openrowingmonitor/app/ant/AntManager.js

64 lines
1.8 KiB
JavaScript

'use strict'
/*
Open Rowing Monitor, https://github.com/laberning/openrowingmonitor
This manager creates a module to listen to ANT+ devices.
This currently can be used to get the heart rate from ANT+ heart rate sensors.
Requires an ANT+ USB stick, the following models might work:
- Garmin USB or USB2 ANT+ or an off-brand clone of it (ID 0x1008)
- Garmin mini ANT+ (ID 0x1009)
*/
import log from 'loglevel'
import Ant from 'ant-plus'
import EventEmitter from 'node:events'
function createAntManager () {
const emitter = new EventEmitter()
const antStick = new Ant.GarminStick2()
const antStick3 = new Ant.GarminStick3()
// it seems that we have to use two separate heart rate sensors to support both old and new
// ant sticks, since the library requires them to be bound before open is called
const heartrateSensor = new Ant.HeartRateSensor(antStick)
const heartrateSensor3 = new Ant.HeartRateSensor(antStick3)
heartrateSensor.on('hbData', (data) => {
emitter.emit('heartrateMeasurement', { heartrate: data.ComputedHeartRate, batteryLevel: data.BatteryLevel })
})
heartrateSensor3.on('hbData', (data) => {
emitter.emit('heartrateMeasurement', { heartrate: data.ComputedHeartRate, batteryLevel: data.BatteryLevel })
})
antStick.on('startup', () => {
log.info('classic ANT+ stick found')
heartrateSensor.attach(0, 0)
})
antStick3.on('startup', () => {
log.info('mini ANT+ stick found')
heartrateSensor3.attach(0, 0)
})
antStick.on('shutdown', () => {
log.info('classic ANT+ stick lost')
})
antStick3.on('shutdown', () => {
log.info('mini ANT+ stick lost')
})
if (!antStick.open()) {
log.debug('classic ANT+ stick NOT found')
}
if (!antStick3.open()) {
log.debug('mini ANT+ stick NOT found')
}
return Object.assign(emitter, {
})
}
export { createAntManager }