openpdu/src/board.go

116 lines
2.0 KiB
Go

package main
import (
"log"
"strings"
"github.com/spf13/viper"
)
type Channel interface {
Toggle() (bool, error)
On() error
Off() error
ToString() string
UpdateMQTT()
Status() bool
Parent() Board
Dump()
Name() string
OnBoot() string
SetOnBoot(string)
SetMQTTStateTopic(string)
SetMQTTCommandTopic(string)
}
type Board interface {
Init()
Dump()
Channel(uint64) Channel
}
type Outlet struct {
ID string
Num uint
Description string
Channel Channel
}
var boards []Board
var allChannels map[string]Channel
var outlets []*Outlet
func parseBoardsConfig() {
// TODO: init boards array?
allChannels = make(map[string]Channel)
boardsConfig := viper.Sub("boards")
if boardsConfig == nil {
logWarning("No board configured")
return
}
for key := range boardsConfig.AllSettings() {
boardConfig := boardsConfig.Sub(key)
boardType := boardConfig.GetString("type")
switch boardType {
case "mqtt":
b := newMQTTBoard(boardConfig, key)
boards = append(boards, b)
case "gpio":
default:
b := newDummyBoard(boardConfig, key)
boards = append(boards, b)
}
}
outlets = make([]*Outlet, len(allChannels))
outletsConfig := viper.Sub("outlets")
if outletsConfig == nil {
logWarning("No outlet configured")
return
}
for key := range outletsConfig.AllSettings() {
outletConfig := outletsConfig.Sub(key)
num := outletConfig.GetUint("num")
outletConfig.SetDefault("description", "no description")
description := outletConfig.GetString("description")
channelID := strings.ToLower(outletConfig.GetString("channelID"))
channel := allChannels[channelID]
// TODO: channel non esistente
o := Outlet{
ID: key,
Num: num,
Description: description,
Channel: channel,
}
outlets[num] = &o
}
for b := range boards {
go boards[b].Init()
}
// dumpa tutto
for b := range boards {
boards[b].Dump()
}
// dumpa tutto
for o := range outlets {
outlets[o].Dump()
}
}
func (o *Outlet) Dump() {
log.Printf("Outlet %v: channel name: %v\n", o.Num, o.Channel.Name())
}