From 1868b1f1b6fcda2f275b3835382d969eeccd27d8 Mon Sep 17 00:00:00 2001 From: Paolo Asperti Date: Wed, 30 Dec 2020 17:22:26 +0100 Subject: [PATCH] Update board.go, main.go, and webui.go --- src/board.go | 134 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.go | 1 + src/webui.go | 4 +- 3 files changed, 137 insertions(+), 2 deletions(-) create mode 100644 src/board.go diff --git a/src/board.go b/src/board.go new file mode 100644 index 0000000..e702d03 --- /dev/null +++ b/src/board.go @@ -0,0 +1,134 @@ +package main + +import ( + "fmt" + "log" + + "github.com/spf13/viper" +) + +type Channel struct { + num uint + name string + value bool + inverted bool // low level only + startValue bool +} + +type Board struct { + id string + name string + channelCount uint + inverted bool // low level only + channels []Channel +} + +func (c Channel) Toggle() (bool, error) { + c.value = !c.value + return c.value, nil +} + +func (c Channel) On() error { + c.value = true + return nil +} + +func (c Channel) Off() error { + c.value = true + return nil +} + +func (c Channel) Status() bool { + return c.value +} + +var boards []Board + +func newDummyChannel(v *viper.Viper, num uint) Channel { + v.SetDefault("name", fmt.Sprintf("channel %d", num)) + v.SetDefault("startValue", false) + v.SetDefault("inverted", false) + return Channel{ + num: num, + name: v.GetString("name"), + value: v.GetBool("startValue"), + inverted: v.GetBool("inverted"), + startValue: v.GetBool("startValue"), + } +} + +func newDummyBoard(v *viper.Viper, id string) Board { + v.SetDefault("name", "board "+id) + v.SetDefault("inverted", false) + v.SetDefault("type", "dummy") + v.SetDefault("channelCount", 0) + v.SetDefault("channels", "") + + if v.GetInt("channelCount") > 0 { + for i := 0; i < v.GetInt("channelCount"); i++ { + v.SetDefault("channels."+fmt.Sprint(i)+".num", i) + } + } + + channels := make([]Channel, v.GetInt("channelCount")) + if v.GetInt("channelCount") > 0 { + channelsConfig := v.Sub("channels") + if channelsConfig != nil { + for num := range channelsConfig.AllSettings() { + channelConfig := channelsConfig.Sub(num) + n := channelConfig.GetUint("num") + channels[n] = newDummyChannel(channelConfig, n) + } + } + } + + return Board{ + id: id, + name: v.GetString("name"), + channelCount: v.GetUint("channelCount"), + inverted: v.GetBool("inverted"), + channels: channels, + } +} + +func parseBoardsConfig() { + 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 "gpio": + default: + boards = append(boards, newDummyBoard(boardConfig, key)) + + } + + } + + // dumpa tutto + for b := range boards { + boards[b].Dump() + } + +} + +func (c Channel) Dump() { + v := "off" + if c.startValue { + v = "on" + } + log.Printf(" Channel %d (start: %s): %s \n", c.num, v, c.name) +} + +func (b Board) Dump() { + log.Printf("Board '%s' (id: %s): %d channels\n", b.name, b.id, b.channelCount) + for c := range b.channels { + b.channels[c].Dump() + } +} diff --git a/src/main.go b/src/main.go index 409eecc..66f8817 100644 --- a/src/main.go +++ b/src/main.go @@ -12,6 +12,7 @@ func init() { } func main() { + parseBoardsConfig() go mqttLoop() go UpsConnect() logInfo("hostname: " + viper.GetString("hostname")) diff --git a/src/webui.go b/src/webui.go index fdeae35..8786d30 100644 --- a/src/webui.go +++ b/src/webui.go @@ -88,12 +88,12 @@ func jsonOutletToggle(ctx *macaron.Context) { if err != nil { log.Fatal(err) } - MQTTpublish("openpdu/toggolo1", string(id)) + MQTTpublish("openpdu/toggolo1", fmt.Sprint(id)) err = MyBoard.channelToggle(uint(id)) if err != nil { log.Fatal(err) } - MQTTpublish("openpdu/toggolo2", string(id)) + MQTTpublish("openpdu/toggolo2", fmt.Sprint(id)) ctx.JSON(http.StatusOK, Dictionary{ "data": "ok", })