Upgrade Notes
- Update your boxes. The webcam, oscilloscope, PicoScope and
lager nets statechanges run on the box. Runlager update --box <box-name>after you upgrade the CLI. - Starting a webcam stream no longer resets the camera’s settings. Before, each start turned autofocus on and set brightness to 128. Now a start applies only the controls that you set through lager. A script that relied on the reset must now set autofocus and brightness itself.
lager nets statereports new reasons for a missing reading. A net now readsinstrument-absent,instrument-timeout,probe-cooldownordevice-busywhere it read a null with no reason before. Update any script that matches on these values.
Features
-
A new webcam viewer page, in the style of the oscilloscope page. It has a Net picker, the
camera’s model, frame size, frame rate and a stream status. It adds a Snapshot button and
zoom buttons. New controls:
- Resolution and frame rate, from the modes that the camera offers. Before, streams ran at 640x480 only.
- Pan while zoomed: drag the picture, use the arrow keys, or double-click a point.
- Exposure and gain, on cameras that have them.
- Rotation in quarter turns, a flip in either direction, and full screen.
-
Every image control of a webcam, on the viewer page and in Python. White balance,
contrast, saturation, hue, gamma, sharpness, backlight compensation and power line frequency
join exposure, gain, focus and brightness. Each control uses the camera’s own range. The
webcam net gains
controls(),set_control()andlock_controls().lock_controls()turns every auto mode off, so pictures compare from run to run. -
snapshot()andframe()on a webcam net read frames from the running stream. Alager pythonscript gets a JPEG or a numpy array without opening the camera. -
Support for the ELP global-shutter camera (AR0234, USB ID
32e4:0234).lager nets add-allandlager nets addoffer it as a webcam. -
lager webcam NET start --openopens the stream in your browser. On a stream that already runs, it reopens the viewer with a fresh link. - A Screenshot button on the oscilloscope page. It saves the waveform view as a PNG. A line under the trace gives the model, the net, the time base, each channel’s scale, the trigger and the time. It works for every scope on the page.
-
GET /nets/state?stream=1streams each instrument’s net states as the box reads them. The answer is newline-delimited JSON, with a final line that lists any nets that ran out of time. A box that supports it setsnetsStateStreamin its/statuscapabilities.
Bug Fixes
lager debug NET flasherased the target when you gave no image. With no--hex,--elfor--bin, or with two of them, it erased the chip and then refused. It now refuses before it contacts the box.lager debug NET memrd --jsonprinted progress lines before the JSON. When the command connected to the debugger first, the output did not parse. Those lines now go to stderr.- A webcam’s focus and brightness were limited to 0-255. Some cameras use other ranges, so a start set brightness to the maximum on some of them. Focus and brightness now use the camera’s own range.
lager nets statewaited 8 seconds when one instrument was unplugged or silent. The box now skips an instrument that is not on the USB bus. It stops waiting for one after 3 seconds, and it does not ask that instrument again for 30 seconds.- A four-channel PicoScope offered only channels 1 and 2. This happened when the USB product string named the series, such as 2000A, rather than the model. The box now takes the channel count from the model that the scope daemon detects.
- The oscilloscope page waited for Connect while the scope ran. It now connects as soon as it knows the scope. When the stream closes, the page dims the last measurements and marks them as old.
- A Rigol MSO5000 failed every command when its capture card was missing. Now every command except the live view works. The live view names the USB ports that have a video device.
- A Rigol MSO5000 showed rise and fall times of up to 3 ms on a 70 ns edge. The set now asks the scope for those two values. On every scope, the timing starts at the last crossing of the 10% level before the edge.
- A Rigol MSO5000’s live view slowed to one or two frames a second while the page showed
measurements. The daemon now computes the measurements from one screen record, in about
0.2 seconds. A single
lager scope NET measurestill asks the scope. - A Rigol MSO5000’s live view read the wrong volts after a volts/div change. The daemon now reads the channel’s offset back with the new scale.
- A Rigol MSO5000’s live view showed a spike and a false “Channel A clipped” warning. The scope’s trigger marker caused both. The daemon now leaves the marker out. The page draws each channel in the scope’s own color.
- The scope’s side menu covered part of a Rigol MSO5000’s live view when it returned. The daemon now finds the menu and hides it.
- A Rigol MSO5000’s live view did not return after a power cycle. A power cycle turns the scope’s HDMI output off. The box now turns it back on through the scope’s menus when the capture card shows no picture.
- A new Rigol scope daemon started before the old one stopped. The new daemon then found the USB interface in use. The box now waits for the old daemon to exit.
lager scope NET roll onon a Rigol gave the wrong reason. It now says that the scope has no roll mode.
Improvements
lager scope NET stream webtells you when no browser opens. Over SSH, it now asks you to open the link yourself.- The automated tests cover more of the CLI and the hardware. The pull-request gate now runs
every CLI command group. The hardware bench now runs nightly and on each release tag, not on
every merge. The nightly run adds the supply, LabJack, MCC USB-202, USB hub,
lager debugand Python API suites. Bench checks that never failed now fail on a real fault.
Known Limitations
- Two ELP global-shutter cameras on one box appear as one camera. Every unit reports the same serial number. Add the second net by hand.

