Files
qrun/cmd/decktest/main.go

107 lines
2.3 KiB
Go
Raw Permalink Normal View History

package main
import (
"fmt"
"image/color"
"os"
"os/signal"
"syscall"
"qrun/lib/streamdeck"
)
var palette = []color.RGBA{
{220, 50, 50, 255},
{50, 180, 50, 255},
{50, 100, 220, 255},
{220, 160, 30, 255},
{180, 50, 180, 255},
{50, 180, 180, 255},
{220, 120, 50, 255},
{100, 100, 200, 255},
}
func main() {
dev, err := streamdeck.Open()
if err != nil {
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
os.Exit(1)
}
defer dev.Close()
model := dev.Model()
fmt.Printf("Connected to: %s (%s, serial: %s)\n", dev.Product(), model.Name, dev.SerialNumber())
fmt.Printf("Keys: %d (%dx%d), Encoders: %d\n", model.Keys, model.KeyCols, model.KeyRows, model.Encoders)
dev.SetBrightness(80)
keyLabels := make([]string, model.Keys)
for i := range keyLabels {
if i < 8 {
keyLabels[i] = string(rune('1' + i))
} else {
keyLabels[i] = string(rune('A' + i - 8))
}
}
drawKey := func(key int, active bool) {
col := key % model.KeyCols
bg := palette[col%len(palette)]
if !active {
bg = color.RGBA{bg.R / 3, bg.G / 3, bg.B / 3, 255}
}
dev.SetKeyText(key, bg, color.White, keyLabels[key])
}
for i := 0; i < model.Keys; i++ {
drawKey(i, false)
}
if model.LCDWidth > 0 {
dev.SetLCDColor(0, 0, model.LCDWidth, model.LCDHeight, color.RGBA{30, 30, 30, 255})
}
active := make([]bool, model.Keys)
input := make(chan streamdeck.InputEvent, 64)
go func() {
if err := dev.ReadInput(input); err != nil {
fmt.Fprintf(os.Stderr, "Read error: %v\n", err)
}
}()
sig := make(chan os.Signal, 1)
signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM)
for {
select {
case ev := <-input:
if ev.Key != nil && ev.Key.Pressed {
k := ev.Key.Key
active[k] = !active[k]
drawKey(k, active[k])
fmt.Printf("Key %s toggled %v\n", keyLabels[k], active[k])
}
if ev.Encoder != nil {
e := ev.Encoder
if e.Delta != 0 {
fmt.Printf("Encoder %d rotated %+d\n", e.Encoder, e.Delta)
} else {
fmt.Printf("Encoder %d pressed=%v\n", e.Encoder, e.Pressed)
}
}
if ev.Touch != nil {
t := ev.Touch
if t.Type == streamdeck.TouchSwipe {
fmt.Printf("Touch swipe (%d,%d) -> (%d,%d)\n", t.X, t.Y, t.X2, t.Y2)
} else {
fmt.Printf("Touch %v at (%d,%d)\n", t.Type, t.X, t.Y)
}
}
case <-sig:
fmt.Println()
return
}
}
}