diff --git a/src/FirmwarePlugin/APM/APMFirmwarePlugin.cc b/src/FirmwarePlugin/APM/APMFirmwarePlugin.cc index 7e586a4f24bf7ea30a6d1760b9b65f79cd8ff763..7dc4476f72b9db2e4183888c6dd171837578ebef 100644 --- a/src/FirmwarePlugin/APM/APMFirmwarePlugin.cc +++ b/src/FirmwarePlugin/APM/APMFirmwarePlugin.cc @@ -715,12 +715,19 @@ FactMetaData* APMFirmwarePlugin::_getMetaDataForFact(QObject* parameterMetaData, return nullptr; } -QList APMFirmwarePlugin::supportedMissionCommands(void) +QList APMFirmwarePlugin::supportedMissionCommands(QGCMAVLink::VehicleClass_t vehicleClass) { return { +#if 0 + // Waiting for module update + MAV_CMD_DO_SET_REVERSE, +#endif + }; + + QList supportedCommands = { MAV_CMD_NAV_WAYPOINT, MAV_CMD_NAV_LOITER_UNLIM, MAV_CMD_NAV_LOITER_TURNS, MAV_CMD_NAV_LOITER_TIME, - MAV_CMD_NAV_RETURN_TO_LAUNCH, MAV_CMD_NAV_LAND, MAV_CMD_NAV_TAKEOFF, + MAV_CMD_NAV_RETURN_TO_LAUNCH, MAV_CMD_NAV_CONTINUE_AND_CHANGE_ALT, MAV_CMD_NAV_LOITER_TO_ALT, MAV_CMD_NAV_SPLINE_WAYPOINT, @@ -744,12 +751,32 @@ QList APMFirmwarePlugin::supportedMissionCommands(void) MAV_CMD_DO_GRIPPER, MAV_CMD_DO_GUIDED_LIMITS, MAV_CMD_DO_AUTOTUNE_ENABLE, + }; + + QList vtolCommands = { MAV_CMD_NAV_VTOL_TAKEOFF, MAV_CMD_NAV_VTOL_LAND, MAV_CMD_DO_VTOL_TRANSITION, -#if 0 - // Waiting for module update - MAV_CMD_DO_SET_REVERSE, -#endif }; + + QList flightCommands = { + MAV_CMD_NAV_LAND, MAV_CMD_NAV_TAKEOFF, + }; + + if (vehicleClass == QGCMAVLink::VehicleClassGeneric) { + supportedCommands += vtolCommands; + supportedCommands += flightCommands; + } + if (vehicleClass == QGCMAVLink::VehicleClassVTOL) { + supportedCommands += vtolCommands; + supportedCommands += flightCommands; + } else if (vehicleClass == QGCMAVLink::VehicleClassFixedWing || vehicleClass == QGCMAVLink::VehicleClassMultiRotor) { + supportedCommands += flightCommands; + } + + if (qgcApp()->toolbox()->settingsManager()->planViewSettings()->useConditionGate()->rawValue().toBool()) { + supportedCommands.append(MAV_CMD_CONDITION_GATE); + } + + return supportedCommands; } QString APMFirmwarePlugin::missionCommandOverrides(QGCMAVLink::VehicleClass_t vehicleClass) const diff --git a/src/FirmwarePlugin/APM/APMFirmwarePlugin.h b/src/FirmwarePlugin/APM/APMFirmwarePlugin.h index 5c8a609c594782a6aa311bb094c39d86387eedff..81226a754a5c788189c84d239adb5e4b659f3b1d 100644 --- a/src/FirmwarePlugin/APM/APMFirmwarePlugin.h +++ b/src/FirmwarePlugin/APM/APMFirmwarePlugin.h @@ -72,7 +72,7 @@ public: // Overrides from FirmwarePlugin QList componentsForVehicle(AutoPilotPlugin* vehicle) override; - QList supportedMissionCommands(void) override; + QList supportedMissionCommands(QGCMAVLink::VehicleClass_t vehicleClass) override; AutoPilotPlugin* autopilotPlugin (Vehicle* vehicle) override; bool isCapable (const Vehicle *vehicle, FirmwareCapabilities capabilities) override; diff --git a/src/FirmwarePlugin/APM/ArduSubFirmwarePlugin.cc b/src/FirmwarePlugin/APM/ArduSubFirmwarePlugin.cc index 574f1975171e21cb1ee718ab90fd5f4a9fccf845..7c1be4a5d43133e40cb59e9c7661d38eb79fd5be 100644 --- a/src/FirmwarePlugin/APM/ArduSubFirmwarePlugin.cc +++ b/src/FirmwarePlugin/APM/ArduSubFirmwarePlugin.cc @@ -144,36 +144,6 @@ ArduSubFirmwarePlugin::ArduSubFirmwarePlugin(void): _factRenameMap[QStringLiteral("airSpeed")] = QStringLiteral(""); } -QList ArduSubFirmwarePlugin::supportedMissionCommands(void) -{ - return { - MAV_CMD_NAV_WAYPOINT, - MAV_CMD_NAV_RETURN_TO_LAUNCH, - MAV_CMD_NAV_LAND, - MAV_CMD_NAV_CONTINUE_AND_CHANGE_ALT, - MAV_CMD_NAV_SPLINE_WAYPOINT, - MAV_CMD_NAV_GUIDED_ENABLE, - MAV_CMD_NAV_DELAY, - MAV_CMD_CONDITION_DELAY, MAV_CMD_CONDITION_DISTANCE, MAV_CMD_CONDITION_YAW, - MAV_CMD_DO_SET_MODE, - MAV_CMD_DO_JUMP, - MAV_CMD_DO_CHANGE_SPEED, - MAV_CMD_DO_SET_HOME, - MAV_CMD_DO_SET_RELAY, MAV_CMD_DO_REPEAT_RELAY, - MAV_CMD_DO_SET_SERVO, MAV_CMD_DO_REPEAT_SERVO, - MAV_CMD_DO_LAND_START, - MAV_CMD_DO_SET_ROI, - MAV_CMD_DO_DIGICAM_CONFIGURE, MAV_CMD_DO_DIGICAM_CONTROL, - MAV_CMD_DO_MOUNT_CONTROL, - MAV_CMD_DO_SET_CAM_TRIGG_DIST, - MAV_CMD_DO_FENCE_ENABLE, - MAV_CMD_DO_INVERTED_FLIGHT, - MAV_CMD_DO_GRIPPER, - MAV_CMD_DO_GUIDED_LIMITS, - MAV_CMD_DO_AUTOTUNE_ENABLE, - }; -} - int ArduSubFirmwarePlugin::remapParamNameHigestMinorVersionNumber(int majorVersionNumber) const { // Remapping supports up to 3.6 diff --git a/src/FirmwarePlugin/APM/ArduSubFirmwarePlugin.h b/src/FirmwarePlugin/APM/ArduSubFirmwarePlugin.h index a957a5305881005e17aadc167bc0cca7a423cd28..3f7d7445c951191c323122ba71090bb14358553a 100644 --- a/src/FirmwarePlugin/APM/ArduSubFirmwarePlugin.h +++ b/src/FirmwarePlugin/APM/ArduSubFirmwarePlugin.h @@ -110,8 +110,6 @@ class ArduSubFirmwarePlugin : public APMFirmwarePlugin public: ArduSubFirmwarePlugin(void); - QList supportedMissionCommands(void) final; - int defaultJoystickTXMode(void) final { return 3; } void initializeStreamRates(Vehicle* vehicle) override final; diff --git a/src/FirmwarePlugin/FirmwarePlugin.cc b/src/FirmwarePlugin/FirmwarePlugin.cc index 1b992dfe6cf0006ba1f690a9f42df2ab27ad05d4..71c44e7034c95307cc9fe7141a374f9334047125 100644 --- a/src/FirmwarePlugin/FirmwarePlugin.cc +++ b/src/FirmwarePlugin/FirmwarePlugin.cc @@ -174,7 +174,7 @@ bool FirmwarePlugin::sendHomePositionToVehicle(void) return false; } -QList FirmwarePlugin::supportedMissionCommands(void) +QList FirmwarePlugin::supportedMissionCommands(QGCMAVLink::VehicleClass_t vehicleClass) { // Generic supports all commands return QList(); diff --git a/src/FirmwarePlugin/FirmwarePlugin.h b/src/FirmwarePlugin/FirmwarePlugin.h index 8f2f626f1c9d290f7e869e1bb8a233ccdd74583a..a5e343196e499e1241c13bd7ab03c7183c4ea22e 100644 --- a/src/FirmwarePlugin/FirmwarePlugin.h +++ b/src/FirmwarePlugin/FirmwarePlugin.h @@ -238,7 +238,7 @@ public: virtual bool _isParameterVolatile(QObject* /*parameterMetaData*/, const QString& /*name*/, MAV_TYPE /*vehicleType*/) { return false; } /// List of supported mission commands. Empty list for all commands supported. - virtual QList supportedMissionCommands(void); + virtual QList supportedMissionCommands(QGCMAVLink::VehicleClass_t vehicleClass); /// Returns the name of the mission command json override file for the specified vehicle type. /// @param vehicleClass Vehicle class to return file for, VehicleClassGeneric is a request for overrides for all vehicle types diff --git a/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc b/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc index 76236fa5ff765f8147ed339a06dee7e42c6271db..e939aaafeb5713418db8bd893b48130d3d424878 100644 --- a/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc +++ b/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc @@ -268,14 +268,13 @@ void PX4FirmwarePlugin::_getParameterMetaDataVersionInfo(const QString& metaData return PX4ParameterMetaData::getParameterMetaDataVersionInfo(metaDataFile, majorVersion, minorVersion); } -QList PX4FirmwarePlugin::supportedMissionCommands(void) +QList PX4FirmwarePlugin::supportedMissionCommands(QGCMAVLink::VehicleClass_t vehicleClass) { - QList cmds = { + QList supportedCommands = { MAV_CMD_NAV_WAYPOINT, - MAV_CMD_NAV_LOITER_UNLIM, MAV_CMD_NAV_LOITER_TIME, MAV_CMD_NAV_LOITER_TO_ALT, - MAV_CMD_NAV_LAND, MAV_CMD_NAV_TAKEOFF, MAV_CMD_NAV_RETURN_TO_LAUNCH, + MAV_CMD_NAV_LOITER_UNLIM, MAV_CMD_NAV_LOITER_TIME, + MAV_CMD_NAV_RETURN_TO_LAUNCH, MAV_CMD_DO_JUMP, - MAV_CMD_DO_VTOL_TRANSITION, MAV_CMD_NAV_VTOL_TAKEOFF, MAV_CMD_NAV_VTOL_LAND, MAV_CMD_DO_DIGICAM_CONTROL, MAV_CMD_DO_SET_CAM_TRIGG_DIST, MAV_CMD_DO_SET_SERVO, @@ -288,13 +287,33 @@ QList PX4FirmwarePlugin::supportedMissionCommands(void) MAV_CMD_IMAGE_START_CAPTURE, MAV_CMD_IMAGE_STOP_CAPTURE, MAV_CMD_VIDEO_START_CAPTURE, MAV_CMD_VIDEO_STOP_CAPTURE, MAV_CMD_NAV_DELAY, MAV_CMD_CONDITION_YAW, + MAV_CMD_NAV_LOITER_TO_ALT, }; + QList vtolCommands = { + MAV_CMD_DO_VTOL_TRANSITION, MAV_CMD_NAV_VTOL_TAKEOFF, MAV_CMD_NAV_VTOL_LAND, + }; + + QList flightCommands = { + MAV_CMD_NAV_LAND, MAV_CMD_NAV_TAKEOFF, + }; + + if (vehicleClass == QGCMAVLink::VehicleClassGeneric) { + supportedCommands += vtolCommands; + supportedCommands += flightCommands; + } + if (vehicleClass == QGCMAVLink::VehicleClassVTOL) { + supportedCommands += vtolCommands; + supportedCommands += flightCommands; + } else if (vehicleClass == QGCMAVLink::VehicleClassFixedWing || vehicleClass == QGCMAVLink::VehicleClassMultiRotor) { + supportedCommands += flightCommands; + } + if (qgcApp()->toolbox()->settingsManager()->planViewSettings()->useConditionGate()->rawValue().toBool()) { - cmds.append(MAV_CMD_CONDITION_GATE); + supportedCommands.append(MAV_CMD_CONDITION_GATE); } - return cmds; + return supportedCommands; } QString PX4FirmwarePlugin::missionCommandOverrides(QGCMAVLink::VehicleClass_t vehicleClass) const diff --git a/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.h b/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.h index 0fce47d2ffc1101fa479e68f13ea6f695bdd37ff..5eb347ac5db344acc325757a9452005f40a55e78 100644 --- a/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.h +++ b/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.h @@ -29,7 +29,7 @@ public: // Overrides from FirmwarePlugin QList componentsForVehicle(AutoPilotPlugin* vehicle) override; - QList supportedMissionCommands(void) override; + QList supportedMissionCommands(QGCMAVLink::VehicleClass_t vehicleClass) override; AutoPilotPlugin* autopilotPlugin (Vehicle* vehicle) override; bool isCapable (const Vehicle *vehicle, FirmwareCapabilities capabilities) override; diff --git a/src/MissionManager/CameraSection.cc b/src/MissionManager/CameraSection.cc index a8046eefefa8dd3827d1c69d197bb3fd911e1bf2..5fc24e1ccce6162c01e6a481c31b42974b381887 100644 --- a/src/MissionManager/CameraSection.cc +++ b/src/MissionManager/CameraSection.cc @@ -580,7 +580,7 @@ void CameraSection::_cameraActionChanged(void) bool CameraSection::cameraModeSupported(void) const { - return _specifyCameraMode || _masterController->controllerVehicle()->firmwarePlugin()->supportedMissionCommands().contains(MAV_CMD_SET_CAMERA_MODE); + return _specifyCameraMode || _masterController->controllerVehicle()->firmwarePlugin()->supportedMissionCommands(QGCMAVLink::VehicleClassGeneric).contains(MAV_CMD_SET_CAMERA_MODE); } void CameraSection::_dirtyIfSpecified(void) diff --git a/src/MissionManager/MissionCommandTree.cc b/src/MissionManager/MissionCommandTree.cc index ce1c06f4802acd79a12cec2cd736c3be7da32bdb..00f797f709d461a10f65de26e9a0f7787ed11170 100644 --- a/src/MissionManager/MissionCommandTree.cc +++ b/src/MissionManager/MissionCommandTree.cc @@ -114,7 +114,7 @@ void MissionCommandTree::_buildAllCommands(Vehicle* vehicle, QGCMAVLink::Vehicle } // Build category list from supported commands - QList supportedCommands = vehicle->firmwarePlugin()->supportedMissionCommands(); + QList supportedCommands = vehicle->firmwarePlugin()->supportedMissionCommands(vehicleClass); for (MAV_CMD cmd: collapsedTree.keys()) { if (supportedCommands.contains(cmd)) { QString newCategory = collapsedTree[cmd]->category(); @@ -193,15 +193,14 @@ QVariantList MissionCommandTree::getCommandsForCategory(Vehicle* vehicle, const // vehicle can be null in which case _firmwareAndVehicleClassInfo will tell of the firmware/vehicle type for the offline editing vehicle. // We then use that to get a firmware plugin so we can get the list of supported commands. FirmwarePlugin* firmwarePlugin = qgcApp()->toolbox()->firmwarePluginManager()->firmwarePluginForAutopilot(QGCMAVLink::firmwareClassToAutopilot(firmwareClass), QGCMAVLink::vehicleClassToMavType(vehicleClass)); - QList supportedCommands = firmwarePlugin->supportedMissionCommands(); + QList supportedCommands = firmwarePlugin->supportedMissionCommands(vehicleClass); QVariantList list; QMap commandMap = _allCommands[firmwareClass][vehicleClass]; for (MAV_CMD command: commandMap.keys()) { - if (supportedCommands.contains(command)) { + if (supportedCommands.isEmpty() || supportedCommands.contains(command)) { MissionCommandUIInfo* uiInfo = commandMap[command]; - if ((uiInfo->category() == category || category == _allCommandsCategory) && - (showFlyThroughCommands || !uiInfo->specifiesCoordinate() || uiInfo->isStandaloneCoordinate())) { + if ((uiInfo->category() == category || category == _allCommandsCategory) && (showFlyThroughCommands || !uiInfo->specifiesCoordinate() || uiInfo->isStandaloneCoordinate())) { list.append(QVariant::fromValue(uiInfo)); } } diff --git a/src/MissionManager/MissionCommandTreeEditorTest.cc b/src/MissionManager/MissionCommandTreeEditorTest.cc index 08e8522b0069c7f7bbf210dbe3237b6788ff0881..c9c0f09a31d7b5ff4345ccf91e8483d3b7794b1f 100644 --- a/src/MissionManager/MissionCommandTreeEditorTest.cc +++ b/src/MissionManager/MissionCommandTreeEditorTest.cc @@ -29,13 +29,13 @@ void MissionCommandTreeEditorTest::_testEditorsWorker(QGCMAVLink::FirmwareClass_ PlanMasterController* masterController = new PlanMasterController(); FirmwarePlugin* firmwarePlugin = qgcApp()->toolbox()->firmwarePluginManager()->firmwarePluginForAutopilot(QGCMAVLink::firmwareClassToAutopilot(firmwareClass), QGCMAVLink::vehicleClassToMavType(vehicleClass)); - if (firmwarePlugin->supportedMissionCommands().count() == 0) { + if (firmwarePlugin->supportedMissionCommands(vehicleClass).count() == 0) { firmwarePlugin = qgcApp()->toolbox()->firmwarePluginManager()->firmwarePluginForAutopilot(QGCMAVLink::firmwareClassToAutopilot(QGCMAVLink::FirmwareClassPX4), QGCMAVLink::vehicleClassToMavType(vehicleClass)); } - int cColumns = firmwarePlugin->supportedMissionCommands().count(); + int cColumns = firmwarePlugin->supportedMissionCommands(vehicleClass).count(); QVariantList varSimpleItems; - for (MAV_CMD command: firmwarePlugin->supportedMissionCommands()) { + for (MAV_CMD command: firmwarePlugin->supportedMissionCommands(vehicleClass)) { SimpleMissionItem* simpleItem = new SimpleMissionItem(masterController, false /* flyView */, false /* forLoad */, this); simpleItem->setCommand(command); varSimpleItems.append(QVariant::fromValue(simpleItem)); diff --git a/src/MissionManager/MissionController.cc b/src/MissionManager/MissionController.cc index 0a675b839bdd3c69c3e47c0eea58ebc4cff918a7..c2627676966f9ed275d90ed2f2505d9f7f78b928 100644 --- a/src/MissionManager/MissionController.cc +++ b/src/MissionManager/MissionController.cc @@ -406,7 +406,7 @@ VisualMissionItem* MissionController::insertROIMissionItem(QGeoCoordinate coordi { SimpleMissionItem* simpleItem = qobject_cast(_insertSimpleMissionItemWorker(coordinate, MAV_CMD_DO_SET_ROI_LOCATION, visualItemIndex, makeCurrentItem)); - if (!_controllerVehicle->firmwarePlugin()->supportedMissionCommands().contains(MAV_CMD_DO_SET_ROI_LOCATION)) { + if (!_controllerVehicle->firmwarePlugin()->supportedMissionCommands(QGCMAVLink::VehicleClassGeneric).contains(MAV_CMD_DO_SET_ROI_LOCATION)) { simpleItem->setCommand(MAV_CMD_DO_SET_ROI) ; simpleItem->missionItem().setParam1(MAV_ROI_LOCATION); } @@ -418,7 +418,7 @@ VisualMissionItem* MissionController::insertCancelROIMissionItem(int visualItemI { SimpleMissionItem* simpleItem = qobject_cast(_insertSimpleMissionItemWorker(QGeoCoordinate(), MAV_CMD_DO_SET_ROI_NONE, visualItemIndex, makeCurrentItem)); - if (!_controllerVehicle->firmwarePlugin()->supportedMissionCommands().contains(MAV_CMD_DO_SET_ROI_NONE)) { + if (!_controllerVehicle->firmwarePlugin()->supportedMissionCommands(QGCMAVLink::VehicleClassGeneric).contains(MAV_CMD_DO_SET_ROI_NONE)) { simpleItem->setCommand(MAV_CMD_DO_SET_ROI) ; simpleItem->missionItem().setParam1(MAV_ROI_NONE); } diff --git a/src/MissionManager/TransectStyleComplexItem.cc b/src/MissionManager/TransectStyleComplexItem.cc index 2090c9e5adc1ee1304279f47a49e507a3ca6a287..454ea09b9b3fdeff7117e1461ceb4cb002159bb4 100644 --- a/src/MissionManager/TransectStyleComplexItem.cc +++ b/src/MissionManager/TransectStyleComplexItem.cc @@ -1018,7 +1018,7 @@ void TransectStyleComplexItem::_buildAndAppendMissionItems(QList& bool imagesInTurnaround = _cameraTriggerInTurnAroundFact.rawValue().toBool(); bool hasTurnarounds = _turnAroundDistance() != 0; bool addTriggerAtBeginningEnd = !hoverAndCaptureEnabled() && imagesInTurnaround && triggerCamera(); - bool useConditionGate = _controllerVehicle->firmwarePlugin()->supportedMissionCommands().contains(MAV_CMD_CONDITION_GATE) && + bool useConditionGate = _controllerVehicle->firmwarePlugin()->supportedMissionCommands(QGCMAVLink::VehicleClassGeneric).contains(MAV_CMD_CONDITION_GATE) && triggerCamera() && !hoverAndCaptureEnabled(); diff --git a/src/PlanView/PlanView.qml b/src/PlanView/PlanView.qml index 407efb451e32bd5d89364e8345bdd03ec0f21831..bdc3fbd77cf497b0a1c4c9114e7358d2936797cc 100644 --- a/src/PlanView/PlanView.qml +++ b/src/PlanView/PlanView.qml @@ -652,7 +652,7 @@ Item { text: qsTr("Takeoff") iconSource: "/res/takeoff.svg" enabled: _missionController.isInsertTakeoffValid - visible: toolStrip._isMissionLayer + visible: toolStrip._isMissionLayer && !_planMasterController.controllerVehicle.rover onTriggered: { toolStrip.allAddClickBoolsOff() insertTakeItemAfterCurrent()