diff --git a/src/AutoPilotPlugins/AutoPilotPluginManager.cc b/src/AutoPilotPlugins/AutoPilotPluginManager.cc index 097198218d7ba6feaff553a04757aefc9ada1651..624f0073806fc060cdaa7450ed550654f6ce2b7d 100644 --- a/src/AutoPilotPlugins/AutoPilotPluginManager.cc +++ b/src/AutoPilotPlugins/AutoPilotPluginManager.cc @@ -93,10 +93,10 @@ void AutoPilotPluginManager::_uasDeleted(UASInterface* uas) int uasId = uas->getUASID(); Q_ASSERT(uasId != 0); - Q_ASSERT(_pluginMap.contains(autopilotType)); - Q_ASSERT(_pluginMap[autopilotType].contains(uasId)); - delete _pluginMap[autopilotType][uasId]; - _pluginMap[autopilotType].remove(uasId); + if (_pluginMap.contains(autopilotType) && _pluginMap[autopilotType].contains(uasId)) { + delete _pluginMap[autopilotType][uasId]; + _pluginMap[autopilotType].remove(uasId); + } } AutoPilotPlugin* AutoPilotPluginManager::getInstanceForAutoPilotPlugin(UASInterface* uas) diff --git a/src/FactSystem/FactBinder.cc b/src/FactSystem/FactBinder.cc index f16350ade727c41dc72b9b5ef29c729bf25cb021..d0979c390974ef87f6a266f792f75f006b8d6b2d 100644 --- a/src/FactSystem/FactBinder.cc +++ b/src/FactSystem/FactBinder.cc @@ -27,6 +27,8 @@ #include "FactBinder.h" #include "UASManager.h" #include "AutoPilotPluginManager.h" +#include "QGCApplication.h" + #include FactBinder::FactBinder(void) : @@ -83,8 +85,8 @@ void FactBinder::setName(const QString& name) emit nameChanged(); emit metaDataChanged(); } else { - qWarning() << "FAILED BINDING PARAM" << name << ": PARAM DOES NOT EXIST ON SYSTEM!"; - Q_ASSERT(false); + QString panicMessage("Required parameter (component id: %1, name: %2), is missing from vehicle. QGroundControl cannot operate with this firmware revision. QGroundControl will now shut down."); + qgcApp()->panicShutdown(panicMessage.arg(_componentId).arg(parsedName)); } } } diff --git a/src/FactSystem/ParameterLoader.cc b/src/FactSystem/ParameterLoader.cc index c27fb70085a5b7d4936e93c18c3d225274cfa748..c1a5da25196843d187fb3eba41e5bb4e40a7f551 100644 --- a/src/FactSystem/ParameterLoader.cc +++ b/src/FactSystem/ParameterLoader.cc @@ -27,6 +27,7 @@ #include "ParameterLoader.h" #include "QGCApplication.h" #include "QGCLoggingCategory.h" +#include "QGCApplication.h" #include #include @@ -268,8 +269,12 @@ bool ParameterLoader::parameterExists(int componentId, const QString& name) Fact* ParameterLoader::getFact(int componentId, const QString& name) { componentId = _actualComponentId(componentId); - Q_ASSERT(_mapParameterName2Variant.contains(componentId)); - Q_ASSERT(_mapParameterName2Variant[componentId].contains(name)); + + if (!_mapParameterName2Variant.contains(componentId) || !_mapParameterName2Variant[componentId].contains(name)) { + QString panicMessage("Required parameter (component id: %1, name: %2), is missing from vehicle. QGroundControl cannot operate with this firmware revision. QGroundControl will now shut down."); + qgcApp()->panicShutdown(panicMessage.arg(componentId).arg(name)); + } + Fact* fact = _mapParameterName2Variant[componentId][name].value(); Q_ASSERT(fact); return fact; diff --git a/src/QGCApplication.cc b/src/QGCApplication.cc index 7b76300f5481d808e79c9f61578eed6b77ace191..b9ad6c733f3838221490bf311adf06b2450074b4 100644 --- a/src/QGCApplication.cc +++ b/src/QGCApplication.cc @@ -635,3 +635,9 @@ void QGCApplication::_reconnect(void) LinkManager::instance()->createConnectedLink(_reconnectLinkConfig); _reconnectLinkConfig = NULL; } + +void QGCApplication::panicShutdown(const QString& panicMessage) +{ + QGCMessageBox::critical("Panic Shutdown", panicMessage); + ::exit(0); +} diff --git a/src/QGCApplication.h b/src/QGCApplication.h index 8bd84b55d7eb489d3adfe58526cae174c3f760a6..695d3d7d404ed73797d96cb6bef4f486b0d1019a 100644 --- a/src/QGCApplication.h +++ b/src/QGCApplication.h @@ -98,6 +98,10 @@ public: /// Disconnects the current link and waits for the specified number of seconds before reconnecting. void reconnectAfterWait(int waitSeconds); + /// Used to shutdown the app if a fatal condition occurs from which it cannot recover + /// @param panicMessage Message to display to user + void panicShutdown(const QString& panicMessage); + public slots: /// You can connect to this slot to show an information message box from a different thread. void informationMessageBoxOnMainThread(const QString& title, const QString& msg);