hwinfo-streamdeck/internal/app/hwinfostreamdeckplugin/handlers.go

273 lines
7.5 KiB
Go
Raw Normal View History

2023-10-31 20:16:41 -04:00
package hwinfostreamdeckplugin
import (
"fmt"
"image/color"
"strconv"
hwsensorsservice "github.com/shayne/hwinfo-streamdeck/pkg/service"
"github.com/shayne/hwinfo-streamdeck/pkg/streamdeck"
)
func (p *Plugin) handleSensorSelect(event *streamdeck.EvSendToPlugin, sdpi *evSdpiCollection) error {
sensorid := sdpi.Value
readings, err := p.hw.ReadingsForSensorID(sensorid)
if err != nil {
return fmt.Errorf("handleSensorSelect ReadingsBySensor failed: %v", err)
}
evreadings := []*evSendReadingsPayloadReading{}
for _, r := range readings {
evreadings = append(evreadings, &evSendReadingsPayloadReading{ID: r.ID(), Label: r.Label(), Prefix: r.Unit()})
}
settings, err := p.am.getSettings(event.Context)
if err != nil {
return fmt.Errorf("handleReadingSelect getSettings: %v", err)
}
// only update settings if SensorUID is changing
// this covers case where PI sends event when tile
// selected in SD UI
if settings.SensorUID != sensorid {
settings.SensorUID = sensorid
settings.ReadingID = 0
settings.IsValid = false
}
payload := evSendReadingsPayload{Readings: evreadings, Settings: &settings}
err = p.sd.SendToPropertyInspector(event.Action, event.Context, payload)
if err != nil {
return fmt.Errorf("sensorsSelect SendToPropertyInspector: %v", err)
}
err = p.sd.SetSettings(event.Context, &settings)
if err != nil {
return fmt.Errorf("handleSensorSelect SetSettings: %v", err)
}
p.am.SetAction(event.Action, event.Context, &settings)
return nil
}
func getDefaultMinMaxForReading(r hwsensorsservice.Reading) (int, int) {
switch r.Unit() {
case "%":
return 0, 100
case "Yes/No":
return 0, 1
}
min := r.ValueMin()
max := r.ValueMax()
min -= min * .2
if min <= 0 {
min = 0.
}
max += max * .2
return int(min), int(max)
}
func (p *Plugin) handleReadingSelect(event *streamdeck.EvSendToPlugin, sdpi *evSdpiCollection) error {
rid64, err := strconv.ParseInt(sdpi.Value, 10, 32)
if err != nil {
return fmt.Errorf("handleReadingSelect Atoi failed: %s, %v", sdpi.Value, err)
}
rid := int32(rid64)
settings, err := p.am.getSettings(event.Context)
if err != nil {
return fmt.Errorf("handleReadingSelect getSettings: %v", err)
}
// no action if reading didn't change
if settings.ReadingID == rid {
return nil
}
settings.ReadingID = rid
// set default min/max
r, err := p.getReading(settings.SensorUID, settings.ReadingID)
if err != nil {
return fmt.Errorf("handleReadingSelect getReading: %v", err)
}
g, ok := p.graphs[event.Context]
if !ok {
return fmt.Errorf("handleReadingSelect no graph for context: %s", event.Context)
}
defaultMin, defaultMax := getDefaultMinMaxForReading(r)
settings.Min = defaultMin
g.SetMin(settings.Min)
settings.Max = defaultMax
g.SetMax(settings.Max)
settings.IsValid = true // set IsValid once we choose reading
err = p.sd.SetSettings(event.Context, &settings)
if err != nil {
return fmt.Errorf("handleReadingSelect SetSettings: %v", err)
}
p.am.SetAction(event.Action, event.Context, &settings)
return nil
}
func (p *Plugin) handleSetMin(event *streamdeck.EvSendToPlugin, sdpi *evSdpiCollection) error {
min, err := strconv.Atoi(sdpi.Value)
if err != nil {
return fmt.Errorf("handleSetMin strconv: %v", err)
}
g, ok := p.graphs[event.Context]
if !ok {
return fmt.Errorf("handleSetMax no graph for context: %s", event.Context)
}
g.SetMin(min)
settings, err := p.am.getSettings(event.Context)
if err != nil {
return fmt.Errorf("handleSetMin getSettings: %v", err)
}
settings.Min = min
err = p.sd.SetSettings(event.Context, &settings)
if err != nil {
return fmt.Errorf("handleSetMin SetSettings: %v", err)
}
p.am.SetAction(event.Action, event.Context, &settings)
return nil
}
func (p *Plugin) handleSetMax(event *streamdeck.EvSendToPlugin, sdpi *evSdpiCollection) error {
max, err := strconv.Atoi(sdpi.Value)
if err != nil {
return fmt.Errorf("handleSetMax strconv: %v", err)
}
g, ok := p.graphs[event.Context]
if !ok {
return fmt.Errorf("handleSetMax no graph for context: %s", event.Context)
}
g.SetMax(max)
settings, err := p.am.getSettings(event.Context)
if err != nil {
return fmt.Errorf("handleSetMax getSettings: %v", err)
}
settings.Max = max
err = p.sd.SetSettings(event.Context, &settings)
if err != nil {
return fmt.Errorf("handleSetMax SetSettings: %v", err)
}
p.am.SetAction(event.Action, event.Context, &settings)
return nil
}
func (p *Plugin) handleSetFormat(event *streamdeck.EvSendToPlugin, sdpi *evSdpiCollection) error {
format := sdpi.Value
settings, err := p.am.getSettings(event.Context)
if err != nil {
return fmt.Errorf("handleSetFormat getSettings: %v", err)
}
settings.Format = format
err = p.sd.SetSettings(event.Context, &settings)
if err != nil {
return fmt.Errorf("handleSetFormat SetSettings: %v", err)
}
p.am.SetAction(event.Action, event.Context, &settings)
return nil
}
func (p *Plugin) handleDivisor(event *streamdeck.EvSendToPlugin, sdpi *evSdpiCollection) error {
divisor := sdpi.Value
settings, err := p.am.getSettings(event.Context)
if err != nil {
return fmt.Errorf("handleDivisor getSettings: %v", err)
}
settings.Divisor = divisor
err = p.sd.SetSettings(event.Context, &settings)
if err != nil {
return fmt.Errorf("handleDivisor SetSettings: %v", err)
}
p.am.SetAction(event.Action, event.Context, &settings)
return nil
}
const (
hexFormat = "#%02x%02x%02x"
hexShortFormat = "#%1x%1x%1x"
hexToRGBFactor = 17
)
func hexToRGBA(hex string) *color.RGBA {
var r, g, b uint8
if len(hex) == 4 {
fmt.Sscanf(hex, hexShortFormat, &r, &g, &b)
r *= hexToRGBFactor
g *= hexToRGBFactor
b *= hexToRGBFactor
} else {
fmt.Sscanf(hex, hexFormat, &r, &g, &b)
}
return &color.RGBA{R: r, G: g, B: b, A: 255}
}
func (p *Plugin) handleColorChange(event *streamdeck.EvSendToPlugin, key string, sdpi *evSdpiCollection) error {
hex := sdpi.Value
settings, err := p.am.getSettings(event.Context)
if err != nil {
return fmt.Errorf("handleDivisor getSettings: %v", err)
}
g, ok := p.graphs[event.Context]
if !ok {
return fmt.Errorf("handleSetMax no graph for context: %s", event.Context)
}
clr := hexToRGBA(hex)
switch key {
case "foreground":
settings.ForegroundColor = hex
g.SetForegroundColor(clr)
case "background":
settings.BackgroundColor = hex
g.SetBackgroundColor(clr)
case "highlight":
settings.HighlightColor = hex
g.SetHighlightColor(clr)
case "valuetext":
settings.ValueTextColor = hex
g.SetLabelColor(1, clr)
}
err = p.sd.SetSettings(event.Context, &settings)
if err != nil {
return fmt.Errorf("handleColorChange SetSettings: %v", err)
}
p.am.SetAction(event.Action, event.Context, &settings)
return nil
}
func (p *Plugin) handleSetFontSize(event *streamdeck.EvSendToPlugin, key string, sdpi *evSdpiCollection) error {
sv := sdpi.Value
size, err := strconv.ParseFloat(sv, 64)
if err != nil {
return fmt.Errorf("failed to convert value to float: %w", err)
}
settings, err := p.am.getSettings(event.Context)
if err != nil {
return fmt.Errorf("getSettings failed: %w", err)
}
g, ok := p.graphs[event.Context]
if !ok {
return fmt.Errorf("no graph for context: %s", event.Context)
}
switch key {
case "titleFontSize":
settings.TitleFontSize = size
g.SetLabelFontSize(0, size)
case "valueFontSize":
settings.ValueFontSize = size
g.SetLabelFontSize(1, size)
default:
return fmt.Errorf("invalid key: %s", sdpi.Key)
}
err = p.sd.SetSettings(event.Context, &settings)
if err != nil {
return fmt.Errorf("SetSettings failed: %w", err)
}
p.am.SetAction(event.Action, event.Context, &settings)
return nil
}