diff --git a/companion/src/appdata.cpp b/companion/src/appdata.cpp index f9ff82d8e..6874cfbe3 100644 --- a/companion/src/appdata.cpp +++ b/companion/src/appdata.cpp @@ -673,6 +673,8 @@ AppData::AppData() getset( _outputDisplayDetails, "outputDisplayDetails" ,false ); getset( _enableBackup, "backupEnable" ,false ); getset( _backupOnFlash, "backupOnFlash" ,true ); + getset( _checkHardwareCompatibility, "checkHardwareCompatibility" ,true ); + getset( _jsSupport, "js_support" ,false ); getset( _maximized, "maximized" ,false ); getset( _showSplash, "show_splash" ,true ); diff --git a/companion/src/appdata.h b/companion/src/appdata.h index 53148bf34..1c7859ff3 100644 --- a/companion/src/appdata.h +++ b/companion/src/appdata.h @@ -200,6 +200,7 @@ class AppData: protected CompStoreObj BOOL_PROPERTY(enableBackup, false) BOOL_PROPERTY(outputDisplayDetails, false) BOOL_PROPERTY(backupOnFlash, true) + BOOL_PROPERTY(checkHardwareCompatibility, true) // All the global variables public: diff --git a/companion/src/firmwareinterface.cpp b/companion/src/firmwareinterface.cpp index b0a4c5729..0fa9c559f 100755 --- a/companion/src/firmwareinterface.cpp +++ b/companion/src/firmwareinterface.cpp @@ -123,6 +123,29 @@ QString FirmwareInterface::seekLabel(const QString & label) return seekString(label + ":"); } +QString FirmwareInterface::getFlavour() const +{ + if (flavour == "opentx-x9dp") + return "opentx-taranis-plus"; + else if (flavour == "opentx-x9d") + return "opentx-taranis"; + else + return flavour; +} + +bool FirmwareInterface::isHardwareCompatible(const FirmwareInterface &previousFirmware) const +{ + QString newFlavour = getFlavour(); + if (newFlavour.isEmpty()) + return true; + + QString previousFlavour = previousFirmware.getFlavour(); + if (previousFlavour.isEmpty()) + return true; + + return (newFlavour == previousFlavour); +} + bool FirmwareInterface::SeekSplash(QByteArray splash) { int start = flash.indexOf(splash); diff --git a/companion/src/firmwareinterface.h b/companion/src/firmwareinterface.h index 2a46e9cbe..2301d04a5 100755 --- a/companion/src/firmwareinterface.h +++ b/companion/src/firmwareinterface.h @@ -46,7 +46,8 @@ class FirmwareInterface inline QString getDate() { return date; } inline QString getTime() { return time; } int getSize() { return flash_size; } - inline QString getFlavour() { return flavour; } + QString getFlavour() const; + bool isHardwareCompatible(const FirmwareInterface &previousFirmware) const; inline QString getVersion() { return version; } unsigned int getVersionId() { return versionId; } inline int getEEpromVersion() { return eepromVersion; } diff --git a/companion/src/flashfirmwaredialog.cpp b/companion/src/flashfirmwaredialog.cpp index ff897e1f5..98d42b2a1 100755 --- a/companion/src/flashfirmwaredialog.cpp +++ b/companion/src/flashfirmwaredialog.cpp @@ -10,6 +10,7 @@ #include "progressdialog.h" #include "radiointerface.h" #include "splashlibrary.h" +#include "progresswidget.h" #if defined WIN32 || !defined __GNUC__ #include @@ -50,6 +51,8 @@ fwName(g.profile[g.id()].fwName()) ui->backupEEprom->setEnabled(false); } + ui->checkHardwareCompatibility->setChecked(g.checkHardwareCompatibility()); + updateUI(); resize(0, 0); // TODO needed? @@ -197,6 +200,8 @@ void FlashFirmwareDialog::on_useLibrarySplash_clicked() void FlashFirmwareDialog::on_burnButton_clicked() { g.flashDir(QFileInfo(fwName).dir().absolutePath()); + g.checkHardwareCompatibility(ui->checkHardwareCompatibility->isChecked()); + g.backupOnFlash(ui->backupEEprom->isChecked()); if (imageSource != FIRMWARE) { // load the splash image @@ -240,13 +245,27 @@ void FlashFirmwareDialog::shrink() void FlashFirmwareDialog::startFlash(const QString &filename) { - bool backup = ui->backupEEprom->checkState() == Qt::Checked; - g.backupOnFlash(backup); + bool backup = g.backupOnFlash(); close(); ProgressDialog progressDialog(this, tr("Write Firmware to Radio"), CompanionIcon("write_flash.png")); + // check hardware compatibility if requested + if (g.checkHardwareCompatibility()) { + QString tempFirmware = generateProcessUniqueTempFileName("flash.bin"); + if (!readFirmware(tempFirmware, progressDialog.progress())) { + QMessageBox::warning(this, tr("Firmware check failed"), tr("Could not check firmware from radio")); + return; + } + FirmwareInterface previousFirmware(tempFirmware); + FirmwareInterface newFirmware(filename); + if (!newFirmware.isHardwareCompatible(previousFirmware)) { + QMessageBox::warning(this, tr("Firmware check failed"), tr("New firmware is not compatible with the one currently installed!")); + return; + } + } + // backup if requested bool result = true; QString backupFilename; @@ -272,5 +291,6 @@ void FlashFirmwareDialog::startFlash(const QString &filename) } } + progressDialog.progress()->setInfo(tr("Flashing done")); progressDialog.exec(); } diff --git a/companion/src/flashfirmwaredialog.ui b/companion/src/flashfirmwaredialog.ui index 065ed4cb9..01d74b78c 100755 --- a/companion/src/flashfirmwaredialog.ui +++ b/companion/src/flashfirmwaredialog.ui @@ -216,6 +216,22 @@ + + + + + 0 + 0 + + + + Allows Companion to write to older version of the firmware + + + Check Hardware compatibility + + + diff --git a/companion/src/process_flash.cpp b/companion/src/process_flash.cpp index 75c1561d0..95d38e766 100755 --- a/companion/src/process_flash.cpp +++ b/companion/src/process_flash.cpp @@ -274,11 +274,10 @@ void FlashProcess::onFinished(int code=0) errorWizard(); } } - else if (hasErrors) + else if (hasErrors) { progress->setInfo(tr("Flashing done with errors")); - else - progress->setInfo(tr("Flashing done")); - if(lfuse || hfuse || efuse) { + } + if (lfuse || hfuse || efuse) { addReadFuses(); } progress->setValue(progress->maximum()); diff --git a/companion/src/radiointerface.cpp b/companion/src/radiointerface.cpp index ddc3840a2..9a304f20d 100755 --- a/companion/src/radiointerface.cpp +++ b/companion/src/radiointerface.cpp @@ -248,8 +248,6 @@ bool readFirmware(const QString &filename, ProgressWidget *progress) return false; } - g.flashDir(QFileInfo(filename).dir().absolutePath()); - if (IS_ARM(GetCurrentFirmware()->getBoard())) { QString path = findMassstoragePath("FIRMWARE.BIN"); if (!path.isEmpty()) {