-
Notifications
You must be signed in to change notification settings - Fork 3
Example Show End to End
A concrete walkthrough of building, loading, and firing a small four-cue show with two receivers. Every screen, click, and command is described.
Safety: for the dry-run portion of this example, do not connect real e-matches. Use the cue strip LEDs to visualize what would fire. Once you've watched the LEDs do the right thing end-to-end, then wire up real pyro.
You have:
- One dongle plugged into your laptop (
/dev/tty.usbmodem01on macOS). - Two receivers, provisioned as
RX146andRX147, each with one 8-cue module attached. Both are powered on. - A laptop running
start_prod.sh. The status bar shows green Link / Daemon / Dongle. Both receivers show online and battery > 80% on the Receivers page.
You want to fire:
- Cue 1 of
RX146at T+0s — single shell. - Cue 2 of
RX146at T+1s — single shell. - Cue 1 of
RX147at T+1.5s — single shell. - Cue 2 of
RX147at T+3s — single shell.
A 3-second pyro burst on two receivers. Trivial, but it exercises the entire system.
The Editor needs at least one inventory item to drop on the timeline. Open Inventory in the top nav.
- Click Add item.
- Fill in:
-
Name:
Test 3" Red Peony -
Type:
SHELL -
Duration:
0.6(seconds — how long the visible burst lasts) -
Lift delay:
1.5(the delay between the launch tube charge and the burst above ground) -
Color:
red
-
Name:
- Save.
For a four-cue test, one shell is enough. Real shows pull from a much richer inventory.
- Click Editor in the top nav.
- Click + New show (top-right).
- Fill in:
-
Name:
Demo Show -
Authorization code:
1234(or anything you'll remember — you'll have to retype it to save and to load)
-
Name:
- Click Create.
The blank editor appears.
A show owns its target grid. Even though RX146 and RX147 are in the global Receivers table, the show needs to know which ones it will use.
- In the editor's Target Grid sub-tab (default), click Add receiver.
- Pick
RX146from the dropdown. Set cues to[1, 2]. Click Save. - Repeat for
RX147with cues[1, 2].
You'll see a 2 × 2 cue grid for each receiver. The Editor uses this grid to validate zone:target references on the timeline.
- In the timeline area (above the Target Grid), click + Add item at time
0.0. - Pick
Test 3" Red Peonyfrom the inventory list. Click Add. - The new timeline item shows up at T+0. Drag it to:
-
Zone:
RX146 -
Target:
1
-
Zone:
- Repeat three more times:
| # | Time | Zone | Target |
|---|---|---|---|
| 1 | 0.0 | RX146 | 1 |
| 2 | 1.0 | RX146 | 2 |
| 3 | 1.5 | RX147 | 1 |
| 4 | 3.0 | RX147 | 2 |
You can drag items horizontally to nudge timing, or click into them to set exact values.
Click Save in the show header. Type the authorization code (1234). Save succeeds. The show now lives in Show.display_payload in SQLite.
- Click Console in the top nav.
- The Console page shows the show picker (because nothing is staged yet). Search for
Demo Show. - Click Stage.
You're now in the Console view of Demo Show. The timeline shows the four items as a read-only preview. The mode badge top-right shows Ready.
- Confirm both receivers show online + green in the Receivers card at the top of the Console (or on the Receivers page).
- Confirm the dongle's start switch is in the STOP position. If it's in START, the daemon will refuse to load.
- Click Load show. Type the auth code (
1234).
The button changes to Loading. Behind the scenes:
- Browser POSTs
{ "type": "load_show", "id": <showId> }to/api/system/cmd_daemon. - A JSON file appears in
/tmp/d_cmd/. The daemon picks it up. - The daemon runs
load_show(), which:- Loads the show row from SQLite.
- Builds a sorted firing array
[(0.0, RX146, 1), (1.0, RX146, 2), (1.5, RX147, 1), (3.0, RX147, 2)]. - For
RX146: sendsstartload RX146 2 <showId>to the dongle, thenshowloadn RX146 2 0 0 1000 1 2(one chunk holds both cues). - For
RX147: sendsstartload RX147 2 <showId>thenshowloadn RX147 2 1500 0 3000 1 2.
- The dongle queues each receiver's commands. Within ~150 ms, both receivers ACK with
loadComplete=trueandshowIdset to your show's ID. - The daemon flips
LOAD_STATEtoLOADEDand the UI shows Loaded.
If you're watching the receiver hardware: the cue strip LEDs on each receiver light red for the cues that need continuity (1 and 2) — the receivers are saying "I expect to fire these and I don't have continuity yet". If you had real e-matches connected with continuity, those LEDs would be green.
- Flip the arming switch on the dongle to ARMED (down).
- Confirm the status bar shows the dongle in armed state. The mode badge becomes Armed. A red "armed" rail appears on the side of the UI.
The default daemon flag delegate_start_to_client is on. So:
- Click Launch in the Console.
- The daemon receives
start_show, seesdstc=true, setswaiting_for_client_start=true, transitionsRUN_STATEtoDELEGATE_WAIT. The UI now shows a "Waiting for hardware confirmation" indicator. - Flip the start switch on the dongle to START (down). The daemon's
monitor_switchthread sees the transition, callsstart_schedule(from_delegate=True). -
Pre-check runs. With
min_battery_to_fire_pct = 30(the default) and both receivers reporting >80%, it passes immediately.require_continuityis off by default; if it were on, the daemon would refuse without continuity on cues 1 and 2 of both receivers. - The daemon picks
show_start_time = now_ms + 25 sand broadcastsshowstart(×6) to both receivers. Both receivers ACKstartReady=truewithin ~50 ms. - The mode badge becomes Pre-check → Countdown. A big
T-25.0timer appears on the Console.
The countdown elapses, you see T-3.0, T-2.0, T-1.0, T-0.0. At T-0, all four cues fire on schedule:
- T+0.0 —
RX146.cue1LED flashes yellow (firing) for 1000 ms (the configuredfire_duration_ms), then blue (fired). - T+1.0 —
RX146.cue2fires. - T+1.5 —
RX147.cue1fires. - T+3.0 —
RX147.cue2fires.
The Console timeline cursor sweeps through the four items. Telemetry updates in real time on the Receivers card — battery edges down a hair, success% stays at 100%.
After T+3, the daemon waits for the show's nominal duration (computed from max(item.startTime + item.duration) plus a small tail). Eventually RUN_STATE flips back to STOPPED. The mode badge returns to Loaded.
- Flip the start switch to STOP (up).
- Flip the arming switch to DISARMED (up).
- Click Unload in the Console.
The daemon sends reset <ident> 0 to each receiver, clearing their preloaded schedules. The mode badge returns to Ready.
In rough order, the dongle's USB serial line saw:
host->dongle: msync 0 1715680000123 (host time sync, every 2s)
host->dongle: startload RX146 2 42
host->dongle: showloadn RX146 2 0 0 1000 1 2
host->dongle: startload RX147 2 42
host->dongle: showloadn RX147 2 1500 0 3000 1 2
dongle->host: {"type":"rxupd","i":"RX146","l":1,"r":0,"s":42,...}
dongle->host: {"type":"rxupd","i":"RX147","l":1,"r":0,"s":42,...}
host->dongle: showstart RX146 1715680025123 0 42 6
host->dongle: showstart RX147 1715680025123 0 42 6
dongle->host: {"type":"rxupd","i":"RX146","l":1,"r":1,...}
dongle->host: {"type":"rxupd","i":"RX147","l":1,"r":1,...}
host->dongle: play 0 (every 3s during countdown)
... 25 second wait ...
(receivers fire autonomously from preloaded schedule)
host->dongle: reset RX146 0
host->dongle: reset RX147 0
And the per-second status frame just kept ticking the whole time.
If you want a deeper look, see the Wire protocol reference for the JSON schema of every message.
Once the dry-run looks right:
- Disarm and stop. Unload.
- Wire up your e-matches to the four cues.
- Watch the cue strip LEDs go from red (continuity needed but not detected) to green (continuity needed and detected). Anything still red means a bad e-match or bad connection.
- Verify continuity health on the Receivers page (every cue you expect to fire should be green).
- Repeat the load → arm → launch flow.
Have fun. Stand back.
Getting started
- Overview
- Desktop installers (macOS / Windows)
- macOS
- Linux
- Windows
- Production vs Development
- Connecting the dongle
- Flash a receiver
- Flash a dongle
- OTA flashing
Raspberry Pi
System overview
Subsystems
Hardware
- Receiver firmware
- Dongle firmware
- RF protocol
- Contributor Portal — BOMs, schematics, and board resources
UI walkthrough
Reference
Downloads
- Firmware
- Installers
Module Build & User Guides
- Cue
- Receiver
- Dongle