gobot.io/x/gobot@v1.16.0/drivers/gpio/rgb_led_driver.go (about)

     1  package gpio
     2  
     3  import "gobot.io/x/gobot"
     4  
     5  // RgbLedDriver represents a digital RGB Led
     6  type RgbLedDriver struct {
     7  	pinRed     string
     8  	redColor   byte
     9  	pinGreen   string
    10  	greenColor byte
    11  	pinBlue    string
    12  	blueColor  byte
    13  	name       string
    14  	connection DigitalWriter
    15  	high       bool
    16  	gobot.Commander
    17  }
    18  
    19  // NewRgbLedDriver return a new RgbLedDriver given a DigitalWriter and
    20  // 3 pins: redPin, greenPin, and bluePin
    21  //
    22  // Adds the following API Commands:
    23  //	"SetRGB" - See RgbLedDriver.SetRGB
    24  //	"Toggle" - See RgbLedDriver.Toggle
    25  //	"On" - See RgbLedDriver.On
    26  //	"Off" - See RgbLedDriver.Off
    27  func NewRgbLedDriver(a DigitalWriter, redPin string, greenPin string, bluePin string) *RgbLedDriver {
    28  	l := &RgbLedDriver{
    29  		name:       gobot.DefaultName("RGBLED"),
    30  		pinRed:     redPin,
    31  		pinGreen:   greenPin,
    32  		pinBlue:    bluePin,
    33  		connection: a,
    34  		high:       false,
    35  		Commander:  gobot.NewCommander(),
    36  	}
    37  
    38  	l.AddCommand("SetRGB", func(params map[string]interface{}) interface{} {
    39  		r := byte(params["r"].(int))
    40  		g := byte(params["g"].(int))
    41  		b := byte(params["b"].(int))
    42  		return l.SetRGB(r, g, b)
    43  	})
    44  
    45  	l.AddCommand("Toggle", func(params map[string]interface{}) interface{} {
    46  		return l.Toggle()
    47  	})
    48  
    49  	l.AddCommand("On", func(params map[string]interface{}) interface{} {
    50  		return l.On()
    51  	})
    52  
    53  	l.AddCommand("Off", func(params map[string]interface{}) interface{} {
    54  		return l.Off()
    55  	})
    56  
    57  	return l
    58  }
    59  
    60  // Start implements the Driver interface
    61  func (l *RgbLedDriver) Start() (err error) { return }
    62  
    63  // Halt implements the Driver interface
    64  func (l *RgbLedDriver) Halt() (err error) { return }
    65  
    66  // Name returns the RGBLEDDrivers name
    67  func (l *RgbLedDriver) Name() string { return l.name }
    68  
    69  // SetName sets the RGBLEDDrivers name
    70  func (l *RgbLedDriver) SetName(n string) { l.name = n }
    71  
    72  // Pin returns the RgbLedDrivers pins
    73  func (l *RgbLedDriver) Pin() string { return "r=" + l.pinRed + ", g=" + l.pinGreen + ", b=" + l.pinBlue }
    74  
    75  // RedPin returns the RgbLedDrivers redPin
    76  func (l *RgbLedDriver) RedPin() string { return l.pinRed }
    77  
    78  // GreenPin returns the RgbLedDrivers redPin
    79  func (l *RgbLedDriver) GreenPin() string { return l.pinGreen }
    80  
    81  // BluePin returns the RgbLedDrivers bluePin
    82  func (l *RgbLedDriver) BluePin() string { return l.pinBlue }
    83  
    84  // Connection returns the RgbLedDriver Connection
    85  func (l *RgbLedDriver) Connection() gobot.Connection {
    86  	return l.connection.(gobot.Connection)
    87  }
    88  
    89  // State return true if the led is On and false if the led is Off
    90  func (l *RgbLedDriver) State() bool {
    91  	return l.high
    92  }
    93  
    94  // On sets the led's pins to their various states
    95  func (l *RgbLedDriver) On() (err error) {
    96  	if err = l.SetLevel(l.pinRed, l.redColor); err != nil {
    97  		return
    98  	}
    99  
   100  	if err = l.SetLevel(l.pinGreen, l.greenColor); err != nil {
   101  		return
   102  	}
   103  
   104  	if err = l.SetLevel(l.pinBlue, l.blueColor); err != nil {
   105  		return
   106  	}
   107  
   108  	l.high = true
   109  	return
   110  }
   111  
   112  // Off sets the led to black.
   113  func (l *RgbLedDriver) Off() (err error) {
   114  	if err = l.SetLevel(l.pinRed, 0); err != nil {
   115  		return
   116  	}
   117  
   118  	if err = l.SetLevel(l.pinGreen, 0); err != nil {
   119  		return
   120  	}
   121  
   122  	if err = l.SetLevel(l.pinBlue, 0); err != nil {
   123  		return
   124  	}
   125  
   126  	l.high = false
   127  	return
   128  }
   129  
   130  // Toggle sets the led to the opposite of it's current state
   131  func (l *RgbLedDriver) Toggle() (err error) {
   132  	if l.State() {
   133  		err = l.Off()
   134  	} else {
   135  		err = l.On()
   136  	}
   137  	return
   138  }
   139  
   140  // SetLevel sets the led to the specified color level
   141  func (l *RgbLedDriver) SetLevel(pin string, level byte) (err error) {
   142  	if writer, ok := l.connection.(PwmWriter); ok {
   143  		return writer.PwmWrite(pin, level)
   144  	}
   145  	return ErrPwmWriteUnsupported
   146  }
   147  
   148  // SetRGB sets the Red Green Blue value of the LED.
   149  func (l *RgbLedDriver) SetRGB(r, g, b byte) error {
   150  	l.redColor = r
   151  	l.greenColor = g
   152  	l.blueColor = b
   153  
   154  	return l.On()
   155  }