fix(steppir): the same fast poll, and motion reported at the command
The shortened transmit gag was written for an Ultrabeam that is now polled four times a second while it moves. The SteppIR was still on two seconds and reported nothing at all until its own poll came round, so the gap between the 900 ms grace and the first poll that would have seen the movement was a hole in "block TX while the elements travel" — the transmitter released in the middle of a move. It now reports a commanded move at once (bounded, so an antenna that never answers cannot latch the inhibit on), on a COPY of the cached status so the flag cannot leak into what the poll goroutine owns, and follows the motors with its poll rate exactly as the Ultrabeam does.
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
package steppir
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
// The controller says nothing until its own poll comes round, so a move has to
|
||||
// be reported from the moment it is COMMANDED. Without it the app's "block TX
|
||||
// while the elements travel" had a hole: the grace covering the command ran out
|
||||
// before the first poll that would have seen the movement, and the transmitter
|
||||
// was released in the middle of a move.
|
||||
func TestAJustCommandedMoveReportsMotion(t *testing.T) {
|
||||
c := &Client{}
|
||||
c.lastStatus = &Status{Connected: true} // idle, as the controller last said
|
||||
|
||||
if st, _ := c.GetStatus(); st.MotorsMoving != 0 {
|
||||
t.Fatal("an idle antenna reports motion")
|
||||
}
|
||||
|
||||
c.statusMu.Lock()
|
||||
c.moveCmdAt = time.Now()
|
||||
c.statusMu.Unlock()
|
||||
|
||||
st, _ := c.GetStatus()
|
||||
if st.MotorsMoving == 0 {
|
||||
t.Error("a move commanded a moment ago is not reported as motion")
|
||||
}
|
||||
if c.lastStatus.MotorsMoving != 0 {
|
||||
t.Error("the optimistic flag leaked into the cached status the poll owns")
|
||||
}
|
||||
|
||||
// Bounded: an antenna that never reports motion must not latch the transmit
|
||||
// inhibit on for ever.
|
||||
c.statusMu.Lock()
|
||||
c.moveCmdAt = time.Now().Add(-moveOptimisticWindow - time.Second)
|
||||
c.statusMu.Unlock()
|
||||
if st, _ := c.GetStatus(); st.MotorsMoving != 0 {
|
||||
t.Error("the optimistic window never expires")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user