diff options
-rw-r--r-- | .cproject | 15 | ||||
-rw-r--r-- | .settings/language.settings.xml | 20 | ||||
-rw-r--r-- | src/BugList.txt | 111 | ||||
-rw-r--r-- | src/Configuration.h | 2 | ||||
-rw-r--r-- | src/Display/MenuItem.cpp | 2 | ||||
-rw-r--r-- | src/Duet3/Pins_Duet3.h | 2 | ||||
-rw-r--r-- | src/DuetM/Pins_DuetM.h | 2 | ||||
-rw-r--r-- | src/DuetNG/Pins_DuetNG.h | 2 | ||||
-rw-r--r-- | src/GCodes/GCodeBuffer.cpp | 2 | ||||
-rw-r--r-- | src/GCodes/GCodes.cpp | 54 | ||||
-rw-r--r-- | src/GCodes/GCodes.h | 10 | ||||
-rw-r--r-- | src/GCodes/GCodes2.cpp | 14 | ||||
-rw-r--r-- | src/Networking/ESP8266WiFi/WiFiInterface.cpp | 1 | ||||
-rw-r--r-- | src/Networking/LwipEthernet/LwipEthernetInterface.cpp | 1 | ||||
-rw-r--r-- | src/Networking/Network.cpp | 2 | ||||
-rw-r--r-- | src/Networking/W5500Ethernet/W5500Interface.cpp | 1 | ||||
-rw-r--r-- | src/ObjectModel/ObjectModel.cpp | 158 | ||||
-rw-r--r-- | src/ObjectModel/ObjectModel.h | 60 | ||||
-rw-r--r-- | src/OutputMemory.cpp | 4 | ||||
-rw-r--r-- | src/Pccb/Pins_Pccb.h | 2 | ||||
-rw-r--r-- | src/Platform.cpp | 54 | ||||
-rw-r--r-- | src/Platform.h | 4 | ||||
-rw-r--r-- | src/RADDS/Network.h | 11 | ||||
-rw-r--r-- | src/RADDS/Pins_RADDS.h | 25 | ||||
-rw-r--r-- | src/RepRap.cpp | 17 | ||||
-rw-r--r-- | src/SAME70xpld/Pins_SAME70xpld.h | 2 | ||||
-rw-r--r-- | src/Version.h | 4 |
27 files changed, 265 insertions, 317 deletions
@@ -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} "${workspace_loc}/${CoreName}/RADDS/cores/arduino/syscalls.o" ${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=""${workspace_loc:/${CoreName}/RADDS/}""/> + <listOptionValue builtIn="false" value=""${workspace_loc:/${CoreName}/RADDS_RTOS/}""/> + <listOptionValue builtIn="false" value=""${workspace_loc:/FreeRTOS/SAM3X}""/> + <listOptionValue builtIn="false" value=""${workspace_loc:/RRFLibraries/SAM3X_RTOS}""/> </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"${workspace_loc:/${CoreName}/variants/RADDS/linker_scripts/gcc/flash.ld}" -Wl,-Map,"${workspace_loc:/${ProjName}/${ConfigName}}/${BuildArtifactFileBaseName}.map"" 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=""${workspace_loc:/${CoreName}/variants/RADDS}""/> <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/src}""/> <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/src/RADDS}""/> + <listOptionValue builtIn="false" value=""${workspace_loc:/FreeRTOS/src/include}""/> + <listOptionValue builtIn="false" value=""${workspace_loc:/FreeRTOS/src/portable/GCC/ARM_CM3}""/> + <listOptionValue builtIn="false" value=""${workspace_loc:/RRFLibraries/src}""/> </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 "${INPUTS}"" 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 "${INPUTS}"" 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 "${INPUTS}"" 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 "${INPUTS}"" 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 "${INPUTS}"" 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 "${INPUTS}"" 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 "${INPUTS}"" 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 "${INPUTS}"" 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 "${INPUTS}"" 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 "${INPUTS}"" 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 "${INPUTS}"" 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 "${INPUTS}"" 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 "${INPUTS}"" 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 "${INPUTS}"" 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 "${INPUTS}"" 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 "${INPUTS}"" 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 "${INPUTS}"" 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 "${INPUTS}"" 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" |