gobot.io/x/gobot/v2@v2.1.0/drivers/gpio/direct_pin_driver.go (about)

     1  package gpio
     2  
     3  import (
     4  	"strconv"
     5  
     6  	"gobot.io/x/gobot/v2"
     7  )
     8  
     9  // DirectPinDriver represents a GPIO pin
    10  type DirectPinDriver struct {
    11  	name       string
    12  	pin        string
    13  	connection gobot.Connection
    14  	gobot.Commander
    15  }
    16  
    17  // NewDirectPinDriver return a new DirectPinDriver given a Connection and pin.
    18  //
    19  // Adds the following API Commands:
    20  //
    21  //	"DigitalRead" - See DirectPinDriver.DigitalRead
    22  //	"DigitalWrite" - See DirectPinDriver.DigitalWrite
    23  //	"PwmWrite" - See DirectPinDriver.PwmWrite
    24  //	"ServoWrite" - See DirectPinDriver.ServoWrite
    25  func NewDirectPinDriver(a gobot.Connection, pin string) *DirectPinDriver {
    26  	d := &DirectPinDriver{
    27  		name:       gobot.DefaultName("DirectPin"),
    28  		connection: a,
    29  		pin:        pin,
    30  		Commander:  gobot.NewCommander(),
    31  	}
    32  
    33  	d.AddCommand("DigitalRead", func(params map[string]interface{}) interface{} {
    34  		val, err := d.DigitalRead()
    35  		return map[string]interface{}{"val": val, "err": err}
    36  	})
    37  	d.AddCommand("DigitalWrite", func(params map[string]interface{}) interface{} {
    38  		level, _ := strconv.Atoi(params["level"].(string))
    39  		return d.DigitalWrite(byte(level))
    40  	})
    41  	d.AddCommand("PwmWrite", func(params map[string]interface{}) interface{} {
    42  		level, _ := strconv.Atoi(params["level"].(string))
    43  		return d.PwmWrite(byte(level))
    44  	})
    45  	d.AddCommand("ServoWrite", func(params map[string]interface{}) interface{} {
    46  		level, _ := strconv.Atoi(params["level"].(string))
    47  		return d.ServoWrite(byte(level))
    48  	})
    49  
    50  	return d
    51  }
    52  
    53  // Name returns the DirectPinDrivers name
    54  func (d *DirectPinDriver) Name() string { return d.name }
    55  
    56  // SetName sets the DirectPinDrivers name
    57  func (d *DirectPinDriver) SetName(n string) { d.name = n }
    58  
    59  // Pin returns the DirectPinDrivers pin
    60  func (d *DirectPinDriver) Pin() string { return d.pin }
    61  
    62  // Connection returns the DirectPinDrivers Connection
    63  func (d *DirectPinDriver) Connection() gobot.Connection { return d.connection }
    64  
    65  // Start implements the Driver interface
    66  func (d *DirectPinDriver) Start() (err error) { return }
    67  
    68  // Halt implements the Driver interface
    69  func (d *DirectPinDriver) Halt() (err error) { return }
    70  
    71  // Off turn off pin
    72  func (d *DirectPinDriver) Off() (err error) {
    73  	if writer, ok := d.Connection().(DigitalWriter); ok {
    74  		return writer.DigitalWrite(d.Pin(), byte(0))
    75  	}
    76  	err = ErrDigitalWriteUnsupported
    77  	return
    78  }
    79  
    80  // On turn on pin
    81  func (d *DirectPinDriver) On() (err error) {
    82  	if writer, ok := d.Connection().(DigitalWriter); ok {
    83  		return writer.DigitalWrite(d.Pin(), byte(1))
    84  	}
    85  	err = ErrDigitalWriteUnsupported
    86  	return
    87  }
    88  
    89  // DigitalRead returns the current digital state of the pin
    90  func (d *DirectPinDriver) DigitalRead() (val int, err error) {
    91  	if reader, ok := d.Connection().(DigitalReader); ok {
    92  		return reader.DigitalRead(d.Pin())
    93  	}
    94  	err = ErrDigitalReadUnsupported
    95  	return
    96  }
    97  
    98  // DigitalWrite writes to the pin. Acceptable values are 1 or 0
    99  func (d *DirectPinDriver) DigitalWrite(level byte) (err error) {
   100  	if writer, ok := d.Connection().(DigitalWriter); ok {
   101  		return writer.DigitalWrite(d.Pin(), level)
   102  	}
   103  	err = ErrDigitalWriteUnsupported
   104  	return
   105  }
   106  
   107  // PwmWrite writes the 0-254 value to the specified pin
   108  func (d *DirectPinDriver) PwmWrite(level byte) (err error) {
   109  	if writer, ok := d.Connection().(PwmWriter); ok {
   110  		return writer.PwmWrite(d.Pin(), level)
   111  	}
   112  	err = ErrPwmWriteUnsupported
   113  	return
   114  }
   115  
   116  // ServoWrite writes value to the specified pin
   117  func (d *DirectPinDriver) ServoWrite(level byte) (err error) {
   118  	if writer, ok := d.Connection().(ServoWriter); ok {
   119  		return writer.ServoWrite(d.Pin(), level)
   120  	}
   121  	err = ErrServoWriteUnsupported
   122  	return
   123  }