improved bluetooth loop

This commit is contained in:
Erik Brakkee 2026-05-26 17:27:27 +02:00
parent b5b3610b70
commit 10d8f6bb97

View File

@ -3,6 +3,7 @@ package main
import ( import (
"encoding/binary" "encoding/binary"
"fmt" "fmt"
"math"
"os/exec" "os/exec"
"time" "time"
@ -53,31 +54,41 @@ func main() {
})) }))
must(adapter.DefaultAdvertisement().Start()) must(adapter.DefaultAdvertisement().Start())
fmt.Println("BLE advertising...") fmt.Println("BLE advertising...")
var crankRevs uint16
var lastCrankEventTime uint16
var totalRevs float64
var lastCompletedRev float64 // time in 1/1024s of last completed revolution
lastUpdate := time.Now()
var elapsedTicks float64
for { for {
sec := time.Now().Second() now := time.Now()
deltaT := now.Sub(lastUpdate).Seconds()
lastUpdate = now
sec := now.Second()
watts := uint16(100 + sec) watts := uint16(100 + sec)
rpm := uint16(50 + sec) rpm := float64(50 + sec)
// advance crank event time based on rpm totalRevs += rpm / 60.0 * deltaT
// time between crank events = 1024*60/rpm ticks elapsedTicks += deltaT * 1024.0
crankEventInterval := uint16(1024 * 60 / rpm)
lastCrankEventTime += crankEventInterval completedRevs := math.Floor(totalRevs)
crankRevs++ // 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
// flags: bit 5 = crank revolution data present
payload := make([]byte, 8) payload := make([]byte, 8)
binary.LittleEndian.PutUint16(payload[0:], 0x20) binary.LittleEndian.PutUint16(payload[0:], 0x20)
binary.LittleEndian.PutUint16(payload[2:], watts) binary.LittleEndian.PutUint16(payload[2:], watts)
binary.LittleEndian.PutUint16(payload[4:], crankRevs) binary.LittleEndian.PutUint16(payload[4:], uint16(completedRevs))
binary.LittleEndian.PutUint16(payload[6:], lastCrankEventTime) binary.LittleEndian.PutUint16(payload[6:], uint16(lastCompletedRev))
powerChar.Write(payload) powerChar.Write(payload)
fmt.Printf("watts: %d rpm: %d crankRevs: %d eventTime: %d\n", watts, rpm, crankRevs, lastCrankEventTime) fmt.Printf("watts: %d rpm: %.0f completedRevs: %.0f lastRevTime: %.0f\n",
watts, rpm, completedRevs, lastCompletedRev)
time.Sleep(time.Second) time.Sleep(250 * time.Millisecond)
} }
} }