Skip to content

CLI Commands

greghulette edited this page Jul 28, 2026 · 2 revisions

CLI Commands

Besides the Serial JSON Protocol, the firmware accepts plain-text commands on the USB serial console — type them in any serial terminal at 115200 baud, one per line, and press Enter. There are two families:

  • #Lxx diagnostics — quick read-outs for SBUS and WCB health without the config tool.
  • ?-prefixed commands — record & replay control, direct Maestro drive and 2-way queries, forgetting learned WCB peers, and firmware OTA.

Both families run through the same command handler, so the exact same lines also work from the config tool's remote terminal over the WCB Network — see Remote Management over WCB. The #Lxx table below is not the whole CLI surface; the ? commands are documented further down.


#Lxx diagnostics

Type the command and press Enter.

Command Does
#L01 Print board identity (NaviCore — WCB HW 3.2).
#L02 Restart the board.
#L09 SBUS state dump — detected variant (16/24‑ch), frame count, fps, age, lost/failsafe flags, and the first 24 channel values.
#L10 Toggle 1 Hz live SBUS dump on/off (repeats #L09 once a second).
#L11 WCB status — this board's device ID, system quantity, and an up/down list of every known WCB. Peers auto‑discovered beyond the configured quantity are flagged with a trailing * (the output prints the legend (* = auto-discovered beyond quantity)).
#L12 RC state — current mode, decoded matrix button, and raw matrix value.
#L13 Raw SBUS frame hex dump — every byte with header/flags/footer annotated (shows whether CH17–24 carry data on an SBUS‑24 link).
#L20 HCR test on S3 (GPIO15) — sends SetEmotion(Happy,80) straight to the port, bypassing config + button mapping.
#L21 HCR test on S4 (GPIO17) — same, on S4.

An unknown #L code prints Unknown #L code N. Valid: 1,2,9,10,11,12,13,20,21.


Using the HCR tests to isolate a fault

#L20 / #L21 drive the serial port directly — no config, no mapping in the way. So:

  • HCR reacts to #L20 but not to a mapped button → the problem is in config or mapping (HCR destination not saved, or the button isn't mapped to an HCR action), not the wiring.
  • #L20 does nothing either → it's wiring (TX/RX swapped, no common ground, 3V3 vs 5V level) or the aux‑serial port itself.

See WLED and HCR Audio for how HCR destinations are configured, and Troubleshooting for more.


? commands

These share the same console and remote terminal as the #Lxx codes. All are case‑insensitive.

?REC — record & replay

Bench control for the Record & Replay engine — the same clips the config tool's Clips panel manages. See Record and Replay.

Command Does
?REC,START Start recording a take (in the current function‑switch mode).
?REC,STOP Stop recording, or abort an in‑progress replay.
?REC,PLAY[,<name>] Replay the in‑RAM take, or load and replay a saved clip.
?REC,SAVE[,<name>] Save the current take. No name → auto‑named rec_N.
?REC,LOAD,<name> Load a saved clip into the buffer.
?REC,LS List saved clips (and the clips‑partition free/used space).
?REC,RM,<name> Delete a saved clip.
?REC,RENAME,<from>,<to> Rename a saved clip.
?REC,CLEAR Clear the in‑RAM buffer.
?REC or ?REC,INFO Print recorder status.

The config tool's timeline editor also drives a set of machine‑facing ?REC,EDIT… transport commands (EDITLOAD / EDITBEGIN / EDITEV / EDITEND / EDITCANCEL). You don't type these by hand — the editor uses them to stream a clip out for editing and upload the result back.

?MAE — direct Maestro control & queries

Drive a Maestro channel directly (this is what powers the config tool's timeline scrub/preview) and read values back over the Pololu 2‑way protocol. Slots are logical Maestro slots 1–8; channels 0–31. See Maestro Setup.

Command Does
?MAE,<slot>,<ch>,<pos> Set target on a channel — pos in quarter‑µs.
?MAE,FREE,<slot>,<ch> Set speed and accel to 0 so the channel snaps straight to targets.
?MAE,GET,<slot>,<ch> Get Position[MAE:<slot>]{"q":"pos","ch":…,"val":…}.
?MAE,MOVING,<slot> Get Moving State[MAE:<slot>]{"q":"mov","val":0/1}.
?MAE,ERR,<slot> Get Errors[MAE:<slot>]{"q":"err","val":…} (clears the error flags on read).

Query replies come back as compact [MAE:<slot>]{…} JSON markers. A local Maestro slot replies synchronously; a remote slot (on another WCB) replies asynchronously once the hosting board relays the answer back.

?FORGET — drop a learned WCB peer

The WCB mesh auto‑learns peers that advertise themselves. These commands remove a learned peer from the runtime table and NVS. See WCB Network.

Command Does
?FORGET,<id> Forget one learned peer — id 1–20.
?FORGET,ALL Forget every learned (auto‑joined) peer.

A malformed id prints the usage hint [WCB] usage: ?FORGET,<id 1-20> or ?FORGET,ALL.

?OTA — firmware over‑the‑air

?OTALOCAL,… and ?OTA,… carry firmware OTA updates. These are driven by the config tool rather than typed by hand — see Flashing the Firmware and Remote Management over WCB.

Any other ? line that isn't recognised prints Unknown command: ….


Boot banner

At power‑up the board prints its board profile, SBUS layout, WCB join status, and firmware version. Between these lines you'll also see memory/config/clips log lines; a representative run looks like:

=== NaviCore ===
[BOARD] WCB HW 3.2 pin profile
[SBUS] IN+OUT share Serial1/UART1 — RX GPIO5 / TX GPIO4, 100k 8E2 inverted. UART0 = hardware S3.
[WCB] Joined network as device ID 20 (quantity=4)
[NaviCore] Firmware v0.2.0_… — setup complete.

On WCB HW 3.2 both SBUS IN and OUT share one full‑duplex UART (UART1 / Serial1): RX on GPIO5, TX on GPIO4, 100k 8E2 inverted. That frees UART0 to serve as the hardware S3 aux port. (On the NaviCore v2 profile the same shared‑UART layout applies with SBUS RX/TX on GPIO4/GPIO5.)

If you see [WCB] ERROR: wcb->begin() failed — check WCB Network settings in GUI, check your WCB Network settings.


See also: Record and Replay · Maestro Setup · Remote Management over WCB · Serial JSON Protocol

Clone this wiki locally