87 lines
1.9 KiB
Go
87 lines
1.9 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"fmt"
|
||
|
"io/ioutil"
|
||
|
"os"
|
||
|
|
||
|
"github.com/tblyler/lightshowpi/config"
|
||
|
"github.com/tblyler/lightshowpi/light"
|
||
|
"github.com/tblyler/lightshowpi/light/rpi"
|
||
|
"github.com/tblyler/lightshowpi/sound"
|
||
|
"golang.org/x/sync/errgroup"
|
||
|
)
|
||
|
|
||
|
func readConfig(filePath string) (*config.Config, error) {
|
||
|
file, err := os.Open(filePath)
|
||
|
if err != nil {
|
||
|
return nil, fmt.Errorf("failed to open %s: %w", filePath, err)
|
||
|
}
|
||
|
|
||
|
defer file.Close()
|
||
|
|
||
|
rawConfigData, err := ioutil.ReadAll(file)
|
||
|
if err != nil {
|
||
|
return nil, fmt.Errorf("failed to read config file %s: %w", filePath, err)
|
||
|
}
|
||
|
|
||
|
config, err := config.ParseConfig(rawConfigData)
|
||
|
if err != nil {
|
||
|
return nil, fmt.Errorf("failed to parse %s: %w", filePath, err)
|
||
|
}
|
||
|
|
||
|
return config, nil
|
||
|
}
|
||
|
|
||
|
func main() {
|
||
|
err := func() error {
|
||
|
cfg, err := readConfig("/etc/lightshowpi.toml")
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
piManager, err := rpi.NewManager(*cfg.RPIManagerConfig())
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
defer piManager.Close()
|
||
|
|
||
|
basicLights := map[string]light.BasicLight{}
|
||
|
|
||
|
for alias, info := range cfg.RaspberryPi.BasicLights {
|
||
|
basicLight, err := piManager.GetBasicLight(info.Pin)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("failed to get raspberry pi basic light %s for pin %d: %w", alias, info.Pin, err)
|
||
|
}
|
||
|
|
||
|
basicLights[alias] = basicLight
|
||
|
}
|
||
|
|
||
|
basicLightConductorSchedule, err := light.NewBasicLightConductorScheduleFromFile(cfg.LightSchedulePath)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
basicLightConductor := light.NewBasicLightConductor(basicLights, basicLightConductorSchedule)
|
||
|
soundOuput := sound.NewFM(cfg.FMOutput)
|
||
|
|
||
|
errGroup, errGroupCtx := errgroup.WithContext(context.TODO())
|
||
|
errGroup.Go(func() error {
|
||
|
return basicLightConductor.Start(errGroupCtx)
|
||
|
})
|
||
|
|
||
|
errGroup.Go(func() error {
|
||
|
return soundOuput.Play(errGroupCtx, cfg.SongPath)
|
||
|
})
|
||
|
|
||
|
return errGroup.Wait()
|
||
|
}()
|
||
|
|
||
|
if err != nil {
|
||
|
fmt.Fprintln(os.Stderr, err)
|
||
|
os.Exit(1)
|
||
|
}
|
||
|
}
|