/
wimatrix.go
70 lines (61 loc) · 1.34 KB
/
wimatrix.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package wimatrix
import (
"github.com/asaskevich/EventBus"
"github.com/eclipse/paho.mqtt.golang"
"github.com/foize/go.fifo"
"github.com/quan-to/slog"
"golang.org/x/image/colornames"
"image/color"
"time"
)
var log = slog.Scope("WiMatrix")
type Device struct {
name string
mq mqtt.Client
ev EventBus.Bus
lastColor color.Color
lastBGColor color.Color
eventQueue *fifo.Queue
running bool
currentMode Mode
lastBgBrightness float32
lastBrightness float32
}
func MakeWiiMatrix(name string, mq mqtt.Client, ev EventBus.Bus) *Device {
return &Device{
name: name,
mq: mq,
ev: ev,
lastColor: colornames.White,
lastBGColor: colornames.Black,
lastBgBrightness: 0,
lastBrightness: 0,
eventQueue: fifo.NewQueue(),
running: false,
currentMode: ModeClock,
}
}
func (d *Device) Start() {
d.subEventBus()
d.running = true
go d.eventLoop()
}
func (d *Device) Stop() {
d.running = false
d.unSubEventBus()
}
func (d *Device) putEvent(event event) {
d.eventQueue.Add(event)
}
func (d *Device) eventLoop() {
for d.running {
rawe := d.eventQueue.Next()
if rawe != nil {
e, ok := rawe.(event)
if ok && !e.Expired() {
d.processEvent(e)
}
}
time.Sleep(time.Millisecond)
}
}