@iotize/tap
Version:
IoTize Device client for Javascript
90 lines • 6.27 kB
JavaScript
import { Checksum } from '@iotize/tap/client/impl';
/**
* Created by IoTize on 19/04/2018.
*
* Split data into chunks with a size of maxPacketSize + 1
* @param {Array} data
* @param {number} maxPacketSize
* @class
*/
export class BLEPacketSplitter {
/**
*
* @param data
* @param maxPacketSize
*/
constructor(data, maxPacketSize) {
this.lastPacketSize = 0;
this.maxPacketSize = 0;
this.currentPacketIndex = 0;
if (maxPacketSize < 1) {
throw new Error('Packet size must be greater than 0');
}
this.data = data;
this.maxPacketSize = maxPacketSize;
this.currentPacketIndex = this.getTotalNumberOfPacket() - 1;
this.lastPacketSize = this.getLastPacketSize();
}
/**
* Create a BLEPacketSplitter instance from data and add the checksum at the end
* @param {Array} data body data
* @param {number} maxPacketSize packet size
* @return {BLEPacketSplitter} the new instance
*/
static wrapWithChecksum(data, maxPacketSize) {
var checkSum = BLEPacketSplitter.computeChecksum(data);
var wrappedData = new Uint8Array(data.length + 1);
wrappedData.set(data);
wrappedData.set([checkSum & 0xff], data.length);
return new BLEPacketSplitter(wrappedData, maxPacketSize);
}
getTotalNumberOfPacket() {
return (((this.data.length / this.maxPacketSize) | 0) +
(this.data.length % this.maxPacketSize === 0 ? 0 : 1));
}
getLastPacketSize() {
let result = this.data.length % this.maxPacketSize;
if (result === 0) {
result = this.maxPacketSize;
}
return result;
}
getPackets() {
let packets = [];
while (this.hasNextPacket()) {
packets.push(this.getNextPacket());
}
return packets;
}
getNextPacket() {
let packetSize;
let offset;
if (this.currentPacketIndex > 0) {
offset =
this.lastPacketSize +
(this.currentPacketIndex - 1) * this.maxPacketSize;
packetSize = this.maxPacketSize;
}
else {
offset = 0;
packetSize = this.lastPacketSize;
}
let packet = new Uint8Array(packetSize + 1);
packet[0] = offset | 0;
for (let i = 0; i < packetSize; i++) {
packet[i + 1] = this.data[offset + i];
}
this.currentPacketIndex--;
return packet;
}
hasNextPacket() {
return this.currentPacketIndex >= 0;
}
static computeChecksum(data) {
return Checksum.compute(data) & 0xff;
}
getTotalSize() {
return this.data.length;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxlLXBhY2tldC1zcGxpdHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb3RvY29sL2JsZS9jb21tb24vc3JjL2xpYi9ibGUtcGFja2V0LXNwbGl0dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVuRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxPQUFPLGlCQUFpQjtJQVM1Qjs7OztPQUlHO0lBQ0gsWUFBbUIsSUFBZ0IsRUFBRSxhQUFxQjtRQUN4RCxJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLElBQUksYUFBYSxHQUFHLENBQUMsRUFBRTtZQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7U0FDdkQ7UUFDRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDakQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLGdCQUFnQixDQUM1QixJQUFnQixFQUNoQixhQUFxQjtRQUVyQixJQUFJLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkQsSUFBSSxXQUFXLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNsRCxXQUFXLENBQUMsR0FBRyxDQUFD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