Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Duet3D/RepRapFirmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.cproject15
-rw-r--r--.settings/language.settings.xml20
-rw-r--r--src/BugList.txt111
-rw-r--r--src/Configuration.h2
-rw-r--r--src/Display/MenuItem.cpp2
-rw-r--r--src/Duet3/Pins_Duet3.h2
-rw-r--r--src/DuetM/Pins_DuetM.h2
-rw-r--r--src/DuetNG/Pins_DuetNG.h2
-rw-r--r--src/GCodes/GCodeBuffer.cpp2
-rw-r--r--src/GCodes/GCodes.cpp54
-rw-r--r--src/GCodes/GCodes.h10
-rw-r--r--src/GCodes/GCodes2.cpp14
-rw-r--r--src/Networking/ESP8266WiFi/WiFiInterface.cpp1
-rw-r--r--src/Networking/LwipEthernet/LwipEthernetInterface.cpp1
-rw-r--r--src/Networking/Network.cpp2
-rw-r--r--src/Networking/W5500Ethernet/W5500Interface.cpp1
-rw-r--r--src/ObjectModel/ObjectModel.cpp158
-rw-r--r--src/ObjectModel/ObjectModel.h60
-rw-r--r--src/OutputMemory.cpp4
-rw-r--r--src/Pccb/Pins_Pccb.h2
-rw-r--r--src/Platform.cpp54
-rw-r--r--src/Platform.h4
-rw-r--r--src/RADDS/Network.h11
-rw-r--r--src/RADDS/Pins_RADDS.h25
-rw-r--r--src/RepRap.cpp17
-rw-r--r--src/SAME70xpld/Pins_SAME70xpld.h2
-rw-r--r--src/Version.h4
27 files changed, 265 insertions, 317 deletions
diff --git a/.cproject b/.cproject
index 485ead60..7330ebf3 100644
--- a/.cproject
+++ b/.cproject
@@ -117,7 +117,7 @@
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
</cconfiguration>
<cconfiguration id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.1027429289">
- <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.1027429289" moduleId="org.eclipse.cdt.core.settings" name="RADDS">
+ <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.1027429289" moduleId="org.eclipse.cdt.core.settings" name="RADDS_RTOS">
<macros>
<stringMacro name="LinkFlags2" type="VALUE_TEXT" value="-Wl,--end-group -lm"/>
<stringMacro name="LinkFlags1" type="VALUE_TEXT" value="-mthumb -Wl,--cref -Wl,--check-sections -Wl,--gc-sections -Wl,--entry=Reset_Handler -Wl,--unresolved-symbols=report-all -Wl,--warn-common -Wl,--warn-section-align -Wl,--warn-unresolved-symbols -Wl,--start-group"/>
@@ -135,7 +135,7 @@
</extensions>
</storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
- <configuration artifactExtension="elf" artifactName="${ProjName}-RADDS" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.1027429289" name="RADDS" parent="cdt.managedbuild.config.gnu.cross.exe.release" postannouncebuildStep="Generating binary file" postbuildStep="arm-none-eabi-objcopy -O binary ${workspace_loc:/${ProjName}/${ConfigName}}/${BuildArtifactFileBaseName}.elf ${workspace_loc:/${ProjName}/${ConfigName}}/${BuildArtifactFileBaseName}.bin">
+ <configuration artifactExtension="elf" artifactName="${ProjName}-RADDS" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.1027429289" name="RADDS_RTOS" parent="cdt.managedbuild.config.gnu.cross.exe.release" postannouncebuildStep="Generating binary file" postbuildStep="arm-none-eabi-objcopy -O binary ${workspace_loc:/${ProjName}/${ConfigName}}/${BuildArtifactFileBaseName}.elf ${workspace_loc:/${ProjName}/${ConfigName}}/${BuildArtifactFileBaseName}.bin">
<folderInfo id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.1027429289." name="/" resourcePath="">
<toolChain id="cdt.managedbuild.toolchain.gnu.cross.exe.release.1973208555" name="Cross GCC" superClass="cdt.managedbuild.toolchain.gnu.cross.exe.release">
<option id="cdt.managedbuild.option.gnu.cross.path.2092504710" name="Path" superClass="cdt.managedbuild.option.gnu.cross.path" useByScannerDiscovery="false" value="${GccPath}" valueType="string"/>
@@ -166,6 +166,7 @@
<option id="gnu.c.compiler.option.preprocessor.def.symbols.2017188375" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
<listOptionValue builtIn="false" value="__SAM3X8E__"/>
<listOptionValue builtIn="false" value="__RADDS__"/>
+ <listOptionValue builtIn="false" value="RTOS"/>
</option>
<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.110609707" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
</tool>
@@ -174,10 +175,14 @@
<tool command="gcc" commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${LinkFlags1} &quot;${workspace_loc}/${CoreName}/RADDS/cores/arduino/syscalls.o&quot; ${INPUTS} ${LinkFlags2}" id="cdt.managedbuild.tool.gnu.cross.cpp.linker.1176271302" name="Cross G++ Linker" superClass="cdt.managedbuild.tool.gnu.cross.cpp.linker">
<option id="gnu.cpp.link.option.nostdlibs.706270025" name="No startup or default libs (-nostdlib)" superClass="gnu.cpp.link.option.nostdlibs" useByScannerDiscovery="false" value="false" valueType="boolean"/>
<option id="gnu.cpp.link.option.paths.1160723414" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths" useByScannerDiscovery="false" valueType="libPaths">
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/RADDS/}&quot;"/>
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/RADDS_RTOS/}&quot;"/>
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/FreeRTOS/SAM3X}&quot;"/>
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/RRFLibraries/SAM3X_RTOS}&quot;"/>
</option>
<option id="gnu.cpp.link.option.libs.1006761104" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" useByScannerDiscovery="false" valueType="libs">
<listOptionValue builtIn="false" value="${CoreName}"/>
+ <listOptionValue builtIn="false" value="FreeRTOS"/>
+ <listOptionValue builtIn="false" value="RRFLibraries"/>
</option>
<option id="gnu.cpp.link.option.flags.827167716" name="Linker flags" superClass="gnu.cpp.link.option.flags" useByScannerDiscovery="false" value="-Os -Wl,--gc-sections -Wl,--fatal-warnings -mcpu=cortex-m3 -T&quot;${workspace_loc:/${CoreName}/variants/RADDS/linker_scripts/gcc/flash.ld}&quot; -Wl,-Map,&quot;${workspace_loc:/${ProjName}/${ConfigName}}/${BuildArtifactFileBaseName}.map&quot;" valueType="string"/>
<inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.99895855" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
@@ -209,10 +214,14 @@
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/variants/RADDS}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/RADDS}&quot;"/>
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/FreeRTOS/src/include}&quot;"/>
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/FreeRTOS/src/portable/GCC/ARM_CM3}&quot;"/>
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/RRFLibraries/src}&quot;"/>
</option>
<option id="gnu.cpp.compiler.option.preprocessor.def.1179781669" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">
<listOptionValue builtIn="false" value="__SAM3X8E__"/>
<listOptionValue builtIn="false" value="__RADDS__"/>
+ <listOptionValue builtIn="false" value="RTOS"/>
<listOptionValue builtIn="false" value="_XOPEN_SOURCE"/>
</option>
<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.1578939493" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml
index 33bc54e2..c75b6be1 100644
--- a/.settings/language.settings.xml
+++ b/.settings/language.settings.xml
@@ -5,18 +5,18 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
- <provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="-159893819235269839" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
+ <provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="1375560664997985665" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
</extension>
</configuration>
- <configuration id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.1027429289" name="RADDS">
+ <configuration id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.1027429289" name="RADDS_RTOS">
<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
- <provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="-159893819235269839" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
+ <provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="1375560664997985665" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
@@ -27,7 +27,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
- <provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="-159893819235269839" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
+ <provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="1375560664997985665" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
@@ -38,7 +38,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
- <provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="-159893819235269839" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
+ <provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="1375560664997985665" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
@@ -49,7 +49,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
- <provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="-159893819235269839" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
+ <provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="1375560664997985665" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
@@ -60,7 +60,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
- <provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="-159893819235269839" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
+ <provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="1375560664997985665" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
@@ -71,7 +71,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
- <provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="-159893819235269839" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
+ <provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="1375560664997985665" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
@@ -82,7 +82,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
- <provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="-159893819235269839" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
+ <provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="1375560664997985665" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
@@ -93,7 +93,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
- <provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="-159893819235269839" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
+ <provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="1375560664997985665" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
diff --git a/src/BugList.txt b/src/BugList.txt
index 94665734..67fd3ec5 100644
--- a/src/BugList.txt
+++ b/src/BugList.txt
@@ -48,20 +48,7 @@ Done in 2.02RC2:
- [done] If a bad curve fit occurs during tuning, display the values as A, C and D instead of G, tc and td to better relate to M307
- [done, M3D testing] Merge in Matt's display changes
-Investigations:
-**- 3 independent Z motors, https://forum.duet3d.com/topic/6974/problem-with-3-independent-z-axis-motors-and-endstops/26
-- incorrect babystepping, https://forum.duet3d.com/topic/6888/babystep-bug-w-incorrect-motion/2 (already fixed 1mm limit)
-- [tested, pause/resume works as intended] Check M106 R1 parameter, see https://forum.duet3d.com/topic/6538/resuming-print-fan-after-pause
-- M226 not working? https://forum.duet3d.com/topic/6860/filament-change-no-reaction/3
-- Weird height map, https://forum.duet3d.com/topic/6472/mesh-grid-compensation/28
-- Full stepping problem, https://forum.duet3d.com/topic/6433/how-to-reduce-the-speed-of-extrusion/14
-- Print time estimation problem, see https://forum.duet3d.com/topic/5572/it-s-out-reprapfirmware-2-0-and-1-21-1-released/64 and https://forum.duet3d.com/topic/5572/it-s-out-reprapfirmware-2-0-and-1-21-1-released/73
-- Disconnections, https://forum.duet3d.com/topic/6487/running-bed-mesh-compensation/19
-- M122, https://forum.duet3d.com/topic/6725/m122-does-not-work-from-dwc-console
-- DueX5 LEDs flashing at boot time, https://forum.duet3d.com/topic/6970/led-strip-flashing-on-boot-duex5
-- M24 after heater fault pause, https://forum.duet3d.com/topic/7154/firmware-2-01-resume-after-heater-fault-isn-t-working
-
-Remaining:
+Done in 2.02RC3:
- [done, test] Zero or negative Z probe tolerance means always average all readings (G30 and G29)
- [done, test] When storage debug enabled, failing to open a file is a warning not an error
- [done, test] Improve motor phase open circuit message and make it a warning not an error
@@ -92,15 +79,74 @@ Remaining:
- [done, ok] G30 S-1 when no Z probe, https://forum.duet3d.com/topic/6510/a-couple-of-dwc-odd-things/2
- [done] Log Z leadscrew/manual adjustment calibration results even if calibration failed
- [done] Log mesh probing results to file
+- [done] Fix 12864 fan speed display issue (displays 3000 after processing M106 S30)
+Closed investigations:
+- [no fault] stall detect on Z axis
+- [re-test using new DuetWiFiServer] "Failed to change mode" messages after M552 S2/S0/S1 cycle
+- [can't reproduce] "Attempt to seek on a non-open file", https://www.duet3d.com/forum/thread.php?pid=41175#p41175
+- [hopefully this is fixed by the DHCP fixes, or else there is a DueX involved] https://www.duet3d.com/forum/thread.php?pid=37797#p37797 (Duet Ethernet long delays between moves)
+- [no idea, bus fault in pbuf_cat] Look at https://www.duet3d.com/forum/thread.php?pid=37551#p37551
- [no fault located, re-test] Fix Duet 3 ABC axes
- [no fault located, re-test] Wait for all moves to stop before M584
-- check DAA working as intended, results are inconsistent. Problem when used with segmented kinematics because the acceleration is in multiple segments.
-- Allow extruder movement in tpre? https://forum.duet3d.com/topic/7263/controlling-stepper-motors-via-drive-numbers-eg-g1-d4-700-f100/4
- [no, it already adds 22 checksum bits] Add check digit to serial number
- [no, we don't record print time] Distinguish between estimated/simulated/actual print time in M36
-- M207 per-tool values, https://forum.duet3d.com/topic/6855/add-drive-extruder-parameter-to-m207/6
- [problem gone away] chrishamm's watchdog issue, see his email of 2018-08-01
+- [tested, pause/resume works as intended] Check M106 R1 parameter, see https://forum.duet3d.com/topic/6538/resuming-print-fan-after-pause
+
+Open investigations:
+- Test extruder stall detection, https://forum.duet3d.com/topic/7300/issues-using-stall-detection-when-loading-filament
+- [check] if a homing command in an SD print file is aborted due to e.g. G1 Z5 in the homing file, error message should be written to both DWC and PanelDue
+- 3 independent Z motors, https://forum.duet3d.com/topic/6974/problem-with-3-independent-z-axis-motors-and-endstops/26
+- incorrect babystepping, https://forum.duet3d.com/topic/6888/babystep-bug-w-incorrect-motion/2 (already fixed 1mm limit)
+- M226 not working? https://forum.duet3d.com/topic/6860/filament-change-no-reaction/3
+- Weird height map, https://forum.duet3d.com/topic/6472/mesh-grid-compensation/28
+- Full stepping problem, https://forum.duet3d.com/topic/6433/how-to-reduce-the-speed-of-extrusion/14
+- Print time estimation problem, see https://forum.duet3d.com/topic/5572/it-s-out-reprapfirmware-2-0-and-1-21-1-released/64 and https://forum.duet3d.com/topic/5572/it-s-out-reprapfirmware-2-0-and-1-21-1-released/73
+- Disconnections, https://forum.duet3d.com/topic/6487/running-bed-mesh-compensation/19
+- M122, https://forum.duet3d.com/topic/6725/m122-does-not-work-from-dwc-console
+- DueX5 LEDs flashing at boot time, https://forum.duet3d.com/topic/6970/led-strip-flashing-on-boot-duex5
+- M24 after heater fault pause, https://forum.duet3d.com/topic/7154/firmware-2-01-resume-after-heater-fault-isn-t-working
+- check DAA working as intended, results are inconsistent. Problem when used with segmented kinematics because the acceleration is in multiple segments.
+
+To be fixed in 2.02 release:
+- [done, test] G30 H parameters don't work if deployprobe.g or retractprobe.g file present
+- [done, test] Execute residual babystepping immediately
+- [done, test] Warning message if trying to move motors on internal drivers but VIN too low or too high
+- [done, ok] Send mapped fan speed at the start of the fan speed list in the M408 response for PanelDue
+- [done, ok] PanelDue emergency stop interrupt from UART driver
+- [done, ok] M408 P1 F"gcodes" returns an empty gcodes object
+- [done, ok] Variable substitution in GCode commands
+- [done, ok in DWC and PanelDue, test on 12864] Object model returned wrong value for speed factor
+- [done, ok] support string-valued object model values in JSON report
+- [done, test] increase min fullsteps for motor open detection from 4 to 20
+- [done] Bring RADDS build up to date and use RTOS
+
+Future:
+- Allow jerk between printing and non-printing moves, so that coast-to-end works?
+- M408 P1 S"gcodes" returns an empty gcodes object, so does m408p1 f"gcodes.speedFactor"
+- Error handling in [variable] parser in GCodeBuffer class
+- In object model, "interface"->"interfaces" to look better in JSON response
+- WiFi auto reconnect should not log all unsuccessful connection attempts, just the first one
+- Option to send M280 servo commands just a few times instead of continuously, for E3D
+- M122 to tell you if the drivers are enabled, or disabled and waiting for the correct voltage
+- M3 R parameter so it can restore the spinder/laser after a pause (https://forum.duet3d.com/topic/5418/cnc-laser-m3-unpause-r-parameter)
+- Adjust laser power during acceleration/deceleration
+- First layer segmentation, to help with baby stepping? Or another way to implement live babystepping?
+- Complete the object model
+- Conditional GCode
+- Object model variables in 12864 display
+- CNC shutdown when movement outside limits attempted not working well, https://forum.duet3d.com/topic/6186/stable-firmware-2-01-duet-2-and-1-22-duet-06-085-released/55
+- Better dead time measurement during auto tuning. Measure both turn-on and turn-off?
+- Bezier speed curves or other S-curve acceleration, e.g. look at https://github.com/MarlinFirmware/Marlin/pull/10373/files
+- M584 allow an axis to be mapped to driver -1
+- If wifi module gets stuck in starting or changing mode state, reset it again
+- Workplace offsets are supposed to be persistant (check NIST), https://www.duet3d.com/forum/thread.php?pid=43755#p43755
+- At the end of a simulation, restore the original workplace coordinate selection
+- CNC: look at G17/18/19, see https://forum.duet3d.com/topic/4669/ooznest-workbee-screw-driven
+
+- Allow extruder movement in tpre? https://forum.duet3d.com/topic/7263/controlling-stepper-motors-via-drive-numbers-eg-g1-d4-700-f100/4
+- M207 per-tool values, https://forum.duet3d.com/topic/6855/add-drive-extruder-parameter-to-m207/6
- Command to copy output from the following commands to the log file?
- Track which devices use which pins
- Hangprinter PRs
@@ -108,34 +154,20 @@ Remaining:
- M116 parameter to set allowed temperature difference
- Alternative G10 command to set offsets from known current tool position, see https://forum.duet3d.com/topic/6465/g92-g10-m585-for-setting-head-position-not-machine-position/4
- Keep sending M408 responses to PanelDue while waiting for movement to complete, or M400 or homing move or similar
-- CNC shutdown when movement outside limits attempted not working well, https://forum.duet3d.com/topic/6186/stable-firmware-2-01-duet-2-and-1-22-duet-06-085-released/55
-
-Future:
-- Extra logging? https://forum.duet3d.com/topic/7103/extend-m929-logging-capabilities/5
+- Extra logging? [did some extra in 2.02RC3] https://forum.duet3d.com/topic/7103/extend-m929-logging-capabilities/5
- Junction deviation instead of jerk?
-- first layer segmentation, to help with baby stepping? Or another way to implement live babystepping?
- Still doesn't always find the DueX5, see https://forum.duet3d.com/topic/6239/unstable-after-firmware-upgrade/3. Is the Heat task affecting the timing? Need new I2C driver?
-- [do in DuetWiFiServer] WiFi continuous auto reconnect in client mode, or extra M552 parameter? See https://forum.duet3d.com/topic/5765/wifi-module-auto-reconnect
-- Better dead time measurement during auto tuning. Measure both turn-on and turn-off?
-- Bezier speed curves or other S-curve acceleration, e.g. look at https://github.com/MarlinFirmware/Marlin/pull/10373/files
-- Option to send M280 servo commands just a few times instead of continuously, for E3D
- Danny's modified SCARA kinematics (workpiece is on a plate, extruder is fixed)
- Look at pushover notification support, https://forum.duet3d.com/topic/169/notification-via-pushover-or-other-service/45
-- M3 R parameter so it can restore the spinder/laser after a pause (https://forum.duet3d.com/topic/5418/cnc-laser-m3-unpause-r-parameter)
- M81: don't give low voltage warnings when main power has just been turned off
- M81: option to invert polarity?
-- M584 when assigning a drive, unmap any existing assignment? [sometimes we want dual mapping] Also allow an axis to be mapped to driver -1.
- Add S4 option to G1 command, like S1 but no endstop checks (needed for CoreXY, CoreXZ)
-- CNC: look at G17/18/19, see https://forum.duet3d.com/topic/4669/ooznest-workbee-screw-driven
- M569 command to allow selection of smart/dumb driver (including on Duet M), also allow all 12 drivers to be smart
- Apostrophe in quoted filename: can we make apostrophe special in SSIDs/passwords but not filenames?
-- If wifi module gets stuck in starting or changing mode state, reset it again
- M140 command to set default bed heaters for M140 S commands (e.g. M140 P0:1:2)
- Consider: Heater faults to run M81 even when not doing a build (https://forum.duet3d.com/topic/6225/configure-action-on-heater-fault/7)
- Option to repeat G32 until deviation/leadscrew adjustment is below a threshold or a retry count reached (and allow for probing failures)
- Macro option when a motor stall is detected, https://forum.duet3d.com/topic/7026/more-options-for-stall-detection
-
-Other (some of these may be in 2.02):
- Update PanelDue firmware via Duet
- Use Heat task to read DHT sensors?
- Add option R4 to M915 command, to do an emergency stop (useful for Z motor)
@@ -146,30 +178,17 @@ Other (some of these may be in 2.02):
- Unexpected heaters off/tool selection behaviour, https://www.duet3d.com/forum/thread.php?pid=43059#p43059
- warn when using : where ; was probably meant
- Error message if you attempt movement with VIN < minimum
+- When VIN power too low and stepper drivers turned off, flag axes as not homed?
- min/max RSSI display?
- report RSSI in M552?
-- When VIN power too low and stepper drivers turned off, flag axes as not homed?
- Auto mount main SD card when inserted
-- Workplace offsets are supposed to be persistant (check NIST), https://www.duet3d.com/forum/thread.php?pid=43755#p43755
-- At the end of a simulation, restore the original workplace coordinate selection
- Add warning message when print exceeds bounds
- When uploading while a file is being printed, don't allow the currently-printing file to be replaced
- Option to send stall warning messages when not printing from SD card, https://forum.duet3d.com/topic/6720/stall-protection-on-pyserial-print
- Custom macros to execute on stall detection, including extruder stall detection https://forum.duet3d.com/topic/6730/stall-detection-custom-actions
-- [check] if a homing command in an SD print file is aborted due to e.g. G1 Z5 in the homing file, error message should be written to both DWC and PanelDue
-- [no fault] stall detect on Z axis
-- Files generated by Cura doesn't detect layer changes, see https://www.duet3d.com/forum/thread.php?pid=40865#p40865
-- [re-test using new DuetWiFiServer] "Failed to change mode" messages after M552 S2/S0/S1 cycle
-- [can't reproduce] "Attempt to seek on a non-open file", https://www.duet3d.com/forum/thread.php?pid=41175#p41175
-- [hopefully this is fixed by the DHCP fixes] https://www.duet3d.com/forum/thread.php?pid=37797#p37797 (Duet Ethernet long delays between moves)
-- [no idea, bus fault in pbuf_cat] Look at https://www.duet3d.com/forum/thread.php?pid=37551#p37551
-
- When Z probe readings are out of tolerance, display the lowest difference seen between consecutive readings?
-- laser control, https://www.duet3d.com/forum/thread.php?pid=37891#p37891
-- slow DWC but fast FTP, https://www.duet3d.com/forum/thread.php?pid=38345#p38345
-- no stall detect on Z axis, https://www.duet3d.com/forum/thread.php?pid=38504#p38504, https://www.duet3d.com/forum/thread.php?pid=39484#p39484
- check that we never enable the drivers before we set vsense
- [don't do] Don't report the motor current for a non-existent extruder
diff --git a/src/Configuration.h b/src/Configuration.h
index c29f882d..f6469073 100644
--- a/src/Configuration.h
+++ b/src/Configuration.h
@@ -55,7 +55,7 @@ constexpr uint32_t LogFlushInterval = 15000; // Milliseconds
constexpr uint32_t DriverCoolingTimeout = 4000; // Milliseconds
constexpr float DefaultMessageTimeout = 10.0; // How long a message is displayed by default, in seconds
-constexpr uint32_t MinimumOpenLoadFullStepsPerSec = 4;
+constexpr uint32_t MinimumOpenLoadFullStepsPerSec = 20; // this is 4mm/sec @ 80steps/mm
// FanCheckInterval must be lower than MinimumWarningInterval to avoid giving driver over temperature warnings too soon when thermostatic control of electronics cooling fans is used
static_assert(FanCheckInterval < MinimumWarningInterval, "FanCheckInterval too large");
diff --git a/src/Display/MenuItem.cpp b/src/Display/MenuItem.cpp
index 43552fd1..3e6c55cd 100644
--- a/src/Display/MenuItem.cpp
+++ b/src/Display/MenuItem.cpp
@@ -326,7 +326,7 @@ bool ValueMenuItem::Adjust_SelectHelper()
switch (itemNumber)
{
case 0:
- reprap.GetGCodes().SetSpeedFactor(currentValue * 0.01);
+ reprap.GetGCodes().SetSpeedFactor(currentValue);
break;
case 20:
diff --git a/src/Duet3/Pins_Duet3.h b/src/Duet3/Pins_Duet3.h
index 12337323..ad7d2d6a 100644
--- a/src/Duet3/Pins_Duet3.h
+++ b/src/Duet3/Pins_Duet3.h
@@ -42,8 +42,6 @@ constexpr size_t MaxTotalDrivers = NumDirectDrivers + MaxCanDrivers;
constexpr size_t MinAxes = 3; // The minimum and default number of axes
constexpr size_t MaxAxes = 9; // The maximum number of movement axes in the machine, usually just X, Y and Z, <= DRIVES
-// Initialization macro used in statements needing to initialize values in arrays of size MAX_AXES
-#define AXES_(a,b,c,d,e,f,g,h,i) { a,b,c,d,e,f,g,h,i }
constexpr size_t MaxExtruders = MaxTotalDrivers - MinAxes; // The maximum number of extruders
constexpr size_t MaxDriversPerAxis = 5; // The maximum number of stepper drivers assigned to one axis
diff --git a/src/DuetM/Pins_DuetM.h b/src/DuetM/Pins_DuetM.h
index 87ee327c..70e320d5 100644
--- a/src/DuetM/Pins_DuetM.h
+++ b/src/DuetM/Pins_DuetM.h
@@ -49,8 +49,6 @@ constexpr size_t NumThermistorInputs = 4;
constexpr size_t MinAxes = 3; // The minimum and default number of axes
constexpr size_t MaxAxes = 6; // The maximum number of movement axes in the machine, usually just X, Y and Z, <= DRIVES
-// Initialization macro used in statements needing to initialize values in arrays of size MAX_AXES
-#define AXES_(a,b,c,d,e,f,g,h,i) { a,b,c,d,e,f }
constexpr size_t MaxExtruders = NumDirectDrivers - MinAxes; // The maximum number of extruders
constexpr size_t MaxDriversPerAxis = 4; // The maximum number of stepper drivers assigned to one axis
diff --git a/src/DuetNG/Pins_DuetNG.h b/src/DuetNG/Pins_DuetNG.h
index d3381b9d..01974cd3 100644
--- a/src/DuetNG/Pins_DuetNG.h
+++ b/src/DuetNG/Pins_DuetNG.h
@@ -46,8 +46,6 @@ constexpr size_t NumThermistorInputs = 8;
constexpr size_t MinAxes = 3; // The minimum and default number of axes
constexpr size_t MaxAxes = 9; // The maximum number of movement axes in the machine, usually just X, Y and Z, <= DRIVES
-// Initialization macro used in statements needing to initialize values in arrays of size MAX_AXES
-#define AXES_(a,b,c,d,e,f,g,h,i) { a,b,c,d,e,f,g,h,i }
constexpr size_t MaxExtruders = NumDirectDrivers - MinAxes; // The maximum number of extruders
constexpr size_t MaxDriversPerAxis = 5; // The maximum number of stepper drivers assigned to one axis
diff --git a/src/GCodes/GCodeBuffer.cpp b/src/GCodes/GCodeBuffer.cpp
index cf9443ed..1c300d53 100644
--- a/src/GCodes/GCodeBuffer.cpp
+++ b/src/GCodes/GCodeBuffer.cpp
@@ -1298,7 +1298,7 @@ TypeCode GCodeBuffer::EvaluateExpression(const char *p, const char **endptr, Exp
if (isalpha(*p)) // if it's a variable name
{
const char * const start = p;
- while (isalpha(*p) || isdigit(*p) || *p == '_')
+ while (isalpha(*p) || isdigit(*p) || *p == '_' || *p == '.')
{
++p;
}
diff --git a/src/GCodes/GCodes.cpp b/src/GCodes/GCodes.cpp
index 18955f15..83462029 100644
--- a/src/GCodes/GCodes.cpp
+++ b/src/GCodes/GCodes.cpp
@@ -77,6 +77,16 @@ DEFINE_GET_OBJECT_MODEL_TABLE(GCodes)
#endif
+#ifdef SERIAL_AUX_DEVICE
+// Support for emergency stpo form PanelDue
+bool GCodes::emergencyStopCommanded = false;
+
+void GCodes::CommandEmergencyStop(UARTClass *p)
+{
+ emergencyStopCommanded = true;
+}
+#endif
+
GCodes::GCodes(Platform& p) :
platform(p), machineType(MachineType::fff), active(false),
#if HAS_VOLTAGE_MONITOR
@@ -176,6 +186,9 @@ void GCodes::Init()
DotStarLed::Init();
#endif
+#ifdef SERIAL_AUX_DEVICE
+ SERIAL_AUX_DEVICE.SetInterruptCallback(GCodes::CommandEmergencyStop);
+#endif
}
// This is called from Init and when doing an emergency stop
@@ -199,7 +212,7 @@ void GCodes::Reset()
nextGcodeSource = 0;
fileToPrint.Close();
- speedFactor = SecondsToMinutes; // default is just to convert from mm/minute to mm/second
+ speedFactor = 100.0;
for (size_t i = 0; i < MaxExtruders; ++i)
{
@@ -362,6 +375,16 @@ void GCodes::Spin()
return;
}
+#ifdef SERIAL_AUX_DEVICE
+ if (emergencyStopCommanded)
+ {
+ DoEmergencyStop();
+ while (SERIAL_AUX_DEVICE.read() >= 0) { }
+ emergencyStopCommanded = false;
+ return;
+ }
+#endif
+
CheckTriggers();
CheckHeaterFault();
CheckFilament();
@@ -1197,12 +1220,9 @@ void GCodes::RunStateMachine(GCodeBuffer& gb, const StringRef& reply)
else
{
// Successful probing
- float heightAdjust = 0.0;
- bool dummy;
- gb.TryGetFValue('H', heightAdjust, dummy);
float m[MaxAxes];
reprap.GetMove().GetCurrentMachinePosition(m, false); // get height without bed compensation
- g30zStoppedHeight = m[Z_AXIS] - heightAdjust; // save for later
+ g30zStoppedHeight = m[Z_AXIS] - g30HValue; // save for later
g30zHeightError = g30zStoppedHeight - platform.ZProbeStopHeight();
g30zHeightErrorSum += g30zHeightError;
}
@@ -2244,7 +2264,7 @@ bool GCodes::LoadExtrusionAndFeedrateFromGCode(GCodeBuffer& gb)
{
const float rate = gb.GetFValue() * distanceScale;
gb.MachineState().feedRate = (moveBuffer.moveType == 0)
- ? rate * speedFactor
+ ? rate * speedFactor * (0.01 * SecondsToMinutes)
: rate * SecondsToMinutes; // don't apply the speed factor to homing and other special moves
}
moveBuffer.feedRate = gb.MachineState().feedRate;
@@ -3073,6 +3093,7 @@ GCodeResult GCodes::DoHome(GCodeBuffer& gb, const StringRef& reply)
GCodeResult GCodes::ExecuteG30(GCodeBuffer& gb, const StringRef& reply)
{
g30SValue = (gb.Seen('S')) ? gb.GetIValue() : -3; // S-3 is equivalent to having no S parameter
+ g30HValue = (gb.Seen('H')) ? gb.GetFValue() : 0.0;
g30ProbePointIndex = -1;
bool seenP = false;
gb.TryGetIValue('P', g30ProbePointIndex, seenP);
@@ -3718,13 +3739,6 @@ void GCodes::HandleReply(GCodeBuffer& gb, GCodeResult rslt, const char* reply)
return;
}
- // Second UART device, e.g. PanelDue. Do NOT use emulation for this one!
- if (&gb == auxGCode)
- {
- platform.AppendAuxReply(reply, reply[0] == '{');
- return;
- }
-
const Compatibility c = (&gb == serialGCode || &gb == telnetGCode) ? platform.Emulating() : Compatibility::me;
const MessageType type = gb.GetResponseMessageType();
const char* const response = (gb.GetCommandLetter() == 'M' && gb.GetCommandNumber() == 998) ? "rs " : "ok";
@@ -5050,13 +5064,7 @@ void GCodes::CheckHeaterFault()
// Return the current speed factor
float GCodes::GetSpeedFactor() const
{
- return speedFactor * MinutesToSeconds;
-}
-
-// Set the speed factor
-void GCodes::SetSpeedFactor(float factor)
-{
- speedFactor = constrain<float>(factor, 0.1, 5.0) / MinutesToSeconds;
+ return speedFactor;
}
// Return a current extrusion factor
@@ -5081,6 +5089,12 @@ Pwm_t GCodes::ConvertLaserPwm(float reqVal) const
#if SUPPORT_12864_LCD
+// Set the speed factor. Value passed is in percent.
+void GCodes::SetSpeedFactor(float factor)
+{
+ speedFactor = constrain<float>(factor, 10.0, 500.0);
+}
+
// Process a GCode command from the 12864 LCD returning true if the command was accepted
bool GCodes::ProcessCommandFromLcd(const char *cmd)
{
diff --git a/src/GCodes/GCodes.h b/src/GCodes/GCodes.h
index b8618b5f..0762ef42 100644
--- a/src/GCodes/GCodes.h
+++ b/src/GCodes/GCodes.h
@@ -162,7 +162,9 @@ public:
{ axesHomed = 0; }
float GetSpeedFactor() const; // Return the current speed factor
+#if SUPPORT_12864_LCD
void SetSpeedFactor(float factor); // Set the speed factor
+#endif
float GetExtrusionFactor(size_t extruder); // Return the current extrusion factors
void SetExtrusionFactor(size_t extruder, float factor); // Set an extrusion factor
@@ -220,9 +222,9 @@ public:
float GetItemStandbyTemperature(unsigned int itemNumber) const;
void SetItemActiveTemperature(unsigned int itemNumber, float temp);
void SetItemStandbyTemperature(unsigned int itemNumber, float temp);
- float GetMappedFanSpeed() const { return lastDefaultFanSpeed; } // Get the mapped fan speed
#endif
+ float GetMappedFanSpeed() const { return lastDefaultFanSpeed; } // Get the mapped fan speed
void SetMappedFanSpeed(float f); // Set the mapped fan speed
void HandleReply(GCodeBuffer& gb, GCodeResult rslt, const char *reply); // Handle G-Code replies
void EmergencyStop(); // Cancel everything
@@ -386,6 +388,11 @@ private:
#endif
Pwm_t ConvertLaserPwm(float reqVal) const;
+#ifdef SERIAL_AUX_DEVICE
+ static bool emergencyStopCommanded;
+ static void CommandEmergencyStop(UARTClass *p);
+#endif
+
Platform& platform; // The RepRap machine
FileGCodeInput* fileInput; // ...
@@ -502,6 +509,7 @@ private:
GridDefinition defaultGrid; // The grid defined by the M557 command in config.g
int32_t g30ProbePointIndex; // the index of the point we are probing (G30 P parameter), or -1 if none
int g30SValue; // S parameter in the G30 command, or -2 if there wasn't one
+ float g30HValue; // H parameter in the G30 command, or 0.0 if there wasn't on
float g30zStoppedHeight; // the height to report after running G30 S-1
float g30zHeightError; // the height error last time we probed
float g30PrevHeightError; // the height error the previous time we probed
diff --git a/src/GCodes/GCodes2.cpp b/src/GCodes/GCodes2.cpp
index 576a03b1..2d73d7e3 100644
--- a/src/GCodes/GCodes2.cpp
+++ b/src/GCodes/GCodes2.cpp
@@ -2007,8 +2007,8 @@ bool GCodes::HandleMcode(GCodeBuffer& gb, const StringRef& reply)
case 220: // Set/report speed factor override percentage
if (gb.Seen('S'))
{
- float newSpeedFactor = (gb.GetFValue() * 0.01) * SecondsToMinutes; // include the conversion from mm/minute to mm/second
- if (newSpeedFactor > 0.0)
+ float newSpeedFactor = gb.GetFValue();
+ if (newSpeedFactor > 10.0)
{
// Update the feed rate for ALL input sources, and all feed rates on the stack
const float speedFactorRatio = newSpeedFactor / speedFactor;
@@ -2039,7 +2039,7 @@ bool GCodes::HandleMcode(GCodeBuffer& gb, const StringRef& reply)
}
else
{
- reply.printf("Speed factor override: %.1f%%", (double)(speedFactor * MinutesToSeconds * 100.0));
+ reply.printf("Speed factor override: %.1f%%", (double)speedFactor);
}
break;
@@ -2158,6 +2158,14 @@ bool GCodes::HandleMcode(GCodeBuffer& gb, const StringRef& reply)
// The following causes all the remaining baby stepping that we didn't manage to push to be added to the [remainder of the] currently-executing move, if there is one.
// This could result in an abrupt Z movement, however the move will be processed as normal so the jerk limit will be honoured.
moveBuffer.coords[Z_AXIS] += difference;
+
+ if (amountPushed != difference && segmentsLeft == 0 && reprap.GetMove().AllMovesAreFinished())
+ {
+ // The pipeline is empty, so execute the babystepping move immediately
+ moveBuffer.SetDefaults();
+ moveBuffer.feedRate = platform.MaxFeedrate(Z_AXIS);
+ NewMoveAvailable(1);
+ }
}
else
{
diff --git a/src/Networking/ESP8266WiFi/WiFiInterface.cpp b/src/Networking/ESP8266WiFi/WiFiInterface.cpp
index 3b3c64d6..bd71e507 100644
--- a/src/Networking/ESP8266WiFi/WiFiInterface.cpp
+++ b/src/Networking/ESP8266WiFi/WiFiInterface.cpp
@@ -167,6 +167,7 @@ WiFiInterface::WiFiInterface(Platform& p) : platform(p), uploader(nullptr), ftpD
const ObjectModelTableEntry WiFiInterface::objectModelTable[] =
{
+ { "name", OBJECT_MODEL_FUNC_NOSELF("wifi"), TYPE_OF(const char *), ObjectModelTableEntry::none },
{ "ip", OBJECT_MODEL_FUNC(&(self->ipAddress)), TYPE_OF(IPAddress), ObjectModelTableEntry::none },
{ "netmask", OBJECT_MODEL_FUNC(&(self->netmask)), TYPE_OF(IPAddress), ObjectModelTableEntry::none },
{ "gateway", OBJECT_MODEL_FUNC(&(self->gateway)), TYPE_OF(IPAddress), ObjectModelTableEntry::none }
diff --git a/src/Networking/LwipEthernet/LwipEthernetInterface.cpp b/src/Networking/LwipEthernet/LwipEthernetInterface.cpp
index 368013b7..dc8dd614 100644
--- a/src/Networking/LwipEthernet/LwipEthernetInterface.cpp
+++ b/src/Networking/LwipEthernet/LwipEthernetInterface.cpp
@@ -149,6 +149,7 @@ LwipEthernetInterface::LwipEthernetInterface(Platform& p) : platform(p), closeDa
const ObjectModelTableEntry LwipEthernetInterface::objectModelTable[] =
{
+ { "name", OBJECT_MODEL_FUNC_NOSELF("ethernet"), TYPE_OF(const char *), ObjectModelTableEntry::none },
{ "ip", OBJECT_MODEL_FUNC(&(self->ipAddress)), TYPE_OF(IPAddress), ObjectModelTableEntry::none },
{ "netmask", OBJECT_MODEL_FUNC(&(self->netmask)), TYPE_OF(IPAddress), ObjectModelTableEntry::none },
{ "gateway", OBJECT_MODEL_FUNC(&(self->gateway)), TYPE_OF(IPAddress), ObjectModelTableEntry::none }
diff --git a/src/Networking/Network.cpp b/src/Networking/Network.cpp
index 6a69728c..179d3a57 100644
--- a/src/Networking/Network.cpp
+++ b/src/Networking/Network.cpp
@@ -70,7 +70,7 @@ static const ObjectModelArrayDescriptor interfaceArrayDescriptor =
const ObjectModelTableEntry Network::objectModelTable[] =
{
- { "interface", OBJECT_MODEL_FUNC_NOSELF(&interfaceArrayDescriptor), TYPE_OF(ObjectModel) | IsArray, ObjectModelTableEntry::none }
+ { "interfaces", OBJECT_MODEL_FUNC_NOSELF(&interfaceArrayDescriptor), TYPE_OF(ObjectModel) | IsArray, ObjectModelTableEntry::none }
};
DEFINE_GET_OBJECT_MODEL_TABLE(Network)
diff --git a/src/Networking/W5500Ethernet/W5500Interface.cpp b/src/Networking/W5500Ethernet/W5500Interface.cpp
index fb8ba382..18f008d0 100644
--- a/src/Networking/W5500Ethernet/W5500Interface.cpp
+++ b/src/Networking/W5500Ethernet/W5500Interface.cpp
@@ -44,6 +44,7 @@ W5500Interface::W5500Interface(Platform& p)
const ObjectModelTableEntry W5500Interface::objectModelTable[] =
{
+ { "name", OBJECT_MODEL_FUNC_NOSELF("ethernet"), TYPE_OF(const char *), ObjectModelTableEntry::none },
{ "ip", OBJECT_MODEL_FUNC(&(self->ipAddress)), TYPE_OF(IPAddress), ObjectModelTableEntry::none },
{ "netmask", OBJECT_MODEL_FUNC(&(self->netmask)), TYPE_OF(IPAddress), ObjectModelTableEntry::none },
{ "gateway", OBJECT_MODEL_FUNC(&(self->gateway)), TYPE_OF(IPAddress), ObjectModelTableEntry::none }
diff --git a/src/ObjectModel/ObjectModel.cpp b/src/ObjectModel/ObjectModel.cpp
index fdbd79c9..581c16c8 100644
--- a/src/ObjectModel/ObjectModel.cpp
+++ b/src/ObjectModel/ObjectModel.cpp
@@ -32,7 +32,7 @@ bool ObjectModel::ReportAsJson(OutputBuffer* buf, const char* filter, ReportFlag
{
buf->cat(',');
}
- omte->ReportAsJson(buf, this, filter, flags);
+ omte->ReportAsJson(buf, this, GetNextElement(filter), flags);
added = true;
}
--numEntries;
@@ -68,99 +68,6 @@ const ObjectModelTableEntry* ObjectModel::FindObjectModelTableEntry(const char*
return (low < numElems && tbl[low].IdCompare(idString) == 0) ? &tbl[low] : nullptr;
}
-// Get the object model table entry for the leaf object in the query
-const ObjectModelTableEntry *ObjectModel::FindObjectModelLeafEntry(const char *idString)
-{
- const ObjectModelTableEntry *e = FindObjectModelTableEntry(idString);
- return (e == nullptr) ? e : e->FindLeafEntry(this, idString);
-}
-
-#if 0 // not implemented yet
-bool ObjectModel::GetStringObjectValue(const StringRef& str, const char* idString) const
-{
-}
-
-bool ObjectModel::GetLongEnumObjectValue(const StringRef& str, const char* idString) const
-{
-}
-
-bool ObjectModel::GetShortEnumObjectValue(uint32_t& val, const char* idString) const
-{
-}
-
-bool ObjectModel::GetBitmapObjectValue(uint32_t& val, const char* idString) const
-{
-}
-#endif
-
-#if 0
-bool ObjectModel::SetFloatObjectValue(float val, const char* idString)
-{
-}
-
-bool ObjectModel::SetUnsignedObjectValue(uint32_t val, const char* idString)
-{
-}
-
-bool ObjectModel::SetSignedObjectValue(int32_t val, const char* idString)
-{
-}
-
-bool ObjectModel::SetStringObjectValue(const StringRef& str, const char* idString)
-{
-}
-
-bool ObjectModel::SetLongEnumObjectValue(const StringRef& str, const char* idString)
-{
-}
-
-bool ObjectModel::SetShortEnumObjectValue(uint32_t val, const char* idString)
-{
-}
-
-bool ObjectModel::SetBitmapObjectValue(uint32_t val, const char* idString)
-{
-}
-
-bool ObjectModel::SetBoolObjectValue(bool val, const char* idString)
-{
-}
-
-bool ObjectModel::AdjustFloatObjectValue(float val, const char* idString)
-{
-}
-
-bool ObjectModel::AdjustUnsignedObjectValue(int32_t val, const char* idString)
-{
-}
-
-bool ObjectModel::AdjustSignedObjectValue(int32_t val, const char* idString)
-{
-}
-
-bool ObjectModel::ToggleBoolObjectValue(const char* idString)
-{
-}
-#endif
-
-const char** ObjectModel::GetStringObjectPointer(const char* idString)
-{
- //TODO
- return nullptr;
-}
-
-uint32_t* ObjectModel::GetShortEnumObjectPointer(const char* idString)
-{
- const ObjectModelTableEntry *e = FindObjectModelLeafEntry(idString);
- return (e == nullptr) ? nullptr : (uint32_t*)(e->GetValuePointer(this, TYPE_OF(Enum32)));
-}
-
-uint32_t* ObjectModel::GetBitmapObjectPointer(const char* idString)
-{
- const ObjectModelTableEntry *e = FindObjectModelLeafEntry(idString);
- return (e == nullptr) ? nullptr : (uint32_t*)(e->GetValuePointer(this, TYPE_OF(Bitmap32)));
-}
-
/*static*/ const char* ObjectModel::GetNextElement(const char *id)
{
while (*id != 0 && *id != '.' && *id != '[')
@@ -179,16 +86,6 @@ bool ObjectModelTableEntry::Matches(const char* filterString, ObjectModelFilterF
return IdCompare(filterString) == 0 && (flags & filterFlags) == filterFlags;
}
-const ObjectModelTableEntry *ObjectModelTableEntry::FindLeafEntry(ObjectModel *self, const char *idString) const
-{
- if (!IsObject())
- {
- return this;
- }
-
- return ((ObjectModel*)param(self))->FindObjectModelLeafEntry(ObjectModel::GetNextElement(idString));
-}
-
// Private function to report a value of primitive type
void ObjectModelTableEntry::ReportItemAsJson(OutputBuffer *buf, const char *filter, ObjectModel::ReportFlags flags, void *nParam, TypeCode type)
{
@@ -210,6 +107,10 @@ void ObjectModelTableEntry::ReportItemAsJson(OutputBuffer *buf, const char *filt
buf->catf("%" PRIi32, *(const int32_t *)nParam);
break;
+ case TYPE_OF(const char*):
+ buf->EncodeString((const char*)nParam, strlen((const char*)nParam), true, true, false);
+ break;
+
case TYPE_OF(Bitmap32):
if (flags & ObjectModel::flagShortForm)
{
@@ -321,23 +222,26 @@ void* ObjectModelTableEntry::GetValuePointer(ObjectModel *self, TypeCode t) cons
return param(self);
}
-// Return the type of an object
-TypeCode ObjectModel::GetObjectType(const char *idString)
-{
- const ObjectModelTableEntry * const e = FindObjectModelLeafEntry(idString);
- return (e == nullptr) ? NoType : e->type;
-}
-
// Get the value of an object when we don't know what its type is
TypeCode ObjectModel::GetObjectValue(ExpressionValue& val, const char *idString)
{
- const ObjectModelTableEntry * const e = FindObjectModelLeafEntry(idString);
+ const ObjectModelTableEntry *e = FindObjectModelTableEntry(idString);
if (e == nullptr)
{
return NoType;
}
+
+ if ((e->type & IsArray) != 0)
+ {
+ //TODO handle arrays
+ return NoType;
+ }
+
switch (e->type)
{
+ case TYPE_OF(ObjectModel):
+ return ((ObjectModel*)e->param(this))->GetObjectValue(val, GetNextElement(idString));
+
case TYPE_OF(float):
val.fVal = *((const float*)e->param(this));
break;
@@ -363,16 +267,25 @@ TypeCode ObjectModel::GetObjectValue(ExpressionValue& val, const char *idString)
}
// Template specialisations
-template<> bool ObjectModel::GetObjectValue(float& val, const char *idString)
+bool ObjectModel::GetObjectValue(float& val, const char *idString)
{
- const ObjectModelTableEntry * const e = FindObjectModelLeafEntry(idString);
+ const ObjectModelTableEntry *e = FindObjectModelTableEntry(idString);
if (e == nullptr)
{
- return false;
+ return NoType;
+ }
+
+ if ((e->type & IsArray) != 0)
+ {
+ //TODO handle arrays
+ return NoType;
}
switch (e->type)
{
+ case TYPE_OF(ObjectModel):
+ return ((ObjectModel*)e->param(this))->GetObjectValue(val, GetNextElement(idString));
+
case TYPE_OF(float):
val = *((const float*)e->param(this));
return true;
@@ -391,16 +304,25 @@ template<> bool ObjectModel::GetObjectValue(float& val, const char *idString)
}
// Specialisation of above for int, allowing conversion from unsigned to signed
-template<> bool ObjectModel::GetObjectValue(int32_t& val, const char *idString)
+bool ObjectModel::GetObjectValue(int32_t& val, const char *idString)
{
- const ObjectModelTableEntry * const e = FindObjectModelLeafEntry(idString);
+ const ObjectModelTableEntry *e = FindObjectModelTableEntry(idString);
if (e == nullptr)
{
- return false;
+ return NoType;
+ }
+
+ if ((e->type & IsArray) != 0)
+ {
+ //TODO handle arrays
+ return NoType;
}
switch (e->type)
{
+ case TYPE_OF(ObjectModel):
+ return ((ObjectModel*)e->param(this))->GetObjectValue(val, GetNextElement(idString));
+
case TYPE_OF(int32_t):
val = *((const int32_t*)e->param(this));
return true;
diff --git a/src/ObjectModel/ObjectModel.h b/src/ObjectModel/ObjectModel.h
index d76f9ce5..e0e69f4c 100644
--- a/src/ObjectModel/ObjectModel.h
+++ b/src/ObjectModel/ObjectModel.h
@@ -55,35 +55,15 @@ public:
// Get the value of an object when we don't know what its type is
TypeCode GetObjectValue(ExpressionValue& val, const char *idString);
- // Get values of various types from the object model, returning true if successful
- template<class T> bool GetObjectValue(T& val, const char *idString);
-
- bool GetStringObjectValue(const StringRef& str, const char* idString) const;
- bool GetLongEnumObjectValue(const StringRef& str, const char *idString) const;
- bool GetShortEnumObjectValue(uint32_t &val, const char *idString) const;
- bool GetBitmapObjectValue(uint32_t &val, const char *idString) const;
-
- // Try to set values of various types from the object model, returning true if successful
- bool SetFloatObjectValue(float val, const char *idString);
- bool SetUnsignedObjectValue(uint32_t val, const char *idString);
- bool SetSignedObjectValue(int32_t val, const char *idString);
- bool SetStringObjectValue(const StringRef& str, const char *idString);
- bool SetLongEnumObjectValue(const StringRef& str, const char *idString);
- bool SetShortEnumObjectValue(uint32_t val, const char *idString);
- bool SetBitmapObjectValue(uint32_t val, const char *idString);
- bool SetBoolObjectValue(bool val, const char *idString);
-
- // Try to adjust values of various types from the object model, returning true if successful
- bool AdjustFloatObjectValue(float val, const char *idString);
- bool AdjustUnsignedObjectValue(int32_t val, const char *idString);
- bool AdjustSignedObjectValue(int32_t val, const char *idString);
- bool ToggleBoolObjectValue(const char *idString);
+ // Specialisation of above for float, allowing conversion from integer to float
+ bool GetObjectValue(float& val, const char *idString);
+
+ // Specialisation of above for int, allowing conversion from unsigned to signed
+ bool GetObjectValue(int32_t& val, const char *idString);
// Get the object model table entry for the current level object in the query
const ObjectModelTableEntry *FindObjectModelTableEntry(const char *idString);
- // Get the object model table entry for the leaf object in the query
- const ObjectModelTableEntry *FindObjectModelLeafEntry(const char *idString);
// Skip the current element in the ID or filter string
static const char* GetNextElement(const char *id);
@@ -174,36 +154,6 @@ public:
static void ReportItemAsJson(OutputBuffer *buf, const char *filter, ObjectModel::ReportFlags flags, void *nParam, TypeCode type);
};
-// Function to retrieve a value by searching the object model
-// Returns true if success
-template<class T> bool ObjectModel::GetObjectValue(T& val, const char *idString)
-{
- const ObjectModelTableEntry * const e = FindObjectModelLeafEntry(idString);
- if (e == nullptr)
- {
- return false;
- }
- const T *p = (float*)(e->GetValuePointer(this, TYPE_OF(T)));
- if (p == nullptr)
- {
- return false;
- }
- val = *p;
- return true;
-}
-
-// Specialisation of above for float, allowing conversion from integer to float
-template<> bool ObjectModel::GetObjectValue(float& val, const char *idString);
-
-// Specialisation of above for int, allowing conversion from unsigned to signed
-template<> bool ObjectModel::GetObjectValue(int32_t& val, const char *idString);
-
-template<class T> T* ObjectModel::GetObjectPointer(const char* idString)
-{
- const ObjectModelTableEntry *e = FindObjectModelLeafEntry(idString);
- return (e == nullptr) ? nullptr : (T*)(e->GetValuePointer(this, TYPE_OF(T)));
-}
-
// Use this macro to inherit form ObjectModel
#define INHERIT_OBJECT_MODEL : public ObjectModel
diff --git a/src/OutputMemory.cpp b/src/OutputMemory.cpp
index 22200a1f..1b7ed82a 100644
--- a/src/OutputMemory.cpp
+++ b/src/OutputMemory.cpp
@@ -264,8 +264,8 @@ size_t OutputBuffer::EncodeString(const char *src, size_t srcLength, bool allowC
case '"':
case '\\':
#if 1
- // In theory we should escape '/' as well. However, we never used to, and doing so confuses PanelDue.
- // This will be fixed in PanelDue firmware version 1.15, but in the mean time, don't escape '/'.
+ // Escaping '/' is optional in JSON, although doing so so confuses PanelDue (fixed in PanelDue firmware version 1.15 and later).
+ // As it's optional, we don't do it.
#else
case '/':
#endif
diff --git a/src/Pccb/Pins_Pccb.h b/src/Pccb/Pins_Pccb.h
index c0b40b83..0f40b4e4 100644
--- a/src/Pccb/Pins_Pccb.h
+++ b/src/Pccb/Pins_Pccb.h
@@ -71,8 +71,6 @@ constexpr size_t NumThermistorInputs = 2;
constexpr size_t MinAxes = 3; // The minimum and default number of axes
constexpr size_t MaxAxes = 6; // The maximum number of movement axes in the machine, <= DRIVES
-// Initialization macro used in statements needing to initialize values in arrays of size MAX_AXES
-#define AXES_(a,b,c,d,e,f,g,h,i) { a,b,c,d,e,f }
constexpr size_t MaxExtruders = NumDirectDrivers - MinAxes; // The maximum number of extruders
constexpr size_t MaxDriversPerAxis = 4; // The maximum number of stepper drivers assigned to one axis
diff --git a/src/Platform.cpp b/src/Platform.cpp
index 1b661208..4bbb2274 100644
--- a/src/Platform.cpp
+++ b/src/Platform.cpp
@@ -505,6 +505,10 @@ void Platform::Init()
autoSaveState = AutoSaveState::starting;
#endif
+#if HAS_SMART_DRIVERS && HAS_VOLTAGE_MONITOR
+ warnDriversNotPowered = false;
+#endif
+
extrusionAncilliaryPwmValue = 0.0;
configuredHeaters = 0;
@@ -1327,6 +1331,7 @@ void Platform::Spin()
}
#ifdef DUET3
+ // Blink the LED
{
static uint32_t lastTime = 0;
static bool diagState = true;
@@ -1611,7 +1616,7 @@ void Platform::Spin()
// Check for a VSSA fault
#if HAS_VREF_MONITOR
- constexpr uint32_t MaxVssaFilterSum = (15 * 4096 * ThermistorAverageReadings * 4)/2200;
+ constexpr uint32_t MaxVssaFilterSum = (15 * 4096 * ThermistorAverageReadings * 4)/2200; // VSSA fuse should have <= 15 ohms resistance
if (adcFilters[VssaFilterIndex].GetSum() > MaxVssaFilterSum)
{
Message(ErrorMessage, "VSSA fault, check thermistor wiring\n");
@@ -1626,6 +1631,16 @@ void Platform::Spin()
reported = true;
}
#endif
+
+#if HAS_SMART_DRIVERS && HAS_VOLTAGE_MONITOR
+ // Check for attempts to move motors when not powered
+ if (warnDriversNotPowered)
+ {
+ Message(ErrorMessage, "Attempt to move motors when VIN is not in range");
+ warnDriversNotPowered = false;
+ reported = true;
+ }
+#endif
if (reported)
{
lastWarningMillis = now;
@@ -2869,26 +2884,37 @@ void Platform::SetDirection(size_t drive, bool direction)
// Enable a driver. Must not be called from an ISR, or with interrupts disabled.
void Platform::EnableDriver(size_t driver)
{
- if (driver < NumDirectDrivers && driverState[driver] != DriverStatus::enabled)
+#if HAS_SMART_DRIVERS && HAS_VOLTAGE_MONITOR
+ if (driver < numSmartDrivers && !driversPowered)
{
- driverState[driver] = DriverStatus::enabled;
- UpdateMotorCurrent(driver); // the current may have been reduced by the idle timeout
+ warnDriversNotPowered = true;
+ }
+ else
+ {
+#endif
+ if (driver < NumDirectDrivers && driverState[driver] != DriverStatus::enabled)
+ {
+ driverState[driver] = DriverStatus::enabled;
+ UpdateMotorCurrent(driver); // the current may have been reduced by the idle timeout
#if defined(DUET3) && HAS_SMART_DRIVERS
- SmartDrivers::EnableDrive(driver, true); // all drivers driven directly by the main board are smart
+ SmartDrivers::EnableDrive(driver, true); // all drivers driven directly by the main board are smart
#elif HAS_SMART_DRIVERS
- if (driver < numSmartDrivers)
- {
- SmartDrivers::EnableDrive(driver, true);
- }
- else
- {
- digitalWrite(ENABLE_PINS[driver], enableValues[driver] > 0);
- }
+ if (driver < numSmartDrivers)
+ {
+ SmartDrivers::EnableDrive(driver, true);
+ }
+ else
+ {
+ digitalWrite(ENABLE_PINS[driver], enableValues[driver] > 0);
+ }
#else
- digitalWrite(ENABLE_PINS[driver], enableValues[driver] > 0);
+ digitalWrite(ENABLE_PINS[driver], enableValues[driver] > 0);
#endif
+ }
+#if HAS_SMART_DRIVERS && HAS_VOLTAGE_MONITOR
}
+#endif
}
// Disable a driver
diff --git a/src/Platform.h b/src/Platform.h
index 0f899cee..e95194f9 100644
--- a/src/Platform.h
+++ b/src/Platform.h
@@ -739,6 +739,10 @@ private:
bool driversPowered;
#endif
+#if HAS_SMART_DRIVERS && HAS_VOLTAGE_MONITOR
+ bool warnDriversNotPowered;
+#endif
+
#if HAS_STALL_DETECT
DriversBitmap logOnStallDrivers, pauseOnStallDrivers, rehomeOnStallDrivers;
DriversBitmap stalledDrivers, stalledDriversToLog, stalledDriversToPause, stalledDriversToRehome;
diff --git a/src/RADDS/Network.h b/src/RADDS/Network.h
index 88c9771a..72b93de3 100644
--- a/src/RADDS/Network.h
+++ b/src/RADDS/Network.h
@@ -4,12 +4,15 @@
#include "RepRapFirmware.h"
#include "MessageType.h"
#include "GCodes/GCodeResult.h"
+#include "General/IPAddress.h"
-const uint8_t DefaultIpAddress[4] = { 0, 0, 0, 0 };
-const uint8_t DefaultNetMask[4] = { 0, 0, 0, 0 };
-const uint8_t DefaultGateway[4] = { 0, 0, 0, 0 };
+const IPAddress DefaultIpAddress;
+const IPAddress DefaultNetMask;
+const IPAddress DefaultGateway;
const uint8_t macAddress[6] = { 0, 0, 0, 0, 0, 0 };
+const uint8_t DefaultMacAddress[6] = { 0, 0, 0, 0, 0, 0 };
+
const size_t SsidBufferLength = 32; // maximum characters in an SSID
// The main network class that drives the network.
@@ -31,7 +34,7 @@ public:
GCodeResult GetNetworkState(unsigned int interface, const StringRef& reply);
- void SetEthernetIPAddress(const uint8_t p_ipAddress[], const uint8_t p_netmask[], const uint8_t p_gateway[]) { }
+ void SetEthernetIPAddress(IPAddress p_ipAddress, IPAddress p_netmask, IPAddress p_gateway) { }
void SetMacAddress(unsigned int interface, const uint8_t mac[]) { }
const uint8_t *GetMacAddress(unsigned int interface) const { return macAddress; }
diff --git a/src/RADDS/Pins_RADDS.h b/src/RADDS/Pins_RADDS.h
index 40a51827..ad226fc3 100644
--- a/src/RADDS/Pins_RADDS.h
+++ b/src/RADDS/Pins_RADDS.h
@@ -29,11 +29,8 @@ const size_t NumFirmwareUpdateModules = 1;
// The physical capabilities of the machine
// The number of drives in the machine, including X, Y, and Z plus extruder drives
-const size_t DRIVES = 9;
-
-// Initialization macro used in statements needing to initialize values in arrays of size DRIVES. E.g.,
-// max_feed_rates[DRIVES] = {DRIVES_(1, 1, 1, 1, 1, 1, 1, 1, 1, 1)}
-#define DRIVES_(a,b,c,d,e,f,g,h,i,j,k,l) { a,b,c,d,e,f,g,h,i }
+const size_t NumDirectDrivers = 9;
+constexpr size_t MaxTotalDrivers = NumDirectDrivers;
// The number of heaters in the machine
// 0 is the heated bed even if there isn't one.
@@ -44,11 +41,8 @@ constexpr size_t NumThermistorInputs = 4;
constexpr size_t MinAxes = 3; // The minimum and default number of axes
constexpr size_t MaxAxes = 6; // The maximum number of movement axes in the machine, usually just X, Y and Z, <= DRIVES
-// Initialization macro used in statements needing to initialize values in arrays of size MAX_AXES
-#define AXES_(a,b,c,d,e,f,g,h,i) { a,b,c,d,e,f }
-constexpr size_t MIN_AXES = 3; // The minimum and default number of axes
-constexpr size_t MaxExtruders = DRIVES - MIN_AXES; // The maximum number of extruders
+constexpr size_t MaxExtruders = NumDirectDrivers - MinAxes; // The maximum number of extruders
constexpr size_t MaxDriversPerAxis = 4; // The maximum number of stepper drivers assigned to one axis
constexpr size_t NUM_SERIAL_CHANNELS = 2;
@@ -58,11 +52,11 @@ constexpr size_t NUM_SERIAL_CHANNELS = 2;
// The numbers of entries in each array must correspond with the values of DRIVES, AXES, or HEATERS. Set values to NoPin to flag unavailability.
// DRIVES
-// X Y Z E1 E2 E3 E4 E5 E6
-const Pin ENABLE_PINS[DRIVES] = { 26, 22, 15, 62, 65, 49, 37, 31, 68 };
-// A15 A12 A09 A02 B19 C12 C03 D06 B16
-const Pin STEP_PINS[DRIVES] = { 24, 17, 2, 61, 64, 51, 35, 29, 67 };
-const Pin DIRECTION_PINS[DRIVES] = { 23, 16, 3, 60, 63, 53, 33, 27, 66 };
+// X Y Z E1 E2 E3 E4 E5 E6
+const Pin ENABLE_PINS[NumDirectDrivers] = { 26, 22, 15, 62, 65, 49, 37, 31, 68 };
+// A15 A12 A09 A02 B19 C12 C03 D06 B16
+const Pin STEP_PINS[NumDirectDrivers] = { 24, 17, 2, 61, 64, 51, 35, 29, 67 };
+const Pin DIRECTION_PINS[NumDirectDrivers] = { 23, 16, 3, 60, 63, 53, 33, 27, 66 };
// Endstops
// E Stops not currently used
@@ -111,8 +105,7 @@ const Pin SpiTempSensorCsPins[MaxSpiTempSensors] = { 38, 36 };
const Pin ATX_POWER_PIN = 40;
// Z Probe pin
-// Must be an ADC capable pin. Can be any of the ARM's A/D capable
-// pins even a non-Arduino pin.
+// Must be an ADC capable pin. Can be any of the ARM's A/D capable pins even a non-Arduino pin.
const Pin Z_PROBE_PIN = A5; // RADDS "ADC" pin
// Digital pin number to turn the IR LED on (high) or off (low)
diff --git a/src/RepRap.cpp b/src/RepRap.cpp
index db52a357..422fc826 100644
--- a/src/RepRap.cpp
+++ b/src/RepRap.cpp
@@ -976,8 +976,8 @@ OutputBuffer *RepRap::GetStatusResponse(uint8_t type, ResponseSource source)
response->cat((ch == '[') ? "[]" : "]");
}
- // Speed and Extrusion factors
- response->catf(",\"speedFactor\":%.1f,\"extrFactors\":", (double)(gCodes->GetSpeedFactor() * 100.0));
+ // Speed and Extrusion factors in %
+ response->catf(",\"speedFactor\":%.1f,\"extrFactors\":", (double)(gCodes->GetSpeedFactor()));
ch = '[';
for (size_t extruder = 0; extruder < GetExtrudersInUse(); extruder++)
{
@@ -1691,7 +1691,7 @@ OutputBuffer *RepRap::GetLegacyStatusResponse(uint8_t type, int seq)
}
// Send the speed and extruder override factors
- response->catf("],\"sfactor\":%.2f,\"efactor\":", (double)(gCodes->GetSpeedFactor() * 100.0));
+ response->catf("],\"sfactor\":%.2f,\"efactor\":", (double)(gCodes->GetSpeedFactor()));
ch = '[';
for (size_t i = 0; i < GetExtrudersInUse(); ++i)
{
@@ -1723,20 +1723,19 @@ OutputBuffer *RepRap::GetLegacyStatusResponse(uint8_t type, int seq)
}
// Send the fan settings, for PanelDue firmware 1.13 and later
- response->catf(",\"fanPercent\":");
- ch = '[';
+ // Currently, PanelDue assumes that the first value is the print cooling fan speed and only uses that one, so send the mapped fan speed first
+ response->catf(",\"fanPercent\":[%.1f", (double)(gCodes->GetMappedFanSpeed() * 100.0));
for (size_t i = 0; i < NUM_FANS; ++i)
{
- response->catf("%c%.1f", ch, (double)(platform->GetFanValue(i) * 100.0));
- ch = ',';
+ response->catf(",%.1f", (double)(platform->GetFanValue(i) * 100.0));
}
+ response->cat(']');
// Send fan RPM value(s)
- response->cat(']');
if (NumTachos != 0)
{
response->cat(",\"fanRPM\":");
- // For compatibility with older versions of DWC, if there is only one tacho value then we send it as a simple variable
+ // For compatibility with older versions of DWC and PanelDue, if there is only one tacho value then we send it as a simple variable
if (NumTachos > 1)
{
char ch = '[';
diff --git a/src/SAME70xpld/Pins_SAME70xpld.h b/src/SAME70xpld/Pins_SAME70xpld.h
index fa4dcd2a..883dad4b 100644
--- a/src/SAME70xpld/Pins_SAME70xpld.h
+++ b/src/SAME70xpld/Pins_SAME70xpld.h
@@ -39,8 +39,6 @@ constexpr size_t NumThermistorInputs = 4;
constexpr size_t MinAxes = 3; // The minimum and default number of axes
constexpr size_t MaxAxes = 9; // The maximum number of movement axes in the machine, usually just X, Y and Z, <= DRIVES
-// Initialization macro used in statements needing to initialize values in arrays of size MAX_AXES
-#define AXES_(a,b,c,d,e,f,g,h,i) { a,b,c,d,e,f,g,h,i }
constexpr size_t MaxExtruders = NumDirectDrivers - MinAxes; // The maximum number of extruders
constexpr size_t MaxDriversPerAxis = 5; // The maximum number of stepper drivers assigned to one axis
diff --git a/src/Version.h b/src/Version.h
index eb8554c1..7a7f96c5 100644
--- a/src/Version.h
+++ b/src/Version.h
@@ -12,7 +12,7 @@
#ifndef VERSION
#ifdef RTOS
# define RTOSVER "(RTOS)"
-# define MAIN_VERSION "2.02RC3"
+# define MAIN_VERSION "2.02RC4"
#else
# define MAIN_VERSION "1.22"
# define RTOSVER
@@ -22,7 +22,7 @@
#endif
#ifndef DATE
-# define DATE "2018-10-17b2"
+# define DATE "2018-10-28b2"
#endif
#define AUTHORS "reprappro, dc42, chrishamm, t3p3, dnewman, printm3d"