diff --git a/app/peripherals/ant/AntManager.js b/app/peripherals/ant/AntManager.js index d268c54..c4a5384 100644 --- a/app/peripherals/ant/AntManager.js +++ b/app/peripherals/ant/AntManager.js @@ -10,42 +10,27 @@ - Garmin mini ANT+ (ID 0x1009) */ import log from 'loglevel' -import Ant from 'ant-plus' +import { AntDevice } from 'incyclist-ant-plus/lib/bindings/index.js' export default class AntManager { _isStickOpen = false + _stick = new AntDevice({ startupTimeout: 2000 }) - constructor () { - // 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 - this._stick = new Ant.GarminStick3() // 0fcf:1009 - if (!this._stick.is_present()) { - this._stick = new Ant.GarminStick2() // 0fcf:1008 - } + async openAntStick () { + if (this._isStickOpen) return + if (!(await this._stick.open())) { throw (new Error('Error opening Ant Stick')) } + + log.info('ANT+ stick found') + this._isStickOpen = true } - openAntStick () { - return new Promise((resolve, reject) => { - if (!this._stick.open()) { - reject(new Error('Error opening Ant Stick')) - } - this._stick.once('startup', () => { - log.info('ANT+ stick found') - this._isStickOpen = true - resolve(this._stick) - }) - }) - } + async closeAntStick () { + if (!this._isStickOpen) return - closeAntStick () { - return new Promise(resolve => { - this._stick.once('shutdown', () => { - log.info('ANT+ stick is closed') - this._isStickOpen = false - resolve() - }) - this._stick.close() - }) + if (!(await this._stick.close())) { throw (new Error('Error closing Ant Stick')) } + + log.info('ANT+ stick is closed') + this._isStickOpen = false } isStickOpen () { diff --git a/app/peripherals/ant/HrmPeripheral.js b/app/peripherals/ant/HrmPeripheral.js index e85ea66..99fe289 100644 --- a/app/peripherals/ant/HrmPeripheral.js +++ b/app/peripherals/ant/HrmPeripheral.js @@ -6,35 +6,33 @@ a Cycling Speed and Cadence Profile */ import EventEmitter from 'node:events' -import Ant from 'ant-plus' +import log from 'loglevel' +import { HeartRateSensor } from 'incyclist-ant-plus' function createAntHrmPeripheral (antManager) { const emitter = new EventEmitter() const antStick = antManager.getAntStick() + const heartRateSensor = new HeartRateSensor(0) - const heartRateSensor = new Ant.HeartRateSensor(antStick) + async function attach () { + if (!antManager.isStickOpen()) { await antManager.openAntStick() } + this.channel = await antStick.getChannel() - heartRateSensor.on('hbData', (data) => { - emitter.emit('heartRateMeasurement', { heartrate: data.ComputedHeartRate, batteryLevel: data.BatteryLevel }) - }) - - function attach () { - return new Promise(resolve => { - heartRateSensor.once('attached', () => { - resolve() - }) - heartRateSensor.attach(0, 0) + this.channel.on('data', (profile, deviceID, data) => { + emitter.emit('heartRateMeasurement', { heartrate: data.ComputedHeartRate, batteryLevel: data.BatteryLevel }) }) + + if (!(await this.channel.startSensor(heartRateSensor))) { + log.error('Could not start ANT+ heart rate sensor') + } } - function destroy () { - return new Promise((resolve) => { - heartRateSensor.once('detached', () => { - heartRateSensor.removeAllListeners() - resolve() - }) - heartRateSensor.detach() - }) + async function destroy () { + if (!this.channel) { + log.debug('Ant Sensor does not seem to be running') + return + } + await this.channel.stopSensor(heartRateSensor) } return Object.assign(emitter, { diff --git a/package.json b/package.json index e59db40..d1fbe6e 100644 --- a/package.json +++ b/package.json @@ -33,9 +33,9 @@ "dependencies": { "@abandonware/bleno": "0.5.1-4", "@abandonware/noble": "1.9.2-15", - "ant-plus": "0.1.24", "finalhandler": "1.1.2", "form-data": "4.0.0", + "incyclist-ant-plus": "^0.1.15", "lit": "2.1.3", "loglevel": "1.8.0", "nosleep.js": "0.12.0",