Changelog DSF 3.x Beta - Duet3D/DuetSoftwareFramework GitHub Wiki
New features:
- Added
M20 C
andrr_file{s/list}
max parameters - Added support for
<fileinfo>.customInfo
via";customInfo"
comments in G-code jobs - Volume label of external drives is reported in the object model where applicable
Changed behaviour:
- Change data type of minor command fraction (#209)
- Allow user-defined macros to be parsed as well by
fileinfo
requests - Made CORS check for WebSockets stricter
- Priority codes are preferrably sent to idle channels with the same firmware emulation
Bug fixes:
- Changed M20 S1 to behave like in RRF
- Prioritise
M292
to allow custom codes that create blocking message boxes - Fixed
M99
support within system macros - Added missing slashes to ends of default directories
-
M32
/M37
could override the file being printed (#206) - Fixed JSON handling of some OM types and of abstract int/float properties
- Fixed type of outgoing update codes (#204)
New features:
- Upgraded base from .NET 6 to .NET 8
- Implemented high-performance JSON (de-)serialization in all areas using (custom) source generators
- .NET applications using DSF 3.6 libraries can be trimmed and/or AOT-compiled
-
M111
can be used to change DCS logging parameters during runtime (see also M111 docs) - Added MQTT support
API changes:
- Added new IPC command to rewrite codes being intercepted
- Python plugins are now installed installed in their own venv (thanks @stuartofmt)
New features:
- Added new pip install script that also checks for built-in modules (thanks stuartofmt)
- Added support for standalone mode HTTP session keys to DuetHttpClient library
- SSID is now reported in network.interfaces[] if applicable
- Added new HTTP endpoint /machine/model as an alternative to /machine/status
Changed behaviour:
- Introduced new "sbc" root key in favour of deprecated state.dsf... properties
- Removed httpEndpoints root key in favour of sbc?.dsf.httpEndpoints
- Open message boxes are automatically closed in the DSF OM when the controller is disconnected
Bug fixes:
- Fixed potential deadlock caused by code interceptors
- G2/G3 may be repeated as well like G0/G1 in Fanuc mode
- Fixed removal of plugin www files on upgrade/uninstall
- M550 did not update /etc/hosts causing potential problems if no network interface was active
- SBC values in variable indices were not substituted in set command
- Line numbers could be off when handling exceptions from codes
- Fixed issue where missing DNS servers could crash DCS
- Fixed file enumeration in DuetPiManagementPlugin plugin manifest
- Race condition could lead to macro filestream being disposed twice causing potential crash of DCS
- Added missing variable declaration to DSF build script
- Fixed expression queries of plugin values
New features:
- Added
recursive
parameter to HTTP file/directory delete request - Added recursive delete functionality for RRF delete requests
- Added support for
M472
(delete file or directory)
Changed behaviour:
- Removed obsolete
move.workspaceNumber
field
Bug fixes:
- Fixed parameter parsing for values consisting of special number formats
- Fixed event log support via
M929
-
ok
was not output after DSF error messages potentially upsetting Repetier Server - Sometimes code pipeline elements could be marked busy incorrectly leading to potential deadlocks
New features:
- Added support for custom array variables and for assigning individual items
-
echo
can be used to append contents to a file withoutNL
(akaecho >>>"file" "data"
)
Changed behaviour:
- Code parser is much more sensitive to invalid code parameters
- Error messages from macros/job files are more condensed to get closer to messages from RRF
- When a code cannot be read (i.e. code input is interrupted), the file is aborted immediately
API changes:
- Flush IPC command can be optionally used to synchronize both file streams
- Enabled
Nullable
type checks throughout DSF projects - Added support for
null
parameter values (e.g.X
inG28 X
) - Consolidated API exception classes in DuetAPI library
- Changed async code parser to use
Stream
type instead ofStreamReader
- ObjectModel patch API commands only work in non-SPI mode
Bug fixes:
- Fixed support for M0/M1/M2 as well as underscores in variable names
- Added work-around for non-conform rr_upload requests with invalid content type
- Fixed type of
tools[].feedForward
and corrected defaultsensors.probes[].travelSpeed
value - Fixed support for
update.sh
in update packages (dsf-update.zip
which requiresRootPluginSupport
) - Updated
stat
import to add support for recent kernels (thanks Loïc) - Removed obsolete OM assignment from Job processor
- When a too long code was attempted to be serialized, DCS crashed
- Fixed DateTime encoding
Upgrade notes:
- You MUST be on RepRapFirmare 3.5-b1 in order to process jobs. It will NOT work with 3.4.5 or older!
- The
scanner
key has been removed from the object model. It is no longer supported
New features:
- Executing codes do not need an individual task any more, instead they are now handled by a new pipeline architecture
- Added support for two file channels, new message box types, and many other improvements made in RRF
- Rewrote much of the meta G-code expression pre-parser and added ability to define custom functions (not yet available via API)
- Added
rr_
compatibility layer to DuetWebServer (HTTP calls in standalone mode)
Bug fixes:
- Code parser could terminate strings too early
- Fixed issue when parsing the end of a file where a multi-byte character could introduce position offsets leading to errors
Upgrade notes:
- It is recommended to disable the
rsyslog
service on DuetPi installations to prevent excessive growth of log files. To do this, run the following command in a Linux terminal:sudo systemctl stop rsyslog && sudo systemctl disable rsyslog
- There is a new SBC permission for webcam access. To allow DSF plugins to access the webcam(s), you must run
sudo gpasswd -a dsf video
once
New features:
- Added support for build times generated by REACTOR slicer
- Upgraded .NET framework to v6
Bug fixes:
- PrusaSlicer print requests were dropped due to incorrect content type (DWS expects
text/plain
but getsapplication/x-www-form-urlencoded
) - On some setups the periodic updater task locked the object model for 1.5s causing print artifacts due to slow SPI communication
-
M999
from a macro file could hang with DuetPiManagementPlugin enabled - Quoted characters were incorrectly treated in keyword arguments
- Multiple filament usages from a single-line comment were not properly parsed
- Error handling for file lists wasn't working as expected
- Only up to 9 axes could be configured
- Parameter letters were always converted to upper-case
New features:
- Number of glitches on the TransferReady pin are now recorded for diagnostics
- DCS uses proper return codes and saves the error reason on startup to
/run/dsf/dcs.err
- DWS forwards the DCS start error to DWC if it is available
Changed behaviour:
- Plugin service notifies systemd about start after plugin manifests are loaded
- Default UNIX socket for DSF now points to
/run/dsf/dcs.sock
rather than to/var/run/dsf/dcs.sock
(/var/run
is usually symlinked to/run
) - Removed special heightmap code from DSF so that RRF can now read and write heightmap files on its own
Bug fixes:
- DCS could complain about plugin services if they terminated during shutdown
- systemd services for DuetPluginService did not wait for processes to start
- Some expression values like DateTime, ULong, and Null were not supported by DSF
- Web server took a few seconds to stop if a WebSocket client was connected
- Noise on the TfrRdy pin could make DCS get out of sync with RRF after updating the firmware (only in
NoTerminateOnReset
mode) - DCS could send invalid collection values in patch mode
- DuetHttpClient did not reconnect under certain circumstances
- G-code filenames starting with digits (but not paths like
0:/gcodes/
) could cause exceptions - If the first or last G1 Z parameter were an expression, the file info may not be parsed
Changed behaviour:
-
config-override.g
is now written by RepRapFirmware - Removed unused
return
command from API keywords - Removed deprecated
CodeResult
class from API - Added new
-c
parameter to ModelObserver to confirm receipt of data - Added new
Keyword
code type to DSF API
Bug fixes:
- Automatic firmware update during unattended updates did not work
- Automatic expansion board updates did not wait for completion
- Fixed problem where subscribers received only cached model patches
- Under certain circumstances macro files could be stopped too early (thanks Andy)
- Pausing job files was not working if RRF reported no file position
-
boards[].mcuTemp
,boards[].v12
, andboards[].vIn
were not nullable - Default firmware directory in the object model was wrong
- JSON responses in subscriber patch mode were not necessarily live
- M505 did not lock the movement before changing the sys directory
- Local variables were not deleted when their scope was released
- M105 did not output a NL at the end of Marlin-compatible replies
New features:
- Added HTTP password protection (M551) using new
/machine/connect
and/machine/disconnect
endpoints - Implemented new class library for remote management of Duets in standalone or SBC mode
- Added new HTTP endpoint /machine/noop to keep HTTP sessions alive on demand
- Added support for pausable macro files (see
M98 R1
)
Changed behaviour:
- Filament management is now done exclusively by RRF
- List of plugins to start on boot is only written when individual plugins are started or stopped
Bug fixes:
- Pausing near the very end of a job file did not work
- Single quotes in string parameters to convert letters to lower-case were not supported
- Keyword results were not properly logged (like from
echo
orabort
) - Under certain conditions messages in conditional blocks were not output instantly
- M997 did not accept the P-parameter to override a firmware filename
- Some log calls did not check for
null
messages
New features:
- Implemented file redirections of the
echo
command (see here) - Added support for new
InvalidateChannel
command allowing plugins to cancel already queued codes and files
Bug fixes:
- Resolved race condition for M0/M1 which could cause stop.g to be executed instead of cancel.g
- Fixed an exception that could occur when codes were cancelled and their result was combined
- Under certain conditions paused prints could not be cancelled properly
New features:
- Plugin manager can now be used to reload specific plugin manifests
- Plugin manager may be used to query the installation/runtime status of plugins
- Added new
cancelling
item tostate.status
enum - Subscribers and code stream clients can define what messages they want to receive
- Added support for array expressions
- DuetPiManagementPlugin now supports (un-)mounting of devices via
M21
/M22
Changed behaviour:
- Web server only sends messages with HTTP target to web clients
Bug fixes:
- When RRF reset, DCS could terminate when trying to clear the global variables
- Expression parameters were incorrectly serialized
- Certain UTF-8 strings could be truncated when sent to RRF
- Fixed race condition when attempting to save updated filament mapping
-
GetFileInfo
requests attempted to parse non-GCode files - M-codes could have G-parameters, now only T-parameters are permitted
- Functions with more than one parameter were not working in
echo
commands
New features:
- RRF v3.4-b1 and newer can now read and write files on the SBC
Changed behaviour:
- Replies from macro files are output immediately as they are generated (like in standalone mode)
- Codes starting macros do not collect the results from the sub-macro codes any more (like in standalone mode)
- SPI link timing is not controlled by DCS any more, instead RRF does this (see also M576)
Bug fixes:
- Variable names could not contain underscores
Compatible versions:
- RepRapFirmware 3.3-b3
- DuetWebControl 3.3-b3
New features:
- Added support for variables in G-code files (
global
,var
,set
)
Changed behaviour:
- Added fallback to
directories.system
if firmware files cannot be found indirectories.firmware
Bug fixes:
- Tilt factors for delta kinematics were off in config-override.g
- M0/M1 didn't cancel already queued file codes
- Truncated tool lists are now fetched using multiple queries
Compatible versions:
- RepRapFirmware 3.3-b2
- DuetWebControl 3.3-b2
Changed behaviour:
- Changed file format of the new plugin manifest
- Layers code is no longer compatible with previous versions
- Emulation is always applied to results from code interceptors
- The DSF-only keyword
return
is now obsolete and will be removed from a future version (unless support for it is added to RRF)
Bug fixes:
- Updated regular expressions for various slicer formats
- SBC permissions for third-party plugins were not properly enforced
- When DCS failed to start too many times in a row, it remained disabled
- DPS didn't (de-)serialize string dictionaries properly
Known issues:
- Variable support isn't implemented yet, this is TBD in 3.3-b3
Compatible versions:
- RepRapFirmware 3.3-b1
- DuetWebControl 3.3-b1
Changed behaviour:
- Plugin support in DSF is fully implemented
- DuetWebServer notifies systemd when it has started like DuetControlServer does
-
M999
is only prioritized from text inputs if it is intended for the main board - New configuration file
dsf-config.g
is automatically executed when DCS and third-party plugins have been started - CodeConsole application uses Telnet G-code channel instead of SBC
Known issues:
-
network.interfaces[].speed
does not work for WiFi adapters on the Pi (see https://github.com/dotnet/runtime/issues/47777)
Compatible files:
- RepRapFirmware 3.2.0-b4
- DuetWebControl 3.2.0-b4
Changed behaviour:
- DCS service is now started via sysinit.target instead of basic.target so that config.g is processed faster on boot
- Thumbnails from PrusaSlicer are now parsed (thanks Sindarius)
- M500 writes new heater tuning parameters to config-override.g
- In Marlin emulation "ok" responses are only sent when the line is complete
Bug fixes:
- Codes could be sent to code interceptors in the wrong order
- M21 (P0) returned an error message breaking Octoprint support
- Under certain circumstances some object model keys were not updated on initialisation
- DCS service didn't have permission to change the datetime
- Print times with decimal places were incorrectly parsed
- When the controller was reset or updated, an extra data transfer was performed
Compatible files:
- RepRapFirmware 3.2.0-b3
- DuetWebControl 3.2.0-b3
Changed behaviour:
- DCS is now explicitly notified about closed messages and files (hence no longer compatible with 3.2-b2)
- CodeConsole utility allows evaluation of expressions using
eval <expression>
Bug fixes:
- When certain G-code inputs were disabled, the DSF API threw NullReferenceExceptions
- When the heaters contained null items, no config-override.g could be writen
- When the move compensation type was set to none, the heightmap file was not reset
- Starting macro files could cause out-of-order execution and stack underruns
- Sometimes the object model wasn't fully updated after a disconnect
Compatible files:
- RepRapFirmware 3.2.0-b2
- DuetWebControl 3.2.0-b2
Changed behaviour:
- runonce.g is no longer processed before config.g to match RRF's behaviour
- Increased SPI protocol version due to slight changes for the new Linux task in RRF
Bug fixes:
- Added missing "Starting" item to the MachineStatus enumeration
- M112/M999 were executed out-of-order when read from files
- Sometimes in print files codes invoking macro files could crash DCS
- Aborted macro files did not cancel codes properly
- Comments following codes directly without a whitespace could cause parsing errors
Compatible files:
- RepRapFirmware 3.2.0-b1
- DuetWebControl 3.2.0-b1
Changed behaviour:
- Permissions are now required for DSF commands for executables running in
/opt/dsf/plugins
- Simulation times are automatically written to G-code files
- Increased API level due to object model changes
- Renamed namespace
DuetAPI.Machine
toDuetAPI.ObjectModel
andMachineModel
toObjectModel
- DSF processes are now running as their own
dsf
user
Bug fixes:
- DCS service file contained an invalid CPU priority
- Event logging via M929 was not working
- Macro files with an unknown start code were not properly cancelled by M99/M292 P1
Known issues:
- Security permissions are not enforced via AppArmor yet (and they are still subject to change)
- Package dependencies are not yet installed when a plugin is installed