diff --git a/cmd/bridge/bluetooth.go b/cmd/bridge/bluetooth.go index 6e6791b..e0cc0ae 100644 --- a/cmd/bridge/bluetooth.go +++ b/cmd/bridge/bluetooth.go @@ -51,14 +51,19 @@ func ExposeBluetooth(events <-chan Event) { must(adapter.DefaultAdvertisement().Start()) logMsg("bt: BLE advertising...") - var totalRevs float64 - var lastCompletedRev float64 // time in 1/1024s of last completed revolution - lastUpdate := time.Now() - var elapsedTicks float64 + var totalRevs float64 = 0.0 + var elapsedTicks float64 = 0.0 + + // initial event. + event := <-events + lastUpdateTime := event.Now + var lastCompletedRevs float64 = 0.0 + var lastRevTicks float64 = 0.0 // time in 1/1024s of last completed revolution + for event := range events { now := event.Now - deltaT := now.Sub(lastUpdate).Seconds() - lastUpdate = now + deltaT := now.Sub(lastUpdateTime).Seconds() + lastUpdateTime = now watts := event.Power rpm := float64(event.Cadence) @@ -67,23 +72,33 @@ func ExposeBluetooth(events <-chan Event) { elapsedTicks += deltaT * 1024.0 completedRevs := math.Floor(totalRevs) - // time at which the last completed revolution occurred - // = current time - fractional part of revolution * time per revolution - fracRev := totalRevs - completedRevs - timePerRev := 1024.0 * 60.0 / rpm - lastCompletedRev = elapsedTicks - fracRev*timePerRev + + if completedRevs > lastCompletedRevs { + // we crossed a new full RPM so comput the last time of that rotation + + // time at which the last completed revolution occurred + // = current time - fractional part of revolution * time per revolution + fracRev := totalRevs - completedRevs + ticksPerRev := 1024.0 * 60.0 / rpm + + lastRevTicks = elapsedTicks - fracRev*ticksPerRev + lastCompletedRevs = completedRevs + + } else { + // No change we need to emit the same data ss before. + } payload := make([]byte, 8) binary.LittleEndian.PutUint16(payload[0:], bleSignalDetectedFlag) binary.LittleEndian.PutUint16(payload[2:], watts) - binary.LittleEndian.PutUint16(payload[4:], uint16(completedRevs)) - binary.LittleEndian.PutUint16(payload[6:], uint16(lastCompletedRev)) + binary.LittleEndian.PutUint16(payload[4:], uint16(lastCompletedRevs)) + binary.LittleEndian.PutUint16(payload[6:], uint16(lastRevTicks)) if _, err := powerChar.Write(payload); err != nil { logPrintf("bt: failed to write power characteristic: %v\n", err) } logPrintf("bt: watts: %d rpm: %.0f completedRevs: %.0f lastRevTime: %.0f processingDelay: %v\n", - watts, rpm, completedRevs, lastCompletedRev, time.Now().Sub(now)) + watts, rpm, completedRevs, lastRevTicks, time.Now().Sub(now)) } logMsg("bt: BLE advertising stopped") } diff --git a/run.sh b/run.sh index 78c22a1..b1180ee 100755 --- a/run.sh +++ b/run.sh @@ -1,3 +1,13 @@ #!/bin/bash -systemd-inhibit --what=idle:sleep --why="Do not interrupt cycling" $( dirname $0 )/bin/bridge + + +while : +do + systemd-inhibit --what=idle:sleep --why="Do not interrupt cycling" $( dirname $0 )/bin/bridge "$@" + if [[ $? -ne 0 ]] + then + echo "ERROR: bridge exited with ERROR" 1>&2 + fi + sleep 1 +done