From 04a4054aaa5c0a90bfbccc97af49ae3ed9fa3a2a Mon Sep 17 00:00:00 2001 From: Pritam Ghanghas Date: Wed, 14 Oct 2015 03:54:55 +0530 Subject: [PATCH] flight mode support for ArduPilot --- QGCApplication.pro | 4 + src/FirmwarePlugin/APM/APMFirmwarePlugin.cc | 90 ++++++++++++++----- src/FirmwarePlugin/APM/APMFirmwarePlugin.h | 23 ++++- .../APM/ArduCopterFirmwarePlugin.cc | 85 +++++++++--------- .../APM/ArduCopterFirmwarePlugin.h | 37 ++++++-- .../APM/ArduPlaneFirmwarePlugin.cc | 72 +++++++++++++++ .../APM/ArduPlaneFirmwarePlugin.h | 74 +++++++++++++++ .../APM/ArduRoverFirmwarePlugin.cc | 60 +++++++++++++ .../APM/ArduRoverFirmwarePlugin.h | 74 +++++++++++++++ src/FirmwarePlugin/FirmwarePluginManager.cc | 18 ++-- src/QGCApplication.cc | 4 + 11 files changed, 459 insertions(+), 82 deletions(-) create mode 100644 src/FirmwarePlugin/APM/ArduPlaneFirmwarePlugin.cc create mode 100644 src/FirmwarePlugin/APM/ArduPlaneFirmwarePlugin.h create mode 100644 src/FirmwarePlugin/APM/ArduRoverFirmwarePlugin.cc create mode 100644 src/FirmwarePlugin/APM/ArduRoverFirmwarePlugin.h diff --git a/QGCApplication.pro b/QGCApplication.pro index 08f0eeedd..26bf2c144 100644 --- a/QGCApplication.pro +++ b/QGCApplication.pro @@ -514,6 +514,8 @@ HEADERS+= \ src/FirmwarePlugin/FirmwarePlugin.h \ src/FirmwarePlugin/APM/APMFirmwarePlugin.h \ src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.h \ + src/FirmwarePlugin/APM/ArduPlaneFirmwarePlugin.h \ + src/FirmwarePlugin/APM/ArduRoverFirmwarePlugin.h \ src/FirmwarePlugin/Generic/GenericFirmwarePlugin.h \ src/FirmwarePlugin/PX4/PX4FirmwarePlugin.h \ src/Vehicle/MultiVehicleManager.h \ @@ -552,6 +554,8 @@ SOURCES += \ src/AutoPilotPlugins/PX4/SensorsComponentController.cc \ src/FirmwarePlugin/APM/APMFirmwarePlugin.cc \ src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.cc \ + src/FirmwarePlugin/APM/ArduPlaneFirmwarePlugin.cc \ + src/FirmwarePlugin/APM/ArduRoverFirmwarePlugin.cc \ src/FirmwarePlugin/FirmwarePluginManager.cc \ src/FirmwarePlugin/Generic/GenericFirmwarePlugin.cc \ src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc \ diff --git a/src/FirmwarePlugin/APM/APMFirmwarePlugin.cc b/src/FirmwarePlugin/APM/APMFirmwarePlugin.cc index 7b359e2a9..92aec3bf9 100644 --- a/src/FirmwarePlugin/APM/APMFirmwarePlugin.cc +++ b/src/FirmwarePlugin/APM/APMFirmwarePlugin.cc @@ -28,8 +28,6 @@ #include "Generic/GenericFirmwarePlugin.h" #include "QGCMAVLink.h" -#include - QGC_LOGGING_CATEGORY(APMFirmwarePluginLog, "APMFirmwarePluginLog") static const QRegExp APM_COPTER_REXP("^(ArduCopter|APM:Copter)"); @@ -115,6 +113,31 @@ void APMFirmwareVersion::_parseVersion(const QString &versionText) _patch = capturedTexts[4].toInt(); } + +/* + * @brief APMCustomMode encapsulates the custom modes for APM + */ +APMCustomMode::APMCustomMode(uint32_t mode, bool settable) : + _mode(mode), + _settable(settable) +{ +} + + +void APMCustomMode::setEnumToStringMapping(const QMap& enumToString) +{ + _enumToString = enumToString; +} + +QString APMCustomMode::modeString() const +{ + QString mode = _enumToString.value(modeAsInt()); + if (mode.isEmpty()) { + mode = "mode" + QString::number(modeAsInt()); + } + return mode; +} + APMFirmwarePlugin::APMFirmwarePlugin(QObject* parent) : FirmwarePlugin(parent) { @@ -123,11 +146,7 @@ APMFirmwarePlugin::APMFirmwarePlugin(QObject* parent) : bool APMFirmwarePlugin::isCapable(FirmwareCapabilities capabilities) { - Q_UNUSED(capabilities); - - // FIXME: No capabilitis yet supported - - return false; + return (capabilities & (MavCmdPreflightStorageCapability | SetFlightModeCapability)) == capabilities; } QList APMFirmwarePlugin::componentsForVehicle(AutoPilotPlugin* vehicle) @@ -138,29 +157,51 @@ QList APMFirmwarePlugin::componentsForVehicle(AutoPilotPlugin } QStringList APMFirmwarePlugin::flightModes(void) -{ - // FIXME: NYI - - qWarning() << "APMFirmwarePlugin::flightModes not supported"; - - return QStringList(); +{ + QStringList flightModesList; + foreach (const APMCustomMode& customMode, _supportedModes) { + if (customMode.canBeSet()) { + flightModesList << customMode.modeString(); + } + } + return flightModesList; } QString APMFirmwarePlugin::flightMode(uint8_t base_mode, uint32_t custom_mode) { - // FIXME: Nothing more than generic support yet - return GenericFirmwarePlugin::instance()->flightMode(base_mode, custom_mode); + QString flightMode = "Unknown"; + + if (base_mode & MAV_MODE_FLAG_CUSTOM_MODE_ENABLED) { + foreach (const APMCustomMode& customMode, _supportedModes) { + if (customMode.modeAsInt() == custom_mode) { + flightMode = customMode.modeString(); + } + } + } + return flightMode; } bool APMFirmwarePlugin::setFlightMode(const QString& flightMode, uint8_t* base_mode, uint32_t* custom_mode) { - Q_UNUSED(flightMode); - Q_UNUSED(base_mode); - Q_UNUSED(custom_mode); - - qWarning() << "APMFirmwarePlugin::setFlightMode called on base class, not supported"; - - return false; + *base_mode = 0; + *custom_mode = 0; + + bool found = false; + + foreach(const APMCustomMode& mode, _supportedModes) { + if (flightMode.compare(mode.modeString(), Qt::CaseInsensitive) == 0) { + *base_mode = MAV_MODE_FLAG_CUSTOM_MODE_ENABLED; + *custom_mode = mode.modeAsInt(); + found = true; + break; + } + } + + if (!found) { + qCWarning(APMFirmwarePluginLog) << "Unknown flight Mode" << flightMode; + } + + return found; } int APMFirmwarePlugin::manualControlReservedButtonCount(void) @@ -332,3 +373,8 @@ void APMFirmwarePlugin::initializeVehicle(Vehicle* vehicle) vehicle->requestDataStream(MAV_DATA_STREAM_EXTRA2, 10); vehicle->requestDataStream(MAV_DATA_STREAM_EXTRA3, 3); } + +void APMFirmwarePlugin::setSupportedModes(QList supportedModes) +{ + _supportedModes = supportedModes; +} diff --git a/src/FirmwarePlugin/APM/APMFirmwarePlugin.h b/src/FirmwarePlugin/APM/APMFirmwarePlugin.h index 7d0c348d5..fa639db16 100644 --- a/src/FirmwarePlugin/APM/APMFirmwarePlugin.h +++ b/src/FirmwarePlugin/APM/APMFirmwarePlugin.h @@ -55,6 +55,23 @@ private: int _patch; }; +class APMCustomMode +{ +public: + APMCustomMode(uint32_t mode, bool settable); + uint32_t modeAsInt() const { return _mode; } + bool canBeSet() const { return _settable; } + QString modeString() const; + +protected: + void setEnumToStringMapping(const QMap& enumToString); + +private: + uint32_t _mode; + bool _settable; + QMap _enumToString; +}; + /// This is the base class for all stack specific APM firmware plugins class APMFirmwarePlugin : public FirmwarePlugin { @@ -74,13 +91,15 @@ public: protected: /// All access to singleton is through stack specific implementation APMFirmwarePlugin(QObject* parent = NULL); + void setSupportedModes(QList supportedModes); private: void _adjustSeverity(mavlink_message_t* message) const; static bool _isTextSeverityAdjustmentNeeded(const APMFirmwareVersion& firmwareVersion); - APMFirmwareVersion _firmwareVersion; - bool _textSeverityAdjustmentNeeded; + APMFirmwareVersion _firmwareVersion; + bool _textSeverityAdjustmentNeeded; + QList _supportedModes; }; diff --git a/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.cc b/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.cc index 7d51a871a..5d4a972df 100644 --- a/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.cc +++ b/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.cc @@ -26,56 +26,53 @@ #include "ArduCopterFirmwarePlugin.h" #include "Generic/GenericFirmwarePlugin.h" -#include "QGCMAVLink.h" - -#include IMPLEMENT_QGC_SINGLETON(ArduCopterFirmwarePlugin, ArduCopterFirmwarePlugin) -ArduCopterFirmwarePlugin::ArduCopterFirmwarePlugin(QObject* parent) : - APMFirmwarePlugin(parent) +APMCopterMode::APMCopterMode(uint32_t mode, bool settable) : APMCustomMode(mode, settable) { + QMap enumToString; + enumToString.insert(STABILIZE, "Stabilize"); + enumToString.insert(ACRO, "Acro"); + enumToString.insert(ALT_HOLD, "Alt Hold"); + enumToString.insert(AUTO, "Auto"); + enumToString.insert(GUIDED, "Guided"); + enumToString.insert(LOITER, "Loiter"); + enumToString.insert(RTL, "RTL"); + enumToString.insert(CIRCLE, "Circle"); + enumToString.insert(POSITION, "Position"); + enumToString.insert(LAND, "Land"); + enumToString.insert(OF_LOITER, "OF Loiter"); + enumToString.insert(DRIFT, "Drift"); + enumToString.insert(SPORT, "Sport"); + enumToString.insert(FLIP, "Flip"); + enumToString.insert(AUTOTUNE, "Autotune"); + enumToString.insert(POS_HOLD, "Pos Hold"); + enumToString.insert(BRAKE, "Brake"); + setEnumToStringMapping(enumToString); } -bool ArduCopterFirmwarePlugin::isCapable(FirmwareCapabilities capabilities) -{ - Q_UNUSED(capabilities); - - // FIXME: No capabilitis yet supported - - return false; -} - -QList ArduCopterFirmwarePlugin::componentsForVehicle(AutoPilotPlugin* vehicle) -{ - Q_UNUSED(vehicle); - - return QList(); -} - -QStringList ArduCopterFirmwarePlugin::flightModes(void) -{ - // FIXME: NYI - - qWarning() << "ArduCopterFirmwarePlugin::flightModes not supported"; - - return QStringList(); -} - -QString ArduCopterFirmwarePlugin::flightMode(uint8_t base_mode, uint32_t custom_mode) -{ - // FIXME: Nothing more than generic support yet - return GenericFirmwarePlugin::instance()->flightMode(base_mode, custom_mode); -} - -bool ArduCopterFirmwarePlugin::setFlightMode(const QString& flightMode, uint8_t* base_mode, uint32_t* custom_mode) +ArduCopterFirmwarePlugin::ArduCopterFirmwarePlugin(QObject* parent) : + APMFirmwarePlugin(parent) { - Q_UNUSED(flightMode); - Q_UNUSED(base_mode); - Q_UNUSED(custom_mode); - - qWarning() << "ArduCopterFirmwarePlugin::setFlightMode called on base class, not supported"; - - return false; + QList supportedFlightModes; + supportedFlightModes << APMCopterMode(APMCopterMode::STABILIZE ,true); + supportedFlightModes << APMCopterMode(APMCopterMode::ACRO ,true); + supportedFlightModes << APMCopterMode(APMCopterMode::ALT_HOLD ,true); + supportedFlightModes << APMCopterMode(APMCopterMode::AUTO ,true); + supportedFlightModes << APMCopterMode(APMCopterMode::GUIDED ,true); + supportedFlightModes << APMCopterMode(APMCopterMode::LOITER ,true); + supportedFlightModes << APMCopterMode(APMCopterMode::RTL ,true); + supportedFlightModes << APMCopterMode(APMCopterMode::CIRCLE ,true); + supportedFlightModes << APMCopterMode(APMCopterMode::POSITION ,true); + supportedFlightModes << APMCopterMode(APMCopterMode::LAND ,true); + supportedFlightModes << APMCopterMode(APMCopterMode::OF_LOITER ,true); + supportedFlightModes << APMCopterMode(APMCopterMode::DRIFT ,true); + supportedFlightModes << APMCopterMode(APMCopterMode::SPORT ,true); + supportedFlightModes << APMCopterMode(APMCopterMode::FLIP ,true); + supportedFlightModes << APMCopterMode(APMCopterMode::AUTOTUNE ,true); + supportedFlightModes << APMCopterMode(APMCopterMode::POS_HOLD ,true); + supportedFlightModes << APMCopterMode(APMCopterMode::BRAKE ,true); + setSupportedModes(supportedFlightModes); } diff --git a/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.h b/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.h index db930bc76..a94e82010 100644 --- a/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.h +++ b/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.h @@ -29,6 +29,35 @@ #include "APMFirmwarePlugin.h" +class APMCopterMode : public APMCustomMode +{ +public: + enum Mode { + STABILIZE = 0, // hold level position + ACRO = 1, // rate control + ALT_HOLD = 2, // AUTO control + AUTO = 3, // AUTO control + GUIDED = 4, // AUTO control + LOITER = 5, // Hold a single location + RTL = 6, // AUTO control + CIRCLE = 7, // AUTO control + POSITION = 8, // AUTO control + LAND = 9, // AUTO control + OF_LOITER = 10, // Hold a single location using optical flow + // sensor + DRIFT = 11, // Drift 'Car Like' mode + RESERVED_12 = 12, // RESERVED FOR FUTURE USE + SPORT = 13, // [TODO] Verify this is correct. + FLIP = 14, + AUTOTUNE = 15, + POS_HOLD = 16, // HYBRID LOITER. + BRAKE = 17 + }; + static const int modeCount = 18; + + APMCopterMode(uint32_t mode, bool settable); +}; + class ArduCopterFirmwarePlugin : public APMFirmwarePlugin { Q_OBJECT @@ -36,13 +65,7 @@ class ArduCopterFirmwarePlugin : public APMFirmwarePlugin DECLARE_QGC_SINGLETON(ArduCopterFirmwarePlugin, ArduCopterFirmwarePlugin) public: - // Overrides from FirmwarePlugin - virtual bool isCapable(FirmwareCapabilities capabilities); - virtual QList componentsForVehicle(AutoPilotPlugin* vehicle); - virtual QStringList flightModes(void); - virtual QString flightMode(uint8_t base_mode, uint32_t custom_mode); - virtual bool setFlightMode(const QString& flightMode, uint8_t* base_mode, uint32_t* custom_mode); - + protected: /// All access to singleton is through instance() ArduCopterFirmwarePlugin(QObject* parent = NULL); diff --git a/src/FirmwarePlugin/APM/ArduPlaneFirmwarePlugin.cc b/src/FirmwarePlugin/APM/ArduPlaneFirmwarePlugin.cc new file mode 100644 index 000000000..e4de1ac62 --- /dev/null +++ b/src/FirmwarePlugin/APM/ArduPlaneFirmwarePlugin.cc @@ -0,0 +1,72 @@ +/*===================================================================== + + QGroundControl Open Source Ground Control Station + + (c) 2009 - 2015 QGROUNDCONTROL PROJECT + + This file is part of the QGROUNDCONTROL project + + QGROUNDCONTROL is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + QGROUNDCONTROL is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QGROUNDCONTROL. If not, see . + + ======================================================================*/ + +/// @file +/// @author Pritam Ghanghas + +#include "ArduPlaneFirmwarePlugin.h" +#include "Generic/GenericFirmwarePlugin.h" + +IMPLEMENT_QGC_SINGLETON(ArduPlaneFirmwarePlugin, ArduPlaneFirmwarePlugin) + +APMPlaneMode::APMPlaneMode(uint32_t mode, bool settable) : APMCustomMode(mode, settable) +{ + QMap enumToString; + enumToString.insert(MANUAL, "Manual"); + enumToString.insert(CIRCLE, "Circle"); + enumToString.insert(STABILIZE, "Stabilize"); + enumToString.insert(TRAINING, "Training"); + enumToString.insert(ACRO, "Acro"); + enumToString.insert(FLY_BY_WIRE_A, "FWB A"); + enumToString.insert(FLY_BY_WIRE_B, "FWB B"); + enumToString.insert(CRUISE, "Cruise"); + enumToString.insert(AUTOTUNE, "Autotune"); + enumToString.insert(AUTO, "Auto"); + enumToString.insert(RTL, "RTL"); + enumToString.insert(LOITER, "Loiter"); + enumToString.insert(GUIDED, "Guided"); + enumToString.insert(INITIALIZING, "Initializing"); + + setEnumToStringMapping(enumToString); +} + +ArduPlaneFirmwarePlugin::ArduPlaneFirmwarePlugin(QObject* parent) : + APMFirmwarePlugin(parent) +{ + QList supportedFlightModes; + supportedFlightModes << APMPlaneMode(APMPlaneMode::MANUAL ,true); + supportedFlightModes << APMPlaneMode(APMPlaneMode::CIRCLE ,true); + supportedFlightModes << APMPlaneMode(APMPlaneMode::STABILIZE ,true); + supportedFlightModes << APMPlaneMode(APMPlaneMode::TRAINING ,true); + supportedFlightModes << APMPlaneMode(APMPlaneMode::ACRO ,true); + supportedFlightModes << APMPlaneMode(APMPlaneMode::FLY_BY_WIRE_A ,true); + supportedFlightModes << APMPlaneMode(APMPlaneMode::FLY_BY_WIRE_B ,true); + supportedFlightModes << APMPlaneMode(APMPlaneMode::CRUISE ,true); + supportedFlightModes << APMPlaneMode(APMPlaneMode::AUTOTUNE ,true); + supportedFlightModes << APMPlaneMode(APMPlaneMode::AUTO ,true); + supportedFlightModes << APMPlaneMode(APMPlaneMode::RTL ,true); + supportedFlightModes << APMPlaneMode(APMPlaneMode::LOITER ,true); + supportedFlightModes << APMPlaneMode(APMPlaneMode::GUIDED ,true); + supportedFlightModes << APMPlaneMode(APMPlaneMode::INITIALIZING ,false); + setSupportedModes(supportedFlightModes); +} diff --git a/src/FirmwarePlugin/APM/ArduPlaneFirmwarePlugin.h b/src/FirmwarePlugin/APM/ArduPlaneFirmwarePlugin.h new file mode 100644 index 000000000..648f19b9f --- /dev/null +++ b/src/FirmwarePlugin/APM/ArduPlaneFirmwarePlugin.h @@ -0,0 +1,74 @@ +/*===================================================================== + + QGroundControl Open Source Ground Control Station + + (c) 2009 - 2014 QGROUNDCONTROL PROJECT + + This file is part of the QGROUNDCONTROL project + + QGROUNDCONTROL is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + QGROUNDCONTROL is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QGROUNDCONTROL. If not, see . + + ======================================================================*/ + +/// @file +/// @author Pritam Ghanghas + +#ifndef ArduPlaneFirmwarePlugin_H +#define ArduPlaneFirmwarePlugin_H + +#include "APMFirmwarePlugin.h" + +class APMPlaneMode: public APMCustomMode +{ +public: + enum Mode { + MANUAL = 0, + CIRCLE = 1, + STABILIZE = 2, + TRAINING = 3, + ACRO = 4, + FLY_BY_WIRE_A = 5, + FLY_BY_WIRE_B = 6, + CRUISE = 7, + AUTOTUNE = 8, + RESERVED_9 = 9, // RESERVED FOR FUTURE USE + AUTO = 10, + RTL = 11, + LOITER = 12, + RESERVED_13 = 13, // RESERVED FOR FUTURE USE + RESERVED_14 = 14, // RESERVED FOR FUTURE USE + GUIDED = 15, + INITIALIZING = 16 + }; + static const int modeCount = 17; + + APMPlaneMode(uint32_t mode, bool settable); +}; + +class ArduPlaneFirmwarePlugin : public APMFirmwarePlugin +{ + Q_OBJECT + + DECLARE_QGC_SINGLETON(ArduPlaneFirmwarePlugin, ArduPlaneFirmwarePlugin) + +public: + +protected: + /// All access to singleton is through instance() + ArduPlaneFirmwarePlugin(QObject* parent = NULL); + +private: +}; + +#endif diff --git a/src/FirmwarePlugin/APM/ArduRoverFirmwarePlugin.cc b/src/FirmwarePlugin/APM/ArduRoverFirmwarePlugin.cc new file mode 100644 index 000000000..2488a2a4a --- /dev/null +++ b/src/FirmwarePlugin/APM/ArduRoverFirmwarePlugin.cc @@ -0,0 +1,60 @@ +/*===================================================================== + + QGroundControl Open Source Ground Control Station + + (c) 2009 - 2015 QGROUNDCONTROL PROJECT + + This file is part of the QGROUNDCONTROL project + + QGROUNDCONTROL is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + QGROUNDCONTROL is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QGROUNDCONTROL. If not, see . + + ======================================================================*/ + +/// @file +/// @author Pritam Ghanghas + +#include "ArduRoverFirmwarePlugin.h" +#include "Generic/GenericFirmwarePlugin.h" + +IMPLEMENT_QGC_SINGLETON(ArduRoverFirmwarePlugin, ArduRoverFirmwarePlugin) + +APMRoverMode::APMRoverMode(uint32_t mode, bool settable) : APMCustomMode(mode, settable) +{ + QMap enumToString; + enumToString.insert(MANUAL, "Manual"); + enumToString.insert(LEARNING, "Learning"); + enumToString.insert(STEERING, "Steering"); + enumToString.insert(HOLD, "Hold"); + enumToString.insert(AUTO, "Auto"); + enumToString.insert(RTL, "RTL"); + enumToString.insert(GUIDED, "Guided"); + enumToString.insert(INITIALIZING, "Initializing"); + + setEnumToStringMapping(enumToString); +} + +ArduRoverFirmwarePlugin::ArduRoverFirmwarePlugin(QObject* parent) : + APMFirmwarePlugin(parent) +{ + QList supportedFlightModes; + supportedFlightModes << APMRoverMode(APMRoverMode::MANUAL ,true); + supportedFlightModes << APMRoverMode(APMRoverMode::LEARNING ,true); + supportedFlightModes << APMRoverMode(APMRoverMode::STEERING ,true); + supportedFlightModes << APMRoverMode(APMRoverMode::HOLD ,true); + supportedFlightModes << APMRoverMode(APMRoverMode::AUTO ,true); + supportedFlightModes << APMRoverMode(APMRoverMode::RTL ,true); + supportedFlightModes << APMRoverMode(APMRoverMode::GUIDED ,true); + supportedFlightModes << APMRoverMode(APMRoverMode::INITIALIZING ,false); + setSupportedModes(supportedFlightModes); +} diff --git a/src/FirmwarePlugin/APM/ArduRoverFirmwarePlugin.h b/src/FirmwarePlugin/APM/ArduRoverFirmwarePlugin.h new file mode 100644 index 000000000..697a2466c --- /dev/null +++ b/src/FirmwarePlugin/APM/ArduRoverFirmwarePlugin.h @@ -0,0 +1,74 @@ +/*===================================================================== + + QGroundControl Open Source Ground Control Station + + (c) 2009 - 2014 QGROUNDCONTROL PROJECT + + This file is part of the QGROUNDCONTROL project + + QGROUNDCONTROL is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + QGROUNDCONTROL is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QGROUNDCONTROL. If not, see . + + ======================================================================*/ + +/// @file +/// @author Pritam Ghanghas + +#ifndef ArduRoverFirmwarePlugin_H +#define ArduRoverFirmwarePlugin_H + +#include "APMFirmwarePlugin.h" + +class APMRoverMode : public APMCustomMode +{ +public: + enum Mode { + MANUAL = 0, + RESERVED_1 = 1, // RESERVED FOR FUTURE USE + LEARNING = 2, + STEERING = 3, + HOLD = 4, + RESERVED_5 = 5, // RESERVED FOR FUTURE USE + RESERVED_6 = 6, // RESERVED FOR FUTURE USE + RESERVED_7 = 7, // RESERVED FOR FUTURE USE + RESERVED_8 = 8, // RESERVED FOR FUTURE USE + RESERVED_9 = 9, // RESERVED FOR FUTURE USE + AUTO = 10, + RTL = 11, + RESERVED_12 = 12, // RESERVED FOR FUTURE USE + RESERVED_13 = 13, // RESERVED FOR FUTURE USE + RESERVED_14 = 14, // RESERVED FOR FUTURE USE + GUIDED = 15, + INITIALIZING = 16, + }; + static const int modeCount = 17; + + APMRoverMode(uint32_t mode, bool settable); +}; + +class ArduRoverFirmwarePlugin : public APMFirmwarePlugin +{ + Q_OBJECT + + DECLARE_QGC_SINGLETON(ArduRoverFirmwarePlugin, ArduRoverFirmwarePlugin) + +public: + +protected: + /// All access to singleton is through instance() + ArduRoverFirmwarePlugin(QObject* parent = NULL); + +private: +}; + +#endif diff --git a/src/FirmwarePlugin/FirmwarePluginManager.cc b/src/FirmwarePlugin/FirmwarePluginManager.cc index 1c00ecbde..a781f0bf8 100644 --- a/src/FirmwarePlugin/FirmwarePluginManager.cc +++ b/src/FirmwarePlugin/FirmwarePluginManager.cc @@ -27,6 +27,8 @@ #include "FirmwarePluginManager.h" #include "Generic/GenericFirmwarePlugin.h" #include "APM/ArduCopterFirmwarePlugin.h" +#include "APM/ArduPlaneFirmwarePlugin.h" +#include "APM/ArduRoverFirmwarePlugin.h" #include "PX4/PX4FirmwarePlugin.h" IMPLEMENT_QGC_SINGLETON(FirmwarePluginManager, FirmwarePluginManager) @@ -51,22 +53,24 @@ FirmwarePlugin* FirmwarePluginManager::firmwarePluginForAutopilot(MAV_AUTOPILOT case MAV_TYPE_HEXAROTOR: case MAV_TYPE_OCTOROTOR: case MAV_TYPE_TRICOPTER: + case MAV_TYPE_COAXIAL: + case MAV_TYPE_HELICOPTER: return ArduCopterFirmwarePlugin::instance(); break; - // FIXME: The remainder of these need to be correctly assigned and new plugin classes created as needed. - // Once done, the unused cases can be removed and just the fall back default: left case MAV_TYPE_FIXED_WING: + return ArduPlaneFirmwarePlugin::instance(); + break; + case MAV_TYPE_GROUND_ROVER: + case MAV_TYPE_SURFACE_BOAT: + case MAV_TYPE_SUBMARINE: + return ArduRoverFirmwarePlugin::instance(); + break; case MAV_TYPE_GENERIC: - case MAV_TYPE_COAXIAL: - case MAV_TYPE_HELICOPTER: case MAV_TYPE_ANTENNA_TRACKER: case MAV_TYPE_GCS: case MAV_TYPE_AIRSHIP: case MAV_TYPE_FREE_BALLOON: case MAV_TYPE_ROCKET: - case MAV_TYPE_GROUND_ROVER: - case MAV_TYPE_SURFACE_BOAT: - case MAV_TYPE_SUBMARINE: case MAV_TYPE_FLAPPING_WING: case MAV_TYPE_KITE: case MAV_TYPE_ONBOARD_CONTROLLER: diff --git a/src/QGCApplication.cc b/src/QGCApplication.cc index 4230ee0f1..a4507446b 100644 --- a/src/QGCApplication.cc +++ b/src/QGCApplication.cc @@ -74,6 +74,8 @@ #include "MultiVehicleManager.h" #include "Generic/GenericFirmwarePlugin.h" #include "APM/ArduCopterFirmwarePlugin.h" +#include "APM/ArduPlaneFirmwarePlugin.h" +#include "APM/ArduRoverFirmwarePlugin.h" #include "PX4/PX4FirmwarePlugin.h" #include "Vehicle.h" #include "MavlinkQmlSingleton.h" @@ -584,6 +586,8 @@ void QGCApplication::_createSingletons(void) // No dependencies firmwarePlugin = PX4FirmwarePlugin::_createSingleton(); firmwarePlugin = ArduCopterFirmwarePlugin::_createSingleton(); + firmwarePlugin = ArduPlaneFirmwarePlugin::_createSingleton(); + firmwarePlugin = ArduRoverFirmwarePlugin::_createSingleton(); // No dependencies FirmwarePluginManager* firmwarePluginManager = FirmwarePluginManager::_createSingleton(); -- 2.22.0