From 2be3351e16fc1d963ce9fe917c0614d70d7b7956 Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Thu, 14 May 2026 20:33:56 -0400 Subject: [PATCH] Added ability to read buildid which is necessary in order to grab the proper firmware files for the given hardware --- re/udsfirmwareuploaderwindow.cpp | 60 ++++++++++++++++++++++++ re/udsfirmwareuploaderwindow.h | 3 ++ ui/udsfirmwareuploaderwindow.ui | 79 +++++++++++++++++++++----------- 3 files changed, 115 insertions(+), 27 deletions(-) diff --git a/re/udsfirmwareuploaderwindow.cpp b/re/udsfirmwareuploaderwindow.cpp index cc072ab..7b2c4b5 100644 --- a/re/udsfirmwareuploaderwindow.cpp +++ b/re/udsfirmwareuploaderwindow.cpp @@ -46,6 +46,7 @@ UDSFirmwareUploaderWindow::UDSFirmwareUploaderWindow(const QVector *fr connect(ui->btnLoadFile, &QPushButton::clicked, this, &UDSFirmwareUploaderWindow::handleLoadFile); 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->btnBrowseTeslaDir, &QPushButton::clicked, this, &UDSFirmwareUploaderWindow::handleBrowseTeslaDir); connect(ui->btnReloadNodes, &QPushButton::clicked, this, &UDSFirmwareUploaderWindow::handleReloadNodes); connect(udsHandler, &UDS_HANDLER::newUDSMessage, this, &UDSFirmwareUploaderWindow::gotUDSReply); @@ -83,6 +84,7 @@ void UDSFirmwareUploaderWindow::setState(UPLOAD_STATE newState) ui->btnStartStop->setEnabled(true); ui->btnAbort->setEnabled(false); ui->btnLoadFile->setEnabled(true); + ui->btnReadBuildID->setEnabled(true); } } @@ -154,6 +156,7 @@ void UDSFirmwareUploaderWindow::startUpload() ui->btnStartStop->setEnabled(false); ui->btnAbort->setEnabled(true); ui->btnLoadFile->setEnabled(false); + ui->btnReadBuildID->setEnabled(false); udsHandler->setReception(true); udsHandler->addFilter(busId, responseId, 0x7FF); @@ -332,6 +335,41 @@ void UDSFirmwareUploaderWindow::sendTesterPresent() udsHandler->sendUDSFrame(msg); } +void UDSFirmwareUploaderWindow::handleReadBuildID() +{ + if (currentState != STATE_IDLE && currentState != STATE_COMPLETE && currentState != STATE_ERROR) + return; + + busId = ui->spinBus->value(); + targetId = Utility::ParseStringToNum(ui->txtTargetID->text()); + responseId = Utility::ParseStringToNum(ui->txtResponseID->text()); + + ui->btnReadBuildID->setEnabled(false); + + udsHandler->setReception(true); + udsHandler->addFilter(busId, responseId, 0x7FF); + + logMessage(QString("Reading build ID from 0x%1 (response 0x%2, bus %3)...") + .arg(targetId, 0, 16).arg(responseId, 0, 16).arg(busId)); + + sendReadBuildID(); +} + +void UDSFirmwareUploaderWindow::sendReadBuildID() +{ + UDS_MESSAGE msg; + msg.bus = busId; + msg.setFrameId(targetId); + msg.service = UDS_SERVICES::READ_BY_ID; + msg.subFuncLen = 2; + msg.subFunc = 0xF180; + + udsHandler->setFlowCtrl(true); //we need to generate flow control messages for this read request. + udsHandler->sendUDSFrame(msg); + setState(STATE_WAIT_BUILD_ID_RESP); + timeoutTimer->start(); +} + void UDSFirmwareUploaderWindow::handleNRC(int nrc) { QString desc = udsHandler->getNegativeResponseLong(nrc); @@ -455,6 +493,28 @@ void UDSFirmwareUploaderWindow::gotUDSReply(UDS_MESSAGE msg) break; } + case STATE_WAIT_BUILD_ID_RESP: + { + // READ_BY_ID (0x22) positive response (0x62): service byte stripped by UDS handler. + // msg.payload() = [0xF1, 0x80, ..., buildId at indices 6-9] + // This corresponds to bytes 6-10 of the raw ISOTP assembled frame. + if (dataLen >= 10) + { + quint32 buildId = (data[6] << 24) + (data[7] << 16) + (data[8] << 8) + data[9]; + QString buildIdStr = QString::number(buildId); + logMessage("Build ID: " + buildIdStr); + ui->lblBuildID->setText(buildIdStr); + } + else + { + logMessage(QString("Build ID response too short (%1 bytes in payload)").arg(dataLen)); + } + udsHandler->clearAllFilters(); + udsHandler->setReception(false); + setState(STATE_IDLE); + break; + } + default: break; } diff --git a/re/udsfirmwareuploaderwindow.h b/re/udsfirmwareuploaderwindow.h index b3a2337..2fddc5c 100644 --- a/re/udsfirmwareuploaderwindow.h +++ b/re/udsfirmwareuploaderwindow.h @@ -44,6 +44,7 @@ enum UPLOAD_STATE STATE_WAIT_EXIT_RESP, STATE_SEND_ECU_RESET, STATE_WAIT_RESET_RESP, + STATE_WAIT_BUILD_ID_RESP, STATE_COMPLETE, STATE_ERROR }; @@ -60,6 +61,7 @@ private slots: void handleLoadFile(); void handleStartStop(); void handleAbort(); + void handleReadBuildID(); void handleBrowseTeslaDir(); void handleReloadNodes(); void handleNodeChanged(int index); @@ -83,6 +85,7 @@ private: void sendTransferExit(); void sendECUReset(); void sendTesterPresent(); + void sendReadBuildID(); void handleNRC(int nrc); void advanceState(); diff --git a/ui/udsfirmwareuploaderwindow.ui b/ui/udsfirmwareuploaderwindow.ui index 18986d9..873cb8f 100644 --- a/ui/udsfirmwareuploaderwindow.ui +++ b/ui/udsfirmwareuploaderwindow.ui @@ -7,7 +7,7 @@ 0 0 624 - 520 + 527 @@ -44,44 +44,83 @@ - + + + + Browse... + + + + + + + Reload + + + + Target ECU: - + - + Target Response ID: - + 0x7E8 - + Target Request ID: - + 0x7E0 + + + + Device Build ID: + + + + + + + + + Read Build ID + + + + + + + (not read) + + + + + @@ -110,20 +149,6 @@ - - - - Flash Address: - - - - - - - 0x08000000 - - - @@ -151,17 +176,17 @@ - - + + - Reload + Flash Address: - - + + - Browse... + 0x08000000