package sensor import ( "context" "fmt" "sync" "github.com/go-flucky/flucky/pkg/internal/collect" "github.com/go-flucky/flucky/pkg/internal/prittyprint" "github.com/go-flucky/flucky/pkg/types" ) // Read measured values from sensors func Read(ctx context.Context, sensors []Sensor) ([]*types.MeasuredValue, error) { measuredValuesChannel := make(chan []*types.MeasuredValue, len(sensors)) errorChannel := make(chan error, len(sensors)) ReadChannel(ctx, sensors, measuredValuesChannel, errorChannel) errors := collect.Errors(errorChannel) if len(errors) > 0 { return nil, prittyprint.FormatErrors(errors) } measuredValues := collect.MeasuredValues(measuredValuesChannel) return measuredValues, nil } // ReadChannel reads the measured values from sensors and writes them to a // channel. func ReadChannel(ctx context.Context, sensors []Sensor, measuredValuesChannel chan<- []*types.MeasuredValue, errorChannel chan<- error) { wg := new(sync.WaitGroup) wg.Add(len(sensors)) for _, sensor := range sensors { go sensor.ReadChannel(measuredValuesChannel, errorChannel, wg) } wg.Wait() } // ReadContinuously reads the measured values continously from sensors and writes // them to a channel. func ReadContinuously(ctx context.Context, sensors []Sensor, measuredValuesChannel chan<- []*types.MeasuredValue, errorChannel chan<- error) { for { select { case <-ctx.Done(): errorChannel <- fmt.Errorf("Context closed: %v", ctx.Err()) return default: ReadChannel(ctx, sensors, measuredValuesChannel, errorChannel) } } }