diff --git a/ground/openpilotgcs/src/plugins/uavobjectutil/devicedescriptorstruct.h b/ground/openpilotgcs/src/plugins/uavobjectutil/devicedescriptorstruct.h index c44fb73c0..bf8fafb19 100644 --- a/ground/openpilotgcs/src/plugins/uavobjectutil/devicedescriptorstruct.h +++ b/ground/openpilotgcs/src/plugins/uavobjectutil/devicedescriptorstruct.h @@ -5,9 +5,9 @@ struct deviceDescriptorStruct { public: + QString gitHash; + QString gitDate; QString gitTag; - QString buildDate; - QString description; int boardType; int boardRevision; static QString idToBoardName(int id) diff --git a/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.cpp b/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.cpp index 0fc0e5fd9..ac64c61d8 100644 --- a/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.cpp +++ b/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.cpp @@ -669,42 +669,45 @@ deviceDescriptorStruct UAVObjectUtilManager::getBoardDescriptionStruct() bool UAVObjectUtilManager::descriptionToStructure(QByteArray desc, deviceDescriptorStruct *struc) { - if (desc.startsWith("OpFw")) { - // This looks like a binary with a description at the end - /* - # 4 bytes: header: "OpFw" - # 4 bytes: GIT commit tag (short version of SHA1) - # 4 bytes: Unix timestamp of compile time - # 2 bytes: target platform. Should follow same rule as BOARD_TYPE and BOARD_REVISION in board define files. - # 26 bytes: commit tag if it is there, otherwise "Unreleased". Zero-padded - # ---- 40 bytes limit --- - # 20 bytes: SHA1 sum of the firmware. - # 40 bytes: free for now. - */ + if (desc.startsWith("OpFw")) { + /* + * This looks like a binary with a description at the end + * 4 bytes: header: "OpFw" + * 4 bytes: git commit hash (short version of SHA1) + * 4 bytes: Unix timestamp of last git commit + * 2 bytes: target platform. Should follow same rule as BOARD_TYPE and BOARD_REVISION in board define files. + * 26 bytes: commit tag if it is there, otherwise "Unreleased". Zero-padded + * ---- 40 bytes limit --- + * 20 bytes: SHA1 sum of the firmware. + * 40 bytes: free for now. + */ - // Note: the ARM binary is big-endian: - quint32 gitCommitTag = desc.at(7)&0xFF; - for (int i=1;i<4;i++) { - gitCommitTag = gitCommitTag<<8; - gitCommitTag += desc.at(7-i) & 0xFF; - } - struc->gitTag=QString::number(gitCommitTag,16); - quint32 buildDate = desc.at(11)&0xFF; - for (int i=1;i<4;i++) { - buildDate = buildDate<<8; - buildDate += desc.at(11-i) & 0xFF; - } - struc->buildDate= QDateTime::fromTime_t(buildDate).toUTC().toString("yyyyMMdd HH:mm"); - QByteArray targetPlatform = desc.mid(12,2); - // TODO: check platform compatibility - QString dscText = QString(desc.mid(14,26)); - struc->boardType=(int)targetPlatform.at(0); - struc->boardRevision=(int)targetPlatform.at(1); - struc->description=dscText; - return true; + // Note: the ARM binary is big-endian: + quint32 gitCommitHash = desc.at(7) & 0xFF; + for (int i = 1; i < 4; i++) { + gitCommitHash = gitCommitHash << 8; + gitCommitHash += desc.at(7-i) & 0xFF; } - return false; + struc->gitHash = QString::number(gitCommitHash, 16); + quint32 gitDate = desc.at(11) & 0xFF; + for (int i = 1; i < 4; i++) { + gitDate = gitDate << 8; + gitDate += desc.at(11-i) & 0xFF; + } + struc->gitDate = QDateTime::fromTime_t(gitDate).toUTC().toString("yyyyMMdd HH:mm"); + + QString gitTag = QString(desc.mid(14,26)); + struc->gitTag = gitTag; + + // TODO: check platform compatibility + QByteArray targetPlatform = desc.mid(12,2); + struc->boardType = (int)targetPlatform.at(0); + struc->boardRevision = (int)targetPlatform.at(1); + + return true; + } + return false; } // ****************************** diff --git a/ground/openpilotgcs/src/plugins/uavsettingsimportexport/uavsettingsimportexportfactory.cpp b/ground/openpilotgcs/src/plugins/uavsettingsimportexport/uavsettingsimportexportfactory.cpp index b082e1eb5..7645d0cf7 100644 --- a/ground/openpilotgcs/src/plugins/uavsettingsimportexport/uavsettingsimportexportfactory.cpp +++ b/ground/openpilotgcs/src/plugins/uavsettingsimportexport/uavsettingsimportexportfactory.cpp @@ -218,20 +218,37 @@ QString UAVSettingsImportExportFactory::createXMLDocument( QDomDocument doc(docName); QDomElement root = doc.createElement(isSettings ? "settings" : "data"); doc.appendChild(root); - QDomElement versionInfo =doc.createElement("versionInfo"); + + // add hardware, firmware and GCS version info + QDomElement versionInfo = doc.createElement("version"); root.appendChild(versionInfo); - QDomElement fw=doc.createElement("Embedded"); - UAVObjectUtilManager* utilMngr = pm->getObject(); - deviceDescriptorStruct struc=utilMngr->getBoardDescriptionStruct(); - fw.setAttribute("gitcommittag",struc.gitTag); - fw.setAttribute("fwtag",struc.description); - fw.setAttribute("cpuSerial",QString(utilMngr->getBoardCPUSerial().toHex())); + UAVObjectUtilManager *utilMngr = pm->getObject(); + deviceDescriptorStruct board = utilMngr->getBoardDescriptionStruct(); + QDomElement hw = doc.createElement("hardware"); + hw.setAttribute("type", QString().setNum(board.boardType, 16)); + hw.setAttribute("revision", QString().setNum(board.boardRevision, 16)); + hw.setAttribute("serial", QString(utilMngr->getBoardCPUSerial().toHex())); + versionInfo.appendChild(hw); + + QDomElement fw = doc.createElement("firmware"); + fw.setAttribute("date", board.gitDate); + fw.setAttribute("hash", board.gitHash); + fw.setAttribute("tag", board.gitTag); versionInfo.appendChild(fw); - QDomElement gcs=doc.createElement("GCS"); - gcs.setAttribute("revision",QString::fromLatin1(Core::Constants::GCS_REVISION_STR)); + + QString gcsRevision = QString::fromLatin1(Core::Constants::GCS_REVISION_STR); + QString gcsGitDate = gcsRevision.mid(gcsRevision.indexOf(" ") + 1, 14); + QString gcsGitHash = gcsRevision.mid(gcsRevision.indexOf(":") + 1, 8); + QString gcsGitTag = gcsRevision.left(gcsRevision.indexOf(":")); + + QDomElement gcs = doc.createElement("gcs"); + gcs.setAttribute("date", gcsGitDate); + gcs.setAttribute("hash", gcsGitHash); + gcs.setAttribute("tag", gcsGitTag); versionInfo.appendChild(gcs); + // iterate over settings objects QList< QList > objList = objManager->getDataObjects(); foreach (QList list, objList) { diff --git a/ground/openpilotgcs/src/plugins/uploader/devicewidget.cpp b/ground/openpilotgcs/src/plugins/uploader/devicewidget.cpp index 9e57a4225..b5e977a48 100644 --- a/ground/openpilotgcs/src/plugins/uploader/devicewidget.cpp +++ b/ground/openpilotgcs/src/plugins/uploader/devicewidget.cpp @@ -180,13 +180,13 @@ void deviceWidget::freeze() */ bool deviceWidget::populateBoardStructuredDescription(QByteArray desc) { - if(UAVObjectUtilManager::descriptionToStructure(desc,&onBoardDescrition)) + if(UAVObjectUtilManager::descriptionToStructure(desc,&onBoardDescription)) { - myDevice->lblGitTag->setText(onBoardDescrition.gitTag); - myDevice->lblBuildDate->setText(onBoardDescrition.buildDate.insert(4,"-").insert(7,"-")); - if(onBoardDescrition.description.startsWith("release",Qt::CaseInsensitive)) + myDevice->lblGitTag->setText(onBoardDescription.gitHash); + myDevice->lblBuildDate->setText(onBoardDescription.gitDate.insert(4,"-").insert(7,"-")); + if(onBoardDescription.gitTag.startsWith("release",Qt::CaseInsensitive)) { - myDevice->lblDescription->setText(QString("Firmware tag: ")+onBoardDescrition.description); + myDevice->lblDescription->setText(QString("Firmware tag: ")+onBoardDescription.gitTag); QPixmap pix = QPixmap(QString(":uploader/images/application-certificate.svg")); myDevice->lblCertified->setPixmap(pix); myDevice->lblCertified->setToolTip(tr("Tagged officially released firmware build")); @@ -194,13 +194,13 @@ bool deviceWidget::populateBoardStructuredDescription(QByteArray desc) } else { - myDevice->lblDescription->setText(onBoardDescrition.description); + myDevice->lblDescription->setText(onBoardDescription.gitTag); QPixmap pix = QPixmap(QString(":uploader/images/warning.svg")); myDevice->lblCertified->setPixmap(pix); myDevice->lblCertified->setToolTip(tr("Untagged or custom firmware build")); } - myDevice->lblBrdName->setText(idToBoardName(onBoardDescrition.boardType<<8)); + myDevice->lblBrdName->setText(idToBoardName(onBoardDescription.boardType<<8)); return true; } @@ -210,27 +210,27 @@ bool deviceWidget::populateBoardStructuredDescription(QByteArray desc) } bool deviceWidget::populateLoadedStructuredDescription(QByteArray desc) { - if(UAVObjectUtilManager::descriptionToStructure(desc,&LoadedDescrition)) + if(UAVObjectUtilManager::descriptionToStructure(desc,&LoadedDescription)) { - myDevice->lblGitTagL->setText(LoadedDescrition.gitTag); - myDevice->lblBuildDateL->setText( LoadedDescrition.buildDate.insert(4,"-").insert(7,"-")); - if(LoadedDescrition.description.startsWith("release",Qt::CaseInsensitive)) + myDevice->lblGitTagL->setText(LoadedDescription.gitHash); + myDevice->lblBuildDateL->setText( LoadedDescription.gitDate.insert(4,"-").insert(7,"-")); + if(LoadedDescription.gitTag.startsWith("release",Qt::CaseInsensitive)) { - myDevice->lblDescritpionL->setText(LoadedDescrition.description); - myDevice->description->setText(LoadedDescrition.description); + myDevice->lblDescritpionL->setText(LoadedDescription.gitTag); + myDevice->description->setText(LoadedDescription.gitTag); QPixmap pix = QPixmap(QString(":uploader/images/application-certificate.svg")); myDevice->lblCertifiedL->setPixmap(pix); myDevice->lblCertifiedL->setToolTip(tr("Tagged officially released firmware build")); } else { - myDevice->lblDescritpionL->setText(LoadedDescrition.description); - myDevice->description->setText(LoadedDescrition.description); + myDevice->lblDescritpionL->setText(LoadedDescription.gitTag); + myDevice->description->setText(LoadedDescription.gitTag); QPixmap pix = QPixmap(QString(":uploader/images/warning.svg")); myDevice->lblCertifiedL->setPixmap(pix); myDevice->lblCertifiedL->setToolTip(tr("Untagged or custom firmware build")); } - myDevice->lblBrdNameL->setText(deviceDescriptorStruct::idToBoardName(LoadedDescrition.boardType<<8)); + myDevice->lblBrdNameL->setText(deviceDescriptorStruct::idToBoardName(LoadedDescription.boardType<<8)); return true; } @@ -323,12 +323,12 @@ void deviceWidget::loadFirmware() myDevice->statusLabel->setText(tr("WARNING: the loaded firmware is for different hardware. Do not update!")); px.load(QString(":/uploader/images/error.svg")); } - else if(QDateTime::fromString(onBoardDescrition.buildDate)>QDateTime::fromString(LoadedDescrition.buildDate)) + else if(QDateTime::fromString(onBoardDescription.gitDate)>QDateTime::fromString(LoadedDescription.gitDate)) { myDevice->statusLabel->setText(tr("The board has newer firmware than loaded. Are you sure you want to update?")); px.load(QString(":/uploader/images/warning.svg")); } - else if(!LoadedDescrition.description.startsWith("release",Qt::CaseInsensitive)) + else if(!LoadedDescription.gitTag.startsWith("release",Qt::CaseInsensitive)) { myDevice->statusLabel->setText(tr("The loaded firmware is untagged or custom build. Update only if it was received from a trusted source (official website or your own build)")); px.load(QString(":/uploader/images/warning.svg")); diff --git a/ground/openpilotgcs/src/plugins/uploader/devicewidget.h b/ground/openpilotgcs/src/plugins/uploader/devicewidget.h index 772216e3b..3530c3d6a 100644 --- a/ground/openpilotgcs/src/plugins/uploader/devicewidget.h +++ b/ground/openpilotgcs/src/plugins/uploader/devicewidget.h @@ -54,8 +54,8 @@ public: QString setOpenFileName(); QString setSaveFileName(); private: - deviceDescriptorStruct onBoardDescrition; - deviceDescriptorStruct LoadedDescrition; + deviceDescriptorStruct onBoardDescription; + deviceDescriptorStruct LoadedDescription; QByteArray loadedFW; QString idToBoardName(int id); Ui_deviceWidget *myDevice; diff --git a/ground/openpilotgcs/src/plugins/uploader/devicewidget.ui b/ground/openpilotgcs/src/plugins/uploader/devicewidget.ui index c5c7a807e..4fea11eb5 100644 --- a/ground/openpilotgcs/src/plugins/uploader/devicewidget.ui +++ b/ground/openpilotgcs/src/plugins/uploader/devicewidget.ui @@ -208,7 +208,7 @@ - Description: + Firmware tag: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -218,7 +218,7 @@ - Build date: + Firmware date: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -228,7 +228,7 @@ - Git tag: + Git commit hash: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter diff --git a/ground/openpilotgcs/src/plugins/uploader/runningdevicewidget.cpp b/ground/openpilotgcs/src/plugins/uploader/runningdevicewidget.cpp index fcde00125..a62fe403c 100644 --- a/ground/openpilotgcs/src/plugins/uploader/runningdevicewidget.cpp +++ b/ground/openpilotgcs/src/plugins/uploader/runningdevicewidget.cpp @@ -112,9 +112,9 @@ void runningDeviceWidget::populate() deviceDescriptorStruct devDesc; if(UAVObjectUtilManager::descriptionToStructure(description,&devDesc)) { - if(devDesc.description.startsWith("release",Qt::CaseInsensitive)) + if(devDesc.gitTag.startsWith("release",Qt::CaseInsensitive)) { - myDevice->lblFWTag->setText(QString("Firmware tag: ")+devDesc.description); + myDevice->lblFWTag->setText(QString("Firmware tag: ")+devDesc.gitTag); QPixmap pix = QPixmap(QString(":uploader/images/application-certificate.svg")); myDevice->lblCertified->setPixmap(pix); myDevice->lblCertified->setToolTip(tr("Tagged officially released firmware build")); @@ -122,13 +122,13 @@ void runningDeviceWidget::populate() } else { - myDevice->lblFWTag->setText(QString("Firmware tag: ")+devDesc.description); + myDevice->lblFWTag->setText(QString("Firmware tag: ")+devDesc.gitTag); QPixmap pix = QPixmap(QString(":uploader/images/warning.svg")); myDevice->lblCertified->setPixmap(pix); myDevice->lblCertified->setToolTip(tr("Untagged or custom firmware build")); } - myDevice->lblGitCommitTag->setText("Git commit tag: "+devDesc.gitTag); - myDevice->lblFWDate->setText(QString("Firmware date: ") + devDesc.buildDate.insert(4,"-").insert(7,"-")); + myDevice->lblGitCommitTag->setText("Git commit hash: "+devDesc.gitHash); + myDevice->lblFWDate->setText(QString("Firmware date: ") + devDesc.gitDate.insert(4,"-").insert(7,"-")); } else { diff --git a/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp b/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp index 73bc0c535..4a312f6b5 100755 --- a/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp +++ b/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp @@ -619,16 +619,20 @@ void UploaderGadgetWidget::info(QString infoString, int infoNumber) void UploaderGadgetWidget::versionMatchCheck() { ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); - UAVObjectUtilManager* utilMngr = pm->getObject(); - deviceDescriptorStruct boardDescription=utilMngr->getBoardDescriptionStruct(); - QString gcsDescription=QString::fromLatin1(Core::Constants::GCS_REVISION_STR); - if(boardDescription.gitTag!=gcsDescription.mid(gcsDescription.indexOf(":")+1,8)) - { - qDebug()<showMessage(QString(tr("GCS and FW versions do not match which can cause configuration problems.")) + " \n" + - QString(tr("GCS Versions: ")) + gcsDescription + " \n" + - QString(tr("FW Versions: ")) + boardDescription.gitTag+":"+boardDescription.buildDate); + UAVObjectUtilManager *utilMngr = pm->getObject(); + deviceDescriptorStruct boardDescription = utilMngr->getBoardDescriptionStruct(); + + QString gcsDescription = QString::fromLatin1(Core::Constants::GCS_REVISION_STR); + QString gcsGitHash = gcsDescription.mid(gcsDescription.indexOf(":")+1, 8); + QString gcsGitDate = gcsDescription.mid(gcsDescription.indexOf(" ")+1, 14); + + QString gcsVersion = gcsGitDate + " (" + gcsGitHash + ")"; + QString fwVersion = boardDescription.gitDate + " (" + boardDescription.gitHash + ")"; + + if (boardDescription.gitHash != gcsGitHash) { + QString warning = QString(tr( + "GCS and firmware versions do not match which can cause configuration problems. " + "GCS version: %1. Firmware version: %2.")).arg(gcsVersion).arg(fwVersion); + msg->showMessage(warning); } }