From aa3b01dd78ef2f9174152e58bd75a3b3d9de79b3 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Thu, 7 Sep 2017 12:00:42 +0200 Subject: PollInterval --- cmd/poll/main.go | 2 +- cmd/runcmd/main.go | 2 +- redbutton.go | 33 ++++++++++++++++++++------------- 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/cmd/poll/main.go b/cmd/poll/main.go index 6e2dd10..95be209 100644 --- a/cmd/poll/main.go +++ b/cmd/poll/main.go @@ -14,7 +14,7 @@ func main() { } defer dev.Close() - for state := range redbutton.Poll(dev) { + for state := range redbutton.Poll(dev, redbutton.PollInterval) { fmt.Println(state) } } diff --git a/cmd/runcmd/main.go b/cmd/runcmd/main.go index e01bb04..7832742 100644 --- a/cmd/runcmd/main.go +++ b/cmd/runcmd/main.go @@ -54,7 +54,7 @@ func main() { } defer dev.Close() - state := redbutton.Poll(dev) + state := redbutton.Poll(dev, redbutton.PollInterval) for stateFn := Init; stateFn != nil; { stateFn = stateFn(<-state) } diff --git a/redbutton.go b/redbutton.go index 5c6091f..911f16d 100644 --- a/redbutton.go +++ b/redbutton.go @@ -10,8 +10,9 @@ import ( ) const ( - vendor = 0x1d34 - product = 0x000d + vendor = 0x1d34 + product = 0x000d + PollInterval = 200 * time.Millisecond ) type Button int @@ -23,37 +24,43 @@ const ( Armed ) -func State(dev *hid.Device) (Button, bool) { +func State(dev *hid.Device) (Button, error) { buf := make([]byte, 8) buf[0] = 0x01 buf[7] = 0x02 if _, err := dev.Write(buf); err != nil { - return Unknown, false + return Unknown, err } if _, err := dev.Read(buf); err != nil { - return Unknown, false + return Unknown, err } if buf[7] != 0x03 { - return Unknown, false + return Unknown, nil } - return Button(buf[0] & 0x03), true + return Button(buf[0] & 0x03), nil } -func Poll(dev *hid.Device) <-chan Button { +func Poll(dev *hid.Device, d time.Duration) <-chan Button { + if d == 0 { + d = PollInterval + } ch := make(chan Button) go func() { prev := Unknown - tick := time.NewTicker(200 * time.Millisecond) + tick := time.NewTicker(d) defer tick.Stop() + defer close(ch) for range tick.C { - if state, ok := State(dev); ok { - if state != prev { - ch <- state - } + state, err := State(dev) + if err != nil { + return + } + if state != prev { + ch <- state prev = state } } -- cgit v1.2.3