th7/config/config.go

135 lines
2.9 KiB
Go
Raw Normal View History

2022-11-12 14:20:29 +00:00
package config
import (
"errors"
"fmt"
"strings"
2022-11-12 14:20:29 +00:00
"th7/data/config"
"th7/data/temperature"
"th7/data/thermocouple"
"github.com/spf13/viper"
)
var (
ErrConfigBadThermocoupleType = errors.New("unrecognised thermocouple type")
ErrConfigBadTemperatureUnit = errors.New("unrecognised temperature unit")
)
var (
thermocoupleTypes = map[string]thermocouple.Type{
"B": thermocouple.B,
"E": thermocouple.E,
"J": thermocouple.J,
"K": thermocouple.K,
"N": thermocouple.N,
"R": thermocouple.R,
"S": thermocouple.S,
"T": thermocouple.T,
"UV": thermocouple.None,
2022-11-12 14:20:29 +00:00
}
temperatureUnits = map[string]temperature.Unit{
"C": temperature.C,
"F": temperature.F,
"K": temperature.K,
"UV": temperature.None,
2022-11-12 14:20:29 +00:00
}
)
func getThermocoupleType(t string) (thermocouple.Type, error) {
t = strings.ToUpper(t)
2022-11-12 14:20:29 +00:00
if val, ok := thermocoupleTypes[t]; ok {
return val, nil
} else {
return thermocouple.None, ErrConfigBadThermocoupleType
}
}
func getTemperatureUnit(u string) (temperature.Unit, error) {
u = strings.ToUpper(u)
2022-11-12 14:20:29 +00:00
if val, ok := temperatureUnits[u]; ok {
return val, nil
} else {
return temperature.None, ErrConfigBadTemperatureUnit
}
}
func Load() (config.Config, error) {
var cfg config.Config
var err error
v := viper.New()
v.AddConfigPath(".")
v.SetConfigFile("config.toml")
err = v.ReadInConfig()
if err != nil {
return cfg, err
}
v.SetDefault("TH7.port", 8080)
v.SetDefault("TH7.cache", true)
v.SetDefault("TH7.LED", true)
v.SetDefault("TH7.logfreq", 60)
2022-11-12 16:22:55 +00:00
v.SetDefault("TH7.debug", false)
v.SetDefault("TH7.nolog", false)
2022-11-12 14:20:29 +00:00
cfg.Board.Port = v.GetInt("TH7.port")
cfg.Board.Cache = v.GetBool("TH7.cache")
cfg.Board.Led = v.GetBool("TH7.LED")
2022-11-12 16:22:55 +00:00
cfg.Board.Logfreq = v.GetInt("TH7.logfreq")
cfg.Board.Debug = v.GetBool("TH7.debug")
cfg.Board.NoLogging = v.GetBool("TH7.nolog")
2022-11-12 14:20:29 +00:00
cfg.Channels = make([]config.Channel, 0)
// set defaults for channels
for i := 1; i < 8; i++ {
var head = fmt.Sprintf("Channel_%d", i)
v.SetDefault(head+".type", "NOTSET")
2022-11-12 14:20:29 +00:00
v.SetDefault(head+".gain", 106.8)
v.SetDefault(head+".offset", 0.0)
v.SetDefault(head+".unit", "UV")
2022-11-12 14:20:29 +00:00
}
for i := 1; i < 8; i++ {
var c config.Channel
var unit temperature.Unit
var tc thermocouple.Type
2022-11-12 14:20:29 +00:00
var head = fmt.Sprintf("Channel_%d", i)
if v.GetString(head+".type") == "NOTSET" {
2022-11-12 14:20:29 +00:00
continue
}
c.Id = i
c.Gain = v.GetFloat64(head + ".gain")
c.Offset = v.GetFloat64(head + ".offset")
tc, err := getThermocoupleType(v.GetString(head + ".type"))
2022-11-12 14:20:29 +00:00
if err != nil {
fmt.Printf("%s.type=%s\n", head, v.GetString(head+".type"))
2022-11-12 14:20:29 +00:00
return cfg, err
}
c.Thermo = tc
if tc == thermocouple.None {
unit = temperature.None
} else {
unit, err = getTemperatureUnit(v.GetString(head + ".unit"))
if err != nil {
fmt.Printf("%s.unit=%s\n", head, v.GetString(head+".unit"))
return cfg, err
}
2022-11-12 14:20:29 +00:00
}
c.Unit = unit
cfg.Channels = append(cfg.Channels, c)
}
cfg.DB = v.GetStringMap("DB")
return cfg, nil
}