aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2015-05-21 19:13:25 +0200
committerDimitri Sokolyuk <demon@dim13.org>2015-05-21 19:13:25 +0200
commitc75830c3931bfe1338788d186cd3f1e00ef2abd6 (patch)
tree6c7739274b4ab960d09274e5ea9dc2ca6b0e1e26
parent302c86fa8056fc91ecb09cf0b4a129a3d8288392 (diff)
Restructure Button type, emit only on state change
-rw-r--r--redbutton.go47
1 files changed, 34 insertions, 13 deletions
diff --git a/redbutton.go b/redbutton.go
index a0e069c..452d09c 100644
--- a/redbutton.go
+++ b/redbutton.go
@@ -7,9 +7,29 @@ import (
"github.com/GeertJohan/go.hid"
)
-type Button struct {
- Button bool
- Lid bool
+const (
+ vendor = 0x1d34
+ product = 0x000d
+)
+
+type Button int
+
+const (
+ Unknown Button = iota
+ Closed
+ Pressed
+ Armed
+)
+
+var state = map[Button]string{
+ Unknown: "Unknown",
+ Closed: "Closed",
+ Pressed: "Pressed",
+ Armed: "Armed",
+}
+
+func (b Button) String() string {
+ return state[b]
}
func State(dev *hid.Device) (Button, error) {
@@ -18,32 +38,33 @@ func State(dev *hid.Device) (Button, error) {
buf[7] = 0x02
if _, err := dev.Write(buf); err != nil {
- return Button{}, err
+ return Unknown, err
}
- if _, err := dev.ReadTimeout(buf, 200); err != nil {
- return Button{}, err
+ if _, err := dev.ReadTimeout(buf, 10); err != nil {
+ return Unknown, err
}
if buf[7] != 0x03 {
- return Button{}, errors.New("bad magic")
+ return Unknown, errors.New("bad magic")
}
- return Button{
- buf[0]&(1<<0) == 0,
- buf[0]&(1<<1) == 0,
- }, nil
+ return Button(buf[0] & 0x03), nil
}
func Poll(dev *hid.Device) <-chan Button {
ch := make(chan Button)
go func() {
+ prev := Unknown
for {
state, err := State(dev)
if err != nil {
panic(err)
}
- ch <- state
+ if state != prev {
+ ch <- state
+ }
+ prev = state
time.Sleep(100 * time.Millisecond)
}
}()
@@ -51,5 +72,5 @@ func Poll(dev *hid.Device) <-chan Button {
}
func Open() (*hid.Device, error) {
- return hid.Open(0x1D34, 0x000D, "")
+ return hid.Open(vendor, product, "")
}