- Add pyproject.toml (hatchling backend, version 0.1.0, name ecu-framework).
Runtime deps split out from requirements.txt; test extras and the
Melexis-transitive bundle are opt-in.
- Add CHANGELOG.md (Keep-A-Changelog format), seeding [Unreleased] with the
installable shift and a [0.1.0] entry for the existing baseline.
- ecu_framework/__init__.py: resolve __version__ from importlib.metadata
with a "0.0.0+local" fallback for source checkouts. Add power and
flashing to __all__ and the docstring (previously stale).
- Drop per-subpackage __version__ from lin/ and power/. A single
pyproject.toml version is the source of truth; subpackage-level
__version__ strings drift and nothing consumed them.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
owon_psu.py upgrades (all backward-compatible):
- SerialParams.from_config() and OwonPSU.from_config() factories that
translate the YAML power_supply block (parity 'N', stopbits 1.0)
into pyserial constants — eliminates the boilerplate every test
was duplicating.
- Parsed-numeric measurement helpers: measure_voltage_v(),
measure_current_a(), output_is_on(). Tests can now assert on
floats / bools instead of regex-ing strings.
- safe_off_on_close=True (new ctor kwarg, default on) — close()
sends 'output 0' before closing the port. Last-ditch protection
against leaving the bench powered on after an aborted test.
Keyword-only so the historical positional ctor signature is
preserved.
- Cross-platform port resolver: windows_com_to_linux,
linux_serial_to_windows, candidate_ports, resolve_port. The
resolver tries the configured port verbatim, then its
cross-platform translation (COM7 ↔ /dev/ttyS6 on WSL1), then
Linux USB-serial paths (/dev/ttyUSB*, /dev/ttyACM*), then a full
scan_ports() with optional idn_substr filter. One bench config
works on Windows, WSL1, WSL2 + usbipd-win, and native Linux.
- try_idn_on_port refactored to use OwonPSU internally, removing
~25 lines of duplicated serial-port plumbing.
ecu_framework/power/__init__.py re-exports the new helpers so tests
can do `from ecu_framework.power import resolve_port, ...`.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>