ID 값 ext경우 잘못 ID읽는 부분 수정

This commit is contained in:
2025-10-17 22:51:46 +00:00
parent 6e28b48eaa
commit ce4444df2e
3 changed files with 685 additions and 98 deletions

79
graph.h
View File

@@ -168,7 +168,7 @@ const char graph_html[] PROGMEM = R"rawliteral(
.signal-item:hover { border-color: #43cea2; transform: translateY(-2px); }
.signal-item.selected { border-color: #185a9d; background: #e3f2fd; }
.signal-name { font-weight: 600; color: #333; margin-bottom: 5px; font-size: 0.9em; }
.signal-info { font-size: 0.8em; color: #666; }
.signal-info { font-size: 0.8em; color: #666; line-height: 1.4; }
.highlight {
background-color: #ffeb3b;
padding: 2px 0;
@@ -265,6 +265,7 @@ const char graph_html[] PROGMEM = R"rawliteral(
<button class="btn btn-success" onclick="startGraphing()">Start</button>
<button class="btn btn-danger" onclick="stopGraphing()">Stop</button>
<button class="btn btn-primary" onclick="clearSelection()">Clear</button>
<button class="btn btn-primary" onclick="debugDBCInfo()">Debug Info</button>
</div>
<div class="signal-selector">
@@ -273,7 +274,7 @@ const char graph_html[] PROGMEM = R"rawliteral(
<input type="text"
id="search-box"
class="search-box"
placeholder="Search by signal name, CAN ID, or unit..."
placeholder="Search by signal name, CAN ID, message name, or unit..."
oninput="filterSignals()">
<div id="search-info" class="search-info" style="display:none;"></div>
</div>
@@ -383,12 +384,27 @@ const char graph_html[] PROGMEM = R"rawliteral(
line = line.trim();
if (line.startsWith('BO_ ')) {
const match = line.match(/BO_\s+(\d+)\s+(\w+)\s*:/);
const match = line.match(/BO_\s+(\d+)\s+(\w+)\s*:\s*(\d+)/);
if (match) {
const id = parseInt(match[1]);
let id = parseInt(match[1]);
const name = match[2];
currentMessage = {id: id, name: name, signals: []};
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만 사용
}
currentMessage = {
id: id,
name: name,
dlc: dlc,
signals: []
};
dbcData.messages[id] = currentMessage;
console.log('Parsed Message: ID=' + id + ' (0x' + id.toString(16).toUpperCase() + ') Name=' + name + ' DLC=' + dlc);
}
}
else if (line.startsWith('SG_ ') && currentMessage) {
@@ -402,19 +418,23 @@ const char graph_html[] PROGMEM = R"rawliteral(
signed: match[5] === '-',
factor: parseFloat(match[6]),
offset: parseFloat(match[7]),
minMax: match[8],
unit: match[9],
messageId: currentMessage.id,
messageName: currentMessage.name
messageName: currentMessage.name,
messageDlc: currentMessage.dlc
};
currentMessage.signals.push(signal);
allSignals.push(signal);
console.log(' Signal: ' + signal.name + ' [' + signal.startBit + '|' + signal.bitLength + '] Unit: ' + signal.unit);
}
}
}
filteredSignals = [...allSignals];
displaySignals();
showStatus('DBC loaded: ' + Object.keys(dbcData.messages).length + ' messages', 'success');
showStatus('DBC loaded: ' + Object.keys(dbcData.messages).length + ' messages, ' + allSignals.length + ' signals', 'success');
}
function filterSignals() {
@@ -426,10 +446,18 @@ const char graph_html[] PROGMEM = R"rawliteral(
} else {
filteredSignals = allSignals.filter(signal => {
const nameMatch = signal.name.toLowerCase().includes(searchQuery);
const idMatch = signal.messageId.toString(16).toLowerCase().includes(searchQuery);
const idDecMatch = signal.messageId.toString().includes(searchQuery);
const idHex = signal.messageId.toString(16).toLowerCase();
const idHexMatch = idHex.includes(searchQuery) ||
idHex.includes(searchQuery.replace('0x', ''));
const msgNameMatch = signal.messageName.toLowerCase().includes(searchQuery);
const unitMatch = signal.unit && signal.unit.toLowerCase().includes(searchQuery);
return nameMatch || idMatch || unitMatch;
return nameMatch || idDecMatch || idHexMatch || msgNameMatch || unitMatch;
});
const searchInfo = document.getElementById('search-info');
@@ -500,18 +528,20 @@ const char graph_html[] PROGMEM = R"rawliteral(
item.onclick = () => toggleSignal(signal, item);
const canIdHex = '0x' + signal.messageId.toString(16).toUpperCase().padStart(3, '0');
const highlightedName = highlightText(signal.name, searchQuery);
const canId = '0x' + signal.messageId.toString(16).toUpperCase();
const highlightedId = highlightText(canId, searchQuery);
const unitText = signal.unit ? highlightText(signal.unit, searchQuery) : '';
const highlightedId = highlightText(canIdHex, searchQuery);
const highlightedMsgName = highlightText(signal.messageName, searchQuery);
const unitText = signal.unit ? highlightText(signal.unit, searchQuery) : 'no unit';
item.innerHTML =
'<div class="signal-name">' + highlightedName + '</div>' +
'<div class="signal-info">' +
'ID: ' + highlightedId + ' | ' +
signal.bitLength + 'bit' +
(signal.unit ? ' | ' + unitText : '') +
'CAN ID: ' + highlightedId + ' (' + highlightedMsgName + ')<br>' +
'Bit: ' + signal.startBit + '|' + signal.bitLength + ' | ' + unitText +
'</div>';
signalList.appendChild(item);
});
@@ -638,6 +668,25 @@ const char graph_html[] PROGMEM = R"rawliteral(
showStatus('Use the stop button in the graph viewer window', 'error');
}
function debugDBCInfo() {
console.log('=== DBC Debug Info ===');
console.log('Total Messages: ' + Object.keys(dbcData.messages).length);
console.log('Total Signals: ' + allSignals.length);
Object.values(dbcData.messages).forEach(msg => {
console.log('\nMessage: ' + msg.name);
console.log(' ID: ' + msg.id + ' (0x' + msg.id.toString(16).toUpperCase() + ')');
console.log(' DLC: ' + msg.dlc);
console.log(' Signals: ' + msg.signals.length);
msg.signals.forEach(sig => {
console.log(' - ' + sig.name + ': ' + sig.startBit + '|' + sig.bitLength + ' [' + sig.unit + ']');
});
});
showStatus('Debug info printed to console (F12)', 'success');
}
function showStatus(message, type) {
const status = document.getElementById('status');
status.textContent = message;