103 lines
3.6 KiB
Python
103 lines
3.6 KiB
Python
import time
|
|
|
|
import pytest
|
|
import serial
|
|
|
|
from ecu_framework.power import OwonPSU, SerialParams
|
|
from ecu_framework.config import EcuTestConfig
|
|
|
|
|
|
pytestmark = [pytest.mark.hardware]
|
|
|
|
|
|
def test_owon_psu_idn_and_optional_set(config: EcuTestConfig, rp):
|
|
"""
|
|
Title: Owon PSU - IDN, Output Status, Set/Measure Verification
|
|
|
|
Description:
|
|
Validates serial SCPI control of an Owon PSU: IDN retrieval, output status query,
|
|
and optional set/measure cycle using values from central configuration.
|
|
|
|
Test Steps:
|
|
1. Load PSU config from EcuTestConfig.power_supply
|
|
2. Open serial connection and query *IDN?
|
|
3. Query output status (output?) and record initial state
|
|
4. If configured, set voltage/current, enable output briefly, measure V/I, then disable output
|
|
5. Record IDN, output status before/after, set values, and measured values in the report
|
|
|
|
Expected Result:
|
|
*IDN? returns a non-empty string (containing idn_substr if configured), serial operations succeed,
|
|
and, when enabled, the output toggles on then off with measurements returned.
|
|
"""
|
|
psu_cfg = config.power_supply
|
|
if not psu_cfg.enabled:
|
|
pytest.skip("Power supply tests disabled in config.power_supply.enabled")
|
|
if not psu_cfg.port:
|
|
pytest.skip("No power supply 'port' configured (config.power_supply.port)")
|
|
|
|
# Serial params (with sensible defaults via central config)
|
|
baud = int(psu_cfg.baudrate)
|
|
timeout = float(psu_cfg.timeout)
|
|
parity = psu_cfg.parity or "N"
|
|
stopbits = psu_cfg.stopbits or 1
|
|
xonxoff = bool(psu_cfg.xonxoff)
|
|
rtscts = bool(psu_cfg.rtscts)
|
|
dsrdtr = bool(psu_cfg.dsrdtr)
|
|
eol = psu_cfg.eol or "\n"
|
|
|
|
ps = SerialParams(
|
|
baudrate=baud,
|
|
timeout=timeout,
|
|
parity={"N": serial.PARITY_NONE, "E": serial.PARITY_EVEN, "O": serial.PARITY_ODD}.get(str(parity).upper(), serial.PARITY_NONE),
|
|
stopbits={1: serial.STOPBITS_ONE, 2: serial.STOPBITS_TWO}.get(int(float(stopbits)), serial.STOPBITS_ONE),
|
|
xonxoff=xonxoff,
|
|
rtscts=rtscts,
|
|
dsrdtr=dsrdtr,
|
|
)
|
|
|
|
want_substr = psu_cfg.idn_substr
|
|
do_set = bool(psu_cfg.do_set)
|
|
set_v = float(psu_cfg.set_voltage)
|
|
set_i = float(psu_cfg.set_current)
|
|
|
|
port = str(psu_cfg.port).strip()
|
|
|
|
with OwonPSU(port, ps, eol=eol) as psu:
|
|
# Step 2: IDN
|
|
idn = psu.idn()
|
|
rp("psu_idn", idn)
|
|
print(f"PSU IDN: {idn}")
|
|
assert isinstance(idn, str)
|
|
assert idn != "", "*IDN? returned empty response"
|
|
if want_substr:
|
|
assert str(want_substr).lower() in idn.lower(), f"IDN does not contain expected substring: {want_substr}. Got: {idn}"
|
|
|
|
# Step 3: Output status before
|
|
out_before = psu.output_status()
|
|
rp("output_status_before", str(out_before))
|
|
print(f"Output status (before): {out_before}")
|
|
|
|
if do_set:
|
|
# Step 4: Set and measure
|
|
rp("set_voltage", set_v)
|
|
rp("set_current", set_i)
|
|
print(f"Setting: voltage={set_v}V, current={set_i}A")
|
|
|
|
psu.set_voltage(1, set_v)
|
|
psu.set_current(1, set_i)
|
|
psu.set_output(True)
|
|
time.sleep(1.0) # allow settling
|
|
|
|
try:
|
|
mv = psu.measure_voltage()
|
|
mi = psu.measure_current()
|
|
rp("measured_voltage", mv)
|
|
rp("measured_current", mi)
|
|
print(f"Measured: voltage={mv}V, current={mi}A")
|
|
finally:
|
|
psu.set_output(False)
|
|
|
|
out_after = psu.output_status()
|
|
rp("output_status_after", str(out_after))
|
|
print(f"Output status (after): {out_after}")
|