diff --git a/config.toml b/config.toml index b6c027a..cc28ab3 100644 --- a/config.toml +++ b/config.toml @@ -1,15 +1,13 @@ [TH7] port = 8080 +logfreq = 60 cache = true LED = false -logfreq = 60 +debug = true [DB] -type = "mysql" -user = "root" -pass = "admin123" -host = "localhost" -port = 3306 +type = "sqlite3" +path = "test.db" [Channel_1] type = 'K' diff --git a/config/config.go b/config/config.go index bafb883..c5caf0c 100644 --- a/config/config.go +++ b/config/config.go @@ -67,11 +67,13 @@ func Load() (config.Config, error) { v.SetDefault("TH7.cache", true) v.SetDefault("TH7.LED", true) v.SetDefault("TH7.logfreq", 60) + v.SetDefault("TH7.debug", 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.loqfreq") + cfg.Board.Logfreq = v.GetInt("TH7.logfreq") + cfg.Board.Debug = v.GetBool("TH7.debug") cfg.Channels = make([]config.Channel, 0) var c config.Channel diff --git a/core/adapter.go b/core/adapter.go new file mode 100644 index 0000000..a2ce4fa --- /dev/null +++ b/core/adapter.go @@ -0,0 +1,15 @@ +package core + +import ( + "th7/data/config" + "th7/ports" +) + +func NewAdapter(pcb ports.PCBPort, cfg config.Config) (ports.CorePort, error) { + + if cfg.Board.Debug { + return NewDummyAdapter(pcb), nil + } else { + return NewTH7Adapter(pcb, cfg), nil + } +} diff --git a/core/th7.go b/core/th7.go index d49353f..955b206 100644 --- a/core/th7.go +++ b/core/th7.go @@ -2,41 +2,26 @@ package core import ( "sync" + "th7/data/config" "th7/data/core" "th7/ports" ) type TH7Adapter struct { pcbPort ports.PCBPort - dbPort ports.DBPort mu sync.Mutex data core.Data - run bool } -func NewTH7Adapter(pcbPort ports.PCBPort, dbPort ports.DBPort) *TH7Adapter { +func NewTH7Adapter(pcbPort ports.PCBPort, cfg config.Config) *TH7Adapter { var adapter TH7Adapter adapter.pcbPort = pcbPort - adapter.dbPort = dbPort - - adapter.run = true - - go startDBLoggerService(&adapter) - go startProxyService(&adapter) return &adapter } -func startProxyService(t *TH7Adapter) { - -} - -func startDBLoggerService(t *TH7Adapter) { - -} - func (t *TH7Adapter) GetChannel(id int) (core.Channel, error) { t.mu.Lock() defer t.mu.Unlock() diff --git a/data/config/data.go b/data/config/data.go index aee2fa5..6ea001c 100644 --- a/data/config/data.go +++ b/data/config/data.go @@ -18,6 +18,7 @@ type TH7 struct { Cache bool `json:"cache"` Led bool `json:"LED"` Logfreq int `json:"logfreq"` + Debug bool `json:"debug"` } type Config struct { diff --git a/db/adapter.go b/db/adapter.go new file mode 100644 index 0000000..63ce959 --- /dev/null +++ b/db/adapter.go @@ -0,0 +1,23 @@ +package db + +import ( + "errors" + "fmt" + "th7/ports" +) + +func NewAdapter(db map[string]interface{}) (ports.DBPort, error) { + + // if no "type" is given, use dummy + if _, ok := db["type"]; !ok { + return NewDummyAdapter() + } + + db_type := fmt.Sprint(db["type"]) + switch db_type { + case "sqlite3": + return NewSQLite3Adapter(db) + } + + return &DummyAdapter{}, errors.New("unknown db type") +} diff --git a/db/dummy.go b/db/dummy.go index 088ed12..a1767d1 100644 --- a/db/dummy.go +++ b/db/dummy.go @@ -2,13 +2,12 @@ package db import ( "fmt" - "th7/data/core" ) type DummyAdapter struct { } -func NewDummyAdapter(dbInfo map[string]interface{}) (*DummyAdapter, error) { +func NewDummyAdapter() (*DummyAdapter, error) { return &DummyAdapter{}, nil } @@ -16,6 +15,6 @@ func (d *DummyAdapter) Close() { fmt.Println("Closing DB ...") } -func (d *DummyAdapter) Save(data core.Data) { +func (d *DummyAdapter) Save() { fmt.Println("Saving data to DB ...") } diff --git a/db/logger/logger.go b/db/logger/logger.go new file mode 100644 index 0000000..1d94aa2 --- /dev/null +++ b/db/logger/logger.go @@ -0,0 +1,38 @@ +package logger + +import ( + "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) + log.db.Save() + } +} + +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/sqlite3.go b/db/sqlite3.go index f38cd9c..c1d721e 100644 --- a/db/sqlite3.go +++ b/db/sqlite3.go @@ -2,9 +2,9 @@ package db import ( "database/sql" + "errors" "fmt" "sync" - "th7/data/core" _ "github.com/mattn/go-sqlite3" ) @@ -14,10 +14,17 @@ type SQLite3Adapter struct { db *sql.DB } -func NewSQLite3Adapter(path string) (*SQLite3Adapter, error) { +func NewSQLite3Adapter(dbInfo map[string]interface{}) (*SQLite3Adapter, error) { var adapter SQLite3Adapter + // if path is given ... + if _, ok := dbInfo["path"]; !ok { + return &adapter, errors.New("sqlite3 requires a path config variable") + } + + path := fmt.Sprint(dbInfo["path"]) + db, err := sql.Open("sqlite3", path) if err != nil { return &adapter, err @@ -45,9 +52,9 @@ func (ad *SQLite3Adapter) Close() { ad.db.Close() } -func (ad *SQLite3Adapter) Save(data core.Data) { +func (ad *SQLite3Adapter) Save() { ad.mu.Lock() defer ad.mu.Unlock() - fmt.Println("TODO save data...", data) + fmt.Println("TODO save data...") } diff --git a/main.go b/main.go index d5352b7..08b3c24 100644 --- a/main.go +++ b/main.go @@ -3,9 +3,13 @@ package main import ( "fmt" "log" + "os" + "os/signal" + "syscall" "th7/config" "th7/core" "th7/db" + "th7/db/logger" "th7/pcb" "th7/ports" "th7/web" @@ -19,6 +23,9 @@ func main() { var webPort ports.WebPort var err error + kill := make(chan os.Signal, 1) + signal.Notify(kill, syscall.SIGTERM, syscall.SIGINT) + config, err := config.Load() if err != nil { log.Fatalf("Error loading config: %v", err) @@ -26,20 +33,29 @@ func main() { fmt.Println(config) - pcbPort, err = pcb.NewDummyAdapter(config.Board.Led) + pcbPort, err = pcb.NewAdapter(config.Board.Led) if err != nil { log.Fatalf("Fatal error: %v\n", err) } defer pcbPort.Deinit() - dbPort, err = db.NewDummyAdapter(config.DB) + dbPort, err = db.NewAdapter(config.DB) if err != nil { log.Fatalf("Fatal error: %v\n", err) } defer dbPort.Close() - corePort = core.NewDummyAdapter(pcbPort) + 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() webPort = web.NewGinAdapter(corePort) - webPort.Run() + go webPort.Run() + + sig := <-kill + log.Printf("Caught signal %v", sig) } diff --git a/pcb/adapter.go b/pcb/adapter.go new file mode 100644 index 0000000..6e332ac --- /dev/null +++ b/pcb/adapter.go @@ -0,0 +1,8 @@ +package pcb + +import "th7/ports" + +func NewAdapter(LED bool) (ports.PCBPort, error) { + + return NewDummyAdapter(LED) +} diff --git a/ports/db.go b/ports/db.go index 6023812..fd75e65 100644 --- a/ports/db.go +++ b/ports/db.go @@ -1,10 +1,6 @@ package ports -import ( - "th7/data/core" -) - type DBPort interface { Close() - Save(core.Data) + Save() }