Skip to content

feat(perfectcue): DSAN PerfectCue network extender support - #2

Merged
TomsFaire merged 5 commits into
mainfrom
feature/perfectcue-network-extender
Apr 24, 2026
Merged

feat(perfectcue): DSAN PerfectCue network extender support#2
TomsFaire merged 5 commits into
mainfrom
feature/perfectcue-network-extender

Conversation

@TomsFaire

Copy link
Copy Markdown
Owner

Summary

  • Adds TCP listener that accepts slide advance/back commands from DSAN PerfectCue network extenders
  • Correctly implements the binary byte protocol: 0x0F (next), 0x1F (previous), 0xFF (keepalive — ignored)
  • Supports multiple simultaneous listeners — one per port — for multi-extender deployments
  • New PerfectCue Network Extender panel in Advanced settings: enable toggle, dynamic port list with +/Remove (same UX pattern as backup machines), Save button
  • Preferences migrate automatically from legacy single perfectCuePort value to the new perfectCuePorts array

Test plan

  • Launch from worktree, go to Advanced tab — PerfectCue panel is visible
  • Enable checkbox + Save → app starts listening; disable + Save → stops listening
  • Add/remove ports with + and Remove buttons; Save applies new port set
  • Connect a real DSAN network extender — DSAN connected appears in debug log
  • Forward button → next slide dispatched; Back button → previous slide dispatched
  • 0xFF keepalive packets arrive every ~5s with no spurious slide changes
  • Extender reconnect cycles (disconnect + reconnect) handled gracefully with no errors
  • Legacy perfectCuePort pref migrates to perfectCuePorts: [8899] on first load

🤖 Generated with Claude Code

TomsFaire and others added 5 commits April 23, 2026 16:32
Add src/perfectcue-parser.js with pure parsePerfectCueCommand/splitOnCR
functions and 9 node:test unit tests. Also adds test script to package.json
and src/**/* to electron-builder files list.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
createPerfectCueServer takes injected dispatch/log/onStatus so it can be
tested outside Electron. Six integration tests cover split-chunk reassembly,
multi-command bursts, and connection status transitions.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add state vars, startPerfectCueListener/stop/dispatch/applyPerfectCuePrefs.
applyPerfectCuePrefs called at app.whenReady and after save-preferences IPC
so port changes take effect immediately. stopPerfectCueListener wired into
before-quit for clean shutdown.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace text-based >FORWARD/>REVERSE parser with raw byte matching.
The device sends 0x0F (next), 0x1F (previous), and 0xFF (keepalive)
— no CR framing. Drops splitOnCR in favour of iterating Buffer bytes
directly per data event.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- main.js: replace single perfectCueServer with perfectCueServers[]
  array; startPerfectCueListeners(ports) opens one TCP server per port;
  applyPerfectCuePrefs migrates legacy perfectCuePort single value
- index.html: PerfectCue panel in Advanced tab with enable checkbox
  and dynamic port list (+/Remove, same pattern as backup machines)
- renderer.js: addPerfectCuePortRow, renderPerfectCuePortList,
  getPerfectCuePortsFromUi, savePerfectCuePrefs; prefs load migrates
  old perfectCuePort on first run

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@TomsFaire
TomsFaire merged commit e5badd2 into main Apr 24, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant