aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2017-09-07 12:00:42 +0200
committerDimitri Sokolyuk <demon@dim13.org>2017-09-07 12:00:42 +0200
commitaa3b01dd78ef2f9174152e58bd75a3b3d9de79b3 (patch)
tree51b99cbec098ff2a5d5f18b6b6f08b07ac1baa3f
parent36810d344b000de50a1d4fbba53587a72f68bcae (diff)
PollInterval
-rw-r--r--cmd/poll/main.go2
-rw-r--r--cmd/runcmd/main.go2
-rw-r--r--redbutton.go33
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
}
}