gobot.io/x/gobot@v1.16.0/drivers/gpio/makey_button_driver.go (about) 1 package gpio 2 3 import ( 4 "time" 5 6 "gobot.io/x/gobot" 7 ) 8 9 // MakeyButtonDriver Represents a Makey Button 10 type MakeyButtonDriver struct { 11 name string 12 pin string 13 halt chan bool 14 connection DigitalReader 15 Active bool 16 interval time.Duration 17 gobot.Eventer 18 } 19 20 // NewMakeyButtonDriver returns a new MakeyButtonDriver with a polling interval of 21 // 10 Milliseconds given a DigitalReader and pin. 22 // 23 // Optionally accepts: 24 // time.Duration: Interval at which the ButtonDriver is polled for new information 25 func NewMakeyButtonDriver(a DigitalReader, pin string, v ...time.Duration) *MakeyButtonDriver { 26 m := &MakeyButtonDriver{ 27 name: gobot.DefaultName("MakeyButton"), 28 connection: a, 29 pin: pin, 30 Active: false, 31 Eventer: gobot.NewEventer(), 32 interval: 10 * time.Millisecond, 33 halt: make(chan bool), 34 } 35 36 if len(v) > 0 { 37 m.interval = v[0] 38 } 39 40 m.AddEvent(Error) 41 m.AddEvent(ButtonPush) 42 m.AddEvent(ButtonRelease) 43 44 return m 45 } 46 47 // Name returns the MakeyButtonDrivers name 48 func (b *MakeyButtonDriver) Name() string { return b.name } 49 50 // SetName sets the MakeyButtonDrivers name 51 func (b *MakeyButtonDriver) SetName(n string) { b.name = n } 52 53 // Pin returns the MakeyButtonDrivers pin 54 func (b *MakeyButtonDriver) Pin() string { return b.pin } 55 56 // Connection returns the MakeyButtonDrivers Connection 57 func (b *MakeyButtonDriver) Connection() gobot.Connection { return b.connection.(gobot.Connection) } 58 59 // Start starts the MakeyButtonDriver and polls the state of the button at the given interval. 60 // 61 // Emits the Events: 62 // Push int - On button push 63 // Release int - On button release 64 // Error error - On button error 65 func (b *MakeyButtonDriver) Start() (err error) { 66 state := 1 67 go func() { 68 timer := time.NewTimer(b.interval) 69 timer.Stop() 70 for { 71 newValue, err := b.connection.DigitalRead(b.Pin()) 72 if err != nil { 73 b.Publish(Error, err) 74 } else if newValue != state && newValue != -1 { 75 state = newValue 76 if newValue == 0 { 77 b.Active = true 78 b.Publish(ButtonPush, newValue) 79 } else { 80 b.Active = false 81 b.Publish(ButtonRelease, newValue) 82 } 83 } 84 timer.Reset(b.interval) 85 select { 86 case <-timer.C: 87 case <-b.halt: 88 return 89 } 90 } 91 }() 92 return 93 } 94 95 // Halt stops polling the makey button for new information 96 func (b *MakeyButtonDriver) Halt() (err error) { 97 b.halt <- true 98 return 99 }