Skip to content

feat: node status v4 — tolerant row parsing and the 0xFF00 roster request (firmware #359 re-sync) #170

Closed

Description

@mottihoresh

Summary

Firmware's v1.0 freeze review (OpenSkyHawk/OpenSkyhawk#295, PR OpenSkyHawk/OpenSkyhawk#359) changes the node-status contract the client reads. Today's client breaks against it: node-status-wire.ts:53 accepts exactly 28 hex characters, so every v4 row is dropped and the Cockpit goes empty with no message (only the old 26-character v2 length gets an alert). This ticket is the minimum to keep the Cockpit working against it: re-sync, parse v4 rows tolerantly, send the roster request at 0xFF00. Showing the new per-board versions is a follow-up ticket (see below).

Pin: sync to current OpenSkyhawk main (e82ac6eb7c6ada62135e39a065ddf652eaf35eaf at the time of writing, or newer if main has moved when the PR is cut), not #359's commit. The boards send that layout now: #359 plus #365's bootloader fields.

Scope (2026-10-26): this ticket is the whole firmware re-sync. It generates everything new in the contract, including the DIAG constants that #169 uses. #169 is the link-health feature on top and has no sync work of its own.

Until this lands: don't run a Gateway flashed with #359's firmware against the client.

Wire changes (all from npm run sync, never hand-copied)

What Before After
NODE_STATUS_PROTO_VERSION 3 4
NODE_STATUS_ROW_BYTES 14 (28 hex) 19 (38 hex)
New NodeStatusField — FW_MAJOR 14, FW_MINOR 15, FW_PATCH 16, BOOTLOADER 17, BOOT_STATE 18 (u8 each; the last two from OpenSkyHawk/OpenSkyhawk#365)
NODE_STATUS_REQ_ADDR (roster request) 0x86FE 0xFF00
  • Firmware version per board: each STM32 node now sends its release version in READY_n; the bridge caches it and appends it to the node's row. The node-0 row carries the bridge's own build. 00 00 00 = not reported: no READY seen since the bridge booted, or older firmware. When an alive node's version changes (a reflash inside the 3 s heartbeat timeout), the bridge pushes a _NODE_STATUS delta.
  • Roster request moved to 0xFF00: 0x86FE is a live DCS-BIOS address for the AH-64D (PLT_VIDEO_FLIR_GAIN) and the Mirage F1 (P_VOR_01_G), so flying either made the bridge answer every export of that control with a roster burst. No DCS-BIOS module uses 0xFF00. The client already sends whatever node-status.generated.ts says, so the re-sync is the whole change.
  • Node status is now on by default in PanelBridge firmware.

Compatibility rules the client must follow (firmware decision D22)

Within a major, firmware only appends fields, values and pages. Each 1.x addition then stays readable by an older client, which isn't true today:

  • Accept longer rows: a well-formed _NODE_STATUS row at least as long as the layout the client knows → parse the known fields, ignore the rest.
  • Shorter well-formed row → "Gateway firmware too old" alert, once (replaces the hard-coded 26-character v2 check). Never drop rows silently.
  • Unknown values (NodeKind, NodeFaultCode, TelemPage, flag bits) → show as "unknown (0xNN)", never an error.
  • Malformed lines: drop, debug log only.

Changes

Out of scope

Activity

  1. added this to the v0.2.0 milestone on Oct 25, 2026
  2. changed the title [-]feat: node status v4 — per-board firmware versions, tolerant row parsing, roster request at 0xFF00[/-] [+]feat: node status v4 — tolerant row parsing and the 0xFF00 roster request (firmware #359 re-sync)[/+] on Oct 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions