// 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}

// NOTE: THIS DECODER IS JUST AN EXAMPLE AND IS NOT SUPPORTING ALL ENLESS SENSORS
// BUT IT DOES SUPPORT THE MOST COMMON ONES AND THE MAIN PARAMETERS
// PLEASE USE THIS CODE AS A STARTING POINT AND ADJUSTING IT TO YOUR NEEDS

function Decode(fPort, bytes) {
    var decoded = {};

decoded.devEUI = LoRaObject.devEUI;
decoded.rssi = LoRaObject.rxInfo[0].rssi;

var sensorType = bytes[3];

switch(sensorType) {
  case 0x04:
    decoded.sensorType = "600-021";
	decoded.temperature = readInt16LE(bytes.slice(6, 8)) / 10;
	decoded.humidity = readInt16LE(bytes.slice(8, 10)) / 10;
	var battery = bytes[19];
	break;
  case 0x05:
    decoded.sensorType = "600-022";
	decoded.temperature = readInt16LE(bytes.slice(6, 8)) / 10;
	decoded.humidity = readInt16LE(bytes.slice(8, 10)) / 10;
	decoded.VOC = readUInt16LE(bytes.slice(10, 12));
	var battery = bytes[19];
	break;
  case 0x06:
    decoded.sensorType = "600-023";
	decoded.temperature = readInt16LE(bytes.slice(6, 8)) / 10;
	decoded.humidity = readInt16LE(bytes.slice(8, 10)) / 10;
	decoded.VOC = readUInt16LE(bytes.slice(10, 12));
	decoded.CO2 = readUInt16LE(bytes.slice(12, 14));
	var battery = bytes[19];
	break;
  case 0x07:
    decoded.sensorType = "600-031";
	decoded.temperature1 = readInt16LE(bytes.slice(6, 8)) / 10;
	decoded.temperature2 = readInt16LE(bytes.slice(8, 10)) / 10;
	var battery = bytes[13];
	break;
  case 0x08:
    decoded.sensorType = "600-036";
	decoded.Pulse1 = readUInt32LE(bytes.slice(6, 10));
	decoded.Pulse2 = readUInt32LE(bytes.slice(10, 14));
	decoded.PulseOC = readUInt32LE(bytes.slice(14, 18));
	var battery = bytes[21];
	break;
  case 0x09:
    decoded.sensorType = "600-037";
	decoded.Pulse1 = readUInt32LE(bytes.slice(6, 10));
	decoded.Pulse2 = readUInt32LE(bytes.slice(10, 14));
	decoded.PulseOC = readUInt32LE(bytes.slice(14, 18));
	var battery = bytes[21];
	break;
  case 0x0A:
    decoded.sensorType = "600-038";
	decoded.Pulse1 = readUInt32LE(bytes.slice(6, 10));
	decoded.Pulse2 = readUInt32LE(bytes.slice(10, 14));
	decoded.PulseOC = readUInt32LE(bytes.slice(14, 18));
	var battery = bytes[21];
	break;
  case 0x0B:
    decoded.sensorType = "600-039";
	decoded.Pulse1 = readUInt32LE(bytes.slice(6, 10));
	decoded.Pulse2 = readUInt32LE(bytes.slice(10, 14));
	decoded.PulseOC = readUInt32LE(bytes.slice(14, 18));
	var battery = bytes[21];
	break;
  case 0x0C:
    decoded.sensorType = "600-232";
	decoded.temperature1 = readInt16LE(bytes.slice(6, 8)) / 10;
	decoded.temperature2 = readInt16LE(bytes.slice(8, 10)) / 10;
	var battery = bytes[13];
	break;
  default:
    decoded.sensorType = "Error";
} 

var batteryStatus = battery >> 2 & 0x03;

decoded.battery = 100 - batteryStatus * 25;
	
	return decoded;
}

/* ******************************************
 * bytes to number
 ********************************************/
function readUInt16LE(bytes) {
    var value = (bytes[0] << 8) + bytes[1];
    return value & 0xffff;
}

function readInt16LE(bytes) {
    var ref = readUInt16LE(bytes);
    return ref > 0x7fff ? ref - 0x10000 : ref;
}

function readUInt32LE(bytes) {
    var value = (bytes[0] << 24) + (bytes[1] << 16) + (bytes[2] << 8) + bytes[3];
    return value & 0xffffffff;
}