/**************************************************************************** * * (c) 2009-2016 QGROUNDCONTROL PROJECT * * QGroundControl is licensed according to the terms in the file * COPYING.md in the root of the source code directory. * ****************************************************************************/ #ifndef MissionCommandTree_H #define MissionCommandTree_H #include "QGCToolbox.h" #include "QGCMAVLink.h" #include "Vehicle.h" #include #include class MissionCommandUIInfo; class MissionCommandList; class SettingsManager; #ifdef UNITTEST_BUILD class MissionCommandTreeTest; #endif /// Manages a hierarchy of MissionCommandUIInfo. /// /// The static hierarchy allows for overriding mission command ui info based on MAV_AUTOPILOT and MAV_TYPE. The hierarchy of the tree is: /// Any Firmware, Any Vehicle - Base set of all command definitions for any firmware, any vehicle, essentially ui defined to mavlink spec /// Any Firmware, Fixed Wing /// Known Firmware, Fixed Wing /// Any Firmware, Multi Rotor (all types) /// Known Firmware, Multi Rotor (all types) /// Any Firmware, VTOL (all types) /// Known Firmware, VTOL (all types) /// Any Firmware, Rover /// Known Firmware, Rover /// Any Firmware, Sub /// Known Firmware, Sub /// For known firmwares, the override files are requested from the FirmwarePlugin. /// /// When ui info is requested for a specific vehicle the static hierarchy in _staticCommandTree is collapsed into the set of available commands in /// _availableCommands taking into account the appropriate set of overrides for the MAV_AUTOPILOT/MAV_TYPE combination associated with the vehicle. /// class MissionCommandTree : public QGCTool { Q_OBJECT public: MissionCommandTree(QGCApplication* app, QGCToolbox* toolbox, bool unitTest = false); /// Returns the friendly name for the specified command QString friendlyName(MAV_CMD command); /// Returns the raw name for the specified command QString rawName(MAV_CMD command); const QList& allCommandIds(void) const; Q_INVOKABLE QStringList categoriesForVehicle(Vehicle* vehicle) { return _availableCategoriesForVehicle(vehicle); } const MissionCommandUIInfo* getUIInfo(Vehicle* vehicle, MAV_CMD command); Q_INVOKABLE QVariantList getCommandsForCategory(Vehicle* vehicle, const QString& category); // Overrides from QGCTool virtual void setToolbox(QGCToolbox* toolbox); private: void _collapseHierarchy(Vehicle* vehicle, const MissionCommandList* cmdList, QMap& collapsedTree); MAV_TYPE _baseVehicleType(MAV_TYPE mavType) const; MAV_AUTOPILOT _baseFirmwareType(MAV_AUTOPILOT firmwareType) const; void _buildAvailableCommands(Vehicle* vehicle); QStringList _availableCategoriesForVehicle(Vehicle* vehicle); void _baseVehicleInfo(Vehicle* vehicle, MAV_AUTOPILOT& baseFirmwareType, MAV_TYPE& baseVehicleType) const; private: QString _allCommandsCategory; ///< Category which contains all available commands QList _allCommandIds; ///< List of all known command ids (not vehicle specific) SettingsManager* _settingsManager; bool _unitTest; ///< true: running in unit test mode /// Full hierarchy QMap> _staticCommandTree; /// Collapsed hierarchy for specific vehicle type QMap>> _availableCommands; /// Collapsed hierarchy for specific vehicle type QMap> _availableCategories; #ifdef UNITTEST_BUILD friend class MissionCommandTreeTest; #endif }; #endif