Skip to content

Bump Daqifi.Core from 0.24.0 to 1.4.0 - #46

Merged
tylerkron merged 1 commit into
mainfrom
dependabot/nuget/Daqifi.Core-1.4.0
Aug 3, 2026
Merged

Bump Daqifi.Core from 0.24.0 to 1.4.0#46
tylerkron merged 1 commit into
mainfrom
dependabot/nuget/Daqifi.Core-1.4.0

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Aug 3, 2026

Copy link
Copy Markdown
Contributor

Updated Daqifi.Core from 0.24.0 to 1.4.0.

Release notes

Sourced from Daqifi.Core's releases.

1.4.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,531 tests) on net9.0 and net10.0.

Highlights

  • Auto-reconnect and streaming session resume — opt in, and a device that drops mid-capture reconnects and picks the stream back up instead of leaving you to rebuild it. (#​379, #​418)
  • Cancellable async connect/disconnect and IAsyncDisposable — connect and teardown now honor a CancellationToken, and devices can be await using'd. (#​341, #​416)
  • Per-device operation serialization — concurrent callers no longer read each other's replies; every exchange takes its turn on the device. (#​342, #​421)
  • SD card operations over WiFi — list, storage, download, and logging control now work over the TCP transport, not just USB. (#​327, #​420)

Features

  • DeviceCapabilities merges the device's own live capability document, so what a device reports wins over compiled-in assumptions. (#​390, #​404)
  • Managed WINC serial-bridge protocol plus a read-only WiFi module inspector. (part of #​271, #​423)
  • Producer write failures surface through a SendFailed event instead of vanishing. (#​413)
  • An opt-in connect that attaches to a device without disturbing a stream already running on it. (#​385, #​414)

Reliability & fixes

  • A physically dropped serial or TCP connection is detected, making ConnectionStatus.Lost reachable. (#​403)
  • Core's connectivity guards throw a typed DeviceNotConnectedException. (#​395, #​402)
  • Four downstream workarounds retired: SD stall typing, empty-transfer guard, ResetAll semantics, and the Verifying overload. (#​398, #​405)
  • SD download is bounded, so a wedged card can't hang the call or ignore cancellation. (#​399, #​401)
  • A timed-out SD LIST is no longer reported as an empty card. (#​396, #​400)
  • The SD bus switch and the SD→LAN restore both run inside the exchange lock. (#​406, #​407, #​417)
  • Background failures are visible, and the last silent read-loop spin is gone. (#​377, #​378, #​394, #​415)
  • Analog IsEnabled tracks the device — protobuf field 22 is parsed. (#​409, #​411)
  • Serial connect failures are named for what they are instead of all reading as access denials. (#​424, #​427)
  • Firmware's malformed first stream frame is no longer broadcast to consumers. (#​425, #​428)
  • SD log parsing uses the device's own timestamp clock. (#​426, #​429)
  • The MCP server rejects over-max sample rates instead of silently clamping them. (#​412)

Internal

  • DaqifiStreamingDevice and FirmwareUpdateService split into focused collaborators. (part of #​344, #​419, #​422)
  • WINC abandoned-open tests are deterministic rather than timing-based. (#​430)
  • Dependency bump. (#​393)

Full Changelog: daqifi/daqifi-core@v1.3.0...v1.4.0

1.3.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, diagnostics, and LAN chip info all pass. Full unit suite green (1,932 tests) on net9.0 and net10.0.

Highlights

  • Live sample streaming with IAsyncEnumerable<LiveSample> — consume decoded, calibrated samples with await foreach instead of wiring up event handlers and decoding protobuf yourself. (#​334, #​359)
  • Discover and connect across every transport at onceAllTransportsDeviceFinder plus DiscoverAndConnectAsync find a device over USB or WiFi in one call, and a new connected-device registry catches the same unit showing up on two transports. (#​338, #​354, #​381)
  • Dropped-sample detectionTimestampGapDetector flags gaps in the device timestamp sequence so you can tell a clean capture from a lossy one. (#​339, #​353)
  • Feature capability tableDeviceFeature plus Supports() let you ask a device what it can do instead of hard-coding firmware version checks. (#​256, #​389)

Features

  • SD file transfer now works over WiFi on firmware v3.7.0 and newer, not just USB. (#​347)
  • Per-channel ADC calibration constants can be written over SCPI. (#​386, #​388)
  • SetFriendlyNameAsync for renaming a device from code. (#​355)
  • SD logging returns the filename it started writing, and StreamingFrequency is validated before it reaches the device. (#​336, #​337, #​349)
  • Remaining NVM persistence SCPI commands are wired up. (#​207, #​329)
  • Manually-entered IPs now resolve their TCP data port instead of assuming a default. (#​244, #​330)
  • Device and firmware-update diagnostics route through an optional ILogger (defaults to NullLogger). (#​340, #​360, #​361)

Firmware / bootloader

  • Standalone bootloader health-check and soft-reset, usable without starting a flash. (#​299, #​375)
  • Intel HEX records are structurally validated up front, so a corrupt image fails fast instead of mid-flash. (#​369, #​370)

Reliability & fixes

  • WiFi configuration is persisted before it is applied, so a failed apply no longer loses the config. (#​352, #​391)
  • CalB is now also exposed un-scaled by InternalScaleM, matching firmware's calibration math. (#​387, #​392)
  • TCP reads are bounded so connecting can't fail because a consumer thread is already reading. (#​383, #​384)
  • Firmware's malformed warmup stream frame is suppressed instead of surfacing as a decode error. (#​351, #​362)
  • Redundant PWM frequency sends are skipped (PWM frequency is device-global). (#​345, #​356)
  • Thread-safe ClearBuffer, restored Clone WINC flag, health telemetry, and channel-bounds/bipolar-scaling validation. (#​297, #​300, #​328, #​331, #​332, #​335, #​346, #​348, #​350)
  • Hardened parsers: SD CSV data-start detection, empty line endings, and out-of-range log levels all fail cleanly. (#​365, #​366, #​367, #​368, #​371, #​372)

Full Changelog: daqifi/daqifi-core@v1.2.0...v1.3.0

1.2.0

Verified end-to-end against a DAQiFi Nyquist (firmware 3.7.2) over USB: discovery, streaming (10 Hz–1 kHz), SD card list/storage/logging/download, diagnostics, LAN chip info, and firmware download all pass. Full unit suite green (1,524 tests) on net9.0 and net10.0.

Highlights

  • Classified device events — new StatusMessageReceived and StreamMessageReceived events let consumers subscribe to status vs. stream traffic without inspecting raw protobuf. (#​323)
  • Device friendly-name support — read/write a device's friendly name via SCPI, with validation, surfaced on DeviceMetadata.FriendlyName. (#​313)
  • More resilient connect & discovery — serial probing is now immune to hung ports, and InitializeAsync retries transient SCPI errors and throws a typed exception on failure. (#​295, #​317)

Features

  • PWM frequency and duty now have commandable defaults; duty is clamped on set. (#​322)
  • SdCardFileParserFactory.TryDetectFormat and SupportedExtensions for format sniffing. (#​318)
  • SdCardLogEntry.HasDeviceTimestamp to distinguish device- vs. host-stamped entries. (#​321)
  • DeviceMetadata.CopyFrom and DeviceCapabilities.Clone for snapshotting device state. (#​319)
  • WifiBridgeActivator.Deactivate to explicitly own the transparent-mode exit. (#​315)

Firmware / bootloader

  • Recover a wedged bootloader via JMP_TO_APP soft-reset when the health check fails. (#​312)
  • Kick LAN:APPLY once on a -200 LAN-not-initialized error to self-heal WiFi bring-up. (#​203, #​324)
  • Power on the WINC module before probing chip info in CheckWifiFirmwareStatusAsync. (#​320)

Reliability & fixes

  • Isolate WifiBridgeActivator from uncancellable SerialPort.Open() hangs. (#​326)
  • Keep IChannel instances stable across PopulateChannelsFromStatus (no churn on re-populate). (#​314)
  • Batch of smaller fixes and added test coverage. (#​204, #​264, #​282, #​311, #​325)

Full Changelog: daqifi/daqifi-core@v1.1.1...v1.2.0

1.1.1

What's Changed

Full Changelog: daqifi/daqifi-core@v1.1.0...v1.1.1

1.1.0

What's Changed

Full Changelog: daqifi/daqifi-core@v1.0.0...v1.1.0

1.0.0

🎉 1.0.0

This release marks the 1.0.0 milestone for Daqifi.Core. The public API is now stable under semantic versioning — breaking changes will bump the major version. The library supports DAQiFi firmware v3.5.0+ (per ADR 0001), and it is the foundation the DAQiFi desktop application is migrating onto.

What's new

📊 Decoded per-frame sample pipeline (#​279)

Core now decodes each live stream-data frame into per-channel samples and raises IChannel.SampleReceived, instead of only re-raising the raw DaqifiOutMessage. Consumers no longer have to hand-demux frames — channel ordering, calibration scaling, digital bit-unpacking, and rollover-aware timestamps all live in Core. Closes #​242.

  • USB pre-scaled floats (AnalogInDataFloat) are used directly; WiFi raw ADC counts (AnalogInData) are scaled per channel via IAnalogChannel.GetScaledValue. Digital bytes are bit-unpacked to per-channel high/low for input-direction channels.
  • New public API: IDataSample.RawValue (raw ADC count, null on the float path), IDataSample.DeviceTimestamp (raw device tick of the frame), SampleReceivedEventArgs.Channel, and an IChannel.SetActiveSample(IDataSample) overload.
  • Existing MessageReceived consumers are unchanged — the raw re-raise still fires first. Decoding runs only while IsStreaming and is best-effort per frame, so a malformed frame can't tear down the stream.

Validated end-to-end on a real Nyquist 1 over USB serial, exercising the calibration-scaling path with monotonic frame-aligned device timestamps.

🔌 Digital output, first-class (#​280)

Digital output (SetDioDirection / SetDioValue) existed in Core but was undocumented, unexposed over MCP, and unverified on hardware. It's now a first-class, hardware-validated capability — including a stream decode fix: digital stream bits are now indexed by channel number (bit N is pin N, matching how the firmware snapshots the whole DIO port), instead of by position in the enabled-channel list. Previously, enabling a subset of digital channels read the wrong pins — e.g. enabling only DIO 4 read pin 0's state.

  • New MCP tools: configure_digital_channels, set_digital_direction, and set_digital_output (auto-switches an input channel to output so one call drives a pin). list_channels now reports OutputValue for digital channels; get_device_status reports EnabledDigitalChannels.
  • Docs: README capability row + digital-output recipe; MCP tool table in src/Daqifi.Mcp/README.md.

Validated on a Nyquist 1 over USB with physical loopbacks — raw SCPI and Core end-to-end, including streaming a strict subset of digital channels (the exact scenario the old positional decode fails).

⚡ PWM output (#​281)

Adds PWM output as a first-class, hardware-validated capability, building on #​280.

  • Device API: SetPwmEnabled(channel, bool) and SetPwmDutyCycle(channel, 1–100) are per channel; SetPwmFrequency(6–50,000 Hz) is device-wide, because all PWM channels share one hardware timer — a per-channel frequency API would mislead. IDigitalChannel gains IsPwmCapable (populated from the firmware board mask — channels 0, 3, 4, 5, 6, 7), plus IsPwmEnabled / PwmDutyCyclePercent bookkeeping that survives status refresh.
  • Client-side guardrails for confirmed firmware traps: enabling PWM on a non-capable channel throws (the firmware would otherwise freeze digital writes on that channel with disable as the only recovery — so disable is accepted on any channel), duty 0 is rejected (firmware readback would claim 0 while the old duty keeps toggling), and frequency is limited to 6–50,000 Hz (below 6 Hz the firmware's period register silently wraps).
  • New MCP tools: set_pwm_output (duty + optional device-wide frequency + enable in one call) and disable_pwm. list_channels now reports PwmCapable / PwmEnabled.

Validated on a Nyquist 1 over USB: commanded duty and frequency measured through a physically wired loopback from streamed samples (exactly 40 rising edges in 4 s at 10 Hz), including a live duty change and disable → drive-low handback.

Full Changelog: daqifi/daqifi-core@v0.28.0...v1.0.0

0.28.0

What's new

🤖 MCP server — drive a device from an AI agent (#​277)

A new Daqifi.Mcp project ships a Model Context Protocol server so an AI agent (Claude Desktop/Code, Cursor, Codex, or any MCP-aware client) can control a DAQiFi Nyquist device end-to-end — no application code required. It's a thin, in-process layer over Daqifi.Core, distributed as a dotnet tool.

Tools: discover_devices, connect_device, list_connected_devices, disconnect_device, get_device_status, list_channels, configure_analog_channels, set_sample_rate, start_sd_logging, stop_sd_logging.

Scope is the basic control loop — discover, connect, configure analog channels + sample rate, and run on-device SD-card logging. (Live data streaming and SD file list/download are planned follow-ups.)

  • Install: dotnet tool install -g Daqifi.Mcp, then point your client at the daqifi-mcp command.
  • Safety: --read-only mode and a --max-sample-rate-hz clamp; the 1000 Hz hardware ceiling is always enforced.
  • Client config (Claude Desktop, Cursor, Codex) and details: src/Daqifi.Mcp/README.md.

Validated end-to-end against a real Nyquist 1 (firmware 3.6.2) over USB.

🔎 Discovery: echo-on devices are now found (#​272, #​268)

Serial discovery now resynchronizes the protobuf parser past echo/prompt noise, so devices with command echo enabled are discovered correctly instead of being skipped.

Also in this release

  • Core: new public DaqifiDevice.GetChannelsSnapshot() — a lock-protected channel snapshot that is safe to enumerate off the device consumer thread (used by the MCP layer, and useful for any out-of-process consumer).
  • Release pipeline: tagged releases now also pack and publish the Daqifi.Mcp .NET tool to NuGet, and the Daqifi.Core push is idempotent (--skip-duplicate) so re-running a release no longer fails on already-published versions.
  • Dependencies: bump the minor-and-patch group (#​276).

Full Changelog: daqifi/daqifi-core@v0.27.0...v0.28.0

0.27.0

What's Changed

Full Changelog: daqifi/daqifi-core@v0.26.0...v0.27.0

0.26.0

What's new

  • HidLibraryTransport.ExclusiveAccess — opens a HID device exclusively (Windows dwShareMode=0 via HidSharp; macOS IOKit kIOHIDOptionsTypeSeizeDevice) so no other user-mode opener can touch it while the handle is held. Best-effort: a refused exclusive open falls back to a shared open. Enables grabbing and holding a sitting PIC32 HID bootloader and locking out other openers during a flash. (#​274)

Open() failure paths capture and chain both open causes and dispose leaked partial streams.

0.25.0

WiFi (WINC) flash lifecycle owned by Core (#​270)

Core now owns the full WiFi-module flash lifecycle so consumers don't reimplement orchestration (closes the core of #​269).

Highlights

  • Output-based success verification. A WiFi flash now succeeds only when the WINC tool emits its success marker (Operation completed successfully, configurable via WifiFlashSuccessMarker) — not from the unreliable exit code or a duration heuristic. This correctly fails the "tool couldn't open the port → returned in ~1s with no output" case, Programming device failed, and partial failures.
  • Port-release wait after disconnect before launching the flash tool (PostLanDisconnectPortReleaseDelay), so the tool can actually open the COM port.
  • WINC prompt handling in Core: WincBootPromptResponseDelay + an injectable WifiBridgeActivationCallback fired at the "Power cycle WINC" prompt (raw-serial specifics stay host-side).
  • Retry on transient bridge-init failures (WifiFlashAttempts / WifiFlashRetryDelay); genuine programming failures are not retried.
  • Live flash progress parsed from the tool's write/read/verify block-address output (no longer latches onto the local image-build phase).

New FirmwareUpdateServiceOptions

PostLanDisconnectPortReleaseDelay, WincBootPromptResponseDelay, WifiBridgeActivationCallback, WifiFlashAttempts, WifiFlashRetryDelay, WifiFlashSuccessMarker.

Hardware-validated against a WINC1500 module. Full test suite green.

0.24.1

fix(discovery): disable echo before the serial identity probe so echo-on devices are found (#​267)

Restores serial discovery of freshly-booted / never-connected (echo-on) DAQiFi devices, which v0.22.0–v0.24.0 silently dropped because the echoed SYSInfoPB? reply couldn't be framed by the protobuf parser.

Commits viewable in compare view.

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

---
updated-dependencies:
- dependency-name: Daqifi.Core
  dependency-version: 1.4.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot added .NET Pull requests that update .NET code dependencies Pull requests that update a dependency file labels Aug 3, 2026
@tylerkron
tylerkron merged commit f04ae23 into main Aug 3, 2026
1 check passed
@tylerkron
tylerkron deleted the dependabot/nuget/Daqifi.Core-1.4.0 branch August 3, 2026 03:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file .NET Pull requests that update .NET code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant