UNPKG

ucan_json_parser

Version:

Parse JSON data to uCAN compatible byte streams

81 lines (69 loc) 2.49 kB
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; }