diff --git a/docs/hendi_lockout_findings.md b/docs/hendi_lockout_findings.md new file mode 100644 index 0000000..8b53e51 --- /dev/null +++ b/docs/hendi_lockout_findings.md @@ -0,0 +1,35 @@ +# Hendi remote-control lockout findings + +Firmware under test: **v1.12** (`getSoftwareVersion()` / `I?`+`V?` via +`components/actor/hendiCtrl.py`). Reproduced and verified on real hardware +using `scripts/hendi_ctrl_app.py`'s `--trigger-error-state`, `--reset` and +`--test-heater` flags. + +## Trigger + +Calling `remoteEnable(True)` (`R1`) and then disconnecting/exiting without a +matching `remoteEnable(False)` (`R0`) - i.e. an ungraceful disconnect while +remote control is enabled - puts the device into a locked-out state. + +## Recovery attempts + +| # | Recovery method | Mechanism | Result | +|---|---|---|---| +| 1 | `--reset` (toggle DTR/RTS reset line) | Soft reset via serial control lines, no power loss | **Fails** - `remoteEnable(True)` still returns `HendiException("Communication error")` on the next connection | +| 2 | `--reset` immediately followed by `--test-heater` in the *same* process/connection | Soft reset, then reuse the still-open serial connection | Succeeded once, but not reproducible across repeat isolated attempts - not a reliable recovery path | +| 3 | Physical power cycle (device knob) | Full power-off/on of the unit | **Recovers** - `remoteEnable(True)` succeeds immediately afterward, heater sweep runs cleanly | + +## Symptom while locked out + +- `I?` / `V?` (software identifier/version queries) still respond normally. +- `R1` (`remoteEnable(True)`) fails with a communication error - this is the + only observed symptom, and it blocks any command path that needs remote + control enabled (e.g. `--test-heater`). + +## Conclusion + +On firmware v1.12, only a physical power cycle clears the lockout; neither a +serial soft-reset nor a fresh serial reconnect does. This is the behavior the +planned firmware fix should address - a graceful-disconnect timeout, an +explicit unlock command, or making the DTR/RTS reset line actually clear the +lockout flag.