Skip to content

v0.10.0

Choose a tag to compare

@github-actions github-actions released this 29 Sep 12:55
· 394 commits to main since this release
480cae0

Cynitor 0.10.0

New

Raw CAN log playback

  • Play a saved candump log back as if it were the live bus (Record view → Play, at 1×, 10×, 100× or as fast as possible), with CAN disconnected.
  • When a log stops, the subject types, node names and bitrates the session knew are saved beside it (<log>.types.json), so register-typed subjects still decode on playback.

Firmware update over Cyphal

  • Nodes that serve ExecuteCommand get Update firmware… in their Services tab: pick a .bin, and Cynitor serves it to the node's Cyphal bootloader (e.g. Zubax Kocherga).
  • A progress bar shows the bytes read and the node's mode, and the new version shows as soon as the node restarts.
  • Only uavcan.file.Read is served, from one folder: other nodes cannot write or delete files on the host.

Types for subjects no register names

  • Such subjects now say "type unknown" instead of waiting for data forever.
  • Click one in Subjects: Cynitor listens for 3 s and lists the compiled types its messages fit exactly (CAN FD frame padding allowed), custom DSDL first, each with the latest message decoded as it.
  • Pick one, or type any compiled type. The choice is saved and applied on every connect; a publisher's registers still take precedence.

Demo nodes

  • tools/demo_nodes.py runs a demo node on a vcan to try everything above without hardware (see the README, "No hardware?").

Fixes

  • Dashboard stall behind the CAN hub: with any non-SocketCAN adapter, the event loop could freeze for seconds to minutes whenever a subscription was created or closed, waiting on a python-can lock. This was also the cause of the flaky Ubuntu integration job.
  • Own node-ID on SocketCAN without yakut.
  • Unanswered GetInfo: when a node sends heartbeats but does not answer, the log now says why (e.g. a Classic CAN node on a CAN FD bus).
  • Numeric arrays (e.g. float32[3]) were shown as garbage text; they are numbers now.
  • Small UI fixes: no allocator warning at startup, the plotted timestamp series starts hidden, and the Cyphal logo is visible in dark mode.

API changes

All additive; nothing existing changed. Details in WEBSOCKET_README.md.

Endpoint Purpose
POST /api/rawlogs/{name}/play Play a raw log as the bus
GET/POST /api/firmware, DELETE /api/firmware/{name} List, upload, delete firmware files
POST /api/nodes/{id}/firmware Start a node's firmware update
PUT/DELETE /api/subjects/{id}/type Set or clear a subject's type
GET /api/subjects/{id}/type-guesses Guess a subject's type from its payloads
GET /api/nodes Adds subject_types (type and who set it)

Data folder

New entries, created only when used:

  • raw/*.types.json: playback sidecars
  • firmware/: uploaded firmware files
  • subject_types.json: the subject types you set

Testing

  • Backend unit tests: 697 pass on Python 3.10 and 3.12.
  • Frontend e2e: 15/15 pass.
  • Integration (Classic and CAN FD, through the hub) now also covers playback, a full firmware transfer, and guessing and setting a subject's type.
  • Checked live on a CAN FD vcan against the demo nodes.