Skip to content

Version 3.7.0

Latest

Choose a tag to compare

@chrishamm chrishamm released this 08 Oct 16:03
· 1 commit to v3.7-dev since this release

Compatible versions:

  • RepRapFirmware 3.7.0
  • DuetWebControl 3.7.0

Upgrade notes:

  • DuetControlServer reserves 256 MiB of memory via MemoryMin now, which requires the memory cgroup controller. New DuetPi images enable it, on an existing installation add cgroup_enable=memory to cmdline.txt, else the setting stays without effect
  • Regex settings in config.json are plain patterns now and configured lists replace the defaults instead of extending them. An unmodified config.json is migrated automatically, installations with a modified config.json keep their own copy and need the same changes by hand, in particular the start-of-line anchors in NumLayersFilters
  • SetObjectModel, LockObjectModel and UnlockObjectModel were removed from the IPC protocol; PatchObjectModel is the only object model writer now and locks itself internally
  • The DuetAPIClient namespace layout changed and all public APIs gained ConfigureAwait, which is source-breaking for API consumers
  • duetpluginservice-root no longer overrides KillMode, so child processes started by root plugins are stopped together with the service. Plugins that need work to outlive a service restart must run it in their own systemd unit

New features:

  • Migrated all projects to .NET 10 (dropped .NET 9 support)
  • Completely overhauled DCS architecture using proper hosted services (dependency injection)
  • Added support for SBC mode over USB; the communication method (USB/SPI) is reported in the object model
  • Added optional NativeAOT builds via the AotPublish property (off by default), a container to cross-build for linux-arm, linux-arm64 and linux-x64, and a --aot packager option that drops the duetruntime dependency
  • Added support for M581.1 (event triggers), M36.2 and explicit line numbers
  • Added support for the ADS131 temperature sensor
  • Object model subscriptions can ask for verbose and obsolete fields using the new Verbose and Obsolete flags of SubscribeInitMessage or the verbose and obsolete query parameters of the WebSocket endpoint. RRF is only asked for those fields while a subscriber wants them
  • Added GetFileList request that returns part of a directory listing to the firmware, so the Files menu of an attached 12864 display works in SBC mode
  • Added SetWifiCountry to set the WiFi regulatory domain
  • Added optional key path filters to GetObjectModel
  • Software upgrade progress is reported during M997 S2, including installs from .deb or dsf-update.zip files; DuetPiManagementPlugin reports the configured package feed as plugin data
  • Job and macro file errors report the filename instead of the channel, matching RRF
  • Object height is detected from slicer comments via the new ObjectHeightFilters setting like RepRapFirmware does, and the layer count, print time and filament usage filters were extended to cover OrcaSlicer, Cura, PrusaSlicer, preFlight, Fusion 360, Pathio, Simplify3D, KISSlicer and Kiri:Moto
  • Filament usage is computed from slicers that report only the filament volume, using the filament diameter of the first extruder
  • Added IpcJsonBufferSize setting to configure the IPC receive chunk size
  • Added DSF_SOCKET_PATH environment variable to override the socket location
  • Improved pause handling with two motion systems
  • Greatly improved code and expression parsers, including decimal-place support when evaluating expressions (#192)
  • Added a way to flag when plugins have fully started (NotifyPluginStarted); plugin www files are installed via symlinks and plugin IDs are case-insensitive
  • Migrated all projects to System.CommandLine for better parameter parsing
  • Added README files to the NuGet packages

API changes:

  • Bumped the IPC protocol version to 13
  • Added MainBoard and ExpansionBoard so that mainboard-only and expansion-only fields no longer sit on every Board
  • Added a generated model descriptor API for reflection-free property enumeration and get/set by name
  • Added ModelUpdateScope to tell object model updates which missing properties may be reset to null
  • Changed position of pulsed filament monitors from a distance to the raw pulse count (int)
  • DuetHttpClient URL-encodes every query parameter and sends virtual paths the way DWC does
  • DuetSharedLibrary no longer ships XML documentation

Object model changes:

  • Added sbc.upgrade with message and an optional progress value while a software upgrade is running

Changed behaviour:

  • rr_model/M409 omit null values unless F"n" is given, and object model queries no longer ask RRF for null values
  • Fields that never change after start-up are flagged verbose and only queried on initial connect; boards[].maxMotors stays non-verbose because it changes on hot-plugged CAN boards
  • 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
  • Increased FileInfoReadLimitFooter from 256 KiB to 400 KiB to match RepRapFirmware
  • Replaced ImageSharp with an internal PNG encoder because it requires a paid license key as of v4.0; icon pixel data is only decoded when the thumbnail content is requested
  • Replaced System.Device.Gpio and System.Device.Spi with native drivers
  • Greatly reduced GC pressure and IPC allocations across DCS, which now runs with SustainedLowLatency and at a higher CPU and IO scheduling priority
  • Max code buffer space per channel is computed dynamically, which greatly improves throughput when simulating files with only one motion system
  • Migrated DuetWebServer to minimal APIs and the slim host builder
  • M997 S2 and system package installations run in their own transient systemd units (dsf-update and dsf-package) so they are no longer terminated when the upgrade replaces the services that started them; systemctl status dsf-update reports whether one is still running
  • Codes that exceed the transfer buffer report a proper error instead of a generic failure
  • Improved error messages in USB mode, added a delay between USB reconnect attempts, and the transfer phase is reported on SPI disconnect
  • Removed SocketPollInterval; dead peers are detected when a new plugin service registers
  • Network protocol initialization runs in parallel and no longer aborts plugin start-up when one service is unavailable
  • Stable versions are packaged from Release binaries, and the pre/post install scripts are more robust when systemd is not running
  • The object model documentation on the RRF wiki is regenerated automatically by CI and notes that obsolete fields can be queried using the o flag

Bug fixes:

  • The object model could get out of sync after SPI timeouts, because pending link requests were not invalidated on reconnect and responses could be assigned to queries that had not been sent
  • Sporadic TfrRdy timeouts in SBC mode because the GPIO monitor thread could report an edge with the pin level from before it
  • 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
  • Query flags were ignored below a requested object model key
  • 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
  • A job was treated as complete while the firmware was still executing its moves, so a late pause left an unrecoverable state
  • Resuming a job in Fanuc or LaserWeb style G-code lost the modal G0/G1/G2/G3 command, so the first line without a command letter was not recognised
  • Object height of files whose last layer is bigger than the footer read limit was not detected
  • The layer count of G-code files from preFlight was detected wrongly because the NumLayersFilters patterns matched their keywords anywhere in a line
  • PrusaSlicer's silent-mode print time took precedence over the normal-mode one, and Fusion 360 print times like 40m:36s were parsed as seconds
  • The skip keyword was rejected outside G-code files
  • Result variables of M260.1/M261.1 did not mark their code block as having local variables, variables declared before any code block was opened were never tracked, and a failed request still registered its result variable
  • M99 in SBC mode could cause a spurious out-of-order reply warning
  • Uploaded file names lost plus signs and percent escapes on the rr_ endpoints and catch-all routes because query values were decoded twice (#159)
  • InputShapingType.EI2 and EI3 serialized as eI2 and eI3
  • Jobs pages whose path contains a dot could not be reloaded
  • sbc.cpu.hardware was null on 64-bit kernels that no longer report a Hardware line in /proc/cpuinfo
  • Pooled codes kept the reply log level of their previous run, so replies could be logged at a stale level or not at all
  • Truncated icon thumbnails yielded garbage pixels instead of being rejected
  • Fixed a deadlock in the plugin subsystem, IAP updates over USB, and several M997/M997 S2 failures that were reported as success or silently ignored
  • M999 replies were lost because DCS stopped before they reached the clients
  • Fixed exceptions being sent as success responses in the code stream and on malformed JSON
  • Fixed expression evaluation of enums to use their JSON name
  • A locally modified configuration file prevented unattended upgrades of the DSF packages