Version 1.12

Enhancements
=========
Added support for RTD temperature sensors
When cancelling a print, if cancel.g exists then run it instead of
turning heaters off
Improved file upload speed over the web interface
Chamber heater is now exempted from timeout
Pressure advance now reduces maximum extruder jerk setting by a smaller
amount when the extruder steps/mm is high
The Duet no longer reports itself as an Arduino Due and has its own
Windows driver
Added experimental "maximum average printing acceleration" feature
Try to improve speed of getting file information in Print Monitor

Bug fixes
======
Simulation mode was not working properly
External driver support code sometimes failed to enable the associated
drives
Fixed potential overflow if a user attempted to use non-existent driver
9 on a Duet 0.6
M408 status requests were not handled when in simulation mode
Removed hard coded PATH in project
This commit is contained in:
David Crocker 2016-05-07 21:55:19 +01:00
parent 1a0ce16128
commit 7c864d13e3
21 changed files with 327 additions and 112 deletions

View file

@ -106,7 +106,7 @@
</toolChain>
</folderInfo>
<sourceEntries>
<entry excluding="src/Duet/Lwip/lwip/src/core/ipv6|src/Duet/Lwip/lwip/test|src/DuetNG|Libraries/Lwip/lwip/src/core/ipv6|Libraries/Lwip/lwip/test|DuetArduinoCore/system/CMSIS/Device/ATMEL/sam3xa/source/as_gcc|DuetArduinoCore/system/CMSIS/Device/ATMEL/sam3xa/source/gcc_atmel|DuetArduinoCore/system/CMSIS/Device/ARM|DuetArduinoCore/system/CMSIS/Device/ATMEL/sam3xa/source/gcc_arm|DuetArduinoCore/system/CMSIS/Device/ATMEL/sam3xa/source/iar|DuetArduinoCore/system/CMSIS/CMSIS/Lib/ARM|DuetArduinoCore/system/CMSIS/CMSIS/DSP_Lib|DuetArduinoCore/system/CMSIS/Device/ATMEL/sam4.h|DuetArduinoCore/system/CMSIS/Device/ATMEL/sam4s|DuetArduinoCore/system/CMSIS/Device/ATMEL/sam3u|DuetArduinoCore/system/CMSIS/Device/ATMEL/sam3s|DuetArduinoCore/system/CMSIS/Device/ATMEL/sam3n|DuetArduinoCore/system/CMSIS/Device/ARM/ARMCM4|DuetArduinoCore/system/CMSIS/Device/ARM/ARMCM0|DuetArduinoCore/system/CMSIS/Device/ATMEL/sam3sd8" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
<entry excluding="src/Duet/Lwip/lwip/src/core/ipv6|src/Duet/Lwip/lwip/test|src/DuetNG`" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
</sourceEntries>
</configuration>
</storageModule>
@ -216,7 +216,6 @@
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Duet/Lwip}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Duet/EMAC}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Libraries/Fatfs}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Libraries/MAX31855}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Libraries/MCP4461}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Libraries/Flash}&quot;"/>
</option>
@ -231,7 +230,7 @@
</toolChain>
</folderInfo>
<sourceEntries>
<entry excluding="SAM4E_CoreNG/src/DuetNG|src/Duet/Lwip/lwip/src/core/ipv6|src/Duet/Lwip/lwip/test|src/DuetNG|Libraries/Lwip/lwip/src/core/ipv6|Libraries/Lwip/lwip/test|DuetArduinoCore/system/CMSIS/Device/ATMEL/sam3xa/source/as_gcc|DuetArduinoCore/system/CMSIS/Device/ATMEL/sam3xa/source/gcc_atmel|DuetArduinoCore/system/CMSIS/Device/ARM|DuetArduinoCore/system/CMSIS/Device/ATMEL/sam3xa/source/gcc_arm|DuetArduinoCore/system/CMSIS/Device/ATMEL/sam3xa/source/iar|DuetArduinoCore/system/CMSIS/CMSIS/Lib/ARM|DuetArduinoCore/system/CMSIS/CMSIS/DSP_Lib|DuetArduinoCore/system/CMSIS/Device/ATMEL/sam4.h|DuetArduinoCore/system/CMSIS/Device/ATMEL/sam4s|DuetArduinoCore/system/CMSIS/Device/ATMEL/sam3u|DuetArduinoCore/system/CMSIS/Device/ATMEL/sam3s|DuetArduinoCore/system/CMSIS/Device/ATMEL/sam3n|DuetArduinoCore/system/CMSIS/Device/ARM/ARMCM4|DuetArduinoCore/system/CMSIS/Device/ARM/ARMCM0|DuetArduinoCore/system/CMSIS/Device/ATMEL/sam3sd8" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
<entry excluding="src/Duet/Lwip/lwip/src/core/ipv6|src/DuetNG|src/Duet/Lwip/lwip/test" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
</sourceEntries>
</configuration>
</storageModule>
@ -337,7 +336,6 @@
<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/Libraries/Fatfs}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Libraries/MAX31855}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Libraries/MCP4461}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/src/Libraries/Flash}&quot;"/>
</option>
@ -353,7 +351,7 @@
</toolChain>
</folderInfo>
<sourceEntries>
<entry excluding="SAM4E_CoreNG/src/Duet|src/Duet|Libraries/EMAC|Libraries/Lwip|Libraries/Lwip/lwip/src/core/ipv6|Libraries/Lwip/lwip/test|DuetArduinoCore/system/CMSIS/Device/ATMEL/sam3xa/source/as_gcc|DuetArduinoCore/system/CMSIS/Device/ATMEL/sam3xa/source/gcc_atmel|DuetArduinoCore/system/CMSIS/Device/ARM|DuetArduinoCore/system/CMSIS/Device/ATMEL/sam3xa/source/gcc_arm|DuetArduinoCore/system/CMSIS/Device/ATMEL/sam3xa/source/iar|DuetArduinoCore/system/CMSIS/CMSIS/Lib/ARM|DuetArduinoCore/system/CMSIS/CMSIS/DSP_Lib|DuetArduinoCore/system/CMSIS/Device/ATMEL/sam4.h|DuetArduinoCore/system/CMSIS/Device/ATMEL/sam4s|DuetArduinoCore/system/CMSIS/Device/ATMEL/sam3u|DuetArduinoCore/system/CMSIS/Device/ATMEL/sam3s|DuetArduinoCore/system/CMSIS/Device/ATMEL/sam3n|DuetArduinoCore/system/CMSIS/Device/ARM/ARMCM4|DuetArduinoCore/system/CMSIS/Device/ARM/ARMCM0|DuetArduinoCore/system/CMSIS/Device/ATMEL/sam3sd8" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
<entry excluding="src/Duet" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
</sourceEntries>
</configuration>
</storageModule>
@ -368,9 +366,11 @@
<configuration configurationName="Release">
<resource resourceType="PROJECT" workspacePath="/RepRapFirmware"/>
</configuration>
<configuration configurationName="SAM3X_CoreNG"/>
<configuration configurationName="ReleaseWithCoreNG">
<resource resourceType="PROJECT" workspacePath="/RepRapFirmware"/>
</configuration>
<configuration configurationName="SAM4E_CoreNG"/>
<configuration configurationName="ReleaseWithCoreDuet">
<resource resourceType="PROJECT" workspacePath="/RepRapFirmware"/>
</configuration>

View file

@ -5,7 +5,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="1158727986141128527" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="337623625225680352" 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>
@ -16,7 +16,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="1158727986141128527" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="337623625225680352" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
@ -27,7 +27,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="1158727986141128527" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="337623625225680352" 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>

View file

@ -5,9 +5,6 @@ environment/project/cdt.managedbuild.config.gnu.cross.exe.release.516195201.9764
environment/project/cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.241502451/LINK_FLAGS_2/delimiter=;
environment/project/cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.241502451/LINK_FLAGS_2/operation=append
environment/project/cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.241502451/LINK_FLAGS_2/value=-Wl,--end-group -lm -gcc
environment/project/cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.241502451/PATH/delimiter=;
environment/project/cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.241502451/PATH/operation=replace
environment/project/cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.241502451/PATH/value=C\:/Arduino-1.5.8/hardware/tools/gcc-arm-none-eabi-4.8.3-2014q1/bin/;C\:/Program Files (x86)/Java/jre7/bin/client;C\:/Program Files (x86)/Java/jre7/bin;C\:/Program Files (x86)/Java/jre7/lib/i386;C\:\\Windows\\system32;C\:\\Windows;C\:\\Windows\\System32\\Wbem;C\:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C\:\\Program Files (x86)\\Common Files\\Sage SData\\;C\:\\Program Files (x86)\\Common Files\\Sage SBD\\;C\:\\Program Files (x86)\\GNU\\GnuPG\\pub;C\:\\Program Files (x86)\\MiKTeX 2.9\\miktex\\bin\\;C\:\\Program Files\\Microsoft SQL Server\\110\\Tools\\Binn\\;C\:\\WINDOWS\\system32;C\:\\WINDOWS;C\:\\WINDOWS\\System32\\Wbem;C\:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;C\:\\Program Files (x86)\\ATI Technologies\\ATI.ACE\\Core-Static;C\:\\Program Files (x86)\\AMD\\ATI.ACE\\Core-Static;C\:\\Strawberry\\c\\bin;C\:\\Strawberry\\perl\\site\\bin;C\:\\Strawberry\\perl\\bin;C\:\\Program Files\\nodejs\\;C\:\\Program Files (x86)\\Skype\\Phone\\;C\:\\Program Files (x86)\\Atmel\\sam-ba_2.15\\drv\\;C\:\\Program Files (x86)\\Atmel\\sam-ba_2.15;C\:\\SPARK\\gpl-2014\\bin;C\:\\GNAT\\2014\\bin;C\:\\Bin;C\:\\Python27;C\:\\Users\\David\\AppData\\Roaming\\npm;C\:\\eclipse-juno
environment/project/cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.241502451/append=true
environment/project/cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850.241502451/appendContributed=true
environment/project/cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850/LINK_FLAGS_1/delimiter=;
@ -16,9 +13,6 @@ environment/project/cdt.managedbuild.config.gnu.cross.exe.release.516195201.9764
environment/project/cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850/LINK_FLAGS_2/delimiter=;
environment/project/cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850/LINK_FLAGS_2/operation=append
environment/project/cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850/LINK_FLAGS_2/value=-Wl,--end-group -lm -gcc
environment/project/cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850/PATH/delimiter=;
environment/project/cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850/PATH/operation=replace
environment/project/cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850/PATH/value=C\:/Arduino-1.5.8/hardware/tools/gcc-arm-none-eabi-4.8.3-2014q1/bin/;C\:/Program Files (x86)/Java/jre7/bin/client;C\:/Program Files (x86)/Java/jre7/bin;C\:/Program Files (x86)/Java/jre7/lib/i386;C\:\\Windows\\system32;C\:\\Windows;C\:\\Windows\\System32\\Wbem;C\:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C\:\\Program Files (x86)\\Common Files\\Sage SData\\;C\:\\Program Files (x86)\\Common Files\\Sage SBD\\;C\:\\Program Files (x86)\\GNU\\GnuPG\\pub;C\:\\Program Files (x86)\\MiKTeX 2.9\\miktex\\bin\\;C\:\\Program Files\\Microsoft SQL Server\\110\\Tools\\Binn\\;C\:\\WINDOWS\\system32;C\:\\WINDOWS;C\:\\WINDOWS\\System32\\Wbem;C\:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;C\:\\Program Files (x86)\\ATI Technologies\\ATI.ACE\\Core-Static;C\:\\Program Files (x86)\\AMD\\ATI.ACE\\Core-Static;C\:\\Strawberry\\c\\bin;C\:\\Strawberry\\perl\\site\\bin;C\:\\Strawberry\\perl\\bin;C\:\\Program Files\\nodejs\\;C\:\\Program Files (x86)\\Skype\\Phone\\;C\:\\Program Files (x86)\\Atmel\\sam-ba_2.15\\drv\\;C\:\\Program Files (x86)\\Atmel\\sam-ba_2.15;C\:\\SPARK\\gpl-2014\\bin;C\:\\GNAT\\2014\\bin;C\:\\Bin;C\:\\Python27;C\:\\Users\\David\\AppData\\Roaming\\npm;C\:\\eclipse-juno
environment/project/cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850/append=true
environment/project/cdt.managedbuild.config.gnu.cross.exe.release.516195201.976458850/appendContributed=true
environment/project/cdt.managedbuild.config.gnu.cross.exe.release.516195201/LINK_FLAGS_1/delimiter=;
@ -27,8 +21,5 @@ environment/project/cdt.managedbuild.config.gnu.cross.exe.release.516195201/LINK
environment/project/cdt.managedbuild.config.gnu.cross.exe.release.516195201/LINK_FLAGS_2/delimiter=;
environment/project/cdt.managedbuild.config.gnu.cross.exe.release.516195201/LINK_FLAGS_2/operation=append
environment/project/cdt.managedbuild.config.gnu.cross.exe.release.516195201/LINK_FLAGS_2/value=-Wl,--end-group -lm -gcc
environment/project/cdt.managedbuild.config.gnu.cross.exe.release.516195201/PATH/delimiter=;
environment/project/cdt.managedbuild.config.gnu.cross.exe.release.516195201/PATH/operation=replace
environment/project/cdt.managedbuild.config.gnu.cross.exe.release.516195201/PATH/value=C\:/Arduino-1.5.8/hardware/tools/gcc-arm-none-eabi-4.8.3-2014q1/bin/;C\:/Program Files (x86)/Java/jre7/bin/client;C\:/Program Files (x86)/Java/jre7/bin;C\:/Program Files (x86)/Java/jre7/lib/i386;C\:\\Windows\\system32;C\:\\Windows;C\:\\Windows\\System32\\Wbem;C\:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C\:\\Program Files (x86)\\Common Files\\Sage SData\\;C\:\\Program Files (x86)\\Common Files\\Sage SBD\\;C\:\\Program Files (x86)\\GNU\\GnuPG\\pub;C\:\\Program Files (x86)\\MiKTeX 2.9\\miktex\\bin\\;C\:\\Program Files\\Microsoft SQL Server\\110\\Tools\\Binn\\;C\:\\WINDOWS\\system32;C\:\\WINDOWS;C\:\\WINDOWS\\System32\\Wbem;C\:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;C\:\\Program Files (x86)\\ATI Technologies\\ATI.ACE\\Core-Static;C\:\\Program Files (x86)\\AMD\\ATI.ACE\\Core-Static;C\:\\Strawberry\\c\\bin;C\:\\Strawberry\\perl\\site\\bin;C\:\\Strawberry\\perl\\bin;C\:\\Program Files\\nodejs\\;C\:\\Program Files (x86)\\Skype\\Phone\\;C\:\\Program Files (x86)\\Atmel\\sam-ba_2.15\\drv\\;C\:\\Program Files (x86)\\Atmel\\sam-ba_2.15;C\:\\SPARK\\gpl-2014\\bin;C\:\\GNAT\\2014\\bin;C\:\\Bin;C\:\\Python27;C\:\\Users\\David\\AppData\\Roaming\\npm;C\:\\eclipse-juno
environment/project/cdt.managedbuild.config.gnu.cross.exe.release.516195201/append=true
environment/project/cdt.managedbuild.config.gnu.cross.exe.release.516195201/appendContributed=true

86
Driver/duet.inf Normal file
View file

@ -0,0 +1,86 @@
; Windows 2000, XP, Vista, 7 and 8 (x32 and x64) setup file for Duet 3D printer control electronics
; Copyright (c) 2000-2013 ATMEL, Inc.
[Version]
Signature = "$Windows NT$"
Class = Ports
ClassGuid = {4D36E978-E325-11CE-BFC1-08002BE10318}
Provider = %Provider%
CatalogFile = duetinf.cat
DriverVer = 05/01/2016,1.12.0.0
;----------------------------------------------------------
; Targets
;----------------------------------------------------------
[Manufacturer]
%Provider%=DeviceList, NTAMD64, NT
[DeviceList]
%DUET%=DriverInstall, USB\VID_03EB&PID_2404
[DeviceList.NTAMD64]
%DUET%=DriverInstall.NTamd64, USB\VID_03EB&PID_2404
[DeviceList.NT]
%DUET%=DriverInstall.NT, USB\VID_03EB&PID_2404
;------------------------------------------------------------
; Windows XP, Vista, Windows 7, Windows 8, Windows 10 - 32bit
;------------------------------------------------------------
[DestinationDirs]
DefaultDestDir=12
FakeModemCopyFileSection=12
[DriverInstall.NT]
include=mdmcpq.inf
CopyFiles=FakeModemCopyFileSection
AddReg=DriverInstall.NT.AddReg
[DriverInstall.NT.AddReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,usbser.sys
HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider"
[DriverInstall.NT.Services]
AddService = usbser, 0x00000002, DriverService.NT
[DriverService.NT]
DisplayName = %Serial.SvcDesc%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
StartType = 3 ; SERVICE_DEMAND_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %12%\usbser.sys
LoadOrderGroup = Base
;------------------------------------------------------------
; Windows XP, Vista, Windows 7, Windows 8, Windows 10 - 64bit
;------------------------------------------------------------
[DriverInstall.NTamd64]
include=mdmcpq.inf
CopyFiles=FakeModemCopyFileSection
AddReg=DriverInstall.NTamd64.AddReg
[DriverInstall.NTamd64.AddReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,usbser.sys
HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider"
[DriverInstall.NTamd64.Services]
AddService=usbser, 0x00000002, DriverService.NTamd64
[DriverService.NTamd64]
DisplayName=%Serial.SvcDesc%
ServiceType=1
StartType=3
ErrorControl=1
ServiceBinary=%12%\usbser.sys
;----------------------------------------------------------
; String
;----------------------------------------------------------
[Strings]
Provider = "Duet 3D printer electronics driver"
DUET = "Duet 3D printer control electronics"
Serial.SvcDesc = "USB Serial emulation driver"

BIN
Driver/duetinf.cat Normal file

Binary file not shown.

Binary file not shown.

6
Scripts/signdriver.bat Normal file
View file

@ -0,0 +1,6 @@
rem CD to the RepRapFirmware root directory before running this
"C:\Program Files (x86)\Windows Kits\10\bin\x86\Inf2Cat.exe" /driver:Driver /os:XP_X86,Vista_X86,Vista_X64,7_X86,7_X64,8_X86,8_X64,6_3_X86,6_3_X64,10_X86,10_X64
set PASSWORD=
set /P PASSWORD=Private key password: %=%
"C:\Program Files (x86)\Windows Kits\10\bin\x86\signtool.exe" sign /f g:\EscherTechnologies.p12 /p %PASSWORD% /tr http://timestamp.comodoca.com /v Driver/duetinf.cat
"C:\Program Files (x86)\Windows Kits\10\bin\x86\signtool.exe" verify /pa /tw Driver/duetinf.cat

View file

@ -26,11 +26,11 @@ Licence: GPL
// Firmware name is now defined in the Pins file
#ifndef VERSION
# define VERSION "1.11a"
# define VERSION "1.12"
#endif
#ifndef DATE
# define DATE "2016-04-24"
# define DATE "2016-05-07"
#endif
#define AUTHORS "reprappro, dc42, zpl, t3p3, dnewman"
@ -164,6 +164,7 @@ const float FILAMENT_WIDTH = 1.75; // Millimetres
#define BED_EQUATION_G "bed.g"
#define PAUSE_G "pause.g"
#define RESUME_G "resume.g"
#define CANCEL_G "cancel.g"
#define STOP_G "stop.g"
#define SLEEP_G "sleep.g"

View file

@ -80,14 +80,14 @@ void DDA::Init()
}
// Set up a real move. Return true if it represents real movement, else false.
bool DDA::Init(const GCodes::RawMove *nextMove, bool doMotorMapping)
bool DDA::Init(const GCodes::RawMove &nextMove, bool doMotorMapping)
{
// 1. Compute the new endpoints and the movement vector
const int32_t *positionNow = prev->DriveCoordinates();
const Move *move = reprap.GetMove();
if (doMotorMapping)
{
move->MotorTransform(nextMove->coords, endPoint); // transform the axis coordinates if on a delta or CoreXY printer
move->MotorTransform(nextMove.coords, endPoint); // transform the axis coordinates if on a delta or CoreXY printer
isDeltaMovement = move->IsDeltaMode()
&& (endPoint[X_AXIS] != positionNow[X_AXIS] || endPoint[Y_AXIS] != positionNow[Y_AXIS] || endPoint[Z_AXIS] != positionNow[Z_AXIS]);
}
@ -106,13 +106,13 @@ bool DDA::Init(const GCodes::RawMove *nextMove, bool doMotorMapping)
accelerations[drive] = normalAccelerations[drive];
if (drive >= AXES || !doMotorMapping)
{
endPoint[drive] = Move::MotorEndPointToMachine(drive, nextMove->coords[drive]);
endPoint[drive] = Move::MotorEndPointToMachine(drive, nextMove.coords[drive]);
}
int32_t delta;
if (drive < AXES)
{
endCoordinates[drive] = nextMove->coords[drive];
endCoordinates[drive] = nextMove.coords[drive];
delta = endPoint[drive] - positionNow[drive];
}
else
@ -123,7 +123,7 @@ bool DDA::Init(const GCodes::RawMove *nextMove, bool doMotorMapping)
DriveMovement& dm = ddm[drive];
if (drive < AXES && !isSpecialDeltaMove)
{
directionVector[drive] = nextMove->coords[drive] - prev->GetEndCoordinate(drive, false);
directionVector[drive] = nextMove.coords[drive] - prev->GetEndCoordinate(drive, false);
dm.state = (isDeltaMovement || delta != 0)
? DMState::moving // on a delta printer, if one tower moves then we assume they all do
: DMState::idle;
@ -168,9 +168,9 @@ bool DDA::Init(const GCodes::RawMove *nextMove, bool doMotorMapping)
}
// 3. Store some values
endStopsToCheck = nextMove->endStopsToCheck;
filePos = nextMove->filePos;
usePressureAdvance = nextMove->usePressureAdvance;
endStopsToCheck = nextMove.endStopsToCheck;
filePos = nextMove.filePos;
usePressureAdvance = nextMove.usePressureAdvance;
// The end coordinates will be valid at the end of this move if it does not involve endstop checks and is not a special move on a delta printer
endCoordinatesValid = (endStopsToCheck == 0) && (doMotorMapping || !move->IsDeltaMode());
@ -271,7 +271,7 @@ bool DDA::Init(const GCodes::RawMove *nextMove, bool doMotorMapping)
// Set the speed to the smaller of the requested and maximum speed.
// Also enforce a minimum speed of 0.5mm/sec. We need a minimum speed to avoid overflow in the movement calculations.
float reqSpeed = nextMove->feedRate;
float reqSpeed = nextMove.feedRate;
if (isSpecialDeltaMove)
{
// Special case of a raw or homing move on a delta printer
@ -338,6 +338,7 @@ float DDA::GetMotorPosition(size_t drive) const
return Move::MotorEndpointToPosition(endPoint[drive], drive);
}
// Try to increase the ending speed of this move to allow the next move to start at targetNextSpeed
void DDA::DoLookahead(DDA *laDDA)
//pre(state == provisional)
{
@ -350,32 +351,34 @@ void DDA::DoLookahead(DDA *laDDA)
bool recurse = false;
if (goingUp)
{
// We have been asked to adjust the end speed of this move to targetStartSpeed
// We have been asked to adjust the end speed of this move to match the next move starting at targetNextSpeed
if (laDDA->topSpeed == laDDA->requestedSpeed)
{
// This move already reaches its top speed, so just need to adjust the deceleration part
laDDA->endSpeed = laDDA->requestedSpeed;
laDDA->CalcNewSpeeds();
laDDA->endSpeed = laDDA->requestedSpeed; // remove the deceleration phase
laDDA->CalcNewSpeeds(); // put it back if necessary
}
else if (laDDA->decelDistance == laDDA->totalDistance && laDDA->prev->state == provisional)
{
// This move doesn't reach its requested speed, so we may have to adjust the previous move as well to get optimum behaviour
// This is a deceleration-only move, so we may have to adjust the previous move as well to get optimum behaviour
laDDA->endSpeed = laDDA->requestedSpeed;
laDDA->CalcNewSpeeds();
laDDA->prev->targetNextSpeed = min<float>(sqrtf((laDDA->endSpeed * laDDA->endSpeed) + (2 * laDDA->acceleration * laDDA->totalDistance)), laDDA->requestedSpeed);
laDDA->prev->targetNextSpeed = min<float>(sqrtf(fsquare(laDDA->endSpeed) + (2 * laDDA->acceleration * laDDA->totalDistance)),
laDDA->requestedSpeed);
recurse = true;
}
else
{
// This move doesn't reach its requested speed, but we can't adjust the previous one
laDDA->endSpeed = min<float>(sqrtf((laDDA->startSpeed * laDDA->startSpeed) + (2 * laDDA->acceleration * laDDA->totalDistance)), laDDA->requestedSpeed);
// This move doesn't reach its requested speed, but it isn't a deceleration-only move, or we can't adjust the previous one
laDDA->endSpeed = min<float>(sqrtf(fsquare(laDDA->startSpeed) + (2 * laDDA->acceleration * laDDA->totalDistance)),
laDDA->requestedSpeed);
laDDA->CalcNewSpeeds();
}
}
else
{
laDDA->startSpeed = laDDA->prev->targetNextSpeed;
float maxEndSpeed = sqrtf((laDDA->startSpeed * laDDA->startSpeed) + (2 * laDDA->acceleration * laDDA->totalDistance));
float maxEndSpeed = sqrtf(fsquare(laDDA->startSpeed) + (2 * laDDA->acceleration * laDDA->totalDistance));
if (maxEndSpeed < laDDA->endSpeed)
{
// Oh dear, we were too optimistic! Have another go.
@ -410,18 +413,18 @@ void DDA::DoLookahead(DDA *laDDA)
// Recalculate the top speed, acceleration distance and deceleration distance, and whether we can pause after this move
void DDA::RecalculateMove()
{
accelDistance = ((requestedSpeed * requestedSpeed) - (startSpeed * startSpeed))/(2.0 * acceleration);
decelDistance = ((requestedSpeed * requestedSpeed) - (endSpeed * endSpeed))/(2.0 * acceleration);
accelDistance = (fsquare(requestedSpeed) - fsquare(startSpeed))/(2.0 * acceleration);
decelDistance = (fsquare(requestedSpeed) - fsquare(endSpeed))/(2.0 * acceleration);
if (accelDistance + decelDistance >= totalDistance)
{
// It's an accelerate-decelerate move. If V is the peak speed, then (V^2 - u^2)/2a + (V^2 - v^2)/2a = distance.
// So (2V^2 - u^2 - v^2)/2a = distance
// So V^2 = a * distance + 0.5(u^2 + v^2)
float vsquared = (acceleration * totalDistance) + 0.5 * ((startSpeed * startSpeed) + (endSpeed * endSpeed));
float vsquared = (acceleration * totalDistance) + 0.5 * (fsquare(startSpeed) + fsquare(endSpeed));
// Calculate accelerate distance from: V^2 = u^2 + 2as
if (vsquared >= 0.0)
{
accelDistance = max<float>((vsquared - (startSpeed * startSpeed))/(2.0 * acceleration), 0.0);
accelDistance = max<float>((vsquared - fsquare(startSpeed))/(2.0 * acceleration), 0.0);
decelDistance = totalDistance - accelDistance;
topSpeed = sqrtf(vsquared);
}
@ -593,9 +596,48 @@ void DDA::Prepare()
params.decelStartDistance = totalDistance - decelDistance;
// Convert the accelerate/decelerate distances to times
const float accelStopTime = (topSpeed - startSpeed)/acceleration;
const float decelStartTime = accelStopTime + (params.decelStartDistance - accelDistance)/topSpeed;
const float totalTime = decelStartTime + (topSpeed - endSpeed)/acceleration;
float accelStopTime = (topSpeed - startSpeed)/acceleration;
float decelStartTime = accelStopTime + (params.decelStartDistance - accelDistance)/topSpeed;
float totalTime = decelStartTime + (topSpeed - endSpeed)/acceleration;
// Enforce the maximum average acceleration
if (isPrintingMove && topSpeed > startSpeed && topSpeed > endSpeed)
{
const float maxAverageAcceleration = reprap.GetPlatform()->GetMaxAverageAcceleration();
if (2 * topSpeed - startSpeed - endSpeed > totalTime * maxAverageAcceleration)
{
// Reduce the top speed to comply with the maximum average acceleration
const float a2 = fsquare(acceleration);
const float am2 = fsquare(maxAverageAcceleration);
const float aam = acceleration * maxAverageAcceleration;
const float discriminant = (a2 + (2 * aam) - am2) * (fsquare(startSpeed) + fsquare(endSpeed))
+ (2 * a2 + 2 * am2 - 4 * aam) * startSpeed * endSpeed
+ (8 * a2 * maxAverageAcceleration - 4 * acceleration * am2) * totalDistance;
const float oldTopSpeed = topSpeed;
if (discriminant < 0.0)
{
topSpeed = max<float>(startSpeed, endSpeed);
}
else
{
const float temp = (sqrtf(discriminant) + (acceleration - maxAverageAcceleration) * (startSpeed + endSpeed))
/(4 * acceleration - 2 * maxAverageAcceleration);
topSpeed = max<float>(max<float>(temp, startSpeed), endSpeed);
}
//DEBUG
debugPrintf("ots %f nts %f ss %f es %f\n", oldTopSpeed, topSpeed, startSpeed, endSpeed);
// Recalculate parameters
accelDistance = (fsquare(topSpeed) - fsquare(startSpeed))/(2 * acceleration);
decelDistance = (fsquare(topSpeed) - fsquare(endSpeed))/(2 * acceleration);
params.decelStartDistance = totalDistance - decelDistance;
accelStopTime = (topSpeed - startSpeed)/acceleration;
decelStartTime = accelStopTime + (params.decelStartDistance - accelDistance)/topSpeed;
totalTime = decelStartTime + (topSpeed - endSpeed)/acceleration;
}
}
clocksNeeded = (uint32_t)(totalTime * stepClockRate);
params.startSpeedTimesCdivA = (uint32_t)((startSpeed * stepClockRate)/acceleration);
@ -896,7 +938,7 @@ quit:
uint32_t finishTime = moveStartTime + clocksNeeded; // calculate how long this move should take
Move *move = reprap.GetMove();
move->CurrentMoveCompleted(); // tell Move that the current move is complete
return move->StartNextMove(finishTime); // schedule the next move
return move->TryStartNextMove(finishTime); // schedule the next move
}
return false;
}

View file

@ -30,7 +30,7 @@ public:
DDA(DDA* n);
bool Init(const GCodes::RawMove *nextMove, bool doMotorMapping); // Set up a new move, returning true if it represents real movement
bool Init(const GCodes::RawMove &nextMove, bool doMotorMapping); // Set up a new move, returning true if it represents real movement
void Init(); // Set up initial positions for machine startup
bool Start(uint32_t tim); // Start executing the DDA, i.e. move the move.
bool Step(); // Take one step of the DDA, called by timed interrupt.

View file

@ -50,7 +50,6 @@ const float SENSE_RESISTOR = 0.1; // Stepper motor current sense resist
const float MAX_STEPPER_DIGIPOT_VOLTAGE = (3.3 * 2.5 / (2.7 + 2.5)); // Stepper motor current reference voltage
const float STEPPER_DAC_VOLTAGE_RANGE = 2.02; // Stepper motor current reference voltage for E1 if using a DAC
const float STEPPER_DAC_VOLTAGE_OFFSET = -0.025; // Stepper motor current offset voltage for E1 if using a DAC
const int DAC0_DIGITAL_PIN = 66; // Arduino Due pin number corresponding to DAC0 output pin
// HEATERS
@ -100,7 +99,7 @@ const Pin Z_PROBE_MOD_PIN = 52; // Digital pin number to turn the IR L
const Pin Z_PROBE_MOD_PIN07 = X12; // Digital pin number to turn the IR LED on (high) or off (low) on Duet v0.7 and v0.8.5 (PC10)
// Pin number that the DAC that controls the second extruder motor current on the Duet 0.8.5 is connected to
const int Dac0DigitalPin = 66; // Arduino Due pin number corresponding to DAC0 output pin
const int Dac0DigitalPin = 66; // Arduino Due pin number corresponding to DAC0 output pin
// COOLING FANS

View file

@ -609,6 +609,42 @@ void Webserver::HttpInterpreter::DoFastUpload()
if (transaction->ReadBuffer(buffer, len))
{
network->Unlock();
#if 1
// Write data in sector-aligned chunks. This also means that the buffer in fatfs is only used to hold the FAT.
static const size_t writeBufLength = 2048; // use a multiple of the 512b sector size
static uint32_t writeBufStorage[writeBufLength/4]; // aligned buffer for file writes
static size_t writeBufIndex;
char* const writeBuf = (char *)writeBufStorage;
if (uploadedBytes == 0)
{
writeBufIndex = 0;
}
while (len != 0)
{
size_t lengthToCopy = min<size_t>(writeBufLength - writeBufIndex, len);
memcpy(writeBuf + writeBufIndex, buffer, lengthToCopy);
writeBufIndex += lengthToCopy;
uploadedBytes += lengthToCopy;
buffer += lengthToCopy;
len -= lengthToCopy;
if (writeBufIndex == writeBufLength || uploadedBytes >= postFileLength)
{
bool success = fileBeingUploaded.Write(writeBuf, writeBufIndex);
writeBufIndex = 0;
if (!success)
{
platform->Message(GENERIC_MESSAGE, "Error: Could not write upload data!\n");
CancelUpload();
while (!network->Lock());
SendJsonResponse("upload");
return;
}
}
}
#else
if (!fileBeingUploaded.Write(buffer, len))
{
platform->Message(GENERIC_MESSAGE, "Error: Could not write upload data!\n");
@ -619,6 +655,7 @@ void Webserver::HttpInterpreter::DoFastUpload()
return;
}
uploadedBytes += len;
#endif
while (!network->Lock());
}

View file

@ -370,7 +370,7 @@ namespace ExternalDrivers
USART_EXT_DRV->US_BRGR = VARIANT_MCK/DriversSpiClockFrequency; // 1MHz SPI clock
USART_EXT_DRV->US_CR = US_CR_RSTRX | US_CR_RSTTX | US_CR_RXDIS | US_CR_TXDIS | US_CR_RSTSTA;
// We need a few microseconds of delay here foe the USART to sort itself out,
// We need a few microseconds of delay here for the USART to sort itself out,
// otherwise the processor generates two short reset pulses on its own NRST pin, and resets itself.
// But it looks like the TMC drivers need a longer delay anyway to get used to CS being high,
// otherwise they ignore the command we send to set the microstepping to x16 and start up in full-step mode.

View file

@ -2582,7 +2582,7 @@ bool GCodes::HandleMcode(GCodeBuffer* gb, StringRef& reply)
bool error = false;
int code = gb->GetIValue();
if (simulating && (code < 20 || code > 37) && code != 82 && code != 83 && code != 111 && code != 105 && code != 122 && code != 999)
if (simulating && (code < 20 || code > 37) && code != 82 && code != 83 && code != 111 && code != 105 && code != 122 && code != 408 && code != 999)
{
return true; // we don't yet simulate most M codes
}
@ -2592,22 +2592,39 @@ bool GCodes::HandleMcode(GCodeBuffer* gb, StringRef& reply)
case 0: // Stop
case 1: // Sleep
if (!AllMovesAreFinishedAndMoveBufferIsLoaded())
return false;
if (fileBeingPrinted.IsLive())
{
fileBeingPrinted.Close();
return false;
}
// Deselect the active tool
// Reset everything
CancelPrint();
if (isPaused)
{
isPaused = false;
reply.copy("Print cancelled");
// If we are cancelling a paused print with M0 and cancel.g exists then run it
if (code == 0)
{
if (DoFileMacro(CANCEL_G, false))
{
break;
}
}
}
// Otherwise, deselect the active tool, if any
{
Tool* tool = reprap.GetCurrentTool();
if (tool != NULL)
if (tool != nullptr)
{
reprap.StandbyTool(tool->Number());
}
}
// Turn the heaters off
reprap.GetHeat()->SwitchOffAll();
// zpl 2014-18-10: Although RRP says M0 is supposed to turn off all drives and heaters,
// I think M1 is sufficient for this purpose. Leave M0 for a normal reset.
if (code == 1)
@ -2618,16 +2635,6 @@ bool GCodes::HandleMcode(GCodeBuffer* gb, StringRef& reply)
{
platform->SetDrivesIdle();
}
reprap.GetHeat()->SwitchOffAll();
if (isPaused)
{
isPaused = false;
reply.copy("Print cancelled");
}
// Reset everything
CancelPrint();
break;
#if SUPPORT_ROLAND
@ -3724,6 +3731,13 @@ bool GCodes::HandleMcode(GCodeBuffer* gb, StringRef& reply)
}
}
if (gb->Seen('P'))
{
// Set max average printing acceleration
platform->SetMaxAverageAcceleration(gb->GetFValue() * distanceScale);
seen = true;
}
if (!seen)
{
reply.printf("Accelerations: X: %.1f, Y: %.1f, Z: %.1f, E: ",
@ -3737,6 +3751,7 @@ bool GCodes::HandleMcode(GCodeBuffer* gb, StringRef& reply)
reply.cat(":");
}
}
reply.catf(", avg. printing: %.1f", platform->GetMaxAverageAcceleration());
}
}
break;
@ -5119,7 +5134,7 @@ bool GCodes::HandleMcode(GCodeBuffer* gb, StringRef& reply)
isFlashing = false; // should never get here, but leave this here in case an error has occurred
}
#ifdef DUET_NG
else if (sparam == 1 || sparam == 2)
else if (sparam >= 1 && sparam <= 3)
{
reprap.GetNetwork()->FirmwareUpdate(sparam);
}

View file

@ -317,7 +317,7 @@ void PID::Spin()
}
// Now check how long it takes to warm up. If too long, maybe the thermistor is not in contact with the heater
if (heatingUp && heater != reprap.GetHeat()->GetBedHeater()) // FIXME - also check bed warmup time?
if (heatingUp && heater != reprap.GetHeat()->GetBedHeater() && heater != reprap.GetHeat()->GetChamberHeater()) // FIXME - also check bed warmup time?
{
float tmp = (active) ? activeTemperature : standbyTemperature;
if (temperature < tmp - TEMPERATURE_CLOSE_ENOUGH)

View file

@ -190,7 +190,7 @@ void Move::Spin()
{
Transform(nextMove.coords);
}
if (ddaRingAddPointer->Init(&nextMove, doMotorMapping))
if (ddaRingAddPointer->Init(nextMove, doMotorMapping))
{
ddaRingAddPointer = ddaRingAddPointer->GetNext();
idleCount = 0;
@ -200,19 +200,7 @@ void Move::Spin()
}
}
if (simulating)
{
if (idleCount > 10 && !DDARingEmpty())
{
// No move added this time, so simulate executing one already in the queue
DDA *dda = ddaRingGetPointer;
simulationTime += dda->CalcTime();
liveCoordinatesValid = dda->FetchEndPosition(const_cast<int32_t*>(liveEndPoints), const_cast<float *>(liveCoordinates));
dda->Complete();
ddaRingGetPointer = ddaRingGetPointer->GetNext();
}
}
else if (!deltaProbing)
if (!deltaProbing)
{
// See whether we need to kick off a move
DDA *cdda = currentDda; // currentDda is volatile, so copy it
@ -228,20 +216,27 @@ void Move::Spin()
}
if (dda->GetState() == DDA::frozen)
{
cpu_irq_disable(); // must call StartNextMove and Interrupt with interrupts disabled
if (StartNextMove(Platform::GetInterruptClocks())) // start the next move if none is executing already
if (simulating)
{
Interrupt();
currentDda = ddaRingGetPointer; // pretend we are executing this move
}
else
{
cpu_irq_disable(); // must call StartNextMove and Interrupt with interrupts disabled
if (StartNextMove(Platform::GetInterruptClocks())) // start the next move
{
Interrupt();
}
cpu_irq_enable();
}
cpu_irq_enable();
iState = IdleState::busy;
}
else if (iState == IdleState::busy && !reprap.GetGCodes()->IsPaused() && idleTimeout > 0.0)
else if (!simulating && iState == IdleState::busy && !reprap.GetGCodes()->IsPaused() && idleTimeout > 0.0)
{
lastMoveTime = reprap.GetPlatform()->Time(); // record when we first noticed that the machine was idle
iState = IdleState::timing;
}
else if (iState == IdleState::timing && reprap.GetPlatform()->Time() - lastMoveTime >= idleTimeout)
else if (!simulating && iState == IdleState::timing && reprap.GetPlatform()->Time() - lastMoveTime >= idleTimeout)
{
reprap.GetPlatform()->SetDrivesIdle(); // put all drives in idle hold
iState = IdleState::idle;
@ -271,6 +266,15 @@ void Move::Spin()
cdda = cdda->GetNext();
st = cdda->GetState();
}
if (simulating)
{
// Simulate completion of the current move
//DEBUG
//currentDda->DebugPrint();
simulationTime += currentDda->CalcTime();
CurrentMoveCompleted();
}
}
}
@ -1133,13 +1137,12 @@ void Move::CurrentMoveCompleted()
ddaRingGetPointer = ddaRingGetPointer->GetNext();
}
// Start the next move. Must be called with interrupts disabled, to avoid a race condition.
bool Move::StartNextMove(uint32_t startTime)
// Try to start another move. Must be called with interrupts disabled, to avoid a race condition.
bool Move::TryStartNextMove(uint32_t startTime)
{
if (ddaRingGetPointer->GetState() == DDA::frozen)
{
currentDda = ddaRingGetPointer;
return currentDda->Start(startTime);
return StartNextMove(startTime);
}
else
{

View file

@ -77,10 +77,10 @@ public:
void SetCoreXYMode(int mode) { coreXYMode = mode; }
float GetCoreAxisFactor(size_t axis) const { return axisFactors[axis]; }
void setCoreAxisFactor(size_t axis, float f) { axisFactors[axis] = f; }
bool IsCoreXYAxis(size_t axis) const; // return true if the specified axis shares its motors with another
bool IsCoreXYAxis(size_t axis) const; // Return true if the specified axis shares its motors with another
void CurrentMoveCompleted(); // signals that the current move has just been completed
bool StartNextMove(uint32_t startTime); // start the next move, returning true if Step() needs to be called immediately
void CurrentMoveCompleted(); // Signal that the current move has just been completed
bool TryStartNextMove(uint32_t startTime); // Try to start another move, returning true if Step() needs to be called immediately
void MotorTransform(const float machinePos[AXES], int32_t motorPos[AXES]) const; // Convert Cartesian coordinates to delta motor coordinates
float MotorFactor(size_t drive, const float directionVector[]) const; // Calculate the movement fraction for a single axis motor of a Cartesian or CoreXY printer
void MachineToEndPoint(const int32_t motorPos[], float machinePos[], size_t numDrives) const; // Convert motor coordinates to machine coordinates
@ -107,6 +107,7 @@ private:
enum class IdleState : uint8_t { idle, busy, timing };
bool StartNextMove(uint32_t startTime); // start the next move, returning true if Step() needs to be called immediately
void SetProbedBedEquation(size_t numPoints, StringRef& reply); // When we have a full set of probed points, work out the bed's equation
void DoDeltaCalibration(size_t numPoints, StringRef& reply);
void BedTransform(float move[AXES]) const; // Take a position and apply the bed compensations
@ -180,11 +181,9 @@ inline bool Move::NoLiveMovement() const
return DDARingEmpty() && currentDda == nullptr; // must test currentDda and DDARingEmpty *in this order* !
}
// To wait until all the current moves in the buffers are
// complete, call this function repeatedly and wait for it to
// return true. Then do whatever you wanted to do after all
// current moves have finished. THEN CALL THE ResumeMoving() FUNCTION
// OTHERWISE NOTHING MORE WILL EVER HAPPEN.
// To wait until all the current moves in the buffers are complete, call this function repeatedly and wait for it to return true.
// Then do whatever you wanted to do after all current moves have finished.
// Then call ResumeMoving() otherwise nothing more will ever happen.
inline bool Move::AllMovesAreFinished()
{
addNoMoreMoves = true;
@ -196,4 +195,12 @@ inline void Move::ResumeMoving()
addNoMoreMoves = false;
}
// Start the next move. Must be called with interrupts disabled, to avoid a race with the step ISR.
inline bool Move::StartNextMove(uint32_t startTime)
//pre(ddaRingGetPointer->GetState() == DDA::frozen)
{
currentDda = ddaRingGetPointer;
return currentDda->Start(startTime);
}
#endif /* MOVE_H_ */

View file

@ -209,6 +209,7 @@ void Platform::Init()
maxStepperDigipotVoltage = MAX_STEPPER_DIGIPOT_VOLTAGE;
stepperDacVoltageRange = STEPPER_DAC_VOLTAGE_RANGE;
stepperDacVoltageOffset = STEPPER_DAC_VOLTAGE_OFFSET;
maxAverageAcceleration = 10000.0; // high enough to have no effect until it is changed
// Z PROBE
@ -242,6 +243,10 @@ void Platform::Init()
}
// Motors
for (size_t drive = 0; drive < DRIVES; drive++)
{
driverNumbers[drive] = -1; // needed so that SetPhysicalDrive() behaves correctly
}
for (size_t drive = 0; drive < DRIVES; drive++)
{
@ -1611,7 +1616,7 @@ void Platform::EnableDrive(size_t drive)
UpdateMotorCurrent(driver); // the current may have been reduced by the idle timeout
#ifdef EXTERNAL_DRIVERS
if (drive >= FIRST_EXTERNAL_DRIVE)
if (driver >= FIRST_EXTERNAL_DRIVE)
{
ExternalDrivers::EnableDrive(driver - FIRST_EXTERNAL_DRIVE, true);
}
@ -1637,7 +1642,7 @@ void Platform::DisableDrive(size_t drive)
{
const size_t driver = driverNumbers[drive];
#ifdef EXTERNAL_DRIVERS
if (drive >= FIRST_EXTERNAL_DRIVE)
if (driver >= FIRST_EXTERNAL_DRIVE)
{
ExternalDrivers::EnableDrive(driver - FIRST_EXTERNAL_DRIVE, false);
}
@ -1729,7 +1734,7 @@ void Platform::UpdateMotorCurrent(size_t drive)
}
#ifndef DUET_NG
}
else
else if (driver < 8) // on a Duet 0.6 we have a maximum of 8 drives
{
mcpExpansion.setNonVolatileWiper(potWipes[driver], pot);
mcpExpansion.setVolatileWiper(potWipes[driver], pot);
@ -1806,13 +1811,22 @@ unsigned int Platform::GetMicrostepping(size_t drive, bool& interpolation) const
void Platform::SetPhysicalDrive(size_t driverNumber, int8_t physicalDrive)
{
int oldDrive = GetPhysicalDrive(driverNumber);
if (oldDrive >= 0)
if (oldDrive != physicalDrive)
{
driverNumbers[oldDrive] = -1;
stepPinDescriptors[oldDrive] = OutputPin();
if (oldDrive >= 0)
{
DisableDrive(oldDrive); // turn off the motor current
driverNumbers[oldDrive] = -1;
stepPinDescriptors[oldDrive] = OutputPin();
}
if (physicalDrive >= 0)
{
driverNumbers[physicalDrive] = driverNumber;
stepPinDescriptors[physicalDrive] = OutputPin(stepPins[driverNumber]);
driveState[physicalDrive] = DriveStatus::disabled;
}
}
driverNumbers[physicalDrive] = driverNumber;
stepPinDescriptors[physicalDrive] = OutputPin(stepPins[driverNumber]);
}
// Return the physical drive used by this driver, or -1 if not found
@ -2281,8 +2295,10 @@ float Platform::ActualInstantDv(size_t drive) const
if (drive >= AXES)
{
float eComp = elasticComp[drive - AXES];
// If we are using elastic compensation then we need to limit the instantDv to avoid velocity mismatches
return (eComp <= 0.0) ? idv : min<float>(idv, 1.0/(eComp * driveStepsPerUnit[drive]));
// If we are using elastic compensation then we need to limit the extruder instantDv to avoid velocity mismatches.
// Assume that we want the extruder motor position to be accurate to within 0.01mm of extrusion.
// TODO remove this limit and add/remove steps to the previous and/or next move instead
return (eComp <= 0.0) ? idv : min<float>(idv, 0.01/eComp);
}
else
{

View file

@ -516,6 +516,8 @@ public:
float Acceleration(size_t drive) const;
const float* Accelerations() const;
void SetAcceleration(size_t drive, float value);
const float GetMaxAverageAcceleration() const { return maxAverageAcceleration; }
void SetMaxAverageAcceleration(float f) { maxAverageAcceleration = f; }
float MaxFeedrate(size_t drive) const;
const float* MaxFeedrates() const;
void SetMaxFeedrate(size_t drive, float value);
@ -723,6 +725,7 @@ private:
float motorCurrents[DRIVES];
float idleCurrentFactor;
size_t slowestDrive;
float maxAverageAcceleration;
// Digipots

View file

@ -593,9 +593,17 @@ bool PrintMonitor::GetFileInfoResponse(const char *filename, OutputBuffer *&resp
if (filename != nullptr && filename[0] != 0)
{
GCodeFileInfo info;
if (!GetFileInfo(FS_PREFIX, filename, info))
// Getting file information take a few runs. Speed it up when we are not printing by calling it several times.
uint32_t startTime = millis();
bool gotFileInfo;
do
{
gotFileInfo = GetFileInfo(FS_PREFIX, filename, info);
} while (!gotFileInfo && !isPrinting && millis() - startTime < MAX_FILEINFO_PROCESS_TIME);
if (!gotFileInfo)
{
// This may take a few runs...
return false;
}

View file

@ -26,7 +26,7 @@ const FilePosition GCODE_FOOTER_SIZE = 192000uL; // How many bytes to read from
#ifdef DUET_NG
const size_t GCODE_READ_SIZE = 4096; // How many bytes to read in one go in GetFileInfo() (should be a multiple of 512 for read efficiency)
#else
const size_t GCODE_READ_SIZE = 2048; // How many bytes to read in one go in GetFileInfo() (should be a multiple of 512 for read efficiency)
const size_t GCODE_READ_SIZE = 1024; // How many bytes to read in one go in GetFileInfo() (should be a multiple of 512 for read efficiency)
#endif
const size_t GCODE_OVERLAP_SIZE = 100; // Size of the overlapping buffer for searching (should be a multiple of 4)
@ -39,6 +39,7 @@ const float ESTIMATION_MIN_FILE_USAGE = 0.001; // Minium per cent of the file t
const float FIRST_LAYER_SPEED_FACTOR = 0.25; // First layer speed factor compared to other layers (only for layer-based estimation)
const uint32_t PRINTMONITOR_UPDATE_INTERVAL = 200; // Update interval in milliseconds
const uint32_t MAX_FILEINFO_PROCESS_TIME = 100; // Maximum time to spend polling for file info in each call
enum PrintEstimationMethod
{