v9.5.4
User-facing fixes
- LCD panel sleeps cleanly on shutdown / app close (#143 k1w3l, Elite Vision 360 SCSI). After the app exited, the panel stayed lit showing "USB communication lost" until VBUS dropped — Windows TRCC sleeps the panel, Linux didn't. Audit of the C# v2.1.4 source confirmed Windows sends nothing at shutdown; its USB stack just selective-suspends the device. Linux can't do the same because our udev rule pins
power/autosuspend=-1to keep frames flowing. The fix: a newtrcc sleepchokepoint that re-enables autosuspend (writesauto→power/control) and unconfigures each matching USB device (writes0→bConfigurationValue) so the firmware sees a clean detach and powers down the panel. Wired through the GUI'saboutToQuit(catches close-button), the systemd service'sExecStop=(catches reboot/shutdown), and exposed astrcc sleep/POST /trcc/sleepfor any remaining flows.
Architecture
Platform.suspend_usb_device(vid, pid) -> bool— new capability port. Linux walks/sys/bus/usb/devices, matches on VID:PID (covers SCSI which has noUsbAddressand the multi-LCD case where two physical devices share VID:PID), writes the sysfs nodes, returnsTrueon at least one success. Windows returnsTrueno-op (USB stack handles it). macOS / BSD default toFalseuntil a reporter surfaces the need.Trcc.suspend_all_devices() -> OpResult— single chokepoint for app shutdown. Collects unique(vid, pid)across LCD+LED registries, runscleanup()andDeviceProtocolFactory.close_all()to release transports BEFORE writingbConfigurationValue=0(avoids EBUSY), then asks the platform to suspend each pair. Idempotent.