From aa3b01dd78ef2f9174152e58bd75a3b3d9de79b3 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Thu, 7 Sep 2017 12:00:42 +0200 Subject: PollInterval --- redbutton.go | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) (limited to 'redbutton.go') 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