Skip to content

Example Show End to End

OneSeventyFour edited this page May 14, 2026 · 1 revision

End-to-end show example

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.

Scenario

You have:

  • One dongle plugged into your laptop (/dev/tty.usbmodem01 on macOS).
  • Two receivers, provisioned as RX146 and RX147, 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 RX146 at T+0s — single shell.
  • Cue 2 of RX146 at T+1s — single shell.
  • Cue 1 of RX147 at T+1.5s — single shell.
  • Cue 2 of RX147 at T+3s — single shell.

A 3-second pyro burst on two receivers. Trivial, but it exercises the entire system.


Step 1 — Add inventory

The Editor needs at least one inventory item to drop on the timeline. Open Inventory in the top nav.

  1. Click Add item.
  2. 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
  3. Save.

For a four-cue test, one shell is enough. Real shows pull from a much richer inventory.


Step 2 — Create the show

  1. Click Editor in the top nav.
  2. Click + New show (top-right).
  3. Fill in:
    • Name: Demo Show
    • Authorization code: 1234 (or anything you'll remember — you'll have to retype it to save and to load)
  4. Click Create.

The blank editor appears.


Step 3 — Add the show's receivers

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.

  1. In the editor's Target Grid sub-tab (default), click Add receiver.
  2. Pick RX146 from the dropdown. Set cues to [1, 2]. Click Save.
  3. Repeat for RX147 with 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.


Step 4 — Add cues to the timeline

  1. In the timeline area (above the Target Grid), click + Add item at time 0.0.
  2. Pick Test 3" Red Peony from the inventory list. Click Add.
  3. The new timeline item shows up at T+0. Drag it to:
    • Zone: RX146
    • Target: 1
  4. 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.


Step 5 — Save the show

Click Save in the show header. Type the authorization code (1234). Save succeeds. The show now lives in Show.display_payload in SQLite.


Step 6 — Stage the show

  1. Click Console in the top nav.
  2. The Console page shows the show picker (because nothing is staged yet). Search for Demo Show.
  3. 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.


Step 7 — Load the show

  1. Confirm both receivers show online + green in the Receivers card at the top of the Console (or on the Receivers page).
  2. Confirm the dongle's start switch is in the STOP position. If it's in START, the daemon will refuse to load.
  3. 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: sends startload RX146 2 <showId> to the dongle, then showloadn RX146 2 0 0 1000 1 2 (one chunk holds both cues).
    • For RX147: sends startload RX147 2 <showId> then showloadn RX147 2 1500 0 3000 1 2.
  • The dongle queues each receiver's commands. Within ~150 ms, both receivers ACK with loadComplete=true and showId set to your show's ID.
  • The daemon flips LOAD_STATE to LOADED and 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.


Step 8 — Arm

  1. Flip the arming switch on the dongle to ARMED (down).
  2. 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.

Step 9 — Launch (delegate path)

The default daemon flag delegate_start_to_client is on. So:

  1. Click Launch in the Console.
  2. The daemon receives start_show, sees dstc=true, sets waiting_for_client_start=true, transitions RUN_STATE to DELEGATE_WAIT. The UI now shows a "Waiting for hardware confirmation" indicator.
  3. Flip the start switch on the dongle to START (down). The daemon's monitor_switch thread sees the transition, calls start_schedule(from_delegate=True).
  4. Pre-check runs. With min_battery_to_fire_pct = 30 (the default) and both receivers reporting >80%, it passes immediately. require_continuity is off by default; if it were on, the daemon would refuse without continuity on cues 1 and 2 of both receivers.
  5. The daemon picks show_start_time = now_ms + 25 s and broadcasts showstart (×6) to both receivers. Both receivers ACK startReady=true within ~50 ms.
  6. The mode badge becomes Pre-checkCountdown. A big T-25.0 timer appears on the Console.

Step 10 — Watch the show

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.cue1 LED flashes yellow (firing) for 1000 ms (the configured fire_duration_ms), then blue (fired).
  • T+1.0 — RX146.cue2 fires.
  • T+1.5 — RX147.cue1 fires.
  • T+3.0 — RX147.cue2 fires.

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.


Step 11 — Cleanup

  1. Flip the start switch to STOP (up).
  2. Flip the arming switch to DISARMED (up).
  3. Click Unload in the Console.

The daemon sends reset <ident> 0 to each receiver, clearing their preloaded schedules. The mode badge returns to Ready.


What you just did at the wire level

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.


Now do it with real pyro

Once the dry-run looks right:

  1. Disarm and stop. Unload.
  2. Wire up your e-matches to the four cues.
  3. 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.
  4. Verify continuity health on the Receivers page (every cue you expect to fire should be green).
  5. Repeat the load → arm → launch flow.

Have fun. Stand back.

Clone this wiki locally