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