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--.cproject2624
-rw-r--r--.settings/language.settings.xml221
-rw-r--r--src/Alligator/Pins_Alligator.h33
-rw-r--r--src/BugList.txt58
-rw-r--r--src/Configuration.h27
-rw-r--r--src/Display/MenuItem.h2
-rw-r--r--src/Duet/Lwip/contrib/apps/mdns/mdns_responder.c4
-rw-r--r--src/Duet/Network.cpp12
-rw-r--r--src/Duet/Pins_Duet.h13
-rw-r--r--src/DuetM/Pins_DuetM.h37
-rw-r--r--src/DuetNG/DueXn.cpp26
-rw-r--r--src/DuetNG/Pins_DuetNG.h20
-rw-r--r--src/DuetNG/SX1509.cpp4
-rw-r--r--src/Fans/DotStarLed.cpp107
-rw-r--r--src/Fans/DotStarLed.h22
-rw-r--r--src/Fans/Fan.cpp (renamed from src/Fan.cpp)4
-rw-r--r--src/Fans/Fan.h (renamed from src/Fan.h)2
-rw-r--r--src/Fans/Tacho.cpp53
-rw-r--r--src/Fans/Tacho.h32
-rw-r--r--src/GCodes/GCodeBuffer.cpp175
-rw-r--r--src/GCodes/GCodeBuffer.h57
-rw-r--r--src/GCodes/GCodeInput.cpp12
-rw-r--r--src/GCodes/GCodeQueue.cpp160
-rw-r--r--src/GCodes/GCodeQueue.h4
-rw-r--r--src/GCodes/GCodes.cpp244
-rw-r--r--src/GCodes/GCodes.h47
-rw-r--r--src/GCodes/GCodes2.cpp82
-rw-r--r--src/Heating/Heat.cpp11
-rw-r--r--src/Heating/Sensors/TemperatureSensor.cpp4
-rw-r--r--src/Libraries/Fatfs/diskio.cpp63
-rw-r--r--src/Libraries/Fatfs/diskio.h1
-rw-r--r--src/Libraries/Fatfs/ff.h2
-rw-r--r--src/Movement/BedProbing/RotaryCompensation.cpp10
-rw-r--r--src/Movement/BedProbing/RotaryCompensation.h15
-rw-r--r--src/Movement/DDA.cpp28
-rw-r--r--src/Movement/Kinematics/HangprinterKinematics.cpp37
-rw-r--r--src/Movement/Kinematics/HangprinterKinematics.h9
-rw-r--r--src/Movement/Move.cpp11
-rw-r--r--src/Pccb/Network.cpp46
-rw-r--r--src/Pccb/Network.h50
-rw-r--r--src/Pccb/Pins_Pccb.h180
-rw-r--r--src/Pins.h49
-rw-r--r--src/Platform.cpp194
-rw-r--r--src/Platform.h59
-rw-r--r--src/RADDS/Pins_RADDS.h31
-rw-r--r--src/RepRap.cpp113
-rw-r--r--src/RepRap.h8
-rw-r--r--src/RepRapFirmware.cpp1
-rw-r--r--src/SAME70_TEST/Pins_SAME70_TEST.h16
-rw-r--r--src/StepperDrivers/TMC22xx/TMC22xx.cpp (renamed from src/DuetM/TMC22xx.cpp)320
-rw-r--r--src/StepperDrivers/TMC22xx/TMC22xx.h (renamed from src/DuetM/TMC22xx.h)22
-rw-r--r--src/StepperDrivers/TMC2660/TMC2660.cpp (renamed from src/DuetNG/TMC2660.cpp)41
-rw-r--r--src/StepperDrivers/TMC2660/TMC2660.h (renamed from src/DuetNG/TMC2660.h)6
-rw-r--r--src/Storage/FileStore.cpp7
-rw-r--r--src/Storage/FileStore.h2
-rw-r--r--src/Tasks.cpp14
-rw-r--r--src/Tools/Tool.cpp9
-rw-r--r--src/Tools/Tool.h2
-rw-r--r--src/Version.h6
59 files changed, 3659 insertions, 1790 deletions
diff --git a/.cproject b/.cproject
index b4789922..e7751b41 100644
--- a/.cproject
+++ b/.cproject
@@ -1,890 +1,1740 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
- <storageModule moduleId="org.eclipse.cdt.core.settings">
- <cconfiguration id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850">
- <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850" moduleId="org.eclipse.cdt.core.settings" name="Duet085">
- <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"/>
- <stringMacro name="CoreName" type="VALUE_TEXT" value="CoreNG"/>
- <stringMacro name="GccPath" type="VALUE_TEXT" value="/home/christian/duet-dc42/gcc-arm-none-eabi-7-2017-q4-major/bin/"/>
- </macros>
- <externalSettings/>
- <extensions>
- <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
- <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- </extensions>
- </storageModule>
- <storageModule moduleId="cdtBuildSystem" version="4.0.0">
- <configuration artifactExtension="elf" artifactName="${ProjName}" 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" name="Duet085" parent="cdt.managedbuild.config.gnu.cross.exe.release" postannouncebuildStep="Generating binary file" postbuildStep="arm-none-eabi-objcopy -O binary ${workspace_loc:/${ProjName}/${ConfigName}}/${ProjName}.elf ${workspace_loc:/${ProjName}/${ConfigName}}/${ProjName}.bin">
- <folderInfo id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850." name="/" resourcePath="">
- <toolChain id="cdt.managedbuild.toolchain.gnu.cross.exe.release.947353540" name="Cross GCC" superClass="cdt.managedbuild.toolchain.gnu.cross.exe.release">
- <option id="cdt.managedbuild.option.gnu.cross.path.1742191832" name="Path" superClass="cdt.managedbuild.option.gnu.cross.path" useByScannerDiscovery="false" value="${GccPath}" valueType="string"/>
- <option id="cdt.managedbuild.option.gnu.cross.prefix.1660769040" name="Prefix" superClass="cdt.managedbuild.option.gnu.cross.prefix" useByScannerDiscovery="false" value="arm-none-eabi-" valueType="string"/>
- <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="cdt.managedbuild.targetPlatform.gnu.cross.223860525" isAbstract="false" osList="all" superClass="cdt.managedbuild.targetPlatform.gnu.cross"/>
- <builder buildPath="${workspace_loc:/RepRapFirmware}/Release" id="cdt.managedbuild.builder.gnu.cross.13059261" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="cdt.managedbuild.builder.gnu.cross"/>
- <tool id="cdt.managedbuild.tool.gnu.cross.assembler.163742171" name="Cross GCC Assembler" superClass="cdt.managedbuild.tool.gnu.cross.assembler">
- <inputType id="cdt.managedbuild.tool.gnu.assembler.input.230262206" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
- </tool>
- <tool commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" id="cdt.managedbuild.tool.gnu.cross.c.compiler.278237460" name="Cross GCC Compiler" superClass="cdt.managedbuild.tool.gnu.cross.c.compiler">
- <option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.option.optimization.level.710346403" name="Optimization Level" superClass="gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="gnu.c.optimization.level.more" valueType="enumerated"/>
- <option id="gnu.c.compiler.option.debugging.level.836865552" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.none" valueType="enumerated"/>
- <option id="gnu.c.compiler.option.misc.verbose.431575256" name="Verbose (-v)" superClass="gnu.c.compiler.option.misc.verbose" useByScannerDiscovery="false" value="false" valueType="boolean"/>
- <option id="gnu.c.compiler.option.misc.other.660952665" name="Other flags" superClass="gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-c -std=gnu99 -mcpu=cortex-m3 -mthumb -ffunction-sections -fdata-sections -nostdlib -Wdouble-promotion -fsingle-precision-constant &quot;-Wa,-ahl=$*.s&quot;" valueType="string"/>
- <option id="gnu.c.compiler.option.include.paths.2080437508" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/cores/arduino}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Storage}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/utils}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/cmsis/sam3x/include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/header_files}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/preprocessor}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/thirdparty/CMSIS/Include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/variants/duet}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Duet/Lwip}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Duet/Lwip/lwip/src/include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Duet/EMAC}&quot;"/>
- </option>
- <option id="gnu.c.compiler.option.preprocessor.def.symbols.571434619" 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="DUET_06_085"/>
- </option>
- <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1642892736" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
- </tool>
- <tool id="cdt.managedbuild.tool.gnu.cross.c.linker.831729502" name="Cross GCC Linker" superClass="cdt.managedbuild.tool.gnu.cross.c.linker"/>
- <tool id="cdt.managedbuild.tool.gnu.cross.archiver.586905748" name="Cross GCC Archiver" superClass="cdt.managedbuild.tool.gnu.cross.archiver"/>
- <tool command="gcc" commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${LinkFlags1} &quot;${workspace_loc:/${CoreName}/SAM3X8E/cores/arduino/syscalls.o}&quot; ${INPUTS} ${LinkFlags2}" id="cdt.managedbuild.tool.gnu.cross.cpp.linker.77650722" name="Cross G++ Linker" superClass="cdt.managedbuild.tool.gnu.cross.cpp.linker">
- <option id="gnu.cpp.link.option.nostdlibs.296038599" 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.75045718" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths" useByScannerDiscovery="false" valueType="libPaths">
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/SAM3X8E/}&quot;"/>
- </option>
- <option id="gnu.cpp.link.option.libs.1995000942" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" useByScannerDiscovery="false" valueType="libs">
- <listOptionValue builtIn="false" value="${CoreName}"/>
- </option>
- <option id="gnu.cpp.link.option.flags.1670739910" 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/duet/linker_scripts/gcc/flash.ld} -Wl,-Map,${workspace_loc:/${ProjName}/${ConfigName}}/${BuildArtifactFileBaseName}.map" valueType="string"/>
- <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1491196930" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
- <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
- <additionalInput kind="additionalinput" paths="$(LIBS)"/>
- </inputType>
- </tool>
- <tool command="g++" id="cdt.managedbuild.tool.gnu.cross.cpp.compiler.1261470824" name="Cross G++ Compiler" superClass="cdt.managedbuild.tool.gnu.cross.cpp.compiler">
- <option id="gnu.cpp.compiler.option.optimization.level.1078688101" name="Optimization Level" superClass="gnu.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.more" valueType="enumerated"/>
- <option id="gnu.cpp.compiler.option.debugging.level.1332396113" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.none" valueType="enumerated"/>
- <option id="gnu.cpp.compiler.option.other.verbose.1151170522" name="Verbose (-v)" superClass="gnu.cpp.compiler.option.other.verbose" useByScannerDiscovery="false" value="false" valueType="boolean"/>
- <option id="gnu.cpp.compiler.option.other.other.184134051" name="Other flags" superClass="gnu.cpp.compiler.option.other.other" useByScannerDiscovery="false" value="-c -std=gnu++14 -mcpu=cortex-m3 -mthumb -ffunction-sections -fdata-sections -fno-threadsafe-statics -fno-rtti -fno-exceptions -nostdlib -Wdouble-promotion -fsingle-precision-constant &quot;-Wa,-ahl=$*.s&quot;" valueType="string"/>
- <option id="gnu.cpp.compiler.option.include.paths.1285689288" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/cores/arduino}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Flash}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/SharedSpi}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Storage}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Wire}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/utils}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/services/clock}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/services/flash_efc}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/cmsis/sam3x/include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/header_files}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/preprocessor}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/thirdparty/CMSIS/Include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/variants/duet}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Duet}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Duet/Lwip}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Duet/EMAC}&quot;"/>
- </option>
- <option id="gnu.cpp.compiler.option.preprocessor.def.1548770846" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">
- <listOptionValue builtIn="false" value="__SAM3X8E__"/>
- <listOptionValue builtIn="false" value="DUET_06_085"/>
- <listOptionValue builtIn="false" value="_XOPEN_SOURCE"/>
- </option>
- <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.948285998" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
- </tool>
- </toolChain>
- </folderInfo>
- <sourceEntries>
- <entry excluding="src/Alligator|src/Duet/Lwip/lwip/src/core/ipv6|src/Duet/Lwip/lwip/test|src/SAME70_TEST|src/Display|src/Networking|src/DuetNG|src/DuetM|src/RADDS" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
- </sourceEntries>
- </configuration>
- </storageModule>
- <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">
- <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"/>
- <stringMacro name="CoreName" type="VALUE_TEXT" value="CoreNG"/>
- <stringMacro name="GccPath" type="VALUE_TEXT" value="/home/christian/duet-dc42/gcc-arm-none-eabi-7-2017-q4-major/bin/"/>
- </macros>
- <externalSettings/>
- <extensions>
- <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
- <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- </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}}/${ProjName}-RADDS.elf ${workspace_loc:/${ProjName}/${ConfigName}}/${ProjName}-RADDS.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"/>
- <option id="cdt.managedbuild.option.gnu.cross.prefix.1606498191" name="Prefix" superClass="cdt.managedbuild.option.gnu.cross.prefix" useByScannerDiscovery="false" value="arm-none-eabi-" valueType="string"/>
- <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="cdt.managedbuild.targetPlatform.gnu.cross.342355349" isAbstract="false" osList="all" superClass="cdt.managedbuild.targetPlatform.gnu.cross"/>
- <builder buildPath="${workspace_loc:/RepRapFirmware}/Release" id="cdt.managedbuild.builder.gnu.cross.1336978387" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="cdt.managedbuild.builder.gnu.cross"/>
- <tool id="cdt.managedbuild.tool.gnu.cross.assembler.863511428" name="Cross GCC Assembler" superClass="cdt.managedbuild.tool.gnu.cross.assembler">
- <inputType id="cdt.managedbuild.tool.gnu.assembler.input.664007272" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
- </tool>
- <tool commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" id="cdt.managedbuild.tool.gnu.cross.c.compiler.764246283" name="Cross GCC Compiler" superClass="cdt.managedbuild.tool.gnu.cross.c.compiler">
- <option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.option.optimization.level.1125289372" name="Optimization Level" superClass="gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="gnu.c.optimization.level.more" valueType="enumerated"/>
- <option id="gnu.c.compiler.option.debugging.level.807229803" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.none" valueType="enumerated"/>
- <option id="gnu.c.compiler.option.misc.verbose.1747279976" name="Verbose (-v)" superClass="gnu.c.compiler.option.misc.verbose" useByScannerDiscovery="false" value="false" valueType="boolean"/>
- <option id="gnu.c.compiler.option.misc.other.1771169870" name="Other flags" superClass="gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-c -std=gnu99 -mcpu=cortex-m3 -mthumb -ffunction-sections -fdata-sections -nostdlib -Wdouble-promotion -fsingle-precision-constant &quot;-Wa,-ahl=$*.s&quot;" valueType="string"/>
- <option id="gnu.c.compiler.option.include.paths.425316569" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/cores/arduino}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Storage}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/utils}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/cmsis/sam3x/include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/header_files}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/preprocessor}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/thirdparty/CMSIS/Include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/variants/RADDS}&quot;"/>
- </option>
- <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__"/>
- </option>
- <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.110609707" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
- </tool>
- <tool id="cdt.managedbuild.tool.gnu.cross.c.linker.1692168928" name="Cross GCC Linker" superClass="cdt.managedbuild.tool.gnu.cross.c.linker"/>
- <tool id="cdt.managedbuild.tool.gnu.cross.archiver.1755453550" name="Cross GCC Archiver" superClass="cdt.managedbuild.tool.gnu.cross.archiver"/>
- <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;"/>
- </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}"/>
- </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">
- <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
- <additionalInput kind="additionalinput" paths="$(LIBS)"/>
- </inputType>
- </tool>
- <tool command="g++" id="cdt.managedbuild.tool.gnu.cross.cpp.compiler.2077096750" name="Cross G++ Compiler" superClass="cdt.managedbuild.tool.gnu.cross.cpp.compiler">
- <option id="gnu.cpp.compiler.option.optimization.level.25432549" name="Optimization Level" superClass="gnu.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.more" valueType="enumerated"/>
- <option id="gnu.cpp.compiler.option.debugging.level.1920128035" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.none" valueType="enumerated"/>
- <option id="gnu.cpp.compiler.option.other.verbose.1825237573" name="Verbose (-v)" superClass="gnu.cpp.compiler.option.other.verbose" useByScannerDiscovery="false" value="false" valueType="boolean"/>
- <option id="gnu.cpp.compiler.option.other.other.165959132" name="Other flags" superClass="gnu.cpp.compiler.option.other.other" useByScannerDiscovery="false" value="-c -std=gnu++14 -mcpu=cortex-m3 -mthumb -ffunction-sections -fdata-sections -fno-threadsafe-statics -fno-rtti -fno-exceptions -nostdlib -Wdouble-promotion -fsingle-precision-constant &quot;-Wa,-ahl=$*.s&quot;" valueType="string"/>
- <option id="gnu.cpp.compiler.option.include.paths.603435221" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/cores/arduino}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Flash}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/SharedSpi}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Storage}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Wire}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/utils}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/services/clock}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/services/flash_efc}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/cmsis/sam3x/include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/header_files}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/preprocessor}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/thirdparty/CMSIS/Include}&quot;"/>
- <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;"/>
- </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="_XOPEN_SOURCE"/>
- </option>
- <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.1578939493" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
- </tool>
- </toolChain>
- </folderInfo>
- <sourceEntries>
- <entry excluding="src/Networking|src/Alligator|src/SAME70_TEST|src/Display|src/Duet|src/DuetNG|src/DuetM" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
- </sourceEntries>
- </configuration>
- </storageModule>
- <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
- </cconfiguration>
- <cconfiguration id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.1745168887">
- <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.1745168887" moduleId="org.eclipse.cdt.core.settings" name="Alligator">
- <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"/>
- <stringMacro name="CoreName" type="VALUE_TEXT" value="CoreNG"/>
- <stringMacro name="GccPath" type="VALUE_TEXT" value="/home/christian/duet-dc42/gcc-arm-none-eabi-7-2017-q4-major/bin/"/>
- </macros>
- <externalSettings/>
- <extensions>
- <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
- <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- </extensions>
- </storageModule>
- <storageModule moduleId="cdtBuildSystem" version="4.0.0">
- <configuration artifactExtension="elf" artifactName="${ProjName}-Alligator" 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.1745168887" name="Alligator" parent="cdt.managedbuild.config.gnu.cross.exe.release" postannouncebuildStep="Generating binary file" postbuildStep="arm-none-eabi-objcopy -O binary ${workspace_loc:/${ProjName}/${ConfigName}}/${ProjName}-Alligator.elf ${workspace_loc:/${ProjName}/${ConfigName}}/${ProjName}-Alligator.bin">
- <folderInfo id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.1745168887." name="/" resourcePath="">
- <toolChain id="cdt.managedbuild.toolchain.gnu.cross.exe.release.623324432" name="Cross GCC" superClass="cdt.managedbuild.toolchain.gnu.cross.exe.release">
- <option id="cdt.managedbuild.option.gnu.cross.path.645044151" name="Path" superClass="cdt.managedbuild.option.gnu.cross.path" useByScannerDiscovery="false" value="${GccPath}" valueType="string"/>
- <option id="cdt.managedbuild.option.gnu.cross.prefix.629438941" name="Prefix" superClass="cdt.managedbuild.option.gnu.cross.prefix" useByScannerDiscovery="false" value="arm-none-eabi-" valueType="string"/>
- <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="cdt.managedbuild.targetPlatform.gnu.cross.878309876" isAbstract="false" osList="all" superClass="cdt.managedbuild.targetPlatform.gnu.cross"/>
- <builder buildPath="${workspace_loc:/RepRapFirmware}/Release" id="cdt.managedbuild.builder.gnu.cross.56178753" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="cdt.managedbuild.builder.gnu.cross"/>
- <tool id="cdt.managedbuild.tool.gnu.cross.assembler.384615201" name="Cross GCC Assembler" superClass="cdt.managedbuild.tool.gnu.cross.assembler">
- <inputType id="cdt.managedbuild.tool.gnu.assembler.input.1769413014" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
- </tool>
- <tool commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" id="cdt.managedbuild.tool.gnu.cross.c.compiler.429394189" name="Cross GCC Compiler" superClass="cdt.managedbuild.tool.gnu.cross.c.compiler">
- <option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.option.optimization.level.1940178744" name="Optimization Level" superClass="gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="gnu.c.optimization.level.more" valueType="enumerated"/>
- <option id="gnu.c.compiler.option.debugging.level.1345702698" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.none" valueType="enumerated"/>
- <option id="gnu.c.compiler.option.misc.verbose.1965295612" name="Verbose (-v)" superClass="gnu.c.compiler.option.misc.verbose" useByScannerDiscovery="false" value="false" valueType="boolean"/>
- <option id="gnu.c.compiler.option.misc.other.2089676962" name="Other flags" superClass="gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-c -std=gnu99 -mcpu=cortex-m3 -mthumb -ffunction-sections -fdata-sections -nostdlib -Wdouble-promotion -fsingle-precision-constant &quot;-Wa,-ahl=$*.s&quot;" valueType="string"/>
- <option id="gnu.c.compiler.option.include.paths.1071791609" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/cores/arduino}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Storage}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/utils}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/cmsis/sam3x/include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/header_files}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/preprocessor}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/thirdparty/CMSIS/Include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/variants/alligator}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Duet/Lwip}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Duet/Lwip/lwip/src/include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Duet/EMAC}&quot;"/>
- </option>
- <option id="gnu.c.compiler.option.preprocessor.def.symbols.680004295" 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="__ALLIGATOR__"/>
- </option>
- <option id="gnu.c.compiler.option.dialect.std.1020546177" name="Language standard" superClass="gnu.c.compiler.option.dialect.std" useByScannerDiscovery="true" value="gnu.c.compiler.dialect.default" valueType="enumerated"/>
- <option id="gnu.c.compiler.option.include.files.1091766282" name="Include files (-include)" superClass="gnu.c.compiler.option.include.files" useByScannerDiscovery="false"/>
- <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1737201945" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
- </tool>
- <tool id="cdt.managedbuild.tool.gnu.cross.c.linker.1510685625" name="Cross GCC Linker" superClass="cdt.managedbuild.tool.gnu.cross.c.linker"/>
- <tool id="cdt.managedbuild.tool.gnu.cross.archiver.2031955379" name="Cross GCC Archiver" superClass="cdt.managedbuild.tool.gnu.cross.archiver"/>
- <tool command="gcc" commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${LinkFlags1} &quot;${workspace_loc:/${CoreName}/Alligator/cores/arduino/syscalls.o}&quot; ${INPUTS} ${LinkFlags2}" id="cdt.managedbuild.tool.gnu.cross.cpp.linker.1616069436" name="Cross G++ Linker" superClass="cdt.managedbuild.tool.gnu.cross.cpp.linker">
- <option id="gnu.cpp.link.option.nostdlibs.760089516" 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.1593340130" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths" useByScannerDiscovery="false" valueType="libPaths">
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/Alligator/}&quot;"/>
- </option>
- <option id="gnu.cpp.link.option.libs.1260510068" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" useByScannerDiscovery="false" valueType="libs">
- <listOptionValue builtIn="false" value="${CoreName}"/>
- </option>
- <option id="gnu.cpp.link.option.flags.1376831701" 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/alligator/linker_scripts/gcc/flash.ld} -Wl,-Map,${workspace_loc:/${ProjName}/${ConfigName}}/${BuildArtifactFileBaseName}.map" valueType="string"/>
- <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1951368129" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
- <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
- <additionalInput kind="additionalinput" paths="$(LIBS)"/>
- </inputType>
- </tool>
- <tool command="g++" id="cdt.managedbuild.tool.gnu.cross.cpp.compiler.1533537470" name="Cross G++ Compiler" superClass="cdt.managedbuild.tool.gnu.cross.cpp.compiler">
- <option id="gnu.cpp.compiler.option.optimization.level.1431609218" name="Optimization Level" superClass="gnu.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.more" valueType="enumerated"/>
- <option id="gnu.cpp.compiler.option.debugging.level.1167774913" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.none" valueType="enumerated"/>
- <option id="gnu.cpp.compiler.option.other.verbose.68487747" name="Verbose (-v)" superClass="gnu.cpp.compiler.option.other.verbose" useByScannerDiscovery="false" value="false" valueType="boolean"/>
- <option id="gnu.cpp.compiler.option.other.other.1532821901" name="Other flags" superClass="gnu.cpp.compiler.option.other.other" useByScannerDiscovery="false" value="-c -std=gnu++14 -mcpu=cortex-m3 -mthumb -ffunction-sections -fdata-sections -fno-threadsafe-statics -fno-rtti -fno-exceptions -nostdlib -Wdouble-promotion -fsingle-precision-constant &quot;-Wa,-ahl=$*.s&quot;" valueType="string"/>
- <option id="gnu.cpp.compiler.option.include.paths.1825159078" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/cores/arduino}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Flash}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/SharedSpi}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Storage}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Wire}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/utils}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/services/clock}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/services/flash_efc}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/cmsis/sam3x/include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/header_files}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/preprocessor}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/thirdparty/CMSIS/Include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/variants/alligator}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Alligator}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Duet}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Duet/Lwip}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Duet/EMAC}&quot;"/>
- </option>
- <option id="gnu.cpp.compiler.option.preprocessor.def.890621467" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">
- <listOptionValue builtIn="false" value="__SAM3X8E__"/>
- <listOptionValue builtIn="false" value="__ALLIGATOR__"/>
- <listOptionValue builtIn="false" value="_XOPEN_SOURCE"/>
- </option>
- <option id="gnu.cpp.compiler.option.preprocessor.undef.913409309" name="Undefined symbols (-U)" superClass="gnu.cpp.compiler.option.preprocessor.undef" useByScannerDiscovery="false"/>
- <option id="gnu.cpp.compiler.option.dialect.std.603621474" name="Language standard" superClass="gnu.cpp.compiler.option.dialect.std" useByScannerDiscovery="true" value="gnu.cpp.compiler.dialect.default" valueType="enumerated"/>
- <option id="gnu.cpp.compiler.option.include.files.1575937801" name="Include files (-include)" superClass="gnu.cpp.compiler.option.include.files" useByScannerDiscovery="false"/>
- <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.667323948" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
- </tool>
- </toolChain>
- </folderInfo>
- <sourceEntries>
- <entry excluding="src/Networking|src/Duet/Lwip/lwip/src/core/ipv6|src/Networking|src/DuetNG|src/Alligator/Lwip/lwip/src/include/ipv6|src/Alligator/Lwip/lwip/test|src/Duet/MCP4461|src/Duet/Lwip/lwip/test|src/SAME70_TEST|src/Display|src/DuetM|src/Alligator/Lwip/lwip/src/core/ipv6|src/RADDS" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
- </sourceEntries>
- </configuration>
- </storageModule>
- <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
- </cconfiguration>
- <cconfiguration id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.241502451.170574622">
- <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.241502451.170574622" moduleId="org.eclipse.cdt.core.settings" name="Duet2_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"/>
- <stringMacro name="CoreName" type="VALUE_TEXT" value="CoreNG"/>
- <stringMacro name="GccPath" type="VALUE_TEXT" value="/home/christian/duet-dc42/gcc-arm-none-eabi-7-2017-q4-major/bin/"/>
- </macros>
- <externalSettings/>
- <extensions>
- <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
- <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- </extensions>
- </storageModule>
- <storageModule moduleId="cdtBuildSystem" version="4.0.0">
- <configuration artifactExtension="elf" artifactName="Duet2CombinedFirmware" 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.241502451.170574622" name="Duet2_RTOS" parent="cdt.managedbuild.config.gnu.cross.exe.release" postannouncebuildStep="Generating binary file" postbuildStep="arm-none-eabi-objcopy -O binary ${workspace_loc:/${ProjName}/${ConfigName}}/Duet2CombinedFirmware.elf ${workspace_loc:/${ProjName}/${ConfigName}}/Duet2CombinedFirmware.bin">
- <folderInfo id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.241502451.170574622." name="/" resourcePath="">
- <toolChain id="cdt.managedbuild.toolchain.gnu.cross.exe.release.435431950" name="Cross GCC" superClass="cdt.managedbuild.toolchain.gnu.cross.exe.release">
- <option id="cdt.managedbuild.option.gnu.cross.path.1881231799" name="Path" superClass="cdt.managedbuild.option.gnu.cross.path" useByScannerDiscovery="false" value="${GccPath}" valueType="string"/>
- <option id="cdt.managedbuild.option.gnu.cross.prefix.172065168" name="Prefix" superClass="cdt.managedbuild.option.gnu.cross.prefix" useByScannerDiscovery="false" value="arm-none-eabi-" valueType="string"/>
- <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="cdt.managedbuild.targetPlatform.gnu.cross.1838379384" isAbstract="false" osList="all" superClass="cdt.managedbuild.targetPlatform.gnu.cross"/>
- <builder buildPath="${workspace_loc:/RepRapFirmware}/Release" id="cdt.managedbuild.builder.gnu.cross.591414239" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="cdt.managedbuild.builder.gnu.cross"/>
- <tool id="cdt.managedbuild.tool.gnu.cross.assembler.1539163958" name="Cross GCC Assembler" superClass="cdt.managedbuild.tool.gnu.cross.assembler">
- <inputType id="cdt.managedbuild.tool.gnu.assembler.input.1036697395" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
- </tool>
- <tool commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" id="cdt.managedbuild.tool.gnu.cross.c.compiler.463703707" name="Cross GCC Compiler" superClass="cdt.managedbuild.tool.gnu.cross.c.compiler">
- <option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.option.optimization.level.456685708" name="Optimization Level" superClass="gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="gnu.c.optimization.level.more" valueType="enumerated"/>
- <option id="gnu.c.compiler.option.debugging.level.1579494397" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.none" valueType="enumerated"/>
- <option id="gnu.c.compiler.option.misc.verbose.328543251" name="Verbose (-v)" superClass="gnu.c.compiler.option.misc.verbose" useByScannerDiscovery="false" value="false" valueType="boolean"/>
- <option id="gnu.c.compiler.option.misc.other.465279131" name="Other flags" superClass="gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-c -std=gnu99 -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections -nostdlib -Wdouble-promotion -fsingle-precision-constant &quot;-Wa,-ahl=$*.s&quot;" valueType="string"/>
- <option id="gnu.c.compiler.option.include.paths.288982451" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/cores/arduino}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Storage}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/utils}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/services/ioport}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/cmsis/sam4e/include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/header_files}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/preprocessor}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/thirdparty/CMSIS/Include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/variants/duetNG}&quot;"/>
- </option>
- <option id="gnu.c.compiler.option.preprocessor.def.symbols.1227675538" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
- <listOptionValue builtIn="false" value="__SAM4E8E__"/>
- <listOptionValue builtIn="false" value="RTOS"/>
- <listOptionValue builtIn="false" value="DUET_NG"/>
- </option>
- <option id="gnu.c.compiler.option.dialect.std.580173803" name="Language standard" superClass="gnu.c.compiler.option.dialect.std" useByScannerDiscovery="true" value="gnu.c.compiler.dialect.default" valueType="enumerated"/>
- <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1065384487" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
- </tool>
- <tool id="cdt.managedbuild.tool.gnu.cross.c.linker.1102044150" name="Cross GCC Linker" superClass="cdt.managedbuild.tool.gnu.cross.c.linker"/>
- <tool id="cdt.managedbuild.tool.gnu.cross.archiver.1402882499" name="Cross GCC Archiver" superClass="cdt.managedbuild.tool.gnu.cross.archiver"/>
- <tool command="gcc" commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${LinkFlags1} &quot;${workspace_loc:/${CoreName}/SAM4E8E_RTOS/cores/arduino/syscalls.o}&quot; ${INPUTS} ${LinkFlags2}" id="cdt.managedbuild.tool.gnu.cross.cpp.linker.1768134875" name="Cross G++ Linker" superClass="cdt.managedbuild.tool.gnu.cross.cpp.linker">
- <option id="gnu.cpp.link.option.nostdlibs.399544265" 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.605414111" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths" useByScannerDiscovery="false" valueType="libPaths">
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/SAM4E8E_RTOS/}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/FreeRTOS/SAM4E}&quot;"/>
- </option>
- <option id="gnu.cpp.link.option.libs.847860449" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" useByScannerDiscovery="false" valueType="libs">
- <listOptionValue builtIn="false" value="${CoreName}"/>
- <listOptionValue builtIn="false" value="FreeRTOS"/>
- </option>
- <option id="gnu.cpp.link.option.flags.161856294" name="Linker flags" superClass="gnu.cpp.link.option.flags" useByScannerDiscovery="false" value="-Os --specs=nano.specs -Wl,--gc-sections -Wl,--fatal-warnings -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -T${workspace_loc:/${CoreName}/variants/duetNG/linker_scripts/gcc/flash.ld} -Wl,-Map,${workspace_loc:/${ProjName}/${ConfigName}}/${BuildArtifactFileBaseName}.map" valueType="string"/>
- <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1270956612" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
- <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
- <additionalInput kind="additionalinput" paths="$(LIBS)"/>
- </inputType>
- </tool>
- <tool command="g++" id="cdt.managedbuild.tool.gnu.cross.cpp.compiler.1697970502" name="Cross G++ Compiler" superClass="cdt.managedbuild.tool.gnu.cross.cpp.compiler">
- <option id="gnu.cpp.compiler.option.optimization.level.1835678360" name="Optimization Level" superClass="gnu.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.more" valueType="enumerated"/>
- <option id="gnu.cpp.compiler.option.debugging.level.737051102" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.none" valueType="enumerated"/>
- <option id="gnu.cpp.compiler.option.other.verbose.1225557122" name="Verbose (-v)" superClass="gnu.cpp.compiler.option.other.verbose" useByScannerDiscovery="false" value="false" valueType="boolean"/>
- <option id="gnu.cpp.compiler.option.other.other.1423466590" name="Other flags" superClass="gnu.cpp.compiler.option.other.other" useByScannerDiscovery="false" value="-c -std=gnu++14 -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections -fno-threadsafe-statics -fno-rtti -fno-exceptions -nostdlib -Wdouble-promotion -fsingle-precision-constant &quot;-Wa,-ahl=$*.s&quot;" valueType="string"/>
- <option id="gnu.cpp.compiler.option.include.paths.1505018967" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/cores/arduino}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Flash}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/SharedSpi}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Storage}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Wire}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/utils}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/services/clock}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/services/ioport}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/services/flash_efc}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/cmsis/sam4e/include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/header_files}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/preprocessor}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/thirdparty/CMSIS/Include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/variants/duetNG}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/DuetNG}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Networking}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/DuetWiFiSocketServer/src/include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/FreeRTOS/src/include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/FreeRTOS/src/portable/GCC/ARM_CM4F}&quot;"/>
- </option>
- <option id="gnu.cpp.compiler.option.preprocessor.def.1443248224" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">
- <listOptionValue builtIn="false" value="__SAM4E8E__"/>
- <listOptionValue builtIn="false" value="RTOS"/>
- <listOptionValue builtIn="false" value="DUET_NG"/>
- <listOptionValue builtIn="false" value="_XOPEN_SOURCE"/>
- </option>
- <option id="gnu.cpp.compiler.option.dialect.std.705325399" name="Language standard" superClass="gnu.cpp.compiler.option.dialect.std" useByScannerDiscovery="true" value="gnu.cpp.compiler.dialect.default" valueType="enumerated"/>
- <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.65828751" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
- </tool>
- </toolChain>
- </folderInfo>
- <sourceEntries>
- <entry excluding="src/Networking/LwipEthernet|src/Alligator|src/SAME70_TEST|src/Display|src/Duet|src/DuetM|src/RADDS" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
- </sourceEntries>
- </configuration>
- </storageModule>
- <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
- </cconfiguration>
- <cconfiguration id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.241502451.1275216290.274082366.1645191116.1726130161">
- <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.241502451.1275216290.274082366.1645191116.1726130161" moduleId="org.eclipse.cdt.core.settings" name="SAME70_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"/>
- <stringMacro name="CoreName" type="VALUE_TEXT" value="CoreNG"/>
- <stringMacro name="GccPath" type="VALUE_TEXT" value="/home/christian/duet-dc42/gcc-arm-none-eabi-7-2017-q4-major/bin/"/>
- </macros>
- <externalSettings/>
- <extensions>
- <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
- <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- </extensions>
- </storageModule>
- <storageModule moduleId="cdtBuildSystem" version="4.0.0">
- <configuration artifactExtension="elf" artifactName="SAME70Firmware" 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.241502451.1275216290.274082366.1645191116.1726130161" name="SAME70_RTOS" parent="cdt.managedbuild.config.gnu.cross.exe.release" postannouncebuildStep="Generating binary file" postbuildStep="arm-none-eabi-objcopy -O binary ${workspace_loc:/${ProjName}/${ConfigName}}/SAME70Firmware.elf ${workspace_loc:/${ProjName}/${ConfigName}}/SAME70Firmware.bin">
- <folderInfo id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.241502451.1275216290.274082366.1645191116.1726130161." name="/" resourcePath="">
- <toolChain id="cdt.managedbuild.toolchain.gnu.cross.exe.release.418398691" name="Cross GCC" superClass="cdt.managedbuild.toolchain.gnu.cross.exe.release">
- <option id="cdt.managedbuild.option.gnu.cross.path.737846295" name="Path" superClass="cdt.managedbuild.option.gnu.cross.path" useByScannerDiscovery="false" value="${GccPath}" valueType="string"/>
- <option id="cdt.managedbuild.option.gnu.cross.prefix.1759325799" name="Prefix" superClass="cdt.managedbuild.option.gnu.cross.prefix" useByScannerDiscovery="false" value="arm-none-eabi-" valueType="string"/>
- <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="cdt.managedbuild.targetPlatform.gnu.cross.278027372" isAbstract="false" osList="all" superClass="cdt.managedbuild.targetPlatform.gnu.cross"/>
- <builder buildPath="${workspace_loc:/RepRapFirmware}/Release" id="cdt.managedbuild.builder.gnu.cross.1995751749" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="cdt.managedbuild.builder.gnu.cross"/>
- <tool id="cdt.managedbuild.tool.gnu.cross.assembler.408977354" name="Cross GCC Assembler" superClass="cdt.managedbuild.tool.gnu.cross.assembler">
- <inputType id="cdt.managedbuild.tool.gnu.assembler.input.2007824056" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
- </tool>
- <tool commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" id="cdt.managedbuild.tool.gnu.cross.c.compiler.683111625" name="Cross GCC Compiler" superClass="cdt.managedbuild.tool.gnu.cross.c.compiler">
- <option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.option.optimization.level.1059564366" name="Optimization Level" superClass="gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="gnu.c.optimization.level.more" valueType="enumerated"/>
- <option id="gnu.c.compiler.option.debugging.level.1763855573" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.default" valueType="enumerated"/>
- <option id="gnu.c.compiler.option.misc.verbose.1619149556" name="Verbose (-v)" superClass="gnu.c.compiler.option.misc.verbose" useByScannerDiscovery="false" value="false" valueType="boolean"/>
- <option id="gnu.c.compiler.option.misc.other.881101552" name="Other flags" superClass="gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-c -std=gnu99 -mcpu=cortex-m7 -mthumb -mfpu=fpv5-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections -nostdlib -Wdouble-promotion -fsingle-precision-constant" valueType="string"/>
- <option id="gnu.c.compiler.option.include.paths.1588247101" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/cores/arduino}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Storage}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/utils}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/services/clock}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/services/ioport}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/components/ethernet_phy/ksz8081rna}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers/hsmci}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers/gmac}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers/pmc}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers/rstc}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers/rtc}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/cmsis/same70/include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/header_files}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/preprocessor}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/thirdparty/CMSIS/Include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/variants/same70}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/SAME70_TEST}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Networking/LwipEthernet}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Networking/LwipEthernet/Lwip/src/include}&quot;"/>
- </option>
- <option id="gnu.c.compiler.option.preprocessor.def.symbols.2060162405" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
- <listOptionValue builtIn="false" value="__SAME70Q21__"/>
- <listOptionValue builtIn="false" value="SAME70_TEST_BOARD"/>
- <listOptionValue builtIn="false" value="RTOS"/>
- </option>
- <option id="gnu.c.compiler.option.dialect.std.2086912971" name="Language standard" superClass="gnu.c.compiler.option.dialect.std" useByScannerDiscovery="true" value="gnu.c.compiler.dialect.default" valueType="enumerated"/>
- <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.590982919" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
- </tool>
- <tool id="cdt.managedbuild.tool.gnu.cross.c.linker.698944650" name="Cross GCC Linker" superClass="cdt.managedbuild.tool.gnu.cross.c.linker"/>
- <tool id="cdt.managedbuild.tool.gnu.cross.archiver.1178245746" name="Cross GCC Archiver" superClass="cdt.managedbuild.tool.gnu.cross.archiver"/>
- <tool command="gcc" commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${LinkFlags1} &quot;${workspace_loc:/${CoreName}/SAME70_RTOS/cores/arduino/syscalls.o}&quot; ${INPUTS} ${LinkFlags2}" id="cdt.managedbuild.tool.gnu.cross.cpp.linker.1809359936" name="Cross G++ Linker" superClass="cdt.managedbuild.tool.gnu.cross.cpp.linker">
- <option id="gnu.cpp.link.option.nostdlibs.1494262112" 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.374020775" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths" useByScannerDiscovery="false" valueType="libPaths">
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/SAME70_RTOS/}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/FreeRTOS/SAME70}&quot;"/>
- </option>
- <option id="gnu.cpp.link.option.libs.1189839054" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" useByScannerDiscovery="false" valueType="libs">
- <listOptionValue builtIn="false" value="${CoreName}"/>
- <listOptionValue builtIn="false" value="FreeRTOS"/>
- </option>
- <option id="gnu.cpp.link.option.flags.770219385" name="Linker flags" superClass="gnu.cpp.link.option.flags" useByScannerDiscovery="false" value="-Os -Wl,--gc-sections -Wl,--fatal-warnings -mcpu=cortex-m7 -mthumb -mfpu=fpv5-d16 -mfloat-abi=hard -T${workspace_loc:/${CoreName}/variants/same70/linker_scripts/gcc/flash.ld} -Wl,-Map,${workspace_loc:/${ProjName}/${ConfigName}}/${BuildArtifactFileBaseName}.map" valueType="string"/>
- <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1510992918" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
- <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
- <additionalInput kind="additionalinput" paths="$(LIBS)"/>
- </inputType>
- </tool>
- <tool command="g++" id="cdt.managedbuild.tool.gnu.cross.cpp.compiler.730587251" name="Cross G++ Compiler" superClass="cdt.managedbuild.tool.gnu.cross.cpp.compiler">
- <option id="gnu.cpp.compiler.option.optimization.level.221735778" name="Optimization Level" superClass="gnu.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.more" valueType="enumerated"/>
- <option id="gnu.cpp.compiler.option.debugging.level.1690050236" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
- <option id="gnu.cpp.compiler.option.other.verbose.2083519512" name="Verbose (-v)" superClass="gnu.cpp.compiler.option.other.verbose" useByScannerDiscovery="false" value="false" valueType="boolean"/>
- <option id="gnu.cpp.compiler.option.other.other.1879111073" name="Other flags" superClass="gnu.cpp.compiler.option.other.other" useByScannerDiscovery="false" value="-c -std=gnu++14 -mcpu=cortex-m7 -mthumb -mfpu=fpv5-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections -fno-threadsafe-statics -fno-rtti -fno-exceptions -nostdlib -Wdouble-promotion -fsingle-precision-constant" valueType="string"/>
- <option id="gnu.cpp.compiler.option.include.paths.1952129269" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/cores/arduino}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Flash}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/SharedSpi}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Storage}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Wire}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/utils}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/services/clock}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/services/ioport}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers/gmac}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/services/flash_efc}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/cmsis/same70/include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/header_files}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/preprocessor}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/thirdparty/CMSIS/Include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/variants/same70}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/SAME70_TEST}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Networking}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Networking/LwipEthernet}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Networking/LwipEthernet/Lwip/src/include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/DuetWiFiSocketServer/src/include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/FreeRTOS/src/include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/FreeRTOS/src/portable/GCC/ARM_CM7/r0p1}&quot;"/>
- </option>
- <option id="gnu.cpp.compiler.option.preprocessor.def.1432647334" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">
- <listOptionValue builtIn="false" value="__SAME70Q21__"/>
- <listOptionValue builtIn="false" value="RTOS"/>
- <listOptionValue builtIn="false" value="SAME70_TEST_BOARD"/>
- <listOptionValue builtIn="false" value="_XOPEN_SOURCE"/>
- </option>
- <option id="gnu.cpp.compiler.option.dialect.std.1245992156" name="Language standard" superClass="gnu.cpp.compiler.option.dialect.std" useByScannerDiscovery="true" value="gnu.cpp.compiler.dialect.default" valueType="enumerated"/>
- <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.1500062938" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
- </tool>
- </toolChain>
- </folderInfo>
- <sourceEntries>
- <entry excluding="src/Networking/W5500Ethernet|src/DuetNG/DuetWiFi|src/Duet|src/DuetNG/DuetEthernet/Wiznet/Internet/SNTP|src/DuetNG|src/Networking/LwipEthernet/Lwip/test|src/DuetNG/DuetEthernet/Wiznet/Internet/DNS|src/DuetNG/DuetEthernet/Wiznet/Application|src/DuetNG/DuetEthernet/Wiznet/Internet/MQTT|src/Alligator|src/Display|src/Networking/LwipEthernet/Lwip/src/apps/mqtt|src/Networking/LwipEthernet/Lwip/doc|src/DuetNG/DuetEthernet/Wiznet/Internet/TFTP|src/DuetNG/DuetEthernet/Ethernet3|src/Networking/LwipEthernet/Lwip/src/apps/snmp|src/Networking/LwipEthernet/Lwip/src/apps/httpd|src/DuetNG/DuetEthernet/Wiznet/Internet/FTPServer|src/DuetNG/DuetEthernet/Ethernet3/examples|src/Networking/LwipEthernet/Lwip/src/apps/tftp|src/Networking/LwipEthernet/Lwip/src/netif/ppp|src/Networking/LwipEthernet/Lwip/src/apps/lwiperf|src/DuetNG/DuetEthernet/Wiznet/Internet/FTPClient|src/Networking/LwipEthernet/Lwip/src/apps/sntp|src/DuetNG/DuetEthernet/Wiznet/Internet/httpServer|src/DuetNG/DuetEthernet/Wiznet/Internet/SNMP|src/DuetM|src/RADDS" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
- </sourceEntries>
- </configuration>
- </storageModule>
- <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
- </cconfiguration>
- <cconfiguration id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.241502451.1275216290.1979117592.1786125202">
- <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.241502451.1275216290.1979117592.1786125202" moduleId="org.eclipse.cdt.core.settings" name="DuetM_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"/>
- <stringMacro name="CoreName" type="VALUE_TEXT" value="CoreNG"/>
- <stringMacro name="GccPath" type="VALUE_TEXT" value="/home/christian/duet-dc42/gcc-arm-none-eabi-7-2017-q4-major/bin/"/>
- </macros>
- <externalSettings/>
- <extensions>
- <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
- <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- </extensions>
- </storageModule>
- <storageModule moduleId="cdtBuildSystem" version="4.0.0">
- <configuration artifactExtension="elf" artifactName="DuetMaestroFirmware" 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.241502451.1275216290.1979117592.1786125202" name="DuetM_RTOS" parent="cdt.managedbuild.config.gnu.cross.exe.release" postannouncebuildStep="Generating binary file" postbuildStep="arm-none-eabi-objcopy -O binary ${workspace_loc:/${ProjName}/${ConfigName}}/DuetMaestroFirmware.elf ${workspace_loc:/${ProjName}/${ConfigName}}/DuetMaestroFirmware.bin">
- <folderInfo id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.241502451.1275216290.1979117592.1786125202." name="/" resourcePath="">
- <toolChain id="cdt.managedbuild.toolchain.gnu.cross.exe.release.587287092" name="Cross GCC" superClass="cdt.managedbuild.toolchain.gnu.cross.exe.release">
- <option id="cdt.managedbuild.option.gnu.cross.path.1109728511" name="Path" superClass="cdt.managedbuild.option.gnu.cross.path" useByScannerDiscovery="false" value="${GccPath}" valueType="string"/>
- <option id="cdt.managedbuild.option.gnu.cross.prefix.902845750" name="Prefix" superClass="cdt.managedbuild.option.gnu.cross.prefix" useByScannerDiscovery="false" value="arm-none-eabi-" valueType="string"/>
- <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="cdt.managedbuild.targetPlatform.gnu.cross.650058498" isAbstract="false" osList="all" superClass="cdt.managedbuild.targetPlatform.gnu.cross"/>
- <builder buildPath="${workspace_loc:/RepRapFirmware}/Release" id="cdt.managedbuild.builder.gnu.cross.1418828251" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="cdt.managedbuild.builder.gnu.cross"/>
- <tool id="cdt.managedbuild.tool.gnu.cross.assembler.2098319503" name="Cross GCC Assembler" superClass="cdt.managedbuild.tool.gnu.cross.assembler">
- <inputType id="cdt.managedbuild.tool.gnu.assembler.input.960800346" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
- </tool>
- <tool commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" id="cdt.managedbuild.tool.gnu.cross.c.compiler.362346514" name="Cross GCC Compiler" superClass="cdt.managedbuild.tool.gnu.cross.c.compiler">
- <option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.option.optimization.level.1146301638" name="Optimization Level" superClass="gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="gnu.c.optimization.level.more" valueType="enumerated"/>
- <option id="gnu.c.compiler.option.debugging.level.26576195" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.none" valueType="enumerated"/>
- <option id="gnu.c.compiler.option.misc.verbose.506647291" name="Verbose (-v)" superClass="gnu.c.compiler.option.misc.verbose" useByScannerDiscovery="false" value="false" valueType="boolean"/>
- <option id="gnu.c.compiler.option.misc.other.1094924681" name="Other flags" superClass="gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-c -std=gnu99 -mcpu=cortex-m4 -mthumb -ffunction-sections -fdata-sections -nostdlib -Wdouble-promotion -fsingle-precision-constant &quot;-Wa,-ahl=$*.s&quot;" valueType="string"/>
- <option id="gnu.c.compiler.option.include.paths.1928788580" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/cores/arduino}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Storage}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/utils}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/services/ioport}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers/hsmci}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers/rstc}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers/rtc}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/cmsis/sam4s/include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/header_files}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/preprocessor}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/thirdparty/CMSIS/Include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/variants/sam4s}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Networking/W5500Ethernet}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Networking/W5500Ethernet/Wiznet/Ethernet}&quot;"/>
- </option>
- <option id="gnu.c.compiler.option.preprocessor.def.symbols.42674268" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
- <listOptionValue builtIn="false" value="__SAM4S8C__"/>
- <listOptionValue builtIn="false" value="DUET_M"/>
- <listOptionValue builtIn="false" value="RTOS"/>
- </option>
- <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1911984296" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
- </tool>
- <tool id="cdt.managedbuild.tool.gnu.cross.c.linker.658619264" name="Cross GCC Linker" superClass="cdt.managedbuild.tool.gnu.cross.c.linker"/>
- <tool id="cdt.managedbuild.tool.gnu.cross.archiver.62127405" name="Cross GCC Archiver" superClass="cdt.managedbuild.tool.gnu.cross.archiver"/>
- <tool command="gcc" commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${LinkFlags1} &quot;${workspace_loc:/${CoreName}/SAM4S/cores/arduino/syscalls.o}&quot; ${INPUTS} ${LinkFlags2}" id="cdt.managedbuild.tool.gnu.cross.cpp.linker.219833956" name="Cross G++ Linker" superClass="cdt.managedbuild.tool.gnu.cross.cpp.linker">
- <option id="gnu.cpp.link.option.nostdlibs.1759008050" 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.1780686736" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths" useByScannerDiscovery="false" valueType="libPaths">
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/SAM4S_RTOS/}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/FreeRTOS/SAM4S}&quot;"/>
- </option>
- <option id="gnu.cpp.link.option.libs.1861827109" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" useByScannerDiscovery="false" valueType="libs">
- <listOptionValue builtIn="false" value="${CoreName}"/>
- <listOptionValue builtIn="false" value="FreeRTOS"/>
- </option>
- <option id="gnu.cpp.link.option.flags.249188176" name="Linker flags" superClass="gnu.cpp.link.option.flags" useByScannerDiscovery="false" value="-Os -Wl,--gc-sections -Wl,--fatal-warnings -mcpu=cortex-m4 -T${workspace_loc:/${CoreName}/variants/sam4s/linker_scripts/gcc/flash.ld} -Wl,-Map,${workspace_loc:/${ProjName}/${ConfigName}}/${BuildArtifactFileBaseName}.map" valueType="string"/>
- <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1766055484" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
- <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
- <additionalInput kind="additionalinput" paths="$(LIBS)"/>
- </inputType>
- </tool>
- <tool command="g++" id="cdt.managedbuild.tool.gnu.cross.cpp.compiler.1679811926" name="Cross G++ Compiler" superClass="cdt.managedbuild.tool.gnu.cross.cpp.compiler">
- <option id="gnu.cpp.compiler.option.optimization.level.742108559" name="Optimization Level" superClass="gnu.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.more" valueType="enumerated"/>
- <option id="gnu.cpp.compiler.option.debugging.level.1766333437" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.none" valueType="enumerated"/>
- <option id="gnu.cpp.compiler.option.other.verbose.423352956" name="Verbose (-v)" superClass="gnu.cpp.compiler.option.other.verbose" useByScannerDiscovery="false" value="false" valueType="boolean"/>
- <option id="gnu.cpp.compiler.option.other.other.296249362" name="Other flags" superClass="gnu.cpp.compiler.option.other.other" useByScannerDiscovery="false" value="-c -std=gnu++14 -mcpu=cortex-m4 -mthumb -ffunction-sections -fdata-sections -fno-threadsafe-statics -fno-rtti -fno-exceptions -nostdlib -Wdouble-promotion -fsingle-precision-constant &quot;-Wa,-ahl=$*.s&quot;" valueType="string"/>
- <option id="gnu.cpp.compiler.option.include.paths.1392267649" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/cores/arduino}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Flash}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/SharedSpi}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Storage}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Wire}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/utils}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/services/clock}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/services/ioport}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/services/flash_efc}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/cmsis/sam4s/include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/header_files}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/preprocessor}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/thirdparty/CMSIS/Include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/variants/sam4s}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/DuetM}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Networking}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/FreeRTOS/src/include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/FreeRTOS/src/portable/GCC/ARM_CM4F}&quot;"/>
- </option>
- <option id="gnu.cpp.compiler.option.preprocessor.def.1873093132" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">
- <listOptionValue builtIn="false" value="__SAM4S8C__"/>
- <listOptionValue builtIn="false" value="DUET_M"/>
- <listOptionValue builtIn="false" value="RTOS"/>
- <listOptionValue builtIn="false" value="_XOPEN_SOURCE"/>
- </option>
- <option id="gnu.cpp.compiler.option.dialect.std.1735471203" name="Language standard" superClass="gnu.cpp.compiler.option.dialect.std" useByScannerDiscovery="true" value="gnu.cpp.compiler.dialect.default" valueType="enumerated"/>
- <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.1116287501" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
- </tool>
- </toolChain>
- </folderInfo>
- <sourceEntries>
- <entry excluding="src/DuetNG|src/Networking/ESP8266WiFi|src/Networking/LwipEthernet|src/Alligator|src/SAME70_TEST|src/Duet|src/RADDS" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
- </sourceEntries>
- </configuration>
- </storageModule>
- <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
- </cconfiguration>
- <cconfiguration id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.241502451.1275216290.274082366.1645191116.1852610203">
- <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.241502451.1275216290.274082366.1645191116.1852610203" moduleId="org.eclipse.cdt.core.settings" name="SAME70_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"/>
- <stringMacro name="CoreName" type="VALUE_TEXT" value="CoreNG"/>
- <stringMacro name="GccPath" type="VALUE_TEXT" value="C:\Program Files (x86)\GNU Tools ARM Embedded\6 2017-q2-update\bin"/>
- </macros>
- <externalSettings/>
- <extensions>
- <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
- <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- </extensions>
- </storageModule>
- <storageModule moduleId="cdtBuildSystem" version="4.0.0">
- <configuration artifactExtension="elf" artifactName="SAME70Firmware" 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.241502451.1275216290.274082366.1645191116.1852610203" name="SAME70_RTOS" parent="cdt.managedbuild.config.gnu.cross.exe.release" postannouncebuildStep="Generating binary file" postbuildStep="arm-none-eabi-objcopy -O binary ${workspace_loc:/${ProjName}/${ConfigName}}/SAME70Firmware.elf ${workspace_loc:/${ProjName}/${ConfigName}}/SAME70Firmware.bin">
- <folderInfo id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.241502451.1275216290.274082366.1645191116.1852610203." name="/" resourcePath="">
- <toolChain id="cdt.managedbuild.toolchain.gnu.cross.exe.release.5959303" name="Cross GCC" superClass="cdt.managedbuild.toolchain.gnu.cross.exe.release">
- <option id="cdt.managedbuild.option.gnu.cross.path.163568524" name="Path" superClass="cdt.managedbuild.option.gnu.cross.path" useByScannerDiscovery="false" value="${GccPath}" valueType="string"/>
- <option id="cdt.managedbuild.option.gnu.cross.prefix.308380201" name="Prefix" superClass="cdt.managedbuild.option.gnu.cross.prefix" useByScannerDiscovery="false" value="arm-none-eabi-" valueType="string"/>
- <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="cdt.managedbuild.targetPlatform.gnu.cross.1827418537" isAbstract="false" osList="all" superClass="cdt.managedbuild.targetPlatform.gnu.cross"/>
- <builder buildPath="${workspace_loc:/RepRapFirmware}/Release" id="cdt.managedbuild.builder.gnu.cross.1828958094" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="cdt.managedbuild.builder.gnu.cross"/>
- <tool id="cdt.managedbuild.tool.gnu.cross.assembler.254554862" name="Cross GCC Assembler" superClass="cdt.managedbuild.tool.gnu.cross.assembler">
- <inputType id="cdt.managedbuild.tool.gnu.assembler.input.1960931313" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
- </tool>
- <tool commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" id="cdt.managedbuild.tool.gnu.cross.c.compiler.1113168108" name="Cross GCC Compiler" superClass="cdt.managedbuild.tool.gnu.cross.c.compiler">
- <option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.option.optimization.level.1099089925" name="Optimization Level" superClass="gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="gnu.c.optimization.level.more" valueType="enumerated"/>
- <option id="gnu.c.compiler.option.debugging.level.2018591546" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.default" valueType="enumerated"/>
- <option id="gnu.c.compiler.option.misc.verbose.1767118602" name="Verbose (-v)" superClass="gnu.c.compiler.option.misc.verbose" useByScannerDiscovery="false" value="false" valueType="boolean"/>
- <option id="gnu.c.compiler.option.misc.other.2139236731" name="Other flags" superClass="gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-c -std=gnu99 -mcpu=cortex-m7 -mthumb -mfpu=fpv5-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections -nostdlib -Wdouble-promotion -fsingle-precision-constant" valueType="string"/>
- <option id="gnu.c.compiler.option.include.paths.1736169055" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/cores/arduino}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Storage}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/utils}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/services/clock}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/services/ioport}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/components/ethernet_phy/ksz8081rna}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers/hsmci}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers/gmac}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers/pmc}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers/rstc}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers/rtc}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/cmsis/same70/include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/header_files}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/preprocessor}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/thirdparty/CMSIS/Include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/variants/same70}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/SAME70_TEST}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Networking/LwipEthernet}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Networking/LwipEthernet/Lwip/src/include}&quot;"/>
- </option>
- <option id="gnu.c.compiler.option.preprocessor.def.symbols.316510289" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
- <listOptionValue builtIn="false" value="__SAME70Q21__"/>
- <listOptionValue builtIn="false" value="RTOS"/>
- <listOptionValue builtIn="false" value="SAME70_TEST_BOARD"/>
- </option>
- <option id="gnu.c.compiler.option.dialect.std.133148413" name="Language standard" superClass="gnu.c.compiler.option.dialect.std" useByScannerDiscovery="true" value="gnu.c.compiler.dialect.default" valueType="enumerated"/>
- <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.477491021" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
- </tool>
- <tool id="cdt.managedbuild.tool.gnu.cross.c.linker.1392905935" name="Cross GCC Linker" superClass="cdt.managedbuild.tool.gnu.cross.c.linker"/>
- <tool id="cdt.managedbuild.tool.gnu.cross.archiver.733829747" name="Cross GCC Archiver" superClass="cdt.managedbuild.tool.gnu.cross.archiver"/>
- <tool command="gcc" commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${LinkFlags1} &quot;${workspace_loc}/${CoreName}/SAME70/cores/arduino/syscalls.o&quot; ${INPUTS} ${LinkFlags2}" id="cdt.managedbuild.tool.gnu.cross.cpp.linker.1019421301" name="Cross G++ Linker" superClass="cdt.managedbuild.tool.gnu.cross.cpp.linker">
- <option id="gnu.cpp.link.option.nostdlibs.1609488418" 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.579521002" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths" useByScannerDiscovery="false" valueType="libPaths">
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/SAME70_RTOS/}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/FreeRTOS/SAME70}&quot;"/>
- </option>
- <option id="gnu.cpp.link.option.libs.1783235457" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" useByScannerDiscovery="false" valueType="libs">
- <listOptionValue builtIn="false" value="${CoreName}"/>
- <listOptionValue builtIn="false" value="FreeRTOS"/>
- </option>
- <option id="gnu.cpp.link.option.flags.2100826215" name="Linker flags" superClass="gnu.cpp.link.option.flags" useByScannerDiscovery="false" value="-Os -Wl,--gc-sections -Wl,--fatal-warnings -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -T${workspace_loc:/${CoreName}/variants/same70/linker_scripts/gcc/flash.ld} -Wl,-Map,${workspace_loc:/${ProjName}/${ConfigName}}/${BuildArtifactFileBaseName}.map" valueType="string"/>
- <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1623645672" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
- <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
- <additionalInput kind="additionalinput" paths="$(LIBS)"/>
- </inputType>
- </tool>
- <tool command="g++" id="cdt.managedbuild.tool.gnu.cross.cpp.compiler.1243015316" name="Cross G++ Compiler" superClass="cdt.managedbuild.tool.gnu.cross.cpp.compiler">
- <option id="gnu.cpp.compiler.option.optimization.level.744605431" name="Optimization Level" superClass="gnu.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.more" valueType="enumerated"/>
- <option id="gnu.cpp.compiler.option.debugging.level.1247470383" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.default" valueType="enumerated"/>
- <option id="gnu.cpp.compiler.option.other.verbose.1130347909" name="Verbose (-v)" superClass="gnu.cpp.compiler.option.other.verbose" useByScannerDiscovery="false" value="false" valueType="boolean"/>
- <option id="gnu.cpp.compiler.option.other.other.1453375027" name="Other flags" superClass="gnu.cpp.compiler.option.other.other" useByScannerDiscovery="false" value="-c -std=gnu++14 -mcpu=cortex-m7 -mthumb -mfpu=fpv5-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections -fno-threadsafe-statics -fno-rtti -fno-exceptions -nostdlib -Wdouble-promotion -fsingle-precision-constant &quot;-Wa,-ahl=$*.s&quot;" valueType="string"/>
- <option id="gnu.cpp.compiler.option.include.paths.633679617" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/cores/arduino}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Flash}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/SharedSpi}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Storage}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Wire}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/utils}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/services/clock}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/services/ioport}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers/gmac}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/services/flash_efc}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/cmsis/same70/include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/header_files}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/preprocessor}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/thirdparty/CMSIS/Include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/variants/same70}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/SAME70_TEST}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Networking}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Networking/LwipEthernet}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Networking/LwipEthernet/Lwip/src/include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/DuetWiFiSocketServer/src/include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/FreeRTOS/src/include}&quot;"/>
- <listOptionValue builtIn="false" value="&quot;${workspace_loc:/FreeRTOS/src/portable/GCC/ARM_CM7/r0p1}&quot;"/>
- </option>
- <option id="gnu.cpp.compiler.option.preprocessor.def.315745995" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">
- <listOptionValue builtIn="false" value="__SAME70Q21__"/>
- <listOptionValue builtIn="false" value="RTOS"/>
- <listOptionValue builtIn="false" value="SAME70_TEST_BOARD"/>
- <listOptionValue builtIn="false" value="_XOPEN_SOURCE"/>
- </option>
- <option id="gnu.cpp.compiler.option.dialect.std.815297330" name="Language standard" superClass="gnu.cpp.compiler.option.dialect.std" useByScannerDiscovery="true" value="gnu.cpp.compiler.dialect.default" valueType="enumerated"/>
- <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.2035099195" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
- </tool>
- </toolChain>
- </folderInfo>
- <sourceEntries>
- <entry excluding="src/Networking/W5500Ethernet|src/DuetNG/DuetWiFi|src/Duet|src/DuetNG/DuetEthernet/Wiznet/Internet/SNTP|src/DuetNG|src/Networking/LwipEthernet/Lwip/test|src/DuetNG/DuetEthernet/Wiznet/Internet/DNS|src/DuetNG/DuetEthernet/Wiznet/Application|src/DuetNG/DuetEthernet/Wiznet/Internet/MQTT|src/Alligator|src/Display|src/Networking/LwipEthernet/Lwip/src/apps/mqtt|src/Networking/LwipEthernet/Lwip/doc|src/DuetNG/DuetEthernet/Wiznet/Internet/TFTP|src/DuetNG/DuetEthernet/Ethernet3|src/Networking/LwipEthernet/Lwip/src/apps/snmp|src/Networking/LwipEthernet/Lwip/src/apps/httpd|src/DuetNG/DuetEthernet/Wiznet/Internet/FTPServer|src/DuetNG/DuetEthernet/Ethernet3/examples|src/Networking/LwipEthernet/Lwip/src/apps/tftp|src/Networking/LwipEthernet/Lwip/src/netif/ppp|src/Networking/LwipEthernet/Lwip/src/apps/lwiperf|src/DuetNG/DuetEthernet/Wiznet/Internet/FTPClient|src/Networking/LwipEthernet/Lwip/src/apps/sntp|src/DuetNG/DuetEthernet/Wiznet/Internet/httpServer|src/DuetNG/DuetEthernet/Wiznet/Internet/SNMP|src/DuetM|src/RADDS" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
- </sourceEntries>
- </configuration>
- </storageModule>
- <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
- </cconfiguration>
- </storageModule>
- <storageModule moduleId="cdtBuildSystem" version="4.0.0">
- <project id="RepRapFirmware.cdt.managedbuild.target.gnu.cross.exe.1494358155" name="Executable" projectType="cdt.managedbuild.target.gnu.cross.exe"/>
- </storageModule>
- <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
- <storageModule moduleId="refreshScope" versionNumber="2">
- <configuration configurationName="DuetM_RTOS"/>
- <configuration configurationName="Alligator"/>
- <configuration configurationName="SAME70"/>
- <configuration configurationName="Duet2"/>
- <configuration configurationName="RADDS"/>
- <configuration configurationName="Duet2_RTOS"/>
- <configuration configurationName="DuetM"/>
- <configuration configurationName="Duet085"/>
- </storageModule>
- <storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
- <storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
- <storageModule moduleId="scannerConfiguration">
- <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
- <scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.cross.exe.release.516195201;cdt.managedbuild.config.gnu.cross.exe.release.516195201.;cdt.managedbuild.tool.gnu.cross.cpp.compiler.1703390221;cdt.managedbuild.tool.gnu.cpp.compiler.input.111814721">
- <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"/>
- </scannerConfigBuildInfo>
- <scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.cross.exe.release.516195201;cdt.managedbuild.config.gnu.cross.exe.release.516195201.;cdt.managedbuild.tool.gnu.cross.c.compiler.220085372;cdt.managedbuild.tool.gnu.c.compiler.input.1345445195">
- <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
- </scannerConfigBuildInfo>
- </storageModule>
+
+ <storageModule moduleId="org.eclipse.cdt.core.settings">
+
+ <cconfiguration id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850">
+
+ <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850" moduleId="org.eclipse.cdt.core.settings" name="Duet085">
+
+ <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"/>
+
+ <stringMacro name="CoreName" type="VALUE_TEXT" value="CoreNG"/>
+
+ <stringMacro name="GccPath" type="VALUE_TEXT" value="/home/christian/duet/gcc-arm-none-eabi-7-2018-q2-update/bin"/>
+
+ </macros>
+
+ <externalSettings/>
+
+ <extensions>
+
+ <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+
+ <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ </extensions>
+
+ </storageModule>
+
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+
+ <configuration artifactExtension="elf" artifactName="${ProjName}" 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" name="Duet085" optionalBuildProperties="" 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." name="/" resourcePath="">
+
+ <toolChain id="cdt.managedbuild.toolchain.gnu.cross.exe.release.947353540" name="Cross GCC" superClass="cdt.managedbuild.toolchain.gnu.cross.exe.release">
+
+ <option id="cdt.managedbuild.option.gnu.cross.path.1742191832" name="Path" superClass="cdt.managedbuild.option.gnu.cross.path" useByScannerDiscovery="false" value="${GccPath}" valueType="string"/>
+
+ <option id="cdt.managedbuild.option.gnu.cross.prefix.1660769040" name="Prefix" superClass="cdt.managedbuild.option.gnu.cross.prefix" useByScannerDiscovery="false" value="arm-none-eabi-" valueType="string"/>
+
+ <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="cdt.managedbuild.targetPlatform.gnu.cross.223860525" isAbstract="false" osList="all" superClass="cdt.managedbuild.targetPlatform.gnu.cross"/>
+
+ <builder buildPath="${workspace_loc:/RepRapFirmware}/Release" id="cdt.managedbuild.builder.gnu.cross.13059261" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="cdt.managedbuild.builder.gnu.cross"/>
+
+ <tool id="cdt.managedbuild.tool.gnu.cross.assembler.163742171" name="Cross GCC Assembler" superClass="cdt.managedbuild.tool.gnu.cross.assembler">
+
+ <inputType id="cdt.managedbuild.tool.gnu.assembler.input.230262206" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+
+ </tool>
+
+ <tool commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" id="cdt.managedbuild.tool.gnu.cross.c.compiler.278237460" name="Cross GCC Compiler" superClass="cdt.managedbuild.tool.gnu.cross.c.compiler">
+
+ <option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.option.optimization.level.710346403" name="Optimization Level" superClass="gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="gnu.c.optimization.level.more" valueType="enumerated"/>
+
+ <option id="gnu.c.compiler.option.debugging.level.836865552" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.none" valueType="enumerated"/>
+
+ <option id="gnu.c.compiler.option.misc.verbose.431575256" name="Verbose (-v)" superClass="gnu.c.compiler.option.misc.verbose" useByScannerDiscovery="false" value="false" valueType="boolean"/>
+
+ <option id="gnu.c.compiler.option.misc.other.660952665" name="Other flags" superClass="gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-c -std=gnu99 -mcpu=cortex-m3 -mthumb -ffunction-sections -fdata-sections -nostdlib -Wdouble-promotion -fsingle-precision-constant &quot;-Wa,-ahl=$*.s&quot;" valueType="string"/>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.include.paths.2080437508" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/cores/arduino}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Storage}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/utils}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/cmsis/sam3x/include}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/header_files}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/preprocessor}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/thirdparty/CMSIS/Include}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/variants/duet}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Duet/Lwip}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Duet/Lwip/lwip/src/include}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Duet/EMAC}&quot;"/>
+
+ </option>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.preprocessor.def.symbols.571434619" 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="DUET_06_085"/>
+
+ </option>
+
+ <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1642892736" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
+
+ </tool>
+
+ <tool id="cdt.managedbuild.tool.gnu.cross.c.linker.831729502" name="Cross GCC Linker" superClass="cdt.managedbuild.tool.gnu.cross.c.linker"/>
+
+ <tool id="cdt.managedbuild.tool.gnu.cross.archiver.586905748" name="Cross GCC Archiver" superClass="cdt.managedbuild.tool.gnu.cross.archiver"/>
+
+ <tool command="gcc" commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${LinkFlags1} &quot;${workspace_loc:/${CoreName}/SAM3X8E/cores/arduino/syscalls.o}&quot; ${INPUTS} ${LinkFlags2}" id="cdt.managedbuild.tool.gnu.cross.cpp.linker.77650722" name="Cross G++ Linker" superClass="cdt.managedbuild.tool.gnu.cross.cpp.linker">
+
+ <option id="gnu.cpp.link.option.nostdlibs.296038599" name="No startup or default libs (-nostdlib)" superClass="gnu.cpp.link.option.nostdlibs" useByScannerDiscovery="false" value="false" valueType="boolean"/>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.link.option.paths.75045718" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths" useByScannerDiscovery="false" valueType="libPaths">
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/SAM3X8E/}&quot;"/>
+
+ </option>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.link.option.libs.1995000942" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" useByScannerDiscovery="false" valueType="libs">
+
+ <listOptionValue builtIn="false" value="${CoreName}"/>
+
+ </option>
+
+ <option id="gnu.cpp.link.option.flags.1670739910" 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/duet/linker_scripts/gcc/flash.ld} -Wl,-Map,${workspace_loc:/${ProjName}/${ConfigName}}/${BuildArtifactFileBaseName}.map" valueType="string"/>
+
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1491196930" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+
+ <additionalInput kind="additionalinput" paths="$(LIBS)"/>
+
+ </inputType>
+
+ </tool>
+
+ <tool command="g++" id="cdt.managedbuild.tool.gnu.cross.cpp.compiler.1261470824" name="Cross G++ Compiler" superClass="cdt.managedbuild.tool.gnu.cross.cpp.compiler">
+
+ <option id="gnu.cpp.compiler.option.optimization.level.1078688101" name="Optimization Level" superClass="gnu.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.more" valueType="enumerated"/>
+
+ <option id="gnu.cpp.compiler.option.debugging.level.1332396113" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.none" valueType="enumerated"/>
+
+ <option id="gnu.cpp.compiler.option.other.verbose.1151170522" name="Verbose (-v)" superClass="gnu.cpp.compiler.option.other.verbose" useByScannerDiscovery="false" value="false" valueType="boolean"/>
+
+ <option id="gnu.cpp.compiler.option.other.other.184134051" name="Other flags" superClass="gnu.cpp.compiler.option.other.other" useByScannerDiscovery="false" value="-c -std=gnu++14 -mcpu=cortex-m3 -mthumb -ffunction-sections -fdata-sections -fno-threadsafe-statics -fno-rtti -fno-exceptions -nostdlib -Wdouble-promotion -fsingle-precision-constant &quot;-Wa,-ahl=$*.s&quot;" valueType="string"/>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.compiler.option.include.paths.1285689288" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/cores/arduino}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Flash}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/SharedSpi}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Storage}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Wire}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/utils}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/services/clock}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/services/flash_efc}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/cmsis/sam3x/include}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/header_files}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/preprocessor}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/thirdparty/CMSIS/Include}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/variants/duet}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Duet}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Duet/Lwip}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Duet/EMAC}&quot;"/>
+
+ </option>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.compiler.option.preprocessor.def.1548770846" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">
+
+ <listOptionValue builtIn="false" value="__SAM3X8E__"/>
+
+ <listOptionValue builtIn="false" value="DUET_06_085"/>
+
+ <listOptionValue builtIn="false" value="_XOPEN_SOURCE"/>
+
+ </option>
+
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.948285998" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
+
+ </tool>
+
+ </toolChain>
+
+ </folderInfo>
+
+ <sourceEntries>
+
+ <entry excluding="src/Pccb|src/Alligator|src/Duet/Lwip/lwip/src/core/ipv6|src/Duet/Lwip/lwip/test|src/SAME70_TEST|src/Display|src/Networking|src/DuetNG|src/DuetM|src/RADDS" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
+
+ </sourceEntries>
+
+ </configuration>
+
+ </storageModule>
+
+ <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">
+
+ <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"/>
+
+ <stringMacro name="CoreName" type="VALUE_TEXT" value="CoreNG"/>
+
+ <stringMacro name="GccPath" type="VALUE_TEXT" value="/home/christian/duet/gcc-arm-none-eabi-7-2018-q2-update/bin"/>
+
+ </macros>
+
+ <externalSettings/>
+
+ <extensions>
+
+ <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+
+ <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ </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" optionalBuildProperties="" 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"/>
+
+ <option id="cdt.managedbuild.option.gnu.cross.prefix.1606498191" name="Prefix" superClass="cdt.managedbuild.option.gnu.cross.prefix" useByScannerDiscovery="false" value="arm-none-eabi-" valueType="string"/>
+
+ <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="cdt.managedbuild.targetPlatform.gnu.cross.342355349" isAbstract="false" osList="all" superClass="cdt.managedbuild.targetPlatform.gnu.cross"/>
+
+ <builder buildPath="${workspace_loc:/RepRapFirmware}/Release" id="cdt.managedbuild.builder.gnu.cross.1336978387" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="cdt.managedbuild.builder.gnu.cross"/>
+
+ <tool id="cdt.managedbuild.tool.gnu.cross.assembler.863511428" name="Cross GCC Assembler" superClass="cdt.managedbuild.tool.gnu.cross.assembler">
+
+ <inputType id="cdt.managedbuild.tool.gnu.assembler.input.664007272" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+
+ </tool>
+
+ <tool commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" id="cdt.managedbuild.tool.gnu.cross.c.compiler.764246283" name="Cross GCC Compiler" superClass="cdt.managedbuild.tool.gnu.cross.c.compiler">
+
+ <option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.option.optimization.level.1125289372" name="Optimization Level" superClass="gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="gnu.c.optimization.level.more" valueType="enumerated"/>
+
+ <option id="gnu.c.compiler.option.debugging.level.807229803" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.none" valueType="enumerated"/>
+
+ <option id="gnu.c.compiler.option.misc.verbose.1747279976" name="Verbose (-v)" superClass="gnu.c.compiler.option.misc.verbose" useByScannerDiscovery="false" value="false" valueType="boolean"/>
+
+ <option id="gnu.c.compiler.option.misc.other.1771169870" name="Other flags" superClass="gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-c -std=gnu99 -mcpu=cortex-m3 -mthumb -ffunction-sections -fdata-sections -nostdlib -Wdouble-promotion -fsingle-precision-constant &quot;-Wa,-ahl=$*.s&quot;" valueType="string"/>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.include.paths.425316569" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/cores/arduino}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Storage}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/utils}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/cmsis/sam3x/include}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/header_files}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/preprocessor}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/thirdparty/CMSIS/Include}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/variants/RADDS}&quot;"/>
+
+ </option>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" 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__"/>
+
+ </option>
+
+ <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.110609707" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
+
+ </tool>
+
+ <tool id="cdt.managedbuild.tool.gnu.cross.c.linker.1692168928" name="Cross GCC Linker" superClass="cdt.managedbuild.tool.gnu.cross.c.linker"/>
+
+ <tool id="cdt.managedbuild.tool.gnu.cross.archiver.1755453550" name="Cross GCC Archiver" superClass="cdt.managedbuild.tool.gnu.cross.archiver"/>
+
+ <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 IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" 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;"/>
+
+ </option>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" 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}"/>
+
+ </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">
+
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+
+ <additionalInput kind="additionalinput" paths="$(LIBS)"/>
+
+ </inputType>
+
+ </tool>
+
+ <tool command="g++" id="cdt.managedbuild.tool.gnu.cross.cpp.compiler.2077096750" name="Cross G++ Compiler" superClass="cdt.managedbuild.tool.gnu.cross.cpp.compiler">
+
+ <option id="gnu.cpp.compiler.option.optimization.level.25432549" name="Optimization Level" superClass="gnu.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.more" valueType="enumerated"/>
+
+ <option id="gnu.cpp.compiler.option.debugging.level.1920128035" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.none" valueType="enumerated"/>
+
+ <option id="gnu.cpp.compiler.option.other.verbose.1825237573" name="Verbose (-v)" superClass="gnu.cpp.compiler.option.other.verbose" useByScannerDiscovery="false" value="false" valueType="boolean"/>
+
+ <option id="gnu.cpp.compiler.option.other.other.165959132" name="Other flags" superClass="gnu.cpp.compiler.option.other.other" useByScannerDiscovery="false" value="-c -std=gnu++14 -mcpu=cortex-m3 -mthumb -ffunction-sections -fdata-sections -fno-threadsafe-statics -fno-rtti -fno-exceptions -nostdlib -Wdouble-promotion -fsingle-precision-constant &quot;-Wa,-ahl=$*.s&quot;" valueType="string"/>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.compiler.option.include.paths.603435221" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/cores/arduino}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Flash}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/SharedSpi}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Storage}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Wire}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/utils}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/services/clock}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/services/flash_efc}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/cmsis/sam3x/include}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/header_files}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/preprocessor}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/thirdparty/CMSIS/Include}&quot;"/>
+
+ <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;"/>
+
+ </option>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" 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="_XOPEN_SOURCE"/>
+
+ </option>
+
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.1578939493" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
+
+ </tool>
+
+ </toolChain>
+
+ </folderInfo>
+
+ <sourceEntries>
+
+ <entry excluding="src/Pccb|src/Alligator|src/SAME70_TEST|src/Display|src/Duet|src/Networking|src/DuetNG|src/DuetM" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
+
+ </sourceEntries>
+
+ </configuration>
+
+ </storageModule>
+
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+
+ </cconfiguration>
+
+ <cconfiguration id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.1745168887">
+
+ <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.1745168887" moduleId="org.eclipse.cdt.core.settings" name="Alligator">
+
+ <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"/>
+
+ <stringMacro name="CoreName" type="VALUE_TEXT" value="CoreNG"/>
+
+ <stringMacro name="GccPath" type="VALUE_TEXT" value="/home/christian/duet/gcc-arm-none-eabi-7-2018-q2-update/bin"/>
+
+ </macros>
+
+ <externalSettings/>
+
+ <extensions>
+
+ <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+
+ <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ </extensions>
+
+ </storageModule>
+
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+
+ <configuration artifactExtension="elf" artifactName="${ProjName}-Alligator" 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.1745168887" name="Alligator" optionalBuildProperties="org.eclipse.cdt.docker.launcher.containerbuild.property.selectedvolumes=,org.eclipse.cdt.docker.launcher.containerbuild.property.volumes=" 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.1745168887." name="/" resourcePath="">
+
+ <toolChain id="cdt.managedbuild.toolchain.gnu.cross.exe.release.623324432" name="Cross GCC" superClass="cdt.managedbuild.toolchain.gnu.cross.exe.release">
+
+ <option id="cdt.managedbuild.option.gnu.cross.path.645044151" name="Path" superClass="cdt.managedbuild.option.gnu.cross.path" useByScannerDiscovery="false" value="${GccPath}" valueType="string"/>
+
+ <option id="cdt.managedbuild.option.gnu.cross.prefix.629438941" name="Prefix" superClass="cdt.managedbuild.option.gnu.cross.prefix" useByScannerDiscovery="false" value="arm-none-eabi-" valueType="string"/>
+
+ <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="cdt.managedbuild.targetPlatform.gnu.cross.878309876" isAbstract="false" osList="all" superClass="cdt.managedbuild.targetPlatform.gnu.cross"/>
+
+ <builder buildPath="${workspace_loc:/RepRapFirmware}/Release" id="cdt.managedbuild.builder.gnu.cross.56178753" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="cdt.managedbuild.builder.gnu.cross"/>
+
+ <tool id="cdt.managedbuild.tool.gnu.cross.assembler.384615201" name="Cross GCC Assembler" superClass="cdt.managedbuild.tool.gnu.cross.assembler">
+
+ <inputType id="cdt.managedbuild.tool.gnu.assembler.input.1769413014" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+
+ </tool>
+
+ <tool commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" id="cdt.managedbuild.tool.gnu.cross.c.compiler.429394189" name="Cross GCC Compiler" superClass="cdt.managedbuild.tool.gnu.cross.c.compiler">
+
+ <option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.option.optimization.level.1940178744" name="Optimization Level" superClass="gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="gnu.c.optimization.level.more" valueType="enumerated"/>
+
+ <option id="gnu.c.compiler.option.debugging.level.1345702698" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.none" valueType="enumerated"/>
+
+ <option id="gnu.c.compiler.option.misc.verbose.1965295612" name="Verbose (-v)" superClass="gnu.c.compiler.option.misc.verbose" useByScannerDiscovery="false" value="false" valueType="boolean"/>
+
+ <option id="gnu.c.compiler.option.misc.other.2089676962" name="Other flags" superClass="gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-c -std=gnu99 -mcpu=cortex-m3 -mthumb -ffunction-sections -fdata-sections -nostdlib -Wdouble-promotion -fsingle-precision-constant &quot;-Wa,-ahl=$*.s&quot;" valueType="string"/>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.include.paths.1071791609" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/cores/arduino}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Storage}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/utils}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/cmsis/sam3x/include}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/header_files}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/preprocessor}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/thirdparty/CMSIS/Include}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/variants/alligator}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Duet/Lwip}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Duet/Lwip/lwip/src/include}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Duet/EMAC}&quot;"/>
+
+ </option>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.preprocessor.def.symbols.680004295" 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="__ALLIGATOR__"/>
+
+ </option>
+
+ <option id="gnu.c.compiler.option.dialect.std.1020546177" name="Language standard" superClass="gnu.c.compiler.option.dialect.std" useByScannerDiscovery="true" value="gnu.c.compiler.dialect.default" valueType="enumerated"/>
+
+ <option id="gnu.c.compiler.option.include.files.1091766282" name="Include files (-include)" superClass="gnu.c.compiler.option.include.files" useByScannerDiscovery="false"/>
+
+ <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1737201945" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
+
+ </tool>
+
+ <tool id="cdt.managedbuild.tool.gnu.cross.c.linker.1510685625" name="Cross GCC Linker" superClass="cdt.managedbuild.tool.gnu.cross.c.linker"/>
+
+ <tool id="cdt.managedbuild.tool.gnu.cross.archiver.2031955379" name="Cross GCC Archiver" superClass="cdt.managedbuild.tool.gnu.cross.archiver"/>
+
+ <tool command="gcc" commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${LinkFlags1} &quot;${workspace_loc:/${CoreName}/Alligator/cores/arduino/syscalls.o}&quot; ${INPUTS} ${LinkFlags2}" id="cdt.managedbuild.tool.gnu.cross.cpp.linker.1616069436" name="Cross G++ Linker" superClass="cdt.managedbuild.tool.gnu.cross.cpp.linker">
+
+ <option id="gnu.cpp.link.option.nostdlibs.760089516" name="No startup or default libs (-nostdlib)" superClass="gnu.cpp.link.option.nostdlibs" useByScannerDiscovery="false" value="false" valueType="boolean"/>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.link.option.paths.1593340130" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths" useByScannerDiscovery="false" valueType="libPaths">
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/Alligator/}&quot;"/>
+
+ </option>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.link.option.libs.1260510068" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" useByScannerDiscovery="false" valueType="libs">
+
+ <listOptionValue builtIn="false" value="${CoreName}"/>
+
+ </option>
+
+ <option id="gnu.cpp.link.option.flags.1376831701" 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/alligator/linker_scripts/gcc/flash.ld} -Wl,-Map,${workspace_loc:/${ProjName}/${ConfigName}}/${BuildArtifactFileBaseName}.map" valueType="string"/>
+
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1951368129" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+
+ <additionalInput kind="additionalinput" paths="$(LIBS)"/>
+
+ </inputType>
+
+ </tool>
+
+ <tool command="g++" id="cdt.managedbuild.tool.gnu.cross.cpp.compiler.1533537470" name="Cross G++ Compiler" superClass="cdt.managedbuild.tool.gnu.cross.cpp.compiler">
+
+ <option id="gnu.cpp.compiler.option.optimization.level.1431609218" name="Optimization Level" superClass="gnu.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.more" valueType="enumerated"/>
+
+ <option id="gnu.cpp.compiler.option.debugging.level.1167774913" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.none" valueType="enumerated"/>
+
+ <option id="gnu.cpp.compiler.option.other.verbose.68487747" name="Verbose (-v)" superClass="gnu.cpp.compiler.option.other.verbose" useByScannerDiscovery="false" value="false" valueType="boolean"/>
+
+ <option id="gnu.cpp.compiler.option.other.other.1532821901" name="Other flags" superClass="gnu.cpp.compiler.option.other.other" useByScannerDiscovery="false" value="-c -std=gnu++14 -mcpu=cortex-m3 -mthumb -ffunction-sections -fdata-sections -fno-threadsafe-statics -fno-rtti -fno-exceptions -nostdlib -Wdouble-promotion -fsingle-precision-constant &quot;-Wa,-ahl=$*.s&quot;" valueType="string"/>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.compiler.option.include.paths.1825159078" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/cores/arduino}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Flash}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/SharedSpi}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Storage}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Wire}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/utils}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/services/clock}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/services/flash_efc}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/cmsis/sam3x/include}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/header_files}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/preprocessor}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/thirdparty/CMSIS/Include}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/variants/alligator}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Alligator}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Duet}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Duet/Lwip}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Duet/EMAC}&quot;"/>
+
+ </option>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.compiler.option.preprocessor.def.890621467" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">
+
+ <listOptionValue builtIn="false" value="__SAM3X8E__"/>
+
+ <listOptionValue builtIn="false" value="__ALLIGATOR__"/>
+
+ <listOptionValue builtIn="false" value="_XOPEN_SOURCE"/>
+
+ </option>
+
+ <option id="gnu.cpp.compiler.option.preprocessor.undef.913409309" name="Undefined symbols (-U)" superClass="gnu.cpp.compiler.option.preprocessor.undef" useByScannerDiscovery="false"/>
+
+ <option id="gnu.cpp.compiler.option.dialect.std.603621474" name="Language standard" superClass="gnu.cpp.compiler.option.dialect.std" useByScannerDiscovery="true" value="gnu.cpp.compiler.dialect.default" valueType="enumerated"/>
+
+ <option id="gnu.cpp.compiler.option.include.files.1575937801" name="Include files (-include)" superClass="gnu.cpp.compiler.option.include.files" useByScannerDiscovery="false"/>
+
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.667323948" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
+
+ </tool>
+
+ </toolChain>
+
+ </folderInfo>
+
+ <sourceEntries>
+
+ <entry excluding="src/Pccb|src/Duet/Lwip/lwip/src/core/ipv6|src/Duet/Lwip/lwip/test|src/SAME70_TEST|src/Display|src/Networking|src/DuetNG|src/Alligator/Lwip/lwip/src/include/ipv6|src/Alligator/Lwip/lwip/test|src/DuetM|src/Duet/MCP4461|src/Alligator/Lwip/lwip/src/core/ipv6|src/RADDS" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
+
+ </sourceEntries>
+
+ </configuration>
+
+ </storageModule>
+
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+
+ </cconfiguration>
+
+ <cconfiguration id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.241502451.170574622">
+
+ <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.241502451.170574622" moduleId="org.eclipse.cdt.core.settings" name="Duet2_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"/>
+
+ <stringMacro name="CoreName" type="VALUE_TEXT" value="CoreNG"/>
+
+ <stringMacro name="GccPath" type="VALUE_TEXT" value="/home/christian/duet/gcc-arm-none-eabi-7-2018-q2-update/bin"/>
+
+ </macros>
+
+ <externalSettings/>
+
+ <extensions>
+
+ <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+
+ <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ </extensions>
+
+ </storageModule>
+
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+
+ <configuration artifactExtension="elf" artifactName="Duet2CombinedFirmware" 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.241502451.170574622" name="Duet2_RTOS" optionalBuildProperties="" 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.241502451.170574622." name="/" resourcePath="">
+
+ <toolChain id="cdt.managedbuild.toolchain.gnu.cross.exe.release.435431950" name="Cross GCC" superClass="cdt.managedbuild.toolchain.gnu.cross.exe.release">
+
+ <option id="cdt.managedbuild.option.gnu.cross.path.1881231799" name="Path" superClass="cdt.managedbuild.option.gnu.cross.path" useByScannerDiscovery="false" value="${GccPath}" valueType="string"/>
+
+ <option id="cdt.managedbuild.option.gnu.cross.prefix.172065168" name="Prefix" superClass="cdt.managedbuild.option.gnu.cross.prefix" useByScannerDiscovery="false" value="arm-none-eabi-" valueType="string"/>
+
+ <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="cdt.managedbuild.targetPlatform.gnu.cross.1838379384" isAbstract="false" osList="all" superClass="cdt.managedbuild.targetPlatform.gnu.cross"/>
+
+ <builder buildPath="${workspace_loc:/RepRapFirmware}/Release" id="cdt.managedbuild.builder.gnu.cross.591414239" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="cdt.managedbuild.builder.gnu.cross"/>
+
+ <tool id="cdt.managedbuild.tool.gnu.cross.assembler.1539163958" name="Cross GCC Assembler" superClass="cdt.managedbuild.tool.gnu.cross.assembler">
+
+ <inputType id="cdt.managedbuild.tool.gnu.assembler.input.1036697395" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+
+ </tool>
+
+ <tool commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" id="cdt.managedbuild.tool.gnu.cross.c.compiler.463703707" name="Cross GCC Compiler" superClass="cdt.managedbuild.tool.gnu.cross.c.compiler">
+
+ <option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.option.optimization.level.456685708" name="Optimization Level" superClass="gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="gnu.c.optimization.level.more" valueType="enumerated"/>
+
+ <option id="gnu.c.compiler.option.debugging.level.1579494397" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.none" valueType="enumerated"/>
+
+ <option id="gnu.c.compiler.option.misc.verbose.328543251" name="Verbose (-v)" superClass="gnu.c.compiler.option.misc.verbose" useByScannerDiscovery="false" value="false" valueType="boolean"/>
+
+ <option id="gnu.c.compiler.option.misc.other.465279131" name="Other flags" superClass="gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-c -std=gnu99 -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections -nostdlib -Wdouble-promotion -fsingle-precision-constant &quot;-Wa,-ahl=$*.s&quot;" valueType="string"/>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.include.paths.288982451" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/cores/arduino}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Storage}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/utils}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/services/ioport}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/cmsis/sam4e/include}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/header_files}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/preprocessor}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/thirdparty/CMSIS/Include}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/variants/duetNG}&quot;"/>
+
+ </option>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.preprocessor.def.symbols.1227675538" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
+
+ <listOptionValue builtIn="false" value="__SAM4E8E__"/>
+
+ <listOptionValue builtIn="false" value="RTOS"/>
+
+ <listOptionValue builtIn="false" value="DUET_NG"/>
+
+ </option>
+
+ <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1065384487" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
+
+ </tool>
+
+ <tool id="cdt.managedbuild.tool.gnu.cross.c.linker.1102044150" name="Cross GCC Linker" superClass="cdt.managedbuild.tool.gnu.cross.c.linker"/>
+
+ <tool id="cdt.managedbuild.tool.gnu.cross.archiver.1402882499" name="Cross GCC Archiver" superClass="cdt.managedbuild.tool.gnu.cross.archiver"/>
+
+ <tool command="gcc" commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${LinkFlags1} &quot;${workspace_loc:/${CoreName}/SAM4E8E_RTOS/cores/arduino/syscalls.o}&quot; ${INPUTS} ${LinkFlags2}" id="cdt.managedbuild.tool.gnu.cross.cpp.linker.1768134875" name="Cross G++ Linker" superClass="cdt.managedbuild.tool.gnu.cross.cpp.linker">
+
+ <option id="gnu.cpp.link.option.nostdlibs.399544265" name="No startup or default libs (-nostdlib)" superClass="gnu.cpp.link.option.nostdlibs" useByScannerDiscovery="false" value="false" valueType="boolean"/>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.link.option.paths.605414111" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths" useByScannerDiscovery="false" valueType="libPaths">
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/SAM4E8E_RTOS/}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/FreeRTOS/SAM4E}&quot;"/>
+
+ </option>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.link.option.libs.847860449" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" useByScannerDiscovery="false" valueType="libs">
+
+ <listOptionValue builtIn="false" value="${CoreName}"/>
+
+ <listOptionValue builtIn="false" value="FreeRTOS"/>
+
+ </option>
+
+ <option id="gnu.cpp.link.option.flags.161856294" name="Linker flags" superClass="gnu.cpp.link.option.flags" useByScannerDiscovery="false" value="-Os --specs=nano.specs -Wl,--gc-sections -Wl,--fatal-warnings -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -T${workspace_loc:/${CoreName}/variants/duetNG/linker_scripts/gcc/flash.ld} -Wl,-Map,${workspace_loc:/${ProjName}/${ConfigName}}/${BuildArtifactFileBaseName}.map" valueType="string"/>
+
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1270956612" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+
+ <additionalInput kind="additionalinput" paths="$(LIBS)"/>
+
+ </inputType>
+
+ </tool>
+
+ <tool command="g++" id="cdt.managedbuild.tool.gnu.cross.cpp.compiler.1697970502" name="Cross G++ Compiler" superClass="cdt.managedbuild.tool.gnu.cross.cpp.compiler">
+
+ <option id="gnu.cpp.compiler.option.optimization.level.1835678360" name="Optimization Level" superClass="gnu.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.more" valueType="enumerated"/>
+
+ <option id="gnu.cpp.compiler.option.debugging.level.737051102" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.none" valueType="enumerated"/>
+
+ <option id="gnu.cpp.compiler.option.other.verbose.1225557122" name="Verbose (-v)" superClass="gnu.cpp.compiler.option.other.verbose" useByScannerDiscovery="false" value="false" valueType="boolean"/>
+
+ <option id="gnu.cpp.compiler.option.other.other.1423466590" name="Other flags" superClass="gnu.cpp.compiler.option.other.other" useByScannerDiscovery="false" value="-c -std=gnu++14 -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections -fno-threadsafe-statics -fno-rtti -fno-exceptions -nostdlib -Wdouble-promotion -fsingle-precision-constant &quot;-Wa,-ahl=$*.s&quot;" valueType="string"/>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.compiler.option.include.paths.1505018967" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/cores/arduino}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Flash}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/SharedSpi}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Storage}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Wire}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/utils}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/services/clock}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/services/ioport}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/services/flash_efc}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/cmsis/sam4e/include}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/header_files}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/preprocessor}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/thirdparty/CMSIS/Include}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/variants/duetNG}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/DuetNG}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Networking}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/DuetWiFiSocketServer/src/include}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/FreeRTOS/src/include}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/FreeRTOS/src/portable/GCC/ARM_CM4F}&quot;"/>
+
+ </option>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.compiler.option.preprocessor.def.1443248224" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">
+
+ <listOptionValue builtIn="false" value="__SAM4E8E__"/>
+
+ <listOptionValue builtIn="false" value="RTOS"/>
+
+ <listOptionValue builtIn="false" value="DUET_NG"/>
+
+ <listOptionValue builtIn="false" value="_XOPEN_SOURCE"/>
+
+ </option>
+
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.65828751" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
+
+ </tool>
+
+ </toolChain>
+
+ </folderInfo>
+
+ <sourceEntries>
+
+ <entry excluding="src/Pccb|src/Alligator|src/SAME70_TEST|src/Display|src/Duet|src/Networking/LwipEthernet|src/DuetM|src/RADDS" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
+
+ </sourceEntries>
+
+ </configuration>
+
+ </storageModule>
+
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+
+ </cconfiguration>
+
+ <cconfiguration id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.241502451.170574622.649587786">
+
+ <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.241502451.170574622.649587786" moduleId="org.eclipse.cdt.core.settings" name="DuetM_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"/>
+
+ <stringMacro name="CoreName" type="VALUE_TEXT" value="CoreNG"/>
+
+ <stringMacro name="GccPath" type="VALUE_TEXT" value="/home/christian/duet/gcc-arm-none-eabi-7-2018-q2-update/bin"/>
+
+ </macros>
+
+ <externalSettings/>
+
+ <extensions>
+
+ <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+
+ <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ </extensions>
+
+ </storageModule>
+
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+
+ <configuration artifactExtension="elf" artifactName="DuetMaestroFirmware" 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.241502451.170574622.649587786" name="DuetM_RTOS" optionalBuildProperties="" 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.241502451.170574622.649587786." name="/" resourcePath="">
+
+ <toolChain id="cdt.managedbuild.toolchain.gnu.cross.exe.release.1494327638" name="Cross GCC" superClass="cdt.managedbuild.toolchain.gnu.cross.exe.release">
+
+ <option id="cdt.managedbuild.option.gnu.cross.path.1101985181" name="Path" superClass="cdt.managedbuild.option.gnu.cross.path" useByScannerDiscovery="false" value="${GccPath}" valueType="string"/>
+
+ <option id="cdt.managedbuild.option.gnu.cross.prefix.455634880" name="Prefix" superClass="cdt.managedbuild.option.gnu.cross.prefix" useByScannerDiscovery="false" value="arm-none-eabi-" valueType="string"/>
+
+ <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="cdt.managedbuild.targetPlatform.gnu.cross.1648156947" isAbstract="false" osList="all" superClass="cdt.managedbuild.targetPlatform.gnu.cross"/>
+
+ <builder buildPath="${workspace_loc:/RepRapFirmware}/Release" id="cdt.managedbuild.builder.gnu.cross.1787405692" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="cdt.managedbuild.builder.gnu.cross"/>
+
+ <tool id="cdt.managedbuild.tool.gnu.cross.assembler.1187253546" name="Cross GCC Assembler" superClass="cdt.managedbuild.tool.gnu.cross.assembler">
+
+ <inputType id="cdt.managedbuild.tool.gnu.assembler.input.456980885" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+
+ </tool>
+
+ <tool commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" id="cdt.managedbuild.tool.gnu.cross.c.compiler.1037043643" name="Cross GCC Compiler" superClass="cdt.managedbuild.tool.gnu.cross.c.compiler">
+
+ <option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.option.optimization.level.293020747" name="Optimization Level" superClass="gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="gnu.c.optimization.level.more" valueType="enumerated"/>
+
+ <option id="gnu.c.compiler.option.debugging.level.1647722987" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.none" valueType="enumerated"/>
+
+ <option id="gnu.c.compiler.option.misc.verbose.412653021" name="Verbose (-v)" superClass="gnu.c.compiler.option.misc.verbose" useByScannerDiscovery="false" value="false" valueType="boolean"/>
+
+ <option id="gnu.c.compiler.option.misc.other.1084863157" name="Other flags" superClass="gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-c -std=gnu99 -mcpu=cortex-m4 -mthumb -ffunction-sections -fdata-sections -nostdlib -Wdouble-promotion -fsingle-precision-constant &quot;-Wa,-ahl=$*.s&quot;" valueType="string"/>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.include.paths.275997920" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/cores/arduino}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Storage}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/utils}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/services/ioport}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/cmsis/sam4s/include}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/header_files}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/preprocessor}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/thirdparty/CMSIS/Include}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/variants/sam4s}&quot;"/>
+
+ </option>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.preprocessor.def.symbols.833298868" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
+
+ <listOptionValue builtIn="false" value="__SAM4S8C__"/>
+
+ <listOptionValue builtIn="false" value="RTOS"/>
+
+ <listOptionValue builtIn="false" value="DUET_M"/>
+
+ </option>
+
+ <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.667707888" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
+
+ </tool>
+
+ <tool id="cdt.managedbuild.tool.gnu.cross.c.linker.411798791" name="Cross GCC Linker" superClass="cdt.managedbuild.tool.gnu.cross.c.linker"/>
+
+ <tool id="cdt.managedbuild.tool.gnu.cross.archiver.2116733751" name="Cross GCC Archiver" superClass="cdt.managedbuild.tool.gnu.cross.archiver"/>
+
+ <tool command="gcc" commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${LinkFlags1} &quot;${workspace_loc:/${CoreName}/SAM4S_RTOS/cores/arduino/syscalls.o}&quot; ${INPUTS} ${LinkFlags2}" id="cdt.managedbuild.tool.gnu.cross.cpp.linker.1011842834" name="Cross G++ Linker" superClass="cdt.managedbuild.tool.gnu.cross.cpp.linker">
+
+ <option id="gnu.cpp.link.option.nostdlibs.91014132" name="No startup or default libs (-nostdlib)" superClass="gnu.cpp.link.option.nostdlibs" useByScannerDiscovery="false" value="false" valueType="boolean"/>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.link.option.paths.2085138159" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths" useByScannerDiscovery="false" valueType="libPaths">
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/SAM4S_RTOS/}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/FreeRTOS/SAM4S}&quot;"/>
+
+ </option>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.link.option.libs.214117190" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" useByScannerDiscovery="false" valueType="libs">
+
+ <listOptionValue builtIn="false" value="${CoreName}"/>
+
+ <listOptionValue builtIn="false" value="FreeRTOS"/>
+
+ </option>
+
+ <option id="gnu.cpp.link.option.flags.1077151865" name="Linker flags" superClass="gnu.cpp.link.option.flags" useByScannerDiscovery="false" value="-Os --specs=nano.specs -Wl,--gc-sections -Wl,--fatal-warnings -mcpu=cortex-m4 -T${workspace_loc:/${CoreName}/variants/sam4s/linker_scripts/gcc/flash.ld} -Wl,-Map,${workspace_loc:/${ProjName}/${ConfigName}}/${BuildArtifactFileBaseName}.map" valueType="string"/>
+
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.480654714" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+
+ <additionalInput kind="additionalinput" paths="$(LIBS)"/>
+
+ </inputType>
+
+ </tool>
+
+ <tool command="g++" id="cdt.managedbuild.tool.gnu.cross.cpp.compiler.1849650984" name="Cross G++ Compiler" superClass="cdt.managedbuild.tool.gnu.cross.cpp.compiler">
+
+ <option id="gnu.cpp.compiler.option.optimization.level.1017091230" name="Optimization Level" superClass="gnu.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.more" valueType="enumerated"/>
+
+ <option id="gnu.cpp.compiler.option.debugging.level.326047343" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.none" valueType="enumerated"/>
+
+ <option id="gnu.cpp.compiler.option.other.verbose.1316817271" name="Verbose (-v)" superClass="gnu.cpp.compiler.option.other.verbose" useByScannerDiscovery="false" value="false" valueType="boolean"/>
+
+ <option id="gnu.cpp.compiler.option.other.other.434744183" name="Other flags" superClass="gnu.cpp.compiler.option.other.other" useByScannerDiscovery="false" value="-c -std=gnu++14 -mcpu=cortex-m4 -mthumb -ffunction-sections -fdata-sections -fno-threadsafe-statics -fno-rtti -fno-exceptions -nostdlib -Wdouble-promotion -fsingle-precision-constant &quot;-Wa,-ahl=$*.s&quot;" valueType="string"/>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.compiler.option.include.paths.1102345734" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/cores/arduino}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Flash}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/SharedSpi}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Storage}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Wire}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/utils}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/services/clock}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/services/ioport}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/services/flash_efc}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/cmsis/sam4s/include}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/header_files}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/preprocessor}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/thirdparty/CMSIS/Include}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/variants/sam4s}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/DuetM}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Networking}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/DuetWiFiSocketServer/src/include}&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;"/>
+
+ </option>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.compiler.option.preprocessor.def.1832014133" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">
+
+ <listOptionValue builtIn="false" value="__SAM4S8C__"/>
+
+ <listOptionValue builtIn="false" value="RTOS"/>
+
+ <listOptionValue builtIn="false" value="DUET_M"/>
+
+ <listOptionValue builtIn="false" value="_XOPEN_SOURCE"/>
+
+ </option>
+
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.1979789995" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
+
+ </tool>
+
+ </toolChain>
+
+ </folderInfo>
+
+ <sourceEntries>
+
+ <entry excluding="src/Pccb|src/Alligator|src/SAME70_TEST|src/Duet|src/Networking/ESP8266WiFi|src/Networking/LwipEthernet|src/DuetNG|src/RADDS" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
+
+ </sourceEntries>
+
+ </configuration>
+
+ </storageModule>
+
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+
+ </cconfiguration>
+
+ <cconfiguration id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.241502451.1275216290.274082366.1645191116.1852610203">
+
+ <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.241502451.1275216290.274082366.1645191116.1852610203" moduleId="org.eclipse.cdt.core.settings" name="SAME70_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"/>
+
+ <stringMacro name="CoreName" type="VALUE_TEXT" value="CoreNG"/>
+
+ <stringMacro name="GccPath" type="VALUE_TEXT" value="/home/christian/duet/gcc-arm-none-eabi-7-2018-q2-update/bin"/>
+
+ </macros>
+
+ <externalSettings/>
+
+ <extensions>
+
+ <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+
+ <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ </extensions>
+
+ </storageModule>
+
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+
+ <configuration artifactExtension="elf" artifactName="SAME70Firmware" 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.241502451.1275216290.274082366.1645191116.1852610203" name="SAME70_RTOS" optionalBuildProperties="org.eclipse.cdt.docker.launcher.containerbuild.property.volumes=,org.eclipse.cdt.docker.launcher.containerbuild.property.selectedvolumes=" 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.241502451.1275216290.274082366.1645191116.1852610203." name="/" resourcePath="">
+
+ <toolChain id="cdt.managedbuild.toolchain.gnu.cross.exe.release.5959303" name="Cross GCC" superClass="cdt.managedbuild.toolchain.gnu.cross.exe.release">
+
+ <option id="cdt.managedbuild.option.gnu.cross.path.163568524" name="Path" superClass="cdt.managedbuild.option.gnu.cross.path" useByScannerDiscovery="false" value="${GccPath}" valueType="string"/>
+
+ <option id="cdt.managedbuild.option.gnu.cross.prefix.308380201" name="Prefix" superClass="cdt.managedbuild.option.gnu.cross.prefix" useByScannerDiscovery="false" value="arm-none-eabi-" valueType="string"/>
+
+ <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="cdt.managedbuild.targetPlatform.gnu.cross.1827418537" isAbstract="false" osList="all" superClass="cdt.managedbuild.targetPlatform.gnu.cross"/>
+
+ <builder buildPath="${workspace_loc:/RepRapFirmware}/Release" id="cdt.managedbuild.builder.gnu.cross.1828958094" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="cdt.managedbuild.builder.gnu.cross"/>
+
+ <tool id="cdt.managedbuild.tool.gnu.cross.assembler.254554862" name="Cross GCC Assembler" superClass="cdt.managedbuild.tool.gnu.cross.assembler">
+
+ <inputType id="cdt.managedbuild.tool.gnu.assembler.input.1960931313" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+
+ </tool>
+
+ <tool commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" id="cdt.managedbuild.tool.gnu.cross.c.compiler.1113168108" name="Cross GCC Compiler" superClass="cdt.managedbuild.tool.gnu.cross.c.compiler">
+
+ <option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.option.optimization.level.1099089925" name="Optimization Level" superClass="gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="gnu.c.optimization.level.more" valueType="enumerated"/>
+
+ <option id="gnu.c.compiler.option.debugging.level.2018591546" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.default" valueType="enumerated"/>
+
+ <option id="gnu.c.compiler.option.misc.verbose.1767118602" name="Verbose (-v)" superClass="gnu.c.compiler.option.misc.verbose" useByScannerDiscovery="false" value="false" valueType="boolean"/>
+
+ <option id="gnu.c.compiler.option.misc.other.2139236731" name="Other flags" superClass="gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-c -std=gnu99 -mcpu=cortex-m7 -mthumb -mfpu=fpv5-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections -nostdlib -Wdouble-promotion -fsingle-precision-constant" valueType="string"/>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.include.paths.1736169055" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/cores/arduino}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Storage}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/utils}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/services/clock}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/services/ioport}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/components/ethernet_phy/ksz8081rna}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers/hsmci}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers/gmac}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers/pmc}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers/rstc}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers/rtc}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/cmsis/same70/include}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/header_files}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/preprocessor}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/thirdparty/CMSIS/Include}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/variants/same70}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/SAME70_TEST}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Networking/LwipEthernet}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Networking/LwipEthernet/Lwip/src/include}&quot;"/>
+
+ </option>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.preprocessor.def.symbols.316510289" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
+
+ <listOptionValue builtIn="false" value="__SAME70Q21__"/>
+
+ <listOptionValue builtIn="false" value="RTOS"/>
+
+ <listOptionValue builtIn="false" value="SAME70_TEST_BOARD"/>
+
+ </option>
+
+ <option id="gnu.c.compiler.option.dialect.std.133148413" name="Language standard" superClass="gnu.c.compiler.option.dialect.std" useByScannerDiscovery="true" value="gnu.c.compiler.dialect.default" valueType="enumerated"/>
+
+ <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.477491021" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
+
+ </tool>
+
+ <tool id="cdt.managedbuild.tool.gnu.cross.c.linker.1392905935" name="Cross GCC Linker" superClass="cdt.managedbuild.tool.gnu.cross.c.linker"/>
+
+ <tool id="cdt.managedbuild.tool.gnu.cross.archiver.733829747" name="Cross GCC Archiver" superClass="cdt.managedbuild.tool.gnu.cross.archiver"/>
+
+ <tool command="gcc" commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${LinkFlags1} &quot;${workspace_loc:/${CoreName}/SAME70_RTOS/cores/arduino/syscalls.o}&quot; ${INPUTS} ${LinkFlags2}" id="cdt.managedbuild.tool.gnu.cross.cpp.linker.1019421301" name="Cross G++ Linker" superClass="cdt.managedbuild.tool.gnu.cross.cpp.linker">
+
+ <option id="gnu.cpp.link.option.nostdlibs.1609488418" name="No startup or default libs (-nostdlib)" superClass="gnu.cpp.link.option.nostdlibs" useByScannerDiscovery="false" value="false" valueType="boolean"/>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.link.option.paths.579521002" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths" useByScannerDiscovery="false" valueType="libPaths">
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/SAME70_RTOS/}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/FreeRTOS/SAME70}&quot;"/>
+
+ </option>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.link.option.libs.1783235457" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" useByScannerDiscovery="false" valueType="libs">
+
+ <listOptionValue builtIn="false" value="${CoreName}"/>
+
+ <listOptionValue builtIn="false" value="FreeRTOS"/>
+
+ </option>
+
+ <option id="gnu.cpp.link.option.flags.2100826215" name="Linker flags" superClass="gnu.cpp.link.option.flags" useByScannerDiscovery="false" value="-Os -Wl,--gc-sections -Wl,--fatal-warnings -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -T${workspace_loc:/${CoreName}/variants/same70/linker_scripts/gcc/flash.ld} -Wl,-Map,${workspace_loc:/${ProjName}/${ConfigName}}/${BuildArtifactFileBaseName}.map" valueType="string"/>
+
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1623645672" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+
+ <additionalInput kind="additionalinput" paths="$(LIBS)"/>
+
+ </inputType>
+
+ </tool>
+
+ <tool command="g++" id="cdt.managedbuild.tool.gnu.cross.cpp.compiler.1243015316" name="Cross G++ Compiler" superClass="cdt.managedbuild.tool.gnu.cross.cpp.compiler">
+
+ <option id="gnu.cpp.compiler.option.optimization.level.744605431" name="Optimization Level" superClass="gnu.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.more" valueType="enumerated"/>
+
+ <option id="gnu.cpp.compiler.option.debugging.level.1247470383" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.default" valueType="enumerated"/>
+
+ <option id="gnu.cpp.compiler.option.other.verbose.1130347909" name="Verbose (-v)" superClass="gnu.cpp.compiler.option.other.verbose" useByScannerDiscovery="false" value="false" valueType="boolean"/>
+
+ <option id="gnu.cpp.compiler.option.other.other.1453375027" name="Other flags" superClass="gnu.cpp.compiler.option.other.other" useByScannerDiscovery="false" value="-c -std=gnu++14 -mcpu=cortex-m7 -mthumb -mfpu=fpv5-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections -fno-threadsafe-statics -fno-rtti -fno-exceptions -nostdlib -Wdouble-promotion -fsingle-precision-constant &quot;-Wa,-ahl=$*.s&quot;" valueType="string"/>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.compiler.option.include.paths.633679617" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/cores/arduino}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Flash}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/SharedSpi}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Storage}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Wire}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/utils}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/services/clock}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/services/ioport}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers/gmac}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/services/flash_efc}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/cmsis/same70/include}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/header_files}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/preprocessor}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/thirdparty/CMSIS/Include}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/variants/same70}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/SAME70_TEST}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Networking}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Networking/LwipEthernet}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Networking/LwipEthernet/Lwip/src/include}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/DuetWiFiSocketServer/src/include}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/FreeRTOS/src/include}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/FreeRTOS/src/portable/GCC/ARM_CM7/r0p1}&quot;"/>
+
+ </option>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.compiler.option.preprocessor.def.315745995" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">
+
+ <listOptionValue builtIn="false" value="__SAME70Q21__"/>
+
+ <listOptionValue builtIn="false" value="RTOS"/>
+
+ <listOptionValue builtIn="false" value="SAME70_TEST_BOARD"/>
+
+ <listOptionValue builtIn="false" value="_XOPEN_SOURCE"/>
+
+ </option>
+
+ <option id="gnu.cpp.compiler.option.dialect.std.815297330" name="Language standard" superClass="gnu.cpp.compiler.option.dialect.std" useByScannerDiscovery="true" value="gnu.cpp.compiler.dialect.default" valueType="enumerated"/>
+
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.2035099195" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
+
+ </tool>
+
+ </toolChain>
+
+ </folderInfo>
+
+ <sourceEntries>
+
+ <entry excluding="src/Networking/ESP8266WiFi|src/Pccb|src/DuetNG/DuetWiFi|src/Duet|src/DuetNG/DuetEthernet/Wiznet/Internet/SNTP|src/DuetNG|src/Networking/LwipEthernet/Lwip/test|src/DuetNG/DuetEthernet/Wiznet/Internet/DNS|src/DuetNG/DuetEthernet/Wiznet/Application|src/Networking/W5500Ethernet|src/DuetNG/DuetEthernet/Wiznet/Internet/MQTT|src/Alligator|src/Display|src/Networking/LwipEthernet/Lwip/src/apps/mqtt|src/Networking/LwipEthernet/Lwip/doc|src/DuetNG/DuetEthernet/Wiznet/Internet/TFTP|src/DuetNG/DuetEthernet/Ethernet3|src/Networking/LwipEthernet/Lwip/src/apps/snmp|src/Networking/LwipEthernet/Lwip/src/apps/httpd|src/DuetNG/DuetEthernet/Wiznet/Internet/FTPServer|src/DuetNG/DuetEthernet/Ethernet3/examples|src/Networking/LwipEthernet/Lwip/src/apps/tftp|src/Networking/LwipEthernet/Lwip/src/netif/ppp|src/Networking/LwipEthernet/Lwip/src/apps/lwiperf|src/DuetNG/DuetEthernet/Wiznet/Internet/FTPClient|src/Networking/LwipEthernet/Lwip/src/apps/sntp|src/DuetNG/DuetEthernet/Wiznet/Internet/httpServer|src/DuetNG/DuetEthernet/Wiznet/Internet/SNMP|src/DuetM|src/RADDS" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
+
+ </sourceEntries>
+
+ </configuration>
+
+ </storageModule>
+
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+
+ </cconfiguration>
+
+ <cconfiguration id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.241502451.170574622.649587786.1798324396">
+
+ <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.241502451.170574622.649587786.1798324396" moduleId="org.eclipse.cdt.core.settings" name="PCCB">
+
+ <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"/>
+
+ <stringMacro name="CoreName" type="VALUE_TEXT" value="CoreNG"/>
+
+ <stringMacro name="GccPath" type="VALUE_TEXT" value="/home/christian/duet/gcc-arm-none-eabi-7-2018-q2-update/bin"/>
+
+ </macros>
+
+ <externalSettings/>
+
+ <extensions>
+
+ <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+
+ <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+
+ </extensions>
+
+ </storageModule>
+
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+
+ <configuration artifactExtension="elf" artifactName="PccbFirmware" 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.241502451.170574622.649587786.1798324396" name="PCCB" optionalBuildProperties="" 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.241502451.170574622.649587786.1798324396." name="/" resourcePath="">
+
+ <toolChain id="cdt.managedbuild.toolchain.gnu.cross.exe.release.1017317107" name="Cross GCC" superClass="cdt.managedbuild.toolchain.gnu.cross.exe.release">
+
+ <option id="cdt.managedbuild.option.gnu.cross.path.1932906636" name="Path" superClass="cdt.managedbuild.option.gnu.cross.path" useByScannerDiscovery="false" value="${GccPath}" valueType="string"/>
+
+ <option id="cdt.managedbuild.option.gnu.cross.prefix.1572241044" name="Prefix" superClass="cdt.managedbuild.option.gnu.cross.prefix" useByScannerDiscovery="false" value="arm-none-eabi-" valueType="string"/>
+
+ <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="cdt.managedbuild.targetPlatform.gnu.cross.185324036" isAbstract="false" osList="all" superClass="cdt.managedbuild.targetPlatform.gnu.cross"/>
+
+ <builder buildPath="${workspace_loc:/RepRapFirmware}/Release" id="cdt.managedbuild.builder.gnu.cross.1082169056" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="cdt.managedbuild.builder.gnu.cross"/>
+
+ <tool id="cdt.managedbuild.tool.gnu.cross.assembler.1148717304" name="Cross GCC Assembler" superClass="cdt.managedbuild.tool.gnu.cross.assembler">
+
+ <inputType id="cdt.managedbuild.tool.gnu.assembler.input.2143813580" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+
+ </tool>
+
+ <tool commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" id="cdt.managedbuild.tool.gnu.cross.c.compiler.1981974117" name="Cross GCC Compiler" superClass="cdt.managedbuild.tool.gnu.cross.c.compiler">
+
+ <option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.option.optimization.level.1510743318" name="Optimization Level" superClass="gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="gnu.c.optimization.level.more" valueType="enumerated"/>
+
+ <option id="gnu.c.compiler.option.debugging.level.1424949241" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.none" valueType="enumerated"/>
+
+ <option id="gnu.c.compiler.option.misc.verbose.623464210" name="Verbose (-v)" superClass="gnu.c.compiler.option.misc.verbose" useByScannerDiscovery="false" value="false" valueType="boolean"/>
+
+ <option id="gnu.c.compiler.option.misc.other.1167454821" name="Other flags" superClass="gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-c -std=gnu99 -mcpu=cortex-m4 -mthumb -ffunction-sections -fdata-sections -nostdlib -Wdouble-promotion -fsingle-precision-constant &quot;-Wa,-ahl=$*.s&quot;" valueType="string"/>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.include.paths.531615654" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/cores/arduino}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Storage}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/utils}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/services/ioport}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/cmsis/sam4s/include}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/header_files}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/preprocessor}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/thirdparty/CMSIS/Include}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/variants/sam4s}&quot;"/>
+
+ </option>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.preprocessor.def.symbols.507583566" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
+
+ <listOptionValue builtIn="false" value="__SAM4S8C__"/>
+
+ <listOptionValue builtIn="false" value="RTOS"/>
+
+ <listOptionValue builtIn="false" value="PCCB"/>
+
+ </option>
+
+ <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.562849016" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
+
+ </tool>
+
+ <tool id="cdt.managedbuild.tool.gnu.cross.c.linker.1448735774" name="Cross GCC Linker" superClass="cdt.managedbuild.tool.gnu.cross.c.linker"/>
+
+ <tool id="cdt.managedbuild.tool.gnu.cross.archiver.886333230" name="Cross GCC Archiver" superClass="cdt.managedbuild.tool.gnu.cross.archiver"/>
+
+ <tool command="gcc" commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${LinkFlags1} &quot;${workspace_loc:/${CoreName}/SAM4S_RTOS/cores/arduino/syscalls.o}&quot; ${INPUTS} ${LinkFlags2}" id="cdt.managedbuild.tool.gnu.cross.cpp.linker.687537254" name="Cross G++ Linker" superClass="cdt.managedbuild.tool.gnu.cross.cpp.linker">
+
+ <option id="gnu.cpp.link.option.nostdlibs.1719677032" name="No startup or default libs (-nostdlib)" superClass="gnu.cpp.link.option.nostdlibs" useByScannerDiscovery="false" value="false" valueType="boolean"/>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.link.option.paths.2028936348" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths" useByScannerDiscovery="false" valueType="libPaths">
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/SAM4S_RTOS_PCCB/}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/FreeRTOS/SAM4S}&quot;"/>
+
+ </option>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.link.option.libs.1421214818" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" useByScannerDiscovery="false" valueType="libs">
+
+ <listOptionValue builtIn="false" value="${CoreName}"/>
+
+ <listOptionValue builtIn="false" value="FreeRTOS"/>
+
+ </option>
+
+ <option id="gnu.cpp.link.option.flags.633609481" name="Linker flags" superClass="gnu.cpp.link.option.flags" useByScannerDiscovery="false" value="-Os --specs=nano.specs -Wl,--gc-sections -Wl,--fatal-warnings -mcpu=cortex-m4 -T${workspace_loc:/${CoreName}/variants/sam4s/linker_scripts/gcc/flash.ld} -Wl,-Map,${workspace_loc:/${ProjName}/${ConfigName}}/${BuildArtifactFileBaseName}.map" valueType="string"/>
+
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.96746585" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+
+ <additionalInput kind="additionalinput" paths="$(LIBS)"/>
+
+ </inputType>
+
+ </tool>
+
+ <tool command="g++" id="cdt.managedbuild.tool.gnu.cross.cpp.compiler.972255361" name="Cross G++ Compiler" superClass="cdt.managedbuild.tool.gnu.cross.cpp.compiler">
+
+ <option id="gnu.cpp.compiler.option.optimization.level.820933483" name="Optimization Level" superClass="gnu.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.more" valueType="enumerated"/>
+
+ <option id="gnu.cpp.compiler.option.debugging.level.1785551954" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.none" valueType="enumerated"/>
+
+ <option id="gnu.cpp.compiler.option.other.verbose.1038790030" name="Verbose (-v)" superClass="gnu.cpp.compiler.option.other.verbose" useByScannerDiscovery="false" value="false" valueType="boolean"/>
+
+ <option id="gnu.cpp.compiler.option.other.other.1212511140" name="Other flags" superClass="gnu.cpp.compiler.option.other.other" useByScannerDiscovery="false" value="-c -std=gnu++14 -mcpu=cortex-m4 -mthumb -ffunction-sections -fdata-sections -fno-threadsafe-statics -fno-rtti -fno-exceptions -nostdlib -Wdouble-promotion -fsingle-precision-constant &quot;-Wa,-ahl=$*.s&quot;" valueType="string"/>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.compiler.option.include.paths.1648844124" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/cores/arduino}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Flash}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/SharedSpi}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Storage}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/libraries/Wire}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/utils}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/services/clock}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/common/services/ioport}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/drivers}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/services/flash_efc}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/cmsis/sam4s/include}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/header_files}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/sam/utils/preprocessor}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/asf/thirdparty/CMSIS/Include}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${CoreName}/variants/sam4s}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Pccb}&quot;"/>
+
+ <listOptionValue builtIn="false" value="&quot;${workspace_loc:/DuetWiFiSocketServer/src/include}&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;"/>
+
+ </option>
+
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.compiler.option.preprocessor.def.249074867" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">
+
+ <listOptionValue builtIn="false" value="__SAM4S8C__"/>
+
+ <listOptionValue builtIn="false" value="RTOS"/>
+
+ <listOptionValue builtIn="false" value="PCCB"/>
+
+ <listOptionValue builtIn="false" value="_XOPEN_SOURCE"/>
+
+ </option>
+
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.58883174" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
+
+ </tool>
+
+ </toolChain>
+
+ </folderInfo>
+
+ <sourceEntries>
+
+ <entry excluding="src/DuetM|src/Display|src/Networking|src/Alligator|src/SAME70_TEST|src/Duet|src/Networking/ESP8266WiFi|src/Networking/LwipEthernet|src/DuetNG|src/RADDS" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
+
+ </sourceEntries>
+
+ </configuration>
+
+ </storageModule>
+
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+
+ </cconfiguration>
+
+ </storageModule>
+
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+
+ <project id="RepRapFirmware.cdt.managedbuild.target.gnu.cross.exe.1494358155" name="Executable" projectType="cdt.managedbuild.target.gnu.cross.exe"/>
+
+ </storageModule>
+
+ <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
+
+ <storageModule moduleId="refreshScope" versionNumber="2">
+
+ <configuration configurationName="DuetM_RTOS"/>
+
+ <configuration configurationName="Alligator"/>
+
+ <configuration configurationName="SAME70_RTOS"/>
+
+ <configuration configurationName="SAME70"/>
+
+ <configuration configurationName="RADDS"/>
+
+ <configuration configurationName="Duet2_RTOS"/>
+
+ <configuration configurationName="Duet2"/>
+
+ <configuration configurationName="PCCB"/>
+
+ <configuration configurationName="DuetM"/>
+
+ <configuration configurationName="Duet085"/>
+
+ </storageModule>
+
+ <storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
+
+ <storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
+
+ <storageModule moduleId="scannerConfiguration">
+
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+
+ <scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.cross.exe.release.516195201;cdt.managedbuild.config.gnu.cross.exe.release.516195201.;cdt.managedbuild.tool.gnu.cross.cpp.compiler.1703390221;cdt.managedbuild.tool.gnu.cpp.compiler.input.111814721">
+
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"/>
+
+ </scannerConfigBuildInfo>
+
+ <scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.cross.exe.release.516195201;cdt.managedbuild.config.gnu.cross.exe.release.516195201.;cdt.managedbuild.tool.gnu.cross.c.compiler.220085372;cdt.managedbuild.tool.gnu.c.compiler.input.1345445195">
+
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
+
+ </scannerConfigBuildInfo>
+
+ </storageModule>
+
</cproject>
diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml
index 1998c537..f6440b45 100644
--- a/.settings/language.settings.xml
+++ b/.settings/language.settings.xml
@@ -1,69 +1,158 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project>
- <configuration id="cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850" name="Duet085">
- <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="-114279925955362495" 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">
- <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="-114279925955362495" 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.1745168887" name="Alligator">
- <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="-114279925955362495" 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.241502451.170574622" name="Duet2_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="-114279925955362495" 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.241502451.1275216290.274082366.1645191116.1726130161" name="SAME70_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="-114279925955362495" 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.241502451.1275216290.274082366.1645191116.1852610203" name="SAME70_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="-114279925955362495" 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" name="Duet085">
+
+ <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="-1426937548715061090" 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">
+
+ <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="-1426937548715061090" 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.1745168887" name="Alligator">
+
+ <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="-1426937548715061090" 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.241502451.170574622" name="Duet2_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="-1426937548715061090" 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.241502451.170574622.649587786" name="DuetM_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="-1426937548715061090" 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.241502451.1275216290.274082366.1645191116.1852610203" name="SAME70_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="-1426937548715061090" 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.241502451.170574622.649587786.1798324396" name="PCCB">
+
+ <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="-1426937548715061090" 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>
+
</project>
diff --git a/src/Alligator/Pins_Alligator.h b/src/Alligator/Pins_Alligator.h
index 120e475b..ba7d0c35 100644
--- a/src/Alligator/Pins_Alligator.h
+++ b/src/Alligator/Pins_Alligator.h
@@ -4,12 +4,9 @@
#define FIRMWARE_NAME "RepRapFirmware for Alligator"
// Features definition
-#define HAS_LWIP_NETWORKING 1
-#define HAS_WIFI_NETWORKING 0
+#define HAS_LEGACY_NETWORKING 1
#define HAS_CPU_TEMP_SENSOR 1
#define HAS_HIGH_SPEED_SD 0
-#define HAS_SMART_DRIVERS 0
-#define HAS_STALL_DETECT 0
#define HAS_VOLTAGE_MONITOR 0
#define HAS_VREF_MONITOR 0
#define ACTIVE_LOW_HEAT_ON 0
@@ -37,16 +34,16 @@ const size_t MaxDriversPerAxis = 4; // The maximum number of stepper drivers
#define AXES_(a,b,c,d,e,f,g,h,i) { a,b,c,d,e,f }
// Alligator + Piggy module max 5 heaters
-const int8_t Heaters = 5; // The number of heaters in the machine; 0 is the heated bed even if there isn't one
-#define HEATERS_(a,b,c,d,e,f,g,h) { a,b,c,d,e }
+constexpr size_t Heaters = 5; // The number of heaters in the machine; 0 is the heated bed even if there isn't one
-const size_t NumExtraHeaterProtections = 4; // The number of extra heater protection instances
+constexpr size_t NumExtraHeaterProtections = 4; // The number of extra heater protection instances
+constexpr size_t NumThermistorInputs = 5;
-const size_t MaxAxes = 7; // The maximum number of movement axes in the machine, usually just X, Y and Z, <= DRIVES
-const size_t MinAxes = 3; // The minimum and default number of axes
-const size_t MaxExtruders = DRIVES - MinAxes; // The maximum number of extruders
+constexpr size_t MaxAxes = 7; // The maximum number of movement axes in the machine, usually just X, Y and Z, <= DRIVES
+constexpr size_t MinAxes = 3; // The minimum and default number of axes
+constexpr size_t MaxExtruders = DRIVES - MinAxes; // The maximum number of extruders
-const size_t NUM_SERIAL_CHANNELS = 3; // The number of serial IO channels (USB and two auxiliary UARTs)
+constexpr size_t NUM_SERIAL_CHANNELS = 3; // The number of serial IO channels (USB and two auxiliary UARTs)
#define SERIAL_MAIN_DEVICE SerialUSB
#define SERIAL_AUX_DEVICE Serial
#define SERIAL_AUX2_DEVICE Serial1
@@ -69,19 +66,18 @@ const Pin MotorFaultDetectPin = 22;
// Alligator End-stop pinout mapping for RepRapFirmware:
// 5V SIGN SIGN GND , 5V SIGN SIGN GND, 5V SIGN SIGN GND
// X E0 Y E1 Z E2-Zprobe
-const Pin END_STOP_PINS[DRIVES] = { 33, 35, 38, 34, 37, 39 ,NoPin };
+const Pin END_STOP_PINS[DRIVES] = { 33, 35, 38, 34, 37, 39, NoPin };
// SPI DAC Motor for Current Vref
const size_t MaxSpiDac = 2;
const Pin SPI_DAC_CS[MaxSpiDac] = { 53, 6 };
// HEATERS
-const Pin TEMP_SENSE_PINS[Heaters] = HEATERS_(1, 0, 2, 3, 4, f, g, h); // Analogue pin numbers
+const Pin TEMP_SENSE_PINS[NumThermistorInputs] = { 1, 0, 2, 3, 4 }; // Analogue pin numbers
// h1,h2,h3,h4: X2,8,9,X8 is hardware PWM
// b: X3 is not hardware PWM
-const Pin HEAT_ON_PINS[Heaters] = HEATERS_(X3, X2, 8, 9, X8, f, g, h); // b,h1,h2,h3,h4
-
+const Pin HEAT_ON_PINS[Heaters] = { X3, X2, 8, 9, X8 };
// Default thermistor parameters
// Bed thermistor: http://uk.farnell.com/epcos/b57863s103f040/sensor-miniature-ntc-10k/dp/1299930?Ntt=129-9930
@@ -112,11 +108,11 @@ const Pin ATX_POWER_PIN = NoPin; // Arduino Due pin number that control
const Pin Z_PROBE_PIN = 39; // Z min pin ,Last signal of the end-stop connectors
// Digital pin number to turn the IR LED on (high) or off (low)
-const Pin Z_PROBE_MOD_PIN = NoPin; // Digital pin number to turn the IR LED on (high) or off (low) on Duet v0.6 and v1.0 (PB21)
+const Pin Z_PROBE_MOD_PIN = NoPin; // Digital pin number to turn the IR LED on (high) or off (low) on Duet v0.6 and v1.0 (PB21)
const Pin DiagPin = NoPin;
// Pin number that the DAC that controls the second extruder motor current on the Duet 0.8.5 is connected to
-const int Dac0DigitalPin = NoPin; // Arduino Due pin number corresponding to DAC0 output pin
+const int Dac0DigitalPin = NoPin; // Arduino Due pin number corresponding to DAC0 output pin
// COOLING FANS
const size_t NUM_FANS = 4;
@@ -124,7 +120,8 @@ const size_t NUM_FANS = 4;
// Fan2: 31 is not hardware PWM
// J5 pin1 black connector ha hardware PWM, attached to FANS
const Pin COOLING_FAN_PINS[NUM_FANS] = { X0, 31, X17};
-const Pin COOLING_FAN_RPM_PIN = NoPin; // Pin PA15
+constexpr size_t NumTachos = 0;
+constexpr Pin TachoPins[NumTachos] = { };
// SD cards
const size_t NumSdCards = 1;
diff --git a/src/BugList.txt b/src/BugList.txt
index e920e51f..92b4b235 100644
--- a/src/BugList.txt
+++ b/src/BugList.txt
@@ -195,7 +195,7 @@ WiFi:
- [resolve library incompatibility] New ESP8266 SDK
- [done] check what's new in Arduino ESP 2.4.1
-Bug fixes/investigations:
+Done in 2.01beta1:
- [done, test] sqrt(2) error factor in extrusion-only moves, see Michael's email
- [done] Homing wrong if axes not labeled sequentially, see Christian's email of 18/6/18
- [done, test] Fix "2dtstc2diva=u" in debug printout, https://forum.duet3d.com/topic/3139/high-level-of-steperrors-what-can-cause-them/5
@@ -212,30 +212,50 @@ Bug fixes/investigations:
- [done] Add SW_ENC pin on CONN_SD to available GPIO ports
- [done] Increased M999 delay to 1 second
- [done] If M911 resume threshold is set too high, save-on-power-off never primes itself
+- [done] display mutex owners in task diagnostics
+
+Done in 2.02beta2:
+- [done, test] GCode queue overflow, see https://forum.duet3d.com/topic/5821/major-performance-problem. Suspend processing until queue space is available.
+- [done, test M28/M29 and M559/M560 file uploads] M28 and M29 in a macro, https://forum.duet3d.com/topic/5642/filament-load-macro-writing-to-file-in-sys. Move fileBeingWritten to GCodeBuffer, get rid of writingFileDirectory.
+- [done, test] we get a Pop underflow message when you send DWC jog commands and axes are not homed
+- [done, test] clear bed compensation not working properly, https://forum.duet3d.com/topic/5978/dwc-ui-position-updates-are-behind-causing-leveling-problems/6
+- [done] Duet Maestro default to TMC2224 drivers on expansion
+- [done] bltouch now uses unfiltered digital probe mode
+- [done] Reset/retry after SD card error - we have confirmation that fatfs is reporting a low-level error (error 1)
+- [increased retries, test detection] Doesn't find DueX5 after M999 reset? https://forum.duet3d.com/topic/5713/duet2-with-2-0-rtos-looses-duex5-on-reset
+- [made some changes] Test Duet 06/085 DHCP problem again, see https://forum.duet3d.com/topic/5572/it-s-out-reprapfirmware-2-0-and-1-21-1-released/16 for config.g files
+- [done, test] resurrect.g to include G92 commands to set head position to the power fail position
+- [done] Software watchdog to watch Heat task
+- [done, test] When an under-voltage event occurs, spurious driver status warnings/error were sometimes reported
+- [done, test] When an under- or over-voltage event occurred, the VIN voltage reported was the current voltage, not the voltage when the event was recorded
+- [done, test] Software reset data now includes which task was active
+- [done, test] Step errors on a drive corresponding to an invisible axis, https://forum.duet3d.com/topic/3139/high-level-of-steperrors-what-can-cause-them/5
+
+Bug fixes/investigations for 2.02beta3:
+- [done, ok] Chrishamm's changes to allow fans to be named
+- [done] Initial assumed Z position could be strange because babystepping wasn't cleared early enough at startup
+- [done] allow Z probe mod pin to be accessed as a GP output pin (but some Z probe modes will still change it)
+- [done] allow up to 5 drivers/axis on Duet 2 WiFi/Ethernet instead of 4
+- [done, test] M28/M29 in macro still doesn't work if the M29 is right at the end of the file. Also test the case of no M29.
+- [done, ok] Fix tacho RPM readings
+- Pressure advance with high K and low microstepping, see https://forum.duet3d.com/topic/1935/more-strange-pressure-advance-behaviour/95
+- Do we need to defer stall detection when a motor is starting from rest?
+- [awaiting reply] Step errors when using Nimble and pressure advance, https://forum.duet3d.com/topic/3139/high-level-of-steperrors-what-can-cause-them/5
+- [awaiting reply] GCode file that pauses between parts, https://forum.duet3d.com/topic/5702/printer-keeps-pausing-during-print/15
+- [looks like it was a temperature sensing error] Is there a kink during auto tuning? https://forum.duet3d.com/topic/5582/hot-end-auto-tuning-failed-due. Could explain oddly low dead times from auto tuning.
+- Stuck in spin loop, https://forum.duet3d.com/topic/5674/damned-crash-stuck-in-spin-loop
+- Report that if you use FileZilla to upload several short files, some of them are written blank, https://forum.duet3d.com/topic/5992/files-uploaded-over-ftp-occasionally-blank
-- Test gcode file that pauses between parts, https://forum.duet3d.com/topic/5702/printer-keeps-pausing-during-print/15
-- Doesn't find DueX5 after M999 reset? https://forum.duet3d.com/topic/5713/duet2-with-2-0-rtos-looses-duex5-on-reset
-- stuck in spin loop, https://forum.duet3d.com/topic/5674/damned-crash-stuck-in-spin-loop
-- step errors, see https://forum.duet3d.com/topic/3139/high-level-of-steperrors-what-can-cause-them/5
- Investigate failed .BMP conversion, https://forum.duet3d.com/topic/5623/boot-logo-corruption-in-1-21/2
-- Duet Maestro default to TMC2224 drivers on expansion? How to detect them?
-- M28 and M29 in a macro, https://forum.duet3d.com/topic/5642/filament-load-macro-writing-to-file-in-sys. Move fileBeingWritten to GCodeBuffer, get rid of writingFileDirectory.
-- Is there a kink during auto tuning? https://forum.duet3d.com/topic/5582/hot-end-auto-tuning-failed-due. Could explain oddly low dead times from auto tuning.
-- Does bltouch need a default recovery time to allow it to deploy? (probably not)
-- Should bltouch use digital probe mode? Some users having problems with P25 in G31 command.
-- Test Duet 06/085 DHCP problem again, see https://forum.duet3d.com/topic/5572/it-s-out-reprapfirmware-2-0-and-1-21-1-released/16 for config.g files
-- Retry after SD card error?
Other:
-- @wilriker PR for M106 PWM limit
-- [done, test] display mutex owners in task diagnostics
Planned for 2.02:
-- WiFi continuous auto reconnect, or extra M552 parameter? See https://forum.duet3d.com/topic/5765/wifi-module-auto-reconnect
+- @wilriker PR for M106 PWM limit
+- 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
-- Recovery from SD card errors during a print (Dan)
- Danny's modified SCARA kinematics (workpiece is on a plate, extruder is fixed)
- Laser support via G1 S parameter, see https://forum.duet3d.com/topic/4702/laser-cnc-support-in-rrf-gcode-semantics/4
- Look at pushover notification support, https://forum.duet3d.com/topic/169/notification-via-pushover-or-other-service/45
@@ -244,11 +264,10 @@ Planned for 2.02:
- M584 when assigning a drive, unmap any existing assignment. 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, also allow all 12 drivers to be smart
+- M569 command to allow selection of smart/dumb driver (including on Duet M), also allow all 12 drivers to be smart
- M569 TOFF parameter, https://forum.duet3d.com/topic/5392/does-m906-set-rms-or-peak-current/28
- 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
-- If wifi disconnects when in client mode, keep retrying the connection
- M140 command to set default bed heaters for M140 S commands (e.g. M140 P0:1:2)
Other (some of these may be in 2.02):
@@ -260,7 +279,6 @@ Other (some of these may be in 2.02):
- support M205 for setting jerk
- support G12 clean tool?
- Add fan PWM limit, https://forum.duet3d.com/topic/5370/m106-feature-request-limit-max-pwm-parameter/4
-- M116 extra "close enough" parameter
- after homing, warn if outside M208 movement limits on SCARA, polar etc.
- Unexpected heaters off/tool selection behaviour, https://www.duet3d.com/forum/thread.php?pid=43059#p43059
- warn when using : where ; was probably meant
@@ -271,7 +289,6 @@ Other (some of these may be in 2.02):
- 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
-- looks like we get a Pop underflow message when you send DWC jog commands and axes are not homed
- 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
@@ -288,7 +305,6 @@ Other (some of these may be in 2.02):
- 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
-- Pressure advance, see https://www.duet3d.com/forum/thread.php?pid=38036#p38036
- 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 726a6c19..a6bef8d5 100644
--- a/src/Configuration.h
+++ b/src/Configuration.h
@@ -74,19 +74,34 @@ constexpr float DefaultHotEndHeaterGain = 340.0;
constexpr float DefaultHotEndHeaterTimeConstant = 140.0;
constexpr float DefaultHotEndHeaterDeadTime = 5.5;
-#if SAM4E || SAME70
+#ifdef PCCB
+
+constexpr size_t NumBedHeaters = 1;
+constexpr size_t NumChamberHeaters = 1;
+constexpr int8_t DefaultBedHeaters[NumBedHeaters] = { -1 };
+constexpr int8_t DefaultChamberHeaters[NumChamberHeaters] = { -1 };
+
+constexpr int8_t DefaultE0Heater = 0; // Index of the default first extruder heater, used only for the legacy status response
+
+#elif SAM4E || SAME70
+
constexpr size_t NumBedHeaters = 4;
constexpr size_t NumChamberHeaters = 2;
constexpr int8_t DefaultBedHeaters[NumBedHeaters] = { 0, -1, -1, -1 };
constexpr int8_t DefaultChamberHeaters[NumChamberHeaters] = { -1, -1 };
+
+constexpr int8_t DefaultE0Heater = 1; // Index of the default first extruder heater, used only for the legacy status response
+
#else
+
constexpr size_t NumBedHeaters = 1;
constexpr size_t NumChamberHeaters = 2;
constexpr int8_t DefaultBedHeaters[NumBedHeaters] = { 0 };
constexpr int8_t DefaultChamberHeaters[NumChamberHeaters] = { -1, -1 };
-#endif
-constexpr int8_t DefaultE0Heater = 1; // Index of the default first extruder heater
+constexpr int8_t DefaultE0Heater = 1; // Index of the default first extruder heater, used only for the legacy status response
+
+#endif
constexpr unsigned int FirstVirtualHeater = 100; // the heater number at which virtual heaters start
constexpr unsigned int MaxVirtualHeaters = 10; // the number of virtual heaters supported
@@ -155,6 +170,8 @@ static_assert(MaxCalibrationPoints <= MaxProbePoints, "MaxCalibrationPoints must
// SD card
constexpr uint32_t SdCardDetectDebounceMillis = 200; // How long we give the SD card to settle in the socket
+constexpr unsigned int MaxSdCardTries = 3; // Number of read or write attempts before giving up
+constexpr uint32_t SdCardRetryDelay = 10; // Number of milliseconds delay between SD transfer retries
// Z probing
constexpr float DefaultZDive = 5.0; // Millimetres
@@ -178,8 +195,10 @@ constexpr size_t PASSWORD_LENGTH = 20;
#if SAM4E || SAM4S || SAME70
// Increased GCODE_LENGTH on the SAM4 because M587 and M589 commands on the Duet WiFi can get very long
constexpr size_t GCODE_LENGTH = 161; // maximum number of non-comment characters in a line of GCode including the null terminator
+constexpr size_t SHORT_GCODE_LENGTH = 61; // maximum length of a GCode that we can queue to synchronise it to a move
#else
constexpr size_t GCODE_LENGTH = 101; // maximum number of non-comment characters in a line of GCode including the null terminator
+constexpr size_t SHORT_GCODE_LENGTH = 61; // maximum length of a GCode that we can queue to synchronise it to a move
#endif
constexpr size_t MaxMessageLength = 256;
@@ -209,6 +228,8 @@ constexpr size_t RESERVED_OUTPUT_BUFFERS = 2; // Number of reserved output buf
# error
#endif
+const size_t maxQueuedCodes = 16; // How many codes can be queued?
+
// Move system
constexpr float DefaultFeedRate = 3000.0; // The initial requested feed rate after resetting the printer, in mm/min
constexpr float DefaultG0FeedRate = 18000; // The initial feed rate for G0 commands after resetting the printer, in mm/min
diff --git a/src/Display/MenuItem.h b/src/Display/MenuItem.h
index 28402c7e..6817322a 100644
--- a/src/Display/MenuItem.h
+++ b/src/Display/MenuItem.h
@@ -10,7 +10,7 @@
#include "Libraries/General/FreelistManager.h"
#include "RepRapFirmware.h"
-#include "ST7920/Lcd7920.h"
+#include "ST7920/lcd7920.h"
// Menu item class hierarchy
class MenuItem
diff --git a/src/Duet/Lwip/contrib/apps/mdns/mdns_responder.c b/src/Duet/Lwip/contrib/apps/mdns/mdns_responder.c
index 5353b367..167b38e7 100644
--- a/src/Duet/Lwip/contrib/apps/mdns/mdns_responder.c
+++ b/src/Duet/Lwip/contrib/apps/mdns/mdns_responder.c
@@ -544,7 +544,11 @@ static void setup_hostnames(struct mdns_state *ms, struct netif *netif)
sprintf(ms->hostnames[1], "%c%s-%02X%s", hostlen+3, netif->hostname,
netif->hwaddr[5], dotlocal);
+#if 1 // DC42
+ char macaddr[13];
+#else
char macaddr[12];
+#endif
sprintf(macaddr, "%02X%02X%02X%02X%02X%02X",
netif->hwaddr[0], netif->hwaddr[1], netif->hwaddr[2],
netif->hwaddr[3], netif->hwaddr[4], netif->hwaddr[5]);
diff --git a/src/Duet/Network.cpp b/src/Duet/Network.cpp
index a0ddfaa5..7713c2d8 100644
--- a/src/Duet/Network.cpp
+++ b/src/Duet/Network.cpp
@@ -160,8 +160,11 @@ static void ethernet_rx_callback(uint32_t ul_status)
static void conn_err(void *arg, err_t err)
{
- // Report the error to the monitor
- reprap.GetPlatform().MessageF(UsbMessage, "Network: Connection error, code %d\n", err);
+ if (reprap.Debug(moduleNetwork) && !inInterrupt())
+ {
+ // Report the error to the monitor
+ reprap.GetPlatform().MessageF(UsbMessage, "Network: Connection error, code %d\n", err);
+ }
// Tell the higher levels about the error
ConnectionState *cs = (ConnectionState*)arg;
@@ -179,7 +182,10 @@ static err_t conn_recv(void *arg, tcp_pcb *pcb, pbuf *p, err_t err)
{
if (cs->pcb != pcb)
{
- reprap.GetPlatform().Message(UsbMessage, "Network: Mismatched pcb in conn_recv!\n");
+ if (reprap.Debug(moduleNetwork) && !inInterrupt())
+ {
+ reprap.GetPlatform().Message(UsbMessage, "Network: Mismatched pcb in conn_recv!\n");
+ }
tcp_abort(pcb);
return ERR_ABRT;
}
diff --git a/src/Duet/Pins_Duet.h b/src/Duet/Pins_Duet.h
index 8f17abdf..5d9e193a 100644
--- a/src/Duet/Pins_Duet.h
+++ b/src/Duet/Pins_Duet.h
@@ -4,12 +4,9 @@
#define FIRMWARE_NAME "RepRapFirmware for Duet"
// Features definition
-#define HAS_LWIP_NETWORKING 1
-#define HAS_WIFI_NETWORKING 0
+#define HAS_LEGACY_NETWORKING 1
#define HAS_CPU_TEMP_SENSOR 1
#define HAS_HIGH_SPEED_SD 1
-#define HAS_SMART_DRIVERS 0
-#define HAS_STALL_DETECT 0
#define HAS_VOLTAGE_MONITOR 0
#define HAS_VREF_MONITOR 0
#define ACTIVE_LOW_HEAT_ON 1
@@ -32,9 +29,8 @@ constexpr size_t DRIVES = 9; // The number of drives in the machine, includ
#define DRIVES_(a,b,c,d,e,f,g,h,i,j,k,l) { a,b,c,d,e,f,g,h,i }
constexpr size_t Heaters = 7; // The number of heaters in the machine; 0 is the heated bed even if there isn't one
-#define HEATERS_(a,b,c,d,e,f,g,h) { a,b,c,d,e,f,g }
-
constexpr size_t NumExtraHeaterProtections = 4; // The number of extra heater protection instances
+constexpr size_t NumThermistorInputs = 7;
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
@@ -73,7 +69,7 @@ constexpr float STEPPER_DAC_VOLTAGE_RANGE = 2.02; // Stepper motor current
constexpr float STEPPER_DAC_VOLTAGE_OFFSET = -0.025; // Stepper motor current offset voltage for E1 if using a DAC
// HEATERS
-constexpr Pin TEMP_SENSE_PINS[Heaters] = { 5, 4, 0, 7, 8, 9, 11 }; // Analogue pin numbers
+constexpr Pin TEMP_SENSE_PINS[NumThermistorInputs] = { 5, 4, 0, 7, 8, 9, 11 }; // Analogue pin numbers
constexpr Pin HEAT_ON_PINS[Heaters] = { 6, X5, X7, 7, 8, 9, X17 }; // Heater Channel 7 (pin X17) is shared with Fan1
// Default thermistor parameters
@@ -127,7 +123,8 @@ constexpr int Dac0DigitalPin = 66; // Arduino Due pin number correspon
// COOLING FANS
constexpr size_t NUM_FANS = 2;
constexpr Pin COOLING_FAN_PINS[NUM_FANS] = { X6, X17 }; // Pin D34 is PWM capable but not an Arduino PWM pin - use X6 instead
-constexpr Pin COOLING_FAN_RPM_PIN = 23; // Pin PA15
+constexpr size_t NumTachos = 1;
+constexpr Pin TachoPins[NumTachos] = { 23 }; // Pin PA15
// SD cards
constexpr size_t NumSdCards = 2;
diff --git a/src/DuetM/Pins_DuetM.h b/src/DuetM/Pins_DuetM.h
index 3825e32b..f59ec75c 100644
--- a/src/DuetM/Pins_DuetM.h
+++ b/src/DuetM/Pins_DuetM.h
@@ -12,6 +12,7 @@
# define DEFAULT_BOARD_TYPE BoardType::DuetM_10
constexpr size_t NumFirmwareUpdateModules = 1; // 1 module
# define IAP_FIRMWARE_FILE "DuetMaestroFirmware.bin"
+#define IAP_UPDATE_FILE "iap4s.bin"
// Features definition
#define HAS_LWIP_NETWORKING 0
@@ -20,14 +21,12 @@ constexpr size_t NumFirmwareUpdateModules = 1; // 1 module
#define HAS_CPU_TEMP_SENSOR 1
#define HAS_HIGH_SPEED_SD 1
-#define HAS_SMART_DRIVERS 1
-#define HAS_STALL_DETECT 0
+#define SUPPORT_TMC22xx 1
+#define TMC22xx_HAS_MUX 1
#define HAS_VOLTAGE_MONITOR 1
#define HAS_VREF_MONITOR 1
#define ACTIVE_LOW_HEAT_ON 1
-#define IAP_UPDATE_FILE "iap4s.bin"
-
#define SUPPORT_INKJET 0 // set nonzero to support inkjet control
#define SUPPORT_ROLAND 0 // set nonzero to support Roland mill
#define SUPPORT_SCANNER 0 // set zero to disable support for FreeLSS scanners
@@ -42,10 +41,9 @@ constexpr size_t DRIVES = 7; // The maximum number of drives supported by t
constexpr size_t MaxSmartDrivers = 7; // The maximum number of smart drivers
#define DRIVES_(a,b,c,d,e,f,g,h,i,j,k,l) { a,b,c,d,e,f,g }
-constexpr size_t Heaters = 4; // The number of heaters/thermistors in the machine. Duet M has 3 heaters but 4 thermistors.
-#define HEATERS_(a,b,c,d,e,f,g,h) { a,b,c }
-
+constexpr size_t Heaters = 3; // The number of heaters/thermistors in the machine. Duet M has 3 heaters but 4 thermistors.
constexpr size_t NumExtraHeaterProtections = 4; // The number of extra heater protection instances
+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
@@ -69,6 +67,24 @@ constexpr Pin GlobalTmcEnablePin = 1; // The pin that drives ENN of all drive
constexpr Pin ENABLE_PINS[DRIVES] = { NoPin, NoPin, NoPin, NoPin, NoPin, 63, 61 };
constexpr Pin STEP_PINS[DRIVES] = { 56, 38, 64, 40, 41, 67, 57 };
constexpr Pin DIRECTION_PINS[DRIVES] = { 54, 8, 30, 33, 42, 18, 60 };
+
+// UART interface to stepper drivers
+Uart * const UART_TMC_DRV = UART0;
+const IRQn UART_TMC_DRV_IRQn = UART0_IRQn;
+const uint32_t ID_UART_TMC_DRV = ID_UART0;
+const uint8_t UART_TMC_DRV_PINS = APINS_UART0;
+
+#define UART_TMC_DRV_Handler UART0_Handler
+
+// Define the baud rate used to send/receive data to/from the drivers.
+// If we assume a worst case clock frequency of 8MHz then the maximum baud rate is 8MHz/16 = 500kbaud.
+// We send data via a 1K series resistor. Even if we assume a 200pF load on the shared UART line, this gives a 200ns time constant, which is much less than the 2us bit time @ 500kbaud.
+// To write a register we need to send 8 bytes. To read a register we send 4 bytes and receive 8 bytes after a programmable delay.
+// So at 500kbaud it takes about 128us to write a register, and 192us+ to read a register.
+// In testing I found that 500kbaud was not reliable, so now using 200kbaud.
+const uint32_t DriversBaudRate = 200000;
+const uint32_t TransferTimeout = 10; // any transfer should complete within 10 ticks @ 1ms/tick
+
constexpr Pin DriverMuxPins[3] = { 50, 52, 53 }; // Pins that control the UART multiplexer, LSB first
// Endstops
@@ -77,8 +93,8 @@ constexpr Pin DriverMuxPins[3] = { 50, 52, 53 }; // Pins that control the UART m
constexpr Pin END_STOP_PINS[DRIVES] = { 24, 32, 46, 25, 43, NoPin, NoPin };
// Heaters and thermistors
-constexpr Pin HEAT_ON_PINS[Heaters] = { 36, 37, 16, NoPin }; // Heater pin numbers
-constexpr Pin TEMP_SENSE_PINS[Heaters] = { 20, 26, 66, 27 }; // Thermistor pin numbers
+constexpr Pin HEAT_ON_PINS[Heaters] = { 36, 37, 16 }; // Heater pin numbers
+constexpr Pin TEMP_SENSE_PINS[NumThermistorInputs] = { 20, 26, 66, 27 }; // Thermistor pin numbers
constexpr Pin VssaSensePin = 19;
constexpr Pin VrefSensePin = 17;
@@ -117,7 +133,8 @@ constexpr Pin DiagPin = Z_PROBE_MOD_PIN;
// Cooling fans
constexpr size_t NUM_FANS = 3;
constexpr Pin COOLING_FAN_PINS[NUM_FANS] = { 59, 58, 65 };
-constexpr Pin COOLING_FAN_RPM_PIN = 21;
+constexpr size_t NumTachos = 1;
+constexpr Pin TachoPins[NumTachos] = { 21 };
// SD cards
constexpr size_t NumSdCards = 2;
diff --git a/src/DuetNG/DueXn.cpp b/src/DuetNG/DueXn.cpp
index 1e3418b2..3a642559 100644
--- a/src/DuetNG/DueXn.cpp
+++ b/src/DuetNG/DueXn.cpp
@@ -59,12 +59,15 @@ namespace DuetExpansion
{
reprap.GetPlatform().InitI2c(); // initialise I2C
- bool ret = dueXnExpander.begin(DueXnAddress);
- if (!ret)
+ // DC 2018-07-12: occasionally the SX1509B isn't found after doing a software reset, so try a few more attempts
+ bool ret;
+ unsigned int attempts = 0;
+ do
{
- delay(100); // wait a little while
- ret = dueXnExpander.begin(DueXnAddress); // do 1 retry
- }
+ ++attempts;
+ delay(50);
+ ret = dueXnExpander.begin(DueXnAddress);
+ } while (!ret && attempts < 5);
if (ret)
{
@@ -102,12 +105,15 @@ namespace DuetExpansion
void AdditionalOutputInit()
{
reprap.GetPlatform().InitI2c(); // initialise I2C
- bool ret = additionalIoExpander.begin(AdditionalIoExpanderAddress);
- if (!ret)
+
+ bool ret;
+ unsigned int attempts = 0;
+ do
{
- delay(100); // wait a little while
- ret = additionalIoExpander.begin(AdditionalIoExpanderAddress); // do 1 retry
- }
+ ++attempts;
+ delay(50);
+ ret = additionalIoExpander.begin(AdditionalIoExpanderAddress);
+ } while (!ret && attempts < 5);
if (ret)
{
diff --git a/src/DuetNG/Pins_DuetNG.h b/src/DuetNG/Pins_DuetNG.h
index 3aa83879..8d4f7334 100644
--- a/src/DuetNG/Pins_DuetNG.h
+++ b/src/DuetNG/Pins_DuetNG.h
@@ -5,6 +5,7 @@
# define DEFAULT_BOARD_TYPE BoardType::DuetWiFi_10
constexpr size_t NumFirmwareUpdateModules = 4; // 3 modules, plus one for manual upload to WiFi module (module 2 is now unused)
# define IAP_FIRMWARE_FILE "Duet2CombinedFirmware.bin"
+#define IAP_UPDATE_FILE "iap4e.bin" // using the same IAP file for both Duet WiFi and Duet Ethernet
# define WIFI_FIRMWARE_FILE "DuetWiFiServer.bin"
// Features definition
@@ -15,14 +16,11 @@ constexpr size_t NumFirmwareUpdateModules = 4; // 3 modules, plus one for manua
#define HAS_CPU_TEMP_SENSOR 1
#define HAS_HIGH_SPEED_SD 1
-#define HAS_SMART_DRIVERS 1
-#define HAS_STALL_DETECT 1
+#define SUPPORT_TMC2660 1
#define HAS_VOLTAGE_MONITOR 1
#define HAS_VREF_MONITOR 0
#define ACTIVE_LOW_HEAT_ON 1
-#define IAP_UPDATE_FILE "iap4e.bin" // using the same IAP file for both Duet WiFi and Duet Ethernet
-
#define SUPPORT_INKJET 0 // set nonzero to support inkjet control
#define SUPPORT_ROLAND 0 // set nonzero to support Roland mill
#define SUPPORT_SCANNER 1 // set zero to disable support for FreeLSS scanners
@@ -39,9 +37,8 @@ constexpr size_t MaxSmartDrivers = 10; // The maximum number of smart drivers
#define DRIVES_(a,b,c,d,e,f,g,h,i,j,k,l) { a,b,c,d,e,f,g,h,i,j,k,l }
constexpr size_t Heaters = 8; // The number of heaters in the machine; 0 is the heated bed even if there isn't one
-#define HEATERS_(a,b,c,d,e,f,g,h) { a,b,c,d,e,f,g,h }
-
constexpr size_t NumExtraHeaterProtections = 8; // The number of extra heater protection instances
+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
@@ -49,7 +46,7 @@ constexpr size_t MaxAxes = 9; // The maximum number of movement axes in the
#define AXES_(a,b,c,d,e,f,g,h,i) { a,b,c,d,e,f,g,h,i }
constexpr size_t MaxExtruders = DRIVES - MinAxes; // The maximum number of extruders
-constexpr size_t MaxDriversPerAxis = 4; // The maximum number of stepper drivers assigned to one axis
+constexpr size_t MaxDriversPerAxis = 5; // The maximum number of stepper drivers assigned to one axis
constexpr size_t NUM_SERIAL_CHANNELS = 2; // The number of serial IO channels (USB and one auxiliary UART)
#define SERIAL_MAIN_DEVICE SerialUSB
@@ -79,7 +76,7 @@ constexpr Pin END_STOP_PINS[DRIVES] = { 46, 02, 93, 74, 48, 96, 97, 98, 99, 17,
constexpr Pin DUEX_END_STOP_PINS[5] = { 200, 203, 202, 201, 213 }; // these replace endstops 5-9 if a DueX is present
// HEATERS
-constexpr Pin TEMP_SENSE_PINS[Heaters] = { 45, 47, 44, 61, 62, 63, 59, 18 }; // Thermistor pin numbers
+constexpr Pin TEMP_SENSE_PINS[NumThermistorInputs] = { 45, 47, 44, 61, 62, 63, 59, 18 }; // Thermistor pin numbers
constexpr Pin HEAT_ON_PINS[Heaters] = { 19, 20, 16, 35, 37, 40, 43, 15 }; // Heater pin numbers (heater 7 pin TBC)
// Default thermistor parameters
@@ -131,7 +128,8 @@ constexpr Pin DiagPin = Z_PROBE_MOD_PIN;
// Cooling fans
constexpr size_t NUM_FANS = 9;
constexpr Pin COOLING_FAN_PINS[NUM_FANS] = { 55, 58, 00, 212, 207, 206, 205, 204, 215 };
-constexpr Pin COOLING_FAN_RPM_PIN = 102; // PB6 on expansion connector
+constexpr size_t NumTachos = 1;
+constexpr Pin TachoPins[NumTachos] = { 102 }; // PB6 on expansion connector
// SD cards
constexpr size_t NumSdCards = 2;
@@ -158,12 +156,12 @@ constexpr Pin ROLAND_RTS_PIN = xx; // Expansion pin 12, PA13_RXD1
#endif
// M42 and M208 commands now use logical pin numbers, not firmware pin numbers.
-// This next definition defines the highest one.
// This is the mapping from logical pins 60+ to firmware pin numbers
constexpr Pin SpecialPinMap[] =
{
24, 97, 98, 99, // We allow CS5-CS8 to be used because few users need >4 thermocouples or RTDs
- 7 // SW_ENC on CONN_SD
+ 7, // SW_ENC on CONN_SD
+ Z_PROBE_MOD_PIN
};
constexpr Pin DueX5GpioPinMap[] = { 211, 210, 209, 208 }; // Pins 100-103 map to GPIO 1-4 on DueX5
// We also allow pins 120-135 to be used if there is an additional SX1509B expander
diff --git a/src/DuetNG/SX1509.cpp b/src/DuetNG/SX1509.cpp
index 9b7a54d7..3c601e28 100644
--- a/src/DuetNG/SX1509.cpp
+++ b/src/DuetNG/SX1509.cpp
@@ -21,11 +21,10 @@ local, and you've found our code helpful, please buy us a round!
Distributed as-is; no warranty is given.
******************************************************************************/
-#include "Core.h"
+#include "RepRapFirmware.h"
#include "Wire.h"
#include "SX1509.h"
#include "SX1509Registers.h"
-#include "Pins.h"
SX1509::SX1509() : _clkX(0), errorCount(0)
{
@@ -38,6 +37,7 @@ bool SX1509::begin(uint8_t address)
deviceAddress = address;
reset();
+ delay(2); // not sure this is needed, but it may help
pwmPins = 0;
diff --git a/src/Fans/DotStarLed.cpp b/src/Fans/DotStarLed.cpp
new file mode 100644
index 00000000..d8854c74
--- /dev/null
+++ b/src/Fans/DotStarLed.cpp
@@ -0,0 +1,107 @@
+/*
+ * DotStarLed.cpp
+ *
+ * Created on: 18 Jul 2018
+ * Author: David
+ */
+
+#include "DotStarLed.h"
+
+#if SUPPORT_DOTSTAR_LED
+
+#include "GCodes/GCodeBuffer.h"
+#include "sam/drivers/pdc/pdc.h"
+#include "sam/drivers/usart/usart.h"
+
+namespace DotStarLed
+{
+ const unsigned int MaxChunkSize = 30; // maximum number of LEDs we DMA to in one go (most strips have 30 LEDs/metre)
+
+ static unsigned int numRemaining = 0; // how much of the current request remains after the current transfer
+ static bool busy = false;
+ static uint8_t chunkBuffer[3 * MaxChunkSize]; // BGR values for each LED in the chunk
+
+ void Init()
+ {
+ // Set up the USART pins for SPI mode
+ // The pins are already set up for SPI in the pins table
+ ConfigurePin(GetPinDescription(DotStarMosiPin));
+ ConfigurePin(GetPinDescription(DotStarSclkPin));
+
+ // Enable the clock to the USART
+ pmc_enable_periph_clk(DotStarUsartId);
+
+ // Set the USART in SPI mode, with the clock high when inactive, data changing on the falling edge of the clock
+ DotStarUsart->US_IDR = ~0u;
+ DotStarUsart->US_CR = US_CR_RSTRX | US_CR_RSTTX | US_CR_RXDIS | US_CR_TXDIS;
+ DotStarUsart->US_MR = US_MR_USART_MODE_SPI_MASTER
+ | US_MR_USCLKS_MCK
+ | US_MR_CHRL_8_BIT
+ | US_MR_CHMODE_NORMAL
+ | US_MR_CPOL
+ | US_MR_CLKO;
+ DotStarUsart->US_BRGR = VARIANT_MCK/DotStarSpiClockFrequency; // set SPI clock frequency
+ DotStarUsart->US_CR = US_CR_RSTRX | US_CR_RSTTX | US_CR_RXDIS | US_CR_TXDIS | US_CR_RSTSTA;
+
+ // Initialise variables
+ numRemaining = 0;
+ busy = false;
+ }
+
+ GCodeResult SetColours(GCodeBuffer& gb, const StringRef& reply)
+ {
+ if (busy) // if we sent something
+ {
+ if ((DotStarUsart->US_CSR & US_CSR_ENDTX) == 0) // if we are still sending
+ {
+ return GCodeResult::notFinished;
+ }
+ busy = false; // we finished the last transfer
+ }
+
+ bool seen = false;
+ uint32_t red = 0, green = 0, blue = 0, numLeds = MaxChunkSize;
+ gb.TryGetUIValue('R', red, seen);
+ gb.TryGetUIValue('U', green, seen);
+ gb.TryGetUIValue('B', blue, seen);
+ gb.TryGetUIValue('S', numLeds, seen);
+ if (!seen || numLeds == 0)
+ {
+ return GCodeResult::ok;
+ }
+
+ if (numRemaining != 0)
+ {
+ numLeds = numRemaining; // we have come back to do another chunk
+ }
+
+ // Set up the data in the DMA buffer
+ unsigned int thisChunk = min<unsigned int>(numLeds, MaxChunkSize);
+ uint8_t *p = chunkBuffer;
+ for (unsigned int i = 0; i < thisChunk; ++i)
+ {
+ // According to the Adafruit web site, current production uses the order BGR
+ *p++ = (uint8_t)blue;
+ *p++ = (uint8_t)green;
+ *p++ = (uint8_t)red;
+ }
+
+ // DMA the data
+ DotStarUsart->US_CR = US_CR_RSTRX | US_CR_RSTTX | US_CR_TXDIS; // reset transmitter and receiver, disable transmitter
+ Pdc * const usartPdc = usart_get_pdc_base(DotStarUsart);
+ usartPdc->PERIPH_PTCR = PERIPH_PTCR_RXTDIS | PERIPH_PTCR_TXTDIS; // disable the PDC
+ usartPdc->PERIPH_TPR = reinterpret_cast<uint32_t>(&chunkBuffer);
+ usartPdc->PERIPH_TCR = 3 * thisChunk;
+ usartPdc->PERIPH_PTCR = PERIPH_PTCR_TXTEN; // enable the PDC to send data
+
+ DotStarUsart->US_CR = US_CR_TXEN; // enable transmitter
+
+ numRemaining = numLeds - thisChunk;
+ busy = true;
+ return (numRemaining == 0) ? GCodeResult::ok : GCodeResult::notFinished;
+ }
+};
+
+#endif
+
+// End
diff --git a/src/Fans/DotStarLed.h b/src/Fans/DotStarLed.h
new file mode 100644
index 00000000..902918ec
--- /dev/null
+++ b/src/Fans/DotStarLed.h
@@ -0,0 +1,22 @@
+/*
+ * DotStarLed.h
+ *
+ * Created on: 18 Jul 2018
+ * Author: David
+ */
+
+#ifndef SRC_FANS_DOTSTARLED_H_
+#define SRC_FANS_DOTSTARLED_H_
+
+#include "RepRapFirmware.h"
+#include "GCodes/GCodeResult.h"
+
+class GCodeBuffer;
+
+namespace DotStarLed
+{
+ void Init();
+ GCodeResult SetColours(GCodeBuffer& gb, const StringRef& reply);
+};
+
+#endif /* SRC_FANS_DOTSTARLED_H_ */
diff --git a/src/Fan.cpp b/src/Fans/Fan.cpp
index 0351abce..65ab5ba9 100644
--- a/src/Fan.cpp
+++ b/src/Fans/Fan.cpp
@@ -11,13 +11,13 @@
#include "GCodes/GCodeBuffer.h"
#include "Heating/Heat.h"
-void Fan::Init(Pin p_pin, bool hwInverted)
+void Fan::Init(Pin p_pin, bool hwInverted, PwmFrequency p_freq)
{
isConfigured = false;
val = lastVal = 0.0;
minVal = 0.1; // 10% minimum fan speed
blipTime = 100; // 100ms fan blip
- freq = DefaultFanPwmFreq;
+ freq = p_freq;
pin = p_pin;
hardwareInverted = hwInverted;
inverted = blipping = false;
diff --git a/src/Fan.h b/src/Fans/Fan.h
index f0e5598f..371b1264 100644
--- a/src/Fan.h
+++ b/src/Fans/Fan.h
@@ -29,7 +29,7 @@ public:
bool IsEnabled() const { return pin != NoPin; }
float GetConfiguredPwm() const { return val; } // returns the configured PWM. Actual PWM may be different, e.g. due to blipping or for thermostatic fans.
- void Init(Pin p_pin, bool hwInverted);
+ void Init(Pin p_pin, bool hwInverted, PwmFrequency p_freq);
void SetPwm(float speed);
bool HasMonitoredHeaters() const { return heatersMonitored != 0; }
void SetHeatersMonitored(HeatersMonitoredBitmap h);
diff --git a/src/Fans/Tacho.cpp b/src/Fans/Tacho.cpp
new file mode 100644
index 00000000..60d6e920
--- /dev/null
+++ b/src/Fans/Tacho.cpp
@@ -0,0 +1,53 @@
+/*
+ * Tacho.cpp
+ *
+ * Created on: 16 Jul 2018
+ * Author: David
+ */
+
+#include "Tacho.h"
+#include "Platform.h"
+
+void FanInterrupt(CallbackParameter cb)
+{
+ static_cast<Tacho *>(cb.vp)->Interrupt();
+}
+
+Tacho::Tacho() : fanInterruptCount(0), fanLastResetTime(0), fanInterval(0), pin(NoPin)
+{
+}
+
+void Tacho::Init(Pin p_pin)
+{
+ pin = p_pin;
+ if (pin != NoPin)
+ {
+ pinModeDuet(pin, INPUT_PULLUP, 1500); // enable pullup and 1500Hz debounce filter (500Hz only worked up to 7000RPM)
+ attachInterrupt(pin, FanInterrupt, INTERRUPT_MODE_FALLING, this);
+ }
+}
+
+uint32_t Tacho::GetRPM() const
+{
+ // The ISR sets fanInterval to the number of step interrupt clocks it took to get fanMaxInterruptCount interrupts.
+ // We get 2 tacho pulses per revolution, hence 2 interrupts per revolution.
+ // However, if the fan stops then we get no interrupts and fanInterval stops getting updated.
+ // We must recognise this and return zero.
+ return (fanInterval != 0 && Platform::GetInterruptClocks() - fanLastResetTime < 3 * StepClockRate) // if we have a reading and it is less than 3 second old
+ ? (StepClockRate * fanMaxInterruptCount * (60/2))/fanInterval // then calculate RPM assuming 2 interrupts per rev
+ : 0; // else assume fan is off or tacho not connected
+}
+
+void Tacho::Interrupt()
+{
+ ++fanInterruptCount;
+ if (fanInterruptCount == fanMaxInterruptCount)
+ {
+ const uint32_t now = Platform::GetInterruptClocks();
+ fanInterval = now - fanLastResetTime;
+ fanLastResetTime = now;
+ fanInterruptCount = 0;
+ }
+}
+
+// End
diff --git a/src/Fans/Tacho.h b/src/Fans/Tacho.h
new file mode 100644
index 00000000..279f0d91
--- /dev/null
+++ b/src/Fans/Tacho.h
@@ -0,0 +1,32 @@
+/*
+ * Tacho.h
+ *
+ * Created on: 16 Jul 2018
+ * Author: David
+ */
+
+#ifndef SRC_FANS_TACHO_H_
+#define SRC_FANS_TACHO_H_
+
+#include "RepRapFirmware.h"
+
+class Tacho
+{
+public:
+ Tacho();
+ void Init(Pin p_pin);
+ uint32_t GetRPM() const;
+
+ void Interrupt();
+
+private:
+ static constexpr uint32_t fanMaxInterruptCount = 32; // number of fan interrupts that we average over
+
+ uint32_t fanInterruptCount; // accessed only in ISR, so no need to declare it volatile
+ volatile uint32_t fanLastResetTime; // time (microseconds) at which we last reset the interrupt count, accessed inside and outside ISR
+ volatile uint32_t fanInterval; // written by ISR, read outside the ISR
+
+ Pin pin;
+};
+
+#endif /* SRC_FANS_TACHO_H_ */
diff --git a/src/GCodes/GCodeBuffer.cpp b/src/GCodes/GCodeBuffer.cpp
index df5b0044..817c66a8 100644
--- a/src/GCodes/GCodeBuffer.cpp
+++ b/src/GCodes/GCodeBuffer.cpp
@@ -8,13 +8,16 @@
//*************************************************************************************
#include "GCodeBuffer.h"
+#include "GCodes.h"
#include "GCodeInput.h"
#include "Platform.h"
#include "RepRap.h"
+static constexpr char eofString[] = EOF_STRING; // What's at the end of an HTML file?
+
// Create a default GCodeBuffer
GCodeBuffer::GCodeBuffer(const char* id, MessageType mt, bool usesCodeQueue)
- : machineState(new GCodeMachineState()), identity(id), writingFileDirectory(nullptr),
+ : machineState(new GCodeMachineState()), identity(id), fileBeingWritten(nullptr), writingFileSize(0), eofStringCounter(0),
toolNumberAdjust(0), responseMessageType(mt), checksumRequired(false), queueCodes(usesCodeQueue), binaryWriting(false)
{
Init();
@@ -252,7 +255,7 @@ bool GCodeBuffer::LineFinished()
gcodeBuffer[gcodeLineEnd] = 0;
const bool badChecksum = (hadChecksum && computedChecksum != declaredChecksum);
const bool missingChecksum = (checksumRequired && !hadChecksum && machineState->previous == nullptr);
- if (reprap.Debug(moduleGcodes) && !writingFileDirectory)
+ if (reprap.Debug(moduleGcodes) && fileBeingWritten == nullptr)
{
reprap.GetPlatform().MessageF(DebugMessage, "%s%s: %s\n", identity, ((badChecksum) ? "(bad-csum)" : (missingChecksum) ? "(no-csum)" : ""), gcodeBuffer);
}
@@ -759,6 +762,28 @@ void GCodeBuffer::TryGetBValue(char c, bool& val, bool& seen)
}
}
+// Try to get an int array exactly 'numVals' long after parameter letter 'c'.
+// If the wrong number of values is provided, generate an error message and return true.
+// Else set 'seen' if we saw the letter and value, and return false.
+bool GCodeBuffer::TryGetUIArray(char c, size_t numVals, uint32_t vals[], const StringRef& reply, bool& seen, bool doPad)
+{
+ if (Seen(c))
+ {
+ size_t count = numVals;
+ GetUnsignedArray(vals, count, doPad);
+ if (count == numVals)
+ {
+ seen = true;
+ }
+ else
+ {
+ reply.printf("Wrong number of values after '\''%c'\'', expected %d", c, numVals);
+ return true;
+ }
+ }
+ return false;
+}
+
// Try to get a float array exactly 'numVals' long after parameter letter 'c'.
// If the wrong number of values is provided, generate an error message and return true.
// Else set 'seen' if we saw the letter and value, and return false.
@@ -961,16 +986,20 @@ bool GCodeBuffer::PopState()
}
// Abort execution of any files or macros being executed, returning true if any files were closed
+// We now avoid popping the state if we were not executing from a file, so that if DWC or PanelDue is used to jog the axes before they are homed, we don't report stack underflow.
void GCodeBuffer::AbortFile(FileGCodeInput* fileInput)
{
- do
+ if (machineState->fileState.IsLive())
{
- if (machineState->fileState.IsLive())
+ do
{
- fileInput->Reset(machineState->fileState);
- machineState->fileState.Close();
- }
- } while (PopState()); // abandon any macros
+ if (machineState->fileState.IsLive())
+ {
+ fileInput->Reset(machineState->fileState);
+ machineState->fileState.Close();
+ }
+ } while (PopState()); // abandon any macros
+ }
}
// Return true if this source is executing a file macro
@@ -1010,4 +1039,134 @@ void GCodeBuffer::PrintCommand(const StringRef& s) const
}
}
+// Open a file to write to
+bool GCodeBuffer::OpenFileToWrite(const char* directory, const char* fileName, const FilePosition size, const bool binaryWrite, const uint32_t fileCRC32)
+{
+ fileBeingWritten = reprap.GetPlatform().OpenFile(directory, fileName, OpenMode::write);
+ eofStringCounter = 0;
+ writingFileSize = size;
+ if (fileBeingWritten == nullptr)
+ {
+ return false;
+ }
+
+ crc32 = fileCRC32;
+ binaryWriting = binaryWrite;
+ return true;
+}
+
+// Write the current GCode to file
+void GCodeBuffer::WriteToFile()
+{
+ if (GetCommandLetter() == 'M')
+ {
+ if (GetCommandNumber() == 29) // end of file?
+ {
+ fileBeingWritten->Close();
+ fileBeingWritten = nullptr;
+ SetFinished(true);
+ const char* const r = (reprap.GetPlatform().Emulating() == Compatibility::marlin) ? "Done saving file." : "";
+ reprap.GetGCodes().HandleReply(*this, GCodeResult::ok, r);
+ return;
+ }
+ }
+ else if (GetCommandLetter() == 'G' && GetCommandNumber() == 998) // resend request?
+ {
+ if (Seen('P'))
+ {
+ SetFinished(true);
+ String<ShortScratchStringLength> scratchString;
+ scratchString.printf("%" PRIi32 "\n", GetIValue());
+ reprap.GetGCodes().HandleReply(*this, GCodeResult::ok, scratchString.c_str());
+ return;
+ }
+ }
+
+ fileBeingWritten->Write(Buffer());
+ fileBeingWritten->Write('\n');
+ SetFinished(true);
+}
+
+void GCodeBuffer::WriteBinaryToFile(char b)
+{
+ if (b == eofString[eofStringCounter] && writingFileSize == 0)
+ {
+ eofStringCounter++;
+ if (eofStringCounter < ARRAY_SIZE(eofString) - 1)
+ {
+ return; // not reached end of input yet
+ }
+ }
+ else
+ {
+ if (eofStringCounter != 0)
+ {
+ for (uint8_t i = 0; i < eofStringCounter; i++)
+ {
+ fileBeingWritten->Write(eofString[i]);
+ }
+ eofStringCounter = 0;
+ }
+ fileBeingWritten->Write(b); // writing one character at a time isn't very efficient, but uploading HTML files via USB is rarely done these days
+ if (writingFileSize == 0 || fileBeingWritten->Length() < writingFileSize)
+ {
+ return; // not reached end of input yet
+ }
+ }
+
+ FinishWritingBinary();
+}
+
+void GCodeBuffer::FinishWritingBinary()
+{
+ // If we get here then we have come to the end of the data
+ fileBeingWritten->Close();
+ const bool crcOk = (crc32 == fileBeingWritten->GetCRC32() || crc32 == 0);
+ fileBeingWritten = nullptr;
+ binaryWriting = false;
+ if (crcOk)
+ {
+ const char* const r = (reprap.GetPlatform().Emulating() == Compatibility::marlin) ? "Done saving file." : "";
+ reprap.GetGCodes().HandleReply(*this, GCodeResult::ok, r);
+ }
+ else
+ {
+ reprap.GetGCodes().HandleReply(*this, GCodeResult::error, "CRC32 checksum doesn't match");
+ }
+}
+
+// This is called when we reach the end of the file we are reading from
+void GCodeBuffer::FileEnded()
+{
+ if (IsWritingBinary())
+ {
+ // We are in the middle of writing a binary file but the input stream has ended
+ FinishWritingBinary();
+ }
+ else
+ {
+ Put('\n'); // append a newline in case the file didn't end with one
+ if (IsWritingFile())
+ {
+ bool gotM29 = false;
+ if (IsReady()) // if we have a complete command
+ {
+ gotM29 = (GetCommandLetter() == 'M' && GetCommandNumber() == 29);
+ if (!gotM29) // if it wasn't M29, write it to file
+ {
+ fileBeingWritten->Write(Buffer());
+ fileBeingWritten->Write('\n');
+ }
+ }
+
+ // Close the file whether or not we saw M29
+ fileBeingWritten->Close();
+ fileBeingWritten = nullptr;
+ SetFinished(true);
+ const char* const r = (reprap.GetPlatform().Emulating() == Compatibility::marlin) ? "Done saving file." : "";
+ reprap.GetGCodes().HandleReply(*this, GCodeResult::ok, r);
+ }
+ }
+}
+
// End
diff --git a/src/GCodes/GCodeBuffer.h b/src/GCodes/GCodeBuffer.h
index 6675cf2a..f35ec003 100644
--- a/src/GCodes/GCodeBuffer.h
+++ b/src/GCodes/GCodeBuffer.h
@@ -23,6 +23,7 @@ public:
bool Put(char c) __attribute__((hot)); // Add a character to the end
void Put(const char *str, size_t len); // Add an entire string, overwriting any existing content
void Put(const char *str); // Add a null-terminated string, overwriting any existing content
+ void FileEnded(); // Called when we reach the end of the file we are reading from
bool Seen(char c) __attribute__((hot)); // Is a character present?
char GetCommandLetter() const { return commandLetter; }
@@ -48,7 +49,8 @@ public:
void TryGetUIValue(char c, uint32_t& val, bool& seen);
void TryGetBValue(char c, bool& val, bool& seen);
bool TryGetFloatArray(char c, size_t numVals, float vals[], const StringRef& reply, bool& seen, bool doPad = false);
- bool TryGetQuotedString(char c, const StringRef& str, bool& seen);
+ bool TryGetUIArray(char c, size_t numVals, uint32_t vals[], const StringRef& reply, bool& seen, bool doPad = false);
+ bool TryGetQuotedString(char c, const StringRef& str, bool& seen);
bool TryGetPossiblyQuotedString(char c, const StringRef& str, bool& seen);
const char* Buffer() const;
@@ -57,8 +59,6 @@ public:
bool IsReady() const; // Return true if a gcode is ready but hasn't been started yet
bool IsExecuting() const; // Return true if a gcode has been started and is not paused
void SetFinished(bool f); // Set the G Code executed (or not)
- const char* WritingFileDirectory() const; // If we are writing the G Code to a file, where that file is
- void SetWritingFileDirectory(const char* wfd); // Set the directory for the file to write the GCode in
int GetToolNumberAdjust() const { return toolNumberAdjust; }
void SetToolNumberAdjust(int arg) { toolNumberAdjust = arg; }
void SetCommsProperties(uint32_t arg) { checksumRequired = (arg & 1); }
@@ -79,10 +79,17 @@ public:
bool CanQueueCodes() const;
void MessageAcknowledged(bool cancelled);
FilePosition GetFilePosition(size_t bytesCached) const; // Get the file position at the start of the current command
- bool IsWritingBinary() const; // returns true if writing binary
- void SetBinaryWriting(bool state); // set true if writing binary
- uint32_t GetCRC32() const;
- void SetCRC32(uint32_t newCRC32);
+
+ bool OpenFileToWrite(const char* directory, const char* fileName, const FilePosition size, const bool binaryWrite, const uint32_t fileCRC32); // open a file to write to
+ bool IsWritingFile() const { return fileBeingWritten != nullptr; } // returns true if writing a file
+ void WriteToFile(); // write the current GCode to file
+
+ bool IsWritingBinary() const { return IsWritingFile() && binaryWriting; } // returns true if writing binary
+ void WriteBinaryToFile(char b); // write a byte to the file
+ void FinishWritingBinary();
+
+ size_t CommandLength() const { return commandEnd - commandStart; } // get the length of the current command
+ const char* CommandStart() const { return gcodeBuffer + commandStart; } // get the start of the current command
void PrintCommand(const StringRef& s) const;
@@ -123,7 +130,11 @@ private:
unsigned int gcodeLineEnd; // Number of characters in the entire line of gcode
int readPointer; // Where in the buffer to read next
GCodeBufferState bufferState; // Idle, executing or paused
- const char* writingFileDirectory; // If the G Code is going into a file, where that is
+
+ FileStore *fileBeingWritten; // If we are copying GCodes to a file, which file it is
+ FilePosition writingFileSize; // Size of the file being written, or zero if not known
+ uint8_t eofStringCounter; // Check the...
+
int toolNumberAdjust; // The adjustment to tool numbers in commands we receive
const MessageType responseMessageType; // The message type we use for responses to commands coming from this channel
unsigned int lineNumber;
@@ -145,26 +156,6 @@ private:
bool binaryWriting; // Executing gcode or writing binary file?
};
-inline uint32_t GCodeBuffer::GetCRC32() const
-{
- return crc32;
-}
-
-inline void GCodeBuffer::SetCRC32(uint32_t newCRC32)
-{
- crc32 = newCRC32;
-}
-
-inline bool GCodeBuffer::IsWritingBinary() const
-{
- return binaryWriting;
-}
-
-inline void GCodeBuffer::SetBinaryWriting(bool state)
-{
- binaryWriting = state;
-}
-
inline const char* GCodeBuffer::Buffer() const
{
return gcodeBuffer;
@@ -190,16 +181,6 @@ inline bool GCodeBuffer::IsExecuting() const
return bufferState == GCodeBufferState::executing;
}
-inline const char* GCodeBuffer::WritingFileDirectory() const
-{
- return writingFileDirectory;
-}
-
-inline void GCodeBuffer::SetWritingFileDirectory(const char* wfd)
-{
- writingFileDirectory = wfd;
-}
-
inline GCodeState GCodeBuffer::GetState() const
{
return machineState->state;
diff --git a/src/GCodes/GCodeInput.cpp b/src/GCodes/GCodeInput.cpp
index 2e7383db..d8e159e8 100644
--- a/src/GCodes/GCodeInput.cpp
+++ b/src/GCodes/GCodeInput.cpp
@@ -21,18 +21,16 @@ bool GCodeInput::FillBuffer(GCodeBuffer *gb)
if (gb->IsWritingBinary())
{
// HTML uploads are handled by the GCodes class
- reprap.GetGCodes().WriteHTMLToFile(*gb, c);
+ gb->WriteBinaryToFile(c);
}
else if (gb->Put(c))
{
- // Check if we can finish a file upload
- if (gb->WritingFileDirectory() != nullptr)
+ if (gb->IsWritingFile())
{
- reprap.GetGCodes().WriteGCodeToFile(*gb);
- gb->SetFinished(true);
+ gb->WriteToFile();
}
- // Code is complete, stop here
+ // Code is complete or has been written to file, so stop here
return true;
}
}
@@ -116,7 +114,7 @@ void NetworkGCodeInput::Put(MessageType mtype, char c)
return;
}
- state = (c == 'M') ? GCodeInputState::doingMCode : GCodeInputState::doingCode;
+ state = (c == 'M' || c == 'm') ? GCodeInputState::doingMCode : GCodeInputState::doingCode;
break;
case GCodeInputState::doingCode:
diff --git a/src/GCodes/GCodeQueue.cpp b/src/GCodes/GCodeQueue.cpp
index 207bfd17..97240d36 100644
--- a/src/GCodes/GCodeQueue.cpp
+++ b/src/GCodes/GCodeQueue.cpp
@@ -32,118 +32,94 @@ GCodeQueue::GCodeQueue() : freeItems(nullptr), queuedItems(nullptr)
}
#endif
- switch (gb.GetCommandLetter())
+ // Don't queue anything if no moves are being performed
+ const uint32_t scheduledMoves = reprap.GetMove().GetScheduledMoves();
+ if (scheduledMoves != reprap.GetMove().GetCompletedMoves())
{
- case 'G':
+ switch (gb.GetCommandLetter())
{
- const int code = gb.GetCommandNumber();
- return code == 10 && gb.Seen('P'); // Set active/standby temperatures
- }
+ case 'G':
+ {
+ const int code = gb.GetCommandNumber();
+ return code == 10 && gb.Seen('P'); // Set active/standby temperatures
+ }
- case 'M':
- {
- switch (gb.GetCommandNumber())
+ case 'M':
{
- case 3: // spindle control
- case 4: // spindle control
- case 5: // spindle control
- case 42: // set IO pin
- case 106: // fan control
- case 107: // fan off
- case 104: // set temperatures and return immediately
- case 140: // set bed temperature and return immediately
- case 141: // set chamber temperature and return immediately
- case 144: // bed standby
- case 117: // display message
- case 280: // set servo
- case 300: // beep
- case 420: // set RGB colour
- return true;
-
- case 291:
+ switch (gb.GetCommandNumber())
{
- bool seen = false;
- int32_t sParam = 1;
- gb.TryGetIValue('S', sParam, seen);
- return sParam < 2; // queue non-blocking messages only
+ case 3: // spindle control
+ case 4: // spindle control
+ case 5: // spindle control
+ case 42: // set IO pin
+ case 106: // fan control
+ case 107: // fan off
+ case 104: // set temperatures and return immediately
+ case 140: // set bed temperature and return immediately
+ case 141: // set chamber temperature and return immediately
+ case 144: // bed standby
+ case 117: // display message
+ case 280: // set servo
+ case 300: // beep
+ case 420: // set RGB colour
+ return true;
+
+ case 291:
+ {
+ bool seen = false;
+ int32_t sParam = 1;
+ gb.TryGetIValue('S', sParam, seen);
+ return sParam < 2; // queue non-blocking messages only
+ }
+
+ default:
+ break;
}
-
- default:
- break;
}
- }
- break;
+ break;
- default:
- break;
+ default:
+ break;
+ }
}
return false;
}
-// If moves are scheduled and a command can be queued, try to queue the command in the passed GCodeBuffer.
-// If successful, return true to indicate it has been queued and the caller should not execute it.
-// If the queue is full, free up the oldest queued entry by copying its command to our own gcode buffer so that we have room to queue the original command.
+// Try to queue the command in the passed GCodeBuffer.
+// If successful, return true to indicate it has been queued.
+// If the queue is full or the command is too long to be queued, return false.
bool GCodeQueue::QueueCode(GCodeBuffer &gb)
{
- // Don't queue anything if no moves are being performed
- const uint32_t scheduledMoves = reprap.GetMove().GetScheduledMoves();
- bool queueCode = (scheduledMoves != reprap.GetMove().GetCompletedMoves());
-
- if (queueCode)
+ // Can we queue this code somewhere?
+ if (freeItems == nullptr || gb.CommandLength() > SHORT_GCODE_LENGTH - 1)
{
- char codeToRun[GCODE_LENGTH];
- size_t codeToRunLength;
-
- // Can we queue this code somewhere?
- if (freeItems == nullptr)
- {
- // No - we've run out of free items. Run the first outstanding code
- queueCode = false;
- codeToRunLength = strlen(queuedItems->code) + 1;
- SafeStrncpy(codeToRun, queuedItems->code, ARRAY_SIZE(codeToRun));
-
- // Release the first queued item so that it can be reused later
- QueuedCode * const item = queuedItems;
- queuedItems = item->next;
- item->next = nullptr;
- freeItems = item;
- }
-
- // Unlink a free element and assign gb's code to it
- QueuedCode * const code = freeItems;
- freeItems = code->next;
- code->AssignFrom(gb);
- code->executeAtMove = scheduledMoves;
- code->next = nullptr;
+ return false;
+ }
- // Append it to the list of queued codes
- if (queuedItems == nullptr)
- {
- queuedItems = code;
- }
- else
- {
- QueuedCode *last = queuedItems;
- while (last->Next() != nullptr)
- {
- last = last->Next();
- }
- last->next = code;
- }
+ // Unlink a free element and assign gb's code to it
+ QueuedCode * const code = freeItems;
+ freeItems = code->next;
+ code->AssignFrom(gb);
+ code->executeAtMove = reprap.GetMove().GetScheduledMoves();
+ code->next = nullptr;
- // Overwrite the passed gb's content if we could not store its original code
- if (!queueCode)
+ // Append it to the list of queued codes
+ if (queuedItems == nullptr)
+ {
+ queuedItems = code;
+ }
+ else
+ {
+ QueuedCode *last = queuedItems;
+ while (last->Next() != nullptr)
{
- if (reprap.Debug(moduleGcodes))
- {
- reprap.GetPlatform().Message(DebugMessage, "(swap) ");
- }
- gb.Put(codeToRun, codeToRunLength);
+ last = last->Next();
}
+ last->next = code;
}
- return queueCode;
+ return true;
}
bool GCodeQueue::FillBuffer(GCodeBuffer *gb)
@@ -237,7 +213,9 @@ void GCodeQueue::Diagnostics(MessageType mtype)
void QueuedCode::AssignFrom(GCodeBuffer &gb)
{
toolNumberAdjust = gb.GetToolNumberAdjust();
- SafeStrncpy(code, gb.Buffer(), ARRAY_SIZE(code));
+ const size_t length = min<size_t>(gb.CommandLength(), ARRAY_SIZE(code) - 1);
+ memcpy(code, gb.CommandStart(), length);
+ code[length] = 0;
}
void QueuedCode::AssignTo(GCodeBuffer *gb)
diff --git a/src/GCodes/GCodeQueue.h b/src/GCodes/GCodeQueue.h
index 26f6e065..a366218f 100644
--- a/src/GCodes/GCodeQueue.h
+++ b/src/GCodes/GCodeQueue.h
@@ -10,8 +10,6 @@
#include "RepRapFirmware.h"
#include "GCodeBuffer.h"
-const size_t maxQueuedCodes = 8; // How many codes can be queued?
-
class QueuedCode;
class GCodeQueue
@@ -44,7 +42,7 @@ public:
private:
QueuedCode *next;
- char code[GCODE_LENGTH];
+ char code[SHORT_GCODE_LENGTH];
uint32_t executeAtMove;
int toolNumberAdjust;
diff --git a/src/GCodes/GCodes.cpp b/src/GCodes/GCodes.cpp
index 812d4eef..170e35ea 100644
--- a/src/GCodes/GCodes.cpp
+++ b/src/GCodes/GCodes.cpp
@@ -43,6 +43,10 @@
# include "SAME70_TEST/LinuxComm.h"
#endif
+#if SUPPORT_DOTSTAR_LED
+# include "Fans/DotStarLed.h"
+#endif
+
const size_t gcodeReplyLength = 2048; // long enough to pass back a reasonable number of files in response to M20
// Set up some default values for special moves, e.g. for Z probing and firmware retraction
@@ -65,26 +69,37 @@ GCodes::GCodes(Platform& p) :
#endif
isFlashing(false), fileBeingHashed(nullptr), lastWarningMillis(0)
{
- httpInput = new NetworkGCodeInput();
- telnetInput = new NetworkGCodeInput();
fileInput = new FileGCodeInput();
serialInput = new StreamGCodeInput(SERIAL_MAIN_DEVICE);
+#ifdef SERIAL_AUX_DEVICE
auxInput = new StreamGCodeInput(SERIAL_AUX_DEVICE);
-#if HAS_LINUX_INTERFACE
- spiInput = new NetworkGCodeInput();
#endif
-
+#if HAS_NETWORKING
+ httpInput = new NetworkGCodeInput();
+ telnetInput = new NetworkGCodeInput();
httpGCode = new GCodeBuffer("http", HttpMessage, false);
telnetGCode = new GCodeBuffer("telnet", TelnetMessage, true);
+#else
+ httpGCode = telnetGCode = nullptr;
+#endif
fileGCode = new GCodeBuffer("file", GenericMessage, true);
serialGCode = new GCodeBuffer("serial", UsbMessage, true);
+#ifdef SERIAL_AUX_DEVICE
auxGCode = new GCodeBuffer("aux", LcdMessage, false);
+#else
+ auxGCode = nullptr;
+#endif
daemonGCode = new GCodeBuffer("daemon", GenericMessage, false);
#if SUPPORT_12864_LCD
lcdGCode = new GCodeBuffer("lcd", GenericMessage, false);
+#else
+ lcdGCode = nullptr;
#endif
#if HAS_LINUX_INTERFACE
+ spiInput = new NetworkGCodeInput();
spiGCode = new GCodeBuffer("spi", SpiMessage, false);
+#else
+ spiGCode = nullptr;
#endif
queuedGCode = new GCodeBuffer("queue", GenericMessage, false);
autoPauseGCode = new GCodeBuffer("autopause", GenericMessage, false);
@@ -114,16 +129,14 @@ void GCodes::Init()
{
rawExtruderTotalByDrive[extruder] = 0.0;
}
- eofString = EOF_STRING;
- eofStringCounter = 0;
- eofStringLength = strlen(eofString);
+
runningConfigFile = false;
m501SeenInConfigFile = false;
doingToolChange = false;
active = true;
- fileSize = 0;
limitAxes = noMovesBeforeHoming = true;
SetAllAxesNotHomed();
+
for (size_t i = 0; i < NUM_FANS; ++i)
{
pausedFanSpeeds[i] = 0.0;
@@ -132,7 +145,7 @@ void GCodes::Init()
retractLength = DefaultRetractLength;
retractExtra = 0.0;
- currentZHop = retractHop = 0.0;
+ retractHop = 0.0;
retractSpeed = unRetractSpeed = DefaultRetractSpeed * SecondsToMinutes;
isRetracted = false;
lastAuxStatusReportType = -1; // no status reports requested yet
@@ -146,6 +159,11 @@ void GCodes::Init()
#if SUPPORT_SCANNER
reprap.GetScanner().SetGCodeBuffer(serialGCode);
#endif
+
+#if SUPPORT_DOTSTAR_LED
+ DotStarLed::Init();
+#endif
+
#if HAS_LINUX_INTERFACE
reprap.GetLinuxComm().SetGCodeInput(spiInput);
#endif
@@ -156,26 +174,22 @@ void GCodes::Reset()
{
// Here we could reset the input sources as well, but this would mess up M122\nM999
// because both codes are sent at once from the web interface. Hence we don't do this here.
- httpGCode->Reset();
- telnetGCode->Reset();
- fileGCode->Reset();
- serialGCode->Reset();
- auxGCode->Reset();
- auxGCode->SetCommsProperties(1); // by default, we require a checksum on the aux port
- daemonGCode->Reset();
-#if SUPPORT_12864_LCD
- lcdGCode->Reset();
-#endif
-#if HAS_LINUX_INTERFACE
- spiGCode->Reset();
-#endif
- queuedGCode->Reset();
- autoPauseGCode->Reset();
+ for (GCodeBuffer *gb : gcodeSources)
+ {
+ if (gb != nullptr)
+ {
+ gb->Reset();
+ }
+ }
+
+ if (auxGCode != nullptr)
+ {
+ auxGCode->SetCommsProperties(1); // by default, we require a checksum on the aux port
+ }
nextGcodeSource = 0;
fileToPrint.Close();
- fileBeingWritten = nullptr;
speedFactor = SecondsToMinutes; // default is just to convert from mm/minute to mm/second
for (size_t i = 0; i < MaxExtruders; ++i)
@@ -206,7 +220,8 @@ void GCodes::Reset()
}
ClearMove();
- ClearBabyStepping();
+ ClearBabyStepping(); // clear this before calling ToolOffsetInverseTransform
+ currentZHop = 0.0; // clear this before calling ToolOffsetInverseTransform
moveBuffer.xAxes = DefaultXAxisMapping;
moveBuffer.yAxes = DefaultYAxisMapping;
moveBuffer.virtualExtruderPosition = 0.0;
@@ -258,7 +273,7 @@ bool GCodes::DoingFileMacro() const
{
for (const GCodeBuffer *gb : gcodeSources)
{
- if (gb->IsDoingFileMacro())
+ if (gb != nullptr && gb->IsDoingFileMacro())
{
return true;
}
@@ -314,9 +329,12 @@ bool GCodes::IsDaemonBusy() const
// Copy the feed rate etc. from the daemon to the input channels
void GCodes::CopyConfigFinalValues(GCodeBuffer& gb)
{
- for (size_t i = 0; i < ARRAY_SIZE(gcodeSources); ++i)
+ for (GCodeBuffer *gb2 : gcodeSources)
{
- gcodeSources[i]->MachineState().CopyStateFrom(gb.MachineState());
+ if (gb2 != nullptr)
+ {
+ gb2->MachineState().CopyStateFrom(gb.MachineState());
+ }
}
}
@@ -343,12 +361,15 @@ void GCodes::Spin()
GCodeBuffer *gbp = autoPauseGCode;
if (gbp->IsCompletelyIdle() && !(gbp->MachineState().fileState.IsLive()))
{
- gbp = gcodeSources[nextGcodeSource];
- ++nextGcodeSource; // move on to the next gcode source ready for next time
- if (nextGcodeSource == ARRAY_SIZE(gcodeSources) - 1) // the last one is autoPauseGCode, so don't do it again
+ do
{
- nextGcodeSource = 0;
- }
+ gbp = gcodeSources[nextGcodeSource];
+ ++nextGcodeSource; // move on to the next gcode source ready for next time
+ if (nextGcodeSource == ARRAY_SIZE(gcodeSources) - 1) // the last one is autoPauseGCode, so don't do it again
+ {
+ nextGcodeSource = 0;
+ }
+ } while (gbp == nullptr); // we must have at least one GCode source, so this can't loop indefinitely
}
GCodeBuffer& gb = *gbp;
@@ -1415,6 +1436,7 @@ void GCodes::StartNextGCode(GCodeBuffer& gb, const StringRef& reply)
// Code queue
codeQueue->FillBuffer(queuedGCode);
}
+#if HAS_NETWORKING
else if (&gb == httpGCode)
{
// Webserver
@@ -1425,6 +1447,7 @@ void GCodes::StartNextGCode(GCodeBuffer& gb, const StringRef& reply)
// Telnet
telnetInput->FillBuffer(telnetGCode);
}
+#endif
else if ( &gb == serialGCode
#if SUPPORT_SCANNER
&& !reprap.GetScanner().IsRegistered()
@@ -1434,6 +1457,7 @@ void GCodes::StartNextGCode(GCodeBuffer& gb, const StringRef& reply)
// USB interface. This line may be shared with a 3D scanner
serialInput->FillBuffer(serialGCode);
}
+#ifdef SERIAL_AUX_DEVICE
else if (&gb == auxGCode)
{
// Aux serial port (typically PanelDue)
@@ -1443,6 +1467,7 @@ void GCodes::StartNextGCode(GCodeBuffer& gb, const StringRef& reply)
platform.SetAuxDetected();
}
}
+#endif
#if HAS_LINUX_INTERFACE
else if (&gb == spiGCode)
{
@@ -1463,7 +1488,11 @@ void GCodes::DoFilePrint(GCodeBuffer& gb, const StringRef& reply)
// Yes - fill up the GCodeBuffer and run the next code
if (fileInput->FillBuffer(&gb))
{
- gb.SetFinished(ActOnCode(gb, reply));
+ // We read some data, but we don't necessarily have a command available because we may be executing M28 within a file
+ if (gb.IsReady())
+ {
+ gb.SetFinished(ActOnCode(gb, reply));
+ }
}
break;
@@ -1475,7 +1504,8 @@ void GCodes::DoFilePrint(GCodeBuffer& gb, const StringRef& reply)
// We have reached the end of the file. Check for the last line of gcode not ending in newline.
if (!gb.StartingNewCode()) // if there is something in the buffer
{
- if (gb.Put('\n')) // in case there wasn't a newline ending the file
+ gb.FileEnded(); // append a newline and deal with any pending file write
+ if (gb.IsReady())
{
gb.SetFinished(ActOnCode(gb, reply));
return;
@@ -1981,6 +2011,17 @@ void GCodes::SaveResumeInfo(bool wasPowerFailure)
&& reprap.GetMove().WriteResumeSettings(f); // load grid, if we are using one
if (ok)
{
+ // Write a G92 command to say where the head is. This is useful if we can't Z-home the printer with a print on the bed and the Z steps/mm is high.
+ buf.copy("G92");
+ for (size_t axis = 0; axis < numVisibleAxes; ++axis)
+ {
+ buf.catf(" %c%.3f", axisLetters[axis], (double)pauseRestorePoint.moveCoords[axis]);
+ }
+ buf.cat('\n');
+ ok = f->Write(buf.c_str());
+ }
+ if (ok)
+ {
buf.printf("M98 P%s\n", RESUME_PROLOGUE_G); // call the prologue - must contain at least M116
ok = f->Write(buf.c_str())
&& platform.WriteFanSettings(f); // set the speeds of non-thermostatic fans
@@ -2029,7 +2070,7 @@ void GCodes::SaveResumeInfo(bool wasPowerFailure)
{
if (axis != Z_AXIS)
{
- buf.catf(" %c%.2f", axisLetters[axis], (double)pauseRestorePoint.moveCoords[axis]);
+ buf.catf(" %c%.3f", axisLetters[axis], (double)pauseRestorePoint.moveCoords[axis]);
}
}
@@ -2069,9 +2110,12 @@ void GCodes::Diagnostics(MessageType mtype)
const GCodeBuffer * const movementOwner = resourceOwners[MoveResource];
platform.MessageF(mtype, "Movement lock held by %s\n", (movementOwner == nullptr) ? "null" : movementOwner->GetIdentity());
- for (size_t i = 0; i < ARRAY_SIZE(gcodeSources); ++i)
+ for (GCodeBuffer *gb : gcodeSources)
{
- gcodeSources[i]->Diagnostics(mtype);
+ if (gb != nullptr)
+ {
+ gb->Diagnostics(mtype);
+ }
}
codeQueue->Diagnostics(mtype);
@@ -3080,6 +3124,7 @@ bool GCodes::SaveHeightMap(GCodeBuffer& gb, const StringRef& reply) const
void GCodes::ClearBedMapping()
{
reprap.GetMove().SetIdentityTransform();
+ reprap.GetMove().GetCurrentUserPosition(moveBuffer.coords, 0, reprap.GetCurrentXAxes(), reprap.GetCurrentYAxes());
ToolOffsetInverseTransform(moveBuffer.coords, currentUserPosition); // update user coordinates to remove any height map offset there was at the current position
}
@@ -3125,114 +3170,6 @@ void GCodes::GetCurrentCoordinates(const StringRef& s) const
}
}
-bool GCodes::OpenFileToWrite(GCodeBuffer& gb, const char* directory, const char* fileName, const FilePosition size, const bool binaryWrite, const uint32_t fileCRC32)
-{
- fileBeingWritten = platform.OpenFile(directory, fileName, OpenMode::write);
- eofStringCounter = 0;
- fileSize = size;
- if (fileBeingWritten == nullptr)
- {
- platform.MessageF(ErrorMessage, "Failed to open GCode file \"%s\" for writing.\n", fileName);
- return false;
- }
- else
- {
- gb.SetCRC32(fileCRC32);
- gb.SetBinaryWriting(binaryWrite);
- gb.SetWritingFileDirectory(directory);
- return true;
- }
-}
-
-void GCodes::WriteHTMLToFile(GCodeBuffer& gb, char b)
-{
- if (fileBeingWritten == nullptr)
- {
- platform.Message(ErrorMessage, "Attempt to write to a null file.\n");
- return;
- }
-
- if ((b == eofString[eofStringCounter]) && (fileSize == 0))
- {
- eofStringCounter++;
- if (eofStringCounter >= eofStringLength)
- {
- FinishWrite(gb);
- }
- }
- else
- {
- if (eofStringCounter != 0)
- {
- for (uint8_t i = 0; i < eofStringCounter; i++)
- {
- fileBeingWritten->Write(eofString[i]);
- }
- eofStringCounter = 0;
- }
- fileBeingWritten->Write(b); // writing one character at a time isn't very efficient, but uploading HTML files via USB is rarely done these days
- if (fileSize > 0 && fileBeingWritten->Length() >= fileSize)
- {
- FinishWrite(gb);
- }
- }
-}
-
-void GCodes::FinishWrite(GCodeBuffer& gb)
-{
- const char* r;
- fileBeingWritten->Close();
- if ((gb.GetCRC32() != fileBeingWritten->GetCRC32()) && (gb.GetCRC32() != 0))
- {
- r = "Error: CRC32 checksum doesn't match";
- }
- else
- {
- r = (platform.Emulating() == Compatibility::marlin) ? "Done saving file." : "";
- }
- fileBeingWritten = nullptr;
- gb.SetBinaryWriting(false);
- gb.SetWritingFileDirectory(nullptr);
-
- HandleReply(gb, GCodeResult::ok, r);
-}
-
-void GCodes::WriteGCodeToFile(GCodeBuffer& gb)
-{
- if (fileBeingWritten == nullptr)
- {
- platform.Message(ErrorMessage, "Attempt to write to a null file.\n");
- return;
- }
-
- if (gb.GetCommandLetter() == 'M')
- {
- if (gb.GetCommandNumber() == 29) // end of file?
- {
- fileBeingWritten->Close();
- fileBeingWritten = nullptr;
- gb.SetWritingFileDirectory(nullptr);
- const char* r = (platform.Emulating() == Compatibility::marlin) ? "Done saving file." : "";
- HandleReply(gb, GCodeResult::ok, r);
- return;
- }
- }
- else if (gb.GetCommandLetter() == 'G' && gb.GetCommandNumber() == 998) // resend request?
- {
- if (gb.Seen('P'))
- {
- String<ShortScratchStringLength> scratchString;
- scratchString.printf("%" PRIi32 "\n", gb.GetIValue());
- HandleReply(gb, GCodeResult::ok, scratchString.c_str());
- return;
- }
- }
-
- fileBeingWritten->Write(gb.Buffer());
- fileBeingWritten->Write('\n');
- HandleReply(gb, GCodeResult::ok, "");
-}
-
// Set up a file to print, but don't print it yet.
// If successful return true, else write an error message to reply and return false
bool GCodes::QueueFileToPrint(const char* fileName, const StringRef& reply)
@@ -3556,8 +3493,8 @@ bool GCodes::ManageTool(GCodeBuffer& gb, const StringRef& reply)
}
// Check if filament support is being enforced
- const bool forceFilament = (gb.Seen('L') && gb.GetIValue() > 0);
-
+ const int filamentDrive = gb.Seen('L') ? gb.GetIValue()
+ : ((dCount == 1) ? drives[0] : -1);
if (seen)
{
// Add or delete tool, so start by deleting the old one with this number, if any
@@ -3570,7 +3507,7 @@ bool GCodes::ManageTool(GCodeBuffer& gb, const StringRef& reply)
}
else
{
- Tool* const tool = Tool::Create(toolNumber, name.c_str(), drives, dCount, heaters, hCount, xMap, yMap, fanMap, forceFilament, reply);
+ Tool* const tool = Tool::Create(toolNumber, name.c_str(), drives, dCount, heaters, hCount, xMap, yMap, fanMap, filamentDrive, reply);
if (tool == nullptr)
{
return true;
@@ -4936,7 +4873,7 @@ const char* GCodes::GetMachineModeString() const
}
// Respond to a heater fault. The heater has already been turned off and its status set to 'fault' when this is called from the Heat module.
-// The Heat module will generate an appropriate error message, so on need to do that here.
+// The Heat module will generate an appropriate error message, so no need to do that here.
void GCodes::HandleHeaterFault(int heater)
{
if (heaterFaultState == HeaterFaultState::noFault && fileGCode->OriginalMachineState().fileState.IsLive())
@@ -4978,11 +4915,12 @@ void GCodes::CheckHeaterFault()
reprap.GetHeat().SwitchOffAll(true);
platform.MessageF(ErrorMessage, "Shutting down due to un-cleared heater fault after %lu seconds\n", heaterFaultTimeout/1000);
heaterFaultState = HeaterFaultState::stopping;
+ heaterFaultTime = millis();
}
break;
case HeaterFaultState::stopping:
- if (millis() - heaterFaultTime >= 2000) // wait 2 seconds for the message to be picked up by DWC and PanelDue
+ if (millis() - heaterFaultTime >= 1000) // wait 1 second for the message to be picked up by DWC and PanelDue
{
platform.AtxPowerOff(false);
heaterFaultState = HeaterFaultState::stopped;
diff --git a/src/GCodes/GCodes.h b/src/GCodes/GCodes.h
index 334da7ff..c3ed2977 100644
--- a/src/GCodes/GCodes.h
+++ b/src/GCodes/GCodes.h
@@ -169,11 +169,10 @@ public:
float GetBabyStepOffset() const { return currentBabyStepZOffset; } // Get the current baby stepping Z offset
const float *GetUserPosition() const { return currentUserPosition; } // Return the current user position
+#if HAS_NETWORKING
NetworkGCodeInput *GetHTTPInput() const { return httpInput; }
NetworkGCodeInput *GetTelnetInput() const { return telnetInput; }
-
- void WriteGCodeToFile(GCodeBuffer& gb); // Write this GCode into a file
- void WriteHTMLToFile(GCodeBuffer& gb, char b); // Save an HTML file (usually to upload a new web interface)
+#endif
bool IsFlashing() const { return isFlashing; } // Is a new firmware binary going to be flashed?
@@ -223,6 +222,7 @@ public:
#endif
void SetMappedFanSpeed(float f); // Set the mapped fan speed
+ void HandleReply(GCodeBuffer& gb, GCodeResult rslt, const char *reply); // Handle G-Code replies
private:
GCodes(const GCodes&); // private copy constructor to prevent copying
@@ -262,7 +262,6 @@ private:
bool HandleMcode(GCodeBuffer& gb, const StringRef& reply); // Do an M code
bool HandleTcode(GCodeBuffer& gb, const StringRef& reply); // Do a T code
bool HandleResult(GCodeBuffer& gb, GCodeResult rslt, const StringRef& reply);
- void HandleReply(GCodeBuffer& gb, GCodeResult rslt, const char *reply); // Handle G-Code replies
void HandleReply(GCodeBuffer& gb, bool error, OutputBuffer *reply);
const char* DoStraightMove(GCodeBuffer& gb, bool isCoordinated) __attribute__((hot)); // Execute a straight move returning any error message
@@ -291,9 +290,7 @@ private:
bool Push(GCodeBuffer& gb); // Push feedrate etc on the stack
void Pop(GCodeBuffer& gb); // Pop feedrate etc
void DisableDrives(); // Turn the motors off
- bool OpenFileToWrite(GCodeBuffer& gb, const char* directory, const char* fileName, const FilePosition size, const bool binaryWrite, const uint32_t fileCRC32);
// Start saving GCodes in a file
- void FinishWrite(GCodeBuffer& gb); // Finish writing to the file and respond
bool SendConfigToLine(); // Deal with M503
GCodeResult OffsetAxes(GCodeBuffer& gb, const StringRef& reply); // Set/report offsets
@@ -381,37 +378,32 @@ private:
Platform& platform; // The RepRap machine
- NetworkGCodeInput* httpInput; // These cache incoming G-codes...
- NetworkGCodeInput* telnetInput; // ...
FileGCodeInput* fileInput; // ...
StreamGCodeInput* serialInput; // ...
- StreamGCodeInput* auxInput; // ...
+
+#if HAS_NETWORKING
+ NetworkGCodeInput* httpInput; // These cache incoming G-codes...
+ NetworkGCodeInput* telnetInput; // ...
+#endif
+#ifdef SERIAL_AUX_DEVICE
+ StreamGCodeInput* auxInput; // ...for the GCodeBuffers below
+#endif
#if HAS_LINUX_INTERFACE
NetworkGCodeInput* spiInput; // ...for the GCodeBuffers below
#endif
-#if SUPPORT_12864_LCD || HAS_LINUX_INTERFACE
- GCodeBuffer* gcodeSources[9]; // The various sources of gcodes
-#else
- GCodeBuffer* gcodeSources[8]; // The various sources of gcodes
-#endif
+ GCodeBuffer* gcodeSources[10]; // The various sources of gcodes
GCodeBuffer*& httpGCode = gcodeSources[0];
GCodeBuffer*& telnetGCode = gcodeSources[1];
GCodeBuffer*& fileGCode = gcodeSources[2];
GCodeBuffer*& serialGCode = gcodeSources[3];
- GCodeBuffer*& auxGCode = gcodeSources[4]; // This one is for the LCD display on the async serial interface
+ GCodeBuffer*& auxGCode = gcodeSources[4]; // This one is for the PanelDue on the async serial interface
GCodeBuffer*& daemonGCode = gcodeSources[5]; // Used for executing config.g and trigger macro files
GCodeBuffer*& queuedGCode = gcodeSources[6];
-#if SUPPORT_12864_LCD
- GCodeBuffer*& lcdGCode = gcodeSources[7]; // This one for the internally-supported LCD
- GCodeBuffer*& autoPauseGCode = gcodeSources[8]; // ***THIS ONE MUST BE LAST*** GCode state machine used to run macros on power fail, heater faults and filament out
-#elif HAS_LINUX_INTERFACE
- GCodeBuffer*& spiGCode = gcodeSources[7];
- GCodeBuffer*& autoPauseGCode = gcodeSources[8]; // ***THIS ONE MUST BE LAST*** GCode state machine used to run macros on power fail, heater faults and filament out
-#else
- GCodeBuffer*& autoPauseGCode = gcodeSources[7]; // ***THIS ONE MUST BE LAST*** GCode state machine used to run macros on power fail, heater faults and filament out
-#endif
+ GCodeBuffer*& lcdGCode = gcodeSources[7]; // This one for the 12864 LCD
+ GCodeBuffer*& spiGCode = gcodeSources[8];
+ GCodeBuffer*& autoPauseGCode = gcodeSources[9]; // ***THIS ONE MUST BE LAST*** GCode state machine used to run macros on power fail, heater faults and filament out
size_t nextGcodeSource; // The one to check next
@@ -485,13 +477,6 @@ private:
FileData fileToPrint; // The next file to print
FilePosition fileOffsetToPrint; // The offset to print from
- FileStore* fileBeingWritten; // A file to write G Codes (or sometimes HTML) to
- FilePosition fileSize; // Size of the file being written
-
- const char* eofString; // What's at the end of an HTML file?
- uint8_t eofStringCounter; // Check the...
- uint8_t eofStringLength; // ... EoF string as we read.
-
char axisLetters[MaxAxes + 1]; // The names of the axes, with a null terminator
bool limitAxes; // Don't think outside the box
bool noMovesBeforeHoming; // Don't allow movement prior to homing the associates axes
diff --git a/src/GCodes/GCodes2.cpp b/src/GCodes/GCodes2.cpp
index da2056da..e4c5e33c 100644
--- a/src/GCodes/GCodes2.cpp
+++ b/src/GCodes/GCodes2.cpp
@@ -30,16 +30,22 @@
# include "FirmwareUpdater.h"
#endif
-#if defined(DUET_NG)
-# include "TMC2660.h"
-#elif defined(DUET_M)
-# include "TMC22xx.h"
+#if SUPPORT_TMC2660
+# include "StepperDrivers/TMC2660/TMC2660.h"
+#endif
+
+#if SUPPORT_TMC22xx
+# include "StepperDrivers/TMC22xx/TMC22xx.h"
#endif
#if SUPPORT_12864_LCD
# include "Display/Display.h"
#endif
+#if SUPPORT_DOTSTAR_LED
+# include "Fans/DotStarLed.h"
+#endif
+
#include <utility> // for std::swap
// If the code to act on is completed, this returns true, otherwise false.
@@ -61,6 +67,8 @@ bool GCodes::ActOnCode(GCodeBuffer& gb, const StringRef& reply)
HandleReply(gb, GCodeResult::ok, "");
return true;
}
+
+ return false; // we should queue this code but we can't, so wait until we can either execute it or queue it
}
switch (gb.GetCommandLetter())
@@ -230,9 +238,13 @@ bool GCodes::HandleGcode(GCodeBuffer& gb, const StringRef& reply)
result = LoadHeightMap(gb, reply);
break;
- default: // clear height map
+ case 2: // clear height map
ClearBedMapping();
break;
+
+ default:
+ result = GCodeResult::badOrMissingParameter;
+ break;
}
}
break;
@@ -850,7 +862,7 @@ bool GCodes::HandleMcode(GCodeBuffer& gb, const StringRef& reply)
String<MaxFilenameLength> filename;
if (gb.GetUnprecedentedString(filename.GetRef()))
{
- const bool ok = OpenFileToWrite(gb, platform.GetGCodeDir(), filename.c_str(), 0, false, 0);
+ const bool ok = gb.OpenFileToWrite(platform.GetGCodeDir(), filename.c_str(), 0, false, 0);
if (ok)
{
reply.printf("Writing to file: %s", filename.c_str());
@@ -1730,6 +1742,12 @@ bool GCodes::HandleMcode(GCodeBuffer& gb, const StringRef& reply)
}
break;
+#if SUPPORT_DOTSTAR_LED
+ case 150:
+ result = DotStarLed::SetColours(gb, reply);
+ break;
+#endif
+
case 190: // Set bed temperature and wait
case 191: // Set chamber temperature and wait
if ( !LockMovementAndWaitForStandstill(gb) // wait until movement has finished
@@ -2016,13 +2034,16 @@ bool GCodes::HandleMcode(GCodeBuffer& gb, const StringRef& reply)
{
// Update the feed rate for ALL input sources, and all feed rates on the stack
const float speedFactorRatio = newSpeedFactor / speedFactor;
- for (size_t i = 0; i < ARRAY_SIZE(gcodeSources); ++i)
+ for (GCodeBuffer *gb2 : gcodeSources)
{
- GCodeMachineState *ms = &gcodeSources[i]->MachineState();
- while (ms != nullptr)
+ if (gb2 != nullptr)
{
- ms->feedRate *= speedFactorRatio;
- ms = ms->previous;
+ GCodeMachineState *ms = &gb2->MachineState();
+ while (ms != nullptr)
+ {
+ ms->feedRate *= speedFactorRatio;
+ ms = ms->previous;
+ }
}
}
// If the last move hasn't gone yet, update its feed rate too if it is not a firmware retraction
@@ -2257,13 +2278,13 @@ bool GCodes::HandleMcode(GCodeBuffer& gb, const StringRef& reply)
case 303: // Run PID tuning
if (gb.Seen('H'))
{
- const int heater = gb.GetIValue();
+ const unsigned int heater = gb.GetUIValue();
const float temperature = (gb.Seen('S')) ? gb.GetFValue()
: reprap.GetHeat().IsBedHeater(heater) ? 75.0
: reprap.GetHeat().IsChamberHeater(heater) ? 50.0
: 200.0;
const float maxPwm = (gb.Seen('P')) ? gb.GetFValue() : reprap.GetHeat().GetHeaterModel(heater).GetMaxPwm();
- if (heater < 0 || heater >= (int)Heaters)
+ if (heater >= Heaters)
{
reply.copy("Bad heater number in M303 command");
}
@@ -2297,8 +2318,8 @@ bool GCodes::HandleMcode(GCodeBuffer& gb, const StringRef& reply)
case 307: // Set heater process model parameters
if (gb.Seen('H'))
{
- const int heater = gb.GetIValue();
- if (heater >= 0 && heater < (int)Heaters)
+ const unsigned int heater = gb.GetUIValue();
+ if (heater < Heaters)
{
const FopDt& model = reprap.GetHeat().GetHeaterModel(heater);
bool seen = false;
@@ -2963,7 +2984,7 @@ bool GCodes::HandleMcode(GCodeBuffer& gb, const StringRef& reply)
}
const FilePosition size = (gb.Seen('S') ? (FilePosition)gb.GetIValue() : 0);
const uint32_t crc32 = (gb.Seen('C') ? gb.GetUIValue() : 0);
- const bool ok = OpenFileToWrite(gb, folder, filename.c_str(), size, true, crc32);
+ const bool ok = gb.OpenFileToWrite(folder, filename.c_str(), size, true, crc32);
if (ok)
{
reply.printf("Writing to file: %s", filename.c_str());
@@ -2976,15 +2997,19 @@ bool GCodes::HandleMcode(GCodeBuffer& gb, const StringRef& reply)
}
break;
- case 561: // Set identity transform (also clears bed probe grid)
+ case 561: // Set identity transform and disable height map
+ if (!LockMovementAndWaitForStandstill(gb))
+ {
+ return false;
+ }
ClearBedMapping();
break;
case 562: // Reset temperature fault - use with great caution
if (gb.Seen('P'))
{
- const int heater = gb.GetIValue();
- if (heater >= 0 && heater < (int)Heaters)
+ const unsigned int heater = gb.GetUIValue();
+ if (heater < Heaters)
{
reprap.ClearTemperatureFault(heater);
}
@@ -2997,7 +3022,7 @@ bool GCodes::HandleMcode(GCodeBuffer& gb, const StringRef& reply)
else
{
// Clear all heater faults
- for (int heater = 0; heater < (int)Heaters; ++heater)
+ for (unsigned int heater = 0; heater < Heaters; ++heater)
{
reprap.ClearTemperatureFault(heater);
}
@@ -3198,8 +3223,8 @@ bool GCodes::HandleMcode(GCodeBuffer& gb, const StringRef& reply)
}
if (gb.Seen('H'))
{
- const int heater = gb.GetIValue();
- if (heater >= 0 && heater < (int)Heaters)
+ const unsigned heater = gb.GetUIValue();
+ if (heater < Heaters)
{
bool seenValue = false;
float maxTempExcursion, maxFaultTime;
@@ -3296,10 +3321,10 @@ bool GCodes::HandleMcode(GCodeBuffer& gb, const StringRef& reply)
case 573: // Report heater average PWM
if (gb.Seen('P'))
{
- const int heater = gb.GetIValue();
- if (heater >= 0 && heater < (int)Heaters)
+ const unsigned int heater = gb.GetUIValue();
+ if (heater < Heaters)
{
- reply.printf("Average heater %d PWM: %.3f", heater, (double)reprap.GetHeat().GetAveragePWM(heater));
+ reply.printf("Average heater %u PWM: %.3f", heater, (double)reprap.GetHeat().GetAveragePWM(heater));
}
}
break;
@@ -3373,8 +3398,11 @@ bool GCodes::HandleMcode(GCodeBuffer& gb, const StringRef& reply)
serialGCode->SetCommsProperties(val);
break;
case 1:
- auxGCode->SetCommsProperties(val);
- platform.SetAuxDetected();
+ if (auxGCode != nullptr)
+ {
+ auxGCode->SetCommsProperties(val);
+ platform.SetAuxDetected();
+ }
break;
default:
break;
diff --git a/src/Heating/Heat.cpp b/src/Heating/Heat.cpp
index d56fbb83..3f819d62 100644
--- a/src/Heating/Heat.cpp
+++ b/src/Heating/Heat.cpp
@@ -102,6 +102,10 @@ void Heat::Init()
for (size_t heater : ARRAY_INDICES(pids))
{
heaterSensors[heater] = nullptr; // no temperature sensor assigned yet
+#ifdef PCCB
+ // PCCB has no heaters by default, but we pretend that the LED outputs are heaters. So disable the PID controllers.
+ pids[heater]->Init(-1.0, -1.0, -1.0, true, false);
+#else
if (IsBedOrChamberHeater(heater))
{
pids[heater]->Init(DefaultBedHeaterGain, DefaultBedHeaterTimeConstant, DefaultBedHeaterDeadTime, false, false);
@@ -117,6 +121,7 @@ void Heat::Init()
{
pids[heater]->Init(DefaultHotEndHeaterGain, DefaultHotEndHeaterTimeConstant, DefaultHotEndHeaterDeadTime, true, false);
}
+#endif
lastStandbyTools[heater] = nullptr;
}
@@ -134,8 +139,10 @@ void Heat::Init()
#endif
#if HAS_SMART_DRIVERS
virtualHeaterSensors[1] = TemperatureSensor::Create(FirstTmcDriversSenseChannel);
+#ifndef PCCB
virtualHeaterSensors[2] = TemperatureSensor::Create(FirstTmcDriversSenseChannel + 1);
#endif
+#endif
#if SUPPORT_DHT_SENSOR
// Initialise static fields of the DHT sensor
@@ -185,6 +192,8 @@ void Heat::Task()
heaterBeingTuned = -1;
}
+ reprap.KickHeatTaskWatchdog();
+
// Delay until it is time again
vTaskDelayUntil(&lastWakeTime, platform.HeatSampleInterval());
}
@@ -630,8 +639,6 @@ HeaterProtection& Heat::AccessHeaterProtection(size_t index) const
return *heaterProtections[index];
}
-
-
// Updates the PIDs and HeaterProtection items after a heater change
void Heat::UpdateHeaterProtection()
{
diff --git a/src/Heating/Sensors/TemperatureSensor.cpp b/src/Heating/Sensors/TemperatureSensor.cpp
index 2f97a41a..12b45866 100644
--- a/src/Heating/Sensors/TemperatureSensor.cpp
+++ b/src/Heating/Sensors/TemperatureSensor.cpp
@@ -86,11 +86,11 @@ void TemperatureSensor::TryConfigureHeaterName(GCodeBuffer& gb, bool& seen)
TemperatureSensor *TemperatureSensor::Create(unsigned int channel)
{
TemperatureSensor *ts = nullptr;
- if (channel < Heaters)
+ if (channel < NumThermistorInputs)
{
ts = new Thermistor(channel, false);
}
- else if (FirstPT1000Channel <= channel && channel < FirstPT1000Channel + Heaters)
+ else if (FirstPT1000Channel <= channel && channel < FirstPT1000Channel + NumThermistorInputs)
{
ts = new Thermistor(channel, true);
}
diff --git a/src/Libraries/Fatfs/diskio.cpp b/src/Libraries/Fatfs/diskio.cpp
index 6ee696eb..70656778 100644
--- a/src/Libraries/Fatfs/diskio.cpp
+++ b/src/Libraries/Fatfs/diskio.cpp
@@ -52,6 +52,15 @@
#include <cstring>
+static unsigned int highestSdRetriesDone = 0;
+
+unsigned int DiskioGetAndClearMaxRetryCount()
+{
+ const unsigned int ret = highestSdRetriesDone;
+ highestSdRetriesDone = 0;
+ return ret;
+}
+
//void debugPrintf(const char*, ...);
//#if (SAM3S || SAM3U || SAM3N || SAM3XA_SERIES || SAM4S)
@@ -161,22 +170,35 @@ DRESULT disk_read(BYTE drv, BYTE *buff, DWORD sector, BYTE count)
#if ACCESS_MEM_TO_RAM
MutexLocker lock((drv >= SD_MMC_HSMCI_MEM_CNT) ? Tasks::GetSpiMutex() : nullptr);
- uint8_t uc_sector_size = mem_sector_size(drv);
- uint32_t ul_last_sector_num;
-
- if (uc_sector_size == 0) {
+ const uint8_t uc_sector_size = mem_sector_size(drv);
+ if (uc_sector_size == 0)
+ {
return RES_ERROR;
}
/* Check valid address */
+ uint32_t ul_last_sector_num;
mem_read_capacity(drv, &ul_last_sector_num);
- if ((sector + count * uc_sector_size) > (ul_last_sector_num + 1) * uc_sector_size) {
+ if ((sector + count * uc_sector_size) > (ul_last_sector_num + 1) * uc_sector_size)
+ {
return RES_PARERR;
}
/* Read the data */
- if (memory_2_ram(drv, sector, buff, count) != CTRL_GOOD) {
- return RES_ERROR;
+ unsigned int retryNumber = 0;
+ while (memory_2_ram(drv, sector, buff, count) != CTRL_GOOD)
+ {
+ ++retryNumber;
+ if (retryNumber == MaxSdCardTries)
+ {
+ return RES_ERROR;
+ }
+ delay(SdCardRetryDelay);
+ }
+
+ if (retryNumber > highestSdRetriesDone)
+ {
+ highestSdRetriesDone = retryNumber;
}
return RES_OK;
@@ -208,23 +230,36 @@ DRESULT disk_write(BYTE drv, BYTE const *buff, DWORD sector, BYTE count)
#if ACCESS_MEM_TO_RAM
MutexLocker lock((drv >= SD_MMC_HSMCI_MEM_CNT) ? Tasks::GetSpiMutex() : nullptr);
- uint8_t uc_sector_size = mem_sector_size(drv);
- uint32_t ul_last_sector_num;
+ const uint8_t uc_sector_size = mem_sector_size(drv);
- if (uc_sector_size == 0) {
+ if (uc_sector_size == 0)
+ {
return RES_ERROR;
}
/* Check valid address */
+ uint32_t ul_last_sector_num;
mem_read_capacity(drv, &ul_last_sector_num);
- if ((sector + count * uc_sector_size) >
- (ul_last_sector_num + 1) * uc_sector_size) {
+ if ((sector + count * uc_sector_size) > (ul_last_sector_num + 1) * uc_sector_size)
+ {
return RES_PARERR;
}
/* Write the data */
- if (ram_2_memory(drv, sector, buff, count) != CTRL_GOOD) {
- return RES_ERROR;
+ unsigned int retryNumber = 0;
+ while (ram_2_memory(drv, sector, buff, count) != CTRL_GOOD)
+ {
+ ++retryNumber;
+ if (retryNumber == MaxSdCardTries)
+ {
+ return RES_ERROR;
+ }
+ delay(SdCardRetryDelay);
+ }
+
+ if (retryNumber > highestSdRetriesDone)
+ {
+ highestSdRetriesDone = retryNumber;
}
return RES_OK;
diff --git a/src/Libraries/Fatfs/diskio.h b/src/Libraries/Fatfs/diskio.h
index 40817bc5..43e5966c 100644
--- a/src/Libraries/Fatfs/diskio.h
+++ b/src/Libraries/Fatfs/diskio.h
@@ -5,6 +5,7 @@
#ifndef _DISKIO
#ifdef __cplusplus
+unsigned int DiskioGetAndClearMaxRetryCount();
extern "C" {
#endif
diff --git a/src/Libraries/Fatfs/ff.h b/src/Libraries/Fatfs/ff.h
index 7f0d91ab..9e89aa4f 100644
--- a/src/Libraries/Fatfs/ff.h
+++ b/src/Libraries/Fatfs/ff.h
@@ -193,7 +193,7 @@ typedef enum {
FR_NO_FILESYSTEM, /* (13) There is no valid FAT volume */
FR_MKFS_ABORTED, /* (14) The f_mkfs() aborted due to any parameter error */
FR_TIMEOUT, /* (15) Could not get a grant to access the volume within defined period */
- FR_LOCKED, /* (16) The operation is rejected according to the file shareing policy */
+ FR_LOCKED, /* (16) The operation is rejected according to the file sharing policy */
FR_NOT_ENOUGH_CORE, /* (17) LFN working buffer could not be allocated */
FR_TOO_MANY_OPEN_FILES, /* (18) Number of open files > _FS_SHARE */
FR_INVALID_PARAMETER /* (19) Given parameter is invalid */
diff --git a/src/Movement/BedProbing/RotaryCompensation.cpp b/src/Movement/BedProbing/RotaryCompensation.cpp
deleted file mode 100644
index c7b48816..00000000
--- a/src/Movement/BedProbing/RotaryCompensation.cpp
+++ /dev/null
@@ -1,10 +0,0 @@
-/*
- * RotaryCompensation.cpp
- *
- * Created on: Jul 4, 2018
- * Author: Christian
- */
-
-
-
-
diff --git a/src/Movement/BedProbing/RotaryCompensation.h b/src/Movement/BedProbing/RotaryCompensation.h
deleted file mode 100644
index 749c09d4..00000000
--- a/src/Movement/BedProbing/RotaryCompensation.h
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
- * RotaryCompensation.h
- *
- * Created on: Jul 4, 2018
- * Author: Christian
- */
-
-#ifndef SRC_MOVEMENT_BEDPROBING_ROTARYCOMPENSATION_H_
-#define SRC_MOVEMENT_BEDPROBING_ROTARYCOMPENSATION_H_
-
-
-
-
-
-#endif /* SRC_MOVEMENT_BEDPROBING_ROTARYCOMPENSATION_H_ */
diff --git a/src/Movement/DDA.cpp b/src/Movement/DDA.cpp
index f63c78fb..4e0caa91 100644
--- a/src/Movement/DDA.cpp
+++ b/src/Movement/DDA.cpp
@@ -248,8 +248,17 @@ void DDA::Init()
// Either way, return the amount of extrusion we didn't do in the extruder coordinates of nextMove
bool DDA::Init(GCodes::RawMove &nextMove, bool doMotorMapping)
{
- // 1. Compute the new endpoints and the movement vector
+ // 0. If there are more total axes than visible axes, then we must ignore any movement data in nextMove for the invisible axes.
+ // The call to CartesianToMotorSteps may adjust the invisible axis endpoints for architectures such as CoreXYU, so set them up here.
+ const size_t numTotalAxes = reprap.GetGCodes().GetTotalAxes();
+ const size_t numVisibleAxes = reprap.GetGCodes().GetVisibleAxes();
const int32_t * const positionNow = prev->DriveCoordinates();
+ for (size_t axis = numVisibleAxes; axis < numTotalAxes; ++axis)
+ {
+ endPoint[axis] = positionNow[axis];
+ }
+
+ // 1. Compute the new endpoints and the movement vector
const Move& move = reprap.GetMove();
if (doMotorMapping)
{
@@ -271,20 +280,19 @@ bool DDA::Init(GCodes::RawMove &nextMove, bool doMotorMapping)
bool realMove = false;
float accelerations[DRIVES];
const float * const normalAccelerations = reprap.GetPlatform().Accelerations();
- const size_t numAxes = reprap.GetGCodes().GetTotalAxes();
const Kinematics& k = move.GetKinematics();
for (size_t drive = 0; drive < DRIVES; drive++)
{
accelerations[drive] = normalAccelerations[drive];
- if (drive >= numAxes || !doMotorMapping)
+ if (drive >= numTotalAxes || (!doMotorMapping && drive < numVisibleAxes))
{
endPoint[drive] = Move::MotorEndPointToMachine(drive, nextMove.coords[drive]);
}
endCoordinates[drive] = nextMove.coords[drive];
int32_t delta;
- if (drive < numAxes)
+ if (drive < numTotalAxes)
{
delta = endPoint[drive] - positionNow[drive];
if (k.IsContinuousRotationAxis(drive) && nextMove.moveType != 1 && nextMove.moveType != 2)
@@ -305,7 +313,7 @@ bool DDA::Init(GCodes::RawMove &nextMove, bool doMotorMapping)
delta = endPoint[drive];
}
- if (drive < numAxes && doMotorMapping)
+ if (drive < numTotalAxes && doMotorMapping)
{
const float positionDelta = nextMove.coords[drive] - prev->GetEndCoordinate(drive, false);
directionVector[drive] = positionDelta;
@@ -317,7 +325,7 @@ bool DDA::Init(GCodes::RawMove &nextMove, bool doMotorMapping)
else
{
directionVector[drive] = (float)delta/reprap.GetPlatform().DriveStepsPerUnit(drive);
- if (drive >= numAxes && nextMove.coords[drive] > 0.0)
+ if (drive >= numTotalAxes && nextMove.coords[drive] > 0.0)
{
extruding = true;
}
@@ -331,14 +339,14 @@ bool DDA::Init(GCodes::RawMove &nextMove, bool doMotorMapping)
pdm->totalSteps = labs(delta); // for now this is the number of net steps, but gets adjusted later if there is a reverse in direction
pdm->direction = (delta >= 0); // for now this is the direction of net movement, but gets adjusted later if it is a delta movement
- if (drive >= numAxes)
+ if (drive >= numTotalAxes)
{
// It's an extruder movement
nextMove.coords[drive] -= directionVector[drive];
// subtract the amount of extrusion we actually did to leave the residue outstanding
if (xyMoving && nextMove.usePressureAdvance)
{
- const float compensationTime = reprap.GetPlatform().GetPressureAdvance(drive - numAxes);
+ const float compensationTime = reprap.GetPlatform().GetPressureAdvance(drive - numTotalAxes);
if (compensationTime > 0.0)
{
// Compensation causes instant velocity changes equal to acceleration * k, so we may need to limit the acceleration
@@ -359,7 +367,7 @@ bool DDA::Init(GCodes::RawMove &nextMove, bool doMotorMapping)
// Update the end position in the previous move, so that on the next move we don't think there is XY movement when the user didn't ask for any
if (doMotorMapping)
{
- for (size_t drive = 0; drive < numAxes; ++drive)
+ for (size_t drive = 0; drive < numTotalAxes; ++drive)
{
prev->endCoordinates[drive] = nextMove.coords[drive];
}
@@ -423,7 +431,7 @@ bool DDA::Init(GCodes::RawMove &nextMove, bool doMotorMapping)
else if (axesMoving)
{
// Some axes are moving, but not axes that X or Y are mapped to. Normalise the movement to the vector sum of the axes that are moving.
- totalDistance = Normalise(directionVector, DRIVES, numAxes);
+ totalDistance = Normalise(directionVector, DRIVES, numTotalAxes);
}
else
{
diff --git a/src/Movement/Kinematics/HangprinterKinematics.cpp b/src/Movement/Kinematics/HangprinterKinematics.cpp
index a77d377c..f7c066a0 100644
--- a/src/Movement/Kinematics/HangprinterKinematics.cpp
+++ b/src/Movement/Kinematics/HangprinterKinematics.cpp
@@ -12,19 +12,14 @@
#include "Movement/Move.h"
//#include "Movement/BedProbing/RandomProbePointSet.h"
-// Default anchor coordinates, copied from https://github.com/tobbelobb/hangprinter/blob/fabf19bf4653d1d1daf72d53217ba5962c9aca6e/firmware/HangprinterMarlin/Configuration.h
-constexpr float DefaultAnchorA[3] = { 0.0, -2163.0, -75.5};
-constexpr float DefaultAnchorB[3] = {-1841.0, 741.0, -75.5};
-constexpr float DefaultAnchorC[3] = { 1639.0, 1404.0, -75.5};
-constexpr float DefaultAnchorDz = 3250.5;
+// Default anchor coordinates
+// These are only placeholders. Each machine must have these values calibrated in order to work correctly.
+constexpr float DefaultAnchorA[3] = { 0.0, -2000.0, -100.0};
+constexpr float DefaultAnchorB[3] = { 2000.0, 1000.0, -100.0};
+constexpr float DefaultAnchorC[3] = {-2000.0, 1000.0, -100.0};
+constexpr float DefaultAnchorDz = 3000.0;
constexpr float DefaultPrintRadius = 1500.0;
-constexpr size_t HANGPRINTER_AXES = 4;
-constexpr size_t A_AXIS = 0;
-constexpr size_t B_AXIS = 1;
-constexpr size_t C_AXIS = 2;
-constexpr size_t D_AXIS = 3;
-
// Constructor
HangprinterKinematics::HangprinterKinematics()
: Kinematics(KinematicsType::scara, DefaultSegmentsPerSecond, DefaultMinSegmentSize, true)
@@ -39,7 +34,7 @@ void HangprinterKinematics::Init()
ARRAY_INIT(anchorA, DefaultAnchorA);
ARRAY_INIT(anchorB, DefaultAnchorB);
ARRAY_INIT(anchorC, DefaultAnchorC);
- doneAutoCalibration = false;
+ doneAutoCalibration = false;
Recalc();
}
@@ -140,7 +135,7 @@ bool HangprinterKinematics::Configure(unsigned int mCode, GCodeBuffer& gb, const
}
// Calculate the square of the line length from a spool from a Cartesian coordinate
-inline float HangprinterKinematics::LineLengthASquared(const float machinePos[3], const float anchor[3]) const
+inline float HangprinterKinematics::LineLengthSquared(const float machinePos[3], const float anchor[3]) const
{
return fsquare(anchor[Z_AXIS] - machinePos[Z_AXIS]) + fsquare(anchor[Y_AXIS] - machinePos[Y_AXIS]) + fsquare(anchor[X_AXIS] - machinePos[X_AXIS]);
}
@@ -148,15 +143,13 @@ inline float HangprinterKinematics::LineLengthASquared(const float machinePos[3]
// Convert Cartesian coordinates to motor coordinates, returning true if successful
bool HangprinterKinematics::CartesianToMotorSteps(const float machinePos[], const float stepsPerMm[], size_t numVisibleAxes, size_t numTotalAxes, int32_t motorPos[], bool isCoordinated) const
{
- // Geometry of hangprinter makes fsquare(anchorABC[Z_AXIS] - machinePos[Z_AXIS]) the smallest term in the sum.
- // Starting sum with smallest number gives smallest roundoff error.
- const float aSquared = LineLengthASquared(machinePos, anchorA);
- const float bSquared = LineLengthASquared(machinePos, anchorB);
- const float cSquared = LineLengthASquared(machinePos, anchorC);
+ const float aSquared = LineLengthSquared(machinePos, anchorA);
+ const float bSquared = LineLengthSquared(machinePos, anchorB);
+ const float cSquared = LineLengthSquared(machinePos, anchorC);
const float dSquared = fsquare(machinePos[X_AXIS])
+ fsquare(machinePos[Y_AXIS])
+ fsquare(anchorDz - machinePos[Z_AXIS]);
- if (aSquared < 0.0 && bSquared < 0.0 && cSquared < 0.0 && dSquared < 0.0)
+ if (aSquared > 0.0 && bSquared > 0.0 && cSquared > 0.0 && dSquared > 0.0)
{
motorPos[A_AXIS] = lrintf(sqrtf(aSquared) * stepsPerMm[A_AXIS]);
motorPos[B_AXIS] = lrintf(sqrtf(bSquared) * stepsPerMm[B_AXIS]);
@@ -372,9 +365,9 @@ bool HangprinterKinematics::DoAutoCalibration(size_t numFactors, const RandomPro
const floatc_t zp = reprap.GetMove().GetProbeCoordinates(i, machinePos[X_AXIS], machinePos[Y_AXIS], probePoints.PointWasCorrected(i));
machinePos[Z_AXIS] = 0.0;
- probeMotorPositions(i, A_AXIS) = sqrtf(LineLengthASquared(machinePos, anchorA));
- probeMotorPositions(i, B_AXIS) = sqrtf(LineLengthASquared(machinePos, anchorB));
- probeMotorPositions(i, C_AXIS) = sqrtf(LineLengthASquared(machinePos, anchorC));
+ probeMotorPositions(i, A_AXIS) = sqrtf(LineLengthSquared(machinePos, anchorA));
+ probeMotorPositions(i, B_AXIS) = sqrtf(LineLengthSquared(machinePos, anchorB));
+ probeMotorPositions(i, C_AXIS) = sqrtf(LineLengthSquared(machinePos, anchorC));
initialSumOfSquares += fcsquare(zp);
}
diff --git a/src/Movement/Kinematics/HangprinterKinematics.h b/src/Movement/Kinematics/HangprinterKinematics.h
index 60a342d9..96ceb9ef 100644
--- a/src/Movement/Kinematics/HangprinterKinematics.h
+++ b/src/Movement/Kinematics/HangprinterKinematics.h
@@ -43,9 +43,16 @@ private:
static constexpr float DefaultSegmentsPerSecond = 100.0;
static constexpr float DefaultMinSegmentSize = 0.2;
+ // Basic facts about movement system
+ static constexpr size_t HANGPRINTER_AXES = 4;
+ static constexpr size_t A_AXIS = 0;
+ static constexpr size_t B_AXIS = 1;
+ static constexpr size_t C_AXIS = 2;
+ static constexpr size_t D_AXIS = 3;
+
void Init();
void Recalc();
- float LineLengthASquared(const float machinePos[3], const float anchor[3]) const; // Calculate the square of the line length from a spool from a Cartesian coordinate
+ float LineLengthSquared(const float machinePos[3], const float anchor[3]) const; // Calculate the square of the line length from a spool from a Cartesian coordinate
void InverseTransform(float La, float Lb, float Lc, float machinePos[3]) const;
floatc_t ComputeDerivative(unsigned int deriv, float La, float Lb, float Lc) const; // Compute the derivative of height with respect to a parameter at a set of motor endpoints
diff --git a/src/Movement/Move.cpp b/src/Movement/Move.cpp
index 9abc8d80..d7f17232 100644
--- a/src/Movement/Move.cpp
+++ b/src/Movement/Move.cpp
@@ -104,6 +104,7 @@ void Move::Init()
idleTimeout = DefaultIdleTimeout;
moveState = MoveState::idle;
+ lastStateChangeTime = millis();
idleCount = 0;
simulationMode = 0;
@@ -601,7 +602,7 @@ void Move::Diagnostics(MessageType mtype)
{
Platform& p = reprap.GetPlatform();
p.Message(mtype, "=== Move ===\n");
- p.MessageF(mtype, "Hiccups: %" PRIu32 ", StepErrors: %u, LaErrors: %u, FreeDm: %d, MinFreeDm %d, MaxWait: %" PRIu32 "ms, Underruns: %u, %u\n",
+ p.MessageF(mtype, "Hiccups: %" PRIu32 ", StepErrors: %u, LaErrors: %u, FreeDm: %d, MinFreeDm: %d, MaxWait: %" PRIu32 "ms, Underruns: %u, %u\n",
DDA::numHiccups, stepErrors, numLookaheadErrors, DriveMovement::NumFree(), DriveMovement::MinFree(), longestGcodeWaitInterval, numLookaheadUnderruns, numPrepareUnderruns);
DDA::numHiccups = 0;
numLookaheadUnderruns = numPrepareUnderruns = numLookaheadErrors = 0;
@@ -920,14 +921,14 @@ bool Move::SaveHeightMapToFile(FileStore *f) const
float Move::GetTopSpeed() const
{
- const DDA *currDda = currentDda;
- return (currDda == nullptr) ? 0.0f : currDda->GetTopSpeed();
+ const DDA * const currDda = currentDda;
+ return (currDda == nullptr) ? 0.0 : currDda->GetTopSpeed();
}
float Move::GetRequestedSpeed() const
{
- const DDA *currDda = currentDda;
- return (currDda == nullptr) ? 0.0f : currDda->GetRequestedSpeed();
+ const DDA * const currDda = currentDda;
+ return (currDda == nullptr) ? 0.0 : currDda->GetRequestedSpeed();
}
void Move::SetTaperHeight(float h)
diff --git a/src/Pccb/Network.cpp b/src/Pccb/Network.cpp
new file mode 100644
index 00000000..0ad6d123
--- /dev/null
+++ b/src/Pccb/Network.cpp
@@ -0,0 +1,46 @@
+#include "Network.h"
+#include "OutputMemory.h"
+
+const char * const notSupportedText = "Networking is not supported on this hardware";
+
+GCodeResult Network::EnableProtocol(unsigned int interface, int protocol, int port, bool secure, const StringRef& reply)
+{
+ reply.copy(notSupportedText);
+ return GCodeResult::error;
+}
+
+GCodeResult Network::DisableProtocol(unsigned int interface, int protocol, const StringRef& reply)
+{
+ reply.copy(notSupportedText);
+ return GCodeResult::error;
+}
+
+GCodeResult Network::ReportProtocols(unsigned int interface, const StringRef& reply) const
+{
+ reply.copy(notSupportedText);
+ return GCodeResult::error;
+}
+
+GCodeResult Network::EnableInterface(unsigned int interface, int mode, const StringRef& ssid, const StringRef& reply)
+{
+ reply.copy(notSupportedText);
+ return GCodeResult::error;
+}
+
+GCodeResult Network::GetNetworkState(unsigned int interface, const StringRef& reply)
+{
+ reply.copy(notSupportedText);
+ return GCodeResult::error;
+}
+
+void Network::HandleHttpGCodeReply(OutputBuffer *buf)
+{
+ OutputBuffer::ReleaseAll(buf);
+}
+
+void Network::HandleTelnetGCodeReply(OutputBuffer *buf)
+{
+ OutputBuffer::ReleaseAll(buf);
+}
+
+// End
diff --git a/src/Pccb/Network.h b/src/Pccb/Network.h
new file mode 100644
index 00000000..404ebcd2
--- /dev/null
+++ b/src/Pccb/Network.h
@@ -0,0 +1,50 @@
+#ifndef NETWORK_H
+#define NETWORK_H
+
+#include "RepRapFirmware.h"
+#include "MessageType.h"
+#include "GCodes/GCodeResult.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 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.
+class Network
+{
+public:
+ Network(Platform& p) { }
+ void Init() const { }
+ void Activate() const { }
+ void Exit() const { }
+#ifndef RTOS
+ void Spin(bool full) const { }
+#endif
+ void Diagnostics(MessageType mtype) const { }
+
+ GCodeResult EnableInterface(unsigned int interface, int mode, const StringRef& ssid, const StringRef& reply);
+ GCodeResult EnableProtocol(unsigned int interface, int protocol, int port, bool secure, const StringRef& reply);
+ GCodeResult DisableProtocol(unsigned int interface, int protocol, const StringRef& reply);
+ GCodeResult ReportProtocols(unsigned int interface, const StringRef& reply) const;
+
+ 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 SetMacAddress(unsigned int interface, const uint8_t mac[]) { }
+ const uint8_t *GetMacAddress(unsigned int interface) const { return macAddress; }
+
+ void SetHostname(const char *name) const { }
+ bool IsWiFiInterface(unsigned int interface) const { return false; }
+
+ void HandleHttpGCodeReply(const char *msg) { }
+ void HandleTelnetGCodeReply(const char *msg) { }
+ void HandleHttpGCodeReply(OutputBuffer *buf);
+ void HandleTelnetGCodeReply(OutputBuffer *buf);
+ uint32_t GetHttpReplySeq() { return 0; }
+};
+
+#endif
diff --git a/src/Pccb/Pins_Pccb.h b/src/Pccb/Pins_Pccb.h
new file mode 100644
index 00000000..19ad1582
--- /dev/null
+++ b/src/Pccb/Pins_Pccb.h
@@ -0,0 +1,180 @@
+/*
+ * Pins_DuetM.h
+ *
+ * Created on: 29 Nov 2017
+ * Author: David
+ */
+
+#ifndef SRC_DUETM_PINS_DUETM_H_
+#define SRC_DUETM_PINS_DUETM_H_
+
+#define FIRMWARE_NAME "RepRapFirmware for PCCB"
+#define DEFAULT_BOARD_TYPE BoardType::PCCB_10
+constexpr size_t NumFirmwareUpdateModules = 1; // 1 module
+#define IAP_FIRMWARE_FILE "PccbFirmware.bin"
+#define IAP_UPDATE_FILE "iap4s.bin"
+
+// Features definition
+#define HAS_LWIP_NETWORKING 0
+#define HAS_WIFI_NETWORKING 0
+#define HAS_W5500_NETWORKING 0
+
+#define HAS_CPU_TEMP_SENSOR 1
+#define HAS_HIGH_SPEED_SD 1 // SD card socket is optional
+#define SUPPORT_TMC22xx 1
+#define TMC22xx_HAS_MUX 0
+#define HAS_VOLTAGE_MONITOR 1
+#define HAS_VREF_MONITOR 1
+#define ACTIVE_LOW_HEAT_ON 1 // irrelevant because there are no heaters
+
+#define SUPPORT_INKJET 0 // set nonzero to support inkjet control
+#define SUPPORT_ROLAND 0 // set nonzero to support Roland mill
+#define SUPPORT_SCANNER 0 // set zero to disable support for FreeLSS scanners
+#define SUPPORT_IOBITS 0 // set to support P parameter in G0/G1 commands
+#define SUPPORT_DHT_SENSOR 0 // set nonzero to support DHT temperature/humidity sensors (requires RTOS)
+#define SUPPORT_WORKPLACE_COORDINATES 1 // set nonzero to support G10 L2 and G53..59
+#define SUPPORT_12864_LCD 0 // set nonzero to support 12864 LCD and rotary encoder
+#define SUPPORT_DOTSTAR_LED 1 // set nonzero to support DotStar LED strips
+
+// The physical capabilities of the machine
+
+constexpr size_t DRIVES = 8; // The maximum number of drives supported by the electronics
+constexpr size_t MaxSmartDrivers = 2; // The maximum number of smart drivers
+#define DRIVES_(a,b,c,d,e,f,g,h,i,j,k,l) { a,b,c,d,e,f,g,h }
+
+constexpr size_t Heaters = 2; // The number of heaters in the machine. PCCB has no heaters, but we pretend that the LED pins are heaters.
+constexpr size_t NumExtraHeaterProtections = 4; // The number of extra heater protection instances
+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 = DRIVES - 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 = 1; // The number of serial IO channels (USB only)
+#define SERIAL_MAIN_DEVICE SerialUSB
+
+#define I2C_IFACE Wire // First and only I2C interface
+#define I2C_IRQn WIRE_ISR_ID
+
+// The numbers of entries in each array must correspond with the values of DRIVES, AXES, or HEATERS. Set values to NoPin to flag unavailability.
+
+// Drivers
+constexpr Pin GlobalTmcEnablePin = 1; // The pin that drives ENN of all drivers
+constexpr Pin ENABLE_PINS[DRIVES] = { NoPin, NoPin, 61, 35, 41, 55, 0, 64 };
+constexpr Pin STEP_PINS[DRIVES] = { 40, 43, 60, 38, 58, 56, 46, 50 };
+constexpr Pin DIRECTION_PINS[DRIVES] = { 8, 11, 17, 57, 54, 34, 1, 53 };
+
+Uart * const DriverUarts[MaxSmartDrivers] = { UART0, UART1 };
+constexpr uint32_t DriverUartIds[MaxSmartDrivers] = { ID_UART0, ID_UART1 };
+constexpr IRQn DriverUartIRQns[MaxSmartDrivers] = { UART0_IRQn, UART1_IRQn };
+constexpr Pin DriverUartPins[MaxSmartDrivers] = { APINS_UART0, APINS_UART1 };
+
+// Define the baud rate used to send/receive data to/from the drivers.
+// If we assume a worst case clock frequency of 8MHz then the maximum baud rate is 8MHz/16 = 500kbaud.
+// We send data via a 1K series resistor. Even if we assume a 200pF load on the shared UART line, this gives a 200ns time constant, which is much less than the 2us bit time @ 500kbaud.
+// To write a register we need to send 8 bytes. To read a register we send 4 bytes and receive 8 bytes after a programmable delay.
+// So at 500kbaud it takes about 128us to write a register, and 192us+ to read a register.
+// On the PCCB we have only 2 drivers, so we use a lower baud rate to reduce the CPU load
+
+const uint32_t DriversBaudRate = 100000;
+const uint32_t TransferTimeout = 10; // any transfer should complete within 10 ticks @ 1ms/tick
+
+#define UART_TMC_DRV0_Handler UART0_Handler
+#define UART_TMC_DRV1_Handler UART1_Handler
+
+// Endstops
+// RepRapFirmware only has a single endstop per axis.
+// Gcode defines if it is a max ("high end") or min ("low end") endstop and sets if it is active HIGH or LOW.
+constexpr Pin END_STOP_PINS[DRIVES] = { 24, 25, 67, 63, NoPin, NoPin, NoPin, NoPin };
+
+// Heaters and thermistors
+constexpr Pin HEAT_ON_PINS[Heaters] = { 36, 59 }; // these are actually the LED control pins
+constexpr Pin TEMP_SENSE_PINS[NumThermistorInputs] = { 20, 49 }; // Thermistor pin numbers
+constexpr Pin VssaSensePin = 19;
+constexpr Pin VrefSensePin = 27;
+
+// Default thermistor parameters - on PCCB we default both thermistors to the same parameters
+constexpr float BED_R25 = 100000.0;
+constexpr float BED_BETA = 4388.0;
+constexpr float BED_SHC = 0.0;
+constexpr float EXT_R25 = 100000.0;
+constexpr float EXT_BETA = 4388.0;
+constexpr float EXT_SHC = 0.0;
+
+// Thermistor series resistor value in Ohms
+constexpr float THERMISTOR_SERIES_RS = 2200.0;
+
+// Number of SPI temperature sensors to support
+constexpr size_t MaxSpiTempSensors = 1; //TODO which SPI channels does PCCB route to the DueX?
+
+// Digital pins the 31855s have their select lines tied to
+constexpr Pin SpiTempSensorCsPins[MaxSpiTempSensors] = { 63 }; // SPI0_CS6 if a DueX5 is connected
+
+// Pin that controls the ATX power on/off
+constexpr Pin ATX_POWER_PIN = NoPin;
+
+// Analogue pin numbers
+constexpr Pin Z_PROBE_PIN = NoPin; // Z probe analog input
+constexpr Pin PowerMonitorVinDetectPin = 48; // Vin monitor
+constexpr float PowerMonitorVoltageRange = 11.0 * 3.3; // We use an 11:1 voltage divider
+
+// Digital pin number to turn the IR LED on (high) or off (low), also controls the DIAG LED
+constexpr Pin Z_PROBE_MOD_PIN = NoPin;
+constexpr Pin DiagPin = NoPin;
+
+// Cooling fans
+constexpr size_t NUM_FANS = 4;
+constexpr size_t NumTachos = 2;
+constexpr Pin COOLING_FAN_PINS[NUM_FANS] = { 16, 39, 15, 37 }; // PWML2, PWML3, TIOA1, PWML1
+constexpr Pin TachoPins[NumTachos] = { 26, 66 };
+
+#if 0 // currently unused
+// Main LED control
+constexpr size_t NUM_LEDS = 2; // number of main LEDs
+constexpr Pin LedOnPins[NUM_LEDS] = { 36, 59 }; // LED control pins
+#endif
+
+// DotStar LED control (USART0 is SharedSPI,
+Usart * const DotStarUsart = USART1;
+constexpr uint32_t DotStarUsartId = ID_USART1;
+constexpr Pin DotStarMosiPin = 22;
+constexpr Pin DotStarSclkPin = 23;
+constexpr IRQn DotStarUsartIRQn = USART1_IRQn;
+const uint32_t DotStarSpiClockFrequency = 100000; // try sending at 100kHz
+
+// SD cards
+constexpr size_t NumSdCards = 1;
+constexpr Pin SdCardDetectPins[NumSdCards] = { 44 };
+constexpr Pin SdWriteProtectPins[NumSdCards] = { NoPin };
+constexpr Pin SdSpiCSPins[1] = { NoPin };
+constexpr uint32_t ExpectedSdCardSpeed = 15000000;
+
+// M42 and M208 commands now use logical pin numbers, not firmware pin numbers.
+// This next definition defines the highest one.
+// This is the mapping from logical pins 60+ to firmware pin numbers
+constexpr Pin SpecialPinMap[] =
+{
+ 18, 21, 51, 59, 62, 65 // PA18/AD1, PA21/AD8, PC15/AD11, PC22, PC23, PC29
+};
+
+constexpr int HighestLogicalPin = 65; // highest logical pin number on this electronics
+
+// SAM4S Flash locations (may be expanded in the future)
+constexpr uint32_t IAP_FLASH_START = 0x00470000;
+constexpr uint32_t IAP_FLASH_END = 0x0047FFFF; // we allow a full 64K on the SAM4
+
+// Timer allocation
+// TC0 channel 0 is used for step pulse generation and software timers
+// TC0 channel 1 is currently unused
+// TC0 channel 2 is currently unused
+#define STEP_TC (TC0)
+#define STEP_TC_CHAN (0)
+#define STEP_TC_ID ID_TC0
+#define STEP_TC_IRQN TC0_IRQn
+#define STEP_TC_HANDLER TC0_Handler
+
+#endif /* SRC_DUETM_PINS_DUETM_H_ */
diff --git a/src/Pins.h b/src/Pins.h
index ebe82597..fefff471 100644
--- a/src/Pins.h
+++ b/src/Pins.h
@@ -16,8 +16,10 @@
# define PLATFORM DuetNG
# elif defined(__SAME70Q21__)
# define PLATFORM SAME70_TEST
-# elif defined(__SAM4S8C__)
+# elif defined(DUET_M)
# define PLATFORM DuetM
+# elif defined(PCCB)
+# define PLATFORM Pccb
# else
# error Unknown platform
# endif
@@ -30,8 +32,10 @@
# define P_XSTR(x) P_STR(x)
# define P_INCLUDE_FILE P_XSTR(P_CONCAT(PLATFORM,P_CONCAT(/Pins_,P_CONCAT(PLATFORM,.h))))
#endif
+
#include P_INCLUDE_FILE
+// Apply default values to anything not configured
#ifndef SUPPORT_NONLINEAR_EXTRUSION
# define SUPPORT_NONLINEAR_EXTRUSION 1 // for now this is always enabled
#endif
@@ -41,11 +45,50 @@
#endif
#ifndef SUPPORT_12864_LCD
-# define SUPPORT_12864_LCD 0
+# define SUPPORT_12864_LCD 0
+#endif
+
+#ifndef SUPPORT_DOTSTAR_LED
+# define SUPPORT_DOTSTAR_LED 0
#endif
#ifndef USE_CACHE
-# define USE_CACHE 0
+# define USE_CACHE 0
+#endif
+
+#ifndef SUPPORT_TMC2660
+# define SUPPORT_TMC2660 0
+#endif
+
+#ifndef SUPPORT_TMC22xx
+# define SUPPORT_TMC22xx 0
+#endif
+
+#define HAS_SMART_DRIVERS (SUPPORT_TMC2660 || SUPPORT_TMC22xx)
+#define HAS_STALL_DETECT SUPPORT_TMC2660
+
+// HAS_LWIP_NETWORKING refers to Lwip 2 support in the Networking folder, not legacy SAM3XA networking using Lwip 1
+#ifndef HAS_LWIP_NETWORKING
+# define HAS_LWIP_NETWORKING 0
+#endif
+
+#ifndef HAS_WIFI_NETWORKING
+# define HAS_WIFI_NETWORKING 0
+#endif
+
+#ifndef HAS_W5500_NETWORKING
+# define HAS_W5500_NETWORKING 0
+#endif
+
+// Boards that support legacy SAM3X networking must define HAS_LEGACY_NETWORKING in their specific Pins_xxx.h file
+#ifndef HAS_LEGACY_NETWORKING
+# define HAS_LEGACY_NETWORKING 0
+#endif
+
+#define HAS_NETWORKING (HAS_LWIP_NETWORKING || HAS_WIFI_NETWORKING || HAS_W5500_NETWORKING || HAS_LEGACY_NETWORKING)
+
+#if SUPPORT_DHT_SENSOR && !defined(RTOS)
+# error DHT sensor support requires RTOS
#endif
#endif // PINS_H__
diff --git a/src/Platform.cpp b/src/Platform.cpp
index 8c1be54b..2223b018 100644
--- a/src/Platform.cpp
+++ b/src/Platform.cpp
@@ -41,10 +41,11 @@
#include "sd_mmc.h"
-#if defined(DUET_NG)
-# include "TMC2660.h"
-#elif defined(DUET_M)
-# include "TMC22xx.h"
+#if SUPPORT_TMC2660
+# include "StepperDrivers/TMC2660/TMC2660.h"
+#endif
+#if SUPPORT_TMC22xx
+# include "StepperDrivers/TMC22xx/TMC22xx.h"
#endif
#if HAS_WIFI_NETWORKING
@@ -110,11 +111,6 @@ constexpr uint16_t driverNormalVoltageAdcReading = PowerVoltageToAdcReading(27.5
#endif
-static uint32_t fanInterruptCount = 0; // accessed only in ISR, so no need to declare it volatile
-const uint32_t fanMaxInterruptCount = 32; // number of fan interrupts that we average over
-static volatile uint32_t fanLastResetTime = 0; // time (microseconds) at which we last reset the interrupt count, accessed inside and outside ISR
-static volatile uint32_t fanInterval = 0; // written by ISR, read outside the ISR
-
const float MinStepPulseTiming = 0.2; // we assume that we always generate step high and low times at least this wide without special action
const LogicalPin Heater0LogicalPin = 0;
@@ -211,23 +207,31 @@ void Platform::Init()
// Comms
baudRates[0] = MAIN_BAUD_RATE;
+#ifdef SERIAL_AUX_DEVICE
baudRates[1] = AUX_BAUD_RATE;
+#endif
#ifdef SERIAL_AUX2_DEVICE
baudRates[2] = AUX2_BAUD_RATE;
#endif
commsParams[0] = 0;
+#ifdef SERIAL_AUX_DEVICE
commsParams[1] = 1; // by default we require a checksum on data from the aux port, to guard against overrun errors
+#endif
#ifdef SERIAL_AUX2_DEVICE
commsParams[2] = 0;
#endif
usbMutex.Create("USB");
+#ifdef SERIAL_AUX_DEVICE
auxMutex.Create("Aux");
auxDetected = false;
auxSeq = 0;
+#endif
SERIAL_MAIN_DEVICE.begin(baudRates[0]);
+#ifdef SERIAL_AUX_DEVICE
SERIAL_AUX_DEVICE.begin(baudRates[1]); // this can't be done in the constructor because the Arduino port initialisation isn't complete at that point
+#endif
#ifdef SERIAL_AUX2_DEVICE
SERIAL_AUX2_DEVICE.begin(baudRates[2]);
aux2Mutex.Create("Aux2");
@@ -442,7 +446,9 @@ void Platform::Init()
DuetExpansion::AdditionalOutputInit();
#elif defined(DUET_M)
- numSmartDrivers = 5; // TODO for now we assume that additional drivers are dumb
+ numSmartDrivers = MaxSmartDrivers; // for now we assume that expansion drivers are smart too
+#elif defined(PCCB)
+ numSmartDrivers = MaxSmartDrivers;
#endif
#if HAS_SMART_DRIVERS
@@ -496,18 +502,20 @@ void Platform::Init()
for (size_t heater = 0; heater < Heaters; heater++)
{
- if (heatOnPins[heater] != NoPin)
- {
- pinMode(heatOnPins[heater],
+ // pinMode is safe to call when the pin is NoPin, so we don't need to check it here
+ pinMode(heatOnPins[heater],
#if ACTIVE_LOW_HEAT_ON
OUTPUT_LOW
#else
OUTPUT_HIGH
#endif
);
- }
- pinMode(tempSensePins[heater], AIN);
- filteredAdcChannels[heater] = PinToAdcChannel(tempSensePins[heater]); // translate the pin number to the SAM ADC channel number;
+ }
+
+ for (size_t thermistor = 0; thermistor < NumThermistorInputs; thermistor++)
+ {
+ pinMode(tempSensePins[thermistor], AIN);
+ filteredAdcChannels[thermistor] = PinToAdcChannel(tempSensePins[thermistor]); // translate the pin number to the SAM ADC channel number;
}
#if HAS_VREF_MONITOR
@@ -531,6 +539,10 @@ void Platform::Init()
// Fans
InitFans();
+ for (size_t i = 0; i < NumTachos; ++i)
+ {
+ tachos[i].Init(TachoPins[i]);
+ }
// Hotend configuration
nozzleDiameter = NOZZLE_DIAMETER;
@@ -657,7 +669,7 @@ void Platform::InitZProbe()
int Platform::GetZProbeReading() const
{
int zProbeVal = 0; // initialised to avoid spurious compiler warning
- if (zProbeType == ZProbeType::unfilteredDigital || (zProbeOnFilter.IsValid() && zProbeOffFilter.IsValid()))
+ if (zProbeType == ZProbeType::unfilteredDigital || zProbeType == ZProbeType::blTouch || (zProbeOnFilter.IsValid() && zProbeOffFilter.IsValid()))
{
switch (zProbeType)
{
@@ -667,7 +679,6 @@ int Platform::GetZProbeReading() const
case ZProbeType::digital: // Switch connected to Z probe input
case ZProbeType::e1Switch: // Switch connected to E1 endstop input
case ZProbeType::zSwitch: // Switch connected to Z endstop input
- case ZProbeType::blTouch:
zProbeVal = (int) ((zProbeOnFilter.GetSum() + zProbeOffFilter.GetSum()) / (8 * Z_PROBE_AVERAGE_READINGS));
break;
@@ -678,6 +689,7 @@ int Platform::GetZProbeReading() const
break;
case ZProbeType::unfilteredDigital: // Switch connected to Z probe input, no filtering
+ case ZProbeType::blTouch: // blTouch is now unfiltered too
zProbeVal = GetRawZProbeReading()/4;
break;
@@ -1123,6 +1135,7 @@ void Platform::Beep(int freq, int ms)
// Send a short message to the aux channel. There is no flow control on this port, so it can't block for long.
void Platform::SendAuxMessage(const char* msg)
{
+#ifdef SERIAL_AUX_DEVICE
OutputBuffer *buf;
if (OutputBuffer::Allocate(buf))
{
@@ -1132,6 +1145,7 @@ void Platform::SendAuxMessage(const char* msg)
auxOutput.Push(buf);
FlushAuxMessages();
}
+#endif
}
void Platform::Exit()
@@ -1150,7 +1164,9 @@ void Platform::Exit()
// Close down USB and serial ports
SERIAL_MAIN_DEVICE.end();
+#ifdef SERIAL_AUX_DEVICE
SERIAL_AUX_DEVICE.end();
+#endif
#ifdef SERIAL_AUX2_DEVICE
SERIAL_AUX2_DEVICE.end();
#endif
@@ -1205,6 +1221,7 @@ void Platform::SetNetMask(uint8_t nm[])
// Flush messages to aux, returning true if there is more to send
bool Platform::FlushAuxMessages()
{
+#ifdef SERIAL_AUX_DEVICE
// Write non-blocking data to the AUX line
MutexLocker lock(auxMutex);
OutputBuffer *auxOutputBuffer = auxOutput.GetFirstItem();
@@ -1223,6 +1240,9 @@ bool Platform::FlushAuxMessages()
}
}
return auxOutput.GetFirstItem() != nullptr;
+#else
+ return false;
+#endif
}
// Flush messages to USB and aux, returning true if there is more to send
@@ -1334,13 +1354,15 @@ void Platform::Spin()
{
if (currentVin < driverPowerOffAdcReading)
{
- ++numUnderVoltageEvents;
driversPowered = false;
+ ++numUnderVoltageEvents;
+ lastUnderVoltageValue = currentVin; // save this because the voltage may have changed by the time we report it
}
else if (currentVin > driverOverVoltageAdcReading)
{
driversPowered = false;
++numOverVoltageEvents;
+ lastOverVoltageValue = currentVin; // save this because the voltage may have changed by the time we report it
}
else
{
@@ -1514,13 +1536,13 @@ void Platform::Spin()
#if HAS_VOLTAGE_MONITOR
if (numOverVoltageEvents != previousOverVoltageEvents)
{
- MessageF(WarningMessage, "VIN over-voltage event (%.1fV)", (double)GetCurrentPowerVoltage());
+ MessageF(WarningMessage, "VIN over-voltage event (%.1fV)", (double)AdcReadingToPowerVoltage(lastOverVoltageValue));
previousOverVoltageEvents = numOverVoltageEvents;
reported = true;
}
if (numUnderVoltageEvents != previousUnderVoltageEvents)
{
- MessageF(WarningMessage, "VIN under-voltage event (%.1fV)", (double)GetCurrentPowerVoltage());
+ MessageF(WarningMessage, "VIN under-voltage event (%.1fV)", (double)AdcReadingToPowerVoltage(lastUnderVoltageValue));
previousUnderVoltageEvents = numUnderVoltageEvents;
reported = true;
}
@@ -1744,14 +1766,17 @@ void Platform::SoftwareReset(uint16_t reason, const uint32_t *stk)
reason |= (uint16_t)SoftwareResetReason::inLwipSpin;
}
#endif
+
+#ifdef SERIAL_AUX_DEVICE
if (SERIAL_AUX_DEVICE.canWrite() == 0
-#ifdef SERIAL_AUX2_DEVICE
+# ifdef SERIAL_AUX2_DEVICE
|| SERIAL_AUX2_DEVICE.canWrite() == 0
-#endif
+# endif
)
{
reason |= (uint16_t)SoftwareResetReason::inAuxOutput; // if we are resetting because we are stuck in a Spin function, record whether we are trying to send to aux
}
+#endif
}
reason |= (uint8_t)reprap.GetSpinningModule();
reason |= (softwareResetDebugInfo & 0x07) << 5;
@@ -1796,6 +1821,10 @@ void Platform::SoftwareReset(uint16_t reason, const uint32_t *stk)
srdBuf[slot].cfsr = SCB->CFSR;
srdBuf[slot].icsr = SCB->ICSR;
srdBuf[slot].bfar = SCB->BFAR;
+#ifdef RTOS
+ srdBuf[slot].taskName = *reinterpret_cast<const uint32_t*>(pcTaskGetName(nullptr));
+#endif
+
if (stk != nullptr)
{
srdBuf[slot].sp = reinterpret_cast<uint32_t>(stk);
@@ -1836,18 +1865,6 @@ void NETWORK_TC_HANDLER()
#endif
-static void FanInterrupt(CallbackParameter)
-{
- ++fanInterruptCount;
- if (fanInterruptCount == fanMaxInterruptCount)
- {
- const uint32_t now = Platform::GetInterruptClocks();
- fanInterval = now - fanLastResetTime;
- fanLastResetTime = now;
- fanInterruptCount = 0;
- }
-}
-
void Platform::InitialiseInterrupts()
{
#if SAM4E || SAM7E
@@ -1861,17 +1878,23 @@ void Platform::InitialiseInterrupts()
NVIC_SetPriority(SysTick_IRQn, NvicPrioritySystick); // set priority for tick interrupts
#endif
-#if SAM4E || SAME70
+ // Set UART interrupt priorities
+#ifdef PCCB
+ NVIC_SetPriority(DriverUartIRQns[0], NvicPriorityDriversSerialTMC);
+ NVIC_SetPriority(DriverUartIRQns[1], NvicPriorityDriversSerialTMC);
+#else
+# if SAM4E || SAME70
NVIC_SetPriority(UART0_IRQn, NvicPriorityPanelDueUart); // set priority for UART interrupt
NVIC_SetPriority(UART1_IRQn, NvicPriorityWiFiUart); // set priority for WiFi UART interrupt
-#elif SAM4S
+# elif SAM4S
NVIC_SetPriority(UART1_IRQn, NvicPriorityPanelDueUart); // set priority for UART interrupt
-#else
+# else
NVIC_SetPriority(UART_IRQn, NvicPriorityPanelDueUart); // set priority for UART interrupt
-#endif
+# endif
-#if HAS_SMART_DRIVERS
- NVIC_SetPriority(SERIAL_TMC_DRV_IRQn, NvicPriorityDriversSerialTMC);
+# if HAS_SMART_DRIVERS
+ NVIC_SetPriority(UART_TMC_DRV_IRQn, NvicPriorityDriversSerialTMC);
+# endif
#endif
// Timer interrupt for stepper motors
@@ -1943,12 +1966,6 @@ void Platform::InitialiseInterrupts()
NVIC_SetPriority(I2C_IRQn, NvicPriorityTwi);
#endif
- // Interrupt for 4-pin PWM fan sense line
- if (coolingFanRpmPin != NoPin)
- {
- attachInterrupt(coolingFanRpmPin, FanInterrupt, INTERRUPT_MODE_FALLING, nullptr);
- }
-
// Tick interrupt for ADC conversions
tickState = 0;
currentFilterNumber = 0;
@@ -2097,7 +2114,8 @@ void Platform::Diagnostics(MessageType mtype)
: (reason == (uint32_t)SoftwareResetReason::otherFault) ? "Other fault"
: (reason == (uint32_t)SoftwareResetReason::stackOverflow) ? "Stack overflow"
: (reason == (uint32_t)SoftwareResetReason::assertCalled) ? "Assertion failed"
- : "Unknown";
+ : (reason == (uint32_t)SoftwareResetReason::heaterWatchdog) ? "Heat task stuck"
+ : "Unknown";
String<ScratchStringLength> scratchString;
if (srdBuf[slot].when != 0)
{
@@ -2116,8 +2134,15 @@ void Platform::Diagnostics(MessageType mtype)
(srdBuf[slot].resetReason & (uint32_t)SoftwareResetReason::deliberate) ? "deliberate " : "",
reasonText, moduleName[srdBuf[slot].resetReason & 0x0F], srdBuf[slot].neverUsedRam, slot);
// Our format buffer is only 256 characters long, so the next 2 lines must be written separately
- MessageF(mtype, "Software reset code 0x%04x HFSR 0x%08" PRIx32 ", CFSR 0x%08" PRIx32 ", ICSR 0x%08" PRIx32 ", BFAR 0x%08" PRIx32 ", SP 0x%08" PRIx32 "\n",
- srdBuf[slot].resetReason, srdBuf[slot].hfsr, srdBuf[slot].cfsr, srdBuf[slot].icsr, srdBuf[slot].bfar, srdBuf[slot].sp);
+ MessageF(mtype,
+#ifdef RTOS
+ "Software reset code 0x%04x HFSR 0x%08" PRIx32 " CFSR 0x%08" PRIx32 " ICSR 0x%08" PRIx32 " BFAR 0x%08" PRIx32 " SP 0x%08" PRIx32 " Task 0x%08" PRIx32 "\n",
+ srdBuf[slot].resetReason, srdBuf[slot].hfsr, srdBuf[slot].cfsr, srdBuf[slot].icsr, srdBuf[slot].bfar, srdBuf[slot].sp, srdBuf[slot].taskName
+#else
+ "Software reset code 0x%04x HFSR 0x%08" PRIx32 " CFSR 0x%08" PRIx32 " ICSR 0x%08" PRIx32 " BFAR 0x%08" PRIx32 " SP 0x%08" PRIx32 "\n",
+ srdBuf[slot].resetReason, srdBuf[slot].hfsr, srdBuf[slot].cfsr, srdBuf[slot].icsr, srdBuf[slot].bfar, srdBuf[slot].sp
+#endif
+ );
if (srdBuf[slot].sp != 0xFFFFFFFF)
{
// We saved a stack dump, so print it
@@ -2149,7 +2174,7 @@ void Platform::Diagnostics(MessageType mtype)
#endif
// Show the longest SD card write time
- MessageF(mtype, "SD card longest block write time: %.1fms\n", (double)FileStore::GetAndClearLongestWriteTime());
+ MessageF(mtype, "SD card longest block write time: %.1fms, max retries %u\n", (double)FileStore::GetAndClearLongestWriteTime(), FileStore::GetAndClearMaxRetryCount());
#if HAS_CPU_TEMP_SENSOR
// Show the MCU temperatures
@@ -2811,12 +2836,15 @@ void Platform::DisableDrive(size_t drive)
}
}
-// Disable all drives
+// Disable all drives. Called from emergency stop and the tick ISR.
void Platform::DisableAllDrives()
{
for (size_t drive = 0; drive < DRIVES; drive++)
{
- SetDriverCurrent(drive, 0.0, false);
+ if (!inInterrupt()) // on the Duet 06/085 we need interrupts running to send the I2C commands to set motor currents
+ {
+ SetDriverCurrent(drive, 0.0, false);
+ }
DisableDriver(drive);
}
}
@@ -3196,7 +3224,7 @@ void Platform::SetFanValue(size_t fan, float speed)
void Platform::EnableSharedFan(bool enable)
{
const size_t sharedFanNumber = NUM_FANS - 1;
- fans[sharedFanNumber].Init((enable) ? COOLING_FAN_PINS[sharedFanNumber] : NoPin, FansHardwareInverted(sharedFanNumber));
+ fans[sharedFanNumber].Init((enable) ? COOLING_FAN_PINS[sharedFanNumber] : NoPin, FansHardwareInverted(sharedFanNumber), DefaultFanPwmFreq);
}
#endif
@@ -3215,15 +3243,9 @@ const char *Platform::GetFanName(size_t fan) const
}
// Get current fan RPM
-float Platform::GetFanRPM() const
+uint32_t Platform::GetFanRPM(size_t tachoIndex) const
{
- // The ISR sets fanInterval to the number of microseconds it took to get fanMaxInterruptCount interrupts.
- // We get 2 tacho pulses per revolution, hence 2 interrupts per revolution.
- // However, if the fan stops then we get no interrupts and fanInterval stops getting updated.
- // We must recognise this and return zero.
- return (fanInterval != 0 && Platform::GetInterruptClocks() - fanLastResetTime < 3 * StepClockRate) // if we have a reading and it is less than 3 second old
- ? (float)(3 * StepClockRate * fanMaxInterruptCount)/fanInterval // then calculate RPM assuming 2 interrupts per rev
- : 0.0; // else assume fan is off or tacho not connected
+ return (tachoIndex < NumTachos) ? tachos[tachoIndex].GetRPM() : 0;
}
bool Platform::FansHardwareInverted(size_t fanNumber) const
@@ -3241,7 +3263,13 @@ void Platform::InitFans()
{
for (size_t i = 0; i < NUM_FANS; ++i)
{
- fans[i].Init(COOLING_FAN_PINS[i], FansHardwareInverted(i));
+ fans[i].Init(COOLING_FAN_PINS[i], FansHardwareInverted(i),
+#ifdef PCCB
+ (i == 3) ? 25000 : DefaultFanPwmFreq // PCCB fan 3 has 4-wire fan connectors for Intel-spec PWM fans
+#else
+ DefaultFanPwmFreq
+#endif
+ );
}
if (NUM_FANS > 1)
@@ -3249,8 +3277,8 @@ void Platform::InitFans()
#if defined(DUET_06_085)
// Fan 1 on the Duet 0.8.5 shares its control pin with heater 6. Set it full on to make sure the heater (if present) is off.
fans[1].SetPwm(1.0); // set it full on
-#else
- // Set fan 1 to be thermostatic by default, monitoring all heaters except the default bed and chamber heaters
+#elif defined(DUET_NG)
+ // On Duet WiFi/Ethernet we set fan 1 to be thermostatic by default, monitoring all heaters except the default bed and chamber heaters
Fan::HeatersMonitoredBitmap bedAndChamberHeaterMask = 0;
for (uint8_t bedHeater : DefaultBedHeaters)
{
@@ -3268,14 +3296,11 @@ void Platform::InitFans()
}
fans[1].SetHeatersMonitored(LowestNBits<Fan::HeatersMonitoredBitmap>(Heaters) & ~bedAndChamberHeaterMask);
fans[1].SetPwm(1.0); // set it full on
+#elif defined(PCCB)
+ // Fan 3 needs to be set explicitly to zero PWM, otherwise it turns on because the MCU output pin isn't set low
+ fans[3].SetPwm(0.0);
#endif
}
-
- coolingFanRpmPin = COOLING_FAN_RPM_PIN;
- if (coolingFanRpmPin != NoPin)
- {
- pinModeDuet(coolingFanRpmPin, INPUT_PULLUP, 1500); // enable pullup and 1500Hz debounce filter (500Hz only worked up to 7000RPM)
- }
}
void Platform::SetEndStopConfiguration(size_t axis, EndStopPosition esPos, EndStopInputType inputType)
@@ -3294,6 +3319,7 @@ void Platform::GetEndStopConfiguration(size_t axis, EndStopPosition& esType, End
void Platform::AppendAuxReply(const char *msg, bool rawMessage)
{
+#ifdef SERIAL_AUX_DEVICE
// Discard this response if either no aux device is attached or if the response is empty
if (msg[0] != 0 && HaveAux())
{
@@ -3318,10 +3344,12 @@ void Platform::AppendAuxReply(const char *msg, bool rawMessage)
}
}
}
+#endif
}
void Platform::AppendAuxReply(OutputBuffer *reply, bool rawMessage)
{
+#ifdef SERIAL_AUX_DEVICE
// Discard this response if either no aux device is attached or if the response is empty
if (reply == nullptr || reply->Length() == 0 || !HaveAux())
{
@@ -3350,6 +3378,9 @@ void Platform::AppendAuxReply(OutputBuffer *reply, bool rawMessage)
}
}
}
+#else
+ OutputBuffer::ReleaseAll(reply);
+#endif
}
// Send the specified message to the specified destinations. The Error and Warning flags have already been handled.
@@ -3438,11 +3469,12 @@ void Platform::RawMessage(MessageType type, const char *message)
usbOutputBuffer->cat(message);
}
}
-
- if ((type & SpiMessage) != 0)
+#if HAS_LINUX_COMMS
+ else if ((type & SpiMessage) != 0)
{
reprap.GetLinuxComm().HandleGCodeReply(message);
}
+#endif
}
// Note: this overload of Platform::Message does not process the special action flags in the MessageType.
@@ -3537,10 +3569,12 @@ void Platform::Message(const MessageType type, OutputBuffer *buffer)
}
}
+#if HAS_LINUX_COMMS
if ((type & SpiMessage) != 0)
{
reprap.GetLinuxComm().HandleGCodeReply(buffer);
}
+#endif
}
}
@@ -3686,12 +3720,11 @@ void Platform::AtxPowerOff(bool defer)
deferredPowerDown = defer;
if (!defer)
{
- deferredPowerDown = false;
if (logger != nullptr)
{
logger->LogMessage(realTime, "Power off commanded");
logger->Flush(true);
- // We don't call logger->Stop() here because we don't now whether turning off the power will work
+ // We don't call logger->Stop() here because we don't know whether turning off the power will work
}
IoPort::WriteDigital(ATX_POWER_PIN, false);
}
@@ -3770,16 +3803,21 @@ void Platform::ResetChannel(size_t chan)
SERIAL_MAIN_DEVICE.end();
SERIAL_MAIN_DEVICE.begin(baudRates[0]);
break;
+
+#ifdef SERIAL_AUX_DEVICE
case 1:
SERIAL_AUX_DEVICE.end();
SERIAL_AUX_DEVICE.begin(baudRates[1]);
break;
+#endif
+
#ifdef SERIAL_AUX2_DEVICE
case 2:
SERIAL_AUX2_DEVICE.end();
SERIAL_AUX2_DEVICE.begin(baudRates[2]);
break;
#endif
+
default:
break;
}
@@ -3833,6 +3871,8 @@ void Platform::SetBoardType(BoardType bt)
board = BoardType::RADDS_15;
#elif defined(__ALLIGATOR__)
board = BoardType::Alligator_2;
+#elif defined(PCCB)
+ board = BoardType::PCCB_10;
#else
# error Undefined board type
#endif
@@ -3871,6 +3911,8 @@ const char* Platform::GetElectronicsString() const
case BoardType::RADDS_15: return "RADDS 1.5";
#elif defined(__ALLIGATOR__)
case BoardType::Alligator_2: return "Alligator r2";
+#elif defined(PCCB)
+ case BoardType::PCCB_10: return "PCCB 1.0";
#else
# error Undefined board type
#endif
@@ -3900,6 +3942,8 @@ const char* Platform::GetBoardString() const
case BoardType::RADDS_15: return "radds15";
#elif defined(__ALLIGATOR__)
case BoardType::Alligator_2: return "alligator2";
+#elif defined(PCCB)
+ case BoardType::PCCB_10: return "pccb10";
#else
# error Undefined board type
#endif
diff --git a/src/Platform.h b/src/Platform.h
index d8d65890..ae5c6a60 100644
--- a/src/Platform.h
+++ b/src/Platform.h
@@ -31,7 +31,8 @@ Licence: GPL
#include "RepRapFirmware.h"
#include "IoPorts.h"
#include "DueFlashStorage.h"
-#include "Fan.h"
+#include "Fans/Fan.h"
+#include "Fans/Tacho.h"
#include "Heating/TemperatureError.h"
#include "OutputMemory.h"
#include "Storage/FileStore.h"
@@ -57,19 +58,19 @@ constexpr bool BACKWARDS = !FORWARDS;
// Define the number of ADC filters and the indices of the extra ones
#if HAS_VREF_MONITOR
-constexpr size_t VrefFilterIndex = Heaters;
-constexpr size_t VssaFilterIndex = Heaters + 1;
+constexpr size_t VrefFilterIndex = NumThermistorInputs;
+constexpr size_t VssaFilterIndex = NumThermistorInputs + 1;
# if HAS_CPU_TEMP_SENSOR
-constexpr size_t CpuTempFilterIndex = Heaters + 2;
-constexpr size_t NumAdcFilters = Heaters + 3;
+constexpr size_t CpuTempFilterIndex = NumThermistorInputs + 2;
+constexpr size_t NumAdcFilters = NumThermistorInputs + 3;
# else
-constexpr size_t NumAdcFilters = Heaters + 2;
+constexpr size_t NumAdcFilters = NumThermistorInputs + 2;
# endif
#elif HAS_CPU_TEMP_SENSOR
-constexpr size_t CpuTempFilterIndex = Heaters;
-constexpr size_t NumAdcFilters = Heaters + 1;
+constexpr size_t CpuTempFilterIndex = NumThermistorInputs;
+constexpr size_t NumAdcFilters = NumThermistorInputs + 1;
#else
-constexpr size_t NumAdcFilters = Heaters;
+constexpr size_t NumAdcFilters = NumThermistorInputs;
#endif
/**************************************************************************************************/
@@ -129,6 +130,8 @@ enum class BoardType : uint8_t
RADDS_15 = 1
#elif defined(__ALLIGATOR__)
Alligator_2 = 1
+#elif defined(PCCB)
+ PCCB_10 = 1
#else
# error Unknown board
#endif
@@ -180,12 +183,13 @@ enum class SoftwareResetReason : uint16_t
erase = 0x10, // special M999 command to erase firmware and reset
NMI = 0x20,
hardFault = 0x30, // most exceptions get escalated to a hard fault
- stuckInSpin = 0x40, // we got stuck in a Spin() function for too long
+ stuckInSpin = 0x40, // we got stuck in a Spin() function in the Main task for too long
wdtFault = 0x50, // secondary watchdog
usageFault = 0x60,
otherFault = 0x70,
- stackOverflow = 0x80,
- assertCalled = 0x90,
+ stackOverflow = 0x80, // FreeRTOS detected stack overflow
+ assertCalled = 0x90, // FreeRTOS assertion failure
+ heaterWatchdog = 0xA0, // the Heat task didn't kick the watchdog often enough
// Bits that are or'ed in
inAuxOutput = 0x0800, // this bit is or'ed in if we were in aux output at the time
@@ -294,7 +298,7 @@ struct AxisDriversConfig
// The main class that defines the RepRap machine for the benefit of the other classes
class Platform
-{
+{
public:
// Enumeration to describe the status of a drive
enum class DriverStatus : uint8_t { disabled, idle, enabled };
@@ -522,7 +526,7 @@ public:
const char *GetFanName(size_t fan) const;
bool WriteFanSettings(FileStore *f) const; // Save some resume information
- float GetFanRPM() const;
+ uint32_t GetFanRPM(size_t tachoIndex) const;
// Flash operations
void UpdateFirmware();
@@ -663,7 +667,12 @@ private:
uint32_t bfar; // bus fault address register
uint32_t sp; // stack pointer
uint32_t when; // value of the RTC when the software reset occurred
+#ifdef RTOS
+ uint32_t taskName; // first 4 bytes of the task name
+ uint32_t stack[23]; // stack when the exception occurred, with the program counter at the bottom
+#else
uint32_t stack[24]; // stack when the exception occurred, with the program counter at the bottom
+#endif
bool isVacant() const // return true if this struct can be written without erasing it first
{
@@ -807,7 +816,7 @@ private:
static bool WriteAxisLimits(FileStore *f, AxesBitmap axesProbed, const float limits[MaxAxes], int sParam);
// Heaters - bed is assumed to be the first
- Pin tempSensePins[Heaters];
+ Pin tempSensePins[NumThermistorInputs];
Pin heatOnPins[Heaters];
Pin spiTempSenseCsPins[MaxSpiTempSensors];
uint32_t configuredHeaters; // bitmask of all real heaters in use
@@ -815,20 +824,25 @@ private:
// Fans
Fan fans[NUM_FANS];
- Pin coolingFanRpmPin; // we currently support only one fan RPM input
uint32_t lastFanCheckTime;
void InitFans();
bool FansHardwareInverted(size_t fanNumber) const;
+ // Fan tachos
+ Tacho tachos[NumTachos];
+
// Serial/USB
uint32_t baudRates[NUM_SERIAL_CHANNELS];
uint8_t commsParams[NUM_SERIAL_CHANNELS];
+#ifdef SERIAL_AUX_DEVICE
volatile OutputStack auxOutput;
Mutex auxMutex;
+#endif
+
OutputBuffer *auxGCodeReply; // G-Code reply for AUX devices (special one because it is actually encapsulated before sending)
uint32_t auxSeq; // Sequence number for AUX devices
- bool auxDetected; // Have we processed at least one G-Code from an AUX device?
+ bool auxDetected; // Have we processed at least one G-Code from an AUX device?
#ifdef SERIAL_AUX2_DEVICE
volatile OutputStack aux2Output;
@@ -888,6 +902,7 @@ private:
#if HAS_VOLTAGE_MONITOR
AnalogChannelNumber vInMonitorAdcChannel;
volatile uint16_t currentVin, highestVin, lowestVin;
+ uint16_t lastUnderVoltageValue, lastOverVoltageValue;
uint16_t autoPauseReading, autoResumeReading;
uint32_t numUnderVoltageEvents, previousUnderVoltageEvents;
volatile uint32_t numOverVoltageEvents, previousOverVoltageEvents;
@@ -1247,7 +1262,7 @@ inline OutputBuffer *Platform::GetAuxGCodeReply()
// The bitmaps for various controller electronics are organised like this:
// Duet WiFi:
// All step pins are on port D, so the bitmap is just the map of step bits in port D.
-// Duet Maestro:
+// Duet Maestro and PCCB:
// All step pins are on port C, so the bitmap is just the map of step bits in port C.
// Duet 0.6 and 0.8.5:
// Step pins are PA0, PC7,9,11,14,25,29 and PD0,3.
@@ -1271,9 +1286,7 @@ inline OutputBuffer *Platform::GetAuxGCodeReply()
return 0; // TODO assign step pins
#else
const PinDescription& pinDesc = g_APinDescription[STEP_PINS[driver]];
-#if defined(DUET_NG)
- return pinDesc.ulPin;
-#elif defined(DUET_M)
+#if defined(DUET_NG) || defined(DUET_M) || defined(PCCB)
return pinDesc.ulPin;
#elif defined(DUET_06_085)
return (pinDesc.pPort == PIOA) ? pinDesc.ulPin << 1 : pinDesc.ulPin;
@@ -1296,7 +1309,7 @@ inline OutputBuffer *Platform::GetAuxGCodeReply()
// TODO
#elif defined(DUET_NG)
PIOD->PIO_ODSR = driverMap; // on Duet WiFi all step pins are on port D
-#elif defined(DUET_M)
+#elif defined(DUET_M) || defined(PCCB)
PIOC->PIO_ODSR = driverMap; // on Duet Maestro all step pins are on port C
#elif defined(DUET_06_085)
PIOD->PIO_ODSR = driverMap;
@@ -1325,7 +1338,7 @@ inline OutputBuffer *Platform::GetAuxGCodeReply()
// TODO
#elif defined(DUET_NG)
PIOD->PIO_ODSR = 0; // on Duet WiFi all step pins are on port D
-#elif defined(DUET_M)
+#elif defined(DUET_M) || defined(PCCB)
PIOC->PIO_ODSR = 0; // on Duet Maestro all step pins are on port C
#elif defined(DUET_06_085)
PIOD->PIO_ODSR = 0;
diff --git a/src/RADDS/Pins_RADDS.h b/src/RADDS/Pins_RADDS.h
index 1623c6c8..902c8e84 100644
--- a/src/RADDS/Pins_RADDS.h
+++ b/src/RADDS/Pins_RADDS.h
@@ -8,8 +8,6 @@
#define HAS_WIFI_NETWORKING 0
#define HAS_CPU_TEMP_SENSOR 0 // enabling the CPU temperature sensor disables Due pin 13 due to bug in SAM3X
#define HAS_HIGH_SPEED_SD 0
-#define HAS_SMART_DRIVERS 0
-#define HAS_STALL_DETECT 0
#define HAS_VOLTAGE_MONITOR 0
#define HAS_VREF_MONITOR 0
#define ACTIVE_LOW_HEAT_ON 0
@@ -39,24 +37,20 @@ const size_t DRIVES = 9;
// The number of heaters in the machine
// 0 is the heated bed even if there isn't one.
-const size_t Heaters = 4;
+constexpr size_t Heaters = 4;
+constexpr size_t NumExtraHeaterProtections = 4; // The number of extra heater protection instances
+constexpr size_t NumThermistorInputs = 4;
-const size_t NumExtraHeaterProtections = 4; // The number of extra heater protection instances
-
-// Initialization macro used in statements needing to initialize values in arrays of size HEATERS. E.g.,
-// defaultPidKis[HEATERS] = {HEATERS_(5.0, 0.1, 0.1, 0.1, 0.1, 0.1)};
-#define HEATERS_(a,b,c,d,e,f,g,h) { a,b,c,d }
-
-const size_t MinAxes = 3; // The minimum and default number of axes
-const size_t MaxAxes = 6; // The maximum number of movement axes in the machine, usually just X, Y and Z, <= DRIVES
+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 }
-const size_t MIN_AXES = 3; // The minimum and default number of axes
-const size_t MaxExtruders = DRIVES - MIN_AXES; // The maximum number of extruders
-const size_t MaxDriversPerAxis = 4; // The maximum number of stepper drivers assigned to one axis
+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 MaxDriversPerAxis = 4; // The maximum number of stepper drivers assigned to one axis
-const size_t NUM_SERIAL_CHANNELS = 2;
+constexpr size_t NUM_SERIAL_CHANNELS = 2;
// Use TX0/RX0 for the auxiliary serial line
#define SERIAL_MAIN_DEVICE SerialUSB
#define SERIAL_AUX_DEVICE Serial1
@@ -87,14 +81,14 @@ const Pin END_STOP_PINS[DRIVES] = { 28, 30, 32, 39, NoPin, NoPin, NoPin, NoPin }
// HEATERS - The bed is assumed to be the at index 0
// Analogue pin numbers
-const Pin TEMP_SENSE_PINS[Heaters] = HEATERS_(4, 0, 1, 2, e, f, g, h);
+const Pin TEMP_SENSE_PINS[NumThermistorInputs] = { 4, 0, 1, 2 };
// Heater outputs
// Bed PMW: D7 has hardware PWM so bed has PWM
// h0, h1 PMW: D13 & D12 are on TIOB0 & B8 which are both TC B channels, so they get PWM
// h2 bang-bang: D11 is on TIOA8 which is a TC A channel shared with h1, it gets bang-bang control
-const Pin HEAT_ON_PINS[Heaters] = HEATERS_(7, 13, 12, 11, e, f, g, h); // bed, h0, h1, h2
+const Pin HEAT_ON_PINS[Heaters] = { 7, 13, 12, 11 }; // bed, h0, h1, h2
// Default thermistor betas
const float BED_R25 = 10000.0;
@@ -133,7 +127,8 @@ const Pin COOLING_FAN_PINS[NUM_FANS] = { 9, 8 }; // Fan 0, Fan 1
// see FanInterrupt() in Platform.cpp
//
// D25 -- Unused GPIO on AUX1
-const Pin COOLING_FAN_RPM_PIN = 25;
+constexpr size_t NumTachos = 1;
+constexpr Pin TachoPins[NumTachos] = { 25 };
// SD cards
const size_t NumSdCards = 2;
diff --git a/src/RepRap.cpp b/src/RepRap.cpp
index f52cb373..8638a11f 100644
--- a/src/RepRap.cpp
+++ b/src/RepRap.cpp
@@ -125,10 +125,14 @@ extern "C" void hsmciIdle(uint32_t stBits, uint32_t dmaBits)
// Do nothing more in the constructor; put what you want in RepRap:Init()
RepRap::RepRap() : toolList(nullptr), currentTool(nullptr), lastWarningMillis(0), activeExtruders(0),
- activeToolHeaters(0), ticksInSpinState(0), spinningModule(noModule), debug(0), stopped(false),
+ activeToolHeaters(0), ticksInSpinState(0),
+#ifdef RTOS
+ heatTaskIdleTicks(0),
+#endif
+ spinningModule(noModule), debug(0), stopped(false),
active(false), resetting(false), processingConfig(true), beepFrequency(0), beepDuration(0),
displayMessageBox(false), boxSeq(0),
- diagnosticsDestination(MessageType::NoDestinationMessage)
+ diagnosticsDestination(MessageType::NoDestinationMessage), justSentDiagnostics(false)
{
OutputBuffer::Init();
platform = new Platform();
@@ -371,14 +375,22 @@ void RepRap::Spin()
}
// Keep track of the loop time
- const uint32_t dt = Platform::GetInterruptClocks() - lastTime;
- if (dt < fastLoop)
+ if (justSentDiagnostics)
{
- fastLoop = dt;
+ // Sending diagnostics increases the loop time, so don't count it
+ justSentDiagnostics = false;
}
- if (dt > slowLoop)
+ else
{
- slowLoop = dt;
+ const uint32_t dt = Platform::GetInterruptClocks() - lastTime;
+ if (dt < fastLoop)
+ {
+ fastLoop = dt;
+ }
+ if (dt > slowLoop)
+ {
+ slowLoop = dt;
+ }
}
RTOSIface::Yield();
@@ -423,6 +435,7 @@ void RepRap::Diagnostics(MessageType mtype)
#ifdef DUET_NG
DuetExpansion::Diagnostics(mtype);
#endif
+ justSentDiagnostics = true;
}
// Turn off the heaters, disable the motors, and deactivate the Heat and Move classes. Leave everything else working.
@@ -688,26 +701,29 @@ void RepRap::Tick()
{
platform->Tick();
++ticksInSpinState;
- if (ticksInSpinState >= MaxTicksInSpinState) // if we stall for 20 seconds, save diagnostic data and reset
+#ifdef RTOS
+ ++heatTaskIdleTicks;
+ const bool heatTaskStuck = (heatTaskIdleTicks >= MaxTicksInSpinState);
+ if (heatTaskStuck || ticksInSpinState >= MaxTicksInSpinState) // if we stall for 20 seconds, save diagnostic data and reset
+#else
+ if (ticksInSpinState >= MaxTicksInSpinState) // if we stall for 20 seconds, save diagnostic data and reset
+#endif
{
resetting = true;
for (size_t i = 0; i < Heaters; i++)
{
platform->SetHeater(i, 0.0);
}
- for (size_t i = 0; i < DRIVES; i++)
- {
- platform->DisableDrive(i);
- // We can't set motor currents to 0 here because that requires interrupts to be working, and we are in an ISR
- }
+ platform->DisableAllDrives();
// We now save the stack when we get stuck in a spin loop
register const uint32_t * stackPtr asm ("sp");
-
- platform->SoftwareReset((uint16_t)SoftwareResetReason::stuckInSpin,
+ platform->SoftwareReset(
#ifdef RTOS
+ (heatTaskStuck) ? (uint16_t)SoftwareResetReason::heaterWatchdog : (uint16_t)SoftwareResetReason::stuckInSpin,
stackPtr + 5 + 15 // discard the stack used by the FreeRTOS stack handler and our tick handler
#else
+ (uint16_t)SoftwareResetReason::stuckInSpin,
stackPtr + 5 // discard the stack used by our tick handler
#endif
);
@@ -806,7 +822,7 @@ OutputBuffer *RepRap::GetStatusResponse(uint8_t type, ResponseSource source)
response->catf("]},\"speeds\":{\"requested\":%.1f,\"top\":%.1f}",
(double)move->GetRequestedSpeed(), (double)move->GetTopSpeed());
- // Current tool number
+ // Current tool number
response->catf(",\"currentTool\":%d", GetCurrentToolNumber());
// Output notifications
@@ -870,7 +886,7 @@ OutputBuffer *RepRap::GetStatusResponse(uint8_t type, ResponseSource source)
// Cooling fan value
response->cat(",\"fanPercent\":");
ch = '[';
- for(size_t i = 0; i < NUM_FANS; i++)
+ for (size_t i = 0; i < NUM_FANS; i++)
{
response->catf("%c%d", ch, (int)lrintf(platform->GetFanValue(i) * 100.0));
ch = ',';
@@ -931,8 +947,27 @@ OutputBuffer *RepRap::GetStatusResponse(uint8_t type, ResponseSource source)
break;
}
- // Fan RPM
- response->catf(",\"fanRPM\":%d}", static_cast<unsigned int>(platform->GetFanRPM()));
+ // Send fan RPM value(s)
+ 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
+ if (NumTachos > 1)
+ {
+ char ch = '[';
+ for (size_t i = 0; i < NumTachos; ++i)
+ {
+ response->catf("%c%" PRIu32, ch, platform->GetFanRPM(i));
+ ch = ',';
+ }
+ response->cat(']');
+ }
+ else
+ {
+ response->catf("%" PRIu32, platform->GetFanRPM(0));
+ }
+ }
+ response->cat('}'); // end sensors
}
/* Temperatures */
@@ -1120,7 +1155,22 @@ OutputBuffer *RepRap::GetStatusResponse(uint8_t type, ResponseSource source)
{
// Cold Extrude/Retract
response->catf(",\"coldExtrudeTemp\":%.1f", (double)(heat->ColdExtrude() ? 0.0 : HOT_ENOUGH_TO_EXTRUDE));
- response->catf(",\"coldRetractTemp\":%.1f", (double)(heat->ColdExtrude() ? 0.0 : HOT_ENOUGH_TO_RETRACT));\
+ response->catf(",\"coldRetractTemp\":%.1f", (double)(heat->ColdExtrude() ? 0.0 : HOT_ENOUGH_TO_RETRACT));
+
+ // Compensation type
+ response->cat(",\"compensation\":");
+ if (move->IsUsingMesh())
+ {
+ response->cat("\"Mesh\"");
+ }
+ else if (move->GetNumProbePoints() > 0)
+ {
+ response->catf("\"%u Point\"", move->GetNumProbePoints());
+ }
+ else
+ {
+ response->cat("\"None\"");
+ }
// Compensation type
response->cat(",\"compensation\":");
@@ -1627,8 +1677,27 @@ OutputBuffer *RepRap::GetLegacyStatusResponse(uint8_t type, int seq)
ch = ',';
}
- // Send fan RPM value (we only support one)
- response->catf("],\"fanRPM\":%u", static_cast<unsigned int>(platform->GetFanRPM()));
+ // 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
+ if (NumTachos > 1)
+ {
+ char ch = '[';
+ for (size_t i = 0; i < NumTachos; ++i)
+ {
+ response->catf("%c%" PRIu32, ch, platform->GetFanRPM(i));
+ ch = ',';
+ }
+ response->cat(']');
+ }
+ else
+ {
+ response->catf("%" PRIu32, platform->GetFanRPM(0));
+ }
+ }
// Send the home state. To keep the messages short, we send 1 for homed and 0 for not homed, instead of true and false.
response->cat(",\"homed\":");
diff --git a/src/RepRap.h b/src/RepRap.h
index 01319283..3a295a7c 100644
--- a/src/RepRap.h
+++ b/src/RepRap.h
@@ -120,6 +120,10 @@ public:
static uint32_t DoDivide(uint32_t a, uint32_t b); // helper function for diagnostic tests
+#ifdef RTOS
+ void KickHeatTaskWatchdog() { heatTaskIdleTicks = 0; }
+#endif
+
private:
static void EncodeString(StringRef& response, const char* src, size_t spaceToLeave, bool allowControlChars = false, char prefix = 0);
@@ -157,6 +161,9 @@ private:
uint16_t activeToolHeaters;
uint16_t ticksInSpinState;
+#ifdef RTOS
+ uint16_t heatTaskIdleTicks;
+#endif
Module spinningModule;
uint32_t fastLoop, slowLoop;
@@ -182,6 +189,7 @@ private:
// Deferred diagnostics
MessageType diagnosticsDestination;
+ bool justSentDiagnostics;
};
inline Platform& RepRap::GetPlatform() const { return *platform; }
diff --git a/src/RepRapFirmware.cpp b/src/RepRapFirmware.cpp
index 93827b6f..4ef6ba99 100644
--- a/src/RepRapFirmware.cpp
+++ b/src/RepRapFirmware.cpp
@@ -191,6 +191,7 @@ const char * const moduleName[] =
"DuetExpansion",
"FilamentSensors",
"WiFi",
+ "LinuxComms",
"none"
};
diff --git a/src/SAME70_TEST/Pins_SAME70_TEST.h b/src/SAME70_TEST/Pins_SAME70_TEST.h
index dd015109..09ba2ed6 100644
--- a/src/SAME70_TEST/Pins_SAME70_TEST.h
+++ b/src/SAME70_TEST/Pins_SAME70_TEST.h
@@ -11,8 +11,6 @@
#define HAS_LINUX_INTERFACE 1
#define HAS_CPU_TEMP_SENSOR 0
#define HAS_HIGH_SPEED_SD 1
-#define HAS_SMART_DRIVERS 0 // TBD
-#define HAS_STALL_DETECT 0 // TBD
#define HAS_VOLTAGE_MONITOR 0 // TBD
#define HAS_VREF_MONITOR 0 // TBD
#define ACTIVE_LOW_HEAT_ON 1
@@ -43,9 +41,8 @@ const size_t MaxSmartDrivers = 10; // The maximum number of smart drivers
#define DRIVES_(a,b,c,d,e,f,g,h,i,j,k,l) { a,b,c,d,e,f,g,h,i,j,k,l }
constexpr size_t Heaters = 8; // The number of heaters in the machine; 0 is the heated bed even if there isn't one
-#define HEATERS_(a,b,c,d,e,f,g,h) { a,b,c,d,e,f,g,h }
-
constexpr size_t NumExtraHeaterProtections = 8; // The number of extra heater protection instances
+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
@@ -68,12 +65,12 @@ constexpr Pin AdditionalIoExpansionStart = 220; // Pin numbers 220-235 are on t
// 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
-constexpr Pin GlobalTmcEnablePin = NoPin; // The pin that drives ENN of all TMC2660 drivers on production boards (on pre-production boards they are grounded)
+constexpr Pin GlobalTmcEnablePin = NoPin; // The pin that drives ENN of all TMC2660 drivers on production boards (on pre-production boards they are grounded)
constexpr Pin ENABLE_PINS[DRIVES] = { NoPin, NoPin, NoPin, NoPin, NoPin, NoPin, NoPin, NoPin, NoPin, NoPin, NoPin, NoPin };
constexpr Pin STEP_PINS[DRIVES] = { NoPin, NoPin, NoPin, NoPin, NoPin, NoPin, NoPin, NoPin, NoPin, NoPin, NoPin, NoPin };
constexpr Pin DIRECTION_PINS[DRIVES] = { NoPin, NoPin, NoPin, NoPin, NoPin, NoPin, NoPin, NoPin, NoPin, NoPin, NoPin, NoPin };
-constexpr Pin DueX_SG = NoPin; // DueX stallguard detect pin (TBD)
+constexpr Pin DueX_SG = NoPin; // DueX stallguard detect pin (TBD)
constexpr Pin DueX_INT = NoPin; // DueX interrupt pin (TBD)
// Endstops
@@ -81,8 +78,8 @@ constexpr Pin DueX_INT = NoPin; // DueX interrupt pin (TBD)
// Gcode defines if it is a max ("high end") or min ("low end") endstop and sets if it is active HIGH or LOW.
constexpr Pin END_STOP_PINS[DRIVES] = { NoPin, NoPin, NoPin, NoPin, NoPin, NoPin, NoPin, NoPin, NoPin, NoPin, NoPin, NoPin };
-// HEATERS
-constexpr Pin TEMP_SENSE_PINS[Heaters] = { NoPin, NoPin, NoPin, NoPin, NoPin, NoPin, NoPin, NoPin }; // Thermistor pin numbers
+// Heater and thermistors
+constexpr Pin TEMP_SENSE_PINS[NumThermistorInputs] = { NoPin, NoPin, NoPin, NoPin, NoPin, NoPin, NoPin, NoPin }; // Thermistor pin numbers
constexpr Pin HEAT_ON_PINS[Heaters] = { NoPin, NoPin, NoPin, NoPin, NoPin, NoPin, NoPin, NoPin }; // Heater pin numbers (TBD)
// Default thermistor parameters
@@ -125,7 +122,8 @@ constexpr Pin DiagPin = NoPin; // TBD
// Cooling fans
constexpr size_t NUM_FANS = 1;
constexpr Pin COOLING_FAN_PINS[NUM_FANS] = { NoPin };
-constexpr Pin COOLING_FAN_RPM_PIN = NoPin; // TBD
+constexpr size_t NumTachos = 1;
+constexpr Pin TachoPins[NumTachos] = { NoPin }; // TBD
// SD cards
constexpr size_t NumSdCards = 2;
diff --git a/src/DuetM/TMC22xx.cpp b/src/StepperDrivers/TMC22xx/TMC22xx.cpp
index 5f373c26..4a9b3c96 100644
--- a/src/DuetM/TMC22xx.cpp
+++ b/src/StepperDrivers/TMC22xx/TMC22xx.cpp
@@ -5,25 +5,26 @@
* Author: David
*/
+#include "RepRapFirmware.h"
+
+#if SUPPORT_TMC22xx
+
#include "TMC22xx.h"
#include "RepRap.h"
#include "Movement/Move.h"
#include "sam/drivers/pdc/pdc.h"
#include "sam/drivers/uart/uart.h"
+// Important note:
+// The TMC2224 does handle a write request immediately followed by a read request.
+// The TMC2224 does _not_ handle back-to-back read requests, it needs some sort of a delay between them.
+// Therefore this driver will only work if there are at least two TMC22xx drivers being driven,
+// so that each one gets an interval while the other one is being polled.
+
const float MaximumMotorCurrent = 1600.0;
const uint32_t DefaultMicrosteppingShift = 4; // x16 microstepping
const bool DefaultInterpolation = true; // interpolation enabled
-// Define the baud rate used to send/receive data to/from the drivers.
-// If we assume a worst case clock frequency of 8MHz then the maximum baud rate is 8MHz/16 = 500kbaud.
-// We send data via a 1K series resistor. Even if we assume a 200pF load on the shared UART line, this gives a 200ns time constant, which is much less than the 2us bit time @ 500kbaud.
-// To write a register we need to send 8 bytes. To read a register we send 4 bytes and receive 8 bytes after a programmable delay.
-// So at 500kbaud it takes about 128us to write a register, and 192us+ to read a register.
-// In testing I found that 500kbaud was not reliable, so now using 200kbaud.
-const uint32_t DriversBaudRate = 200000;
-const uint32_t TransferTimeout = 10; // any transfer should complete within 10 ticks @ 1ms/tick
-
static size_t numTmc22xxDrivers;
enum class DriversState : uint8_t
@@ -231,22 +232,6 @@ static constexpr uint8_t InitialSendCRC = CRCAddByte(CRCAddByte(0, 0x05), 0x00);
// CRC of a request to read the IFCOUNT register
static constexpr uint8_t ReadIfcountCRC = CRCAddByte(InitialSendCRC, REGNUM_IFCOUNT);
-// To write a register, we send one 8-byte packet to write it, then a 4-byte packet to ask for the IFCOUNT register, then we receive an 8-byte packet containing IFCOUNT.
-// This is the message we send - volatile because we care about when it is written
-static volatile uint8_t sendData[12] =
-{
- 0x05, 0x00, // sync byte and slave address
- 0x00, // register address and write flag (filled in)
- 0x00, 0x00, 0x00, 0x00, // value to write (if writing), or 1 byte of CRC if read request (filled in)
- 0x00, // CRC of write request (filled in)
- 0x05, 0x00, // sync byte and slave address
- REGNUM_IFCOUNT, // register we want to read
- ReadIfcountCRC // CRC
-};
-
-// Buffer for the message we receive when reading data. The first 4 or 12 bytes bytes are our own transmitted data.
-static volatile uint8_t receiveData[20];
-
//----------------------------------------------------------------------------------------------------------------------------------
// Private types and methods
@@ -268,6 +253,7 @@ public:
void AppendDriverStatus(const StringRef& reply);
uint8_t GetDriverNumber() const { return driverNumber; }
bool UpdatePending() const { return registersToUpdate != 0; }
+ bool UsesGlobalEnable() const { return enablePin == NoPin; }
float GetStandstillCurrentPercent() const;
void SetStandstillCurrentPercent(float percent);
@@ -275,16 +261,30 @@ public:
void TransferDone() __attribute__ ((hot)); // called by the ISR when the SPI transfer has completed
void StartTransfer() __attribute__ ((hot)); // called to start a transfer
void TransferTimedOut() { ++numTimeouts; }
- static void AbortTransfer();
+ void AbortTransfer();
uint32_t ReadLiveStatus() const;
uint32_t ReadAccumulatedStatus(uint32_t bitsToKeep);
+ // Variables used by the ISR
+ static TmcDriverState * volatile currentDriver; // volatile because the ISR changes it
+ static uint32_t transferStartedTime;
+
+ void UartTmcHandler(); // core of the ISR for this driver
+
private:
void UpdateRegister(size_t regIndex, uint32_t regVal);
void UpdateChopConfRegister(); // calculate the chopper control register and flag it for sending
void UpdateCurrent();
+
+#if TMC22xx_HAS_MUX
void SetUartMux();
+ static void SetupDMASend(uint8_t regnum, uint32_t outVal, uint8_t crc) __attribute__ ((hot)); // set up the PDC to send a register
+ static void SetupDMAReceive(uint8_t regnum, uint8_t crc) __attribute__ ((hot)); // set up the PDC to receive a register
+#else
+ void SetupDMASend(uint8_t regnum, uint32_t outVal, uint8_t crc) __attribute__ ((hot)); // set up the PDC to send a register
+ void SetupDMAReceive(uint8_t regnum, uint8_t crc) __attribute__ ((hot)); // set up the PDC to receive a register
+#endif
static constexpr unsigned int NumWriteRegisters = 5; // the number of registers that we write to
static const uint8_t WriteRegNumbers[NumWriteRegisters]; // the register numbers that we write to
@@ -303,9 +303,6 @@ private:
static constexpr unsigned int ReadGStat = 0;
static constexpr unsigned int ReadDrvStat = 1;
- static void SetupDMASend(uint8_t regnum, uint32_t outVal, uint8_t crc) __attribute__ ((hot)); // set up the PDC to send a register
- static void SetupDMAReceive(uint8_t regnum, uint8_t crc) __attribute__ ((hot)); // set up the PDC to receive a register
-
volatile uint32_t writeRegisters[NumWriteRegisters]; // the values we want the TMC22xx writable registers to have
volatile uint32_t readRegisters[NumReadRegisters]; // the last values read from the TMC22xx readable registers
volatile uint32_t accumulatedReadRegisters[NumReadRegisters];
@@ -318,6 +315,19 @@ private:
uint32_t microstepShiftFactor; // how much we need to shift 1 left by to get the current microstepping
uint32_t motorCurrent; // the configured motor current
+#if TMC22xx_HAS_MUX
+ static Uart * const uart; // the UART that controls all drivers
+#else
+ Uart *uart; // the UART that controls this driver
+#endif
+
+ // To write a register, we send one 8-byte packet to write it, then a 4-byte packet to ask for the IFCOUNT register, then we receive an 8-byte packet containing IFCOUNT.
+ // This is the message we send - volatile because we care about when it is written
+ static volatile uint8_t sendData[12];
+
+ // Buffer for the message we receive when reading data. The first 4 or 12 bytes bytes are our own transmitted data.
+ static volatile uint8_t receiveData[20];
+
uint16_t readErrors; // how many read errors we had
uint16_t writeErrors; // how many write errors we had
uint16_t numReads; // how many successful reads we had
@@ -333,6 +343,31 @@ private:
bool enabled; // true if driver is enabled
};
+// Static data members of class TmcDriverState
+
+#if TMC22xx_HAS_MUX
+Uart * const TmcDriverState::uart = UART_TMC_DRV;
+#endif
+
+TmcDriverState * volatile TmcDriverState::currentDriver = nullptr; // volatile because the ISR changes it
+uint32_t TmcDriverState::transferStartedTime;
+
+// To write a register, we send one 8-byte packet to write it, then a 4-byte packet to ask for the IFCOUNT register, then we receive an 8-byte packet containing IFCOUNT.
+// This is the message we send - volatile because we care about when it is written
+volatile uint8_t TmcDriverState::sendData[12] =
+{
+ 0x05, 0x00, // sync byte and slave address
+ 0x00, // register address and write flag (filled in)
+ 0x00, 0x00, 0x00, 0x00, // value to write (if writing), or 1 byte of CRC if read request (filled in)
+ 0x00, // CRC of write request (filled in)
+ 0x05, 0x00, // sync byte and slave address
+ REGNUM_IFCOUNT, // register we want to read
+ ReadIfcountCRC // CRC
+};
+
+// Buffer for the message we receive when reading data. The first 4 or 12 bytes bytes are our own transmitted data.
+volatile uint8_t TmcDriverState::receiveData[20];
+
const uint8_t TmcDriverState::WriteRegNumbers[NumWriteRegisters] =
{
REGNUM_GCONF,
@@ -357,18 +392,12 @@ const uint8_t TmcDriverState::ReadRegCRCs[NumReadRegisters] =
// State structures for all drivers
static TmcDriverState driverStates[MaxSmartDrivers];
-// PDC address for the USART
-static Pdc * const uartPdc = uart_get_pdc_base(UART_TMC_DRV);
-
-// Variables used by the ISR
-static TmcDriverState * volatile currentDriver = nullptr; // volatile because the ISR changes it
-static uint32_t transferStartedTime;
-
// Set up the PDC to send a register
-/*static*/ inline void TmcDriverState::SetupDMASend(uint8_t regNum, uint32_t regVal, uint8_t crc)
+inline void TmcDriverState::SetupDMASend(uint8_t regNum, uint32_t regVal, uint8_t crc)
{
// Faster code, not using the ASF
- uartPdc->PERIPH_PTCR = (PERIPH_PTCR_RXTDIS | PERIPH_PTCR_TXTDIS); // disable the PDC
+ Pdc * const pdc = uart_get_pdc_base(uart);
+ pdc->PERIPH_PTCR = (PERIPH_PTCR_RXTDIS | PERIPH_PTCR_TXTDIS); // disable the PDC
sendData[2] = regNum | 0x80;
sendData[3] = (uint8_t)(regVal >> 24);
@@ -377,31 +406,32 @@ static uint32_t transferStartedTime;
sendData[6] = (uint8_t)regVal;
sendData[7] = crc;
- uartPdc->PERIPH_TPR = reinterpret_cast<uint32_t>(sendData);
- uartPdc->PERIPH_TCR = 12; // number of bytes to send: 8 bytes send request + 4 bytes read IFCOUNT request
+ pdc->PERIPH_TPR = reinterpret_cast<uint32_t>(sendData);
+ pdc->PERIPH_TCR = 12; // number of bytes to send: 8 bytes send request + 4 bytes read IFCOUNT request
- uartPdc->PERIPH_RPR = reinterpret_cast<uint32_t>(receiveData);
- uartPdc->PERIPH_RCR = 20; // number of bytes to receive: the sent data + 8 bytes of received data
+ pdc->PERIPH_RPR = reinterpret_cast<uint32_t>(receiveData);
+ pdc->PERIPH_RCR = 20; // number of bytes to receive: the sent data + 8 bytes of received data
- uartPdc->PERIPH_PTCR = (PERIPH_PTCR_RXTEN | PERIPH_PTCR_TXTEN); // enable the PDC to transmit and receive
+ pdc->PERIPH_PTCR = (PERIPH_PTCR_RXTEN | PERIPH_PTCR_TXTEN); // enable the PDC to transmit and receive
}
// Set up the PDC to send a register and receive the status
-/*static*/ inline void TmcDriverState::SetupDMAReceive(uint8_t regNum, uint8_t crc)
+inline void TmcDriverState::SetupDMAReceive(uint8_t regNum, uint8_t crc)
{
// Faster code, not using the ASF
- uartPdc->PERIPH_PTCR = (PERIPH_PTCR_RXTDIS | PERIPH_PTCR_TXTDIS); // disable the PDC
+ Pdc * const pdc = uart_get_pdc_base(uart);
+ pdc->PERIPH_PTCR = (PERIPH_PTCR_RXTDIS | PERIPH_PTCR_TXTDIS); // disable the PDC
sendData[2] = regNum;
sendData[3] = crc;
- uartPdc->PERIPH_TPR = reinterpret_cast<uint32_t>(sendData);
- uartPdc->PERIPH_TCR = 4; // send a 4 byte read data request
+ pdc->PERIPH_TPR = reinterpret_cast<uint32_t>(sendData);
+ pdc->PERIPH_TCR = 4; // send a 4 byte read data request
- uartPdc->PERIPH_RPR = reinterpret_cast<uint32_t>(receiveData);
- uartPdc->PERIPH_RCR = 12; // receive the 4 bytes we sent + 8 bytes of received data
+ pdc->PERIPH_RPR = reinterpret_cast<uint32_t>(receiveData);
+ pdc->PERIPH_RCR = 12; // receive the 4 bytes we sent + 8 bytes of received data
- uartPdc->PERIPH_PTCR = (PERIPH_PTCR_RXTEN | PERIPH_PTCR_TXTEN); // enable the PDC to transmit and receive
+ pdc->PERIPH_PTCR = (PERIPH_PTCR_RXTEN | PERIPH_PTCR_TXTEN); // enable the PDC to transmit and receive
}
// Set a register value and flag it for updating
@@ -434,10 +464,16 @@ pre(!driversPowered)
driverNumber = p_driverNumber;
axisNumber = p_driverNumber; // assume straight-through axis mapping initially
enablePin = p_pin; // this is NoPin for the built-in drivers
+
if (p_pin != NoPin)
{
pinMode(p_pin, OUTPUT_HIGH);
}
+
+#if !TMC22xx_HAS_MUX
+ uart = DriverUarts[p_driverNumber];
+#endif
+
enabled = false;
registersToUpdate = 0;
motorCurrent = 0;
@@ -627,7 +663,7 @@ void TmcDriverState::AppendDriverStatus(const StringRef& reply)
// This is called by the ISR when the SPI transfer has completed
inline void TmcDriverState::TransferDone()
{
- if (sendData[2] & 0x80) // if we were writing a register
+ if (sendData[2] & 0x80) // if we were writing a register
{
const uint8_t currentIfCount = receiveData[18];
if (currentIfCount == (uint8_t)(lastIfCount + 1))
@@ -640,36 +676,40 @@ inline void TmcDriverState::TransferDone()
}
lastIfCount = currentIfCount;
}
- else if (sendData[2] == ReadRegNumbers[registerToRead] && ReadRegNumbers[registerToRead] == receiveData[6] && receiveData[4] == 0x05 && receiveData[5] == 0xFF)
+ else if (driversState != DriversState::noPower) // we don't check the CRC, so only accept the result if power is still good
{
- // We asked to read the scheduled read register, and the sync byte, slave address and register number in the received message match
- //TODO here we could check the CRC of the received message, but for now we assume that we won't get any corruption in the 32-bit received data
- const uint32_t regVal = ((uint32_t)receiveData[7] << 24) | ((uint32_t)receiveData[8] << 16) | ((uint32_t)receiveData[9] << 8) | receiveData[10];
- readRegisters[registerToRead] = regVal;
- accumulatedReadRegisters[registerToRead] |= regVal;
-
- ++registerToRead;
- if (registerToRead == NumReadRegisters)
+ if (sendData[2] == ReadRegNumbers[registerToRead] && ReadRegNumbers[registerToRead] == receiveData[6] && receiveData[4] == 0x05 && receiveData[5] == 0xFF)
{
- registerToRead = 0;
+ // We asked to read the scheduled read register, and the sync byte, slave address and register number in the received message match
+ //TODO here we could check the CRC of the received message, but for now we assume that we won't get any corruption in the 32-bit received data
+ const uint32_t regVal = ((uint32_t)receiveData[7] << 24) | ((uint32_t)receiveData[8] << 16) | ((uint32_t)receiveData[9] << 8) | receiveData[10];
+ readRegisters[registerToRead] = regVal;
+ accumulatedReadRegisters[registerToRead] |= regVal;
+
+ ++registerToRead;
+ if (registerToRead == NumReadRegisters)
+ {
+ registerToRead = 0;
+ }
+ ++numReads;
+ }
+ else
+ {
+ ++readErrors;
}
- ++numReads;
- }
- else
- {
- ++readErrors;
}
}
// This is called to abandon the current transfer, if any
void TmcDriverState::AbortTransfer()
{
- UART_TMC_DRV->UART_IDR = UART_IDR_ENDRX; // disable end-of-receive interrupt
- uartPdc->PERIPH_PTCR = (PERIPH_PTCR_RXTDIS | PERIPH_PTCR_TXTDIS); // disable the PDC
- UART_TMC_DRV->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RXDIS | UART_CR_TXDIS | UART_CR_RSTSTA;
- currentDriver = nullptr;
+ uart->UART_IDR = UART_IDR_ENDRX; // disable end-of-receive interrupt
+ uart_get_pdc_base(uart)->PERIPH_PTCR = (PERIPH_PTCR_RXTDIS | PERIPH_PTCR_TXTDIS); // disable the PDC
+ uart->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RXDIS | UART_CR_TXDIS | UART_CR_RSTSTA;
}
+#if TMC22xx_HAS_MUX
+
// Set up the UART multiplexer to address the selected driver
inline void TmcDriverState::SetUartMux()
{
@@ -699,11 +739,16 @@ inline void TmcDriverState::SetUartMux()
}
}
+#endif
+
// This is called from the ISR or elsewhere to start a new SPI transfer. Inlined for ISR speed.
inline void TmcDriverState::StartTransfer()
{
currentDriver = this;
+
+#if TMC22xx_HAS_MUX
SetUartMux();
+#endif
// Find which register to send. The common case is when no registers need to be updated.
if (registersToUpdate == 0)
@@ -711,11 +756,11 @@ inline void TmcDriverState::StartTransfer()
registerBeingUpdated = 0;
// Read a register
- const irqflags_t flags = cpu_irq_save(); // avoid race condition
- UART_TMC_DRV->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX; // reset transmitter and receiver
+ const irqflags_t flags = cpu_irq_save(); // avoid race condition
+ uart->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX; // reset transmitter and receiver
SetupDMAReceive(ReadRegNumbers[registerToRead], ReadRegCRCs[registerToRead]); // set up the PDC
- UART_TMC_DRV->UART_IER = UART_IER_ENDRX; // enable end-of-receive interrupt
- UART_TMC_DRV->UART_CR = UART_CR_RXEN | UART_CR_TXEN; // enable transmitter and receiver
+ uart->UART_IER = UART_IER_ENDRX; // enable end-of-receive interrupt
+ uart->UART_CR = UART_CR_RXEN | UART_CR_TXEN; // enable transmitter and receiver
transferStartedTime = millis();
cpu_irq_restore(flags);
}
@@ -735,44 +780,71 @@ inline void TmcDriverState::StartTransfer()
} while (regNum < NumWriteRegisters - 1);
// Kick off a transfer for that register
- const irqflags_t flags = cpu_irq_save(); // avoid race condition
+ const irqflags_t flags = cpu_irq_save(); // avoid race condition
registerBeingUpdated = mask;
- UART_TMC_DRV->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX; // reset transmitter and receiver
+ uart->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX; // reset transmitter and receiver
SetupDMASend(WriteRegNumbers[regNum], writeRegisters[regNum], writeRegCRCs[regNum]); // set up the PDC
- UART_TMC_DRV->UART_IER = UART_IER_ENDRX; // enable end-of-transfer interrupt
- UART_TMC_DRV->UART_CR = UART_CR_RXEN | UART_CR_TXEN; // enable transmitter and receiver
+ uart->UART_IER = UART_IER_ENDRX; // enable end-of-transfer interrupt
+ uart->UART_CR = UART_CR_RXEN | UART_CR_TXEN; // enable transmitter and receiver
transferStartedTime = millis();
cpu_irq_restore(flags);
}
}
-// ISR for the UART
-extern "C" void UART_TMC_DRV_Handler(void) __attribute__ ((hot));
+// ISR(s) for the UART(s)
-void UART_TMC_DRV_Handler(void)
+inline void TmcDriverState::UartTmcHandler()
{
- TmcDriverState *driver = currentDriver; // capture volatile variable
- if (driver != nullptr)
+ uart->UART_IDR = UART_IDR_ENDRX; // disable the PDC interrupt
+ TransferDone(); // tidy up after the transfer we just completed
+ if (driversState != DriversState::noPower)
{
- driver->TransferDone(); // tidy up after the transfer we just completed
- if (driversState != DriversState::noPower)
+ // Power is still good, so send/receive again
+ TmcDriverState *driver = this;
+ ++driver; // advance to the next driver
+ if (driver >= driverStates + numTmc22xxDrivers)
{
- // Power is still good, so send/receive to/from the next driver
- ++driver; // advance to the next driver
- if (driver >= driverStates + numTmc22xxDrivers)
- {
- driver = driverStates;
- }
- driver->StartTransfer();
- return;
+ driver = driverStates;
}
+ driver->StartTransfer();
}
+ else
+ {
+ currentDriver = nullptr; // signal that we are not waiting for an interrupt
+ }
+}
+
+#if TMC22xx_HAS_MUX
+
+// ISR for the single UART
+extern "C" void UART_TMC_DRV_Handler() __attribute__ ((hot));
+void UART_TMC_DRV_Handler()
+{
+ UART_TMC_DRV->UART_IDR = UART_IDR_ENDRX; // disable the interrupt
+ TmcDriverState *driver = TmcDriverState::currentDriver; // capture volatile variable
+ if (driver != nullptr)
+ {
+ driver->UartTmcHandler();
+ }
+}
- // Driver power is down or there is no current driver, so stop polling
- UART_TMC_DRV->UART_IDR = UART_IDR_ENDRX;
- currentDriver = nullptr; // signal that we are not waiting for an interrupt
+#else
+
+// ISRs for the individual UARTs
+extern "C" void UART_TMC_DRV0_Handler() __attribute__ ((hot));
+void UART_TMC_DRV0_Handler()
+{
+ driverStates[0].UartTmcHandler();
+}
+
+extern "C" void UART_TMC_DRV1_Handler() __attribute__ ((hot));
+void UART_TMC_DRV1_Handler()
+{
+ driverStates[1].UartTmcHandler();
}
+#endif
+
//--------------------------- Public interface ---------------------------------
namespace SmartDrivers
@@ -786,9 +858,9 @@ namespace SmartDrivers
// Make sure the ENN pins are high
pinMode(GlobalTmcEnablePin, OUTPUT_HIGH);
- // The pins are already set up for UART use in the pins table
- ConfigurePin(GetPinDescription(DriversRxPin));
- ConfigurePin(GetPinDescription(DriversTxPin));
+#if TMC22xx_HAS_MUX
+ // Set up- the single UART that communicates with all TMC22xx drivers
+ ConfigurePin(GetPinDescription(UART_TMC_DRV_PINS)); // the pins are already set up for UART use in the pins table
// Enable the clock to the UART
pmc_enable_periph_clk(ID_UART_TMC_DRV);
@@ -799,16 +871,35 @@ namespace SmartDrivers
UART_TMC_DRV->UART_MR = UART_MR_CHMODE_NORMAL | UART_MR_PAR_NO;
UART_TMC_DRV->UART_BRGR = VARIANT_MCK/(16 * DriversBaudRate); // set baud rate
UART_TMC_DRV->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RXDIS | UART_CR_TXDIS | UART_CR_RSTSTA;
+ NVIC_EnableIRQ(UART_TMC_DRV_IRQn);
// Set up the multiplexer control pins as outputs
pinMode(DriverMuxPins[0], OUTPUT_LOW);
pinMode(DriverMuxPins[1], OUTPUT_LOW);
pinMode(DriverMuxPins[2], OUTPUT_LOW);
+#endif
driversState = DriversState::noPower;
for (size_t drive = 0; drive < numTmc22xxDrivers; ++drive)
{
- driverStates[drive].Init(drive, driverSelectPins[drive]); // axes are mapped straight through to drivers initially
+#if !TMC22xx_HAS_MUX
+ // Initialise the UART that controls this driver
+ // The pins are already set up for UART use in the pins table
+ ConfigurePin(GetPinDescription(DriverUartPins[drive]));
+
+ // Enable the clock to the UART
+ pmc_enable_periph_clk(DriverUartIds[drive]);
+
+ // Set the UART baud rate, 8 bits, 2 stop bits, no parity
+ Uart * const uart = DriverUarts[drive];
+ uart->UART_IDR = ~0u;
+ uart->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RXDIS | UART_CR_TXDIS;
+ uart->UART_MR = UART_MR_CHMODE_NORMAL | UART_MR_PAR_NO;
+ uart->UART_BRGR = VARIANT_MCK/(16 * DriversBaudRate); // set baud rate
+ uart->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RXDIS | UART_CR_TXDIS | UART_CR_RSTSTA;
+ NVIC_EnableIRQ(DriverUartIRQns[drive]);
+#endif
+ driverStates[drive].Init(drive, driverSelectPins[drive]); // axes are mapped straight through to drivers initially
}
}
@@ -903,7 +994,6 @@ namespace SmartDrivers
if (powered)
{
// Power to the drivers has been provided or restored, so we need to enable and re-initialise them
-
for (size_t drive = 0; drive < numTmc22xxDrivers; ++drive)
{
driverStates[drive].WriteAll();
@@ -913,36 +1003,40 @@ namespace SmartDrivers
}
else if (powered)
{
- if (currentDriver == nullptr)
+ // If no transfer is in progress, kick one off.
+ // If a transfer has timed out, abort it.
+ if (TmcDriverState::currentDriver == nullptr)
{
// No transfer in progress, so start one
if (numTmc22xxDrivers != 0)
{
// Kick off the first transfer
- NVIC_EnableIRQ(SERIAL_TMC_DRV_IRQn);
driverStates[0].StartTransfer();
}
}
- else if (millis() - transferStartedTime > TransferTimeout)
+ else if (millis() - TmcDriverState::transferStartedTime > TransferTimeout)
{
// A UART transfer was started but has timed out
- currentDriver->TransferTimedOut();
- uint8_t driverNum = currentDriver->GetDriverNumber();
- TmcDriverState::AbortTransfer(); // this clears currentDriver
+ TmcDriverState::currentDriver->TransferTimedOut();
+ TmcDriverState::currentDriver->AbortTransfer();
+ uint8_t driverNum = TmcDriverState::currentDriver->GetDriverNumber();
+ TmcDriverState::currentDriver = nullptr;
+
++driverNum;
if (driverNum >= numTmc22xxDrivers)
{
driverNum = 0;
}
+ driverStates[driverNum].StartTransfer();
}
if (driversState == DriversState::initialising)
{
- // If all drivers have been initialised, set the global enable
+ // If all drivers that share the global enable have been initialised, set the global enable
bool allInitialised = true;
for (size_t i = 0; i < numTmc22xxDrivers; ++i)
{
- if (driverStates[i].UpdatePending())
+ if (driverStates[i].UsesGlobalEnable() && driverStates[i].UpdatePending())
{
allInitialised = false;
break;
@@ -960,7 +1054,11 @@ namespace SmartDrivers
{
// We had power but we lost it
digitalWrite(GlobalTmcEnablePin, HIGH); // disable the drivers
- TmcDriverState::AbortTransfer();
+ if (TmcDriverState::currentDriver == nullptr)
+ {
+ TmcDriverState::currentDriver->AbortTransfer();
+ TmcDriverState::currentDriver = nullptr;
+ }
driversState = DriversState::noPower;
}
}
@@ -1001,4 +1099,6 @@ namespace SmartDrivers
}; // end namespace
+#endif
+
// End
diff --git a/src/DuetM/TMC22xx.h b/src/StepperDrivers/TMC22xx/TMC22xx.h
index 4e181fdc..7e09de0a 100644
--- a/src/DuetM/TMC22xx.h
+++ b/src/StepperDrivers/TMC22xx/TMC22xx.h
@@ -5,8 +5,16 @@
* Author: David
*/
-#ifndef TMC2660_H_
-#define TMC2660_H_
+// NB - must #include some file that includes Pins.h before including this one, so that SUPPORT_TMC22xx is defined
+
+#ifndef TMC22xx_H_
+#define TMC22xx_H_
+
+#if SUPPORT_TMC22xx
+
+#ifndef TMC22xx_HAS_MUX
+# error TMC22xx_HAS_MUX not defined
+#endif
#include "RepRapFirmware.h"
#include "GCodes/DriverMode.h"
@@ -14,12 +22,6 @@
#include "MessageType.h"
#include "Libraries/General/StringRef.h"
-// The Platform class needs to know which USART we are using when assigning interrupt priorities (SERIAL_TMC_DRV_IRQn), so we define the UART we are using here
-#define UART_TMC_DRV UART0
-#define SERIAL_TMC_DRV_IRQn UART0_IRQn
-#define ID_UART_TMC_DRV ID_UART0
-#define UART_TMC_DRV_Handler UART0_Handler
-
// TMC22xx DRV_STATUS register bit assignments
const uint32_t TMC_RR_OT = 1 << 1; // over temperature shutdown
const uint32_t TMC_RR_OTPW = 1 << 0; // over temperature warning
@@ -56,4 +58,6 @@ namespace SmartDrivers
void SetStandstillCurrentPercent(size_t drive, float percent);
};
-#endif /* TMC2660_H_ */
+#endif
+
+#endif /* TMC22xx_H_ */
diff --git a/src/DuetNG/TMC2660.cpp b/src/StepperDrivers/TMC2660/TMC2660.cpp
index c601fcf0..e390e690 100644
--- a/src/DuetNG/TMC2660.cpp
+++ b/src/StepperDrivers/TMC2660/TMC2660.cpp
@@ -5,6 +5,10 @@
* Author: David
*/
+#include "RepRapFirmware.h"
+
+#if SUPPORT_TMC2660
+
#include "TMC2660.h"
#include "RepRap.h"
#include "Movement/Move.h"
@@ -501,27 +505,30 @@ uint32_t TmcDriverState::GetChopConf() const
// This is called by the ISR when the SPI transfer has completed
inline void TmcDriverState::TransferDone()
{
- fastDigitalWriteHigh(pin); // set the CS pin high for the driver we just polled
- uint32_t status = be32_to_cpu(spiDataIn) >> 12; // get the status
- const uint32_t interval = reprap.GetMove().GetStepInterval(axisNumber, microstepShiftFactor); // get the full step interval
- if (interval == 0 || interval > maxStallStepInterval) // if the motor speed is too low to get reliable stall indication
- {
- status &= ~TMC_RR_SG; // remove the stall status bit
- }
- else
+ fastDigitalWriteHigh(pin); // set the CS pin high for the driver we just polled
+ if (driversPowered) // if the power is still good, update the status
{
- const uint32_t sgLoad = (status >> TMC_RR_SG_LOAD_SHIFT) & 1023; // get the StallGuard load register
- if (sgLoad < minSgLoadRegister)
+ uint32_t status = be32_to_cpu(spiDataIn) >> 12; // get the status
+ const uint32_t interval = reprap.GetMove().GetStepInterval(axisNumber, microstepShiftFactor); // get the full step interval
+ if (interval == 0 || interval > maxStallStepInterval) // if the motor speed is too low to get reliable stall indication
{
- minSgLoadRegister = sgLoad;
+ status &= ~TMC_RR_SG; // remove the stall status bit
}
- if (sgLoad > maxSgLoadRegister)
+ else
{
- maxSgLoadRegister = sgLoad;
+ const uint32_t sgLoad = (status >> TMC_RR_SG_LOAD_SHIFT) & 1023; // get the StallGuard load register
+ if (sgLoad < minSgLoadRegister)
+ {
+ minSgLoadRegister = sgLoad;
+ }
+ if (sgLoad > maxSgLoadRegister)
+ {
+ maxSgLoadRegister = sgLoad;
+ }
}
+ lastReadStatus = status;
+ accumulatedStatus |= status;
}
- lastReadStatus = status;
- accumulatedStatus |= status;
}
// This is called from the ISR or elsewhere to start a new SPI transfer. Inlined for ISR speed.
@@ -743,7 +750,7 @@ namespace SmartDrivers
if (currentDriver == nullptr && numTmc2660Drivers != 0)
{
// Kick off the first transfer
- NVIC_EnableIRQ(SERIAL_TMC_DRV_IRQn);
+ NVIC_EnableIRQ(UART_TMC_DRV_IRQn);
driverStates[0].StartTransfer();
}
}
@@ -820,6 +827,8 @@ namespace SmartDrivers
}; // end namespace
+#endif
+
// End
diff --git a/src/DuetNG/TMC2660.h b/src/StepperDrivers/TMC2660/TMC2660.h
index c31f6ffe..ceed9734 100644
--- a/src/DuetNG/TMC2660.h
+++ b/src/StepperDrivers/TMC2660/TMC2660.h
@@ -8,6 +8,8 @@
#ifndef TMC2660_H_
#define TMC2660_H_
+#if SUPPORT_TMC2660
+
#include "RepRapFirmware.h"
#include "GCodes/DriverMode.h"
#include "Pins.h"
@@ -16,7 +18,7 @@
// The Platform class needs to know which USART we are using when assigning interrupt priorities
#define USART_TMC_DRV USART1
-#define SERIAL_TMC_DRV_IRQn USART1_IRQn
+#define UART_TMC_DRV_IRQn USART1_IRQn
#define ID_USART_TMC_DRV ID_USART1
#define USART_TMC_DRV_Handler USART1_Handler
@@ -58,4 +60,6 @@ namespace SmartDrivers
void SetStandstillCurrentPercent(size_t driver, float percent);
};
+#endif
+
#endif /* TMC2660_H_ */
diff --git a/src/Storage/FileStore.cpp b/src/Storage/FileStore.cpp
index 07322cb9..002c31f6 100644
--- a/src/Storage/FileStore.cpp
+++ b/src/Storage/FileStore.cpp
@@ -5,6 +5,7 @@
#include "MassStorage.h"
#include "Platform.h"
#include "RepRap.h"
+#include "Libraries/Fatfs/diskio.h"
uint32_t FileStore::longestWriteTime = 0;
@@ -476,6 +477,12 @@ float FileStore::GetAndClearLongestWriteTime()
return ret;
}
+// Return the highest SD card retry count that resulted in a successful transfer
+unsigned int FileStore::GetAndClearMaxRetryCount()
+{
+ return DiskioGetAndClearMaxRetryCount();
+}
+
#if 0 // not currently used
// Provide a cluster map for fast seeking. Needs _USE_FASTSEEK defined as 1 in conf_fatfs to make any difference.
diff --git a/src/Storage/FileStore.h b/src/Storage/FileStore.h
index 9f674a4b..8626974d 100644
--- a/src/Storage/FileStore.h
+++ b/src/Storage/FileStore.h
@@ -60,7 +60,7 @@ public:
bool SetClusterMap(uint32_t[]); // Provide a cluster map for fast seeking
#endif
static float GetAndClearLongestWriteTime(); // Return the longest time it took to write a block to a file, in milliseconds
-
+ static unsigned int GetAndClearMaxRetryCount(); // Return the highest SD card retry count that resulted in a successful transfer
friend class MassStorage;
private:
diff --git a/src/Tasks.cpp b/src/Tasks.cpp
index 193198f9..db4139b8 100644
--- a/src/Tasks.cpp
+++ b/src/Tasks.cpp
@@ -201,23 +201,15 @@ namespace Tasks
p.MessageF(mtype, " %s(%s,%u)",
taskDetails.pcTaskName, stateText, (unsigned int)(taskDetails.usStackHighWaterMark * sizeof(StackType_t)));
}
- p.Message(mtype, "\nMutexes:");
+ p.Message(mtype, "\nOwned mutexes:");
for (const Mutex *m = Mutex::GetMutexList(); m != nullptr; m = m->GetNext())
{
const TaskHandle holder = m->GetHolder();
- TaskStatus_t taskDetails;
- const char *holderText;
- if (holder == nullptr)
- {
- holderText = "null";
- }
- else
+ if (holder != nullptr)
{
- vTaskGetInfo(holder, &taskDetails, pdTRUE, eInvalid);
- holderText = taskDetails.pcTaskName;
+ p.MessageF(mtype, " %s(%s)", m->GetName(), pcTaskGetName(holder));
}
- p.MessageF(mtype, " %s(%s)", m->GetName(), holderText);
}
p.MessageF(mtype, "\n");
#endif
diff --git a/src/Tools/Tool.cpp b/src/Tools/Tool.cpp
index 87cd83f8..2aee50b1 100644
--- a/src/Tools/Tool.cpp
+++ b/src/Tools/Tool.cpp
@@ -34,7 +34,7 @@
Tool * Tool::freelist = nullptr;
// Create a new tool and return a pointer to it. If an error occurs, put an error message in 'reply' and return nullptr.
-/*static*/ Tool *Tool::Create(int toolNumber, const char *name, long d[], size_t dCount, long h[], size_t hCount, AxesBitmap xMap, AxesBitmap yMap, FansBitmap fanMap, bool forceFilament, const StringRef& reply)
+/*static*/ Tool *Tool::Create(int toolNumber, const char *name, long d[], size_t dCount, long h[], size_t hCount, AxesBitmap xMap, AxesBitmap yMap, FansBitmap fanMap, int filamentDrive, const StringRef& reply)
{
const size_t numExtruders = reprap.GetGCodes().GetNumExtruders();
if (dCount > ARRAY_SIZE(Tool::drives))
@@ -82,11 +82,10 @@ Tool * Tool::freelist = nullptr;
t = new Tool;
}
- if (dCount == 1 || (dCount > 0 && forceFilament))
+ if (filamentDrive >= 0 && filamentDrive < (int)MaxExtruders)
{
- // Create only one Filament instance per extruder drive, and only if this tool is assigned to exactly one extruder
- // This option can be overridden manually though
- Filament * const filament = Filament::GetFilamentByExtruder(d[0]);
+ // Use exactly only one Filament instance per extruder drive
+ Filament * const filament = Filament::GetFilamentByExtruder(filamentDrive);
t->filament = (filament == nullptr) ? new Filament(d[0]) : filament;
}
else
diff --git a/src/Tools/Tool.h b/src/Tools/Tool.h
index 4afba13b..0c12c21b 100644
--- a/src/Tools/Tool.h
+++ b/src/Tools/Tool.h
@@ -45,7 +45,7 @@ class Tool
{
public:
- static Tool *Create(int toolNumber, const char *name, long d[], size_t dCount, long h[], size_t hCount, AxesBitmap xMap, AxesBitmap yMap, FansBitmap fanMap, bool forceFilament, const StringRef& reply);
+ static Tool *Create(int toolNumber, const char *name, long d[], size_t dCount, long h[], size_t hCount, AxesBitmap xMap, AxesBitmap yMap, FansBitmap fanMap, int filamentDrive, const StringRef& reply);
static void Delete(Tool *t);
float GetOffset(size_t axis) const pre(axis < MaxAxes);
diff --git a/src/Version.h b/src/Version.h
index d3695b71..bc5732f3 100644
--- a/src/Version.h
+++ b/src/Version.h
@@ -12,9 +12,9 @@
#ifndef VERSION
#ifdef RTOS
# define RTOSVER "(RTOS)"
-# define MAIN_VERSION "2.01beta3"
+# define MAIN_VERSION "2.01beta3+1"
#else
-# define MAIN_VERSION "1.21.2beta3"
+# define MAIN_VERSION "1.22beta3+1"
# define RTOSVER
#endif
@@ -22,7 +22,7 @@
#endif
#ifndef DATE
-# define DATE "2018-07-20b1"
+# define DATE "2018-07-23b1"
#endif
#define AUTHORS "reprappro, dc42, chrishamm, t3p3, dnewman"