QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
MockLink.h
Go to the documentation of this file.
1#pragma once
2
4#include "LinkInterface.h"
5#include "MAVLinkEnums.h"
7#include "QGCMAVLinkTypes.h"
8#include "MockConfiguration.h"
11
12#include <QtCore/QElapsedTimer>
13#include <QtCore/QList>
14#include <QtCore/QMap>
15#include <QtCore/QMutex>
16#include <QtCore/QPair>
17#include <QtCore/QSet>
18#include <QtPositioning/QGeoCoordinate>
19
20#include <array>
21#include <atomic>
22
23class MockLinkCamera;
24class MockLinkFTP;
25class MockLinkGimbal;
26class MockLinkWorker;
28class QThread;
29
30class MockLink : public LinkInterface
31{
32 Q_OBJECT
33 friend class MockLinkFTP;
34 friend class StandardModesTest;
35
36public:
37 explicit MockLink(SharedLinkConfigurationPtr &config, QObject *parent = nullptr);
38 virtual ~MockLink();
39
40 void run1HzTasks();
41 void run10HzTasks();
42 void run500HzTasks();
44
45 bool shouldSendStatusText() const { return _sendStatusText; }
46
47 bool isConnected() const final { return _connected; }
48 void disconnect() final;
49
50 Q_INVOKABLE void setCommLost(bool commLost) { _commLost = commLost; }
51 Q_INVOKABLE void simulateConnectionRemoved();
52
53 int vehicleId() const { return _vehicleSystemId; }
54 MAV_AUTOPILOT getFirmwareType() const { return _firmwareType; }
55
56 double vehicleLatitude() const { return _vehicleLatitude; }
57 double vehicleLongitude() const { return _vehicleLongitude; }
58 double vehicleAltitudeAMSL() const { return _vehicleAltitudeAMSL; }
59
61 QGeoCoordinate homeCoordinate() const { return _homeCoordinate; }
62
63 bool signingEnabled() const { return _signingEnabled; }
64
67
70 void sendStatusTextMessage(uint8_t severity, const QString &text);
71
73 void setCalibrationPose(MockLinkPX4Calibration::Pose pose) const { _mockLinkPX4Calibration->setPose(pose); }
74
75 MockLinkFTP *mockLinkFTP() const;
76 MockLinkGimbal *mockLinkGimbal() const { return _mockLinkGimbal; }
77
80 void setVehicleAttitudeOverrideDeg(float rollDeg, float pitchDeg, float yawDeg);
82
84 void setArmed(bool armed) { if (armed) _mavBaseMode |= MAV_MODE_FLAG_SAFETY_ARMED; else _mavBaseMode &= ~MAV_MODE_FLAG_SAFETY_ARMED; }
85 bool armed() const { return (_mavBaseMode & MAV_MODE_FLAG_SAFETY_ARMED) != 0; }
86
90 void setMissionItemFailureMode(MockLinkMissionItemHandler::FailureMode_t failureMode, MAV_MISSION_RESULT failureAckResult) const { _missionItemHandler->setFailureMode(failureMode, failureAckResult); }
91
93 void sendUnexpectedMissionAck(MAV_MISSION_RESULT ackType) const { _missionItemHandler->sendUnexpectedMissionAck(ackType); }
94
96 void sendUnexpectedMissionItem() const { _missionItemHandler->sendUnexpectedMissionItem(); }
97
99 void sendUnexpectedMissionRequest() const { _missionItemHandler->sendUnexpectedMissionRequest(); }
100
101 void sendUnexpectedCommandAck(MAV_CMD command, MAV_RESULT ackResult);
102
104 void resetMissionItemHandler() const { _missionItemHandler->reset(); }
105
107 void loadSimpleMultirotorMission() const { _missionItemHandler->loadSimpleMultirotorMission(); }
108
110 QString logDownloadFile() const { return _logDownloadFilename; }
111
113 uint8_t outgoingMavlinkChannel() const { return _outgoingMavlinkChannel; }
114
115 void clearReceivedMavCommandCounts() { _receivedMavCommandCountMap.clear(); _receivedMavCommandByCompCountMap.clear(); _receivedRequestMessageByCompAndMsgCountMap.clear(); }
116 int receivedMavCommandCount(MAV_CMD command) const { return _receivedMavCommandCountMap.value(command, 0); }
117 int receivedMavCommandCount(MAV_CMD command, int compId) const { return _receivedMavCommandByCompCountMap.value(command).value(compId, 0); }
118 int receivedRequestMessageCount(int compId, int messageId) const { return _receivedRequestMessageByCompAndMsgCountMap.value(compId).value(messageId, 0); }
119 void clearReceivedRequestMessageCounts() { _receivedRequestMessageCountMap.clear(); _receivedRequestMessageByCompAndMsgCountMap.clear(); }
120 int receivedRequestMessageCount(uint32_t messageId) const { return _receivedRequestMessageCountMap.value(messageId, 0); }
121 void clearReceivedMavlinkMessageCounts() { _receivedMavlinkMessageCountMap.clear(); _lastReceivedMavlinkMessageMap.clear(); _hashCheckRequestCount = 0; _missionItemHandler->clearRequestListCounts(); }
122 int receivedMavlinkMessageCount(uint32_t messageId) const { return _receivedMavlinkMessageCountMap.value(messageId, 0); }
124 bool lastReceivedMavlinkMessage(uint32_t messageId, mavlink_message_t &message) const {
125 if (!_lastReceivedMavlinkMessageMap.contains(messageId)) {
126 return false;
127 }
128 message = _lastReceivedMavlinkMessageMap.value(messageId);
129 return true;
130 }
131 int receivedMissionRequestListCount(MAV_MISSION_TYPE type) const { return _missionItemHandler->requestListCount(type); }
132
135 void bumpAvailableModesMonitorSequence() { ++_availableModesMonitorSeqNumber; }
136
138 void setDuplicateResponses(bool duplicate) { _duplicateResponses = duplicate; }
139
146 void setRequestMessageFailureMode(RequestMessageFailureMode_t failureMode) { _requestMessageFailureMode = failureMode; }
147
150 void setRequestMessageNoResponse(uint32_t messageId, bool noResponse = true) {
151 QMutexLocker locker(&_requestMessageNoResponseMutex);
152 if (noResponse) {
153 _requestMessageNoResponseIds.insert(messageId);
154 } else {
155 _requestMessageNoResponseIds.remove(messageId);
156 }
157 }
158
166 _paramSetFailureMode = mode;
167 _paramSetFailureFirstAttemptPending = (mode == FailParamSetFirstAttemptNoAck);
168 }
169
177 _paramRequestReadFailureMode = mode;
178 _paramRequestReadFailureFirstAttemptPending = (mode == FailParamRequestReadFirstAttemptNoResponse);
179 }
180
181 void setHashCheckNoResponse(bool noResponse) { _hashCheckNoResponse = noResponse; }
182
186 void setResetSysAutostartOnParamReset(bool reset) { _resetSysAutostartOnParamReset = reset; }
187
189 int hashCheckRequestCount() const { return _hashCheckRequestCount; }
191 QList<QPair<int, int>> paramRequestReadIndexLog() const { return _paramRequestReadIndexLog; }
192
194 void setMockParamValue(int componentId, const QString &paramName, float value);
195
200
203
206 void setAPMMagCalStartFailureMode(bool fail) { _apmMagCalStartFailureMode = fail; }
207
210 void setInt32ParamValue(int componentId, const QString &paramName, int32_t value) { _mapParamName2Value[componentId][paramName] = QVariant::fromValue(value); }
211
214 QVariant paramValue(int componentId, const QString &paramName) const { return _mapParamName2Value.value(componentId).value(paramName); }
215
218 void setRemoteIDArmStatus(uint8_t status, const QString& error);
219
222 static MockLink *startMockLink(MockConfiguration *mockConfig) { return _startMockLink(mockConfig); }
230
235 void servedVideoStream(MockConfiguration::VideoStreamType &type, QString &uri) const;
236
238 MockConfiguration::VideoStreamType requestedVideoStreamType() const { return _requestedVideoStreamType; }
239
240 // Special commands for testing Vehicle::sendMavCommandWithHandler
241 static constexpr MAV_CMD MAV_CMD_MOCKLINK_ALWAYS_RESULT_ACCEPTED = MAV_CMD_USER_1;
242 static constexpr MAV_CMD MAV_CMD_MOCKLINK_ALWAYS_RESULT_FAILED = MAV_CMD_USER_2;
243 static constexpr MAV_CMD MAV_CMD_MOCKLINK_SECOND_ATTEMPT_RESULT_ACCEPTED = MAV_CMD_USER_3;
244 static constexpr MAV_CMD MAV_CMD_MOCKLINK_SECOND_ATTEMPT_RESULT_FAILED = MAV_CMD_USER_4;
245 static constexpr MAV_CMD MAV_CMD_MOCKLINK_NO_RESPONSE = MAV_CMD_USER_5;
246 static constexpr MAV_CMD MAV_CMD_MOCKLINK_NO_RESPONSE_NO_RETRY = static_cast<MAV_CMD>(MAV_CMD_USER_5 + 1);
247 static constexpr MAV_CMD MAV_CMD_MOCKLINK_RESULT_IN_PROGRESS_ACCEPTED = static_cast<MAV_CMD>(MAV_CMD_USER_5 + 2);
248 static constexpr MAV_CMD MAV_CMD_MOCKLINK_RESULT_IN_PROGRESS_FAILED = static_cast<MAV_CMD>(MAV_CMD_USER_5 + 3);
249 static constexpr MAV_CMD MAV_CMD_MOCKLINK_RESULT_IN_PROGRESS_NO_ACK = static_cast<MAV_CMD>(MAV_CMD_USER_5 + 4);
250
251signals:
252 void writeBytesQueuedSignal(const QByteArray &bytes);
253 void highLatencyTransmissionEnabledChanged(bool highLatencyTransmissionEnabled);
254
255private slots:
257 void _writeBytes(const QByteArray &bytes) final;
258 void _writeBytesQueued(const QByteArray &bytes);
259
260private:
261 typedef struct {
262 const char *name;
263 uint8_t standard_mode;
264 uint32_t custom_mode;
265 bool canBeSet;
266 bool advanced;
267 } FlightMode_t;
268
269 bool _connect() final;
270 bool _allocateMavlinkChannel() final;
271 void _freeMavlinkChannel() final;
272
273 bool _incomingMavlinkChannelIsSet() const;
274 bool _outgoingMavlinkChannelIsSet() const;
275
276 void _loadParams();
277 void _resetParamsToDefaults();
278 void _applyAPMFreshFlashState();
279
281 float _floatUnionForParam(int componentId, const QString &paramName);
282 uint32_t _computeParamHash(int componentId) const;
283 void _setParamFloatUnionIntoMap(int componentId, const QString &paramName, float paramFloat);
284
286 void _handleIncomingNSHBytes(const char *bytes, int cBytes);
288 void _handleIncomingMavlinkBytes(const uint8_t *bytes, int cBytes);
290 void _updateIncomingMessageCounts(const mavlink_message_t &msg);
291 void _handleIncomingMavlinkMsg(const mavlink_message_t &msg);
292 void _handleHeartBeat(const mavlink_message_t &msg);
293 void _handleSetMode(const mavlink_message_t &msg);
294 void _handleParamRequestList(const mavlink_message_t &msg);
295 void _handleParamSet(const mavlink_message_t &msg);
296 void _handleParamRequestRead(const mavlink_message_t &msg);
297 bool _shouldSkipParamSend(int componentId, const QString &paramName, int paramIndex) const;
298 bool _shouldSkipParamRead(int componentId, const QString &paramName, int paramIndex);
299 bool _hasNonDefaultParamComponent() const;
300 void _handleFTP(const mavlink_message_t &msg);
301 void _handleCommandLong(const mavlink_message_t &msg);
302 void _handleCommandInt(const mavlink_message_t &msg);
303 void _handleInProgressCommandLong(const mavlink_command_long_t &request);
304 void _handleCommandLongSetMessageInterval(const mavlink_command_long_t &request, bool &acccepted);
305 void _handleManualControl(const mavlink_message_t &msg);
306 void _handleRCChannelsOverride(const mavlink_message_t &msg);
307 void _handlePreFlightCalibration(const mavlink_command_long_t &request);
308 void _handleTakeoff(const mavlink_command_long_t &request);
309 void _handleLogRequestList(const mavlink_message_t &msg);
310 void _handleLogErase(const mavlink_message_t &msg);
311 void _handleLogRequestData(const mavlink_message_t &msg);
312 void _handleParamMapRC(const mavlink_message_t &msg);
313 void _handleSetupSigning(const mavlink_message_t &msg);
314 void _sendParamError(int componentId, const char *paramId, int16_t paramIndex, uint8_t errorCode);
315 void _handleRequestMessage(const mavlink_command_long_t &request, bool &accepted, bool &noAck);
316 void _handleRequestMessageAutopilotVersion(const mavlink_command_long_t &request, bool &accepted);
317 void _handleRequestMessageDebug(const mavlink_command_long_t &request, bool &accepted, bool &noAck);
318 void _handleRequestMessageAvailableModes(const mavlink_command_long_t &request, bool &accepted);
319
320 void _sendHeartBeat();
321 void _sendHighLatency2();
322 void _sendHomePosition();
323 void _sendGpsRawInt();
324 void _sendGlobalPositionInt();
325 void _sendExtendedSysState();
326 void _sendVibration();
327 void _sendSysStatus();
328 void _sendBatteryStatus();
329 void _sendNamedValueFloats();
330 void _sendDistanceSensors();
331 void _sendChunkedStatusText(uint16_t chunkId, bool missingChunks);
332 void _sendStatusTextMessages();
333 void _respondWithAutopilotVersion();
334 void _sendRCChannels();
335 void _sendADSBVehicles();
336 void _sendGeneralMetaData();
337 void _sendRemoteIDArmStatus();
338 void _sendEscInfo();
339 void _sendEscStatus();
340 void _sendRadioStatus();
341 void _sendAvailableModesMonitor();
342 void _sendAttitudeQuaternion();
343 void _sendAttitudeTarget();
344 void _sendLocalPositionNed();
345 void _sendPositionTargetLocalNed();
346
347 void _paramRequestListWorker();
348 void _logDownloadWorker();
349 void _availableModesWorker();
350 void _apmCompassCalWorker();
351 void _apmAccelCalWorker();
352 void _sendAvailableMode(uint8_t modeIndexOneBased);
353 int _availableModesCount() const;
354 void _moveADSBVehicle(int vehicleIndex);
355
356 static MockLink *_startMockLinkWorker(const QString &configName, MAV_AUTOPILOT firmwareType, MAV_TYPE vehicleType, MockConfiguration::Options options, MockConfiguration::FailureMode_t failureMode, MockConfiguration::VideoStreamType videoStreamType = MockConfiguration::VideoStreamNone);
357 static MockLink *_startMockLink(MockConfiguration *mockConfig);
358
359 void _startVideoStreamServer();
360 void _stopVideoStreamServer();
361
364 static QString _createRandomFile(uint32_t byteCount);
365 QString _createLogContentsFile(const QString &logName);
366
367 QThread *_workerThread = nullptr;
368 MockLinkWorker *_worker = nullptr;
369
370 const MockConfiguration *_mockConfig = nullptr;
371 const MAV_AUTOPILOT _firmwareType = MAV_AUTOPILOT_PX4;
372 const MAV_TYPE _vehicleType = MAV_TYPE_QUADROTOR;
373 const bool _sendStatusText = false;
374 const bool _apmStartFreshParams = false;
375 const bool _enableCamera = false;
376 const bool _enableGimbal = false;
377 const bool _enableProximity = false;
378 const bool _enableADSB = _mockConfig->enableADSB();
379 const MockConfiguration::FailureMode_t _failureMode = MockConfiguration::FailNone;
380 const bool _stayMavlinkV1 = false;
381 const bool _ftpCapability = false;
382 const bool _sendRadioStatusEnabled = true;
383 const uint8_t _vehicleSystemId = 0;
384 const QGeoCoordinate _homeCoordinate = MockConfiguration::homeCoordinate(_mockConfig->homeLocationEnum());
385 const double _defaultVehicleLatitude = _homeCoordinate.latitude();
386 const double _defaultVehicleLongitude = _homeCoordinate.longitude();
387 const double _defaultVehicleHomeAltitude = _homeCoordinate.altitude();
388 const double _vehicleLatitude = 0.0;
389 const double _vehicleLongitude = 0.0;
390 // These are just set for reporting the fields in _respondWithAutopilotVersion()
391 // and ensuring that the Vehicle reports the fields in Vehicle::firmwareBoardVendorId etc.
392 // They do not control any mock simulation (and it is up to the Custom build to do that).
393 const uint16_t _boardVendorId = 0;
394 const uint16_t _boardProductId = 0;
395 MockLinkMissionItemHandler *const _missionItemHandler = nullptr;
396 MockLinkCamera *const _mockLinkCamera = nullptr;
397 MockLinkGimbal *const _mockLinkGimbal = nullptr;
398 MockLinkPX4Calibration *const _mockLinkPX4Calibration = nullptr;
399 MockLinkFTP *const _mockLinkFTP = nullptr;
400
401 // Written by test thread, read by worker thread in _sendAttitudeQuaternion; one lock so a frame never mixes old and new angles
402 struct AttitudeOverride {
403 bool enabled = false;
404 float rollRad = 0.0f;
405 float pitchRad = 0.0f;
406 float yawRad = 0.0f;
407 };
408 mutable QMutex _attitudeOverrideMutex;
409 AttitudeOverride _attitudeOverride;
410
412 MockVideoStreamServer *_videoStreamServer = nullptr;
413 // Served state is written on the connect/disconnect thread and read from the worker
414 // thread (MockLinkCamera), so it is guarded by _videoStreamMutex.
415 mutable QMutex _videoStreamMutex;
417 QString _videoStreamUri;
418
419 uint8_t _incomingMavlinkChannel = std::numeric_limits<uint8_t>::max();
420 QMutex _incomingMavlinkMutex;
422 uint8_t _outgoingMavlinkChannel = std::numeric_limits<uint8_t>::max();
423
424 mavlink_signing_t _mockSigning{};
425 mavlink_signing_streams_t _mockSigningStreams{};
426
427 bool _connected = false;
428 bool _inNSH = false;
429
430 uint8_t _mavBaseMode = MAV_MODE_FLAG_MANUAL_INPUT_ENABLED | MAV_MODE_FLAG_CUSTOM_MODE_ENABLED;
431 uint32_t _mavCustomMode = PX4CustomMode::MANUAL;
432
433 QElapsedTimer _runningTime;
434 static constexpr int kTestParamRequestListBatch = 25;
435 static constexpr int32_t _batteryMaxTimeRemaining = 15 * 60;
436 int8_t _battery1PctRemaining = 100;
437 int32_t _battery1TimeRemaining = _batteryMaxTimeRemaining;
438 MAV_BATTERY_CHARGE_STATE _battery1ChargeState = MAV_BATTERY_CHARGE_STATE_OK;
439 int8_t _battery2PctRemaining = 100;
440 int32_t _battery2TimeRemaining = _batteryMaxTimeRemaining;
441 MAV_BATTERY_CHARGE_STATE _battery2ChargeState = MAV_BATTERY_CHARGE_STATE_OK;
442
443 double _vehicleAltitudeAMSL = _defaultVehicleHomeAltitude;
444 std::atomic<bool> _commLost = false;
445 std::atomic<bool> _duplicateResponses = false;
446 bool _mavlinkV2Upgraded = false;
447 bool _signingEnabled = false;
448 bool _highLatencyTransmissionEnabled = true;
449
450 int _sendHomePositionDelayCount = 10;
451 int _sendGPSPositionDelayCount = 100;
452
453 int _currentParamRequestListComponentIndex = -1;
454 int _currentParamRequestListParamIndex = -1;
455 QList<int> _paramRequestListComponentIds;
456 QStringList _paramRequestListParamNames;
460 QMutex _paramRequestListMutex;
461
462 // Mavlink standard modes worker information
463 int _availableModesWorkerNextModeIndex = 0;
467 QMutex _availableModesWorkerMutex;
470 std::atomic<uint8_t> _availableModesMonitorSeqNumber = 0;
471
472 QString _logDownloadFilename;
473 bool _logsErased = false;
474 uint16_t _logDownloadId = 0;
475 uint32_t _logDownloadSize = 0;
476 uint32_t _logDownloadCurrentOffset = 0;
477 uint32_t _logDownloadBytesRemaining = 0;
481 QMutex _logDownloadMutex;
482
483 RequestMessageFailureMode_t _requestMessageFailureMode = FailRequestMessageNone;
484 mutable QMutex _requestMessageNoResponseMutex;
485 QSet<uint32_t> _requestMessageNoResponseIds;
486 ParamSetFailureMode_t _paramSetFailureMode = FailParamSetNone;
487 bool _paramSetFailureFirstAttemptPending = false;
488 ParamRequestReadFailureMode_t _paramRequestReadFailureMode = FailParamRequestReadNone;
489 bool _paramRequestReadFailureFirstAttemptPending = false;
490 bool _hashCheckNoResponse = false;
491 int _hashCheckRequestCount = 0;
492 QList<QPair<int, int>> _paramRequestReadIndexLog;
493 bool _paramRequestListHashCheckSent = false;
494 bool _resetSysAutostartOnParamReset = false;
495
496 // Periodic OPEN_DRONE_ID_ARM_STATUS content (overridable via setRemoteIDArmStatus).
497 // Written by the test (main) thread, read by the 1Hz worker: guarded by _remoteIDArmStatusMutex.
498 QMutex _remoteIDArmStatusMutex;
499 uint8_t _remoteIDArmStatus = MAV_ODID_ARM_STATUS_GOOD_TO_ARM;
500 QString _remoteIDArmStatusError = QStringLiteral("No Error");
501
502 // APM compass calibration worker state
503 // Protects _apmCompassCalProgress: main thread writes 0 to start/stop,
504 // worker thread reads/increments each 100ms tick.
505 mutable QMutex _apmCompassCalMutex;
506 int _apmCompassCalProgress = -1;
507 int _apmCompassCalTickCount = 0;
508 bool _apmStaleFailedMagCalReportStreaming = false;
509 bool _apmMagCalStartFailureMode = false;
510
511 // APM accel calibration worker state
512 // Protects _apmAccelCalPos: main thread writes the starting pos,
513 // worker thread reads and advances through the sequence.
514 QMutex _apmAccelCalMutex;
516 static constexpr ACCELCAL_VEHICLE_POS kAPMAccelCalPosSequence[] = {
517 ACCELCAL_VEHICLE_POS_LEVEL,
518 ACCELCAL_VEHICLE_POS_LEFT,
519 ACCELCAL_VEHICLE_POS_RIGHT,
520 ACCELCAL_VEHICLE_POS_NOSEDOWN,
521 ACCELCAL_VEHICLE_POS_NOSEUP,
522 ACCELCAL_VEHICLE_POS_BACK,
523 };
524 int _apmAccelCalPosIndex = -1;
525 bool _apmAccelCalGotAck = false;
526 int _apmAccelCalTickCount = 0;
527
528 struct RCChannelOverride {
529 enum class State { Ignore, Overridden, Released } state = State::Ignore;
530 uint16_t value = 0;
531 };
532 static constexpr int kRcChannelOverrideChannelCount = 18;
533 std::array<RCChannelOverride, kRcChannelOverrideChannelCount> _rcChannelOverrides;
534
535 QMap<MAV_CMD, int> _receivedMavCommandCountMap;
536 QMap<MAV_CMD, QMap<int, int>> _receivedMavCommandByCompCountMap;
537 QMap<uint32_t, int> _receivedRequestMessageCountMap;
538 QMap<int, QMap<int, int>> _receivedRequestMessageByCompAndMsgCountMap;
539 QMap<uint32_t, int> _receivedMavlinkMessageCountMap;
540 QMap<uint32_t, mavlink_message_t> _lastReceivedMavlinkMessageMap;
541 QMap<int, QMap<QString, QVariant>> _mapParamName2Value;
542 QMap<int, QMap<QString, MAV_PARAM_TYPE>> _mapParamName2MavParamType;
543
544 struct ADSBVehicle {
545 QGeoCoordinate coordinate;
546 double angle = 0.0;
547 double altitude = 0.0;
548 };
549 QList<ADSBVehicle> _adsbVehicles;
550 QList<QGeoCoordinate> _adsbVehicleCoordinates;
551 static constexpr int _numberOfVehicles = 5;
552 double _adsbAngles[_numberOfVehicles]{};
553
554 static std::atomic<int> _nextVehicleSystemId;
555
556 static constexpr const char *_failParam = "COM_FLTMODE6";
557
558 static constexpr uint8_t _vehicleComponentId = MAV_COMP_ID_AUTOPILOT1;
559
560 // Simulated DroneCAN node exposed as its own param component (FailMissingParamOnAllRequestsNonDefaultComponent and friends)
561 static constexpr uint8_t _nonDefaultParamComponentId = 125;
562 static constexpr const char *_nonDefaultFailParam = "BATT_MONITOR";
563 static constexpr int _sharedFailParamIndex = 1;
564 static constexpr int _nonDefaultStreamedParamCount = 2;
565 QSet<QPair<int, int>> _nonDefaultReadAttempted;
566
567 static constexpr uint16_t _logDownloadLogId = 0;
568 static constexpr uint32_t _logDownloadFileSize = 1000;
569
570 static constexpr bool _mavlinkStarted = true;
571
575 inline static const QSet<QString> kAPMCalOffsetParams = {
576 QStringLiteral("COMPASS_OFS_X"), QStringLiteral("COMPASS_OFS_Y"), QStringLiteral("COMPASS_OFS_Z"),
577 QStringLiteral("COMPASS_OFS2_X"), QStringLiteral("COMPASS_OFS2_Y"), QStringLiteral("COMPASS_OFS2_Z"),
578 QStringLiteral("COMPASS_OFS3_X"), QStringLiteral("COMPASS_OFS3_Y"), QStringLiteral("COMPASS_OFS3_Z"),
579 QStringLiteral("INS_ACCOFFS_X"), QStringLiteral("INS_ACCOFFS_Y"), QStringLiteral("INS_ACCOFFS_Z"),
580 };
581
582 static QList<FlightMode_t> _availableFlightModes;
583 static QList<FlightMode_t> _apmCopterAvailableFlightModes;
584 static QList<FlightMode_t> _apmPlaneAvailableFlightModes;
585 static QList<FlightMode_t> _apmRoverAvailableFlightModes;
586 static QList<FlightMode_t> _apmSubAvailableFlightModes;
587
589 const QList<FlightMode_t> &_flightModeList() const;
590
591 std::atomic<bool> _disconnectedEmitted{false};
592};
Config config
std::shared_ptr< LinkConfiguration > SharedLinkConfigurationPtr
Error error
struct __mavlink_message mavlink_message_t
struct __mavlink_command_long_t mavlink_command_long_t
int32_t latitude
Definition UBXPlan.cc:40
int32_t longitude
Definition UBXPlan.cc:42
The link interface defines the interface for all links used to communicate with the ground station ap...
@ VideoStreamNone
No stream served.
Simulates MAVLink Camera Protocol v2 components for MockLink.
Mock implementation of Mavlink FTP server.
Definition MockLinkFTP.h:18
Simulates MAVLink Gimbal Manager Protocol for MockLink.
int requestListCount(MAV_MISSION_TYPE type) const
void sendUnexpectedMissionAck(MAV_MISSION_RESULT ackType)
Called to send a MISSION_ACK message while the MissionManager is in idle state.
void reset()
Reset the state of the MissionItemHandler to no items, no transactions in progress.
void setFailureMode(FailureMode_t failureMode, MAV_MISSION_RESULT failureAckResult)
void sendUnexpectedMissionRequest()
Called to send a MISSION_REQUEST message while the MissionManager is in idle state.
void sendUnexpectedMissionItem()
Called to send a MISSION_ITEM message while the MissionManager is in idle state.
Simulates the PX4 commander magnetometer and accelerometer calibration protocols for MockLink.
Pose
Vehicle poses. Order matches the PX4 detect_orientation_return enum.
Worker class that runs periodic tasks for MockLink simulation.
Serves a synthetic (videotestsrc) live video stream for MockLink so the GStreamer receive pipeline ca...
std::optional< double > coordinate(std::string_view field, std::string_view hemisphere, bool latitude)