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

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