app / dsox1204g-v2
!

Not installable via adompkg

This app has no published release. adompkg install kyle/dsox1204g-v2 will not work until a maintainer publishes a tarball with install.sh and uninstall.sh.

See the publishing docs for the package.json schema and tarball layout required to ship this app.

DSOX1204G v2

A real-time, browser-based oscilloscope UI for the Keysight DSOX1204G (and compatible Keysight scopes over SCPI/LAN). Python/FastAPI backend talks raw SCPI-over-TCP to the hardware and streams waveform frames over a WebSocket; a Svelte 4 SPA renders them on a canvas at 60 fps with click-drag "knob" interactions, persistence mode, live measurements, and a matching CLI for scripting / AI control.

Hardware requirement (the "backend caveat")

This app is two pieces that need to run together:

  1. The frontend + control UI — runs in any browser. Lightweight, no hardware required to look at.
  2. The Python backend — must run on a container or machine that has a direct LAN path to the physical oscilloscope (port 5025, SCPI raw socket). The scope itself can't be put on the public internet without someone's LAN, and the backend needs to actually be reachable from the scope to stream waveforms.

If you don't have a DSOX1204G (or compatible Keysight scope) reachable on your LAN, you can still read the code, run the frontend in demo mode, or follow the patterns here to build your own scope UI. If you do have one, the backend can be pointed at its IP at runtime via the Device sidebar or POST /config/address.

A reference deployment is running at https://dsox1204g-ax3spi0ds2dc.adom.cloud/ against a DSOX1204G on the Adom office LAN. Access is gated by ownership of the underlying hardware.

Features

  • Canvas-rendered live waveforms with 4 channels, DPR-aware, 60 fps
  • Click-drag knobs — ground triangle = channel offset, T marker = trigger level, drag plot body = horizontal pan (timebase position), mouse wheel = H/div, shift+wheel = V/div of active channel
  • Live cursor readout — crosshair with tooltip showing time + per-channel voltage under the mouse
  • Measurements panel — per-channel Vpp, Vrms, Vavg, Freq, Period computed from streamed samples
  • Persistence mode — cycle 4/8/16/32 frames of intensity-graded trace history
  • Trigger control — source, slope, level, sweep, show/hide visual
  • Keyboard shortcuts — Space run/stop · 1–4 toggle channels · T trigger line · A autoscale · S single · R reset · ? help
  • CSV export — download current captures with a time column
  • Runtime scope address change — point the backend at a different scope without restarting
  • Matching CLI./bin/scope wraps every REST endpoint so every UI button has a shell command
  • Adom skill included so Claude can drive the CLI in an agent loop

Performance notes

  • Uses :WAVeform:FORMat BYTE (the DSOX1204G's ADC is 8-bit native; WORD was wasting half the bandwidth)
  • Only enabled channels are polled each frame
  • Waveform preamble cached per channel, invalidated when scale/offset/coupling change — saves a round-trip
  • Single compound SCPI command :WAV:SOUR CHAN<n>;:WAV:DATA? instead of two
  • Typical live throughput: ~20 Hz on 1 channel, halved per additional enabled channel. The scope's LAN firmware is the wall beyond that

DSOX1204G SCPI gotchas (discovered the hard way)

Both are documented inline in backend/server.py:

  1. :CHANnel<n>:DISPlay OFF (keyword form) hangs this scope. The numeric 0/1 form is used everywhere.
  2. :WAVeform:SOURce CHAN<n> implicitly re-enables channel <n>. If the capture loop iterates a stale local "enabled" list and queries a channel that was just disabled, the disable is silently reversed. Fix: update local enable-state inside the same lock as the SCPI write.

Repo

github.com/adom-inc/dsox1204g-v2 (private; contact kcknox for access)

Install the skill on a user container

The repo ships a SKILL.md under skills/dsox1204g/ that teaches Claude how to drive the CLI. To install it locally:

git clone [email protected]:adom-inc/dsox1204g-v2.git
ln -sfn "$PWD/dsox1204g-v2/skills/dsox1204g" ~/.claude/skills/dsox1204g

Then any prompt mentioning DSOX / Keysight scope / trigger / autoscale / channel scale will pick it up.

CLI quick reference

./bin/scope status
./bin/scope run | stop | single | autoscale
./bin/scope ch 1 on | off | scale 0.5 | offset 0 | coupling AC
./bin/scope tb scale 1e-6 | position 0
./bin/scope trig source CHAN1 | slope POS | level 0.5 | sweep AUTO
./bin/scope scpi query "*IDN?"

Point at a different backend: DSOX_HOST=http://host:5174 ./bin/scope ...