From a546d9a6d103f1264991405ce9333af8ff4b12a0 Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Sun, 26 Apr 2015 16:35:58 -0700 Subject: [PATCH] Exit app immediately if missing required paramter --- src/AutoPilotPlugins/AutoPilotPluginManager.cc | 8 ++++---- src/FactSystem/FactBinder.cc | 6 ++++-- src/FactSystem/ParameterLoader.cc | 9 +++++++-- src/QGCApplication.cc | 6 ++++++ src/QGCApplication.h | 4 ++++ 5 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/AutoPilotPlugins/AutoPilotPluginManager.cc b/src/AutoPilotPlugins/AutoPilotPluginManager.cc index 0971982..624f007 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 f16350a..d0979c3 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 c27fb70..c1a5da2 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 7b76300..b9ad6c7 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 8bd84b5..695d3d7 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);