91 lines
4.1 KiB
JavaScript
91 lines
4.1 KiB
JavaScript
'use strict'
|
|
/*
|
|
Open Rowing Monitor, https://github.com/laberning/openrowingmonitor
|
|
|
|
This seems to be the central service to get information about the workout
|
|
This Primary Service provides a lot of stuff that we most certainly do not need to simulate a
|
|
simple PM5 service.
|
|
|
|
todo: figure out to which services some common applications subscribe and then just implement those
|
|
// fluid simulation uses GeneralStatus STROKESTATE_DRIVING
|
|
// cloud simulation uses MULTIPLEXER, AdditionalStatus -> currentPace
|
|
// EXR: subscribes to: 'general status', 'additional status', 'additional status 2', 'additional stroke data'
|
|
Might implement:
|
|
* GeneralStatus
|
|
* AdditionalStatus
|
|
* AdditionalStatus2
|
|
* (StrokeData)
|
|
* AdditionalStrokeData
|
|
* and of course the multiplexer
|
|
*/
|
|
import bleno from '@abandonware/bleno'
|
|
import { getFullUUID } from './Pm5Constants.js'
|
|
import ValueReadCharacteristic from './characteristic/ValueReadCharacteristic.js'
|
|
import MultiplexedCharacteristic from './characteristic/MultiplexedCharacteristic.js'
|
|
import GeneralStatus from './characteristic/GeneralStatus.js'
|
|
import AdditionalStatus from './characteristic/AdditionalStatus.js'
|
|
import AdditionalStatus2 from './characteristic/AdditionalStatus2.js'
|
|
import AdditionalStrokeData from './characteristic/AdditionalStrokeData.js'
|
|
import StrokeData from './characteristic/StrokeData.js'
|
|
|
|
export default class PM5RowingService extends bleno.PrimaryService {
|
|
constructor () {
|
|
const multiplexedCharacteristic = new MultiplexedCharacteristic()
|
|
const generalStatus = new GeneralStatus(multiplexedCharacteristic)
|
|
const additionalStatus = new AdditionalStatus(multiplexedCharacteristic)
|
|
const additionalStatus2 = new AdditionalStatus2(multiplexedCharacteristic)
|
|
const strokeData = new StrokeData(multiplexedCharacteristic)
|
|
const additionalStrokeData = new AdditionalStrokeData(multiplexedCharacteristic)
|
|
super({
|
|
uuid: getFullUUID('0030'),
|
|
characteristics: [
|
|
// C2 rowing general status
|
|
generalStatus,
|
|
// C2 rowing additional status
|
|
additionalStatus,
|
|
// C2 rowing additional status 2
|
|
additionalStatus2,
|
|
// C2 rowing general status and additional status samplerate
|
|
new ValueReadCharacteristic(getFullUUID('0034'), 'samplerate', 'samplerate'),
|
|
// C2 rowing stroke data
|
|
strokeData,
|
|
// C2 rowing additional stroke data
|
|
additionalStrokeData,
|
|
// C2 rowing split/interval data
|
|
new ValueReadCharacteristic(getFullUUID('0037'), 'split data', 'split data'),
|
|
// C2 rowing additional split/interval data
|
|
new ValueReadCharacteristic(getFullUUID('0038'), 'additional split data', 'additional split data'),
|
|
// C2 rowing end of workout summary data
|
|
new ValueReadCharacteristic(getFullUUID('0039'), 'workout summary', 'workout summary'),
|
|
// C2 rowing end of workout additional summary data
|
|
new ValueReadCharacteristic(getFullUUID('003A'), 'additional workout summary', 'additional workout summary'),
|
|
// C2 rowing heart rate belt information
|
|
new ValueReadCharacteristic(getFullUUID('003B'), 'heart rate belt information', 'heart rate belt information'),
|
|
// C2 force curve data
|
|
new ValueReadCharacteristic(getFullUUID('003D'), 'force curve data', 'force curve data'),
|
|
// C2 multiplexed information
|
|
multiplexedCharacteristic
|
|
]
|
|
})
|
|
this.generalStatus = generalStatus
|
|
this.additionalStatus = additionalStatus
|
|
this.additionalStatus2 = additionalStatus2
|
|
this.strokeData = strokeData
|
|
this.additionalStrokeData = additionalStrokeData
|
|
this.multiplexedCharacteristic = multiplexedCharacteristic
|
|
}
|
|
|
|
notifyData (type, data) {
|
|
if (type === 'strokeFinished' || type === 'metricsUpdate') {
|
|
this.generalStatus.notify(data)
|
|
this.additionalStatus.notify(data)
|
|
this.additionalStatus2.notify(data)
|
|
this.strokeData.notify(data)
|
|
this.additionalStrokeData.notify(data)
|
|
} else if (type === 'strokeStateChanged') {
|
|
// the stroke state is delivered via the GeneralStatus Characteristic, so we only need to notify that one
|
|
this.generalStatus.notify(data)
|
|
}
|
|
}
|
|
}
|