package daemon import ( "fmt" "log" "os" "os/signal" "syscall" "time" "github.com/go-flucky/flucky/pkg/config" "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, compression bool) error { 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) // go sensor.ReadHumiditiesContinuously(cnf.GetHumiditySensors(config.ENABLED), humidityChannel, errorChannel) go sensor.ReadTemperaturesContinuously(cnf.GetTemperatureSensors(config.ENABLED), temperatureChannel, errorChannel) temperatures := make([]*types.Temperature, 0) ticker := time.Tick(time.Second * 300) rgbLEDs := cnf.GetRGBLEDs(config.ENABLED) err := rgbled.Green(rgbLEDs) if err != nil { return fmt.Errorf("Can not turn on blue info light: %v", err) } for { select { case <-ticker: err := rgbled.Blue(rgbLEDs) if err != nil { return fmt.Errorf("Can not turn on yellow info light: %v", err) } log.Printf("Write measured values into logfile") log.Printf("%v new measured temperature values", len(temperatures)) err = logfile.WriteTemperatures(temperatures, cnf.Device.TemperatureLogfile, compression) if err != nil { return fmt.Errorf("Can not save temperatures: %v", err) } temperatures = make([]*types.Temperature, 0) err = rgbled.Green(rgbLEDs) if err != nil { return fmt.Errorf("Can not turn on green info light: %v", err) } case temperature, more := <-temperatureChannel: if more { temperatures = append(temperatures, temperature) } else { log.Printf("Temperature Channel closed. Write remaining values into the logfile") err := logfile.WriteTemperatures(temperatures, cnf.Device.TemperatureLogfile, compression) if err != nil { return fmt.Errorf("Can not save temperatures: %v", err) } } case killSignal := <-interrupt: err := rgbled.Red(rgbLEDs) if err != nil { return fmt.Errorf("Can not turn on info light: %v", err) } //close(humidityChannel) close(temperatureChannel) return fmt.Errorf("Daemon was interruped by system signal %v", killSignal) } } }