From 840777b2fdb4cb8c12d716ffe94e3c3dca0d5cad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Rasmussen?= Date: Tue, 15 Mar 2022 17:09:53 +0100 Subject: [PATCH] Wait on slaves for w1 bus master bulk read --- cmd/fermentord/main.go | 2 -- pkg/temperature/ds18b20.go | 44 +++++++++++++++++++++++++++++++++++--- 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/cmd/fermentord/main.go b/cmd/fermentord/main.go index d2ea191..e8e9c5d 100644 --- a/cmd/fermentord/main.go +++ b/cmd/fermentord/main.go @@ -28,8 +28,6 @@ func mainLoop(ctx context.Context, wg *sync.WaitGroup, js nats.JetStream, config defer hub.Flush(10 * time.Second) defer wg.Done() - temperature.Initialize() - // Controller chCtrlTemp := make(chan temperature.TemperatureReading, 10) defer close(chCtrlTemp) diff --git a/pkg/temperature/ds18b20.go b/pkg/temperature/ds18b20.go index 873f5a8..5bd6521 100644 --- a/pkg/temperature/ds18b20.go +++ b/pkg/temperature/ds18b20.go @@ -18,8 +18,15 @@ import ( "github.com/getsentry/sentry-go" ) +type BulkReadBusState int + const ( + BulkReadIdle BulkReadBusState = 0 + BulkReadBusy BulkReadBusState = -1 + BulkReadReady BulkReadBusState = 1 + sensorConversionTime = 750 * time.Millisecond + busPollDelay = 10 * time.Millisecond ) var ( @@ -39,7 +46,7 @@ var ( filters map[string]*EWMAFilter ) -func Initialize() { +func init() { sensors = make([]string, 0) filters = make(map[string]*EWMAFilter) C = make(chan TemperatureReading, 30) @@ -60,6 +67,7 @@ func PollSensors(ctx context.Context, wg *sync.WaitGroup, readingInterval time.D defer ticker.Stop() for { + work_loop: select { case <-ticker.C: start := time.Now() @@ -91,8 +99,24 @@ func PollSensors(ctx context.Context, wg *sync.WaitGroup, readingInterval time.D time.Sleep(deltaSleep) } - // Read all sensors. - readSensors(hub) + // Poll bus state + poll_bus: + state, err := pollBusState() + if err != nil { + accErrTrigger++ + hub.CaptureException(err) + log.Print(err) + break work_loop + } + + switch state { + case BulkReadBusy: + time.Sleep(busPollDelay) + goto poll_bus + + case BulkReadIdle, BulkReadReady: + readSensors(hub) + } case c := <-ConfigUpdates: sensors = c @@ -153,6 +177,20 @@ func triggerBulkRead() error { return err } +func pollBusState() (BulkReadBusState, error) { + b, err := ioutil.ReadFile("/sys/bus/w1/devices/w1_bus_master1/therm_bulk_read") + if err != nil { + return BulkReadIdle, err + } + + i, err := strconv.Atoi(string(b)) + if err != nil { + return BulkReadIdle, err + } + + return BulkReadBusState(i), nil +} + // read returns the temperature of the specified sensor in millidegrees celcius. func read(sensor string) (int64, error) { path := filepath.Join("/sys/bus/w1/devices", sensor, "w1_slave")