60 lines
1.8 KiB
JavaScript
60 lines
1.8 KiB
JavaScript
'use strict'
|
|
/*
|
|
Open Rowing Monitor, https://github.com/laberning/openrowingmonitor
|
|
|
|
Implements the Multiplexed Characteristic as defined by the spec:
|
|
|
|
"On some Android platforms, there is a limitation to the number of notification messages allowed.
|
|
To circumvent this issue, a single characteristic (C2 multiplexed data
|
|
info) exists to allow multiple characteristics to be multiplexed onto a single characteristic. The last byte in the
|
|
characteristic will indicate which data characteristic is multiplexed."
|
|
*/
|
|
import bleno from '@abandonware/bleno'
|
|
import { getFullUUID } from '../Pm5Constants.js'
|
|
import log from 'loglevel'
|
|
|
|
export default class MultiplexedCharacteristic extends bleno.Characteristic {
|
|
constructor () {
|
|
super({
|
|
// id for MultiplexedInformation as defined in the spec
|
|
uuid: getFullUUID('0080'),
|
|
value: null,
|
|
properties: ['notify']
|
|
})
|
|
this._updateValueCallback = null
|
|
}
|
|
|
|
onSubscribe (maxValueSize, updateValueCallback) {
|
|
log.debug(`MultiplexedCharacteristic - central subscribed with maxSize: ${maxValueSize}`)
|
|
this._updateValueCallback = updateValueCallback
|
|
return this.RESULT_SUCCESS
|
|
}
|
|
|
|
onUnsubscribe () {
|
|
log.debug('MultiplexedCharacteristic - central unsubscribed')
|
|
this._updateValueCallback = null
|
|
return this.RESULT_UNLIKELY_ERROR
|
|
}
|
|
|
|
centralSubscribed () {
|
|
return this._updateValueCallback !== null
|
|
}
|
|
|
|
notify (id, characteristicBuffer) {
|
|
const characteristicId = Buffer.alloc(1)
|
|
characteristicId.writeUInt8(id, 0)
|
|
const buffer = Buffer.concat(
|
|
[
|
|
characteristicId,
|
|
characteristicBuffer
|
|
],
|
|
characteristicId.length + characteristicBuffer.length
|
|
)
|
|
|
|
if (this._updateValueCallback) {
|
|
this._updateValueCallback(buffer)
|
|
}
|
|
return this.RESULT_SUCCESS
|
|
}
|
|
}
|