Well, I’ve experienced same behavior. Some frames are no decoded due to “execution timeout”.
// Decode decodes an array of bytes into an object.
// - fPort contains the LoRaWAN fPort number
// - bytes is an array of bytes, e.g. [225, 230, 255, 0]
// The function must return an object, e.g. {"temperature": 22.5}
function Decode(fPort, bytes) {
function timestamp_generator(secondsTakenOff) {
var date = new Date();
date.setUTCSeconds(date.getUTCSeconds() - secondsTakenOff);
return date.toISOString();
}
var header = bytes[0] >> 6;
switch(header) {
case 0:
pressure = (bytes[0] & 63) << 6 | bytes[1] >> 2;
humidity = (bytes[1] & 3) << 5 | bytes[2] >> 3;
height_1 = (bytes[2] & 7) << 9 | bytes[3] << 1 | bytes[4] >> 7;
height_1_delta_1 = (bytes[4] & 127) << 1 | bytes[5] >> 7;
height_2 = (bytes[5] & 127) << 5 | bytes[6] >> 3;
height_2_delta_2 = (bytes[6] & 7) << 5 | bytes[7] >> 3;
temperature = (bytes[7] & 7) << 7 | bytes[8] >> 1;
temperature_delta_1 = (bytes[8] & 1) << 7 | bytes[9] >> 1;
temperature_delta_2 = (bytes[9] & 1) << 7 | bytes[10] >> 1;
temperature_delta_3 = (bytes[10] & 1) << 7 | bytes[11] >> 1;
return {"frameType":"mesure", "pressure":{"value": pressure, "timestamp": timestamp_generator(0)}, "humidity":{"value":humidity, "timestamp": timestamp_generator(0)}, "height_1":{"value": height_1, "timestamp": timestamp_generator(0)}, "height_1_delta_1":{"value": height_1_delta_1, "timestamp":timestamp_generator(225)}, "height_2":{"value": height_2, "timestamp": timestamp_generator(450)}, "height_2_delta_2":{"value": height_2_delta_2, "timestamp": timestamp_generator(675)}, "temperature":{"value":temperature, "timestamp":timestamp_generator(0)}, "temperature_delta_1":{"value": temperature_delta_1, "timestamp":timestamp_generator(225)}, "temperature_delta_2":{"value": temperature_delta_2, "timestamp": timestamp_generator(450)}, "temperature_delta_3":{"value": temperature_delta_3, "timestamp": timestamp_generator(675)}};
case 1:
pressure = (bytes[0] & 63) << 6 | bytes[1] >> 2;
humidity = (bytes[1] & 3) << 5 | bytes[2] >> 3;
temperature = (bytes[2] & 7) << 7 | bytes[3] >> 1;
battery = (bytes[3] & 1) << 9 | bytes[4] << 1 | bytes[5] >> 7;
accelerometer_X = (bytes[5] & 126);
accelerometer_Y = (bytes[5] & 1) << 5 | bytes[6] >> 3;
accelerometer_Z = (bytes[6] & 7) << 3 | bytes[7] >> 5;
return {"frameType":"status", "pressure":{"value": pressure, "timestamp":timestamp_generator(0)}, "humidity":{"value": humidity, "timestamp":timestamp_generator(0)}, "temperature":{"value": temperature, "timestamp":timestamp_generator(0)}, "battery":{"value": battery, "timestamp":timestamp_generator(0)}, "accelerometer_X":{"value": accelerometer_X, "timestamp":timestamp_generator(0)}, "accelerometer_Y":{"value": accelerometer_Y, "timestamp":timestamp_generator(0)}, "accelerometer_Z":{"value": accelerometer_Z, "timestamp":timestamp_generator(0)}};
case 2:
pressure = (bytes[0] & 63) << 6 | bytes[1] >> 2;
humidity = (bytes[1] & 3) << 5 | bytes[2] >> 3;
temperature = (bytes[2] & 7) << 7 | bytes[3] >> 1;
battery = (bytes[3] & 1) << 9 | bytes[4] << 1 | bytes[5] >> 7;
accelerometer_X = (bytes[5] & 126);
accelerometer_Y = (bytes[5] & 1) << 5 | bytes[6] >> 3;
accelerometer_Z = (bytes[6] & 7) << 3 | bytes[7] >> 5;
height_1 = (bytes[7] & 31) << 7 | bytes[8] >> 1;
return {"frameType":"status", "pressure":{"value": pressure, "timestamp":timestamp_generator(0)}, "humidity":{"value": humidity, "timestamp":timestamp_generator(0)}, "temperature":{"value": temperature, "timestamp":timestamp_generator(0)}, "battery":{"value": battery, "timestamp":timestamp_generator(0)}, "accelerometer_X":{"value": accelerometer_X, "timestamp":timestamp_generator(0)}, "accelerometer_Y":{"value": accelerometer_Y, "timestamp":timestamp_generator(0)}, "accelerometer_Z":{"value": accelerometer_Z, "timestamp":timestamp_generator(0)}, "height_1":{"value": height_1, "timestamp":timestamp_generator(0)}};
}
}
I can’t reinstall from scratch.
BTW, in my return “case 0”, I take several time the current time. And it varies from 0 to 3 milliseconds. So my entire code could actually run in more than 10 ms. Is there a reason to limit the decoding to 10 ms ?
PS : @brocaar what do you want from us to Pull-request ?