Files
workspace-led-controller/controller/controller.go
2026-04-07 23:46:35 +03:00

83 lines
1.5 KiB
Go

package controller
import (
"fmt"
"log"
"led-controller/config"
"led-controller/controller/openrgb"
"led-controller/controller/relay"
)
type Controller struct {
cfg *config.Config
orgb *openrgb.Client
relay *relay.Relay
}
func New(cfg *config.Config) (*Controller, error) {
c := &Controller{cfg: cfg}
if cfg.OpenRGB.Enabled {
client, err := openrgb.Connect()
if err != nil {
log.Printf("warning: openrgb unavailable: %v", err)
} else {
c.orgb = client
log.Println("openrgb: connected via CLI")
}
}
if cfg.Relay.Enabled {
c.relay = relay.New(cfg.Relay.Device, cfg.Relay.Channel, cfg.Relay.Baud)
log.Printf("relay: configured on %s channel %d", cfg.Relay.Device, cfg.Relay.Channel)
}
return c, nil
}
func (c *Controller) SetLEDs(on bool) error {
var errs []error
if c.cfg.OpenRGB.Enabled {
if err := c.setOpenRGB(on); err != nil {
errs = append(errs, fmt.Errorf("openrgb: %w", err))
}
}
if c.cfg.Relay.Enabled && c.relay != nil {
if err := c.relay.Set(on); err != nil {
errs = append(errs, fmt.Errorf("relay: %w", err))
}
}
if len(errs) > 0 {
return fmt.Errorf("%v", errs)
}
return nil
}
func (c *Controller) setOpenRGB(on bool) error {
if c.orgb == nil {
client, err := openrgb.Connect()
if err != nil {
return err
}
c.orgb = client
}
if on {
return c.orgb.SetAllOn(0xFF, 0xFF, 0xFF)
}
return c.orgb.SetAllOff()
}
func (c *Controller) Close() {
if c.orgb != nil {
c.orgb.Close()
}
if c.relay != nil {
c.relay.Close()
}
}