Repository navigation
Compatible versions:
- RepRapFirmware 3.7.0
- DuetWebControl 3.7.0
Upgrade notes:
- DuetControlServer reserves 256 MiB of memory via
MemoryMinnow, which requires the memory cgroup controller. New DuetPi images enable it, on an existing installation addcgroup_enable=memorytocmdline.txt, else the setting stays without effect - Regex settings in
config.jsonare plain patterns now and configured lists replace the defaults instead of extending them. An unmodifiedconfig.jsonis migrated automatically, installations with a modifiedconfig.jsonkeep their own copy and need the same changes by hand, in particular the start-of-line anchors inNumLayersFilters SetObjectModel,LockObjectModelandUnlockObjectModelwere removed from the IPC protocol;PatchObjectModelis the only object model writer now and locks itself internally- The
DuetAPIClientnamespace layout changed and all public APIs gainedConfigureAwait, which is source-breaking for API consumers duetpluginservice-rootno longer overridesKillMode, 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 9support) - Completely overhauled
DCSarchitecture using proper hosted services (dependency injection) - Added support for
SBCmode overUSB; the communication method (USB/SPI) is reported in the object model - Added optional
NativeAOTbuilds via theAotPublishproperty (off by default), a container to cross-build forlinux-arm,linux-arm64andlinux-x64, and a--aotpackager option that drops theduetruntimedependency - Added support for
M581.1(event triggers),M36.2and explicit line numbers - Added support for the
ADS131temperature sensor - Object model subscriptions can ask for verbose and obsolete fields using the new
VerboseandObsoleteflags ofSubscribeInitMessageor theverboseandobsoletequery parameters of the WebSocket endpoint. RRF is only asked for those fields while a subscriber wants them - Added
GetFileListrequest that returns part of a directory listing to the firmware, so the Files menu of an attached 12864 display works in SBC mode - Added
SetWifiCountryto set the WiFi regulatory domain - Added optional key path filters to
GetObjectModel - Software upgrade progress is reported during
M997 S2, including installs from.debordsf-update.zipfiles;DuetPiManagementPluginreports 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
ObjectHeightFilterssetting 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
IpcJsonBufferSizesetting to configure the IPC receive chunk size - Added
DSF_SOCKET_PATHenvironment 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); pluginwwwfiles are installed via symlinks and plugin IDs are case-insensitive - Migrated all projects to
System.CommandLinefor better parameter parsing - Added
READMEfiles to the NuGet packages
API changes:
- Bumped the IPC protocol version to 13
- Added
MainBoardandExpansionBoardso that mainboard-only and expansion-only fields no longer sit on everyBoard - Added a generated model descriptor API for reflection-free property enumeration and get/set by name
- Added
ModelUpdateScopeto tell object model updates which missing properties may be reset to null - Changed
positionof pulsed filament monitors from a distance to the raw pulse count (int) DuetHttpClientURL-encodes every query parameter and sends virtual paths the way DWC doesDuetSharedLibraryno longer ships XML documentation
Object model changes:
- Added
sbc.upgradewithmessageand an optionalprogressvalue while a software upgrade is running
Changed behaviour:
rr_model/M409omit null values unlessF"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[].maxMotorsstays 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[].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
- Increased
FileInfoReadLimitFooterfrom 256 KiB to 400 KiB to match RepRapFirmware - Replaced
ImageSharpwith 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.GpioandSystem.Device.Spiwith native drivers - Greatly reduced GC pressure and IPC allocations across
DCS, which now runs withSustainedLowLatencyand 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
DuetWebServerto minimal APIs and the slim host builder M997 S2and system package installations run in their own transient systemd units (dsf-updateanddsf-package) so they are no longer terminated when the upgrade replaces the services that started them;systemctl status dsf-updatereports 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
oflag
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
NumLayersFilterspatterns 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:36swere parsed as seconds - The
skipkeyword was rejected outside G-code files - Result variables of
M260.1/M261.1did 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 M99in 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.EI2andEI3serialized aseI2andeI3- Jobs pages whose path contains a dot could not be reloaded
sbc.cpu.hardwarewas 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 S2failures that were reported as success or silently ignored M999replies were lost becauseDCSstopped 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