Skip to main content
The Lager Python SDK provides a powerful, object-oriented interface for controlling hardware and automating tests on your Device Under Test (DUT). It enables programmatic control of power supplies, sensors, debug probes, and more.

Import

from lager import Net, NetType  # Convenience import for Net and NetType

Core Classes

ClassDescriptionImport
StepFactory test step base classfrom lager.factory import Step, run
PersistentCacheData persistence between test runsfrom lager.cache import PersistentCache
binariesExecute custom binariesfrom lager.binaries import run_custom_binary
NetCore class for managing hardware connectionsfrom lager import Net, NetType
debugDevice debug and flash operationsfrom lager.debug import connect_jlink
RTTReal-Time Terminal communicationfrom lager.core import RTT
usb_hubUSB device power controlfrom lager.usb_hub import enable, disable, toggle
DexarmRobotic arm controlfrom lager.arm.rotrics import Dexarm
CentralBLE scanning and connectionfrom lager.ble import Central, Client
BlufiClientESP32 WiFi provisioningfrom lager.blufi import BlufiClient

Net Types

The SDK supports various net types for different hardware:
NetTypeDescriptionHardware
NetType.PowerSupplyProgrammable power supplyRigol DP800, Keithley, Keysight
NetType.PowerSupply2QTwo-quadrant supply (solar sim)EA PSI/EL series
NetType.BatteryBattery simulatorKeithley 2281S
NetType.ELoadElectronic loadRigol DL3000
NetType.AnalogOscilloscope analog inputRigol MSO5000
NetType.LogicLogic analyzer inputRigol MSO5000
NetType.WaveformWaveform generatorRigol MSO5000
NetType.GPIODigital I/OLabJack T7
NetType.ADCAnalog-to-digital converterLabJack T7
NetType.DACDigital-to-analog converterLabJack T7
NetType.ThermocoupleTemperature sensorPhidget
NetType.RotationRotary encoderPhidget
NetType.WattMeterPower meterYocto-Watt
NetType.UARTSerial communicationUSB Serial
NetType.DebugDebug probeJ-Link, pyOCD
NetType.ArmRobotic armRotrics Dexarm
NetType.UsbUSB port controlAcroname, YKUSH
NetType.WifiWiFi moduleLager Box WiFi
NetType.ActuateActuator controlDexarm actuator

Quick Start

List Available Nets

from lager import Net

nets = Net.list_saved()
for net in nets:
    print(f"{net['name']}: {net['role']}")

Control a Power Supply

from lager import Net, NetType

# Get the power supply net
psu = Net.get('VDD', type=NetType.PowerSupply)

# Configure and enable
psu.set_voltage(3.3)
psu.set_current(0.5)
psu.enable()

# Read measurements
print(f"Voltage: {psu.voltage()}V")
print(f"Current: {psu.current()}A")

# Disable when done
psu.disable()

Read an ADC

from lager import Net, NetType

adc = Net.get('SENSOR', type=NetType.ADC)
voltage = adc.input()
print(f"Voltage: {voltage}V")

Control GPIO

from lager import Net, NetType

# Read input
button = Net.get('BUTTON', type=NetType.GPIO)
state = button.input()

# Set output
led = Net.get('LED', type=NetType.GPIO)
led.output(1)  # HIGH
led.output(0)  # LOW

Flash Firmware

from lager.debug import connect_jlink, flash_device, reset_device, disconnect

# Connect to target
connect_jlink(speed='4000', device='NRF52840_XXAA', transport='SWD')

# Flash firmware
for line in flash_device(files=(['firmware.hex'], [], []), mcu='NRF52840_XXAA'):
    print(line)

# Reset and run
for line in reset_device(halt=False):
    print(line)

# Disconnect
disconnect()

USB Power Control

from lager.usb_hub import enable, disable, toggle

# Power on/off USB ports by net name
enable('CAMERA_USB')   # Power on
disable('CAMERA_USB')  # Power off
toggle('SENSOR_USB')   # Toggle state

Complete Example

from lager import Net, NetType
from lager.debug import connect_jlink, flash_device, reset_device, disconnect
from lager.usb_hub import enable as usb_enable, disable as usb_disable
import time

# 1. Flash firmware
connect_jlink(speed='4000', device='NRF52840_XXAA', transport='SWD')
for line in flash_device(files=(['firmware.hex'], [], []), mcu='NRF52840_XXAA'):
    print(line)
for line in reset_device(halt=False):
    print(line)
disconnect()
print("Firmware flashed")

# 2. Power on USB peripheral
usb_enable('SENSOR_USB')
print("USB sensor powered on")

# 3. Enable main power
main_power = Net.get("VDD_MAIN", type=NetType.PowerSupply)
main_power.set_voltage(3.3)
main_power.enable()
print("Main power enabled")

# 4. Read sensor
sensor = Net.get("TEMP_SENSE", type=NetType.ADC)
temperature = sensor.input()
print(f"Temperature: {temperature}V")

# 5. Clean up
main_power.disable()
usb_disable('SENSOR_USB')
print("Test complete")

API Reference

Core Classes

PageDescription
Factory Test FrameworkStep-based production test sequences
Persistent CacheData persistence between test runs
Custom BinariesExecute custom binaries on the Lager Box
NetHardware net management and core operations
DebugDevice flashing, reset, and debug control
RTTReal-Time Terminal communication
USBUSB device power control

Power & Simulation

PageDescription
Power SupplyProgrammable power supply control
BatteryBattery simulation and testing
SolarSolar panel simulation
Electronic LoadElectronic load control
Watt MeterPower measurement

Measurement

PageDescription
ScopeOscilloscope waveform capture and measurements
Logic AnalyzerDigital signal capture and protocol decode
ADCAnalog-to-digital conversion
ThermocoupleTemperature measurement

I/O & Communication

PageDescription
GPIODigital input/output control
DACDigital-to-analog conversion
CAN BusController Area Network communication
UARTUART net serial communication
SerialNative pyserial support
BLEBluetooth Low Energy communication
BluFiESP32 WiFi provisioning over BLE
WiFiWiFi configuration

Utilities

PageDescription
Robot ArmRobotic arm control
WebcamWebcam streaming and video capture

Error Handling

from lager import Net, NetType
from lager.pcb.net import InvalidNetError

try:
    net = Net.get('INVALID_NET', NetType.Analog)
except InvalidNetError as e:
    print(f"Net not found: {e}")
except Exception as e:
    print(f"Error: {e}")

Notes

  • Always call disable() when finished with power-related nets
  • Simple nets (GPIO, ADC, DAC) don’t require enable()/disable() calls
  • Complex nets (PowerSupply, Battery, Analog) require enable() before use
  • Net names must match those configured in the Lager system
  • Use try/except blocks for robust error handling