UNPKG

ojousima.ruuvi_endpoints.ts

Version:
95 lines (94 loc) 4.43 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.df5parser = void 0; var ruuvitagbroadcast_1 = require("./ruuvitagbroadcast"); var dataFormatStart = 0; var dataFormatEnd = dataFormatStart + 1; var temperatureStart = dataFormatEnd; var temperatureEnd = temperatureStart + 2; var temperatureInvalid = -32768; var humidityStart = temperatureEnd; var humidityEnd = humidityStart + 2; var humidityInvalid = 65535; var pressureStart = humidityEnd; var pressureEnd = pressureStart + 2; var pressureInvalid = 65535; var accelerationXStart = pressureEnd; var accelerationXEnd = accelerationXStart + 2; var accelerationYStart = accelerationXEnd; var accelerationYEnd = accelerationYStart + 2; var accelerationZStart = accelerationYEnd; var accelerationZEnd = accelerationZStart + 2; var accelerationInvalid = -32768; var powerStart = accelerationZEnd; var powerEnd = powerStart + 2; var batteryInvalid = 1600 + 2047; var txInvalid = 31; var movementStart = powerEnd; var movementEnd = movementStart + 1; var movementInvalid = 0xff; var sequenceStart = movementEnd; var sequenceEnd = sequenceStart + 2; var sequenceInvalid = 0xffff; var addressStart = sequenceEnd; var addressEnd = addressStart + 6; var addressInvalid = 0xffffffffffff; var df5parser = function (data) { if (data.length < addressEnd - 1 || 0x05 !== data[0]) { throw new Error('Not DF5 data'); } var robject = new ruuvitagbroadcast_1.RuuviTagBroadcast(); robject.dataFormat = data[dataFormatStart]; var temperatureBytes = data.slice(temperatureStart, temperatureEnd); var temperature = temperatureBytes[0] * 256 + temperatureBytes[1]; if (temperature > 32767) { temperature -= 65535; } robject.temperatureC = temperature === temperatureInvalid ? null : temperature / 200.0; var humidityBytes = data.slice(humidityStart, humidityEnd); var humidity = humidityBytes[0] * 256 + humidityBytes[1]; robject.humidityRh = humidityInvalid === humidity ? null : humidity / 400.0; var pressureBytes = data.slice(pressureStart, pressureEnd); var pressure = pressureBytes[0] * 256 + pressureBytes[1]; robject.pressurePa = pressureInvalid === pressure ? null : pressure + 50000; var accelerationBytes = data.slice(accelerationXStart, accelerationXEnd); // milli-g var accelerationX = accelerationBytes[0] * 256 + accelerationBytes[1]; if (accelerationX > 32767) { accelerationX -= 65536; // two's complement } robject.accelerationXG = accelerationInvalid === accelerationX ? null : accelerationX / 1000.0; accelerationBytes = data.slice(accelerationYStart, accelerationYEnd); var accelerationY = accelerationBytes[0] * 256 + accelerationBytes[1]; if (accelerationY > 32767) { accelerationY -= 65536; // two's complement } robject.accelerationYG = accelerationInvalid === accelerationY ? null : accelerationY / 1000.0; accelerationBytes = data.slice(accelerationZStart, accelerationZEnd); var accelerationZ = accelerationBytes[0] * 256 + accelerationBytes[1]; if (accelerationZ > 32767) { accelerationZ -= 65536; // two's complement } robject.accelerationZG = accelerationInvalid === accelerationZ ? null : accelerationZ / 1000.0; var powerBytes = data.slice(powerStart, powerEnd); var battery = powerBytes[0] * 8 + Math.floor(powerBytes[1] / 32); robject.batteryVoltageV = batteryInvalid === battery ? null : (battery + 1600) / 1000.0; var tx = powerBytes[1] % 32; robject.txPowerDBm = txInvalid === tx ? null : tx * 2 - 40; var movementBytes = data.slice(movementStart, movementEnd); var movement = movementBytes[0]; robject.movementCounter = movementInvalid === movement ? null : movement; var sequenceBytes = data.slice(sequenceStart, sequenceEnd); var sequence = sequenceBytes[0] * 256 + sequenceBytes[1]; robject.measurementSequence = sequenceInvalid === sequence ? null : sequence; var addressBytes = data.slice(addressStart, addressEnd); // Sorry, but lint says so. var address = addressBytes[0] * 256 * 256 * 256 * 256 * 256 + addressBytes[1] * 256 * 256 * 256 * 256 + addressBytes[2] * 256 * 256 * 256 + addressBytes[3] * 256 * 256 + addressBytes[4] * 256 + addressBytes[5]; robject.mac = addressInvalid === address ? null : address; return robject; }; exports.df5parser = df5parser;