From b70e1880cf3eb3c75d567cb38b340be8b8cc7e1d Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Mon, 8 May 2017 20:11:44 -0700 Subject: [PATCH] Correctly place firmware plugin instance data with Vehicle --- src/FirmwarePlugin/APM/APMFirmwarePlugin.cc | 19 ++++++++++++++----- src/FirmwarePlugin/APM/APMFirmwarePlugin.h | 15 +++++++++++++-- src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc | 17 +++++++++++------ src/FirmwarePlugin/PX4/PX4FirmwarePlugin.h | 13 ++++++++++++- 4 files changed, 50 insertions(+), 14 deletions(-) diff --git a/src/FirmwarePlugin/APM/APMFirmwarePlugin.cc b/src/FirmwarePlugin/APM/APMFirmwarePlugin.cc index 475955e42..3ca2eebbb 100644 --- a/src/FirmwarePlugin/APM/APMFirmwarePlugin.cc +++ b/src/FirmwarePlugin/APM/APMFirmwarePlugin.cc @@ -139,9 +139,15 @@ QString APMCustomMode::modeString() const return mode; } +APMFirmwarePluginInstanceData::APMFirmwarePluginInstanceData(QObject* parent) + : QObject(parent) + , textSeverityAdjustmentNeeded(false) +{ + +} + APMFirmwarePlugin::APMFirmwarePlugin(void) : _coaxialMotors(false) - , _textSeverityAdjustmentNeeded(false) { qmlRegisterType ("QGroundControl.Controllers", 1, 0, "APMFlightModesComponentController"); qmlRegisterType ("QGroundControl.Controllers", 1, 0, "APMAirframeComponentController"); @@ -321,6 +327,7 @@ void APMFirmwarePlugin::_handleOutgoingParamSet(Vehicle* vehicle, LinkInterface* bool APMFirmwarePlugin::_handleIncomingStatusText(Vehicle* vehicle, mavlink_message_t* message) { QString messageText; + APMFirmwarePluginInstanceData* instanceData = qobject_cast(vehicle->firmwarePluginInstanceData()); mavlink_statustext_t statusText; mavlink_msg_statustext_decode(message, &statusText); @@ -334,7 +341,7 @@ bool APMFirmwarePlugin::_handleIncomingStatusText(Vehicle* vehicle, mavlink_mess if (messageText.contains(APM_COPTER_REXP) || messageText.contains(APM_PLANE_REXP) || messageText.contains(APM_ROVER_REXP) || messageText.contains(APM_SUB_REXP)) { // found version string APMFirmwareVersion firmwareVersion(messageText); - _textSeverityAdjustmentNeeded = _isTextSeverityAdjustmentNeeded(firmwareVersion); + instanceData->textSeverityAdjustmentNeeded = _isTextSeverityAdjustmentNeeded(firmwareVersion); vehicle->setFirmwareVersion(firmwareVersion.majorNumber(), firmwareVersion.minorNumber(), firmwareVersion.patchNumber()); @@ -378,7 +385,7 @@ bool APMFirmwarePlugin::_handleIncomingStatusText(Vehicle* vehicle, mavlink_mess } // adjust mesasge if needed - if (_textSeverityAdjustmentNeeded) { + if (instanceData->textSeverityAdjustmentNeeded) { _adjustSeverity(message); } @@ -416,10 +423,10 @@ bool APMFirmwarePlugin::_handleIncomingStatusText(Vehicle* vehicle, mavlink_mess if (messageText.startsWith("PreArm")) { // ArduPilot PreArm messages can come across very frequently especially on Solo, which seems to send them once a second. // Filter them out if they come too quickly. - if (_noisyPrearmMap.contains(messageText) && _noisyPrearmMap[messageText].msecsTo(QTime::currentTime()) < (10 * 1000)) { + if (instanceData->noisyPrearmMap.contains(messageText) && instanceData->noisyPrearmMap[messageText].msecsTo(QTime::currentTime()) < (10 * 1000)) { return false; } - _noisyPrearmMap[messageText] = QTime::currentTime(); + instanceData->noisyPrearmMap[messageText] = QTime::currentTime(); vehicle->setPrearmError(messageText); } @@ -578,6 +585,8 @@ void APMFirmwarePlugin::_adjustCalibrationMessageSeverity(mavlink_message_t* mes void APMFirmwarePlugin::initializeVehicle(Vehicle* vehicle) { + vehicle->setFirmwarePluginInstanceData(new APMFirmwarePluginInstanceData); + if (vehicle->isOfflineEditingVehicle()) { switch (vehicle->vehicleType()) { case MAV_TYPE_QUADROTOR: diff --git a/src/FirmwarePlugin/APM/APMFirmwarePlugin.h b/src/FirmwarePlugin/APM/APMFirmwarePlugin.h index f53f1fa82..ce46554f0 100644 --- a/src/FirmwarePlugin/APM/APMFirmwarePlugin.h +++ b/src/FirmwarePlugin/APM/APMFirmwarePlugin.h @@ -120,13 +120,24 @@ private: void _handleOutgoingParamSet(Vehicle* vehicle, LinkInterface* outgoingLink, mavlink_message_t* message); void _soloVideoHandshake(Vehicle* vehicle); - bool _textSeverityAdjustmentNeeded; + // Any instance data here must be global to all vehicles + // Vehicle specific data should go into APMFirmwarePluginInstanceData + QList _supportedModes; - QMap _noisyPrearmMap; static const char* _artooIP; static const int _artooVideoHandshakePort; +}; + +class APMFirmwarePluginInstanceData : public QObject +{ + Q_OBJECT + +public: + APMFirmwarePluginInstanceData(QObject* parent = NULL); + bool textSeverityAdjustmentNeeded; + QMap noisyPrearmMap; }; #endif diff --git a/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc b/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc index 24ddd4942..161f8b77a 100644 --- a/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc +++ b/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc @@ -26,6 +26,13 @@ #include "px4_custom_mode.h" +PX4FirmwarePluginInstanceData::PX4FirmwarePluginInstanceData(QObject* parent) + : QObject(parent) + , versionNotified(false) +{ + +} + PX4FirmwarePlugin::PX4FirmwarePlugin(void) : _manualFlightMode(tr("Manual")) , _acroFlightMode(tr("Acro")) @@ -43,7 +50,6 @@ PX4FirmwarePlugin::PX4FirmwarePlugin(void) , _rtgsFlightMode(tr("Return to Groundstation")) , _followMeFlightMode(tr("Follow Me")) , _simpleFlightMode(tr("Simple")) - , _versionNotified(false) { qmlRegisterType ("QGroundControl.Controllers", 1, 0, "PX4AdvancedFlightModesController"); qmlRegisterType ("QGroundControl.Controllers", 1, 0, "PX4SimpleFlightModesController"); @@ -229,9 +235,7 @@ bool PX4FirmwarePlugin::isCapable(const Vehicle *vehicle, FirmwareCapabilities c void PX4FirmwarePlugin::initializeVehicle(Vehicle* vehicle) { - Q_UNUSED(vehicle); - - // PX4 Flight Stack doesn't need to do any extra work + vehicle->setFirmwarePluginInstanceData(new PX4FirmwarePluginInstanceData); } bool PX4FirmwarePlugin::sendHomePositionToVehicle(void) @@ -500,7 +504,8 @@ void PX4FirmwarePlugin::_handleAutopilotVersion(Vehicle* vehicle, mavlink_messag { Q_UNUSED(vehicle); - if (!_versionNotified) { + PX4FirmwarePluginInstanceData* instanceData = qobject_cast(vehicle->firmwarePluginInstanceData()); + if (!instanceData->versionNotified) { bool notifyUser = false; int supportedMajorVersion = 1; int supportedMinorVersion = 4; @@ -530,7 +535,7 @@ void PX4FirmwarePlugin::_handleAutopilotVersion(Vehicle* vehicle, mavlink_messag } if (notifyUser) { - _versionNotified = true; + instanceData->versionNotified = true; qgcApp()->showMessage(QString("QGroundControl supports PX4 Pro firmware Version %1.%2.%3 and above. You are using a version prior to that which will lead to unpredictable results. Please upgrade your firmware.").arg(supportedMajorVersion).arg(supportedMinorVersion).arg(supportedPatchVersion)); } } diff --git a/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.h b/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.h index 0eb139c72..bda3803a9 100644 --- a/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.h +++ b/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.h @@ -108,7 +108,18 @@ private slots: private: void _handleAutopilotVersion(Vehicle* vehicle, mavlink_message_t* message); - bool _versionNotified; ///< true: user notified over version issue + // Any instance data here must be global to all vehicles + // Vehicle specific data should go into PX4FirmwarePluginInstanceData +}; + +class PX4FirmwarePluginInstanceData : public QObject +{ + Q_OBJECT + +public: + PX4FirmwarePluginInstanceData(QObject* parent = NULL); + + bool versionNotified; ///< true: user notified over version issue }; #endif -- 2.22.0