Repository navigation
Version 3.6.4
Compatible versions:
- RepRapFirmware 3.6.4
- DuetWebControl 3.6.4
Upgrade notes:
- An unmodified
config.jsonis updated automatically. A modified one keeps its ownNumLayersFiltersandFileInfoReadLimitFooter, so the new layer count patterns (now anchored to the start of the line) and the bigger 400 KiB footer read limit apply only after updating these two settings by hand. The newObjectHeightFilterssetting takes effect without changes
New features:
- Added support for the
skipmeta keyword - Added
SetWifiCountryto set the WiFi regulatory domain - Object height is detected from
max_z_height(OrcaSlicer),MAXZ(Cura) andHeight(Fusion 360) comments via the newObjectHeightFilterssetting, like RepRapFirmware does - Added
LAYER_COUNT(Cura) andtotal layer number(OrcaSlicer) toNumLayersFilters
API changes:
- Deprecated
SetObjectModel,LockObjectModelandUnlockObjectModel, all three are removed in 3.7 move.kinematics.segmentation.minSegLengthreplacesminSegmentLength, which remains as an obsolete alias- Removed
sensors.filamentMonitors[].calibrated.sensivity, which never carried data
Object model changes:
- Deprecated
boards[].accelerometer, DSF 3.7 reports accelerometers assensors.accelerometers[]instead
Changed behaviour:
- Meta command gating uses a per-channel executing-state shadow instead of the lagging
inputs[].activechecks, so no full model sync is needed afterM596 M598from a file channel makes the file readers rendezvous like the firmware streams do- Local variables of closed code blocks are deleted only when they are redeclared or the file is closed, so a pause can rewind into their scope
DuetHttpClientURL-encodes every query parameter and sends virtual paths the way DWC does- Increased
FileInfoReadLimitFooterfrom 256 KiB to 400 KiB to match RepRapFirmware - Aborted macro files and file abort requests are logged at Debug level on the Daemon channel
- Plugin manifests without an id or a name, Python plugin executables containing shell metacharacters and
M587/M589values that could inject extra configuration directives are rejected - DSF packages install with
--force-confold, so a locally modified configuration file no longer holds back the whole package set duetpimanagementplugindepends onunattended-upgradesnow- Icon thumbnails are converted with a built-in PNG encoder, which drops the
SixLabors.ImageSharpdependency
Bug fixes:
- A
config.jsonwritten by DSF 3.7 left every file info filter empty, soM36returned no file information M997 S2deadlocked when the update replaced only the RepRapFirmware package, because the firmware update codes from its package scripts waited for the plugin that was still performing the updateM997 S2reported a successful update as an error, because the message type was taken from whether the install script printed anything instead of from its exit code, and a failed unattended upgrade was not reported at all- Too many queued
rr_modelrequests could starve RepRapFirmware of output buffers, leading to intermittent DCS crashes - The SPI transfer loop kept spinning without exchanging anything after a lost connection, and bad responses during the header exchange were not handled
- Matched file sync requests were never removed, so every following sync at the same file position deadlocked
- A resume arriving while a file task was still draining towards its pause was silently discarded, and a job was treated as complete while the firmware was still executing its moves, so a late pause left an unrecoverable state
- Plugin upgrades deleted the whole plugin directory, and plugin files on the virtual SD card were not removed on uninstall
- The first plugin in the started-plugin list was not started again when the list carried a UTF-8 byte order mark, which is why DuetPiManagementPlugin stayed disabled after switching between the 3.6 and 3.7 package feeds
- Stopping a root plugin killed its child processes, which could take down a package operation upgrading DSF itself
- Object model enums were substituted into meta expressions by their CLR name, and substituted enum names were not escaped
- Several object model definitions never matched what RepRapFirmware reports, so those values stayed empty or failed to parse:
move.kinematics.segmentation.minSegLength, filament monitor sensitivity and calibration factor, current loop and ADS131 channel 0 sensor types, DueX driver sensors and theinitFailednetwork state - Exceptions were sent as success responses over IPC, codes waited forever when an interception client terminated, and generic code interception with an empty channel list matched no channels at all instead of all valid ones
- Expressions using RepRapFirmware's
resultmeta variable were not forwarded to the firmware - Local variables were mishandled around
M260.1/M261.1results and declarations outside any code block, so blocks were closed while codes still referenced their results, such declarations were only logged as a warning, and deleting the result variable of a failed code reported an unknown variable M37without aPparameter threw a missing parameter error, andM37 F0still wrote the simulated time back to the fileM997was reported as cancelled by the controller reset it triggers, andM99in SBC mode could cause a spurious out-of-order reply warning- Pooled codes kept the reply log level of their previous run, so replies could be logged at a stale level or not at all
- Long messages sent to RepRapFirmware were split at fixed byte offsets, so multi-byte UTF-8 sequences decoded to replacement characters
- Files written by
echo >andM28started with a UTF-8 byte order mark, so macros written in SBC mode failed with "Bad command" once the SD card was used in standalone mode - The layer count of G-code files from preFlight was detected wrongly because the
NumLayersFilterspatterns matched their keywords anywhere in a line, and the object height of files whose last layer is bigger than the footer read limit was not detected - The file info parse was aborted by duplicate user-defined keys and by malformed thumbnails, and the simulated time marker is searched in raw bytes now, so files with non-ASCII content are truncated at the right offset
- Uploaded file names lost plus signs and percent escapes on the
rr_endpoints because query values were decoded twice (#159) - DuetWebServer dropped all request headers of custom HTTP endpoints, could take the whole process down when its web directory change handler failed, and aborted package configuration when it failed to start
- WebSocket sends from DuetWebServer are serialized, a PONG could previously collide with an object model patch
nextwas clamped to the start index in truncated file list responses, so clients requested the same page over and over again- Driver values with more than two segments (e.g.
1.2.3) were silently ignored, kinematics that RepRapFirmware reports with capitalized names were mapped to the wrong class,uint[]code parameters were converted asint[], and the==operator threw off results for parameters with null values - Several object model base class bugs: the
CopyTooverloads of the dictionary types called themselves, clones aliased the live model objects, in-place updates of reassigned collection items were not written back, an item that failed to deserialize corrupted the rest of its collection, and dictionary change detection never matched across parses CodeBlockdeep-copies its local variables so forked files no longer share the same list, andCRC32throws on cancellation instead of returning a partial checksum- Uninstalling a plugin that ships
daemon.grenamed the resolved file instead of the relative SD path,dsfgroup memberships are re-applied explicitly on upgrade, andCodeStreamwas packaged intoduetruntime - DHCP configuration parsing read the CIDR even when the subnet mask was not matched, and WiFi scans reported WPA3 for every network following a WPA3-capable one
CodeConsolereported a spurious error when DCS shuts down, and orphaned macro warnings are hidden while shutting downDuetHttpClientleaked pending model update requests, ignoredUpdateInterval, did not poll the reply sequence number while the object model is not observed, and did not free the session when the board is emulated or its API level is too lowM122,M408andM409replies span several data transfers, so a message box or macro request could overtake them and complete the wrong code- Codes sent with the
Unbufferedflag blocked their code channel for good, and an unbuffered code likeM122orM409sent while a macro was about to start a nested macro deadlocked the channel untilM112 - A job file starting another print with
M23,M32orM37deadlocked at the end of the file until an emergency stop