112 lines
3.2 KiB
JavaScript
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);
|
|
})
|
|
}
|
|
})
|