You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

127 lines
3.2 KiB
JavaScript

var intToBytes = function(i, byteSize) {
var buf = new Buffer(byteSize);
for (var x = 0; x < byteSize; x++) {
buf[x] = i >> (x * 8);
}
return buf;
};
var unixtime = function(i) {
if (isNaN(i) || i < 0) {
throw new Error('Unix time must be positive');
}
return intToBytes(i, unixtime.BYTES);
};
unixtime.BYTES = 4;
var uint8 = function(i) {
if (isNaN(i) || i < 0 || i > 255) {
throw new Error('int be in range 0..255');
}
return intToBytes(i, uint8.BYTES);
};
uint8.BYTES = 1;
var uint16 = function(i) {
if (isNaN(i) || i < 0 || i > 65535) {
throw new Error('int be in range 0..65535');
}
return intToBytes(i, uint16.BYTES);
};
uint16.BYTES = 2;
var latLng = function(latitude, longitude) {
if (isNaN(latitude) || latitude < -90 || latitude > 90) {
throw new Error('Latitude must be between -90° and 90°');
}
if (isNaN(longitude) || longitude < -180 || longitude > 180) {
throw new Error('Longitude must be between -180° and 180°');
}
return Buffer.concat([
intToBytes(~~(latitude * 1e6), latLng.BYTES / 2),
intToBytes(~~(longitude * 1e6), latLng.BYTES / 2)
]);
};
latLng.BYTES = 8;
var temperature = function(i) {
if (isNaN(i) || i < -327.68 || i > 327.67) {
throw new Error('Temperature must be in range -327.68..327.67');
}
var t = ~~(Math.abs(i) * 1e2);
var b = ('0000000000000000' + Number(t >>> 0).toString(2)).slice(-16);
if (i < 0) {
var arr = b.split('').map(function(x) { return !Number(x); });
for (var o = arr.length - 1; o > 0; o--) {
arr[o] = !arr[o];
if (arr[o]) {
break;
}
}
b = arr.map(Number).join('');
}
return new Buffer([
parseInt(b.slice(-16, -8), 2),
parseInt(b.slice(-8), 2)
]);
};
temperature.BYTES = 2;
var humidity = function(i) {
if (isNaN(i) || i < 0 || i > 100) {
throw new Error('Humidity must be in range 0..100');
}
return intToBytes(i * 1e2, humidity.BYTES);
};
humidity.BYTES = 2;
var bitmap = function(a, b, c, d, e, f, g, h) { // eslint-disable-line no-unused-vars
var base = [];
for(var i = 0; i < 8; i++) {
var bit = arguments[i];
if (typeof bit === 'undefined') {
base[i] = false;
} else if (typeof bit !== 'boolean') {
throw new TypeError('Arguments must be of type boolean');
} else {
base[i] = bit;
}
}
var bm = parseInt(base.map(Number).join(''), 2);
return intToBytes(bm, bitmap.BYTES);
};
bitmap.BYTES = 1;
var encode = function(values, mask) {
if (!Array.isArray(values)) {
throw new TypeError('Values must be an array');
}
if (!Array.isArray(mask)) {
throw new TypeError('Mask must be an array');
}
if (values.length > mask.length) {
throw new Error('Mask length is ' + mask.length + ' whereas input is ' + values.length);
}
return Buffer.concat(values
.map(function(args, i) {
return mask[i].apply(null, Array.isArray(args) ? args : [args]);
}));
};
if (typeof module === 'object' && typeof module.exports !== 'undefined') {
module.exports = {
unixtime: unixtime,
uint8: uint8,
uint16: uint16,
temperature: temperature,
humidity: humidity,
latLng: latLng,
bitmap: bitmap,
encode: encode
};
}