Add reading of the version map from firmware that shows which files to flash onto a given controller

given its buildid.
This commit is contained in:
Collin Kidder
2026-05-14 21:01:43 -04:00
parent 2be3351e16
commit bb26f52c3d
3 changed files with 83 additions and 0 deletions
+73
View File
@@ -6,6 +6,7 @@
#include <QFile>
#include <QFileDialog>
#include <QTextStream>
#include <QDateTime>
#include <QCoreApplication>
#include <QDir>
@@ -47,6 +48,7 @@ UDSFirmwareUploaderWindow::UDSFirmwareUploaderWindow(const QVector<CANFrame> *fr
connect(ui->btnStartStop, &QPushButton::clicked, this, &UDSFirmwareUploaderWindow::handleStartStop);
connect(ui->btnAbort, &QPushButton::clicked, this, &UDSFirmwareUploaderWindow::handleAbort);
connect(ui->btnReadBuildID, &QPushButton::clicked, this, &UDSFirmwareUploaderWindow::handleReadBuildID);
connect(ui->btnLookupVersion, &QPushButton::clicked, this, &UDSFirmwareUploaderWindow::handleLookupVersion);
connect(ui->btnBrowseTeslaDir, &QPushButton::clicked, this, &UDSFirmwareUploaderWindow::handleBrowseTeslaDir);
connect(ui->btnReloadNodes, &QPushButton::clicked, this, &UDSFirmwareUploaderWindow::handleReloadNodes);
connect(udsHandler, &UDS_HANDLER::newUDSMessage, this, &UDSFirmwareUploaderWindow::gotUDSReply);
@@ -502,6 +504,7 @@ void UDSFirmwareUploaderWindow::gotUDSReply(UDS_MESSAGE msg)
{
quint32 buildId = (data[6] << 24) + (data[7] << 16) + (data[8] << 8) + data[9];
QString buildIdStr = QString::number(buildId);
lastBuildId = buildIdStr;
logMessage("Build ID: " + buildIdStr);
ui->lblBuildID->setText(buildIdStr);
}
@@ -713,6 +716,76 @@ void UDSFirmwareUploaderWindow::testerPresentTick()
logMessage("Tester Present keep-alive sent");
}
void UDSFirmwareUploaderWindow::handleLookupVersion()
{
lookupVersionMap();
}
void UDSFirmwareUploaderWindow::lookupVersionMap()
{
int nodeIdx = ui->cmbTeslaNode->currentIndex();
if (nodeIdx <= 0)
{
logMessage("Version lookup: select a target ECU node first");
return;
}
if (lastBuildId.isEmpty())
{
logMessage("Version lookup: read the build ID first");
return;
}
QString ecuName = ui->cmbTeslaNode->currentText().toLower();
QStringList searchPaths;
if (!teslaDir.isEmpty()) searchPaths.append(teslaDir + "/deploy/seed_artifacts_v2");
searchPaths.append(QCoreApplication::applicationDirPath());
searchPaths.append(QDir::currentPath());
QString tsvPath;
for (const QString &path : searchPaths)
{
QString candidate = path + "/version_map2.tsv";
if (QFile::exists(candidate)) { tsvPath = candidate; break; }
}
if (tsvPath.isEmpty())
{
logMessage("Version lookup: version_map2.tsv not found");
return;
}
QFile f(tsvPath);
if (!f.open(QIODevice::ReadOnly | QIODevice::Text))
{
logMessage("Version lookup: could not open " + tsvPath);
return;
}
logMessage(QString("Version lookup: ECU='%1' build='%2'").arg(ecuName).arg(lastBuildId));
QString searchTerm = ecuName + ":" + lastBuildId.trimmed();
int matchCount = 0;
QTextStream in(&f);
while (!in.atEnd())
{
QString line = in.readLine();
QStringList cols = line.split('\t');
if (cols.size() < 2) continue;
if (cols[0] == searchTerm)
{
logMessage("Match: " + line);
matchCount++;
}
}
f.close();
if (matchCount == 0)
logMessage("Version lookup: no matches found");
else
logMessage(QString("Version lookup: %1 match(es) found").arg(matchCount));
}
void UDSFirmwareUploaderWindow::advanceState()
{
}
+3
View File
@@ -62,6 +62,7 @@ private slots:
void handleStartStop();
void handleAbort();
void handleReadBuildID();
void handleLookupVersion();
void handleBrowseTeslaDir();
void handleReloadNodes();
void handleNodeChanged(int index);
@@ -86,6 +87,7 @@ private:
void sendECUReset();
void sendTesterPresent();
void sendReadBuildID();
void lookupVersionMap();
void handleNRC(int nrc);
void advanceState();
@@ -111,6 +113,7 @@ private:
bool useSecurity;
QString teslaDir;
QString lastBuildId;
QVector<TeslaNodeInfo> teslaNodes;
QMap<QString, uint32_t> messageIdMap;
};
+7
View File
@@ -119,6 +119,13 @@
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnLookupVersion">
<property name="text">
<string>Lookup Version</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="8" column="0">