Skip to content

Version 3.6.4

Choose a tag to compare

@chrishamm chrishamm released this 09 Nov 08:07

Compatible versions:

  • RepRapFirmware 3.6.4
  • DuetWebControl 3.6.4

Upgrade notes:

  • An unmodified config.json is updated automatically. A modified one keeps its own NumLayersFilters and FileInfoReadLimitFooter, 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 new ObjectHeightFilters setting takes effect without changes

New features:

  • Added support for the skip meta keyword
  • Added SetWifiCountry to set the WiFi regulatory domain
  • Object height is detected from max_z_height (OrcaSlicer), MAXZ (Cura) and Height (Fusion 360) comments via the new ObjectHeightFilters setting, like RepRapFirmware does
  • Added LAYER_COUNT (Cura) and total layer number (OrcaSlicer) to NumLayersFilters

API changes:

  • Deprecated SetObjectModel, LockObjectModel and UnlockObjectModel, all three are removed in 3.7
  • move.kinematics.segmentation.minSegLength replaces minSegmentLength, 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 as sensors.accelerometers[] instead

Changed behaviour:

  • Meta command gating uses a per-channel executing-state shadow instead of the lagging inputs[].active checks, so no full model sync is needed after M596
  • M598 from 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
  • DuetHttpClient URL-encodes every query parameter and sends virtual paths the way DWC does
  • Increased FileInfoReadLimitFooter from 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/M589 values 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
  • duetpimanagementplugin depends on unattended-upgrades now
  • Icon thumbnails are converted with a built-in PNG encoder, which drops the SixLabors.ImageSharp dependency

Bug fixes:

  • A config.json written by DSF 3.7 left every file info filter empty, so M36 returned no file information
  • M997 S2 deadlocked 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 update
  • M997 S2 reported 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_model requests 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 the initFailed network 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 result meta variable were not forwarded to the firmware
  • Local variables were mishandled around M260.1/M261.1 results 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
  • M37 without a P parameter threw a missing parameter error, and M37 F0 still wrote the simulated time back to the file
  • M997 was reported as cancelled by the controller reset it triggers, and M99 in 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 > and M28 started 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 NumLayersFilters patterns 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
  • next was 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 as int[], and the == operator threw off results for parameters with null values
  • Several object model base class bugs: the CopyTo overloads 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
  • CodeBlock deep-copies its local variables so forked files no longer share the same list, and CRC32 throws on cancellation instead of returning a partial checksum
  • Uninstalling a plugin that ships daemon.g renamed the resolved file instead of the relative SD path, dsf group memberships are re-applied explicitly on upgrade, and CodeStream was packaged into duetruntime
  • 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
  • CodeConsole reported a spurious error when DCS shuts down, and orphaned macro warnings are hidden while shutting down
  • DuetHttpClient leaked pending model update requests, ignored UpdateInterval, 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 low
  • M122, M408 and M409 replies span several data transfers, so a message box or macro request could overtake them and complete the wrong code
  • Codes sent with the Unbuffered flag blocked their code channel for good, and an unbuffered code like M122 or M409 sent while a macro was about to start a nested macro deadlocked the channel until M112
  • A job file starting another print with M23, M32 or M37 deadlocked at the end of the file until an emergency stop