Repository navigation
v0.10.0
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
ExecuteCommandget 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.Readis 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.pyruns 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
timestampseries 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 sidecarsfirmware/: uploaded firmware filessubject_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.