UNPKG

@iotile/iotile-device

Version:

A typescript library for interfacing with IOTile BLE devices

98 lines 4.42 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var iotile_common_1 = require("@iotile/iotile-common"); //Public domain code from https://gist.github.com/pascaldekloe/62546103a1576803dade9269ccf76330 function parseUTF8String(data) { var bytes = new Uint8Array(data); var i = 0; var s = ''; while (i < bytes.length) { var c = bytes[i++]; if (c > 127) { if (c > 191 && c < 224) { if (i >= bytes.length) throw new Error('UTF-8 decode: incomplete 2-byte sequence'); c = (c & 31) << 6 | bytes[i++] & 63; } else if (c > 223 && c < 240) { if (i + 1 >= bytes.length) throw new Error('UTF-8 decode: incomplete 3-byte sequence'); c = (c & 15) << 12 | (bytes[i++] & 63) << 6 | bytes[i++] & 63; } else if (c > 239 && c < 248) { if (i + 2 >= bytes.length) throw new Error('UTF-8 decode: incomplete 4-byte sequence'); c = (c & 7) << 18 | (bytes[i++] & 63) << 12 | (bytes[i++] & 63) << 6 | bytes[i++] & 63; } else throw new Error('UTF-8 decode: unknown multibyte start 0x' + c.toString(16) + ' at index ' + (i - 1)); } if (c <= 0xffff) { s += String.fromCharCode(c); } else if (c <= 0x10ffff) { c -= 0x10000; s += String.fromCharCode(c >> 10 | 0xd800); s += String.fromCharCode(c & 0x3FF | 0xdc00); } else { throw new Error('UTF-8 decode: code point 0x' + c.toString(16) + ' exceeds UTF-16 reach'); } } return s; } exports.parseUTF8String = parseUTF8String; /** * Turn a binary 128 bit uuid into a string of the format {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} * * All hex digits are printing in upper case. * * @param data A 16-byte data field containin a binary UUID in either little-endian * or big endian format. * @param reverse Reverse the 16-bytes before parsing them. This is useful if the * data is being sent as a 128-bit little endian value such as what * is included in Bluetooth advertisement packets. */ function parseBinaryUUID(data, reverse) { if (data.byteLength !== 16) throw new Error("A binary 128-bit uuid must be exactly 16 bytes long, length was " + data.byteLength); if (reverse) { var reversedData = new Uint8Array(16); var origData = new Uint8Array(data); for (var i = 0; i < 16; ++i) { reversedData[15 - i] = origData[i]; } data = reversedData.buffer; } var view = new DataView(data); var timeLow = iotile_common_1.numberToHexString(view.getUint32(0, false), 8); var timeMid = iotile_common_1.numberToHexString(view.getUint16(4, false), 4); var timeHigh = iotile_common_1.numberToHexString(view.getUint16(6, false), 4); var clockResHigh = iotile_common_1.numberToHexString(view.getUint8(8), 2); var clockResLow = iotile_common_1.numberToHexString(view.getUint8(9), 2); var node1 = iotile_common_1.numberToHexString(view.getUint16(10, false), 4); var node2 = iotile_common_1.numberToHexString(view.getUint32(12, false), 8); var guid = timeLow + "-" + timeMid + "-" + timeHigh + "-" + clockResHigh + clockResLow + "-" + node1 + node2; return guid.toUpperCase(); } exports.parseBinaryUUID = parseBinaryUUID; /** * Turn a binary 16 bit uuid into a string of the format {xxxx} * * All hex digits are printing in upper case. * * @param data A 2-byte data field containin a binary UUID in either little-endian * or big endian format. * @param reverse Reverse the 2-bytes before parsing them. This is useful if the * data is being sent as a 16-bit little endian value such as what * is included in Bluetooth advertisement packets. */ function parseBinary16BitUUID(data, reverse) { if (data.byteLength !== 2) throw new Error("A binary 16-bit uuid must be exactly 2 bytes long, length was " + data.byteLength); var view = new DataView(data); var UUID = iotile_common_1.numberToHexString(view.getUint16(0, reverse), 4); return UUID.toUpperCase(); } exports.parseBinary16BitUUID = parseBinary16BitUUID; //# sourceMappingURL=utilities.js.map