goevdi/openvd/main.go

109 lines
2.1 KiB
Go

package main
import (
"os"
"os/signal"
"git.terah.dev/imterah/goevdi/libdisplayconfig"
lib "git.terah.dev/imterah/goevdi/libevdi"
"github.com/charmbracelet/log"
"gopkg.in/yaml.v3"
)
type Displays struct {
DisplayList []struct {
Modes []libdisplayconfig.Mode
} `yaml:"displays"`
}
func main() {
log.Info("OpenVD - based on GoEvdi")
logLevel := os.Getenv("OPENVD_LOG_LEVEL")
if logLevel != "" {
switch logLevel {
case "debug":
log.SetLevel(log.DebugLevel)
case "info":
log.SetLevel(log.InfoLevel)
case "warn":
log.SetLevel(log.WarnLevel)
case "error":
log.SetLevel(log.ErrorLevel)
case "fatal":
log.SetLevel(log.FatalLevel)
}
}
lib.SetupLogger(&lib.EvdiLogger{
Log: func(message string) {
log.Debugf("evdi: %s", message)
},
})
if len(os.Args) <= 1 {
log.Fatalf("Illegal arguments! Usage: openvd [configuration_file]")
}
config, err := os.ReadFile(os.Args[1])
if err != nil {
log.Fatalf("Failed to read configuration file: %s", err.Error())
}
displays := &Displays{}
err = yaml.Unmarshal(config, displays)
if err != nil {
log.Fatalf("Failed to parse configuration file: %s", err.Error())
}
evdiInstances := []*lib.EvdiNode{}
for displayID, display := range displays.DisplayList {
log.Infof("Setting up display #%d", displayID+1)
if len(display.Modes) == 0 {
log.Fatalf("Failed to set up display: no modes specified")
}
edid, err := libdisplayconfig.GenerateEDID(display.Modes)
if err != nil {
log.Fatalf("Failed to generate EDID: %s", err.Error())
}
log.Debug("Attempting to add EVDI device...")
evdi, err := lib.Open(nil)
if err != nil {
log.Fatalf("Failed to add EVDI device: %s", err.Error())
}
evdiInstances = append(evdiInstances, evdi)
log.Debug("Attempting to configure display...")
evdi.Connect(edid, uint(display.Modes[0].Width), uint(display.Modes[0].Height), uint(display.Modes[0].Refresh))
log.Infof("Succesfully set up display #%d", displayID+1)
}
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
for range c {
log.Info("Quitting.")
for _, evdi := range evdiInstances {
evdi.Disconnect()
evdi.Close()
}
os.Exit(0)
}
}