Controller link faults reference

When the serial link between the agent and the microcontroller board fails, every probe is classified into exactly one of the categories below. The category code appears in the FixoRuntimeActivity event log so you can recognise the failure class at a glance.

This page enumerates every category that the agent can produce. For a walkthrough on fixing these, see the Troubleshoot controller link how-to.

The agent never voluntarily abandons the link. As long as the Connect toggle is on, the retry loop keeps probing — every few seconds, indefinitely, with exponential backoff and jitter. A categorised fault is informational: it tells you why this probe failed, not that we've given up.


Tier A — Pre-open

The operating system refused to hand the agent a usable serial port. Coloured amber (Warning) in the event log.

A1 — No device

The path you target (e.g. /dev/ttyACM0) doesn't exist on disk.

  • Cause: USB unplugged, board not enumerating, kernel module missing.
  • Typical fix: plug the cable in. The agent picks the link up automatically once the path reappears.

A2 — Permission denied

The device node is there but your user account can't open it.

  • Cause: missing membership in the OS group that owns serial devices.
  • Typical fix (Linux): sudo usermod -aG dialout "$USER", then log out and back in.

A5 — I/O error (other)

Catch-all for any other OS-level open failure — driver bugs, hot-unplug races, "device or resource busy" (another process holds the port). The message text carries the kernel's errno string.


Tier B — Post-open

The agent owns the port; the firmware isn't speaking the expected protocol. Coloured red (Error).

B1 — No bytes

PING was written; zero bytes came back inside the response budget (default 500 ms).

  • Common causes: AVR mid-reset (first probe after open), blank board, baud mismatch.
  • Self-healing case: when the elapsed time since open is under ~2.2 s, this is reclassified as C1 (bootloader window).

B2 — Bytes received, no numex frame

Bytes came back, but they don't parse as the numex protocol the agent speaks.

  • Cause: wrong firmware on the board (a foreign Arduino sketch), baud mismatch, or partial frame stuck in the middle of a write.
  • Typical fix: flash the correct firmware via FixoStudio.

B3 — Numex protocol-version mismatch

The PONG frame parsed, but its version field disagrees with what the host supports. Usually happens after a half-completed OTA.

B4 — Config-hash mismatch

The firmware reports it's running content-hash X; the host expects Y. The link is up — actuator and sensor data still flow — but the firmware on the board doesn't match the active preset. The runtime status badge reads wrong firmware instead of Connected.

B5 — Firmware-reported error

The STATUS frame carries a non-zero error code (sensor init failed, missing lobe, watchdog triggered, etc.). The decoded error name appears in the log message.

B6 — Mid-session drop

The link was up — at least one previous probe succeeded — and then the port suddenly closed.

  • Causes: USB unplugged mid-session, system suspend, cable jiggle, USB hub power glitch.

Tier C — Transient

Recoverable timing artefacts. Not user-actionable — they self-heal on the next probe. Coloured plain (Info).

C1 — Bootloader window

The first probe after port-open returned no bytes, and the elapsed time since open is under the ~2.2 s Optiboot window. This is the AVR's auto-reset behaviour after DTR pulse; the firmware hasn't finished booting yet. The next probe usually succeeds.

C2 — Slow reply

PONG arrived but the round-trip time exceeded the slow-reply threshold (default 250 ms). The link is healthy, just slow — often a USB-2 hub or a busy CPU. Sampled at most once per minute per (preset, hash) to keep the log readable.


Tier D — Configuration

Something is missing that the agent needs before it can probe at all. Coloured plain (Info). Tier-D faults emit once on entry and once on resolution — they don't coalesce.

D1 — No port selected

Connect is on, but no serial port is configured.

  • Recovery: the device detector picks up new USB-serial nodes automatically; alternatively open FixoWizard to pick one.

D2 — No active preset

Connect is on, but no preset is active — there's no firmware to drive. Open FixoStudio (or FixoWizard) and pick a preset.


Coalescing

The retry loop produces many identical events while a fault persists. To keep the event log readable, identical (category, detail) pairs within a 30 s window collapse into a single ConnectionFaultCoalesced entry with a count and a duration:

[22:38:09] A  A1  port "ttyACM0" not present — is the controller plugged in?  (×7 in 23 s)

When the 30 s window closes without another same-key event, the counter resets; the next failure starts a fresh count=1 ConnectionFault entry.


The runtime status panel shows Connected; the event log gains periodic PingReplied rows (every successful PONG) and FirmwareReplied rows (sampled at most once per minute). The absence of category-prefixed A, B, C, or D rows for a sustained period is the canonical "all is well" signal.

In this section
Topics
reference controller serial hardware troubleshooting faults
See also