From 0a48932baad7b42b8a1ef707a92a7618c107ec33 Mon Sep 17 00:00:00 2001 From: Erik Brakkee Date: Tue, 26 May 2026 15:48:26 +0200 Subject: [PATCH] seprating the ant+ code out. --- cmd/bridge/ant.go | 66 +++++++++++++++++++++++++++++++++++++++++ cmd/bridge/bluetooth.go | 1 + cmd/bridge/main.go | 55 ++++------------------------------ 3 files changed, 72 insertions(+), 50 deletions(-) create mode 100644 cmd/bridge/ant.go create mode 100644 cmd/bridge/bluetooth.go diff --git a/cmd/bridge/ant.go b/cmd/bridge/ant.go new file mode 100644 index 0000000..85f08cd --- /dev/null +++ b/cmd/bridge/ant.go @@ -0,0 +1,66 @@ +package main + +import ( + "context" + "fmt" + "io" + + "github.com/google/gousb" + "github.com/half2me/antgo/ant" + "github.com/half2me/antgo/device" + "github.com/half2me/antgo/driver/usb" +) + +func resetAndWait(drv io.ReadWriter) error { + if _, err := drv.Write(ant.SystemResetMessage()); err != nil { + return err + } + // drain until we see the startup message (0x6F) + for { + msg, err := ant.ReadMsg(drv) + if err != nil { + return err + } + if msg.Class() == ant.MESSAGE_STARTUP { + return nil + } + } +} + +func listenForAntDevice(vendorId gousb.ID, productId gousb.ID, deviceNumber uint32) { + drv, err := usb.GetDevice(vendorId, productId) + if err != nil { + panic(err) + } + defer drv.Close() + + fmt.Println("device opened") + + if err := resetAndWait(drv); err != nil { + panic(err) + } + if err := device.StartRxScanModeWait(drv); err != nil { + panic(err) + } + fmt.Println("scan mode started") + + msgs := make(chan ant.BroadcastMessage, 100) + go device.DumpBroadcastMessages(context.Background(), drv, msgs) + + fmt.Println("listening...") + for msg := range msgs { + if msg.DeviceNumber() != deviceNumber { + fmt.Printf("Received msg from ignored ant+ device %v\n", msg.DeviceNumber()) + continue + } + //fmt.Printf("raw msg: device type=0x%02x device number=%d content=%x\n", + // msg.DeviceType(), msg.DeviceNumber(), msg.Content()) + + switch msg.DeviceType() { + case ant.DEVICE_TYPE_POWER: + cur := ant.PowerMessage(msg) + fmt.Printf("%v: power: %dW cadence: %d rpm\n", + msg.DeviceNumber(), cur.InstantaneousPower(), cur.InstantaneousCadence()) + } + } +} diff --git a/cmd/bridge/bluetooth.go b/cmd/bridge/bluetooth.go new file mode 100644 index 0000000..06ab7d0 --- /dev/null +++ b/cmd/bridge/bluetooth.go @@ -0,0 +1 @@ +package main diff --git a/cmd/bridge/main.go b/cmd/bridge/main.go index 1c9bdff..953aa26 100644 --- a/cmd/bridge/main.go +++ b/cmd/bridge/main.go @@ -1,63 +1,18 @@ package main import ( - "context" "fmt" - "io" - "github.com/half2me/antgo/ant" - "github.com/half2me/antgo/device" - "github.com/half2me/antgo/driver/usb" + "github.com/google/gousb" ) -func resetAndWait(drv io.ReadWriter) error { - if _, err := drv.Write(ant.SystemResetMessage()); err != nil { - return err - } - // drain until we see the startup message (0x6F) - for { - msg, err := ant.ReadMsg(drv) - if err != nil { - return err - } - if msg.Class() == ant.MESSAGE_STARTUP { - return nil - } - } -} - func main() { - drv, err := usb.GetDevice(0x0fcf, 0x1008) - if err != nil { - panic(err) - } - defer drv.Close() - fmt.Println("device opened") + var vendorId gousb.ID = 0x0fcf + var productId gousb.ID = 0x1008 + var deviceNumber uint32 = 3001 - if err := resetAndWait(drv); err != nil { - panic(err) - } - if err := device.StartRxScanModeWait(drv); err != nil { - panic(err) - } - fmt.Println("scan mode started") - - msgs := make(chan ant.BroadcastMessage, 100) - go device.DumpBroadcastMessages(context.Background(), drv, msgs) - - fmt.Println("listening...") - for msg := range msgs { - //fmt.Printf("raw msg: device type=0x%02x device number=%d content=%x\n", - // msg.DeviceType(), msg.DeviceNumber(), msg.Content()) - - switch msg.DeviceType() { - case ant.DEVICE_TYPE_POWER: - cur := ant.PowerMessage(msg) - fmt.Printf("%v: power: %dW cadence: %d rpm\n", - msg.DeviceNumber(), cur.InstantaneousPower(), cur.InstantaneousCadence()) - } - } + listenForAntDevice(vendorId, productId, deviceNumber) fmt.Println("channel closed") }