ojousima.ruuvi_endpoints.ts
Version:
Experiments with RuuviTags and TS
95 lines (94 loc) • 4.43 kB
JavaScript
"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;