QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
QGCMAVLink.cc
Go to the documentation of this file.
1#include "QGCMAVLink.h"
3
4QGC_LOGGING_CATEGORY(QGCMAVLinkLog, "MAVLink.QGCMAVLink")
5
6const QHash<int, QString> QGCMAVLink::mavlinkCompIdHash {
7 { MAV_COMP_ID_AUTOPILOT1, "Autopilot" },
8 { MAV_COMP_ID_ONBOARD_COMPUTER, "Onboard Computer" },
9 { MAV_COMP_ID_CAMERA, "Camera1" },
10 { MAV_COMP_ID_CAMERA2, "Camera2" },
11 { MAV_COMP_ID_CAMERA3, "Camera3" },
12 { MAV_COMP_ID_CAMERA4, "Camera4" },
13 { MAV_COMP_ID_CAMERA5, "Camera5" },
14 { MAV_COMP_ID_CAMERA6, "Camera6" },
15 { MAV_COMP_ID_SERVO1, "Servo1" },
16 { MAV_COMP_ID_SERVO2, "Servo2" },
17 { MAV_COMP_ID_SERVO3, "Servo3" },
18 { MAV_COMP_ID_SERVO4, "Servo4" },
19 { MAV_COMP_ID_SERVO5, "Servo5" },
20 { MAV_COMP_ID_SERVO6, "Servo6" },
21 { MAV_COMP_ID_SERVO7, "Servo7" },
22 { MAV_COMP_ID_SERVO8, "Servo8" },
23 { MAV_COMP_ID_SERVO9, "Servo9" },
24 { MAV_COMP_ID_SERVO10, "Servo10" },
25 { MAV_COMP_ID_SERVO11, "Servo11" },
26 { MAV_COMP_ID_SERVO12, "Servo12" },
27 { MAV_COMP_ID_SERVO13, "Servo13" },
28 { MAV_COMP_ID_SERVO14, "Servo14" },
29 { MAV_COMP_ID_GIMBAL, "Gimbal1" },
30 { MAV_COMP_ID_ADSB, "ADSB" },
31 { MAV_COMP_ID_OSD, "OSD" },
32 { MAV_COMP_ID_FLARM, "FLARM" },
33 { MAV_COMP_ID_GIMBAL2, "Gimbal2" },
34 { MAV_COMP_ID_GIMBAL3, "Gimbal3" },
35 { MAV_COMP_ID_GIMBAL4, "Gimbal4" },
36 { MAV_COMP_ID_GIMBAL5, "Gimbal5" },
37 { MAV_COMP_ID_GIMBAL6, "Gimbal6" },
38 { MAV_COMP_ID_IMU, "IMU1" },
39 { MAV_COMP_ID_IMU_2, "IMU2" },
40 { MAV_COMP_ID_IMU_3, "IMU3" },
41 { MAV_COMP_ID_GPS, "GPS1" },
42 { MAV_COMP_ID_GPS2, "GPS2" }
43};
44
45#ifdef MAVLINK_EXTERNAL_RX_STATUS
47#endif
48
49#ifdef MAVLINK_GET_CHANNEL_STATUS
50mavlink_status_t* mavlink_get_channel_status(uint8_t channel)
51{
52#ifndef MAVLINK_EXTERNAL_RX_STATUS
53 static QList<mavlink_status_t> m_mavlink_status(MAVLINK_COMM_NUM_BUFFERS);
54#endif
55 if (!QGCMAVLink::isValidChannel(channel)) {
56 qCWarning(QGCMAVLinkLog) << Q_FUNC_INFO << "Invalid Channel Number:" << channel;
57 return nullptr;
58 }
59
60 return &m_mavlink_status[channel];
61}
62#endif
63
64QGCMAVLink::QGCMAVLink(QObject *parent)
65 : QObject(parent)
66{
67 // qCDebug(StatusTextHandlerLog) << Q_FUNC_INFO << this;
68
69 (void) qRegisterMetaType<mavlink_message_t>("mavlink_message_t");
70 (void) qRegisterMetaType<MAV_TYPE>("MAV_TYPE");
71 (void) qRegisterMetaType<MAV_AUTOPILOT>("MAV_AUTOPILOT");
72 (void) qRegisterMetaType<QGCMAVLink::GripperActions>("QGCMAVLink::GripperActions");
73}
74
76{
77 // qCDebug(StatusTextHandlerLog) << Q_FUNC_INFO << this;
78}
79
80QList<QGCMAVLink::FirmwareClass_t> QGCMAVLink::allFirmwareClasses(void)
81{
82 static const QList<QGCMAVLink::FirmwareClass_t> classes = {
86 };
87
88 return classes;
89}
90
91QList<QGCMAVLink::VehicleClass_t> QGCMAVLink::allVehicleClasses(void)
92{
93 static const QList<QGCMAVLink::VehicleClass_t> classes = {
100 };
101
102 return classes;
103}
104
106{
107 if (isPX4FirmwareClass(autopilot)) {
108 return FirmwareClassPX4;
109 } else if (isArduPilotFirmwareClass(autopilot)) {
111 } else {
113 }
114}
115
117{
118 switch (firmwareClass) {
119 case FirmwareClassPX4:
120 return QT_TRANSLATE_NOOP("Firmware Class", "PX4 Pro");
122 return QT_TRANSLATE_NOOP("Firmware Class", "ArduPilot");
124 return QT_TRANSLATE_NOOP("Firmware Class", "Generic");
125 default:
126 return QT_TRANSLATE_NOOP("Firmware Class", "Unknown");
127 }
128}
129
130MAV_AUTOPILOT QGCMAVLink::firmwareTypeFromString(const QString &firmwareTypeStr)
131{
132 const QString type = firmwareTypeStr.trimmed();
133 if (type == QLatin1String("ArduPilot")) {
134 return MAV_AUTOPILOT_ARDUPILOTMEGA;
135 }
136 if (type == QLatin1String("PX4 Pro")) {
137 return MAV_AUTOPILOT_PX4;
138 }
139 return MAV_AUTOPILOT_GENERIC;
140}
141
142bool QGCMAVLink::isAirship(MAV_TYPE mavType)
143{
144 return vehicleClass(mavType) == VehicleClassAirship;
145}
146
147bool QGCMAVLink::isFixedWing(MAV_TYPE mavType)
148{
149 return vehicleClass(mavType) == VehicleClassFixedWing;
150}
151
152bool QGCMAVLink::isRoverBoat(MAV_TYPE mavType)
153{
154 return vehicleClass(mavType) == VehicleClassRoverBoat;
155}
156
157bool QGCMAVLink::isSpacecraft(MAV_TYPE mavType)
158{
159 return vehicleClass(mavType) == VehicleClassSpacecraft;
160}
161
162bool QGCMAVLink::isSub(MAV_TYPE mavType)
163{
164 return vehicleClass(mavType) == VehicleClassSub;
165}
166
167bool QGCMAVLink::isMultiRotor(MAV_TYPE mavType)
168{
169 return vehicleClass(mavType) == VehicleClassMultiRotor;
170}
171
172bool QGCMAVLink::isVTOL(MAV_TYPE mavType)
173{
174 return vehicleClass(mavType) == VehicleClassVTOL;
175}
176
178{
179 switch (mavType) {
180 case MAV_TYPE_GROUND_ROVER:
181 case MAV_TYPE_SURFACE_BOAT:
183 case MAV_TYPE_SUBMARINE:
184 return VehicleClassSub;
185 case MAV_TYPE_SPACECRAFT_ORBITER:
187 case MAV_TYPE_QUADROTOR:
188 case MAV_TYPE_COAXIAL:
189 case MAV_TYPE_HELICOPTER:
190 case MAV_TYPE_HEXAROTOR:
191 case MAV_TYPE_OCTOROTOR:
192 case MAV_TYPE_TRICOPTER:
194 case MAV_TYPE_VTOL_TAILSITTER_DUOROTOR:
195 case MAV_TYPE_VTOL_TAILSITTER_QUADROTOR:
196 case MAV_TYPE_VTOL_TILTROTOR:
197 case MAV_TYPE_VTOL_FIXEDROTOR:
198 case MAV_TYPE_VTOL_TAILSITTER:
199 case MAV_TYPE_VTOL_TILTWING:
200 case MAV_TYPE_VTOL_RESERVED5:
201 return VehicleClassVTOL;
202 case MAV_TYPE_FIXED_WING:
204 case MAV_TYPE_AIRSHIP:
205 return VehicleClassAirship;
206 default:
207 return VehicleClassGeneric;
208 }
209}
210
212{
213 switch (vehicleClass) {
215 return QT_TRANSLATE_NOOP("Vehicle Class", "Airship");
217 return QT_TRANSLATE_NOOP("Vehicle Class", "Fixed Wing");
219 return QT_TRANSLATE_NOOP("Vehicle Class", "Rover-Boat");
220 case VehicleClassSub:
221 return QT_TRANSLATE_NOOP("Vehicle Class", "Sub");
223 return QT_TRANSLATE_NOOP("Vehicle Class", "Spacecraft");
225 return QT_TRANSLATE_NOOP("Vehicle Class", "Multi-Rotor");
226 case VehicleClassVTOL:
227 return QT_TRANSLATE_NOOP("Vehicle Class", "VTOL");
229 return QT_TRANSLATE_NOOP("Vehicle Class", "Generic");
230 default:
231 return QT_TRANSLATE_NOOP("Vehicle Class", "Unknown");
232 }
233}
234
235MAV_TYPE QGCMAVLink::vehicleTypeFromString(const QString &vehicleStr)
236{
237 const QString type = vehicleStr.trimmed();
238 if (type == QLatin1String("Multi-Rotor")) {
239 return MAV_TYPE_QUADROTOR;
240 }
241 if (type == QLatin1String("Fixed Wing")) {
242 return MAV_TYPE_FIXED_WING;
243 }
244 if (type == QLatin1String("Rover")) {
245 return MAV_TYPE_GROUND_ROVER;
246 }
247 if (type == QLatin1String("Sub")) {
248 return MAV_TYPE_SUBMARINE;
249 }
250 return MAV_TYPE_GENERIC;
251}
252
254{
255 switch (vehicleClass) {
257 return QStringLiteral("Airship");
259 return QStringLiteral("FixedWing");
261 return QStringLiteral("RoverBoat");
262 case VehicleClassSub:
263 return QStringLiteral("Sub");
265 return QStringLiteral("Spacecraft");
267 return QStringLiteral("MultiRotor");
268 case VehicleClassVTOL:
269 return QStringLiteral("VTOL");
271 return QStringLiteral("Generic");
272 default:
273 return QStringLiteral("Unknown");
274 }
275}
276
277QString QGCMAVLink::mavResultToString(uint8_t result)
278{
279 switch (result) {
280 case MAV_RESULT_ACCEPTED:
281 return QStringLiteral("MAV_RESULT_ACCEPTED");
282 case MAV_RESULT_TEMPORARILY_REJECTED:
283 return QStringLiteral("MAV_RESULT_TEMPORARILY_REJECTED");
284 case MAV_RESULT_DENIED:
285 return QStringLiteral("MAV_RESULT_DENIED");
286 case MAV_RESULT_UNSUPPORTED:
287 return QStringLiteral("MAV_RESULT_UNSUPPORTED");
288 case MAV_RESULT_FAILED:
289 return QStringLiteral("MAV_RESULT_FAILED");
290 case MAV_RESULT_IN_PROGRESS:
291 return QStringLiteral("MAV_RESULT_IN_PROGRESS");
292 default:
293 return QStringLiteral("MAV_RESULT unknown %1").arg(result);
294 }
295}
296
297QString QGCMAVLink::mavSysStatusSensorToString(MAV_SYS_STATUS_SENSOR sysStatusSensor)
298{
299 struct sensorInfo_s {
300 uint32_t bit;
301 QString sensorName;
302 };
303
304 static const sensorInfo_s rgSensorInfo[] = {
305 { MAV_SYS_STATUS_SENSOR_3D_GYRO, QT_TRANSLATE_NOOP("MAVLink SYS_STATUS_SENSOR value", "Gyro") },
306 { MAV_SYS_STATUS_SENSOR_3D_ACCEL, QT_TRANSLATE_NOOP("MAVLink SYS_STATUS_SENSOR value", "Accelerometer") },
307 { MAV_SYS_STATUS_SENSOR_3D_MAG, QT_TRANSLATE_NOOP("MAVLink SYS_STATUS_SENSOR value", "Magnetometer") },
308 { MAV_SYS_STATUS_SENSOR_ABSOLUTE_PRESSURE, QT_TRANSLATE_NOOP("MAVLink SYS_STATUS_SENSOR value", "Absolute pressure") },
309 { MAV_SYS_STATUS_SENSOR_DIFFERENTIAL_PRESSURE, QT_TRANSLATE_NOOP("MAVLink SYS_STATUS_SENSOR value", "Differential pressure") },
310 { MAV_SYS_STATUS_SENSOR_GPS, QT_TRANSLATE_NOOP("MAVLink SYS_STATUS_SENSOR value", "GPS") },
311 { MAV_SYS_STATUS_SENSOR_OPTICAL_FLOW, QT_TRANSLATE_NOOP("MAVLink SYS_STATUS_SENSOR value", "Optical flow") },
312 { MAV_SYS_STATUS_SENSOR_VISION_POSITION, QT_TRANSLATE_NOOP("MAVLink SYS_STATUS_SENSOR value", "Computer vision position") },
313 { MAV_SYS_STATUS_SENSOR_LASER_POSITION, QT_TRANSLATE_NOOP("MAVLink SYS_STATUS_SENSOR value", "Laser based position") },
314 { MAV_SYS_STATUS_SENSOR_EXTERNAL_GROUND_TRUTH, QT_TRANSLATE_NOOP("MAVLink SYS_STATUS_SENSOR value", "External ground truth") },
315 { MAV_SYS_STATUS_SENSOR_ANGULAR_RATE_CONTROL, QT_TRANSLATE_NOOP("MAVLink SYS_STATUS_SENSOR value", "Angular rate control") },
316 { MAV_SYS_STATUS_SENSOR_ATTITUDE_STABILIZATION, QT_TRANSLATE_NOOP("MAVLink SYS_STATUS_SENSOR value", "Attitude stabilization") },
317 { MAV_SYS_STATUS_SENSOR_YAW_POSITION, QT_TRANSLATE_NOOP("MAVLink SYS_STATUS_SENSOR value", "Yaw position") },
318 { MAV_SYS_STATUS_SENSOR_Z_ALTITUDE_CONTROL, QT_TRANSLATE_NOOP("MAVLink SYS_STATUS_SENSOR value", "Z/altitude control") },
319 { MAV_SYS_STATUS_SENSOR_XY_POSITION_CONTROL, QT_TRANSLATE_NOOP("MAVLink SYS_STATUS_SENSOR value", "X/Y position control") },
320 { MAV_SYS_STATUS_SENSOR_MOTOR_OUTPUTS, QT_TRANSLATE_NOOP("MAVLink SYS_STATUS_SENSOR value", "Motor outputs / control") },
321 { MAV_SYS_STATUS_SENSOR_RC_RECEIVER, QT_TRANSLATE_NOOP("MAVLink SYS_STATUS_SENSOR value", "RC receiver") },
322 { MAV_SYS_STATUS_SENSOR_3D_GYRO2, QT_TRANSLATE_NOOP("MAVLink SYS_STATUS_SENSOR value", "Gyro 2") },
323 { MAV_SYS_STATUS_SENSOR_3D_ACCEL2, QT_TRANSLATE_NOOP("MAVLink SYS_STATUS_SENSOR value", "Accelerometer 2") },
324 { MAV_SYS_STATUS_SENSOR_3D_MAG2, QT_TRANSLATE_NOOP("MAVLink SYS_STATUS_SENSOR value", "Magnetometer 2") },
325 { MAV_SYS_STATUS_GEOFENCE, QT_TRANSLATE_NOOP("MAVLink SYS_STATUS_SENSOR value", "GeoFence") },
326 { MAV_SYS_STATUS_AHRS, QT_TRANSLATE_NOOP("MAVLink SYS_STATUS_SENSOR value", "AHRS") },
327 { MAV_SYS_STATUS_TERRAIN, QT_TRANSLATE_NOOP("MAVLink SYS_STATUS_SENSOR value", "Terrain") },
328 { MAV_SYS_STATUS_REVERSE_MOTOR, QT_TRANSLATE_NOOP("MAVLink SYS_STATUS_SENSOR value", "Motors reversed") },
329 { MAV_SYS_STATUS_LOGGING, QT_TRANSLATE_NOOP("MAVLink SYS_STATUS_SENSOR value", "Logging") },
330 { MAV_SYS_STATUS_SENSOR_BATTERY, QT_TRANSLATE_NOOP("MAVLink SYS_STATUS_SENSOR value", "Battery") },
331 { MAV_SYS_STATUS_SENSOR_PROXIMITY, QT_TRANSLATE_NOOP("MAVLink SYS_STATUS_SENSOR value", "Proximity") },
332 { MAV_SYS_STATUS_SENSOR_SATCOM, QT_TRANSLATE_NOOP("MAVLink SYS_STATUS_SENSOR value", "Satellite Communication") },
333 { MAV_SYS_STATUS_PREARM_CHECK, QT_TRANSLATE_NOOP("MAVLink SYS_STATUS_SENSOR value", "Pre-Arm Check") },
334 { MAV_SYS_STATUS_OBSTACLE_AVOIDANCE, QT_TRANSLATE_NOOP("MAVLink SYS_STATUS_SENSOR value", "Avoidance/collision prevention") },
335 { MAV_SYS_STATUS_SENSOR_PROPULSION, QT_TRANSLATE_NOOP("MAVLink SYS_STATUS_SENSOR value", "Propulsion") }
336 };
337
338 for (size_t i=0; i<sizeof(rgSensorInfo)/sizeof(sensorInfo_s); i++) {
339 const sensorInfo_s* pSensorInfo = &rgSensorInfo[i];
340 if (sysStatusSensor == pSensorInfo->bit) {
341 return pSensorInfo->sensorName;
342 }
343 }
344
345 qWarning() << "QGCMAVLink::mavSysStatusSensorToString: Unknown sensor" << sysStatusSensor;
346
347 return QT_TRANSLATE_NOOP("MAVLink unknown SYS_STATUS_SENSOR value", "Unknown sensor");
348}
349
350QString QGCMAVLink::mavTypeToString(MAV_TYPE mavType) {
351 static const QMap<int, QString> typeNames = {
352 { MAV_TYPE_GENERIC, tr("Generic micro air vehicle" )},
353 { MAV_TYPE_FIXED_WING, tr("Fixed wing aircraft")},
354 { MAV_TYPE_QUADROTOR, tr("Quadrotor")},
355 { MAV_TYPE_COAXIAL, tr("Coaxial helicopter")},
356 { MAV_TYPE_HELICOPTER, tr("Normal helicopter with tail rotor.")},
357 { MAV_TYPE_ANTENNA_TRACKER, tr("Ground installation")},
358 { MAV_TYPE_GCS, tr("Operator control unit / ground control station")},
359 { MAV_TYPE_AIRSHIP, tr("Airship, controlled")},
360 { MAV_TYPE_FREE_BALLOON, tr("Free balloon, uncontrolled")},
361 { MAV_TYPE_ROCKET, tr("Rocket")},
362 { MAV_TYPE_GROUND_ROVER, tr("Ground rover")},
363 { MAV_TYPE_SURFACE_BOAT, tr("Surface vessel, boat, ship")},
364 { MAV_TYPE_SUBMARINE, tr("Submarine")},
365 { MAV_TYPE_SPACECRAFT_ORBITER, tr("Spacecraft, orbiter")},
366 { MAV_TYPE_HEXAROTOR, tr("Hexarotor")},
367 { MAV_TYPE_OCTOROTOR, tr("Octorotor")},
368 { MAV_TYPE_TRICOPTER, tr("trirotor")},
369 { MAV_TYPE_FLAPPING_WING, tr("Flapping wing")},
370 { MAV_TYPE_KITE, tr("Kite")},
371 { MAV_TYPE_ONBOARD_CONTROLLER, tr("Onboard companion controller")},
372 { MAV_TYPE_VTOL_TAILSITTER_DUOROTOR, tr("Two-rotor VTOL using control surfaces in vertical operation in addition. Tailsitter")},
373 { MAV_TYPE_VTOL_TAILSITTER_QUADROTOR, tr("Quad-rotor VTOL using a V-shaped quad config in vertical operation. Tailsitter")},
374 { MAV_TYPE_VTOL_TILTROTOR, tr("Tiltrotor VTOL")},
375 { MAV_TYPE_VTOL_FIXEDROTOR, tr("VTOL Fixedrotor")},
376 { MAV_TYPE_VTOL_TAILSITTER, tr("VTOL Tailsitter")},
377 { MAV_TYPE_VTOL_TILTWING, tr("VTOL Tiltwing")},
378 { MAV_TYPE_VTOL_RESERVED5, tr("VTOL reserved 5")},
379 { MAV_TYPE_GIMBAL, tr("Onboard gimbal")},
380 { MAV_TYPE_ADSB, tr("Onboard ADSB peripheral")},
381 };
382
383 return typeNames.value(mavType, "MAV_TYPE_UNKNOWN");
384}
385
386QString QGCMAVLink::firmwareVersionTypeToString(FIRMWARE_VERSION_TYPE firmwareVersionType)
387{
388 switch (firmwareVersionType) {
389 case FIRMWARE_VERSION_TYPE_DEV:
390 return QStringLiteral("dev");
391 case FIRMWARE_VERSION_TYPE_ALPHA:
392 return QStringLiteral("alpha");
393 case FIRMWARE_VERSION_TYPE_BETA:
394 return QStringLiteral("beta");
395 case FIRMWARE_VERSION_TYPE_RC:
396 return QStringLiteral("rc");
397 case FIRMWARE_VERSION_TYPE_OFFICIAL:
398 default:
399 return QStringLiteral("");
400 }
401}
402
403FIRMWARE_VERSION_TYPE QGCMAVLink::firmwareVersionTypeFromString(const QString &typeStr)
404{
405 const QString type = typeStr.trimmed();
406 if (type == QLatin1String("dev")) {
407 return FIRMWARE_VERSION_TYPE_DEV;
408 }
409 if (type == QLatin1String("alpha")) {
410 return FIRMWARE_VERSION_TYPE_ALPHA;
411 }
412 if (type == QLatin1String("beta")) {
413 return FIRMWARE_VERSION_TYPE_BETA;
414 }
415 if (type == QLatin1String("rc")) {
416 return FIRMWARE_VERSION_TYPE_RC;
417 }
418 return FIRMWARE_VERSION_TYPE_OFFICIAL;
419}
420
421int QGCMAVLink::motorCount(MAV_TYPE mavType, uint8_t frameType)
422{
423 switch (mavType) {
424 case MAV_TYPE_HELICOPTER:
425 return 1;
426 case MAV_TYPE_VTOL_TAILSITTER_DUOROTOR:
427 return 2;
428 case MAV_TYPE_TRICOPTER:
429 return 3;
430 case MAV_TYPE_QUADROTOR:
431 case MAV_TYPE_VTOL_TAILSITTER_QUADROTOR:
432 return 4;
433 case MAV_TYPE_HEXAROTOR:
434 return 6;
435 case MAV_TYPE_OCTOROTOR:
436 return 8;
437 case MAV_TYPE_SUBMARINE:
438 {
439 // Supported frame types
440 enum {
441 SUB_FRAME_BLUEROV1,
442 SUB_FRAME_VECTORED,
443 SUB_FRAME_VECTORED_6DOF,
444 SUB_FRAME_VECTORED_6DOF_90DEG,
445 SUB_FRAME_SIMPLEROV_3,
446 SUB_FRAME_SIMPLEROV_4,
447 SUB_FRAME_SIMPLEROV_5,
448 SUB_FRAME_CUSTOM
449 };
450
451 switch (frameType) { // ardupilot/libraries/AP_Motors/AP_Motors6DOF.h sub_frame_t
452
453 case SUB_FRAME_BLUEROV1:
454 case SUB_FRAME_VECTORED:
455 return 6;
456
457 case SUB_FRAME_SIMPLEROV_3:
458 return 3;
459
460 case SUB_FRAME_SIMPLEROV_4:
461 return 4;
462
463 case SUB_FRAME_SIMPLEROV_5:
464 return 5;
465
466 case SUB_FRAME_VECTORED_6DOF:
467 case SUB_FRAME_VECTORED_6DOF_90DEG:
468 case SUB_FRAME_CUSTOM:
469 return 8;
470
471 default:
472 return -1;
473 }
474 }
475 case MAV_TYPE_SPACECRAFT_ORBITER:
476 return 8;
477
478 default:
479 return -1;
480 }
481}
482
483uint32_t QGCMAVLink::highLatencyFailuresToMavSysStatus(mavlink_high_latency2_t& highLatency2)
484{
485 struct failure2Sensor_s {
486 HL_FAILURE_FLAG failureBit;
487 MAV_SYS_STATUS_SENSOR sensorBit;
488 };
489
490 static constexpr const failure2Sensor_s rgFailure2Sensor[] = {
491 { HL_FAILURE_FLAG_GPS, MAV_SYS_STATUS_SENSOR_GPS },
492 { HL_FAILURE_FLAG_DIFFERENTIAL_PRESSURE, MAV_SYS_STATUS_SENSOR_DIFFERENTIAL_PRESSURE },
493 { HL_FAILURE_FLAG_ABSOLUTE_PRESSURE, MAV_SYS_STATUS_SENSOR_ABSOLUTE_PRESSURE },
494 { HL_FAILURE_FLAG_3D_ACCEL, MAV_SYS_STATUS_SENSOR_3D_ACCEL },
495 { HL_FAILURE_FLAG_3D_GYRO, MAV_SYS_STATUS_SENSOR_3D_GYRO },
496 { HL_FAILURE_FLAG_3D_MAG, MAV_SYS_STATUS_SENSOR_3D_MAG },
497 };
498
499 // Map from MAV_FAILURE bits to standard SYS_STATUS message handling
500 uint32_t onboardControlSensorsEnabled = 0;
501 for (size_t i=0; i<sizeof(rgFailure2Sensor)/sizeof(failure2Sensor_s); i++) {
502 const failure2Sensor_s* pFailure2Sensor = &rgFailure2Sensor[i];
503 if (highLatency2.failure_flags & pFailure2Sensor->failureBit) {
504 // Assume if reporting as unhealthy that is it present and enabled
505 onboardControlSensorsEnabled |= pFailure2Sensor->sensorBit;
506 }
507 }
508
509 return onboardControlSensorsEnabled;
510}
511
512QString QGCMAVLink::compIdToString(uint8_t compId)
513{
514 QString compIdStr;
515
516 if (mavlinkCompIdHash.contains(compId)) {
517 compIdStr = mavlinkCompIdHash.value(compId);
518 } else {
519 compIdStr = QStringLiteral("Unknown");
520 }
521
522 return QStringLiteral("%1 (%2)").arg(compIdStr).arg(static_cast<int>(compId));
523}
#define MAVLINK_COMM_NUM_BUFFERS
Definition MAVLinkLib.h:27
#define QGC_LOGGING_CATEGORY(name, categoryStr)