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..b747ffe331 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"
@@ -27,26 +25,33 @@ env:
- TEST_PLATFORM="sanguino_atmega1284p"
- TEST_PLATFORM="sanguino_atmega644p"
+ # Broken Extended STM32 Environments
+ #- TEST_PLATFORM="ARMED"
+ #- TEST_PLATFORM="BIGTREE_BTT002"
+ #- TEST_PLATFORM="BIGTREE_SKR_PRO"
+
# Extended STM32 Environments
- - 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 +77,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 f3ec8b2ca5..ef271ae889 100644
--- a/Marlin/Configuration.h
+++ b/Marlin/Configuration.h
@@ -133,6 +133,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 ***
@@ -460,6 +461,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)
@@ -477,8 +479,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(TREX3)
#define TEMP_SENSOR_0 61
@@ -861,7 +861,12 @@
#else
#define Y_MAXFEED 150
#endif
-#define DEFAULT_MAX_FEEDRATE { 200, Y_MAXFEED, 8, 25 }
+#define DEFAULT_MAX_FEEDRATE { 200, Y_MAXFEED, 8, 75 }
+
+#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 { 300, 200, 15, 150 } // ...or, set your own edit limits
+#endif
/**
* Default Max Acceleration (change/s) change = mm/s
@@ -869,7 +874,12 @@
* Override with M201
* X, Y, Z, E0 [, E1[, E2[, E3[, E4[, E5]]]]]
*/
-#define DEFAULT_MAX_ACCELERATION { 750, 500, 400, 4000 }
+#define DEFAULT_MAX_ACCELERATION { 750, 500, 400, 3000 }
+
+#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 { 1500, 1500, 800, 5000 } // ...or, set your own edit limits
+#endif
/**
* Default Acceleration (change/s) change = mm/s
@@ -879,40 +889,43 @@
* M204 R Retract Acceleration
* M204 T Travel Acceleration
*/
-#define DEFAULT_ACCELERATION 1500 // X, Y, Z and E acceleration for printing moves
-#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts
-#define DEFAULT_TRAVEL_ACCELERATION 1500 // X, Y, Z acceleration for travel (non printing) moves
+#define DEFAULT_ACCELERATION 500 // X, Y, Z and E acceleration for printing moves
+#define DEFAULT_RETRACT_ACCELERATION 2000 // E acceleration for retracts
+#define DEFAULT_TRAVEL_ACCELERATION 500 // 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.08 // (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
*
@@ -1026,8 +1039,6 @@
/**
* Z Probe to nozzle (X,Y) offset, relative to (0, 0).
- * Default X and Y offsets must be integers.
- * Floats may be set with M851 if required.
*
* In the following example the X and Y offsets are both positive:
*
@@ -1053,7 +1064,7 @@
#define NOZZLE_TO_PROBE_OFFSET { -7, 29, -1.5 }
#endif
// Certain types of probes need to stay away from edges
-#define MIN_PROBE_EDGE 1
+#define MIN_PROBE_EDGE 10
// X and Y axis travel speed (mm/m) between probes
#define XY_PROBE_SPEED 5000
@@ -1074,7 +1085,7 @@
* A total of 3 or more adds more slow probes, taking the average.
*/
#define MULTIPLE_PROBING 2
-#define EXTRA_PROBING 1
+//#define EXTRA_PROBING 1
/**
* Z probes require clearance when deploying, stowing, and moving between
@@ -1383,12 +1394,6 @@
#define GRID_MAX_POINTS_X 11
#define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X
- // Set the boundaries for probing (where the probe can reach).
- //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE
- //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE))
- //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE
- //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE))
-
// Probe along the Y axis, advancing X after each column
//#define PROBE_Y_FIRST
@@ -1442,19 +1447,6 @@
#endif // BED_LEVELING
-/**
- * Points to probe for all 3-point Leveling procedures.
- * Override if the automatically selected points are inadequate.
- */
-#if EITHER(AUTO_BED_LEVELING_3POINT, AUTO_BED_LEVELING_UBL)
- #define PROBE_PT_1_X 40
- #define PROBE_PT_1_Y 365
- #define PROBE_PT_2_X 40
- #define PROBE_PT_2_Y 40
- #define PROBE_PT_3_X 365
- #define PROBE_PT_3_Y 40
-#endif
-
/**
* Add a bed leveling sub-menu for ABL or MBL.
* Include a guided procedure if manual probing is enabled.
@@ -1762,10 +1754,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
diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h
index 5a86ea5b33..68ffbbc8a5 100644
--- a/Marlin/Configuration_adv.h
+++ b/Marlin/Configuration_adv.h
@@ -214,7 +214,7 @@
#define AUTOTEMP_OLDWEIGHT 0.98
#endif
-// Show extra position information in M114
+// Show extra position information with 'M114 D'
#define M114_DETAIL
// Show Temperature ADC value
@@ -385,6 +385,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 255 // 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.
@@ -612,20 +613,32 @@
//#define Z_STEPPER_AUTO_ALIGN
#if ENABLED(Z_STEPPER_AUTO_ALIGN)
// Define probe X and Y positions for Z1, Z2 [, Z3]
- #define Z_STEPPER_ALIGN_X { 10, 150, 290 }
- #define Z_STEPPER_ALIGN_Y { 290, 10, 290 }
+ #define Z_STEPPER_ALIGN_XY { { 10, 290 }, { 150, 10 }, { 290, 290 } }
+
+ // 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 3
+
// Enable to restore leveling setup after operation
#define RESTORE_LEVELING_AFTER_G34
// On a 300mm bed a 5% grade would give a misalignment of ~1.5cm
#define G34_MAX_GRADE 5 // (%) 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 +912,12 @@
// Add an 'M73' G-code to set the current percentage
#define LCD_SET_PROGRESS_MANUALLY
+#if HAS_GRAPHICAL_LCD && HAS_PRINT_PROGRESS
+ //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits
+ //#define SHOW_REMAINING_TIME // Display estimated time to completion
+ //#define ROTATE_PROGRESS_DISPLAY // Display (P)rogress, (E)lapsed, and (R)emaining time
+#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)
@@ -1215,21 +1234,45 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
- // Enable UTF8 rendering capabilities.
+ // UTF8 processing and rendering.
+ // Unsupported characters are shown as '?'.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
+ // Western accents support. These accented characters use
+ // combined bitmaps and require relatively little storage.
#define TOUCH_UI_UTF8_WESTERN_CHARSET
+ #if ENABLED(TOUCH_UI_UTF8_WESTERN_CHARSET)
+ // Additional character groups. These characters require
+ // full bitmaps and take up considerable storage:
+ //#define TOUCH_UI_UTF8_SUPERSCRIPTS // ¹ ² ³
+ //#define TOUCH_UI_UTF8_COPYRIGHT // © ®
+ //#define TOUCH_UI_UTF8_GERMANIC // ß
+ //#define TOUCH_UI_UTF8_SCANDINAVIAN // Æ Ð Ø Þ æ ð ø þ
+ //#define TOUCH_UI_UTF8_PUNCTUATION // « » ¿ ¡
+ //#define TOUCH_UI_UTF8_CURRENCY // ¢ £ ¤ ¥
+ //#define TOUCH_UI_UTF8_ORDINALS // º ª
+ //#define TOUCH_UI_UTF8_MATHEMATICS // ± × ÷
+ //#define TOUCH_UI_UTF8_FRACTIONS // ¼ ½ ¾
+ //#define TOUCH_UI_UTF8_SYMBOLS // µ ¶ ¦ § ¬
+ #endif
#endif
- // When labels do not fit buttons, use smaller font
+ // Use a smaller font when labels don't fit buttons
#define TOUCH_UI_FIT_TEXT
- // Runtime language selection (otherwise LCD_LANGUAGE)
- //#define TOUCH_UI_LANGUAGE_MENU
+ // Allow language selection from menu at run-time (otherwise use LCD_LANGUAGE)
+ //#define LCD_LANGUAGE_1 en
+ //#define LCD_LANGUAGE_2 fr
+ //#define LCD_LANGUAGE_3 de
+ //#define LCD_LANGUAGE_4 es
+ //#define LCD_LANGUAGE_5 it
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE
+
+ // Output extra debug info for Touch UI events
+ //#define TOUCH_UI_DEBUG
#endif
//
@@ -1318,18 +1361,55 @@
#define LIN_ADVANCE
#endif
#if ENABLED(LIN_ADVANCE)
- #define LIN_ADVANCE_K 0.0 // Unit: mm compression per 1mm/s extruder speed
- //#define LA_DEBUG // If enabled, this will generate debug information output over USB.
+ //#define EXTRA_LIN_ADVANCE_K // Enable for second linear advance constants
+ #define LIN_ADVANCE_K 0.0 // Unit: mm compression per 1mm/s extruder speed
+ //#define LA_DEBUG // If enabled, this will generate debug information output over USB.
#endif
// @section leveling
+/**
+ * Points to probe for all 3-point Leveling procedures.
+ * Override if the automatically selected points are inadequate.
+ */
+#if EITHER(AUTO_BED_LEVELING_3POINT, AUTO_BED_LEVELING_UBL)
+ //#define PROBE_PT_1_X 15
+ //#define PROBE_PT_1_Y 180
+ //#define PROBE_PT_2_X 15
+ //#define PROBE_PT_2_Y 20
+ //#define PROBE_PT_3_X 170
+ //#define PROBE_PT_3_Y 20
+#endif
+
+/**
+ * Override MIN_PROBE_EDGE for each side of the build plate
+ * Useful to get probe points to exact positions on targets or
+ * to allow leveling to avoid plate clamps on only specific
+ * sides of the bed.
+ *
+ * If you are replacing the prior *_PROBE_BED_POSITION options,
+ * LEFT and FRONT values in most cases will map directly over
+ * RIGHT and REAR would be the inverse such as
+ * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION)
+ *
+ * This will allow all positions to match at compilation, however
+ * should the probe position be modified with M851XY then the
+ * probe points will follow. This prevents any change from causing
+ * the probe to be unable to reach any points.
+ */
+#if PROBE_SELECTED && !IS_KINEMATIC
+ //#define MIN_PROBE_EDGE_LEFT MIN_PROBE_EDGE
+ //#define MIN_PROBE_EDGE_RIGHT MIN_PROBE_EDGE
+ //#define MIN_PROBE_EDGE_FRONT MIN_PROBE_EDGE
+ //#define MIN_PROBE_EDGE_BACK MIN_PROBE_EDGE
+#endif
+
#if EITHER(MESH_BED_LEVELING, AUTO_BED_LEVELING_UBL)
// Override the mesh area if the automatic (max) area is too large
- //#define MESH_MIN_X MESH_INSET
- //#define MESH_MIN_Y MESH_INSET
- //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET)
- //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET)
+ #define MESH_MIN_X X_MIN_POS + MESH_INSET
+ #define MESH_MIN_Y Y_MIN_POS + MESH_INSET
+ #define MESH_MAX_X X_MAX_POS - MESH_INSET
+ #define MESH_MAX_Y Y_MAX_POS - MESH_INSET
#endif
/**
@@ -1384,7 +1464,7 @@
#define MIN_STEPS_PER_SEGMENT 6
/**
- * Minimum delay after setting the stepper DIR (in ns)
+ * Minimum delay before and after setting the stepper DIR (in ns)
* 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire)
* 20 : Minimum for TMC2xxx drivers
* 200 : Minimum for A4988 drivers
@@ -1396,7 +1476,8 @@
*
* Override the default value based on the driver type set in Configuration.h.
*/
-//#define MINIMUM_STEPPER_DIR_DELAY 650
+//#define MINIMUM_STEPPER_POST_DIR_DELAY 650
+//#define MINIMUM_STEPPER_PRE_DIR_DELAY 650
/**
* Minimum stepper driver pulse width (in µs)
@@ -1750,91 +1831,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
/**
@@ -1988,6 +2069,8 @@
*
* IMPROVE_HOMING_RELIABILITY tunes acceleration and jerk when
* homing and adds a guard period for endstop triggering.
+ *
+ * TMC2209 requires STEALTHCHOP enabled for SENSORLESS_HOMING
*/
//#define SENSORLESS_HOMING // StallGuard capable drivers only
@@ -2060,7 +2143,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)
@@ -2068,7 +2151,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)
@@ -2076,7 +2159,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)
@@ -2084,7 +2167,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)
@@ -2092,7 +2175,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)
@@ -2100,7 +2183,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)
@@ -2108,7 +2191,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)
@@ -2116,7 +2199,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)
@@ -2124,7 +2207,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)
@@ -2132,7 +2215,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)
@@ -2140,7 +2223,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)
@@ -2148,7 +2231,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)
@@ -2156,7 +2239,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
/**
@@ -2468,10 +2551,10 @@
#define USER_GCODE_1 "M502 \n M500 \n M501 \n M190 S75 \n G28 \n G29 P1 \n G29 S1 \n G29 S0 \n G29 F 10.0 \n G29 A \n M500 \n G28 \n G29 L1 \n " COMMFANNSPEED " M109 S225 \n G1 X150 Y 150 \n G1 Z0 \n M77 \n M117 Set Z Offset"
#define USER_GCODE_3 "M190 S75 \n " COMMFANNSPEED " M104 235 \n G28 \n G29 L1 \n G1 X100 Y 100 \n G1 Z0"
#endif
-
+
#define USER_DESC_4 "Fill Mesh Points"
#define USER_GCODE_4 "G29 P3 \n G29 P3 \n G29 P3 \n G29 T"
-
+
#define USER_DESC_2 "PID Bed"
#define USER_GCODE_2 "M303 C4 S75 E-1 U \n M500 \n M117 PID Tune Done"
@@ -2498,6 +2581,13 @@
#define HOST_PROMPT_SUPPORT
#endif
+/**
+ * Cancel Objects
+ *
+ * Implement M486 to allow Marlin to skip objects
+ */
+#define CANCEL_OBJECTS
+
/**
* I2C position encoders for closed loop control.
* Developed by Chris Barr at Aus3D.
diff --git a/Marlin/Version.h b/Marlin/Version.h
new file mode 100644
index 0000000000..9fc092858f
--- /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_TR20"
+
+/**
+ * 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-26"
+
+/**
+ * Defines a generic printer name to be output to the LCD after booting Marlin.
+ */
+#define MACHINE_NAME "TM3D Trex"
+
+/**
+ * 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_Trex2+_2.0.x"
+
+/**
+ * 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..e83176918c 100644
--- a/Marlin/src/HAL/HAL_AVR/HAL.h
+++ b/Marlin/src/HAL/HAL_AVR/HAL.h
@@ -38,6 +38,14 @@
#include
#include
+#ifndef pgm_read_ptr
+ // Compatibility for avr-libc 1.8.0-4.1 included with Ubuntu for
+ // Windows Subsystem for Linux on Windows 10 as of 10/18/2019
+ #define pgm_read_ptr_far(address_long) (void*)__ELPM_word((uint32_t)(address_long))
+ #define pgm_read_ptr_near(address_short) (void*)__LPM_word((uint16_t)(address_short))
+ #define pgm_read_ptr(address_short) pgm_read_ptr_near(address_short)
+#endif
+
// ------------------------
// Defines
// ------------------------
@@ -146,8 +154,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/Servo.cpp b/Marlin/src/HAL/HAL_AVR/Servo.cpp
index 58e220cbaf..33818edb96 100644
--- a/Marlin/src/HAL/HAL_AVR/Servo.cpp
+++ b/Marlin/src/HAL/HAL_AVR/Servo.cpp
@@ -131,7 +131,7 @@ void initISR(timer16_Sequence_t timer) {
TCCR1A = 0; // normal counting mode
TCCR1B = _BV(CS11); // set prescaler of 8
TCNT1 = 0; // clear the timer count
- #if defined(__AVR_ATmega8__)|| defined(__AVR_ATmega128__)
+ #if defined(__AVR_ATmega8__) || defined(__AVR_ATmega128__)
SBI(TIFR, OCF1A); // clear any pending interrupts;
SBI(TIMSK, OCIE1A); // enable the output compare interrupt
#else
diff --git a/Marlin/src/HAL/HAL_AVR/fast_pwm.cpp b/Marlin/src/HAL/HAL_AVR/fast_pwm.cpp
index 55ca669a87..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"
@@ -59,8 +59,8 @@ Timer get_pwm_timer(const pin_t pin) {
#ifdef TCCR2
case TIMER2: {
Timer timer = {
- /*TCCRnQ*/ { &TCCR2, nullptr, nullptr},
- /*OCRnQ*/ { (uint16_t*)&OCR2, nullptr, nullptr},
+ /*TCCRnQ*/ { &TCCR2, nullptr, nullptr },
+ /*OCRnQ*/ { (uint16_t*)&OCR2, nullptr, nullptr },
/*ICRn*/ nullptr,
/*n, q*/ 2, 0
};
@@ -70,8 +70,8 @@ Timer get_pwm_timer(const pin_t pin) {
case TIMER2A: break; // protect TIMER2A
case TIMER2B: {
Timer timer = {
- /*TCCRnQ*/ { &TCCR2A, &TCCR2B, nullptr},
- /*OCRnQ*/ { (uint16_t*)&OCR2A, (uint16_t*)&OCR2B, nullptr},
+ /*TCCRnQ*/ { &TCCR2A, &TCCR2B, nullptr },
+ /*OCRnQ*/ { (uint16_t*)&OCR2A, (uint16_t*)&OCR2B, nullptr },
/*ICRn*/ nullptr,
/*n, q*/ 2, 1
};
@@ -81,8 +81,8 @@ Timer get_pwm_timer(const pin_t pin) {
case TIMER2B: ++q;
case TIMER2A: {
Timer timer = {
- /*TCCRnQ*/ { &TCCR2A, &TCCR2B, nullptr},
- /*OCRnQ*/ { (uint16_t*)&OCR2A, (uint16_t*)&OCR2B, nullptr},
+ /*TCCRnQ*/ { &TCCR2A, &TCCR2B, nullptr },
+ /*OCRnQ*/ { (uint16_t*)&OCR2A, (uint16_t*)&OCR2B, nullptr },
/*ICRn*/ nullptr,
2, q
};
@@ -91,13 +91,24 @@ Timer get_pwm_timer(const pin_t pin) {
#endif
#endif
#endif
- #ifdef TCCR3A
+ #ifdef OCR3C
case TIMER3C: ++q;
case TIMER3B: ++q;
case TIMER3A: {
Timer timer = {
- /*TCCRnQ*/ { &TCCR3A, &TCCR3B, &TCCR3C},
- /*OCRnQ*/ { &OCR3A, &OCR3B, &OCR3C},
+ /*TCCRnQ*/ { &TCCR3A, &TCCR3B, &TCCR3C },
+ /*OCRnQ*/ { &OCR3A, &OCR3B, &OCR3C },
+ /*ICRn*/ &ICR3,
+ /*n, q*/ 3, q
+ };
+ return timer;
+ }
+ #elif defined(OCR3B)
+ case TIMER3B: ++q;
+ case TIMER3A: {
+ Timer timer = {
+ /*TCCRnQ*/ { &TCCR3A, &TCCR3B, nullptr },
+ /*OCRnQ*/ { &OCR3A, &OCR3B, nullptr },
/*ICRn*/ &ICR3,
/*n, q*/ 3, q
};
@@ -109,8 +120,8 @@ Timer get_pwm_timer(const pin_t pin) {
case TIMER4B: ++q;
case TIMER4A: {
Timer timer = {
- /*TCCRnQ*/ { &TCCR4A, &TCCR4B, &TCCR4C},
- /*OCRnQ*/ { &OCR4A, &OCR4B, &OCR4C},
+ /*TCCRnQ*/ { &TCCR4A, &TCCR4B, &TCCR4C },
+ /*OCRnQ*/ { &OCR4A, &OCR4B, &OCR4C },
/*ICRn*/ &ICR4,
/*n, q*/ 4, q
};
@@ -122,7 +133,7 @@ Timer get_pwm_timer(const pin_t pin) {
case TIMER5B: ++q;
case TIMER5A: {
Timer timer = {
- /*TCCRnQ*/ { &TCCR5A, &TCCR5B, &TCCR5C},
+ /*TCCRnQ*/ { &TCCR5A, &TCCR5B, &TCCR5C },
/*OCRnQ*/ { &OCR5A, &OCR5B, &OCR5C },
/*ICRn*/ &ICR5,
/*n, q*/ 5, q
@@ -132,8 +143,8 @@ Timer get_pwm_timer(const pin_t pin) {
#endif
}
Timer timer = {
- /*TCCRnQ*/ { nullptr, nullptr, nullptr},
- /*OCRnQ*/ { nullptr, nullptr, nullptr},
+ /*TCCRnQ*/ { nullptr, nullptr, nullptr },
+ /*OCRnQ*/ { nullptr, nullptr, nullptr },
/*ICRn*/ nullptr,
0, 0
};
@@ -267,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/EepromEmulation.cpp b/Marlin/src/HAL/HAL_DUE/EepromEmulation.cpp
index 3d6e22f6d3..c7b7007053 100644
--- a/Marlin/src/HAL/HAL_DUE/EepromEmulation.cpp
+++ b/Marlin/src/HAL/HAL_DUE/EepromEmulation.cpp
@@ -922,8 +922,7 @@ static void ee_Init() {
if (!ee_IsPageClean(grp * PagesPerGroup + page)) {
#ifdef EE_EMU_DEBUG
SERIAL_ECHO_START();
- SERIAL_ECHOPAIR("EEPROM Page ",page);
- SERIAL_ECHOLNPAIR(" not clean on group ",grp);
+ SERIAL_ECHOLNPAIR("EEPROM Page ", page, " not clean on group ", grp);
SERIAL_FLUSH();
#endif
ee_PageErase(grp * PagesPerGroup + page);
@@ -944,7 +943,7 @@ static void ee_Init() {
#ifdef EE_EMU_DEBUG
SERIAL_ECHO_START();
- SERIAL_ECHOLNPAIR("EEPROM Active page: ",curPage);
+ SERIAL_ECHOLNPAIR("EEPROM Active page: ", curPage);
SERIAL_FLUSH();
#endif
@@ -953,8 +952,7 @@ static void ee_Init() {
if (!ee_IsPageClean(curGroup * PagesPerGroup + page)) {
#ifdef EE_EMU_DEBUG
SERIAL_ECHO_START();
- SERIAL_ECHOPAIR("EEPROM Page ",page);
- SERIAL_ECHOLNPAIR(" not clean on active group ",curGroup);
+ SERIAL_ECHOLNPAIR("EEPROM Page ", page, " not clean on active group ", curGroup);
SERIAL_FLUSH();
ee_Dump(curGroup * PagesPerGroup + page, getFlashStorage(curGroup * PagesPerGroup + page));
#endif
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..8fac3fcab6 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 customizedSerial1
+#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 customizedSerial2
+ #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/ctrl_access.c b/Marlin/src/HAL/HAL_DUE/usb/ctrl_access.c
index 7991857d62..0ec14e0b8f 100644
--- a/Marlin/src/HAL/HAL_DUE/usb/ctrl_access.c
+++ b/Marlin/src/HAL/HAL_DUE/usb/ctrl_access.c
@@ -174,11 +174,11 @@ static xSemaphoreHandle ctrl_access_semphr = NULL;
//! LUN descriptor table.
static const struct
{
- Ctrl_status (*test_unit_ready)();
+ Ctrl_status (*test_unit_ready)(void);
Ctrl_status (*read_capacity)(U32 *);
bool (*unload)(bool);
- bool (*wr_protect)();
- bool (*removal)();
+ bool (*wr_protect)(void);
+ bool (*removal)(void);
#if ACCESS_USB == true
Ctrl_status (*usb_read_10)(U32, U16);
Ctrl_status (*usb_write_10)(U32, U16);
@@ -255,7 +255,7 @@ bool g_wr_protect;
#ifdef FREERTOS_USED
-bool ctrl_access_init()
+bool ctrl_access_init(void)
{
// If the handle to the protecting semaphore is not valid,
if (!ctrl_access_semphr)
@@ -275,7 +275,7 @@ bool ctrl_access_init()
*
* \return \c true if the access was successfully locked, else \c false.
*/
-static bool ctrl_access_lock()
+static bool ctrl_access_lock(void)
{
// If the semaphore could not be created, there is no backup solution.
if (!ctrl_access_semphr) return false;
@@ -289,7 +289,7 @@ static bool ctrl_access_lock()
#endif // FREERTOS_USED
-U8 get_nb_lun()
+U8 get_nb_lun(void)
{
#if MEM_USB == ENABLE
# ifndef Lun_usb_get_lun
@@ -310,7 +310,7 @@ U8 get_nb_lun()
}
-U8 get_cur_lun()
+U8 get_cur_lun(void)
{
return LUN_ID_0;
}
diff --git a/Marlin/src/HAL/HAL_DUE/usb/ctrl_access.h b/Marlin/src/HAL/HAL_DUE/usb/ctrl_access.h
index 823887623b..af6c8ceb96 100644
--- a/Marlin/src/HAL/HAL_DUE/usb/ctrl_access.h
+++ b/Marlin/src/HAL/HAL_DUE/usb/ctrl_access.h
@@ -191,7 +191,7 @@ extern bool g_wr_protect;
*
* \return \c true if the locker was successfully initialized, else \c false.
*/
-extern bool ctrl_access_init();
+extern bool ctrl_access_init(void);
#endif // FREERTOS_USED
@@ -199,7 +199,7 @@ extern bool ctrl_access_init();
*
* \return Number of LUNs in the system.
*/
-extern U8 get_nb_lun();
+extern U8 get_nb_lun(void);
/*! \brief Returns the current LUN.
*
@@ -207,7 +207,7 @@ extern U8 get_nb_lun();
*
* \todo Implement.
*/
-extern U8 get_cur_lun();
+extern U8 get_cur_lun(void);
/*! \brief Tests the memory state and initializes the memory if required.
*
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/usb/sd_mmc_spi_mem.h b/Marlin/src/HAL/HAL_DUE/usb/sd_mmc_spi_mem.h
index f81ce7fdda..6df82c146b 100644
--- a/Marlin/src/HAL/HAL_DUE/usb/sd_mmc_spi_mem.h
+++ b/Marlin/src/HAL/HAL_DUE/usb/sd_mmc_spi_mem.h
@@ -78,7 +78,7 @@
//!
//! @brief This function initializes the hw/sw resources required to drive the SD_MMC_SPI.
//!/
-extern void sd_mmc_spi_mem_init();
+extern void sd_mmc_spi_mem_init(void);
//!
//! @brief This function tests the state of the SD_MMC memory and sends it to the Host.
@@ -91,7 +91,7 @@ extern void sd_mmc_spi_mem_init();
//! Media not present -> CTRL_NO_PRESENT
//! Media has changed -> CTRL_BUSY
//!/
-extern Ctrl_status sd_mmc_spi_test_unit_ready();
+extern Ctrl_status sd_mmc_spi_test_unit_ready(void);
//!
//! @brief This function gives the address of the last valid sector.
@@ -124,14 +124,14 @@ extern bool sd_mmc_spi_unload(bool unload);
//!
//! @return false -> the memory is not write-protected (always)
//!/
-extern bool sd_mmc_spi_wr_protect();
+extern bool sd_mmc_spi_wr_protect(void);
//!
//! @brief This function tells if the memory has been removed or not.
//!
//! @return false -> The memory isn't removed
//!
-extern bool sd_mmc_spi_removal();
+extern bool sd_mmc_spi_removal(void);
//---- ACCESS DATA FONCTIONS ----
diff --git a/Marlin/src/HAL/HAL_DUE/usb/sysclk.c b/Marlin/src/HAL/HAL_DUE/usb/sysclk.c
index 1848b2d819..899244dd88 100644
--- a/Marlin/src/HAL/HAL_DUE/usb/sysclk.c
+++ b/Marlin/src/HAL/HAL_DUE/usb/sysclk.c
@@ -71,7 +71,7 @@ extern "C" {
* \param pll_id Source of the USB clock.
* \param div Actual clock divisor. Must be superior to 0.
*/
-void sysclk_enable_usb()
+void sysclk_enable_usb(void)
{
Assert(CONFIG_USBCLK_DIV > 0);
@@ -103,7 +103,7 @@ void sysclk_enable_usb()
*
* \note This implementation does not switch off the PLL, it just turns off the USB clock.
*/
-void sysclk_disable_usb()
+void sysclk_disable_usb(void)
{
pmc_disable_udpck();
}
diff --git a/Marlin/src/HAL/HAL_DUE/usb/sysclk.h b/Marlin/src/HAL/HAL_DUE/usb/sysclk.h
index 51a311ce29..48c99de298 100644
--- a/Marlin/src/HAL/HAL_DUE/usb/sysclk.h
+++ b/Marlin/src/HAL/HAL_DUE/usb/sysclk.h
@@ -213,8 +213,8 @@ extern "C" {
#endif
-extern void sysclk_enable_usb();
-extern void sysclk_disable_usb();
+extern void sysclk_enable_usb(void);
+extern void sysclk_disable_usb(void);
//! @}
diff --git a/Marlin/src/HAL/HAL_DUE/usb/udc.c b/Marlin/src/HAL/HAL_DUE/usb/udc.c
index dfc9933a29..048a902d3b 100644
--- a/Marlin/src/HAL/HAL_DUE/usb/udc.c
+++ b/Marlin/src/HAL/HAL_DUE/usb/udc.c
@@ -132,14 +132,14 @@ static uint8_t udc_string_product_name[] = USB_DEVICE_PRODUCT_NAME;
* define USB_DEVICE_GET_SERIAL_NAME_LENGTH.
*/
#if defined USB_DEVICE_GET_SERIAL_NAME_POINTER
- static const uint8_t *udc_get_string_serial_name()
+ static const uint8_t *udc_get_string_serial_name(void)
{
return (const uint8_t *)USB_DEVICE_GET_SERIAL_NAME_POINTER;
}
# define USB_DEVICE_SERIAL_NAME_SIZE \
USB_DEVICE_GET_SERIAL_NAME_LENGTH
#elif defined USB_DEVICE_SERIAL_NAME
- static const uint8_t *udc_get_string_serial_name()
+ static const uint8_t *udc_get_string_serial_name(void)
{
return (const uint8_t *)USB_DEVICE_SERIAL_NAME;
}
@@ -164,7 +164,7 @@ static UDC_DESC_STORAGE struct udc_string_desc_t udc_string_desc = {
};
//! @}
-usb_iface_desc_t UDC_DESC_STORAGE *udc_get_interface_desc()
+usb_iface_desc_t UDC_DESC_STORAGE *udc_get_interface_desc(void)
{
return udc_ptr_iface;
}
@@ -174,7 +174,7 @@ usb_iface_desc_t UDC_DESC_STORAGE *udc_get_interface_desc()
*
* \return address after the last byte of USB Configuration descriptor
*/
-static usb_conf_desc_t UDC_DESC_STORAGE *udc_get_eof_conf()
+static usb_conf_desc_t UDC_DESC_STORAGE *udc_get_eof_conf(void)
{
return (UDC_DESC_STORAGE usb_conf_desc_t *) ((uint8_t *)
udc_ptr_conf->desc +
@@ -360,14 +360,14 @@ static bool udc_iface_enable(uint8_t iface_num, uint8_t setting_num)
/*! \brief Start the USB Device stack
*/
-void udc_start()
+void udc_start(void)
{
udd_enable();
}
/*! \brief Stop the USB Device stack
*/
-void udc_stop()
+void udc_stop(void)
{
udd_disable();
udc_reset();
@@ -377,7 +377,7 @@ void udc_stop()
* \brief Reset the current configuration of the USB device,
* This routines can be called by UDD when a RESET on the USB line occurs.
*/
-void udc_reset()
+void udc_reset(void)
{
uint8_t iface_num;
@@ -404,7 +404,7 @@ void udc_reset()
#endif
}
-void udc_sof_notify()
+void udc_sof_notify(void)
{
uint8_t iface_num;
@@ -424,7 +424,7 @@ void udc_sof_notify()
*
* \return true if success
*/
-static bool udc_req_std_dev_get_status()
+static bool udc_req_std_dev_get_status(void)
{
if (udd_g_ctrlreq.req.wLength != sizeof(udc_device_status)) {
return false;
@@ -441,7 +441,7 @@ static bool udc_req_std_dev_get_status()
*
* \return true if success
*/
-static bool udc_req_std_ep_get_status()
+static bool udc_req_std_ep_get_status(void)
{
static le16_t udc_ep_status;
@@ -463,7 +463,7 @@ static bool udc_req_std_ep_get_status()
*
* \return true if success
*/
-static bool udc_req_std_dev_clear_feature()
+static bool udc_req_std_dev_clear_feature(void)
{
if (udd_g_ctrlreq.req.wLength) {
return false;
@@ -486,7 +486,7 @@ static bool udc_req_std_dev_clear_feature()
*
* \return true if success
*/
-static bool udc_req_std_ep_clear_feature()
+static bool udc_req_std_ep_clear_feature(void)
{
if (udd_g_ctrlreq.req.wLength) {
return false;
@@ -504,7 +504,7 @@ static bool udc_req_std_ep_clear_feature()
*
* \return true if success
*/
-static bool udc_req_std_dev_set_feature()
+static bool udc_req_std_dev_set_feature(void)
{
if (udd_g_ctrlreq.req.wLength) {
return false;
@@ -567,7 +567,7 @@ static bool udc_req_std_dev_set_feature()
* \return true if success
*/
#if (0!=USB_DEVICE_MAX_EP)
-static bool udc_req_std_ep_set_feature()
+static bool udc_req_std_ep_set_feature(void)
{
if (udd_g_ctrlreq.req.wLength) {
return false;
@@ -584,7 +584,7 @@ static bool udc_req_std_ep_set_feature()
* \brief Change the address of device
* Callback called at the end of request set address
*/
-static void udc_valid_address()
+static void udc_valid_address(void)
{
udd_set_address(udd_g_ctrlreq.req.wValue & 0x7F);
}
@@ -594,7 +594,7 @@ static void udc_valid_address()
*
* \return true if success
*/
-static bool udc_req_std_dev_set_address()
+static bool udc_req_std_dev_set_address(void)
{
if (udd_g_ctrlreq.req.wLength) {
return false;
@@ -611,7 +611,7 @@ static bool udc_req_std_dev_set_address()
*
* \return true if success
*/
-static bool udc_req_std_dev_get_str_desc()
+static bool udc_req_std_dev_get_str_desc(void)
{
uint8_t i;
const uint8_t *str;
@@ -670,7 +670,7 @@ static bool udc_req_std_dev_get_str_desc()
*
* \return true if success
*/
-static bool udc_req_std_dev_get_descriptor()
+static bool udc_req_std_dev_get_descriptor(void)
{
uint8_t conf_num;
@@ -787,7 +787,7 @@ static bool udc_req_std_dev_get_descriptor()
*
* \return true if success
*/
-static bool udc_req_std_dev_get_configuration()
+static bool udc_req_std_dev_get_configuration(void)
{
if (udd_g_ctrlreq.req.wLength != 1) {
return false;
@@ -802,7 +802,7 @@ static bool udc_req_std_dev_get_configuration()
*
* \return true if success
*/
-static bool udc_req_std_dev_set_configuration()
+static bool udc_req_std_dev_set_configuration(void)
{
uint8_t iface_num;
@@ -867,7 +867,7 @@ static bool udc_req_std_dev_set_configuration()
*
* \return true if success
*/
-static bool udc_req_std_iface_get_setting()
+static bool udc_req_std_iface_get_setting(void)
{
uint8_t iface_num;
udi_api_t UDC_DESC_STORAGE *udi_api;
@@ -905,7 +905,7 @@ static bool udc_req_std_iface_get_setting()
*
* \return true if success
*/
-static bool udc_req_std_iface_set_setting()
+static bool udc_req_std_iface_set_setting(void)
{
uint8_t iface_num, setting_num;
@@ -933,7 +933,7 @@ static bool udc_req_std_iface_set_setting()
*
* \return true if the request is supported
*/
-static bool udc_reqstd()
+static bool udc_reqstd(void)
{
if (Udd_setup_is_in()) {
// GET Standard Requests
@@ -1027,7 +1027,7 @@ static bool udc_reqstd()
*
* \return true if the request is supported
*/
-static bool udc_req_iface()
+static bool udc_req_iface(void)
{
uint8_t iface_num;
udi_api_t UDC_DESC_STORAGE *udi_api;
@@ -1062,7 +1062,7 @@ static bool udc_req_iface()
*
* \return true if the request is supported
*/
-static bool udc_req_ep()
+static bool udc_req_ep(void)
{
uint8_t iface_num;
udi_api_t UDC_DESC_STORAGE *udi_api;
@@ -1101,7 +1101,7 @@ static bool udc_req_ep()
*
* \return true if the request is supported, else the request is stalled by UDD
*/
-bool udc_process_setup()
+bool udc_process_setup(void)
{
// By default no data (receive/send) and no callbacks registered
udd_g_ctrlreq.payload_size = 0;
diff --git a/Marlin/src/HAL/HAL_DUE/usb/udc.h b/Marlin/src/HAL/HAL_DUE/usb/udc.h
index 3c1dd582ed..885bdf04d6 100644
--- a/Marlin/src/HAL/HAL_DUE/usb/udc.h
+++ b/Marlin/src/HAL/HAL_DUE/usb/udc.h
@@ -172,18 +172,18 @@ extern "C" {
}
\endcode
*/
-static inline bool udc_include_vbus_monitoring()
+static inline bool udc_include_vbus_monitoring(void)
{
return udd_include_vbus_monitoring();
}
/*! \brief Start the USB Device stack
*/
-void udc_start();
+void udc_start(void);
/*! \brief Stop the USB Device stack
*/
-void udc_stop();
+void udc_stop(void);
/**
* \brief Attach device to the bus when possible
@@ -192,7 +192,7 @@ void udc_stop();
* then it will attach device when an acceptable Vbus
* level from the host is detected.
*/
-static inline void udc_attach()
+static inline void udc_attach(void)
{
udd_attach();
}
@@ -203,7 +203,7 @@ static inline void udc_attach()
*
* The driver must remove pull-up on USB line D- or D+.
*/
-static inline void udc_detach()
+static inline void udc_detach(void)
{
udd_detach();
}
@@ -212,7 +212,7 @@ static inline void udc_detach()
/*! \brief The USB driver sends a resume signal called \e "Upstream Resume"
* This is authorized only when the remote wakeup feature is enabled by host.
*/
-static inline void udc_remotewakeup()
+static inline void udc_remotewakeup(void)
{
udd_send_remotewakeup();
}
@@ -223,7 +223,7 @@ static inline void udc_remotewakeup()
*
* \return pointer on the current interface descriptor.
*/
-usb_iface_desc_t UDC_DESC_STORAGE *udc_get_interface_desc();
+usb_iface_desc_t UDC_DESC_STORAGE *udc_get_interface_desc(void);
//@}
@@ -334,7 +334,7 @@ usb_iface_desc_t UDC_DESC_STORAGE *udc_get_interface_desc();
*
* Add to application C-file:
* \code
- void usb_init()
+ void usb_init(void)
{
udc_start();
}
@@ -551,23 +551,23 @@ usb_iface_desc_t UDC_DESC_STORAGE *udc_get_interface_desc();
#define USB_DEVICE_ATTR \
(USB_CONFIG_ATTR_REMOTE_WAKEUP | USB_CONFIG_ATTR_..._POWERED)
#define UDC_REMOTEWAKEUP_ENABLE() my_callback_remotewakeup_enable()
- extern void my_callback_remotewakeup_enable();
+ extern void my_callback_remotewakeup_enable(void);
#define UDC_REMOTEWAKEUP_DISABLE() my_callback_remotewakeup_disable()
- extern void my_callback_remotewakeup_disable();
+ extern void my_callback_remotewakeup_disable(void);
\endcode
*
* Add to application C-file:
* \code
- void my_callback_remotewakeup_enable()
+ void my_callback_remotewakeup_enable(void)
{
// Enable application wakeup events (e.g. enable GPIO interrupt)
}
- void my_callback_remotewakeup_disable()
+ void my_callback_remotewakeup_disable(void)
{
// Disable application wakeup events (e.g. disable GPIO interrupt)
}
- void my_interrupt_event()
+ void my_interrupt_event(void)
{
udc_remotewakeup();
}
@@ -580,10 +580,10 @@ usb_iface_desc_t UDC_DESC_STORAGE *udc_get_interface_desc();
#define USB_DEVICE_ATTR (USB_CONFIG_ATTR_REMOTE_WAKEUP | USB_CONFIG_ATTR_..._POWERED) \endcode
* - \code // Define callback called when the host enables the remotewakeup feature
#define UDC_REMOTEWAKEUP_ENABLE() my_callback_remotewakeup_enable()
- extern void my_callback_remotewakeup_enable(); \endcode
+ extern void my_callback_remotewakeup_enable(void); \endcode
* - \code // Define callback called when the host disables the remotewakeup feature
#define UDC_REMOTEWAKEUP_DISABLE() my_callback_remotewakeup_disable()
- extern void my_callback_remotewakeup_disable(); \endcode
+ extern void my_callback_remotewakeup_disable(void); \endcode
* -# Send a remote wakeup (USB upstream):
* - \code udc_remotewakeup(); \endcode
*/
@@ -605,18 +605,18 @@ usb_iface_desc_t UDC_DESC_STORAGE *udc_get_interface_desc();
* \code
#define USB_DEVICE_ATTR (USB_CONFIG_ATTR_BUS_POWERED)
#define UDC_SUSPEND_EVENT() user_callback_suspend_action()
- extern void user_callback_suspend_action()
+ extern void user_callback_suspend_action(void)
#define UDC_RESUME_EVENT() user_callback_resume_action()
- extern void user_callback_resume_action()
+ extern void user_callback_resume_action(void)
\endcode
*
* Add to application C-file:
* \code
- void user_callback_suspend_action()
+ void user_callback_suspend_action(void)
{
// Disable hardware component to reduce power consumption
}
- void user_callback_resume_action()
+ void user_callback_resume_action(void)
{
// Re-enable hardware component
}
@@ -628,12 +628,12 @@ usb_iface_desc_t UDC_DESC_STORAGE *udc_get_interface_desc();
#define USB_DEVICE_ATTR (USB_CONFIG_ATTR_BUS_POWERED) \endcode
* - \code // Define callback called when the host suspend the USB line
#define UDC_SUSPEND_EVENT() user_callback_suspend_action()
- extern void user_callback_suspend_action(); \endcode
+ extern void user_callback_suspend_action(void); \endcode
* - \code // Define callback called when the host or device resume the USB line
#define UDC_RESUME_EVENT() user_callback_resume_action()
- extern void user_callback_resume_action(); \endcode
+ extern void user_callback_resume_action(void); \endcode
* -# Reduce power consumption in suspend mode (max. 2.5mA on Vbus):
- * - \code void user_callback_suspend_action()
+ * - \code void user_callback_suspend_action(void)
{
turn_off_components();
} \endcode
@@ -664,7 +664,7 @@ usb_iface_desc_t UDC_DESC_STORAGE *udc_get_interface_desc();
* \code
uint8_t serial_number[USB_DEVICE_GET_SERIAL_NAME_LENGTH];
- void init_build_usb_serial_number()
+ void init_build_usb_serial_number(void)
{
serial_number[0] = 'A';
serial_number[1] = 'B';
@@ -683,7 +683,7 @@ usb_iface_desc_t UDC_DESC_STORAGE *udc_get_interface_desc();
* - \code
uint8_t serial_number[USB_DEVICE_GET_SERIAL_NAME_LENGTH];
- void init_build_usb_serial_number()
+ void init_build_usb_serial_number(void)
{
serial_number[0] = 'A';
serial_number[1] = 'B';
diff --git a/Marlin/src/HAL/HAL_DUE/usb/udd.h b/Marlin/src/HAL/HAL_DUE/usb/udd.h
index 4d024dbc63..c87763de23 100644
--- a/Marlin/src/HAL/HAL_DUE/usb/udd.h
+++ b/Marlin/src/HAL/HAL_DUE/usb/udd.h
@@ -94,11 +94,11 @@ typedef struct {
uint16_t payload_size;
//! Callback called after reception of ZLP from setup request
- void (*callback)();
+ void (*callback)(void);
//! Callback called when the buffer given (.payload) is full or empty.
//! This one return false to abort data transfer, or true with a new buffer in .payload.
- bool (*over_under_run)();
+ bool (*over_under_run)(void);
} udd_ctrl_request_t;
extern udd_ctrl_request_t udd_g_ctrlreq;
@@ -123,7 +123,7 @@ extern udd_ctrl_request_t udd_g_ctrlreq;
* Registered by routine udd_ep_wait_stall_clear()
* Callback called when endpoint stall is cleared.
*/
-typedef void (*udd_callback_halt_cleared_t)();
+typedef void (*udd_callback_halt_cleared_t)(void);
/**
* \brief End of transfer callback function type.
@@ -142,17 +142,17 @@ typedef void (*udd_callback_trans_t) (udd_ep_status_t status,
*
* \return true, if the VBUS monitoring is possible.
*/
-bool udd_include_vbus_monitoring();
+bool udd_include_vbus_monitoring(void);
/**
* \brief Enables the USB Device mode
*/
-void udd_enable();
+void udd_enable(void);
/**
* \brief Disables the USB Device mode
*/
-void udd_disable();
+void udd_disable(void);
/**
* \brief Attach device to the bus when possible
@@ -161,14 +161,14 @@ void udd_disable();
* then it will attach device when an acceptable Vbus
* level from the host is detected.
*/
-void udd_attach();
+void udd_attach(void);
/**
* \brief Detaches the device from the bus
*
* The driver must remove pull-up on USB line D- or D+.
*/
-void udd_detach();
+void udd_detach(void);
/**
* \brief Test whether the USB Device Controller is running at high
@@ -176,7 +176,7 @@ void udd_detach();
*
* \return \c true if the Device is running at high speed mode, otherwise \c false.
*/
-bool udd_is_high_speed();
+bool udd_is_high_speed(void);
/**
* \brief Changes the USB address of device
@@ -190,25 +190,25 @@ void udd_set_address(uint8_t address);
*
* \return USB address
*/
-uint8_t udd_getaddress();
+uint8_t udd_getaddress(void);
/**
* \brief Returns the current start of frame number
*
* \return current start of frame number.
*/
-uint16_t udd_get_frame_number();
+uint16_t udd_get_frame_number(void);
/**
* \brief Returns the current micro start of frame number
*
* \return current micro start of frame number required in high speed mode.
*/
-uint16_t udd_get_micro_frame_number();
+uint16_t udd_get_micro_frame_number(void);
/*! \brief The USB driver sends a resume signal called Upstream Resume
*/
-void udd_send_remotewakeup();
+void udd_send_remotewakeup(void);
/**
* \brief Load setup payload
@@ -346,10 +346,10 @@ void udd_ep_abort(udd_ep_id_t ep);
* The following functions allow the device to jump to a specific test mode required in high speed mode.
*/
//@{
-void udd_test_mode_j();
-void udd_test_mode_k();
-void udd_test_mode_se0_nak();
-void udd_test_mode_packet();
+void udd_test_mode_j(void);
+void udd_test_mode_k(void);
+void udd_test_mode_se0_nak(void);
+void udd_test_mode_packet(void);
//@}
@@ -370,21 +370,21 @@ void udd_test_mode_packet();
*
* \return \c 1 if the request is accepted, otherwise \c 0.
*/
-extern bool udc_process_setup();
+extern bool udc_process_setup(void);
/**
* \brief Reset the UDC
*
* The UDC must reset all configuration.
*/
-extern void udc_reset();
+extern void udc_reset(void);
/**
* \brief To signal that a SOF is occurred
*
* The UDC must send the signal to all UDIs enabled
*/
-extern void udc_sof_notify();
+extern void udc_sof_notify(void);
//@}
diff --git a/Marlin/src/HAL/HAL_DUE/usb/udi.h b/Marlin/src/HAL/HAL_DUE/usb/udi.h
index 6a5b470f4c..709908cad9 100644
--- a/Marlin/src/HAL/HAL_DUE/usb/udi.h
+++ b/Marlin/src/HAL/HAL_DUE/usb/udi.h
@@ -82,7 +82,7 @@ typedef struct {
*
* \return \c 1 if function was successfully done, otherwise \c 0.
*/
- bool (*enable)();
+ bool (*enable)(void);
/**
* \brief Disable the interface.
@@ -95,7 +95,7 @@ typedef struct {
* - the device is detached from the host (i.e. Vbus is no
* longer present)
*/
- void (*disable)();
+ void (*disable)(void);
/**
* \brief Handle a control request directed at an interface.
@@ -108,7 +108,7 @@ typedef struct {
*
* \return \c 1 if this interface supports the SETUP request, otherwise \c 0.
*/
- bool (*setup)();
+ bool (*setup)(void);
/**
* \brief Returns the current setting of the selected interface.
@@ -117,12 +117,12 @@ typedef struct {
*
* \return alternate setting of selected interface
*/
- uint8_t (*getsetting)();
+ uint8_t (*getsetting)(void);
/**
* \brief To signal that a SOF is occurred
*/
- void (*sof_notify)();
+ void (*sof_notify)(void);
} udi_api_t;
//@}
diff --git a/Marlin/src/HAL/HAL_DUE/usb/udi_cdc.c b/Marlin/src/HAL/HAL_DUE/usb/udi_cdc.c
index 430de6c015..60c9546ce2 100644
--- a/Marlin/src/HAL/HAL_DUE/usb/udi_cdc.c
+++ b/Marlin/src/HAL/HAL_DUE/usb/udi_cdc.c
@@ -84,14 +84,14 @@
*
* @{
*/
-bool udi_cdc_comm_enable();
-void udi_cdc_comm_disable();
-bool udi_cdc_comm_setup();
-bool udi_cdc_data_enable();
-void udi_cdc_data_disable();
-bool udi_cdc_data_setup();
-uint8_t udi_cdc_getsetting();
-void udi_cdc_data_sof_notify();
+bool udi_cdc_comm_enable(void);
+void udi_cdc_comm_disable(void);
+bool udi_cdc_comm_setup(void);
+bool udi_cdc_data_enable(void);
+void udi_cdc_data_disable(void);
+bool udi_cdc_data_setup(void);
+uint8_t udi_cdc_getsetting(void);
+void udi_cdc_data_sof_notify(void);
UDC_DESC_STORAGE udi_api_t udi_api_cdc_comm = {
.enable = udi_cdc_comm_enable,
.disable = udi_cdc_comm_disable,
@@ -130,14 +130,14 @@ UDC_DESC_STORAGE udi_api_t udi_api_cdc_data = {
*
* \return port number
*/
-static uint8_t udi_cdc_setup_to_port();
+static uint8_t udi_cdc_setup_to_port(void);
/**
* \brief Sends line coding to application
*
* Called after SETUP request when line coding data is received.
*/
-static void udi_cdc_line_coding_received();
+static void udi_cdc_line_coding_received(void);
/**
* \brief Records new state
@@ -267,7 +267,7 @@ static volatile bool udi_cdc_tx_both_buf_to_send[UDI_CDC_PORT_NB];
//@}
-bool udi_cdc_comm_enable()
+bool udi_cdc_comm_enable(void)
{
uint8_t port;
uint8_t iface_comm_num;
@@ -321,7 +321,7 @@ bool udi_cdc_comm_enable()
return true;
}
-bool udi_cdc_data_enable()
+bool udi_cdc_data_enable(void)
{
uint8_t port;
@@ -360,13 +360,13 @@ bool udi_cdc_data_enable()
return true;
}
-void udi_cdc_comm_disable()
+void udi_cdc_comm_disable(void)
{
Assert(udi_cdc_nb_comm_enabled != 0);
udi_cdc_nb_comm_enabled--;
}
-void udi_cdc_data_disable()
+void udi_cdc_data_disable(void)
{
uint8_t port;
@@ -377,7 +377,7 @@ void udi_cdc_data_disable()
udi_cdc_data_running = false;
}
-bool udi_cdc_comm_setup()
+bool udi_cdc_comm_setup(void)
{
uint8_t port = udi_cdc_setup_to_port();
@@ -433,17 +433,17 @@ bool udi_cdc_comm_setup()
return false; // request Not supported
}
-bool udi_cdc_data_setup()
+bool udi_cdc_data_setup(void)
{
return false; // request Not supported
}
-uint8_t udi_cdc_getsetting()
+uint8_t udi_cdc_getsetting(void)
{
return 0; // CDC don't have multiple alternate setting
}
-void udi_cdc_data_sof_notify()
+void udi_cdc_data_sof_notify(void)
{
static uint8_t port_notify = 0;
@@ -461,7 +461,7 @@ void udi_cdc_data_sof_notify()
// ------------------------
//------- Internal routines to control serial line
-static uint8_t udi_cdc_setup_to_port()
+static uint8_t udi_cdc_setup_to_port(void)
{
uint8_t port;
@@ -479,7 +479,7 @@ static uint8_t udi_cdc_setup_to_port()
return port;
}
-static void udi_cdc_line_coding_received()
+static void udi_cdc_line_coding_received(void)
{
uint8_t port = udi_cdc_setup_to_port();
UNUSED(port);
@@ -797,17 +797,17 @@ void udi_cdc_ctrl_signal_dsr(bool b_set)
udi_cdc_ctrl_state_change(0, b_set, CDC_SERIAL_STATE_DSR);
}
-void udi_cdc_signal_framing_error()
+void udi_cdc_signal_framing_error(void)
{
udi_cdc_ctrl_state_change(0, true, CDC_SERIAL_STATE_FRAMING);
}
-void udi_cdc_signal_parity_error()
+void udi_cdc_signal_parity_error(void)
{
udi_cdc_ctrl_state_change(0, true, CDC_SERIAL_STATE_PARITY);
}
-void udi_cdc_signal_overrun()
+void udi_cdc_signal_overrun(void)
{
udi_cdc_ctrl_state_change(0, true, CDC_SERIAL_STATE_OVERRUN);
}
@@ -853,7 +853,7 @@ iram_size_t udi_cdc_multi_get_nb_received_data(uint8_t port)
return nb_received;
}
-iram_size_t udi_cdc_get_nb_received_data()
+iram_size_t udi_cdc_get_nb_received_data(void)
{
return udi_cdc_multi_get_nb_received_data(0);
}
@@ -863,7 +863,7 @@ bool udi_cdc_multi_is_rx_ready(uint8_t port)
return (udi_cdc_multi_get_nb_received_data(port) > 0);
}
-bool udi_cdc_is_rx_ready()
+bool udi_cdc_is_rx_ready(void)
{
return udi_cdc_multi_is_rx_ready(0);
}
@@ -912,7 +912,7 @@ udi_cdc_getc_process_one_byte:
return rx_data;
}
-int udi_cdc_getc()
+int udi_cdc_getc(void)
{
return udi_cdc_multi_getc(0);
}
@@ -1041,7 +1041,7 @@ iram_size_t __attribute__((optimize("O0"))) udi_cdc_multi_get_free_tx_buffer(uin
return retval;
}
-iram_size_t udi_cdc_get_free_tx_buffer()
+iram_size_t udi_cdc_get_free_tx_buffer(void)
{
return udi_cdc_multi_get_free_tx_buffer(0);
}
@@ -1051,7 +1051,7 @@ bool udi_cdc_multi_is_tx_ready(uint8_t port)
return (udi_cdc_multi_get_free_tx_buffer(port) != 0);
}
-bool udi_cdc_is_tx_ready()
+bool udi_cdc_is_tx_ready(void)
{
return udi_cdc_multi_is_tx_ready(0);
}
diff --git a/Marlin/src/HAL/HAL_DUE/usb/udi_cdc.h b/Marlin/src/HAL/HAL_DUE/usb/udi_cdc.h
index 66da384e6c..526419c860 100644
--- a/Marlin/src/HAL/HAL_DUE/usb/udi_cdc.h
+++ b/Marlin/src/HAL/HAL_DUE/usb/udi_cdc.h
@@ -366,38 +366,38 @@ void udi_cdc_ctrl_signal_dsr(bool b_set);
/**
* \brief Notify a framing error
*/
-void udi_cdc_signal_framing_error();
+void udi_cdc_signal_framing_error(void);
/**
* \brief Notify a parity error
*/
-void udi_cdc_signal_parity_error();
+void udi_cdc_signal_parity_error(void);
/**
* \brief Notify a overrun
*/
-void udi_cdc_signal_overrun();
+void udi_cdc_signal_overrun(void);
/**
* \brief Gets the number of byte received
*
* \return the number of data available
*/
-iram_size_t udi_cdc_get_nb_received_data();
+iram_size_t udi_cdc_get_nb_received_data(void);
/**
* \brief This function checks if a character has been received on the CDC line
*
* \return \c 1 if a byte is ready to be read.
*/
-bool udi_cdc_is_rx_ready();
+bool udi_cdc_is_rx_ready(void);
/**
* \brief Waits and gets a value on CDC line
*
* \return value read on CDC line
*/
-int udi_cdc_getc();
+int udi_cdc_getc(void);
/**
* \brief Reads a RAM buffer on CDC line
@@ -425,7 +425,7 @@ iram_size_t udi_cdc_read_no_polling(void* buf, iram_size_t size);
*
* \return the number of free byte in TX buffer
*/
-iram_size_t udi_cdc_get_free_tx_buffer();
+iram_size_t udi_cdc_get_free_tx_buffer(void);
/**
* \brief This function checks if a new character sent is possible
@@ -433,7 +433,7 @@ iram_size_t udi_cdc_get_free_tx_buffer();
*
* \return \c 1 if a new character can be sent
*/
-bool udi_cdc_is_tx_ready();
+bool udi_cdc_is_tx_ready(void);
/**
* \brief Puts a byte on CDC line
@@ -611,9 +611,9 @@ iram_size_t udi_cdc_multi_write_buf(uint8_t port, const void* buf, iram_size_t s
* Content of conf_usb.h:
* \code
#define UDI_CDC_ENABLE_EXT(port) my_callback_cdc_enable()
- extern bool my_callback_cdc_enable();
+ extern bool my_callback_cdc_enable(void);
#define UDI_CDC_DISABLE_EXT(port) my_callback_cdc_disable()
- extern void my_callback_cdc_disable();
+ extern void my_callback_cdc_disable(void);
#define UDI_CDC_LOW_RATE
#define UDI_CDC_DEFAULT_RATE 115200
@@ -627,17 +627,17 @@ iram_size_t udi_cdc_multi_write_buf(uint8_t port, const void* buf, iram_size_t s
* Add to application C-file:
* \code
static bool my_flag_autorize_cdc_transfert = false;
- bool my_callback_cdc_enable()
+ bool my_callback_cdc_enable(void)
{
my_flag_autorize_cdc_transfert = true;
return true;
}
- void my_callback_cdc_disable()
+ void my_callback_cdc_disable(void)
{
my_flag_autorize_cdc_transfert = false;
}
- void task()
+ void task(void)
{
if (my_flag_autorize_cdc_transfert) {
udi_cdc_putc('A');
@@ -652,14 +652,14 @@ iram_size_t udi_cdc_multi_write_buf(uint8_t port, const void* buf, iram_size_t s
* - \code #define USB_DEVICE_SERIAL_NAME "12...EF" // Disk SN for CDC \endcode
* \note The USB serial number is mandatory when a CDC interface is used.
* - \code #define UDI_CDC_ENABLE_EXT(port) my_callback_cdc_enable()
- extern bool my_callback_cdc_enable(); \endcode
+ extern bool my_callback_cdc_enable(void); \endcode
* \note After the device enumeration (detecting and identifying USB devices),
* the USB host starts the device configuration. When the USB CDC interface
* from the device is accepted by the host, the USB host enables this interface and the
* UDI_CDC_ENABLE_EXT() callback function is called and return true.
* Thus, when this event is received, the data transfer on CDC interface are authorized.
* - \code #define UDI_CDC_DISABLE_EXT(port) my_callback_cdc_disable()
- extern void my_callback_cdc_disable(); \endcode
+ extern void my_callback_cdc_disable(void); \endcode
* \note When the USB device is unplugged or is reset by the USB host, the USB
* interface is disabled and the UDI_CDC_DISABLE_EXT() callback function
* is called. Thus, the data transfer must be stopped on CDC interface.
@@ -673,7 +673,7 @@ iram_size_t udi_cdc_multi_write_buf(uint8_t port, const void* buf, iram_size_t s
* \note Default configuration of communication port at startup.
* -# Send or wait data on CDC line:
* - \code // Waits and gets a value on CDC line
- int udi_cdc_getc();
+ int udi_cdc_getc(void);
// Reads a RAM buffer on CDC line
iram_size_t udi_cdc_read_buf(int* buf, iram_size_t size);
// Puts a byte on CDC line
diff --git a/Marlin/src/HAL/HAL_DUE/usb/udi_msc.c b/Marlin/src/HAL/HAL_DUE/usb/udi_msc.c
index 95b5e8a248..627bca0d4f 100644
--- a/Marlin/src/HAL/HAL_DUE/usb/udi_msc.c
+++ b/Marlin/src/HAL/HAL_DUE/usb/udi_msc.c
@@ -71,10 +71,10 @@
*
* @{
*/
-bool udi_msc_enable();
-void udi_msc_disable();
-bool udi_msc_setup();
-uint8_t udi_msc_getsetting();
+bool udi_msc_enable(void);
+void udi_msc_disable(void);
+bool udi_msc_setup(void);
+uint8_t udi_msc_getsetting(void);
//! Global structure which contains standard UDI API for UDC
UDC_DESC_STORAGE udi_api_t udi_api_msc = {
@@ -151,12 +151,12 @@ volatile bool udi_msc_b_reset_trans = true;
/**
* \brief Stall CBW request
*/
-static void udi_msc_cbw_invalid();
+static void udi_msc_cbw_invalid(void);
/**
* \brief Stall CSW request
*/
-static void udi_msc_csw_invalid();
+static void udi_msc_csw_invalid(void);
/**
* \brief Links a callback and buffer on endpoint OUT reception
@@ -165,7 +165,7 @@ static void udi_msc_csw_invalid();
* - enable interface
* - at the end of previous command after sending the CSW
*/
-static void udi_msc_cbw_wait();
+static void udi_msc_cbw_wait(void);
/**
* \brief Callback called after CBW reception
@@ -228,7 +228,7 @@ static void udi_msc_data_sent(udd_ep_status_t status, iram_size_t nb_sent,
*
* Called at the end of SCSI command
*/
-static void udi_msc_csw_process();
+static void udi_msc_csw_process(void);
/**
* \brief Sends CSW
@@ -236,7 +236,7 @@ static void udi_msc_csw_process();
* Called by #udi_msc_csw_process()
* or UDD callback when endpoint halt is cleared
*/
-void udi_msc_csw_send();
+void udi_msc_csw_send(void);
/**
* \brief Callback called after CSW sent
@@ -259,7 +259,7 @@ static void udi_msc_csw_sent(udd_ep_status_t status, iram_size_t nb_sent,
/**
* \brief Reinitialize sense data.
*/
-static void udi_msc_clear_sense();
+static void udi_msc_clear_sense(void);
/**
* \brief Update sense data with new value to signal a fail
@@ -274,37 +274,37 @@ static void udi_msc_sense_fail(uint8_t sense_key, uint16_t add_sense,
/**
* \brief Update sense data with new value to signal success
*/
-static void udi_msc_sense_pass();
+static void udi_msc_sense_pass(void);
/**
* \brief Update sense data to signal that memory is not present
*/
-static void udi_msc_sense_fail_not_present();
+static void udi_msc_sense_fail_not_present(void);
/**
* \brief Update sense data to signal that memory is busy
*/
-static void udi_msc_sense_fail_busy_or_change();
+static void udi_msc_sense_fail_busy_or_change(void);
/**
* \brief Update sense data to signal a hardware error on memory
*/
-static void udi_msc_sense_fail_hardware();
+static void udi_msc_sense_fail_hardware(void);
/**
* \brief Update sense data to signal that memory is protected
*/
-static void udi_msc_sense_fail_protected();
+static void udi_msc_sense_fail_protected(void);
/**
* \brief Update sense data to signal that CDB fields are not valid
*/
-static void udi_msc_sense_fail_cdb_invalid();
+static void udi_msc_sense_fail_cdb_invalid(void);
/**
* \brief Update sense data to signal that command is not supported
*/
-static void udi_msc_sense_command_invalid();
+static void udi_msc_sense_command_invalid(void);
//@}
@@ -317,31 +317,31 @@ static void udi_msc_sense_command_invalid();
* \brief Process SPC Request Sense command
* Returns error information about last command
*/
-static void udi_msc_spc_requestsense();
+static void udi_msc_spc_requestsense(void);
/**
* \brief Process SPC Inquiry command
* Returns information (name,version) about disk
*/
-static void udi_msc_spc_inquiry();
+static void udi_msc_spc_inquiry(void);
/**
* \brief Checks state of disk
*
* \retval true if disk is ready, otherwise false and updates sense data
*/
-static bool udi_msc_spc_testunitready_global();
+static bool udi_msc_spc_testunitready_global(void);
/**
* \brief Process test unit ready command
* Returns state of logical unit
*/
-static void udi_msc_spc_testunitready();
+static void udi_msc_spc_testunitready(void);
/**
* \brief Process prevent allow medium removal command
*/
-static void udi_msc_spc_prevent_allow_medium_removal();
+static void udi_msc_spc_prevent_allow_medium_removal(void);
/**
* \brief Process mode sense command
@@ -354,12 +354,12 @@ static void udi_msc_spc_mode_sense(bool b_sense10);
/**
* \brief Process start stop command
*/
-static void udi_msc_sbc_start_stop();
+static void udi_msc_sbc_start_stop(void);
/**
* \brief Process read capacity command
*/
-static void udi_msc_sbc_read_capacity();
+static void udi_msc_sbc_read_capacity(void);
/**
* \brief Process read10 or write10 command
@@ -373,7 +373,7 @@ static void udi_msc_sbc_trans(bool b_read);
//@}
-bool udi_msc_enable()
+bool udi_msc_enable(void)
{
uint8_t lun;
udi_msc_b_trans_req = false;
@@ -398,7 +398,7 @@ bool udi_msc_enable()
}
-void udi_msc_disable()
+void udi_msc_disable(void)
{
udi_msc_b_trans_req = false;
udi_msc_b_ack_trans = true;
@@ -407,7 +407,7 @@ void udi_msc_disable()
}
-bool udi_msc_setup()
+bool udi_msc_setup(void)
{
if (Udd_setup_is_in()) {
// Requests Interface GET
@@ -451,7 +451,7 @@ bool udi_msc_setup()
return false; // Not supported request
}
-uint8_t udi_msc_getsetting()
+uint8_t udi_msc_getsetting(void)
{
return 0; // MSC don't have multiple alternate setting
}
@@ -460,7 +460,7 @@ uint8_t udi_msc_getsetting()
// ------------------------
//------- Routines to process CBW packet
-static void udi_msc_cbw_invalid()
+static void udi_msc_cbw_invalid(void)
{
if (!udi_msc_b_cbw_invalid)
return; // Don't re-stall endpoint if error reseted by setup
@@ -469,7 +469,7 @@ static void udi_msc_cbw_invalid()
udd_ep_wait_stall_clear(UDI_MSC_EP_OUT, udi_msc_cbw_invalid);
}
-static void udi_msc_csw_invalid()
+static void udi_msc_csw_invalid(void)
{
if (!udi_msc_b_cbw_invalid)
return; // Don't re-stall endpoint if error reseted by setup
@@ -478,7 +478,7 @@ static void udi_msc_csw_invalid()
udd_ep_wait_stall_clear(UDI_MSC_EP_IN, udi_msc_csw_invalid);
}
-static void udi_msc_cbw_wait()
+static void udi_msc_cbw_wait(void)
{
// Register buffer and callback on OUT endpoint
if (!udd_ep_run(UDI_MSC_EP_OUT, true,
@@ -648,7 +648,7 @@ static void udi_msc_data_sent(udd_ep_status_t status, iram_size_t nb_sent,
// ------------------------
//------- Routines to process CSW packet
-static void udi_msc_csw_process()
+static void udi_msc_csw_process(void)
{
if (0 != udi_msc_csw.dCSWDataResidue) {
// Residue not NULL
@@ -665,7 +665,7 @@ static void udi_msc_csw_process()
}
-void udi_msc_csw_send()
+void udi_msc_csw_send(void)
{
// Sends CSW on IN endpoint
if (!udd_ep_run(UDI_MSC_EP_IN, false,
@@ -694,7 +694,7 @@ static void udi_msc_csw_sent(udd_ep_status_t status, iram_size_t nb_sent,
// ------------------------
//------- Routines manage sense data
-static void udi_msc_clear_sense()
+static void udi_msc_clear_sense(void)
{
memset((uint8_t*)&udi_msc_sense, 0, sizeof(struct scsi_request_sense_data));
udi_msc_sense.valid_reponse_code = SCSI_SENSE_VALID | SCSI_SENSE_CURRENT;
@@ -715,42 +715,42 @@ static void udi_msc_sense_fail(uint8_t sense_key, uint16_t add_sense,
udi_msc_sense.AddSnsCodeQlfr = add_sense;
}
-static void udi_msc_sense_pass()
+static void udi_msc_sense_pass(void)
{
udi_msc_clear_sense();
udi_msc_csw.bCSWStatus = USB_CSW_STATUS_PASS;
}
-static void udi_msc_sense_fail_not_present()
+static void udi_msc_sense_fail_not_present(void)
{
udi_msc_sense_fail(SCSI_SK_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT, 0);
}
-static void udi_msc_sense_fail_busy_or_change()
+static void udi_msc_sense_fail_busy_or_change(void)
{
udi_msc_sense_fail(SCSI_SK_UNIT_ATTENTION,
SCSI_ASC_NOT_READY_TO_READY_CHANGE, 0);
}
-static void udi_msc_sense_fail_hardware()
+static void udi_msc_sense_fail_hardware(void)
{
udi_msc_sense_fail(SCSI_SK_HARDWARE_ERROR,
SCSI_ASC_NO_ADDITIONAL_SENSE_INFO, 0);
}
-static void udi_msc_sense_fail_protected()
+static void udi_msc_sense_fail_protected(void)
{
udi_msc_sense_fail(SCSI_SK_DATA_PROTECT, SCSI_ASC_WRITE_PROTECTED, 0);
}
-static void udi_msc_sense_fail_cdb_invalid()
+static void udi_msc_sense_fail_cdb_invalid(void)
{
udi_msc_sense_fail(SCSI_SK_ILLEGAL_REQUEST,
SCSI_ASC_INVALID_FIELD_IN_CDB, 0);
}
-static void udi_msc_sense_command_invalid()
+static void udi_msc_sense_command_invalid(void)
{
udi_msc_sense_fail(SCSI_SK_ILLEGAL_REQUEST,
SCSI_ASC_INVALID_COMMAND_OPERATION_CODE, 0);
@@ -760,7 +760,7 @@ static void udi_msc_sense_command_invalid()
// ------------------------
//------- Routines manage SCSI Commands
-static void udi_msc_spc_requestsense()
+static void udi_msc_spc_requestsense(void)
{
uint8_t length = udi_msc_cbw.CDB[4];
@@ -775,7 +775,7 @@ static void udi_msc_spc_requestsense()
}
-static void udi_msc_spc_inquiry()
+static void udi_msc_spc_inquiry(void)
{
uint8_t length, i;
UDC_DATA(4)
@@ -836,7 +836,7 @@ static void udi_msc_spc_inquiry()
}
-static bool udi_msc_spc_testunitready_global()
+static bool udi_msc_spc_testunitready_global(void)
{
switch (mem_test_unit_ready(udi_msc_cbw.bCBWLUN)) {
case CTRL_GOOD:
@@ -856,7 +856,7 @@ static bool udi_msc_spc_testunitready_global()
}
-static void udi_msc_spc_testunitready()
+static void udi_msc_spc_testunitready(void)
{
if (udi_msc_spc_testunitready_global()) {
// LUN ready, then update sense data with status pass
@@ -944,7 +944,7 @@ static void udi_msc_spc_mode_sense(bool b_sense10)
}
-static void udi_msc_spc_prevent_allow_medium_removal()
+static void udi_msc_spc_prevent_allow_medium_removal(void)
{
uint8_t prevent = udi_msc_cbw.CDB[4];
if (0 == prevent) {
@@ -956,7 +956,7 @@ static void udi_msc_spc_prevent_allow_medium_removal()
}
-static void udi_msc_sbc_start_stop()
+static void udi_msc_sbc_start_stop(void)
{
bool start = 0x1 & udi_msc_cbw.CDB[4];
bool loej = 0x2 & udi_msc_cbw.CDB[4];
@@ -968,7 +968,7 @@ static void udi_msc_sbc_start_stop()
}
-static void udi_msc_sbc_read_capacity()
+static void udi_msc_sbc_read_capacity(void)
{
UDC_BSS(4) static struct sbc_read_capacity10_data udi_msc_capacity;
@@ -1039,7 +1039,7 @@ static void udi_msc_sbc_trans(bool b_read)
}
-bool udi_msc_process_trans()
+bool udi_msc_process_trans(void)
{
Ctrl_status status;
diff --git a/Marlin/src/HAL/HAL_DUE/usb/udi_msc.h b/Marlin/src/HAL/HAL_DUE/usb/udi_msc.h
index e7271e4835..c632ee4aac 100644
--- a/Marlin/src/HAL/HAL_DUE/usb/udi_msc.h
+++ b/Marlin/src/HAL/HAL_DUE/usb/udi_msc.h
@@ -148,7 +148,7 @@ typedef struct {
*
* Routine called by the main loop
*/
-bool udi_msc_process_trans();
+bool udi_msc_process_trans(void);
/**
* \brief Transfers data to/from USB MSC endpoints
@@ -206,26 +206,26 @@ bool udi_msc_trans_block(bool b_read, uint8_t * block, iram_size_t block_size,
#define UDI_MSC_GLOBAL_PRODUCT_VERSION \
'1', '.', '0', '0'
#define UDI_MSC_ENABLE_EXT() my_callback_msc_enable()
- extern bool my_callback_msc_enable();
+ extern bool my_callback_msc_enable(void);
#define UDI_MSC_DISABLE_EXT() my_callback_msc_disable()
- extern void my_callback_msc_disable();
+ extern void my_callback_msc_disable(void);
#include "udi_msc_conf.h" // At the end of conf_usb.h file
\endcode
*
* Add to application C-file:
* \code
static bool my_flag_autorize_msc_transfert = false;
- bool my_callback_msc_enable()
+ bool my_callback_msc_enable(void)
{
my_flag_autorize_msc_transfert = true;
return true;
}
- void my_callback_msc_disable()
+ void my_callback_msc_disable(void)
{
my_flag_autorize_msc_transfert = false;
}
- void task()
+ void task(void)
{
udi_msc_process_trans();
}
@@ -244,7 +244,7 @@ bool udi_msc_trans_block(bool b_read, uint8_t * block, iram_size_t block_size,
* \note The USB MSC interface requires a vendor ID (8 ASCII characters)
* and a product version (4 ASCII characters).
* - \code #define UDI_MSC_ENABLE_EXT() my_callback_msc_enable()
- extern bool my_callback_msc_enable(); \endcode
+ extern bool my_callback_msc_enable(void); \endcode
* \note After the device enumeration (detecting and identifying USB devices),
* the USB host starts the device configuration. When the USB MSC interface
* from the device is accepted by the host, the USB host enables this interface and the
@@ -252,7 +252,7 @@ bool udi_msc_trans_block(bool b_read, uint8_t * block, iram_size_t block_size,
* Thus, when this event is received, the tasks which call
* udi_msc_process_trans() must be enabled.
* - \code #define UDI_MSC_DISABLE_EXT() my_callback_msc_disable()
- extern void my_callback_msc_disable(); \endcode
+ extern void my_callback_msc_disable(void); \endcode
* \note When the USB device is unplugged or is reset by the USB host, the USB
* interface is disabled and the UDI_MSC_DISABLE_EXT() callback function
* is called. Thus, it is recommended to disable the task which is called udi_msc_process_trans().
@@ -260,14 +260,14 @@ bool udi_msc_trans_block(bool b_read, uint8_t * block, iram_size_t block_size,
* which provides the memories interfaces. However, the memory data transfers
* must be done outside USB interrupt routine. This is done in the MSC process
* ("udi_msc_process_trans()") called by main loop:
- * - \code * void task() {
+ * - \code * void task(void) {
udi_msc_process_trans();
} \endcode
* -# The MSC speed depends on task periodicity. To get the best speed
* the notification callback "UDI_MSC_NOTIFY_TRANS_EXT" can be used to wakeup
* this task (Example, through a mutex):
* - \code #define UDI_MSC_NOTIFY_TRANS_EXT() msc_notify_trans()
- void msc_notify_trans() {
+ void msc_notify_trans(void) {
wakeup_my_task();
} \endcode
*
diff --git a/Marlin/src/HAL/HAL_DUE/usb/uotghs_device_due.c b/Marlin/src/HAL/HAL_DUE/usb/uotghs_device_due.c
index ae569e2f55..9bac29276c 100644
--- a/Marlin/src/HAL/HAL_DUE/usb/uotghs_device_due.c
+++ b/Marlin/src/HAL/HAL_DUE/usb/uotghs_device_due.c
@@ -357,41 +357,41 @@ static uint16_t udd_ctrl_payload_buf_cnt;
*
* Called after a USB line reset or when UDD is enabled
*/
-static void udd_reset_ep_ctrl();
+static void udd_reset_ep_ctrl(void);
/**
* \brief Reset control endpoint management
*
* Called after a USB line reset or at the end of SETUP request (after ZLP)
*/
-static void udd_ctrl_init();
+static void udd_ctrl_init(void);
//! \brief Managed reception of SETUP packet on control endpoint
-static void udd_ctrl_setup_received();
+static void udd_ctrl_setup_received(void);
//! \brief Managed reception of IN packet on control endpoint
-static void udd_ctrl_in_sent();
+static void udd_ctrl_in_sent(void);
//! \brief Managed reception of OUT packet on control endpoint
-static void udd_ctrl_out_received();
+static void udd_ctrl_out_received(void);
//! \brief Managed underflow event of IN packet on control endpoint
-static void udd_ctrl_underflow();
+static void udd_ctrl_underflow(void);
//! \brief Managed overflow event of OUT packet on control endpoint
-static void udd_ctrl_overflow();
+static void udd_ctrl_overflow(void);
//! \brief Managed stall event of IN/OUT packet on control endpoint
-static void udd_ctrl_stall_data();
+static void udd_ctrl_stall_data(void);
//! \brief Send a ZLP IN on control endpoint
-static void udd_ctrl_send_zlp_in();
+static void udd_ctrl_send_zlp_in(void);
//! \brief Send a ZLP OUT on control endpoint
-static void udd_ctrl_send_zlp_out();
+static void udd_ctrl_send_zlp_out(void);
//! \brief Call callback associated to setup request
-static void udd_ctrl_endofrequest();
+static void udd_ctrl_endofrequest(void);
/**
@@ -401,7 +401,7 @@ static void udd_ctrl_endofrequest();
*
* \return \c 1 if an event about control endpoint is occured, otherwise \c 0.
*/
-static bool udd_ctrl_interrupt();
+static bool udd_ctrl_interrupt(void);
//@}
@@ -448,10 +448,10 @@ typedef struct {
static udd_ep_job_t udd_ep_job[USB_DEVICE_MAX_EP];
//! \brief Reset all job table
-static void udd_ep_job_table_reset();
+static void udd_ep_job_table_reset(void);
//! \brief Abort all endpoint jobs on going
-static void udd_ep_job_table_kill();
+static void udd_ep_job_table_kill(void);
#ifdef UDD_EP_FIFO_SUPPORTED
/**
@@ -500,7 +500,7 @@ static void udd_ep_finish_job(udd_ep_job_t * ptr_job, bool b_abort, uint8_t ep_n
*
* \return \c 1 if an event about bulk/interrupt/isochronous endpoints has occured, otherwise \c 0.
*/
-static bool udd_ep_interrupt();
+static bool udd_ep_interrupt(void);
#endif // (0!=USB_DEVICE_MAX_EP)
//@}
@@ -524,8 +524,8 @@ static bool udd_ep_interrupt();
* See Technical reference $3.8.3 Masking interrupt requests in peripheral modules.
*/
#ifdef UHD_ENABLE
-void udd_interrupt();
-void udd_interrupt()
+void udd_interrupt(void);
+void udd_interrupt(void)
#else
ISR(UDD_USB_INT_FUN)
#endif
@@ -643,13 +643,13 @@ udd_interrupt_sof_end:
}
-bool udd_include_vbus_monitoring()
+bool udd_include_vbus_monitoring(void)
{
return true;
}
-void udd_enable()
+void udd_enable(void)
{
irqflags_t flags;
@@ -736,7 +736,7 @@ void udd_enable()
}
-void udd_disable()
+void udd_disable(void)
{
irqflags_t flags;
@@ -777,7 +777,7 @@ void udd_disable()
}
-void udd_attach()
+void udd_attach(void)
{
irqflags_t flags;
flags = cpu_irq_save();
@@ -818,7 +818,7 @@ void udd_attach()
}
-void udd_detach()
+void udd_detach(void)
{
otg_unfreeze_clock();
@@ -829,7 +829,7 @@ void udd_detach()
}
-bool udd_is_high_speed()
+bool udd_is_high_speed(void)
{
#ifdef USB_DEVICE_HS_SUPPORT
return !Is_udd_full_speed_mode();
@@ -847,23 +847,23 @@ void udd_set_address(uint8_t address)
}
-uint8_t udd_getaddress()
+uint8_t udd_getaddress(void)
{
return udd_get_configured_address();
}
-uint16_t udd_get_frame_number()
+uint16_t udd_get_frame_number(void)
{
return udd_frame_number();
}
-uint16_t udd_get_micro_frame_number()
+uint16_t udd_get_micro_frame_number(void)
{
return udd_micro_frame_number();
}
-void udd_send_remotewakeup()
+void udd_send_remotewakeup(void)
{
#ifndef UDD_NO_SLEEP_MGR
if (!udd_b_idle)
@@ -1242,27 +1242,27 @@ bool udd_ep_wait_stall_clear(udd_ep_id_t ep,
#ifdef USB_DEVICE_HS_SUPPORT
-void udd_test_mode_j()
+void udd_test_mode_j(void)
{
udd_enable_hs_test_mode();
udd_enable_hs_test_mode_j();
}
-void udd_test_mode_k()
+void udd_test_mode_k(void)
{
udd_enable_hs_test_mode();
udd_enable_hs_test_mode_k();
}
-void udd_test_mode_se0_nak()
+void udd_test_mode_se0_nak(void)
{
udd_enable_hs_test_mode();
}
-void udd_test_mode_packet()
+void udd_test_mode_packet(void)
{
uint8_t i;
uint8_t *ptr_dest;
@@ -1310,7 +1310,7 @@ void udd_test_mode_packet()
// ------------------------
//--- INTERNAL ROUTINES TO MANAGED THE CONTROL ENDPOINT
-static void udd_reset_ep_ctrl()
+static void udd_reset_ep_ctrl(void)
{
irqflags_t flags;
@@ -1334,7 +1334,7 @@ static void udd_reset_ep_ctrl()
cpu_irq_restore(flags);
}
-static void udd_ctrl_init()
+static void udd_ctrl_init(void)
{
irqflags_t flags;
flags = cpu_irq_save();
@@ -1357,7 +1357,7 @@ static void udd_ctrl_init()
}
-static void udd_ctrl_setup_received()
+static void udd_ctrl_setup_received(void)
{
irqflags_t flags;
uint8_t i;
@@ -1419,7 +1419,7 @@ static void udd_ctrl_setup_received()
}
-static void udd_ctrl_in_sent()
+static void udd_ctrl_in_sent(void)
{
static bool b_shortpacket = false;
uint16_t nb_remain;
@@ -1503,7 +1503,7 @@ static void udd_ctrl_in_sent()
}
-static void udd_ctrl_out_received()
+static void udd_ctrl_out_received(void)
{
irqflags_t flags;
uint8_t i;
@@ -1594,7 +1594,7 @@ static void udd_ctrl_out_received()
}
-static void udd_ctrl_underflow()
+static void udd_ctrl_underflow(void)
{
if (Is_udd_out_received(0))
return; // Underflow ignored if OUT data is received
@@ -1611,7 +1611,7 @@ static void udd_ctrl_underflow()
}
-static void udd_ctrl_overflow()
+static void udd_ctrl_overflow(void)
{
if (Is_udd_in_send(0))
return; // Overflow ignored if IN data is received
@@ -1627,7 +1627,7 @@ static void udd_ctrl_overflow()
}
-static void udd_ctrl_stall_data()
+static void udd_ctrl_stall_data(void)
{
// Stall all packets on IN & OUT control endpoint
udd_ep_control_state = UDD_EPCTRL_STALL_REQ;
@@ -1635,7 +1635,7 @@ static void udd_ctrl_stall_data()
}
-static void udd_ctrl_send_zlp_in()
+static void udd_ctrl_send_zlp_in(void)
{
irqflags_t flags;
@@ -1653,7 +1653,7 @@ static void udd_ctrl_send_zlp_in()
}
-static void udd_ctrl_send_zlp_out()
+static void udd_ctrl_send_zlp_out(void)
{
irqflags_t flags;
@@ -1669,7 +1669,7 @@ static void udd_ctrl_send_zlp_out()
}
-static void udd_ctrl_endofrequest()
+static void udd_ctrl_endofrequest(void)
{
// If a callback is registered then call it
if (udd_g_ctrlreq.callback) {
@@ -1678,7 +1678,7 @@ static void udd_ctrl_endofrequest()
}
-static bool udd_ctrl_interrupt()
+static bool udd_ctrl_interrupt(void)
{
if (!Is_udd_endpoint_interrupt(0)) {
@@ -1734,7 +1734,7 @@ static bool udd_ctrl_interrupt()
#if (0 != USB_DEVICE_MAX_EP)
-static void udd_ep_job_table_reset()
+static void udd_ep_job_table_reset(void)
{
uint8_t i;
for (i = 0; i < USB_DEVICE_MAX_EP; i++) {
@@ -1744,7 +1744,7 @@ static void udd_ep_job_table_reset()
}
-static void udd_ep_job_table_kill()
+static void udd_ep_job_table_kill(void)
{
uint8_t i;
@@ -1970,7 +1970,7 @@ static void udd_ep_out_received(udd_ep_id_t ep)
}
#endif // #ifdef UDD_EP_FIFO_SUPPORTED
-static bool udd_ep_interrupt()
+static bool udd_ep_interrupt(void)
{
udd_ep_id_t ep;
udd_ep_job_t *ptr_job;
diff --git a/Marlin/src/HAL/HAL_DUE/usb/uotghs_otg.h b/Marlin/src/HAL/HAL_DUE/usb/uotghs_otg.h
index 13a66b2261..86c903b2c1 100644
--- a/Marlin/src/HAL/HAL_DUE/usb/uotghs_otg.h
+++ b/Marlin/src/HAL/HAL_DUE/usb/uotghs_otg.h
@@ -66,13 +66,13 @@ extern "C" {
*
* \return \c true if the ID pin management has been started, otherwise \c false.
*/
-bool otg_dual_enable();
+bool otg_dual_enable(void);
/**
* \brief Uninitialize the dual role
* This function is implemented in uotghs_host.c file.
*/
-void otg_dual_disable();
+void otg_dual_disable(void);
//! @name UOTGHS OTG ID pin management
diff --git a/Marlin/src/HAL/HAL_DUE/usb/usb_task.c b/Marlin/src/HAL/HAL_DUE/usb/usb_task.c
index 7c95c99c07..b735858018 100644
--- a/Marlin/src/HAL/HAL_DUE/usb/usb_task.c
+++ b/Marlin/src/HAL/HAL_DUE/usb/usb_task.c
@@ -56,7 +56,7 @@
static volatile bool main_b_cdc_enable = false;
static volatile bool main_b_dtr_active = false;
-void usb_task_idle() {
+void usb_task_idle(void) {
#if ENABLED(SDSUPPORT)
// Attend SD card access from the USB MSD -- Prioritize access to improve speed
int delay = 2;
@@ -70,14 +70,14 @@ void usb_task_idle() {
}
#if ENABLED(SDSUPPORT)
- bool usb_task_msc_enable() { return ((main_b_msc_enable = true)); }
- void usb_task_msc_disable() { main_b_msc_enable = false; }
- bool usb_task_msc_isenabled() { return main_b_msc_enable; }
+ bool usb_task_msc_enable(void) { return ((main_b_msc_enable = true)); }
+ void usb_task_msc_disable(void) { main_b_msc_enable = false; }
+ bool usb_task_msc_isenabled(void) { return main_b_msc_enable; }
#endif
bool usb_task_cdc_enable(const uint8_t port) { UNUSED(port); return ((main_b_cdc_enable = true)); }
void usb_task_cdc_disable(const uint8_t port) { UNUSED(port); main_b_cdc_enable = false; main_b_dtr_active = false; }
-bool usb_task_cdc_isenabled() { return main_b_cdc_enable; }
+bool usb_task_cdc_isenabled(void) { return main_b_cdc_enable; }
/*! \brief Called by CDC interface
* Callback running when CDC device have received data
@@ -121,7 +121,7 @@ void usb_task_cdc_set_dtr(const uint8_t port, const bool b_enable) {
}
}
-bool usb_task_cdc_dtr_active() { return main_b_dtr_active; }
+bool usb_task_cdc_dtr_active(void) { return main_b_dtr_active; }
/// Microsoft WCID descriptor
typedef struct USB_MicrosoftCompatibleDescriptor_Interface {
@@ -202,7 +202,7 @@ static USB_MicrosoftExtendedPropertiesDescriptor microsoft_extended_properties_d
** WCID configuration information
** Hooked into UDC via UDC_GET_EXTRA_STRING #define.
*/
-bool usb_task_extra_string() {
+bool usb_task_extra_string(void) {
static uint8_t udi_msft_magic[] = "MSFT100\xEE";
static uint8_t udi_cdc_name[] = "CDC interface";
#if ENABLED(SDSUPPORT)
@@ -262,7 +262,7 @@ bool usb_task_extra_string() {
/**************************************************************************************************
** Handle device requests that the ASF stack doesn't
*/
-bool usb_task_other_requests() {
+bool usb_task_other_requests(void) {
uint8_t* ptr = 0;
uint16_t size = 0;
@@ -297,7 +297,7 @@ bool usb_task_other_requests() {
return true;
}
-void usb_task_init() {
+void usb_task_init(void) {
uint16_t *ptr;
diff --git a/Marlin/src/HAL/HAL_DUE/usb/usb_task.h b/Marlin/src/HAL/HAL_DUE/usb/usb_task.h
index 26e4983481..fad62fda50 100644
--- a/Marlin/src/HAL/HAL_DUE/usb/usb_task.h
+++ b/Marlin/src/HAL/HAL_DUE/usb/usb_task.h
@@ -58,12 +58,12 @@ extern "C" {
*
* \retval true if MSC startup is ok
*/
-bool usb_task_msc_enable();
+bool usb_task_msc_enable(void);
/*! \brief Called by MSC interface
* Callback running when USB Host disable MSC interface
*/
-void usb_task_msc_disable();
+void usb_task_msc_disable(void);
/*! \brief Opens the communication port
* This is called by CDC interface when USB Host enable it.
@@ -84,25 +84,25 @@ void usb_task_cdc_set_dtr(const uint8_t port, const bool b_enable);
/*! \brief Check if MSC is enumerated and configured on the PC side
*/
-bool usb_task_msc_isenabled();
+bool usb_task_msc_isenabled(void);
/*! \brief Check if CDC is enumerated and configured on the PC side
*/
-bool usb_task_cdc_isenabled();
+bool usb_task_cdc_isenabled(void);
/*! \brief Check if CDC is actually OPEN by an application on the PC side
* assuming DTR signal means a program is listening to messages
*/
-bool usb_task_cdc_dtr_active();
+bool usb_task_cdc_dtr_active(void);
/*! \brief Called by UDC when USB Host request a extra string different
* of this specified in USB device descriptor
*/
-bool usb_task_extra_string();
+bool usb_task_extra_string(void);
/*! \brief Called by UDC when USB Host performs unknown requests
*/
-bool usb_task_other_requests();
+bool usb_task_other_requests(void);
/*! \brief Called by CDC interface
* Callback running when CDC device have received data
@@ -117,15 +117,15 @@ void usb_task_cdc_config(const uint8_t port, usb_cdc_line_coding_t *cfg);
/*! \brief The USB device interrupt
*/
-void USBD_ISR();
+void USBD_ISR(void);
/*! \brief USB task init
*/
-void usb_task_init();
+void usb_task_init(void);
/*! \brief USB task idle
*/
-void usb_task_idle();
+void usb_task_idle(void);
#ifdef __cplusplus
}
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/Servo.cpp b/Marlin/src/HAL/HAL_ESP32/Servo.cpp
index c6be4b1280..3c3b8fa704 100644
--- a/Marlin/src/HAL/HAL_ESP32/Servo.cpp
+++ b/Marlin/src/HAL/HAL_ESP32/Servo.cpp
@@ -32,25 +32,25 @@
int Servo::channel_next_free = 12;
Servo::Servo() {
- this->channel = channel_next_free++;
+ channel = channel_next_free++;
}
-int8_t Servo::attach(const int pin) {
- if (this->channel >= CHANNEL_MAX_NUM) return -1;
- if (pin > 0) this->pin = pin;
+int8_t Servo::attach(const int inPin) {
+ if (channel >= CHANNEL_MAX_NUM) return -1;
+ if (pin > 0) pin = inPin;
- ledcSetup(this->channel, 50, 16); // channel X, 50 Hz, 16-bit depth
- ledcAttachPin(this->pin, this->channel);
+ ledcSetup(channel, 50, 16); // channel X, 50 Hz, 16-bit depth
+ ledcAttachPin(pin, channel);
return true;
}
-void Servo::detach() { ledcDetachPin(this->pin); }
+void Servo::detach() { ledcDetachPin(pin); }
-int Servo::read() { return this->degrees; }
+int Servo::read() { return degrees; }
void Servo::write(int inDegrees) {
- this->degrees = constrain(inDegrees, MIN_ANGLE, MAX_ANGLE);
- int us = map(this->degrees, MIN_ANGLE, MAX_ANGLE, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH);
+ degrees = constrain(inDegrees, MIN_ANGLE, MAX_ANGLE);
+ int us = map(degrees, MIN_ANGLE, MAX_ANGLE, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH);
int duty = map(us, 0, TAU_USEC, 0, MAX_COMPARE);
ledcWrite(channel, duty);
}
@@ -58,11 +58,11 @@ void Servo::write(int inDegrees) {
void Servo::move(const int value) {
constexpr uint16_t servo_delay[] = SERVO_DELAY;
static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long.");
- if (this->attach(0) >= 0) {
- this->write(value);
- safe_delay(servo_delay[this->channel]);
+ if (attach(0) >= 0) {
+ write(value);
+ safe_delay(servo_delay[channel]);
#if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE)
- this->detach();
+ detach();
#endif
}
}
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/Servo.h b/Marlin/src/HAL/HAL_LPC1768/Servo.h
index 8b511032cb..1bbf84c73e 100644
--- a/Marlin/src/HAL/HAL_LPC1768/Servo.h
+++ b/Marlin/src/HAL/HAL_LPC1768/Servo.h
@@ -57,11 +57,11 @@ class libServo: public Servo {
constexpr uint16_t servo_delay[] = SERVO_DELAY;
static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long.");
- if (this->attach(servo_info[this->servoIndex].Pin.nbr) >= 0) { // try to reattach
- this->write(value);
- safe_delay(servo_delay[this->servoIndex]); // delay to allow servo to reach position
+ if (attach(servo_info[servoIndex].Pin.nbr) >= 0) { // try to reattach
+ write(value);
+ safe_delay(servo_delay[servoIndex]); // delay to allow servo to reach position
#if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE)
- this->detach();
+ detach();
#endif
}
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..b3ab59026e 100644
--- a/Marlin/src/HAL/HAL_LPC1768/upload_extra_script.py
+++ b/Marlin/src/HAL/HAL_LPC1768/upload_extra_script.py
@@ -31,9 +31,11 @@ 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 = str(subprocess.check_output("fsutil fsinfo drives"))
# typical result (string): 'C:\ D:\ E:\ F:\ G:\ H:\ I:\ J:\ K:\ L:\ M:\ Y:\ Z:\'
- driveStr = driveStr.strip().lstrip('Drives: ')
+ # driveStr = driveStr.strip().lstrip('Drives: ') <- Doesn't work in other Languages as English. In German is "Drives:" = "Laufwerke:"
+ FirstFound = driveStr.find(':',0,-1) # Find the first ":" and
+ driveStr = driveStr[FirstFound + 1 : -1] # truncate to the rest
# typical result (array of stings): ['C:\\', 'D:\\', 'E:\\', 'F:\\',
# 'G:\\', 'H:\\', 'I:\\', 'J:\\', 'K:\\', 'L:\\', 'M:\\', 'Y:\\', 'Z:\\']
drives = driveStr.split()
@@ -44,7 +46,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 = str(subprocess.check_output('cmd /C dir ' + final_drive_name, stderr=subprocess.STDOUT))
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 e70d575788..edc161a5d3 100644
--- a/Marlin/src/HAL/HAL_STM32/HAL.cpp
+++ b/Marlin/src/HAL/HAL_STM32/HAL.cpp
@@ -104,12 +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) { NVIC_SystemReset(); }
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
diff --git a/Marlin/src/HAL/HAL_STM32/HAL.h b/Marlin/src/HAL/HAL_STM32/HAL.h
index e275290ce5..dae75d42f2 100644
--- a/Marlin/src/HAL/HAL_STM32/HAL.h
+++ b/Marlin/src/HAL/HAL_STM32/HAL.h
@@ -198,3 +198,6 @@ uint16_t HAL_adc_get_result();
#define GET_PIN_MAP_PIN(index) index
#define GET_PIN_MAP_INDEX(pin) pin
#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval)
+
+#define PLATFORM_M997_SUPPORT
+void flashFirmware(int16_t value);
diff --git a/Marlin/src/HAL/HAL_STM32/Servo.cpp b/Marlin/src/HAL/HAL_STM32/Servo.cpp
index 93154f7847..2882f071ac 100644
--- a/Marlin/src/HAL/HAL_STM32/Servo.cpp
+++ b/Marlin/src/HAL/HAL_STM32/Servo.cpp
@@ -31,24 +31,24 @@
uint8_t servoPin[MAX_SERVOS] = { 0 };
int8_t libServo::attach(const int pin) {
- if (this->servoIndex >= MAX_SERVOS) return -1;
- if (pin > 0) servoPin[this->servoIndex] = pin;
- return Servo::attach(servoPin[this->servoIndex]);
+ if (servoIndex >= MAX_SERVOS) return -1;
+ if (pin > 0) servoPin[servoIndex] = pin;
+ return super::attach(servoPin[servoIndex]);
}
int8_t libServo::attach(const int pin, const int min, const int max) {
- if (pin > 0) servoPin[this->servoIndex] = pin;
- return Servo::attach(servoPin[this->servoIndex], min, max);
+ if (pin > 0) servoPin[servoIndex] = pin;
+ return super::attach(servoPin[servoIndex], min, max);
}
void libServo::move(const int value) {
constexpr uint16_t servo_delay[] = SERVO_DELAY;
static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long.");
- if (this->attach(0) >= 0) {
- this->write(value);
- safe_delay(servo_delay[this->servoIndex]);
+ if (attach(0) >= 0) {
+ write(value);
+ safe_delay(servo_delay[servoIndex]);
#if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE)
- this->detach();
+ detach();
#endif
}
}
diff --git a/Marlin/src/HAL/HAL_STM32/Servo.h b/Marlin/src/HAL/HAL_STM32/Servo.h
index a782c130e4..592f3a0662 100644
--- a/Marlin/src/HAL/HAL_STM32/Servo.h
+++ b/Marlin/src/HAL/HAL_STM32/Servo.h
@@ -31,6 +31,7 @@ class libServo : public Servo {
int8_t attach(const int pin, const int min, const int max);
void move(const int value);
private:
+ typedef Servo super;
uint16_t min_ticks, max_ticks;
uint8_t servoIndex; // index into the channel data for this servo
};
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/SPI.cpp b/Marlin/src/HAL/HAL_STM32F1/SPI.cpp
index bc10824c8b..101b42a53a 100644
--- a/Marlin/src/HAL/HAL_STM32F1/SPI.cpp
+++ b/Marlin/src/HAL/HAL_STM32F1/SPI.cpp
@@ -213,31 +213,31 @@ void SPIClass::setDataSize(uint32_t datasize) {
}
void SPIClass::setDataMode(uint8_t dataMode) {
- /*
- Notes:
- As far as we know the AVR numbers for dataMode match the numbers required by the STM32.
- From the AVR doc http://www.atmel.com/images/doc2585.pdf section 2.4
-
- SPI Mode CPOL CPHA Shift SCK-edge Capture SCK-edge
- 0 0 0 Falling Rising
- 1 0 1 Rising Falling
- 2 1 0 Rising Falling
- 3 1 1 Falling Rising
-
- On the STM32 it appears to be
-
- bit 1 - CPOL : Clock polarity
- (This bit should not be changed when communication is ongoing)
- 0 : CLK to 0 when idle
- 1 : CLK to 1 when idle
-
- bit 0 - CPHA : Clock phase
- (This bit should not be changed when communication is ongoing)
- 0 : The first clock transition is the first data capture edge
- 1 : The second clock transition is the first data capture edge
-
- If someone finds this is not the case or sees a logic error with this let me know ;-)
- */
+ /**
+ * Notes:
+ * As far as we know the AVR numbers for dataMode match the numbers required by the STM32.
+ * From the AVR doc http://www.atmel.com/images/doc2585.pdf section 2.4
+ *
+ * SPI Mode CPOL CPHA Shift SCK-edge Capture SCK-edge
+ * 0 0 0 Falling Rising
+ * 1 0 1 Rising Falling
+ * 2 1 0 Rising Falling
+ * 3 1 1 Falling Rising
+ *
+ * On the STM32 it appears to be
+ *
+ * bit 1 - CPOL : Clock polarity
+ * (This bit should not be changed when communication is ongoing)
+ * 0 : CLK to 0 when idle
+ * 1 : CLK to 1 when idle
+ *
+ * bit 0 - CPHA : Clock phase
+ * (This bit should not be changed when communication is ongoing)
+ * 0 : The first clock transition is the first data capture edge
+ * 1 : The second clock transition is the first data capture edge
+ *
+ * If someone finds this is not the case or sees a logic error with this let me know ;-)
+ */
_currentSetting->dataMode = dataMode;
uint32_t cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_CPOL|SPI_CR1_CPHA);
_currentSetting->spi_d->regs->CR1 = cr1 | (dataMode & (SPI_CR1_CPOL|SPI_CR1_CPHA));
@@ -593,7 +593,7 @@ void SPIClass::detachInterrupt() {
// Should be disableInterrupt()
}
-/*
+/**
* Pin accessors
*/
@@ -613,25 +613,14 @@ uint8_t SPIClass::nssPin() {
return dev_to_spi_pins(_currentSetting->spi_d)->nss;
}
-/*
+/**
* Deprecated functions
*/
+uint8_t SPIClass::send(uint8_t data) { write(data); return 1; }
+uint8_t SPIClass::send(uint8_t *buf, uint32_t len) { write(buf, len); return len; }
+uint8_t SPIClass::recv() { return read(); }
-uint8_t SPIClass::send(uint8_t data) {
- this->write(data);
- return 1;
-}
-
-uint8_t SPIClass::send(uint8_t *buf, uint32_t len) {
- this->write(buf, len);
- return len;
-}
-
-uint8_t SPIClass::recv() {
- return this->read();
-}
-
-/*
+/**
* DMA call back functions, one per port.
*/
#if BOARD_NR_SPI >= 1
@@ -650,7 +639,7 @@ uint8_t SPIClass::recv() {
}
#endif
-/*
+/**
* Auxiliary functions
*/
static const spi_pins* dev_to_spi_pins(spi_dev *dev) {
diff --git a/Marlin/src/HAL/HAL_STM32F1/SPI.h b/Marlin/src/HAL/HAL_STM32F1/SPI.h
index 20f22431f6..0162ac13bb 100644
--- a/Marlin/src/HAL/HAL_STM32F1/SPI.h
+++ b/Marlin/src/HAL/HAL_STM32F1/SPI.h
@@ -96,36 +96,36 @@ typedef enum {
class SPISettings {
public:
- SPISettings(uint32_t clock, BitOrder bitOrder, uint8_t dataMode) {
- if (__builtin_constant_p(clock))
- init_AlwaysInline(clock, bitOrder, dataMode, DATA_SIZE_8BIT);
+ SPISettings(uint32_t inClock, BitOrder inBitOrder, uint8_t inDataMode) {
+ if (__builtin_constant_p(inClock))
+ init_AlwaysInline(inClock, inBitOrder, inDataMode, DATA_SIZE_8BIT);
else
- init_MightInline(clock, bitOrder, dataMode, DATA_SIZE_8BIT);
+ init_MightInline(inClock, inBitOrder, inDataMode, DATA_SIZE_8BIT);
}
- SPISettings(uint32_t clock, BitOrder bitOrder, uint8_t dataMode, uint32_t dataSize) {
- if (__builtin_constant_p(clock))
- init_AlwaysInline(clock, bitOrder, dataMode, dataSize);
+ SPISettings(uint32_t inClock, BitOrder inBitOrder, uint8_t inDataMode, uint32_t inDataSize) {
+ if (__builtin_constant_p(inClock))
+ init_AlwaysInline(inClock, inBitOrder, inDataMode, inDataSize);
else
- init_MightInline(clock, bitOrder, dataMode, dataSize);
+ init_MightInline(inClock, inBitOrder, inDataMode, inDataSize);
}
- SPISettings(uint32_t clock) {
- if (__builtin_constant_p(clock))
- init_AlwaysInline(clock, MSBFIRST, SPI_MODE0, DATA_SIZE_8BIT);
+ SPISettings(uint32_t inClock) {
+ if (__builtin_constant_p(inClock))
+ init_AlwaysInline(inClock, MSBFIRST, SPI_MODE0, DATA_SIZE_8BIT);
else
- init_MightInline(clock, MSBFIRST, SPI_MODE0, DATA_SIZE_8BIT);
+ init_MightInline(inClock, MSBFIRST, SPI_MODE0, DATA_SIZE_8BIT);
}
SPISettings() {
init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0, DATA_SIZE_8BIT);
}
private:
- void init_MightInline(uint32_t clock, BitOrder bitOrder, uint8_t dataMode, uint32_t dataSize) {
- init_AlwaysInline(clock, bitOrder, dataMode, dataSize);
+ void init_MightInline(uint32_t inClock, BitOrder inBitOrder, uint8_t inDataMode, uint32_t inDataSize) {
+ init_AlwaysInline(inClock, inBitOrder, inDataMode, inDataSize);
}
- void init_AlwaysInline(uint32_t clock, BitOrder bitOrder, uint8_t dataMode, uint32_t dataSize) __attribute__((__always_inline__)) {
- this->clock = clock;
- this->bitOrder = bitOrder;
- this->dataMode = dataMode;
- this->dataSize = dataSize;
+ void init_AlwaysInline(uint32_t inClock, BitOrder inBitOrder, uint8_t inDataMode, uint32_t inDataSize) __attribute__((__always_inline__)) {
+ clock = inClock;
+ bitOrder = inBitOrder;
+ dataMode = inDataMode;
+ dataSize = inDataSize;
}
uint32_t clock;
uint32_t dataSize;
@@ -339,7 +339,7 @@ public:
* or 1-3 in high density devices.
*/
void setModule(int spi_num) {
- _currentSetting=&_settings[spi_num-1];// SPI channels are called 1 2 and 3 but the array is zero indexed
+ _currentSetting = &_settings[spi_num - 1];// SPI channels are called 1 2 and 3 but the array is zero indexed
}
/* -- The following methods are deprecated --------------------------- */
diff --git a/Marlin/src/HAL/HAL_STM32F1/Servo.cpp b/Marlin/src/HAL/HAL_STM32F1/Servo.cpp
index 9db978637d..5dc2169154 100644
--- a/Marlin/src/HAL/HAL_STM32F1/Servo.cpp
+++ b/Marlin/src/HAL/HAL_STM32F1/Servo.cpp
@@ -56,52 +56,50 @@ uint8_t ServoCount = 0;
#define SERVO_OVERFLOW ((uint16_t)round((double)TAU_CYC / SERVO_PRESCALER))
// Unit conversions
-#define US_TO_COMPARE(us) ((uint16_t)map((us), 0, TAU_USEC, 0, SERVO_OVERFLOW))
-#define COMPARE_TO_US(c) ((uint32_t)map((c), 0, SERVO_OVERFLOW, 0, TAU_USEC))
-#define ANGLE_TO_US(a) ((uint16_t)(map((a), this->minAngle, this->maxAngle, \
- SERVO_DEFAULT_MIN_PW, SERVO_DEFAULT_MAX_PW)))
-#define US_TO_ANGLE(us) ((int16_t)(map((us), SERVO_DEFAULT_MIN_PW, SERVO_DEFAULT_MAX_PW, \
- this->minAngle, this->maxAngle)))
+#define US_TO_COMPARE(us) uint16_t(map((us), 0, TAU_USEC, 0, SERVO_OVERFLOW))
+#define COMPARE_TO_US(c) uint32_t(map((c), 0, SERVO_OVERFLOW, 0, TAU_USEC))
+#define ANGLE_TO_US(a) uint16_t(map((a), minAngle, maxAngle, SERVO_DEFAULT_MIN_PW, SERVO_DEFAULT_MAX_PW))
+#define US_TO_ANGLE(us) int16_t(map((us), SERVO_DEFAULT_MIN_PW, SERVO_DEFAULT_MAX_PW, minAngle, maxAngle))
-void libServo::servoWrite(uint8_t pin, uint16_t duty_cycle) {
+void libServo::servoWrite(uint8_t inPin, uint16_t duty_cycle) {
#ifdef SERVO0_TIMER_NUM
- if (this->servoIndex == 0) {
- this->pwmSetDuty(duty_cycle);
+ if (servoIndex == 0) {
+ pwmSetDuty(duty_cycle);
return;
}
#endif
- timer_dev *tdev = PIN_MAP[pin].timer_device;
- uint8_t tchan = PIN_MAP[pin].timer_channel;
+ timer_dev *tdev = PIN_MAP[inPin].timer_device;
+ uint8_t tchan = PIN_MAP[inPin].timer_channel;
if (tdev) timer_set_compare(tdev, tchan, duty_cycle);
}
libServo::libServo() {
- this->servoIndex = ServoCount < MAX_SERVOS ? ServoCount++ : INVALID_SERVO;
+ servoIndex = ServoCount < MAX_SERVOS ? ServoCount++ : INVALID_SERVO;
}
-bool libServo::attach(const int32_t pin, const int32_t minAngle, const int32_t maxAngle) {
- if (this->servoIndex >= MAX_SERVOS) return false;
- if (pin >= BOARD_NR_GPIO_PINS) return false;
+bool libServo::attach(const int32_t inPin, const int32_t inMinAngle, const int32_t inMaxAngle) {
+ if (servoIndex >= MAX_SERVOS) return false;
+ if (inPin >= BOARD_NR_GPIO_PINS) return false;
- this->minAngle = minAngle;
- this->maxAngle = maxAngle;
- this->angle = -1;
+ minAngle = inMinAngle;
+ maxAngle = inMaxAngle;
+ angle = -1;
#ifdef SERVO0_TIMER_NUM
- if (this->servoIndex == 0 && this->setupSoftPWM(pin)) {
- this->pin = pin; // set attached()
+ if (servoIndex == 0 && setupSoftPWM(inPin)) {
+ pin = inPin; // set attached()
return true;
}
#endif
- if (!PWM_PIN(pin)) return false;
+ if (!PWM_PIN(inPin)) return false;
- timer_dev *tdev = PIN_MAP[pin].timer_device;
- //uint8_t tchan = PIN_MAP[pin].timer_channel;
+ timer_dev *tdev = PIN_MAP[inPin].timer_device;
+ //uint8_t tchan = PIN_MAP[inPin].timer_channel;
- SET_PWM(pin);
- servoWrite(pin, 0);
+ SET_PWM(inPin);
+ servoWrite(inPin, 0);
timer_pause(tdev);
timer_set_prescaler(tdev, SERVO_PRESCALER - 1); // prescaler is 1-based
@@ -109,25 +107,24 @@ bool libServo::attach(const int32_t pin, const int32_t minAngle, const int32_t m
timer_generate_update(tdev);
timer_resume(tdev);
- this->pin = pin; // set attached()
-
+ pin = inPin; // set attached()
return true;
}
bool libServo::detach() {
- if (!this->attached()) return false;
- this->angle = -1;
- servoWrite(this->pin, 0);
+ if (!attached()) return false;
+ angle = -1;
+ servoWrite(pin, 0);
return true;
}
int32_t libServo::read() const {
- if (this->attached()) {
+ if (attached()) {
#ifdef SERVO0_TIMER_NUM
- if (this->servoIndex == 0) return this->angle;
+ if (servoIndex == 0) return angle;
#endif
- timer_dev *tdev = PIN_MAP[this->pin].timer_device;
- uint8_t tchan = PIN_MAP[this->pin].timer_channel;
+ timer_dev *tdev = PIN_MAP[pin].timer_device;
+ uint8_t tchan = PIN_MAP[pin].timer_channel;
return US_TO_ANGLE(COMPARE_TO_US(timer_get_compare(tdev, tchan)));
}
return 0;
@@ -137,12 +134,12 @@ void libServo::move(const int32_t value) {
constexpr uint16_t servo_delay[] = SERVO_DELAY;
static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long.");
- if (this->attached()) {
- this->angle = constrain(value, this->minAngle, this->maxAngle);
- servoWrite(this->pin, US_TO_COMPARE(ANGLE_TO_US(this->angle)));
- safe_delay(servo_delay[this->servoIndex]);
+ if (attached()) {
+ angle = constrain(value, minAngle, maxAngle);
+ servoWrite(pin, US_TO_COMPARE(ANGLE_TO_US(angle)));
+ safe_delay(servo_delay[servoIndex]);
#if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE)
- this->detach();
+ detach();
#endif
}
}
@@ -169,13 +166,13 @@ void libServo::move(const int32_t value) {
}
}
- bool libServo::setupSoftPWM(const int32_t pin) {
+ bool libServo::setupSoftPWM(const int32_t inPin) {
timer_dev *tdev = get_timer_dev(SERVO0_TIMER_NUM);
if (!tdev) return false;
#ifdef SERVO0_PWM_OD
- OUT_WRITE_OD(pin, 1);
+ OUT_WRITE_OD(inPin, 1);
#else
- OUT_WRITE(pin, 0);
+ OUT_WRITE(inPin, 0);
#endif
timer_pause(tdev);
@@ -206,9 +203,9 @@ void libServo::move(const int32_t value) {
timer_disable_irq(tdev, 1);
timer_disable_irq(tdev, 2);
#ifdef SERVO0_PWM_OD
- OUT_WRITE_OD(this->pin, 1); // off
+ OUT_WRITE_OD(pin, 1); // off
#else
- OUT_WRITE(this->pin, 0);
+ OUT_WRITE(pin, 0);
#endif
}
}
@@ -221,7 +218,7 @@ void libServo::move(const int32_t value) {
#else
- bool libServo::setupSoftPWM(const int32_t pin) { return false; }
+ bool libServo::setupSoftPWM(const int32_t inPin) { return false; }
void libServo::pwmSetDuty(const uint16_t duty_cycle) {}
void libServo::pauseSoftPWM() {}
diff --git a/Marlin/src/HAL/HAL_STM32F1/Servo.h b/Marlin/src/HAL/HAL_STM32F1/Servo.h
index f97ca7486b..92f4dd678d 100644
--- a/Marlin/src/HAL/HAL_STM32F1/Servo.h
+++ b/Marlin/src/HAL/HAL_STM32F1/Servo.h
@@ -41,7 +41,7 @@ class libServo {
public:
libServo();
bool attach(const int32_t pin, const int32_t minAngle=SERVO_DEFAULT_MIN_ANGLE, const int32_t maxAngle=SERVO_DEFAULT_MAX_ANGLE);
- bool attached() const { return this->pin != NOT_ATTACHED; }
+ bool attached() const { return pin != NOT_ATTACHED; }
bool detach();
void move(const int32_t value);
int32_t read() const;
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/Servo.cpp b/Marlin/src/HAL/HAL_STM32_F4_F7/Servo.cpp
index 736ddd45e4..b3aac77615 100644
--- a/Marlin/src/HAL/HAL_STM32_F4_F7/Servo.cpp
+++ b/Marlin/src/HAL/HAL_STM32_F4_F7/Servo.cpp
@@ -30,22 +30,22 @@
#include "Servo.h"
int8_t libServo::attach(const int pin) {
- if (this->servoIndex >= MAX_SERVOS) return -1;
- return Servo::attach(pin);
+ if (servoIndex >= MAX_SERVOS) return -1;
+ return super::attach(pin);
}
int8_t libServo::attach(const int pin, const int min, const int max) {
- return Servo::attach(pin, min, max);
+ return super::attach(pin, min, max);
}
void libServo::move(const int value) {
constexpr uint16_t servo_delay[] = SERVO_DELAY;
static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long.");
- if (this->attach(0) >= 0) {
- this->write(value);
- safe_delay(servo_delay[this->servoIndex]);
+ if (attach(0) >= 0) {
+ write(value);
+ safe_delay(servo_delay[servoIndex]);
#if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE)
- this->detach();
+ detach();
#endif
}
}
diff --git a/Marlin/src/HAL/HAL_STM32_F4_F7/Servo.h b/Marlin/src/HAL/HAL_STM32_F4_F7/Servo.h
index c839c6a145..64fa05025c 100644
--- a/Marlin/src/HAL/HAL_STM32_F4_F7/Servo.h
+++ b/Marlin/src/HAL/HAL_STM32_F4_F7/Servo.h
@@ -35,6 +35,7 @@ class libServo : public Servo {
int8_t attach(const int pin, const int min, const int max);
void move(const int value);
private:
+ typedef Servo super;
uint16_t min_ticks, max_ticks;
uint8_t servoIndex; // index into the channel data for this servo
};
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/Servo.cpp b/Marlin/src/HAL/HAL_TEENSY31_32/Servo.cpp
index 7af900b149..6451f6b172 100644
--- a/Marlin/src/HAL/HAL_TEENSY31_32/Servo.cpp
+++ b/Marlin/src/HAL/HAL_TEENSY31_32/Servo.cpp
@@ -29,25 +29,25 @@
uint8_t servoPin[MAX_SERVOS] = { 0 };
-int8_t libServo::attach(const int pin) {
- if (this->servoIndex >= MAX_SERVOS) return -1;
- if (pin > 0) servoPin[this->servoIndex] = pin;
- return Servo::attach(servoPin[this->servoIndex]);
+int8_t libServo::attach(const int inPin) {
+ if (servoIndex >= MAX_SERVOS) return -1;
+ if (inPin > 0) servoPin[servoIndex] = inPin;
+ return super::attach(servoPin[servoIndex]);
}
-int8_t libServo::attach(const int pin, const int min, const int max) {
- if (pin > 0) servoPin[this->servoIndex] = pin;
- return Servo::attach(servoPin[this->servoIndex], min, max);
+int8_t libServo::attach(const int inPin, const int inMin, const int inMax) {
+ if (inPin > 0) servoPin[servoIndex] = inPin;
+ return super::attach(servoPin[servoIndex], inMin, inMax);
}
void libServo::move(const int value) {
constexpr uint16_t servo_delay[] = SERVO_DELAY;
static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long.");
- if (this->attach(0) >= 0) {
- this->write(value);
- safe_delay(servo_delay[this->servoIndex]);
+ if (attach(0) >= 0) {
+ write(value);
+ safe_delay(servo_delay[servoIndex]);
#if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE)
- this->detach();
+ detach();
#endif
}
}
diff --git a/Marlin/src/HAL/HAL_TEENSY31_32/Servo.h b/Marlin/src/HAL/HAL_TEENSY31_32/Servo.h
index e096dc60c8..3eb7d39b22 100644
--- a/Marlin/src/HAL/HAL_TEENSY31_32/Servo.h
+++ b/Marlin/src/HAL/HAL_TEENSY31_32/Servo.h
@@ -30,7 +30,8 @@ class libServo : public Servo {
int8_t attach(const int pin, const int min, const int max);
void move(const int value);
private:
- uint16_t min_ticks;
- uint16_t max_ticks;
- uint8_t servoIndex; // index into the channel data for this servo
+ typedef Servo super;
+ uint16_t min_ticks;
+ uint16_t max_ticks;
+ uint8_t servoIndex; // index into the channel data for this servo
};
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/Servo.cpp b/Marlin/src/HAL/HAL_TEENSY35_36/Servo.cpp
index faf72e9d1e..d376b80a7d 100644
--- a/Marlin/src/HAL/HAL_TEENSY35_36/Servo.cpp
+++ b/Marlin/src/HAL/HAL_TEENSY35_36/Servo.cpp
@@ -1,3 +1,24 @@
+/**
+ * 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 .
+ *
+ */
#if defined(__MK64FX512__) || defined(__MK66FX1M0__)
#include "../../inc/MarlinConfig.h"
@@ -8,25 +29,25 @@
uint8_t servoPin[MAX_SERVOS] = { 0 };
-int8_t libServo::attach(const int pin) {
- if (this->servoIndex >= MAX_SERVOS) return -1;
- if (pin > 0) servoPin[this->servoIndex] = pin;
- return Servo::attach(servoPin[this->servoIndex]);
+int8_t libServo::attach(const int inPin) {
+ if (servoIndex >= MAX_SERVOS) return -1;
+ if (inPin > 0) servoPin[servoIndex] = inPin;
+ return super::attach(servoPin[servoIndex]);
}
-int8_t libServo::attach(const int pin, const int min, const int max) {
- if (pin > 0) servoPin[this->servoIndex] = pin;
- return Servo::attach(servoPin[this->servoIndex], min, max);
+int8_t libServo::attach(const int inPin, const int inMin, const int inMax) {
+ if (inPin > 0) servoPin[servoIndex] = inPin;
+ return super::attach(servoPin[servoIndex], inMin, inMax);
}
void libServo::move(const int value) {
constexpr uint16_t servo_delay[] = SERVO_DELAY;
static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long.");
- if (this->attach(0) >= 0) {
- this->write(value);
- safe_delay(servo_delay[this->servoIndex]);
+ if (attach(0) >= 0) {
+ write(value);
+ safe_delay(servo_delay[servoIndex]);
#if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE)
- this->detach();
+ detach();
#endif
}
}
diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/Servo.h b/Marlin/src/HAL/HAL_TEENSY35_36/Servo.h
index 4b97dbffbb..cafd323a38 100644
--- a/Marlin/src/HAL/HAL_TEENSY35_36/Servo.h
+++ b/Marlin/src/HAL/HAL_TEENSY35_36/Servo.h
@@ -30,7 +30,8 @@ class libServo : public Servo {
int8_t attach(const int pin, const int min, const int max);
void move(const int value);
private:
- uint16_t min_ticks;
- uint16_t max_ticks;
- uint8_t servoIndex; // Index into the channel data for this servo
+ typedef Servo super;
+ uint16_t min_ticks;
+ uint16_t max_ticks;
+ uint8_t servoIndex; // Index into the channel data for this servo
};
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/HAL/shared/eeprom_i2c.cpp b/Marlin/src/HAL/shared/eeprom_i2c.cpp
index 9c9d48f2df..2752b7d4cc 100644
--- a/Marlin/src/HAL/shared/eeprom_i2c.cpp
+++ b/Marlin/src/HAL/shared/eeprom_i2c.cpp
@@ -43,11 +43,7 @@ static uint8_t eeprom_device_address = 0x50;
// ------------------------
static void eeprom_init() {
- static bool eeprom_initialized = false;
- if (!eeprom_initialized) {
- Wire.begin();
- eeprom_initialized = true;
- }
+ Wire.begin();
}
void eeprom_write_byte(uint8_t *pos, unsigned char value) {
diff --git a/Marlin/src/HAL/shared/servo.cpp b/Marlin/src/HAL/shared/servo.cpp
index 22cf6bc88f..b5975e58e7 100644
--- a/Marlin/src/HAL/shared/servo.cpp
+++ b/Marlin/src/HAL/shared/servo.cpp
@@ -58,11 +58,11 @@
#include "servo.h"
#include "servo_private.h"
-ServoInfo_t servo_info[MAX_SERVOS]; // static array of servo info structures
-uint8_t ServoCount = 0; // the total number of attached servos
+ServoInfo_t servo_info[MAX_SERVOS]; // static array of servo info structures
+uint8_t ServoCount = 0; // the total number of attached servos
-#define SERVO_MIN() (MIN_PULSE_WIDTH - this->min * 4) // minimum value in uS for this servo
-#define SERVO_MAX() (MAX_PULSE_WIDTH - this->max * 4) // maximum value in uS for this servo
+#define SERVO_MIN(v) (MIN_PULSE_WIDTH - (v) * 4) // minimum value in uS for this servo
+#define SERVO_MAX(v) (MAX_PULSE_WIDTH - (v) * 4) // maximum value in uS for this servo
/************ static functions common to all instances ***********************/
@@ -79,54 +79,54 @@ static boolean isTimerActive(timer16_Sequence_t timer) {
Servo::Servo() {
if (ServoCount < MAX_SERVOS) {
- this->servoIndex = ServoCount++; // assign a servo index to this instance
- servo_info[this->servoIndex].ticks = usToTicks(DEFAULT_PULSE_WIDTH); // store default values - 12 Aug 2009
+ servoIndex = ServoCount++; // assign a servo index to this instance
+ servo_info[servoIndex].ticks = usToTicks(DEFAULT_PULSE_WIDTH); // store default values - 12 Aug 2009
}
else
- this->servoIndex = INVALID_SERVO; // too many servos
+ servoIndex = INVALID_SERVO; // too many servos
}
-int8_t Servo::attach(const int pin) {
- return this->attach(pin, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH);
+int8_t Servo::attach(const int inPin) {
+ return attach(inPin, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH);
}
-int8_t Servo::attach(const int pin, const int min, const int max) {
+int8_t Servo::attach(const int inPin, const int inMin, const int inMax) {
- if (this->servoIndex >= MAX_SERVOS) return -1;
+ if (servoIndex >= MAX_SERVOS) return -1;
- if (pin > 0) servo_info[this->servoIndex].Pin.nbr = pin;
- pinMode(servo_info[this->servoIndex].Pin.nbr, OUTPUT); // set servo pin to output
+ if (inPin > 0) servo_info[servoIndex].Pin.nbr = inPin;
+ pinMode(servo_info[servoIndex].Pin.nbr, OUTPUT); // set servo pin to output
- // todo min/max check: ABS(min - MIN_PULSE_WIDTH) /4 < 128
- this->min = (MIN_PULSE_WIDTH - min) / 4; //resolution of min/max is 4 uS
- this->max = (MAX_PULSE_WIDTH - max) / 4;
+ // TODO: min/max check: ABS(min - MIN_PULSE_WIDTH) / 4 < 128
+ min = (MIN_PULSE_WIDTH - inMin) / 4; //resolution of min/max is 4 uS
+ max = (MAX_PULSE_WIDTH - inMax) / 4;
// initialize the timer if it has not already been initialized
timer16_Sequence_t timer = SERVO_INDEX_TO_TIMER(servoIndex);
if (!isTimerActive(timer)) initISR(timer);
- servo_info[this->servoIndex].Pin.isActive = true; // this must be set after the check for isTimerActive
+ servo_info[servoIndex].Pin.isActive = true; // this must be set after the check for isTimerActive
- return this->servoIndex;
+ return servoIndex;
}
void Servo::detach() {
- servo_info[this->servoIndex].Pin.isActive = false;
+ servo_info[servoIndex].Pin.isActive = false;
timer16_Sequence_t timer = SERVO_INDEX_TO_TIMER(servoIndex);
if (!isTimerActive(timer)) finISR(timer);
}
void Servo::write(int value) {
if (value < MIN_PULSE_WIDTH) // treat values less than 544 as angles in degrees (valid values in microseconds are handled as microseconds)
- value = map(constrain(value, 0, 180), 0, 180, SERVO_MIN(), SERVO_MAX());
- this->writeMicroseconds(value);
+ value = map(constrain(value, 0, 180), 0, 180, SERVO_MIN(min), SERVO_MAX(max));
+ writeMicroseconds(value);
}
void Servo::writeMicroseconds(int value) {
// calculate and store the values for the given channel
- byte channel = this->servoIndex;
+ byte channel = servoIndex;
if (channel < MAX_SERVOS) { // ensure channel is valid
// ensure pulse width is valid
- value = constrain(value, SERVO_MIN(), SERVO_MAX()) - (TRIM_DURATION);
+ value = constrain(value, SERVO_MIN(min), SERVO_MAX(max)) - (TRIM_DURATION);
value = usToTicks(value); // convert to ticks after compensating for interrupt overhead - 12 Aug 2009
CRITICAL_SECTION_START;
@@ -136,22 +136,22 @@ void Servo::writeMicroseconds(int value) {
}
// return the value as degrees
-int Servo::read() { return map(this->readMicroseconds() + 1, SERVO_MIN(), SERVO_MAX(), 0, 180); }
+int Servo::read() { return map(readMicroseconds() + 1, SERVO_MIN(min), SERVO_MAX(max), 0, 180); }
int Servo::readMicroseconds() {
- return (this->servoIndex == INVALID_SERVO) ? 0 : ticksToUs(servo_info[this->servoIndex].ticks) + (TRIM_DURATION);
+ return (servoIndex == INVALID_SERVO) ? 0 : ticksToUs(servo_info[servoIndex].ticks) + (TRIM_DURATION);
}
-bool Servo::attached() { return servo_info[this->servoIndex].Pin.isActive; }
+bool Servo::attached() { return servo_info[servoIndex].Pin.isActive; }
void Servo::move(const int value) {
constexpr uint16_t servo_delay[] = SERVO_DELAY;
static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long.");
- if (this->attach(0) >= 0) {
- this->write(value);
- safe_delay(servo_delay[this->servoIndex]);
+ if (attach(0) >= 0) {
+ write(value);
+ safe_delay(servo_delay[servoIndex]);
#if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE)
- this->detach();
+ detach();
#endif
}
}
diff --git a/Marlin/src/Marlin.cpp b/Marlin/src/Marlin.cpp
index 46a6aa61ce..de7b592ef1 100644
--- a/Marlin/src/Marlin.cpp
+++ b/Marlin/src/Marlin.cpp
@@ -145,6 +145,10 @@
#include "feature/power_loss_recovery.h"
#endif
+#if ENABLED(CANCEL_OBJECTS)
+ #include "feature/cancel_object.h"
+#endif
+
#if HAS_FILAMENT_SENSOR
#include "feature/runout.h"
#endif
@@ -173,10 +177,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
@@ -221,9 +221,9 @@ void setup_killpin() {
void setup_powerhold() {
#if HAS_SUICIDE
- OUT_WRITE(SUICIDE_PIN, HIGH);
+ OUT_WRITE(SUICIDE_PIN, !SUICIDE_PIN_INVERTING);
#endif
- #if HAS_POWER_SWITCH
+ #if ENABLED(PSU_CONTROL)
#if ENABLED(PS_DEFAULT_OFF)
powersupply_on = true; PSU_OFF();
#else
@@ -279,6 +279,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 +290,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 +315,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,13 +328,13 @@ 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
}
void event_probe_recover() {
#if ENABLED(HOST_PROMPT_SUPPORT)
- host_prompt_do(PROMPT_INFO, PSTR("G29 Retrying"));
+ host_prompt_do(PROMPT_INFO, PSTR("G29 Retrying"), PSTR("Dismiss"));
#endif
#ifdef ACTION_ON_G29_RECOVER
host_action(PSTR(ACTION_ON_G29_RECOVER));
@@ -426,6 +346,33 @@ void disable_all_steppers() {
#endif
+#if ENABLED(ADVANCED_PAUSE_FEATURE)
+ #include "feature/pause.h"
+#else
+ constexpr bool did_pause_print = false;
+#endif
+
+/**
+ * Printing is active when the print job timer is running
+ */
+bool printingIsActive() {
+ return !did_pause_print && (print_job_timer.isRunning() || IS_SD_PRINTING());
+}
+
+/**
+ * Printing is paused according to SD or host indicators
+ */
+bool printingIsPaused() {
+ return did_pause_print || print_job_timer.isPaused() || IS_SD_PAUSED();
+}
+
+void startOrResumeJob() {
+ #if ENABLED(CANCEL_OBJECTS)
+ if (!printingIsPaused()) cancelable.reset();
+ #endif
+ print_job_timer.start();
+}
+
/**
* Manage several activities:
* - Check for Filament Runout
@@ -582,10 +529,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 +576,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 +703,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
@@ -790,7 +738,7 @@ void minkill(const bool steppers_off/*=false*/) {
// Power off all steppers (for M112) or just the E steppers
steppers_off ? disable_all_steppers() : disable_e_steppers();
- #if HAS_POWER_SWITCH
+ #if ENABLED(PSU_CONTROL)
PSU_OFF();
#endif
@@ -801,29 +749,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
}
@@ -962,10 +898,11 @@ void setup() {
SERIAL_EOL();
#if defined(STRING_DISTRIBUTION_DATE) && defined(STRING_CONFIG_H_AUTHOR)
- SERIAL_ECHO_START();
- SERIAL_ECHOPGM(MSG_CONFIGURATION_VER);
- SERIAL_ECHOPGM(STRING_DISTRIBUTION_DATE);
- SERIAL_ECHOLNPGM(MSG_AUTHOR STRING_CONFIG_H_AUTHOR);
+ SERIAL_ECHO_MSG(
+ MSG_CONFIGURATION_VER
+ STRING_DISTRIBUTION_DATE
+ MSG_AUTHOR STRING_CONFIG_H_AUTHOR
+ );
SERIAL_ECHO_MSG("Compiled: " __DATE__);
#endif
@@ -974,9 +911,13 @@ void setup() {
// UI must be initialized before EEPROM
// (because EEPROM code calls the UI).
- ui.init();
- ui.reset_status();
+ // Set up LEDs early
+ #if HAS_COLOR_LEDS
+ leds.setup();
+ #endif
+
+ ui.init();
#if HAS_SPI_LCD && ENABLED(SHOW_BOOTSCREEN)
ui.show_bootscreen();
#endif
@@ -995,7 +936,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
@@ -1005,6 +946,8 @@ void setup() {
print_job_timer.init(); // Initial setup of print job timer
+ ui.reset_status(); // Print startup message after print statistics are loaded
+
endstops.init(); // Init endstops and pullups
stepper.init(); // Init stepper. This enables interrupts!
@@ -1068,10 +1011,6 @@ void setup() {
OUT_WRITE(STAT_LED_BLUE_PIN, LOW); // OFF
#endif
- #if HAS_COLOR_LEDS
- leds.setup();
- #endif
-
#if HAS_CASE_LIGHT
#if DISABLED(CASE_LIGHT_USE_NEOPIXEL)
if (PWM_PIN(CASE_LIGHT_PIN)) SET_PWM(CASE_LIGHT_PIN); else SET_OUTPUT(CASE_LIGHT_PIN);
@@ -1152,6 +1091,10 @@ void setup() {
card.beginautostart();
#endif
+ #if ENABLED(HOST_PROMPT_SUPPORT)
+ host_action_prompt_end();
+ #endif
+
#if HAS_TRINAMIC && DISABLED(PS_DEFAULT_OFF)
test_tmc_connection(true, true, true, true);
#endif
diff --git a/Marlin/src/Marlin.h b/Marlin/src/Marlin.h
index 1a9acc0075..f720c870a1 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,10 @@ extern bool Running;
inline bool IsRunning() { return Running; }
inline bool IsStopped() { return !Running; }
+bool printingIsActive();
+bool printingIsPaused();
+void startOrResumeJob();
+
extern bool wait_for_heatup;
#if HAS_RESUME_CONTINUE
@@ -348,7 +352,7 @@ extern millis_t max_inactive_time, stepper_inactive_time;
extern uint8_t controllerfan_speed;
#endif
-#if HAS_POWER_SWITCH
+#if ENABLED(PSU_CONTROL)
extern bool powersupply_on;
#define PSU_PIN_ON() do{ OUT_WRITE(PS_ON_PIN, PSU_ACTIVE_HIGH); powersupply_on = true; }while(0)
#define PSU_PIN_OFF() do{ OUT_WRITE(PS_ON_PIN, !PSU_ACTIVE_HIGH); powersupply_on = false; }while(0)
@@ -365,11 +369,7 @@ bool pin_is_protected(const pin_t pin);
void protected_pin_err();
#if HAS_SUICIDE
- inline void suicide() { OUT_WRITE(SUICIDE_PIN, LOW); }
-#endif
-
-#if HAS_FILAMENT_SENSOR
- void event_filament_runout();
+ inline void suicide() { OUT_WRITE(SUICIDE_PIN, SUICIDE_PIN_INVERTING); }
#endif
#if ENABLED(G29_RETRY_AND_RECOVER)
diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h
index 89f1f0d20d..cf533739a3 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
@@ -286,7 +289,7 @@
//
#define BOARD_BEAST 4200 // STM32F4xxVxT6 Libmaple-based STM32F4 controller
-#define BOARD_STM32F4 4201 // STM32 STM32GENERIC-based STM32F4 controller
+#define BOARD_GENERIC_STM32F4 4201 // STM32 STM32GENERIC-based STM32F4 controller
#define BOARD_ARMED 4202 // Arm'ed STM32F4-based controller
#define BOARD_RUMBA32 4203 // RUMBA32 STM32F4-based controller
#define BOARD_BLACK_STM32F407VE 4204 // BLACK_STM32F407VE
@@ -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 3a10340559..03deea89dc 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)
@@ -61,6 +61,13 @@
// Nanoseconds per cycle
#define NANOSECONDS_PER_CYCLE (1000000000.0 / F_CPU)
+// Macros to make sprintf_P read from PROGMEM (AVR extension)
+#ifdef __AVR__
+ #define S_FMT "%S"
+#else
+ #define S_FMT "%s"
+#endif
+
// Macros to make a string from a macro
#define STRINGIFY_(M) #M
#define STRINGIFY(M) STRINGIFY_(M)
@@ -198,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
@@ -244,9 +255,6 @@
#define DECREMENT_(n) DEC_##n
#define DECREMENT(n) DECREMENT_(n)
-#define MMM_TO_MMS(MM_M) ((MM_M)/60.0f)
-#define MMS_TO_MMM(MM_S) ((MM_S)*60.0f)
-
#define NOOP (void(0))
#define CEILING(x,y) (((x) + (y) - 1) / (y))
@@ -271,7 +279,7 @@
#define ATAN2(y, x) atan2f(y, x)
#define POW(x, y) powf(x, y)
#define SQRT(x) sqrtf(x)
-#define RSQRT(x) (1 / sqrtf(x))
+#define RSQRT(x) (1.0f / sqrtf(x))
#define CEIL(x) ceilf(x)
#define FLOOR(x) floorf(x)
#define LROUND(x) lroundf(x)
@@ -285,8 +293,8 @@
#endif
// Use NUM_ARGS(__VA_ARGS__) to get the number of variadic arguments
-#define _NUM_ARGS(_0,_24_,_23,_22,_21,_20,_19,_18,_17,_16,_15,_14,_13,_12,_11,_10,_9,_8,_7,_6,_5,_4,_3,_2,_1,N,...) N
-#define NUM_ARGS(V...) _NUM_ARGS(0,V,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0)
+#define _NUM_ARGS(_,Z,Y,X,W,V,U,T,S,R,Q,P,O,N,M,L,K,J,I,H,G,F,E,D,C,B,A,OUT,...) OUT
+#define NUM_ARGS(V...) _NUM_ARGS(0,V,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0)
#ifdef __cplusplus
@@ -312,29 +320,29 @@
#else
#define MIN_2(a,b) ((a)<(b)?(a):(b))
- #define MIN_3(a,...) MIN_2(a,MIN_2(__VA_ARGS__))
- #define MIN_4(a,...) MIN_2(a,MIN_3(__VA_ARGS__))
- #define MIN_5(a,...) MIN_2(a,MIN_4(__VA_ARGS__))
- #define MIN_6(a,...) MIN_2(a,MIN_5(__VA_ARGS__))
- #define MIN_7(a,...) MIN_2(a,MIN_6(__VA_ARGS__))
- #define MIN_8(a,...) MIN_2(a,MIN_7(__VA_ARGS__))
- #define MIN_9(a,...) MIN_2(a,MIN_8(__VA_ARGS__))
- #define MIN_10(a,...) MIN_2(a,MIN_9(__VA_ARGS__))
- #define __MIN_N(N, ...) MIN_##N(__VA_ARGS__)
- #define _MIN_N(N, ...) __MIN_N(N,__VA_ARGS__)
- #define _MIN(...) _MIN_N(NUM_ARGS(__VA_ARGS__), __VA_ARGS__)
+ #define MIN_3(a,V...) MIN_2(a,MIN_2(V))
+ #define MIN_4(a,V...) MIN_2(a,MIN_3(V))
+ #define MIN_5(a,V...) MIN_2(a,MIN_4(V))
+ #define MIN_6(a,V...) MIN_2(a,MIN_5(V))
+ #define MIN_7(a,V...) MIN_2(a,MIN_6(V))
+ #define MIN_8(a,V...) MIN_2(a,MIN_7(V))
+ #define MIN_9(a,V...) MIN_2(a,MIN_8(V))
+ #define MIN_10(a,V...) MIN_2(a,MIN_9(V))
+ #define __MIN_N(N,V...) MIN_##N(V)
+ #define _MIN_N(N,V...) __MIN_N(N,V)
+ #define _MIN(V...) _MIN_N(NUM_ARGS(V), V)
#define MAX_2(a,b) ((a)>(b)?(a):(b))
- #define MAX_3(a,...) MAX_2(a,MAX_2(__VA_ARGS__))
- #define MAX_4(a,...) MAX_2(a,MAX_3(__VA_ARGS__))
- #define MAX_5(a,...) MAX_2(a,MAX_4(__VA_ARGS__))
- #define MAX_6(a,...) MAX_2(a,MAX_5(__VA_ARGS__))
- #define MAX_7(a,...) MAX_2(a,MAX_6(__VA_ARGS__))
- #define MAX_8(a,...) MAX_2(a,MAX_7(__VA_ARGS__))
- #define MAX_9(a,...) MAX_2(a,MAX_8(__VA_ARGS__))
- #define MAX_10(a,...) MAX_2(a,MAX_9(__VA_ARGS__))
- #define __MAX_N(N, ...) MAX_##N(__VA_ARGS__)
- #define _MAX_N(N, ...) __MAX_N(N,__VA_ARGS__)
- #define _MAX(...) _MAX_N(NUM_ARGS(__VA_ARGS__), __VA_ARGS__)
+ #define MAX_3(a,V...) MAX_2(a,MAX_2(V))
+ #define MAX_4(a,V...) MAX_2(a,MAX_3(V))
+ #define MAX_5(a,V...) MAX_2(a,MAX_4(V))
+ #define MAX_6(a,V...) MAX_2(a,MAX_5(V))
+ #define MAX_7(a,V...) MAX_2(a,MAX_6(V))
+ #define MAX_8(a,V...) MAX_2(a,MAX_7(V))
+ #define MAX_9(a,V...) MAX_2(a,MAX_8(V))
+ #define MAX_10(a,V...) MAX_2(a,MAX_9(V))
+ #define __MAX_N(N,V...) MAX_##N(V)
+ #define _MAX_N(N,V...) __MAX_N(N,V)
+ #define _MAX(V...) _MAX_N(NUM_ARGS(V), V)
#endif
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