aboutsummaryrefslogtreecommitdiff
path: root/redbutton.go
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2015-05-21 18:50:45 +0200
committerDimitri Sokolyuk <demon@dim13.org>2015-05-21 18:50:45 +0200
commit1cb19c68d8ef3f525c0c051f60240b07054477a1 (patch)
tree9fc4f459358f17d6656fd549d92fc8bb9bee518f /redbutton.go
parentbbf61b753c77c76eb2b1afcd441bdb31c6fe19de (diff)
Convert into package
Diffstat (limited to 'redbutton.go')
-rw-r--r--redbutton.go55
1 files changed, 55 insertions, 0 deletions
diff --git a/redbutton.go b/redbutton.go
new file mode 100644
index 0000000..549ed9d
--- /dev/null
+++ b/redbutton.go
@@ -0,0 +1,55 @@
+package redbutton
+
+import (
+ "errors"
+ "time"
+
+ "github.com/GeertJohan/go.hid"
+)
+
+type Button struct {
+ Button bool
+ Lid bool
+}
+
+func GetState(dev *hid.Device) (Button, error) {
+ buf := make([]byte, 8)
+ buf[0] = 0x01
+ buf[7] = 0x02
+
+ if _, err := dev.Write(buf); err != nil {
+ return Button{}, err
+ }
+
+ if _, err := dev.ReadTimeout(buf, 200); err != nil {
+ return Button{}, err
+ }
+
+ if buf[7] != 0x03 {
+ return Button{}, errors.New("bad magic")
+ }
+
+ return Button{
+ buf[0]&(1<<0) == 0,
+ buf[0]&(1<<1) == 0,
+ }, nil
+}
+
+func PollState(dev *hid.Device) <-chan Button {
+ ch := make(chan Button)
+ go func() {
+ for {
+ state, err := GetState(dev)
+ if err != nil {
+ panic(err)
+ }
+ ch <- state
+ time.Sleep(100 * time.Millisecond)
+ }
+ }()
+ return ch
+}
+
+func Open() (*hid.Device, error) {
+ return hid.Open(0x1D34, 0x000D, "")
+}