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  }