From dbe22b25dd068d5a206c88bba0221a3378a2115b Mon Sep 17 00:00:00 2001 From: William Clark Date: Wed, 16 Nov 2022 00:07:01 +0000 Subject: [PATCH] restructure db and logging process, and also config --- config.toml | 2 +- config/config.go | 32 +++++++++++++++++++++----------- data/config/data.go | 11 ++++++----- db/adapter.go | 36 ++++++++++++++++++++++++++++-------- db/dummy.go | 9 +++++++-- db/logger/logger.go | 44 -------------------------------------------- db/logging.go | 28 ++++++++++++++++++++++++++++ db/sqlite3.go | 4 +++- main.go | 14 +++++--------- ports/db.go | 2 +- 10 files changed, 100 insertions(+), 82 deletions(-) delete mode 100644 db/logger/logger.go create mode 100644 db/logging.go diff --git a/config.toml b/config.toml index b13d920..008f53b 100644 --- a/config.toml +++ b/config.toml @@ -10,7 +10,7 @@ type = "sqlite3" path = "test.db" [Channel_1] -type = 'K' +type = 'k' unit = 'C' gain = 106.8 offset = 2.4 diff --git a/config/config.go b/config/config.go index a14cf45..6d6e985 100644 --- a/config/config.go +++ b/config/config.go @@ -3,6 +3,7 @@ package config import ( "errors" "fmt" + "strings" "th7/data/config" "th7/data/temperature" "th7/data/thermocouple" @@ -36,6 +37,7 @@ var ( ) func getThermocoupleType(t string) (thermocouple.Type, error) { + t = strings.ToUpper(t) if val, ok := thermocoupleTypes[t]; ok { return val, nil } else { @@ -44,6 +46,7 @@ func getThermocoupleType(t string) (thermocouple.Type, error) { } func getTemperatureUnit(u string) (temperature.Unit, error) { + u = strings.ToUpper(u) if val, ok := temperatureUnits[u]; ok { return val, nil } else { @@ -70,31 +73,33 @@ func Load() (config.Config, error) { v.SetDefault("TH7.LED", true) v.SetDefault("TH7.logfreq", 60) v.SetDefault("TH7.debug", false) + v.SetDefault("TH7.nolog", false) cfg.Board.Port = v.GetInt("TH7.port") cfg.Board.Cache = v.GetBool("TH7.cache") cfg.Board.Led = v.GetBool("TH7.LED") cfg.Board.Logfreq = v.GetInt("TH7.logfreq") cfg.Board.Debug = v.GetBool("TH7.debug") + cfg.Board.NoLogging = v.GetBool("TH7.nolog") cfg.Channels = make([]config.Channel, 0) - var c config.Channel // set defaults for channels for i := 1; i < 8; i++ { var head = fmt.Sprintf("Channel_%d", i) + v.SetDefault(head+".type", "NOTSET") v.SetDefault(head+".gain", 106.8) v.SetDefault(head+".offset", 0.0) v.SetDefault(head+".unit", "UV") } for i := 1; i < 8; i++ { + var c config.Channel + var unit temperature.Unit + var tc thermocouple.Type var head = fmt.Sprintf("Channel_%d", i) - tc := v.GetString(head + ".type") - // thermocouple type is non-optional, so if it doesnt exist - // then the entry does not exist. - if tc == "" { + if v.GetString(head+".type") == "NOTSET" { continue } @@ -102,16 +107,21 @@ func Load() (config.Config, error) { c.Gain = v.GetFloat64(head + ".gain") c.Offset = v.GetFloat64(head + ".offset") - tctype, err := getThermocoupleType(tc) + tc, err := getThermocoupleType(v.GetString(head + ".type")) if err != nil { + fmt.Printf("%s.type=%s\n", head, v.GetString(head+".type")) return cfg, err } - c.Thermo = tctype + c.Thermo = tc - unit, err := getTemperatureUnit(v.GetString(head + ".unit")) - if err != nil { - fmt.Printf("%s.unit=%c\n", head, v.GetInt(head+".unit")) - return cfg, err + 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 + } } c.Unit = unit diff --git a/data/config/data.go b/data/config/data.go index 6ea001c..6f11ff3 100644 --- a/data/config/data.go +++ b/data/config/data.go @@ -14,11 +14,12 @@ type Channel struct { } type TH7 struct { - Port int `json:"port"` - Cache bool `json:"cache"` - Led bool `json:"LED"` - Logfreq int `json:"logfreq"` - Debug bool `json:"debug"` + Port int `json:"port"` + Cache bool `json:"cache"` + Led bool `json:"LED"` + Logfreq int `json:"logfreq"` + Debug bool `json:"debug"` + NoLogging bool `json:"nologging"` } type Config struct { diff --git a/db/adapter.go b/db/adapter.go index 63ce959..8817f04 100644 --- a/db/adapter.go +++ b/db/adapter.go @@ -3,21 +3,41 @@ package db import ( "errors" "fmt" + "th7/data/config" "th7/ports" + "time" ) -func NewAdapter(db map[string]interface{}) (ports.DBPort, error) { +func NewAdapter(corePort ports.CorePort, cfg config.Config) (ports.DBPort, error) { - // if no "type" is given, use dummy - if _, ok := db["type"]; !ok { - return NewDummyAdapter() + var duration time.Duration + var no_logging bool + var adapter ports.DBPort + var err error + + no_logging = cfg.Board.NoLogging + duration = time.Duration(cfg.Board.Logfreq) * time.Second + + if _, ok := cfg.DB["type"]; !ok || no_logging { + adapter, _ = NewDummyAdapter() // it doesn't fail + go startLoggingProcess(adapter, corePort, duration) + return adapter, nil } - db_type := fmt.Sprint(db["type"]) - switch db_type { + db := fmt.Sprint(cfg.DB["type"]) + + switch db { case "sqlite3": - return NewSQLite3Adapter(db) + adapter, err = NewSQLite3Adapter(cfg.DB) + + default: + return &DummyAdapter{}, errors.New("unknown db type") } - return &DummyAdapter{}, errors.New("unknown db type") + if err != nil { + return &DummyAdapter{}, err + } + + go startLoggingProcess(adapter, corePort, duration) + return adapter, nil } diff --git a/db/dummy.go b/db/dummy.go index 9e921a3..08eaa5a 100644 --- a/db/dummy.go +++ b/db/dummy.go @@ -16,6 +16,11 @@ func (d *DummyAdapter) Close() { fmt.Println("Closing DB ...") } -func (d *DummyAdapter) Save([]core.Channel) { - fmt.Println("Saving data to DB ...") +func (d *DummyAdapter) Save(channels []core.Channel) error { + fmt.Println("=======================================") + for _, val := range channels { + fmt.Printf("Saved: id=%d, unit=%d, value=%g\n", val.Id, val.Unit, val.Value) + } + fmt.Println("=======================================") + return nil } diff --git a/db/logger/logger.go b/db/logger/logger.go deleted file mode 100644 index ee9689e..0000000 --- a/db/logger/logger.go +++ /dev/null @@ -1,44 +0,0 @@ -package logger - -import ( - "fmt" - "th7/ports" - "time" -) - -type Logger struct { - core ports.CorePort - db ports.DBPort - period int - run bool -} - -func doLogging(log *Logger) { - - duration := time.Duration(log.period) * time.Second - - for log.run { - - time.Sleep(duration) - - ch, err := log.core.GetChannels() - if err != nil { - fmt.Printf("error getting data for logger: %v\n", err) - } - log.db.Save(ch) - } -} - -func NewLogger(core ports.CorePort, db ports.DBPort, period int) *Logger { - var logger Logger - logger.db = db - logger.core = core - logger.period = period - logger.run = true - go doLogging(&logger) - return &logger -} - -func (l *Logger) Stop() { - l.run = false -} diff --git a/db/logging.go b/db/logging.go new file mode 100644 index 0000000..2b3c2ab --- /dev/null +++ b/db/logging.go @@ -0,0 +1,28 @@ +package db + +import ( + "fmt" + "th7/ports" + "time" +) + +func startLoggingProcess(db ports.DBPort, core ports.CorePort, dur time.Duration) { + + // wait 10 seconds to not log start up values that can be noisy + time.Sleep(10 * time.Second) + + for true { + + val, err := core.GetChannels() + if err != nil { + fmt.Printf("Error encountered while getting values: %v\n", err) + } + + err = db.Save(val) + if err != nil { + fmt.Printf("Error encountered while saving values: %v\n", err) + } + + time.Sleep(dur) + } +} diff --git a/db/sqlite3.go b/db/sqlite3.go index 8a0d43b..5c4cdbc 100644 --- a/db/sqlite3.go +++ b/db/sqlite3.go @@ -51,11 +51,13 @@ func NewSQLite3Adapter(dbInfo map[string]interface{}) (*SQLite3Adapter, error) { func (ad *SQLite3Adapter) Close() { ad.db.Close() + return } -func (ad *SQLite3Adapter) Save([]core.Channel) { +func (ad *SQLite3Adapter) Save([]core.Channel) error { ad.mu.Lock() defer ad.mu.Unlock() fmt.Println("TODO save data...") + return nil } diff --git a/main.go b/main.go index 7fcde3c..020f2ba 100644 --- a/main.go +++ b/main.go @@ -9,7 +9,6 @@ import ( "th7/config" "th7/core" "th7/db" - "th7/db/logger" "th7/pcb" "th7/ports" "th7/web" @@ -43,19 +42,16 @@ func main() { } defer pcbPort.Deinit() - dbPort, err = db.NewAdapter(config.DB) - if err != nil { - log.Fatalf("Fatal error: %v\n", err) - } - defer dbPort.Close() - corePort, err = core.NewAdapter(pcbPort, config) if err != nil { log.Fatalf("Error starting TH7 Adapter: %v\n", err) } - logger := logger.NewLogger(corePort, dbPort, config.Board.Logfreq) - defer logger.Stop() + dbPort, err = db.NewAdapter(corePort, config) + if err != nil { + log.Fatalf("Fatal error: %v\n", err) + } + defer dbPort.Close() webPort = web.NewGinAdapter(corePort) go webPort.Run() diff --git a/ports/db.go b/ports/db.go index 9a33913..39d35ab 100644 --- a/ports/db.go +++ b/ports/db.go @@ -4,5 +4,5 @@ import "th7/data/core" type DBPort interface { Close() - Save([]core.Channel) + Save([]core.Channel) error }