refactor: temperature

This commit is contained in:
2019-02-24 22:46:36 +01:00
parent d6f41b8105
commit 1a3a31c5f2
24 changed files with 605 additions and 292 deletions

View File

@ -3,14 +3,19 @@ package sensor
import (
"log"
"git.cryptic.systems/fh-trier/go-flucky-server/pkg/types"
"git.cryptic.systems/fh-trier/go-flucky/pkg/types"
)
type DHT11Sensor struct {
*types.Sensor
}
func (s *DHT11Sensor) Read() (interface{}, error) {
func (s *DHT11Sensor) ReadHumidity() (*types.Humidity, error) {
log.Println("DHT11 Read Method not yet implemented")
return nil, nil
}
func (s *DHT11Sensor) ReadTemperature() (*types.Temperature, error) {
log.Println("DHT11 Read Method not yet implemented")
return nil, nil
}

View File

@ -3,14 +3,19 @@ package sensor
import (
"log"
"git.cryptic.systems/fh-trier/go-flucky-server/pkg/types"
"git.cryptic.systems/fh-trier/go-flucky/pkg/types"
)
type DHT22Sensor struct {
*types.Sensor
}
func (s *DHT22Sensor) Read() (interface{}, error) {
func (s *DHT22Sensor) ReadHumidity() (*types.Humidity, error) {
log.Println("DHT11 Read Method not yet implemented")
return nil, nil
}
func (s *DHT22Sensor) ReadTemperature() (*types.Temperature, error) {
log.Println("DHT22 Read Method not yet implemented")
return nil, nil
}

View File

@ -4,7 +4,7 @@ import (
"fmt"
"time"
"git.cryptic.systems/fh-trier/go-flucky-server/pkg/types"
"git.cryptic.systems/fh-trier/go-flucky/pkg/types"
uuid "github.com/satori/go.uuid"
"github.com/yryz/ds18b20"
)
@ -13,7 +13,7 @@ type DS18B20 struct {
*types.Sensor
}
func (s *DS18B20) Read() (interface{}, error) {
func (s *DS18B20) ReadTemperature() (*types.Temperature, error) {
t, err := ds18b20.Temperature(*s.WireID)
if err != nil {

View File

@ -1,7 +1,115 @@
package sensor
type Sensor interface {
Read() (interface{}, error)
import (
"sync"
"git.cryptic.systems/fh-trier/go-flucky/pkg/internal/errutils"
"git.cryptic.systems/fh-trier/go-flucky/pkg/types"
)
type HumiditySensor interface {
ReadHumidity() (*types.Humidity, error)
}
// func ReadTemperatures
type TemperatureSensor interface {
ReadTemperature() (*types.Temperature, error)
}
func ReadHumidities(humiditySensors []HumiditySensor) ([]*types.Humidity, error) {
wg := new(sync.WaitGroup)
wg.Add(len(humiditySensors))
errChannel := make(chan error, len(humiditySensors))
humidityChannel := make(chan *types.Humidity, len(humiditySensors))
for _, humiditySensor := range humiditySensors {
go func(hs HumiditySensor) {
defer wg.Done()
humidity, err := hs.ReadHumidity()
if err != nil {
errChannel <- err
humidityChannel <- nil
}
errChannel <- nil
humidityChannel <- humidity
}(humiditySensor)
}
wg.Wait()
errorList := errutils.CollectErrors(errChannel)
if err := errutils.FormatErrors(errorList); err != nil {
return nil, err
}
humidityList := collectHumidities(humidityChannel)
return humidityList, nil
}
func ReadTemperatures(temperatureSensors []TemperatureSensor) ([]*types.Temperature, error) {
wg := new(sync.WaitGroup)
wg.Add(len(temperatureSensors))
errChannel := make(chan error, len(temperatureSensors))
temperatureChannel := make(chan *types.Temperature, len(temperatureSensors))
for _, temperatureSensor := range temperatureSensors {
go func(ts TemperatureSensor) {
defer wg.Done()
temperature, err := ts.ReadTemperature()
if err != nil {
errChannel <- err
}
temperatureChannel <- temperature
}(temperatureSensor)
}
wg.Wait()
errorList := errutils.CollectErrors(errChannel)
if err := errutils.FormatErrors(errorList); err != nil {
return nil, err
}
temperatureList := collectTemperatures(temperatureChannel)
return temperatureList, nil
}
func collectHumidities(humChan <-chan *types.Humidity) []*types.Humidity {
humidityList := make([]*types.Humidity, 0)
for {
select {
case hum, more := <-humChan:
if more {
humidityList = append(humidityList, hum)
continue
}
return nil
default:
return humidityList
}
}
}
func collectTemperatures(tempChan <-chan *types.Temperature) []*types.Temperature {
temperatureList := make([]*types.Temperature, 0)
for {
select {
case temp, more := <-tempChan:
if more {
temperatureList = append(temperatureList, temp)
continue
}
return nil
default:
return temperatureList
}
}
}