aboutsummaryrefslogtreecommitdiff
path: root/blinkstick.go
blob: 34adedec0cb975c2ee65bfb024b3db8c2a53b28c (plain)
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
// Package blinckstick implements BlinkStick Stripe HID interface
package blinkstick

import (
	"image/color"
	"io"
)

/* Reports:
   1: LED Data [R, G, B]
   2: Name [Binary Data 0..32]
   3: Data [Binary Data 0..32]
   4: Mode set [MODE]: 0 - RGB LED Strip, 1 - Inverse RGB LED Strip, 2 - WS2812
   5: LED Data [CHANNEL, INDEX, R, G, B]
   6: LED Frame [Channel, [G, R, B][0..7]]
   7: LED Frame [Channel, [G, R, B][0..15]]
   8: LED Frame [Channel, [G, R, B][0..31]]
   9: LED Frame [Channel, [G, R, B][0..63]]
*/

// SetIndex sets color by index
func SetIndex(w io.Writer, i int, c color.Color) {
	if c == nil {
		c = color.Black
	}
	r, g, b, _ := c.RGBA()
	w.Write([]byte{5, 0, uint8(i), uint8(r >> 8), uint8(g >> 8), uint8(b >> 8)})
}

func Set(w io.Writer, colors ...color.Color) {
	var buf []byte
	switch {
	case len(colors) <= 8:
		buf = make([]byte, 3*8+2)
		buf[0] = 6
	case len(colors) <= 16:
		buf = make([]byte, 3*16+2)
		buf[0] = 7
	case len(colors) <= 32:
		buf = make([]byte, 3*32+2)
		buf[0] = 8
	case len(colors) <= 64:
		buf = make([]byte, 3*64+2)
		buf[0] = 9
	default:
		panic("too many colors")
	}
	for i, c := range colors {
		if c == nil {
			c = color.Black
		}
		r, g, b, _ := c.RGBA()
		buf[3*i+2] = uint8(g >> 8)
		buf[3*i+3] = uint8(r >> 8)
		buf[3*i+4] = uint8(b >> 8)
	}
	w.Write(buf)
}

// SetAll sets all (8) LEDs to same color
func SetAll(w io.Writer, c color.Color) {
	Set(w, c, c, c, c, c, c, c, c)
}

// Off all LEDs
func Off(w io.Writer) {
	SetAll(w, color.Black)
}