obd-raw-data-parser
Version:
A lightweight TypeScript library for parsing OBD-II raw data into human readable format. Based on the excellent work of obd-utils by Nishkalkashyap.
90 lines (89 loc) • 3.48 kB
JavaScript
import responsePIDS from "./obdPIDS.js";
export function parseOBDResponse(hexString) {
const reply = {};
let byteNumber;
let valueArray = [];
if (hexString === "NO DATA" ||
hexString === "OK" ||
hexString === "?" ||
hexString === "UNABLE TO CONNECT" ||
hexString === "SEARCHING...") {
reply.value = hexString;
return reply;
}
hexString = hexString.replace(/ /g, "");
valueArray = [];
for (byteNumber = 0; byteNumber < hexString.length; byteNumber += 2) {
valueArray.push(hexString.substr(byteNumber, 2));
}
if (valueArray[0] === "41") {
reply.mode = valueArray[0];
reply.pid = valueArray[1];
for (let i = 0; i < responsePIDS.length; i++) {
if (responsePIDS[i].pid === reply.pid) {
const numberOfBytes = responsePIDS[i].bytes;
reply.name = responsePIDS[i].name;
reply.unit = responsePIDS[i].unit;
const convertToUseful = responsePIDS[i].convertToUseful;
if (!convertToUseful) {
break;
}
switch (numberOfBytes) {
case 1:
reply.value = convertToUseful(valueArray[2]);
break;
case 2:
reply.value = convertToUseful(valueArray[2], valueArray[3]);
break;
case 4:
reply.value = convertToUseful(valueArray[2], valueArray[3], valueArray[4], valueArray[5]);
break;
case 8:
reply.value = convertToUseful(valueArray[2], valueArray[3], valueArray[4], valueArray[5], valueArray[6], valueArray[7], valueArray[8], valueArray[9]);
break;
}
break;
}
}
}
else if (valueArray[0] === "43") {
reply.mode = valueArray[0];
for (let i = 0; i < responsePIDS.length; i++) {
if (responsePIDS[i].mode === "03") {
const convertToUseful = responsePIDS[i].convertToUseful;
if (!convertToUseful) {
break;
}
reply.name = responsePIDS[i].name;
reply.unit = responsePIDS[i].unit;
reply.value = convertToUseful(valueArray[1], valueArray[2], valueArray[3], valueArray[4], valueArray[5], valueArray[6]);
}
}
}
else if (valueArray[0] === "49") {
reply.mode = valueArray[0];
reply.pid = valueArray[1];
for (let i = 0; i < responsePIDS.length; i++) {
if (responsePIDS[i].mode === "09" && responsePIDS[i].pid === reply.pid) {
reply.name = responsePIDS[i].name;
reply.unit = responsePIDS[i].unit;
const convertToUseful = responsePIDS[i].convertToUseful;
if (!convertToUseful) {
break;
}
reply.value = convertToUseful(hexString);
break;
}
}
}
return reply;
}
export function getPIDInfo(pid) {
const responsePid = responsePIDS.find((item) => item.pid === pid);
return responsePid || null;
}
export function getAllPIDs() {
return responsePIDS;
}
export { DTCBaseDecoder } from "./DTC/DTCBaseDecoder.js";
export { VinDecoder } from "./VIN/VinDecoder.js";