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/sensor" "github.com/go-flucky/flucky/pkg/types" ) // Start the daemon func Start(cnf *config.Configuration) 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 * 60) for { select { case <-ticker: log.Printf("Write measured values into logfile") log.Printf("%v new measured temperature values", len(temperatures)) err := logfile.WriteTemperatures(temperatures, cnf.Device.TemperatureLogfile, true) if err != nil { return fmt.Errorf("Can not save temperatures: %v", err) } temperatures = make([]*types.Temperature, 0) 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, true) if err != nil { return fmt.Errorf("Can not save temperatures: %v", err) } } case killSignal := <-interrupt: //close(humidityChannel) close(temperatureChannel) return fmt.Errorf("Daemon was interruped by system signal %v", killSignal) } } }