can dbc graph Value Table 파싱
This commit is contained in:
57
graph.h
57
graph.h
@@ -375,11 +375,41 @@ const char graph_html[] PROGMEM = R"rawliteral(
|
||||
}
|
||||
|
||||
function parseDBCContent(content) {
|
||||
dbcData = {messages: {}};
|
||||
dbcData = {messages: {}, valueTables: {}};
|
||||
allSignals = [];
|
||||
const lines = content.split('\n');
|
||||
let currentMessage = null;
|
||||
|
||||
// 먼저 VAL_ 정의를 파싱
|
||||
for (let line of lines) {
|
||||
line = line.trim();
|
||||
|
||||
if (line.startsWith('VAL_ ')) {
|
||||
// VAL_ 형식: VAL_ <MessageID> <SignalName> <value> "<text>" ...;
|
||||
const match = line.match(/VAL_\s+(\d+)\s+(\w+)\s+(.+);/);
|
||||
if (match) {
|
||||
const msgId = parseInt(match[1]);
|
||||
const sigName = match[2];
|
||||
const valuesStr = match[3];
|
||||
|
||||
// Extended CAN ID 처리
|
||||
const normalizedMsgId = (msgId & 0x80000000) ? (msgId & 0x1FFFFFFF) : msgId;
|
||||
|
||||
const key = normalizedMsgId + '_' + sigName;
|
||||
dbcData.valueTables[key] = {};
|
||||
|
||||
// 값-텍스트 쌍 파싱
|
||||
const valueMatches = valuesStr.matchAll(/(\d+)\s+"([^"]+)"/g);
|
||||
for (let vm of valueMatches) {
|
||||
dbcData.valueTables[key][parseInt(vm[1])] = vm[2];
|
||||
}
|
||||
|
||||
console.log('Parsed Value Table: ' + key, dbcData.valueTables[key]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 메시지와 시그널 파싱
|
||||
for (let line of lines) {
|
||||
line = line.trim();
|
||||
|
||||
@@ -390,10 +420,8 @@ const char graph_html[] PROGMEM = R"rawliteral(
|
||||
const name = match[2];
|
||||
const dlc = parseInt(match[3]);
|
||||
|
||||
// Extended CAN ID 처리 (bit 31이 set되어 있으면 제거)
|
||||
// CAN Extended format에서 bit 31은 Extended ID 플래그
|
||||
if (id & 0x80000000) {
|
||||
id = id & 0x1FFFFFFF; // bit 31 제거, 29-bit ID만 사용
|
||||
id = id & 0x1FFFFFFF;
|
||||
}
|
||||
|
||||
currentMessage = {
|
||||
@@ -410,8 +438,9 @@ const char graph_html[] PROGMEM = R"rawliteral(
|
||||
else if (line.startsWith('SG_ ') && currentMessage) {
|
||||
const match = line.match(/SG_\s+(\w+)\s*:\s*(\d+)\|(\d+)@([01])([+-])\s*\(([^,]+),([^)]+)\)\s*\[([^\]]+)\]\s*"([^"]*)"/);
|
||||
if (match) {
|
||||
const signalName = match[1];
|
||||
const signal = {
|
||||
name: match[1],
|
||||
name: signalName,
|
||||
startBit: parseInt(match[2]),
|
||||
bitLength: parseInt(match[3]),
|
||||
byteOrder: match[4] === '0' ? 'motorola' : 'intel',
|
||||
@@ -424,6 +453,14 @@ const char graph_html[] PROGMEM = R"rawliteral(
|
||||
messageName: currentMessage.name,
|
||||
messageDlc: currentMessage.dlc
|
||||
};
|
||||
|
||||
// Value Table 연결
|
||||
const vtKey = currentMessage.id + '_' + signalName;
|
||||
if (dbcData.valueTables[vtKey]) {
|
||||
signal.valueTable = dbcData.valueTables[vtKey];
|
||||
console.log(' Signal with value table: ' + signalName, signal.valueTable);
|
||||
}
|
||||
|
||||
currentMessage.signals.push(signal);
|
||||
allSignals.push(signal);
|
||||
|
||||
@@ -672,7 +709,14 @@ const char graph_html[] PROGMEM = R"rawliteral(
|
||||
console.log('=== DBC Debug Info ===');
|
||||
console.log('Total Messages: ' + Object.keys(dbcData.messages).length);
|
||||
console.log('Total Signals: ' + allSignals.length);
|
||||
console.log('Total Value Tables: ' + Object.keys(dbcData.valueTables).length);
|
||||
|
||||
console.log('\n=== Value Tables ===');
|
||||
for (let key in dbcData.valueTables) {
|
||||
console.log(key + ':', dbcData.valueTables[key]);
|
||||
}
|
||||
|
||||
console.log('\n=== Messages ===');
|
||||
Object.values(dbcData.messages).forEach(msg => {
|
||||
console.log('\nMessage: ' + msg.name);
|
||||
console.log(' ID: ' + msg.id + ' (0x' + msg.id.toString(16).toUpperCase() + ')');
|
||||
@@ -681,6 +725,9 @@ const char graph_html[] PROGMEM = R"rawliteral(
|
||||
|
||||
msg.signals.forEach(sig => {
|
||||
console.log(' - ' + sig.name + ': ' + sig.startBit + '|' + sig.bitLength + ' [' + sig.unit + ']');
|
||||
if (sig.valueTable) {
|
||||
console.log(' Value Table:', sig.valueTable);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user