QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
ArduSubFirmwarePlugin.cc
Go to the documentation of this file.
2
3#include "MAVLinkLib.h"
5#include "Vehicle.h"
6
7QGC_LOGGING_CATEGORY(APMSubmarineFactGroupLog, "FirmwarePlugin.ArduSubFirmwarePlugin")
8
10 : FactGroup(300, QStringLiteral(":/json/Vehicle/SubmarineFact.json"), parent)
11{
12 // qCDebug(APMSubmarineFactGroupLog) << Q_FUNC_INFO << this;
13
14 _addFact(&_camTiltFact);
15 _addFact(&_tetherTurnsFact);
16 _addFact(&_lightsLevel1Fact);
17 _addFact(&_lightsLevel2Fact);
18 _addFact(&_pilotGainFact);
19 _addFact(&_inputHoldFact);
20 _addFact(&_rollPitchToggleFact);
21 _addFact(&_rangefinderDistanceFact);
22 _addFact(&_rangefinderTargetFact);
23
24 _camTiltFact.setRawValue(std::numeric_limits<float>::quiet_NaN());
25 _tetherTurnsFact.setRawValue(std::numeric_limits<float>::quiet_NaN());
26 _lightsLevel1Fact.setRawValue(std::numeric_limits<float>::quiet_NaN());
27 _lightsLevel2Fact.setRawValue(std::numeric_limits<float>::quiet_NaN());
28 _pilotGainFact.setRawValue(std::numeric_limits<float>::quiet_NaN());
29 _inputHoldFact.setRawValue(std::numeric_limits<float>::quiet_NaN());
30 _rollPitchToggleFact.setRawValue(2); // 2 shows "Unavailable" in older firmwares
31 _rangefinderDistanceFact.setRawValue(std::numeric_limits<float>::quiet_NaN());
32 _rangefinderTargetFact.setRawValue(std::numeric_limits<float>::quiet_NaN());
33}
34
36{
37 // qCDebug(APMSubmarineFactGroupLog) << Q_FUNC_INFO << this;
38}
39
41{
42 return vehicleImageOpaque(vehicle);
43}
44
45void ArduSubFirmwarePlugin::adjustMetaData(MAV_TYPE vehicleType, FactMetaData *metaData)
46{
47 Q_UNUSED(vehicleType);
48
49 if (!metaData) {
50 return;
51 }
52
53 if (_factRenameMap.contains(metaData->name())) {
54 metaData->setShortDescription(QString(_factRenameMap[metaData->name()]));
55 }
56}
57
62
67
69{
70 for (FirmwareFlightMode &mode: modeList) {
71 mode.fixedWing = false;
72 mode.multiRotor = true;
73 }
74
75 _updateFlightModeList(modeList);
76}
77
79{
80 switch (val) {
82 return APMSubMode::AUTO;
84 return APMSubMode::GUIDED;
85 default:
86 return UINT32_MAX;
87 }
88}
89
90/*===========================================================================*/
91
92bool ArduSubFirmwarePlugin::_remapParamNameIntialized = false;
93FirmwarePlugin::remapParamNameMajorVersionMap_t ArduSubFirmwarePlugin::_remapParamName;
94
96 : APMFirmwarePlugin(parent)
97 , _infoFactGroup(this)
98{
111 });
112
113 static FlightModeList availableFlightModes = {
114 // Mode Name , Custom Mode CanBeSet adv
115 { _manualFlightMode , APMSubMode::MANUAL , true , true },
117 { _acroFlightMode , APMSubMode::ACRO , true , true },
118 { _altHoldFlightMode , APMSubMode::ALT_HOLD , true , true },
119 { _autoFlightMode , APMSubMode::AUTO , true , true },
120 { _guidedFlightMode , APMSubMode::GUIDED , true , true },
121 { _circleFlightMode , APMSubMode::CIRCLE , true , true },
122 { _surfaceFlightMode , APMSubMode::SURFACE , true , true },
123 { _posHoldFlightMode , APMSubMode::POSHOLD , true , true },
125 { _surftrakFlightMode , APMSubMode::SURFTRAK , true , true },
126 };
127 updateAvailableFlightModes(availableFlightModes);
128
129 if (!_remapParamNameIntialized) {
130 // ArduPilot 4.7: parameter renames and SI unit conversion
131 FirmwarePlugin::remapParamNameMap_t &remapV4_7 = _remapParamName[4][7];
132
133 // Position controller: PSC_VELXY_* -> PSC_NE_VEL_*
134 remapV4_7["PSC_NE_VEL_P"] = QStringLiteral("PSC_VELXY_P");
135 remapV4_7["PSC_NE_VEL_I"] = QStringLiteral("PSC_VELXY_I");
136 remapV4_7["PSC_NE_VEL_D"] = QStringLiteral("PSC_VELXY_D");
137 remapV4_7["PSC_NE_VEL_IMAX"] = QStringLiteral("PSC_VELXY_IMAX");
138 remapV4_7["PSC_NE_VEL_FLTE"] = QStringLiteral("PSC_VELXY_FLTE");
139 remapV4_7["PSC_NE_VEL_FLTD"] = QStringLiteral("PSC_VELXY_FLTD");
140 remapV4_7["PSC_NE_VEL_FF"] = QStringLiteral("PSC_VELXY_FF");
141
142 // Position controller: PSC_VELZ_* -> PSC_D_VEL_*
143 remapV4_7["PSC_D_VEL_P"] = QStringLiteral("PSC_VELZ_P");
144 remapV4_7["PSC_D_VEL_I"] = QStringLiteral("PSC_VELZ_I");
145 remapV4_7["PSC_D_VEL_D"] = QStringLiteral("PSC_VELZ_D");
146 remapV4_7["PSC_D_VEL_IMAX"] = QStringLiteral("PSC_VELZ_IMAX");
147 remapV4_7["PSC_D_VEL_FLTE"] = QStringLiteral("PSC_VELZ_FLTE");
148 remapV4_7["PSC_D_VEL_FF"] = QStringLiteral("PSC_VELZ_FF");
149
150 // Position controller: PSC_ACCZ_* -> PSC_D_ACC_*
151 remapV4_7["PSC_D_ACC_P"] = QStringLiteral("PSC_ACCZ_P");
152 remapV4_7["PSC_D_ACC_I"] = QStringLiteral("PSC_ACCZ_I");
153 remapV4_7["PSC_D_ACC_D"] = QStringLiteral("PSC_ACCZ_D");
154 remapV4_7["PSC_D_ACC_IMAX"] = QStringLiteral("PSC_ACCZ_IMAX");
155 remapV4_7["PSC_D_ACC_FLTD"] = QStringLiteral("PSC_ACCZ_FLTD");
156 remapV4_7["PSC_D_ACC_FLTE"] = QStringLiteral("PSC_ACCZ_FLTE");
157 remapV4_7["PSC_D_ACC_FLTT"] = QStringLiteral("PSC_ACCZ_FLTT");
158 remapV4_7["PSC_D_ACC_FF"] = QStringLiteral("PSC_ACCZ_FF");
159 remapV4_7["PSC_D_ACC_SMAX"] = QStringLiteral("PSC_ACCZ_SMAX");
160
161 // Position controller: PSC_POSXY_P -> PSC_NE_POS_P
162 remapV4_7["PSC_NE_POS_P"] = QStringLiteral("PSC_POSXY_P");
163
164 // Position controller: PSC_POSZ_P -> PSC_D_POS_P
165 remapV4_7["PSC_D_POS_P"] = QStringLiteral("PSC_POSZ_P");
166
167 // Waypoint navigation: WPNAV_* -> WP_*
168 remapV4_7["WP_ACC"] = QStringLiteral("WPNAV_ACCEL");
169 remapV4_7["WP_ACC_CNR"] = QStringLiteral("WPNAV_ACCEL_C");
170 remapV4_7["WP_ACC_Z"] = QStringLiteral("WPNAV_ACCEL_Z");
171 remapV4_7["WP_RADIUS_M"] = QStringLiteral("WPNAV_RADIUS");
172 remapV4_7["WP_SPD"] = QStringLiteral("WPNAV_SPEED");
173 remapV4_7["WP_SPD_DN"] = QStringLiteral("WPNAV_SPEED_DN");
174 remapV4_7["WP_SPD_UP"] = QStringLiteral("WPNAV_SPEED_UP");
175
176 // Attitude controller
177 remapV4_7["ATC_ACC_R_MAX"] = QStringLiteral("ATC_ACCEL_R_MAX");
178 remapV4_7["ATC_ACC_P_MAX"] = QStringLiteral("ATC_ACCEL_P_MAX");
179 remapV4_7["ATC_ACC_Y_MAX"] = QStringLiteral("ATC_ACCEL_Y_MAX");
180 remapV4_7["ATC_RATE_WPY_MAX"]= QStringLiteral("ATC_SLEW_YAW");
181
182 // Circle
183 remapV4_7["CIRCLE_RADIUS_M"] = QStringLiteral("CIRCLE_RADIUS");
184
185 // EKF
186 remapV4_7["EK3_FLOW_MAX"] = QStringLiteral("EK3_MAX_FLOW");
187
188 // Common
189 remapV4_7["ARMING_SKIPCHK"] = QStringLiteral("ARMING_CHECK");
190
191 _remapParamNameIntialized = true;
192 }
193
194 _nameToFactGroupMap.insert("apmSubInfo", &_infoFactGroup);
195
196 _factRenameMap[QStringLiteral("altitudeRelative")] = QStringLiteral("Depth");
197 _factRenameMap[QStringLiteral("flightTime")] = QStringLiteral("Dive Time");
198 _factRenameMap[QStringLiteral("altitudeAMSL")] = QStringLiteral("");
199 _factRenameMap[QStringLiteral("hobbs")] = QStringLiteral("");
200 _factRenameMap[QStringLiteral("airSpeed")] = QStringLiteral("");
201}
202
207
209{
210 return ((majorVersionNumber == 4) ? 7 : Vehicle::versionNotSetValue);
211}
212
214{
215 vehicle->requestDataStream(MAV_DATA_STREAM_RAW_SENSORS, 2);
216 vehicle->requestDataStream(MAV_DATA_STREAM_EXTENDED_STATUS, 2);
217 vehicle->requestDataStream(MAV_DATA_STREAM_RC_CHANNELS, 2);
218 vehicle->requestDataStream(MAV_DATA_STREAM_POSITION, 3);
219 vehicle->requestDataStream(MAV_DATA_STREAM_EXTRA1, 20);
220 vehicle->requestDataStream(MAV_DATA_STREAM_EXTRA2, 10);
221 vehicle->requestDataStream(MAV_DATA_STREAM_EXTRA3, 3);
222}
223
224bool ArduSubFirmwarePlugin::isCapable(const Vehicle *vehicle, FirmwareCapabilities capabilities) const
225{
226 Q_UNUSED(vehicle);
228 return ((capabilities & available) == capabilities);
229}
230
231void ArduSubFirmwarePlugin::_handleNamedValueFloat(mavlink_message_t *message)
232{
233 mavlink_named_value_float_t value{};
234 mavlink_msg_named_value_float_decode(message, &value);
235
236 const QString name = QString(value.name);
237
238 if (name == "CamTilt") {
239 _infoFactGroup.getFact("cameraTilt")->setRawValue(value.value * 100);
240 } else if (name == "TetherTrn") {
241 _infoFactGroup.getFact("tetherTurns")->setRawValue(value.value);
242 } else if (name == "Lights1") {
243 _infoFactGroup.getFact("lights1")->setRawValue(value.value * 100);
244 } else if (name == "Lights2") {
245 _infoFactGroup.getFact("lights2")->setRawValue(value.value * 100);
246 } else if (name == "PilotGain") {
247 _infoFactGroup.getFact("pilotGain")->setRawValue(value.value * 100);
248 } else if (name == "InputHold") {
249 _infoFactGroup.getFact("inputHold")->setRawValue(value.value);
250 } else if (name == "RollPitch") {
251 _infoFactGroup.getFact("rollPitchToggle")->setRawValue(value.value);
252 } else if (name == "RFTarget") {
253 _infoFactGroup.getFact("rangefinderTarget")->setRawValue(value.value);
254 }
255}
256
257void ArduSubFirmwarePlugin::_handleMavlinkMessage(mavlink_message_t *message)
258{
259 switch (message->msgid) {
260 case (MAVLINK_MSG_ID_NAMED_VALUE_FLOAT):
261 _handleNamedValueFloat(message);
262 break;
263 case (MAVLINK_MSG_ID_RANGEFINDER):
264 {
265 mavlink_rangefinder_t msg{};
266 mavlink_msg_rangefinder_decode(message, &msg);
267 _infoFactGroup.getFact("rangefinderDistance")->setRawValue(msg.distance);
268 break;
269 }
270 default:
271 break;
272 }
273}
274
276{
277 _handleMavlinkMessage(message);
279}
280
281QMap<QString, FactGroup*>* ArduSubFirmwarePlugin::factGroups()
282{
283 return &_nameToFactGroupMap;
284}
QList< FirmwareFlightMode > FlightModeList
struct __mavlink_message mavlink_message_t
#define QGC_LOGGING_CATEGORY(name, categoryStr)
This is the base class for all stack specific APM firmware plugins.
bool adjustIncomingMavlinkMessage(Vehicle *vehicle, mavlink_message_t *message) override
void initializeStreamRates(Vehicle *vehicle) override
QMap< QString, FactGroup * > * factGroups() override
Returns a pointer to a dictionary of firmware-specific FactGroups.
uint32_t _convertToCustomFlightModeEnum(uint32_t val) const override
void adjustMetaData(MAV_TYPE vehicleType, FactMetaData *metaData) override
QString stabilizedFlightMode() const override
Returns the flight mode for Stabilized.
int remapParamNameHigestMinorVersionNumber(int majorVersionNumber) const override
ArduSubFirmwarePlugin(QObject *parent=nullptr)
QString vehicleImageOpaque(const Vehicle *) const override
Return the resource file which contains the vehicle icon used in the flight view when the view is dar...
const QString _motorDetectionFlightMode
QString vehicleImageOutline(const Vehicle *vehicle) const override
Return the resource file which contains the vehicle icon used in the flight view when the view is lig...
bool adjustIncomingMavlinkMessage(Vehicle *vehicle, mavlink_message_t *message) override
bool isCapable(const Vehicle *vehicle, FirmwareCapabilities capabilities) const override
QString motorDetectionFlightMode() const override
Returns the flight mode for Motor Detection.
void updateAvailableFlightModes(FlightModeList &modeList) override
Update Available flight modes received from vehicle.
Used to group Facts together into an object hierarachy.
Definition FactGroup.h:16
Q_INVOKABLE Fact * getFact(const QString &name) const
Definition FactGroup.cc:72
Holds the meta data associated with a Fact.
void setShortDescription(const QString &shortDescription)
QString name() const
void setRawValue(const QVariant &value)
Definition Fact.cc:135
void _setModeEnumToModeStringMapping(FlightModeCustomModeMap enumToString)
FirmwareCapabilities
Set of optional capabilites which firmware may support.
@ GuidedModeCapability
Vehicle supports guided mode commands.
@ SetFlightModeCapability
FirmwarePlugin::setFlightMode method is supported.
@ PauseVehicleCapability
Vehicle supports pausing at current location.
void _updateFlightModeList(FlightModeList &flightModeList)
QMap< QString, QString > remapParamNameMap_t
FlightModeCustomModeMap _modeEnumToString
QMap< int, remapParamNameMinorVersionRemapMap_t > remapParamNameMajorVersionMap_t
void requestDataStream(MAV_DATA_STREAM stream, uint16_t rate, bool sendMultiple=true)
Definition Vehicle.cc:1546
static const int versionNotSetValue