openrowingmonitor/app/ble/pm5/characteristic/MultiplexedCharacteristic.js

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
}
}