Skip to content

Commit 030eb05

Browse files
committed
Add rgb driver
1 parent 700455b commit 030eb05

File tree

4 files changed

+135
-6
lines changed

4 files changed

+135
-6
lines changed

driver/direct.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,13 @@ func (d *directDriver) write() error {
3030

3131
func (d *directDriver) HandleMessage(action string, params map[string]interface{}) error {
3232
switch action {
33-
case "on":
33+
case cmdOn:
3434
d.state = true
3535

36-
case "off":
36+
case cmdOff:
3737
d.state = false
3838

39-
case "write":
39+
case cmdWrite:
4040
val := params["power"]
4141
if val == nil {
4242
return errors.New("Missing parameter 'power'")

driver/driver.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,13 @@ import (
55

66
"github.com/xanecs/lighthouse/config"
77
"gobot.io/x/gobot"
8+
"gobot.io/x/gobot/drivers/gpio"
9+
)
10+
11+
const (
12+
cmdOn = "on"
13+
cmdOff = "off"
14+
cmdWrite = "write"
815
)
916

1017
// Device represents a device that can handle messages
@@ -23,6 +30,13 @@ func NewDriver(cfg config.DeviceConfig, connection gobot.Connection) (Device, er
2330
case "pwm":
2431
return newPwmDriver(cfg, connection)
2532

33+
case "rgb":
34+
dd, ok := connection.(gpio.DigitalWriter)
35+
if !ok {
36+
return nil, errors.New("rgb mode is not supported on this board")
37+
}
38+
return newRgbDriver(cfg, dd)
39+
2640
default:
2741
return nil, errors.New("Invalid mode")
2842
}

driver/pwm.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ type pwmDriver struct {
1818

1919
func (p *pwmDriver) write() error {
2020
if !p.power {
21+
if p.inverted {
22+
return p.driver.PwmWrite(255)
23+
}
2124
return p.driver.Off()
2225
}
2326
brightness := p.brightness
@@ -29,10 +32,10 @@ func (p *pwmDriver) write() error {
2932

3033
func (p *pwmDriver) HandleMessage(action string, params map[string]interface{}) error {
3134
switch action {
32-
case "on":
35+
case cmdOn:
3336
p.power = true
3437

35-
case "off":
38+
case cmdOff:
3639
p.power = false
3740

3841
case "brightness":
@@ -46,7 +49,7 @@ func (p *pwmDriver) HandleMessage(action string, params map[string]interface{})
4649
}
4750
p.brightness = uint8(255 * brightness)
4851

49-
case "write":
52+
case cmdWrite:
5053
val := params["power"]
5154
if val == nil {
5255
return errors.New("Missing parameter 'power'")

driver/rgb.go

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package driver
2+
3+
import (
4+
"errors"
5+
6+
"github.com/xanecs/lighthouse/config"
7+
8+
"gobot.io/x/gobot"
9+
"gobot.io/x/gobot/drivers/gpio"
10+
)
11+
12+
type rgbDriver struct {
13+
driver *gpio.RgbLedDriver
14+
inverted bool
15+
power bool
16+
color color
17+
}
18+
19+
type color struct {
20+
red byte
21+
green byte
22+
blue byte
23+
}
24+
25+
func (r *rgbDriver) write() error {
26+
if !r.power {
27+
if r.inverted {
28+
return r.driver.SetRGB(255, 255, 255)
29+
}
30+
return r.driver.Off()
31+
}
32+
if r.inverted {
33+
return r.driver.SetRGB(255-r.color.red, 255-r.color.green, 255-r.color.blue)
34+
}
35+
return r.driver.SetRGB(r.color.red, r.color.green, r.color.blue)
36+
}
37+
38+
func (r *rgbDriver) HandleMessage(action string, params map[string]interface{}) error {
39+
switch action {
40+
case cmdOn:
41+
r.power = true
42+
43+
case cmdOff:
44+
r.power = false
45+
46+
case "color":
47+
newColor, err := parseColor(params)
48+
if err != nil {
49+
return err
50+
}
51+
r.color = newColor
52+
53+
case cmdWrite:
54+
val := params["power"]
55+
if val == nil {
56+
return errors.New("Missing parameter 'power'")
57+
}
58+
power, ok := val.(bool)
59+
if !ok {
60+
return errors.New("Invalid parameter 'power'")
61+
}
62+
63+
newColor, err := parseColor(params)
64+
if err != nil {
65+
return err
66+
}
67+
68+
r.power = power
69+
r.color = newColor
70+
}
71+
return r.write()
72+
}
73+
74+
func (r *rgbDriver) Status() map[string]interface{} {
75+
return map[string]interface{}{"power": r.power, "color": r.color}
76+
}
77+
78+
func (r *rgbDriver) Driver() gobot.Device {
79+
return r.driver
80+
}
81+
82+
func parseColor(params map[string]interface{}) (color, error) {
83+
valR := params["red"]
84+
valG := params["green"]
85+
valB := params["blue"]
86+
87+
if valR == nil || valG == nil || valB == nil {
88+
return color{}, errors.New("Missing color parameters")
89+
}
90+
91+
red, okR := valR.(byte)
92+
green, okG := valG.(byte)
93+
blue, okB := valB.(byte)
94+
95+
if !(okR && okG && okB) {
96+
return color{}, errors.New("Invalid color parameters")
97+
}
98+
99+
return color{red, green, blue}, nil
100+
}
101+
102+
func newRgbDriver(cfg config.DeviceConfig, connection gpio.DigitalWriter) (*rgbDriver, error) {
103+
if len(cfg.Pins) != 3 {
104+
return nil, errors.New("Invalid number of pins")
105+
}
106+
return &rgbDriver{
107+
driver: gpio.NewRgbLedDriver(connection, cfg.Pins[0], cfg.Pins[1], cfg.Pins[2]),
108+
inverted: cfg.Inverted,
109+
power: false,
110+
color: color{255, 255, 255},
111+
}, nil
112+
}

0 commit comments

Comments
 (0)