ucan_json_parser
Version:
Parse JSON data to uCAN compatible byte streams
81 lines (69 loc) • 2.49 kB
JavaScript
let ucan_device_types_array = require('./ucan_device_types.json');
const ucan_frame_data_offset = 0;
module.exports.JSONCommandToByteStream = function(message){
let rx_json = JSON.parse(message);
console.log(JSON.stringify(rx_json));
let ucan_device_type = ucan_device_types_array.filter((x)=>{
return x.type == rx_json.type;
});
if (ucan_device_type.length > 0)
{
let dd = ucan_device_type[0];
// copose frame header part
let frame_id = rx_json.id;
let buffer = Buffer.alloc(dd.frame_len + ucan_frame_data_offset,0);
// buffer[0] = rx_json.id;
// buffer[1] = rx_json.id / 0xFF;
// copose frame data part
// 1. find param in device_definition
let cmd_data = Object.keys(rx_json.signals).map((j) => {
let mx = dd.signals[j]
return {"value":rx_json.signals[j],"sd":mx};
});
// 2. cast values to bytes
cmd_data = cmd_data.map(x => {
e = x.value;
switch (typeof(e))
{
case 'boolean':
e == true ? e = 1 : e = 0;
break;
case 'number':
e = e;
break;
default:
e = 0;
}
x.value = e;
return x;
});
// 3. copose data part of the frame
cmd_data.forEach(e => {
buffer[(e.sd.byte + ucan_frame_data_offset)] |= (e.value << e.sd.bit)
})
// 4. return frame object
let canmsg = { id: frame_id, data: buffer };
return canmsg;
// socket_can.sendCANPacket(canmsg);
}
};
module.exports.ByteStreamToJSONData = function(message, device_type) {
// 1. find if device type exist for this id
let dt = ucan_device_types_array.find((x) => {
return x.id == device_type;
});
//2. if type found map signals
if ((dt != undefined) && (message.data.length >= dt.frame_len))
{
resp = {"id": message.id};
Object.keys(dt.signals).forEach((e) => {
let d = (message.data[dt.signals[e].byte + ucan_frame_data_offset] >> dt.signals[e].bit) & (0xFF >> (8-dt.signals[e].size))
resp[e] = d;
});
return resp;
}
}
module.exports.GetDeviceTypes = function(message)
{
return ucan_device_types_array;
}