From c75830c3931bfe1338788d186cd3f1e00ef2abd6 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Thu, 21 May 2015 19:13:25 +0200 Subject: Restructure Button type, emit only on state change --- redbutton.go | 47 ++++++++++++++++++++++++++++++++++------------- 1 file 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, "") } -- cgit v1.2.3