Files
prostarsolar/python-driver/lambda.js
2018-01-08 18:26:08 -06:00

112 lines
3.2 KiB
JavaScript

var assert = require('assert');
var topic = {"ChannelName":"t_amb","DeviceAddress":"c4:93:00:0a:8a:0d:01:99","DeviceType":"prostarsolar","GatewayAddress":"C493000A8A0D","TechName":"prostarsolar_[c4:93:00:0a:8a:0d:01:99]","TenantID":194};
var payload = {"Timestamp":1515422927,"Value":"0"};
var now = 1515422927;
var lambda = function(topic, payload, now){
var inpValue = parseInt(payload.Value);
var outValue;
var binaryInput = Array(16).join("0") + inpValue.toString(2);
var binRep = binaryInput.substring(binaryInput.length - 16);
var sign = 1;
var fraction;
if (parseInt(binRep[0]) === 1){
sign = -1;
}
var exponent = parseInt(binRep.substring(1, 6), 2);
if (exponent === 30.0){
fraction = parseInt("1".concat(binRep.substring(7, 17)), 2);
} else {
fraction = parseInt(binRep.substring(7, 17), 2);
}
if (exponent === 0){
outValue = sign * Math.pow(2,-14) * fraction / Math.pow(2.0, 10.0);
} else if (exponent === 0b11111){
if (fraction == 0){
outValue = sign * Infinity;
} else {
outValue = NaN;
}
} else {
var frac_part = 1.0 + fraction / Math.pow(2.0, 10.0);
outValue = sign * Math.pow(2 , exponent - 15) * frac_part;
}
return outValue;
}
var intToFloat16 = function(intToConvert){
var binRep = pad(intToConvert.toString(2), 16, "0");
var sign = 1;
var fraction;
if (parseInt(binRep[0]) === 1){
sign = -1;
}
var exponent = parseInt(binRep.substring(1, 6), 2);
if (exponent === 30.0){
fraction = parseInt("1".concat(binRep.substring(7, 17)), 2);
} else {
fraction = parseInt(binRep.substring(7, 17), 2);
}
// console.log("Sign: " + sign);
// console.log("exponent: " + exponent + " -- " + binRep.substring(1, 6));
// console.log("fraction: " + fraction);
if (exponent === 0){
return sign * (2 ** -14) * fraction / (2.0 ** 10.0);
} else if (exponent === 0b11111){
if (fraction == 0){
return sign * Infinity;
} else {
return NaN;
}
} else {
var frac_part = 1.0 + fraction / (2.0 ** 10.0);
return sign * (2 ** (exponent - 15)) * frac_part;
}
}
var pad = function(start, numChars, padWith){
var fullString = Array(numChars).join(padWith) + start;
return fullString.substring(fullString.length - 16);
}
var test_values = [
[0b0000000000000000, 0.],
[0b1000000000000000, -0.],
[0b0011110000000000, 1],
[0b0011110000000001, 1.0009765625],
[0b1011110000000001, -1.0009765625],
[0b1100000000000000, -2],
[0b0100000000000000, 2],
[0b0111101111111111, 65504.],
[0b1111101111111111, -65504.],
[0b0000010000000000, 6.10352e-5],
[0b0000001111111111, 6.09756e-5],
[0b0000000000000001, 5.96046e-8],
[0b0111110000000000, Infinity],
[0b1111110000000000, -Infinity],
[0b0011010101010101, 0.333251953125]
]
describe('intToFloat16', function(){
for (var i = 0; i < test_values.length; i++){
var testInput = test_values[i][0];
var expectedVal = test_values[i][1];
payload.Value = testInput;
// var testVal = intToFloat16(testInput);
var testVal = lambda(topic, payload, now);
it("should return " + test_values[i][1] + " for " + test_values[i][0].toString(2) + " : " + testVal, function(){
assert.equal(testVal, expectedVal);
})
}
})