ecu-tests/vendor/Owon/owon_psu_quick_demo.py

96 lines
3.1 KiB
Python

"""Owon PSU quick demo (optimized to use ecu_framework.power.owon_psu).
This script reads configuration from OWON_PSU_CONFIG (YAML) or ./config/owon_psu.yaml,
prints discovered ports responding to *IDN?, then connects to the configured port
and performs a small sequence (IDN, optional V/I set, toggle output, measure V/I).
No CLI flags; edit YAML to change behavior.
"""
from __future__ import annotations
import os
import time
from pathlib import Path
import yaml
try:
from ecu_framework.power import OwonPSU, SerialParams, scan_ports
except ModuleNotFoundError:
# Ensure repository root is on sys.path when running this file directly
import sys
repo_root = Path(__file__).resolve().parents[2]
if str(repo_root) not in sys.path:
sys.path.insert(0, str(repo_root))
from ecu_framework.power import OwonPSU, SerialParams, scan_ports
def _load_yaml_config() -> dict:
cfg_path = str(Path("config") / "owon_psu.yaml")
p = Path(cfg_path).resolve()
print("Using config path:", str(p))
if not p.is_file():
return {}
with p.open("r", encoding="utf-8") as f:
data = yaml.safe_load(f) or {}
return data if isinstance(data, dict) else {}
def run_demo() -> int:
cfg = _load_yaml_config()
if not cfg or "port" not in cfg:
print("Config not found or missing 'port'. Set OWON_PSU_CONFIG or create ./config/owon_psu.yaml")
return 2
print("Scanning ports (responding to *IDN?):")
for dev, idn in scan_ports(SerialParams(baudrate=int(cfg.get("baudrate", 115200)), timeout=float(cfg.get("timeout", 1.0)))):
print(f" {dev} -> {idn}")
# Serial params
baud = int(cfg.get("baudrate", 115200))
timeout = float(cfg.get("timeout", 1.0))
eol = cfg.get("eol", "\n")
from serial import PARITY_NONE, PARITY_EVEN, PARITY_ODD, STOPBITS_ONE, STOPBITS_TWO
parity = {"N": PARITY_NONE, "E": PARITY_EVEN, "O": PARITY_ODD}.get(str(cfg.get("parity", "N")).upper(), PARITY_NONE)
stopbits = {1: STOPBITS_ONE, 2: STOPBITS_TWO}.get(int(float(cfg.get("stopbits", 1))), STOPBITS_ONE)
xonxoff = bool(cfg.get("xonxoff", False))
rtscts = bool(cfg.get("rtscts", False))
dsrdtr = bool(cfg.get("dsrdtr", False))
ps = SerialParams(
baudrate=baud,
timeout=timeout,
parity=parity,
stopbits=stopbits,
xonxoff=xonxoff,
rtscts=rtscts,
dsrdtr=dsrdtr,
)
port = str(cfg["port"]).strip()
do_set = bool(cfg.get("do_set", False))
set_v = float(cfg.get("set_voltage", 1.0))
set_i = float(cfg.get("set_current", 0.1))
with OwonPSU(port, ps, eol=eol) as psu:
idn = psu.idn()
print(f"IDN: {idn}")
print(f"Output status: {psu.output_status()}")
if do_set:
psu.set_output(True)
time.sleep(0.5)
psu.set_voltage(1, set_v)
psu.set_current(1, set_i)
time.sleep(1.0)
print(f"Measured V: {psu.measure_voltage()} V")
print(f"Measured I: {psu.measure_current()} A")
time.sleep(0.5)
psu.set_output(False)
return 0
if __name__ == "__main__":
raise SystemExit(run_demo())