v1.5.0
Verified end-to-end against a DAQiFi Nyquist (firmware 3.7.2) over USB: serial discovery, connect + populated init, 100 Hz streaming, SD card list/storage, and LAN chip info all pass. Full unit suite green (2,853 tests) on net9.0 and net10.0.
Highlights
- Cancellable async surface on
IStreamingDevice,IAsyncDisposableonIDevice— connecting, streaming, and tearing down a device can now all be cancelled and awaited properly, instead of blocking or relying on manual cleanup. This makes it much easier to build responsive apps on top of Core — a UI can cancel a stuck connect attempt or cleanly dispose a device without extra plumbing. Note for anyone implementing these interfaces directly outside this repo: you'll need to add the new async members,DisposeAsync, and the 9 calibration confirmation members described below — sync-only callers are unaffected. (#460, #469) - Calibration and voltage-precision commands now confirm they actually landed — previously, if a device refused one of these commands, Core reported success anyway, because it never checked. That could leave a device silently uncalibrated with no way to tell. These commands now read the device's own error queue back and raise a clear error if the device didn't accept it, so a failure surfaces instead of hiding. (#455)
- WiFi firmware updates are more resilient — Core now handles the full update sequence itself instead of leaving apps to work around gaps: it powers the WiFi module on before an update so the update mode actually takes effect, recovers the module automatically if a flash fails partway through (instead of leaving it unreachable until a power cycle), and no longer triggers an unnecessary reflash just because it couldn't reach GitHub to check the latest version. (part of #269 — #443, #444, #445, #434)
Fixes
- Streaming rate limits are re-checked after enabling more channels, so a rate that was valid for a small channel set can no longer stay in effect once it exceeds what the larger channel set actually supports. (#472)
- Devices are now recognized as the same physical unit regardless of whether their serial number was reported in decimal or hex — previously a device could appear as two different devices depending on which form was seen first. (#471)
- The MCP server no longer reports made-up PWM duty-cycle/frequency values for state nobody actually commanded — it now reports "unknown" until a real command has been sent, instead of a plausible-looking guess. (#470)
- Serial device discovery no longer loses track of a device just because a prior discovery attempt timed out or was cancelled partway through. (#454)
- Fixed a defect where a device's binary status data could be misinterpreted as a text message and discarded. (part of #268 — #457)
Internal
- SCPI wire strings single-sourced through
ScpiMessageProducer. (#468) - Dead-API sweep:
TextMessage,SdCardBusyException, abandoned simulator docs. (#467) DaqifiStreamingDevicecontinues splitting into focused collaborators — channel/DIO/PWM/analog-output control, status-frame channel mapping, stream frame decode, connect/disconnect serialization, device administration, raw-command session interpretation, the live-sample async stream, session snapshot/restore, and USB stream-interface routing. (part of #344 — #432, #433, #435, #436, #437, #439, #440, #441, #442)- Shared
ScaleRawAnalogValueshelper extracted for SD card parsing. (#466) - CI now runs on
merge_groupso a merge queue can gatemain. (#459) - Command history documented as oldest-first, not newest-first. (part of #344 — #452)
- Assorted test hardening: bounded live-stream device test awaits, wall-clock-tight tests no longer race a stalled CI runner, WiFi update SCPI sequence expectations reconciled, canceled-settle case guarded against a persisted network config. (#453, #458, #456, #451)
Full Changelog: v1.4.0...v1.5.0