From a83bdc443cdbcb9c02994c2200a964800d33eed4 Mon Sep 17 00:00:00 2001 From: Philipp Arndt <2f.mail@gmx.de> Date: Sun, 13 Oct 2024 13:05:07 +0200 Subject: [PATCH] fix: improve startup message order --- app/eltako/eltako.go | 8 +++++--- app/eltako/polling.go | 7 +++++-- app/main.go | 6 +++++- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/app/eltako/eltako.go b/app/eltako/eltako.go index 15ab512..02ce225 100644 --- a/app/eltako/eltako.go +++ b/app/eltako/eltako.go @@ -8,6 +8,7 @@ import ( "github.com/philipparndt/go-logger" "io" "net/http" + "sync" ) type ShadingActor struct { @@ -139,17 +140,18 @@ func (s *ShadingActor) String() string { return fmt.Sprintf("ShadingActor{name: %s; ip: %s}", s.Name, s.IP) } -func (s *ShadingActor) Start(cfg config.Eltako) error { +func (s *ShadingActor) Start(wg *sync.WaitGroup, cfg config.Eltako) error { + wg.Add(2) err := s.UpdateToken() if err != nil { logger.Error(fmt.Sprintf("Initial token update failed for %s", s), err) return err } - go s.scheduleUpdateToken() + go s.scheduleUpdateToken(wg) if cfg.PollingInterval > 0 { - go s.schedulePolling(cfg.PollingInterval) + go s.schedulePolling(wg, cfg.PollingInterval) } else { logger.Info(fmt.Sprintf("Polling disabled for %s", s)) } diff --git a/app/eltako/polling.go b/app/eltako/polling.go index ce64ba2..f92019e 100644 --- a/app/eltako/polling.go +++ b/app/eltako/polling.go @@ -4,13 +4,15 @@ import ( "fmt" "github.com/philipparndt/go-logger" "github.com/philipparndt/mqtt-gateway/mqtt" + "sync" "time" ) -func (s *ShadingActor) schedulePolling(pollingInterval int) { +func (s *ShadingActor) schedulePolling(wg *sync.WaitGroup, pollingInterval int) { errorCtr := 0 interval := time.Duration(pollingInterval) * time.Millisecond logger.Info(fmt.Sprintf("Starting polling of %s with interval %s", s, interval)) + wg.Done() for { position, err := s.getPosition() @@ -28,9 +30,10 @@ func (s *ShadingActor) schedulePolling(pollingInterval int) { } } -func (s *ShadingActor) scheduleUpdateToken() { +func (s *ShadingActor) scheduleUpdateToken(wg *sync.WaitGroup) { interval := time.Duration(60) * time.Minute logger.Info(fmt.Sprintf("Scheduling token update of %s with interval %s", s, interval)) + wg.Done() for { logger.Debug("Updating token") err := s.UpdateToken() diff --git a/app/main.go b/app/main.go index f1f6ee0..688d178 100644 --- a/app/main.go +++ b/app/main.go @@ -9,21 +9,25 @@ import ( "github.com/philipparndt/mqtt-gateway/mqtt" "os" "os/signal" + "sync" "syscall" ) func startActors(cfg config.Eltako) *eltako.ActorRegistry { registry := eltako.NewActorRegistry() + + wg := sync.WaitGroup{} for _, device := range cfg.Devices { logger.Info(fmt.Sprintf("Initializing %s", device.String())) actor := eltako.NewShadingActor(device) - err := actor.Start(cfg) + err := actor.Start(&wg, cfg) if err != nil { panic(err) } registry.AddActor(actor) } + wg.Wait() return registry }