can dbc graph Value Table 파싱

This commit is contained in:
2025-10-21 10:57:07 +00:00
parent 54230dd627
commit c70bc58b34
2 changed files with 128 additions and 10 deletions

57
graph.h
View File

@@ -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);
}
});
});