2014-04-27 18:54:41 -07:00
|
|
|
package i2c
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
)
|
|
|
|
|
2022-12-10 13:10:23 +01:00
|
|
|
const blinkmDefaultAddress = 0x09
|
2015-07-03 18:57:29 -07:00
|
|
|
|
2016-12-20 18:59:26 +01:00
|
|
|
// BlinkMDriver is a Gobot Driver for a BlinkM LED
|
2014-04-27 18:54:41 -07:00
|
|
|
type BlinkMDriver struct {
|
2022-12-10 13:10:23 +01:00
|
|
|
*Driver
|
2014-04-27 18:54:41 -07:00
|
|
|
}
|
|
|
|
|
2016-09-25 14:08:18 +02:00
|
|
|
// NewBlinkMDriver creates a new BlinkMDriver.
|
2014-10-20 12:42:01 -05:00
|
|
|
//
|
2017-02-09 16:47:11 +01:00
|
|
|
// Params:
|
2022-12-10 13:10:23 +01:00
|
|
|
// c Connector - the Adaptor to use with this Driver
|
2017-02-09 16:47:11 +01:00
|
|
|
//
|
|
|
|
// Optional params:
|
2017-02-10 11:08:32 +01:00
|
|
|
// i2c.WithBus(int): bus to use with this driver
|
|
|
|
// i2c.WithAddress(int): address to use with this driver
|
2017-02-09 16:47:11 +01:00
|
|
|
//
|
2022-12-10 13:10:23 +01:00
|
|
|
func NewBlinkMDriver(c Connector, options ...func(Config)) *BlinkMDriver {
|
2014-06-11 18:59:30 -07:00
|
|
|
b := &BlinkMDriver{
|
2022-12-10 13:10:23 +01:00
|
|
|
Driver: NewDriver(c, "BlinkM", blinkmDefaultAddress),
|
2017-02-09 09:41:12 +01:00
|
|
|
}
|
2022-12-10 13:10:23 +01:00
|
|
|
b.afterStart = b.initialize
|
2017-02-09 09:41:12 +01:00
|
|
|
|
|
|
|
for _, option := range options {
|
|
|
|
option(b)
|
2014-04-27 18:54:41 -07:00
|
|
|
}
|
2014-06-11 18:59:30 -07:00
|
|
|
|
2014-07-09 18:32:27 -07:00
|
|
|
b.AddCommand("Rgb", func(params map[string]interface{}) interface{} {
|
2014-06-11 18:59:30 -07:00
|
|
|
red := byte(params["red"].(float64))
|
|
|
|
green := byte(params["green"].(float64))
|
|
|
|
blue := byte(params["blue"].(float64))
|
2014-11-19 16:56:48 -08:00
|
|
|
return b.Rgb(red, green, blue)
|
2014-06-11 18:59:30 -07:00
|
|
|
})
|
2017-02-10 11:08:32 +01:00
|
|
|
|
2014-07-09 18:32:27 -07:00
|
|
|
b.AddCommand("Fade", func(params map[string]interface{}) interface{} {
|
2014-06-11 18:59:30 -07:00
|
|
|
red := byte(params["red"].(float64))
|
|
|
|
green := byte(params["green"].(float64))
|
|
|
|
blue := byte(params["blue"].(float64))
|
2014-11-19 16:56:48 -08:00
|
|
|
return b.Fade(red, green, blue)
|
2014-06-11 18:59:30 -07:00
|
|
|
})
|
2017-02-10 11:08:32 +01:00
|
|
|
|
2014-09-11 15:38:08 -05:00
|
|
|
b.AddCommand("FirmwareVersion", func(params map[string]interface{}) interface{} {
|
2014-11-19 16:56:48 -08:00
|
|
|
version, err := b.FirmwareVersion()
|
|
|
|
return map[string]interface{}{"version": version, "err": err}
|
2014-09-11 15:38:08 -05:00
|
|
|
})
|
2017-02-10 11:08:32 +01:00
|
|
|
|
2014-09-11 15:38:08 -05:00
|
|
|
b.AddCommand("Color", func(params map[string]interface{}) interface{} {
|
2014-11-19 16:56:48 -08:00
|
|
|
color, err := b.Color()
|
|
|
|
return map[string]interface{}{"color": color, "err": err}
|
2014-09-11 15:38:08 -05:00
|
|
|
})
|
2014-06-11 18:59:30 -07:00
|
|
|
|
|
|
|
return b
|
2014-04-27 18:54:41 -07:00
|
|
|
}
|
2016-12-20 18:59:26 +01:00
|
|
|
|
2014-10-20 12:42:01 -05:00
|
|
|
// Rgb sets color using r,g,b params
|
2014-11-19 16:56:48 -08:00
|
|
|
func (b *BlinkMDriver) Rgb(red byte, green byte, blue byte) (err error) {
|
2017-02-06 00:19:42 +01:00
|
|
|
if _, err = b.connection.Write([]byte("n")); err != nil {
|
2014-11-19 16:56:48 -08:00
|
|
|
return
|
|
|
|
}
|
2017-02-06 00:19:42 +01:00
|
|
|
_, err = b.connection.Write([]byte{red, green, blue})
|
2014-11-19 16:56:48 -08:00
|
|
|
return
|
2014-04-27 18:54:41 -07:00
|
|
|
}
|
|
|
|
|
2014-10-20 12:42:01 -05:00
|
|
|
// Fade removes color using r,g,b params
|
2014-11-19 16:56:48 -08:00
|
|
|
func (b *BlinkMDriver) Fade(red byte, green byte, blue byte) (err error) {
|
2017-02-06 00:19:42 +01:00
|
|
|
if _, err = b.connection.Write([]byte("c")); err != nil {
|
2014-11-19 16:56:48 -08:00
|
|
|
return
|
|
|
|
}
|
2017-02-06 00:19:42 +01:00
|
|
|
_, err = b.connection.Write([]byte{red, green, blue})
|
2014-11-19 16:56:48 -08:00
|
|
|
return
|
2014-04-27 18:54:41 -07:00
|
|
|
}
|
|
|
|
|
2014-10-20 12:42:01 -05:00
|
|
|
// FirmwareVersion returns version with MAYOR.minor format
|
2014-11-19 16:56:48 -08:00
|
|
|
func (b *BlinkMDriver) FirmwareVersion() (version string, err error) {
|
2017-02-06 00:19:42 +01:00
|
|
|
if _, err = b.connection.Write([]byte("Z")); err != nil {
|
2014-11-19 16:56:48 -08:00
|
|
|
return
|
|
|
|
}
|
2017-02-06 00:19:42 +01:00
|
|
|
data := []byte{0, 0}
|
|
|
|
read, err := b.connection.Read(data)
|
|
|
|
if read != 2 || err != nil {
|
2014-11-19 16:56:48 -08:00
|
|
|
return
|
2014-04-27 18:54:41 -07:00
|
|
|
}
|
2014-11-19 16:56:48 -08:00
|
|
|
return fmt.Sprintf("%v.%v", data[0], data[1]), nil
|
2014-04-27 18:54:41 -07:00
|
|
|
}
|
|
|
|
|
2014-10-20 12:42:01 -05:00
|
|
|
// Color returns an array with current rgb color
|
2014-11-19 16:56:48 -08:00
|
|
|
func (b *BlinkMDriver) Color() (color []byte, err error) {
|
2017-02-06 00:19:42 +01:00
|
|
|
if _, err = b.connection.Write([]byte("g")); err != nil {
|
2014-11-19 16:56:48 -08:00
|
|
|
return
|
|
|
|
}
|
2017-02-06 00:19:42 +01:00
|
|
|
data := []byte{0, 0, 0}
|
|
|
|
read, err := b.connection.Read(data)
|
|
|
|
if read != 3 || err != nil {
|
2014-11-19 16:56:48 -08:00
|
|
|
return []byte{}, err
|
2014-04-27 18:54:41 -07:00
|
|
|
}
|
2014-11-19 16:56:48 -08:00
|
|
|
return []byte{data[0], data[1], data[2]}, nil
|
2014-04-27 18:54:41 -07:00
|
|
|
}
|
2022-12-10 13:10:23 +01:00
|
|
|
|
|
|
|
func (b *BlinkMDriver) initialize() error {
|
|
|
|
if _, err := b.connection.Write([]byte("o")); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|