package daemon import ( "context" "fmt" "log" "os" "os/signal" "syscall" "time" "github.com/go-flucky/flucky/pkg/config" "github.com/go-flucky/flucky/pkg/internal/collect" "github.com/go-flucky/flucky/pkg/internal/prittyprint" "github.com/go-flucky/flucky/pkg/logfile" "github.com/go-flucky/flucky/pkg/rgbled" "github.com/go-flucky/flucky/pkg/sensor" "github.com/go-flucky/flucky/pkg/types" ) // Start the daemon func Start(cnf *config.Configuration, cleanCacheIntervall time.Duration, compression bool, round float64) error { ticker := time.Tick(cleanCacheIntervall) interrupt := make(chan os.Signal, 1) signal.Notify(interrupt, os.Interrupt, os.Kill, syscall.SIGTERM) errorChannel := make(chan error, 0) //humidityChannel := make(chan *types.Humidity, 0) temperatureChannel := make(chan *types.Temperature, 0) ctx := context.Background() childContext, cancel := context.WithCancel(ctx) // go sensor.ReadHumiditiesContinuously(cnf.GetHumiditySensors(config.ENABLED), humidityChannel, errorChannel) go sensor.ReadTemperaturesContinuously(childContext, cnf.GetTemperatureSensors(config.ENABLED), temperatureChannel, errorChannel) temperatures := make([]*types.Temperature, 0) rgbLEDs := cnf.GetRGBLEDs(config.ENABLED) err := rgbled.Green(rgbLEDs) if err != nil { cancel() return fmt.Errorf("Can not turn on blue info light: %v", err) } for { select { case <-ticker: err := rgbled.Blue(rgbLEDs) if err != nil { cancel() return fmt.Errorf("Can not turn on yellow info light: %v", err) } err = logfile.WriteTemperatures(temperatures, cnf.Device.TemperatureLogfile, compression) if err != nil { cancel() return fmt.Errorf("Can not save temperatures: %v", err) } temperatures = make([]*types.Temperature, 0) err = rgbled.Green(rgbLEDs) if err != nil { cancel() return fmt.Errorf("Can not turn on green info light: %v", err) } case temperature, more := <-temperatureChannel: if more { temperatures = append(temperatures, temperature) continue } case killSignal := <-interrupt: log.Printf("Daemon was interruped by system signal %v\n", killSignal) cancel() err := rgbled.Red(rgbLEDs) if err != nil { return fmt.Errorf("Can not turn on info light: %v", err) } errors := collect.Errors(errorChannel) if len(errors) > 0 { log.Println(prittyprint.FormatErrors(errors)) } err = logfile.WriteTemperatures(temperatures, cnf.Device.TemperatureLogfile, compression) if err != nil { return fmt.Errorf("Can not save temperatures: %v", err) } return nil } } }