cabana/src/workers/CanStreamerWorker.worker.js

119 lines
2.7 KiB
JavaScript

/* eslint-env worker */
/* eslint-disable no-restricted-globals */
import DBC from "../models/can/dbc";
import DbcUtils from "../utils/dbc";
import extend from "xtend";
function processStreamedCanMessages(
newCanMessages,
prevMsgEntries,
firstCanTime,
dbc,
lastBusTime,
byteStateChangeCountsByMessage,
maxByteStateChangeCount
) {
const messages = {};
let lastCanTime;
for (let batch = 0; batch < newCanMessages.length; batch++) {
let { time, canMessages } = newCanMessages[batch];
canMessages = canMessages.sort((msg1, msg2) => {
if (msg1[1] < msg2[1]) {
return -1;
} else if (msg1[1] > msg2[1]) {
return 1;
} else {
return 0;
}
});
let busTimeSum = 0;
for (let i = 0; i < canMessages.length; i++) {
let { address, busTime, data, bus } = canMessages[i];
let prevBusTime;
if (i === 0) {
if (lastBusTime === null) {
prevBusTime = 0;
} else {
prevBusTime = lastBusTime;
}
} else {
prevBusTime = canMessages[i - 1].busTime;
}
if (busTime >= prevBusTime) {
busTimeSum += busTime - prevBusTime;
} else {
busTimeSum += 0x10000 - prevBusTime + busTime;
}
const message = extend(canMessages[i]);
message.busTime = time + busTimeSum / 500000.0;
if (firstCanTime === 0) {
firstCanTime = message.busTime;
}
const msgEntry = DbcUtils.addCanMessage(
message,
dbc,
firstCanTime,
messages,
prevMsgEntries,
byteStateChangeCountsByMessage
);
if (i === canMessages.length - 1) {
lastCanTime = msgEntry.relTime;
}
}
lastBusTime = canMessages[canMessages.length - 1].busTime;
const newMaxByteStateChangeCount = DbcUtils.findMaxByteStateChangeCount(
messages
);
if (newMaxByteStateChangeCount > maxByteStateChangeCount) {
maxByteStateChangeCount = newMaxByteStateChangeCount;
}
Object.keys(messages).forEach(key => {
messages[key] = DbcUtils.setMessageByteColors(
messages[key],
maxByteStateChangeCount
);
});
}
self.postMessage({
newMessages: messages,
seekTime: lastCanTime,
lastBusTime,
firstCanTime,
maxByteStateChangeCount
});
}
self.onmessage = function(e) {
const {
newCanMessages,
prevMsgEntries,
firstCanTime,
dbcText,
lastBusTime,
byteStateChangeCountsByMessage,
maxByteStateChangeCount
} = e.data;
const dbc = new DBC(dbcText);
processStreamedCanMessages(
newCanMessages,
prevMsgEntries,
firstCanTime,
dbc,
lastBusTime,
byteStateChangeCountsByMessage,
maxByteStateChangeCount
);
};