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  }