diff --git a/src/FirmwarePlugin/APM/APMFirmwarePlugin.cc b/src/FirmwarePlugin/APM/APMFirmwarePlugin.cc index 10b7021cc4a6b172b42d1a4af4dde51d465cdb5f..3246a99367dde0a736d2b9e9a005a7cc2c5cf30a 100644 --- a/src/FirmwarePlugin/APM/APMFirmwarePlugin.cc +++ b/src/FirmwarePlugin/APM/APMFirmwarePlugin.cc @@ -394,8 +394,15 @@ QList APMFirmwarePlugin::supportedMissionCommands(void) { QList list; - // FIXME: Temp list, just dup of PX4 - list << 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_CONDITION_DELAY << MAV_CMD_DO_JUMP; + list << 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_GUIDED_ENABLE + << MAV_CMD_DO_SET_ROI << MAV_CMD_DO_GUIDED_LIMITS << MAV_CMD_DO_JUMP << MAV_CMD_DO_CHANGE_SPEED << MAV_CMD_DO_SET_CAM_TRIGG_DIST + << MAV_CMD_DO_SET_RELAY << MAV_CMD_DO_REPEAT_RELAY + << MAV_CMD_DO_SET_SERVO << MAV_CMD_DO_REPEAT_SERVO + << MAV_CMD_DO_DIGICAM_CONFIGURE << MAV_CMD_DO_DIGICAM_CONTROL + << MAV_CMD_DO_MOUNT_CONTROL + << MAV_CMD_CONDITION_DELAY << MAV_CMD_CONDITION_CHANGE_ALT << MAV_CMD_CONDITION_DISTANCE << MAV_CMD_CONDITION_YAW; return list; } diff --git a/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc b/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc index ccfdc4b8ab46f1fd7b3a3b9df57715314c6eca04..014ffb2048f87d531791f432ae37ee03fd462c3e 100644 --- a/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc +++ b/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc @@ -214,8 +214,14 @@ QList PX4FirmwarePlugin::supportedMissionCommands(void) list << 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_ROI - << MAV_CMD_NAV_LAND << MAV_CMD_NAV_TAKEOFF - << MAV_CMD_DO_JUMP << MAV_CMD_DO_SET_SERVO; + << MAV_CMD_NAV_GUIDED_ENABLE + << MAV_CMD_DO_SET_ROI << MAV_CMD_DO_GUIDED_LIMITS << MAV_CMD_DO_JUMP << MAV_CMD_DO_CHANGE_SPEED << MAV_CMD_DO_SET_CAM_TRIGG_DIST + << MAV_CMD_DO_SET_RELAY << MAV_CMD_DO_REPEAT_RELAY + << MAV_CMD_DO_SET_SERVO << MAV_CMD_DO_REPEAT_SERVO + << MAV_CMD_DO_DIGICAM_CONFIGURE << MAV_CMD_DO_DIGICAM_CONTROL + << MAV_CMD_DO_MOUNT_CONTROL + << MAV_CMD_CONDITION_DELAY << MAV_CMD_CONDITION_CHANGE_ALT << MAV_CMD_CONDITION_DISTANCE << MAV_CMD_CONDITION_YAW; return list; } diff --git a/src/MissionManager/MavCmdInfo.json b/src/MissionManager/MavCmdInfo.json index 3bf8c6438db2f54a8854b4bdf6ee0c86ca3937d8..5e06ddd9127871c87c1baa78a77d60330101233c 100644 --- a/src/MissionManager/MavCmdInfo.json +++ b/src/MissionManager/MavCmdInfo.json @@ -5,9 +5,10 @@ { "comment": "MAV_CMD_NAV_LAST: Used for fake home position waypoint", "id": 95, - "rawName": "Home", + "rawName": "HomeRaw", "friendlyName": "Home", "description": "Home Position", + "description": "Home Position", "specifiesCoordinate": true, "friendlyEdit": true }, @@ -100,7 +101,7 @@ }, "param4": { "label": "Heading:", - "units": "degrees", + "units": "degreesConvert", "default": 0.0, "decimalPlaces": 2 } @@ -114,13 +115,13 @@ "friendlyEdit": true, "param1": { "label": "Pitch:", - "units": "degrees", + "units": "degreesConvert", "default": 0.26179939, "decimalPlaces": 2 }, "param4": { "label": "Heading:", - "units": "degrees", + "units": "degreesConvert", "default": 0.0, "decimalPlaces": 2 } @@ -133,7 +134,7 @@ { "id": 80, "rawName": "MAV_CMD_NAV_ROI", - "friendlyName": "Region of interest", + "friendlyName": "Region of interest (nav)", "description": "Sets the region of interest for cameras.", "specifiesCoordinate": true, "friendlyEdit": true, @@ -150,7 +151,7 @@ "decimalPlaces": 0 }, "param3": { - "label": "ROI index:", + "label": "ROI Index:", "default": 0, "decimalPlaces": 0 } @@ -158,7 +159,17 @@ { "id": 81, "rawName": "MAV_CMD_NAV_PATHPLANNING", "friendlyName": "MAV_CMD_NAV_PATHPLANNING" }, { "id": 82, "rawName": "MAV_CMD_NAV_SPLINE_WAYPOINT", "friendlyName": "MAV_CMD_NAV_SPLINE_WAYPOINT" }, { "id": 83, "rawName": "MAV_CMD_NAV_ALTITUDE_WAIT", "friendlyName": "MAV_CMD_NAV_ALTITUDE_WAIT" }, - { "id": 92, "rawName": "MAV_CMD_NAV_GUIDED_ENABLE", "friendlyName": "MAV_CMD_NAV_GUIDED_ENABLE" }, + { + "id": 92, + "rawName": "MAV_CMD_NAV_GUIDED_ENABLE", + "friendlyName": "Guided enable", + "description": "Enable/Disabled guided mode.", + "param1": { + "label": "Enable:", + "default": 1, + "decimalPlaces": 0 + } + }, { "id": 112, "rawName": "MAV_CMD_CONDITION_DELAY", @@ -172,9 +183,65 @@ "decimalPlaces": 0 } }, - { "id": 113, "rawName": "MAV_CMD_CONDITION_CHANGE_ALT", "friendlyName": "MAV_CMD_CONDITION_CHANGE_ALT" }, - { "id": 114, "rawName": "MAV_CMD_CONDITION_DISTANCE", "friendlyName": "MAV_CMD_CONDITION_DISTANCE" }, - { "id": 115, "rawName": "MAV_CMD_CONDITION_YAW", "friendlyName": "MAV_CMD_CONDITION_YAW" }, + { + "id": 113, + "rawName": "MAV_CMD_CONDITION_CHANGE_ALT", + "description": "Delay the mission until the specified altitide is reached.", + "friendlyName": "Wait for altitude", + "param1": { + "label": "Rate:", + "units": "m/s", + "default": 5, + "decimalPlaces": 2 + }, + "param7": { + "label": "Altitude:", + "units": "meters", + "default": 55, + "decimalPlaces": 2 + } + }, + { + "id": 114, + "rawName": "MAV_CMD_CONDITION_DISTANCE", + "description": "Delay the mission until within the specified distance of the next waypoint.", + "friendlyName": "Wait for distance", + "param1": { + "label": "Distance:", + "units": "meters", + "default": 0, + "decimalPlaces": 2 + } + }, + { + "id": 115, + "rawName": "MAV_CMD_CONDITION_YAW", + "friendlyName": "Wait for Heading", + "description": "Delay the mission until the specified heading is reached.", + "param1": { + "label": "Heading:", + "units": "degrees", + "default": 0, + "decimalPlaces": 1 + }, + "param2": { + "label": "Rate:", + "units": "degrees/s", + "default": 5, + "decimalPlaces": 1 + }, + "param3": { + "label": "Direction:", + "default": 1, + "decimalPlaces": 0 + }, + "param3": { + "label": "Offset:", + "enumStrings": "Relative,Absolute", + "enumValues": "1,0", + "default": 5 + } + }, { "id": 159, "rawName": "MAV_CMD_CONDITION_LAST", "friendlyName": "MAV_CMD_CONDITION_LAST" }, { "id": 176, "rawName": "MAV_CMD_DO_SET_MODE", "friendlyName": "MAV_CMD_DO_SET_MODE" }, { @@ -194,11 +261,68 @@ "decimalPlaces": 0 } }, - { "id": 178, "rawName": "MAV_CMD_DO_CHANGE_SPEED", "friendlyName": "MAV_CMD_DO_CHANGE_SPEED" }, + { + "id": 178, + "rawName": "MAV_CMD_DO_CHANGE_SPEED", + "friendlyName": "Change speed", + "description": "Change speed and/or throttle set points.", + "param1": { + "label": "Type:", + "enumStrings": "Airspeed,Ground Speed", + "enumValues": "0,1", + "default": 1 + }, + "param2": { + "label": "Speed:", + "units": "m/s", + "default": -1 + }, + "param3": { + "label": "Throttle:", + "units": "%", + "default": -1 + } + }, { "id": 179, "rawName": "MAV_CMD_DO_SET_HOME", "friendlyName": "MAV_CMD_DO_SET_HOME" }, { "id": 180, "rawName": "MAV_CMD_DO_SET_PARAMETER", "friendlyName": "MAV_CMD_DO_SET_PARAMETER" }, - { "id": 181, "rawName": "MAV_CMD_DO_SET_RELAY", "friendlyName": "MAV_CMD_DO_SET_RELAY" }, - { "id": 182, "rawName": "MAV_CMD_DO_REPEAT_RELAY", "friendlyName": "MAV_CMD_DO_REPEAT_RELAY" }, + { + "id": 181, + "rawName": "MAV_CMD_DO_SET_RELAY", + "friendlyName": "Set relay", + "description": "Set relay to a condition.", + "param1": { + "label": "Relay #:", + "default": 0, + "decimalPlaces": 0 + }, + "param2": { + "label": "Value:", + "default": 0 + } + }, + { + "id": 182, + "rawName": "MAV_CMD_DO_REPEAT_RELAY", + "friendlyName": "Cycle relay", + "description": "Cycle relay on/off for desired cycles/time.", + "param1": { + "label": "Relay #:", + "default": 0, + "decimalPlaces": 0 + }, + "param2": { + "label": "Cycles:", + "default": 1, + "units": "count", + "decimalPlaces": 0 + }, + "param3": { + "label": "Time:", + "default": 10, + "units": "seconds", + "decimalPlaces": 0 + } + }, { "id": 183, "rawName": "MAV_CMD_DO_SET_SERVO", @@ -216,27 +340,219 @@ "decimalPlaces": 0 } }, - { "id": 184, "rawName": "MAV_CMD_DO_REPEAT_SERVO", "friendlyName": "MAV_CMD_DO_REPEAT_SERVO" }, + { + "id": 184, + "rawName": "MAV_CMD_DO_REPEAT_SERVO", + "friendlyName": "Cycle servo", + "description": "Set servo to specified PWM value.", + "param1": { + "label": "Servo:", + "default": 1, + "decimalPlaces": 0 + }, + "param2": { + "label": "PWM:", + "default": 1000, + "decimalPlaces": 0 + }, + "param3": { + "label": "Cycles:", + "default": 1, + "units": "count", + "decimalPlaces": 0 + }, + "param4": { + "label": "Time:", + "default": 10, + "units": "seconds", + "decimalPlaces": 0 + } + }, { "id": 185, "rawName": "MAV_CMD_DO_FLIGHTTERMINATION", "friendlyName": "MAV_CMD_DO_FLIGHTTERMINATION" }, { "id": 189, "rawName": "MAV_CMD_DO_LAND_START", "friendlyName": "MAV_CMD_DO_LAND_START" }, { "id": 190, "rawName": "MAV_CMD_DO_RALLY_LAND", "friendlyName": "MAV_CMD_DO_RALLY_LAND" }, { "id": 191, "rawName": "MAV_CMD_DO_GO_AROUND", "friendlyName": "MAV_CMD_DO_GO_AROUND" }, { "id": 200, "rawName": "MAV_CMD_DO_CONTROL_VIDEO", "friendlyName": "MAV_CMD_DO_CONTROL_VIDEO" }, - { "id": 201, "rawName": "MAV_CMD_DO_SET_ROI", "friendlyName": "MAV_CMD_DO_SET_ROI" }, - { "id": 202, "rawName": "MAV_CMD_DO_DIGICAM_CONFIGURE", "friendlyName": "MAV_CMD_DO_DIGICAM_CONFIGURE" }, - { "id": 203, "rawName": "MAV_CMD_DO_DIGICAM_CONTROL", "friendlyName": "MAV_CMD_DO_DIGICAM_CONTROL" }, + { + "id": 201, + "rawName": "MAV_CMD_DO_SET_ROI", + "friendlyName": "Region of interest (cmd)" , + "description": "Sets the region of interest for cameras.", + "specifiesCoordinate": true, + "friendlyEdit": true, + "param1": { + "label": "Mode:", + "enumStrings": "None,Next waypoint,Mission item,Location,ROI item", + "enumValues": "0,1,2,3,4", + "default": 3, + "decimalPlaces": 0 + }, + "param2": { + "label": "Mission Index:", + "default": 0, + "decimalPlaces": 0 + }, + "param3": { + "label": "ROI Index:", + "default": 0, + "decimalPlaces": 0 + } + }, + { + "id": 202, + "rawName": "MAV_CMD_DO_DIGICAM_CONFIGURE", + "friendlyName": "Camera config", + "description": "Configure onboard camera controller.", + "param1": { + "label": "Mode:", + "default": 0, + "decimalPlaces": 0 + }, + "param2": { + "label": "Shutter spd:", + "default": 60, + "units": "1/secs", + "decimalPlaces": 0 + }, + "param3": { + "label": "Aperture:", + "default": 4, + "units": "F stop", + "decimalPlaces": 1 + }, + "param4": { + "label": "ISO:", + "default": 200, + "decimalPlaces": 0 + }, + "param5": { + "label": "Exposure:", + "default": 0, + "decimalPlaces": 0 + }, + "param6": { + "label": "Command:", + "default": 0, + "decimalPlaces": 0 + }, + "param7": { + "label": "Cut off:", + "default": 0, + "decimalPlaces": 2 + } + }, + { + "id": 203, + "friendlyName": "Camera control", + "rawName": "MAV_CMD_DO_DIGICAM_CONTROL", + "description": "Control onboard camera.", + "param1": { + "label": "Session:", + "default": 0, + "decimalPlaces": 0 + }, + "param2": { + "label": "Zoom:", + "default": 0, + "decimalPlaces": 3 + }, + "param3": { + "label": "Step:", + "default": 0, + "decimalPlaces": 3 + }, + "param4": { + "label": "Focus lock:", + "default": 0, + "decimalPlaces": 0 + }, + "param5": { + "label": "Command:", + "default": 0, + "decimalPlaces": 0 + }, + "param6": { + "label": "Id:", + "default": 0, + "decimalPlaces": 0 + } + }, { "id": 204, "rawName": "MAV_CMD_DO_MOUNT_CONFIGURE", "friendlyName": "MAV_CMD_DO_MOUNT_CONFIGURE" }, - { "id": 205, "rawName": "MAV_CMD_DO_MOUNT_CONTROL", "friendlyName": "MAV_CMD_DO_MOUNT_CONTROL" }, - { "id": 206, "rawName": "MAV_CMD_DO_SET_CAM_TRIGG_DIST", "friendlyName": "MAV_CMD_DO_SET_CAM_TRIGG_DIST" }, + { + "id": 205, + "rawName": "MAV_CMD_DO_MOUNT_CONTROL", + "friendlyName": "Mount config", + "description": "Control antenna mount or camera.", + "param1": { + "label": "Lat/Pitch:", + "default": 0, + "decimalPlaces": 7 + }, + "param2": { + "label": "Lon/Roll:", + "default": 0, + "decimalPlaces": 7 + }, + "param3": { + "label": "Alt/Yaw:", + "default": 0, + "decimalPlaces": 7 + }, + "param7": { + "label": "Mode:", + "default": 0, + "decimalPlaces": 0, + "enumStrings": "Retract,Neutral,Mavlink Targetting,RC Targetting, GPS Point", + "enumValues": "0,1,2,3,4" + } + }, + { + "id": 206, + "rawName": "MAV_CMD_DO_SET_CAM_TRIGG_DIST", + "friendlyName": "Camera trigger distance", + "description": "Set camera trigger distance.", + "param1": { + "label": "Distance:", + "default": 25, + "units": "meters", + "decimalPlaces": 2 + } + }, { "id": 207, "rawName": "MAV_CMD_DO_FENCE_ENABLE", "friendlyName": "MAV_CMD_DO_FENCE_ENABLE" }, { "id": 208, "rawName": "MAV_CMD_DO_PARACHUTE", "friendlyName": "MAV_CMD_DO_PARACHUTE" }, { "id": 209, "rawName": "MAV_CMD_DO_MOTOR_TEST", "friendlyName": "MAV_CMD_DO_MOTOR_TEST" }, { "id": 210, "rawName": "MAV_CMD_DO_INVERTED_FLIGHT", "friendlyName": "MAV_CMD_DO_INVERTED_FLIGHT" }, - { "id": 211, "rawName": "MAV_CMD_DO_GRIPPER", "friendlyName": "MAV_CMD_DO_GRIPPER" }, - { "id": 212, "rawName": "MAV_CMD_DO_AUTOTUNE_ENABLE", "friendlyName": "MAV_CMD_DO_AUTOTUNE_ENABLE" }, { "id": 220, "rawName": "MAV_CMD_DO_MOUNT_CONTROL_QUAT", "friendlyName": "MAV_CMD_DO_MOUNT_CONTROL_QUAT" }, { "id": 221, "rawName": "MAV_CMD_DO_GUIDED_MASTER", "friendlyName": "MAV_CMD_DO_GUIDED_MASTER" }, - { "id": 222, "rawName": "MAV_CMD_DO_GUIDED_LIMITS", "friendlyName": "MAV_CMD_DO_GUIDED_LIMITS" }, + { + "id": 222, + "rawName": "MAV_CMD_DO_GUIDED_LIMITS", + "friendlyName": "Exetrnal control limits", + "description": "Set limits for external control", + "param1": { + "label": "Timeout:", + "default": 0, + "units": "seconds", + "decimalPlaces": 0 + }, + "param2": { + "label": "Min Alt:", + "default": 25, + "units": "m(AMSL)", + "decimalPlaces": 2 + }, + "param3": { + "label": "Max Alt:", + "default": 100, + "decimalPlaces": 7 + }, + "param4": { + "label": "H Limit:", + "default": 25, + "units": "m(AMSL)", + "decimalPlaces": 2 + } + }, { "id": 252, "rawName": "MAV_CMD_OVERRIDE_GOTO", "friendlyName": "MAV_CMD_OVERRIDE_GOTO" }, { "id": 300, "rawName": "MAV_CMD_MISSION_START", "friendlyName": "MAV_CMD_MISSION_START" }, { "id": 400, "rawName": "MAV_CMD_COMPONENT_ARM_DISARM", "friendlyName": "MAV_CMD_COMPONENT_ARM_DISARM" }, diff --git a/src/MissionManager/MissionItem.cc b/src/MissionManager/MissionItem.cc index 7c5d3ba43aab1d6cb27498ffdb529da6521036b0..7e7a0676a420d51f5a929c6fda6a385e7574f5ae 100644 --- a/src/MissionManager/MissionItem.cc +++ b/src/MissionManager/MissionItem.cc @@ -49,6 +49,8 @@ FactMetaData* MissionItem::_supportedCommandMetaData = NULL; const QString MissionItem::_decimalPlacesJsonKey (QStringLiteral("decimalPlaces")); const QString MissionItem::_defaultJsonKey (QStringLiteral("default")); const QString MissionItem::_descriptionJsonKey (QStringLiteral("description")); +const QString MissionItem::_enumStringsJsonKey (QStringLiteral("enumStrings")); +const QString MissionItem::_enumValuesJsonKey (QStringLiteral("enumValues")); const QString MissionItem::_friendlyEditJsonKey (QStringLiteral("friendlyEdit")); const QString MissionItem::_friendlyNameJsonKey (QStringLiteral("friendlyName")); const QString MissionItem::_idJsonKey (QStringLiteral("id")); @@ -64,6 +66,7 @@ const QString MissionItem::_specifiesCoordinateJsonKey (QStringLiteral("specifi const QString MissionItem::_unitsJsonKey (QStringLiteral("units")); const QString MissionItem::_versionJsonKey (QStringLiteral("version")); +const QString MissionItem::_degreesConvertUnits (QStringLiteral("degreesConvert")); const QString MissionItem::_degreesUnits (QStringLiteral("degrees")); QMap MissionItem::_mavCmdInfoMap; @@ -116,8 +119,8 @@ MissionItem::MissionItem(QObject* parent) , _homePositionValid(false) , _altitudeRelativeToHomeFact (0, "Altitude is relative to home", FactMetaData::valueTypeUint32) , _autoContinueFact (0, "AutoContinue", FactMetaData::valueTypeUint32) - , _commandFact (0, "Command:", FactMetaData::valueTypeUint32) - , _frameFact (0, "Frame:", FactMetaData::valueTypeUint32) + , _commandFact (0, "", FactMetaData::valueTypeUint32) + , _frameFact (0, "", FactMetaData::valueTypeUint32) , _param1Fact (0, "Param1:", FactMetaData::valueTypeDouble) , _param2Fact (0, "Param2:", FactMetaData::valueTypeDouble) , _param3Fact (0, "Param3:", FactMetaData::valueTypeDouble) @@ -130,6 +133,9 @@ MissionItem::MissionItem(QObject* parent) , _param2MetaData(FactMetaData::valueTypeDouble) , _param3MetaData(FactMetaData::valueTypeDouble) , _param4MetaData(FactMetaData::valueTypeDouble) + , _param5MetaData(FactMetaData::valueTypeDouble) + , _param6MetaData(FactMetaData::valueTypeDouble) + , _param7MetaData(FactMetaData::valueTypeDouble) , _syncingAltitudeRelativeToHomeAndFrame (false) , _syncingHeadingDegreesAndParam4 (false) , _syncingSupportedCommandAndCommand (false) @@ -177,6 +183,9 @@ MissionItem::MissionItem(int sequenceNumber, , _param2MetaData(FactMetaData::valueTypeDouble) , _param3MetaData(FactMetaData::valueTypeDouble) , _param4MetaData(FactMetaData::valueTypeDouble) + , _param5MetaData(FactMetaData::valueTypeDouble) + , _param6MetaData(FactMetaData::valueTypeDouble) + , _param7MetaData(FactMetaData::valueTypeDouble) , _syncingAltitudeRelativeToHomeAndFrame (false) , _syncingHeadingDegreesAndParam4 (false) , _syncingSupportedCommandAndCommand (false) @@ -293,6 +302,9 @@ void MissionItem::_connectSignals(void) connect(&_commandFact, &Fact::valueChanged, this, &MissionItem::_sendFriendlyEditAllowedChanged); connect(&_frameFact, &Fact::valueChanged, this, &MissionItem::_sendFriendlyEditAllowedChanged); + // When the command changes we need to set defaults. This must go out before the signals below so it must be registered first. + connect(&_commandFact, &Fact::valueChanged, this, &MissionItem::setDefaultsForCommand); + // Whenever these properties change the ui model changes as well connect(this, &MissionItem::commandChanged, this, &MissionItem::_sendUiModelChanged); connect(this, &MissionItem::rawEditChanged, this, &MissionItem::_sendUiModelChanged); @@ -301,8 +313,6 @@ void MissionItem::_connectSignals(void) connect(&_commandFact, &Fact::valueChanged, this, &MissionItem::_sendCommandChanged); connect(&_frameFact, &Fact::valueChanged, this, &MissionItem::_sendFrameChanged); - // When the command changes we need to set defaults - connect(&_commandFact, &Fact::valueChanged, this, &MissionItem::setDefaultsForCommand); } bool MissionItem::_validateKeyTypes(QJsonObject& jsonObject, const QStringList& keys, const QList& types) @@ -398,7 +408,7 @@ bool MissionItem::_loadMavCmdInfoJson(void) // Read params - for (int i=1; i<5; i++) { + for (int i=1; i<=7; i++) { QString paramKey = QString(_paramJsonKeyFormat).arg(i); if (jsonObject.contains(paramKey)) { @@ -407,8 +417,8 @@ bool MissionItem::_loadMavCmdInfoJson(void) // Validate key types QStringList keys; QList types; - keys << _labelJsonKey << _unitsJsonKey << _defaultJsonKey << _decimalPlacesJsonKey; - types << QJsonValue::String << QJsonValue::String << QJsonValue::Double << QJsonValue::Double; + keys << _defaultJsonKey << _decimalPlacesJsonKey << _enumStringsJsonKey << _enumValuesJsonKey << _labelJsonKey << _unitsJsonKey; + types << QJsonValue::Double << QJsonValue::Double << QJsonValue::String << QJsonValue::String << QJsonValue::String << QJsonValue::String; if (!_validateKeyTypes(paramObject, keys, types)) { return false; } @@ -420,10 +430,41 @@ bool MissionItem::_loadMavCmdInfoJson(void) return false; } - _mavCmdInfoMap[mavCmdInfo.command].paramInfoMap[i].param = i; - _mavCmdInfoMap[mavCmdInfo.command].paramInfoMap[i].units = paramObject.value(_unitsJsonKey).toString(); + _mavCmdInfoMap[mavCmdInfo.command].friendlyEdit = true; // Assume friendly edit if we have params + _mavCmdInfoMap[mavCmdInfo.command].paramInfoMap[i].defaultValue = paramObject.value(_defaultJsonKey).toDouble(0.0); _mavCmdInfoMap[mavCmdInfo.command].paramInfoMap[i].decimalPlaces = paramObject.value(_decimalPlacesJsonKey).toInt(FactMetaData::defaultDecimalPlaces); + _mavCmdInfoMap[mavCmdInfo.command].paramInfoMap[i].enumStrings = paramObject.value(_enumStringsJsonKey).toString().split(",", QString::SkipEmptyParts); + _mavCmdInfoMap[mavCmdInfo.command].paramInfoMap[i].param = i; + _mavCmdInfoMap[mavCmdInfo.command].paramInfoMap[i].units = paramObject.value(_unitsJsonKey).toString(); + + QStringList enumValues = paramObject.value(_enumValuesJsonKey).toString().split(",", QString::SkipEmptyParts); + foreach (QString enumValue, enumValues) { + bool convertOk; + double value = enumValue.toDouble(&convertOk); + + if (!convertOk) { + qWarning() << "Bad enumValue" << enumValue; + return false; + } + + _mavCmdInfoMap[mavCmdInfo.command].paramInfoMap[i].enumValues << QVariant(value); + } + if (_mavCmdInfoMap[mavCmdInfo.command].paramInfoMap[i].enumStrings.count() != _mavCmdInfoMap[mavCmdInfo.command].paramInfoMap[i].enumStrings.count()) { + qWarning() << "enum strings/values count mismatch" << _mavCmdInfoMap[mavCmdInfo.command].paramInfoMap[i].enumStrings.count() << _mavCmdInfoMap[mavCmdInfo.command].paramInfoMap[i].enumStrings.count(); + return false; + } + } + } + + if (mavCmdInfo.friendlyEdit) { + if (mavCmdInfo.description.isEmpty()) { + qWarning() << "Missing description" << mavCmdInfo.rawName; + return false; + } + if (mavCmdInfo.rawName == mavCmdInfo.friendlyName) { + qWarning() << "Missing friendly name" << mavCmdInfo.rawName << mavCmdInfo.friendlyName; + return false; } } } @@ -692,48 +733,26 @@ QmlObjectListModel* MissionItem::textFieldFacts(void) MAV_CMD command = (MAV_CMD)this->command(); - if (_mavCmdInfoMap[command].paramInfoMap.contains(1)) { - _param1Fact._setName(_mavCmdInfoMap[command].paramInfoMap[1].label); - _param1MetaData.setUnits(_mavCmdInfoMap[command].paramInfoMap[1].units); - _param1MetaData.setDecimalPlaces(_mavCmdInfoMap[command].paramInfoMap[1].decimalPlaces); - if (_mavCmdInfoMap[command].paramInfoMap[1].units == _degreesUnits) { - _param1MetaData.setTranslators(_radiansToDegrees, _degreesToRadians); - } - _param1Fact.setMetaData(&_param1MetaData); - model->append(&_param1Fact); - } - - if (_mavCmdInfoMap[command].paramInfoMap.contains(2)) { - _param2Fact._setName(_mavCmdInfoMap[command].paramInfoMap[2].label); - _param2MetaData.setUnits(_mavCmdInfoMap[command].paramInfoMap[2].units); - _param2MetaData.setDecimalPlaces(_mavCmdInfoMap[command].paramInfoMap[2].decimalPlaces); - if (_mavCmdInfoMap[command].paramInfoMap[2].units == _degreesUnits) { - _param2MetaData.setTranslators(_radiansToDegrees, _degreesToRadians); - } - _param2Fact.setMetaData(&_param2MetaData); - model->append(&_param2Fact); - } + Fact* rgParamFacts[7] = { &_param1Fact, &_param2Fact, &_param3Fact, &_param4Fact, &_param5Fact, &_param6Fact, &_param7Fact }; + FactMetaData* rgParamMetaData[7] = { &_param1MetaData, &_param2MetaData, &_param3MetaData, &_param4MetaData, &_param5MetaData, &_param6MetaData, &_param7MetaData }; - if (_mavCmdInfoMap[command].paramInfoMap.contains(3)) { - _param3Fact._setName(_mavCmdInfoMap[command].paramInfoMap[3].label); - _param3MetaData.setUnits(_mavCmdInfoMap[command].paramInfoMap[3].units); - _param3MetaData.setDecimalPlaces(_mavCmdInfoMap[command].paramInfoMap[3].decimalPlaces); - if (_mavCmdInfoMap[command].paramInfoMap[3].units == _degreesUnits) { - _param3MetaData.setTranslators(_radiansToDegrees, _degreesToRadians); - } - _param3Fact.setMetaData(&_param3MetaData); - model->append(&_param3Fact); - } + for (int i=1; i<=7; i++) { + if (_mavCmdInfoMap[command].paramInfoMap.contains(i) && _mavCmdInfoMap[command].paramInfoMap[i].enumStrings.count() == 0) { + Fact* paramFact = rgParamFacts[i-1]; + FactMetaData* paramMetaData = rgParamMetaData[i-1]; - if (_mavCmdInfoMap[command].paramInfoMap.contains(4)) { - _param4Fact._setName(_mavCmdInfoMap[command].paramInfoMap[4].label); - _param4MetaData.setUnits(_mavCmdInfoMap[command].paramInfoMap[4].units); - _param4MetaData.setDecimalPlaces(_mavCmdInfoMap[command].paramInfoMap[4].decimalPlaces); - if (_mavCmdInfoMap[command].paramInfoMap[4].units == _degreesUnits) { - _param4MetaData.setTranslators(_radiansToDegrees, _degreesToRadians); + paramFact->_setName(_mavCmdInfoMap[command].paramInfoMap[i].label); + paramMetaData->setDecimalPlaces(_mavCmdInfoMap[command].paramInfoMap[i].decimalPlaces); + paramMetaData->setEnumInfo(_mavCmdInfoMap[command].paramInfoMap[i].enumStrings, _mavCmdInfoMap[command].paramInfoMap[i].enumValues); + if (_mavCmdInfoMap[command].paramInfoMap[i].units == _degreesConvertUnits) { + paramMetaData->setTranslators(_radiansToDegrees, _degreesToRadians); + paramMetaData->setUnits(_degreesUnits); + } else { + paramMetaData->setUnits(_mavCmdInfoMap[command].paramInfoMap[i].units); + } + paramFact->setMetaData(paramMetaData); + model->append(paramFact); } - _param4Fact.setMetaData(&_param4MetaData); - model->append(&_param4Fact); } if (specifiesCoordinate()) { @@ -767,6 +786,30 @@ QmlObjectListModel* MissionItem::comboboxFacts(void) if (rawEdit()) { model->append(&_commandFact); model->append(&_frameFact); + } else { + Fact* rgParamFacts[7] = { &_param1Fact, &_param2Fact, &_param3Fact, &_param4Fact, &_param5Fact, &_param6Fact, &_param7Fact }; + FactMetaData* rgParamMetaData[7] = { &_param1MetaData, &_param2MetaData, &_param3MetaData, &_param4MetaData, &_param5MetaData, &_param6MetaData, &_param7MetaData }; + + MAV_CMD command = (MAV_CMD)this->command(); + + for (int i=1; i<=7; i++) { + if (_mavCmdInfoMap[command].paramInfoMap.contains(i) && _mavCmdInfoMap[command].paramInfoMap[i].enumStrings.count()) { + Fact* paramFact = rgParamFacts[i-1]; + FactMetaData* paramMetaData = rgParamMetaData[i-1]; + + paramFact->_setName(_mavCmdInfoMap[command].paramInfoMap[i].label); + paramMetaData->setDecimalPlaces(_mavCmdInfoMap[command].paramInfoMap[i].decimalPlaces); + paramMetaData->setEnumInfo(_mavCmdInfoMap[command].paramInfoMap[i].enumStrings, _mavCmdInfoMap[command].paramInfoMap[i].enumValues); + if (_mavCmdInfoMap[command].paramInfoMap[i].units == _degreesConvertUnits) { + paramMetaData->setTranslators(_radiansToDegrees, _degreesToRadians); + paramMetaData->setUnits(_degreesUnits); + } else { + paramMetaData->setUnits(_mavCmdInfoMap[command].paramInfoMap[i].units); + } + paramFact->setMetaData(paramMetaData); + model->append(paramFact); + } + } } return model; @@ -808,7 +851,7 @@ bool MissionItem::rawEdit(void) const void MissionItem::setRawEdit(bool rawEdit) { - if (_rawEdit != rawEdit) { + if (this->rawEdit() != rawEdit) { _rawEdit = rawEdit; emit rawEditChanged(this->rawEdit()); } @@ -893,22 +936,9 @@ void MissionItem::_syncCommandToSupportedCommand(const QVariant& value) void MissionItem::setDefaultsForCommand(void) { foreach (ParamInfo_t paramInfo, _mavCmdInfoMap[(MAV_CMD)command()].paramInfoMap) { - double defaultValue = paramInfo.defaultValue; - - switch (paramInfo.param) { - case 1: - _param1Fact.setRawValue(defaultValue); - break; - case 2: - _param2Fact.setRawValue(defaultValue); - break; - case 3: - _param3Fact.setRawValue(defaultValue); - break; - case 4: - _param4Fact.setRawValue(defaultValue); - break; - } + Fact* rgParamFacts[7] = { &_param1Fact, &_param2Fact, &_param3Fact, &_param4Fact, &_param5Fact, &_param6Fact, &_param7Fact }; + + rgParamFacts[paramInfo.param-1]->setRawValue(paramInfo.defaultValue); } setParam7(defaultAltitude); diff --git a/src/MissionManager/MissionItem.h b/src/MissionManager/MissionItem.h index 51fcfa8824b3f8f94be527a8ab5ffd221dc05f1f..025b7ef4169875142f21b85e70df2bd0fe3c8fdb 100644 --- a/src/MissionManager/MissionItem.h +++ b/src/MissionManager/MissionItem.h @@ -215,21 +215,23 @@ private: private: typedef struct { - int param; - QString label; - QString units; - double defaultValue; - int decimalPlaces; + double defaultValue; + int decimalPlaces; + QStringList enumStrings; + QVariantList enumValues; + QString label; + int param; + QString units; } ParamInfo_t; typedef struct { MAV_CMD command; - QString rawName; - QString friendlyName; QString description; - bool specifiesCoordinate; bool friendlyEdit; + QString friendlyName; QMap paramInfoMap; + QString rawName; + bool specifiesCoordinate; } MavCmdInfo_t; bool _rawEdit; @@ -266,6 +268,9 @@ private: FactMetaData _param2MetaData; FactMetaData _param3MetaData; FactMetaData _param4MetaData; + FactMetaData _param5MetaData; + FactMetaData _param6MetaData; + FactMetaData _param7MetaData; /// This is used to reference any subsequent mission items which do not specify a coordinate. QmlObjectListModel _childItems; @@ -279,6 +284,8 @@ private: static const QString _decimalPlacesJsonKey; static const QString _defaultJsonKey; static const QString _descriptionJsonKey; + static const QString _enumStringsJsonKey; + static const QString _enumValuesJsonKey; static const QString _friendlyNameJsonKey; static const QString _friendlyEditJsonKey; static const QString _idJsonKey; @@ -295,6 +302,7 @@ private: static const QString _versionJsonKey; static const QString _degreesUnits; + static const QString _degreesConvertUnits; }; QDebug operator<<(QDebug dbg, const MissionItem& missionItem); diff --git a/src/QmlControls/MissionItemEditor.qml b/src/QmlControls/MissionItemEditor.qml index deb8283f00cc2da9c5fbe32a74813d1aaa032b4b..32399a8facb6575d3dc7704eedc3af7301a58504 100644 --- a/src/QmlControls/MissionItemEditor.qml +++ b/src/QmlControls/MissionItemEditor.qml @@ -133,11 +133,25 @@ Rectangle { Repeater { model: missionItem.comboboxFacts - FactComboBox { - width: valuesColumn.width - indexModel: false - model: object.enumStrings - fact: object + Item { + width: valuesColumn.width + height: comboBoxFact.height + + QGCLabel { + id: comboBoxLabel + anchors.baseline: comboBoxFact.baseline + text: object.name + visible: object.name != "" + } + + FactComboBox { + id: comboBoxFact + anchors.right: parent.right + width: comboBoxLabel.visible ? _editFieldWidth : parent.width + indexModel: false + model: object.enumStrings + fact: object + } } }