diff --git a/cli/cli.go b/cli/cli.go index d0113cc..7cfaa8f 100644 --- a/cli/cli.go +++ b/cli/cli.go @@ -3,6 +3,7 @@ package cli import ( "flag" "fmt" + "github.com/cyrilix/robocar-base/service" MQTT "github.com/eclipse/paho.mqtt.golang" "log" "os" @@ -49,12 +50,7 @@ func SetFloat64DefaultValueFromEnv(value *float64, key string, defaultValue floa return nil } -type Part interface { - Start() error - Stop() -} - -func HandleExit(p Part) { +func HandleExit(p service.Part) { signals := make(chan os.Signal, 1) signal.Notify(signals, os.Kill, os.Interrupt, syscall.SIGTERM) diff --git a/service/part.go b/service/part.go new file mode 100644 index 0000000..c370778 --- /dev/null +++ b/service/part.go @@ -0,0 +1,33 @@ +package service + +import ( + "fmt" + mqtt "github.com/eclipse/paho.mqtt.golang" + "log" +) + +func StopService(name string, client mqtt.Client, topics ...string) { + log.Printf("Stop %s service", name) + token := client.Unsubscribe(topics...) + token.Wait() + if token.Error() != nil { + log.Printf("unable to unsubscribe service: %v", token.Error()) + } + client.Disconnect(50) +} + +func RegisterCallback(client mqtt.Client, topic string, callback mqtt.MessageHandler) error { + log.Printf("Register callback on topic %v", topic) + token := client.Subscribe(topic, 0, callback) + token.Wait() + if token.Error() != nil { + return fmt.Errorf("unable to register callback on topic %s: %v", topic, token.Error()) + } + return nil +} + +type Part interface { + Start() error + Stop() +} +