package sensor import ( "context" "fmt" "math" "sync" "github.com/go-flucky/flucky/pkg/internal/collect" "github.com/go-flucky/flucky/pkg/internal/prittyprint" "github.com/go-flucky/flucky/pkg/types" ) // ReadHumidities returns a list of measured humidities by humidity sensors func ReadHumidities(humiditySensors []HumiditySensor, round float64) ([]*types.Humidity, error) { humidityChannel := make(chan *types.Humidity, len(humiditySensors)) errorChannel := make(chan error, len(humiditySensors)) wg := new(sync.WaitGroup) wg.Add(len(humiditySensors)) for _, humiditySensor := range humiditySensors { go humiditySensor.ReadHumidityWriteIntoChannel(humidityChannel, errorChannel, wg) } wg.Wait() errors := collect.Errors(errorChannel) if len(errors) > 0 { return nil, prittyprint.FormatErrors(errors) } humidities := collect.Humidities(humidityChannel) if round != 0 { for _, humidity := range humidities { humidity.HumidityValue = math.Round(humidity.HumidityValue/round) * round } } return humidities, nil } // ReadHumiditiesWriteIntoChannel reads the humidity values of humidity sensors and writes them into a channel func ReadHumiditiesWriteIntoChannel(ctx context.Context, humiditySensors []HumiditySensor, humidityChannel chan<- *types.Humidity, errorChannel chan<- error, wg *sync.WaitGroup) { for _, humiditySensor := range humiditySensors { humiditySensor.ReadHumidityWriteIntoChannel(humidityChannel, errorChannel, wg) } } // ReadHumiditiesContinuously reads the humidity values of humidity sensors continuously and writes them into a channel func ReadHumiditiesContinuously(ctx context.Context, humiditySensors []HumiditySensor, humidityChannel chan<- *types.Humidity, errorChannel chan<- error) { for { select { case <-ctx.Done(): errorChannel <- fmt.Errorf("Context closed: %v", ctx.Err()) return default: ReadHumiditiesWriteIntoChannel(ctx, humiditySensors, humidityChannel, errorChannel, nil) } } } // ReadTemperatures returns a list of measured temperatures by temperature sensors func ReadTemperatures(temperatureSensors []TemperatureSensor, round float64) ([]*types.Temperature, error) { temperatureChannel := make(chan *types.Temperature, len(temperatureSensors)) errorChannel := make(chan error, len(temperatureSensors)) wg := new(sync.WaitGroup) wg.Add(len(temperatureSensors)) for _, temperatureSensor := range temperatureSensors { go temperatureSensor.ReadTemperatureWriteIntoChannel(temperatureChannel, errorChannel, wg) } wg.Wait() errors := collect.Errors(errorChannel) if len(errors) > 0 { return nil, prittyprint.FormatErrors(errors) } temperatures := collect.Temperatures(temperatureChannel) if round != 0 { for _, temperature := range temperatures { temperature.TemperatureValue = math.Round(temperature.TemperatureValue/round) * round } } return temperatures, nil } // ReadTemperaturesWriteIntoChannel reads the temperature values of temperature sensors and writes them into a channel func ReadTemperaturesWriteIntoChannel(ctx context.Context, temperatureSensors []TemperatureSensor, temperatureChannel chan<- *types.Temperature, errorChannel chan<- error, wg *sync.WaitGroup) { for _, temperatureSensor := range temperatureSensors { temperatureSensor.ReadTemperatureWriteIntoChannel(temperatureChannel, errorChannel, wg) } } // ReadTemperaturesContinuously reads the temperature values of temperature sensors continuously and writes them into a chann func ReadTemperaturesContinuously(ctx context.Context, temperatureSensors []TemperatureSensor, temperatureChannel chan<- *types.Temperature, errorChannel chan<- error) { for { select { case <-ctx.Done(): errorChannel <- fmt.Errorf("Context closed: %v", ctx.Err()) return default: ReadTemperaturesWriteIntoChannel(ctx, temperatureSensors, temperatureChannel, errorChannel, nil) } } }