diff --git a/.gitignore b/.gitignore
index 6d5e5d26f0..518b03580a 100755
--- a/.gitignore
+++ b/.gitignore
@@ -27,7 +27,7 @@ bdf2u8g
# OS
#
applet/
-*.DS_Store
+.DS_Store
#
# Misc
@@ -167,7 +167,3 @@ __pycache__
# IOLogger logs
*_log.csv
-
-# Simulation / Native
-eeprom.dat
-imgui.ini
diff --git a/Ender3V2_Dwin_TM3DV2.7z b/Ender3V2_Dwin_TM3DV2.7z
new file mode 100644
index 0000000000..829fe54dae
Binary files /dev/null and b/Ender3V2_Dwin_TM3DV2.7z differ
diff --git a/Hex Files/10SProBLTUBLEncMC_DW7.4.4.hex.zip b/Hex Files/10SProBLTUBLEncMC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..a455eb4b76
Binary files /dev/null and b/Hex Files/10SProBLTUBLEncMC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/10SProV2_BIL_DW7.4.4.hex.zip b/Hex Files/10SProV2_BIL_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..4e97db6f99
Binary files /dev/null and b/Hex Files/10SProV2_BIL_DW7.4.4.hex.zip differ
diff --git a/Hex Files/10SProV2_BIL_MC_DW7.4.4.hex.zip b/Hex Files/10SProV2_BIL_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..960e4eda6a
Binary files /dev/null and b/Hex Files/10SProV2_BIL_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/10SProV2_BIL_ME_DW7.4.4.hex.zip b/Hex Files/10SProV2_BIL_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..615cb75354
Binary files /dev/null and b/Hex Files/10SProV2_BIL_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/10SProV2_UBL_DW7.4.4.hex.zip b/Hex Files/10SProV2_UBL_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..1eb05983d0
Binary files /dev/null and b/Hex Files/10SProV2_UBL_DW7.4.4.hex.zip differ
diff --git a/Hex Files/10SProV2_UBL_MC_DW7.4.4.hex.zip b/Hex Files/10SProV2_UBL_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..527c18c852
Binary files /dev/null and b/Hex Files/10SProV2_UBL_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/10SProV2_UBL_ME_DW7.4.4.hex.zip b/Hex Files/10SProV2_UBL_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..97bd246ab6
Binary files /dev/null and b/Hex Files/10SProV2_UBL_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/10SPro_BIL_DW7.4.4.hex.zip b/Hex Files/10SPro_BIL_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..614356991a
Binary files /dev/null and b/Hex Files/10SPro_BIL_DW7.4.4.hex.zip differ
diff --git a/Hex Files/10SPro_BIL_MC_DW7.4.4.hex.zip b/Hex Files/10SPro_BIL_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..5aed0ad223
Binary files /dev/null and b/Hex Files/10SPro_BIL_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/10SPro_BIL_ME_DW7.4.4.hex.zip b/Hex Files/10SPro_BIL_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..8f2f1b5238
Binary files /dev/null and b/Hex Files/10SPro_BIL_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/10SPro_BLTUBLEncME_DW7.4.4.hex.zip b/Hex Files/10SPro_BLTUBLEncME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..4a28383fa8
Binary files /dev/null and b/Hex Files/10SPro_BLTUBLEncME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/10SPro_BLT_BIL_DW7.4.4.hex.zip b/Hex Files/10SPro_BLT_BIL_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..fca0961813
Binary files /dev/null and b/Hex Files/10SPro_BLT_BIL_DW7.4.4.hex.zip differ
diff --git a/Hex Files/10SPro_BLT_BIL_MC_DW7.4.4.hex.zip b/Hex Files/10SPro_BLT_BIL_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..9a03e3dd3d
Binary files /dev/null and b/Hex Files/10SPro_BLT_BIL_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/10SPro_BLT_BIL_ME_DW7.4.4.hex.zip b/Hex Files/10SPro_BLT_BIL_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..8f485681f2
Binary files /dev/null and b/Hex Files/10SPro_BLT_BIL_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/10SPro_BLT_UBL_DW7.4.4.hex.zip b/Hex Files/10SPro_BLT_UBL_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..71a11427f0
Binary files /dev/null and b/Hex Files/10SPro_BLT_UBL_DW7.4.4.hex.zip differ
diff --git a/Hex Files/10SPro_BLT_UBL_Enc_DW7.4.4.hex.zip b/Hex Files/10SPro_BLT_UBL_Enc_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..4933e3e49a
Binary files /dev/null and b/Hex Files/10SPro_BLT_UBL_Enc_DW7.4.4.hex.zip differ
diff --git a/Hex Files/10SPro_BLT_UBL_MC_DW7.4.4.hex.zip b/Hex Files/10SPro_BLT_UBL_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..399bce8763
Binary files /dev/null and b/Hex Files/10SPro_BLT_UBL_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/10SPro_BLT_UBL_ME_DW7.4.4.hex.zip b/Hex Files/10SPro_BLT_UBL_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..3e41a97cdb
Binary files /dev/null and b/Hex Files/10SPro_BLT_UBL_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/10SPro_UBL_DW7.4.4.hex.zip b/Hex Files/10SPro_UBL_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..3bbed36d1d
Binary files /dev/null and b/Hex Files/10SPro_UBL_DW7.4.4.hex.zip differ
diff --git a/Hex Files/10SPro_UBL_MC_DW7.4.4.hex.zip b/Hex Files/10SPro_UBL_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..aa0bfbcfde
Binary files /dev/null and b/Hex Files/10SPro_UBL_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/10SPro_UBL_ME_DW7.4.4.hex.zip b/Hex Files/10SPro_UBL_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..211e40f83e
Binary files /dev/null and b/Hex Files/10SPro_UBL_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10Max_BIL_DW7.4.4.hex.zip b/Hex Files/CR10Max_BIL_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..27563e45a2
Binary files /dev/null and b/Hex Files/CR10Max_BIL_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10Max_BIL_MC_DW7.4.4.hex.zip b/Hex Files/CR10Max_BIL_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..c1d28c3cd7
Binary files /dev/null and b/Hex Files/CR10Max_BIL_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10Max_BIL_ME_DW7.4.4.hex.zip b/Hex Files/CR10Max_BIL_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..659e6a6da6
Binary files /dev/null and b/Hex Files/CR10Max_BIL_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10Max_UBL_DW7.4.4.hex.zip b/Hex Files/CR10Max_UBL_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..dc90e90e18
Binary files /dev/null and b/Hex Files/CR10Max_UBL_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10Max_UBL_MC_DW7.4.4.hex.zip b/Hex Files/CR10Max_UBL_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..fe58d3bce7
Binary files /dev/null and b/Hex Files/CR10Max_UBL_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10Max_UBL_ME_DW7.4.4.hex.zip b/Hex Files/CR10Max_UBL_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..c5a56f69e1
Binary files /dev/null and b/Hex Files/CR10Max_UBL_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10MiniBLTHostMC_DW7.4.4.hex.zip b/Hex Files/CR10MiniBLTHostMC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..1c577fef22
Binary files /dev/null and b/Hex Files/CR10MiniBLTHostMC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10MiniBLTHostME_DW7.4.4.hex.zip b/Hex Files/CR10MiniBLTHostME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..de10712de3
Binary files /dev/null and b/Hex Files/CR10MiniBLTHostME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10Mini_BLT_Host_DW7.4.4.hex.zip b/Hex Files/CR10Mini_BLT_Host_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..c61c58bf55
Binary files /dev/null and b/Hex Files/CR10Mini_BLT_Host_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10Mini_BLT_SD_DW7.4.4.hex.zip b/Hex Files/CR10Mini_BLT_SD_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..1adba51438
Binary files /dev/null and b/Hex Files/CR10Mini_BLT_SD_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10Mini_BLT_SD_MC_DW7.4.4.hex.zip b/Hex Files/CR10Mini_BLT_SD_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..38a83302c1
Binary files /dev/null and b/Hex Files/CR10Mini_BLT_SD_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10Mini_BLT_SD_ME_DW7.4.4.hex.zip b/Hex Files/CR10Mini_BLT_SD_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..ebace3aa9c
Binary files /dev/null and b/Hex Files/CR10Mini_BLT_SD_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10Mini_DW7.4.4.hex.zip b/Hex Files/CR10Mini_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..f33961ab98
Binary files /dev/null and b/Hex Files/CR10Mini_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10Mini_MC_DW7.4.4.hex.zip b/Hex Files/CR10Mini_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..8173001572
Binary files /dev/null and b/Hex Files/CR10Mini_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10Mini_ME_DW7.4.4.hex.zip b/Hex Files/CR10Mini_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..96a12a1f42
Binary files /dev/null and b/Hex Files/CR10Mini_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10S_BLT_DW7.4.4.hex.zip b/Hex Files/CR10S_BLT_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..515870d0d1
Binary files /dev/null and b/Hex Files/CR10S_BLT_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10S_BLT_LR_DW7.4.4.hex.zip b/Hex Files/CR10S_BLT_LR_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..8e9118db2d
Binary files /dev/null and b/Hex Files/CR10S_BLT_LR_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10S_BLT_MC_DW7.4.4.hex.zip b/Hex Files/CR10S_BLT_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..82f16c4d26
Binary files /dev/null and b/Hex Files/CR10S_BLT_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10S_BLT_MC_NF_DW7.4.4.hex.zip b/Hex Files/CR10S_BLT_MC_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..6d4b271b51
Binary files /dev/null and b/Hex Files/CR10S_BLT_MC_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10S_BLT_ME_DW7.4.4.hex.zip b/Hex Files/CR10S_BLT_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..faca7debd2
Binary files /dev/null and b/Hex Files/CR10S_BLT_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10S_BLT_ME_NF_DW7.4.4.hex.zip b/Hex Files/CR10S_BLT_ME_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..758b4c7302
Binary files /dev/null and b/Hex Files/CR10S_BLT_ME_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10S_BLT_NF_DW7.4.4.hex.zip b/Hex Files/CR10S_BLT_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..69a2d36c70
Binary files /dev/null and b/Hex Files/CR10S_BLT_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10S_BLT_NF_LR_DW7.4.4.hex.zip b/Hex Files/CR10S_BLT_NF_LR_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..aad148bf78
Binary files /dev/null and b/Hex Files/CR10S_BLT_NF_LR_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10S_BLT_UBL_DW7.4.4.hex.zip b/Hex Files/CR10S_BLT_UBL_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..c33b768560
Binary files /dev/null and b/Hex Files/CR10S_BLT_UBL_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10S_BLT_UBL_MC_DW7.4.4.hex.zip b/Hex Files/CR10S_BLT_UBL_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..6de8fc0cc8
Binary files /dev/null and b/Hex Files/CR10S_BLT_UBL_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10S_BLT_UBL_MC_NF_DW7.4.4.hex.zip b/Hex Files/CR10S_BLT_UBL_MC_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..d2ad506aef
Binary files /dev/null and b/Hex Files/CR10S_BLT_UBL_MC_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10S_BLT_UBL_ME_DW7.4.4.hex.zip b/Hex Files/CR10S_BLT_UBL_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..d3ee4847b3
Binary files /dev/null and b/Hex Files/CR10S_BLT_UBL_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10S_BLT_UBL_ME_NF_DW7.4.4.hex.zip b/Hex Files/CR10S_BLT_UBL_ME_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..a94a058bf1
Binary files /dev/null and b/Hex Files/CR10S_BLT_UBL_ME_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10S_BLT_UBL_NF_DW7.4.4.hex.zip b/Hex Files/CR10S_BLT_UBL_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..bcd9958602
Binary files /dev/null and b/Hex Files/CR10S_BLT_UBL_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10S_BLT_UBL_NF_LR_DW7.4.4.hex.zip b/Hex Files/CR10S_BLT_UBL_NF_LR_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..bb6d733fcb
Binary files /dev/null and b/Hex Files/CR10S_BLT_UBL_NF_LR_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10S_DW7.4.4.hex.zip b/Hex Files/CR10S_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..ea66860566
Binary files /dev/null and b/Hex Files/CR10S_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10S_LR_DW7.4.4.hex.zip b/Hex Files/CR10S_LR_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..8f03434aac
Binary files /dev/null and b/Hex Files/CR10S_LR_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10S_MC_DW7.4.4.hex.zip b/Hex Files/CR10S_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..11315826a3
Binary files /dev/null and b/Hex Files/CR10S_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10S_MC_NF_DW7.4.4.hex.zip b/Hex Files/CR10S_MC_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..6040269e37
Binary files /dev/null and b/Hex Files/CR10S_MC_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10S_ME_DW7.4.4.hex.zip b/Hex Files/CR10S_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..5d1056d637
Binary files /dev/null and b/Hex Files/CR10S_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10S_ME_NF_DW7.4.4.hex.zip b/Hex Files/CR10S_ME_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..a2f90ced1d
Binary files /dev/null and b/Hex Files/CR10S_ME_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10S_NF_DW7.4.4.hex.zip b/Hex Files/CR10S_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..1f349a16c9
Binary files /dev/null and b/Hex Files/CR10S_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10S_NF_LR_DW7.4.4.hex.zip b/Hex Files/CR10S_NF_LR_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..f48f84232c
Binary files /dev/null and b/Hex Files/CR10S_NF_LR_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10V2_BLT_DW7.4.4.hex.zip b/Hex Files/CR10V2_BLT_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..ddb1df024f
Binary files /dev/null and b/Hex Files/CR10V2_BLT_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10V2_BLT_MC_DW7.4.4.hex.zip b/Hex Files/CR10V2_BLT_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..0097271e4d
Binary files /dev/null and b/Hex Files/CR10V2_BLT_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10V2_BLT_MC_NF_DW7.4.4.hex.zip b/Hex Files/CR10V2_BLT_MC_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..dcec1e8a4c
Binary files /dev/null and b/Hex Files/CR10V2_BLT_MC_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10V2_BLT_ME_DW7.4.4.hex.zip b/Hex Files/CR10V2_BLT_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..55617b522b
Binary files /dev/null and b/Hex Files/CR10V2_BLT_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10V2_BLT_ME_NF_DW7.4.4.hex.zip b/Hex Files/CR10V2_BLT_ME_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..f736fa1578
Binary files /dev/null and b/Hex Files/CR10V2_BLT_ME_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10V2_BLT_NF_DW7.4.4.hex.zip b/Hex Files/CR10V2_BLT_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..9770db53d8
Binary files /dev/null and b/Hex Files/CR10V2_BLT_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10V2_BLT_UBL_DW7.4.4.hex.zip b/Hex Files/CR10V2_BLT_UBL_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..be282e1e6e
Binary files /dev/null and b/Hex Files/CR10V2_BLT_UBL_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10V2_BLT_UBL_MC_DW7.4.4.hex.zip b/Hex Files/CR10V2_BLT_UBL_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..2c969939ee
Binary files /dev/null and b/Hex Files/CR10V2_BLT_UBL_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10V2_BLT_UBL_MC_NF_DW7.4.4.hex.zip b/Hex Files/CR10V2_BLT_UBL_MC_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..e653fc8c3b
Binary files /dev/null and b/Hex Files/CR10V2_BLT_UBL_MC_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10V2_BLT_UBL_ME_DW7.4.4.hex.zip b/Hex Files/CR10V2_BLT_UBL_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..b57d6b51df
Binary files /dev/null and b/Hex Files/CR10V2_BLT_UBL_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10V2_BLT_UBL_ME_NF_DW7.4.4.hex.zip b/Hex Files/CR10V2_BLT_UBL_ME_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..52c93fec55
Binary files /dev/null and b/Hex Files/CR10V2_BLT_UBL_ME_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10V2_BLT_UBL_NF_DW7.4.4.hex.zip b/Hex Files/CR10V2_BLT_UBL_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..a95bf0ddc1
Binary files /dev/null and b/Hex Files/CR10V2_BLT_UBL_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10V2_DW7.4.4.hex.zip b/Hex Files/CR10V2_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..1faff3538f
Binary files /dev/null and b/Hex Files/CR10V2_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10V2_MC_DW7.4.4.hex.zip b/Hex Files/CR10V2_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..45a8a45e8f
Binary files /dev/null and b/Hex Files/CR10V2_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10V2_MC_NF_DW7.4.4.hex.zip b/Hex Files/CR10V2_MC_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..a9a9b17acf
Binary files /dev/null and b/Hex Files/CR10V2_MC_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10V2_ME_DW7.4.4.hex.zip b/Hex Files/CR10V2_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..2018342a23
Binary files /dev/null and b/Hex Files/CR10V2_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10V2_ME_NF_DW7.4.4.hex.zip b/Hex Files/CR10V2_ME_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..baf44b77f7
Binary files /dev/null and b/Hex Files/CR10V2_ME_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10V2_NF_DW7.4.4.hex.zip b/Hex Files/CR10V2_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..54f431d235
Binary files /dev/null and b/Hex Files/CR10V2_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10V2_UBL_DW7.4.4.hex.zip b/Hex Files/CR10V2_UBL_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..430d3430c9
Binary files /dev/null and b/Hex Files/CR10V2_UBL_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10V2_UBL_MC_DW7.4.4.hex.zip b/Hex Files/CR10V2_UBL_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..d7dc87fb00
Binary files /dev/null and b/Hex Files/CR10V2_UBL_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10V2_UBL_MC_NF_DW7.4.4.hex.zip b/Hex Files/CR10V2_UBL_MC_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..090e6a4ee2
Binary files /dev/null and b/Hex Files/CR10V2_UBL_MC_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10V2_UBL_ME_DW7.4.4.hex.zip b/Hex Files/CR10V2_UBL_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..1904f5d5d4
Binary files /dev/null and b/Hex Files/CR10V2_UBL_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10V2_UBL_ME_NF_DW7.4.4.hex.zip b/Hex Files/CR10V2_UBL_ME_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..4b35fd1d89
Binary files /dev/null and b/Hex Files/CR10V2_UBL_ME_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10V2_UBL_NF_DW7.4.4.hex.zip b/Hex Files/CR10V2_UBL_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..1b354cd110
Binary files /dev/null and b/Hex Files/CR10V2_UBL_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10V3_DW7.4.4.hex.zip b/Hex Files/CR10V3_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..3d8e0202d1
Binary files /dev/null and b/Hex Files/CR10V3_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10_BLT_Host_DW7.4.4.hex.zip b/Hex Files/CR10_BLT_Host_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..2c706e9299
Binary files /dev/null and b/Hex Files/CR10_BLT_Host_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10_BLT_Host_MC_DW7.4.4.hex.zip b/Hex Files/CR10_BLT_Host_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..bb99db18be
Binary files /dev/null and b/Hex Files/CR10_BLT_Host_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10_BLT_Host_MC_NF_DW7.4.4.hex.zip b/Hex Files/CR10_BLT_Host_MC_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..fa8c28cd17
Binary files /dev/null and b/Hex Files/CR10_BLT_Host_MC_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10_BLT_Host_ME_DW7.4.4.hex.zip b/Hex Files/CR10_BLT_Host_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..d782b82672
Binary files /dev/null and b/Hex Files/CR10_BLT_Host_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10_BLT_SD_DW7.4.4.hex.zip b/Hex Files/CR10_BLT_SD_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..9a2f99ff44
Binary files /dev/null and b/Hex Files/CR10_BLT_SD_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10_BLT_SD_MC_DW7.4.4.hex.zip b/Hex Files/CR10_BLT_SD_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..6a92d83d7c
Binary files /dev/null and b/Hex Files/CR10_BLT_SD_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10_BLT_SD_MC_NF_DW7.4.4.hex.zip b/Hex Files/CR10_BLT_SD_MC_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..3f255cbfd3
Binary files /dev/null and b/Hex Files/CR10_BLT_SD_MC_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10_BLT_SD_ME_DW7.4.4.hex.zip b/Hex Files/CR10_BLT_SD_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..26d27f60a0
Binary files /dev/null and b/Hex Files/CR10_BLT_SD_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10_DW7.4.4.hex.zip b/Hex Files/CR10_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..49a8d2292a
Binary files /dev/null and b/Hex Files/CR10_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10_MC_DW7.4.4.hex.zip b/Hex Files/CR10_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..9a6389ea4c
Binary files /dev/null and b/Hex Files/CR10_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10_MC_NF_DW7.4.4.hex.zip b/Hex Files/CR10_MC_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..2ec2ef65d0
Binary files /dev/null and b/Hex Files/CR10_MC_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR10_ME_DW7.4.4.hex.zip b/Hex Files/CR10_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..dfbeebd973
Binary files /dev/null and b/Hex Files/CR10_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR2020_DW7.4.4.hex.zip b/Hex Files/CR2020_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..a5b60109f6
Binary files /dev/null and b/Hex Files/CR2020_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR20_BLT_DW7.4.4.hex.zip b/Hex Files/CR20_BLT_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..113113931f
Binary files /dev/null and b/Hex Files/CR20_BLT_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR20_BLT_LR_DW7.4.4.hex.zip b/Hex Files/CR20_BLT_LR_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..e3af94aba8
Binary files /dev/null and b/Hex Files/CR20_BLT_LR_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR20_BLT_MC_DW7.4.4.hex.zip b/Hex Files/CR20_BLT_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..f6ef8778e7
Binary files /dev/null and b/Hex Files/CR20_BLT_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR20_BLT_ME_DW7.4.4.hex.zip b/Hex Files/CR20_BLT_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..e528f6ee5f
Binary files /dev/null and b/Hex Files/CR20_BLT_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR20_BLT_UBL_DW7.4.4.hex.zip b/Hex Files/CR20_BLT_UBL_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..fb9d3ec2c2
Binary files /dev/null and b/Hex Files/CR20_BLT_UBL_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR20_BLT_UBL_LR_DW7.4.4.hex.zip b/Hex Files/CR20_BLT_UBL_LR_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..925a502b18
Binary files /dev/null and b/Hex Files/CR20_BLT_UBL_LR_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR20_BLT_UBL_MC_DW7.4.4.hex.zip b/Hex Files/CR20_BLT_UBL_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..c9f1051a19
Binary files /dev/null and b/Hex Files/CR20_BLT_UBL_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR20_BLT_UBL_ME_DW7.4.4.hex.zip b/Hex Files/CR20_BLT_UBL_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..4e52e365d5
Binary files /dev/null and b/Hex Files/CR20_BLT_UBL_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR20_DW7.4.4.hex.zip b/Hex Files/CR20_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..775b25d7ab
Binary files /dev/null and b/Hex Files/CR20_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR20_LR_DW7.4.4.hex.zip b/Hex Files/CR20_LR_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..41f84fea35
Binary files /dev/null and b/Hex Files/CR20_LR_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR20_MC_DW7.4.4.hex.zip b/Hex Files/CR20_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..a27a1ff0ff
Binary files /dev/null and b/Hex Files/CR20_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR20_ME_DW7.4.4.hex.zip b/Hex Files/CR20_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..51b66c7461
Binary files /dev/null and b/Hex Files/CR20_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR20_Pro_DW7.4.4.hex.zip b/Hex Files/CR20_Pro_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..cda6b0bbeb
Binary files /dev/null and b/Hex Files/CR20_Pro_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR20_Pro_LR_DW7.4.4.hex.zip b/Hex Files/CR20_Pro_LR_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..fd808f5564
Binary files /dev/null and b/Hex Files/CR20_Pro_LR_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR20_Pro_MC_DW7.4.4.hex.zip b/Hex Files/CR20_Pro_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..1d2925c068
Binary files /dev/null and b/Hex Files/CR20_Pro_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR20_Pro_ME_DW7.4.4.hex.zip b/Hex Files/CR20_Pro_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..1b80328fee
Binary files /dev/null and b/Hex Files/CR20_Pro_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR20_Pro_UBL_DW7.4.4.hex.zip b/Hex Files/CR20_Pro_UBL_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..4a464f2ab1
Binary files /dev/null and b/Hex Files/CR20_Pro_UBL_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR20_Pro_UBL_LR_DW7.4.4.hex.zip b/Hex Files/CR20_Pro_UBL_LR_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..922ac27752
Binary files /dev/null and b/Hex Files/CR20_Pro_UBL_LR_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR20_Pro_UBL_MC_DW7.4.4.hex.zip b/Hex Files/CR20_Pro_UBL_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..095b900726
Binary files /dev/null and b/Hex Files/CR20_Pro_UBL_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CR20_Pro_UBL_ME_DW7.4.4.hex.zip b/Hex Files/CR20_Pro_UBL_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..4665511e67
Binary files /dev/null and b/Hex Files/CR20_Pro_UBL_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CRXPro_BILNoFilMC_DW7.4.4.hex.zip b/Hex Files/CRXPro_BILNoFilMC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..438baf8703
Binary files /dev/null and b/Hex Files/CRXPro_BILNoFilMC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CRXPro_BILNoFilME_DW7.4.4.hex.zip b/Hex Files/CRXPro_BILNoFilME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..6388609d3c
Binary files /dev/null and b/Hex Files/CRXPro_BILNoFilME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CRXPro_BIL_Fil_DW7.4.4.hex.zip b/Hex Files/CRXPro_BIL_Fil_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..6c224fcf27
Binary files /dev/null and b/Hex Files/CRXPro_BIL_Fil_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CRXPro_BIL_Fil_MC_DW7.4.4.hex.zip b/Hex Files/CRXPro_BIL_Fil_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..c1418fc9d2
Binary files /dev/null and b/Hex Files/CRXPro_BIL_Fil_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CRXPro_BIL_Fil_ME_DW7.4.4.hex.zip b/Hex Files/CRXPro_BIL_Fil_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..42b98f990b
Binary files /dev/null and b/Hex Files/CRXPro_BIL_Fil_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CRXPro_BIL_NoFil_DW7.4.4.hex.zip b/Hex Files/CRXPro_BIL_NoFil_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..86a87d7fe9
Binary files /dev/null and b/Hex Files/CRXPro_BIL_NoFil_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CRXPro_UBLNoFilMC_DW7.4.4.hex.zip b/Hex Files/CRXPro_UBLNoFilMC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..2cf8ed72f4
Binary files /dev/null and b/Hex Files/CRXPro_UBLNoFilMC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CRXPro_UBLNoFilME_DW7.4.4.hex.zip b/Hex Files/CRXPro_UBLNoFilME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..7555f95c31
Binary files /dev/null and b/Hex Files/CRXPro_UBLNoFilME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CRXPro_UBL_Fil_DW7.4.4.hex.zip b/Hex Files/CRXPro_UBL_Fil_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..7d71ff2a3f
Binary files /dev/null and b/Hex Files/CRXPro_UBL_Fil_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CRXPro_UBL_Fil_MC_DW7.4.4.hex.zip b/Hex Files/CRXPro_UBL_Fil_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..172111c59b
Binary files /dev/null and b/Hex Files/CRXPro_UBL_Fil_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CRXPro_UBL_Fil_ME_DW7.4.4.hex.zip b/Hex Files/CRXPro_UBL_Fil_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..3bceb6ba6a
Binary files /dev/null and b/Hex Files/CRXPro_UBL_Fil_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CRXPro_UBL_NoFil_DW7.4.4.hex.zip b/Hex Files/CRXPro_UBL_NoFil_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..945bffc413
Binary files /dev/null and b/Hex Files/CRXPro_UBL_NoFil_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CRX_BLTBILNoFilME_DW7.4.4.hex.zip b/Hex Files/CRX_BLTBILNoFilME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..176761d6b0
Binary files /dev/null and b/Hex Files/CRX_BLTBILNoFilME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CRX_BLTUBLNoFilME_DW7.4.4.hex.zip b/Hex Files/CRX_BLTUBLNoFilME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..635dd5b83a
Binary files /dev/null and b/Hex Files/CRX_BLTUBLNoFilME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CRX_BLT_BILNoFilMC_DW7.4.4.hex.zip b/Hex Files/CRX_BLT_BILNoFilMC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..2b6751e95a
Binary files /dev/null and b/Hex Files/CRX_BLT_BILNoFilMC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CRX_BLT_BIL_Fil_DW7.4.4.hex.zip b/Hex Files/CRX_BLT_BIL_Fil_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..d59d954a97
Binary files /dev/null and b/Hex Files/CRX_BLT_BIL_Fil_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CRX_BLT_BIL_Fil_MC_DW7.4.4.hex.zip b/Hex Files/CRX_BLT_BIL_Fil_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..37fa35c2e3
Binary files /dev/null and b/Hex Files/CRX_BLT_BIL_Fil_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CRX_BLT_BIL_Fil_ME_DW7.4.4.hex.zip b/Hex Files/CRX_BLT_BIL_Fil_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..d497455972
Binary files /dev/null and b/Hex Files/CRX_BLT_BIL_Fil_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CRX_BLT_BIL_NoFil_DW7.4.4.hex.zip b/Hex Files/CRX_BLT_BIL_NoFil_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..d7f223dbee
Binary files /dev/null and b/Hex Files/CRX_BLT_BIL_NoFil_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CRX_BLT_UBLNoFilMC_DW7.4.4.hex.zip b/Hex Files/CRX_BLT_UBLNoFilMC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..1028cf93b6
Binary files /dev/null and b/Hex Files/CRX_BLT_UBLNoFilMC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CRX_BLT_UBL_Fil_DW7.4.4.hex.zip b/Hex Files/CRX_BLT_UBL_Fil_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..d9e6f65e1f
Binary files /dev/null and b/Hex Files/CRX_BLT_UBL_Fil_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CRX_BLT_UBL_Fil_MC_DW7.4.4.hex.zip b/Hex Files/CRX_BLT_UBL_Fil_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..7f82f6f696
Binary files /dev/null and b/Hex Files/CRX_BLT_UBL_Fil_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CRX_BLT_UBL_Fil_ME_DW7.4.4.hex.zip b/Hex Files/CRX_BLT_UBL_Fil_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..feba45c72f
Binary files /dev/null and b/Hex Files/CRX_BLT_UBL_Fil_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CRX_BLT_UBL_NoFil_DW7.4.4.hex.zip b/Hex Files/CRX_BLT_UBL_NoFil_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..90eac9c92c
Binary files /dev/null and b/Hex Files/CRX_BLT_UBL_NoFil_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CRX_Fil_DW7.4.4.hex.zip b/Hex Files/CRX_Fil_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..18de512b43
Binary files /dev/null and b/Hex Files/CRX_Fil_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CRX_Fil_MC_DW7.4.4.hex.zip b/Hex Files/CRX_Fil_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..b30cba0c29
Binary files /dev/null and b/Hex Files/CRX_Fil_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CRX_Fil_ME_DW7.4.4.hex.zip b/Hex Files/CRX_Fil_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..2aa7ee4f97
Binary files /dev/null and b/Hex Files/CRX_Fil_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CRX_NoFil_DW7.4.4.hex.zip b/Hex Files/CRX_NoFil_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..549afeb54b
Binary files /dev/null and b/Hex Files/CRX_NoFil_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CRX_NoFil_MC_DW7.4.4.hex.zip b/Hex Files/CRX_NoFil_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..738915cad5
Binary files /dev/null and b/Hex Files/CRX_NoFil_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/CRX_NoFil_ME_DW7.4.4.hex.zip b/Hex Files/CRX_NoFil_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..697e9d4996
Binary files /dev/null and b/Hex Files/CRX_NoFil_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/E5PBILSlntDZH_DW7.4.4.hex.zip b/Hex Files/E5PBILSlntDZH_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..2350e4b001
Binary files /dev/null and b/Hex Files/E5PBILSlntDZH_DW7.4.4.hex.zip differ
diff --git a/Hex Files/E5PBILSlntDZ_DW7.4.4.hex.zip b/Hex Files/E5PBILSlntDZ_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..79875fd850
Binary files /dev/null and b/Hex Files/E5PBILSlntDZ_DW7.4.4.hex.zip differ
diff --git a/Hex Files/E5PBILSlntDZ_MC_DW7.4.4.hex.zip b/Hex Files/E5PBILSlntDZ_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..5fdcf2b439
Binary files /dev/null and b/Hex Files/E5PBILSlntDZ_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/E5PBILSlntDZ_ME_DW7.4.4.hex.zip b/Hex Files/E5PBILSlntDZ_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..bc58ddd9f8
Binary files /dev/null and b/Hex Files/E5PBILSlntDZ_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/E5PUBLSlntDZH_DW7.4.4.hex.zip b/Hex Files/E5PUBLSlntDZH_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..7f235d808e
Binary files /dev/null and b/Hex Files/E5PUBLSlntDZH_DW7.4.4.hex.zip differ
diff --git a/Hex Files/E5PUBLSlntDZ_DW7.4.4.hex.zip b/Hex Files/E5PUBLSlntDZ_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..eb904140ec
Binary files /dev/null and b/Hex Files/E5PUBLSlntDZ_DW7.4.4.hex.zip differ
diff --git a/Hex Files/E5PUBLSlntDZ_MC_DW7.4.4.hex.zip b/Hex Files/E5PUBLSlntDZ_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..04c2434756
Binary files /dev/null and b/Hex Files/E5PUBLSlntDZ_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/E5PUBLSlntDZ_ME_DW7.4.4.hex.zip b/Hex Files/E5PUBLSlntDZ_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..30284700d3
Binary files /dev/null and b/Hex Files/E5PUBLSlntDZ_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/E5P_BILH_DW7.4.4.hex.zip b/Hex Files/E5P_BILH_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..8f04a4819b
Binary files /dev/null and b/Hex Files/E5P_BILH_DW7.4.4.hex.zip differ
diff --git a/Hex Files/E5P_BIL_DW7.4.4.hex.zip b/Hex Files/E5P_BIL_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..1c7589ab06
Binary files /dev/null and b/Hex Files/E5P_BIL_DW7.4.4.hex.zip differ
diff --git a/Hex Files/E5P_BIL_DZH_DW7.4.4.hex.zip b/Hex Files/E5P_BIL_DZH_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..4386f6e83e
Binary files /dev/null and b/Hex Files/E5P_BIL_DZH_DW7.4.4.hex.zip differ
diff --git a/Hex Files/E5P_BIL_DZ_DW7.4.4.hex.zip b/Hex Files/E5P_BIL_DZ_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..509599bcbe
Binary files /dev/null and b/Hex Files/E5P_BIL_DZ_DW7.4.4.hex.zip differ
diff --git a/Hex Files/E5P_BIL_DZ_MC_DW7.4.4.hex.zip b/Hex Files/E5P_BIL_DZ_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..be72e7375a
Binary files /dev/null and b/Hex Files/E5P_BIL_DZ_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/E5P_BIL_DZ_ME_DW7.4.4.hex.zip b/Hex Files/E5P_BIL_DZ_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..42e7b73652
Binary files /dev/null and b/Hex Files/E5P_BIL_DZ_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/E5P_BIL_MC_DW7.4.4.hex.zip b/Hex Files/E5P_BIL_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..4cce30a466
Binary files /dev/null and b/Hex Files/E5P_BIL_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/E5P_BIL_ME_DW7.4.4.hex.zip b/Hex Files/E5P_BIL_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..d84e4ce8fb
Binary files /dev/null and b/Hex Files/E5P_BIL_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/E5P_BIL_SlntH_DW7.4.4.hex.zip b/Hex Files/E5P_BIL_SlntH_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..86f9ff398d
Binary files /dev/null and b/Hex Files/E5P_BIL_SlntH_DW7.4.4.hex.zip differ
diff --git a/Hex Files/E5P_BIL_Slnt_DW7.4.4.hex.zip b/Hex Files/E5P_BIL_Slnt_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..eb841392da
Binary files /dev/null and b/Hex Files/E5P_BIL_Slnt_DW7.4.4.hex.zip differ
diff --git a/Hex Files/E5P_BIL_Slnt_MC_DW7.4.4.hex.zip b/Hex Files/E5P_BIL_Slnt_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..90ff66bdc0
Binary files /dev/null and b/Hex Files/E5P_BIL_Slnt_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/E5P_BIL_Slnt_ME_DW7.4.4.hex.zip b/Hex Files/E5P_BIL_Slnt_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..e2d078ef4c
Binary files /dev/null and b/Hex Files/E5P_BIL_Slnt_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/E5P_UBLH_DW7.4.4.hex.zip b/Hex Files/E5P_UBLH_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..73348d0369
Binary files /dev/null and b/Hex Files/E5P_UBLH_DW7.4.4.hex.zip differ
diff --git a/Hex Files/E5P_UBL_DW7.4.4.hex.zip b/Hex Files/E5P_UBL_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..d265277690
Binary files /dev/null and b/Hex Files/E5P_UBL_DW7.4.4.hex.zip differ
diff --git a/Hex Files/E5P_UBL_DZH_DW7.4.4.hex.zip b/Hex Files/E5P_UBL_DZH_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..f948a42021
Binary files /dev/null and b/Hex Files/E5P_UBL_DZH_DW7.4.4.hex.zip differ
diff --git a/Hex Files/E5P_UBL_DZ_DW7.4.4.hex.zip b/Hex Files/E5P_UBL_DZ_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..c9c92e6bcd
Binary files /dev/null and b/Hex Files/E5P_UBL_DZ_DW7.4.4.hex.zip differ
diff --git a/Hex Files/E5P_UBL_DZ_MC_DW7.4.4.hex.zip b/Hex Files/E5P_UBL_DZ_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..c24ea2c814
Binary files /dev/null and b/Hex Files/E5P_UBL_DZ_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/E5P_UBL_DZ_ME_DW7.4.4.hex.zip b/Hex Files/E5P_UBL_DZ_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..deb2373632
Binary files /dev/null and b/Hex Files/E5P_UBL_DZ_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/E5P_UBL_MC_DW7.4.4.hex.zip b/Hex Files/E5P_UBL_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..42b20ea278
Binary files /dev/null and b/Hex Files/E5P_UBL_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/E5P_UBL_ME_DW7.4.4.hex.zip b/Hex Files/E5P_UBL_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..e42d0bc8ef
Binary files /dev/null and b/Hex Files/E5P_UBL_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/E5P_UBL_SlntH_DW7.4.4.hex.zip b/Hex Files/E5P_UBL_SlntH_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..6d67e099f3
Binary files /dev/null and b/Hex Files/E5P_UBL_SlntH_DW7.4.4.hex.zip differ
diff --git a/Hex Files/E5P_UBL_Slnt_DW7.4.4.hex.zip b/Hex Files/E5P_UBL_Slnt_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..963d659ca3
Binary files /dev/null and b/Hex Files/E5P_UBL_Slnt_DW7.4.4.hex.zip differ
diff --git a/Hex Files/E5P_UBL_Slnt_MC_DW7.4.4.hex.zip b/Hex Files/E5P_UBL_Slnt_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..1d99fd5967
Binary files /dev/null and b/Hex Files/E5P_UBL_Slnt_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/E5P_UBL_Slnt_ME_DW7.4.4.hex.zip b/Hex Files/E5P_UBL_Slnt_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..bdb5968b1b
Binary files /dev/null and b/Hex Files/E5P_UBL_Slnt_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender2_BLT_Host_DW7.4.4.hex.zip b/Hex Files/Ender2_BLT_Host_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..cd6b7ba218
Binary files /dev/null and b/Hex Files/Ender2_BLT_Host_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender2_BLT_Host_MC_DW7.4.4.hex.zip b/Hex Files/Ender2_BLT_Host_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..914a0cc452
Binary files /dev/null and b/Hex Files/Ender2_BLT_Host_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender2_BLT_Host_ME_DW7.4.4.hex.zip b/Hex Files/Ender2_BLT_Host_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..e2b66bcc13
Binary files /dev/null and b/Hex Files/Ender2_BLT_Host_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender2_BLT_SD_DW7.4.4.hex.zip b/Hex Files/Ender2_BLT_SD_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..c1bf498e7e
Binary files /dev/null and b/Hex Files/Ender2_BLT_SD_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender2_BLT_SD_MC_DW7.4.4.hex.zip b/Hex Files/Ender2_BLT_SD_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..04775032b1
Binary files /dev/null and b/Hex Files/Ender2_BLT_SD_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender2_BLT_SD_ME_DW7.4.4.hex.zip b/Hex Files/Ender2_BLT_SD_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..cbaec66937
Binary files /dev/null and b/Hex Files/Ender2_BLT_SD_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender2_DW7.4.4.hex.zip b/Hex Files/Ender2_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..04138cf2dc
Binary files /dev/null and b/Hex Files/Ender2_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender2_MC_DW7.4.4.hex.zip b/Hex Files/Ender2_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..200e862aa7
Binary files /dev/null and b/Hex Files/Ender2_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender2_ME_DW7.4.4.hex.zip b/Hex Files/Ender2_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..27a3bdc263
Binary files /dev/null and b/Hex Files/Ender2_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender3_BLT_Host_DW7.4.4.hex.zip b/Hex Files/Ender3_BLT_Host_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..ba26f37f29
Binary files /dev/null and b/Hex Files/Ender3_BLT_Host_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender3_BLT_Host_MC_DW7.4.4.hex.zip b/Hex Files/Ender3_BLT_Host_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..b165397c47
Binary files /dev/null and b/Hex Files/Ender3_BLT_Host_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender3_BLT_Host_ME_DW7.4.4.hex.zip b/Hex Files/Ender3_BLT_Host_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..dd2ef88789
Binary files /dev/null and b/Hex Files/Ender3_BLT_Host_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender3_BLT_SD_DW7.4.4.hex.zip b/Hex Files/Ender3_BLT_SD_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..53972f0d59
Binary files /dev/null and b/Hex Files/Ender3_BLT_SD_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender3_BLT_SD_MC_DW7.4.4.hex.zip b/Hex Files/Ender3_BLT_SD_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..91c2bca596
Binary files /dev/null and b/Hex Files/Ender3_BLT_SD_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender3_BLT_SD_ME_DW7.4.4.hex.zip b/Hex Files/Ender3_BLT_SD_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..8db18cc11c
Binary files /dev/null and b/Hex Files/Ender3_BLT_SD_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender3_DW7.4.4.hex.zip b/Hex Files/Ender3_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..d46b1a0bca
Binary files /dev/null and b/Hex Files/Ender3_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender3_MC_DW7.4.4.hex.zip b/Hex Files/Ender3_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..85454c8616
Binary files /dev/null and b/Hex Files/Ender3_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender3_ME_DW7.4.4.hex.zip b/Hex Files/Ender3_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..8b91f02c23
Binary files /dev/null and b/Hex Files/Ender3_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender4_BLT_DW7.4.4.hex.zip b/Hex Files/Ender4_BLT_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..f27841bbbc
Binary files /dev/null and b/Hex Files/Ender4_BLT_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender4_BLT_MC_DW7.4.4.hex.zip b/Hex Files/Ender4_BLT_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..028db84a32
Binary files /dev/null and b/Hex Files/Ender4_BLT_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender4_BLT_ME_DW7.4.4.hex.zip b/Hex Files/Ender4_BLT_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..61f7f533f0
Binary files /dev/null and b/Hex Files/Ender4_BLT_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender4_BLT_UBL_DW7.4.4.hex.zip b/Hex Files/Ender4_BLT_UBL_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..c61bddf02d
Binary files /dev/null and b/Hex Files/Ender4_BLT_UBL_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender4_BLT_UBL_MC_DW7.4.4.hex.zip b/Hex Files/Ender4_BLT_UBL_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..e18b3aa8e2
Binary files /dev/null and b/Hex Files/Ender4_BLT_UBL_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender4_BLT_UBL_ME_DW7.4.4.hex.zip b/Hex Files/Ender4_BLT_UBL_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..a2f31b128d
Binary files /dev/null and b/Hex Files/Ender4_BLT_UBL_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender4_DW7.4.4.hex.zip b/Hex Files/Ender4_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..03272d4f5d
Binary files /dev/null and b/Hex Files/Ender4_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender4_MC_DW7.4.4.hex.zip b/Hex Files/Ender4_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..e53883ec0e
Binary files /dev/null and b/Hex Files/Ender4_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender4_ME_DW7.4.4.hex.zip b/Hex Files/Ender4_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..08d3875933
Binary files /dev/null and b/Hex Files/Ender4_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender5_BLT_Host_DW7.4.4.hex.zip b/Hex Files/Ender5_BLT_Host_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..144de01a8a
Binary files /dev/null and b/Hex Files/Ender5_BLT_Host_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender5_BLT_Host_MC_DW7.4.4.hex.zip b/Hex Files/Ender5_BLT_Host_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..4417d0a74a
Binary files /dev/null and b/Hex Files/Ender5_BLT_Host_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender5_BLT_Host_ME_DW7.4.4.hex.zip b/Hex Files/Ender5_BLT_Host_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..652644c631
Binary files /dev/null and b/Hex Files/Ender5_BLT_Host_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender5_BLT_SD_DW7.4.4.hex.zip b/Hex Files/Ender5_BLT_SD_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..6a6613312a
Binary files /dev/null and b/Hex Files/Ender5_BLT_SD_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender5_BLT_SD_MC_DW7.4.4.hex.zip b/Hex Files/Ender5_BLT_SD_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..20a530aa91
Binary files /dev/null and b/Hex Files/Ender5_BLT_SD_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender5_BLT_SD_ME_DW7.4.4.hex.zip b/Hex Files/Ender5_BLT_SD_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..c8a4226751
Binary files /dev/null and b/Hex Files/Ender5_BLT_SD_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender5_DW7.4.4.hex.zip b/Hex Files/Ender5_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..054d5582e4
Binary files /dev/null and b/Hex Files/Ender5_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender5_MC_DW7.4.4.hex.zip b/Hex Files/Ender5_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..6492dccabc
Binary files /dev/null and b/Hex Files/Ender5_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/Ender5_ME_DW7.4.4.hex.zip b/Hex Files/Ender5_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..dcaaf35183
Binary files /dev/null and b/Hex Files/Ender5_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_AC_DW7.4.4.hex.zip b/Hex Files/S4_AC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..bd0a104d5c
Binary files /dev/null and b/Hex Files/S4_AC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_AC_LR_DW7.4.4.hex.zip b/Hex Files/S4_AC_LR_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..0ad75bf691
Binary files /dev/null and b/Hex Files/S4_AC_LR_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_AC_MC_DW7.4.4.hex.zip b/Hex Files/S4_AC_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..9030087014
Binary files /dev/null and b/Hex Files/S4_AC_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_AC_MC_NF_DW7.4.4.hex.zip b/Hex Files/S4_AC_MC_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..52bca43fed
Binary files /dev/null and b/Hex Files/S4_AC_MC_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_AC_ME_DW7.4.4.hex.zip b/Hex Files/S4_AC_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..4ff078ba86
Binary files /dev/null and b/Hex Files/S4_AC_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_AC_ME_NF_DW7.4.4.hex.zip b/Hex Files/S4_AC_ME_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..f28452ad1c
Binary files /dev/null and b/Hex Files/S4_AC_ME_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_AC_NF_DW7.4.4.hex.zip b/Hex Files/S4_AC_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..5f4f4c039f
Binary files /dev/null and b/Hex Files/S4_AC_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_AC_NF_LR_DW7.4.4.hex.zip b/Hex Files/S4_AC_NF_LR_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..f6c4fc99ca
Binary files /dev/null and b/Hex Files/S4_AC_NF_LR_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_BLT_AC_DW7.4.4.hex.zip b/Hex Files/S4_BLT_AC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..0dd36d8295
Binary files /dev/null and b/Hex Files/S4_BLT_AC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_BLT_AC_LR_DW7.4.4.hex.zip b/Hex Files/S4_BLT_AC_LR_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..7129d5517e
Binary files /dev/null and b/Hex Files/S4_BLT_AC_LR_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_BLT_AC_MC_DW7.4.4.hex.zip b/Hex Files/S4_BLT_AC_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..0a8a48457e
Binary files /dev/null and b/Hex Files/S4_BLT_AC_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_BLT_AC_MC_NF_DW7.4.4.hex.zip b/Hex Files/S4_BLT_AC_MC_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..1d2bcb2c03
Binary files /dev/null and b/Hex Files/S4_BLT_AC_MC_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_BLT_AC_ME_DW7.4.4.hex.zip b/Hex Files/S4_BLT_AC_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..aaf6023613
Binary files /dev/null and b/Hex Files/S4_BLT_AC_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_BLT_AC_ME_NF_DW7.4.4.hex.zip b/Hex Files/S4_BLT_AC_ME_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..02b4998c1a
Binary files /dev/null and b/Hex Files/S4_BLT_AC_ME_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_BLT_AC_NF_DW7.4.4.hex.zip b/Hex Files/S4_BLT_AC_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..4183d30fa6
Binary files /dev/null and b/Hex Files/S4_BLT_AC_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_BLT_AC_NF_LR_DW7.4.4.hex.zip b/Hex Files/S4_BLT_AC_NF_LR_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..2c73f26054
Binary files /dev/null and b/Hex Files/S4_BLT_AC_NF_LR_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_BLT_AC_UBL_DW7.4.4.hex.zip b/Hex Files/S4_BLT_AC_UBL_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..baadd99b2c
Binary files /dev/null and b/Hex Files/S4_BLT_AC_UBL_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_BLT_AC_UBL_LR_DW7.4.4.hex.zip b/Hex Files/S4_BLT_AC_UBL_LR_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..deda65ac13
Binary files /dev/null and b/Hex Files/S4_BLT_AC_UBL_LR_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_BLT_AC_UBL_MC_DW7.4.4.hex.zip b/Hex Files/S4_BLT_AC_UBL_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..9860e0c374
Binary files /dev/null and b/Hex Files/S4_BLT_AC_UBL_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_BLT_AC_UBL_MC_NF_DW7.4.4.hex.zip b/Hex Files/S4_BLT_AC_UBL_MC_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..bdf7515030
Binary files /dev/null and b/Hex Files/S4_BLT_AC_UBL_MC_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_BLT_AC_UBL_ME_DW7.4.4.hex.zip b/Hex Files/S4_BLT_AC_UBL_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..50c1518c7f
Binary files /dev/null and b/Hex Files/S4_BLT_AC_UBL_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_BLT_AC_UBL_ME_NF_DW7.4.4.hex.zip b/Hex Files/S4_BLT_AC_UBL_ME_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..eb5c4915e2
Binary files /dev/null and b/Hex Files/S4_BLT_AC_UBL_ME_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_BLT_AC_UBL_NF_DW7.4.4.hex.zip b/Hex Files/S4_BLT_AC_UBL_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..5ced0562e7
Binary files /dev/null and b/Hex Files/S4_BLT_AC_UBL_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_BLT_AC_UBL_NF_LR_DW7.4.4.hex.zip b/Hex Files/S4_BLT_AC_UBL_NF_LR_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..cdb44aefd4
Binary files /dev/null and b/Hex Files/S4_BLT_AC_UBL_NF_LR_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_BLT_DW7.4.4.hex.zip b/Hex Files/S4_BLT_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..f8db44e7d0
Binary files /dev/null and b/Hex Files/S4_BLT_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_BLT_LR_DW7.4.4.hex.zip b/Hex Files/S4_BLT_LR_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..f5fa553d1f
Binary files /dev/null and b/Hex Files/S4_BLT_LR_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_BLT_MC_DW7.4.4.hex.zip b/Hex Files/S4_BLT_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..30fe6e1e71
Binary files /dev/null and b/Hex Files/S4_BLT_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_BLT_MC_NF_DW7.4.4.hex.zip b/Hex Files/S4_BLT_MC_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..4e983eed58
Binary files /dev/null and b/Hex Files/S4_BLT_MC_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_BLT_ME_DW7.4.4.hex.zip b/Hex Files/S4_BLT_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..d018c51a28
Binary files /dev/null and b/Hex Files/S4_BLT_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_BLT_ME_NF_DW7.4.4.hex.zip b/Hex Files/S4_BLT_ME_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..ee5c3f9506
Binary files /dev/null and b/Hex Files/S4_BLT_ME_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_BLT_NF_DW7.4.4.hex.zip b/Hex Files/S4_BLT_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..41efbb5db9
Binary files /dev/null and b/Hex Files/S4_BLT_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_BLT_NF_LR_DW7.4.4.hex.zip b/Hex Files/S4_BLT_NF_LR_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..bdc61b45df
Binary files /dev/null and b/Hex Files/S4_BLT_NF_LR_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_BLT_UBL_DW7.4.4.hex.zip b/Hex Files/S4_BLT_UBL_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..cbae20248c
Binary files /dev/null and b/Hex Files/S4_BLT_UBL_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_BLT_UBL_LR_DW7.4.4.hex.zip b/Hex Files/S4_BLT_UBL_LR_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..ba6a90e372
Binary files /dev/null and b/Hex Files/S4_BLT_UBL_LR_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_BLT_UBL_MC_DW7.4.4.hex.zip b/Hex Files/S4_BLT_UBL_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..128c7cb557
Binary files /dev/null and b/Hex Files/S4_BLT_UBL_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_BLT_UBL_MC_NF_DW7.4.4.hex.zip b/Hex Files/S4_BLT_UBL_MC_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..74eb157cbc
Binary files /dev/null and b/Hex Files/S4_BLT_UBL_MC_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_BLT_UBL_ME_DW7.4.4.hex.zip b/Hex Files/S4_BLT_UBL_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..5270bd39ae
Binary files /dev/null and b/Hex Files/S4_BLT_UBL_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_BLT_UBL_ME_NF_DW7.4.4.hex.zip b/Hex Files/S4_BLT_UBL_ME_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..e3cf9c5554
Binary files /dev/null and b/Hex Files/S4_BLT_UBL_ME_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_BLT_UBL_NF_DW7.4.4.hex.zip b/Hex Files/S4_BLT_UBL_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..6539c8150e
Binary files /dev/null and b/Hex Files/S4_BLT_UBL_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_BLT_UBL_NF_LR_DW7.4.4.hex.zip b/Hex Files/S4_BLT_UBL_NF_LR_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..8267f82d88
Binary files /dev/null and b/Hex Files/S4_BLT_UBL_NF_LR_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_DW7.4.4.hex.zip b/Hex Files/S4_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..0327f13028
Binary files /dev/null and b/Hex Files/S4_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_LR_DW7.4.4.hex.zip b/Hex Files/S4_LR_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..98338d539b
Binary files /dev/null and b/Hex Files/S4_LR_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_MC_DW7.4.4.hex.zip b/Hex Files/S4_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..aa0ef5bd9c
Binary files /dev/null and b/Hex Files/S4_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_MC_NF_DW7.4.4.hex.zip b/Hex Files/S4_MC_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..d3a061dea9
Binary files /dev/null and b/Hex Files/S4_MC_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_ME_DW7.4.4.hex.zip b/Hex Files/S4_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..09ddf92ee4
Binary files /dev/null and b/Hex Files/S4_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_ME_NF_DW7.4.4.hex.zip b/Hex Files/S4_ME_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..1cb3492a17
Binary files /dev/null and b/Hex Files/S4_ME_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_NF_DW7.4.4.hex.zip b/Hex Files/S4_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..6769cc537b
Binary files /dev/null and b/Hex Files/S4_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S4_NF_LR_DW7.4.4.hex.zip b/Hex Files/S4_NF_LR_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..74b5bf1c7f
Binary files /dev/null and b/Hex Files/S4_NF_LR_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_AC_DW7.4.4.hex.zip b/Hex Files/S5_AC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..63f1b9c71d
Binary files /dev/null and b/Hex Files/S5_AC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_AC_LR_DW7.4.4.hex.zip b/Hex Files/S5_AC_LR_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..4cd2179ca9
Binary files /dev/null and b/Hex Files/S5_AC_LR_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_AC_MC_DW7.4.4.hex.zip b/Hex Files/S5_AC_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..1aad90ca47
Binary files /dev/null and b/Hex Files/S5_AC_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_AC_MC_NF_DW7.4.4.hex.zip b/Hex Files/S5_AC_MC_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..43b6316f9c
Binary files /dev/null and b/Hex Files/S5_AC_MC_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_AC_ME_DW7.4.4.hex.zip b/Hex Files/S5_AC_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..cd27a59725
Binary files /dev/null and b/Hex Files/S5_AC_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_AC_ME_NF_DW7.4.4.hex.zip b/Hex Files/S5_AC_ME_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..e93d901a5f
Binary files /dev/null and b/Hex Files/S5_AC_ME_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_AC_NF_DW7.4.4.hex.zip b/Hex Files/S5_AC_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..d9530caeac
Binary files /dev/null and b/Hex Files/S5_AC_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_AC_NF_LR_DW7.4.4.hex.zip b/Hex Files/S5_AC_NF_LR_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..a826104aba
Binary files /dev/null and b/Hex Files/S5_AC_NF_LR_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_BLT_AC_DW7.4.4.hex.zip b/Hex Files/S5_BLT_AC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..587211a697
Binary files /dev/null and b/Hex Files/S5_BLT_AC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_BLT_AC_LR_DW7.4.4.hex.zip b/Hex Files/S5_BLT_AC_LR_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..82813cf954
Binary files /dev/null and b/Hex Files/S5_BLT_AC_LR_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_BLT_AC_MC_DW7.4.4.hex.zip b/Hex Files/S5_BLT_AC_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..0dbf914b4d
Binary files /dev/null and b/Hex Files/S5_BLT_AC_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_BLT_AC_MC_NF_DW7.4.4.hex.zip b/Hex Files/S5_BLT_AC_MC_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..d89237285d
Binary files /dev/null and b/Hex Files/S5_BLT_AC_MC_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_BLT_AC_ME_DW7.4.4.hex.zip b/Hex Files/S5_BLT_AC_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..108bad6b86
Binary files /dev/null and b/Hex Files/S5_BLT_AC_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_BLT_AC_ME_NF_DW7.4.4.hex.zip b/Hex Files/S5_BLT_AC_ME_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..cd7d96a51d
Binary files /dev/null and b/Hex Files/S5_BLT_AC_ME_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_BLT_AC_NF_DW7.4.4.hex.zip b/Hex Files/S5_BLT_AC_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..57265c1818
Binary files /dev/null and b/Hex Files/S5_BLT_AC_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_BLT_AC_NF_LR_DW7.4.4.hex.zip b/Hex Files/S5_BLT_AC_NF_LR_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..1b36e3d6a0
Binary files /dev/null and b/Hex Files/S5_BLT_AC_NF_LR_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_BLT_AC_UBL_DW7.4.4.hex.zip b/Hex Files/S5_BLT_AC_UBL_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..22568a0c0c
Binary files /dev/null and b/Hex Files/S5_BLT_AC_UBL_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_BLT_AC_UBL_LR_DW7.4.4.hex.zip b/Hex Files/S5_BLT_AC_UBL_LR_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..61ca87bb48
Binary files /dev/null and b/Hex Files/S5_BLT_AC_UBL_LR_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_BLT_AC_UBL_MC_DW7.4.4.hex.zip b/Hex Files/S5_BLT_AC_UBL_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..bda68fbf18
Binary files /dev/null and b/Hex Files/S5_BLT_AC_UBL_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_BLT_AC_UBL_MC_NF_DW7.4.4.hex.zip b/Hex Files/S5_BLT_AC_UBL_MC_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..1e3787ccce
Binary files /dev/null and b/Hex Files/S5_BLT_AC_UBL_MC_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_BLT_AC_UBL_ME_DW7.4.4.hex.zip b/Hex Files/S5_BLT_AC_UBL_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..b12d2cb81f
Binary files /dev/null and b/Hex Files/S5_BLT_AC_UBL_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_BLT_AC_UBL_ME_NF_DW7.4.4.hex.zip b/Hex Files/S5_BLT_AC_UBL_ME_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..07b6641cbf
Binary files /dev/null and b/Hex Files/S5_BLT_AC_UBL_ME_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_BLT_AC_UBL_NF_DW7.4.4.hex.zip b/Hex Files/S5_BLT_AC_UBL_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..70e417fb39
Binary files /dev/null and b/Hex Files/S5_BLT_AC_UBL_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_BLT_AC_UBL_NF_LR_DW7.4.4.hex.zip b/Hex Files/S5_BLT_AC_UBL_NF_LR_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..7b9402cef2
Binary files /dev/null and b/Hex Files/S5_BLT_AC_UBL_NF_LR_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_BLT_DW7.4.4.hex.zip b/Hex Files/S5_BLT_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..7d8edf58e8
Binary files /dev/null and b/Hex Files/S5_BLT_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_BLT_LR_DW7.4.4.hex.zip b/Hex Files/S5_BLT_LR_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..33f18955a4
Binary files /dev/null and b/Hex Files/S5_BLT_LR_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_BLT_MC_DW7.4.4.hex.zip b/Hex Files/S5_BLT_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..622455200b
Binary files /dev/null and b/Hex Files/S5_BLT_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_BLT_MC_NF_DW7.4.4.hex.zip b/Hex Files/S5_BLT_MC_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..fb6b00955e
Binary files /dev/null and b/Hex Files/S5_BLT_MC_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_BLT_ME_DW7.4.4.hex.zip b/Hex Files/S5_BLT_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..8a8c9facd8
Binary files /dev/null and b/Hex Files/S5_BLT_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_BLT_ME_NF_DW7.4.4.hex.zip b/Hex Files/S5_BLT_ME_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..0ba7fd3a56
Binary files /dev/null and b/Hex Files/S5_BLT_ME_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_BLT_NF_DW7.4.4.hex.zip b/Hex Files/S5_BLT_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..e2cee0086a
Binary files /dev/null and b/Hex Files/S5_BLT_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_BLT_NF_LR_DW7.4.4.hex.zip b/Hex Files/S5_BLT_NF_LR_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..b2d509ac4f
Binary files /dev/null and b/Hex Files/S5_BLT_NF_LR_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_BLT_UBL_DW7.4.4.hex.zip b/Hex Files/S5_BLT_UBL_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..73f88294b5
Binary files /dev/null and b/Hex Files/S5_BLT_UBL_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_BLT_UBL_LR_DW7.4.4.hex.zip b/Hex Files/S5_BLT_UBL_LR_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..013cd917a2
Binary files /dev/null and b/Hex Files/S5_BLT_UBL_LR_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_BLT_UBL_MC_DW7.4.4.hex.zip b/Hex Files/S5_BLT_UBL_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..83f0fc4e3f
Binary files /dev/null and b/Hex Files/S5_BLT_UBL_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_BLT_UBL_MC_NF_DW7.4.4.hex.zip b/Hex Files/S5_BLT_UBL_MC_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..0183de6fe9
Binary files /dev/null and b/Hex Files/S5_BLT_UBL_MC_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_BLT_UBL_ME_DW7.4.4.hex.zip b/Hex Files/S5_BLT_UBL_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..273fa10b98
Binary files /dev/null and b/Hex Files/S5_BLT_UBL_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_BLT_UBL_ME_NF_DW7.4.4.hex.zip b/Hex Files/S5_BLT_UBL_ME_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..e0234fbdce
Binary files /dev/null and b/Hex Files/S5_BLT_UBL_ME_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_BLT_UBL_NF_DW7.4.4.hex.zip b/Hex Files/S5_BLT_UBL_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..48e98c4f3f
Binary files /dev/null and b/Hex Files/S5_BLT_UBL_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_BLT_UBL_NF_LR_DW7.4.4.hex.zip b/Hex Files/S5_BLT_UBL_NF_LR_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..9ffe31f21d
Binary files /dev/null and b/Hex Files/S5_BLT_UBL_NF_LR_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_DW7.4.4.hex.zip b/Hex Files/S5_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..f4e5fb42ef
Binary files /dev/null and b/Hex Files/S5_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_LR_DW7.4.4.hex.zip b/Hex Files/S5_LR_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..3d34e3e99e
Binary files /dev/null and b/Hex Files/S5_LR_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_MC_DW7.4.4.hex.zip b/Hex Files/S5_MC_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..fbd93ce4e5
Binary files /dev/null and b/Hex Files/S5_MC_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_MC_NF_DW7.4.4.hex.zip b/Hex Files/S5_MC_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..ec9566634f
Binary files /dev/null and b/Hex Files/S5_MC_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_ME_DW7.4.4.hex.zip b/Hex Files/S5_ME_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..eb33dad1bc
Binary files /dev/null and b/Hex Files/S5_ME_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_ME_NF_DW7.4.4.hex.zip b/Hex Files/S5_ME_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..d59143d612
Binary files /dev/null and b/Hex Files/S5_ME_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_NF_DW7.4.4.hex.zip b/Hex Files/S5_NF_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..d898318413
Binary files /dev/null and b/Hex Files/S5_NF_DW7.4.4.hex.zip differ
diff --git a/Hex Files/S5_NF_LR_DW7.4.4.hex.zip b/Hex Files/S5_NF_LR_DW7.4.4.hex.zip
new file mode 100644
index 0000000000..3cd2bd818d
Binary files /dev/null and b/Hex Files/S5_NF_LR_DW7.4.4.hex.zip differ
diff --git a/Hex Files/firmware_CR30_DW7.4.4.bin.zip b/Hex Files/firmware_CR30_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..897ecf172e
Binary files /dev/null and b/Hex Files/firmware_CR30_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_CR6Max_452_DW7.4.4.bin.zip b/Hex Files/firmware_CR6Max_452_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..264827c3e8
Binary files /dev/null and b/Hex Files/firmware_CR6Max_452_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_CR6Max_453_DW7.4.4.bin.zip b/Hex Files/firmware_CR6Max_453_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..f0126c3117
Binary files /dev/null and b/Hex Files/firmware_CR6Max_453_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_CR6Max_LGX_452_DW7.4.4.bin.zip b/Hex Files/firmware_CR6Max_LGX_452_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..46e13b25c5
Binary files /dev/null and b/Hex Files/firmware_CR6Max_LGX_452_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_CR6Max_LGX_453_DW7.4.4.bin.zip b/Hex Files/firmware_CR6Max_LGX_453_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..956ff94e8c
Binary files /dev/null and b/Hex Files/firmware_CR6Max_LGX_453_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_CR6_452_DW7.4.4.bin.zip b/Hex Files/firmware_CR6_452_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..955261bc51
Binary files /dev/null and b/Hex Files/firmware_CR6_452_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_CR6_453_DW7.4.4.bin.zip b/Hex Files/firmware_CR6_453_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..3fa8bc2d8b
Binary files /dev/null and b/Hex Files/firmware_CR6_453_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_CR6_LGX_452_DW7.4.4.bin.zip b/Hex Files/firmware_CR6_LGX_452_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..43644c528c
Binary files /dev/null and b/Hex Files/firmware_CR6_LGX_452_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_CR6_LGX_453_DW7.4.4.bin.zip b/Hex Files/firmware_CR6_LGX_453_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..6403941197
Binary files /dev/null and b/Hex Files/firmware_CR6_LGX_453_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3Max_422_BLT_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3Max_422_BLT_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..c0ec13d451
Binary files /dev/null and b/Hex Files/firmware_Ender3Max_422_BLT_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3Max_422_BLT_LR_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3Max_422_BLT_LR_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..96063fdeff
Binary files /dev/null and b/Hex Files/firmware_Ender3Max_422_BLT_LR_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3Max_422_BLT_ZM_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3Max_422_BLT_ZM_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..97b91128a9
Binary files /dev/null and b/Hex Files/firmware_Ender3Max_422_BLT_ZM_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3Max_422_BLT_ZM_LR_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3Max_422_BLT_ZM_LR_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..c0dadbce98
Binary files /dev/null and b/Hex Files/firmware_Ender3Max_422_BLT_ZM_LR_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3Max_422_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3Max_422_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..0cab264d44
Binary files /dev/null and b/Hex Files/firmware_Ender3Max_422_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3Max_422_LR_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3Max_422_LR_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..7b3435fe1c
Binary files /dev/null and b/Hex Files/firmware_Ender3Max_422_LR_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3Max_427_BLT_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3Max_427_BLT_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..76b28ba630
Binary files /dev/null and b/Hex Files/firmware_Ender3Max_427_BLT_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3Max_427_BLT_LR_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3Max_427_BLT_LR_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..295384e712
Binary files /dev/null and b/Hex Files/firmware_Ender3Max_427_BLT_LR_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3Max_427_BLT_ZM_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3Max_427_BLT_ZM_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..2415c8816e
Binary files /dev/null and b/Hex Files/firmware_Ender3Max_427_BLT_ZM_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3Max_427_BLT_ZM_LR_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3Max_427_BLT_ZM_LR_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..a892c7a26d
Binary files /dev/null and b/Hex Files/firmware_Ender3Max_427_BLT_ZM_LR_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3Max_427_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3Max_427_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..ea43916197
Binary files /dev/null and b/Hex Files/firmware_Ender3Max_427_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3Max_427_LR_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3Max_427_LR_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..44c11f4a89
Binary files /dev/null and b/Hex Files/firmware_Ender3Max_427_LR_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3V2_427_BLT_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3V2_427_BLT_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..36655c8d75
Binary files /dev/null and b/Hex Files/firmware_Ender3V2_427_BLT_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3V2_427_BLT_LR_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3V2_427_BLT_LR_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..02b8a055be
Binary files /dev/null and b/Hex Files/firmware_Ender3V2_427_BLT_LR_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3V2_427_BLT_ZM_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3V2_427_BLT_ZM_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..5d4b2f66c6
Binary files /dev/null and b/Hex Files/firmware_Ender3V2_427_BLT_ZM_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3V2_427_BLT_ZM_LR_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3V2_427_BLT_ZM_LR_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..436e0fe267
Binary files /dev/null and b/Hex Files/firmware_Ender3V2_427_BLT_ZM_LR_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3V2_427_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3V2_427_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..8140d94345
Binary files /dev/null and b/Hex Files/firmware_Ender3V2_427_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3V2_427_LR_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3V2_427_LR_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..cccd5caacd
Binary files /dev/null and b/Hex Files/firmware_Ender3V2_427_LR_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3V2_BLT_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3V2_BLT_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..a069af69e4
Binary files /dev/null and b/Hex Files/firmware_Ender3V2_BLT_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3V2_BLT_LR_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3V2_BLT_LR_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..914c6f1469
Binary files /dev/null and b/Hex Files/firmware_Ender3V2_BLT_LR_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3V2_BLT_ZM_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3V2_BLT_ZM_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..06a12592a3
Binary files /dev/null and b/Hex Files/firmware_Ender3V2_BLT_ZM_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3V2_BLT_ZM_LR_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3V2_BLT_ZM_LR_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..b38d2a85dc
Binary files /dev/null and b/Hex Files/firmware_Ender3V2_BLT_ZM_LR_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3V2_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3V2_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..7e1c81e58d
Binary files /dev/null and b/Hex Files/firmware_Ender3V2_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3V2_LR_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3V2_LR_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..59400bc139
Binary files /dev/null and b/Hex Files/firmware_Ender3V2_LR_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3_422_BLT_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3_422_BLT_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..34edfd7140
Binary files /dev/null and b/Hex Files/firmware_Ender3_422_BLT_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3_422_BLT_LR_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3_422_BLT_LR_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..5cd0c3b3d9
Binary files /dev/null and b/Hex Files/firmware_Ender3_422_BLT_LR_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3_422_BLT_ZM_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3_422_BLT_ZM_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..514c2d1aeb
Binary files /dev/null and b/Hex Files/firmware_Ender3_422_BLT_ZM_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3_422_BLT_ZM_LR_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3_422_BLT_ZM_LR_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..f82f9fae29
Binary files /dev/null and b/Hex Files/firmware_Ender3_422_BLT_ZM_LR_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3_422_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3_422_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..727f3301ba
Binary files /dev/null and b/Hex Files/firmware_Ender3_422_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3_422_LR_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3_422_LR_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..5c3ef45a1b
Binary files /dev/null and b/Hex Files/firmware_Ender3_422_LR_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3_427_BLT_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3_427_BLT_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..5e7b54c8dc
Binary files /dev/null and b/Hex Files/firmware_Ender3_427_BLT_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3_427_BLT_LR_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3_427_BLT_LR_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..a040927029
Binary files /dev/null and b/Hex Files/firmware_Ender3_427_BLT_LR_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3_427_BLT_ZM_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3_427_BLT_ZM_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..f29b5fd84a
Binary files /dev/null and b/Hex Files/firmware_Ender3_427_BLT_ZM_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3_427_BLT_ZM_LR_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3_427_BLT_ZM_LR_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..046eb67241
Binary files /dev/null and b/Hex Files/firmware_Ender3_427_BLT_ZM_LR_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3_427_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3_427_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..202f8186e5
Binary files /dev/null and b/Hex Files/firmware_Ender3_427_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender3_427_LR_DW7.4.4.bin.zip b/Hex Files/firmware_Ender3_427_LR_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..bf9921a847
Binary files /dev/null and b/Hex Files/firmware_Ender3_427_LR_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender5Pro_422_BLT_DW7.4.4.bin.zip b/Hex Files/firmware_Ender5Pro_422_BLT_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..9d0012525f
Binary files /dev/null and b/Hex Files/firmware_Ender5Pro_422_BLT_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender5Pro_422_BLT_LR_DW7.4.4.bin.zip b/Hex Files/firmware_Ender5Pro_422_BLT_LR_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..1d27c8e549
Binary files /dev/null and b/Hex Files/firmware_Ender5Pro_422_BLT_LR_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender5Pro_422_BLT_ZM_DW7.4.4.bin.zip b/Hex Files/firmware_Ender5Pro_422_BLT_ZM_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..bc72624bbc
Binary files /dev/null and b/Hex Files/firmware_Ender5Pro_422_BLT_ZM_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender5Pro_422_BLT_ZM_LR_DW7.4.4.bin.zip b/Hex Files/firmware_Ender5Pro_422_BLT_ZM_LR_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..f6638b7f89
Binary files /dev/null and b/Hex Files/firmware_Ender5Pro_422_BLT_ZM_LR_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender5Pro_422_DW7.4.4.bin.zip b/Hex Files/firmware_Ender5Pro_422_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..f2f797ef63
Binary files /dev/null and b/Hex Files/firmware_Ender5Pro_422_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender5Pro_422_LR_DW7.4.4.bin.zip b/Hex Files/firmware_Ender5Pro_422_LR_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..ee8ec4ff0f
Binary files /dev/null and b/Hex Files/firmware_Ender5Pro_422_LR_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender5Pro_427_BLT_DW7.4.4.bin.zip b/Hex Files/firmware_Ender5Pro_427_BLT_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..3f388d970f
Binary files /dev/null and b/Hex Files/firmware_Ender5Pro_427_BLT_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender5Pro_427_BLT_LR_DW7.4.4.bin.zip b/Hex Files/firmware_Ender5Pro_427_BLT_LR_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..458e462a43
Binary files /dev/null and b/Hex Files/firmware_Ender5Pro_427_BLT_LR_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender5Pro_427_BLT_ZM_DW7.4.4.bin.zip b/Hex Files/firmware_Ender5Pro_427_BLT_ZM_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..8f569ed416
Binary files /dev/null and b/Hex Files/firmware_Ender5Pro_427_BLT_ZM_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender5Pro_427_BLT_ZM_LR_DW7.4.4.bin.zip b/Hex Files/firmware_Ender5Pro_427_BLT_ZM_LR_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..9c2a72b25c
Binary files /dev/null and b/Hex Files/firmware_Ender5Pro_427_BLT_ZM_LR_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender5Pro_427_DW7.4.4.bin.zip b/Hex Files/firmware_Ender5Pro_427_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..2acaef2145
Binary files /dev/null and b/Hex Files/firmware_Ender5Pro_427_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender5Pro_427_LR_DW7.4.4.bin.zip b/Hex Files/firmware_Ender5Pro_427_LR_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..4f09feccdd
Binary files /dev/null and b/Hex Files/firmware_Ender5Pro_427_LR_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender6_BLT_DW7.4.4.bin.zip b/Hex Files/firmware_Ender6_BLT_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..70242e9ca3
Binary files /dev/null and b/Hex Files/firmware_Ender6_BLT_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender6_BLT_ZM_DW7.4.4.bin.zip b/Hex Files/firmware_Ender6_BLT_ZM_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..b2ae748b10
Binary files /dev/null and b/Hex Files/firmware_Ender6_BLT_ZM_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender6_DW7.4.4.bin.zip b/Hex Files/firmware_Ender6_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..8c25304eec
Binary files /dev/null and b/Hex Files/firmware_Ender6_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender7_BLT_DW7.4.4.bin.zip b/Hex Files/firmware_Ender7_BLT_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..b343bca0ea
Binary files /dev/null and b/Hex Files/firmware_Ender7_BLT_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender7_BLT_ZM_DW7.4.4.bin.zip b/Hex Files/firmware_Ender7_BLT_ZM_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..967ab5b9c9
Binary files /dev/null and b/Hex Files/firmware_Ender7_BLT_ZM_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_Ender7_DW7.4.4.bin.zip b/Hex Files/firmware_Ender7_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..68bee6ba27
Binary files /dev/null and b/Hex Files/firmware_Ender7_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_SermoonD1_BLT_DW7.4.4.bin.zip b/Hex Files/firmware_SermoonD1_BLT_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..6a081ad898
Binary files /dev/null and b/Hex Files/firmware_SermoonD1_BLT_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_SermoonD1_BLT_ZM_DW7.4.4.bin.zip b/Hex Files/firmware_SermoonD1_BLT_ZM_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..84ff5446f7
Binary files /dev/null and b/Hex Files/firmware_SermoonD1_BLT_ZM_DW7.4.4.bin.zip differ
diff --git a/Hex Files/firmware_SermoonD1_DW7.4.4.bin.zip b/Hex Files/firmware_SermoonD1_DW7.4.4.bin.zip
new file mode 100644
index 0000000000..9d7944eba6
Binary files /dev/null and b/Hex Files/firmware_SermoonD1_DW7.4.4.bin.zip differ
diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h
index e7902ce8a8..2b73a6c117 100644
--- a/Marlin/Configuration.h
+++ b/Marlin/Configuration.h
@@ -19,7 +19,8 @@
// Touchscreens in development, not tested
//#define MachineCR5
-//#define MachineEnder3Touchscreen
+//#define MachineSermoonD1
+//#define MachineEnder7
// Standard Display Atmega2560 machines (No bootloader required)
//#define MachineEnder4
@@ -32,6 +33,9 @@
//#define MachineS5
//#define MachineCR2020 // Industrial Series 2020
+// Belt Printer
+//#define MachineCR30
+
// Atmega1284P machines Needs a bootloader flashed before installation
// See video here : https://www.youtube.com/watch?v=fIl5X2ffdyo
@@ -129,6 +133,13 @@
//#define GraphicLCD // 12864 Full graphics LCD for Ender 4, CR-X, Ender 5 Plus, CR10SPro, or CR10Max
//#define Big_UI // Lightweight status screen, saves CPU cycles
+// CR-6 or Ender touchscreen kit
+//#define MachineEnder3Touchscreen
+
+// Ender 3 V2 rotary Dial LCD
+//#define FORCEV2DISPLAY
+
+
// Touchscreen options - only 32 bit boards have the open serial ports to use with graphics displays above
//#define FORCE10SPRODISPLAY
@@ -282,7 +293,7 @@
*
* Advanced settings can be found in Configuration_adv.h
*/
-#define CONFIGURATION_H_VERSION 02000902
+#define CONFIGURATION_H_VERSION 02000903
//===========================================================================
//============================= Getting Started =============================
@@ -490,12 +501,22 @@
#endif
#endif
-#if ANY(MachineCRX, MachineCRXPro, MachineEnder5Plus, MachineCR10SPro, MachineCR10Max, MachineEnder6)
+#if ANY(MachineCRX, MachineCRXPro, MachineEnder5Plus, MachineCR10SPro, MachineCR10Max, MachineEnder6, MachineSermoonD1, MachineEnder7)
#if NONE(GraphicLCD, OrigLCD, FORCE10SPRODISPLAY)
#define FORCE10SPRODISPLAY
#endif
#endif
+#if ANY(MachineEnder7, MachineSermoonD1)
+ #define DWINOS_4
+#endif
+
+#if ENABLED(MachineCR30)
+ #define OrigLCD
+ #define RET6_12864_LCD
+ #define BedDC
+#endif
+
#if ENABLED(MachineCRX)
#define MachineCR10Std
#define Dual_BowdenSplitterY
@@ -504,7 +525,7 @@
#endif
#endif
-#if ANY(MachineEnder3V2, MachineEnder3Pro422, MachineEnder3Pro427, Creality422, Creality427, MachineEnder3Max, MachineEnder6)
+#if ANY(MachineEnder3V2, MachineEnder3Pro422, MachineEnder3Pro427, Creality422, Creality427, MachineEnder3Max, MachineEnder6, MachineEnder7, MachineSermoonD1)
#define POWER_LOSS_RECOVERY //Screen will not compile without PLR
#if NONE(BedAC, BedDC)
#define BedDC
@@ -534,8 +555,16 @@
#endif
#if (EITHER(Creality422, Creality427) && DISABLED(MachineEnder3V2)) || BOTH(OrigLCD, MachineEnder6)
- #undef FORCE10SPRODISPLAY
- #define RET6_12864_LCD
+ #ifndef FORCE10SPRODISPLAY
+ #ifndef MachineEnder3Touchscreen
+ #ifndef FORCEV2DISPLAY
+ #define RET6_12864_LCD
+ #ifndef OrigLCD
+ #define OrigLCD
+ #endif
+ #endif
+ #endif
+ #endif
#endif
#if NONE(HotendStock, HotendE3D)
@@ -593,11 +622,21 @@
#define POWER_LOSS_RECOVERY
#endif
+#if ENABLED(MachineSermoonD1)
+ #ifndef Creality422
+ #define Creality422
+ #endif
+#endif
+
+#if ANY(SKR13, SKR14, SKR14Turbo, SKRPRO11, SKRE3Turbo, MachineEnder3V2, Creality422, Creality427, MachineEnder6, MachineSermoonD1, MachineCR30, MachineCR6, MachineCR6Max, MachineEnder7)
+ #define MachineLargeROM
+#endif
+
#if NONE(MachineCR10Orig, MachineEnder4, MachineCR10SPro, MachineCRX, MachineCR10Max, MachineEnder5Plus, SKRMiniE3V2, FORCE10SPRODISPLAY) || ENABLED(GraphicLCD)
#define SHOW_BOOTSCREEN
// Show the bitmap in Marlin/_Bootscreen.h on startup.
- #if DISABLED(MachineEnder3V2, MachineCR6, MachineCR6Max, MachineEnder3Touchscreen)
+ #if DISABLED(MachineEnder3V2, MachineCR6, MachineCR6Max, MachineEnder3Touchscreen, FORCEV2DISPLAY)
//#define SHOW_CUSTOM_BOOTSCREEN
// Show the bitmap in Marlin/_Statusscreen.h on the status screen.
//#define CUSTOM_STATUS_SCREEN_IMAGE
@@ -614,7 +653,7 @@
*/
#if ANY(SKR13, SKR14, SKR14Turbo, SKRPRO11, SKRMiniE3V2, SKRE3Turbo, SKR_CR6)
#define SERIAL_PORT -1
- #elif ANY(MachineEnder3V2, MachineEnder3Max, MachineEnder3Pro422, MachineEnder3Pro427, Creality422, Creality427, MachineEnder6, MachineCR6, MachineCR6Max)
+ #elif ANY(MachineEnder3V2, MachineEnder3Max, MachineEnder3Pro422, MachineEnder3Pro427, Creality422, Creality427, MachineEnder6, MachineCR6, MachineCR6Max, MachineSermoonD1, MachineCR30, MachineEnder7)
#define SERIAL_PORT 1
#else
#define SERIAL_PORT 0
@@ -629,28 +668,28 @@
#define LCD_SERIAL_PORT 0
#define LCD_BAUDRATE 115200
#define SERIAL_CATCHALL -1
-#elif ANY(SKR13, SKR14, SKR14Turbo, SKRPRO11, SKRE3Turbo) && DISABLED(MachineEnder3V2, MachineEnder3Touchscreen)
+#elif ANY(SKR13, SKR14, SKR14Turbo, SKRPRO11, SKRE3Turbo) && NONE(MachineEnder3V2, MachineEnder3Touchscreen, FORCEV2DISPLAY)
#define SERIAL_PORT_2 0
#elif ENABLED(SKRMiniE3V2)
#define SERIAL_PORT_2 2
-#elif BOTH(MachineEnder3V2, SKRE3Turbo)
+#elif ENABLED(MachineEnder3V2) && ANY(FORCEV2DISPLAY, SKRE3Turbo)
#define LCD_SERIAL_PORT 1
#define LCD_BAUDRATE 115200
#define SERIAL_CATCHALL -1
-#elif ANY(MachineCR10SPro, MachineCRX, MachineEnder5Plus, MachineCR10Max) && NONE(GraphicLCD, OrigLCD, MachineEnder3V2, Creality422, Creality427, MachineEnder6)
+#elif ANY(MachineCR10SPro, MachineCRX, MachineEnder5Plus, MachineCR10Max) && NONE(GraphicLCD, OrigLCD, MachineEnder3V2, Creality422, Creality427, MachineEnder6, FORCEV2DISPLAY)
#define LCD_SERIAL_PORT 2
#define LCD_BAUDRATE 115200
#define SERIAL_CATCHALL 0
-#elif ANY(MachineCR10SPro, MachineCRX, MachineEnder5Plus, MachineCR10Max, MachineEnder6) && NONE(GraphicLCD, OrigLCD)
+#elif ANY(MachineCR10SPro, MachineCRX, MachineEnder5Plus, MachineCR10Max, MachineEnder6, Creality422, Creality427, MachineSermoonD1, MachineEnder3Touchscreen, MachineCR6, MachineCR6Max, FORCEV2DISPLAY) && NONE(GraphicLCD, OrigLCD)
#define LCD_SERIAL_PORT 3
#define LCD_BAUDRATE 115200
#define SERIAL_CATCHALL 1
+#elif ENABLED(MachineEnder7)
+ #define LCD_SERIAL_PORT 2
+ #define LCD_BAUDRATE 115200
+ #define SERIAL_CATCHALL 1
#elif ANY(Creality422, Creality427) && NONE(MachineEnder3V2, FORCE10SPRODISPLAY, MachineEnder3Touchscreen)
#define SERIAL_PORT_2 3
-#elif ANY(Creality422, Creality427) && ENABLED(FORCE10SPRODISPLAY)
- #define LCD_SERIAL_PORT 3
- #define LCD_BAUDRATE 115200
- #define SERIAL_CATCHALL 1
#endif
/**
@@ -664,7 +703,7 @@
*
* :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000]
*/
-#if ANY(MachineEnder3V2, CrealityViewerKit, MachineCR6, MachineCR6Max, MachineEnder3Touchscreen)
+#if ANY(MachineEnder3V2, CrealityViewerKit, MachineCR6, MachineCR6Max, MachineEnder3Touchscreen, FORCEV2DISPLAY)
#define BAUDRATE 115200
#else
#define BAUDRATE 250000
@@ -707,6 +746,8 @@
#define MOTHERBOARD BOARD_BTT_SKR_E3_TURBO
#elif ENABLED(MachineEnder6)
#define MOTHERBOARD BOARD_CREALITY_V431
+ #elif ENABLED(MachineEnder7)
+ #define MOTHERBOARD BOARD_CREALITY_V24S1
#elif ENABLED(Creality427)
#define MOTHERBOARD BOARD_CREALITY_V427
#elif ENABLED(Creality422)
@@ -717,6 +758,8 @@
#define MOTHERBOARD BOARD_BTT_SKR_CR6
#elif ENABLED(CR6_452)
#define MOTHERBOARD BOARD_CREALITY_V452
+ #elif ENABLED(MachineCR30)
+ #define MOTHERBOARD BOARD_CREALITY_V4210
#elif ANY(MachineCR6, MachineCR6Max)
#define MOTHERBOARD BOARD_CREALITY_V453
#else
@@ -847,7 +890,6 @@
#define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders
#define PARKING_EXTRUDER_GRAB_DISTANCE 1 // (mm) Distance to move beyond the parking point to grab the extruder
- //#define MANUAL_SOLENOID_CONTROL // Manual control of docking solenoids with M380 S / M381
#if ENABLED(PARKING_EXTRUDER)
@@ -1459,7 +1501,7 @@
// Enable one of the options below for CoreXY, CoreXZ, or CoreYZ kinematics,
// either in the usual order or reversed
-#if ANY(MachineEnder4, MachineEnder6)
+#if ANY(MachineEnder4, MachineEnder6, MachineEnder7, MachineCR30)
#define COREXY
#endif
//#define COREXZ
@@ -1470,7 +1512,16 @@
//#define MARKFORGED_XY // MarkForged. See https://reprap.org/forum/read.php?152,504042
// Enable for a belt style printer with endless "Z" motion
-//#define BELTPRINTER
+#if ENABLED(MachineCR30)
+ #define BELTPRINTER
+#endif
+
+// Enable for Polargraph Kinematics
+//#define POLARGRAPH
+#if ENABLED(POLARGRAPH)
+ #define POLARGRAPH_MAX_BELT_LEN 1035.0
+ #define POLAR_SEGMENTS_PER_SECOND 5
+#endif
//===========================================================================
//============================== Endstop Settings ===========================
@@ -1487,7 +1538,11 @@
#define USE_YMAX_PLUG
#else
#define USE_XMIN_PLUG
- #define USE_YMIN_PLUG
+ #if ENABLED(MachineEnder7)
+ #define USE_YMAX_PLUG
+ #else
+ #define USE_YMIN_PLUG
+ #endif
#define USE_ZMIN_PLUG
#endif
//#define USE_IMIN_PLUG
@@ -1504,18 +1559,18 @@
#define ENDSTOPPULLUPS
#if DISABLED(ENDSTOPPULLUPS)
// Disable ENDSTOPPULLUPS to set pullups individually
- //#define ENDSTOPPULLUP_XMAX
- //#define ENDSTOPPULLUP_YMAX
- //#define ENDSTOPPULLUP_ZMAX
- //#define ENDSTOPPULLUP_IMAX
- //#define ENDSTOPPULLUP_JMAX
- //#define ENDSTOPPULLUP_KMAX
//#define ENDSTOPPULLUP_XMIN
//#define ENDSTOPPULLUP_YMIN
//#define ENDSTOPPULLUP_ZMIN
//#define ENDSTOPPULLUP_IMIN
//#define ENDSTOPPULLUP_JMIN
//#define ENDSTOPPULLUP_KMIN
+ //#define ENDSTOPPULLUP_XMAX
+ //#define ENDSTOPPULLUP_YMAX
+ //#define ENDSTOPPULLUP_ZMAX
+ //#define ENDSTOPPULLUP_IMAX
+ //#define ENDSTOPPULLUP_JMAX
+ //#define ENDSTOPPULLUP_KMAX
//#define ENDSTOPPULLUP_ZMIN_PROBE
#endif
@@ -1523,28 +1578,28 @@
//#define ENDSTOPPULLDOWNS
#if DISABLED(ENDSTOPPULLDOWNS)
// Disable ENDSTOPPULLDOWNS to set pulldowns individually
- //#define ENDSTOPPULLDOWN_XMAX
- //#define ENDSTOPPULLDOWN_YMAX
- //#define ENDSTOPPULLDOWN_ZMAX
- //#define ENDSTOPPULLDOWN_IMAX
- //#define ENDSTOPPULLDOWN_JMAX
- //#define ENDSTOPPULLDOWN_KMAX
//#define ENDSTOPPULLDOWN_XMIN
//#define ENDSTOPPULLDOWN_YMIN
//#define ENDSTOPPULLDOWN_ZMIN
//#define ENDSTOPPULLDOWN_IMIN
//#define ENDSTOPPULLDOWN_JMIN
//#define ENDSTOPPULLDOWN_KMIN
+ //#define ENDSTOPPULLDOWN_XMAX
+ //#define ENDSTOPPULLDOWN_YMAX
+ //#define ENDSTOPPULLDOWN_ZMAX
+ //#define ENDSTOPPULLDOWN_IMAX
+ //#define ENDSTOPPULLDOWN_JMAX
+ //#define ENDSTOPPULLDOWN_KMAX
//#define ENDSTOPPULLDOWN_ZMIN_PROBE
#endif
// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup).
-#if ANY(MachineEnder4, MachineCR2020)
+#if ANY(MachineEnder4, MachineCR2020, MachineCR30)
#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop.
#else
#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.
#endif
-#if ENABLED(MachineCR2020)
+#if ANY(MachineCR2020, MachineCR30)
#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop.
#else
#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.
@@ -1585,7 +1640,7 @@
* :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'L6474', 'POWERSTEP01', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2160', 'TMC2160_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC2209', 'TMC2209_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE', 'TMC5160', 'TMC5160_STANDALONE']
*/
-#if ANY(SKR13, SKR14, SKR14Turbo, SKRPRO11, MachineCR10SV2, CrealitySilentBoard, MachineCR10SPro, MachineCR10SProV2, MachineCR10Max, SKRMiniE3V2, MachineCR6, MachineCR6Max) && DISABLED(SKR_UART)
+#if (ANY(SKR13, SKR14, SKR14Turbo, SKRPRO11, CrealitySilentBoard) || ANY(MachineCR10SV2, MachineCR10SPro, MachineCR10SProV2, MachineCR10Max, SKRMiniE3V2, MachineCR6, MachineCR6Max, MachineEnder6, MachineEnder7, MachineSermoonD1, MachineCR30)) && DISABLED(SKR_UART)
#if ENABLED(SKR_2209)
#define X_DRIVER_TYPE TMC2209_STANDALONE
#define Y_DRIVER_TYPE TMC2209_STANDALONE
@@ -1739,7 +1794,7 @@
#define EStepsmm 409
#elif ANY(EZRstruder, MachineCR10SV2)
#define EStepsmm 93
-#elif ANY(MachineCR10SPro, MachineCR10Max, MachineCRXPro, MachineEnder6)
+#elif ANY(MachineCR10SPro, MachineCR10Max, MachineCRXPro, MachineEnder6, MachineEnder7, MachineCR30)
#define EStepsmm 140
#elif ENABLED(MachineCR2020)
#define EStepsmm 113
@@ -1749,6 +1804,8 @@
#if ENABLED(MachineEnder5Plus)
#define ZStepsmm 800
+#elif ENABLED(MachineCR30)
+ #define ZStepsmm 1152.95
#else
#define ZStepsmm 400
#endif
@@ -1759,7 +1816,13 @@
#define EstepMultiplier 1
#endif
-#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, ZStepsmm, (EStepsmm*EstepMultiplier) }
+#if ENABLED(MachineEnder7)
+ #define XYStepsmm 200
+#else
+ #define XYStepsmm 80
+#endif
+
+#define DEFAULT_AXIS_STEPS_PER_UNIT { XYStepsmm, XYStepsmm, ZStepsmm, (EStepsmm*EstepMultiplier) }
/**
* Default Max Feed Rate (mm/s)
@@ -1772,13 +1835,13 @@
#define DEFAULT_ACCELERATION 750 // X, Y, Z and E acceleration for printing moves
#define DEFAULT_RETRACT_ACCELERATION 1000 // E acceleration for retracts
#define DEFAULT_TRAVEL_ACCELERATION 300 // X, Y, Z acceleration for travel (non printing) moves
-#elif ANY(MachineMini, MachineCR20, MachineEnder2, MachineEnder3, MachineEnder3Max, MachineEnder3V2, MachineEnder4, MachineEnder5, MachineEnder5Plus)
+#elif ANY(MachineMini, MachineCR20, MachineEnder2, MachineEnder3, MachineEnder3Max, MachineEnder3V2, MachineEnder4, MachineEnder5, MachineEnder5Plus, MachineSermoonD1)
#define DEFAULT_MAX_FEEDRATE { 750, 750, 10, 75 }
#define DEFAULT_MAX_ACCELERATION { 2000, 2000, 100, 75 }
#define DEFAULT_ACCELERATION 750 // X, Y, Z and E acceleration for printing moves
#define DEFAULT_RETRACT_ACCELERATION 1000 // E acceleration for retracts
#define DEFAULT_TRAVEL_ACCELERATION 300 // X, Y, Z acceleration for travel (non printing) moves
-#elif (ANY(MachineCR10SPro, MachineCR6, MachineCR6Max))
+#elif (ANY(MachineCR10SPro, MachineCR6, MachineCR6Max, MachineCR30))
#define DEFAULT_MAX_FEEDRATE { 500, 500, 10, 70 }
#define DEFAULT_MAX_ACCELERATION { 750, 750, 100, 60 }
#define DEFAULT_ACCELERATION 750 // X, Y, Z and E acceleration for printing moves
@@ -1808,6 +1871,12 @@
#define DEFAULT_ACCELERATION 2000 // X, Y, Z and E acceleration for printing moves
#define DEFAULT_RETRACT_ACCELERATION 1000 // E acceleration for retracts
#define DEFAULT_TRAVEL_ACCELERATION 300 // X, Y, Z acceleration for travel (non printing) moves
+#elif ENABLED(MachineEnder7)
+ #define DEFAULT_MAX_FEEDRATE { 750, 750, 10, 75 }
+ #define DEFAULT_MAX_ACCELERATION { 35000, 35000, 100, 75 }
+ #define DEFAULT_ACCELERATION 10000 // X, Y, Z and E acceleration for printing moves
+ #define DEFAULT_RETRACT_ACCELERATION 1000 // E acceleration for retracts
+ #define DEFAULT_TRAVEL_ACCELERATION 10000 // X, Y, Z acceleration for travel (non printing) moves
#endif
//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2
@@ -1846,8 +1915,16 @@
*/
#define CLASSIC_JERK
#if ENABLED(CLASSIC_JERK)
- #define DEFAULT_XJERK 10.0
- #define DEFAULT_YJERK 5.0
+ #if ANY(MachineEnder6, MachineEnder5, MachineEnder5Plus, MachineSermoonD1)
+ #define DEFAULT_XJERK 20.0
+ #define DEFAULT_YJERK 20.0
+ #elif ENABLED(MachineEnder7)
+ #define DEFAULT_XJERK 30.0
+ #define DEFAULT_YJERK 30.0
+ #else
+ #define DEFAULT_XJERK 10.0
+ #define DEFAULT_YJERK 5.0
+ #endif
#define DEFAULT_ZJERK 0.3
//#define DEFAULT_IJERK 0.3
//#define DEFAULT_JJERK 0.3
@@ -2090,7 +2167,7 @@
#define NOZZLE_TO_PROBE_OFFSET { -27.625, 0.0, 0 }
#endif
#endif
-#elif ENABLED(MachineCRXPro, HotendStock, ABL_BLTOUCH)
+#elif ANY(MachineCRXPro, MachineEnder3Max, MachineSermoonD1, MachineEnder7) && ALL(HotendStock, ABL_BLTOUCH)
#define NOZZLE_TO_PROBE_OFFSET { 48, 3, 0 }
#elif ANY(MachineCR6, MachineCR6Max)
#define NOZZLE_TO_PROBE_OFFSET { 0, 0, 0.2 }
@@ -2181,6 +2258,15 @@
#endif
#endif
+/**
+ * Probe Enable / Disable
+ * The probe only provides a triggered signal when enabled.
+ */
+//#define PROBE_ENABLE_DISABLE
+#if ENABLED(PROBE_ENABLE_DISABLE)
+ //#define PROBE_ENABLE_PIN -1 // Override the default pin here
+#endif
+
/**
* Multiple Probing
*
@@ -2302,7 +2388,18 @@
// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way.
-#if(ANY(MachineEnder4, MachineEnder5))
+#if(ANY(MachineEnder4, MachineEnder5) && ANY(Creality422, Creality427))
+ #define INVERT_X_DIR false
+ #define INVERT_Y_DIR false
+ #define INVERT_Z_DIR false
+ #if(ENABLED(E3DTitan))
+ #define INVERT_E0_DIR true
+ #define INVERT_E1_DIR false
+ #else
+ #define INVERT_E0_DIR false
+ #define INVERT_E1_DIR true
+ #endif
+#elif(ANY(MachineEnder4, MachineEnder5, MachineCR30) && NONE(Creality422, Creality427))
#define INVERT_X_DIR true
#define INVERT_Y_DIR true
#define INVERT_Z_DIR true
@@ -2339,19 +2436,23 @@
#define INVERT_X_DIR true
#define INVERT_Y_DIR false
#else
- #define INVERT_X_DIR false
- #if ANY(MachineCRX,MachineCR10SPro, MachineCR10Max, MachineCR2020, MachineEnder6)
+ #if ENABLED(MachineSermoonD1)
+ #define INVERT_X_DIR true
+ #else
+ #define INVERT_X_DIR false
+ #endif
+ #if ANY(MachineCRX,MachineCR10SPro, MachineCR10Max, MachineCR2020, MachineEnder6, MachineEnder7)
#define INVERT_Y_DIR true
#else
#define INVERT_Y_DIR false
#endif
#endif
- #if ANY(MachineEnder5Plus, MachineCR2020, MachineEnder6)
+ #if ANY(MachineEnder5Plus, MachineCR2020, MachineEnder6, MachineSermoonD1, MachineEnder7)
#define INVERT_Z_DIR false
#else
#define INVERT_Z_DIR true
#endif
- #if ANY(E3DTitan, MachineCR2020, MachineEnder6)
+ #if ANY(E3DTitan, MachineCR2020, MachineEnder6, MachineEnder7)
#define INVERT_E0_DIR true
#define INVERT_E1_DIR false
#else
@@ -2404,7 +2505,11 @@
#define Z_HOME_DIR -1
#else
#define X_HOME_DIR -1
- #define Y_HOME_DIR -1
+ #if ENABLED(MachineEnder7)
+ #define Y_HOME_DIR 1
+ #else
+ #define Y_HOME_DIR -1
+ #endif
#define Z_HOME_DIR -1
#endif
//#define I_HOME_DIR -1
@@ -2458,7 +2563,7 @@
#else
#define Z_MAX_POS 250
#endif
- #define X_MAX_POS 250
+ #define X_MAX_POS 245
#define Y_MAX_POS 250
#define ClipClearance 15
#elif(ANY(MachineEnder4, MachineEnder5))
@@ -2487,6 +2592,27 @@
#define X_MAX_POS 260
#define Y_MAX_POS 260
#define ClipClearance 10
+ #elif ENABLED(MachineSermoonD1)
+ #define X_BED_SIZE 290
+ #define Y_BED_SIZE 270
+ #define Z_MAX_POS 320
+ #define X_MAX_POS 290
+ #define Y_MAX_POS 270
+ #define ClipClearance 10
+ #elif ENABLED(MachineEnder7)
+ #define X_BED_SIZE 250
+ #define Y_BED_SIZE 250
+ #define Z_MAX_POS 350
+ #define X_MAX_POS 255
+ #define Y_MAX_POS 255
+ #define ClipClearance 10
+ #elif ENABLED(MachineCR30)
+ #define X_BED_SIZE 220
+ #define Y_BED_SIZE 250
+ #define Z_MAX_POS 20000000
+ #define X_MAX_POS X_BED_SIZE
+ #define Y_MAX_POS Y_BED_SIZE
+ #define ClipClearance 2
#elif ENABLED(MachineCR20)
#define X_BED_SIZE 230
#define Y_BED_SIZE 230
@@ -2570,6 +2696,9 @@
#elif ENABLED(MachineCR6Max)
#define X_MIN_POS -10
#define Y_MIN_POS -3
+#elif ENABLED(MachineCR30)
+ #define X_MIN_POS 0
+ #define Y_MIN_POS -5
#else
#define X_MIN_POS 0
#define Y_MIN_POS 0
@@ -2763,7 +2892,7 @@
#define AUTO_BED_LEVELING_UBL
#elif BOTH(PROBE_MANUALLY, FORCE10SPRODISPLAY)
#define MESH_BED_LEVELING
- #elif !BOTH(OrigLA, MachineCR10Orig)
+ #elif !BOTH(OrigLA, MachineCR10Orig) && DISABLED(MachineCR30)
#define AUTO_BED_LEVELING_BILINEAR
#endif
/**
@@ -2788,7 +2917,7 @@
* Turn on with the command 'M111 S32'.
* NOTE: Requires a lot of PROGMEM!
*/
-#if ANY(MachineCR6, MachineCR6Max, MachineEnder6, Creality422, Creality427, SKR13, SKR14, SKR14Turbo, SKRE3Turbo, SKRPRO11)
+#if ENABLED(MachineLargeROM)
#define DEBUG_LEVELING_FEATURE
#endif
@@ -2837,7 +2966,7 @@
#if ENABLED(MeshFast)
#define GRID_MAX_POINTS_X 3
#elif ENABLED(MeshStd)
- #if ENABLED(MachineCR6)
+ #if ANY(MachineCR6, MachineEnder3Touchscreen)
#define GRID_MAX_POINTS_X 4
#elif ENABLED(MachineCR6Max)
#define GRID_MAX_POINTS_X 7
@@ -2925,7 +3054,7 @@
* Add a bed leveling sub-menu for ABL or MBL.
* Include a guided procedure if manual probing is enabled.
*/
-#if NONE(ABL_EZABL, ABL_NCSW, ABL_BLTOUCH, ABL_TOUCH_MI, SKRMiniE3V2, MachineEnder3V2, FORCE10SPRODISPLAY, MachineCR6, MachineCR6Max, MachineEnder3Touchscreen) && (DISABLED(MachineCRX) || ANY(GraphicLCD, OrigLCD))
+#if NONE(ABL_EZABL, ABL_NCSW, ABL_BLTOUCH, ABL_TOUCH_MI, SKRMiniE3V2, MachineEnder3V2, FORCE10SPRODISPLAY, MachineCR6, MachineCR6Max, MachineSermoonD1, MachineEnder7, MachineCR30, FORCEV2DISPLAY) && (DISABLED(MachineCRX) || ANY(GraphicLCD, OrigLCD))
#define LCD_BED_LEVELING
#endif
@@ -3362,10 +3491,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, hu, it,
+ * en, an, bg, ca, cz, da, de, el, el_CY, es, eu, fi, fr, gl, hr, hu, it,
* jp_kana, ko_KR, nl, pl, pt, pt_br, ro, ru, sk, sv, tr, uk, vi, zh_CN, zh_TW
*
- * :{ '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', 'hu':'Hungarian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ro':'Romanian', 'ru':'Russian', 'sk':'Slovak', 'sv':'Swedish', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)' }
+ * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek (Greece)', 'el_CY':'Greek (Cyprus)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'hu':'Hungarian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ro':'Romanian', 'ru':'Russian', 'sk':'Slovak', 'sv':'Swedish', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)' }
*/
#define LCD_LANGUAGE en
@@ -3591,9 +3720,9 @@
#define ENDER2_STOCKDISPLAY
#elif ANY(MachineCR20, MachineCR2020)
#define MKS_MINI_12864
-#elif ENABLED(MachineEnder3V2)
+#elif ANY(MachineEnder3V2, FORCEV2DISPLAY)
#define DWIN_CREALITY_LCD_JYERSUI
-#elif ANY(OrigLCD, MachineCR10Orig, MachineEnder3Pro422, MachineEnder3Pro427, MachineEnder3Max, SKRMiniE3V2, SKRE3Turbo) && DISABLED(GraphicLCD, MachineEnder3Touchscreen, FORCE10SPRODISPLAY)
+#elif ANY(OrigLCD, MachineCR10Orig, MachineEnder3Pro422, MachineEnder3Pro427, MachineEnder3Max, SKRMiniE3V2, SKRE3Turbo) && NONE(GraphicLCD, MachineEnder3Touchscreen, FORCE10SPRODISPLAY)
#define CR10_STOCKDISPLAY
#elif NONE(MachineCR10SPro, MachineCRX, MachineEnder5Plus, MachineCR10Max, OrigLCD, MachineCR10Orig, SKRMiniE3V2, FORCE10SPRODISPLAY, MachineCR6, MachineCR6Max, MachineEnder3Touchscreen) || ENABLED(GraphicLCD)
#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
@@ -3707,6 +3836,11 @@
//#define VIKI2
//#define miniVIKI
+//
+// Alfawise Ex8 printer LCD marked as WYH L12864 COG
+//
+//#define WYH_L12864
+
//
// MakerLab Mini Panel with graphic
// controller and SD support - https://reprap.org/wiki/Mini_panel
@@ -3959,7 +4093,7 @@
// Third-party or vendor-customized controller interfaces.
// Sources should be installed in 'src/lcd/extui'.
//
-#if ANY(MachineCR10SPro, MachineCRX, MachineEnder5Plus, MachineCR10Max, MachineEnder6) && (NONE(GraphicLCD, SKRMiniE3V2, OrigLCD) || ENABLED(FORCE10SPRODISPLAY))
+#if ANY(MachineCR10SPro, MachineCRX, MachineEnder5Plus, MachineCR10Max, MachineEnder6, MachineEnder7, MachineSermoonD1) && (NONE(GraphicLCD, SKRMiniE3V2, OrigLCD) || ENABLED(FORCE10SPRODISPLAY))
#ifndef FORCE10SPRODISPLAY
#define FORCE10SPRODISPLAY
#endif
@@ -3980,32 +4114,32 @@
*/
//
-// 480x320, 3.5", SPI Display From MKS
-// Normally used in MKS Robin Nano V2
+// 480x320, 3.5", SPI Display with Rotary Encoder from MKS
+// Usually paired with MKS Robin Nano V2 & V3
//
//#define MKS_TS35_V2_0
//
// 320x240, 2.4", FSMC Display From MKS
-// Normally used in MKS Robin Nano V1.2
+// Usually paired with MKS Robin Nano V1.2
//
//#define MKS_ROBIN_TFT24
//
// 320x240, 2.8", FSMC Display From MKS
-// Normally used in MKS Robin Nano V1.2
+// Usually paired with MKS Robin Nano V1.2
//
//#define MKS_ROBIN_TFT28
//
// 320x240, 3.2", FSMC Display From MKS
-// Normally used in MKS Robin Nano V1.2
+// Usually paired with MKS Robin Nano V1.2
//
//#define MKS_ROBIN_TFT32
//
// 480x320, 3.5", FSMC Display From MKS
-// Normally used in MKS Robin Nano V1.2
+// Usually paired with MKS Robin Nano V1.2
//
//#define MKS_ROBIN_TFT35
@@ -4016,7 +4150,7 @@
//
// 320x240, 3.2", FSMC Display From MKS
-// Normally used in MKS Robin
+// Usually paired with MKS Robin
//
//#define MKS_ROBIN_TFT_V1_1R
@@ -4046,10 +4180,15 @@
//#define ANET_ET5_TFT35
//
-// 1024x600, 7", RGB Stock Display from BIQU-BX
+// 1024x600, 7", RGB Stock Display with Rotary Encoder from BIQU-BX
//
//#define BIQU_BX_TFT70
+//
+// 480x320, 3.5", SPI Stock Display with Rotary Encoder from BIQU B1 SE Series
+//
+//#define BTT_TFT35_SPI_V1_0
+
//
// Generic TFT with detailed options
//
@@ -4104,23 +4243,11 @@
//
// Ender-3 v2 OEM display. A DWIN display with Rotary Encoder.
//
-//#define DWIN_CREALITY_LCD
-
-//
-// Ender-3 v2 OEM display, enhanced.
-//
-//#define DWIN_CREALITY_LCD_ENHANCED
-
-//
-// Ender-3 v2 OEM display with enhancements by Jacob Myers
-//
-//#define DWIN_CREALITY_LCD_JYERSUI
-
-//
-// MarlinUI for Creality's DWIN display (and others)
-//
-//#define DWIN_MARLINUI_PORTRAIT
-//#define DWIN_MARLINUI_LANDSCAPE
+//#define DWIN_CREALITY_LCD // Creality UI
+//#define DWIN_CREALITY_LCD_ENHANCED // Enhanced UI
+//#define DWIN_CREALITY_LCD_JYERSUI // Jyers UI by Jacob Myers
+//#define DWIN_MARLINUI_PORTRAIT // MarlinUI (portrait orientation)
+//#define DWIN_MARLINUI_LANDSCAPE // MarlinUI (landscape orientation)
//
// Touch Screen Settings
@@ -4286,9 +4413,9 @@
* Set this manually if there are extra servos needing manual control.
* Set to 0 to turn off servo support.
*/
-//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command
+//#define NUM_SERVOS 3 // Note: Servo index starts with 0 for M280-M282 commands
-// (ms) Delay before the next move will start, to give the servo time to reach its target angle.
+// (ms) Delay before the next move will start, to give the servo time to reach its target angle.
// 300ms is a good value but you can try less delay.
// If the servo can't reach the requested position, increase it.
#define SERVO_DELAY { 300 }
@@ -4298,3 +4425,6 @@
// Edit servo angles with M281 and save to EEPROM with M500
//#define EDITABLE_SERVO_ANGLES
+
+// Disable servo with M282 to reduce power consumption, noise, and heat when not in use
+//#define SERVO_DETACH_GCODE
diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h
index 533dafe643..f931845215 100644
--- a/Marlin/Configuration_adv.h
+++ b/Marlin/Configuration_adv.h
@@ -30,7 +30,7 @@
*
* Basic settings can be found in Configuration.h
*/
-#define CONFIGURATION_ADV_H_VERSION 02000902
+#define CONFIGURATION_ADV_H_VERSION 02000903
//===========================================================================
//============================= Thermal Settings ============================
@@ -437,7 +437,7 @@
#define AUTOTEMP
#endif
#if ENABLED(AUTOTEMP)
- #define AUTOTEMP_OLDWEIGHT 0.98
+ #define AUTOTEMP_OLDWEIGHT 0.98 // Factor used to weight previous readings (0.0 < value < 1.0)
// Turn on AUTOTEMP on M104/M109 by default using proportions set here
//#define AUTOTEMP_PROPORTIONAL
#if ENABLED(AUTOTEMP_PROPORTIONAL)
@@ -825,9 +825,11 @@
#define HOMING_BACKOFF_POST_MM { 8, 8, 2 } // (mm) Backoff from endstops after homing
-#define QUICK_HOME // If G28 contains XY do a diagonal move first
-
-//#define HOME_Y_BEFORE_X // If G28 contains XY home Y before X
+#if DISABLED(MachineCR30)
+ #define QUICK_HOME // If G28 contains XY do a diagonal move first
+#else
+ #define HOME_Y_BEFORE_X // If G28 contains XY home Y before X
+#endif
//#define HOME_Z_FIRST // Home Z first. Requires a Z-MIN endstop (not a probe).
//#define CODEPENDENT_XY_HOMING // If X/Y can't home without homing Y/X first
@@ -877,7 +879,7 @@
* differs, a mode set eeprom write will be completed at initialization.
* Use the option below to force an eeprom write to a V3.1 probe regardless.
*/
- #if NONE(SKR13, SKR14, SKR14Turbo, SKRPRO11, SKRMiniE3V2)
+ #if NONE(SKR13, SKR14, SKR14Turbo, SKRPRO11, SKRMiniE3V2, Creality422, Creality427, MachineEnder6, MachineEnder7, MachineSermoonD1, MachineCR30, MachineCR6, MachineCR6Max)
#define BLTOUCH_SET_5V_MODE
#endif
/**
@@ -889,14 +891,14 @@
//#define BLTOUCH_FORCE_MODE_SET
/**
- * Use "HIGH SPEED" mode for probing.
+ * Enable "HIGH SPEED" option for probing.
* Danger: Disable if your probe sometimes fails. Only suitable for stable well-adjusted systems.
* This feature was designed for Deltabots with very fast Z moves; however, higher speed Cartesians
* might be able to use it. If the machine can't raise Z fast enough the BLTouch may go into ALARM.
+ *
+ * Set the default state here, change with 'M401 S' or UI, use M500 to save, M502 to reset.
*/
- #if NONE(MachineCR10Orig, LowMemoryBoard, MachineCRXs)
- #define BLTOUCH_HS_MODE
- #endif
+ #define BLTOUCH_HS_MODE true
// Safety: Enable voltage mode settings in the LCD menu.
//#define BLTOUCH_LCD_VOLTAGE_MENU
@@ -1030,7 +1032,7 @@
// If the Nozzle or Bed falls when the Z stepper is disabled, set its resting position here.
//#define Z_AFTER_DEACTIVATE Z_HOME_POS
-#if ANY(MachineEnder5, MachineEnder5Plus, MachineEnder6)
+#if ANY(MachineEnder5, MachineEnder5Plus, MachineEnder6, MachineCR30)
#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated
#endif
@@ -1045,8 +1047,8 @@
// Increase the slowdown divisor for larger buffer sizes.
#define SLOWDOWN
#if ENABLED(SLOWDOWN)
- #if ANY(SKR13, SKR14, SKR14Turbo, SKRPRO11, SKRMiniE3V2, MachineEnder3V2, Creality422, Creality427)
- #define SLOWDOWN_DIVISOR 4
+ #if ENABLED(MachineLargeROM)
+ #define SLOWDOWN_DIVISOR 8
#else
#define SLOWDOWN_DIVISOR 2
#endif
@@ -1175,7 +1177,7 @@
* vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the
* lowest stepping frequencies.
*/
-#if ANY(SKR13, SKR14, SKR14Turbo, SKRPRO11, MachineEnder3V2, Creality422, Creality427, MachineCR6, MachineCR6Max, MachineEnder6)
+#if ENABLED(MachineLargeROM)
#define ADAPTIVE_STEP_SMOOTHING
#endif
@@ -1338,7 +1340,7 @@
#endif // HAS_LCD_MENU
-#if HAS_DISPLAY
+#if EITHER(HAS_DISPLAY, DWIN_CREALITY_LCD_ENHANCED)
// The timeout (in ms) to return to the status screen from sub-menus
#define LCD_TIMEOUT_TO_STATUS 15000
@@ -1366,7 +1368,7 @@
// LCD Print Progress options
#if EITHER(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY)
- #if ANY(HAS_MARLINUI_U8GLIB, EXTENSIBLE_UI, HAS_MARLINUI_HD44780, IS_TFTGLCD_PANEL, IS_DWIN_MARLINUI)
+ #if CAN_SHOW_REMAINING_TIME
#define SHOW_REMAINING_TIME // Display estimated time to completion
#if ENABLED(SHOW_REMAINING_TIME)
#define USE_M73_REMAINING_TIME // Use remaining time from M73 command instead of estimation
@@ -1411,7 +1413,9 @@
//#define SD_IGNORE_AT_STARTUP // Don't mount the SD card when starting up
//#define SDCARD_READONLY // Read-only SD card (to save over 2K of flash)
- //#define GCODE_REPEAT_MARKERS // Enable G-code M808 to set repeat markers and do looping
+ #if ENABLED(MachineCR30)
+ #define GCODE_REPEAT_MARKERS // Enable G-code M808 to set repeat markers and do looping
+ #endif
#define SD_PROCEDURE_DEPTH 1 // Increase if you need more nested M32 calls
@@ -1680,7 +1684,7 @@
* Set STATUS_EXPIRE_SECONDS to zero to never clear the status.
* This will prevent position updates from being displayed.
*/
- #if ENABLED(U8GLIB_ST7920)
+ #if IS_U8GLIB_ST7920
// Enable this option and reduce the value to optimize screen updates.
// The normal delay is 10µs. Use the lowest value that still gives a reliable display.
//#define DOGM_SPI_DELAY_US 5
@@ -1714,14 +1718,14 @@
//#define STATUS_FAN_FRAMES 3 // :[0,1,2,3,4] Number of fan animation frames
//#define STATUS_HEAT_PERCENT // Show heating in a progress bar
//#define BOOT_MARLIN_LOGO_SMALL // Show a smaller Marlin logo on the Boot Screen (saving 399 bytes of flash)
- #if ANY(SKR13, SKR14, SKR14Turbo, SKRPRO11)
+ #if ENABLED(MachineLargeROM)
#define BOOT_MARLIN_LOGO_ANIMATED // Animated Marlin logo. Costs ~3260 (or ~940) bytes of PROGMEM.
#else
#define BOOT_MARLIN_LOGO_SMALL // Show a smaller Marlin logo on the Boot Screen (saving 399 bytes of flash)
#endif
//#define GAMES_EASTER_EGG // Add extra blank lines above the "Games" sub-menu
- #if ANY(SKR13, SKR14, SKR14Turbo, SKRPRO11)
+ #if ENABLED(MachineLargeROM)
// Frivolous Game Options
#define MARLIN_BRICKOUT
#define MARLIN_INVADERS
@@ -1743,9 +1747,11 @@
//
// Additional options for DGUS / DWIN displays
//
-#if HAS_DGUS_LCD || ENABLED(DGUS_LCD_UI_CREALITY_TOUCH)
- #define LCD_SERIAL_PORT 3
- #define LCD_BAUDRATE 115200
+#if HAS_DGUS_LCD || ENABLED(DGUS_LCD_UI_CREALITY_TOUCH) || ENABLED(FORCE10SPRODISPLAY)
+ #ifndef LCD_SERIAL_PORT
+ #define LCD_SERIAL_PORT 3
+ #define LCD_BAUDRATE 115200
+ #endif
#define DGUS_RX_BUFFER_SIZE 128
#define DGUS_TX_BUFFER_SIZE 48
@@ -1975,7 +1981,7 @@
#endif
#if ENABLED(BABYSTEP_ZPROBE_OFFSET)
//#define BABYSTEP_HOTEND_Z_OFFSET // For multiple hotends, babystep relative Z offsets
- #if NONE(MachineCR10Orig, LowMemoryBoard, EXTENSIBLE_UI, SKRMiniE3V2, MachineEnder3V2, MachineCR6, MachineCR6Max) && (DISABLED(MachineEnder4) || ENABLED(GraphicLCD))
+ #if NONE(MachineCR10Orig, LowMemoryBoard, EXTENSIBLE_UI, SKRMiniE3V2, MachineEnder3V2, MachineCR6, MachineCR6Max, FORCEV2DISPLAY) && (DISABLED(MachineEnder4) || ENABLED(GraphicLCD))
#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor
#endif
#endif
@@ -2006,6 +2012,7 @@
#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 EXPERIMENTAL_SCURVE // Enable this option to permit S-Curve Acceleration
+ #define ALLOW_LOW_EJERK // Allow a DEFAULT_EJERK value of <10. Recommended for direct drive hotends.
#endif
// @section leveling
@@ -2065,7 +2072,7 @@
* Repeatedly attempt G29 leveling until it succeeds.
* Stop after G29_MAX_RETRIES attempts.
*/
-#if ENABLED(ABL_BI) && NONE(MachineCR10Orig, LowMemoryBoard, SKRMiniE3V2)
+#if ENABLED(ABL_BI) && NONE(MachineCR10Orig, LowMemoryBoard, SKRMiniE3V2, MachineCR30)
#define G29_RETRY_AND_RECOVER
#endif
#if ENABLED(G29_RETRY_AND_RECOVER)
@@ -2083,59 +2090,69 @@
/**
* Thermal Probe Compensation
- * Probe measurements are adjusted to compensate for temperature distortion.
- * Use G76 to calibrate this feature. Use M871 to set values manually.
- * For a more detailed explanation of the process see G76_M871.cpp.
+ *
+ * Adjust probe measurements to compensate for distortion associated with the temperature
+ * of the probe, bed, and/or hotend.
+ * Use G76 to automatically calibrate this feature for probe and bed temperatures.
+ * (Extruder temperature/offset values must be calibrated manually.)
+ * Use M871 to set temperature/offset values manually.
+ * For more details see https://marlinfw.org/docs/features/probe_temp_compensation.html
*/
-#if HAS_BED_PROBE && TEMP_SENSOR_PROBE && TEMP_SENSOR_BED
- // Enable thermal first layer compensation using bed and probe temperatures
- #define PROBE_TEMP_COMPENSATION
+//#define PTC_PROBE // Compensate based on probe temperature
+//#define PTC_BED // Compensate based on bed temperature
+//#define PTC_HOTEND // Compensate based on hotend temperature
- // Add additional compensation depending on hotend temperature
- // Note: this values cannot be calibrated and have to be set manually
- #if ENABLED(PROBE_TEMP_COMPENSATION)
+#if ANY(PTC_PROBE, PTC_BED, PTC_HOTEND)
+ /**
+ * If the probe is outside the defined range, use linear extrapolation with the closest
+ * point and the point with index PTC_LINEAR_EXTRAPOLATION. e.g., If set to 4 it will use the
+ * linear extrapolation between data[0] and data[4] for values below PTC_PROBE_START.
+ */
+ //#define PTC_LINEAR_EXTRAPOLATION 4
+
+ #if ENABLED(PTC_PROBE)
+ // Probe temperature calibration generates a table of values starting at PTC_PROBE_START
+ // (e.g., 30), in steps of PTC_PROBE_RES (e.g., 5) with PTC_PROBE_COUNT (e.g., 10) samples.
+ #define PTC_PROBE_START 30 // (°C)
+ #define PTC_PROBE_RES 5 // (°C)
+ #define PTC_PROBE_COUNT 10
+ #define PTC_PROBE_ZOFFS { 0 } // (µm) Z adjustments per sample
+ #endif
+
+ #if ENABLED(PTC_BED)
+ // Bed temperature calibration builds a similar table.
+ #define PTC_BED_START 60 // (°C)
+ #define PTC_BED_RES 5 // (°C)
+ #define PTC_BED_COUNT 10
+ #define PTC_BED_ZOFFS { 0 } // (µm) Z adjustments per sample
+ #endif
+
+ #if ENABLED(PTC_HOTEND)
+ // Note: There is no automatic calibration for the hotend. Use M871.
+ #define PTC_HOTEND_START 180 // (°C)
+ #define PTC_HOTEND_RES 5 // (°C)
+ #define PTC_HOTEND_COUNT 20
+ #define PTC_HOTEND_ZOFFS { 0 } // (µm) Z adjustments per sample
+ #endif
+
+ // G76 options
+ #if BOTH(PTC_PROBE, PTC_BED)
// Park position to wait for probe cooldown
#define PTC_PARK_POS { 0, 0, 100 }
// Probe position to probe and wait for probe to reach target temperature
+ //#define PTC_PROBE_POS { 12.0f, 7.3f } // Example: MK52 magnetic heatbed
#define PTC_PROBE_POS { 90, 100 }
- // Enable additional compensation using hotend temperature
- // Note: this values cannot be calibrated automatically but have to be set manually
- //#define USE_TEMP_EXT_COMPENSATION
-
- // Probe temperature calibration generates a table of values starting at PTC_SAMPLE_START
- // (e.g., 30), in steps of PTC_SAMPLE_RES (e.g., 5) with PTC_SAMPLE_COUNT (e.g., 10) samples.
-
- //#define PTC_SAMPLE_START 30 // (°C)
- //#define PTC_SAMPLE_RES 5 // (°C)
- //#define PTC_SAMPLE_COUNT 10
-
- // Bed temperature calibration builds a similar table.
-
- //#define BTC_SAMPLE_START 60 // (°C)
- //#define BTC_SAMPLE_RES 5 // (°C)
- //#define BTC_SAMPLE_COUNT 10
-
- // The temperature the probe should be at while taking measurements during bed temperature
- // calibration.
- //#define BTC_PROBE_TEMP 30 // (°C)
+ // The temperature the probe should be at while taking measurements during
+ // bed temperature calibration.
+ #define PTC_PROBE_TEMP 30 // (°C)
// Height above Z=0.0 to raise the nozzle. Lowering this can help the probe to heat faster.
- // Note: the Z=0.0 offset is determined by the probe offset which can be set using M851.
- //#define PTC_PROBE_HEATING_OFFSET 0.5
-
- // Height to raise the Z-probe between heating and taking the next measurement. Some probes
- // may fail to untrigger if they have been triggered for a long time, which can be solved by
- // increasing the height the probe is raised to.
- //#define PTC_PROBE_RAISE 15
-
- // If the probe is outside of the defined range, use linear extrapolation using the closest
- // point and the PTC_LINEAR_EXTRAPOLATION'th next point. E.g. if set to 4 it will use data[0]
- // and data[4] to perform linear extrapolation for values below PTC_SAMPLE_START.
- //#define PTC_LINEAR_EXTRAPOLATION 4
+ // Note: The Z=0.0 offset is determined by the probe Z offset (e.g., as set with M851 Z).
+ #define PTC_PROBE_HEATING_OFFSET 0.5
#endif
-#endif
+#endif // PTC_PROBE || PTC_BED || PTC_HOTEND
// @section extras
@@ -2206,9 +2223,12 @@
*
* Override the default value based on the driver type set in Configuration.h.
*/
-//#define MINIMUM_STEPPER_POST_DIR_DELAY 650
-//#define MINIMUM_STEPPER_PRE_DIR_DELAY 650
-
+#if ENABLED(MachineEnder7)
+ #define MINIMUM_STEPPER_POST_DIR_DELAY 10
+ #define MINIMUM_STEPPER_PRE_DIR_DELAY 10
+ #define MINIMUM_STEPPER_PULSE 0
+ #define MAXIMUM_STEPPER_RATE 5000000
+#endif
/**
* Minimum stepper driver pulse width (in µs)
* 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers
@@ -2249,8 +2269,8 @@
// The number of linear moves that can be in the planner at once.
// The value of BLOCK_BUFFER_SIZE must be a power of 2 (e.g. 8, 16, 32)
-#if ANY(SKR13, SKR14, SKR14Turbo, SKRPRO11, SKRMiniE3V2, MachineEnder3V2, Creality422, Creality427) || DISABLED(EXTENSIBLE_UI)
- #define BLOCK_BUFFER_SIZE 16
+#if ENABLED(MachineLargeROM) || DISABLED(EXTENSIBLE_UI)
+ #define BLOCK_BUFFER_SIZE 32
#else
#define BLOCK_BUFFER_SIZE 8
#endif
@@ -2259,10 +2279,8 @@
// The ASCII buffer for serial input
#define MAX_CMD_SIZE 96
-#if ANY(MachineCR10Orig, SKRMiniE3V2, MachineEnder3V2, Creality422, Creality427) //melzi has more ram than a 2560
+#if ANY(MachineCR10Orig, SKRMiniE3V2, MachineLargeROM) //melzi has more ram than a 2560
#define BUFSIZE 16
-#elif ANY(SKR13, SKR14, SKR14Turbo, SKRPRO11)
- #define BUFSIZE 8
#else
#define BUFSIZE 4
#endif
@@ -2386,7 +2404,7 @@
*
* Note that M207 / M208 / M209 settings are saved to EEPROM.
*/
- #if ANY(SKR13, SKR14, SKR14Turbo, SKRPRO11, MachineEnder3V2, Creality422, Creality427, MachineCR6, MachineCR6Max, MachineEnder6)
+ #if ENABLED(MachineLargeROM)
#define FWRETRACT
#endif
#if ENABLED(FWRETRACT)
@@ -2429,6 +2447,7 @@
*/
//#define EVENT_GCODE_TOOLCHANGE_T0 "G28 A\nG1 A0" // Extra G-code to run while executing tool-change command T0
//#define EVENT_GCODE_TOOLCHANGE_T1 "G1 A10" // Extra G-code to run while executing tool-change command T1
+ //#define EVENT_GCODE_TOOLCHANGE_ALWAYS_RUN // Always execute above G-code sequences. Use with caution!
/**
* Tool Sensors detect when tools have been picked up or dropped.
@@ -2558,8 +2577,8 @@
#define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety.
#define FILAMENT_CHANGE_ALERT_BEEPS 2 // Number of alert beeps to play when a response is needed.
#define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change.
- #define FILAMENT_CHANGE_RESUME_ON_INSERT // Automatically continue / load filament when runout sensor is made again
- #define FILAMENT_CHANGE_FAST_RESUME // Reduce number of waits by not prompting again post timeout before continuing
+ #define FILAMENT_CHANGE_RESUME_ON_INSERT // Automatically continue / load filament when runout sensor is made again
+ #define PAUSE_REHEAT_FAST_RESUME // Reduce number of waits by not prompting again post timeout before continuing
#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change.
//#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change
@@ -4006,11 +4025,12 @@
*/
#define HOST_ACTION_COMMANDS
#if ENABLED(HOST_ACTION_COMMANDS)
+ //#define HOST_PAUSE_M76
#if DISABLED(MachineCR10Orig) || ENABLED(MelziHostOnly)
- //#define HOST_PAUSE_M76
#define HOST_PROMPT_SUPPORT
- #define HOST_START_MENU_ITEM // Add a menu item that tells the host to start
#endif
+ #define HOST_START_MENU_ITEM // Add a menu item that tells the host to start
+ //#define HOST_SHUTDOWN_MENU_ITEM // Add a menu item that tells the host to shut down
#endif
/**
@@ -4352,16 +4372,15 @@
// M100 Free Memory Watcher to debug memory usage
//
//#define M100_FREE_MEMORY_WATCHER
+#if ENABLED(MachineLargeROM)
+ //
+ // M42 - Set pin states
+ //
+ #define DIRECT_PIN_CONTROL
-//
-// M42 - Set pin states
-//
-//#define DIRECT_PIN_CONTROL
-
-//
-// M43 - display pin status, toggle pins, watch pins, watch endstops & toggle LED, test servo probe
-//
-#if ANY(SKR13, SKR14, SKR14Turbo, SKRPRO11, MachineEnder3V2, Creality422, Creality427, MachineCR6, MachineCR6Max, MachineEnder6)
+ //
+ // M43 - display pin status, toggle pins, watch pins, watch endstops & toggle LED, test servo probe
+ //
#define PINS_DEBUGGING
#endif
@@ -4388,3 +4407,6 @@
*/
//#define SOFT_RESET_VIA_SERIAL // 'KILL' and '^X' commands will soft-reset the controller
//#define SOFT_RESET_ON_KILL // Use a digital button to soft-reset the controller after KILL
+
+// Report uncleaned reset reason from register r2 instead of MCUSR. Supported by Optiboot on AVR.
+//#define OPTIBOOT_RESET_REASON
diff --git a/Marlin/Version.h b/Marlin/Version.h
index 2f9d5f930c..782c39afd7 100644
--- a/Marlin/Version.h
+++ b/Marlin/Version.h
@@ -28,7 +28,7 @@
/**
* Marlin release version identifier
*/
-#define SHORT_BUILD_VERSION "2.0.9_DW7.4.2"
+#define SHORT_BUILD_VERSION "2.0.9_DW7.4.4"
/**
* Verbose version identifier which should contain a reference to the location
@@ -51,6 +51,10 @@
#define VerChar1 "E5"
#elif(ENABLED(MachineEnder6))
#define VerChar1 "E6"
+#elif(ENABLED(MachineEnder7))
+ #define VerChar1 "E7"
+#elif(ENABLED(MachineSermoonD1))
+ #define VerChar1 "D1"
#elif(ENABLED(MachineEnder5Plus))
#define VerChar1 "E5P"
#elif(ENABLED(MachineCR20))
@@ -71,6 +75,8 @@
#define VerChar1 "5"
#elif ENABLED(MachineCR2020)
#define VerChar1 "20"
+#elif(ENABLED(MachineCR30))
+ #define VerChar1 "CR30"
#endif
#if(ENABLED(HotendStock))
@@ -119,7 +125,7 @@
* here we define this default string as the date where the latest release
* version was tagged.
*/
-#define STRING_DISTRIBUTION_DATE "2021-09-14"
+#define STRING_DISTRIBUTION_DATE "2021-11-12"
/**
* Defines a generic printer name to be output to the LCD after booting Marlin.
@@ -140,6 +146,8 @@
#define CUSTOM_MACHINE_NAME "E3Max"
#elif(ENABLED(MachineEnder6))
#define CUSTOM_MACHINE_NAME "Ender6"
+#elif(ENABLED(MachineEnder7))
+ #define CUSTOM_MACHINE_NAME "Ender7"
#elif(ENABLED(MachineEnder3V2))
#define CUSTOM_MACHINE_NAME "Ender3V2"
#elif(ENABLED(MachineEnder4))
@@ -172,6 +180,10 @@
#define CUSTOM_MACHINE_NAME "CR10500"
#elif ENABLED(MachineCR2020)
#define CUSTOM_MACHINE_NAME "CR2020"
+#elif ENABLED(MachineSermoonD1)
+ #define CUSTOM_MACHINE_NAME "SermoonD1"
+#elif ENABLED(MachineCR30)
+ #define CUSTOM_MACHINE_NAME "CR30 Printmill"
#endif
/**
diff --git a/Marlin/src/HAL/AVR/HAL.cpp b/Marlin/src/HAL/AVR/HAL.cpp
index 708583b262..d7bf2a6f6f 100644
--- a/Marlin/src/HAL/AVR/HAL.cpp
+++ b/Marlin/src/HAL/AVR/HAL.cpp
@@ -35,12 +35,31 @@
// Public Variables
// ------------------------
-//uint8_t MCUSR;
+// Don't initialize/override variable (which would happen in .init4)
+uint8_t reset_reason __attribute__((section(".noinit")));
// ------------------------
// Public functions
// ------------------------
+__attribute__((naked)) // Don't output function pro- and epilogue
+__attribute__((used)) // Output the function, even if "not used"
+__attribute__((section(".init3"))) // Put in an early user definable section
+void HAL_save_reset_reason() {
+ #if ENABLED(OPTIBOOT_RESET_REASON)
+ __asm__ __volatile__(
+ A("STS %0, r2")
+ : "=m"(reset_reason)
+ );
+ #else
+ reset_reason = MCUSR;
+ #endif
+
+ // Clear within 16ms since WDRF bit enables a 16ms watchdog timer -> Boot loop
+ MCUSR = 0;
+ wdt_disable();
+}
+
void HAL_init() {
// Init Servo Pins
#define INIT_SERVO(N) OUT_WRITE(SERVO##N##_PIN, LOW)
diff --git a/Marlin/src/HAL/AVR/HAL.h b/Marlin/src/HAL/AVR/HAL.h
index 065f8fd15a..de07632b41 100644
--- a/Marlin/src/HAL/AVR/HAL.h
+++ b/Marlin/src/HAL/AVR/HAL.h
@@ -91,7 +91,7 @@ typedef int8_t pin_t;
// Public Variables
// ------------------------
-//extern uint8_t MCUSR;
+extern uint8_t reset_reason;
// Serial ports
#ifdef USBCON
@@ -152,21 +152,19 @@ void HAL_init();
//void _delay_ms(const int delay);
-inline void HAL_clear_reset_source() { MCUSR = 0; }
-inline uint8_t HAL_get_reset_source() { return MCUSR; }
+inline void HAL_clear_reset_source() { }
+inline uint8_t HAL_get_reset_source() { return reset_reason; }
void HAL_reboot();
+#pragma GCC diagnostic push
#if GCC_VERSION <= 50000
- #pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-function"
#endif
extern "C" int freeMemory();
-#if GCC_VERSION <= 50000
- #pragma GCC diagnostic pop
-#endif
+#pragma GCC diagnostic pop
// ADC
#ifdef DIDR2
@@ -223,7 +221,7 @@ void set_pwm_frequency(const pin_t pin, int f_desired);
/**
* set_pwm_duty
- * Sets the PWM duty cycle of the provided pin to the provided value
+ * Set the PWM duty cycle of the provided pin to the provided value
* Optionally allows inverting the duty cycle [default = false]
* Optionally allows changing the maximum size of the provided value to enable finer PWM duty control [default = 255]
*/
diff --git a/Marlin/src/HAL/AVR/HAL_SPI.cpp b/Marlin/src/HAL/AVR/HAL_SPI.cpp
index 1a1b98b3dd..8784bb07b3 100644
--- a/Marlin/src/HAL/AVR/HAL_SPI.cpp
+++ b/Marlin/src/HAL/AVR/HAL_SPI.cpp
@@ -34,7 +34,9 @@
#include "../../inc/MarlinConfig.h"
void spiBegin() {
- OUT_WRITE(SD_SS_PIN, HIGH);
+ #if PIN_EXISTS(SD_SS)
+ OUT_WRITE(SD_SS_PIN, HIGH);
+ #endif
SET_OUTPUT(SD_SCK_PIN);
SET_INPUT(SD_MISO_PIN);
SET_OUTPUT(SD_MOSI_PIN);
@@ -74,7 +76,8 @@ void spiBegin() {
#elif defined(PRR0)
PRR0
#endif
- , PRSPI);
+ , PRSPI
+ );
SPCR = _BV(SPE) | _BV(MSTR) | (spiRate >> 1);
SPSR = spiRate & 1 || spiRate == 6 ? 0 : _BV(SPI2X);
diff --git a/Marlin/src/HAL/AVR/MarlinSPI.h b/Marlin/src/HAL/AVR/MarlinSPI.h
new file mode 100644
index 0000000000..0c447ba4cb
--- /dev/null
+++ b/Marlin/src/HAL/AVR/MarlinSPI.h
@@ -0,0 +1,26 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+#include
+
+using MarlinSPI = SPIClass;
diff --git a/Marlin/src/HAL/AVR/fast_pwm.cpp b/Marlin/src/HAL/AVR/fast_pwm.cpp
index 238c1124ad..2556fa0441 100644
--- a/Marlin/src/HAL/AVR/fast_pwm.cpp
+++ b/Marlin/src/HAL/AVR/fast_pwm.cpp
@@ -22,11 +22,10 @@
#ifdef __AVR__
#include "../../inc/MarlinConfigPre.h"
+#include "HAL.h"
#if NEEDS_HARDWARE_PWM // Specific meta-flag for features that mandate PWM
-#include "HAL.h"
-
struct Timer {
volatile uint8_t* TCCRnQ[3]; // max 3 TCCR registers per timer
volatile uint16_t* OCRnQ[3]; // max 3 OCR registers per timer
@@ -153,7 +152,7 @@ Timer get_pwm_timer(const pin_t pin) {
void set_pwm_frequency(const pin_t pin, int f_desired) {
Timer timer = get_pwm_timer(pin);
- if (timer.n == 0) return; // Don't proceed if protected timer or not recognised
+ if (timer.n == 0) return; // Don't proceed if protected timer or not recognized
uint16_t size;
if (timer.n == 2) size = 255; else size = 65535;
@@ -243,40 +242,39 @@ void set_pwm_frequency(const pin_t pin, int f_desired) {
_SET_ICRn(timer.ICRn, res); // Set ICRn value (TOP) = res
}
+#endif // NEEDS_HARDWARE_PWM
+
void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255*/, const bool invert/*=false*/) {
- // If v is 0 or v_size (max), digitalWrite to LOW or HIGH.
- // Note that digitalWrite also disables pwm output for us (sets COM bit to 0)
- if (v == 0)
- digitalWrite(pin, invert);
- else if (v == v_size)
- digitalWrite(pin, !invert);
- else {
- Timer timer = get_pwm_timer(pin);
- if (timer.n == 0) return; // Don't proceed if protected timer or not recognised
- // Set compare output mode to CLEAR -> SET or SET -> CLEAR (if inverted)
- _SET_COMnQ(timer.TCCRnQ, (timer.q
- #ifdef TCCR2
- + (timer.q == 2) // COM20 is on bit 4 of TCCR2, thus requires q + 1 in the macro
- #endif
- ), COM_CLEAR_SET + invert
- );
+ #if NEEDS_HARDWARE_PWM
- uint16_t top;
- if (timer.n == 2) { // if TIMER2
- top = (
- #if ENABLED(USE_OCR2A_AS_TOP)
- *timer.OCRnQ[0] // top = OCR2A
- #else
- 255 // top = 0xFF (max)
- #endif
+ // If v is 0 or v_size (max), digitalWrite to LOW or HIGH.
+ // Note that digitalWrite also disables pwm output for us (sets COM bit to 0)
+ if (v == 0)
+ digitalWrite(pin, invert);
+ else if (v == v_size)
+ digitalWrite(pin, !invert);
+ else {
+ Timer timer = get_pwm_timer(pin);
+ if (timer.n == 0) return; // Don't proceed if protected timer or not recognized
+ // Set compare output mode to CLEAR -> SET or SET -> CLEAR (if inverted)
+ _SET_COMnQ(timer.TCCRnQ, (timer.q
+ #ifdef TCCR2
+ + (timer.q == 2) // COM20 is on bit 4 of TCCR2, thus requires q + 1 in the macro
+ #endif
+ ), COM_CLEAR_SET + invert
);
- }
- else
- top = *timer.ICRn; // top = ICRn
- _SET_OCRnQ(timer.OCRnQ, timer.q, v * float(top) / float(v_size)); // Scale 8/16-bit v to top value
- }
+ uint16_t top = (timer.n == 2) ? TERN(USE_OCR2A_AS_TOP, *timer.OCRnQ[0], 255) : *timer.ICRn;
+ _SET_OCRnQ(timer.OCRnQ, timer.q, (v * top + v_size / 2) / v_size); // Scale 8/16-bit v to top value
+ }
+
+ #else
+
+ analogWrite(pin, v);
+ UNUSED(v_size);
+ UNUSED(invert);
+
+ #endif
}
-#endif // NEEDS_HARDWARE_PWM
#endif // __AVR__
diff --git a/Marlin/src/HAL/AVR/pinsDebug.h b/Marlin/src/HAL/AVR/pinsDebug.h
index 5fc48a1edc..fcbb7af3e1 100644
--- a/Marlin/src/HAL/AVR/pinsDebug.h
+++ b/Marlin/src/HAL/AVR/pinsDebug.h
@@ -2,6 +2,9 @@
* Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
diff --git a/Marlin/src/HAL/AVR/pinsDebug_Teensyduino.h b/Marlin/src/HAL/AVR/pinsDebug_Teensyduino.h
index 051972a861..582ae79ba7 100644
--- a/Marlin/src/HAL/AVR/pinsDebug_Teensyduino.h
+++ b/Marlin/src/HAL/AVR/pinsDebug_Teensyduino.h
@@ -2,6 +2,9 @@
* Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
diff --git a/Marlin/src/HAL/AVR/pinsDebug_plus_70.h b/Marlin/src/HAL/AVR/pinsDebug_plus_70.h
index db3fdf1f76..d9aa44c3cb 100644
--- a/Marlin/src/HAL/AVR/pinsDebug_plus_70.h
+++ b/Marlin/src/HAL/AVR/pinsDebug_plus_70.h
@@ -2,6 +2,9 @@
* Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
diff --git a/Marlin/src/HAL/AVR/u8g_com_HAL_AVR_sw_spi.cpp b/Marlin/src/HAL/AVR/u8g_com_HAL_AVR_sw_spi.cpp
index 9d928e7af3..45b54379db 100644
--- a/Marlin/src/HAL/AVR/u8g_com_HAL_AVR_sw_spi.cpp
+++ b/Marlin/src/HAL/AVR/u8g_com_HAL_AVR_sw_spi.cpp
@@ -64,8 +64,8 @@
#include
-uint8_t u8g_bitData, u8g_bitNotData, u8g_bitClock, u8g_bitNotClock;
-volatile uint8_t *u8g_outData, *u8g_outClock;
+static uint8_t u8g_bitData, u8g_bitNotData, u8g_bitClock, u8g_bitNotClock;
+static volatile uint8_t *u8g_outData, *u8g_outClock;
static void u8g_com_arduino_init_shift_out(uint8_t dataPin, uint8_t clockPin) {
u8g_outData = portOutputRegister(digitalPinToPort(dataPin));
diff --git a/Marlin/src/HAL/DUE/HAL.h b/Marlin/src/HAL/DUE/HAL.h
index 92e26bcf43..96ab5d9808 100644
--- a/Marlin/src/HAL/DUE/HAL.h
+++ b/Marlin/src/HAL/DUE/HAL.h
@@ -144,6 +144,11 @@ inline void HAL_adc_init() {}//todo
void HAL_adc_start_conversion(const uint8_t ch);
uint16_t HAL_adc_get_result();
+//
+// PWM
+//
+inline void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t=255, const bool=false) { analogWrite(pin, v); }
+
//
// Pin Map
//
@@ -168,16 +173,14 @@ void HAL_init();
//
void _delay_ms(const int delay);
+#pragma GCC diagnostic push
#if GCC_VERSION <= 50000
- #pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-function"
#endif
int freeMemory();
-#if GCC_VERSION <= 50000
- #pragma GCC diagnostic pop
-#endif
+#pragma GCC diagnostic pop
#ifdef __cplusplus
extern "C" {
diff --git a/Marlin/src/HAL/DUE/MarlinSPI.h b/Marlin/src/HAL/DUE/MarlinSPI.h
new file mode 100644
index 0000000000..0c447ba4cb
--- /dev/null
+++ b/Marlin/src/HAL/DUE/MarlinSPI.h
@@ -0,0 +1,26 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+#include
+
+using MarlinSPI = SPIClass;
diff --git a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp
index fcfcef88be..68f6a5c1a7 100644
--- a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp
+++ b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp
@@ -20,7 +20,6 @@
*
*/
-
/**
* Based on u8g_com_msp430_hw_spi.c
*
diff --git a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_st7920_sw_spi.cpp b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_st7920_sw_spi.cpp
index 65bfd4f4e2..8268cf307e 100644
--- a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_st7920_sw_spi.cpp
+++ b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_st7920_sw_spi.cpp
@@ -57,7 +57,7 @@
#include "../../../inc/MarlinConfigPre.h"
-#if ENABLED(U8GLIB_ST7920)
+#if IS_U8GLIB_ST7920
#include "../../../inc/MarlinConfig.h"
#include "../../shared/Delay.h"
@@ -182,5 +182,5 @@ uint8_t u8g_com_HAL_DUE_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_va
}
#endif // LIGHTWEIGHT_UI
-#endif // U8GLIB_ST7920
+#endif // IS_U8GLIB_ST7920
#endif // ARDUINO_ARCH_SAM
diff --git a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp
index 2b13c182d0..68e3e74a45 100644
--- a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp
+++ b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp
@@ -57,7 +57,7 @@
#include "../../../inc/MarlinConfigPre.h"
-#if HAS_MARLINUI_U8GLIB && DISABLED(U8GLIB_ST7920)
+#if HAS_MARLINUI_U8GLIB && !IS_U8GLIB_ST7920
#include "u8g_com_HAL_DUE_sw_spi_shared.h"
@@ -141,5 +141,5 @@ uint8_t u8g_com_HAL_DUE_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void
return 1;
}
-#endif // HAS_MARLINUI_U8GLIB && !U8GLIB_ST7920
+#endif // HAS_MARLINUI_U8GLIB && !IS_U8GLIB_ST7920
#endif // ARDUINO_ARCH_SAM
diff --git a/Marlin/src/HAL/DUE/pinsDebug.h b/Marlin/src/HAL/DUE/pinsDebug.h
index 225ba95ce9..f01c53c8ce 100644
--- a/Marlin/src/HAL/DUE/pinsDebug.h
+++ b/Marlin/src/HAL/DUE/pinsDebug.h
@@ -2,6 +2,9 @@
* Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
diff --git a/Marlin/src/HAL/DUE/upload_extra_script.py b/Marlin/src/HAL/DUE/upload_extra_script.py
index d52a0a3642..4f7a494512 100644
--- a/Marlin/src/HAL/DUE/upload_extra_script.py
+++ b/Marlin/src/HAL/DUE/upload_extra_script.py
@@ -4,15 +4,16 @@
# Windows: bossac.exe
# Other: leave unchanged
#
+import pioutil
+if pioutil.is_pio_build():
+ import platform
+ current_OS = platform.system()
-import platform
-current_OS = platform.system()
+ if current_OS == 'Windows':
-if current_OS == 'Windows':
+ Import("env")
- Import("env")
-
- # Use bossac.exe on Windows
- env.Replace(
- UPLOADCMD="bossac --info --unlock --write --verify --reset --erase -U false --boot $SOURCE"
- )
+ # Use bossac.exe on Windows
+ env.Replace(
+ UPLOADCMD="bossac --info --unlock --write --verify --reset --erase -U false --boot $SOURCE"
+ )
diff --git a/Marlin/src/HAL/ESP32/HAL.cpp b/Marlin/src/HAL/ESP32/HAL.cpp
index 7818dbdd87..6a66d519b3 100644
--- a/Marlin/src/HAL/ESP32/HAL.cpp
+++ b/Marlin/src/HAL/ESP32/HAL.cpp
@@ -28,6 +28,10 @@
#include
#include
+#if ENABLED(USE_ESP32_TASK_WDT)
+ #include
+#endif
+
#if ENABLED(WIFISUPPORT)
#include
#include "wifi.h"
@@ -90,8 +94,24 @@ volatile int numPWMUsed = 0,
#endif
-void HAL_init_board() {
+#if ENABLED(USE_ESP32_EXIO)
+ HardwareSerial YSerial2(2);
+ void Write_EXIO(uint8_t IO, uint8_t v) {
+ if (ISRS_ENABLED()) {
+ DISABLE_ISRS();
+ YSerial2.write(0x80 | (((char)v) << 5) | (IO - 100));
+ ENABLE_ISRS();
+ }
+ else
+ YSerial2.write(0x80 | (((char)v) << 5) | (IO - 100));
+ }
+#endif
+
+void HAL_init_board() {
+ #if ENABLED(USE_ESP32_TASK_WDT)
+ esp_task_wdt_init(10, true);
+ #endif
#if ENABLED(ESP3D_WIFISUPPORT)
esp3dlib.init();
#elif ENABLED(WIFISUPPORT)
@@ -127,7 +147,11 @@ void HAL_init_board() {
// Initialize the i2s peripheral only if the I2S stepper stream is enabled.
// The following initialization is performed after Serial1 and Serial2 are defined as
// their native pins might conflict with the i2s stream even when they are remapped.
- TERN_(I2S_STEPPER_STREAM, i2s_init());
+ #if ENABLED(USE_ESP32_EXIO)
+ YSerial2.begin(460800 * 3, SERIAL_8N1, 16, 17);
+ #elif ENABLED(I2S_STEPPER_STREAM)
+ i2s_init();
+ #endif
}
void HAL_idletask() {
diff --git a/Marlin/src/HAL/ESP32/HAL.h b/Marlin/src/HAL/ESP32/HAL.h
index 0f92052030..8473e3c4e4 100644
--- a/Marlin/src/HAL/ESP32/HAL.h
+++ b/Marlin/src/HAL/ESP32/HAL.h
@@ -105,16 +105,14 @@ void HAL_reboot();
void _delay_ms(int delay);
+#pragma GCC diagnostic push
#if GCC_VERSION <= 50000
- #pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-function"
#endif
int freeMemory();
-#if GCC_VERSION <= 50000
- #pragma GCC diagnostic pop
-#endif
+#pragma GCC diagnostic pop
void analogWrite(pin_t pin, int value);
@@ -131,6 +129,10 @@ void HAL_adc_init();
void HAL_adc_start_conversion(const uint8_t adc_pin);
+// PWM
+inline void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t=255, const bool=false) { analogWrite(pin, v); }
+
+// Pin Map
#define GET_PIN_MAP_PIN(index) index
#define GET_PIN_MAP_INDEX(pin) pin
#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval)
@@ -142,6 +144,10 @@ void HAL_idletask();
inline void HAL_init() {}
void HAL_init_board();
+#if ENABLED(USE_ESP32_EXIO)
+ void Write_EXIO(uint8_t IO, uint8_t v);
+#endif
+
//
// Delay in cycles (used by DELAY_NS / DELAY_US)
//
diff --git a/Marlin/src/HAL/ESP32/HAL_SPI.cpp b/Marlin/src/HAL/ESP32/HAL_SPI.cpp
index 8743ac5be2..868ab1b671 100644
--- a/Marlin/src/HAL/ESP32/HAL_SPI.cpp
+++ b/Marlin/src/HAL/ESP32/HAL_SPI.cpp
@@ -53,11 +53,9 @@ static SPISettings spiConfig;
// ------------------------
void spiBegin() {
- #if !PIN_EXISTS(SD_SS)
- #error "SD_SS_PIN not defined!"
+ #if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_SS)
+ OUT_WRITE(SD_SS_PIN, HIGH);
#endif
-
- OUT_WRITE(SD_SS_PIN, HIGH);
}
void spiInit(uint8_t spiRate) {
diff --git a/Marlin/src/HAL/ESP32/MarlinSPI.h b/Marlin/src/HAL/ESP32/MarlinSPI.h
new file mode 100644
index 0000000000..0c447ba4cb
--- /dev/null
+++ b/Marlin/src/HAL/ESP32/MarlinSPI.h
@@ -0,0 +1,26 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+#include
+
+using MarlinSPI = SPIClass;
diff --git a/Marlin/src/HAL/ESP32/esp32.csv b/Marlin/src/HAL/ESP32/esp32.csv
new file mode 100644
index 0000000000..8f6e101f02
--- /dev/null
+++ b/Marlin/src/HAL/ESP32/esp32.csv
@@ -0,0 +1,6 @@
+# Name, Type, SubType, Offset, Size, Flags
+nvs, data, nvs, 0x9000, 0x5000,
+otadata, data, ota, 0xe000, 0x2000,
+app0, app, ota_0, 0x10000, 0x180000,
+app1, app, ota_1, 0x190000, 0x180000,
+spiffs, data, spiffs, 0x310000, 0xF0000,
diff --git a/Marlin/src/HAL/ESP32/fastio.h b/Marlin/src/HAL/ESP32/fastio.h
index 8db89dca12..c8e3f7e343 100644
--- a/Marlin/src/HAL/ESP32/fastio.h
+++ b/Marlin/src/HAL/ESP32/fastio.h
@@ -40,13 +40,19 @@
// Set pin as input with pullup mode
#define _PULLUP(IO, v) pinMode(IO, v ? INPUT_PULLUP : INPUT)
-// Read a pin wrapper
-#define READ(IO) (IS_I2S_EXPANDER_PIN(IO) ? i2s_state(I2S_EXPANDER_PIN_INDEX(IO)) : digitalRead(IO))
+#if ENABLED(USE_ESP32_EXIO)
+ // Read a pin wrapper
+ #define READ(IO) digitalRead(IO)
+ // Write to a pin wrapper
+ #define WRITE(IO, v) (IO >= 100 ? Write_EXIO(IO, v) : digitalWrite(IO, v))
+#else
+ // Read a pin wrapper
+ #define READ(IO) (IS_I2S_EXPANDER_PIN(IO) ? i2s_state(I2S_EXPANDER_PIN_INDEX(IO)) : digitalRead(IO))
+ // Write to a pin wrapper
+ #define WRITE(IO, v) (IS_I2S_EXPANDER_PIN(IO) ? i2s_write(I2S_EXPANDER_PIN_INDEX(IO), v) : digitalWrite(IO, v))
+#endif
-// Write to a pin wrapper
-#define WRITE(IO, v) (IS_I2S_EXPANDER_PIN(IO) ? i2s_write(I2S_EXPANDER_PIN_INDEX(IO), v) : digitalWrite(IO, v))
-
-// Set pin as input wrapper
+// Set pin as input wrapper (0x80 | (v << 5) | (IO - 100))
#define SET_INPUT(IO) _SET_INPUT(IO)
// Set pin as input with pullup wrapper
diff --git a/Marlin/src/HAL/ESP32/i2s.cpp b/Marlin/src/HAL/ESP32/i2s.cpp
index c28c008793..3e77b65836 100644
--- a/Marlin/src/HAL/ESP32/i2s.cpp
+++ b/Marlin/src/HAL/ESP32/i2s.cpp
@@ -23,6 +23,8 @@
#include "../../inc/MarlinConfigPre.h"
+#if DISABLED(USE_ESP32_EXIO)
+
#include "i2s.h"
#include "../shared/Marduino.h"
@@ -62,12 +64,9 @@ uint32_t i2s_port_data = 0;
#define I2S_EXIT_CRITICAL() portEXIT_CRITICAL(&i2s_spinlock[i2s_num])
static inline void gpio_matrix_out_check(uint32_t gpio, uint32_t signal_idx, bool out_inv, bool oen_inv) {
- //if pin = -1, do not need to configure
- if (gpio != -1) {
- PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[gpio], PIN_FUNC_GPIO);
- gpio_set_direction((gpio_num_t)gpio, (gpio_mode_t)GPIO_MODE_DEF_OUTPUT);
- gpio_matrix_out(gpio, signal_idx, out_inv, oen_inv);
- }
+ PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[gpio], PIN_FUNC_GPIO);
+ gpio_set_direction((gpio_num_t)gpio, (gpio_mode_t)GPIO_MODE_DEF_OUTPUT);
+ gpio_matrix_out(gpio, signal_idx, out_inv, oen_inv);
}
static esp_err_t i2s_reset_fifo(i2s_port_t i2s_num) {
@@ -254,13 +253,7 @@ int i2s_init() {
I2S0.fifo_conf.dscr_en = 0;
- I2S0.conf_chan.tx_chan_mod = (
- #if ENABLED(I2S_STEPPER_SPLIT_STREAM)
- 4
- #else
- 0
- #endif
- );
+ I2S0.conf_chan.tx_chan_mod = TERN(I2S_STEPPER_SPLIT_STREAM, 4, 0);
I2S0.fifo_conf.tx_fifo_mod = 0;
I2S0.conf.tx_mono = 0;
@@ -311,9 +304,16 @@ int i2s_init() {
xTaskCreatePinnedToCore(stepperTask, "StepperTask", 10000, nullptr, 1, nullptr, CONFIG_ARDUINO_RUNNING_CORE); // run I2S stepper task on same core as rest of Marlin
// Route the i2s pins to the appropriate GPIO
- gpio_matrix_out_check(I2S_DATA, I2S0O_DATA_OUT23_IDX, 0, 0);
- gpio_matrix_out_check(I2S_BCK, I2S0O_BCK_OUT_IDX, 0, 0);
- gpio_matrix_out_check(I2S_WS, I2S0O_WS_OUT_IDX, 0, 0);
+ // If a pin is not defined, no need to configure
+ #if defined(I2S_DATA) && I2S_DATA >= 0
+ gpio_matrix_out_check(I2S_DATA, I2S0O_DATA_OUT23_IDX, 0, 0);
+ #endif
+ #if defined(I2S_BCK) && I2S_BCK >= 0
+ gpio_matrix_out_check(I2S_BCK, I2S0O_BCK_OUT_IDX, 0, 0);
+ #endif
+ #if defined(I2S_WS) && I2S_WS >= 0
+ gpio_matrix_out_check(I2S_WS, I2S0O_WS_OUT_IDX, 0, 0);
+ #endif
// Start the I2S peripheral
return i2s_start(I2S_NUM_0);
@@ -340,4 +340,5 @@ void i2s_push_sample() {
dma.current[dma.rw_pos++] = i2s_port_data;
}
+#endif // !USE_ESP32_EXIO
#endif // ARDUINO_ARCH_ESP32
diff --git a/Marlin/src/HAL/ESP32/spi_pins.h b/Marlin/src/HAL/ESP32/spi_pins.h
index cfe71eee4a..58881f0ea7 100644
--- a/Marlin/src/HAL/ESP32/spi_pins.h
+++ b/Marlin/src/HAL/ESP32/spi_pins.h
@@ -2,6 +2,9 @@
* Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
diff --git a/Marlin/src/HAL/ESP32/watchdog.h b/Marlin/src/HAL/ESP32/watchdog.h
index b6c169e347..43db813076 100644
--- a/Marlin/src/HAL/ESP32/watchdog.h
+++ b/Marlin/src/HAL/ESP32/watchdog.h
@@ -25,7 +25,7 @@
extern "C" {
#endif
- esp_err_t esp_task_wdt_reset();
+ esp_err_t esp_task_wdt_reset();
#ifdef __cplusplus
}
diff --git a/Marlin/src/HAL/LINUX/HAL.h b/Marlin/src/HAL/LINUX/HAL.h
index 79639f4993..d7d3a92b73 100644
--- a/Marlin/src/HAL/LINUX/HAL.h
+++ b/Marlin/src/HAL/LINUX/HAL.h
@@ -79,16 +79,14 @@ extern MSerialT usb_serial;
inline void HAL_init() {}
// Utility functions
+#pragma GCC diagnostic push
#if GCC_VERSION <= 50000
- #pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-function"
#endif
int freeMemory();
-#if GCC_VERSION <= 50000
- #pragma GCC diagnostic pop
-#endif
+#pragma GCC diagnostic pop
// ADC
#define HAL_ADC_VREF 5.0
@@ -103,6 +101,9 @@ void HAL_adc_enable_channel(const uint8_t ch);
void HAL_adc_start_conversion(const uint8_t ch);
uint16_t HAL_adc_get_result();
+// PWM
+inline void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t=255, const bool=false) { analogWrite(pin, v); }
+
// Reset source
inline void HAL_clear_reset_source(void) {}
inline uint8_t HAL_get_reset_source(void) { return RST_POWER_ON; }
diff --git a/Marlin/src/HAL/LINUX/MarlinSPI.h b/Marlin/src/HAL/LINUX/MarlinSPI.h
new file mode 100644
index 0000000000..0c447ba4cb
--- /dev/null
+++ b/Marlin/src/HAL/LINUX/MarlinSPI.h
@@ -0,0 +1,26 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+#include
+
+using MarlinSPI = SPIClass;
diff --git a/Marlin/src/HAL/LINUX/main.cpp b/Marlin/src/HAL/LINUX/main.cpp
index 31f6de98ee..f2af2ff33f 100644
--- a/Marlin/src/HAL/LINUX/main.cpp
+++ b/Marlin/src/HAL/LINUX/main.cpp
@@ -2,6 +2,9 @@
* Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
@@ -16,6 +19,7 @@
* along with this program. If not, see .
*
*/
+
#ifdef __PLAT_LINUX__
//#define GPIO_LOGGING // Full GPIO and Positional Logging
diff --git a/Marlin/src/HAL/LINUX/pinsDebug.h b/Marlin/src/HAL/LINUX/pinsDebug.h
index 9803c5d362..7bfd97d024 100644
--- a/Marlin/src/HAL/LINUX/pinsDebug.h
+++ b/Marlin/src/HAL/LINUX/pinsDebug.h
@@ -2,6 +2,9 @@
* Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
diff --git a/Marlin/src/HAL/LPC1768/HAL.h b/Marlin/src/HAL/LPC1768/HAL.h
index ca4e2decab..348ea6b21a 100644
--- a/Marlin/src/HAL/LPC1768/HAL.h
+++ b/Marlin/src/HAL/LPC1768/HAL.h
@@ -123,16 +123,14 @@ extern DefaultSerial1 USBSerial;
//
// Utility functions
//
+#pragma GCC diagnostic push
#if GCC_VERSION <= 50000
- #pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-function"
#endif
int freeMemory();
-#if GCC_VERSION <= 50000
- #pragma GCC diagnostic pop
-#endif
+#pragma GCC diagnostic pop
//
// ADC API
@@ -156,17 +154,17 @@ int freeMemory();
using FilteredADC = LPC176x::ADC;
extern uint32_t HAL_adc_reading;
-[[gnu::always_inline]] inline void HAL_start_adc(const pin_t pin) {
+[[gnu::always_inline]] inline void HAL_adc_start_conversion(const pin_t pin) {
HAL_adc_reading = FilteredADC::read(pin) >> (16 - HAL_ADC_RESOLUTION); // returns 16bit value, reduce to required bits
}
-[[gnu::always_inline]] inline uint16_t HAL_read_adc() {
+[[gnu::always_inline]] inline uint16_t HAL_adc_get_result() {
return HAL_adc_reading;
}
#define HAL_adc_init()
#define HAL_ANALOG_SELECT(pin) FilteredADC::enable_channel(pin)
-#define HAL_START_ADC(pin) HAL_start_adc(pin)
-#define HAL_READ_ADC() HAL_read_adc()
+#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin)
+#define HAL_READ_ADC() HAL_adc_get_result()
#define HAL_ADC_READY() (true)
// Test whether the pin is valid
diff --git a/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp b/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp
index 6570a599a4..1991d79719 100644
--- a/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp
+++ b/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp
@@ -90,15 +90,15 @@ bool PersistentStore::access_finish() {
// to see errors that are happening in read_data / write_data
static void debug_rw(const bool write, int &pos, const uint8_t *value, const size_t size, const FRESULT s, const size_t total=0) {
#if ENABLED(DEBUG_SD_EEPROM_EMULATION)
- PGM_P const rw_str = write ? PSTR("write") : PSTR("read");
+ FSTR_P const rw_str = write ? F("write") : F("read");
SERIAL_CHAR(' ');
- SERIAL_ECHOPGM_P(rw_str);
+ SERIAL_ECHOF(rw_str);
SERIAL_ECHOLNPGM("_data(", pos, ",", *value, ",", size, ", ...)");
if (total) {
SERIAL_ECHOPGM(" f_");
- SERIAL_ECHOPGM_P(rw_str);
+ SERIAL_ECHOF(rw_str);
SERIAL_ECHOPGM("()=", s, "\n size=", size, "\n bytes_");
- SERIAL_ECHOLNPGM_P(write ? PSTR("written=") : PSTR("read="), total);
+ SERIAL_ECHOLNF(write ? F("written=") : F("read="), total);
}
else
SERIAL_ECHOLNPGM(" f_lseek()=", s);
diff --git a/Marlin/src/HAL/LPC1768/fast_pwm.cpp b/Marlin/src/HAL/LPC1768/fast_pwm.cpp
index dd440b5e77..70fc0e333d 100644
--- a/Marlin/src/HAL/LPC1768/fast_pwm.cpp
+++ b/Marlin/src/HAL/LPC1768/fast_pwm.cpp
@@ -22,18 +22,18 @@
#ifdef TARGET_LPC1768
#include "../../inc/MarlinConfigPre.h"
-
-#if NEEDS_HARDWARE_PWM // Specific meta-flag for features that mandate PWM
-
#include
-void set_pwm_frequency(const pin_t pin, int f_desired) {
- LPC176x::pwm_set_frequency(pin, f_desired);
-}
-
void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255*/, const bool invert/*=false*/) {
LPC176x::pwm_write_ratio(pin, invert ? 1.0f - (float)v / v_size : (float)v / v_size);
}
-#endif // NEEDS_HARDWARE_PWM
+#if NEEDS_HARDWARE_PWM // Specific meta-flag for features that mandate PWM
+
+ void set_pwm_frequency(const pin_t pin, int f_desired) {
+ LPC176x::pwm_set_frequency(pin, f_desired);
+ }
+
+#endif
+
#endif // TARGET_LPC1768
diff --git a/Marlin/src/HAL/LPC1768/pinsDebug.h b/Marlin/src/HAL/LPC1768/pinsDebug.h
index 466bf170b4..a2f5c123a2 100644
--- a/Marlin/src/HAL/LPC1768/pinsDebug.h
+++ b/Marlin/src/HAL/LPC1768/pinsDebug.h
@@ -2,6 +2,9 @@
* Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
diff --git a/Marlin/src/HAL/LPC1768/tft/tft_spi.cpp b/Marlin/src/HAL/LPC1768/tft/tft_spi.cpp
index a2cb66ab5b..a9847b2d2f 100644
--- a/Marlin/src/HAL/LPC1768/tft/tft_spi.cpp
+++ b/Marlin/src/HAL/LPC1768/tft/tft_spi.cpp
@@ -26,39 +26,22 @@
#include "tft_spi.h"
-//TFT_SPI tft;
-
SPIClass TFT_SPI::SPIx(1);
-#define TFT_CS_H WRITE(TFT_CS_PIN, HIGH)
-#define TFT_CS_L WRITE(TFT_CS_PIN, LOW)
-
-#define TFT_DC_H WRITE(TFT_DC_PIN, HIGH)
-#define TFT_DC_L WRITE(TFT_DC_PIN, LOW)
-
-#define TFT_RST_H WRITE(TFT_RESET_PIN, HIGH)
-#define TFT_RST_L WRITE(TFT_RESET_PIN, LOW)
-
-#define TFT_BLK_H WRITE(TFT_BACKLIGHT_PIN, HIGH)
-#define TFT_BLK_L WRITE(TFT_BACKLIGHT_PIN, LOW)
-
void TFT_SPI::Init() {
#if PIN_EXISTS(TFT_RESET)
- SET_OUTPUT(TFT_RESET_PIN);
- TFT_RST_H;
+ OUT_WRITE(TFT_RESET_PIN, HIGH);
delay(100);
#endif
#if PIN_EXISTS(TFT_BACKLIGHT)
- SET_OUTPUT(TFT_BACKLIGHT_PIN);
- TFT_BLK_H;
+ OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH);
#endif
SET_OUTPUT(TFT_DC_PIN);
SET_OUTPUT(TFT_CS_PIN);
-
- TFT_DC_H;
- TFT_CS_H;
+ WRITE(TFT_DC_PIN, HIGH);
+ WRITE(TFT_CS_PIN, HIGH);
/**
* STM32F1 APB2 = 72MHz, APB1 = 36MHz, max SPI speed of this MCU if 18Mhz
@@ -97,7 +80,7 @@ void TFT_SPI::Init() {
void TFT_SPI::DataTransferBegin(uint16_t DataSize) {
SPIx.setDataSize(DataSize);
SPIx.begin();
- TFT_CS_L;
+ WRITE(TFT_CS_PIN, LOW);
}
uint32_t TFT_SPI::GetID() {
@@ -116,7 +99,7 @@ uint32_t TFT_SPI::ReadID(uint16_t Reg) {
SPIx.setDataSize(DATASIZE_8BIT);
SPIx.setClock(SPI_CLOCK_DIV64);
SPIx.begin();
- TFT_CS_L;
+ WRITE(TFT_CS_PIN, LOW);
WriteReg(Reg);
LOOP_L_N(i, 4) {
@@ -131,21 +114,15 @@ uint32_t TFT_SPI::ReadID(uint16_t Reg) {
return data >> 7;
}
-bool TFT_SPI::isBusy() {
- return false;
-}
+bool TFT_SPI::isBusy() { return false; }
-void TFT_SPI::Abort() {
- DataTransferEnd();
-}
+void TFT_SPI::Abort() { DataTransferEnd(); }
-void TFT_SPI::Transmit(uint16_t Data) {
- SPIx.transfer(Data);
-}
+void TFT_SPI::Transmit(uint16_t Data) { SPIx.transfer(Data); }
void TFT_SPI::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) {
- DataTransferBegin(DATASIZE_16BIT); //16
- TFT_DC_H;
+ DataTransferBegin(DATASIZE_16BIT);
+ WRITE(TFT_DC_PIN, HIGH);
SPIx.dmaSend(Data, Count, MemoryIncrease);
DataTransferEnd();
}
diff --git a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_sw_spi.cpp b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_sw_spi.cpp
index 039fa6769b..e159ebaa0c 100644
--- a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_sw_spi.cpp
+++ b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_sw_spi.cpp
@@ -57,7 +57,7 @@
#include "../../../inc/MarlinConfigPre.h"
-#if ENABLED(U8GLIB_ST7920)
+#if IS_U8GLIB_ST7920
#include
#include
@@ -143,5 +143,5 @@ uint8_t u8g_com_HAL_LPC1768_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t ar
return 1;
}
-#endif // U8GLIB_ST7920
+#endif // IS_U8GLIB_ST7920
#endif // TARGET_LPC1768
diff --git a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp
index 3308d03e79..f116a9b80a 100644
--- a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp
+++ b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp
@@ -57,7 +57,7 @@
#include "../../../inc/MarlinConfigPre.h"
-#if HAS_MARLINUI_U8GLIB && DISABLED(U8GLIB_ST7920)
+#if HAS_MARLINUI_U8GLIB && !IS_U8GLIB_ST7920
#include
#include "../../shared/HAL_SPI.h"
@@ -205,5 +205,5 @@ uint8_t u8g_com_HAL_LPC1768_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val,
return 1;
}
-#endif // HAS_MARLINUI_U8GLIB && !U8GLIB_ST7920
+#endif // HAS_MARLINUI_U8GLIB && !IS_U8GLIB_ST7920
#endif // TARGET_LPC1768
diff --git a/Marlin/src/HAL/LPC1768/upload_extra_script.py b/Marlin/src/HAL/LPC1768/upload_extra_script.py
index fb3aaef7cd..7975f151f7 100755
--- a/Marlin/src/HAL/LPC1768/upload_extra_script.py
+++ b/Marlin/src/HAL/LPC1768/upload_extra_script.py
@@ -1,123 +1,127 @@
#
-# sets output_port
+# upload_extra_script.py
+# set the output_port
# if target_filename is found then that drive is used
# else if target_drive is found then that drive is used
#
from __future__ import print_function
-target_filename = "FIRMWARE.CUR"
-target_drive = "REARM"
+import pioutil
+if pioutil.is_pio_build():
-import os,getpass,platform
+ target_filename = "FIRMWARE.CUR"
+ target_drive = "REARM"
-current_OS = platform.system()
-Import("env")
+ import os,getpass,platform
-def print_error(e):
- print('\nUnable to find destination disk (%s)\n' \
- 'Please select it in platformio.ini using the upload_port keyword ' \
- '(https://docs.platformio.org/en/latest/projectconf/section_env_upload.html) ' \
- 'or copy the firmware (.pio/build/%s/firmware.bin) manually to the appropriate disk\n' \
- %(e, env.get('PIOENV')))
+ current_OS = platform.system()
+ Import("env")
-def before_upload(source, target, env):
- try:
- #
- # Find a disk for upload
- #
- upload_disk = 'Disk not found'
- target_file_found = False
- target_drive_found = False
- if current_OS == 'Windows':
+ def print_error(e):
+ print('\nUnable to find destination disk (%s)\n' \
+ 'Please select it in platformio.ini using the upload_port keyword ' \
+ '(https://docs.platformio.org/en/latest/projectconf/section_env_upload.html) ' \
+ 'or copy the firmware (.pio/build/%s/firmware.bin) manually to the appropriate disk\n' \
+ %(e, env.get('PIOENV')))
+
+ def before_upload(source, target, env):
+ try:
#
- # platformio.ini will accept this for a Windows upload port designation: 'upload_port = L:'
- # Windows - doesn't care about the disk's name, only cares about the drive letter
- import subprocess,string
- from ctypes import windll
+ # Find a disk for upload
+ #
+ upload_disk = 'Disk not found'
+ target_file_found = False
+ target_drive_found = False
+ if current_OS == 'Windows':
+ #
+ # platformio.ini will accept this for a Windows upload port designation: 'upload_port = L:'
+ # Windows - doesn't care about the disk's name, only cares about the drive letter
+ import subprocess,string
+ from ctypes import windll
- # getting list of drives
- # https://stackoverflow.com/questions/827371/is-there-a-way-to-list-all-the-available-drive-letters-in-python
- drives = []
- bitmask = windll.kernel32.GetLogicalDrives()
- for letter in string.ascii_uppercase:
- if bitmask & 1:
- drives.append(letter)
- bitmask >>= 1
+ # getting list of drives
+ # https://stackoverflow.com/questions/827371/is-there-a-way-to-list-all-the-available-drive-letters-in-python
+ drives = []
+ bitmask = windll.kernel32.GetLogicalDrives()
+ for letter in string.ascii_uppercase:
+ if bitmask & 1:
+ drives.append(letter)
+ bitmask >>= 1
- for drive in drives:
- final_drive_name = drive + ':\\'
- # print ('disc check: {}'.format(final_drive_name))
- try:
- volume_info = str(subprocess.check_output('cmd /C dir ' + final_drive_name, stderr=subprocess.STDOUT))
- except Exception as e:
- print ('error:{}'.format(e))
- continue
- else:
- if target_drive in volume_info and not target_file_found: # set upload if not found target file yet
- target_drive_found = True
- upload_disk = final_drive_name
- if target_filename in volume_info:
- if not target_file_found:
+ for drive in drives:
+ final_drive_name = drive + ':\\'
+ # print ('disc check: {}'.format(final_drive_name))
+ try:
+ volume_info = str(subprocess.check_output('cmd /C dir ' + final_drive_name, stderr=subprocess.STDOUT))
+ except Exception as e:
+ print ('error:{}'.format(e))
+ continue
+ else:
+ if target_drive in volume_info and not target_file_found: # set upload if not found target file yet
+ target_drive_found = True
upload_disk = final_drive_name
- target_file_found = True
+ if target_filename in volume_info:
+ if not target_file_found:
+ upload_disk = final_drive_name
+ target_file_found = True
- elif current_OS == 'Linux':
- #
- # platformio.ini will accept this for a Linux upload port designation: 'upload_port = /media/media_name/drive'
- #
- drives = os.listdir(os.path.join(os.sep, 'media', getpass.getuser()))
- if target_drive in drives: # If target drive is found, use it.
- target_drive_found = True
- upload_disk = os.path.join(os.sep, 'media', getpass.getuser(), target_drive) + os.sep
- else:
+ elif current_OS == 'Linux':
+ #
+ # platformio.ini will accept this for a Linux upload port designation: 'upload_port = /media/media_name/drive'
+ #
+ drives = os.listdir(os.path.join(os.sep, 'media', getpass.getuser()))
+ if target_drive in drives: # If target drive is found, use it.
+ target_drive_found = True
+ upload_disk = os.path.join(os.sep, 'media', getpass.getuser(), target_drive) + os.sep
+ else:
+ for drive in drives:
+ try:
+ files = os.listdir(os.path.join(os.sep, 'media', getpass.getuser(), drive))
+ except:
+ continue
+ else:
+ if target_filename in files:
+ upload_disk = os.path.join(os.sep, 'media', getpass.getuser(), drive) + os.sep
+ target_file_found = True
+ break
+ #
+ # set upload_port to drive if found
+ #
+
+ if target_file_found or target_drive_found:
+ env.Replace(
+ UPLOAD_FLAGS="-P$UPLOAD_PORT"
+ )
+
+ elif current_OS == 'Darwin': # MAC
+ #
+ # platformio.ini will accept this for a OSX upload port designation: 'upload_port = /media/media_name/drive'
+ #
+ drives = os.listdir('/Volumes') # human readable names
+ if target_drive in drives and not target_file_found: # set upload if not found target file yet
+ target_drive_found = True
+ upload_disk = '/Volumes/' + target_drive + '/'
for drive in drives:
try:
- files = os.listdir(os.path.join(os.sep, 'media', getpass.getuser(), drive))
+ filenames = os.listdir('/Volumes/' + drive + '/') # will get an error if the drive is protected
except:
continue
else:
- if target_filename in files:
- upload_disk = os.path.join(os.sep, 'media', getpass.getuser(), drive) + os.sep
+ if target_filename in filenames:
+ if not target_file_found:
+ upload_disk = '/Volumes/' + drive + '/'
target_file_found = True
- break
- #
- # set upload_port to drive if found
- #
+ #
+ # Set upload_port to drive if found
+ #
if target_file_found or target_drive_found:
- env.Replace(
- UPLOAD_FLAGS="-P$UPLOAD_PORT"
- )
+ env.Replace(UPLOAD_PORT=upload_disk)
+ print('\nUpload disk: ', upload_disk, '\n')
+ else:
+ print_error('Autodetect Error')
- elif current_OS == 'Darwin': # MAC
- #
- # platformio.ini will accept this for a OSX upload port designation: 'upload_port = /media/media_name/drive'
- #
- drives = os.listdir('/Volumes') # human readable names
- if target_drive in drives and not target_file_found: # set upload if not found target file yet
- target_drive_found = True
- upload_disk = '/Volumes/' + target_drive + '/'
- for drive in drives:
- try:
- filenames = os.listdir('/Volumes/' + drive + '/') # will get an error if the drive is protected
- except:
- continue
- else:
- if target_filename in filenames:
- if not target_file_found:
- upload_disk = '/Volumes/' + drive + '/'
- target_file_found = True
+ except Exception as e:
+ print_error(str(e))
- #
- # Set upload_port to drive if found
- #
- if target_file_found or target_drive_found:
- env.Replace(UPLOAD_PORT=upload_disk)
- print('\nUpload disk: ', upload_disk, '\n')
- else:
- print_error('Autodetect Error')
-
- except Exception as e:
- print_error(str(e))
-
-env.AddPreAction("upload", before_upload)
+ env.AddPreAction("upload", before_upload)
diff --git a/Marlin/src/HAL/NATIVE_SIM/HAL.h b/Marlin/src/HAL/NATIVE_SIM/HAL.h
index 235c24808c..915339468b 100644
--- a/Marlin/src/HAL/NATIVE_SIM/HAL.h
+++ b/Marlin/src/HAL/NATIVE_SIM/HAL.h
@@ -133,6 +133,9 @@ void HAL_adc_enable_channel(const uint8_t ch);
void HAL_adc_start_conversion(const uint8_t ch);
uint16_t HAL_adc_get_result();
+// PWM
+inline void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t=255, const bool=false) { analogWrite(pin, v); }
+
// Reset source
inline void HAL_clear_reset_source(void) {}
inline uint8_t HAL_get_reset_source(void) { return RST_POWER_ON; }
diff --git a/Marlin/src/HAL/NATIVE_SIM/pinsDebug.h b/Marlin/src/HAL/NATIVE_SIM/pinsDebug.h
index 7e50492598..aa90eb39a3 100644
--- a/Marlin/src/HAL/NATIVE_SIM/pinsDebug.h
+++ b/Marlin/src/HAL/NATIVE_SIM/pinsDebug.h
@@ -20,7 +20,6 @@
/**
* Support routines for X86_64
*/
-
#pragma once
/**
diff --git a/Marlin/src/HAL/NATIVE_SIM/u8g/u8g_com_st7920_sw_spi.cpp b/Marlin/src/HAL/NATIVE_SIM/u8g/u8g_com_st7920_sw_spi.cpp
index c77c3d30f0..c384cdd751 100644
--- a/Marlin/src/HAL/NATIVE_SIM/u8g/u8g_com_st7920_sw_spi.cpp
+++ b/Marlin/src/HAL/NATIVE_SIM/u8g/u8g_com_st7920_sw_spi.cpp
@@ -57,7 +57,7 @@
#include "../../../inc/MarlinConfig.h"
-#if ENABLED(U8GLIB_ST7920)
+#if IS_U8GLIB_ST7920
#include
#include "../../shared/Delay.h"
@@ -167,5 +167,5 @@ uint8_t u8g_com_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void
}
#endif
-#endif // U8GLIB_ST7920
+#endif // IS_U8GLIB_ST7920
#endif // TARGET_LPC1768
diff --git a/Marlin/src/HAL/NATIVE_SIM/u8g/u8g_com_sw_spi.cpp b/Marlin/src/HAL/NATIVE_SIM/u8g/u8g_com_sw_spi.cpp
index 085954803c..7fd335d62e 100644
--- a/Marlin/src/HAL/NATIVE_SIM/u8g/u8g_com_sw_spi.cpp
+++ b/Marlin/src/HAL/NATIVE_SIM/u8g/u8g_com_sw_spi.cpp
@@ -57,7 +57,7 @@
#include "../../../inc/MarlinConfig.h"
-#if HAS_MARLINUI_U8GLIB && DISABLED(U8GLIB_ST7920)
+#if HAS_MARLINUI_U8GLIB && !IS_U8GLIB_ST7920
#undef SPI_SPEED
#define SPI_SPEED 2 // About 2 MHz
@@ -211,5 +211,5 @@ uint8_t u8g_com_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_pt
#elif !ANY(TFT_COLOR_UI, TFT_CLASSIC_UI, TFT_LVGL_UI, HAS_MARLINUI_HD44780) && HAS_MARLINUI_U8GLIB
#include
uint8_t u8g_com_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) {return 0;}
-#endif // HAS_MARLINUI_U8GLIB && !U8GLIB_ST7920
+#endif // HAS_MARLINUI_U8GLIB && !IS_U8GLIB_ST7920
#endif // __PLAT_NATIVE_SIM__
diff --git a/Marlin/src/HAL/SAMD51/HAL.h b/Marlin/src/HAL/SAMD51/HAL.h
index 491c3f82c4..c262752a8d 100644
--- a/Marlin/src/HAL/SAMD51/HAL.h
+++ b/Marlin/src/HAL/SAMD51/HAL.h
@@ -127,6 +127,11 @@ void HAL_adc_init();
void HAL_adc_start_conversion(const uint8_t adc_pin);
+//
+// PWM
+//
+inline void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t=255, const bool=false) { analogWrite(pin, v); }
+
//
// Pin Map
//
@@ -153,16 +158,14 @@ void HAL_idletask();
//
FORCE_INLINE void _delay_ms(const int delay_ms) { delay(delay_ms); }
+#pragma GCC diagnostic push
#if GCC_VERSION <= 50000
- #pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-function"
#endif
int freeMemory();
-#if GCC_VERSION <= 50000
- #pragma GCC diagnostic pop
-#endif
+#pragma GCC diagnostic pop
#ifdef __cplusplus
extern "C" {
diff --git a/Marlin/src/HAL/SAMD51/MarlinSPI.h b/Marlin/src/HAL/SAMD51/MarlinSPI.h
new file mode 100644
index 0000000000..0c447ba4cb
--- /dev/null
+++ b/Marlin/src/HAL/SAMD51/MarlinSPI.h
@@ -0,0 +1,26 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+#include
+
+using MarlinSPI = SPIClass;
diff --git a/Marlin/src/HAL/SAMD51/QSPIFlash.h b/Marlin/src/HAL/SAMD51/QSPIFlash.h
index db4abec91c..58822fe05f 100644
--- a/Marlin/src/HAL/SAMD51/QSPIFlash.h
+++ b/Marlin/src/HAL/SAMD51/QSPIFlash.h
@@ -25,7 +25,6 @@
*
* Derived from Adafruit_SPIFlash class with no SdFat references
*/
-
#pragma once
#include
diff --git a/Marlin/src/HAL/SAMD51/endstop_interrupts.h b/Marlin/src/HAL/SAMD51/endstop_interrupts.h
index c46b6e072f..61a06c0d4b 100644
--- a/Marlin/src/HAL/SAMD51/endstop_interrupts.h
+++ b/Marlin/src/HAL/SAMD51/endstop_interrupts.h
@@ -162,12 +162,14 @@ void setup_endstop_interrupts() {
#error "Z_MIN_PROBE_PIN has no EXTINT line available."
#endif
_ATTACH(Z_MIN_PROBE_PIN);
- #elif HAS_I_MAX
+ #endif
+ #if HAS_I_MAX
#if !AVAILABLE_EILINE(I_MAX_PIN)
#error "I_MAX_PIN has no EXTINT line available."
#endif
attachInterrupt(I_MAX_PIN, endstop_ISR, CHANGE);
- #elif HAS_I_MIN
+ #endif
+ #if HAS_I_MIN
#if !AVAILABLE_EILINE(I_MIN_PIN)
#error "I_MIN_PIN has no EXTINT line available."
#endif
@@ -178,7 +180,8 @@ void setup_endstop_interrupts() {
#error "J_MAX_PIN has no EXTINT line available."
#endif
attachInterrupt(J_MAX_PIN, endstop_ISR, CHANGE);
- #elif HAS_J_MIN
+ #endif
+ #if HAS_J_MIN
#if !AVAILABLE_EILINE(J_MIN_PIN)
#error "J_MIN_PIN has no EXTINT line available."
#endif
@@ -189,7 +192,8 @@ void setup_endstop_interrupts() {
#error "K_MAX_PIN has no EXTINT line available."
#endif
attachInterrupt(K_MAX_PIN, endstop_ISR, CHANGE);
- #elif HAS_K_MIN
+ #endif
+ #if HAS_K_MIN
#if !AVAILABLE_EILINE(K_MIN_PIN)
#error "K_MIN_PIN has no EXTINT line available."
#endif
diff --git a/Marlin/src/HAL/STM32/HAL.cpp b/Marlin/src/HAL/STM32/HAL.cpp
index a04a24c112..0920a72ec1 100644
--- a/Marlin/src/HAL/STM32/HAL.cpp
+++ b/Marlin/src/HAL/STM32/HAL.cpp
@@ -154,7 +154,7 @@ void HAL_adc_start_conversion(const uint8_t adc_pin) { HAL_adc_result = analogRe
uint16_t HAL_adc_get_result() { return HAL_adc_result; }
// Reset the system to initiate a firmware flash
-void flashFirmware(const int16_t) { HAL_reboot(); }
+WEAK void flashFirmware(const int16_t) { HAL_reboot(); }
// Maple Compatibility
volatile uint32_t systick_uptime_millis = 0;
diff --git a/Marlin/src/HAL/STM32/HAL.h b/Marlin/src/HAL/STM32/HAL.h
index cbf4da2848..caef985722 100644
--- a/Marlin/src/HAL/STM32/HAL.h
+++ b/Marlin/src/HAL/STM32/HAL.h
@@ -183,8 +183,13 @@ static inline int freeMemory() {
#define HAL_ANALOG_SELECT(pin) pinMode(pin, INPUT)
+#ifdef ADC_RESOLUTION
+ #define HAL_ADC_RESOLUTION ADC_RESOLUTION
+#else
+ #define HAL_ADC_RESOLUTION 12
+#endif
+
#define HAL_ADC_VREF 3.3
-#define HAL_ADC_RESOLUTION ADC_RESOLUTION // 12
#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin)
#define HAL_READ_ADC() HAL_adc_result
#define HAL_ADC_READY() true
diff --git a/Marlin/src/HAL/STM32/HAL_SPI.cpp b/Marlin/src/HAL/STM32/HAL_SPI.cpp
index 85a5238b54..8ee4761647 100644
--- a/Marlin/src/HAL/STM32/HAL_SPI.cpp
+++ b/Marlin/src/HAL/STM32/HAL_SPI.cpp
@@ -47,7 +47,9 @@ static SPISettings spiConfig;
#include "../shared/Delay.h"
void spiBegin(void) {
- OUT_WRITE(SD_SS_PIN, HIGH);
+ #if PIN_EXISTS(SD_SS)
+ OUT_WRITE(SD_SS_PIN, HIGH);
+ #endif
OUT_WRITE(SD_SCK_PIN, HIGH);
SET_INPUT(SD_MISO_PIN);
OUT_WRITE(SD_MOSI_PIN, HIGH);
diff --git a/Marlin/src/HAL/STM32/MarlinSPI.cpp b/Marlin/src/HAL/STM32/MarlinSPI.cpp
index e1be50820f..7078d210dc 100644
--- a/Marlin/src/HAL/STM32/MarlinSPI.cpp
+++ b/Marlin/src/HAL/STM32/MarlinSPI.cpp
@@ -19,6 +19,7 @@
* along with this program. If not, see .
*
*/
+
#include "../platforms.h"
#if defined(HAL_STM32) && !defined(STM32H7xx)
diff --git a/Marlin/src/HAL/STM32/MarlinSerial.cpp b/Marlin/src/HAL/STM32/MarlinSerial.cpp
index 3caedc72eb..37a8f40fd0 100644
--- a/Marlin/src/HAL/STM32/MarlinSerial.cpp
+++ b/Marlin/src/HAL/STM32/MarlinSerial.cpp
@@ -2,6 +2,9 @@
* Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
@@ -16,6 +19,7 @@
* along with this program. If not, see .
*
*/
+
#include "../platforms.h"
#ifdef HAL_STM32
diff --git a/Marlin/src/HAL/STM32/MarlinSerial.h b/Marlin/src/HAL/STM32/MarlinSerial.h
index ab5c4260af..bf861fb8a7 100644
--- a/Marlin/src/HAL/STM32/MarlinSerial.h
+++ b/Marlin/src/HAL/STM32/MarlinSerial.h
@@ -2,6 +2,9 @@
* Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
diff --git a/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp b/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp
index 914969f10c..54e1820c78 100644
--- a/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp
+++ b/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp
@@ -19,6 +19,7 @@
* along with this program. If not, see .
*
*/
+
#include "../platforms.h"
#ifdef HAL_STM32
diff --git a/Marlin/src/HAL/STM32/eeprom_bl24cxx.cpp b/Marlin/src/HAL/STM32/eeprom_bl24cxx.cpp
index 5bd4c18577..f30b3dedb2 100644
--- a/Marlin/src/HAL/STM32/eeprom_bl24cxx.cpp
+++ b/Marlin/src/HAL/STM32/eeprom_bl24cxx.cpp
@@ -19,6 +19,7 @@
* along with this program. If not, see .
*
*/
+
#include "../platforms.h"
#ifdef HAL_STM32
diff --git a/Marlin/src/HAL/STM32/eeprom_if_iic.cpp b/Marlin/src/HAL/STM32/eeprom_if_iic.cpp
index 26b3d9044e..ad8712c0c0 100644
--- a/Marlin/src/HAL/STM32/eeprom_if_iic.cpp
+++ b/Marlin/src/HAL/STM32/eeprom_if_iic.cpp
@@ -19,6 +19,7 @@
* along with this program. If not, see .
*
*/
+
#include "../platforms.h"
#ifdef HAL_STM32
diff --git a/Marlin/src/HAL/STM32/eeprom_sdcard.cpp b/Marlin/src/HAL/STM32/eeprom_sdcard.cpp
index 77563b2ae5..473b656f9a 100644
--- a/Marlin/src/HAL/STM32/eeprom_sdcard.cpp
+++ b/Marlin/src/HAL/STM32/eeprom_sdcard.cpp
@@ -19,6 +19,7 @@
* along with this program. If not, see .
*
*/
+
#include "../platforms.h"
#ifdef HAL_STM32
diff --git a/Marlin/src/HAL/STM32/fast_pwm.cpp b/Marlin/src/HAL/STM32/fast_pwm.cpp
index a8fcbe5f82..4d450374d3 100644
--- a/Marlin/src/HAL/STM32/fast_pwm.cpp
+++ b/Marlin/src/HAL/STM32/fast_pwm.cpp
@@ -19,36 +19,22 @@
* along with this program. If not, see .
*
*/
+
#include "../platforms.h"
#ifdef HAL_STM32
-#include "../../inc/MarlinConfigPre.h"
-
-#if NEEDS_HARDWARE_PWM
-
-#include "HAL.h"
+#include "../../inc/MarlinConfig.h"
#include "timers.h"
-void set_pwm_frequency(const pin_t pin, int f_desired) {
+void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255*/, const bool invert/*=false*/) {
if (!PWM_PIN(pin)) return; // Don't proceed if no hardware timer
- PinName pin_name = digitalPinToPinName(pin);
- TIM_TypeDef *Instance = (TIM_TypeDef *)pinmap_peripheral(pin_name, PinMap_PWM); // Get HAL timer instance
-
- LOOP_S_L_N(i, 0, NUM_HARDWARE_TIMERS) // Protect used timers
- if (timer_instance[i] && timer_instance[i]->getHandle()->Instance == Instance)
- return;
-
- pwm_start(pin_name, f_desired, 0, RESOLUTION_8B_COMPARE_FORMAT);
-}
-
-void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255*/, const bool invert/*=false*/) {
PinName pin_name = digitalPinToPinName(pin);
TIM_TypeDef *Instance = (TIM_TypeDef *)pinmap_peripheral(pin_name, PinMap_PWM);
+
uint16_t adj_val = Instance->ARR * v / v_size;
if (invert) adj_val = Instance->ARR - adj_val;
-
switch (get_pwm_channel(pin_name)) {
case TIM_CHANNEL_1: LL_TIM_OC_SetCompareCH1(Instance, adj_val); break;
case TIM_CHANNEL_2: LL_TIM_OC_SetCompareCH2(Instance, adj_val); break;
@@ -57,5 +43,21 @@ void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255
}
}
-#endif // NEEDS_HARDWARE_PWM
+#if NEEDS_HARDWARE_PWM
+
+ void set_pwm_frequency(const pin_t pin, int f_desired) {
+ if (!PWM_PIN(pin)) return; // Don't proceed if no hardware timer
+
+ PinName pin_name = digitalPinToPinName(pin);
+ TIM_TypeDef *Instance = (TIM_TypeDef *)pinmap_peripheral(pin_name, PinMap_PWM); // Get HAL timer instance
+
+ LOOP_S_L_N(i, 0, NUM_HARDWARE_TIMERS) // Protect used timers
+ if (timer_instance[i] && timer_instance[i]->getHandle()->Instance == Instance)
+ return;
+
+ pwm_start(pin_name, f_desired, 0, RESOLUTION_8B_COMPARE_FORMAT);
+ }
+
+#endif
+
#endif // HAL_STM32
diff --git a/Marlin/src/HAL/STM32/pinsDebug.h b/Marlin/src/HAL/STM32/pinsDebug.h
index c77dbc4c75..73d850fc43 100644
--- a/Marlin/src/HAL/STM32/pinsDebug.h
+++ b/Marlin/src/HAL/STM32/pinsDebug.h
@@ -2,6 +2,9 @@
* Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
diff --git a/Marlin/src/HAL/STM32/spi_pins.h b/Marlin/src/HAL/STM32/spi_pins.h
index e2052c5c77..7f341a8c25 100644
--- a/Marlin/src/HAL/STM32/spi_pins.h
+++ b/Marlin/src/HAL/STM32/spi_pins.h
@@ -2,6 +2,9 @@
* Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
diff --git a/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp b/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp
index dacf533224..e68b3c1269 100644
--- a/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp
+++ b/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp
@@ -19,6 +19,7 @@
* along with this program. If not, see .
*
*/
+
#include "../../platforms.h"
#ifdef HAL_STM32
diff --git a/Marlin/src/HAL/STM32/tft/tft_ltdc.cpp b/Marlin/src/HAL/STM32/tft/tft_ltdc.cpp
index 0549dbf108..66cfd65995 100644
--- a/Marlin/src/HAL/STM32/tft/tft_ltdc.cpp
+++ b/Marlin/src/HAL/STM32/tft/tft_ltdc.cpp
@@ -183,7 +183,7 @@ void LTDC_Config() {
hltdc_F.Init.AccumulatedVBP = (LTDC_LCD_VSYNC + LTDC_LCD_VBP - 1);
hltdc_F.Init.AccumulatedActiveH = (TFT_HEIGHT + LTDC_LCD_VSYNC + LTDC_LCD_VBP - 1);
hltdc_F.Init.AccumulatedActiveW = (TFT_WIDTH + LTDC_LCD_HSYNC + LTDC_LCD_HBP - 1);
- hltdc_F.Init.TotalHeight = (TFT_HEIGHT + LTDC_LCD_VSYNC + LTDC_LCD_VBP + LTDC_LCD_VFP - 1);
+ hltdc_F.Init.TotalHeigh = (TFT_HEIGHT + LTDC_LCD_VSYNC + LTDC_LCD_VBP + LTDC_LCD_VFP - 1);
hltdc_F.Init.TotalWidth = (TFT_WIDTH + LTDC_LCD_HSYNC + LTDC_LCD_HBP + LTDC_LCD_HFP - 1);
/* Configure R,G,B component values for LCD background color : all black background */
@@ -205,7 +205,7 @@ void LTDC_Config() {
pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565;
/* Start Address configuration : frame buffer is located at SDRAM memory */
- pLayerCfg.FBStartAddress = (uint32_t)(FRAME_BUFFER_ADDRESS);
+ pLayerCfg.FBStartAdress = (uint32_t)(FRAME_BUFFER_ADDRESS);
/* Alpha constant (255 == totally opaque) */
pLayerCfg.Alpha = 255;
diff --git a/Marlin/src/HAL/STM32/tft/tft_spi.cpp b/Marlin/src/HAL/STM32/tft/tft_spi.cpp
index 29a309f40e..790513e7ed 100644
--- a/Marlin/src/HAL/STM32/tft/tft_spi.cpp
+++ b/Marlin/src/HAL/STM32/tft/tft_spi.cpp
@@ -19,6 +19,7 @@
* along with this program. If not, see .
*
*/
+
#include "../../platforms.h"
#ifdef HAL_STM32
diff --git a/Marlin/src/HAL/STM32/tft/xpt2046.cpp b/Marlin/src/HAL/STM32/tft/xpt2046.cpp
index 912e6c2db7..cf4a8f18e9 100644
--- a/Marlin/src/HAL/STM32/tft/xpt2046.cpp
+++ b/Marlin/src/HAL/STM32/tft/xpt2046.cpp
@@ -19,6 +19,7 @@
* along with this program. If not, see .
*
*/
+
#include "../../platforms.h"
#ifdef HAL_STM32
diff --git a/Marlin/src/HAL/STM32/usb_host.cpp b/Marlin/src/HAL/STM32/usb_host.cpp
index f0879a36a4..d77f0b28e9 100644
--- a/Marlin/src/HAL/STM32/usb_host.cpp
+++ b/Marlin/src/HAL/STM32/usb_host.cpp
@@ -19,6 +19,7 @@
* along with this program. If not, see .
*
*/
+
#include "../platforms.h"
#ifdef HAL_STM32
diff --git a/Marlin/src/HAL/STM32/usb_serial.cpp b/Marlin/src/HAL/STM32/usb_serial.cpp
index 959ca4ff43..b607275db5 100644
--- a/Marlin/src/HAL/STM32/usb_serial.cpp
+++ b/Marlin/src/HAL/STM32/usb_serial.cpp
@@ -2,6 +2,9 @@
* Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
@@ -16,6 +19,7 @@
* along with this program. If not, see .
*
*/
+
#include "../platforms.h"
#ifdef HAL_STM32
diff --git a/Marlin/src/HAL/STM32/usb_serial.h b/Marlin/src/HAL/STM32/usb_serial.h
index ca61b9ed23..3edb6fd618 100644
--- a/Marlin/src/HAL/STM32/usb_serial.h
+++ b/Marlin/src/HAL/STM32/usb_serial.h
@@ -2,6 +2,9 @@
* Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
diff --git a/Marlin/src/HAL/STM32/watchdog.cpp b/Marlin/src/HAL/STM32/watchdog.cpp
index 72c74a2e3b..1eccdec498 100644
--- a/Marlin/src/HAL/STM32/watchdog.cpp
+++ b/Marlin/src/HAL/STM32/watchdog.cpp
@@ -19,6 +19,7 @@
* along with this program. If not, see .
*
*/
+
#include "../platforms.h"
#ifdef HAL_STM32
diff --git a/Marlin/src/HAL/STM32F1/HAL.cpp b/Marlin/src/HAL/STM32F1/HAL.cpp
index 73014945a1..f29b305361 100644
--- a/Marlin/src/HAL/STM32F1/HAL.cpp
+++ b/Marlin/src/HAL/STM32F1/HAL.cpp
@@ -437,7 +437,7 @@ void HAL_adc_start_conversion(const uint8_t adc_pin) {
case POWER_MONITOR_VOLTAGE_PIN: pin_index = POWERMON_VOLTS; break;
#endif
}
- HAL_adc_result = (HAL_adc_results[(int)pin_index] >> 2) & 0x3FF; // shift to get 10 bits only.
+ HAL_adc_result = HAL_adc_results[(int)pin_index] >> (12 - HAL_ADC_RESOLUTION); // shift out unused bits
}
uint16_t HAL_adc_get_result() { return HAL_adc_result; }
@@ -449,8 +449,7 @@ uint16_t analogRead(pin_t pin) {
// Wrapper to maple unprotected analogWrite
void analogWrite(pin_t pin, int pwm_val8) {
- if (PWM_PIN(pin))
- analogWrite(uint8_t(pin), pwm_val8);
+ if (PWM_PIN(pin)) analogWrite(uint8_t(pin), pwm_val8);
}
void HAL_reboot() { nvic_sys_reset(); }
diff --git a/Marlin/src/HAL/STM32F1/HAL.h b/Marlin/src/HAL/STM32F1/HAL.h
index 0861c918aa..864600e4eb 100644
--- a/Marlin/src/HAL/STM32F1/HAL.h
+++ b/Marlin/src/HAL/STM32F1/HAL.h
@@ -237,8 +237,13 @@ static inline int freeMemory() {
void HAL_adc_init();
+#ifdef ADC_RESOLUTION
+ #define HAL_ADC_RESOLUTION ADC_RESOLUTION
+#else
+ #define HAL_ADC_RESOLUTION 12
+#endif
+
#define HAL_ADC_VREF 3.3
-#define HAL_ADC_RESOLUTION 10
#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin)
#define HAL_READ_ADC() HAL_adc_result
#define HAL_ADC_READY() true
diff --git a/Marlin/src/HAL/STM32F1/build_flags.py b/Marlin/src/HAL/STM32F1/build_flags.py
index d0848d1c64..970ca8b767 100755
--- a/Marlin/src/HAL/STM32F1/build_flags.py
+++ b/Marlin/src/HAL/STM32F1/build_flags.py
@@ -30,25 +30,27 @@ if __name__ == "__main__":
# extra script for linker options
else:
- from SCons.Script import DefaultEnvironment
- env = DefaultEnvironment()
- env.Append(
+ import pioutil
+ if pioutil.is_pio_build():
+ from SCons.Script import DefaultEnvironment
+ env = DefaultEnvironment()
+ env.Append(
ARFLAGS=["rcs"],
ASFLAGS=["-x", "assembler-with-cpp"],
CXXFLAGS=[
- "-fabi-version=0",
- "-fno-use-cxa-atexit",
- "-fno-threadsafe-statics"
+ "-fabi-version=0",
+ "-fno-use-cxa-atexit",
+ "-fno-threadsafe-statics"
],
LINKFLAGS=[
- "-Os",
- "-mcpu=cortex-m3",
- "-ffreestanding",
- "-mthumb",
- "--specs=nano.specs",
- "--specs=nosys.specs",
- "-u_printf_float",
+ "-Os",
+ "-mcpu=cortex-m3",
+ "-ffreestanding",
+ "-mthumb",
+ "--specs=nano.specs",
+ "--specs=nosys.specs",
+ "-u_printf_float",
],
- )
+ )
diff --git a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp
index f1cd6b3730..26ea1ea19a 100644
--- a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp
+++ b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp
@@ -2,6 +2,9 @@
* Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
@@ -16,6 +19,7 @@
* along with this program. If not, see .
*
*/
+
#ifdef __STM32F1__
#include "../../../inc/MarlinConfig.h"
diff --git a/Marlin/src/HAL/STM32F1/eeprom_wired.cpp b/Marlin/src/HAL/STM32F1/eeprom_wired.cpp
index 4cac36554f..bc48eef34f 100644
--- a/Marlin/src/HAL/STM32F1/eeprom_wired.cpp
+++ b/Marlin/src/HAL/STM32F1/eeprom_wired.cpp
@@ -2,6 +2,9 @@
* Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
diff --git a/Marlin/src/HAL/STM32F1/fast_pwm.cpp b/Marlin/src/HAL/STM32F1/fast_pwm.cpp
index 884d482af5..5171c11545 100644
--- a/Marlin/src/HAL/STM32F1/fast_pwm.cpp
+++ b/Marlin/src/HAL/STM32F1/fast_pwm.cpp
@@ -23,46 +23,47 @@
#include "../../inc/MarlinConfigPre.h"
-#if NEEDS_HARDWARE_PWM
-
#include
#include "HAL.h"
#include "timers.h"
-void set_pwm_frequency(const pin_t pin, int f_desired) {
- if (!PWM_PIN(pin)) return; // Don't proceed if no hardware timer
-
- timer_dev *timer = PIN_MAP[pin].timer_device;
- uint8_t channel = PIN_MAP[pin].timer_channel;
-
- // Protect used timers
- if (timer == get_timer_dev(TEMP_TIMER_NUM)) return;
- if (timer == get_timer_dev(STEP_TIMER_NUM)) return;
- #if PULSE_TIMER_NUM != STEP_TIMER_NUM
- if (timer == get_timer_dev(PULSE_TIMER_NUM)) return;
- #endif
-
- if (!(timer->regs.bas->SR & TIMER_CR1_CEN)) // Ensure the timer is enabled
- timer_init(timer);
-
- timer_set_mode(timer, channel, TIMER_PWM);
- uint16_t preload = 255; // Lock 255 PWM resolution for high frequencies
- int32_t prescaler = (HAL_TIMER_RATE) / (preload + 1) / f_desired - 1;
- if (prescaler > 65535) { // For low frequencies increase prescaler
- prescaler = 65535;
- preload = (HAL_TIMER_RATE) / (prescaler + 1) / f_desired - 1;
- }
- if (prescaler < 0) return; // Too high frequency
- timer_set_reload(timer, preload);
- timer_set_prescaler(timer, prescaler);
-}
-
void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255*/, const bool invert/*=false*/) {
+ if (!PWM_PIN(pin)) return;
timer_dev *timer = PIN_MAP[pin].timer_device;
uint16_t max_val = timer->regs.bas->ARR * v / v_size;
if (invert) max_val = v_size - max_val;
pwmWrite(pin, max_val);
}
+#if NEEDS_HARDWARE_PWM
+
+ void set_pwm_frequency(const pin_t pin, int f_desired) {
+ if (!PWM_PIN(pin)) return; // Don't proceed if no hardware timer
+
+ timer_dev *timer = PIN_MAP[pin].timer_device;
+ uint8_t channel = PIN_MAP[pin].timer_channel;
+
+ // Protect used timers
+ if (timer == get_timer_dev(TEMP_TIMER_NUM)) return;
+ if (timer == get_timer_dev(STEP_TIMER_NUM)) return;
+ #if PULSE_TIMER_NUM != STEP_TIMER_NUM
+ if (timer == get_timer_dev(PULSE_TIMER_NUM)) return;
+ #endif
+
+ if (!(timer->regs.bas->SR & TIMER_CR1_CEN)) // Ensure the timer is enabled
+ timer_init(timer);
+
+ timer_set_mode(timer, channel, TIMER_PWM);
+ uint16_t preload = 255; // Lock 255 PWM resolution for high frequencies
+ int32_t prescaler = (HAL_TIMER_RATE) / (preload + 1) / f_desired - 1;
+ if (prescaler > 65535) { // For low frequencies increase prescaler
+ prescaler = 65535;
+ preload = (HAL_TIMER_RATE) / (prescaler + 1) / f_desired - 1;
+ }
+ if (prescaler < 0) return; // Too high frequency
+ timer_set_reload(timer, preload);
+ timer_set_prescaler(timer, prescaler);
+ }
+
#endif // NEEDS_HARDWARE_PWM
#endif // __STM32F1__
diff --git a/Marlin/src/HAL/STM32F1/pinsDebug.h b/Marlin/src/HAL/STM32F1/pinsDebug.h
index dcf3a51138..27f4b6732b 100644
--- a/Marlin/src/HAL/STM32F1/pinsDebug.h
+++ b/Marlin/src/HAL/STM32F1/pinsDebug.h
@@ -2,6 +2,9 @@
* Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
diff --git a/Marlin/src/HAL/STM32F1/spi_pins.h b/Marlin/src/HAL/STM32F1/spi_pins.h
index 7d650ffe37..3d3c8f8d2f 100644
--- a/Marlin/src/HAL/STM32F1/spi_pins.h
+++ b/Marlin/src/HAL/STM32F1/spi_pins.h
@@ -2,6 +2,9 @@
* Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
diff --git a/Marlin/src/HAL/STM32F1/tft/tft_spi.cpp b/Marlin/src/HAL/STM32F1/tft/tft_spi.cpp
index 5edf96fe56..9bf6bbb32b 100644
--- a/Marlin/src/HAL/STM32F1/tft/tft_spi.cpp
+++ b/Marlin/src/HAL/STM32F1/tft/tft_spi.cpp
@@ -26,36 +26,20 @@
#include "tft_spi.h"
-// TFT_SPI tft;
-
SPIClass TFT_SPI::SPIx(1);
-#define TFT_CS_H OUT_WRITE(TFT_CS_PIN, HIGH)
-#define TFT_CS_L OUT_WRITE(TFT_CS_PIN, LOW)
-
-#define TFT_DC_H OUT_WRITE(TFT_DC_PIN, HIGH)
-#define TFT_DC_L OUT_WRITE(TFT_DC_PIN, LOW)
-
-#define TFT_RST_H OUT_WRITE(TFT_RST_PIN, HIGH)
-#define TFT_RST_L OUT_WRITE(TFT_RST_PIN, LOW)
-
-#define TFT_BLK_H OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH)
-#define TFT_BLK_L OUT_WRITE(TFT_BACKLIGHT_PIN, LOW)
-
void TFT_SPI::Init() {
#if PIN_EXISTS(TFT_RESET)
- // OUT_WRITE(TFT_RESET_PIN, HIGH);
- TFT_RST_H;
+ OUT_WRITE(TFT_RST_PIN, HIGH);
delay(100);
#endif
#if PIN_EXISTS(TFT_BACKLIGHT)
- // OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH);
- TFT_BLK_H;
+ OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH);
#endif
- TFT_DC_H;
- TFT_CS_H;
+ OUT_WRITE(TFT_DC_PIN, HIGH);
+ OUT_WRITE(TFT_CS_PIN, HIGH);
/**
* STM32F1 APB2 = 72MHz, APB1 = 36MHz, max SPI speed of this MCU if 18Mhz
@@ -87,7 +71,7 @@ void TFT_SPI::Init() {
void TFT_SPI::DataTransferBegin(uint16_t DataSize) {
SPIx.setDataSize(DataSize);
SPIx.begin();
- TFT_CS_L;
+ OUT_WRITE(TFT_CS_PIN, LOW);
}
#ifdef TFT_DEFAULT_DRIVER
@@ -129,28 +113,16 @@ uint32_t TFT_SPI::ReadID(uint16_t Reg) {
#endif
}
-bool TFT_SPI::isBusy() {
- return false;
-}
+bool TFT_SPI::isBusy() { return false; }
-void TFT_SPI::Abort() {
- DataTransferEnd();
-}
+void TFT_SPI::Abort() { DataTransferEnd(); }
-void TFT_SPI::Transmit(uint16_t Data) {
- SPIx.send(Data);
-}
+void TFT_SPI::Transmit(uint16_t Data) { SPIx.send(Data); }
void TFT_SPI::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) {
DataTransferBegin();
- TFT_DC_H;
- if (MemoryIncrease == DMA_MINC_ENABLE) {
- SPIx.dmaSend(Data, Count, true);
- }
- else {
- SPIx.dmaSend(Data, Count, false);
- }
-
+ OUT_WRITE(TFT_DC_PIN, HIGH);
+ SPIx.dmaSend(Data, Count, MemoryIncrease == DMA_MINC_ENABLE);
DataTransferEnd();
}
diff --git a/Marlin/src/HAL/TEENSY31_32/HAL.h b/Marlin/src/HAL/TEENSY31_32/HAL.h
index aa195845fb..61d8b34604 100644
--- a/Marlin/src/HAL/TEENSY31_32/HAL.h
+++ b/Marlin/src/HAL/TEENSY31_32/HAL.h
@@ -98,16 +98,14 @@ void HAL_reboot();
FORCE_INLINE void _delay_ms(const int delay_ms) { delay(delay_ms); }
+#pragma GCC diagnostic push
#if GCC_VERSION <= 50000
- #pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-function"
#endif
extern "C" int freeMemory();
-#if GCC_VERSION <= 50000
- #pragma GCC diagnostic pop
-#endif
+#pragma GCC diagnostic pop
// ADC
@@ -124,6 +122,12 @@ void HAL_adc_init();
void HAL_adc_start_conversion(const uint8_t adc_pin);
uint16_t HAL_adc_get_result();
+// PWM
+
+inline void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t=255, const bool=false) { analogWrite(pin, v); }
+
+// Pin Map
+
#define GET_PIN_MAP_PIN(index) index
#define GET_PIN_MAP_INDEX(pin) pin
#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval)
diff --git a/Marlin/src/HAL/TEENSY31_32/HAL_SPI.cpp b/Marlin/src/HAL/TEENSY31_32/HAL_SPI.cpp
index ff84e91f79..415c692229 100644
--- a/Marlin/src/HAL/TEENSY31_32/HAL_SPI.cpp
+++ b/Marlin/src/HAL/TEENSY31_32/HAL_SPI.cpp
@@ -36,10 +36,9 @@ static SPISettings spiConfig;
// Initialize SPI bus
void spiBegin() {
- #if !PIN_EXISTS(SD_SS)
- #error "SD_SS_PIN not defined!"
+ #if PIN_EXISTS(SD_SS)
+ OUT_WRITE(SD_SS_PIN, HIGH);
#endif
- OUT_WRITE(SD_SS_PIN, HIGH);
SET_OUTPUT(SD_SCK_PIN);
SET_INPUT(SD_MISO_PIN);
SET_OUTPUT(SD_MOSI_PIN);
diff --git a/Marlin/src/HAL/TEENSY31_32/MarlinSPI.h b/Marlin/src/HAL/TEENSY31_32/MarlinSPI.h
new file mode 100644
index 0000000000..0c447ba4cb
--- /dev/null
+++ b/Marlin/src/HAL/TEENSY31_32/MarlinSPI.h
@@ -0,0 +1,26 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+#include
+
+using MarlinSPI = SPIClass;
diff --git a/Marlin/src/HAL/TEENSY31_32/eeprom.cpp b/Marlin/src/HAL/TEENSY31_32/eeprom.cpp
index 85febebebc..d1ff940822 100644
--- a/Marlin/src/HAL/TEENSY31_32/eeprom.cpp
+++ b/Marlin/src/HAL/TEENSY31_32/eeprom.cpp
@@ -2,6 +2,9 @@
* Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
@@ -16,6 +19,7 @@
* along with this program. If not, see .
*
*/
+
#ifdef __MK20DX256__
/**
diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.h b/Marlin/src/HAL/TEENSY35_36/HAL.h
index 0093294a2a..892eb2d3c5 100644
--- a/Marlin/src/HAL/TEENSY35_36/HAL.h
+++ b/Marlin/src/HAL/TEENSY35_36/HAL.h
@@ -105,16 +105,14 @@ void HAL_reboot();
FORCE_INLINE void _delay_ms(const int delay_ms) { delay(delay_ms); }
+#pragma GCC diagnostic push
#if GCC_VERSION <= 50000
- #pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-function"
#endif
extern "C" int freeMemory();
-#if GCC_VERSION <= 50000
- #pragma GCC diagnostic pop
-#endif
+#pragma GCC diagnostic pop
// ADC
@@ -131,6 +129,12 @@ void HAL_adc_init();
void HAL_adc_start_conversion(const uint8_t adc_pin);
uint16_t HAL_adc_get_result();
+// PWM
+
+inline void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t=255, const bool=false) { analogWrite(pin, v); }
+
+// Pin Map
+
#define GET_PIN_MAP_PIN(index) index
#define GET_PIN_MAP_INDEX(pin) pin
#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval)
diff --git a/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp b/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp
index e63ab1c0e3..d80f57b2c4 100644
--- a/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp
+++ b/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp
@@ -36,10 +36,9 @@
static SPISettings spiConfig;
void spiBegin() {
- #if !PIN_EXISTS(SD_SS)
- #error "SD_SS_PIN not defined!"
+ #if PIN_EXISTS(SD_SS)
+ OUT_WRITE(SD_SS_PIN, HIGH);
#endif
- OUT_WRITE(SD_SS_PIN, HIGH);
SET_OUTPUT(SD_SCK_PIN);
SET_INPUT(SD_MISO_PIN);
SET_OUTPUT(SD_MOSI_PIN);
diff --git a/Marlin/src/HAL/TEENSY35_36/MarlinSPI.h b/Marlin/src/HAL/TEENSY35_36/MarlinSPI.h
new file mode 100644
index 0000000000..0c447ba4cb
--- /dev/null
+++ b/Marlin/src/HAL/TEENSY35_36/MarlinSPI.h
@@ -0,0 +1,26 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+#include
+
+using MarlinSPI = SPIClass;
diff --git a/Marlin/src/HAL/TEENSY35_36/pinsDebug.h b/Marlin/src/HAL/TEENSY35_36/pinsDebug.h
index e529fa93be..7a2e1d6e59 100644
--- a/Marlin/src/HAL/TEENSY35_36/pinsDebug.h
+++ b/Marlin/src/HAL/TEENSY35_36/pinsDebug.h
@@ -2,6 +2,9 @@
* Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.cpp b/Marlin/src/HAL/TEENSY40_41/HAL.cpp
index ccc8c2659c..270bee0dc9 100644
--- a/Marlin/src/HAL/TEENSY40_41/HAL.cpp
+++ b/Marlin/src/HAL/TEENSY40_41/HAL.cpp
@@ -106,17 +106,17 @@ void HAL_adc_init() {
void HAL_clear_reset_source() {
uint32_t reset_source = SRC_SRSR;
SRC_SRSR = reset_source;
- }
+}
uint8_t HAL_get_reset_source() {
switch (SRC_SRSR & 0xFF) {
case 1: return RST_POWER_ON; break;
case 2: return RST_SOFTWARE; break;
case 4: return RST_EXTERNAL; break;
- // case 8: return RST_BROWN_OUT; break;
+ //case 8: return RST_BROWN_OUT; break;
case 16: return RST_WATCHDOG; break;
- case 64: return RST_JTAG; break;
- // case 128: return RST_OVERTEMP; break;
+ case 64: return RST_JTAG; break;
+ //case 128: return RST_OVERTEMP; break;
}
return 0;
}
@@ -168,7 +168,7 @@ uint16_t HAL_adc_get_result() {
return 0;
}
-bool is_output(uint8_t pin) {
+bool is_output(pin_t pin) {
const struct digital_pin_bitband_and_config_table_struct *p;
p = digital_pin_to_info_PGM + pin;
return (*(p->reg + 1) & p->mask);
diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.h b/Marlin/src/HAL/TEENSY40_41/HAL.h
index ea51f15ba1..2b730768a8 100644
--- a/Marlin/src/HAL/TEENSY40_41/HAL.h
+++ b/Marlin/src/HAL/TEENSY40_41/HAL.h
@@ -125,16 +125,14 @@ void HAL_reboot();
FORCE_INLINE void _delay_ms(const int delay_ms) { delay(delay_ms); }
+#pragma GCC diagnostic push
#if GCC_VERSION <= 50000
- #pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-function"
#endif
extern "C" uint32_t freeMemory();
-#if GCC_VERSION <= 50000
- #pragma GCC diagnostic pop
-#endif
+#pragma GCC diagnostic pop
// ADC
@@ -152,8 +150,14 @@ void HAL_adc_init();
void HAL_adc_start_conversion(const uint8_t adc_pin);
uint16_t HAL_adc_get_result();
+// PWM
+
+inline void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t=255, const bool=false) { analogWrite(pin, v); }
+
+// Pin Map
+
#define GET_PIN_MAP_PIN(index) index
#define GET_PIN_MAP_INDEX(pin) pin
#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval)
-bool is_output(uint8_t pin);
+bool is_output(pin_t pin);
diff --git a/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp b/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp
index 610765ad49..9dcb812faf 100644
--- a/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp
+++ b/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp
@@ -51,12 +51,9 @@ static SPISettings spiConfig;
// ------------------------
void spiBegin() {
- #ifndef SD_SS_PIN
- #error "SD_SS_PIN is not defined!"
+ #if PIN_EXISTS(SD_SS)
+ OUT_WRITE(SD_SS_PIN, HIGH);
#endif
-
- OUT_WRITE(SD_SS_PIN, HIGH);
-
//SET_OUTPUT(SD_SCK_PIN);
//SET_INPUT(SD_MISO_PIN);
//SET_OUTPUT(SD_MOSI_PIN);
diff --git a/Marlin/src/HAL/TEENSY40_41/MarlinSPI.h b/Marlin/src/HAL/TEENSY40_41/MarlinSPI.h
new file mode 100644
index 0000000000..0c447ba4cb
--- /dev/null
+++ b/Marlin/src/HAL/TEENSY40_41/MarlinSPI.h
@@ -0,0 +1,26 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+#include
+
+using MarlinSPI = SPIClass;
diff --git a/Marlin/src/HAL/TEENSY40_41/pinsDebug.h b/Marlin/src/HAL/TEENSY40_41/pinsDebug.h
index 197cc6f1b2..94b85ea568 100644
--- a/Marlin/src/HAL/TEENSY40_41/pinsDebug.h
+++ b/Marlin/src/HAL/TEENSY40_41/pinsDebug.h
@@ -2,6 +2,9 @@
* Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
diff --git a/Marlin/src/HAL/shared/Delay.cpp b/Marlin/src/HAL/shared/Delay.cpp
index 05af38307b..c64376d25d 100644
--- a/Marlin/src/HAL/shared/Delay.cpp
+++ b/Marlin/src/HAL/shared/Delay.cpp
@@ -19,6 +19,7 @@
* along with this program. If not, see .
*
*/
+
#include "Delay.h"
#include "../../inc/MarlinConfig.h"
@@ -107,13 +108,14 @@
#if ENABLED(MARLIN_DEV_MODE)
void dump_delay_accuracy_check() {
- auto report_call_time = [](PGM_P const name, PGM_P const unit, const uint32_t cycles, const uint32_t total, const bool do_flush=true) {
+ auto report_call_time = [](FSTR_P const name, FSTR_P const unit, const uint32_t cycles, const uint32_t total, const bool do_flush=true) {
SERIAL_ECHOPGM("Calling ");
- SERIAL_ECHOPGM_P(name);
+ SERIAL_ECHOF(name);
SERIAL_ECHOLNPGM(" for ", cycles);
- SERIAL_ECHOPGM_P(unit);
+ SERIAL_ECHOF(unit);
SERIAL_ECHOLNPGM(" took: ", total);
- SERIAL_ECHOPGM_P(unit);
+ SERIAL_CHAR(' ');
+ SERIAL_ECHOF(unit);
if (do_flush) SERIAL_FLUSHTX();
};
@@ -125,41 +127,42 @@
constexpr uint32_t testValues[] = { 1, 5, 10, 20, 50, 100, 150, 200, 350, 500, 750, 1000 };
for (auto i : testValues) {
s = micros(); DELAY_US(i); e = micros();
- report_call_time(PSTR("delay"), PSTR("us"), i, e - s);
+ report_call_time(F("delay"), F("us"), i, e - s);
}
if (HW_REG(_DWT_CTRL)) {
+ static FSTR_P cyc = F("cycles");
+ static FSTR_P dcd = F("DELAY_CYCLES directly ");
+
for (auto i : testValues) {
s = HW_REG(_DWT_CYCCNT); DELAY_CYCLES(i); e = HW_REG(_DWT_CYCCNT);
- report_call_time(PSTR("runtime delay"), PSTR("cycles"), i, e - s);
+ report_call_time(F("runtime delay"), cyc, i, e - s);
}
// Measure the delay to call a real function compared to a function pointer
s = HW_REG(_DWT_CYCCNT); delay_dwt(1); e = HW_REG(_DWT_CYCCNT);
- report_call_time(PSTR("delay_dwt"), PSTR("cycles"), 1, e - s);
-
- static PGMSTR(dcd, "DELAY_CYCLES directly ");
+ report_call_time(F("delay_dwt"), cyc, 1, e - s);
s = HW_REG(_DWT_CYCCNT); DELAY_CYCLES( 1); e = HW_REG(_DWT_CYCCNT);
- report_call_time(dcd, PSTR("cycles"), 1, e - s, false);
+ report_call_time(dcd, cyc, 1, e - s, false);
s = HW_REG(_DWT_CYCCNT); DELAY_CYCLES( 5); e = HW_REG(_DWT_CYCCNT);
- report_call_time(dcd, PSTR("cycles"), 5, e - s, false);
+ report_call_time(dcd, cyc, 5, e - s, false);
s = HW_REG(_DWT_CYCCNT); DELAY_CYCLES(10); e = HW_REG(_DWT_CYCCNT);
- report_call_time(dcd, PSTR("cycles"), 10, e - s, false);
+ report_call_time(dcd, cyc, 10, e - s, false);
s = HW_REG(_DWT_CYCCNT); DELAY_CYCLES(20); e = HW_REG(_DWT_CYCCNT);
- report_call_time(dcd, PSTR("cycles"), 20, e - s, false);
+ report_call_time(dcd, cyc, 20, e - s, false);
s = HW_REG(_DWT_CYCCNT); DELAY_CYCLES(50); e = HW_REG(_DWT_CYCCNT);
- report_call_time(dcd, PSTR("cycles"), 50, e - s, false);
+ report_call_time(dcd, cyc, 50, e - s, false);
s = HW_REG(_DWT_CYCCNT); DELAY_CYCLES(100); e = HW_REG(_DWT_CYCCNT);
- report_call_time(dcd, PSTR("cycles"), 100, e - s, false);
+ report_call_time(dcd, cyc, 100, e - s, false);
s = HW_REG(_DWT_CYCCNT); DELAY_CYCLES(200); e = HW_REG(_DWT_CYCCNT);
- report_call_time(dcd, PSTR("cycles"), 200, e - s, false);
+ report_call_time(dcd, cyc, 200, e - s, false);
}
}
#endif // MARLIN_DEV_MODE
@@ -169,7 +172,7 @@
void calibrate_delay_loop() {}
#if ENABLED(MARLIN_DEV_MODE)
- void dump_delay_accuracy_check() { SERIAL_ECHOPGM_P(PSTR("N/A on this platform")); }
+ void dump_delay_accuracy_check() { SERIAL_ECHOPGM("N/A on this platform"); }
#endif
#endif
diff --git a/Marlin/src/HAL/shared/Delay.h b/Marlin/src/HAL/shared/Delay.h
index 04df35d88d..df07881f01 100644
--- a/Marlin/src/HAL/shared/Delay.h
+++ b/Marlin/src/HAL/shared/Delay.h
@@ -92,6 +92,12 @@ void calibrate_delay_loop();
#define DELAY_CYCLES(X) do { SmartDelay _smrtdly_X(X); } while(0)
+ #if GCC_VERSION <= 70000
+ #define DELAY_CYCLES_VAR(X) DelayCycleFnc(X)
+ #else
+ #define DELAY_CYCLES_VAR DELAY_CYCLES
+ #endif
+
// For delay in microseconds, no smart delay selection is required, directly call the delay function
// Teensy compiler is too old and does not accept smart delay compile-time / run-time selection correctly
#define DELAY_US(x) DelayCycleFnc((x) * ((F_CPU) / 1000000UL))
@@ -200,9 +206,12 @@ void calibrate_delay_loop();
#endif
#if ENABLED(DELAY_NS_ROUND_DOWN)
- #define DELAY_NS(x) DELAY_CYCLES((x) * ((F_CPU) / 1000000UL) / 1000UL) // floor
+ #define _NS_TO_CYCLES(x) ( (x) * ((F_CPU) / 1000000UL) / 1000UL) // floor
#elif ENABLED(DELAY_NS_ROUND_CLOSEST)
- #define DELAY_NS(x) DELAY_CYCLES(((x) * ((F_CPU) / 1000000UL) + 500) / 1000UL) // round
+ #define _NS_TO_CYCLES(x) (((x) * ((F_CPU) / 1000000UL) + 500) / 1000UL) // round
#else
- #define DELAY_NS(x) DELAY_CYCLES(((x) * ((F_CPU) / 1000000UL) + 999) / 1000UL) // "ceil"
+ #define _NS_TO_CYCLES(x) (((x) * ((F_CPU) / 1000000UL) + 999) / 1000UL) // "ceil"
#endif
+
+#define DELAY_NS(x) DELAY_CYCLES(_NS_TO_CYCLES(x))
+#define DELAY_NS_VAR(x) DELAY_CYCLES_VAR(_NS_TO_CYCLES(x))
diff --git a/Marlin/src/HAL/shared/Marduino.h b/Marlin/src/HAL/shared/Marduino.h
index 56be8d7211..0e2a021a3c 100644
--- a/Marlin/src/HAL/shared/Marduino.h
+++ b/Marlin/src/HAL/shared/Marduino.h
@@ -39,7 +39,7 @@
#define DISABLED(V...) DO(DIS,&&,V)
#undef _BV
-#define _BV(b) (1UL << (b))
+#define _BV(b) (1 << (b))
#ifndef SBI
#define SBI(A,B) (A |= _BV(B))
#endif
@@ -83,7 +83,14 @@
#endif
#ifndef FORCE_INLINE
- #define FORCE_INLINE inline __attribute__((always_inline))
+ #define FORCE_INLINE __attribute__((always_inline)) inline
#endif
#include "progmem.h"
+
+class __FlashStringHelper;
+typedef const __FlashStringHelper* FSTR_P;
+#ifndef FPSTR
+ #define FPSTR(S) (reinterpret_cast(S))
+#endif
+#define FTOP(S) (reinterpret_cast(S))
diff --git a/Marlin/src/HAL/shared/progmem.h b/Marlin/src/HAL/shared/progmem.h
index 539d02705e..4cd7663df9 100644
--- a/Marlin/src/HAL/shared/progmem.h
+++ b/Marlin/src/HAL/shared/progmem.h
@@ -38,7 +38,8 @@
#define PSTR(str) (str)
#endif
#ifndef F
-#define F(str) (str)
+class __FlashStringHelper;
+#define F(str) (reinterpret_cast(PSTR(str)))
#endif
#ifndef _SFR_BYTE
#define _SFR_BYTE(n) (n)
@@ -110,7 +111,7 @@
#define strrchr_P(str, c) strrchr((str), (c))
#endif
#ifndef strsep_P
-#define strsep_P(strp, delim) strsep((strp), (delim))
+#define strsep_P(pstr, delim) strsep((pstr), (delim))
#endif
#ifndef strspn_P
#define strspn_P(str, chrs) strspn((str), (chrs))
diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp
index 07a9d0186f..f2031cdfb9 100644
--- a/Marlin/src/MarlinCore.cpp
+++ b/Marlin/src/MarlinCore.cpp
@@ -30,10 +30,6 @@
#include "MarlinCore.h"
-#if ENABLED(MARLIN_DEV_MODE)
- #warning "WARNING! Disable MARLIN_DEV_MODE for the final build!"
-#endif
-
#include "HAL/shared/Delay.h"
#include "HAL/shared/esp_wifi.h"
#include "HAL/shared/cpu_exception/exception_hook.h"
@@ -74,19 +70,15 @@
#include
#endif
-#if ENABLED(DWIN_CREALITY_LCD)
- #include "lcd/e3v2/creality/dwin.h"
- #include "lcd/e3v2/creality/rotary_encoder.h"
-#elif ENABLED(DWIN_CREALITY_LCD_ENHANCED)
- #include "lcd/e3v2/enhanced/dwin.h"
- #include "lcd/e3v2/enhanced/rotary_encoder.h"
-#elif ENABLED(DWIN_CREALITY_LCD_JYERSUI)
- #include "lcd/e3v2/jyersui/dwin.h"
- #include "lcd/e3v2/jyersui/rotary_encoder.h"
-#endif
-
-#if ENABLED(EXTENSIBLE_UI)
- #include "lcd/extui/ui_api.h"
+#if HAS_DWIN_E3V2
+ #include "lcd/e3v2/common/encoder.h"
+ #if ENABLED(DWIN_CREALITY_LCD)
+ #include "lcd/e3v2/creality/dwin.h"
+ #elif ENABLED(DWIN_CREALITY_LCD_ENHANCED)
+ #include "lcd/e3v2/enhanced/dwin.h"
+ #elif ENABLED(DWIN_CREALITY_LCD_JYERSUI)
+ #include "lcd/e3v2/jyersui/dwin.h"
+ #endif
#endif
#if HAS_ETHERNET
@@ -172,6 +164,8 @@
#if ENABLED(DELTA)
#include "module/delta.h"
+#elif ENABLED(POLARGRAPH)
+ #include "module/polargraph.h"
#elif IS_SCARA
#include "module/scara.h"
#endif
@@ -222,6 +216,10 @@
#include "feature/controllerfan.h"
#endif
+#if HAS_PRUSA_MMU1
+ #include "feature/mmu/mmu.h"
+#endif
+
#if HAS_PRUSA_MMU2
#include "feature/mmu/mmu2.h"
#endif
@@ -314,48 +312,6 @@ bool pin_is_protected(const pin_t pin) {
#pragma GCC diagnostic pop
-void enable_e_steppers() {
- #define _ENA_E(N) ENABLE_AXIS_E##N();
- REPEAT(E_STEPPERS, _ENA_E)
-}
-
-void enable_all_steppers() {
- TERN_(AUTO_POWER_CONTROL, powerManager.power_on());
- ENABLE_AXIS_X();
- ENABLE_AXIS_Y();
- ENABLE_AXIS_Z();
- ENABLE_AXIS_I(); // Marlin 6-axis support by DerAndere (https://github.com/DerAndere1/Marlin/wiki)
- ENABLE_AXIS_J();
- ENABLE_AXIS_K();
- enable_e_steppers();
-
- TERN_(EXTENSIBLE_UI, ExtUI::onSteppersEnabled());
-}
-
-void disable_e_steppers() {
- #define _DIS_E(N) DISABLE_AXIS_E##N();
- REPEAT(E_STEPPERS, _DIS_E)
-}
-
-void disable_e_stepper(const uint8_t e) {
- #define _CASE_DIS_E(N) case N: DISABLE_AXIS_E##N(); break;
- switch (e) {
- REPEAT(E_STEPPERS, _CASE_DIS_E)
- }
-}
-
-void disable_all_steppers() {
- DISABLE_AXIS_X();
- DISABLE_AXIS_Y();
- DISABLE_AXIS_Z();
- DISABLE_AXIS_I();
- DISABLE_AXIS_J();
- DISABLE_AXIS_K();
- disable_e_steppers();
-
- TERN_(EXTENSIBLE_UI, ExtUI::onSteppersDisabled());
-}
-
/**
* A Print Job exists when the timer is running or SD is printing
*/
@@ -405,15 +361,15 @@ void startOrResumeJob() {
TERN_(POWER_LOSS_RECOVERY, recovery.purge());
#ifdef EVENT_GCODE_SD_ABORT
- queue.inject_P(PSTR(EVENT_GCODE_SD_ABORT));
+ queue.inject(F(EVENT_GCODE_SD_ABORT));
#endif
TERN_(PASSWORD_AFTER_SD_PRINT_ABORT, password.lock_machine());
}
inline void finishSDPrinting() {
- if (queue.enqueue_one_P(PSTR("M1001"))) { // Keep trying until it gets queued
- marlin_state = MF_RUNNING; // Signal to stop trying
+ if (queue.enqueue_one(F("M1001"))) { // Keep trying until it gets queued
+ marlin_state = MF_RUNNING; // Signal to stop trying
TERN_(PASSWORD_AFTER_SD_PRINT_END, password.lock_machine());
TERN_(DGUS_LCD_UI_MKS, ScreenHandler.SDPrintingFinished());
}
@@ -466,13 +422,13 @@ inline void manage_inactivity(const bool no_stepper_sleep=false) {
already_shutdown_steppers = true; // L6470 SPI will consume 99% of free time without this
// Individual axes will be disabled if configured
- if (ENABLED(DISABLE_INACTIVE_X)) DISABLE_AXIS_X();
- if (ENABLED(DISABLE_INACTIVE_Y)) DISABLE_AXIS_Y();
- if (ENABLED(DISABLE_INACTIVE_Z)) DISABLE_AXIS_Z();
- if (ENABLED(DISABLE_INACTIVE_I)) DISABLE_AXIS_I();
- if (ENABLED(DISABLE_INACTIVE_J)) DISABLE_AXIS_J();
- if (ENABLED(DISABLE_INACTIVE_K)) DISABLE_AXIS_K();
- if (ENABLED(DISABLE_INACTIVE_E)) disable_e_steppers();
+ TERN_(DISABLE_INACTIVE_X, stepper.disable_axis(X_AXIS));
+ TERN_(DISABLE_INACTIVE_Y, stepper.disable_axis(Y_AXIS));
+ TERN_(DISABLE_INACTIVE_Z, stepper.disable_axis(Z_AXIS));
+ TERN_(DISABLE_INACTIVE_I, stepper.disable_axis(I_AXIS));
+ TERN_(DISABLE_INACTIVE_J, stepper.disable_axis(J_AXIS));
+ TERN_(DISABLE_INACTIVE_K, stepper.disable_axis(K_AXIS));
+ TERN_(DISABLE_INACTIVE_E, stepper.disable_e_steppers());
TERN_(AUTO_BED_LEVELING_UBL, ubl.steppers_were_disabled());
}
@@ -522,7 +478,7 @@ inline void manage_inactivity(const bool no_stepper_sleep=false) {
if (!IS_SD_PRINTING() && !READ(HOME_PIN)) { // HOME_PIN goes LOW when pressed
if (ELAPSED(ms, next_home_key_ms)) {
next_home_key_ms = ms + HOME_DEBOUNCE_DELAY;
- LCD_MESSAGEPGM(MSG_AUTO_HOME);
+ LCD_MESSAGE(MSG_AUTO_HOME);
queue.inject_P(G28_STR);
}
}
@@ -541,14 +497,14 @@ inline void manage_inactivity(const bool no_stepper_sleep=false) {
if (ELAPSED(ms, next_cub_ms_##N)) { \
next_cub_ms_##N = ms + CUB_DEBOUNCE_DELAY_##N; \
CODE; \
- queue.inject_P(PSTR(BUTTON##N##_GCODE)); \
+ queue.inject(F(BUTTON##N##_GCODE)); \
TERN_(HAS_LCD_MENU, ui.quick_feedback()); \
} \
} \
}while(0)
- #define CHECK_CUSTOM_USER_BUTTON(N) _CHECK_CUSTOM_USER_BUTTON(N, NOOP)
- #define CHECK_BETTER_USER_BUTTON(N) _CHECK_CUSTOM_USER_BUTTON(N, if (strlen(BUTTON##N##_DESC)) LCD_MESSAGEPGM_P(PSTR(BUTTON##N##_DESC)))
+ #define CHECK_CUSTOM_USER_BUTTON(N) _CHECK_CUSTOM_USER_BUTTON(N, NOOP)
+ #define CHECK_BETTER_USER_BUTTON(N) _CHECK_CUSTOM_USER_BUTTON(N, if (strlen(BUTTON##N##_DESC)) LCD_MESSAGE_F(BUTTON##N##_DESC))
#if HAS_BETTER_USER_BUTTON(1)
CHECK_BETTER_USER_BUTTON(1);
@@ -691,13 +647,13 @@ inline void manage_inactivity(const bool no_stepper_sleep=false) {
#if ENABLED(SWITCHING_EXTRUDER)
bool oldstatus;
switch (active_extruder) {
- default: oldstatus = E0_ENABLE_READ(); ENABLE_AXIS_E0(); break;
+ default: oldstatus = stepper.AXIS_IS_ENABLED(E_AXIS, 0); stepper.ENABLE_EXTRUDER(0); break;
#if E_STEPPERS > 1
- case 2: case 3: oldstatus = E1_ENABLE_READ(); ENABLE_AXIS_E1(); break;
+ case 2: case 3: oldstatus = stepper.AXIS_IS_ENABLED(E_AXIS, 1); stepper.ENABLE_EXTRUDER(1); break;
#if E_STEPPERS > 2
- case 4: case 5: oldstatus = E2_ENABLE_READ(); ENABLE_AXIS_E2(); break;
+ case 4: case 5: oldstatus = stepper.AXIS_IS_ENABLED(E_AXIS, 2); stepper.ENABLE_EXTRUDER(2); break;
#if E_STEPPERS > 3
- case 6: case 7: oldstatus = E3_ENABLE_READ(); ENABLE_AXIS_E3(); break;
+ case 6: case 7: oldstatus = stepper.AXIS_IS_ENABLED(E_AXIS, 3); stepper.ENABLE_EXTRUDER(3); break;
#endif // E_STEPPERS > 3
#endif // E_STEPPERS > 2
#endif // E_STEPPERS > 1
@@ -706,7 +662,7 @@ inline void manage_inactivity(const bool no_stepper_sleep=false) {
bool oldstatus;
switch (active_extruder) {
default:
- #define _CASE_EN(N) case N: oldstatus = E##N##_ENABLE_READ(); ENABLE_AXIS_E##N(); break;
+ #define _CASE_EN(N) case N: oldstatus = stepper.AXIS_IS_ENABLED(E_AXIS, N); stepper.ENABLE_EXTRUDER(N); break;
REPEAT(E_STEPPERS, _CASE_EN);
}
#endif
@@ -720,17 +676,17 @@ inline void manage_inactivity(const bool no_stepper_sleep=false) {
#if ENABLED(SWITCHING_EXTRUDER)
switch (active_extruder) {
- default: oldstatus = E0_ENABLE_WRITE(oldstatus); break;
+ default: if (oldstatus) stepper.ENABLE_EXTRUDER(0); else stepper.DISABLE_EXTRUDER(0); break;
#if E_STEPPERS > 1
- case 2: case 3: oldstatus = E1_ENABLE_WRITE(oldstatus); break;
+ case 2: case 3: if (oldstatus) stepper.ENABLE_EXTRUDER(1); else stepper.DISABLE_EXTRUDER(1); break;
#if E_STEPPERS > 2
- case 4: case 5: oldstatus = E2_ENABLE_WRITE(oldstatus); break;
+ case 4: case 5: if (oldstatus) stepper.ENABLE_EXTRUDER(2); else stepper.DISABLE_EXTRUDER(2); break;
#endif // E_STEPPERS > 2
#endif // E_STEPPERS > 1
}
#else // !SWITCHING_EXTRUDER
switch (active_extruder) {
- #define _CASE_RESTORE(N) case N: E##N##_ENABLE_WRITE(oldstatus); break;
+ #define _CASE_RESTORE(N) case N: if (oldstatus) stepper.ENABLE_EXTRUDER(N); else stepper.DISABLE_EXTRUDER(N); break;
REPEAT(E_STEPPERS, _CASE_RESTORE);
}
#endif // !SWITCHING_EXTRUDER
@@ -900,16 +856,16 @@ void idle(bool no_stepper_sleep/*=false*/) {
* Kill all activity and lock the machine.
* After this the machine will need to be reset.
*/
-void kill(PGM_P const lcd_error/*=nullptr*/, PGM_P const lcd_component/*=nullptr*/, const bool steppers_off/*=false*/) {
+void kill(FSTR_P const lcd_error/*=nullptr*/, FSTR_P const lcd_component/*=nullptr*/, const bool steppers_off/*=false*/) {
thermalManager.disable_all_heaters();
TERN_(HAS_CUTTER, cutter.kill()); // Full cutter shutdown including ISR control
// Echo the LCD message to serial for extra context
- if (lcd_error) { SERIAL_ECHO_START(); SERIAL_ECHOLNPGM_P(lcd_error); }
+ if (lcd_error) { SERIAL_ECHO_START(); SERIAL_ECHOLNF(lcd_error); }
#if EITHER(HAS_DISPLAY, DWIN_CREALITY_LCD_ENHANCED)
- ui.kill_screen(lcd_error ?: GET_TEXT(MSG_KILLED), lcd_component ?: NUL_STR);
+ ui.kill_screen(lcd_error ?: GET_TEXT_F(MSG_KILLED), lcd_component ?: FPSTR(NUL_STR));
#else
UNUSED(lcd_error); UNUSED(lcd_component);
#endif
@@ -920,7 +876,7 @@ void kill(PGM_P const lcd_error/*=nullptr*/, PGM_P const lcd_component/*=nullptr
SERIAL_ERROR_MSG(STR_ERR_KILLED);
#ifdef ACTION_ON_KILL
- host_action_kill();
+ hostui.kill();
#endif
minkill(steppers_off);
@@ -942,7 +898,7 @@ void minkill(const bool steppers_off/*=false*/) {
TERN_(HAS_CUTTER, cutter.kill()); // Reiterate cutter shutdown
// Power off all steppers (for M112) or just the E steppers
- steppers_off ? disable_all_steppers() : disable_e_steppers();
+ steppers_off ? stepper.disable_all_steppers() : stepper.disable_e_steppers();
TERN_(PSU_CONTROL, powerManager.power_off());
@@ -983,7 +939,7 @@ void stop() {
if (!IsStopped()) {
SERIAL_ERROR_MSG(STR_ERR_STOPPED);
- LCD_MESSAGEPGM(MSG_STOPPED);
+ LCD_MESSAGE(MSG_STOPPED);
safe_delay(350); // allow enough time for messages to get out before stopping
marlin_state = MF_STOPPED;
}
@@ -1148,6 +1104,10 @@ void setup() {
tmc_standby_setup(); // TMC Low Power Standby pins must be set early or they're not usable
+ // Check startup - does nothing if bootloader sets MCUSR to 0
+ const byte mcu = HAL_get_reset_source();
+ HAL_clear_reset_source();
+
#if ENABLED(MARLIN_DEV_MODE)
auto log_current_ms = [&](PGM_P const msg) {
SERIAL_ECHO_START();
@@ -1276,15 +1236,14 @@ void setup() {
SETUP_RUN(esp_wifi_init());
- // Check startup - does nothing if bootloader sets MCUSR to 0
- const byte mcu = HAL_get_reset_source();
+ // Report Reset Reason
if (mcu & RST_POWER_ON) SERIAL_ECHOLNPGM(STR_POWERUP);
if (mcu & RST_EXTERNAL) SERIAL_ECHOLNPGM(STR_EXTERNAL_RESET);
if (mcu & RST_BROWN_OUT) SERIAL_ECHOLNPGM(STR_BROWNOUT_RESET);
if (mcu & RST_WATCHDOG) SERIAL_ECHOLNPGM(STR_WATCHDOG_RESET);
if (mcu & RST_SOFTWARE) SERIAL_ECHOLNPGM(STR_SOFTWARE_RESET);
- HAL_clear_reset_source();
+ // Identify myself as Marlin x.x.x
SERIAL_ECHOLNPGM("Marlin " SHORT_BUILD_VERSION);
#if defined(STRING_DISTRIBUTION_DATE) && defined(STRING_CONFIG_H_AUTHOR)
SERIAL_ECHO_MSG(
@@ -1569,11 +1528,11 @@ void setup() {
#ifdef STARTUP_COMMANDS
SETUP_LOG("STARTUP_COMMANDS");
- queue.inject_P(PSTR(STARTUP_COMMANDS));
+ queue.inject(F(STARTUP_COMMANDS));
#endif
#if ENABLED(HOST_PROMPT_SUPPORT)
- SETUP_RUN(host_action_prompt_end());
+ SETUP_RUN(hostui.prompt_end());
#endif
#if HAS_TRINAMIC_CONFIG && DISABLED(PSU_DEFAULT_OFF)
@@ -1595,15 +1554,15 @@ void setup() {
#endif
#if HAS_DWIN_E3V2_BASIC
+ SETUP_LOG("E3V2 Init");
Encoder_Configuration();
HMI_Init();
HMI_SetLanguageCache();
HMI_StartFrame(true);
- DWIN_StatusChanged_P(GET_TEXT(WELCOME_MSG));
#endif
#if HAS_SERVICE_INTERVALS && !HAS_DWIN_E3V2_BASIC
- ui.reset_status(true); // Show service messages or keep current status
+ SETUP_RUN(ui.reset_status(true)); // Show service messages or keep current status
#endif
#if ENABLED(MAX7219_DEBUG)
@@ -1634,7 +1593,7 @@ void setup() {
#endif
#if BOTH(HAS_LCD_MENU, TOUCH_SCREEN_CALIBRATION) && EITHER(TFT_CLASSIC_UI, TFT_COLOR_UI)
- ui.check_touch_calibration();
+ SETUP_RUN(ui.check_touch_calibration());
#endif
marlin_state = MF_RUNNING;
diff --git a/Marlin/src/MarlinCore.h b/Marlin/src/MarlinCore.h
index 6428b77398..7063c7e2de 100644
--- a/Marlin/src/MarlinCore.h
+++ b/Marlin/src/MarlinCore.h
@@ -38,16 +38,7 @@ inline void idle_no_sleep() { idle(true); }
extern bool G38_did_trigger; // Flag from the ISR to indicate the endstop changed
#endif
-/**
- * The axis order in all axis related arrays is X, Y, Z, E
- */
-void enable_e_steppers();
-void enable_all_steppers();
-void disable_e_stepper(const uint8_t e);
-void disable_e_steppers();
-void disable_all_steppers();
-
-void kill(PGM_P const lcd_error=nullptr, PGM_P const lcd_component=nullptr, const bool steppers_off=false);
+void kill(FSTR_P const lcd_error=nullptr, FSTR_P const lcd_component=nullptr, const bool steppers_off=false);
void minkill(const bool steppers_off=false);
// Global State of the firmware
diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h
index 46b2e5cf0c..789512c4ef 100644
--- a/Marlin/src/core/boards.h
+++ b/Marlin/src/core/boards.h
@@ -346,15 +346,17 @@
#define BOARD_CREALITY_V431_D 4046 // Creality v4.3.1d (STM32F103RE)
#define BOARD_CREALITY_V452 4047 // Creality v4.5.2 (STM32F103RE)
#define BOARD_CREALITY_V453 4048 // Creality v4.5.3 (STM32F103RE)
-#define BOARD_TRIGORILLA_PRO 4049 // Trigorilla Pro (STM32F103ZET6)
-#define BOARD_FLY_MINI 4050 // FLYmaker FLY MINI (STM32F103RCT6)
-#define BOARD_FLSUN_HISPEED 4051 // FLSUN HiSpeedV1 (STM32F103VET6)
-#define BOARD_BEAST 4052 // STM32F103RET6 Libmaple-based controller
-#define BOARD_MINGDA_MPX_ARM_MINI 4053 // STM32F103ZET6 Mingda MD-16
-#define BOARD_GTM32_PRO_VD 4054 // STM32F103VET6 controller
-#define BOARD_ZONESTAR_ZM3E2 4055 // Zonestar ZM3E2 (STM32F103RCT6)
-#define BOARD_ZONESTAR_ZM3E4 4056 // Zonestar ZM3E4 V1 (STM32F103VCT6)
-#define BOARD_ZONESTAR_ZM3E4V2 4057 // Zonestar ZM3E4 V2 (STM32F103VCT6)
+#define BOARD_CREALITY_V24S1 4049 // Creality v2.4.S1 (STM32F103RE) v101 as found in the Ender 7
+#define BOARD_TRIGORILLA_PRO 4050 // Trigorilla Pro (STM32F103ZET6)
+#define BOARD_FLY_MINI 4051 // FLYmaker FLY MINI (STM32F103RCT6)
+#define BOARD_FLSUN_HISPEED 4052 // FLSUN HiSpeedV1 (STM32F103VET6)
+#define BOARD_BEAST 4053 // STM32F103RET6 Libmaple-based controller
+#define BOARD_MINGDA_MPX_ARM_MINI 4054 // STM32F103ZET6 Mingda MD-16
+#define BOARD_GTM32_PRO_VD 4055 // STM32F103VET6 controller
+#define BOARD_ZONESTAR_ZM3E2 4056 // Zonestar ZM3E2 (STM32F103RCT6)
+#define BOARD_ZONESTAR_ZM3E4 4057 // Zonestar ZM3E4 V1 (STM32F103VCT6)
+#define BOARD_ZONESTAR_ZM3E4V2 4058 // Zonestar ZM3E4 V2 (STM32F103VCT6)
+#define BOARD_ERYONE_ERY32_MINI 4059 // Eryone Ery32 mini (STM32F103VET6)
//
// ARM Cortex-M4F
@@ -384,24 +386,27 @@
#define BOARD_BTT_GTR_V1_0 4214 // BigTreeTech GTR v1.0 (STM32F407IGT)
#define BOARD_BTT_OCTOPUS_V1_0 4215 // BigTreeTech Octopus v1.0 (STM32F446ZET6)
#define BOARD_BTT_OCTOPUS_V1_1 4216 // BigTreeTech Octopus v1.1 (STM32F446ZET6)
-#define BOARD_LERDGE_K 4217 // Lerdge K (STM32F407ZG)
-#define BOARD_LERDGE_S 4218 // Lerdge S (STM32F407VE)
-#define BOARD_LERDGE_X 4219 // Lerdge X (STM32F407VE)
-#define BOARD_VAKE403D 4220 // VAkE 403D (STM32F446VET6)
-#define BOARD_FYSETC_S6 4221 // FYSETC S6 (STM32F446VET6)
-#define BOARD_FYSETC_S6_V2_0 4222 // FYSETC S6 v2.0 (STM32F446VET6)
-#define BOARD_FYSETC_SPIDER 4223 // FYSETC Spider (STM32F446VET6)
-#define BOARD_FLYF407ZG 4224 // FLYmaker FLYF407ZG (STM32F407ZG)
-#define BOARD_MKS_ROBIN2 4225 // MKS_ROBIN2 (STM32F407ZE)
-#define BOARD_MKS_ROBIN_PRO_V2 4226 // MKS Robin Pro V2 (STM32F407VE)
-#define BOARD_MKS_ROBIN_NANO_V3 4227 // MKS Robin Nano V3 (STM32F407VG)
-#define BOARD_MKS_MONSTER8 4228 // MKS Monster8 (STM32F407VGT6)
-#define BOARD_ANET_ET4 4229 // ANET ET4 V1.x (STM32F407VGT6)
-#define BOARD_ANET_ET4P 4230 // ANET ET4P V1.x (STM32F407VGT6)
-#define BOARD_FYSETC_CHEETAH_V20 4231 // FYSETC Cheetah V2.0
-#define BOARD_TH3D_EZBOARD_LITE_V2 4232 // TH3D EZBoard Lite v2.0
-#define BOARD_INDEX_REV03 4233 // Index PnP Controller REV03 (STM32F407VET6/VGT6)
-#define BOARD_MKS_ROBIN_NANO_V1_3_F4 4234 // MKS Robin Nano V1.3 and MKS Robin Nano-S V1.3 (STM32F407VET6)
+#define BOARD_BTT_OCTOPUS_PRO_V1_0 4217 // BigTreeTech Octopus Pro v1.0 (STM32F446ZET6/STM32F429ZGT6)
+#define BOARD_LERDGE_K 4218 // Lerdge K (STM32F407ZG)
+#define BOARD_LERDGE_S 4219 // Lerdge S (STM32F407VE)
+#define BOARD_LERDGE_X 4220 // Lerdge X (STM32F407VE)
+#define BOARD_VAKE403D 4221 // VAkE 403D (STM32F446VET6)
+#define BOARD_FYSETC_S6 4222 // FYSETC S6 (STM32F446VET6)
+#define BOARD_FYSETC_S6_V2_0 4223 // FYSETC S6 v2.0 (STM32F446VET6)
+#define BOARD_FYSETC_SPIDER 4224 // FYSETC Spider (STM32F446VET6)
+#define BOARD_FLYF407ZG 4225 // FLYmaker FLYF407ZG (STM32F407ZG)
+#define BOARD_MKS_ROBIN2 4226 // MKS_ROBIN2 (STM32F407ZE)
+#define BOARD_MKS_ROBIN_PRO_V2 4227 // MKS Robin Pro V2 (STM32F407VE)
+#define BOARD_MKS_ROBIN_NANO_V3 4228 // MKS Robin Nano V3 (STM32F407VG)
+#define BOARD_MKS_MONSTER8 4229 // MKS Monster8 (STM32F407VGT6)
+#define BOARD_ANET_ET4 4230 // ANET ET4 V1.x (STM32F407VGT6)
+#define BOARD_ANET_ET4P 4231 // ANET ET4P V1.x (STM32F407VGT6)
+#define BOARD_FYSETC_CHEETAH_V20 4232 // FYSETC Cheetah V2.0
+#define BOARD_TH3D_EZBOARD_V2 4233 // TH3D EZBoard v2.0
+#define BOARD_INDEX_REV03 4234 // Index PnP Controller REV03 (STM32F407VET6/VGT6)
+#define BOARD_MKS_ROBIN_NANO_V1_3_F4 4235 // MKS Robin Nano V1.3 and MKS Robin Nano-S V1.3 (STM32F407VET6)
+#define BOARD_MKS_EAGLE 4236 // MKS Eagle (STM32F407VET6)
+#define BOARD_ARTILLERY_RUBY 4237 // Artillery Ruby (STM32F401RCT6)
//
// ARM Cortex M7
@@ -421,7 +426,10 @@
#define BOARD_MRR_ESPA 6001 // MRR ESPA based on ESP32 (native pins only)
#define BOARD_MRR_ESPE 6002 // MRR ESPE based on ESP32 (with I2S stepper stream)
#define BOARD_E4D_BOX 6003 // E4d@BOX
-#define BOARD_FYSETC_E4 6004 // FYSETC E4
+#define BOARD_RESP32_CUSTOM 6004 // Rutilea ESP32 custom board
+#define BOARD_FYSETC_E4 6005 // FYSETC E4
+#define BOARD_PANDA_ZHU 6006 // Panda_ZHU
+#define BOARD_PANDA_M4 6007 // Panda_M4
//
// SAMD51 ARM Cortex M4
diff --git a/Marlin/src/core/debug_out.h b/Marlin/src/core/debug_out.h
index 4e30a5306e..eb1c91e507 100644
--- a/Marlin/src/core/debug_out.h
+++ b/Marlin/src/core/debug_out.h
@@ -36,6 +36,8 @@
#undef DEBUG_ECHOLN
#undef DEBUG_ECHOPGM
#undef DEBUG_ECHOLNPGM
+#undef DEBUG_ECHOF
+#undef DEBUG_ECHOLNF
#undef DEBUG_ECHOPGM_P
#undef DEBUG_ECHOLNPGM_P
#undef DEBUG_ECHOPAIR_F
@@ -54,7 +56,7 @@
#if DEBUG_OUT
#include "debug_section.h"
- #define DEBUG_SECTION(N,S,D) SectionLog N(PSTR(S),D)
+ #define DEBUG_SECTION(N,S,D) SectionLog N(F(S),D)
#define DEBUG_ECHO_START SERIAL_ECHO_START
#define DEBUG_ERROR_START SERIAL_ERROR_START
@@ -65,6 +67,8 @@
#define DEBUG_ECHOLN SERIAL_ECHOLN
#define DEBUG_ECHOPGM SERIAL_ECHOPGM
#define DEBUG_ECHOLNPGM SERIAL_ECHOLNPGM
+ #define DEBUG_ECHOF SERIAL_ECHOF
+ #define DEBUG_ECHOLNF SERIAL_ECHOLNF
#define DEBUG_ECHOPGM SERIAL_ECHOPGM
#define DEBUG_ECHOPGM_P SERIAL_ECHOPGM_P
#define DEBUG_ECHOPAIR_F SERIAL_ECHOPAIR_F
@@ -94,6 +98,8 @@
#define DEBUG_ECHOLN(...) NOOP
#define DEBUG_ECHOPGM(...) NOOP
#define DEBUG_ECHOLNPGM(...) NOOP
+ #define DEBUG_ECHOF(...) NOOP
+ #define DEBUG_ECHOLNF(...) NOOP
#define DEBUG_ECHOPGM_P(...) NOOP
#define DEBUG_ECHOLNPGM_P(...) NOOP
#define DEBUG_ECHOPAIR_F(...) NOOP
diff --git a/Marlin/src/core/debug_section.h b/Marlin/src/core/debug_section.h
index ef1511e6f0..6e23d9e4ed 100644
--- a/Marlin/src/core/debug_section.h
+++ b/Marlin/src/core/debug_section.h
@@ -26,22 +26,22 @@
class SectionLog {
public:
- SectionLog(PGM_P const msg=nullptr, bool inbug=true) {
- the_msg = msg;
- if ((debug = inbug)) echo_msg(PSTR(">>>"));
+ SectionLog(FSTR_P const fmsg=nullptr, bool inbug=true) {
+ the_msg = fmsg;
+ if ((debug = inbug)) echo_msg(F(">>>"));
}
- ~SectionLog() { if (debug) echo_msg(PSTR("<<<")); }
+ ~SectionLog() { if (debug) echo_msg(F("<<<")); }
private:
- PGM_P the_msg;
+ FSTR_P the_msg;
bool debug;
- void echo_msg(PGM_P const pre) {
- SERIAL_ECHOPGM_P(pre);
+ void echo_msg(FSTR_P const fpre) {
+ SERIAL_ECHOF(fpre);
if (the_msg) {
SERIAL_CHAR(' ');
- SERIAL_ECHOPGM_P(the_msg);
+ SERIAL_ECHOF(the_msg);
}
SERIAL_CHAR(' ');
print_pos(current_position);
diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h
index 3341656671..03bffb8bd9 100644
--- a/Marlin/src/core/language.h
+++ b/Marlin/src/core/language.h
@@ -48,8 +48,8 @@
// cz Czech
// da Danish
// de German
-// el Greek
-// el_gr Greek (Greece)
+// el Greek (Greece)
+// el_CY Greek (Cyprus)
// en English
// es Spanish
// eu Basque-Euskera
@@ -165,6 +165,7 @@
#define STR_SAVED_POS "Position saved"
#define STR_RESTORING_POS "Restoring position"
#define STR_INVALID_POS_SLOT "Invalid slot. Total: "
+#define STR_DONE "Done."
#define STR_SD_CANT_OPEN_SUBDIR "Cannot open subdir "
#define STR_SD_INIT_FAIL "No SD card"
@@ -263,9 +264,10 @@
// Settings Report Strings
#define STR_Z_AUTO_ALIGN "Z Auto-Align"
#define STR_BACKLASH_COMPENSATION "Backlash compensation"
-#define STR_DELTA_SETTINGS "Delta settings (L R H S XYZ ABC)"
-#define STR_SCARA_SETTINGS "SCARA settings"
-#define STR_SCARA_S "S"
+#define STR_S_SEG_PER_SEC "S"
+#define STR_DELTA_SETTINGS "Delta (L R H S XYZ ABC)"
+#define STR_SCARA_SETTINGS "SCARA"
+#define STR_POLARGRAPH_SETTINGS "Polargraph"
#define STR_SCARA_P_T_Z "P T Z"
#define STR_ENDSTOP_ADJUSTMENT "Endstop adjustment"
#define STR_SKEW_FACTOR "Skew Factor"
diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h
index 0174e21add..62675d1319 100644
--- a/Marlin/src/core/macros.h
+++ b/Marlin/src/core/macros.h
@@ -33,32 +33,38 @@
#define _AXIS(A) (A##_AXIS)
-#define _XMIN_ 100
-#define _YMIN_ 200
-#define _ZMIN_ 300
-#define _IMIN_ 500
-#define _JMIN_ 600
-#define _KMIN_ 700
-#define _XMAX_ 101
-#define _YMAX_ 201
-#define _ZMAX_ 301
-#define _IMAX_ 501
-#define _JMAX_ 601
-#define _KMAX_ 701
-#define _XDIAG_ 102
-#define _YDIAG_ 202
-#define _ZDIAG_ 302
-#define _IDIAG_ 502
-#define _JDIAG_ 602
-#define _KDIAG_ 702
-#define _E0DIAG_ 400
-#define _E1DIAG_ 401
-#define _E2DIAG_ 402
-#define _E3DIAG_ 403
-#define _E4DIAG_ 404
-#define _E5DIAG_ 405
-#define _E6DIAG_ 406
-#define _E7DIAG_ 407
+#define _XSTOP_ 0x01
+#define _YSTOP_ 0x02
+#define _ZSTOP_ 0x03
+#define _ISTOP_ 0x04
+#define _JSTOP_ 0x05
+#define _KSTOP_ 0x06
+#define _XMIN_ 0x11
+#define _YMIN_ 0x12
+#define _ZMIN_ 0x13
+#define _IMIN_ 0x14
+#define _JMIN_ 0x15
+#define _KMIN_ 0x16
+#define _XMAX_ 0x21
+#define _YMAX_ 0x22
+#define _ZMAX_ 0x23
+#define _IMAX_ 0x24
+#define _JMAX_ 0x25
+#define _KMAX_ 0x26
+#define _XDIAG_ 0x31
+#define _YDIAG_ 0x32
+#define _ZDIAG_ 0x33
+#define _IDIAG_ 0x34
+#define _JDIAG_ 0x35
+#define _KDIAG_ 0x36
+#define _E0DIAG_ 0xE0
+#define _E1DIAG_ 0xE1
+#define _E2DIAG_ 0xE2
+#define _E3DIAG_ 0xE3
+#define _E4DIAG_ 0xE4
+#define _E5DIAG_ 0xE5
+#define _E6DIAG_ 0xE6
+#define _E7DIAG_ 0xE7
#define _FORCE_INLINE_ __attribute__((__always_inline__)) __inline__
#define FORCE_INLINE __attribute__((always_inline)) inline
@@ -160,7 +166,7 @@
#endif
-// Macros to chain up to 14 conditions
+// Macros to chain up to 40 conditions
#define _DO_1(W,C,A) (_##W##_1(A))
#define _DO_2(W,C,A,B) (_##W##_1(A) C _##W##_1(B))
#define _DO_3(W,C,A,V...) (_##W##_1(A) C _DO_2(W,C,V))
@@ -176,6 +182,31 @@
#define _DO_13(W,C,A,V...) (_##W##_1(A) C _DO_12(W,C,V))
#define _DO_14(W,C,A,V...) (_##W##_1(A) C _DO_13(W,C,V))
#define _DO_15(W,C,A,V...) (_##W##_1(A) C _DO_14(W,C,V))
+#define _DO_16(W,C,A,V...) (_##W##_1(A) C _DO_15(W,C,V))
+#define _DO_17(W,C,A,V...) (_##W##_1(A) C _DO_16(W,C,V))
+#define _DO_18(W,C,A,V...) (_##W##_1(A) C _DO_17(W,C,V))
+#define _DO_19(W,C,A,V...) (_##W##_1(A) C _DO_18(W,C,V))
+#define _DO_20(W,C,A,V...) (_##W##_1(A) C _DO_19(W,C,V))
+#define _DO_21(W,C,A,V...) (_##W##_1(A) C _DO_20(W,C,V))
+#define _DO_22(W,C,A,V...) (_##W##_1(A) C _DO_21(W,C,V))
+#define _DO_23(W,C,A,V...) (_##W##_1(A) C _DO_22(W,C,V))
+#define _DO_24(W,C,A,V...) (_##W##_1(A) C _DO_23(W,C,V))
+#define _DO_25(W,C,A,V...) (_##W##_1(A) C _DO_24(W,C,V))
+#define _DO_26(W,C,A,V...) (_##W##_1(A) C _DO_25(W,C,V))
+#define _DO_27(W,C,A,V...) (_##W##_1(A) C _DO_26(W,C,V))
+#define _DO_28(W,C,A,V...) (_##W##_1(A) C _DO_27(W,C,V))
+#define _DO_29(W,C,A,V...) (_##W##_1(A) C _DO_28(W,C,V))
+#define _DO_30(W,C,A,V...) (_##W##_1(A) C _DO_29(W,C,V))
+#define _DO_31(W,C,A,V...) (_##W##_1(A) C _DO_30(W,C,V))
+#define _DO_32(W,C,A,V...) (_##W##_1(A) C _DO_31(W,C,V))
+#define _DO_33(W,C,A,V...) (_##W##_1(A) C _DO_32(W,C,V))
+#define _DO_34(W,C,A,V...) (_##W##_1(A) C _DO_33(W,C,V))
+#define _DO_35(W,C,A,V...) (_##W##_1(A) C _DO_34(W,C,V))
+#define _DO_36(W,C,A,V...) (_##W##_1(A) C _DO_35(W,C,V))
+#define _DO_37(W,C,A,V...) (_##W##_1(A) C _DO_36(W,C,V))
+#define _DO_38(W,C,A,V...) (_##W##_1(A) C _DO_37(W,C,V))
+#define _DO_39(W,C,A,V...) (_##W##_1(A) C _DO_38(W,C,V))
+#define _DO_40(W,C,A,V...) (_##W##_1(A) C _DO_39(W,C,V))
#define __DO_N(W,C,N,V...) _DO_##N(W,C,V)
#define _DO_N(W,C,N,V...) __DO_N(W,C,N,V)
#define DO(W,C,V...) (_DO_N(W,C,NUM_ARGS(V),V))
@@ -251,6 +282,13 @@
memcpy(&a[0],&b[0],_MIN(sizeof(a),sizeof(b))); \
}while(0)
+#define CODE_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 CODE_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 CODE_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 CODE_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 CODE_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 CODE_11( A,B,C,D,E,F,G,H,I,J,K,...) A; B; C; D; E; F; G; H; I; J; K
+#define CODE_10( A,B,C,D,E,F,G,H,I,J,...) A; B; C; D; E; F; G; H; I; J
#define CODE_9( A,B,C,D,E,F,G,H,I,...) A; B; C; D; E; F; G; H; I
#define CODE_8( A,B,C,D,E,F,G,H,...) A; B; C; D; E; F; G; H
#define CODE_7( A,B,C,D,E,F,G,...) A; B; C; D; E; F; G
@@ -286,6 +324,10 @@
#define GANG_N_1(N,K) _GANG_N(N,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K)
// Macros for initializing arrays
+#define LIST_20(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T
+#define LIST_19(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S
+#define LIST_18(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R
+#define LIST_17(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q
#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
@@ -502,6 +544,11 @@
#define INC_13 14
#define INC_14 15
#define INC_15 16
+#define INC_16 17
+#define INC_17 18
+#define INC_18 19
+#define INC_19 20
+#define INC_20 21
#define INCREMENT_(n) INC_##n
#define INCREMENT(n) INCREMENT_(n)
diff --git a/Marlin/src/core/multi_language.h b/Marlin/src/core/multi_language.h
index 5063faf60c..2106f946ac 100644
--- a/Marlin/src/core/multi_language.h
+++ b/Marlin/src/core/multi_language.h
@@ -1,28 +1,35 @@
-/********************
- * 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: . *
- ****************************************************************************/
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
#pragma once
+/*******************************************************
+ * multi_language.h *
+ * By Marcio Teixeira 2019 for Aleph Objects *
+ *******************************************************/
+
#include "../inc/MarlinConfigPre.h"
typedef const char Language_Str[];
+#define LSTR PROGMEM Language_Str
#ifdef LCD_LANGUAGE_5
#define NUM_LANGUAGES 5
@@ -71,7 +78,7 @@ typedef const char Language_Str[];
#define GET_TEXT(MSG) GET_LANG(LCD_LANGUAGE)::MSG
#define MAX_LANG_CHARSIZE LANG_CHARSIZE
#endif
-#define GET_TEXT_F(MSG) (const __FlashStringHelper*)GET_TEXT(MSG)
+#define GET_TEXT_F(MSG) FPSTR(GET_TEXT(MSG))
#define GET_LANGUAGE_NAME(INDEX) GET_LANG(LCD_LANGUAGE_##INDEX)::LANGUAGE
#define LANG_CHARSIZE GET_TEXT(CHARSIZE)
diff --git a/Marlin/src/core/serial.cpp b/Marlin/src/core/serial.cpp
index 8c9f4a8e4d..9cd862df70 100644
--- a/Marlin/src/core/serial.cpp
+++ b/Marlin/src/core/serial.cpp
@@ -69,23 +69,23 @@ PGMSTR(SP_I_LBL, " " AXIS4_STR ":"); PGMSTR(SP_J_LBL, " " AXIS5_STR ":"); PGMSTR
#endif
-void serialprintPGM(PGM_P str) {
+void serial_print_P(PGM_P str) {
while (const char c = pgm_read_byte(str++)) SERIAL_CHAR(c);
}
-void serial_echo_start() { static PGMSTR(echomagic, "echo:"); serialprintPGM(echomagic); }
-void serial_error_start() { static PGMSTR(errormagic, "Error:"); serialprintPGM(errormagic); }
+void serial_echo_start() { static PGMSTR(echomagic, "echo:"); serial_print_P(echomagic); }
+void serial_error_start() { static PGMSTR(errormagic, "Error:"); serial_print_P(errormagic); }
void serial_spaces(uint8_t count) { count *= (PROPORTIONAL_FONT_RATIO); while (count--) SERIAL_CHAR(' '); }
-void serial_ternary(const bool onoff, PGM_P const pre, PGM_P const on, PGM_P const off, PGM_P const post/*=nullptr*/) {
- if (pre) serialprintPGM(pre);
- serialprintPGM(onoff ? on : off);
- if (post) serialprintPGM(post);
+void serial_ternary(const bool onoff, FSTR_P const pre, FSTR_P const on, FSTR_P const off, FSTR_P const post/*=nullptr*/) {
+ if (pre) serial_print(pre);
+ serial_print(onoff ? on : off);
+ if (post) serial_print(post);
}
-void serialprint_onoff(const bool onoff) { serialprintPGM(onoff ? PSTR(STR_ON) : PSTR(STR_OFF)); }
+void serialprint_onoff(const bool onoff) { serial_print(onoff ? F(STR_ON) : F(STR_OFF)); }
void serialprintln_onoff(const bool onoff) { serialprint_onoff(onoff); SERIAL_EOL(); }
-void serialprint_truefalse(const bool tf) { serialprintPGM(tf ? PSTR("true") : PSTR("false")); }
+void serialprint_truefalse(const bool tf) { serial_print(tf ? F("true") : F("false")); }
void print_bin(uint16_t val) {
for (uint8_t i = 16; i--;) {
@@ -94,10 +94,10 @@ void print_bin(uint16_t val) {
}
}
-void print_pos(LINEAR_AXIS_ARGS(const_float_t), PGM_P const prefix/*=nullptr*/, PGM_P const suffix/*=nullptr*/) {
- if (prefix) serialprintPGM(prefix);
+void print_pos(LINEAR_AXIS_ARGS(const_float_t), FSTR_P const prefix/*=nullptr*/, FSTR_P const suffix/*=nullptr*/) {
+ if (prefix) serial_print(prefix);
SERIAL_ECHOPGM_P(
LIST_N(DOUBLE(LINEAR_AXES), SP_X_STR, x, SP_Y_STR, y, SP_Z_STR, z, SP_I_STR, i, SP_J_STR, j, SP_K_STR, k)
);
- if (suffix) serialprintPGM(suffix); else SERIAL_EOL();
+ if (suffix) serial_print(suffix); else SERIAL_EOL();
}
diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h
index 05d80a4829..aee4d4d43d 100644
--- a/Marlin/src/core/serial.h
+++ b/Marlin/src/core/serial.h
@@ -87,7 +87,7 @@ extern uint8_t marlin_debug_flags;
// interface with the ability to output to multiple serial ports.
#if HAS_MULTI_SERIAL
#define _PORT_REDIRECT(n,p) REMEMBER(n,multiSerial.portMask,p)
- #define _PORT_RESTORE(n,p) RESTORE(n)
+ #define _PORT_RESTORE(n) RESTORE(n)
#define SERIAL_ASSERT(P) if (multiSerial.portMask!=(P)) { debugger(); }
// If we have a catchall, use that directly
#ifdef SERIAL_CATCHALL
@@ -167,13 +167,10 @@ inline void SERIAL_ECHO(serial_char_t x) { SERIAL_IMPL.write(x.c); }
#define AS_CHAR(C) serial_char_t(C)
#define AS_DIGIT(C) AS_CHAR('0' + (C))
-// SERIAL_ECHO_F prints a floating point value with optional precision
-inline void SERIAL_ECHO_F(EnsureDouble x, int digit=2) { SERIAL_IMPL.print(x, digit); }
-
template
void SERIAL_ECHOLN(T x) { SERIAL_IMPL.println(x); }
-// SERIAL_PRINT works like SERIAL_ECHO but allow to specify the encoding base of the number printed
+// SERIAL_PRINT works like SERIAL_ECHO but also takes the numeric base
template
void SERIAL_PRINT(T x, U y) { SERIAL_IMPL.print(x, y); }
@@ -184,8 +181,20 @@ void SERIAL_PRINTLN(T x, PrintBase y) { SERIAL_IMPL.println(x, y); }
inline void SERIAL_FLUSH() { SERIAL_IMPL.flush(); }
inline void SERIAL_FLUSHTX() { SERIAL_IMPL.flushTX(); }
-// Print a single PROGMEM string to serial
-void serialprintPGM(PGM_P str);
+// Serial echo and error prefixes
+#define SERIAL_ECHO_START() serial_echo_start()
+#define SERIAL_ERROR_START() serial_error_start()
+
+// Serial end-of-line
+#define SERIAL_EOL() SERIAL_CHAR('\n')
+
+// Print a single PROGMEM, PGM_P, or PSTR() string.
+void serial_print_P(PGM_P str);
+inline void serial_println_P(PGM_P str) { serial_print_P(str); SERIAL_EOL(); }
+
+// Print a single FSTR_P, F(), or FPSTR() string.
+inline void serial_print(FSTR_P const fstr) { serial_print_P(FTOP(fstr)); }
+inline void serial_println(FSTR_P const fstr) { serial_println_P(FTOP(fstr)); }
//
// SERIAL_ECHOPGM... macros are used to output string-value pairs.
@@ -195,8 +204,8 @@ void serialprintPGM(PGM_P str);
#define __SEP_N(N,V...) _SEP_##N(V)
#define _SEP_N(N,V...) __SEP_N(N,V)
#define _SEP_N_REF() _SEP_N
-#define _SEP_1(s) serialprintPGM(PSTR(s));
-#define _SEP_2(s,v) serial_echopair_PGM(PSTR(s),v);
+#define _SEP_1(s) serial_print(F(s));
+#define _SEP_2(s,v) serial_echopair(F(s),v);
#define _SEP_3(s,v,V...) _SEP_2(s,v); DEFER2(_SEP_N_REF)()(TWO_ARGS(V),V);
#define SERIAL_ECHOPGM(V...) do{ EVAL(_SEP_N(TWO_ARGS(V),V)); }while(0)
@@ -204,8 +213,8 @@ void serialprintPGM(PGM_P str);
#define __SELP_N(N,V...) _SELP_##N(V)
#define _SELP_N(N,V...) __SELP_N(N,V)
#define _SELP_N_REF() _SELP_N
-#define _SELP_1(s) serialprintPGM(PSTR(s "\n"));
-#define _SELP_2(s,v) serial_echopair_PGM(PSTR(s),v); SERIAL_EOL();
+#define _SELP_1(s) serial_print(F(s "\n"));
+#define _SELP_2(s,v) serial_echolnpair(F(s),v);
#define _SELP_3(s,v,V...) _SEP_2(s,v); DEFER2(_SELP_N_REF)()(TWO_ARGS(V),V);
#define SERIAL_ECHOLNPGM(V...) do{ EVAL(_SELP_N(TWO_ARGS(V),V)); }while(0)
@@ -213,8 +222,8 @@ void serialprintPGM(PGM_P str);
#define __SEP_N_P(N,V...) _SEP_##N##_P(V)
#define _SEP_N_P(N,V...) __SEP_N_P(N,V)
#define _SEP_N_P_REF() _SEP_N_P
-#define _SEP_1_P(p) serialprintPGM(p);
-#define _SEP_2_P(p,v) serial_echopair_PGM(p,v);
+#define _SEP_1_P(p) serial_print_P(p);
+#define _SEP_2_P(p,v) serial_echopair_P(p,v);
#define _SEP_3_P(p,v,V...) _SEP_2_P(p,v); DEFER2(_SEP_N_P_REF)()(TWO_ARGS(V),V);
#define SERIAL_ECHOPGM_P(V...) do{ EVAL(_SEP_N_P(TWO_ARGS(V),V)); }while(0)
@@ -222,11 +231,29 @@ void serialprintPGM(PGM_P str);
#define __SELP_N_P(N,V...) _SELP_##N##_P(V)
#define _SELP_N_P(N,V...) __SELP_N_P(N,V)
#define _SELP_N_P_REF() _SELP_N_P
-#define _SELP_1_P(p) { serialprintPGM(p); SERIAL_EOL(); }
-#define _SELP_2_P(p,v) { serial_echopair_PGM(p,v); SERIAL_EOL(); }
+#define _SELP_1_P(p) serial_println_P(p)
+#define _SELP_2_P(p,v) serial_echolnpair_P(p,v)
#define _SELP_3_P(p,v,V...) { _SEP_2_P(p,v); DEFER2(_SELP_N_P_REF)()(TWO_ARGS(V),V); }
#define SERIAL_ECHOLNPGM_P(V...) do{ EVAL(_SELP_N_P(TWO_ARGS(V),V)); }while(0)
+// Print up to 20 pairs of values. Odd elements must be FSTR_P, F(), or FPSTR().
+#define __SEP_N_F(N,V...) _SEP_##N##_F(V)
+#define _SEP_N_F(N,V...) __SEP_N_F(N,V)
+#define _SEP_N_F_REF() _SEP_N_F
+#define _SEP_1_F(p) serial_print(p);
+#define _SEP_2_F(p,v) serial_echopair(p,v);
+#define _SEP_3_F(p,v,V...) _SEP_2_F(p,v); DEFER2(_SEP_N_F_REF)()(TWO_ARGS(V),V);
+#define SERIAL_ECHOF(V...) do{ EVAL(_SEP_N_F(TWO_ARGS(V),V)); }while(0)
+
+// Print up to 20 pairs of values followed by newline. Odd elements must be FSTR_P, F(), or FPSTR().
+#define __SELP_N_F(N,V...) _SELP_##N##_F(V)
+#define _SELP_N_F(N,V...) __SELP_N_F(N,V)
+#define _SELP_N_F_REF() _SELP_N_F
+#define _SELP_1_F(p) serial_println(p)
+#define _SELP_2_F(p,v) serial_echolnpair(p,v)
+#define _SELP_3_F(p,v,V...) { _SEP_2_F(p,v); DEFER2(_SELP_N_F_REF)()(TWO_ARGS(V),V); }
+#define SERIAL_ECHOLNF(V...) do{ EVAL(_SELP_N_F(TWO_ARGS(V),V)); }while(0)
+
#ifdef AllowDifferentTypeInList
inline void SERIAL_ECHOLIST_IMPL() {}
@@ -236,47 +263,49 @@ void serialprintPGM(PGM_P str);
template
void SERIAL_ECHOLIST_IMPL(T && t, Args && ... args) {
SERIAL_IMPL.print(t);
- serialprintPGM(PSTR(", "));
+ serial_print(F(", "));
SERIAL_ECHOLIST_IMPL(args...);
}
template
- void SERIAL_ECHOLIST(PGM_P const str, Args && ... args) {
- SERIAL_IMPL.print(str);
+ void SERIAL_ECHOLIST(FSTR_P const str, Args && ... args) {
+ SERIAL_IMPL.print(FTOP(str));
SERIAL_ECHOLIST_IMPL(args...);
}
#else // Optimization if the listed type are all the same (seems to be the case in the codebase so use that instead)
template
- void SERIAL_ECHOLIST(PGM_P const str, Args && ... args) {
- serialprintPGM(str);
+ void SERIAL_ECHOLIST(FSTR_P const fstr, Args && ... args) {
+ serial_print(fstr);
typename Private::first_type_of::type values[] = { args... };
constexpr size_t argsSize = sizeof...(args);
for (size_t i = 0; i < argsSize; i++) {
- if (i) serialprintPGM(PSTR(", "));
+ if (i) serial_print(F(", "));
SERIAL_IMPL.print(values[i]);
}
}
#endif
-#define SERIAL_ECHOPAIR_F_P(P,V...) do{ serialprintPGM(P); SERIAL_ECHO_F(V); }while(0)
-#define SERIAL_ECHOLNPAIR_F_P(V...) do{ SERIAL_ECHOPAIR_F_P(V); SERIAL_EOL(); }while(0)
+// SERIAL_ECHO_F prints a floating point value with optional precision
+inline void SERIAL_ECHO_F(EnsureDouble x, int digit=2) { SERIAL_IMPL.print(x, digit); }
-#define SERIAL_ECHOPAIR_F(S,V...) SERIAL_ECHOPAIR_F_P(PSTR(S),V)
-#define SERIAL_ECHOLNPAIR_F(V...) do{ SERIAL_ECHOPAIR_F(V); SERIAL_EOL(); }while(0)
+#define SERIAL_ECHOPAIR_F_P(P,V...) do{ serial_print_P(P); SERIAL_ECHO_F(V); }while(0)
+#define SERIAL_ECHOLNPAIR_F_P(P,V...) do{ SERIAL_ECHOPAIR_F_P(P,V); SERIAL_EOL(); }while(0)
-#define SERIAL_ECHO_START() serial_echo_start()
-#define SERIAL_ERROR_START() serial_error_start()
-#define SERIAL_EOL() SERIAL_CHAR('\n')
+#define SERIAL_ECHOPAIR_F_F(S,V...) do{ serial_print(S); SERIAL_ECHO_F(V); }while(0)
+#define SERIAL_ECHOLNPAIR_F_F(S,V...) do{ SERIAL_ECHOPAIR_F_F(S,V); SERIAL_EOL(); }while(0)
-#define SERIAL_ECHO_MSG(V...) do{ SERIAL_ECHO_START(); SERIAL_ECHOLNPGM(V); }while(0)
-#define SERIAL_ERROR_MSG(V...) do{ SERIAL_ERROR_START(); SERIAL_ECHOLNPGM(V); }while(0)
+#define SERIAL_ECHOPAIR_F(S,V...) SERIAL_ECHOPAIR_F_F(F(S),V)
+#define SERIAL_ECHOLNPAIR_F(V...) do{ SERIAL_ECHOPAIR_F(V); SERIAL_EOL(); }while(0)
-#define SERIAL_ECHO_SP(C) serial_spaces(C)
+#define SERIAL_ECHO_MSG(V...) do{ SERIAL_ECHO_START(); SERIAL_ECHOLNPGM(V); }while(0)
+#define SERIAL_ERROR_MSG(V...) do{ SERIAL_ERROR_START(); SERIAL_ECHOLNPGM(V); }while(0)
-#define SERIAL_ECHO_TERNARY(TF, PRE, ON, OFF, POST) serial_ternary(TF, PSTR(PRE), PSTR(ON), PSTR(OFF), PSTR(POST))
+#define SERIAL_ECHO_SP(C) serial_spaces(C)
+
+#define SERIAL_ECHO_TERNARY(TF, PRE, ON, OFF, POST) serial_ternary(TF, F(PRE), F(ON), F(OFF), F(POST))
#if SERIAL_FLOAT_PRECISION
#define SERIAL_DECIMAL(V) SERIAL_PRINT(V, SERIAL_FLOAT_PRECISION)
@@ -287,33 +316,42 @@ void serialprintPGM(PGM_P str);
//
// Functions for serial printing from PROGMEM. (Saves loads of SRAM.)
//
-inline void serial_echopair_PGM(PGM_P const s_P, serial_char_t v) { serialprintPGM(s_P); SERIAL_CHAR(v.c); }
-
-inline void serial_echopair_PGM(PGM_P const s_P, float v) { serialprintPGM(s_P); SERIAL_DECIMAL(v); }
-inline void serial_echopair_PGM(PGM_P const s_P, double v) { serialprintPGM(s_P); SERIAL_DECIMAL(v); }
-inline void serial_echopair_PGM(PGM_P const s_P, const char *v) { serialprintPGM(s_P); SERIAL_ECHO(v); }
+inline void serial_echopair_P(PGM_P const pstr, serial_char_t v) { serial_print_P(pstr); SERIAL_CHAR(v.c); }
+inline void serial_echopair_P(PGM_P const pstr, float v) { serial_print_P(pstr); SERIAL_DECIMAL(v); }
+inline void serial_echopair_P(PGM_P const pstr, double v) { serial_print_P(pstr); SERIAL_DECIMAL(v); }
+//inline void serial_echopair_P(PGM_P const pstr, const char *v) { serial_print_P(pstr); SERIAL_ECHO(v); }
+inline void serial_echopair_P(PGM_P const pstr, FSTR_P v) { serial_print_P(pstr); SERIAL_ECHOF(v); }
// Default implementation for types without a specialization. Handles integers.
template
-void serial_echopair_PGM(PGM_P const s_P, T v) { serialprintPGM(s_P); SERIAL_ECHO(v); }
+inline void serial_echopair_P(PGM_P const pstr, T v) { serial_print_P(pstr); SERIAL_ECHO(v); }
-inline void serial_echopair_PGM(PGM_P const s_P, bool v) { serial_echopair_PGM(s_P, (int)v); }
-inline void serial_echopair_PGM(PGM_P const s_P, void *v) { serial_echopair_PGM(s_P, (uintptr_t)v); }
+// Add a newline.
+template
+inline void serial_echolnpair_P(PGM_P const pstr, T v) { serial_echopair_P(pstr, v); SERIAL_EOL(); }
+
+// Catch-all for __FlashStringHelper *
+template
+inline void serial_echopair(FSTR_P const fstr, T v) { serial_echopair_P(FTOP(fstr), v); }
+
+// Add a newline to the serial output
+template
+inline void serial_echolnpair(FSTR_P const fstr, T v) { serial_echolnpair_P(FTOP(fstr), v); }
void serial_echo_start();
void serial_error_start();
-void serial_ternary(const bool onoff, PGM_P const pre, PGM_P const on, PGM_P const off, PGM_P const post=nullptr);
+void serial_ternary(const bool onoff, FSTR_P const pre, FSTR_P const on, FSTR_P const off, FSTR_P const post=nullptr);
void serialprint_onoff(const bool onoff);
void serialprintln_onoff(const bool onoff);
void serialprint_truefalse(const bool tf);
void serial_spaces(uint8_t count);
void print_bin(const uint16_t val);
-void print_pos(LINEAR_AXIS_ARGS(const_float_t), PGM_P const prefix=nullptr, PGM_P const suffix=nullptr);
+void print_pos(LINEAR_AXIS_ARGS(const_float_t), FSTR_P const prefix=nullptr, FSTR_P const suffix=nullptr);
-inline void print_pos(const xyz_pos_t &xyz, PGM_P const prefix=nullptr, PGM_P const suffix=nullptr) {
+inline void print_pos(const xyz_pos_t &xyz, FSTR_P const prefix=nullptr, FSTR_P const suffix=nullptr) {
print_pos(LINEAR_AXIS_ELEM(xyz), prefix, suffix);
}
-#define SERIAL_POS(SUFFIX,VAR) do { print_pos(VAR, PSTR(" " STRINGIFY(VAR) "="), PSTR(" : " SUFFIX "\n")); }while(0)
-#define SERIAL_XYZ(PREFIX,V...) do { print_pos(V, PSTR(PREFIX), nullptr); }while(0)
+#define SERIAL_POS(SUFFIX,VAR) do { print_pos(VAR, F(" " STRINGIFY(VAR) "="), F(" : " SUFFIX "\n")); }while(0)
+#define SERIAL_XYZ(PREFIX,V...) do { print_pos(V, F(PREFIX)); }while(0)
diff --git a/Marlin/src/core/types.h b/Marlin/src/core/types.h
index 372b4b1e66..72099fb408 100644
--- a/Marlin/src/core/types.h
+++ b/Marlin/src/core/types.h
@@ -26,9 +26,6 @@
#include "../inc/MarlinConfigPre.h"
-class __FlashStringHelper;
-typedef const __FlashStringHelper *progmem_str;
-
//
// Conditional type assignment magic. For example...
//
diff --git a/Marlin/src/core/utility.cpp b/Marlin/src/core/utility.cpp
index 8aeec89f02..b70e2fa9a9 100644
--- a/Marlin/src/core/utility.cpp
+++ b/Marlin/src/core/utility.cpp
@@ -92,9 +92,9 @@ void safe_delay(millis_t ms) {
SERIAL_ECHOPGM(" (Aligned With");
if (probe.offset_xy.y > 0)
- SERIAL_ECHOPGM_P(ENABLED(IS_SCARA) ? PSTR("-Distal") : PSTR("-Back"));
+ SERIAL_ECHOF(F(TERN(IS_SCARA, "-Distal", "-Back")));
else if (probe.offset_xy.y < 0)
- SERIAL_ECHOPGM_P(ENABLED(IS_SCARA) ? PSTR("-Proximal") : PSTR("-Front"));
+ SERIAL_ECHOF(F(TERN(IS_SCARA, "-Proximal", "-Front")));
else if (probe.offset_xy.x != 0)
SERIAL_ECHOPGM("-Center");
@@ -102,7 +102,7 @@ void safe_delay(millis_t ms) {
#endif
- SERIAL_ECHOPGM_P(probe.offset.z < 0 ? PSTR("Below") : probe.offset.z > 0 ? PSTR("Above") : PSTR("Same Z as"));
+ SERIAL_ECHOF(probe.offset.z < 0 ? F("Below") : probe.offset.z > 0 ? F("Above") : F("Same Z as"));
SERIAL_ECHOLNPGM(" Nozzle)");
#endif
diff --git a/Marlin/src/feature/backlash.cpp b/Marlin/src/feature/backlash.cpp
index 23dc973049..b646e19f15 100644
--- a/Marlin/src/feature/backlash.cpp
+++ b/Marlin/src/feature/backlash.cpp
@@ -60,9 +60,9 @@ Backlash backlash;
* spread over multiple segments, smoothing out artifacts even more.
*/
-void Backlash::add_correction_steps(const int32_t &da, const int32_t &db, const int32_t &dc, const uint8_t dm, block_t * const block) {
- static uint8_t last_direction_bits;
- uint8_t changed_dir = last_direction_bits ^ dm;
+void Backlash::add_correction_steps(const int32_t &da, const int32_t &db, const int32_t &dc, const axis_bits_t dm, block_t * const block) {
+ static axis_bits_t last_direction_bits;
+ axis_bits_t changed_dir = last_direction_bits ^ dm;
// Ignore direction change unless steps are taken in that direction
#if DISABLED(CORE_BACKLASH) || ENABLED(MARKFORGED_XY)
if (!da) CBI(changed_dir, X_AXIS);
diff --git a/Marlin/src/feature/backlash.h b/Marlin/src/feature/backlash.h
index 500168b380..4d4e294038 100644
--- a/Marlin/src/feature/backlash.h
+++ b/Marlin/src/feature/backlash.h
@@ -71,7 +71,7 @@ public:
return has_measurement(X_AXIS) || has_measurement(Y_AXIS) || has_measurement(Z_AXIS);
}
- void add_correction_steps(const int32_t &da, const int32_t &db, const int32_t &dc, const uint8_t dm, block_t * const block);
+ void add_correction_steps(const int32_t &da, const int32_t &db, const int32_t &dc, const axis_bits_t dm, block_t * const block);
};
extern Backlash backlash;
diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.cpp b/Marlin/src/feature/bedlevel/ubl/ubl.cpp
index 00cb5ed738..964f1123fe 100644
--- a/Marlin/src/feature/bedlevel/ubl/ubl.cpp
+++ b/Marlin/src/feature/bedlevel/ubl/ubl.cpp
@@ -180,10 +180,8 @@ void unified_bed_leveling::display_map(const uint8_t map_type) {
SERIAL_EOL();
serial_echo_column_labels(eachsp - 2);
}
- else {
- SERIAL_ECHOPGM(" for ");
- SERIAL_ECHOPGM_P(csv ? PSTR("CSV:\n") : PSTR("LCD:\n"));
- }
+ else
+ SERIAL_ECHOPGM(" for ", csv ? F("CSV:\n") : F("LCD:\n"));
// Add XY probe offset from extruder because probe.probe_at_point() subtracts them when
// moving to the XY position to be measured. This ensures better agreement between
@@ -213,7 +211,7 @@ void unified_bed_leveling::display_map(const uint8_t map_type) {
// TODO: Display on Graphical LCD
}
else if (isnan(f))
- SERIAL_ECHOPGM_P(human ? PSTR(" . ") : PSTR("NAN"));
+ SERIAL_ECHOF(human ? F(" . ") : F("NAN"));
else if (human || csv) {
if (human && f >= 0.0) SERIAL_CHAR(f > 0 ? '+' : ' '); // Display sign also for positive numbers (' ' for 0)
SERIAL_ECHO_F(f, 3); // Positive: 5 digits, Negative: 6 digits
@@ -281,10 +279,10 @@ bool unified_bed_leveling::sanity_check() {
}
#endif
- process_subcommands_now_P(G28_STR); // Home
- process_subcommands_now_P(PSTR(ALIGN_GCODE "\n" // Align multi z axis if available
- PROBE_GCODE "\n" // Build mesh with available hardware
- "G29P3\nG29P3")); // Ensure mesh is complete by running smart fill twice
+ process_subcommands_now(FPSTR(G28_STR)); // Home
+ process_subcommands_now(F(ALIGN_GCODE "\n" // Align multi z axis if available
+ PROBE_GCODE "\n" // Build mesh with available hardware
+ "G29P3\nG29P3")); // Ensure mesh is complete by running smart fill twice
if (parser.seenval('S')) {
char umw_gcode[32];
@@ -292,9 +290,9 @@ bool unified_bed_leveling::sanity_check() {
queue.inject(umw_gcode);
}
- process_subcommands_now_P(PSTR("G29A\nG29F10\n" // Set UBL Active & Fade 10
- "M140S0\nM104S0\n" // Turn off heaters
- "M500")); // Store settings
+ process_subcommands_now(F("G29A\nG29F10\n" // Set UBL Active & Fade 10
+ "M140S0\nM104S0\n" // Turn off heaters
+ "M500")); // Store settings
}
#endif // UBL_MESH_WIZARD
diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp
index 747c61a8b9..df83923fef 100644
--- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp
+++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp
@@ -346,13 +346,14 @@ void unified_bed_leveling::G29() {
if (parser.seen('Q')) {
const int16_t test_pattern = parser.has_value() ? parser.value_int() : -99;
- if (!WITHIN(test_pattern, -1, 2)) {
- SERIAL_ECHOLNPGM("Invalid test_pattern value. (-1 to 2)\n");
+ if (!WITHIN(test_pattern, TERN0(UBL_DEVEL_DEBUGGING, -1), 2)) {
+ SERIAL_ECHOLNPGM("?Invalid (Q) test pattern. (" TERN(UBL_DEVEL_DEBUGGING, "-1", "0") " to 2)\n");
return;
}
- SERIAL_ECHOLNPGM("Loading test_pattern values.\n");
+ SERIAL_ECHOLNPGM("Applying test pattern.\n");
switch (test_pattern) {
+ default:
case -1: TERN_(UBL_DEVEL_DEBUGGING, g29_eeprom_dump()); break;
case 0:
@@ -609,7 +610,7 @@ void unified_bed_leveling::G29() {
settings.load_mesh(param.KLS_storage_slot);
storage_slot = param.KLS_storage_slot;
- SERIAL_ECHOLNPGM("Done.");
+ SERIAL_ECHOLNPGM(STR_DONE);
}
//
@@ -637,7 +638,7 @@ void unified_bed_leveling::G29() {
settings.store_mesh(param.KLS_storage_slot);
storage_slot = param.KLS_storage_slot;
- SERIAL_ECHOLNPGM("Done.");
+ SERIAL_ECHOLNPGM(STR_DONE);
}
if (parser.seen_test('T'))
@@ -656,7 +657,7 @@ void unified_bed_leveling::G29() {
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Z Probe End Script: ", Z_PROBE_END_SCRIPT);
if (probe_deployed) {
planner.synchronize();
- gcode.process_subcommands_now_P(PSTR(Z_PROBE_END_SCRIPT));
+ gcode.process_subcommands_now(F(Z_PROBE_END_SCRIPT));
}
#else
UNUSED(probe_deployed);
@@ -736,7 +737,7 @@ void unified_bed_leveling::shift_mesh_height() {
const uint8_t point_num = (GRID_MAX_POINTS - count) + 1;
SERIAL_ECHOLNPGM("Probing mesh point ", point_num, "/", GRID_MAX_POINTS, ".");
- TERN_(HAS_STATUS_MESSAGE, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_POINT), point_num, int(GRID_MAX_POINTS)));
+ TERN_(HAS_STATUS_MESSAGE, ui.status_printf(0, F(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_POINT), point_num, int(GRID_MAX_POINTS)));
#if HAS_LCD_MENU
if (ui.button_pressed()) {
@@ -789,12 +790,12 @@ void unified_bed_leveling::shift_mesh_height() {
#endif // HAS_BED_PROBE
-void set_message_with_feedback(PGM_P const msg_P) {
+void set_message_with_feedback(FSTR_P const fstr) {
#if HAS_LCD_MENU
- ui.set_status_P(msg_P);
+ ui.set_status(fstr);
ui.quick_feedback();
#else
- UNUSED(msg_P);
+ UNUSED(fstr);
#endif
}
@@ -850,7 +851,7 @@ void set_message_with_feedback(PGM_P const msg_P) {
planner.synchronize();
SERIAL_ECHOPGM("Place shim under nozzle");
- LCD_MESSAGEPGM(MSG_UBL_BC_INSERT);
+ LCD_MESSAGE(MSG_UBL_BC_INSERT);
ui.return_to_status();
echo_and_take_a_measurement();
@@ -859,7 +860,7 @@ void set_message_with_feedback(PGM_P const msg_P) {
planner.synchronize();
SERIAL_ECHOPGM("Remove shim");
- LCD_MESSAGEPGM(MSG_UBL_BC_REMOVE);
+ LCD_MESSAGE(MSG_UBL_BC_REMOVE);
echo_and_take_a_measurement();
const float z2 = measure_point_with_encoder();
@@ -905,7 +906,7 @@ void set_message_with_feedback(PGM_P const msg_P) {
if (!position_is_reachable(ppos)) break; // SHOULD NOT OCCUR (find_closest_mesh_point only returns reachable points)
- LCD_MESSAGEPGM(MSG_UBL_MOVING_TO_NEXT);
+ LCD_MESSAGE(MSG_UBL_MOVING_TO_NEXT);
do_blocking_move_to(ppos);
do_z_clearance(z_clearance);
@@ -917,11 +918,11 @@ void set_message_with_feedback(PGM_P const msg_P) {
if (parser.seen_test('B')) {
SERIAL_ECHOPGM("Place Shim & Measure");
- LCD_MESSAGEPGM(MSG_UBL_BC_INSERT);
+ LCD_MESSAGE(MSG_UBL_BC_INSERT);
}
else {
SERIAL_ECHOPGM("Measure");
- LCD_MESSAGEPGM(MSG_UBL_BC_INSERT2);
+ LCD_MESSAGE(MSG_UBL_BC_INSERT2);
}
const float z_step = 0.01f; // 0.01mm per encoder tick, occasionally step
@@ -974,7 +975,7 @@ void set_message_with_feedback(PGM_P const msg_P) {
save_ubl_active_state_and_disable();
- LCD_MESSAGEPGM(MSG_UBL_FINE_TUNE_MESH);
+ LCD_MESSAGE(MSG_UBL_FINE_TUNE_MESH);
ui.capture(); // Take over control of the LCD encoder
do_blocking_move_to_xy_z(pos, Z_CLEARANCE_BETWEEN_PROBES); // Move to the given XY with probe clearance
@@ -1039,7 +1040,7 @@ void set_message_with_feedback(PGM_P const msg_P) {
if (_click_and_hold([]{
ui.return_to_status();
do_z_clearance(Z_CLEARANCE_BETWEEN_PROBES);
- set_message_with_feedback(GET_TEXT(MSG_EDITING_STOPPED));
+ set_message_with_feedback(GET_TEXT_F(MSG_EDITING_STOPPED));
})) break;
// TODO: Disable leveling here so the Z value becomes the 'native' Z value.
@@ -1060,7 +1061,7 @@ void set_message_with_feedback(PGM_P const msg_P) {
do_blocking_move_to_xy_z(pos, Z_CLEARANCE_BETWEEN_PROBES);
- LCD_MESSAGEPGM(MSG_UBL_DONE_EDITING_MESH);
+ LCD_MESSAGE(MSG_UBL_DONE_EDITING_MESH);
SERIAL_ECHOLNPGM("Done Editing Mesh");
if (lcd_map_control)
@@ -1077,7 +1078,7 @@ void set_message_with_feedback(PGM_P const msg_P) {
bool unified_bed_leveling::G29_parse_parameters() {
bool err_flag = false;
- set_message_with_feedback(GET_TEXT(MSG_UBL_DOING_G29));
+ set_message_with_feedback(GET_TEXT_F(MSG_UBL_DOING_G29));
param.C_constant = 0;
param.R_repetition = 0;
@@ -1200,7 +1201,7 @@ void unified_bed_leveling::save_ubl_active_state_and_disable() {
ubl_state_recursion_chk++;
if (ubl_state_recursion_chk != 1) {
SERIAL_ECHOLNPGM("save_ubl_active_state_and_disabled() called multiple times in a row.");
- set_message_with_feedback(GET_TEXT(MSG_UBL_SAVE_ERROR));
+ set_message_with_feedback(GET_TEXT_F(MSG_UBL_SAVE_ERROR));
return;
}
#endif
@@ -1213,7 +1214,7 @@ void unified_bed_leveling::restore_ubl_active_state_and_leave() {
#if ENABLED(UBL_DEVEL_DEBUGGING)
if (--ubl_state_recursion_chk) {
SERIAL_ECHOLNPGM("restore_ubl_active_state_and_leave() called too many times.");
- set_message_with_feedback(GET_TEXT(MSG_UBL_RESTORE_ERROR));
+ set_message_with_feedback(GET_TEXT_F(MSG_UBL_RESTORE_ERROR));
return;
}
#endif
@@ -1438,7 +1439,7 @@ void unified_bed_leveling::smart_fill_mesh() {
if (do_3_pt_leveling) {
SERIAL_ECHOLNPGM("Tilting mesh (1/3)");
- TERN_(HAS_STATUS_MESSAGE, ui.status_printf_P(0, PSTR(S_FMT " 1/3"), GET_TEXT(MSG_LCD_TILTING_MESH)));
+ TERN_(HAS_STATUS_MESSAGE, ui.status_printf(0, F(S_FMT " 1/3"), GET_TEXT(MSG_LCD_TILTING_MESH)));
measured_z = probe.probe_at_point(points[0], PROBE_PT_RAISE, param.V_verbosity);
if (isnan(measured_z))
@@ -1457,7 +1458,7 @@ void unified_bed_leveling::smart_fill_mesh() {
if (!abort_flag) {
SERIAL_ECHOLNPGM("Tilting mesh (2/3)");
- TERN_(HAS_STATUS_MESSAGE, ui.status_printf_P(0, PSTR(S_FMT " 2/3"), GET_TEXT(MSG_LCD_TILTING_MESH)));
+ TERN_(HAS_STATUS_MESSAGE, ui.status_printf(0, F(S_FMT " 2/3"), GET_TEXT(MSG_LCD_TILTING_MESH)));
measured_z = probe.probe_at_point(points[1], PROBE_PT_RAISE, param.V_verbosity);
#ifdef VALIDATE_MESH_TILT
@@ -1477,7 +1478,7 @@ void unified_bed_leveling::smart_fill_mesh() {
if (!abort_flag) {
SERIAL_ECHOLNPGM("Tilting mesh (3/3)");
- TERN_(HAS_STATUS_MESSAGE, ui.status_printf_P(0, PSTR(S_FMT " 3/3"), GET_TEXT(MSG_LCD_TILTING_MESH)));
+ TERN_(HAS_STATUS_MESSAGE, ui.status_printf(0, F(S_FMT " 3/3"), GET_TEXT(MSG_LCD_TILTING_MESH)));
measured_z = probe.probe_at_point(points[2], PROBE_PT_LAST_STOW, param.V_verbosity);
#ifdef VALIDATE_MESH_TILT
@@ -1518,7 +1519,7 @@ void unified_bed_leveling::smart_fill_mesh() {
if (!abort_flag) {
SERIAL_ECHOLNPGM("Tilting mesh point ", point_num, "/", total_points, "\n");
- TERN_(HAS_STATUS_MESSAGE, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_LCD_TILTING_MESH), point_num, total_points));
+ TERN_(HAS_STATUS_MESSAGE, ui.status_printf(0, F(S_FMT " %i/%i"), GET_TEXT(MSG_LCD_TILTING_MESH), point_num, total_points));
measured_z = probe.probe_at_point(rpos, parser.seen_test('E') ? PROBE_PT_STOW : PROBE_PT_RAISE, param.V_verbosity); // TODO: Needs error handling
@@ -1609,7 +1610,7 @@ void unified_bed_leveling::smart_fill_mesh() {
}
if (DEBUGGING(LEVELING)) {
- rotation.debug(PSTR("rotation matrix:\n"));
+ rotation.debug(F("rotation matrix:\n"));
DEBUG_ECHOPAIR_F("LSF Results A=", lsf_results.A, 7);
DEBUG_ECHOPAIR_F(" B=", lsf_results.B, 7);
DEBUG_ECHOLNPAIR_F(" D=", lsf_results.D, 7);
@@ -1636,14 +1637,14 @@ void unified_bed_leveling::smart_fill_mesh() {
auto normed = [&](const xy_pos_t &pos, const_float_t zadd) {
return normal.x * pos.x + normal.y * pos.y + zadd;
};
- auto debug_pt = [](PGM_P const pre, const xy_pos_t &pos, const_float_t zadd) {
- d_from(); SERIAL_ECHOPGM_P(pre);
+ auto debug_pt = [](FSTR_P const pre, const xy_pos_t &pos, const_float_t zadd) {
+ d_from(); SERIAL_ECHOF(pre);
DEBUG_ECHO_F(normed(pos, zadd), 6);
DEBUG_ECHOLNPAIR_F(" Z error = ", zadd - get_z_correction(pos), 6);
};
- debug_pt(PSTR("1st point: "), probe_pt[0], normal.z * z1);
- debug_pt(PSTR("2nd point: "), probe_pt[1], normal.z * z2);
- debug_pt(PSTR("3rd point: "), probe_pt[2], normal.z * z3);
+ debug_pt(F("1st point: "), probe_pt[0], normal.z * z1);
+ debug_pt(F("2nd point: "), probe_pt[1], normal.z * z2);
+ debug_pt(F("3rd point: "), probe_pt[2], normal.z * z3);
d_from(); DEBUG_ECHOPGM("safe home with Z=");
DEBUG_ECHOLNPAIR_F("0 : ", normed(safe_homing_xy, 0), 6);
d_from(); DEBUG_ECHOPGM("safe home with Z=");
diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp
index 20408d8d1e..f7e98c9fa7 100644
--- a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp
+++ b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp
@@ -19,6 +19,7 @@
* along with this program. If not, see .
*
*/
+
#include "../../../inc/MarlinConfig.h"
#if ENABLED(AUTO_BED_LEVELING_UBL)
@@ -323,6 +324,8 @@
#define DELTA_SEGMENT_MIN_LENGTH 0.25 // SCARA minimum segment size is 0.25mm
#elif ENABLED(DELTA)
#define DELTA_SEGMENT_MIN_LENGTH 0.10 // mm (still subject to DELTA_SEGMENTS_PER_SECOND)
+ #elif ENABLED(POLARGRAPH)
+ #define DELTA_SEGMENT_MIN_LENGTH 0.10 // mm (still subject to DELTA_SEGMENTS_PER_SECOND)
#else // CARTESIAN
#ifdef LEVELED_SEGMENT_LENGTH
#define DELTA_SEGMENT_MIN_LENGTH LEVELED_SEGMENT_LENGTH
diff --git a/Marlin/src/feature/bltouch.cpp b/Marlin/src/feature/bltouch.cpp
index 49a10f62b1..d3348e79f0 100644
--- a/Marlin/src/feature/bltouch.cpp
+++ b/Marlin/src/feature/bltouch.cpp
@@ -28,7 +28,12 @@
BLTouch bltouch;
-bool BLTouch::last_written_mode; // Initialized by settings.load, 0 = Open Drain; 1 = 5V Drain
+bool BLTouch::od_5v_mode; // Initialized by settings.load, 0 = Open Drain; 1 = 5V Drain
+#ifdef BLTOUCH_HS_MODE
+ bool BLTouch::high_speed_mode; // Initialized by settings.load, 0 = Low Speed; 1 = High Speed
+#else
+ constexpr bool BLTouch::high_speed_mode;
+#endif
#include "../module/servo.h"
#include "../module/probe.h"
@@ -64,17 +69,14 @@ void BLTouch::init(const bool set_voltage/*=false*/) {
#else
if (DEBUGGING(LEVELING)) {
- DEBUG_ECHOLNPGM("last_written_mode - ", last_written_mode);
- DEBUG_ECHOLNPGM("config mode - "
- #if ENABLED(BLTOUCH_SET_5V_MODE)
- "BLTOUCH_SET_5V_MODE"
- #else
- "OD"
- #endif
- );
+ PGMSTR(mode0, "OD");
+ PGMSTR(mode1, "5V");
+ DEBUG_ECHOPGM("BLTouch Mode: ");
+ DEBUG_ECHOPGM_P(bltouch.od_5v_mode ? mode1 : mode0);
+ DEBUG_ECHOLNPGM(" (Default " TERN(BLTOUCH_SET_5V_MODE, "5V", "OD") ")");
}
- const bool should_set = last_written_mode != ENABLED(BLTOUCH_SET_5V_MODE);
+ const bool should_set = od_5v_mode != ENABLED(BLTOUCH_SET_5V_MODE);
#endif
@@ -193,7 +195,7 @@ void BLTouch::mode_conv_proc(const bool M5V) {
_mode_store();
if (M5V) _set_5V_mode(); else _set_OD_mode();
_stow();
- last_written_mode = M5V;
+ od_5v_mode = M5V;
}
#endif // BLTOUCH
diff --git a/Marlin/src/feature/bltouch.h b/Marlin/src/feature/bltouch.h
index 9ecccb4256..ae3ab66300 100644
--- a/Marlin/src/feature/bltouch.h
+++ b/Marlin/src/feature/bltouch.h
@@ -23,10 +23,6 @@
#include "../inc/MarlinConfigPre.h"
-#if DISABLED(BLTOUCH_HS_MODE)
- #define BLTOUCH_SLOW_MODE 1
-#endif
-
// BLTouch commands are sent as servo angles
typedef unsigned char BLTCommand;
@@ -70,8 +66,17 @@ typedef unsigned char BLTCommand;
class BLTouch {
public:
+
static void init(const bool set_voltage=false);
- static bool last_written_mode; // Initialized by settings.load, 0 = Open Drain; 1 = 5V Drain
+ static bool od_5v_mode; // Initialized by settings.load, 0 = Open Drain; 1 = 5V Drain
+
+ #ifdef BLTOUCH_HS_MODE
+ static bool high_speed_mode; // Initialized by settings.load, 0 = Low Speed; 1 = High Speed
+ #else
+ static constexpr bool high_speed_mode = false;
+ #endif
+
+ static inline float z_extra_clearance() { return high_speed_mode ? 7 : 0; }
// DEPLOY and STOW are wrapped for error handling - these are used by homing and by probing
static bool deploy() { return deploy_proc(); }
diff --git a/Marlin/src/feature/cancel_object.cpp b/Marlin/src/feature/cancel_object.cpp
index ee5716888d..bffd2bb720 100644
--- a/Marlin/src/feature/cancel_object.cpp
+++ b/Marlin/src/feature/cancel_object.cpp
@@ -19,6 +19,7 @@
* along with this program. If not, see .
*
*/
+
#include "../inc/MarlinConfig.h"
#if ENABLED(CANCEL_OBJECTS)
@@ -45,7 +46,7 @@ void CancelObject::set_active_object(const int8_t obj) {
#if BOTH(HAS_STATUS_MESSAGE, CANCEL_OBJECTS_REPORTING)
if (active_object >= 0)
- ui.status_printf_P(0, PSTR(S_FMT " %i"), GET_TEXT(MSG_PRINTING_OBJECT), int(active_object));
+ ui.status_printf(0, F(S_FMT " %i"), GET_TEXT(MSG_PRINTING_OBJECT), int(active_object));
else
ui.reset_status();
#endif
diff --git a/Marlin/src/feature/caselight.cpp b/Marlin/src/feature/caselight.cpp
index 1baef6d468..7c4755d0b5 100644
--- a/Marlin/src/feature/caselight.cpp
+++ b/Marlin/src/feature/caselight.cpp
@@ -70,7 +70,7 @@ void CaseLight::update(const bool sflag) {
#if CASELIGHT_USES_BRIGHTNESS
if (pin_is_pwm())
- analogWrite(pin_t(CASE_LIGHT_PIN), (
+ set_pwm_duty(pin_t(CASE_LIGHT_PIN), (
#if CASE_LIGHT_MAX_PWM == 255
n10ct
#else
diff --git a/Marlin/src/feature/closedloop.cpp b/Marlin/src/feature/closedloop.cpp
index 8a97f0c0cd..1b9f711a6b 100644
--- a/Marlin/src/feature/closedloop.cpp
+++ b/Marlin/src/feature/closedloop.cpp
@@ -19,6 +19,7 @@
* along with this program. If not, see .
*
*/
+
#include "../inc/MarlinConfig.h"
#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER)
diff --git a/Marlin/src/feature/controllerfan.cpp b/Marlin/src/feature/controllerfan.cpp
index 35f567fa8f..330f3914f6 100644
--- a/Marlin/src/feature/controllerfan.cpp
+++ b/Marlin/src/feature/controllerfan.cpp
@@ -25,7 +25,7 @@
#if ENABLED(USE_CONTROLLER_FAN)
#include "controllerfan.h"
-#include "../module/stepper/indirection.h"
+#include "../module/stepper.h"
#include "../module/temperature.h"
ControllerFan controllerFan;
@@ -54,33 +54,12 @@ void ControllerFan::update() {
if (ELAPSED(ms, nextMotorCheck)) {
nextMotorCheck = ms + 2500UL; // Not a time critical function, so only check every 2.5s
- #define MOTOR_IS_ON(A,B) (A##_ENABLE_READ() == bool(B##_ENABLE_ON))
- #define _OR_ENABLED_E(N) || MOTOR_IS_ON(E##N,E)
-
- const bool motor_on = (
- ( DISABLED(CONTROLLER_FAN_IGNORE_Z) &&
- ( MOTOR_IS_ON(Z,Z)
- || TERN0(HAS_Z2_ENABLE, MOTOR_IS_ON(Z2,Z))
- || TERN0(HAS_Z3_ENABLE, MOTOR_IS_ON(Z3,Z))
- || TERN0(HAS_Z4_ENABLE, MOTOR_IS_ON(Z4,Z))
- )
- ) || (
- DISABLED(CONTROLLER_FAN_USE_Z_ONLY) &&
- ( MOTOR_IS_ON(X,X) || MOTOR_IS_ON(Y,Y)
- || TERN0(HAS_X2_ENABLE, MOTOR_IS_ON(X2,X))
- || TERN0(HAS_Y2_ENABLE, MOTOR_IS_ON(Y2,Y))
- #if E_STEPPERS
- REPEAT(E_STEPPERS, _OR_ENABLED_E)
- #endif
- )
- )
- );
-
// If any triggers for the controller fan are true...
// - At least one stepper driver is enabled
// - The heated bed is enabled
// - TEMP_SENSOR_BOARD is reporting >= CONTROLLER_FAN_MIN_BOARD_TEMP
- if ( motor_on
+ const ena_mask_t axis_mask = TERN(CONTROLLER_FAN_USE_Z_ONLY, _BV(Z_AXIS), (ena_mask_t)~TERN0(CONTROLLER_FAN_IGNORE_Z, _BV(Z_AXIS)));
+ if ( (stepper.axis_enabled.bits & axis_mask)
|| TERN0(HAS_HEATED_BED, thermalManager.temp_bed.soft_pwm_amount > 0)
|| TERN0(HAS_CONTROLLER_FAN_MIN_BOARD_TEMP, thermalManager.wholeDegBoard() >= CONTROLLER_FAN_MIN_BOARD_TEMP)
) lastMotorOn = ms; //... set time to NOW so the fan will turn on
@@ -93,9 +72,10 @@ void ControllerFan::update() {
? settings.active_speed : settings.idle_speed
);
- // Allow digital or PWM fan output (see M42 handling)
- WRITE(CONTROLLER_FAN_PIN, speed);
- analogWrite(pin_t(CONTROLLER_FAN_PIN), speed);
+ if (PWM_PIN(CONTROLLER_FAN_PIN))
+ set_pwm_duty(pin_t(CONTROLLER_FAN_PIN), speed);
+ else
+ WRITE(CONTROLLER_FAN_PIN, speed);
}
}
diff --git a/Marlin/src/feature/direct_stepping.cpp b/Marlin/src/feature/direct_stepping.cpp
index 2698b53dd6..b8ef04fcd9 100644
--- a/Marlin/src/feature/direct_stepping.cpp
+++ b/Marlin/src/feature/direct_stepping.cpp
@@ -19,6 +19,7 @@
* along with this program. If not, see .
*
*/
+
#include "../inc/MarlinConfigPre.h"
#if ENABLED(DIRECT_STEPPING)
@@ -173,7 +174,7 @@ namespace DirectStepping {
template
void SerialPageManager::write_responses() {
if (fatal_error) {
- kill(GET_TEXT(MSG_BAD_PAGE));
+ kill(GET_TEXT_F(MSG_BAD_PAGE));
return;
}
diff --git a/Marlin/src/feature/e_parser.h b/Marlin/src/feature/e_parser.h
index 3723caa35e..1dee0cf755 100644
--- a/Marlin/src/feature/e_parser.h
+++ b/Marlin/src/feature/e_parser.h
@@ -199,7 +199,7 @@ public:
case EP_M112: killed_by_M112 = true; break;
case EP_M410: quickstop_by_M410 = true; break;
#if ENABLED(HOST_PROMPT_SUPPORT)
- case EP_M876SN: host_response_handler(M876_reason); break;
+ case EP_M876SN: hostui.handle_response(M876_reason); break;
#endif
#if ENABLED(REALTIME_REPORTING_COMMANDS)
case EP_GRBL_STATUS: report_current_position_moving(); break;
diff --git a/Marlin/src/feature/encoder_i2c.cpp b/Marlin/src/feature/encoder_i2c.cpp
index e6b127e03c..87e611f86c 100644
--- a/Marlin/src/feature/encoder_i2c.cpp
+++ b/Marlin/src/feature/encoder_i2c.cpp
@@ -153,7 +153,7 @@ void I2CPositionEncoder::update() {
#ifdef I2CPE_ERR_THRESH_ABORT
if (ABS(error) > I2CPE_ERR_THRESH_ABORT * planner.settings.axis_steps_per_mm[encoderAxis]) {
- //kill(PSTR("Significant Error"));
+ //kill(F("Significant Error"));
SERIAL_ECHOLNPGM("Axis error over threshold, aborting!", error);
safe_delay(5000);
}
@@ -173,7 +173,7 @@ void I2CPositionEncoder::update() {
LOOP_L_N(i, I2CPE_ERR_PRST_ARRAY_SIZE) sumP += errPrst[i];
const int32_t errorP = int32_t(sumP * RECIPROCAL(I2CPE_ERR_PRST_ARRAY_SIZE));
SERIAL_CHAR(axis_codes[encoderAxis]);
- SERIAL_ECHOLNPGM(" : CORRECT ERR ", errorP * planner.steps_to_mm[encoderAxis], "mm");
+ SERIAL_ECHOLNPGM(" : CORRECT ERR ", errorP * planner.mm_per_step[encoderAxis], "mm");
babystep.add_steps(encoderAxis, -LROUND(errorP));
errPrstIdx = 0;
}
@@ -232,7 +232,7 @@ bool I2CPositionEncoder::passes_test(const bool report) {
if (report) {
if (H != I2CPE_MAG_SIG_GOOD) SERIAL_ECHOPGM("Warning. ");
SERIAL_CHAR(axis_codes[encoderAxis]);
- serial_ternary(H == I2CPE_MAG_SIG_BAD, PSTR(" axis "), PSTR("magnetic strip "), PSTR("encoder "));
+ serial_ternary(H == I2CPE_MAG_SIG_BAD, F(" axis "), F("magnetic strip "), F("encoder "));
switch (H) {
case I2CPE_MAG_SIG_GOOD:
case I2CPE_MAG_SIG_MID:
diff --git a/Marlin/src/feature/fwretract.cpp b/Marlin/src/feature/fwretract.cpp
index 26817b9ed2..4077d8d1c2 100644
--- a/Marlin/src/feature/fwretract.cpp
+++ b/Marlin/src/feature/fwretract.cpp
@@ -75,7 +75,7 @@ void FWRetract::reset() {
LOOP_L_N(i, EXTRUDERS) {
retracted[i] = false;
- TERN_(HAS_MULTI_EXTRUDER, retracted_swap[i] = false);
+ E_TERN_(retracted_swap[i] = false);
current_retract[i] = 0.0;
}
}
@@ -91,7 +91,7 @@ void FWRetract::reset() {
* Note: Auto-retract will apply the set Z hop in addition to any Z hop
* included in the G-code. Use M207 Z0 to to prevent double hop.
*/
-void FWRetract::retract(const bool retracting OPTARG(HAS_MULTI_EXTRUDER, bool swapping/*=false*/)) {
+void FWRetract::retract(const bool retracting E_OPTARG(bool swapping/*=false*/)) {
// Prevent two retracts or recovers in a row
if (retracted[active_extruder] == retracting) return;
diff --git a/Marlin/src/feature/fwretract.h b/Marlin/src/feature/fwretract.h
index 9b0ff19c8b..d6d0432e3a 100644
--- a/Marlin/src/feature/fwretract.h
+++ b/Marlin/src/feature/fwretract.h
@@ -74,7 +74,7 @@ public:
#endif
}
- static void retract(const bool retracting OPTARG(HAS_MULTI_EXTRUDER, bool swapping = false));
+ static void retract(const bool retracting E_OPTARG(bool swapping=false));
static void M207_report();
static void M207();
diff --git a/Marlin/src/feature/host_actions.cpp b/Marlin/src/feature/host_actions.cpp
index 62e60320f7..be7b055b55 100644
--- a/Marlin/src/feature/host_actions.cpp
+++ b/Marlin/src/feature/host_actions.cpp
@@ -24,10 +24,10 @@
#if ENABLED(HOST_ACTION_COMMANDS)
-#include "host_actions.h"
-
//#define DEBUG_HOST_ACTIONS
+#include "host_actions.h"
+
#if ENABLED(ADVANCED_PAUSE_FEATURE)
#include "pause.h"
#include "../gcode/queue.h"
@@ -37,37 +37,57 @@
#include "runout.h"
#endif
-void host_action(PGM_P const pstr, const bool eol) {
+HostUI hostui;
+
+flag_t HostUI::flag;
+
+void HostUI::action(FSTR_P const fstr, const bool eol) {
+ if (!flag.bits) return;
PORT_REDIRECT(SerialMask::All);
SERIAL_ECHOPGM("//action:");
- SERIAL_ECHOPGM_P(pstr);
+ SERIAL_ECHOF(fstr);
if (eol) SERIAL_EOL();
}
#ifdef ACTION_ON_KILL
- void host_action_kill() { host_action(PSTR(ACTION_ON_KILL)); }
+ void HostUI::kill() { action(F(ACTION_ON_KILL)); }
#endif
#ifdef ACTION_ON_PAUSE
- void host_action_pause(const bool eol/*=true*/) { host_action(PSTR(ACTION_ON_PAUSE), eol); }
+ void HostUI::pause(const bool eol/*=true*/) { action(F(ACTION_ON_PAUSE), eol); }
#endif
#ifdef ACTION_ON_PAUSED
- void host_action_paused(const bool eol/*=true*/) { host_action(PSTR(ACTION_ON_PAUSED), eol); }
+ void HostUI::paused(const bool eol/*=true*/) { action(F(ACTION_ON_PAUSED), eol); }
#endif
#ifdef ACTION_ON_RESUME
- void host_action_resume() { host_action(PSTR(ACTION_ON_RESUME)); }
+ void HostUI::resume() { action(F(ACTION_ON_RESUME)); }
#endif
#ifdef ACTION_ON_RESUMED
- void host_action_resumed() { host_action(PSTR(ACTION_ON_RESUMED)); }
+ void HostUI::resumed() { action(F(ACTION_ON_RESUMED)); }
#endif
#ifdef ACTION_ON_CANCEL
- void host_action_cancel() { host_action(PSTR(ACTION_ON_CANCEL)); }
+ void HostUI::cancel() { action(F(ACTION_ON_CANCEL)); }
#endif
#ifdef ACTION_ON_START
- void host_action_start() { host_action(PSTR(ACTION_ON_START)); }
+ void HostUI::start() { action(F(ACTION_ON_START)); }
+#endif
+
+#if ENABLED(G29_RETRY_AND_RECOVER)
+ #ifdef ACTION_ON_G29_RECOVER
+ void HostUI::g29_recover() { action(F(ACTION_ON_G29_RECOVER)); }
+ #endif
+ #ifdef ACTION_ON_G29_FAILURE
+ void HostUI::g29_failure() { action(F(ACTION_ON_G29_FAILURE)); }
+ #endif
+#endif
+
+#ifdef SHUTDOWN_ACTION
+ void HostUI::shutdown() { action(F(SHUTDOWN_ACTION)); }
#endif
#if ENABLED(HOST_PROMPT_SUPPORT)
+ PromptReason HostUI::host_prompt_reason = PROMPT_NOT_DEFINED;
+
PGMSTR(CONTINUE_STR, "Continue");
PGMSTR(DISMISS_STR, "Dismiss");
@@ -75,64 +95,69 @@ void host_action(PGM_P const pstr, const bool eol) {
extern bool wait_for_user;
#endif
- PromptReason host_prompt_reason = PROMPT_NOT_DEFINED;
-
- void host_action_notify(const char * const message) {
+ void HostUI::notify(const char * const cstr) {
+ if (!flag.bits) return;
PORT_REDIRECT(SerialMask::All);
- host_action(PSTR("notification "), false);
- SERIAL_ECHOLN(message);
+ action(F("notification "), false);
+ SERIAL_ECHOLN(cstr);
}
- void host_action_notify_P(PGM_P const message) {
+ void HostUI::notify_P(PGM_P const pstr) {
+ if (!flag.bits) return;
PORT_REDIRECT(SerialMask::All);
- host_action(PSTR("notification "), false);
- SERIAL_ECHOLNPGM_P(message);
+ action(F("notification "), false);
+ SERIAL_ECHOLNPGM_P(pstr);
}
- void host_action_prompt(PGM_P const ptype, const bool eol=true) {
+ void HostUI::prompt(FSTR_P const ptype, const bool eol/*=true*/) {
+ if (!flag.bits) return;
PORT_REDIRECT(SerialMask::All);
- host_action(PSTR("prompt_"), false);
- SERIAL_ECHOPGM_P(ptype);
+ action(F("prompt_"), false);
+ SERIAL_ECHOF(ptype);
if (eol) SERIAL_EOL();
}
- void host_action_prompt_plus(PGM_P const ptype, PGM_P const pstr, const char extra_char='\0') {
- host_action_prompt(ptype, false);
+ void HostUI::prompt_plus(FSTR_P const ptype, FSTR_P const fstr, const char extra_char/*='\0'*/) {
+ if (!flag.bits) return;
+ prompt(ptype, false);
PORT_REDIRECT(SerialMask::All);
SERIAL_CHAR(' ');
- SERIAL_ECHOPGM_P(pstr);
+ SERIAL_ECHOF(fstr);
if (extra_char != '\0') SERIAL_CHAR(extra_char);
SERIAL_EOL();
}
- void host_action_prompt_begin(const PromptReason reason, PGM_P const pstr, const char extra_char/*='\0'*/) {
- host_action_prompt_end();
+ void HostUI::prompt_begin(const PromptReason reason, FSTR_P const fstr, const char extra_char/*='\0'*/) {
+ if (!flag.bits) return;
+ prompt_end();
host_prompt_reason = reason;
- host_action_prompt_plus(PSTR("begin"), pstr, extra_char);
+ prompt_plus(F("begin"), fstr, extra_char);
}
- void host_action_prompt_button(PGM_P const pstr) { host_action_prompt_plus(PSTR("button"), pstr); }
- void host_action_prompt_end() { host_action_prompt(PSTR("end")); }
- void host_action_prompt_show() { host_action_prompt(PSTR("show")); }
+ void HostUI::prompt_button(FSTR_P const fstr) { prompt_plus(F("button"), fstr); }
+ void HostUI::prompt_end() { prompt(F("end")); }
+ void HostUI::prompt_show() { prompt(F("show")); }
- void _host_prompt_show(PGM_P const btn1/*=nullptr*/, PGM_P const btn2/*=nullptr*/) {
- if (btn1) host_action_prompt_button(btn1);
- if (btn2) host_action_prompt_button(btn2);
- host_action_prompt_show();
+ void HostUI::_prompt_show(FSTR_P const btn1, FSTR_P const btn2) {
+ if (btn1) prompt_button(btn1);
+ if (btn2) prompt_button(btn2);
+ prompt_show();
}
- void host_prompt_do(const PromptReason reason, PGM_P const pstr, PGM_P const btn1/*=nullptr*/, PGM_P const btn2/*=nullptr*/) {
- host_action_prompt_begin(reason, pstr);
- _host_prompt_show(btn1, btn2);
+ void HostUI::prompt_do(const PromptReason reason, FSTR_P const fstr, FSTR_P const btn1/*=nullptr*/, FSTR_P const btn2/*=nullptr*/) {
+ prompt_begin(reason, fstr);
+ _prompt_show(btn1, btn2);
}
- void host_prompt_do(const PromptReason reason, PGM_P const pstr, const char extra_char, PGM_P const btn1/*=nullptr*/, PGM_P const btn2/*=nullptr*/) {
- host_action_prompt_begin(reason, pstr, extra_char);
- _host_prompt_show(btn1, btn2);
+ void HostUI::prompt_do(const PromptReason reason, FSTR_P const fstr, const char extra_char, FSTR_P const btn1/*=nullptr*/, FSTR_P const btn2/*=nullptr*/) {
+ prompt_begin(reason, fstr, extra_char);
+ _prompt_show(btn1, btn2);
}
- void filament_load_host_prompt() {
- const bool disable_to_continue = TERN0(HAS_FILAMENT_SENSOR, runout.filament_ran_out);
- host_prompt_do(PROMPT_FILAMENT_RUNOUT, PSTR("Paused"), PSTR("PurgeMore"),
- disable_to_continue ? PSTR("DisableRunout") : CONTINUE_STR
- );
- }
+ #if ENABLED(ADVANCED_PAUSE_FEATURE)
+ void HostUI::filament_load_prompt() {
+ const bool disable_to_continue = TERN0(HAS_FILAMENT_SENSOR, runout.filament_ran_out);
+ prompt_do(PROMPT_FILAMENT_RUNOUT, F("Paused"), F("PurgeMore"),
+ disable_to_continue ? F("DisableRunout") : FPSTR(CONTINUE_STR)
+ );
+ }
+ #endif
//
// Handle responses from the host, such as:
@@ -141,7 +166,7 @@ void host_action(PGM_P const pstr, const bool eol) {
// - Resume Print response
// - Dismissal of info
//
- void host_response_handler(const uint8_t response) {
+ void HostUI::handle_response(const uint8_t response) {
const PromptReason hpr = host_prompt_reason;
host_prompt_reason = PROMPT_NOT_DEFINED; // Reset now ahead of logic
switch (hpr) {
diff --git a/Marlin/src/feature/host_actions.h b/Marlin/src/feature/host_actions.h
index 065b59d755..45379afc29 100644
--- a/Marlin/src/feature/host_actions.h
+++ b/Marlin/src/feature/host_actions.h
@@ -24,34 +24,13 @@
#include "../inc/MarlinConfigPre.h"
#include "../HAL/shared/Marduino.h"
-void host_action(PGM_P const pstr, const bool eol=true);
-
-#ifdef ACTION_ON_KILL
- void host_action_kill();
-#endif
-#ifdef ACTION_ON_PAUSE
- void host_action_pause(const bool eol=true);
-#endif
-#ifdef ACTION_ON_PAUSED
- void host_action_paused(const bool eol=true);
-#endif
-#ifdef ACTION_ON_RESUME
- void host_action_resume();
-#endif
-#ifdef ACTION_ON_RESUMED
- void host_action_resumed();
-#endif
-#ifdef ACTION_ON_CANCEL
- void host_action_cancel();
-#endif
-#ifdef ACTION_ON_START
- void host_action_start();
-#endif
+typedef union {
+ uint8_t bits;
+ struct { bool info:1, errors:1, debug:1; };
+} flag_t;
#if ENABLED(HOST_PROMPT_SUPPORT)
- extern const char CONTINUE_STR[], DISMISS_STR[];
-
enum PromptReason : uint8_t {
PROMPT_NOT_DEFINED,
PROMPT_FILAMENT_RUNOUT,
@@ -61,21 +40,83 @@ void host_action(PGM_P const pstr, const bool eol=true);
PROMPT_INFO
};
- extern PromptReason host_prompt_reason;
-
- void host_response_handler(const uint8_t response);
- void host_action_notify(const char * const message);
- void host_action_notify_P(PGM_P const message);
- void host_action_prompt_begin(const PromptReason reason, PGM_P const pstr, const char extra_char='\0');
- void host_action_prompt_button(PGM_P const pstr);
- void host_action_prompt_end();
- void host_action_prompt_show();
- void host_prompt_do(const PromptReason reason, PGM_P const pstr, PGM_P const btn1=nullptr, PGM_P const btn2=nullptr);
- void host_prompt_do(const PromptReason reason, PGM_P const pstr, const char extra_char, PGM_P const btn1=nullptr, PGM_P const btn2=nullptr);
- inline void host_prompt_open(const PromptReason reason, PGM_P const pstr, PGM_P const btn1=nullptr, PGM_P const btn2=nullptr) {
- if (host_prompt_reason == PROMPT_NOT_DEFINED) host_prompt_do(reason, pstr, btn1, btn2);
- }
-
- void filament_load_host_prompt();
-
#endif
+
+class HostUI {
+ public:
+
+ static flag_t flag;
+ HostUI() { flag.bits = 0xFF; }
+
+ static void action(FSTR_P const fstr, const bool eol=true);
+
+ #ifdef ACTION_ON_KILL
+ static void kill();
+ #endif
+ #ifdef ACTION_ON_PAUSE
+ static void pause(const bool eol=true);
+ #endif
+ #ifdef ACTION_ON_PAUSED
+ static void paused(const bool eol=true);
+ #endif
+ #ifdef ACTION_ON_RESUME
+ static void resume();
+ #endif
+ #ifdef ACTION_ON_RESUMED
+ static void resumed();
+ #endif
+ #ifdef ACTION_ON_CANCEL
+ static void cancel();
+ #endif
+ #ifdef ACTION_ON_START
+ static void start();
+ #endif
+ #ifdef SHUTDOWN_ACTION
+ static void shutdown();
+ #endif
+
+ #if ENABLED(G29_RETRY_AND_RECOVER)
+ #ifdef ACTION_ON_G29_RECOVER
+ static void g29_recover();
+ #endif
+ #ifdef ACTION_ON_G29_FAILURE
+ static void g29_failure();
+ #endif
+ #endif
+
+ #if ENABLED(HOST_PROMPT_SUPPORT)
+ private:
+ static void prompt(FSTR_P const ptype, const bool eol=true);
+ static void prompt_plus(FSTR_P const ptype, FSTR_P const fstr, const char extra_char='\0');
+ static void prompt_show();
+ static void _prompt_show(FSTR_P const btn1, FSTR_P const btn2);
+
+ public:
+ static PromptReason host_prompt_reason;
+
+ static void handle_response(const uint8_t response);
+
+ static void notify_P(PGM_P const message);
+ static inline void notify(FSTR_P const fmsg) { notify_P(FTOP(fmsg)); }
+ static void notify(const char * const message);
+
+ static void prompt_begin(const PromptReason reason, FSTR_P const fstr, const char extra_char='\0');
+ static void prompt_button(FSTR_P const fstr);
+ static void prompt_end();
+ static void prompt_do(const PromptReason reason, FSTR_P const pstr, FSTR_P const btn1=nullptr, FSTR_P const btn2=nullptr);
+ static void prompt_do(const PromptReason reason, FSTR_P const pstr, const char extra_char, FSTR_P const btn1=nullptr, FSTR_P const btn2=nullptr);
+ static inline void prompt_open(const PromptReason reason, FSTR_P const pstr, FSTR_P const btn1=nullptr, FSTR_P const btn2=nullptr) {
+ if (host_prompt_reason == PROMPT_NOT_DEFINED) prompt_do(reason, pstr, btn1, btn2);
+ }
+
+ #if ENABLED(ADVANCED_PAUSE_FEATURE)
+ static void filament_load_prompt();
+ #endif
+
+ #endif
+
+};
+
+extern HostUI hostui;
+
+extern const char CONTINUE_STR[], DISMISS_STR[];
diff --git a/Marlin/src/feature/hotend_idle.cpp b/Marlin/src/feature/hotend_idle.cpp
index b962743ed0..4b137f42da 100644
--- a/Marlin/src/feature/hotend_idle.cpp
+++ b/Marlin/src/feature/hotend_idle.cpp
@@ -77,7 +77,7 @@ void HotendIdleProtection::check() {
void HotendIdleProtection::timed_out() {
next_protect_ms = 0;
SERIAL_ECHOLNPGM("Hotend Idle Timeout");
- LCD_MESSAGEPGM(MSG_HOTEND_IDLE_TIMEOUT);
+ LCD_MESSAGE(MSG_HOTEND_IDLE_TIMEOUT);
HOTEND_LOOP() {
if ((HOTEND_IDLE_NOZZLE_TARGET) < thermalManager.degTargetHotend(e))
thermalManager.setTargetHotend(HOTEND_IDLE_NOZZLE_TARGET, e);
diff --git a/Marlin/src/feature/leds/leds.cpp b/Marlin/src/feature/leds/leds.cpp
index 328daa626d..17d790b8cc 100644
--- a/Marlin/src/feature/leds/leds.cpp
+++ b/Marlin/src/feature/leds/leds.cpp
@@ -121,11 +121,11 @@ void LEDLights::set_color(const LEDColor &incol
// This variant uses 3-4 separate pins for the RGB(W) components.
// If the pins can do PWM then their intensity will be set.
- #define _UPDATE_RGBW(C,c) do { \
- if (PWM_PIN(RGB_LED_##C##_PIN)) \
- analogWrite(pin_t(RGB_LED_##C##_PIN), c); \
- else \
- WRITE(RGB_LED_##C##_PIN, c ? HIGH : LOW); \
+ #define _UPDATE_RGBW(C,c) do { \
+ if (PWM_PIN(RGB_LED_##C##_PIN)) \
+ set_pwm_duty(pin_t(RGB_LED_##C##_PIN), c); \
+ else \
+ WRITE(RGB_LED_##C##_PIN, c ? HIGH : LOW); \
}while(0)
#define UPDATE_RGBW(C,c) _UPDATE_RGBW(C, TERN1(CASE_LIGHT_USE_RGB_LED, caselight.on) ? incol.c : 0)
UPDATE_RGBW(R,r); UPDATE_RGBW(G,g); UPDATE_RGBW(B,b);
@@ -170,9 +170,9 @@ void LEDLights::set_color(const LEDColor &incol
#if ENABLED(NEO2_COLOR_PRESETS)
const LEDColor LEDLights2::defaultLEDColor = LEDColor(
- LED_USER_PRESET_RED, LED_USER_PRESET_GREEN, LED_USER_PRESET_BLUE
- OPTARG(HAS_WHITE_LED2, LED_USER_PRESET_WHITE)
- OPTARG(NEOPIXEL_LED, LED_USER_PRESET_BRIGHTNESS)
+ NEO2_USER_PRESET_RED, NEO2_USER_PRESET_GREEN, NEO2_USER_PRESET_BLUE
+ OPTARG(HAS_WHITE_LED2, NEO2_USER_PRESET_WHITE)
+ OPTARG(NEOPIXEL_LED, NEO2_USER_PRESET_BRIGHTNESS)
);
#endif
diff --git a/Marlin/src/feature/max7219.cpp b/Marlin/src/feature/max7219.cpp
index e13c6f5b97..474933aa19 100644
--- a/Marlin/src/feature/max7219.cpp
+++ b/Marlin/src/feature/max7219.cpp
@@ -124,11 +124,10 @@ uint8_t Max7219::suspended; // = 0;
#define SIG_DELAY() DELAY_NS(250)
#endif
-void Max7219::error(const char * const func, const int32_t v1, const int32_t v2/*=-1*/) {
+void Max7219::error(FSTR_P const func, const int32_t v1, const int32_t v2/*=-1*/) {
#if ENABLED(MAX7219_ERRORS)
SERIAL_ECHOPGM("??? Max7219::");
- SERIAL_ECHOPGM_P(func);
- SERIAL_CHAR('(');
+ SERIAL_ECHOF(func, AS_CHAR('('));
SERIAL_ECHO(v1);
if (v2 > 0) SERIAL_ECHOPGM(", ", v2);
SERIAL_CHAR(')');
@@ -268,24 +267,24 @@ void Max7219::set(const uint8_t line, const uint8_t bits) {
// Modify a single LED bit and send the changed line
void Max7219::led_set(const uint8_t x, const uint8_t y, const bool on) {
- if (x >= MAX7219_X_LEDS || y >= MAX7219_Y_LEDS) return error(PSTR("led_set"), x, y);
+ if (x >= MAX7219_X_LEDS || y >= MAX7219_Y_LEDS) return error(F("led_set"), x, y);
if (BIT_7219(x, y) == on) return;
XOR_7219(x, y);
refresh_unit_line(LED_IND(x, y));
}
void Max7219::led_on(const uint8_t x, const uint8_t y) {
- if (x >= MAX7219_X_LEDS || y >= MAX7219_Y_LEDS) return error(PSTR("led_on"), x, y);
+ if (x >= MAX7219_X_LEDS || y >= MAX7219_Y_LEDS) return error(F("led_on"), x, y);
led_set(x, y, true);
}
void Max7219::led_off(const uint8_t x, const uint8_t y) {
- if (x >= MAX7219_X_LEDS || y >= MAX7219_Y_LEDS) return error(PSTR("led_off"), x, y);
+ if (x >= MAX7219_X_LEDS || y >= MAX7219_Y_LEDS) return error(F("led_off"), x, y);
led_set(x, y, false);
}
void Max7219::led_toggle(const uint8_t x, const uint8_t y) {
- if (x >= MAX7219_X_LEDS || y >= MAX7219_Y_LEDS) return error(PSTR("led_toggle"), x, y);
+ if (x >= MAX7219_X_LEDS || y >= MAX7219_Y_LEDS) return error(F("led_toggle"), x, y);
led_set(x, y, !BIT_7219(x, y));
}
@@ -328,13 +327,13 @@ void Max7219::fill() {
}
void Max7219::clear_row(const uint8_t row) {
- if (row >= MAX7219_Y_LEDS) return error(PSTR("clear_row"), row);
+ if (row >= MAX7219_Y_LEDS) return error(F("clear_row"), row);
LOOP_L_N(x, MAX7219_X_LEDS) CLR_7219(x, row);
send_row(row);
}
void Max7219::clear_column(const uint8_t col) {
- if (col >= MAX7219_X_LEDS) return error(PSTR("set_column"), col);
+ if (col >= MAX7219_X_LEDS) return error(F("set_column"), col);
LOOP_L_N(y, MAX7219_Y_LEDS) CLR_7219(col, y);
send_column(col);
}
@@ -345,7 +344,7 @@ void Max7219::clear_column(const uint8_t col) {
* once with a single call to the function (if rotated 90° or 270°).
*/
void Max7219::set_row(const uint8_t row, const uint32_t val) {
- if (row >= MAX7219_Y_LEDS) return error(PSTR("set_row"), row);
+ if (row >= MAX7219_Y_LEDS) return error(F("set_row"), row);
uint32_t mask = _BV32(MAX7219_X_LEDS - 1);
LOOP_L_N(x, MAX7219_X_LEDS) {
if (val & mask) SET_7219(x, row); else CLR_7219(x, row);
@@ -360,7 +359,7 @@ void Max7219::set_row(const uint8_t row, const uint32_t val) {
* once with a single call to the function (if rotated 0° or 180°).
*/
void Max7219::set_column(const uint8_t col, const uint32_t val) {
- if (col >= MAX7219_X_LEDS) return error(PSTR("set_column"), col);
+ if (col >= MAX7219_X_LEDS) return error(F("set_column"), col);
uint32_t mask = _BV32(MAX7219_Y_LEDS - 1);
LOOP_L_N(y, MAX7219_Y_LEDS) {
if (val & mask) SET_7219(col, y); else CLR_7219(col, y);
@@ -371,56 +370,56 @@ void Max7219::set_column(const uint8_t col, const uint32_t val) {
void Max7219::set_rows_16bits(const uint8_t y, uint32_t val) {
#if MAX7219_X_LEDS == 8
- if (y > MAX7219_Y_LEDS - 2) return error(PSTR("set_rows_16bits"), y, val);
+ if (y > MAX7219_Y_LEDS - 2) return error(F("set_rows_16bits"), y, val);
set_row(y + 1, val); val >>= 8;
set_row(y + 0, val);
#else // at least 16 bits on each row
- if (y > MAX7219_Y_LEDS - 1) return error(PSTR("set_rows_16bits"), y, val);
+ if (y > MAX7219_Y_LEDS - 1) return error(F("set_rows_16bits"), y, val);
set_row(y, val);
#endif
}
void Max7219::set_rows_32bits(const uint8_t y, uint32_t val) {
#if MAX7219_X_LEDS == 8
- if (y > MAX7219_Y_LEDS - 4) return error(PSTR("set_rows_32bits"), y, val);
+ if (y > MAX7219_Y_LEDS - 4) return error(F("set_rows_32bits"), y, val);
set_row(y + 3, val); val >>= 8;
set_row(y + 2, val); val >>= 8;
set_row(y + 1, val); val >>= 8;
set_row(y + 0, val);
#elif MAX7219_X_LEDS == 16
- if (y > MAX7219_Y_LEDS - 2) return error(PSTR("set_rows_32bits"), y, val);
+ if (y > MAX7219_Y_LEDS - 2) return error(F("set_rows_32bits"), y, val);
set_row(y + 1, val); val >>= 16;
set_row(y + 0, val);
#else // at least 24 bits on each row. In the 3 matrix case, just display the low 24 bits
- if (y > MAX7219_Y_LEDS - 1) return error(PSTR("set_rows_32bits"), y, val);
+ if (y > MAX7219_Y_LEDS - 1) return error(F("set_rows_32bits"), y, val);
set_row(y, val);
#endif
}
void Max7219::set_columns_16bits(const uint8_t x, uint32_t val) {
#if MAX7219_Y_LEDS == 8
- if (x > MAX7219_X_LEDS - 2) return error(PSTR("set_columns_16bits"), x, val);
+ if (x > MAX7219_X_LEDS - 2) return error(F("set_columns_16bits"), x, val);
set_column(x + 0, val); val >>= 8;
set_column(x + 1, val);
#else // at least 16 bits in each column
- if (x > MAX7219_X_LEDS - 1) return error(PSTR("set_columns_16bits"), x, val);
+ if (x > MAX7219_X_LEDS - 1) return error(F("set_columns_16bits"), x, val);
set_column(x, val);
#endif
}
void Max7219::set_columns_32bits(const uint8_t x, uint32_t val) {
#if MAX7219_Y_LEDS == 8
- if (x > MAX7219_X_LEDS - 4) return error(PSTR("set_rows_32bits"), x, val);
+ if (x > MAX7219_X_LEDS - 4) return error(F("set_rows_32bits"), x, val);
set_column(x + 3, val); val >>= 8;
set_column(x + 2, val); val >>= 8;
set_column(x + 1, val); val >>= 8;
set_column(x + 0, val);
#elif MAX7219_Y_LEDS == 16
- if (x > MAX7219_X_LEDS - 2) return error(PSTR("set_rows_32bits"), x, val);
+ if (x > MAX7219_X_LEDS - 2) return error(F("set_rows_32bits"), x, val);
set_column(x + 1, val); val >>= 16;
set_column(x + 0, val);
#else // at least 24 bits on each row. In the 3 matrix case, just display the low 24 bits
- if (x > MAX7219_X_LEDS - 1) return error(PSTR("set_rows_32bits"), x, val);
+ if (x > MAX7219_X_LEDS - 1) return error(F("set_rows_32bits"), x, val);
set_column(x, val);
#endif
}
diff --git a/Marlin/src/feature/max7219.h b/Marlin/src/feature/max7219.h
index 3e5b62db2f..c25fef1730 100644
--- a/Marlin/src/feature/max7219.h
+++ b/Marlin/src/feature/max7219.h
@@ -42,6 +42,8 @@
* a Max7219_Set_Row(). The opposite is true for rotations of 0 or 180 degrees.
*/
+#include "../inc/MarlinConfig.h"
+
#ifndef MAX7219_ROTATE
#define MAX7219_ROTATE 0
#endif
@@ -140,7 +142,7 @@ public:
private:
static uint8_t suspended;
- static void error(const char * const func, const int32_t v1, const int32_t v2=-1);
+ static void error(FSTR_P const func, const int32_t v1, const int32_t v2=-1);
static void noop();
static void set(const uint8_t line, const uint8_t bits);
static void send_row(const uint8_t row);
diff --git a/Marlin/src/feature/meatpack.cpp b/Marlin/src/feature/meatpack.cpp
index 2edcd7478a..b2899243b2 100644
--- a/Marlin/src/feature/meatpack.cpp
+++ b/Marlin/src/feature/meatpack.cpp
@@ -169,10 +169,9 @@ void MeatPack::handle_command(const MeatPack_Command c) {
void MeatPack::report_state() {
// NOTE: if any configuration vars are added below, the outgoing sync text for host plugin
// should not contain the "PV' substring, as this is used to indicate protocol version
- SERIAL_ECHOPGM("[MP] ");
- SERIAL_ECHOPGM(MeatPack_ProtocolVersion " ");
+ SERIAL_ECHOPGM("[MP] " MeatPack_ProtocolVersion " ");
serialprint_onoff(TEST(state, MPConfig_Bit_Active));
- SERIAL_ECHOPGM_P(TEST(state, MPConfig_Bit_NoSpaces) ? PSTR(" NSP\n") : PSTR(" ESP\n"));
+ SERIAL_ECHOF(TEST(state, MPConfig_Bit_NoSpaces) ? F(" NSP\n") : F(" ESP\n"));
}
/**
diff --git a/Marlin/src/feature/mmu/mmu.cpp b/Marlin/src/feature/mmu/mmu.cpp
index 7189723138..58c49ed224 100644
--- a/Marlin/src/feature/mmu/mmu.cpp
+++ b/Marlin/src/feature/mmu/mmu.cpp
@@ -24,8 +24,9 @@
#if HAS_PRUSA_MMU1
-#include "../MarlinCore.h"
-#include "../module/planner.h"
+#include "../../MarlinCore.h"
+#include "../../module/planner.h"
+#include "../../module/stepper.h"
void mmu_init() {
SET_OUTPUT(E_MUX0_PIN);
@@ -35,7 +36,7 @@ void mmu_init() {
void select_multiplexed_stepper(const uint8_t e) {
planner.synchronize();
- disable_e_steppers();
+ stepper.disable_e_steppers();
WRITE(E_MUX0_PIN, TEST(e, 0) ? HIGH : LOW);
WRITE(E_MUX1_PIN, TEST(e, 1) ? HIGH : LOW);
WRITE(E_MUX2_PIN, TEST(e, 2) ? HIGH : LOW);
diff --git a/Marlin/src/feature/mmu/mmu2.cpp b/Marlin/src/feature/mmu/mmu2.cpp
index cf03eaf7f6..2813337c63 100644
--- a/Marlin/src/feature/mmu/mmu2.cpp
+++ b/Marlin/src/feature/mmu/mmu2.cpp
@@ -35,7 +35,7 @@ MMU2 mmu2;
#include "../../libs/nozzle.h"
#include "../../module/temperature.h"
#include "../../module/planner.h"
-#include "../../module/stepper/indirection.h"
+#include "../../module/stepper.h"
#include "../../MarlinCore.h"
#if ENABLED(HOST_PROMPT_SUPPORT)
@@ -54,7 +54,7 @@ MMU2 mmu2;
#define MMU_CMD_TIMEOUT 45000UL // 45s timeout for mmu commands (except P0)
#define MMU_P0_TIMEOUT 3000UL // Timeout for P0 command: 3seconds
-#define MMU2_COMMAND(S) tx_str_P(PSTR(S "\n"))
+#define MMU2_COMMAND(S) tx_str(F(S "\n"))
#if ENABLED(MMU_EXTRUDER_SENSOR)
uint8_t mmu_idl_sens = 0;
@@ -229,17 +229,17 @@ void MMU2::mmu_loop() {
if (cmd) {
if (WITHIN(cmd, MMU_CMD_T0, MMU_CMD_T0 + EXTRUDERS - 1)) {
// tool change
- int filament = cmd - MMU_CMD_T0;
+ const int filament = cmd - MMU_CMD_T0;
DEBUG_ECHOLNPGM("MMU <= T", filament);
- tx_printf_P(PSTR("T%d\n"), filament);
+ tx_printf(F("T%d\n"), filament);
TERN_(MMU_EXTRUDER_SENSOR, mmu_idl_sens = 1); // enable idler sensor, if any
state = 3; // wait for response
}
else if (WITHIN(cmd, MMU_CMD_L0, MMU_CMD_L0 + EXTRUDERS - 1)) {
// load
- int filament = cmd - MMU_CMD_L0;
+ const int filament = cmd - MMU_CMD_L0;
DEBUG_ECHOLNPGM("MMU <= L", filament);
- tx_printf_P(PSTR("L%d\n"), filament);
+ tx_printf(F("L%d\n"), filament);
state = 3; // wait for response
}
else if (cmd == MMU_CMD_C0) {
@@ -257,9 +257,9 @@ void MMU2::mmu_loop() {
}
else if (WITHIN(cmd, MMU_CMD_E0, MMU_CMD_E0 + EXTRUDERS - 1)) {
// eject filament
- int filament = cmd - MMU_CMD_E0;
+ const int filament = cmd - MMU_CMD_E0;
DEBUG_ECHOLNPGM("MMU <= E", filament);
- tx_printf_P(PSTR("E%d\n"), filament);
+ tx_printf(F("E%d\n"), filament);
state = 3; // wait for response
}
else if (cmd == MMU_CMD_R0) {
@@ -270,9 +270,9 @@ void MMU2::mmu_loop() {
}
else if (WITHIN(cmd, MMU_CMD_F0, MMU_CMD_F0 + EXTRUDERS - 1)) {
// filament type
- int filament = cmd - MMU_CMD_F0;
+ const int filament = cmd - MMU_CMD_F0;
DEBUG_ECHOLNPGM("MMU <= F", filament, " ", cmd_arg);
- tx_printf_P(PSTR("F%d %d\n"), filament, cmd_arg);
+ tx_printf(F("F%d %d\n"), filament, cmd_arg);
state = 3; // wait for response
}
@@ -356,13 +356,15 @@ void MMU2::mmu_loop() {
*/
bool MMU2::rx_start() {
// check for start message
- return rx_str_P(PSTR("start\n"));
+ return rx_str(F("start\n"));
}
/**
* Check if the data received ends with the given string.
*/
-bool MMU2::rx_str_P(const char *str) {
+bool MMU2::rx_str(FSTR_P fstr) {
+ PGM_P pstr = FTOP(fstr);
+
uint8_t i = strlen(rx_buffer);
while (MMU2_SERIAL.available()) {
@@ -375,14 +377,14 @@ bool MMU2::rx_str_P(const char *str) {
}
rx_buffer[i] = '\0';
- uint8_t len = strlen_P(str);
+ uint8_t len = strlen_P(pstr);
if (i < len) return false;
- str += len;
+ pstr += len;
while (len--) {
- char c0 = pgm_read_byte(str--), c1 = rx_buffer[i--];
+ char c0 = pgm_read_byte(pstr--), c1 = rx_buffer[i--];
if (c0 == c1) continue;
if (c0 == '\r' && c1 == '\n') continue; // match cr as lf
if (c0 == '\n' && c1 == '\r') continue; // match lf as cr
@@ -394,19 +396,19 @@ bool MMU2::rx_str_P(const char *str) {
/**
* Transfer data to MMU, no argument
*/
-void MMU2::tx_str_P(const char *str) {
+void MMU2::tx_str(FSTR_P fstr) {
clear_rx_buffer();
- uint8_t len = strlen_P(str);
- LOOP_L_N(i, len) MMU2_SERIAL.write(pgm_read_byte(str++));
+ PGM_P pstr = FTOP(fstr);
+ while (const char c = pgm_read_byte(pstr)) { MMU2_SERIAL.write(c); pstr++; }
prev_request = millis();
}
/**
* Transfer data to MMU, single argument
*/
-void MMU2::tx_printf_P(const char *format, int argument = -1) {
+void MMU2::tx_printf(FSTR_P format, int argument = -1) {
clear_rx_buffer();
- uint8_t len = sprintf_P(tx_buffer, format, argument);
+ const uint8_t len = sprintf_P(tx_buffer, FTOP(format), argument);
LOOP_L_N(i, len) MMU2_SERIAL.write(tx_buffer[i]);
prev_request = millis();
}
@@ -414,9 +416,9 @@ void MMU2::tx_printf_P(const char *format, int argument = -1) {
/**
* Transfer data to MMU, two arguments
*/
-void MMU2::tx_printf_P(const char *format, int argument1, int argument2) {
+void MMU2::tx_printf(FSTR_P format, int argument1, int argument2) {
clear_rx_buffer();
- uint8_t len = sprintf_P(tx_buffer, format, argument1, argument2);
+ const uint8_t len = sprintf_P(tx_buffer, FTOP(format), argument1, argument2);
LOOP_L_N(i, len) MMU2_SERIAL.write(tx_buffer[i]);
prev_request = millis();
}
@@ -433,7 +435,7 @@ void MMU2::clear_rx_buffer() {
* Check if we received 'ok' from MMU
*/
bool MMU2::rx_ok() {
- if (rx_str_P(PSTR("ok\n"))) {
+ if (rx_str(F("ok\n"))) {
prev_P0_request = millis();
return true;
}
@@ -446,12 +448,12 @@ bool MMU2::rx_ok() {
void MMU2::check_version() {
if (buildnr < MMU_REQUIRED_FW_BUILDNR) {
SERIAL_ERROR_MSG("Invalid MMU2 firmware. Version >= " STRINGIFY(MMU_REQUIRED_FW_BUILDNR) " required.");
- kill(GET_TEXT(MSG_KILL_MMU2_FIRMWARE));
+ kill(GET_TEXT_F(MSG_KILL_MMU2_FIRMWARE));
}
}
static void mmu2_not_responding() {
- LCD_MESSAGEPGM(MSG_MMU2_NOT_RESPONDING);
+ LCD_MESSAGE(MSG_MMU2_NOT_RESPONDING);
BUZZ(100, 659);
BUZZ(200, 698);
BUZZ(100, 659);
@@ -486,8 +488,8 @@ static void mmu2_not_responding() {
if (index != extruder) {
- DISABLE_AXIS_E0();
- ui.status_printf_P(0, GET_TEXT(MSG_MMU2_LOADING_FILAMENT), int(index + 1));
+ stepper.disable_extruder();
+ ui.status_printf(0, GET_TEXT_F(MSG_MMU2_LOADING_FILAMENT), int(index + 1));
command(MMU_CMD_T0 + index);
manage_response(true, true);
@@ -495,7 +497,7 @@ static void mmu2_not_responding() {
if (load_to_gears()) {
extruder = index; // filament change is finished
active_extruder = 0;
- ENABLE_AXIS_E0();
+ stepper.enable_extruder();
SERIAL_ECHO_MSG(STR_ACTIVE_EXTRUDER, extruder);
}
ui.reset_status();
@@ -531,13 +533,13 @@ static void mmu2_not_responding() {
#if ENABLED(MMU2_MENUS)
planner.synchronize();
const uint8_t index = mmu2_choose_filament();
- DISABLE_AXIS_E0();
+ stepper.disable_extruder();
command(MMU_CMD_T0 + index);
manage_response(true, true);
if (load_to_gears()) {
mmu_loop();
- ENABLE_AXIS_E0();
+ stepper.enable_extruder();
extruder = index;
active_extruder = 0;
}
@@ -566,14 +568,14 @@ static void mmu2_not_responding() {
set_runout_valid(false);
if (index != extruder) {
- DISABLE_AXIS_E0();
+ stepper.disable_extruder();
if (FILAMENT_PRESENT()) {
DEBUG_ECHOLNPGM("Unloading\n");
mmu_loading_flag = false;
command(MMU_CMD_U0);
manage_response(true, true);
}
- ui.status_printf_P(0, GET_TEXT(MSG_MMU2_LOADING_FILAMENT), int(index + 1));
+ ui.status_printf(0, GET_TEXT_F(MSG_MMU2_LOADING_FILAMENT), int(index + 1));
mmu_loading_flag = true;
command(MMU_CMD_T0 + index);
manage_response(true, true);
@@ -582,7 +584,7 @@ static void mmu2_not_responding() {
extruder = index;
active_extruder = 0;
- ENABLE_AXIS_E0();
+ stepper.enable_extruder();
SERIAL_ECHO_MSG(STR_ACTIVE_EXTRUDER, extruder);
ui.reset_status();
@@ -620,14 +622,14 @@ static void mmu2_not_responding() {
#if ENABLED(MMU2_MENUS)
planner.synchronize();
uint8_t index = mmu2_choose_filament();
- DISABLE_AXIS_E0();
+ stepper.disable_extruder();
command(MMU_CMD_T0 + index);
manage_response(true, true);
mmu_continue_loading();
command(MMU_CMD_C0);
mmu_loop();
- ENABLE_AXIS_E0();
+ stepper.enable_extruder();
extruder = index;
active_extruder = 0;
#else
@@ -670,14 +672,14 @@ static void mmu2_not_responding() {
set_runout_valid(false);
if (index != extruder) {
- DISABLE_AXIS_E0();
- ui.status_printf_P(0, GET_TEXT(MSG_MMU2_LOADING_FILAMENT), int(index + 1));
+ stepper.disable_extruder();
+ ui.status_printf(0, GET_TEXT_F(MSG_MMU2_LOADING_FILAMENT), int(index + 1));
command(MMU_CMD_T0 + index);
manage_response(true, true);
command(MMU_CMD_C0);
extruder = index; //filament change is finished
active_extruder = 0;
- ENABLE_AXIS_E0();
+ stepper.enable_extruder();
SERIAL_ECHO_MSG(STR_ACTIVE_EXTRUDER, extruder);
ui.reset_status();
}
@@ -714,13 +716,13 @@ static void mmu2_not_responding() {
#if ENABLED(MMU2_MENUS)
planner.synchronize();
uint8_t index = mmu2_choose_filament();
- DISABLE_AXIS_E0();
+ stepper.disable_extruder();
command(MMU_CMD_T0 + index);
manage_response(true, true);
command(MMU_CMD_C0);
mmu_loop();
- ENABLE_AXIS_E0();
+ stepper.enable_extruder();
extruder = index;
active_extruder = 0;
#else
@@ -808,14 +810,14 @@ void MMU2::manage_response(const bool move_axes, const bool turn_off_nozzle) {
if (turn_off_nozzle && resume_hotend_temp) {
thermalManager.setTargetHotend(resume_hotend_temp, active_extruder);
- LCD_MESSAGEPGM(MSG_HEATING);
+ LCD_MESSAGE(MSG_HEATING);
BUZZ(200, 40);
while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(1000);
}
if (move_axes && all_axes_homed()) {
- LCD_MESSAGEPGM(MSG_MMU2_RESUMING);
+ LCD_MESSAGE(MSG_MMU2_RESUMING);
BUZZ(198, 404); BUZZ(4, 0); BUZZ(198, 404);
// Move XY to starting position, then Z
@@ -826,7 +828,7 @@ void MMU2::manage_response(const bool move_axes, const bool turn_off_nozzle) {
}
else {
BUZZ(198, 404); BUZZ(4, 0); BUZZ(198, 404);
- LCD_MESSAGEPGM(MSG_MMU2_RESUMING);
+ LCD_MESSAGE(MSG_MMU2_RESUMING);
}
}
}
@@ -842,7 +844,7 @@ void MMU2::set_filament_type(const uint8_t index, const uint8_t filamentType) {
}
void MMU2::filament_runout() {
- queue.inject_P(PSTR(MMU2_FILAMENT_RUNOUT_SCRIPT));
+ queue.inject(F(MMU2_FILAMENT_RUNOUT_SCRIPT));
planner.synchronize();
}
@@ -853,7 +855,7 @@ void MMU2::filament_runout() {
if (cmd == MMU_CMD_NONE && last_cmd == MMU_CMD_C0) {
if (present && !mmu2s_triggered) {
DEBUG_ECHOLNPGM("MMU <= 'A'");
- tx_str_P(PSTR("A\n"));
+ tx_str(F("A\n"));
}
// Slowly spin the extruder during C0
else {
@@ -908,11 +910,11 @@ bool MMU2::load_filament_to_nozzle(const uint8_t index) {
if (thermalManager.tooColdToExtrude(active_extruder)) {
BUZZ(200, 404);
- LCD_ALERTMESSAGEPGM(MSG_HOTEND_TOO_COLD);
+ LCD_ALERTMESSAGE(MSG_HOTEND_TOO_COLD);
return false;
}
- DISABLE_AXIS_E0();
+ stepper.disable_extruder();
command(MMU_CMD_T0 + index);
manage_response(true, true);
@@ -944,13 +946,13 @@ bool MMU2::eject_filament(const uint8_t index, const bool recover) {
if (thermalManager.tooColdToExtrude(active_extruder)) {
BUZZ(200, 404);
- LCD_ALERTMESSAGEPGM(MSG_HOTEND_TOO_COLD);
+ LCD_ALERTMESSAGE(MSG_HOTEND_TOO_COLD);
return false;
}
- LCD_MESSAGEPGM(MSG_MMU2_EJECTING_FILAMENT);
+ LCD_MESSAGE(MSG_MMU2_EJECTING_FILAMENT);
- ENABLE_AXIS_E0();
+ stepper.enable_extruder();
current_position.e -= MMU2_FILAMENTCHANGE_EJECT_FEED;
line_to_current_position(MMM_TO_MMS(2500));
planner.synchronize();
@@ -958,10 +960,10 @@ bool MMU2::eject_filament(const uint8_t index, const bool recover) {
manage_response(false, false);
if (recover) {
- LCD_MESSAGEPGM(MSG_MMU2_EJECT_RECOVER);
+ LCD_MESSAGE(MSG_MMU2_EJECT_RECOVER);
BUZZ(200, 404);
- TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, PSTR("MMU2 Eject Recover"), CONTINUE_STR));
- TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(PSTR("MMU2 Eject Recover")));
+ TERN_(HOST_PROMPT_SUPPORT, hostui.prompt_do(PROMPT_USER_CONTINUE, F("MMU2 Eject Recover"), FPSTR(CONTINUE_STR)));
+ TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired(F("MMU2 Eject Recover")));
TERN_(HAS_RESUME_CONTINUE, wait_for_user_response());
BUZZ(200, 404);
BUZZ(200, 404);
@@ -979,7 +981,7 @@ bool MMU2::eject_filament(const uint8_t index, const bool recover) {
BUZZ(200, 404);
- DISABLE_AXIS_E0();
+ stepper.disable_extruder();
return true;
}
@@ -993,7 +995,7 @@ bool MMU2::unload() {
if (thermalManager.tooColdToExtrude(active_extruder)) {
BUZZ(200, 404);
- LCD_ALERTMESSAGEPGM(MSG_HOTEND_TOO_COLD);
+ LCD_ALERTMESSAGE(MSG_HOTEND_TOO_COLD);
return false;
}
@@ -1016,7 +1018,7 @@ bool MMU2::unload() {
void MMU2::execute_extruder_sequence(const E_Step * sequence, int steps) {
planner.synchronize();
- ENABLE_AXIS_E0();
+ stepper.enable_extruder();
const E_Step* step = sequence;
@@ -1034,7 +1036,7 @@ void MMU2::execute_extruder_sequence(const E_Step * sequence, int steps) {
step++;
}
- DISABLE_AXIS_E0();
+ stepper.disable_extruder();
}
#endif // HAS_PRUSA_MMU2
diff --git a/Marlin/src/feature/mmu/mmu2.h b/Marlin/src/feature/mmu/mmu2.h
index 95338a5184..9574e2217f 100644
--- a/Marlin/src/feature/mmu/mmu2.h
+++ b/Marlin/src/feature/mmu/mmu2.h
@@ -57,10 +57,10 @@ public:
static bool eject_filament(const uint8_t index, const bool recover);
private:
- static bool rx_str_P(const char *str);
- static void tx_str_P(const char *str);
- static void tx_printf_P(const char *format, const int argument);
- static void tx_printf_P(const char *format, const int argument1, const int argument2);
+ static inline bool rx_str(FSTR_P fstr);
+ static inline void tx_str(FSTR_P fstr);
+ static inline void tx_printf(FSTR_P ffmt, const int argument);
+ static inline void tx_printf(FSTR_P ffmt, const int argument1, const int argument2);
static void clear_rx_buffer();
static bool rx_ok();
diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp
index 3474dbe4b7..bab9b700f1 100644
--- a/Marlin/src/feature/pause.cpp
+++ b/Marlin/src/feature/pause.cpp
@@ -194,17 +194,24 @@ bool load_filament(const_float_t slow_load_length/*=0*/, const_float_t fast_load
KEEPALIVE_STATE(PAUSED_FOR_USER);
wait_for_user = true; // LCD click or M108 will clear this
- TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(PSTR("Load Filament")));
+ TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired(F("Load Filament")));
#if ENABLED(HOST_PROMPT_SUPPORT)
const char tool = '0' + TERN0(MULTI_FILAMENT_SENSOR, active_extruder);
- host_prompt_do(PROMPT_USER_CONTINUE, PSTR("Load Filament T"), tool, CONTINUE_STR);
+ hostui.prompt_do(PROMPT_USER_CONTINUE, F("Load Filament T"), tool, FPSTR(CONTINUE_STR));
#endif
while (wait_for_user) {
impatient_beep(max_beep_count);
#if BOTH(FILAMENT_CHANGE_RESUME_ON_INSERT, FILAMENT_RUNOUT_SENSOR)
- if (READ(FIL_RUNOUT1_PIN) != FIL_RUNOUT1_STATE) wait_for_user = false;
+ #if ENABLED(MULTI_FILAMENT_SENSOR)
+ #define _CASE_INSERTED(N) case N-1: if (READ(FIL_RUNOUT##N##_PIN) != FIL_RUNOUT##N##_STATE) wait_for_user = false; break;
+ switch (active_extruder) {
+ REPEAT_1(NUM_RUNOUT_SENSORS, _CASE_INSERTED)
+ }
+ #else
+ if (READ(FIL_RUNOUT_PIN) != FIL_RUNOUT_STATE) wait_for_user = false;
+ #endif
#endif
idle_no_sleep();
}
@@ -245,9 +252,8 @@ bool load_filament(const_float_t slow_load_length/*=0*/, const_float_t fast_load
if (show_lcd) ui.pause_show_message(PAUSE_MESSAGE_PURGE);
- TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(GET_TEXT(MSG_FILAMENT_CHANGE_PURGE)));
- TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, GET_TEXT(MSG_FILAMENT_CHANGE_PURGE), CONTINUE_STR));
- TERN_(DWIN_CREALITY_LCD_ENHANCED, DWIN_Popup_Confirm(ICON_BLTouch, GET_TEXT(MSG_FILAMENT_CHANGE_PURGE), CONTINUE_STR));
+ TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_PURGE)));
+ TERN_(HOST_PROMPT_SUPPORT, hostui.prompt_do(PROMPT_USER_CONTINUE, GET_TEXT_F(MSG_FILAMENT_CHANGE_PURGE), FPSTR(CONTINUE_STR)));
wait_for_user = true; // A click or M108 breaks the purge_length loop
for (float purge_count = purge_length; purge_count > 0 && wait_for_user; --purge_count)
unscaled_e_move(1, ADVANCED_PAUSE_PURGE_FEEDRATE);
@@ -264,14 +270,14 @@ bool load_filament(const_float_t slow_load_length/*=0*/, const_float_t fast_load
unscaled_e_move(purge_length, ADVANCED_PAUSE_PURGE_FEEDRATE);
}
- TERN_(HOST_PROMPT_SUPPORT, filament_load_host_prompt()); // Initiate another host prompt.
+ TERN_(HOST_PROMPT_SUPPORT, hostui.filament_load_prompt()); // Initiate another host prompt.
#if M600_PURGE_MORE_RESUMABLE
if (show_lcd) {
// Show "Purge More" / "Resume" menu and wait for reply
KEEPALIVE_STATE(PAUSED_FOR_USER);
wait_for_user = false;
- #if EITHER(HAS_LCD_MENU, DWIN_CREALITY_LCD_ENHANCED)
+ #if ANY(HAS_LCD_MENU, DWIN_CREALITY_LCD_ENHANCED, DWIN_CREALITY_LCD_JYERSUI)
ui.pause_show_message(PAUSE_MESSAGE_OPTION); // Also sets PAUSE_RESPONSE_WAIT_FOR
#else
pause_menu_response = PAUSE_RESPONSE_WAIT_FOR;
@@ -284,7 +290,7 @@ bool load_filament(const_float_t slow_load_length/*=0*/, const_float_t fast_load
} while (TERN0(M600_PURGE_MORE_RESUMABLE, pause_menu_response == PAUSE_RESPONSE_EXTRUDE_MORE));
#endif
- TERN_(HOST_PROMPT_SUPPORT, host_action_prompt_end());
+ TERN_(HOST_PROMPT_SUPPORT, hostui.prompt_end());
return true;
}
@@ -295,8 +301,8 @@ bool load_filament(const_float_t slow_load_length/*=0*/, const_float_t fast_load
* send current back to their board, potentially frying it.
*/
inline void disable_active_extruder() {
- #if HAS_E_STEPPER_ENABLE
- disable_e_stepper(active_extruder);
+ #if HAS_EXTRUDERS
+ stepper.DISABLE_EXTRUDER(active_extruder);
safe_delay(100);
#endif
}
@@ -390,13 +396,13 @@ bool pause_print(const_float_t retract, const xyz_pos_t &park_point, const bool
#if ENABLED(HOST_ACTION_COMMANDS)
#ifdef ACTION_ON_PAUSED
- host_action_paused();
+ hostui.paused();
#elif defined(ACTION_ON_PAUSE)
- host_action_pause();
+ hostui.pause();
#endif
#endif
- TERN_(HOST_PROMPT_SUPPORT, host_prompt_open(PROMPT_INFO, PSTR("Pause"), DISMISS_STR));
+ TERN_(HOST_PROMPT_SUPPORT, hostui.prompt_open(PROMPT_INFO, F("Pause"), FPSTR(DISMISS_STR)));
// Indicate that the printer is paused
++did_pause_print;
@@ -479,7 +485,7 @@ void show_continue_prompt(const bool is_reload) {
ui.pause_show_message(is_reload ? PAUSE_MESSAGE_INSERT : PAUSE_MESSAGE_WAITING);
SERIAL_ECHO_START();
- SERIAL_ECHOPGM_P(is_reload ? PSTR(_PMSG(STR_FILAMENT_CHANGE_INSERT) "\n") : PSTR(_PMSG(STR_FILAMENT_CHANGE_WAIT) "\n"));
+ SERIAL_ECHOF(is_reload ? F(_PMSG(STR_FILAMENT_CHANGE_INSERT) "\n") : F(_PMSG(STR_FILAMENT_CHANGE_WAIT) "\n"));
}
void wait_for_confirmation(const bool is_reload/*=false*/, const int8_t max_beep_count/*=0*/ DXC_ARGS) {
@@ -505,8 +511,8 @@ void wait_for_confirmation(const bool is_reload/*=false*/, const int8_t max_beep
// Wait for filament insert by user and press button
KEEPALIVE_STATE(PAUSED_FOR_USER);
- TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, GET_TEXT(MSG_NOZZLE_PARKED), CONTINUE_STR));
- TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(GET_TEXT(MSG_NOZZLE_PARKED)));
+ TERN_(HOST_PROMPT_SUPPORT, hostui.prompt_do(PROMPT_USER_CONTINUE, GET_TEXT_F(MSG_NOZZLE_PARKED), FPSTR(CONTINUE_STR)));
+ TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_NOZZLE_PARKED)));
wait_for_user = true; // LCD click or M108 will clear this
while (wait_for_user) {
impatient_beep(max_beep_count);
@@ -521,17 +527,17 @@ void wait_for_confirmation(const bool is_reload/*=false*/, const int8_t max_beep
ui.pause_show_message(PAUSE_MESSAGE_HEAT);
SERIAL_ECHO_MSG(_PMSG(STR_FILAMENT_CHANGE_HEAT));
- TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, GET_TEXT(MSG_HEATER_TIMEOUT), GET_TEXT(MSG_REHEAT)));
+ TERN_(HOST_PROMPT_SUPPORT, hostui.prompt_do(PROMPT_USER_CONTINUE, GET_TEXT_F(MSG_HEATER_TIMEOUT), GET_TEXT_F(MSG_REHEAT)));
- TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(GET_TEXT(MSG_HEATER_TIMEOUT)));
+ TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_HEATER_TIMEOUT)));
TERN_(HAS_RESUME_CONTINUE, wait_for_user_response(0, true)); // Wait for LCD click or M108
- TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_INFO, GET_TEXT(MSG_REHEATING)));
+ TERN_(HOST_PROMPT_SUPPORT, hostui.prompt_do(PROMPT_INFO, GET_TEXT_F(MSG_REHEATING)));
- TERN_(EXTENSIBLE_UI, ExtUI::onStatusChanged_P(GET_TEXT(MSG_REHEATING)));
+ TERN_(EXTENSIBLE_UI, ExtUI::onStatusChanged(GET_TEXT_F(MSG_REHEATING)));
- TERN_(DWIN_CREALITY_LCD_ENHANCED, ui.set_status_P(GET_TEXT(MSG_REHEATING)));
+ TERN_(DWIN_CREALITY_LCD_ENHANCED, LCD_MESSAGE(MSG_REHEATING));
// Re-enable the heaters if they timed out
HOTEND_LOOP() thermalManager.reset_hotend_idle_timer(e);
@@ -547,17 +553,13 @@ void wait_for_confirmation(const bool is_reload/*=false*/, const int8_t max_beep
HOTEND_LOOP() thermalManager.heater_idle[e].start(nozzle_timeout);
- TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, GET_TEXT(MSG_REHEATDONE), CONTINUE_STR));
+ TERN_(HOST_PROMPT_SUPPORT, hostui.prompt_do(PROMPT_USER_CONTINUE, GET_TEXT_F(MSG_REHEATDONE), FPSTR(CONTINUE_STR)));
+ TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_REHEATDONE)));
+ TERN_(DWIN_CREALITY_LCD_ENHANCED, LCD_MESSAGE(MSG_REHEATDONE));
- TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(GET_TEXT(MSG_REHEATDONE)));
+ IF_DISABLED(PAUSE_REHEAT_FAST_RESUME, wait_for_user = true);
- TERN_(DWIN_CREALITY_LCD_ENHANCED, ui.set_status_P(GET_TEXT(MSG_REHEATDONE)));
-
- #if DISABLED(FILAMENT_CHANGE_FAST_RESUME)
- wait_for_user = true;
- #endif
nozzle_timed_out = false;
-
first_impatient_beep(max_beep_count);
}
idle_no_sleep();
@@ -661,14 +663,14 @@ void resume_print(const_float_t slow_load_length/*=0*/, const_float_t fast_load_
ui.pause_show_message(PAUSE_MESSAGE_STATUS);
#ifdef ACTION_ON_RESUMED
- host_action_resumed();
+ hostui.resumed();
#elif defined(ACTION_ON_RESUME)
- host_action_resume();
+ hostui.resume();
#endif
--did_pause_print;
- TERN_(HOST_PROMPT_SUPPORT, host_prompt_open(PROMPT_INFO, PSTR("Resuming"), DISMISS_STR));
+ TERN_(HOST_PROMPT_SUPPORT, hostui.prompt_open(PROMPT_INFO, F("Resuming"), FPSTR(DISMISS_STR)));
// Resume the print job timer if it was running
if (print_job_timer.isPaused()) print_job_timer.start();
diff --git a/Marlin/src/feature/power.cpp b/Marlin/src/feature/power.cpp
index b86249fbc0..fabe35b989 100644
--- a/Marlin/src/feature/power.cpp
+++ b/Marlin/src/feature/power.cpp
@@ -27,7 +27,7 @@
#include "../inc/MarlinConfig.h"
#include "power.h"
-#include "../module/stepper/indirection.h"
+#include "../module/stepper.h"
#include "../MarlinCore.h"
#if ENABLED(PS_OFF_SOUND)
@@ -82,7 +82,7 @@ void Power::power_on() {
TERN_(HAS_TRINAMIC_CONFIG, safe_delay(PSU_POWERUP_DELAY));
#ifdef PSU_POWERUP_GCODE
- GcodeSuite::process_subcommands_now_P(PSTR(PSU_POWERUP_GCODE));
+ gcode.process_subcommands_now(F(PSU_POWERUP_GCODE));
#endif
}
@@ -95,7 +95,7 @@ void Power::power_off() {
if (!psu_on) return;
#ifdef PSU_POWEROFF_GCODE
- GcodeSuite::process_subcommands_now_P(PSTR(PSU_POWEROFF_GCODE));
+ gcode.process_subcommands_now(F(PSU_POWEROFF_GCODE));
#endif
#if ENABLED(PS_OFF_SOUND)
@@ -120,6 +120,9 @@ void Power::power_off() {
*/
bool Power::is_power_needed() {
+ // If any of the stepper drivers are enabled...
+ if (stepper.axis_enabled.bits) return true;
+
if (printJobOngoing() || printingIsPaused()) return true;
#if ENABLED(AUTO_POWER_FANS)
@@ -140,23 +143,6 @@ void Power::power_off() {
if (TERN0(AUTO_POWER_COOLER_FAN, thermalManager.coolerfan_speed))
return true;
- // If any of the drivers or the bed are enabled...
- if (X_ENABLE_READ() == X_ENABLE_ON || Y_ENABLE_READ() == Y_ENABLE_ON || Z_ENABLE_READ() == Z_ENABLE_ON
- #if HAS_X2_ENABLE
- || X2_ENABLE_READ() == X_ENABLE_ON
- #endif
- #if HAS_Y2_ENABLE
- || Y2_ENABLE_READ() == Y_ENABLE_ON
- #endif
- #if HAS_Z2_ENABLE
- || Z2_ENABLE_READ() == Z_ENABLE_ON
- #endif
- #if E_STEPPERS
- #define _OR_ENABLED_E(N) || E##N##_ENABLE_READ() == E_ENABLE_ON
- REPEAT(E_STEPPERS, _OR_ENABLED_E)
- #endif
- ) return true;
-
#if HAS_HOTEND
HOTEND_LOOP() if (thermalManager.degTargetHotend(e) > 0 || thermalManager.temp_hotend[e].soft_pwm_amount > 0) return true;
#endif
diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp
index 159121ba45..723ec1903b 100644
--- a/Marlin/src/feature/powerloss.cpp
+++ b/Marlin/src/feature/powerloss.cpp
@@ -109,7 +109,7 @@ void PrintJobRecovery::check() {
if (card.isMounted()) {
load();
if (!valid()) return cancel();
- queue.inject_P(PSTR("M1000S"));
+ queue.inject(F("M1000S"));
}
}
@@ -130,7 +130,7 @@ void PrintJobRecovery::load() {
(void)file.read(&info, sizeof(info));
close();
}
- debug(PSTR("Load"));
+ debug(F("Load"));
}
/**
@@ -186,7 +186,7 @@ void PrintJobRecovery::save(const bool force/*=false*/, const float zraise/*=POW
TERN_(GCODE_REPEAT_MARKERS, info.stored_repeat = repeat);
TERN_(HAS_HOME_OFFSET, info.home_offset = home_offset);
TERN_(HAS_POSITION_SHIFT, info.position_shift = position_shift);
- TERN_(HAS_MULTI_EXTRUDER, info.active_extruder = active_extruder);
+ E_TERN_(info.active_extruder = active_extruder);
#if DISABLED(NO_VOLUMETRICS)
info.flag.volumetric_enabled = parser.volumetric_enabled;
@@ -244,7 +244,7 @@ void PrintJobRecovery::save(const bool force/*=false*/, const float zraise/*=POW
#if POWER_LOSS_RETRACT_LEN
// Retract filament now
- gcode.process_subcommands_now_P(PSTR("G1 F3000 E-" STRINGIFY(POWER_LOSS_RETRACT_LEN)));
+ gcode.process_subcommands_now(F("G1 F3000 E-" STRINGIFY(POWER_LOSS_RETRACT_LEN)));
#endif
#if POWER_LOSS_ZRAISE
@@ -301,7 +301,7 @@ void PrintJobRecovery::save(const bool force/*=false*/, const float zraise/*=POW
retract_and_lift(zraise);
#endif
- kill(GET_TEXT(MSG_OUTAGE_RECOVERY));
+ kill(GET_TEXT_F(MSG_OUTAGE_RECOVERY));
}
#endif
@@ -311,7 +311,7 @@ void PrintJobRecovery::save(const bool force/*=false*/, const float zraise/*=POW
*/
void PrintJobRecovery::write() {
- debug(PSTR("Write"));
+ debug(F("Write"));
open(false);
file.seekSet(0);
@@ -337,7 +337,7 @@ void PrintJobRecovery::resume() {
#if HAS_LEVELING
// Make sure leveling is off before any G92 and G28
- gcode.process_subcommands_now_P(PSTR("M420 S0 Z0"));
+ gcode.process_subcommands_now(F("M420 S0 Z0"));
#endif
#if HAS_HEATED_BED
@@ -373,7 +373,7 @@ void PrintJobRecovery::resume() {
// establish the current position as best we can.
//
- gcode.process_subcommands_now_P(PSTR("G92.9E0")); // Reset E to 0
+ gcode.process_subcommands_now(F("G92.9E0")); // Reset E to 0
#if Z_HOME_TO_MAX
@@ -410,7 +410,7 @@ void PrintJobRecovery::resume() {
}
// Home XY with no Z raise, and also home Z here if Z isn't homing down below.
- gcode.process_subcommands_now_P(PSTR("G28R0" TERN_(HOME_XY_ONLY, "XY"))); // No raise during G28
+ gcode.process_subcommands_now(F("G28R0" TERN_(HOME_XY_ONLY, "XY"))); // No raise during G28
#endif
@@ -513,7 +513,7 @@ void PrintJobRecovery::resume() {
// Un-retract if there was a retract at outage
#if ENABLED(BACKUP_POWER_SUPPLY) && POWER_LOSS_RETRACT_LEN > 0
- gcode.process_subcommands_now_P(PSTR("G1E" STRINGIFY(POWER_LOSS_RETRACT_LEN) "F3000"));
+ gcode.process_subcommands_now(F("G1E" STRINGIFY(POWER_LOSS_RETRACT_LEN) "F3000"));
#endif
// Additional purge on resume if configured
@@ -523,7 +523,7 @@ void PrintJobRecovery::resume() {
#endif
#if ENABLED(NOZZLE_CLEAN_FEATURE)
- gcode.process_subcommands_now_P(PSTR("G12"));
+ gcode.process_subcommands_now(F("G12"));
#endif
// Move back over to the saved XY
@@ -575,8 +575,8 @@ void PrintJobRecovery::resume() {
#if ENABLED(DEBUG_POWER_LOSS_RECOVERY)
- void PrintJobRecovery::debug(PGM_P const prefix) {
- DEBUG_ECHOPGM_P(prefix);
+ void PrintJobRecovery::debug(FSTR_P const prefix) {
+ DEBUG_ECHOF(prefix);
DEBUG_ECHOLNPGM(" Job Recovery Info...\nvalid_head:", info.valid_head, " valid_foot:", info.valid_foot);
if (info.valid_head) {
if (info.valid_head == info.valid_foot) {
diff --git a/Marlin/src/feature/powerloss.h b/Marlin/src/feature/powerloss.h
index 6a13c92df7..76cb398af2 100644
--- a/Marlin/src/feature/powerloss.h
+++ b/Marlin/src/feature/powerloss.h
@@ -204,9 +204,9 @@ class PrintJobRecovery {
static inline bool valid() { return info.valid() && interrupted_file_exists(); }
#if ENABLED(DEBUG_POWER_LOSS_RECOVERY)
- static void debug(PGM_P const prefix);
+ static void debug(FSTR_P const prefix);
#else
- static inline void debug(PGM_P const) {}
+ static inline void debug(FSTR_P const) {}
#endif
private:
diff --git a/Marlin/src/feature/probe_temp_comp.cpp b/Marlin/src/feature/probe_temp_comp.cpp
index 68984fe756..9a975d6763 100644
--- a/Marlin/src/feature/probe_temp_comp.cpp
+++ b/Marlin/src/feature/probe_temp_comp.cpp
@@ -22,37 +22,53 @@
#include "../inc/MarlinConfigPre.h"
-#if ENABLED(PROBE_TEMP_COMPENSATION)
+#if HAS_PTC
+
+//#define DEBUG_PTC // Print extra debug output with 'M871'
#include "probe_temp_comp.h"
#include
-ProbeTempComp temp_comp;
+ProbeTempComp ptc;
-int16_t ProbeTempComp::z_offsets_probe[cali_info_init[TSI_PROBE].measurements], // = {0}
- ProbeTempComp::z_offsets_bed[cali_info_init[TSI_BED].measurements]; // = {0}
+#if ENABLED(PTC_PROBE)
+ constexpr int16_t z_offsets_probe_default[PTC_PROBE_COUNT] = PTC_PROBE_ZOFFS;
+ int16_t ProbeTempComp::z_offsets_probe[PTC_PROBE_COUNT] = PTC_PROBE_ZOFFS;
+#endif
-#if ENABLED(USE_TEMP_EXT_COMPENSATION)
- int16_t ProbeTempComp::z_offsets_ext[cali_info_init[TSI_EXT].measurements]; // = {0}
+#if ENABLED(PTC_BED)
+ constexpr int16_t z_offsets_bed_default[PTC_BED_COUNT] = PTC_BED_ZOFFS;
+ int16_t ProbeTempComp::z_offsets_bed[PTC_BED_COUNT] = PTC_BED_ZOFFS;
+#endif
+
+#if ENABLED(PTC_HOTEND)
+ constexpr int16_t z_offsets_hotend_default[PTC_HOTEND_COUNT] = PTC_HOTEND_ZOFFS;
+ int16_t ProbeTempComp::z_offsets_hotend[PTC_HOTEND_COUNT] = PTC_HOTEND_ZOFFS;
#endif
int16_t *ProbeTempComp::sensor_z_offsets[TSI_COUNT] = {
- ProbeTempComp::z_offsets_probe, ProbeTempComp::z_offsets_bed
- OPTARG(USE_TEMP_EXT_COMPENSATION, ProbeTempComp::z_offsets_ext)
+ #if ENABLED(PTC_PROBE)
+ ProbeTempComp::z_offsets_probe,
+ #endif
+ #if ENABLED(PTC_BED)
+ ProbeTempComp::z_offsets_bed,
+ #endif
+ #if ENABLED(PTC_HOTEND)
+ ProbeTempComp::z_offsets_hotend,
+ #endif
};
-const temp_calib_t ProbeTempComp::cali_info[TSI_COUNT] = {
- cali_info_init[TSI_PROBE], cali_info_init[TSI_BED]
- OPTARG(USE_TEMP_EXT_COMPENSATION, cali_info_init[TSI_EXT])
-};
-
-constexpr xyz_pos_t ProbeTempComp::park_point;
-constexpr xy_pos_t ProbeTempComp::measure_point;
-constexpr celsius_t ProbeTempComp::probe_calib_bed_temp;
+constexpr temp_calib_t ProbeTempComp::cali_info[TSI_COUNT];
uint8_t ProbeTempComp::calib_idx; // = 0
float ProbeTempComp::init_measurement; // = 0.0
+void ProbeTempComp::reset() {
+ TERN_(PTC_PROBE, LOOP_L_N(i, PTC_PROBE_COUNT) z_offsets_probe[i] = z_offsets_probe_default[i]);
+ TERN_(PTC_BED, LOOP_L_N(i, PTC_BED_COUNT) z_offsets_bed[i] = z_offsets_bed_default[i]);
+ TERN_(PTC_HOTEND, LOOP_L_N(i, PTC_HOTEND_COUNT) z_offsets_hotend[i] = z_offsets_hotend_default[i]);
+}
+
void ProbeTempComp::clear_offsets(const TempSensorID tsi) {
LOOP_L_N(i, cali_info[tsi].measurements)
sensor_z_offsets[tsi][i] = 0;
@@ -69,19 +85,26 @@ void ProbeTempComp::print_offsets() {
LOOP_L_N(s, TSI_COUNT) {
celsius_t temp = cali_info[s].start_temp;
for (int16_t i = -1; i < cali_info[s].measurements; ++i) {
- SERIAL_ECHOPGM_P(s == TSI_BED ? PSTR("Bed") :
- #if ENABLED(USE_TEMP_EXT_COMPENSATION)
- s == TSI_EXT ? PSTR("Extruder") :
- #endif
- PSTR("Probe")
+ SERIAL_ECHOF(
+ TERN_(PTC_BED, s == TSI_BED ? F("Bed") :)
+ TERN_(PTC_HOTEND, s == TSI_EXT ? F("Extruder") :)
+ F("Probe")
);
SERIAL_ECHOLNPGM(
" temp: ", temp,
"C; Offset: ", i < 0 ? 0.0f : sensor_z_offsets[s][i], " um"
);
- temp += cali_info[s].temp_res;
+ temp += cali_info[s].temp_resolution;
}
}
+ #if ENABLED(DEBUG_PTC)
+ float meas[4] = { 0, 0, 0, 0 };
+ compensate_measurement(TSI_PROBE, 27.5, meas[0]);
+ compensate_measurement(TSI_PROBE, 32.5, meas[1]);
+ compensate_measurement(TSI_PROBE, 77.5, meas[2]);
+ compensate_measurement(TSI_PROBE, 82.5, meas[3]);
+ SERIAL_ECHOLNPGM("DEBUG_PTC 27.5:", meas[0], " 32.5:", meas[1], " 77.5:", meas[2], " 82.5:", meas[3]);
+ #endif
}
void ProbeTempComp::prepare_new_calibration(const_float_t init_meas_z) {
@@ -90,28 +113,20 @@ void ProbeTempComp::prepare_new_calibration(const_float_t init_meas_z) {
}
void ProbeTempComp::push_back_new_measurement(const TempSensorID tsi, const_float_t meas_z) {
- switch (tsi) {
- case TSI_PROBE:
- case TSI_BED:
- //case TSI_EXT:
- if (calib_idx >= cali_info[tsi].measurements) return;
- sensor_z_offsets[tsi][calib_idx++] = static_cast(meas_z * 1000.0f - init_measurement * 1000.0f);
- default: break;
- }
+ if (calib_idx >= cali_info[tsi].measurements) return;
+ sensor_z_offsets[tsi][calib_idx++] = static_cast((meas_z - init_measurement) * 1000.0f);
}
bool ProbeTempComp::finish_calibration(const TempSensorID tsi) {
- if (tsi != TSI_PROBE && tsi != TSI_BED) return false;
-
- if (calib_idx < 3) {
- SERIAL_ECHOLNPGM("!Insufficient measurements (min. 3).");
+ if (!calib_idx) {
+ SERIAL_ECHOLNPGM("!No measurements.");
clear_offsets(tsi);
return false;
}
const uint8_t measurements = cali_info[tsi].measurements;
const celsius_t start_temp = cali_info[tsi].start_temp,
- res_temp = cali_info[tsi].temp_res;
+ res_temp = cali_info[tsi].temp_resolution;
int16_t * const data = sensor_z_offsets[tsi];
// Extrapolate
@@ -120,16 +135,15 @@ bool ProbeTempComp::finish_calibration(const TempSensorID tsi) {
SERIAL_ECHOLNPGM("Got ", calib_idx, " measurements. ");
if (linear_regression(tsi, k, d)) {
SERIAL_ECHOPGM("Applying linear extrapolation");
- calib_idx--;
for (; calib_idx < measurements; ++calib_idx) {
- const celsius_float_t temp = start_temp + float(calib_idx) * res_temp;
+ const celsius_float_t temp = start_temp + float(calib_idx + 1) * res_temp;
data[calib_idx] = static_cast(k * temp + d);
}
}
else {
// Simply use the last measured value for higher temperatures
SERIAL_ECHOPGM("Failed to extrapolate");
- const int16_t last_val = data[calib_idx];
+ const int16_t last_val = data[calib_idx-1];
for (; calib_idx < measurements; ++calib_idx)
data[calib_idx] = last_val;
}
@@ -147,7 +161,7 @@ bool ProbeTempComp::finish_calibration(const TempSensorID tsi) {
// Restrict the max. offset difference between two probings
if (calib_idx > 0 && ABS(data[calib_idx - 1] - data[calib_idx]) > 800) {
SERIAL_ECHOLNPGM("!Invalid Z-offset between two probings detected (0-0.8).");
- clear_offsets(TSI_PROBE);
+ clear_offsets(tsi);
return false;
}
}
@@ -156,55 +170,52 @@ bool ProbeTempComp::finish_calibration(const TempSensorID tsi) {
}
void ProbeTempComp::compensate_measurement(const TempSensorID tsi, const celsius_t temp, float &meas_z) {
- if (WITHIN(temp, cali_info[tsi].start_temp, cali_info[tsi].end_temp))
- meas_z -= get_offset_for_temperature(tsi, temp);
-}
-
-float ProbeTempComp::get_offset_for_temperature(const TempSensorID tsi, const celsius_t temp) {
const uint8_t measurements = cali_info[tsi].measurements;
const celsius_t start_temp = cali_info[tsi].start_temp,
- res_temp = cali_info[tsi].temp_res;
+ res_temp = cali_info[tsi].temp_resolution,
+ end_temp = start_temp + measurements * res_temp;
const int16_t * const data = sensor_z_offsets[tsi];
- auto point = [&](uint8_t i) -> xy_float_t {
- return xy_float_t({ static_cast(start_temp) + i * res_temp, static_cast(data[i]) });
+ // Given a data index, return { celsius, zoffset } in the form { x, y }
+ auto tpoint = [&](uint8_t i) -> xy_float_t {
+ return xy_float_t({ static_cast(start_temp) + i * res_temp, i ? static_cast(data[i - 1]) : 0.0f });
};
+ // Interpolate Z based on a temperature being within a given range
auto linear_interp = [](const_float_t x, xy_float_t p1, xy_float_t p2) {
- return (p2.y - p1.y) / (p2.x - p2.y) * (x - p1.x) + p1.y;
+ // zoffs1 + zoffset_per_toffset * toffset
+ return p1.y + (p2.y - p1.y) / (p2.x - p1.x) * (x - p1.x);
};
- // Linear interpolation
- uint8_t idx = static_cast((temp - start_temp) / res_temp);
-
// offset in µm
float offset = 0.0f;
- #if !defined(PTC_LINEAR_EXTRAPOLATION) || PTC_LINEAR_EXTRAPOLATION <= 0
- if (idx < 0)
- offset = 0.0f;
- else if (idx > measurements - 2)
- offset = static_cast(data[measurements - 1]);
+ #if PTC_LINEAR_EXTRAPOLATION
+ if (temp < start_temp)
+ offset = linear_interp(temp, tpoint(0), tpoint(PTC_LINEAR_EXTRAPOLATION));
+ else if (temp >= end_temp)
+ offset = linear_interp(temp, tpoint(measurements - PTC_LINEAR_EXTRAPOLATION), tpoint(measurements));
#else
- if (idx < 0)
- offset = linear_interp(temp, point(0), point(PTC_LINEAR_EXTRAPOLATION));
- else if (idx > measurements - 2)
- offset = linear_interp(temp, point(measurements - PTC_LINEAR_EXTRAPOLATION - 1), point(measurements - 1));
+ if (temp < start_temp)
+ offset = 0.0f;
+ else if (temp >= end_temp)
+ offset = static_cast(data[measurements - 1]);
#endif
- else
- offset = linear_interp(temp, point(idx), point(idx + 1));
+ else {
+ // Linear interpolation
+ const int8_t idx = static_cast((temp - start_temp) / res_temp);
+ offset = linear_interp(temp, tpoint(idx), tpoint(idx + 1));
+ }
- // return offset in mm
- return offset / 1000.0f;
+ // convert offset to mm and apply it
+ meas_z -= offset / 1000.0f;
}
bool ProbeTempComp::linear_regression(const TempSensorID tsi, float &k, float &d) {
- if (tsi != TSI_PROBE && tsi != TSI_BED) return false;
-
- if (!WITHIN(calib_idx, 2, cali_info[tsi].measurements)) return false;
+ if (!WITHIN(calib_idx, 1, cali_info[tsi].measurements)) return false;
const celsius_t start_temp = cali_info[tsi].start_temp,
- res_temp = cali_info[tsi].temp_res;
+ res_temp = cali_info[tsi].temp_resolution;
const int16_t * const data = sensor_z_offsets[tsi];
float sum_x = start_temp,
@@ -234,4 +245,4 @@ bool ProbeTempComp::linear_regression(const TempSensorID tsi, float &k, float &d
return true;
}
-#endif // PROBE_TEMP_COMPENSATION
+#endif // HAS_PTC
diff --git a/Marlin/src/feature/probe_temp_comp.h b/Marlin/src/feature/probe_temp_comp.h
index f5f922410c..4579f2187c 100644
--- a/Marlin/src/feature/probe_temp_comp.h
+++ b/Marlin/src/feature/probe_temp_comp.h
@@ -24,19 +24,22 @@
#include "../inc/MarlinConfig.h"
enum TempSensorID : uint8_t {
- TSI_PROBE,
- TSI_BED,
- #if ENABLED(USE_TEMP_EXT_COMPENSATION)
+ #if ENABLED(PTC_PROBE)
+ TSI_PROBE,
+ #endif
+ #if ENABLED(PTC_BED)
+ TSI_BED,
+ #endif
+ #if ENABLED(PTC_HOTEND)
TSI_EXT,
#endif
TSI_COUNT
};
typedef struct {
- uint8_t measurements; // Max. number of measurements to be stored (35 - 80°C)
- celsius_t temp_res, // Resolution in °C between measurements
- start_temp, // Base measurement; z-offset == 0
- end_temp;
+ uint8_t measurements; // Max. number of measurements to be stored (35 - 80°C)
+ celsius_t temp_resolution, // Resolution in °C between measurements
+ start_temp; // Base measurement; z-offset == 0
} temp_calib_t;
/**
@@ -45,79 +48,40 @@ typedef struct {
* measurement errors/shifts due to changed temperature.
*/
-// Probe temperature calibration constants
-#ifndef PTC_SAMPLE_COUNT
- #define PTC_SAMPLE_COUNT 10
-#endif
-#ifndef PTC_SAMPLE_RES
- #define PTC_SAMPLE_RES 5
-#endif
-#ifndef PTC_SAMPLE_START
- #define PTC_SAMPLE_START 30
-#endif
-#define PTC_SAMPLE_END (PTC_SAMPLE_START + (PTC_SAMPLE_COUNT) * PTC_SAMPLE_RES)
-
-// Bed temperature calibration constants
-#ifndef BTC_PROBE_TEMP
- #define BTC_PROBE_TEMP 30
-#endif
-#ifndef BTC_SAMPLE_COUNT
- #define BTC_SAMPLE_COUNT 10
-#endif
-#ifndef BTC_SAMPLE_RES
- #define BTC_SAMPLE_RES 5
-#endif
-#ifndef BTC_SAMPLE_START
- #define BTC_SAMPLE_START 60
-#endif
-#define BTC_SAMPLE_END (BTC_SAMPLE_START + (BTC_SAMPLE_COUNT) * BTC_SAMPLE_RES)
-
-#ifndef PTC_PROBE_HEATING_OFFSET
- #define PTC_PROBE_HEATING_OFFSET 0.5f
-#endif
-
-#ifndef PTC_PROBE_RAISE
- #define PTC_PROBE_RAISE 10
-#endif
-
-static constexpr temp_calib_t cali_info_init[TSI_COUNT] = {
- { PTC_SAMPLE_COUNT, PTC_SAMPLE_RES, PTC_SAMPLE_START, PTC_SAMPLE_END }, // Probe
- { BTC_SAMPLE_COUNT, BTC_SAMPLE_RES, BTC_SAMPLE_START, BTC_SAMPLE_END }, // Bed
- #if ENABLED(USE_TEMP_EXT_COMPENSATION)
- { 20, 5, 180, 180 + 5 * 20 } // Extruder
- #endif
-};
-
class ProbeTempComp {
public:
- static const temp_calib_t cali_info[TSI_COUNT];
+ static constexpr temp_calib_t cali_info[TSI_COUNT] = {
+ #if ENABLED(PTC_PROBE)
+ { PTC_PROBE_COUNT, PTC_PROBE_RES, PTC_PROBE_START }, // Probe
+ #endif
+ #if ENABLED(PTC_BED)
+ { PTC_BED_COUNT, PTC_BED_RES, PTC_BED_START }, // Bed
+ #endif
+ #if ENABLED(PTC_HOTEND)
+ { PTC_HOTEND_COUNT, PTC_HOTEND_RES, PTC_HOTEND_START }, // Extruder
+ #endif
+ };
- // Where to park nozzle to wait for probe cooldown
- static constexpr xyz_pos_t park_point = PTC_PARK_POS;
-
- // XY coordinates of nozzle for probing the bed
- static constexpr xy_pos_t measure_point = PTC_PROBE_POS; // Coordinates to probe
- //measure_point = { 12.0f, 7.3f }; // Coordinates for the MK52 magnetic heatbed
-
- static constexpr celsius_t probe_calib_bed_temp = BED_MAX_TARGET, // Bed temperature while calibrating probe
- bed_calib_probe_temp = BTC_PROBE_TEMP; // Probe temperature while calibrating bed
-
- static int16_t *sensor_z_offsets[TSI_COUNT],
- z_offsets_probe[cali_info_init[TSI_PROBE].measurements], // (µm)
- z_offsets_bed[cali_info_init[TSI_BED].measurements]; // (µm)
-
- #if ENABLED(USE_TEMP_EXT_COMPENSATION)
- static int16_t z_offsets_ext[cali_info_init[TSI_EXT].measurements]; // (µm)
+ static int16_t *sensor_z_offsets[TSI_COUNT];
+ #if ENABLED(PTC_PROBE)
+ static int16_t z_offsets_probe[PTC_PROBE_COUNT]; // (µm)
+ #endif
+ #if ENABLED(PTC_BED)
+ static int16_t z_offsets_bed[PTC_BED_COUNT]; // (µm)
+ #endif
+ #if ENABLED(PTC_HOTEND)
+ static int16_t z_offsets_hotend[PTC_HOTEND_COUNT]; // (µm)
#endif
static inline void reset_index() { calib_idx = 0; };
static inline uint8_t get_index() { return calib_idx; }
+ static void reset();
static void clear_offsets(const TempSensorID tsi);
static inline void clear_all_offsets() {
- clear_offsets(TSI_BED);
- clear_offsets(TSI_PROBE);
- TERN_(USE_TEMP_EXT_COMPENSATION, clear_offsets(TSI_EXT));
+ TERN_(PTC_PROBE, clear_offsets(TSI_PROBE));
+ TERN_(PTC_BED, clear_offsets(TSI_BED));
+ TERN_(PTC_HOTEND, clear_offsets(TSI_EXT));
}
static bool set_offset(const TempSensorID tsi, const uint8_t idx, const int16_t offset);
static void print_offsets();
@@ -135,8 +99,6 @@ class ProbeTempComp {
*/
static float init_measurement;
- static float get_offset_for_temperature(const TempSensorID tsi, const celsius_t temp);
-
/**
* Fit a linear function in measured temperature offsets
* to allow generating values of higher temperatures.
@@ -144,4 +106,4 @@ class ProbeTempComp {
static bool linear_regression(const TempSensorID tsi, float &k, float &d);
};
-extern ProbeTempComp temp_comp;
+extern ProbeTempComp ptc;
diff --git a/Marlin/src/feature/repeat.cpp b/Marlin/src/feature/repeat.cpp
index b52feb4a00..165f71fd0f 100644
--- a/Marlin/src/feature/repeat.cpp
+++ b/Marlin/src/feature/repeat.cpp
@@ -19,6 +19,7 @@
* along with this program. If not, see .
*
*/
+
#include "../inc/MarlinConfig.h"
#if ENABLED(GCODE_REPEAT_MARKERS)
diff --git a/Marlin/src/feature/runout.cpp b/Marlin/src/feature/runout.cpp
index 1c56378359..9317e3489a 100644
--- a/Marlin/src/feature/runout.cpp
+++ b/Marlin/src/feature/runout.cpp
@@ -96,8 +96,7 @@ void event_filament_runout(const uint8_t extruder) {
//action:out_of_filament
#if ENABLED(HOST_PROMPT_SUPPORT)
- host_action_prompt_begin(PROMPT_FILAMENT_RUNOUT, PSTR("FilamentRunout T"), tool);
- host_action_prompt_show();
+ hostui.prompt_do(PROMPT_FILAMENT_RUNOUT, F("FilamentRunout T"), tool); //action:out_of_filament
#endif
const bool run_runout_script = !runout.host_handling;
@@ -109,18 +108,18 @@ void event_filament_runout(const uint8_t extruder) {
|| TERN0(ADVANCED_PAUSE_FEATURE, strstr(FILAMENT_RUNOUT_SCRIPT, "M25"))
)
) {
- host_action_paused(false);
+ hostui.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);
+ hostui.action(F(ACTION_ON_FILAMENT_RUNOUT " T"), false);
SERIAL_CHAR(tool);
SERIAL_EOL();
#endif
- host_action_pause(false);
+ hostui.pause(false);
}
SERIAL_ECHOPGM(" " ACTION_REASON_ON_FILAMENT_RUNOUT " ");
SERIAL_CHAR(tool);
@@ -140,7 +139,7 @@ void event_filament_runout(const uint8_t extruder) {
SERIAL_ECHOPGM("Runout Command: ");
SERIAL_ECHOLNPGM(FILAMENT_RUNOUT_SCRIPT);
#endif
- queue.inject_P(PSTR(FILAMENT_RUNOUT_SCRIPT));
+ queue.inject(F(FILAMENT_RUNOUT_SCRIPT));
#endif
}
}
diff --git a/Marlin/src/feature/runout.h b/Marlin/src/feature/runout.h
index d88e81d9d9..8065e51555 100644
--- a/Marlin/src/feature/runout.h
+++ b/Marlin/src/feature/runout.h
@@ -317,7 +317,7 @@ class FilamentSensorBase {
static uint8_t was_out; // = 0
if (out != TEST(was_out, s)) {
TBI(was_out, s);
- SERIAL_ECHOLNPGM_P(PSTR("Filament Sensor "), '0' + s, out ? PSTR(" OUT") : PSTR(" IN"));
+ SERIAL_ECHOLNF(F("Filament Sensor "), AS_DIGIT(s), out ? F(" OUT") : F(" IN"));
}
#endif
}
@@ -352,7 +352,7 @@ class FilamentSensorBase {
if (ELAPSED(ms, t)) {
t = millis() + 1000UL;
LOOP_L_N(i, NUM_RUNOUT_SENSORS)
- SERIAL_ECHOPGM_P(i ? PSTR(", ") : PSTR("Remaining mm: "), runout_mm_countdown[i]);
+ SERIAL_ECHOF(i ? F(", ") : F("Remaining mm: "), runout_mm_countdown[i]);
SERIAL_EOL();
}
#endif
@@ -373,7 +373,7 @@ class FilamentSensorBase {
// Only trigger on extrusion with XYZ movement to allow filament change and retract/recover.
const uint8_t e = b->extruder;
const int32_t steps = b->steps.e;
- runout_mm_countdown[e] -= (TEST(b->direction_bits, E_AXIS) ? -steps : steps) * planner.steps_to_mm[E_AXIS_N(e)];
+ runout_mm_countdown[e] -= (TEST(b->direction_bits, E_AXIS) ? -steps : steps) * planner.mm_per_step[E_AXIS_N(e)];
}
}
};
diff --git a/Marlin/src/feature/solenoid.cpp b/Marlin/src/feature/solenoid.cpp
index 623f223caa..b6795d1a1e 100644
--- a/Marlin/src/feature/solenoid.cpp
+++ b/Marlin/src/feature/solenoid.cpp
@@ -34,28 +34,12 @@
#include "../module/tool_change.h"
#endif
-#define HAS_SOLENOID(N) (HAS_SOLENOID_##N && (ENABLED(MANUAL_SOLENOID_CONTROL) || N < EXTRUDERS))
-
// Used primarily with MANUAL_SOLENOID_CONTROL
static void set_solenoid(const uint8_t num, const bool active) {
const uint8_t value = active ? PE_MAGNET_ON_STATE : !PE_MAGNET_ON_STATE;
+ #define _SOL_CASE(N) case N: TERN_(HAS_SOLENOID_##N, OUT_WRITE(SOL##N##_PIN, value)); break;
switch (num) {
- case 0: OUT_WRITE(SOL0_PIN, value); break;
- #if HAS_SOLENOID(1)
- case 1: OUT_WRITE(SOL1_PIN, value); break;
- #endif
- #if HAS_SOLENOID(2)
- case 2: OUT_WRITE(SOL2_PIN, value); break;
- #endif
- #if HAS_SOLENOID(3)
- case 3: OUT_WRITE(SOL3_PIN, value); break;
- #endif
- #if HAS_SOLENOID(4)
- case 4: OUT_WRITE(SOL4_PIN, value); break;
- #endif
- #if HAS_SOLENOID(5)
- case 5: OUT_WRITE(SOL5_PIN, value); break;
- #endif
+ REPEAT(8, _SOL_CASE)
default: SERIAL_ECHO_MSG(STR_INVALID_SOLENOID); break;
}
@@ -67,25 +51,11 @@ static void set_solenoid(const uint8_t num, const bool active) {
void enable_solenoid(const uint8_t num) { set_solenoid(num, true); }
void disable_solenoid(const uint8_t num) { set_solenoid(num, false); }
-void enable_solenoid_on_active_extruder() { enable_solenoid(active_extruder); }
+void enable_solenoid_on_active_extruder() { }
void disable_all_solenoids() {
- disable_solenoid(0);
- #if HAS_SOLENOID(1)
- disable_solenoid(1);
- #endif
- #if HAS_SOLENOID(2)
- disable_solenoid(2);
- #endif
- #if HAS_SOLENOID(3)
- disable_solenoid(3);
- #endif
- #if HAS_SOLENOID(4)
- disable_solenoid(4);
- #endif
- #if HAS_SOLENOID(5)
- disable_solenoid(5);
- #endif
+ #define _SOL_DISABLE(N) TERN_(HAS_SOLENOID_##N, disable_solenoid(N));
+ REPEAT(8, _SOL_DISABLE)
}
#endif // EXT_SOLENOID || MANUAL_SOLENOID_CONTROL
diff --git a/Marlin/src/feature/spindle_laser.cpp b/Marlin/src/feature/spindle_laser.cpp
index ea6fc4990e..9297e9b95c 100644
--- a/Marlin/src/feature/spindle_laser.cpp
+++ b/Marlin/src/feature/spindle_laser.cpp
@@ -66,7 +66,7 @@ void SpindleLaser::init() {
#endif
#if ENABLED(SPINDLE_LASER_USE_PWM)
SET_PWM(SPINDLE_LASER_PWM_PIN);
- analogWrite(pin_t(SPINDLE_LASER_PWM_PIN), SPINDLE_LASER_PWM_OFF); // Set to lowest speed
+ set_pwm_duty(pin_t(SPINDLE_LASER_PWM_PIN), SPINDLE_LASER_PWM_OFF); // Set to lowest speed
#endif
#if ENABLED(HAL_CAN_SET_PWM_FREQ) && defined(SPINDLE_LASER_FREQUENCY)
set_pwm_frequency(pin_t(SPINDLE_LASER_PWM_PIN), SPINDLE_LASER_FREQUENCY);
@@ -92,10 +92,8 @@ void SpindleLaser::init() {
void SpindleLaser::_set_ocr(const uint8_t ocr) {
#if NEEDS_HARDWARE_PWM && SPINDLE_LASER_FREQUENCY
set_pwm_frequency(pin_t(SPINDLE_LASER_PWM_PIN), TERN(MARLIN_DEV_MODE, frequency, SPINDLE_LASER_FREQUENCY));
- set_pwm_duty(pin_t(SPINDLE_LASER_PWM_PIN), ocr ^ SPINDLE_LASER_PWM_OFF);
- #else
- analogWrite(pin_t(SPINDLE_LASER_PWM_PIN), ocr ^ SPINDLE_LASER_PWM_OFF);
#endif
+ set_pwm_duty(pin_t(SPINDLE_LASER_PWM_PIN), ocr ^ SPINDLE_LASER_PWM_OFF);
}
void SpindleLaser::set_ocr(const uint8_t ocr) {
diff --git a/Marlin/src/feature/stepper_driver_safety.cpp b/Marlin/src/feature/stepper_driver_safety.cpp
index 991f5a5906..11b90954b4 100644
--- a/Marlin/src/feature/stepper_driver_safety.cpp
+++ b/Marlin/src/feature/stepper_driver_safety.cpp
@@ -28,78 +28,52 @@
static uint32_t axis_plug_backward = 0;
-void stepper_driver_backward_error(PGM_P str) {
+void stepper_driver_backward_error(FSTR_P const fstr) {
SERIAL_ERROR_START();
- SERIAL_ECHOPGM_P(str);
+ SERIAL_ECHOF(fstr);
SERIAL_ECHOLNPGM(" driver is backward!");
- ui.status_printf_P(2, PSTR(S_FMT S_FMT), str, GET_TEXT(MSG_DRIVER_BACKWARD));
+ ui.status_printf(2, F(S_FMT S_FMT), FTOP(fstr), GET_TEXT(MSG_DRIVER_BACKWARD));
}
void stepper_driver_backward_check() {
OUT_WRITE(SAFE_POWER_PIN, LOW);
- #define TEST_BACKWARD(AXIS, BIT) do { \
+ #define _TEST_BACKWARD(AXIS, BIT) do { \
SET_INPUT(AXIS##_ENABLE_PIN); \
OUT_WRITE(AXIS##_STEP_PIN, false); \
delay(20); \
if (READ(AXIS##_ENABLE_PIN) == false) { \
SBI(axis_plug_backward, BIT); \
- stepper_driver_backward_error(PSTR(STRINGIFY(AXIS))); \
+ stepper_driver_backward_error(F(STRINGIFY(AXIS))); \
} \
}while(0)
- #if HAS_X_ENABLE
- TEST_BACKWARD(X, 0);
- #endif
- #if HAS_X2_ENABLE
- TEST_BACKWARD(X2, 1);
- #endif
+ #define TEST_BACKWARD(AXIS, BIT) TERN_(HAS_##AXIS##_ENABLE, _TEST_BACKWARD(AXIS, BIT))
- #if HAS_Y_ENABLE
- TEST_BACKWARD(Y, 2);
- #endif
- #if HAS_Y2_ENABLE
- TEST_BACKWARD(Y2, 3);
- #endif
+ TEST_BACKWARD(X, 0);
+ TEST_BACKWARD(X2, 1);
- #if HAS_Z_ENABLE
- TEST_BACKWARD(Z, 4);
- #endif
- #if HAS_Z2_ENABLE
- TEST_BACKWARD(Z2, 5);
- #endif
- #if HAS_Z3_ENABLE
- TEST_BACKWARD(Z3, 6);
- #endif
- #if HAS_Z4_ENABLE
- TEST_BACKWARD(Z4, 7);
- #endif
+ TEST_BACKWARD(Y, 2);
+ TEST_BACKWARD(Y2, 3);
- #if HAS_E0_ENABLE
- TEST_BACKWARD(E0, 8);
- #endif
- #if HAS_E1_ENABLE
- TEST_BACKWARD(E1, 9);
- #endif
- #if HAS_E2_ENABLE
- TEST_BACKWARD(E2, 10);
- #endif
- #if HAS_E3_ENABLE
- TEST_BACKWARD(E3, 11);
- #endif
- #if HAS_E4_ENABLE
- TEST_BACKWARD(E4, 12);
- #endif
- #if HAS_E5_ENABLE
- TEST_BACKWARD(E5, 13);
- #endif
- #if HAS_E6_ENABLE
- TEST_BACKWARD(E6, 14);
- #endif
- #if HAS_E7_ENABLE
- TEST_BACKWARD(E7, 15);
- #endif
+ TEST_BACKWARD(Z, 4);
+ TEST_BACKWARD(Z2, 5);
+ TEST_BACKWARD(Z3, 6);
+ TEST_BACKWARD(Z4, 7);
+
+ TEST_BACKWARD(I, 8);
+ TEST_BACKWARD(J, 9);
+ TEST_BACKWARD(K, 10);
+
+ TEST_BACKWARD(E0, 11);
+ TEST_BACKWARD(E1, 12);
+ TEST_BACKWARD(E2, 13);
+ TEST_BACKWARD(E3, 14);
+ TEST_BACKWARD(E4, 15);
+ TEST_BACKWARD(E5, 16);
+ TEST_BACKWARD(E6, 17);
+ TEST_BACKWARD(E7, 18);
if (!axis_plug_backward)
WRITE(SAFE_POWER_PIN, HIGH);
@@ -108,64 +82,36 @@ void stepper_driver_backward_check() {
void stepper_driver_backward_report() {
if (!axis_plug_backward) return;
- auto _report_if_backward = [](PGM_P axis, uint8_t bit) {
+ auto _report_if_backward = [](FSTR_P const axis, uint8_t bit) {
if (TEST(axis_plug_backward, bit))
stepper_driver_backward_error(axis);
};
- #define REPORT_BACKWARD(axis, bit) _report_if_backward(PSTR(STRINGIFY(axis)), bit)
+ #define REPORT_BACKWARD(axis, bit) TERN_(HAS_##axis##_ENABLE, _report_if_backward(F(STRINGIFY(axis)), bit))
- #if HAS_X_ENABLE
- REPORT_BACKWARD(X, 0);
- #endif
- #if HAS_X2_ENABLE
- REPORT_BACKWARD(X2, 1);
- #endif
+ REPORT_BACKWARD(X, 0);
+ REPORT_BACKWARD(X2, 1);
- #if HAS_Y_ENABLE
- REPORT_BACKWARD(Y, 2);
- #endif
- #if HAS_Y2_ENABLE
- REPORT_BACKWARD(Y2, 3);
- #endif
+ REPORT_BACKWARD(Y, 2);
+ REPORT_BACKWARD(Y2, 3);
- #if HAS_Z_ENABLE
- REPORT_BACKWARD(Z, 4);
- #endif
- #if HAS_Z2_ENABLE
- REPORT_BACKWARD(Z2, 5);
- #endif
- #if HAS_Z3_ENABLE
- REPORT_BACKWARD(Z3, 6);
- #endif
- #if HAS_Z4_ENABLE
- REPORT_BACKWARD(Z4, 7);
- #endif
+ REPORT_BACKWARD(Z, 4);
+ REPORT_BACKWARD(Z2, 5);
+ REPORT_BACKWARD(Z3, 6);
+ REPORT_BACKWARD(Z4, 7);
- #if HAS_E0_ENABLE
- REPORT_BACKWARD(E0, 8);
- #endif
- #if HAS_E1_ENABLE
- REPORT_BACKWARD(E1, 9);
- #endif
- #if HAS_E2_ENABLE
- REPORT_BACKWARD(E2, 10);
- #endif
- #if HAS_E3_ENABLE
- REPORT_BACKWARD(E3, 11);
- #endif
- #if HAS_E4_ENABLE
- REPORT_BACKWARD(E4, 12);
- #endif
- #if HAS_E5_ENABLE
- REPORT_BACKWARD(E5, 13);
- #endif
- #if HAS_E6_ENABLE
- REPORT_BACKWARD(E6, 14);
- #endif
- #if HAS_E7_ENABLE
- REPORT_BACKWARD(E7, 15);
- #endif
+ REPORT_BACKWARD(I, 8);
+ REPORT_BACKWARD(J, 9);
+ REPORT_BACKWARD(K, 10);
+
+ REPORT_BACKWARD(E0, 11);
+ REPORT_BACKWARD(E1, 12);
+ REPORT_BACKWARD(E2, 13);
+ REPORT_BACKWARD(E3, 14);
+ REPORT_BACKWARD(E4, 15);
+ REPORT_BACKWARD(E5, 16);
+ REPORT_BACKWARD(E6, 17);
+ REPORT_BACKWARD(E7, 18);
}
#endif // HAS_DRIVER_SAFE_POWER_PROTECT
diff --git a/Marlin/src/feature/tmc_util.cpp b/Marlin/src/feature/tmc_util.cpp
index 97fedf13c5..82c10e6e8e 100644
--- a/Marlin/src/feature/tmc_util.cpp
+++ b/Marlin/src/feature/tmc_util.cpp
@@ -212,7 +212,7 @@
if (data.is_ot) SERIAL_ECHOLNPGM("overtemperature");
if (data.is_s2g) SERIAL_ECHOLNPGM("coil short circuit");
TERN_(TMC_DEBUG, tmc_report_all());
- kill(PSTR("Driver error"));
+ kill(F("Driver error"));
}
#endif
@@ -561,7 +561,7 @@
};
template
- static void print_vsense(TMC &st) { SERIAL_ECHOPGM_P(st.vsense() ? PSTR("1=.18") : PSTR("0=.325")); }
+ static void print_vsense(TMC &st) { SERIAL_ECHOF(st.vsense() ? F("1=.18") : F("0=.325")); }
#if HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC5130)
static void _tmc_status(TMC2130Stepper &st, const TMC_debug_enum i) {
@@ -732,7 +732,7 @@
SERIAL_ECHO(st.cs());
SERIAL_ECHOPGM("/31");
break;
- case TMC_VSENSE: SERIAL_ECHOPGM_P(st.vsense() ? PSTR("1=.165") : PSTR("0=.310")); break;
+ case TMC_VSENSE: SERIAL_ECHOF(st.vsense() ? F("1=.165") : F("0=.310")); break;
case TMC_MICROSTEPS: SERIAL_ECHO(st.microsteps()); break;
//case TMC_OTPW: serialprint_truefalse(st.otpw()); break;
//case TMC_OTPW_TRIGGERED: serialprint_truefalse(st.getOTPW()); break;
@@ -1256,15 +1256,14 @@ static bool test_connection(TMC &st) {
if (test_result > 0) SERIAL_ECHOPGM("Error: All ");
- const char *stat;
+ FSTR_P stat;
switch (test_result) {
default:
- case 0: stat = PSTR("OK"); break;
- case 1: stat = PSTR("HIGH"); break;
- case 2: stat = PSTR("LOW"); break;
+ case 0: stat = F("OK"); break;
+ case 1: stat = F("HIGH"); break;
+ case 2: stat = F("LOW"); break;
}
- SERIAL_ECHOPGM_P(stat);
- SERIAL_EOL();
+ SERIAL_ECHOLNF(stat);
return test_result;
}
@@ -1342,7 +1341,7 @@ void test_tmc_connection(LOGICAL_AXIS_ARGS(const bool)) {
#endif
}
- if (axis_connection) LCD_MESSAGEPGM(MSG_ERROR_TMC);
+ if (axis_connection) LCD_MESSAGE(MSG_ERROR_TMC);
}
#endif // HAS_TRINAMIC_CONFIG
diff --git a/Marlin/src/feature/twibus.cpp b/Marlin/src/feature/twibus.cpp
index 5f5209cdd4..e33581676c 100644
--- a/Marlin/src/feature/twibus.cpp
+++ b/Marlin/src/feature/twibus.cpp
@@ -28,11 +28,17 @@
#include
+#include "../libs/hex_print.h"
+
TWIBus i2c;
TWIBus::TWIBus() {
#if I2C_SLAVE_ADDRESS == 0
- Wire.begin(); // No address joins the BUS as the master
+ Wire.begin( // No address joins the BUS as the master
+ #if PINS_EXIST(I2C_SCL, I2C_SDA) && DISABLED(SOFT_I2C_EEPROM)
+ pin_t(I2C_SDA_PIN), pin_t(I2C_SCL_PIN)
+ #endif
+ );
#else
Wire.begin(I2C_SLAVE_ADDRESS); // Join the bus as a slave
#endif
@@ -51,27 +57,27 @@ void TWIBus::address(const uint8_t adr) {
addr = adr;
- debug(PSTR("address"), adr);
+ debug(F("address"), adr);
}
void TWIBus::addbyte(const char c) {
if (buffer_s >= COUNT(buffer)) return;
buffer[buffer_s++] = c;
- debug(PSTR("addbyte"), c);
+ debug(F("addbyte"), c);
}
void TWIBus::addbytes(char src[], uint8_t bytes) {
- debug(PSTR("addbytes"), bytes);
+ debug(F("addbytes"), bytes);
while (bytes--) addbyte(*src++);
}
void TWIBus::addstring(char str[]) {
- debug(PSTR("addstring"), str);
+ debug(F("addstring"), str);
while (char c = *str++) addbyte(c);
}
void TWIBus::send() {
- debug(PSTR("send"), addr);
+ debug(F("send"), addr);
Wire.beginTransmission(I2C_ADDRESS(addr));
Wire.write(buffer, buffer_s);
@@ -81,21 +87,60 @@ void TWIBus::send() {
}
// static
-void TWIBus::echoprefix(uint8_t bytes, const char pref[], uint8_t adr) {
+void TWIBus::echoprefix(uint8_t bytes, FSTR_P const pref, uint8_t adr) {
SERIAL_ECHO_START();
- SERIAL_ECHOPGM_P(pref);
+ SERIAL_ECHOF(pref);
SERIAL_ECHOPGM(": from:", adr, " bytes:", bytes, " data:");
}
// static
-void TWIBus::echodata(uint8_t bytes, const char pref[], uint8_t adr) {
+void TWIBus::echodata(uint8_t bytes, FSTR_P const pref, uint8_t adr, const uint8_t style/*=0*/) {
+ union TwoBytesToInt16 { uint8_t bytes[2]; int16_t integervalue; };
+ TwoBytesToInt16 ConversionUnion;
+
echoprefix(bytes, pref, adr);
- while (bytes-- && Wire.available()) SERIAL_CHAR(Wire.read());
+
+ while (bytes-- && Wire.available()) {
+ int value = Wire.read();
+ switch (style) {
+
+ // Style 1, HEX DUMP
+ case 1:
+ SERIAL_CHAR(hex_nybble((value & 0xF0) >> 4));
+ SERIAL_CHAR(hex_nybble(value & 0x0F));
+ if (bytes) SERIAL_CHAR(' ');
+ break;
+
+ // Style 2, signed two byte integer (int16)
+ case 2:
+ if (bytes == 1)
+ ConversionUnion.bytes[1] = (uint8_t)value;
+ else if (bytes == 0) {
+ ConversionUnion.bytes[0] = (uint8_t)value;
+ // Output value in base 10 (standard decimal)
+ SERIAL_ECHO(ConversionUnion.integervalue);
+ }
+ break;
+
+ // Style 3, unsigned byte, base 10 (uint8)
+ case 3:
+ SERIAL_ECHO(value);
+ if (bytes) SERIAL_CHAR(' ');
+ break;
+
+ // Default style (zero), raw serial output
+ default:
+ // This can cause issues with some serial consoles, Pronterface is an example where things go wrong
+ SERIAL_CHAR(value);
+ break;
+ }
+ }
+
SERIAL_EOL();
}
-void TWIBus::echobuffer(const char pref[], uint8_t adr) {
- echoprefix(buffer_s, pref, adr);
+void TWIBus::echobuffer(FSTR_P const prefix, uint8_t adr) {
+ echoprefix(buffer_s, prefix, adr);
LOOP_L_N(i, buffer_s) SERIAL_CHAR(buffer[i]);
SERIAL_EOL();
}
@@ -103,22 +148,22 @@ void TWIBus::echobuffer(const char pref[], uint8_t adr) {
bool TWIBus::request(const uint8_t bytes) {
if (!addr) return false;
- debug(PSTR("request"), bytes);
+ debug(F("request"), bytes);
// requestFrom() is a blocking function
if (Wire.requestFrom(I2C_ADDRESS(addr), bytes) == 0) {
- debug("request fail", I2C_ADDRESS(addr));
+ debug(F("request fail"), I2C_ADDRESS(addr));
return false;
}
return true;
}
-void TWIBus::relay(const uint8_t bytes) {
- debug(PSTR("relay"), bytes);
+void TWIBus::relay(const uint8_t bytes, const uint8_t style/*=0*/) {
+ debug(F("relay"), bytes);
if (request(bytes))
- echodata(bytes, PSTR("i2c-reply"), addr);
+ echodata(bytes, F("i2c-reply"), addr, style);
}
uint8_t TWIBus::capture(char *dst, const uint8_t bytes) {
@@ -127,7 +172,7 @@ uint8_t TWIBus::capture(char *dst, const uint8_t bytes) {
while (count < bytes && Wire.available())
dst[count++] = Wire.read();
- debug(PSTR("capture"), count);
+ debug(F("capture"), count);
return count;
}
@@ -140,12 +185,12 @@ void TWIBus::flush() {
#if I2C_SLAVE_ADDRESS > 0
void TWIBus::receive(uint8_t bytes) {
- debug(PSTR("receive"), bytes);
- echodata(bytes, PSTR("i2c-receive"), 0);
+ debug(F("receive"), bytes);
+ echodata(bytes, F("i2c-receive"), 0);
}
void TWIBus::reply(char str[]/*=nullptr*/) {
- debug(PSTR("reply"), str);
+ debug(F("reply"), str);
if (str) {
reset();
@@ -170,18 +215,16 @@ void TWIBus::flush() {
#if ENABLED(DEBUG_TWIBUS)
// static
- void TWIBus::prefix(const char func[]) {
- SERIAL_ECHOPGM("TWIBus::");
- SERIAL_ECHOPGM_P(func);
- SERIAL_ECHOPGM(": ");
+ void TWIBus::prefix(FSTR_P const func) {
+ SERIAL_ECHOPGM("TWIBus::", func, ": ");
}
- void TWIBus::debug(const char func[], uint32_t adr) {
+ void TWIBus::debug(FSTR_P const func, uint32_t adr) {
if (DEBUGGING(INFO)) { prefix(func); SERIAL_ECHOLN(adr); }
}
- void TWIBus::debug(const char func[], char c) {
+ void TWIBus::debug(FSTR_P const func, char c) {
if (DEBUGGING(INFO)) { prefix(func); SERIAL_ECHOLN(c); }
}
- void TWIBus::debug(const char func[], char str[]) {
+ void TWIBus::debug(FSTR_P const func, char str[]) {
if (DEBUGGING(INFO)) { prefix(func); SERIAL_ECHOLN(str); }
}
diff --git a/Marlin/src/feature/twibus.h b/Marlin/src/feature/twibus.h
index 5939153482..d2c7270303 100644
--- a/Marlin/src/feature/twibus.h
+++ b/Marlin/src/feature/twibus.h
@@ -142,7 +142,7 @@ class TWIBus {
*
* @param bytes the number of bytes to request
*/
- static void echoprefix(uint8_t bytes, const char prefix[], uint8_t adr);
+ static void echoprefix(uint8_t bytes, FSTR_P const prefix, uint8_t adr);
/**
* @brief Echo data on the bus to serial
@@ -150,8 +150,9 @@ class TWIBus {
* to serial in a parser-friendly format.
*
* @param bytes the number of bytes to request
+ * @param style Output format for the bytes, 0 = Raw byte [default], 1 = Hex characters, 2 = uint16_t
*/
- static void echodata(uint8_t bytes, const char prefix[], uint8_t adr);
+ static void echodata(uint8_t bytes, FSTR_P const prefix, uint8_t adr, const uint8_t style=0);
/**
* @brief Echo data in the buffer to serial
@@ -160,7 +161,7 @@ class TWIBus {
*
* @param bytes the number of bytes to request
*/
- void echobuffer(const char prefix[], uint8_t adr);
+ void echobuffer(FSTR_P const prefix, uint8_t adr);
/**
* @brief Request data from the slave device and wait.
@@ -192,10 +193,11 @@ class TWIBus {
* @brief Request data from the slave device, echo to serial.
* @details Request a number of bytes from a slave device and output
* the returned data to serial in a parser-friendly format.
+ * @style Output format for the bytes, 0 = raw byte [default], 1 = Hex characters, 2 = uint16_t
*
* @param bytes the number of bytes to request
*/
- void relay(const uint8_t bytes);
+ void relay(const uint8_t bytes, const uint8_t style=0);
#if I2C_SLAVE_ADDRESS > 0
@@ -237,17 +239,16 @@ class TWIBus {
* @brief Prints a debug message
* @details Prints a simple debug message "TWIBus::function: value"
*/
- static void prefix(const char func[]);
- static void debug(const char func[], uint32_t adr);
- static void debug(const char func[], char c);
- static void debug(const char func[], char adr[]);
- static inline void debug(const char func[], uint8_t v) { debug(func, (uint32_t)v); }
+ static void prefix(FSTR_P const func);
+ static void debug(FSTR_P const func, uint32_t adr);
+ static void debug(FSTR_P const func, char c);
+ static void debug(FSTR_P const func, char adr[]);
#else
- static inline void debug(const char[], uint32_t) {}
- static inline void debug(const char[], char) {}
- static inline void debug(const char[], char[]) {}
- static inline void debug(const char[], uint8_t) {}
+ static inline void debug(FSTR_P const, uint32_t) {}
+ static inline void debug(FSTR_P const, char) {}
+ static inline void debug(FSTR_P const, char[]) {}
#endif
+ static inline void debug(FSTR_P const func, uint8_t v) { debug(func, (uint32_t)v); }
};
extern TWIBus i2c;
diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp
index ba14e6f0b4..728771d580 100644
--- a/Marlin/src/gcode/bedlevel/G26.cpp
+++ b/Marlin/src/gcode/bedlevel/G26.cpp
@@ -163,7 +163,7 @@ float g26_random_deviation = 0.0;
*/
bool user_canceled() {
if (!ui.button_pressed()) return false; // Return if the button isn't pressed
- ui.set_status_P(GET_TEXT(MSG_G26_CANCELED), 99);
+ ui.set_status(GET_TEXT_F(MSG_G26_CANCELED), 99);
TERN_(HAS_LCD_MENU, ui.quick_feedback());
ui.wait_for_release();
return true;
@@ -323,7 +323,7 @@ typedef struct {
if (bed_temp > 25) {
#if HAS_WIRED_LCD
- ui.set_status_P(GET_TEXT(MSG_G26_HEATING_BED), 99);
+ ui.set_status(GET_TEXT_F(MSG_G26_HEATING_BED), 99);
ui.quick_feedback();
TERN_(HAS_LCD_MENU, ui.capture());
#endif
@@ -342,7 +342,7 @@ typedef struct {
// Start heating the active nozzle
#if HAS_WIRED_LCD
- ui.set_status_P(GET_TEXT(MSG_G26_HEATING_NOZZLE), 99);
+ ui.set_status(GET_TEXT_F(MSG_G26_HEATING_NOZZLE), 99);
ui.quick_feedback();
#endif
thermalManager.setTargetHotend(hotend_temp, active_extruder);
@@ -372,7 +372,7 @@ typedef struct {
if (prime_flag == -1) { // The user wants to control how much filament gets purged
ui.capture();
- ui.set_status_P(GET_TEXT(MSG_G26_MANUAL_PRIME), 99);
+ ui.set_status(GET_TEXT_F(MSG_G26_MANUAL_PRIME), 99);
ui.chirp();
destination = current_position;
@@ -399,7 +399,7 @@ typedef struct {
ui.wait_for_release();
- ui.set_status_P(GET_TEXT(MSG_G26_PRIME_DONE), 99);
+ ui.set_status(GET_TEXT_F(MSG_G26_PRIME_DONE), 99);
ui.quick_feedback();
ui.release();
}
@@ -407,7 +407,7 @@ typedef struct {
#endif
{
#if HAS_WIRED_LCD
- ui.set_status_P(GET_TEXT(MSG_G26_FIXED_LENGTH), 99);
+ ui.set_status(GET_TEXT_F(MSG_G26_FIXED_LENGTH), 99);
ui.quick_feedback();
#endif
destination = current_position;
@@ -520,7 +520,7 @@ void GcodeSuite::G26() {
g26.keep_heaters_on = parser.boolval('K');
// Accept 'I' if temperature presets are defined
- #if PREHEAT_COUNT
+ #if HAS_PREHEAT
const uint8_t preset_index = parser.seenval('I') ? _MIN(parser.value_byte(), PREHEAT_COUNT - 1) + 1 : 0;
#endif
@@ -530,7 +530,7 @@ void GcodeSuite::G26() {
celsius_t bedtemp = 0;
// Use the 'I' index if temperature presets are defined
- #if PREHEAT_COUNT
+ #if HAS_PREHEAT
if (preset_index) bedtemp = ui.material_preset[preset_index - 1].bed_temp;
#endif
@@ -613,7 +613,7 @@ void GcodeSuite::G26() {
celsius_t noztemp = 0;
// Accept 'I' if temperature presets are defined
- #if PREHEAT_COUNT
+ #if HAS_PREHEAT
if (preset_index) noztemp = ui.material_preset[preset_index - 1].hotend_temp;
#endif
@@ -854,7 +854,7 @@ void GcodeSuite::G26() {
} while (--g26_repeats && location.valid());
LEAVE:
- ui.set_status_P(GET_TEXT(MSG_G26_LEAVING), -1);
+ ui.set_status(GET_TEXT_F(MSG_G26_LEAVING), -1);
TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(location, ExtUI::G26_FINISH));
g26.retract_filament(destination);
diff --git a/Marlin/src/gcode/bedlevel/G35.cpp b/Marlin/src/gcode/bedlevel/G35.cpp
index 8d5c057361..8cabb92382 100644
--- a/Marlin/src/gcode/bedlevel/G35.cpp
+++ b/Marlin/src/gcode/bedlevel/G35.cpp
@@ -33,6 +33,10 @@
#include "../../module/tool_change.h"
#endif
+#if ENABLED(BLTOUCH)
+ #include "../../feature/bltouch.h"
+#endif
+
#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE)
#include "../../core/debug_out.h"
@@ -92,7 +96,7 @@ void GcodeSuite::G35() {
TERN_(HAS_DUPLICATION_MODE, set_duplication_enabled(false));
// Home only Z axis when X and Y is trusted, otherwise all axes, if needed before this procedure
- if (!all_axes_trusted()) process_subcommands_now_P(PSTR("G28Z"));
+ if (!all_axes_trusted()) process_subcommands_now(F("G28Z"));
bool err_break = false;
@@ -102,7 +106,7 @@ void GcodeSuite::G35() {
// In BLTOUCH HS mode, the probe travels in a deployed state.
// Users of G35 might have a badly misaligned bed, so raise Z by the
// length of the deployed pin (BLTOUCH stroke < 7mm)
- do_blocking_move_to_z(SUM_TERN(BLTOUCH_HS_MODE, Z_CLEARANCE_BETWEEN_PROBES, 7));
+ do_blocking_move_to_z(Z_CLEARANCE_BETWEEN_PROBES + TERN0(BLTOUCH, bltouch.z_extra_clearance()));
const float z_probed_height = probe.probe_at_point(tramming_points[i], PROBE_PT_RAISE, 0, true);
if (isnan(z_probed_height)) {
@@ -116,7 +120,7 @@ void GcodeSuite::G35() {
if (DEBUGGING(LEVELING)) {
DEBUG_ECHOPGM("Probing point ", i + 1, " (");
- DEBUG_ECHOPGM_P((char *)pgm_read_ptr(&tramming_point_name[i]));
+ DEBUG_ECHOF(FPSTR(pgm_read_ptr(&tramming_point_name[i])));
DEBUG_CHAR(')');
DEBUG_ECHOLNPGM_P(SP_X_STR, tramming_points[i].x, SP_Y_STR, tramming_points[i].y, SP_Z_STR, z_probed_height);
}
diff --git a/Marlin/src/gcode/bedlevel/M420.cpp b/Marlin/src/gcode/bedlevel/M420.cpp
index 1110ce7ccf..3c23e85a1d 100644
--- a/Marlin/src/gcode/bedlevel/M420.cpp
+++ b/Marlin/src/gcode/bedlevel/M420.cpp
@@ -195,7 +195,7 @@ void GcodeSuite::M420() {
// V to print the matrix or mesh
if (seenV) {
#if ABL_PLANAR
- planner.bed_level_matrix.debug(PSTR("Bed Level Correction Matrix:"));
+ planner.bed_level_matrix.debug(F("Bed Level Correction Matrix:"));
#else
if (leveling_is_valid()) {
#if ENABLED(AUTO_BED_LEVELING_BILINEAR)
@@ -243,15 +243,15 @@ void GcodeSuite::M420() {
}
void GcodeSuite::M420_report(const bool forReplay/*=true*/) {
- report_heading_etc(forReplay, PSTR(
+ report_heading_etc(forReplay, F(
TERN(MESH_BED_LEVELING, "Mesh Bed Leveling", TERN(AUTO_BED_LEVELING_UBL, "Unified Bed Leveling", "Auto Bed Leveling"))
));
- SERIAL_ECHOPGM_P(
- PSTR(" M420 S"), planner.leveling_active
+ SERIAL_ECHOF(
+ F(" M420 S"), planner.leveling_active
#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
- , SP_Z_STR, LINEAR_UNIT(planner.z_fade_height)
+ , FPSTR(SP_Z_STR), LINEAR_UNIT(planner.z_fade_height)
#endif
- , " ; Leveling "
+ , F(" ; Leveling ")
);
serialprintln_onoff(planner.leveling_active);
}
diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp
index 0eb13dba96..14da38c8fe 100644
--- a/Marlin/src/gcode/bedlevel/abl/G29.cpp
+++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp
@@ -36,7 +36,7 @@
#include "../../../module/probe.h"
#include "../../queue.h"
-#if ENABLED(PROBE_TEMP_COMPENSATION)
+#if HAS_PTC
#include "../../../feature/probe_temp_comp.h"
#include "../../../module/temperature.h"
#endif
@@ -244,7 +244,7 @@ G29_TYPE GcodeSuite::G29() {
// Send 'N' to force homing before G29 (internal only)
if (parser.seen_test('N'))
- process_subcommands_now_P(TERN(CAN_SET_LEVELING_AFTER_G28, PSTR("G28L0"), G28_STR));
+ process_subcommands_now(TERN(CAN_SET_LEVELING_AFTER_G28, F("G28L0"), FPSTR(G28_STR)));
// Don't allow auto-leveling without homing first
if (homing_needed_error()) G29_RETURN(false);
@@ -636,7 +636,7 @@ G29_TYPE GcodeSuite::G29() {
if (TERN0(IS_KINEMATIC, !probe.can_reach(abl.probePos))) continue;
if (abl.verbose_level) SERIAL_ECHOLNPGM("Probing mesh point ", pt_index, "/", abl.abl_points, ".");
- TERN_(HAS_STATUS_MESSAGE, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_POINT), int(pt_index), int(abl.abl_points)));
+ TERN_(HAS_STATUS_MESSAGE, ui.status_printf(0, F(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_POINT), int(pt_index), int(abl.abl_points)));
abl.measured_z = faux ? 0.001f * random(-100, 101) : probe.probe_at_point(abl.probePos, raise_after, abl.verbose_level);
@@ -645,11 +645,9 @@ G29_TYPE GcodeSuite::G29() {
break; // Breaks out of both loops
}
- #if ENABLED(PROBE_TEMP_COMPENSATION)
- temp_comp.compensate_measurement(TSI_BED, thermalManager.degBed(), abl.measured_z);
- temp_comp.compensate_measurement(TSI_PROBE, thermalManager.degProbe(), abl.measured_z);
- TERN_(USE_TEMP_EXT_COMPENSATION, temp_comp.compensate_measurement(TSI_EXT, thermalManager.degHotend(), abl.measured_z));
- #endif
+ TERN_(PTC_BED, ptc.compensate_measurement(TSI_BED, thermalManager.degBed(), abl.measured_z));
+ TERN_(PTC_PROBE, ptc.compensate_measurement(TSI_PROBE, thermalManager.degProbe(), abl.measured_z));
+ TERN_(PTC_HOTEND, ptc.compensate_measurement(TSI_EXT, thermalManager.degHotend(0), abl.measured_z));
#if ENABLED(AUTO_BED_LEVELING_LINEAR)
@@ -681,7 +679,7 @@ G29_TYPE GcodeSuite::G29() {
LOOP_L_N(i, 3) {
if (abl.verbose_level) SERIAL_ECHOLNPGM("Probing point ", i + 1, "/3.");
- TERN_(HAS_STATUS_MESSAGE, ui.status_printf_P(0, PSTR(S_FMT " %i/3"), GET_TEXT(MSG_PROBING_POINT), int(i + 1)));
+ TERN_(HAS_STATUS_MESSAGE, ui.status_printf(0, F(S_FMT " %i/3"), GET_TEXT(MSG_PROBING_POINT), int(i + 1)));
// Retain the last probe position
abl.probePos = xy_pos_t(points[i]);
@@ -783,8 +781,8 @@ G29_TYPE GcodeSuite::G29() {
float min_diff = 999;
- auto print_topo_map = [&](PGM_P const title, const bool get_min) {
- SERIAL_ECHOPGM_P(title);
+ auto print_topo_map = [&](FSTR_P const title, const bool get_min) {
+ SERIAL_ECHOF(title);
for (int8_t yy = abl.grid_points.y - 1; yy >= 0; yy--) {
LOOP_L_N(xx, abl.grid_points.x) {
const int ind = abl.indexIntoAB[xx][yy];
@@ -802,19 +800,19 @@ G29_TYPE GcodeSuite::G29() {
SERIAL_EOL();
};
- print_topo_map(PSTR("\nBed Height Topography:\n"
- " +--- BACK --+\n"
- " | |\n"
- " L | (+) | R\n"
- " E | | I\n"
- " F | (-) N (+) | G\n"
- " T | | H\n"
- " | (-) | T\n"
- " | |\n"
- " O-- FRONT --+\n"
- " (0,0)\n"), true);
+ print_topo_map(F("\nBed Height Topography:\n"
+ " +--- BACK --+\n"
+ " | |\n"
+ " L | (+) | R\n"
+ " E | | I\n"
+ " F | (-) N (+) | G\n"
+ " T | | H\n"
+ " | (-) | T\n"
+ " | |\n"
+ " O-- FRONT --+\n"
+ " (0,0)\n"), true);
if (abl.verbose_level > 3)
- print_topo_map(PSTR("\nCorrected Bed Height vs. Bed Topology:\n"), false);
+ print_topo_map(F("\nCorrected Bed Height vs. Bed Topology:\n"), false);
} // abl.topography_map
@@ -825,7 +823,7 @@ G29_TYPE GcodeSuite::G29() {
// For LINEAR and 3POINT leveling correct the current position
if (abl.verbose_level > 0)
- planner.bed_level_matrix.debug(PSTR("\n\nBed Level Correction Matrix:"));
+ planner.bed_level_matrix.debug(F("\n\nBed Level Correction Matrix:"));
if (!abl.dryrun) {
//
@@ -882,7 +880,7 @@ G29_TYPE GcodeSuite::G29() {
#ifdef Z_PROBE_END_SCRIPT
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Z Probe End Script: ", Z_PROBE_END_SCRIPT);
planner.synchronize();
- process_subcommands_now_P(PSTR(Z_PROBE_END_SCRIPT));
+ process_subcommands_now(F(Z_PROBE_END_SCRIPT));
#endif
TERN_(HAS_DWIN_E3V2_BASIC, DWIN_CompletedLeveling());
diff --git a/Marlin/src/gcode/bedlevel/mbl/G29.cpp b/Marlin/src/gcode/bedlevel/mbl/G29.cpp
index 11e503f013..eec89f73ac 100644
--- a/Marlin/src/gcode/bedlevel/mbl/G29.cpp
+++ b/Marlin/src/gcode/bedlevel/mbl/G29.cpp
@@ -103,7 +103,7 @@ void GcodeSuite::G29() {
mbl.reset();
mbl_probe_index = 0;
if (!ui.wait_for_move) {
- queue.inject_P(parser.seen_test('N') ? PSTR("G28" TERN(CAN_SET_LEVELING_AFTER_G28, "L0", "") "\nG29S2") : PSTR("G29S2"));
+ queue.inject(parser.seen_test('N') ? F("G28" TERN(CAN_SET_LEVELING_AFTER_G28, "L0", "") "\nG29S2") : F("G29S2"));
TERN_(EXTENSIBLE_UI, ExtUI::onMeshLevelingStart());
return;
}
@@ -152,7 +152,7 @@ void GcodeSuite::G29() {
// After recording the last point, activate home and activate
mbl_probe_index = -1;
SERIAL_ECHOLNPGM("Mesh probing done.");
- TERN_(HAS_STATUS_MESSAGE, ui.set_status(GET_TEXT(MSG_MESH_DONE)));
+ TERN_(HAS_STATUS_MESSAGE, LCD_MESSAGE(MSG_MESH_DONE));
BUZZ(100, 659);
BUZZ(100, 698);
@@ -214,7 +214,7 @@ void GcodeSuite::G29() {
if (state == MeshNext) {
SERIAL_ECHOLNPGM("MBL G29 point ", _MIN(mbl_probe_index, GRID_MAX_POINTS), " of ", GRID_MAX_POINTS);
- if (mbl_probe_index > 0) TERN_(HAS_STATUS_MESSAGE, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_POINT), _MIN(mbl_probe_index, GRID_MAX_POINTS), int(GRID_MAX_POINTS)));
+ if (mbl_probe_index > 0) TERN_(HAS_STATUS_MESSAGE, ui.status_printf(0, F(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_POINT), _MIN(mbl_probe_index, GRID_MAX_POINTS), int(GRID_MAX_POINTS)));
}
report_current_position();
diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp
index dc93ba3d2f..95f2a9b176 100644
--- a/Marlin/src/gcode/calibrate/G28.cpp
+++ b/Marlin/src/gcode/calibrate/G28.cpp
@@ -156,7 +156,7 @@
homeaxis(Z_AXIS);
}
else {
- LCD_MESSAGEPGM(MSG_ZPROBE_OUT);
+ LCD_MESSAGE(MSG_ZPROBE_OUT);
SERIAL_ECHO_MSG(STR_ZPROBE_OUT_SER);
}
}
@@ -269,33 +269,33 @@ void GcodeSuite::G28() {
#endif
#if HAS_HOMING_CURRENT
- auto debug_current = [](PGM_P const s, const int16_t a, const int16_t b) {
- DEBUG_ECHOPGM_P(s); DEBUG_ECHOLNPGM(" current: ", a, " -> ", b);
+ auto debug_current = [](FSTR_P const s, const int16_t a, const int16_t b) {
+ DEBUG_ECHOF(s); DEBUG_ECHOLNPGM(" current: ", a, " -> ", b);
};
#if HAS_CURRENT_HOME(X)
const int16_t tmc_save_current_X = stepperX.getMilliamps();
stepperX.rms_current(X_CURRENT_HOME);
- if (DEBUGGING(LEVELING)) debug_current(PSTR("X"), tmc_save_current_X, X_CURRENT_HOME);
+ if (DEBUGGING(LEVELING)) debug_current(F("X"), tmc_save_current_X, X_CURRENT_HOME);
#endif
#if HAS_CURRENT_HOME(X2)
const int16_t tmc_save_current_X2 = stepperX2.getMilliamps();
stepperX2.rms_current(X2_CURRENT_HOME);
- if (DEBUGGING(LEVELING)) debug_current(PSTR("X2"), tmc_save_current_X2, X2_CURRENT_HOME);
+ if (DEBUGGING(LEVELING)) debug_current(F("X2"), tmc_save_current_X2, X2_CURRENT_HOME);
#endif
#if HAS_CURRENT_HOME(Y)
const int16_t tmc_save_current_Y = stepperY.getMilliamps();
stepperY.rms_current(Y_CURRENT_HOME);
- if (DEBUGGING(LEVELING)) debug_current(PSTR("Y"), tmc_save_current_Y, Y_CURRENT_HOME);
+ if (DEBUGGING(LEVELING)) debug_current(F("Y"), tmc_save_current_Y, Y_CURRENT_HOME);
#endif
#if HAS_CURRENT_HOME(Y2)
const int16_t tmc_save_current_Y2 = stepperY2.getMilliamps();
stepperY2.rms_current(Y2_CURRENT_HOME);
- if (DEBUGGING(LEVELING)) debug_current(PSTR("Y2"), tmc_save_current_Y2, Y2_CURRENT_HOME);
+ if (DEBUGGING(LEVELING)) debug_current(F("Y2"), tmc_save_current_Y2, Y2_CURRENT_HOME);
#endif
#if HAS_CURRENT_HOME(Z) && ENABLED(DELTA)
const int16_t tmc_save_current_Z = stepperZ.getMilliamps();
stepperZ.rms_current(Z_CURRENT_HOME);
- if (DEBUGGING(LEVELING)) debug_current(PSTR("Z"), tmc_save_current_Z, Z_CURRENT_HOME);
+ if (DEBUGGING(LEVELING)) debug_current(F("Z"), tmc_save_current_Z, Z_CURRENT_HOME);
#endif
#endif
diff --git a/Marlin/src/gcode/calibrate/G33.cpp b/Marlin/src/gcode/calibrate/G33.cpp
index 8867c168d2..779ae99d0a 100644
--- a/Marlin/src/gcode/calibrate/G33.cpp
+++ b/Marlin/src/gcode/calibrate/G33.cpp
@@ -73,9 +73,9 @@ float dcr;
void ac_home() {
endstops.enable(true);
- TERN_(SENSORLESS_HOMING, probe.set_homing_current(true));
+ TERN_(HAS_DELTA_SENSORLESS_PROBING, probe.set_homing_current(true));
home_delta();
- TERN_(SENSORLESS_HOMING, probe.set_homing_current(false));
+ TERN_(HAS_DELTA_SENSORLESS_PROBING, probe.set_homing_current(false));
endstops.not_homing();
}
@@ -97,10 +97,9 @@ void ac_cleanup(TERN_(HAS_MULTI_HOTEND, const uint8_t old_tool_index)) {
TERN_(HAS_MULTI_HOTEND, tool_change(old_tool_index, true));
}
-void print_signed_float(PGM_P const prefix, const_float_t f) {
+void print_signed_float(FSTR_P const prefix, const_float_t f) {
SERIAL_ECHOPGM(" ");
- SERIAL_ECHOPGM_P(prefix);
- SERIAL_CHAR(':');
+ SERIAL_ECHOF(prefix, AS_CHAR(':'));
if (f >= 0) SERIAL_CHAR('+');
SERIAL_ECHO_F(f, 2);
}
@@ -111,24 +110,23 @@ void print_signed_float(PGM_P const prefix, const_float_t f) {
static void print_calibration_settings(const bool end_stops, const bool tower_angles) {
SERIAL_ECHOPGM(".Height:", delta_height);
if (end_stops) {
- print_signed_float(PSTR("Ex"), delta_endstop_adj.a);
- print_signed_float(PSTR("Ey"), delta_endstop_adj.b);
- print_signed_float(PSTR("Ez"), delta_endstop_adj.c);
+ print_signed_float(F("Ex"), delta_endstop_adj.a);
+ print_signed_float(F("Ey"), delta_endstop_adj.b);
+ print_signed_float(F("Ez"), delta_endstop_adj.c);
}
if (end_stops && tower_angles) {
- SERIAL_ECHOPGM(" Radius:", delta_radius);
- SERIAL_EOL();
+ SERIAL_ECHOLNPGM(" Radius:", delta_radius);
SERIAL_CHAR('.');
SERIAL_ECHO_SP(13);
}
if (tower_angles) {
- print_signed_float(PSTR("Tx"), delta_tower_angle_trim.a);
- print_signed_float(PSTR("Ty"), delta_tower_angle_trim.b);
- print_signed_float(PSTR("Tz"), delta_tower_angle_trim.c);
+ print_signed_float(F("Tx"), delta_tower_angle_trim.a);
+ print_signed_float(F("Ty"), delta_tower_angle_trim.b);
+ print_signed_float(F("Tz"), delta_tower_angle_trim.c);
}
- if ((!end_stops && tower_angles) || (end_stops && !tower_angles)) { // XOR
+ if (end_stops != tower_angles)
SERIAL_ECHOPGM(" Radius:", delta_radius);
- }
+
SERIAL_EOL();
}
@@ -137,11 +135,11 @@ static void print_calibration_settings(const bool end_stops, const bool tower_an
*/
static void print_calibration_results(const float z_pt[NPP + 1], const bool tower_points, const bool opposite_points) {
SERIAL_ECHOPGM(". ");
- print_signed_float(PSTR("c"), z_pt[CEN]);
+ print_signed_float(F("c"), z_pt[CEN]);
if (tower_points) {
- print_signed_float(PSTR(" x"), z_pt[__A]);
- print_signed_float(PSTR(" y"), z_pt[__B]);
- print_signed_float(PSTR(" z"), z_pt[__C]);
+ print_signed_float(F(" x"), z_pt[__A]);
+ print_signed_float(F(" y"), z_pt[__B]);
+ print_signed_float(F(" z"), z_pt[__C]);
}
if (tower_points && opposite_points) {
SERIAL_EOL();
@@ -149,9 +147,9 @@ static void print_calibration_results(const float z_pt[NPP + 1], const bool towe
SERIAL_ECHO_SP(13);
}
if (opposite_points) {
- print_signed_float(PSTR("yz"), z_pt[_BC]);
- print_signed_float(PSTR("zx"), z_pt[_CA]);
- print_signed_float(PSTR("xy"), z_pt[_AB]);
+ print_signed_float(F("yz"), z_pt[_BC]);
+ print_signed_float(F("zx"), z_pt[_CA]);
+ print_signed_float(F("xy"), z_pt[_AB]);
}
SERIAL_EOL();
}
@@ -477,11 +475,11 @@ void GcodeSuite::G33() {
SERIAL_ECHOLNPGM("G33 Auto Calibrate");
// Report settings
- PGM_P const checkingac = PSTR("Checking... AC");
- SERIAL_ECHOPGM_P(checkingac);
+ FSTR_P const checkingac = F("Checking... AC");
+ SERIAL_ECHOF(checkingac);
if (verbose_level == 0) SERIAL_ECHOPGM(" (DRY-RUN)");
SERIAL_EOL();
- ui.set_status_P(checkingac);
+ ui.set_status(checkingac);
print_calibration_settings(_endstop_results, _angle_results);
@@ -653,13 +651,13 @@ void GcodeSuite::G33() {
}
}
else { // dry run
- PGM_P const enddryrun = PSTR("End DRY-RUN");
- SERIAL_ECHOPGM_P(enddryrun);
+ FSTR_P const enddryrun = F("End DRY-RUN");
+ SERIAL_ECHOF(enddryrun);
SERIAL_ECHO_SP(35);
SERIAL_ECHOLNPAIR_F("std dev:", zero_std_dev, 3);
char mess[21];
- strcpy_P(mess, enddryrun);
+ strcpy_P(mess, FTOP(enddryrun));
strcpy_P(&mess[11], PSTR(" sd:"));
if (zero_std_dev < 1)
sprintf_P(&mess[15], PSTR("0.%03i"), (int)LROUND(zero_std_dev * 1000.0f));
diff --git a/Marlin/src/gcode/calibrate/G34.cpp b/Marlin/src/gcode/calibrate/G34.cpp
index f335a12311..98a0bdef88 100644
--- a/Marlin/src/gcode/calibrate/G34.cpp
+++ b/Marlin/src/gcode/calibrate/G34.cpp
@@ -47,7 +47,7 @@ void GcodeSuite::G34() {
TemporaryGlobalEndstopsState unlock_z(false);
#ifdef GANTRY_CALIBRATION_COMMANDS_PRE
- gcode.process_subcommands_now_P(PSTR(GANTRY_CALIBRATION_COMMANDS_PRE));
+ process_subcommands_now(F(GANTRY_CALIBRATION_COMMANDS_PRE));
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Sub Commands Processed");
#endif
@@ -148,7 +148,7 @@ void GcodeSuite::G34() {
#ifdef GANTRY_CALIBRATION_COMMANDS_POST
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Running Post Commands");
- gcode.process_subcommands_now_P(PSTR(GANTRY_CALIBRATION_COMMANDS_POST));
+ process_subcommands_now(F(GANTRY_CALIBRATION_COMMANDS_POST));
#endif
SET_SOFT_ENDSTOP_LOOSE(false);
diff --git a/Marlin/src/gcode/calibrate/G34_M422.cpp b/Marlin/src/gcode/calibrate/G34_M422.cpp
index dd1dd5622a..328a40dbb4 100644
--- a/Marlin/src/gcode/calibrate/G34_M422.cpp
+++ b/Marlin/src/gcode/calibrate/G34_M422.cpp
@@ -31,7 +31,7 @@
#include "../../module/stepper.h"
#include "../../module/planner.h"
#include "../../module/probe.h"
-#include "../../lcd/marlinui.h" // for LCD_MESSAGEPGM
+#include "../../lcd/marlinui.h" // for LCD_MESSAGE
#if HAS_LEVELING
#include "../../feature/bedlevel/bedlevel.h"
@@ -45,6 +45,10 @@
#include "../../libs/least_squares_fit.h"
#endif
+#if ENABLED(BLTOUCH)
+ #include "../../feature/bltouch.h"
+#endif
+
#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE)
#include "../../core/debug_out.h"
@@ -149,7 +153,7 @@ void GcodeSuite::G34() {
// In BLTOUCH HS mode, the probe travels in a deployed state.
// Users of G34 might have a badly misaligned bed, so raise Z by the
// length of the deployed pin (BLTOUCH stroke < 7mm)
- #define Z_BASIC_CLEARANCE (Z_CLEARANCE_BETWEEN_PROBES + 7.0f * BOTH(BLTOUCH, BLTOUCH_HS_MODE))
+ #define Z_BASIC_CLEARANCE (Z_CLEARANCE_BETWEEN_PROBES + TERN0(BLTOUCH, bltouch.z_extra_clearance()))
// Compute a worst-case clearance height to probe from. After the first
// iteration this will be re-calculated based on the actual bed position
@@ -229,7 +233,7 @@ void GcodeSuite::G34() {
const float z_probed_height = probe.probe_at_point(z_stepper_align.xy[iprobe], raise_after, 0, true, false);
if (isnan(z_probed_height)) {
SERIAL_ECHOLNPGM("Probing failed");
- LCD_MESSAGEPGM(MSG_LCD_PROBING_FAILED);
+ LCD_MESSAGE(MSG_LCD_PROBING_FAILED);
err_break = true;
break;
}
@@ -328,7 +332,7 @@ void GcodeSuite::G34() {
auto decreasing_accuracy = [](const_float_t v1, const_float_t v2) {
if (v1 < v2 * 0.7f) {
SERIAL_ECHOLNPGM("Decreasing Accuracy Detected.");
- LCD_MESSAGEPGM(MSG_DECREASING_ACCURACY);
+ LCD_MESSAGE(MSG_DECREASING_ACCURACY);
return true;
}
return false;
@@ -411,7 +415,7 @@ void GcodeSuite::G34() {
if (success_break) {
SERIAL_ECHOLNPGM("Target accuracy achieved.");
- LCD_MESSAGEPGM(MSG_ACCURACY_ACHIEVED);
+ LCD_MESSAGE(MSG_ACCURACY_ACHIEVED);
break;
}
@@ -433,7 +437,7 @@ void GcodeSuite::G34() {
// After this operation the z position needs correction
set_axis_never_homed(Z_AXIS);
// Home Z after the alignment procedure
- process_subcommands_now_P(PSTR("G28Z"));
+ process_subcommands_now(F("G28Z"));
#else
// Use the probed height from the last iteration to determine the Z height.
// z_measured_min is used, because all steppers are aligned to z_measured_min.
@@ -538,7 +542,7 @@ void GcodeSuite::M422() {
}
void GcodeSuite::M422_report(const bool forReplay/*=true*/) {
- report_heading(forReplay, PSTR(STR_Z_AUTO_ALIGN));
+ report_heading(forReplay, F(STR_Z_AUTO_ALIGN));
LOOP_L_N(i, NUM_Z_STEPPER_DRIVERS) {
report_echo_start(forReplay);
SERIAL_ECHOLNPGM_P(
diff --git a/Marlin/src/gcode/calibrate/G425.cpp b/Marlin/src/gcode/calibrate/G425.cpp
index 23a66dd0c5..88c906f493 100644
--- a/Marlin/src/gcode/calibrate/G425.cpp
+++ b/Marlin/src/gcode/calibrate/G425.cpp
@@ -709,7 +709,7 @@ inline void calibrate_all() {
void GcodeSuite::G425() {
#ifdef CALIBRATION_SCRIPT_PRE
- GcodeSuite::process_subcommands_now_P(PSTR(CALIBRATION_SCRIPT_PRE));
+ process_subcommands_now(F(CALIBRATION_SCRIPT_PRE));
#endif
if (homing_needed_error()) return;
@@ -745,7 +745,7 @@ void GcodeSuite::G425() {
SET_SOFT_ENDSTOP_LOOSE(false);
#ifdef CALIBRATION_SCRIPT_POST
- GcodeSuite::process_subcommands_now_P(PSTR(CALIBRATION_SCRIPT_POST));
+ process_subcommands_now(F(CALIBRATION_SCRIPT_POST));
#endif
}
diff --git a/Marlin/src/gcode/calibrate/G76_M192_M871.cpp b/Marlin/src/gcode/calibrate/G76_M192_M871.cpp
deleted file mode 100644
index 170958cab4..0000000000
--- a/Marlin/src/gcode/calibrate/G76_M192_M871.cpp
+++ /dev/null
@@ -1,358 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
- *
- * Based on Sprinter and grbl.
- * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- *
- */
-
-/**
- * G76_M871.cpp - Temperature calibration/compensation for z-probing
- */
-
-#include "../../inc/MarlinConfig.h"
-
-#if ENABLED(PROBE_TEMP_COMPENSATION)
-
-#include "../gcode.h"
-#include "../../module/motion.h"
-#include "../../module/planner.h"
-#include "../../module/probe.h"
-#include "../../feature/bedlevel/bedlevel.h"
-#include "../../module/temperature.h"
-#include "../../module/probe.h"
-#include "../../feature/probe_temp_comp.h"
-#include "../../lcd/marlinui.h"
-
-/**
- * G76: calibrate probe and/or bed temperature offsets
- * Notes:
- * - When calibrating probe, bed temperature is held constant.
- * Compensation values are deltas to first probe measurement at probe temp. = 30°C.
- * - When calibrating bed, probe temperature is held constant.
- * Compensation values are deltas to first probe measurement at bed temp. = 60°C.
- * - The hotend will not be heated at any time.
- * - On my Průša MK3S clone I put a piece of paper between the probe and the hotend
- * so the hotend fan would not cool my probe constantly. Alternatively you could just
- * make sure the fan is not running while running the calibration process.
- *
- * Probe calibration:
- * - Moves probe to cooldown point.
- * - Heats up bed to 100°C.
- * - Moves probe to probing point (1mm above heatbed).
- * - Waits until probe reaches target temperature (30°C).
- * - Does a z-probing (=base value) and increases target temperature by 5°C.
- * - Waits until probe reaches increased target temperature.
- * - Does a z-probing (delta to base value will be a compensation value) and increases target temperature by 5°C.
- * - Repeats last two steps until max. temperature reached or timeout (i.e. probe does not heat up any further).
- * - Compensation values of higher temperatures will be extrapolated (using linear regression first).
- * While this is not exact by any means it is still better than simply using the last compensation value.
- *
- * Bed calibration:
- * - Moves probe to cooldown point.
- * - Heats up bed to 60°C.
- * - Moves probe to probing point (1mm above heatbed).
- * - Waits until probe reaches target temperature (30°C).
- * - Does a z-probing (=base value) and increases bed temperature by 5°C.
- * - Moves probe to cooldown point.
- * - Waits until probe is below 30°C and bed has reached target temperature.
- * - Moves probe to probing point and waits until it reaches target temperature (30°C).
- * - Does a z-probing (delta to base value will be a compensation value) and increases bed temperature by 5°C.
- * - Repeats last four points until max. bed temperature reached (110°C) or timeout.
- * - Compensation values of higher temperatures will be extrapolated (using linear regression first).
- * While this is not exact by any means it is still better than simply using the last compensation value.
- *
- * G76 [B | P]
- * - no flag - Both calibration procedures will be run.
- * - `B` - Run bed temperature calibration.
- * - `P` - Run probe temperature calibration.
- */
-
-static void say_waiting_for() { SERIAL_ECHOPGM("Waiting for "); }
-static void say_waiting_for_probe_heating() { say_waiting_for(); SERIAL_ECHOLNPGM("probe heating."); }
-static void say_successfully_calibrated() { SERIAL_ECHOPGM("Successfully calibrated"); }
-static void say_failed_to_calibrate() { SERIAL_ECHOPGM("!Failed to calibrate"); }
-
-void GcodeSuite::G76() {
- // Check if heated bed is available and z-homing is done with probe
- #if TEMP_SENSOR_BED == 0 || !(HOMING_Z_WITH_PROBE)
- return;
- #endif
-
- auto report_temps = [](millis_t &ntr, millis_t timeout=0) {
- idle_no_sleep();
- const millis_t ms = millis();
- if (ELAPSED(ms, ntr)) {
- ntr = ms + 1000;
- thermalManager.print_heater_states(active_extruder);
- }
- return (timeout && ELAPSED(ms, timeout));
- };
-
- auto wait_for_temps = [&](const celsius_t tb, const celsius_t tp, millis_t &ntr, const millis_t timeout=0) {
- say_waiting_for(); SERIAL_ECHOLNPGM("bed and probe temperature.");
- while (thermalManager.wholeDegBed() != tb || thermalManager.wholeDegProbe() > tp)
- if (report_temps(ntr, timeout)) return true;
- return false;
- };
-
- auto g76_probe = [](const TempSensorID sid, celsius_t &targ, const xy_pos_t &nozpos) {
- do_z_clearance(5.0); // Raise nozzle before probing
- const float measured_z = probe.probe_at_point(nozpos, PROBE_PT_STOW, 0, false); // verbose=0, probe_relative=false
- if (isnan(measured_z))
- SERIAL_ECHOLNPGM("!Received NAN. Aborting.");
- else {
- SERIAL_ECHOLNPAIR_F("Measured: ", measured_z);
- if (targ == cali_info_init[sid].start_temp)
- temp_comp.prepare_new_calibration(measured_z);
- else
- temp_comp.push_back_new_measurement(sid, measured_z);
- targ += cali_info_init[sid].temp_res;
- }
- return measured_z;
- };
-
- #if ENABLED(BLTOUCH)
- // Make sure any BLTouch error condition is cleared
- bltouch_command(BLTOUCH_RESET, BLTOUCH_RESET_DELAY);
- set_bltouch_deployed(false);
- #endif
-
- bool do_bed_cal = parser.boolval('B'), do_probe_cal = parser.boolval('P');
- if (!do_bed_cal && !do_probe_cal) do_bed_cal = do_probe_cal = true;
-
- // Synchronize with planner
- planner.synchronize();
-
- const xyz_pos_t parkpos = temp_comp.park_point,
- probe_pos_xyz = xyz_pos_t(temp_comp.measure_point) + xyz_pos_t({ 0.0f, 0.0f, PTC_PROBE_HEATING_OFFSET }),
- noz_pos_xyz = probe_pos_xyz - probe.offset_xy; // Nozzle position based on probe position
-
- if (do_bed_cal || do_probe_cal) {
- // Ensure park position is reachable
- bool reachable = position_is_reachable(parkpos) || WITHIN(parkpos.z, Z_MIN_POS - fslop, Z_MAX_POS + fslop);
- if (!reachable)
- SERIAL_ECHOLNPGM("!Park");
- else {
- // Ensure probe position is reachable
- reachable = probe.can_reach(probe_pos_xyz);
- if (!reachable) SERIAL_ECHOLNPGM("!Probe");
- }
-
- if (!reachable) {
- SERIAL_ECHOLNPGM(" position unreachable - aborting.");
- return;
- }
-
- process_subcommands_now_P(G28_STR);
- }
-
- remember_feedrate_scaling_off();
-
- /******************************************
- * Calibrate bed temperature offsets
- ******************************************/
-
- // Report temperatures every second and handle heating timeouts
- millis_t next_temp_report = millis() + 1000;
-
- auto report_targets = [&](const celsius_t tb, const celsius_t tp) {
- SERIAL_ECHOLNPGM("Target Bed:", tb, " Probe:", tp);
- };
-
- if (do_bed_cal) {
-
- celsius_t target_bed = cali_info_init[TSI_BED].start_temp,
- target_probe = temp_comp.bed_calib_probe_temp;
-
- say_waiting_for(); SERIAL_ECHOLNPGM(" cooling.");
- while (thermalManager.wholeDegBed() > target_bed || thermalManager.wholeDegProbe() > target_probe)
- report_temps(next_temp_report);
-
- // Disable leveling so it won't mess with us
- TERN_(HAS_LEVELING, set_bed_leveling_enabled(false));
-
- for (;;) {
- thermalManager.setTargetBed(target_bed);
-
- report_targets(target_bed, target_probe);
-
- // Park nozzle
- do_blocking_move_to(parkpos);
-
- // Wait for heatbed to reach target temp and probe to cool below target temp
- if (wait_for_temps(target_bed, target_probe, next_temp_report, millis() + MIN_TO_MS(15))) {
- SERIAL_ECHOLNPGM("!Bed heating timeout.");
- break;
- }
-
- // Move the nozzle to the probing point and wait for the probe to reach target temp
- do_blocking_move_to(noz_pos_xyz);
- say_waiting_for_probe_heating();
- SERIAL_EOL();
- while (thermalManager.wholeDegProbe() < target_probe)
- report_temps(next_temp_report);
-
- const float measured_z = g76_probe(TSI_BED, target_bed, noz_pos_xyz);
- if (isnan(measured_z) || target_bed > (BED_MAX_TARGET)) break;
- }
-
- SERIAL_ECHOLNPGM("Retrieved measurements: ", temp_comp.get_index());
- if (temp_comp.finish_calibration(TSI_BED)) {
- say_successfully_calibrated();
- SERIAL_ECHOLNPGM(" bed.");
- }
- else {
- say_failed_to_calibrate();
- SERIAL_ECHOLNPGM(" bed. Values reset.");
- }
-
- // Cleanup
- thermalManager.setTargetBed(0);
- TERN_(HAS_LEVELING, set_bed_leveling_enabled(true));
- } // do_bed_cal
-
- /********************************************
- * Calibrate probe temperature offsets
- ********************************************/
-
- if (do_probe_cal) {
-
- // Park nozzle
- do_blocking_move_to(parkpos);
-
- // Initialize temperatures
- const celsius_t target_bed = temp_comp.probe_calib_bed_temp;
- thermalManager.setTargetBed(target_bed);
-
- celsius_t target_probe = cali_info_init[TSI_PROBE].start_temp;
-
- report_targets(target_bed, target_probe);
-
- // Wait for heatbed to reach target temp and probe to cool below target temp
- wait_for_temps(target_bed, target_probe, next_temp_report);
-
- // Disable leveling so it won't mess with us
- TERN_(HAS_LEVELING, set_bed_leveling_enabled(false));
-
- bool timeout = false;
- for (;;) {
- // Move probe to probing point and wait for it to reach target temperature
- do_blocking_move_to(noz_pos_xyz);
-
- say_waiting_for_probe_heating();
- SERIAL_ECHOLNPGM(" Bed:", target_bed, " Probe:", target_probe);
- const millis_t probe_timeout_ms = millis() + SEC_TO_MS(900UL);
- while (thermalManager.degProbe() < target_probe) {
- if (report_temps(next_temp_report, probe_timeout_ms)) {
- SERIAL_ECHOLNPGM("!Probe heating timed out.");
- timeout = true;
- break;
- }
- }
- if (timeout) break;
-
- const float measured_z = g76_probe(TSI_PROBE, target_probe, noz_pos_xyz);
- if (isnan(measured_z) || target_probe > cali_info_init[TSI_PROBE].end_temp) break;
- }
-
- SERIAL_ECHOLNPGM("Retrieved measurements: ", temp_comp.get_index());
- if (temp_comp.finish_calibration(TSI_PROBE))
- say_successfully_calibrated();
- else
- say_failed_to_calibrate();
- SERIAL_ECHOLNPGM(" probe.");
-
- // Cleanup
- thermalManager.setTargetBed(0);
- TERN_(HAS_LEVELING, set_bed_leveling_enabled(true));
-
- SERIAL_ECHOLNPGM("Final compensation values:");
- temp_comp.print_offsets();
- } // do_probe_cal
-
- restore_feedrate_and_scaling();
-}
-
-/**
- * M871: Report / reset temperature compensation offsets.
- * Note: This does not affect values in EEPROM until M500.
- *
- * M871 [ R | B | P | E ]
- *
- * No Parameters - Print current offset values.
- *
- * Select only one of these flags:
- * R - Reset all offsets to zero (i.e., disable compensation).
- * B - Manually set offset for bed
- * P - Manually set offset for probe
- * E - Manually set offset for extruder
- *
- * With B, P, or E:
- * I[index] - Index in the array
- * V[value] - Adjustment in µm
- */
-void GcodeSuite::M871() {
-
- if (parser.seen('R')) {
- // Reset z-probe offsets to factory defaults
- temp_comp.clear_all_offsets();
- SERIAL_ECHOLNPGM("Offsets reset to default.");
- }
- else if (parser.seen("BPE")) {
- if (!parser.seenval('V')) return;
- const int16_t offset_val = parser.value_int();
- if (!parser.seenval('I')) return;
- const int16_t idx = parser.value_int();
- const TempSensorID mod = (parser.seen('B') ? TSI_BED :
- #if ENABLED(USE_TEMP_EXT_COMPENSATION)
- parser.seen('E') ? TSI_EXT :
- #endif
- TSI_PROBE
- );
- if (idx > 0 && temp_comp.set_offset(mod, idx - 1, offset_val))
- SERIAL_ECHOLNPGM("Set value: ", offset_val);
- else
- SERIAL_ECHOLNPGM("!Invalid index. Failed to set value (note: value at index 0 is constant).");
-
- }
- else // Print current Z-probe adjustments. Note: Values in EEPROM might differ.
- temp_comp.print_offsets();
-}
-
-/**
- * M192: Wait for probe temperature sensor to reach a target
- *
- * Select only one of these flags:
- * R - Wait for heating or cooling
- * S - Wait only for heating
- */
-void GcodeSuite::M192() {
- if (DEBUGGING(DRYRUN)) return;
-
- const bool no_wait_for_cooling = parser.seenval('S');
- if (!no_wait_for_cooling && ! parser.seenval('R')) {
- SERIAL_ERROR_MSG("No target temperature set.");
- return;
- }
-
- const celsius_t target_temp = parser.value_celsius();
- ui.set_status_P(thermalManager.isProbeBelowTemp(target_temp) ? GET_TEXT(MSG_PROBE_HEATING) : GET_TEXT(MSG_PROBE_COOLING));
- thermalManager.wait_for_probe(target_temp, no_wait_for_cooling);
-}
-
-#endif // PROBE_TEMP_COMPENSATION
diff --git a/Marlin/src/gcode/calibrate/G76_M871.cpp b/Marlin/src/gcode/calibrate/G76_M871.cpp
new file mode 100644
index 0000000000..21bb2c7590
--- /dev/null
+++ b/Marlin/src/gcode/calibrate/G76_M871.cpp
@@ -0,0 +1,337 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+/**
+ * G76_M871.cpp - Temperature calibration/compensation for z-probing
+ */
+
+#include "../../inc/MarlinConfig.h"
+
+#if HAS_PTC
+
+#include "../gcode.h"
+#include "../../module/motion.h"
+#include "../../module/planner.h"
+#include "../../module/probe.h"
+#include "../../feature/bedlevel/bedlevel.h"
+#include "../../module/temperature.h"
+#include "../../module/probe.h"
+#include "../../feature/probe_temp_comp.h"
+#include "../../lcd/marlinui.h"
+
+/**
+ * G76: calibrate probe and/or bed temperature offsets
+ * Notes:
+ * - When calibrating probe, bed temperature is held constant.
+ * Compensation values are deltas to first probe measurement at probe temp. = 30°C.
+ * - When calibrating bed, probe temperature is held constant.
+ * Compensation values are deltas to first probe measurement at bed temp. = 60°C.
+ * - The hotend will not be heated at any time.
+ * - On my Průša MK3S clone I put a piece of paper between the probe and the hotend
+ * so the hotend fan would not cool my probe constantly. Alternatively you could just
+ * make sure the fan is not running while running the calibration process.
+ *
+ * Probe calibration:
+ * - Moves probe to cooldown point.
+ * - Heats up bed to 100°C.
+ * - Moves probe to probing point (1mm above heatbed).
+ * - Waits until probe reaches target temperature (30°C).
+ * - Does a z-probing (=base value) and increases target temperature by 5°C.
+ * - Waits until probe reaches increased target temperature.
+ * - Does a z-probing (delta to base value will be a compensation value) and increases target temperature by 5°C.
+ * - Repeats last two steps until max. temperature reached or timeout (i.e. probe does not heat up any further).
+ * - Compensation values of higher temperatures will be extrapolated (using linear regression first).
+ * While this is not exact by any means it is still better than simply using the last compensation value.
+ *
+ * Bed calibration:
+ * - Moves probe to cooldown point.
+ * - Heats up bed to 60°C.
+ * - Moves probe to probing point (1mm above heatbed).
+ * - Waits until probe reaches target temperature (30°C).
+ * - Does a z-probing (=base value) and increases bed temperature by 5°C.
+ * - Moves probe to cooldown point.
+ * - Waits until probe is below 30°C and bed has reached target temperature.
+ * - Moves probe to probing point and waits until it reaches target temperature (30°C).
+ * - Does a z-probing (delta to base value will be a compensation value) and increases bed temperature by 5°C.
+ * - Repeats last four points until max. bed temperature reached (110°C) or timeout.
+ * - Compensation values of higher temperatures will be extrapolated (using linear regression first).
+ * While this is not exact by any means it is still better than simply using the last compensation value.
+ *
+ * G76 [B | P]
+ * - no flag - Both calibration procedures will be run.
+ * - `B` - Run bed temperature calibration.
+ * - `P` - Run probe temperature calibration.
+ */
+
+static void say_waiting_for() { SERIAL_ECHOPGM("Waiting for "); }
+static void say_waiting_for_probe_heating() { say_waiting_for(); SERIAL_ECHOLNPGM("probe heating."); }
+static void say_successfully_calibrated() { SERIAL_ECHOPGM("Successfully calibrated"); }
+static void say_failed_to_calibrate() { SERIAL_ECHOPGM("!Failed to calibrate"); }
+
+#if BOTH(PTC_PROBE, PTC_BED)
+
+ void GcodeSuite::G76() {
+ auto report_temps = [](millis_t &ntr, millis_t timeout=0) {
+ idle_no_sleep();
+ const millis_t ms = millis();
+ if (ELAPSED(ms, ntr)) {
+ ntr = ms + 1000;
+ thermalManager.print_heater_states(active_extruder);
+ }
+ return (timeout && ELAPSED(ms, timeout));
+ };
+
+ auto wait_for_temps = [&](const celsius_t tb, const celsius_t tp, millis_t &ntr, const millis_t timeout=0) {
+ say_waiting_for(); SERIAL_ECHOLNPGM("bed and probe temperature.");
+ while (thermalManager.wholeDegBed() != tb || thermalManager.wholeDegProbe() > tp)
+ if (report_temps(ntr, timeout)) return true;
+ return false;
+ };
+
+ auto g76_probe = [](const TempSensorID sid, celsius_t &targ, const xy_pos_t &nozpos) {
+ do_z_clearance(5.0); // Raise nozzle before probing
+ const float measured_z = probe.probe_at_point(nozpos, PROBE_PT_STOW, 0, false); // verbose=0, probe_relative=false
+ if (isnan(measured_z))
+ SERIAL_ECHOLNPGM("!Received NAN. Aborting.");
+ else {
+ SERIAL_ECHOLNPAIR_F("Measured: ", measured_z);
+ if (targ == ProbeTempComp::cali_info[sid].start_temp)
+ ptc.prepare_new_calibration(measured_z);
+ else
+ ptc.push_back_new_measurement(sid, measured_z);
+ targ += ProbeTempComp::cali_info[sid].temp_resolution;
+ }
+ return measured_z;
+ };
+
+ #if ENABLED(BLTOUCH)
+ // Make sure any BLTouch error condition is cleared
+ bltouch_command(BLTOUCH_RESET, BLTOUCH_RESET_DELAY);
+ set_bltouch_deployed(false);
+ #endif
+
+ bool do_bed_cal = parser.boolval('B'), do_probe_cal = parser.boolval('P');
+ if (!do_bed_cal && !do_probe_cal) do_bed_cal = do_probe_cal = true;
+
+ // Synchronize with planner
+ planner.synchronize();
+
+ #ifndef PTC_PROBE_HEATING_OFFSET
+ #define PTC_PROBE_HEATING_OFFSET 0
+ #endif
+ const xyz_pos_t parkpos = PTC_PARK_POS,
+ probe_pos_xyz = xyz_pos_t(PTC_PROBE_POS) + xyz_pos_t({ 0.0f, 0.0f, PTC_PROBE_HEATING_OFFSET }),
+ noz_pos_xyz = probe_pos_xyz - probe.offset_xy; // Nozzle position based on probe position
+
+ if (do_bed_cal || do_probe_cal) {
+ // Ensure park position is reachable
+ bool reachable = position_is_reachable(parkpos) || WITHIN(parkpos.z, Z_MIN_POS - fslop, Z_MAX_POS + fslop);
+ if (!reachable)
+ SERIAL_ECHOLNPGM("!Park");
+ else {
+ // Ensure probe position is reachable
+ reachable = probe.can_reach(probe_pos_xyz);
+ if (!reachable) SERIAL_ECHOLNPGM("!Probe");
+ }
+
+ if (!reachable) {
+ SERIAL_ECHOLNPGM(" position unreachable - aborting.");
+ return;
+ }
+
+ process_subcommands_now(FPSTR(G28_STR));
+ }
+
+ remember_feedrate_scaling_off();
+
+ /******************************************
+ * Calibrate bed temperature offsets
+ ******************************************/
+
+ // Report temperatures every second and handle heating timeouts
+ millis_t next_temp_report = millis() + 1000;
+
+ auto report_targets = [&](const celsius_t tb, const celsius_t tp) {
+ SERIAL_ECHOLNPGM("Target Bed:", tb, " Probe:", tp);
+ };
+
+ if (do_bed_cal) {
+
+ celsius_t target_bed = PTC_BED_START,
+ target_probe = PTC_PROBE_TEMP;
+
+ say_waiting_for(); SERIAL_ECHOLNPGM(" cooling.");
+ while (thermalManager.wholeDegBed() > target_bed || thermalManager.wholeDegProbe() > target_probe)
+ report_temps(next_temp_report);
+
+ // Disable leveling so it won't mess with us
+ TERN_(HAS_LEVELING, set_bed_leveling_enabled(false));
+
+ for (uint8_t idx = 0; idx <= PTC_BED_COUNT; idx++) {
+ thermalManager.setTargetBed(target_bed);
+
+ report_targets(target_bed, target_probe);
+
+ // Park nozzle
+ do_blocking_move_to(parkpos);
+
+ // Wait for heatbed to reach target temp and probe to cool below target temp
+ if (wait_for_temps(target_bed, target_probe, next_temp_report, millis() + MIN_TO_MS(15))) {
+ SERIAL_ECHOLNPGM("!Bed heating timeout.");
+ break;
+ }
+
+ // Move the nozzle to the probing point and wait for the probe to reach target temp
+ do_blocking_move_to(noz_pos_xyz);
+ say_waiting_for_probe_heating();
+ SERIAL_EOL();
+ while (thermalManager.wholeDegProbe() < target_probe)
+ report_temps(next_temp_report);
+
+ const float measured_z = g76_probe(TSI_BED, target_bed, noz_pos_xyz);
+ if (isnan(measured_z) || target_bed > (BED_MAX_TARGET)) break;
+ }
+
+ SERIAL_ECHOLNPGM("Retrieved measurements: ", ptc.get_index());
+ if (ptc.finish_calibration(TSI_BED)) {
+ say_successfully_calibrated();
+ SERIAL_ECHOLNPGM(" bed.");
+ }
+ else {
+ say_failed_to_calibrate();
+ SERIAL_ECHOLNPGM(" bed. Values reset.");
+ }
+
+ // Cleanup
+ thermalManager.setTargetBed(0);
+ TERN_(HAS_LEVELING, set_bed_leveling_enabled(true));
+ } // do_bed_cal
+
+ /********************************************
+ * Calibrate probe temperature offsets
+ ********************************************/
+
+ if (do_probe_cal) {
+
+ // Park nozzle
+ do_blocking_move_to(parkpos);
+
+ // Initialize temperatures
+ const celsius_t target_bed = BED_MAX_TARGET;
+ thermalManager.setTargetBed(target_bed);
+
+ celsius_t target_probe = PTC_PROBE_START;
+
+ report_targets(target_bed, target_probe);
+
+ // Wait for heatbed to reach target temp and probe to cool below target temp
+ wait_for_temps(target_bed, target_probe, next_temp_report);
+
+ // Disable leveling so it won't mess with us
+ TERN_(HAS_LEVELING, set_bed_leveling_enabled(false));
+
+ bool timeout = false;
+ for (uint8_t idx = 0; idx <= PTC_PROBE_COUNT; idx++) {
+ // Move probe to probing point and wait for it to reach target temperature
+ do_blocking_move_to(noz_pos_xyz);
+
+ say_waiting_for_probe_heating();
+ SERIAL_ECHOLNPGM(" Bed:", target_bed, " Probe:", target_probe);
+ const millis_t probe_timeout_ms = millis() + SEC_TO_MS(900UL);
+ while (thermalManager.degProbe() < target_probe) {
+ if (report_temps(next_temp_report, probe_timeout_ms)) {
+ SERIAL_ECHOLNPGM("!Probe heating timed out.");
+ timeout = true;
+ break;
+ }
+ }
+ if (timeout) break;
+
+ const float measured_z = g76_probe(TSI_PROBE, target_probe, noz_pos_xyz);
+ if (isnan(measured_z)) break;
+ }
+
+ SERIAL_ECHOLNPGM("Retrieved measurements: ", ptc.get_index());
+ if (ptc.finish_calibration(TSI_PROBE))
+ say_successfully_calibrated();
+ else
+ say_failed_to_calibrate();
+ SERIAL_ECHOLNPGM(" probe.");
+
+ // Cleanup
+ thermalManager.setTargetBed(0);
+ TERN_(HAS_LEVELING, set_bed_leveling_enabled(true));
+
+ SERIAL_ECHOLNPGM("Final compensation values:");
+ ptc.print_offsets();
+ } // do_probe_cal
+
+ restore_feedrate_and_scaling();
+ }
+
+#endif // PTC_PROBE && PTC_BED
+
+/**
+ * M871: Report / reset temperature compensation offsets.
+ * Note: This does not affect values in EEPROM until M500.
+ *
+ * M871 [ R | B | P | E ]
+ *
+ * No Parameters - Print current offset values.
+ *
+ * Select only one of these flags:
+ * R - Reset all offsets to zero (i.e., disable compensation).
+ * B - Manually set offset for bed
+ * P - Manually set offset for probe
+ * E - Manually set offset for extruder
+ *
+ * With B, P, or E:
+ * I[index] - Index in the array
+ * V[value] - Adjustment in µm
+ */
+void GcodeSuite::M871() {
+
+ if (parser.seen('R')) {
+ // Reset z-probe offsets to factory defaults
+ ptc.clear_all_offsets();
+ SERIAL_ECHOLNPGM("Offsets reset to default.");
+ }
+ else if (parser.seen("BPE")) {
+ if (!parser.seenval('V')) return;
+ const int16_t offset_val = parser.value_int();
+ if (!parser.seenval('I')) return;
+ const int16_t idx = parser.value_int();
+ const TempSensorID mod = TERN_(PTC_BED, parser.seen_test('B') ? TSI_BED :)
+ TERN_(PTC_HOTEND, parser.seen_test('E') ? TSI_EXT :)
+ TERN_(PTC_PROBE, parser.seen_test('P') ? TSI_PROBE :) TSI_COUNT;
+ if (mod == TSI_COUNT)
+ SERIAL_ECHOLNPGM("!Invalid sensor.");
+ else if (idx > 0 && ptc.set_offset(mod, idx - 1, offset_val))
+ SERIAL_ECHOLNPGM("Set value: ", offset_val);
+ else
+ SERIAL_ECHOLNPGM("!Invalid index. Failed to set value (note: value at index 0 is constant).");
+ }
+ else // Print current Z-probe adjustments. Note: Values in EEPROM might differ.
+ ptc.print_offsets();
+}
+
+#endif // HAS_PTC
diff --git a/Marlin/src/gcode/calibrate/M100.cpp b/Marlin/src/gcode/calibrate/M100.cpp
index 0e2d42907a..338392b597 100644
--- a/Marlin/src/gcode/calibrate/M100.cpp
+++ b/Marlin/src/gcode/calibrate/M100.cpp
@@ -51,7 +51,7 @@
* Also, there are two support functions that can be called from a developer's C code.
*
* uint16_t check_for_free_memory_corruption(PGM_P const free_memory_start);
- * void M100_dump_routine(PGM_P const title, const char * const start, const uintptr_t size);
+ * void M100_dump_routine(FSTR_P const title, const char * const start, const uintptr_t size);
*
* Initial version by Roxy-3D
*/
@@ -182,8 +182,8 @@ inline int32_t count_test_bytes(const char * const start_free_memory) {
}
}
- void M100_dump_routine(PGM_P const title, const char * const start, const uintptr_t size) {
- SERIAL_ECHOLNPGM_P(title);
+ void M100_dump_routine(FSTR_P const title, const char * const start, const uintptr_t size) {
+ SERIAL_ECHOLNF(title);
//
// Round the start and end locations to produce full lines of output
//
@@ -196,8 +196,8 @@ inline int32_t count_test_bytes(const char * const start_free_memory) {
#endif // M100_FREE_MEMORY_DUMPER
-inline int check_for_free_memory_corruption(PGM_P const title) {
- SERIAL_ECHOPGM_P(title);
+inline int check_for_free_memory_corruption(FSTR_P const title) {
+ SERIAL_ECHOF(title);
char *start_free_memory = free_memory_start, *end_free_memory = free_memory_end;
int n = end_free_memory - start_free_memory;
@@ -217,7 +217,7 @@ inline int check_for_free_memory_corruption(PGM_P const title) {
// idle();
serial_delay(20);
#if ENABLED(M100_FREE_MEMORY_DUMPER)
- M100_dump_routine(PSTR(" Memory corruption detected with end_free_memory.
*
*/
+
#include "../../inc/MarlinConfigPre.h"
#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER)
diff --git a/Marlin/src/gcode/calibrate/M425.cpp b/Marlin/src/gcode/calibrate/M425.cpp
index 1d314a37d3..190af0f71b 100644
--- a/Marlin/src/gcode/calibrate/M425.cpp
+++ b/Marlin/src/gcode/calibrate/M425.cpp
@@ -114,7 +114,7 @@ void GcodeSuite::M425() {
}
void GcodeSuite::M425_report(const bool forReplay/*=true*/) {
- report_heading_etc(forReplay, PSTR(STR_BACKLASH_COMPENSATION));
+ report_heading_etc(forReplay, F(STR_BACKLASH_COMPENSATION));
SERIAL_ECHOLNPGM_P(
PSTR(" M425 F"), backlash.get_correction()
#ifdef BACKLASH_SMOOTHING_MM
diff --git a/Marlin/src/gcode/calibrate/M48.cpp b/Marlin/src/gcode/calibrate/M48.cpp
index 9db90c76ac..913ffe30d4 100644
--- a/Marlin/src/gcode/calibrate/M48.cpp
+++ b/Marlin/src/gcode/calibrate/M48.cpp
@@ -79,7 +79,7 @@ void GcodeSuite::M48() {
};
if (!probe.can_reach(test_position)) {
- ui.set_status_P(GET_TEXT(MSG_M48_OUT_OF_BOUNDS), 99);
+ ui.set_status(GET_TEXT_F(MSG_M48_OUT_OF_BOUNDS), 99);
SERIAL_ECHOLNPGM("? (X,Y) out of bounds.");
return;
}
@@ -144,7 +144,7 @@ void GcodeSuite::M48() {
LOOP_L_N(n, n_samples) {
#if HAS_STATUS_MESSAGE
// Display M48 progress in the status bar
- ui.status_printf_P(0, PSTR(S_FMT ": %d/%d"), GET_TEXT(MSG_M48_POINT), int(n + 1), int(n_samples));
+ ui.status_printf(0, F(S_FMT ": %d/%d"), GET_TEXT(MSG_M48_POINT), int(n + 1), int(n_samples));
#endif
// When there are "legs" of movement move around the point before probing
@@ -260,7 +260,7 @@ void GcodeSuite::M48() {
#if HAS_STATUS_MESSAGE
// Display M48 results in the status bar
char sigma_str[8];
- ui.status_printf_P(0, PSTR(S_FMT ": %s"), GET_TEXT(MSG_M48_DEVIATION), dtostrf(sigma, 2, 6, sigma_str));
+ ui.status_printf(0, F(S_FMT ": %s"), GET_TEXT(MSG_M48_DEVIATION), dtostrf(sigma, 2, 6, sigma_str));
#endif
}
diff --git a/Marlin/src/gcode/calibrate/M665.cpp b/Marlin/src/gcode/calibrate/M665.cpp
index 09b5ec8d4e..aa21471b60 100644
--- a/Marlin/src/gcode/calibrate/M665.cpp
+++ b/Marlin/src/gcode/calibrate/M665.cpp
@@ -62,7 +62,7 @@
}
void GcodeSuite::M665_report(const bool forReplay/*=true*/) {
- report_heading_etc(forReplay, PSTR(STR_DELTA_SETTINGS));
+ report_heading_etc(forReplay, F(STR_DELTA_SETTINGS));
SERIAL_ECHOLNPGM_P(
PSTR(" M665 L"), LINEAR_UNIT(delta_diagonal_rod)
, PSTR(" R"), LINEAR_UNIT(delta_radius)
@@ -132,7 +132,7 @@
}
void GcodeSuite::M665_report(const bool forReplay/*=true*/) {
- report_heading_etc(forReplay, PSTR(STR_SCARA_SETTINGS " (" STR_SCARA_S TERN_(HAS_SCARA_OFFSET, " " STR_SCARA_P_T_Z) ")"));
+ report_heading_etc(forReplay, F(STR_SCARA_SETTINGS " (" STR_S_SEG_PER_SEC TERN_(HAS_SCARA_OFFSET, " " STR_SCARA_P_T_Z) ")"));
SERIAL_ECHOLNPGM_P(
PSTR(" M665 S"), segments_per_second
#if HAS_SCARA_OFFSET
@@ -143,6 +143,29 @@
);
}
+#elif ENABLED(POLARGRAPH)
+
+ #include "../../module/polargraph.h"
+
+ /**
+ * M665: Set POLARGRAPH settings
+ *
+ * Parameters:
+ *
+ * S[segments-per-second] - Segments-per-second
+ */
+ void GcodeSuite::M665() {
+ if (parser.seenval('S'))
+ segments_per_second = parser.value_float();
+ else
+ M665_report();
+ }
+
+ void GcodeSuite::M665_report(const bool forReplay/*=true*/) {
+ report_heading_etc(forReplay, F(STR_POLARGRAPH_SETTINGS " (" STR_S_SEG_PER_SEC ")"));
+ SERIAL_ECHOLNPGM(" M665 S", segments_per_second);
+ }
+
#endif
#endif // IS_KINEMATIC
diff --git a/Marlin/src/gcode/calibrate/M666.cpp b/Marlin/src/gcode/calibrate/M666.cpp
index c4149c2352..15f8baf109 100644
--- a/Marlin/src/gcode/calibrate/M666.cpp
+++ b/Marlin/src/gcode/calibrate/M666.cpp
@@ -61,7 +61,7 @@
}
void GcodeSuite::M666_report(const bool forReplay/*=true*/) {
- report_heading_etc(forReplay, PSTR(STR_ENDSTOP_ADJUSTMENT));
+ report_heading_etc(forReplay, F(STR_ENDSTOP_ADJUSTMENT));
SERIAL_ECHOLNPGM_P(
PSTR(" M666 X"), LINEAR_UNIT(delta_endstop_adj.a)
, SP_Y_STR, LINEAR_UNIT(delta_endstop_adj.b)
@@ -105,7 +105,7 @@
}
void GcodeSuite::M666_report(const bool forReplay/*=true*/) {
- report_heading_etc(forReplay, PSTR(STR_ENDSTOP_ADJUSTMENT));
+ report_heading_etc(forReplay, F(STR_ENDSTOP_ADJUSTMENT));
SERIAL_ECHOPGM(" M666");
#if ENABLED(X_DUAL_ENDSTOPS)
SERIAL_ECHOLNPGM_P(SP_X_STR, LINEAR_UNIT(endstops.x2_endstop_adj));
diff --git a/Marlin/src/gcode/calibrate/M852.cpp b/Marlin/src/gcode/calibrate/M852.cpp
index c4361b89f3..b24a449652 100644
--- a/Marlin/src/gcode/calibrate/M852.cpp
+++ b/Marlin/src/gcode/calibrate/M852.cpp
@@ -92,7 +92,7 @@ void GcodeSuite::M852() {
}
void GcodeSuite::M852_report(const bool forReplay/*=true*/) {
- report_heading_etc(forReplay, PSTR(STR_SKEW_FACTOR));
+ report_heading_etc(forReplay, F(STR_SKEW_FACTOR));
SERIAL_ECHOPAIR_F(" M851 I", planner.skew_factor.xy, 6);
#if ENABLED(SKEW_CORRECTION_FOR_Z)
SERIAL_ECHOPAIR_F(" J", planner.skew_factor.xz, 6);
diff --git a/Marlin/src/gcode/config/M200-M205.cpp b/Marlin/src/gcode/config/M200-M205.cpp
index 2880bd9943..7b7ce5e10d 100644
--- a/Marlin/src/gcode/config/M200-M205.cpp
+++ b/Marlin/src/gcode/config/M200-M205.cpp
@@ -76,7 +76,7 @@
void GcodeSuite::M200_report(const bool forReplay/*=true*/) {
if (!forReplay) {
- report_heading(forReplay, PSTR(STR_FILAMENT_SETTINGS), false);
+ report_heading(forReplay, F(STR_FILAMENT_SETTINGS), false);
if (!parser.volumetric_enabled) SERIAL_ECHOPGM(" (Disabled):");
SERIAL_EOL();
report_echo_start(forReplay);
@@ -133,7 +133,7 @@ void GcodeSuite::M201() {
}
void GcodeSuite::M201_report(const bool forReplay/*=true*/) {
- report_heading_etc(forReplay, PSTR(STR_MAX_ACCELERATION));
+ report_heading_etc(forReplay, F(STR_MAX_ACCELERATION));
SERIAL_ECHOLNPGM_P(
LIST_N(DOUBLE(LINEAR_AXES),
PSTR(" M201 X"), LINEAR_UNIT(planner.settings.max_acceleration_mm_per_s2[X_AXIS]),
@@ -178,7 +178,7 @@ void GcodeSuite::M203() {
}
void GcodeSuite::M203_report(const bool forReplay/*=true*/) {
- report_heading_etc(forReplay, PSTR(STR_MAX_FEEDRATES));
+ report_heading_etc(forReplay, F(STR_MAX_FEEDRATES));
SERIAL_ECHOLNPGM_P(
LIST_N(DOUBLE(LINEAR_AXES),
PSTR(" M203 X"), LINEAR_UNIT(planner.settings.max_feedrate_mm_s[X_AXIS]),
@@ -224,7 +224,7 @@ void GcodeSuite::M204() {
}
void GcodeSuite::M204_report(const bool forReplay/*=true*/) {
- report_heading_etc(forReplay, PSTR(STR_ACCELERATION_P_R_T));
+ report_heading_etc(forReplay, F(STR_ACCELERATION_P_R_T));
SERIAL_ECHOLNPGM_P(
PSTR(" M204 P"), LINEAR_UNIT(planner.settings.acceleration)
, PSTR(" R"), LINEAR_UNIT(planner.settings.retract_acceleration)
@@ -285,7 +285,7 @@ void GcodeSuite::M205() {
}
void GcodeSuite::M205_report(const bool forReplay/*=true*/) {
- report_heading_etc(forReplay, PSTR(
+ report_heading_etc(forReplay, F(
"Advanced (B S T"
TERN_(HAS_JUNCTION_DEVIATION, " J")
TERN_(HAS_CLASSIC_JERK, " X Y Z")
diff --git a/Marlin/src/gcode/config/M217.cpp b/Marlin/src/gcode/config/M217.cpp
index 11d8c43ef0..7576272a48 100644
--- a/Marlin/src/gcode/config/M217.cpp
+++ b/Marlin/src/gcode/config/M217.cpp
@@ -131,19 +131,19 @@ void GcodeSuite::M217() {
}
void GcodeSuite::M217_report(const bool forReplay/*=true*/) {
- report_heading_etc(forReplay, PSTR(STR_TOOL_CHANGING));
+ report_heading_etc(forReplay, F(STR_TOOL_CHANGING));
SERIAL_ECHOPGM(" M217");
#if ENABLED(TOOLCHANGE_FILAMENT_SWAP)
SERIAL_ECHOPGM(" S", LINEAR_UNIT(toolchange_settings.swap_length));
SERIAL_ECHOPGM_P(SP_B_STR, LINEAR_UNIT(toolchange_settings.extra_resume),
- SP_E_STR, LINEAR_UNIT(toolchange_settings.extra_prime),
- SP_P_STR, LINEAR_UNIT(toolchange_settings.prime_speed));
+ SP_E_STR, LINEAR_UNIT(toolchange_settings.extra_prime),
+ SP_P_STR, LINEAR_UNIT(toolchange_settings.prime_speed));
SERIAL_ECHOPGM(" R", LINEAR_UNIT(toolchange_settings.retract_speed),
- " U", LINEAR_UNIT(toolchange_settings.unretract_speed),
- " F", toolchange_settings.fan_speed,
- " G", toolchange_settings.fan_time);
+ " U", LINEAR_UNIT(toolchange_settings.unretract_speed),
+ " F", toolchange_settings.fan_speed,
+ " G", toolchange_settings.fan_time);
#if ENABLED(TOOLCHANGE_MIGRATION_FEATURE)
SERIAL_ECHOPGM(" A", migration.automode);
diff --git a/Marlin/src/gcode/config/M218.cpp b/Marlin/src/gcode/config/M218.cpp
index c95cd6c1b9..c39447a28d 100644
--- a/Marlin/src/gcode/config/M218.cpp
+++ b/Marlin/src/gcode/config/M218.cpp
@@ -57,7 +57,7 @@ void GcodeSuite::M218() {
}
void GcodeSuite::M218_report(const bool forReplay/*=true*/) {
- report_heading_etc(forReplay, PSTR(STR_HOTEND_OFFSETS));
+ report_heading_etc(forReplay, F(STR_HOTEND_OFFSETS));
LOOP_S_L_N(e, 1, HOTENDS) {
report_echo_start(forReplay);
SERIAL_ECHOPGM_P(
diff --git a/Marlin/src/gcode/config/M281.cpp b/Marlin/src/gcode/config/M281.cpp
index b6644eb4ab..b90de6be30 100644
--- a/Marlin/src/gcode/config/M281.cpp
+++ b/Marlin/src/gcode/config/M281.cpp
@@ -19,6 +19,7 @@
* along with this program. If not, see .
*
*/
+
#include "../../inc/MarlinConfig.h"
#if ENABLED(EDITABLE_SERVO_ANGLES)
@@ -54,7 +55,7 @@ void GcodeSuite::M281() {
}
void GcodeSuite::M281_report(const bool forReplay/*=true*/) {
- report_heading_etc(forReplay, PSTR(STR_SERVO_ANGLES));
+ report_heading_etc(forReplay, F(STR_SERVO_ANGLES));
LOOP_L_N(i, NUM_SERVOS) {
switch (i) {
default: break;
diff --git a/Marlin/src/gcode/config/M301.cpp b/Marlin/src/gcode/config/M301.cpp
index 19b438309c..fc9f1883d6 100644
--- a/Marlin/src/gcode/config/M301.cpp
+++ b/Marlin/src/gcode/config/M301.cpp
@@ -48,10 +48,10 @@
void GcodeSuite::M301() {
// multi-extruder PID patch: M301 updates or prints a single extruder's PID values
// default behavior (omitting E parameter) is to update for extruder 0 only
- int8_t e = parser.byteval('E', -1); // extruder being updated
+ int8_t e = E_TERN0(parser.byteval('E', -1)); // extruder being updated
if (!parser.seen("PID" TERN_(PID_EXTRUSION_SCALING, "CL") TERN_(PID_FAN_SCALING, "F")))
- return M301_report(true, e);
+ return M301_report(true E_OPTARG(e));
if (e == -1) e = 0;
@@ -78,8 +78,9 @@ void GcodeSuite::M301() {
SERIAL_ERROR_MSG(STR_INVALID_EXTRUDER);
}
-void GcodeSuite::M301_report(const bool forReplay/*=true*/, const int8_t eindex/*=-1*/) {
- report_heading(forReplay, PSTR(STR_HOTEND_PID));
+void GcodeSuite::M301_report(const bool forReplay/*=true*/ E_OPTARG(const int8_t eindex/*=-1*/)) {
+ report_heading(forReplay, F(STR_HOTEND_PID));
+ IF_DISABLED(HAS_MULTI_EXTRUDER, constexpr int8_t eindex = -1);
HOTEND_LOOP() {
if (e == eindex || eindex == -1) {
report_echo_start(forReplay);
diff --git a/Marlin/src/gcode/config/M302.cpp b/Marlin/src/gcode/config/M302.cpp
index 57c049e194..e271dcd469 100644
--- a/Marlin/src/gcode/config/M302.cpp
+++ b/Marlin/src/gcode/config/M302.cpp
@@ -55,7 +55,7 @@ void GcodeSuite::M302() {
// Report current state
SERIAL_ECHO_START();
SERIAL_ECHOPGM("Cold extrudes are ");
- SERIAL_ECHOPGM_P(thermalManager.allow_cold_extrude ? PSTR("en") : PSTR("dis"));
+ SERIAL_ECHOF(thermalManager.allow_cold_extrude ? F("en") : F("dis"));
SERIAL_ECHOLNPGM("abled (min temp ", thermalManager.extrude_min_temp, "C)");
}
}
diff --git a/Marlin/src/gcode/config/M304.cpp b/Marlin/src/gcode/config/M304.cpp
index 05ee4bad80..97dc4be25e 100644
--- a/Marlin/src/gcode/config/M304.cpp
+++ b/Marlin/src/gcode/config/M304.cpp
@@ -42,8 +42,8 @@ void GcodeSuite::M304() {
}
void GcodeSuite::M304_report(const bool forReplay/*=true*/) {
- report_heading_etc(forReplay, PSTR(STR_BED_PID));
- SERIAL_ECHO_MSG(
+ report_heading_etc(forReplay, F(STR_BED_PID));
+ SERIAL_ECHOLNPGM(
" M304 P", thermalManager.temp_bed.pid.Kp
, " I", unscalePID_i(thermalManager.temp_bed.pid.Ki)
, " D", unscalePID_d(thermalManager.temp_bed.pid.Kd)
diff --git a/Marlin/src/gcode/config/M309.cpp b/Marlin/src/gcode/config/M309.cpp
index 01c4e62347..577023292e 100644
--- a/Marlin/src/gcode/config/M309.cpp
+++ b/Marlin/src/gcode/config/M309.cpp
@@ -42,7 +42,7 @@ void GcodeSuite::M309() {
}
void GcodeSuite::M309_report(const bool forReplay/*=true*/) {
- report_heading_etc(forReplay, PSTR(STR_CHAMBER_PID));
+ report_heading_etc(forReplay, F(STR_CHAMBER_PID));
SERIAL_ECHOLNPGM(
" M309 P", thermalManager.temp_chamber.pid.Kp
, " I", unscalePID_i(thermalManager.temp_chamber.pid.Ki)
diff --git a/Marlin/src/gcode/config/M43.cpp b/Marlin/src/gcode/config/M43.cpp
index b2455c4b60..097aa142f0 100644
--- a/Marlin/src/gcode/config/M43.cpp
+++ b/Marlin/src/gcode/config/M43.cpp
@@ -65,12 +65,12 @@ inline void toggle_pins() {
pin_t pin = GET_PIN_MAP_PIN_M43(i);
if (!VALID_PIN(pin)) continue;
if (M43_NEVER_TOUCH(i) || (!ignore_protection && pin_is_protected(pin))) {
- report_pin_state_extended(pin, ignore_protection, true, PSTR("Untouched "));
+ report_pin_state_extended(pin, ignore_protection, true, F("Untouched "));
SERIAL_EOL();
}
else {
watchdog_refresh();
- report_pin_state_extended(pin, ignore_protection, true, PSTR("Pulsing "));
+ report_pin_state_extended(pin, ignore_protection, true, F("Pulsing "));
#ifdef __STM32F1__
const auto prior_mode = _GET_MODE(i);
#else
@@ -112,7 +112,7 @@ inline void toggle_pins() {
}
SERIAL_EOL();
}
- SERIAL_ECHOLNPGM("Done.");
+ SERIAL_ECHOLNPGM(STR_DONE);
} // toggle_pins
@@ -303,7 +303,7 @@ void GcodeSuite::M43() {
if (parser.seen('E')) {
endstops.monitor_flag = parser.value_bool();
SERIAL_ECHOPGM("endstop monitor ");
- SERIAL_ECHOPGM_P(endstops.monitor_flag ? PSTR("en") : PSTR("dis"));
+ SERIAL_ECHOF(endstops.monitor_flag ? F("en") : F("dis"));
SERIAL_ECHOLNPGM("abled");
return;
}
@@ -344,8 +344,8 @@ void GcodeSuite::M43() {
#if HAS_RESUME_CONTINUE
KEEPALIVE_STATE(PAUSED_FOR_USER);
wait_for_user = true;
- TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, PSTR("M43 Wait Called"), CONTINUE_STR));
- TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(PSTR("M43 Wait Called")));
+ TERN_(HOST_PROMPT_SUPPORT, hostui.prompt_do(PROMPT_USER_CONTINUE, F("M43 Wait Called"), FPSTR(CONTINUE_STR)));
+ TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired(F("M43 Wait Called")));
#endif
for (;;) {
diff --git a/Marlin/src/gcode/config/M92.cpp b/Marlin/src/gcode/config/M92.cpp
index ecc5e63a3c..54fe698f97 100644
--- a/Marlin/src/gcode/config/M92.cpp
+++ b/Marlin/src/gcode/config/M92.cpp
@@ -76,7 +76,7 @@ void GcodeSuite::M92() {
if (parser.seen('H') || wanted) {
const uint16_t argH = parser.ushortval('H'),
micro_steps = argH ?: Z_MICROSTEPS;
- const float z_full_step_mm = micro_steps * planner.steps_to_mm[Z_AXIS];
+ const float z_full_step_mm = micro_steps * planner.mm_per_step[Z_AXIS];
SERIAL_ECHO_START();
SERIAL_ECHOPGM("{ micro_steps:", micro_steps, ", z_full_step_mm:", z_full_step_mm);
if (wanted) {
@@ -91,7 +91,7 @@ void GcodeSuite::M92() {
}
void GcodeSuite::M92_report(const bool forReplay/*=true*/, const int8_t e/*=-1*/) {
- report_heading_etc(forReplay, PSTR(STR_STEPS_PER_UNIT));
+ report_heading_etc(forReplay, F(STR_STEPS_PER_UNIT));
SERIAL_ECHOPGM_P(LIST_N(DOUBLE(LINEAR_AXES),
PSTR(" M92 X"), LINEAR_UNIT(planner.settings.axis_steps_per_mm[X_AXIS]),
SP_Y_STR, LINEAR_UNIT(planner.settings.axis_steps_per_mm[Y_AXIS]),
diff --git a/Marlin/src/gcode/control/M108_M112_M410.cpp b/Marlin/src/gcode/control/M108_M112_M410.cpp
index 309c806c8f..39f9c04e19 100644
--- a/Marlin/src/gcode/control/M108_M112_M410.cpp
+++ b/Marlin/src/gcode/control/M108_M112_M410.cpp
@@ -40,7 +40,7 @@ void GcodeSuite::M108() {
* M112: Full Shutdown
*/
void GcodeSuite::M112() {
- kill(M112_KILL_STR, nullptr, true);
+ kill(FPSTR(M112_KILL_STR), nullptr, true);
}
/**
diff --git a/Marlin/src/gcode/control/M111.cpp b/Marlin/src/gcode/control/M111.cpp
index 69d20b4c5d..08c39b762e 100644
--- a/Marlin/src/gcode/control/M111.cpp
+++ b/Marlin/src/gcode/control/M111.cpp
@@ -26,7 +26,7 @@
* M111: Set the debug level
*/
void GcodeSuite::M111() {
- if (parser.seen('S')) marlin_debug_flags = parser.byteval('S');
+ if (parser.seenval('S')) marlin_debug_flags = parser.value_byte();
static PGMSTR(str_debug_1, STR_DEBUG_ECHO);
static PGMSTR(str_debug_2, STR_DEBUG_INFO);
diff --git a/Marlin/src/gcode/control/M17_M18_M84.cpp b/Marlin/src/gcode/control/M17_M18_M84.cpp
index e6e0f033ec..4683786f1f 100644
--- a/Marlin/src/gcode/control/M17_M18_M84.cpp
+++ b/Marlin/src/gcode/control/M17_M18_M84.cpp
@@ -29,29 +29,186 @@
#include "../../feature/bedlevel/bedlevel.h"
#endif
-/**
- * M17: Enable stepper motors
- */
-void GcodeSuite::M17() {
- if (parser.seen_axis()) {
- LOGICAL_AXIS_CODE(
- if (TERN0(HAS_E_STEPPER_ENABLE, parser.seen_test('E'))) enable_e_steppers(),
- if (parser.seen_test('X')) ENABLE_AXIS_X(),
- if (parser.seen_test('Y')) ENABLE_AXIS_Y(),
- if (parser.seen_test('Z')) ENABLE_AXIS_Z(),
- if (parser.seen_test(AXIS4_NAME)) ENABLE_AXIS_I(),
- if (parser.seen_test(AXIS5_NAME)) ENABLE_AXIS_J(),
- if (parser.seen_test(AXIS6_NAME)) ENABLE_AXIS_K()
- );
+#define DEBUG_OUT ENABLED(MARLIN_DEV_MODE)
+#include "../../core/debug_out.h"
+#include "../../libs/hex_print.h"
+
+inline axis_flags_t selected_axis_bits() {
+ axis_flags_t selected{0};
+ #if HAS_EXTRUDERS
+ if (parser.seen('E')) {
+ if (E_TERN0(parser.has_value())) {
+ const uint8_t e = parser.value_int();
+ if (e < EXTRUDERS)
+ selected.bits = _BV(INDEX_OF_AXIS(E_AXIS, e));
+ }
+ else
+ selected.bits = selected.e_bits();
+ }
+ #endif
+ selected.bits |= LINEAR_AXIS_GANG(
+ (parser.seen_test('X') << X_AXIS),
+ | (parser.seen_test('Y') << Y_AXIS),
+ | (parser.seen_test('Z') << Z_AXIS),
+ | (parser.seen_test(AXIS4_NAME) << I_AXIS),
+ | (parser.seen_test(AXIS5_NAME) << J_AXIS),
+ | (parser.seen_test(AXIS6_NAME) << K_AXIS)
+ );
+ return selected;
+}
+
+// Enable specified axes and warn about other affected axes
+void do_enable(const axis_flags_t to_enable) {
+ const ena_mask_t was_enabled = stepper.axis_enabled.bits,
+ shall_enable = to_enable.bits & ~was_enabled;
+
+ DEBUG_ECHOLNPGM("Now Enabled: ", hex_word(stepper.axis_enabled.bits), " Enabling: ", hex_word(to_enable.bits), " | ", shall_enable);
+
+ if (!shall_enable) return; // All specified axes already enabled?
+
+ ena_mask_t also_enabled = 0; // Track steppers enabled due to overlap
+
+ // Enable all flagged axes
+ LOOP_LINEAR_AXES(a) {
+ if (TEST(shall_enable, a)) {
+ stepper.enable_axis(AxisEnum(a)); // Mark and enable the requested axis
+ DEBUG_ECHOLNPGM("Enabled ", axis_codes[a], " (", a, ") with overlap ", hex_word(enable_overlap[a]), " ... Enabled: ", hex_word(stepper.axis_enabled.bits));
+ also_enabled |= enable_overlap[a];
+ }
}
- else {
- LCD_MESSAGEPGM(MSG_NO_MOVE);
- enable_all_steppers();
+ #if HAS_EXTRUDERS
+ LOOP_L_N(e, EXTRUDERS) {
+ const uint8_t a = INDEX_OF_AXIS(E_AXIS, e);
+ if (TEST(shall_enable, a)) {
+ stepper.ENABLE_EXTRUDER(e);
+ DEBUG_ECHOLNPGM("Enabled E", AS_DIGIT(e), " (", a, ") with overlap ", hex_word(enable_overlap[a]), " ... ", hex_word(stepper.axis_enabled.bits));
+ also_enabled |= enable_overlap[a];
+ }
+ }
+ #endif
+
+ if ((also_enabled &= ~(shall_enable | was_enabled))) {
+ SERIAL_CHAR('(');
+ LOOP_LINEAR_AXES(a) if (TEST(also_enabled, a)) SERIAL_CHAR(axis_codes[a], ' ');
+ #if HAS_EXTRUDERS
+ #define _EN_ALSO(N) if (TEST(also_enabled, INDEX_OF_AXIS(E_AXIS, N))) SERIAL_CHAR('E', '0' + N, ' ');
+ REPEAT(EXTRUDERS, _EN_ALSO)
+ #endif
+ SERIAL_ECHOLNPGM("also enabled)");
}
+
+ DEBUG_ECHOLNPGM("Enabled Now: ", hex_word(stepper.axis_enabled.bits));
}
/**
- * M18, M84: Disable stepper motors
+ * M17: Enable stepper motor power for one or more axes.
+ * Print warnings for axes that share an ENABLE_PIN.
+ *
+ * Examples:
+ *
+ * M17 XZ ; Enable X and Z axes
+ * M17 E ; Enable all E steppers
+ * M17 E1 ; Enable just the E1 stepper
+ */
+void GcodeSuite::M17() {
+ if (parser.seen_axis()) {
+ if (any_enable_overlap())
+ do_enable(selected_axis_bits());
+ else {
+ #if HAS_EXTRUDERS
+ if (parser.seen('E')) {
+ if (parser.has_value()) {
+ const uint8_t e = parser.value_int();
+ if (e < EXTRUDERS) stepper.ENABLE_EXTRUDER(e);
+ }
+ else
+ stepper.enable_e_steppers();
+ }
+ #endif
+ LINEAR_AXIS_CODE(
+ if (parser.seen_test('X')) stepper.enable_axis(X_AXIS),
+ if (parser.seen_test('Y')) stepper.enable_axis(Y_AXIS),
+ if (parser.seen_test('Z')) stepper.enable_axis(Z_AXIS),
+ if (parser.seen_test(AXIS4_NAME)) stepper.enable_axis(I_AXIS),
+ if (parser.seen_test(AXIS5_NAME)) stepper.enable_axis(J_AXIS),
+ if (parser.seen_test(AXIS6_NAME)) stepper.enable_axis(K_AXIS)
+ );
+ }
+ }
+ else {
+ LCD_MESSAGE(MSG_NO_MOVE);
+ stepper.enable_all_steppers();
+ }
+}
+
+void try_to_disable(const axis_flags_t to_disable) {
+ ena_mask_t still_enabled = to_disable.bits & stepper.axis_enabled.bits;
+
+ DEBUG_ECHOLNPGM("Enabled: ", hex_word(stepper.axis_enabled.bits), " To Disable: ", hex_word(to_disable.bits), " | ", hex_word(still_enabled));
+
+ if (!still_enabled) return;
+
+ // Attempt to disable all flagged axes
+ LOOP_LINEAR_AXES(a)
+ if (TEST(to_disable.bits, a)) {
+ DEBUG_ECHOPGM("Try to disable ", axis_codes[a], " (", a, ") with overlap ", hex_word(enable_overlap[a]), " ... ");
+ if (stepper.disable_axis(AxisEnum(a))) { // Mark the requested axis and request to disable
+ DEBUG_ECHOPGM("OK");
+ still_enabled &= ~(_BV(a) | enable_overlap[a]); // If actually disabled, clear one or more tracked bits
+ }
+ else
+ DEBUG_ECHOPGM("OVERLAP");
+ DEBUG_ECHOLNPGM(" ... still_enabled=", hex_word(still_enabled));
+ }
+ #if HAS_EXTRUDERS
+ LOOP_L_N(e, EXTRUDERS) {
+ const uint8_t a = INDEX_OF_AXIS(E_AXIS, e);
+ if (TEST(to_disable.bits, a)) {
+ DEBUG_ECHOPGM("Try to disable E", AS_DIGIT(e), " (", a, ") with overlap ", hex_word(enable_overlap[a]), " ... ");
+ if (stepper.DISABLE_EXTRUDER(e)) {
+ DEBUG_ECHOPGM("OK");
+ still_enabled &= ~(_BV(a) | enable_overlap[a]);
+ }
+ else
+ DEBUG_ECHOPGM("OVERLAP");
+ DEBUG_ECHOLNPGM(" ... still_enabled=", hex_word(still_enabled));
+ }
+ }
+ #endif
+
+ auto overlap_warning = [](const ena_mask_t axis_bits) {
+ SERIAL_ECHOPGM(" not disabled. Shared with");
+ LOOP_LINEAR_AXES(a) if (TEST(axis_bits, a)) SERIAL_CHAR(' ', axis_codes[a]);
+ #if HAS_EXTRUDERS
+ #define _EN_STILLON(N) if (TEST(axis_bits, INDEX_OF_AXIS(E_AXIS, N))) SERIAL_CHAR(' ', 'E', '0' + N);
+ REPEAT(EXTRUDERS, _EN_STILLON)
+ #endif
+ SERIAL_ECHOLNPGM(".");
+ };
+
+ // If any of the requested axes are still enabled, give a warning
+ LOOP_LINEAR_AXES(a) {
+ if (TEST(still_enabled, a)) {
+ SERIAL_CHAR(axis_codes[a]);
+ overlap_warning(stepper.axis_enabled.bits & enable_overlap[a]);
+ }
+ }
+ #if HAS_EXTRUDERS
+ LOOP_L_N(e, EXTRUDERS) {
+ const uint8_t a = INDEX_OF_AXIS(E_AXIS, e);
+ if (TEST(still_enabled, a)) {
+ SERIAL_CHAR('E', '0' + e);
+ overlap_warning(stepper.axis_enabled.bits & enable_overlap[a]);
+ }
+ }
+ #endif
+
+ DEBUG_ECHOLNPGM("Enabled Now: ", hex_word(stepper.axis_enabled.bits));
+}
+
+/**
+ * M18, M84: Disable stepper motor power for one or more axes.
+ * Print warnings for axes that share an ENABLE_PIN.
*/
void GcodeSuite::M18_M84() {
if (parser.seenval('S')) {
@@ -61,15 +218,26 @@ void GcodeSuite::M18_M84() {
else {
if (parser.seen_axis()) {
planner.synchronize();
- LOGICAL_AXIS_CODE(
- if (TERN0(HAS_E_STEPPER_ENABLE, parser.seen_test('E'))) disable_e_steppers(),
- if (parser.seen_test('X')) DISABLE_AXIS_X(),
- if (parser.seen_test('Y')) DISABLE_AXIS_Y(),
- if (parser.seen_test('Z')) DISABLE_AXIS_Z(),
- if (parser.seen_test(AXIS4_NAME)) DISABLE_AXIS_I(),
- if (parser.seen_test(AXIS5_NAME)) DISABLE_AXIS_J(),
- if (parser.seen_test(AXIS6_NAME)) DISABLE_AXIS_K()
- );
+ if (any_enable_overlap())
+ try_to_disable(selected_axis_bits());
+ else {
+ #if HAS_EXTRUDERS
+ if (parser.seen('E')) {
+ if (E_TERN0(parser.has_value()))
+ stepper.DISABLE_EXTRUDER(parser.value_int());
+ else
+ stepper.disable_e_steppers();
+ }
+ #endif
+ LINEAR_AXIS_CODE(
+ if (parser.seen_test('X')) stepper.disable_axis(X_AXIS),
+ if (parser.seen_test('Y')) stepper.disable_axis(Y_AXIS),
+ if (parser.seen_test('Z')) stepper.disable_axis(Z_AXIS),
+ if (parser.seen_test(AXIS4_NAME)) stepper.disable_axis(I_AXIS),
+ if (parser.seen_test(AXIS5_NAME)) stepper.disable_axis(J_AXIS),
+ if (parser.seen_test(AXIS6_NAME)) stepper.disable_axis(K_AXIS)
+ );
+ }
}
else
planner.finish_and_disable();
diff --git a/Marlin/src/gcode/control/M211.cpp b/Marlin/src/gcode/control/M211.cpp
index a837d79533..95ae052a7b 100644
--- a/Marlin/src/gcode/control/M211.cpp
+++ b/Marlin/src/gcode/control/M211.cpp
@@ -40,15 +40,15 @@ void GcodeSuite::M211() {
}
void GcodeSuite::M211_report(const bool forReplay/*=true*/) {
- report_heading_etc(forReplay, PSTR(STR_SOFT_ENDSTOPS));
+ report_heading_etc(forReplay, F(STR_SOFT_ENDSTOPS));
SERIAL_ECHOPGM(" M211 S", AS_DIGIT(soft_endstop._enabled), " ; ");
serialprintln_onoff(soft_endstop._enabled);
report_echo_start(forReplay);
const xyz_pos_t l_soft_min = soft_endstop.min.asLogical(),
l_soft_max = soft_endstop.max.asLogical();
- print_pos(l_soft_min, PSTR(STR_SOFT_MIN), PSTR(" "));
- print_pos(l_soft_max, PSTR(STR_SOFT_MAX));
+ print_pos(l_soft_min, F(STR_SOFT_MIN), F(" "));
+ print_pos(l_soft_max, F(STR_SOFT_MAX));
}
#endif // HAS_SOFTWARE_ENDSTOPS
diff --git a/Marlin/src/gcode/control/M280.cpp b/Marlin/src/gcode/control/M280.cpp
index 187c9a9b19..2a8e73eafb 100644
--- a/Marlin/src/gcode/control/M280.cpp
+++ b/Marlin/src/gcode/control/M280.cpp
@@ -26,22 +26,44 @@
#include "../gcode.h"
#include "../../module/servo.h"
+#include "../../module/planner.h"
/**
- * M280: Get or set servo position. P [S]
+ * M280: Get or set servo position.
+ * P - Servo index
+ * S - Angle to set, omit to read current angle, or use -1 to detach
+ *
+ * With POLARGRAPH:
+ * T - Duration of servo move
*/
void GcodeSuite::M280() {
- if (!parser.seen('P')) return;
+ if (!parser.seenval('P')) return;
+
+ TERN_(POLARGRAPH, planner.synchronize());
const int servo_index = parser.value_int();
if (WITHIN(servo_index, 0, NUM_SERVOS - 1)) {
- if (parser.seen('S')) {
- const int a = parser.value_int();
- if (a == -1)
- servo[servo_index].detach();
+ if (parser.seenval('S')) {
+ const int anew = parser.value_int();
+ if (anew >= 0) {
+ #if ENABLED(POLARGRAPH)
+ if (parser.seen('T')) { // (ms) Total duration of servo move
+ const int16_t t = constrain(parser.value_int(), 0, 10000);
+ const int aold = servo[servo_index].read();
+ millis_t now = millis();
+ const millis_t start = now, end = start + t;
+ while (PENDING(now, end)) {
+ safe_delay(50);
+ now = _MIN(millis(), end);
+ MOVE_SERVO(servo_index, LROUND(aold + (anew - aold) * (float(now - start) / t)));
+ }
+ }
+ #endif // POLARGRAPH
+ MOVE_SERVO(servo_index, anew);
+ }
else
- MOVE_SERVO(servo_index, a);
+ DETACH_SERVO(servo_index);
}
else
SERIAL_ECHO_MSG(" Servo ", servo_index, ": ", servo[servo_index].read());
diff --git a/Marlin/src/gcode/control/M282.cpp b/Marlin/src/gcode/control/M282.cpp
new file mode 100644
index 0000000000..e6f5ce7dcc
--- /dev/null
+++ b/Marlin/src/gcode/control/M282.cpp
@@ -0,0 +1,45 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+#include "../../inc/MarlinConfig.h"
+
+#if ENABLED(SERVO_DETACH_GCODE)
+
+#include "../gcode.h"
+#include "../../module/servo.h"
+
+/**
+ * M282: Detach Servo. P
+ */
+void GcodeSuite::M282() {
+
+ if (!parser.seenval('P')) return;
+
+ const int servo_index = parser.value_int();
+ if (WITHIN(servo_index, 0, NUM_SERVOS - 1))
+ DETACH_SERVO(servo_index);
+ else
+ SERIAL_ECHO_MSG("Servo ", servo_index, " out of range");
+
+}
+
+#endif // SERVO_DETACH_GCODE
diff --git a/Marlin/src/gcode/control/M42.cpp b/Marlin/src/gcode/control/M42.cpp
index eead971a01..77c0ccc49b 100644
--- a/Marlin/src/gcode/control/M42.cpp
+++ b/Marlin/src/gcode/control/M42.cpp
@@ -126,10 +126,10 @@ void GcodeSuite::M42() {
extDigitalWrite(pin, pin_status);
#ifdef ARDUINO_ARCH_STM32
- // A simple I/O will be set to 0 by analogWrite()
+ // A simple I/O will be set to 0 by set_pwm_duty()
if (pin_status <= 1 && !PWM_PIN(pin)) return;
#endif
- analogWrite(pin, pin_status);
+ set_pwm_duty(pin, pin_status);
}
#endif // DIRECT_PIN_CONTROL
diff --git a/Marlin/src/gcode/control/M605.cpp b/Marlin/src/gcode/control/M605.cpp
index 08efaab59d..788659e7e2 100644
--- a/Marlin/src/gcode/control/M605.cpp
+++ b/Marlin/src/gcode/control/M605.cpp
@@ -110,7 +110,7 @@
set_duplication_enabled(false);
#ifdef EVENT_GCODE_IDEX_AFTER_MODECHANGE
- gcode.process_subcommands_now_P(PSTR(EVENT_GCODE_IDEX_AFTER_MODECHANGE));
+ process_subcommands_now(F(EVENT_GCODE_IDEX_AFTER_MODECHANGE));
#endif
}
else if (!parser.seen('W')) // if no S or W parameter, the DXC mode gets reset to the user's default
diff --git a/Marlin/src/gcode/control/M80_M81.cpp b/Marlin/src/gcode/control/M80_M81.cpp
index 149613ee15..b8be9daa40 100644
--- a/Marlin/src/gcode/control/M80_M81.cpp
+++ b/Marlin/src/gcode/control/M80_M81.cpp
@@ -25,7 +25,7 @@
#include "../../module/temperature.h"
#include "../../module/planner.h" // for planner.finish_and_disable
#include "../../module/printcounter.h" // for print_job_timer.stop
-#include "../../lcd/marlinui.h" // for LCD_MESSAGEPGM_P
+#include "../../lcd/marlinui.h" // for LCD_MESSAGE_F
#include "../../inc/MarlinConfig.h"
@@ -48,7 +48,7 @@
// S: Report the current power supply state and exit
if (parser.seen('S')) {
- SERIAL_ECHOPGM_P(powerManager.psu_on ? PSTR("PS:1\n") : PSTR("PS:0\n"));
+ SERIAL_ECHOF(powerManager.psu_on ? F("PS:1\n") : F("PS:0\n"));
return;
}
@@ -74,13 +74,12 @@
* This code should ALWAYS be available for FULL SHUTDOWN!
*/
void GcodeSuite::M81() {
- thermalManager.disable_all_heaters();
planner.finish_and_disable();
+ thermalManager.cooldown();
print_job_timer.stop();
#if HAS_FAN
- thermalManager.zero_fan_speeds();
#if ENABLED(PROBING_FANS_OFF)
thermalManager.fans_paused = false;
ZERO(thermalManager.saved_fan_speed);
@@ -95,5 +94,5 @@ void GcodeSuite::M81() {
powerManager.power_off_soon();
#endif
- LCD_MESSAGEPGM_P(PSTR(MACHINE_NAME " " STR_OFF "."));
+ LCD_MESSAGE_F(MACHINE_NAME " " STR_OFF ".");
}
diff --git a/Marlin/src/gcode/feature/L6470/M122.cpp b/Marlin/src/gcode/feature/L6470/M122.cpp
index 1e5b37e4b7..4a5629b049 100644
--- a/Marlin/src/gcode/feature/L6470/M122.cpp
+++ b/Marlin/src/gcode/feature/L6470/M122.cpp
@@ -47,10 +47,10 @@ inline void L6470_say_status(const L64XX_axis_t axis) {
}
#endif
SERIAL_ECHOPGM("\n...OUTPUT: ");
- SERIAL_ECHOPGM_P(sh.STATUS_AXIS & STATUS_HIZ ? PSTR("OFF") : PSTR("ON "));
+ SERIAL_ECHOF(sh.STATUS_AXIS & STATUS_HIZ ? F("OFF") : F("ON "));
SERIAL_ECHOPGM(" BUSY: "); echo_yes_no((sh.STATUS_AXIS & STATUS_BUSY) == 0);
SERIAL_ECHOPGM(" DIR: ");
- SERIAL_ECHOPGM_P((((sh.STATUS_AXIS & STATUS_DIR) >> 4) ^ L64xxManager.index_to_dir[axis]) ? PSTR("FORWARD") : PSTR("REVERSE"));
+ SERIAL_ECHOF((((sh.STATUS_AXIS & STATUS_DIR) >> 4) ^ L64xxManager.index_to_dir[axis]) ? F("FORWARD") : F("REVERSE"));
if (sh.STATUS_AXIS_LAYOUT == L6480_STATUS_LAYOUT) {
SERIAL_ECHOPGM(" Last Command: ");
if (sh.STATUS_AXIS & sh.STATUS_AXIS_WRONG_CMD) SERIAL_ECHOPGM("VALID");
@@ -67,7 +67,7 @@ inline void L6470_say_status(const L64XX_axis_t axis) {
SERIAL_ECHOPGM(" Last Command: ");
if (!(sh.STATUS_AXIS & sh.STATUS_AXIS_WRONG_CMD)) SERIAL_ECHOPGM("IN");
SERIAL_ECHOPGM("VALID ");
- SERIAL_ECHOPGM_P(sh.STATUS_AXIS & sh.STATUS_AXIS_NOTPERF_CMD ? PSTR("COMPLETED ") : PSTR("Not PERFORMED"));
+ SERIAL_ECHOF(sh.STATUS_AXIS & sh.STATUS_AXIS_NOTPERF_CMD ? F("COMPLETED ") : F("Not PERFORMED"));
SERIAL_ECHOPGM("\n...THERMAL: ", !(sh.STATUS_AXIS & sh.STATUS_AXIS_TH_SD) ? "SHUTDOWN " : !(sh.STATUS_AXIS & sh.STATUS_AXIS_TH_WRN) ? "WARNING " : "OK ");
}
SERIAL_ECHOPGM(" OVERCURRENT:"); echo_yes_no((sh.STATUS_AXIS & sh.STATUS_AXIS_OCD) == 0);
diff --git a/Marlin/src/gcode/feature/L6470/M906.cpp b/Marlin/src/gcode/feature/L6470/M906.cpp
index 2ab13f5b5d..d058ce5501 100644
--- a/Marlin/src/gcode/feature/L6470/M906.cpp
+++ b/Marlin/src/gcode/feature/L6470/M906.cpp
@@ -107,7 +107,7 @@ void L64XX_report_current(L64XX &motor, const L64XX_axis_t axis) {
SERIAL_ECHOPGM("...MicroSteps: ", MicroSteps,
" ADC_OUT: ", L6470_ADC_out);
SERIAL_ECHOPGM(" Vs_compensation: ");
- SERIAL_ECHOPGM_P((motor.GetParam(sh.L6470_AXIS_CONFIG) & CONFIG_EN_VSCOMP) ? PSTR("ENABLED ") : PSTR("DISABLED"));
+ SERIAL_ECHOF((motor.GetParam(sh.L6470_AXIS_CONFIG) & CONFIG_EN_VSCOMP) ? F("ENABLED ") : F("DISABLED"));
SERIAL_ECHOLNPGM(" Compensation coefficient: ~", comp_coef * 0.01f);
SERIAL_ECHOPGM("...KVAL_HOLD: ", motor.GetParam(L6470_KVAL_HOLD),
@@ -280,7 +280,7 @@ void GcodeSuite::M906() {
#if E_STEPPERS
case E_AXIS: {
- const int8_t target_e_stepper = get_target_e_stepper_from_command();
+ const int8_t target_e_stepper = get_target_e_stepper_from_command(0);
if (target_e_stepper < 0) return;
switch (target_e_stepper) {
#if AXIS_IS_L64XX(E0)
diff --git a/Marlin/src/gcode/feature/L6470/M916-918.cpp b/Marlin/src/gcode/feature/L6470/M916-918.cpp
index ad0a91111d..8d614603ed 100644
--- a/Marlin/src/gcode/feature/L6470/M916-918.cpp
+++ b/Marlin/src/gcode/feature/L6470/M916-918.cpp
@@ -138,10 +138,10 @@ void GcodeSuite::M916() {
do {
// turn the motor(s) both directions
sprintf_P(gcode_string, PSTR("G0 %s%03d F%03d"), temp_axis_string, uint16_t(position_min), uint16_t(final_feedrate));
- gcode.process_subcommands_now_P(gcode_string);
+ process_subcommands_now(gcode_string);
sprintf_P(gcode_string, PSTR("G0 %s%03d F%03d"), temp_axis_string, uint16_t(position_max), uint16_t(final_feedrate));
- gcode.process_subcommands_now_P(gcode_string);
+ process_subcommands_now(gcode_string);
// get the status after the motors have stopped
planner.synchronize();
@@ -266,10 +266,10 @@ void GcodeSuite::M917() {
DEBUG_ECHOLNPGM(" OCD threshold : ", (OCD_TH_val + 1) * 375);
sprintf_P(gcode_string, PSTR("G0 %s%03d F%03d"), temp_axis_string, uint16_t(position_min), uint16_t(final_feedrate));
- gcode.process_subcommands_now_P(gcode_string);
+ process_subcommands_now(gcode_string);
sprintf_P(gcode_string, PSTR("G0 %s%03d F%03d"), temp_axis_string, uint16_t(position_max), uint16_t(final_feedrate));
- gcode.process_subcommands_now_P(gcode_string);
+ process_subcommands_now(gcode_string);
planner.synchronize();
@@ -308,7 +308,7 @@ void GcodeSuite::M917() {
L64xxManager.set_param(axis_index[j], L6470_KVAL_HOLD, kval_hold);
}
DEBUG_ECHOLNPGM(".");
- gcode.reset_stepper_timeout(); // keep steppers powered
+ reset_stepper_timeout(); // keep steppers powered
watchdog_refresh();
safe_delay(5000);
status_composite_temp = 0;
@@ -615,10 +615,10 @@ void GcodeSuite::M918() {
DEBUG_ECHOLNPGM("...feedrate = ", current_feedrate);
sprintf_P(gcode_string, PSTR("G0 %s%03d F%03d"), temp_axis_string, uint16_t(position_min), uint16_t(current_feedrate));
- gcode.process_subcommands_now_P(gcode_string);
+ process_subcommands_now(gcode_string);
sprintf_P(gcode_string, PSTR("G0 %s%03d F%03d"), temp_axis_string, uint16_t(position_max), uint16_t(current_feedrate));
- gcode.process_subcommands_now_P(gcode_string);
+ process_subcommands_now(gcode_string);
planner.synchronize();
diff --git a/Marlin/src/gcode/feature/advance/M900.cpp b/Marlin/src/gcode/feature/advance/M900.cpp
index 4ed601bbe8..054ea3617f 100644
--- a/Marlin/src/gcode/feature/advance/M900.cpp
+++ b/Marlin/src/gcode/feature/advance/M900.cpp
@@ -145,7 +145,7 @@ void GcodeSuite::M900() {
}
void GcodeSuite::M900_report(const bool forReplay/*=true*/) {
- report_heading(forReplay, PSTR(STR_LINEAR_ADVANCE));
+ report_heading(forReplay, F(STR_LINEAR_ADVANCE));
#if EXTRUDERS < 2
report_echo_start(forReplay);
SERIAL_ECHOLNPGM(" M900 K", planner.extruder_advance_K[0]);
diff --git a/Marlin/src/gcode/feature/clean/G12.cpp b/Marlin/src/gcode/feature/clean/G12.cpp
index b19932eb98..a0b87b1abc 100644
--- a/Marlin/src/gcode/feature/clean/G12.cpp
+++ b/Marlin/src/gcode/feature/clean/G12.cpp
@@ -50,7 +50,7 @@ void GcodeSuite::G12() {
#ifdef WIPE_SEQUENCE_COMMANDS
if (!parser.seen_any()) {
- gcode.process_subcommands_now_P(PSTR(WIPE_SEQUENCE_COMMANDS));
+ process_subcommands_now(F(WIPE_SEQUENCE_COMMANDS));
return;
}
#endif
diff --git a/Marlin/src/gcode/feature/controllerfan/M710.cpp b/Marlin/src/gcode/feature/controllerfan/M710.cpp
index eede16b5bd..b98d88845d 100644
--- a/Marlin/src/gcode/feature/controllerfan/M710.cpp
+++ b/Marlin/src/gcode/feature/controllerfan/M710.cpp
@@ -67,7 +67,7 @@ void GcodeSuite::M710() {
}
void GcodeSuite::M710_report(const bool forReplay/*=true*/) {
- report_heading_etc(forReplay, PSTR(STR_CONTROLLER_FAN));
+ report_heading_etc(forReplay, F(STR_CONTROLLER_FAN));
SERIAL_ECHOLNPGM(" M710"
" S", int(controllerFan.settings.active_speed),
" I", int(controllerFan.settings.idle_speed),
diff --git a/Marlin/src/gcode/feature/digipot/M907-M910.cpp b/Marlin/src/gcode/feature/digipot/M907-M910.cpp
index a0b5c48e82..757cffd473 100644
--- a/Marlin/src/gcode/feature/digipot/M907-M910.cpp
+++ b/Marlin/src/gcode/feature/digipot/M907-M910.cpp
@@ -100,7 +100,7 @@ void GcodeSuite::M907() {
#if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM
void GcodeSuite::M907_report(const bool forReplay/*=true*/) {
- report_heading_etc(forReplay, PSTR(STR_STEPPER_MOTOR_CURRENTS));
+ report_heading_etc(forReplay, F(STR_STEPPER_MOTOR_CURRENTS));
#if HAS_MOTOR_CURRENT_PWM
SERIAL_ECHOLNPGM_P( // PWM-based has 3 values:
PSTR(" M907 X"), stepper.motor_current_setting[0] // X and Y
diff --git a/Marlin/src/gcode/feature/fwretract/G10_G11.cpp b/Marlin/src/gcode/feature/fwretract/G10_G11.cpp
index 35330fe0ac..1889f83d62 100644
--- a/Marlin/src/gcode/feature/fwretract/G10_G11.cpp
+++ b/Marlin/src/gcode/feature/fwretract/G10_G11.cpp
@@ -32,7 +32,7 @@
* G10 - Retract filament according to settings of M207
* TODO: Handle 'G10 P' for tool settings and 'G10 L' for workspace settings
*/
-void GcodeSuite::G10() { fwretract.retract(true OPTARG(HAS_MULTI_EXTRUDER, parser.boolval('S'))); }
+void GcodeSuite::G10() { fwretract.retract(true E_OPTARG(parser.boolval('S'))); }
/**
* G11 - Recover filament according to settings of M208
diff --git a/Marlin/src/gcode/feature/fwretract/M207-M209.cpp b/Marlin/src/gcode/feature/fwretract/M207-M209.cpp
index 040a09a8e0..173c2894dc 100644
--- a/Marlin/src/gcode/feature/fwretract/M207-M209.cpp
+++ b/Marlin/src/gcode/feature/fwretract/M207-M209.cpp
@@ -38,7 +38,7 @@
void GcodeSuite::M207() { fwretract.M207(); }
void GcodeSuite::M207_report(const bool forReplay/*=true*/) {
- report_heading_etc(forReplay, PSTR(STR_RETRACT_S_F_Z));
+ report_heading_etc(forReplay, F(STR_RETRACT_S_F_Z));
fwretract.M207_report();
}
@@ -53,7 +53,7 @@ void GcodeSuite::M207_report(const bool forReplay/*=true*/) {
void GcodeSuite::M208() { fwretract.M208(); }
void GcodeSuite::M208_report(const bool forReplay/*=true*/) {
- report_heading_etc(forReplay, PSTR(STR_RECOVER_S_F));
+ report_heading_etc(forReplay, F(STR_RECOVER_S_F));
fwretract.M208_report();
}
@@ -68,7 +68,7 @@ void GcodeSuite::M208_report(const bool forReplay/*=true*/) {
void GcodeSuite::M209() { fwretract.M209(); }
void GcodeSuite::M209_report(const bool forReplay/*=true*/) {
- report_heading_etc(forReplay, PSTR(STR_AUTO_RETRACT_S));
+ report_heading_etc(forReplay, F(STR_AUTO_RETRACT_S));
fwretract.M209_report();
}
diff --git a/Marlin/src/gcode/feature/i2c/M260_M261.cpp b/Marlin/src/gcode/feature/i2c/M260_M261.cpp
index 438d1527f5..e978fb5048 100644
--- a/Marlin/src/gcode/feature/i2c/M260_M261.cpp
+++ b/Marlin/src/gcode/feature/i2c/M260_M261.cpp
@@ -60,15 +60,16 @@ void GcodeSuite::M260() {
/**
* M261: Request X bytes from I2C slave device
*
- * Usage: M261 A B
+ * Usage: M261 A B S