diag: log SteppIR status frames so a stuck "moving" (TX interlock) is visible
The SteppIR client logged commands it sent but never the status frames it read back, so a misread motor-status byte — which drives the app's "block TX while the antenna is moving" interlock on a FlexRadio — was invisible. Log the raw 11-byte frame plus the decoded freq/dir/moving and the motor (buf[6]) and direction (buf[7]) bytes, but only when the frame changes, to keep the 2 s poll from flooding the log. Purely diagnostic; no behaviour change.
This commit is contained in:
@@ -23,6 +23,7 @@
|
|||||||
package steppir
|
package steppir
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
@@ -84,6 +85,12 @@ type Client struct {
|
|||||||
lastStatus *Status
|
lastStatus *Status
|
||||||
lastSetKHz int
|
lastSetKHz int
|
||||||
|
|
||||||
|
// lastRaw holds the previous raw status frame so we only log a status line
|
||||||
|
// when the controller's reply actually changes — enough to diagnose a stuck
|
||||||
|
// "motors moving" read (which drives the app's TX-inhibit interlock) without
|
||||||
|
// spamming the log every 2 s poll.
|
||||||
|
lastRaw []byte
|
||||||
|
|
||||||
// A just-commanded direction is held until the controller's poll reports it —
|
// A just-commanded direction is held until the controller's poll reports it —
|
||||||
// the motors take a second or two, and a stale poll would otherwise snap the
|
// the motors take a second or two, and a stale poll would otherwise snap the
|
||||||
// UI back. Same trick as the Ultrabeam client.
|
// UI back. Same trick as the Ultrabeam client.
|
||||||
@@ -242,7 +249,17 @@ func (c *Client) queryStatus() (*Status, error) {
|
|||||||
if _, err := io.ReadFull(conn, buf); err != nil {
|
if _, err := io.ReadFull(conn, buf); err != nil {
|
||||||
return nil, fmt.Errorf("read status: %w", err)
|
return nil, fmt.Errorf("read status: %w", err)
|
||||||
}
|
}
|
||||||
return parseStatus(buf)
|
st, err := parseStatus(buf)
|
||||||
|
// Log the raw frame + decode whenever it changes. The motor byte (buf[6]) is
|
||||||
|
// what decides st.MotorsMoving, and that in turn drives the app's "block TX
|
||||||
|
// while moving" interlock — so if a controller (e.g. with its INHIBIT engaged)
|
||||||
|
// reports a byte we misread as perpetual motion, this line makes it visible.
|
||||||
|
if err == nil && !bytes.Equal(buf, c.lastRaw) {
|
||||||
|
c.lastRaw = append(c.lastRaw[:0], buf...)
|
||||||
|
log.Printf("steppir: status ← % X (freq=%d kHz dir=%d moving=%d motorByte=0x%02X dirByte=0x%02X)",
|
||||||
|
buf, st.Frequency, st.Direction, st.MotorsMoving, buf[6], buf[7])
|
||||||
|
}
|
||||||
|
return st, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// parseStatus decodes an 11-byte status frame.
|
// parseStatus decodes an 11-byte status frame.
|
||||||
|
|||||||
Reference in New Issue
Block a user