Documentation Index
Fetch the complete documentation index at: https://docs.lagerdata.com/llms.txt
Use this file to discover all available pages before exploring further.
Features
-
Concurrent J-Link probes on a single Lager Box. Two J-Link probes plugged into one Box can now run independent debug sessions side-by-side. The box-side service in
box/lager/debug/service.pyresolves each debug net’s J-Link USB serial from its VISA address and allocates a deterministic per-probe slot (read fromsaved_nets.jsonviaNetsCache). Slot N owns a three-port window — GDB2331+3N, SWO2332+3N, telnet2333+3N— plus RTT base9090+2N. The auxiliary-swoportand-telnetportare passed explicitly toJLinkGDBServerso its defaults of2332/2333can’t collide with another slot’s GDB port. The service passes-select USB=<serial>toJLinkGDBServerand-SelectEmuBySN <serial>toJLinkExe, writes per-serial PID and log files, and narrowspkillso disconnecting one probe no longer tears down the other. The CLI’s--gdb-portdefault is nowNonerather than2331, so the box’s allocator is honored unless an explicit port is requested; the effectivegdb_portreturned by the box is printed on connect.start_box.shpublishes the widened2331-2342Docker port range andsecure_box_firewall.shadmits the same range, so existing hardened boxes need a firewall refresh to use the new slots. Nets without a parseable serial (legacy single-probe setups) fall back to slot 0 / GDB 2331 / RTT 9090 //tmp/jlink_gdbserver.pidand continue to work unchanged. -
RIGOL DP811 power supply detection.
lager instrumentsnow lists the DP811 alongside the DP821 and DP832. The DP811 shares VID:PID1ab1:0e11with its siblings, so it is identified by USB serial prefix (DP8HorDP81→Rigol_DP811) in bothbox/lager/http_handlers/usb_scanner.pyandcli/impl/query_instruments.py, and is added to the serial-disambiguated bucket so a generic VID:PID match cannot misclassify it as a DP821. -
Multiple concurrent viewers per webcam stream. Each
/streamconnection used to open its owncv2.VideoCaptureagainst/dev/videoN, which V4L2 serves exclusively — the second viewer either failed or got blank frames. The streamer subprocess inbox/lager/automation/webcam/service.pynow spins up a single daemon capture thread on the first viewer that owns the device and broadcasts encoded JPEG frames to a shared buffer guarded by athreading.Condition. Any number of viewers can now subscribe to the same stream concurrently. Stop and re-start each webcam to pick up the regenerated streamer script.
Bug Fixes
LabJackADC.input()no longer inherits sticky AIN register state from a previous tool. ADC reads previously calledljm.eReadNamewith zero AIN register configuration, inheriting whatever the previous tool left inAIN_RANGE,AIN_NEGATIVE_CH,AIN_RESOLUTION_INDEX, andAIN_SETTLING_US. T7 register state persists in device RAM until USB power-cycle, so if a previous tool left an AIN in differential mode with a floating negative channel, every read saturated at ~10.10 V regardless of the actual signal — indistinguishable from a real wiring fault. Safe defaults (RANGE=10.0,NEGATIVE_CH=199,RESOLUTION_INDEX=0,SETTLING_US=0) are now written once per(handle, channel)tuple before the firsteReadName, cached in a class-level set. Config-write failures are logged but do not raise.
Improvements
- Webcam capture forces MJPEG so two cameras can share a USB 2.0 bus. Default OpenCV negotiation picked YUYV (uncompressed, ~150 Mbps at 640×480 30fps), which doesn’t leave room for a second camera on the same bus — the kernel rejected
VIDIOC_STREAMONwith “Not enough bandwidth for altsetting”. MJPEG is roughly 5× smaller and fits two cameras comfortably; the FourCC is now set before width/height/fps so negotiation honors it.

