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/QMap>
14#include <QtCore/QMutex>
15#include <QtCore/QSet>
16#include <QtPositioning/QGeoCoordinate>
17
18#include <array>
19#include <atomic>
20
21class MockLinkCamera;
22class MockLinkFTP;
23class MockLinkGimbal;
24class MockLinkWorker;
26class QThread;
27
28class MockLink : public LinkInterface
29{
30 Q_OBJECT
31 friend class MockLinkFTP;
32
33public:
34 explicit MockLink(SharedLinkConfigurationPtr &config, QObject *parent = nullptr);
35 virtual ~MockLink();
36
37 void run1HzTasks();
38 void run10HzTasks();
39 void run500HzTasks();
41
42 bool shouldSendStatusText() const { return _sendStatusText; }
43
44 bool isConnected() const final { return _connected; }
45 void disconnect() final;
46
47 Q_INVOKABLE void setCommLost(bool commLost) { _commLost = commLost; }
48 Q_INVOKABLE void simulateConnectionRemoved();
49
50 int vehicleId() const { return _vehicleSystemId; }
51 MAV_AUTOPILOT getFirmwareType() const { return _firmwareType; }
52
53 double vehicleLatitude() const { return _vehicleLatitude; }
54 double vehicleLongitude() const { return _vehicleLongitude; }
55 double vehicleAltitudeAMSL() const { return _vehicleAltitudeAMSL; }
56
57 bool signingEnabled() const { return _signingEnabled; }
58
61
64 void sendStatusTextMessage(uint8_t severity, const QString &text);
65
67 void setCalibrationPose(MockLinkPX4Calibration::Pose pose) const { _mockLinkPX4Calibration->setPose(pose); }
68
69 MockLinkFTP *mockLinkFTP() const;
70
72 void setArmed(bool armed) { if (armed) _mavBaseMode |= MAV_MODE_FLAG_SAFETY_ARMED; else _mavBaseMode &= ~MAV_MODE_FLAG_SAFETY_ARMED; }
73 bool armed() const { return (_mavBaseMode & MAV_MODE_FLAG_SAFETY_ARMED) != 0; }
74
78 void setMissionItemFailureMode(MockLinkMissionItemHandler::FailureMode_t failureMode, MAV_MISSION_RESULT failureAckResult) const { _missionItemHandler->setFailureMode(failureMode, failureAckResult); }
79
81 void sendUnexpectedMissionAck(MAV_MISSION_RESULT ackType) const { _missionItemHandler->sendUnexpectedMissionAck(ackType); }
82
84 void sendUnexpectedMissionItem() const { _missionItemHandler->sendUnexpectedMissionItem(); }
85
87 void sendUnexpectedMissionRequest() const { _missionItemHandler->sendUnexpectedMissionRequest(); }
88
89 void sendUnexpectedCommandAck(MAV_CMD command, MAV_RESULT ackResult);
90
92 void resetMissionItemHandler() const { _missionItemHandler->reset(); }
93
95 void loadSimpleMultirotorMission() const { _missionItemHandler->loadSimpleMultirotorMission(); }
96
98 QString logDownloadFile() const { return _logDownloadFilename; }
99
101 uint8_t outgoingMavlinkChannel() const { return _outgoingMavlinkChannel; }
102
103 void clearReceivedMavCommandCounts() { _receivedMavCommandCountMap.clear(); _receivedMavCommandByCompCountMap.clear(); _receivedRequestMessageByCompAndMsgCountMap.clear(); }
104 int receivedMavCommandCount(MAV_CMD command) const { return _receivedMavCommandCountMap.value(command, 0); }
105 int receivedMavCommandCount(MAV_CMD command, int compId) const { return _receivedMavCommandByCompCountMap.value(command).value(compId, 0); }
106 int receivedRequestMessageCount(int compId, int messageId) const { return _receivedRequestMessageByCompAndMsgCountMap.value(compId).value(messageId, 0); }
107 void clearReceivedRequestMessageCounts() { _receivedRequestMessageCountMap.clear(); _receivedRequestMessageByCompAndMsgCountMap.clear(); }
108 int receivedRequestMessageCount(uint32_t messageId) const { return _receivedRequestMessageCountMap.value(messageId, 0); }
109 void clearReceivedMavlinkMessageCounts() { _receivedMavlinkMessageCountMap.clear(); _lastReceivedMavlinkMessageMap.clear(); _hashCheckRequestCount = 0; _missionItemHandler->clearRequestListCounts(); }
110 int receivedMavlinkMessageCount(uint32_t messageId) const { return _receivedMavlinkMessageCountMap.value(messageId, 0); }
112 bool lastReceivedMavlinkMessage(uint32_t messageId, mavlink_message_t &message) const {
113 if (!_lastReceivedMavlinkMessageMap.contains(messageId)) {
114 return false;
115 }
116 message = _lastReceivedMavlinkMessageMap.value(messageId);
117 return true;
118 }
119 int receivedMissionRequestListCount(MAV_MISSION_TYPE type) const { return _missionItemHandler->requestListCount(type); }
120
127 void setRequestMessageFailureMode(RequestMessageFailureMode_t failureMode) { _requestMessageFailureMode = failureMode; }
128
131 void setRequestMessageNoResponse(uint32_t messageId, bool noResponse = true) {
132 QMutexLocker locker(&_requestMessageNoResponseMutex);
133 if (noResponse) {
134 _requestMessageNoResponseIds.insert(messageId);
135 } else {
136 _requestMessageNoResponseIds.remove(messageId);
137 }
138 }
139
147 _paramSetFailureMode = mode;
148 _paramSetFailureFirstAttemptPending = (mode == FailParamSetFirstAttemptNoAck);
149 }
150
158 _paramRequestReadFailureMode = mode;
159 _paramRequestReadFailureFirstAttemptPending = (mode == FailParamRequestReadFirstAttemptNoResponse);
160 }
161
162 void setHashCheckNoResponse(bool noResponse) { _hashCheckNoResponse = noResponse; }
163
167 void setResetSysAutostartOnParamReset(bool reset) { _resetSysAutostartOnParamReset = reset; }
168
170 int hashCheckRequestCount() const { return _hashCheckRequestCount; }
171
173 void setMockParamValue(int componentId, const QString &paramName, float value);
174
179
182
185 void setAPMMagCalStartFailureMode(bool fail) { _apmMagCalStartFailureMode = fail; }
186
189 void setInt32ParamValue(int componentId, const QString &paramName, int32_t value) { _mapParamName2Value[componentId][paramName] = QVariant::fromValue(value); }
190
193 QVariant paramValue(int componentId, const QString &paramName) const { return _mapParamName2Value.value(componentId).value(paramName); }
194
197 void setRemoteIDArmStatus(uint8_t status, const QString& error);
198
207
212 void servedVideoStream(MockConfiguration::VideoStreamType &type, QString &uri) const;
213
215 MockConfiguration::VideoStreamType requestedVideoStreamType() const { return _requestedVideoStreamType; }
216
217 // Special commands for testing Vehicle::sendMavCommandWithHandler
218 static constexpr MAV_CMD MAV_CMD_MOCKLINK_ALWAYS_RESULT_ACCEPTED = MAV_CMD_USER_1;
219 static constexpr MAV_CMD MAV_CMD_MOCKLINK_ALWAYS_RESULT_FAILED = MAV_CMD_USER_2;
220 static constexpr MAV_CMD MAV_CMD_MOCKLINK_SECOND_ATTEMPT_RESULT_ACCEPTED = MAV_CMD_USER_3;
221 static constexpr MAV_CMD MAV_CMD_MOCKLINK_SECOND_ATTEMPT_RESULT_FAILED = MAV_CMD_USER_4;
222 static constexpr MAV_CMD MAV_CMD_MOCKLINK_NO_RESPONSE = MAV_CMD_USER_5;
223 static constexpr MAV_CMD MAV_CMD_MOCKLINK_NO_RESPONSE_NO_RETRY = static_cast<MAV_CMD>(MAV_CMD_USER_5 + 1);
224 static constexpr MAV_CMD MAV_CMD_MOCKLINK_RESULT_IN_PROGRESS_ACCEPTED = static_cast<MAV_CMD>(MAV_CMD_USER_5 + 2);
225 static constexpr MAV_CMD MAV_CMD_MOCKLINK_RESULT_IN_PROGRESS_FAILED = static_cast<MAV_CMD>(MAV_CMD_USER_5 + 3);
226 static constexpr MAV_CMD MAV_CMD_MOCKLINK_RESULT_IN_PROGRESS_NO_ACK = static_cast<MAV_CMD>(MAV_CMD_USER_5 + 4);
227
228signals:
229 void writeBytesQueuedSignal(const QByteArray &bytes);
230 void highLatencyTransmissionEnabledChanged(bool highLatencyTransmissionEnabled);
231
232private slots:
234 void _writeBytes(const QByteArray &bytes) final;
235 void _writeBytesQueued(const QByteArray &bytes);
236
237private:
238 typedef struct {
239 const char *name;
240 uint8_t standard_mode;
241 uint32_t custom_mode;
242 bool canBeSet;
243 bool advanced;
244 } FlightMode_t;
245
246 bool _connect() final;
247 bool _allocateMavlinkChannel() final;
248 void _freeMavlinkChannel() final;
249
250 bool _incomingMavlinkChannelIsSet() const;
251 bool _outgoingMavlinkChannelIsSet() const;
252
253 void _loadParams();
254 void _resetParamsToDefaults();
255 void _applyAPMFreshFlashState();
256
258 float _floatUnionForParam(int componentId, const QString &paramName);
259 uint32_t _computeParamHash(int componentId) const;
260 void _setParamFloatUnionIntoMap(int componentId, const QString &paramName, float paramFloat);
261
263 void _handleIncomingNSHBytes(const char *bytes, int cBytes);
265 void _handleIncomingMavlinkBytes(const uint8_t *bytes, int cBytes);
267 void _updateIncomingMessageCounts(const mavlink_message_t &msg);
268 void _handleIncomingMavlinkMsg(const mavlink_message_t &msg);
269 void _handleHeartBeat(const mavlink_message_t &msg);
270 void _handleSetMode(const mavlink_message_t &msg);
271 void _handleParamRequestList(const mavlink_message_t &msg);
272 void _handleParamSet(const mavlink_message_t &msg);
273 void _handleParamRequestRead(const mavlink_message_t &msg);
274 void _handleFTP(const mavlink_message_t &msg);
275 void _handleCommandLong(const mavlink_message_t &msg);
276 void _handleCommandInt(const mavlink_message_t &msg);
277 void _handleInProgressCommandLong(const mavlink_command_long_t &request);
278 void _handleCommandLongSetMessageInterval(const mavlink_command_long_t &request, bool &acccepted);
279 void _handleManualControl(const mavlink_message_t &msg);
280 void _handleRCChannelsOverride(const mavlink_message_t &msg);
281 void _handlePreFlightCalibration(const mavlink_command_long_t &request);
282 void _handleTakeoff(const mavlink_command_long_t &request);
283 void _handleLogRequestList(const mavlink_message_t &msg);
284 void _handleLogErase(const mavlink_message_t &msg);
285 void _handleLogRequestData(const mavlink_message_t &msg);
286 void _handleParamMapRC(const mavlink_message_t &msg);
287 void _handleSetupSigning(const mavlink_message_t &msg);
288 void _sendParamError(int componentId, const char *paramId, int16_t paramIndex, uint8_t errorCode);
289 void _handleRequestMessage(const mavlink_command_long_t &request, bool &accepted, bool &noAck);
290 void _handleRequestMessageAutopilotVersion(const mavlink_command_long_t &request, bool &accepted);
291 void _handleRequestMessageDebug(const mavlink_command_long_t &request, bool &accepted, bool &noAck);
292 void _handleRequestMessageAvailableModes(const mavlink_command_long_t &request, bool &accepted);
293
294 void _sendHeartBeat();
295 void _sendHighLatency2();
296 void _sendHomePosition();
297 void _sendGpsRawInt();
298 void _sendGlobalPositionInt();
299 void _sendExtendedSysState();
300 void _sendVibration();
301 void _sendSysStatus();
302 void _sendBatteryStatus();
303 void _sendNamedValueFloats();
304 void _sendDistanceSensors();
305 void _sendChunkedStatusText(uint16_t chunkId, bool missingChunks);
306 void _sendStatusTextMessages();
307 void _respondWithAutopilotVersion();
308 void _sendRCChannels();
309 void _sendADSBVehicles();
310 void _sendGeneralMetaData();
311 void _sendRemoteIDArmStatus();
312 void _sendEscInfo();
313 void _sendEscStatus();
314 void _sendRadioStatus();
315 void _sendAvailableModesMonitor();
316 void _sendAttitudeQuaternion();
317 void _sendAttitudeTarget();
318 void _sendLocalPositionNed();
319 void _sendPositionTargetLocalNed();
320
321 void _paramRequestListWorker();
322 void _logDownloadWorker();
323 void _availableModesWorker();
324 void _apmCompassCalWorker();
325 void _apmAccelCalWorker();
326 void _sendAvailableMode(uint8_t modeIndexOneBased);
327 int _availableModesCount() const;
328 void _moveADSBVehicle(int vehicleIndex);
329
330 static MockLink *_startMockLinkWorker(const QString &configName, MAV_AUTOPILOT firmwareType, MAV_TYPE vehicleType, MockConfiguration::Options options, MockConfiguration::FailureMode_t failureMode, MockConfiguration::VideoStreamType videoStreamType = MockConfiguration::VideoStreamNone);
331 static MockLink *_startMockLink(MockConfiguration *mockConfig);
332
333 void _startVideoStreamServer();
334 void _stopVideoStreamServer();
335
338 static QString _createRandomFile(uint32_t byteCount);
339 QString _createLogContentsFile(const QString &logName);
340
341 QThread *_workerThread = nullptr;
342 MockLinkWorker *_worker = nullptr;
343
344 const MockConfiguration *_mockConfig = nullptr;
345 const MAV_AUTOPILOT _firmwareType = MAV_AUTOPILOT_PX4;
346 const MAV_TYPE _vehicleType = MAV_TYPE_QUADROTOR;
347 const bool _sendStatusText = false;
348 const bool _apmStartFreshParams = false;
349 const bool _enableCamera = false;
350 const bool _enableGimbal = false;
351 const bool _enableProximity = false;
352 const MockConfiguration::FailureMode_t _failureMode = MockConfiguration::FailNone;
353 const bool _stayMavlinkV1 = false;
354 const bool _ftpCapability = false;
355 const uint8_t _vehicleSystemId = 0;
356 const double _vehicleLatitude = 0.0;
357 const double _vehicleLongitude = 0.0;
358 // These are just set for reporting the fields in _respondWithAutopilotVersion()
359 // and ensuring that the Vehicle reports the fields in Vehicle::firmwareBoardVendorId etc.
360 // They do not control any mock simulation (and it is up to the Custom build to do that).
361 const uint16_t _boardVendorId = 0;
362 const uint16_t _boardProductId = 0;
363 MockLinkMissionItemHandler *const _missionItemHandler = nullptr;
364 MockLinkCamera *const _mockLinkCamera = nullptr;
365 MockLinkGimbal *const _mockLinkGimbal = nullptr;
366 MockLinkPX4Calibration *const _mockLinkPX4Calibration = nullptr;
367 MockLinkFTP *const _mockLinkFTP = nullptr;
368
369 const MockConfiguration::VideoStreamType _requestedVideoStreamType = MockConfiguration::VideoStreamNone;
370 MockVideoStreamServer *_videoStreamServer = nullptr;
371 // Served state is written on the connect/disconnect thread and read from the worker
372 // thread (MockLinkCamera), so it is guarded by _videoStreamMutex.
373 mutable QMutex _videoStreamMutex;
374 MockConfiguration::VideoStreamType _servedVideoStreamType = MockConfiguration::VideoStreamNone;
375 QString _videoStreamUri;
376
377 uint8_t _incomingMavlinkChannel = std::numeric_limits<uint8_t>::max();
378 QMutex _incomingMavlinkMutex;
380 uint8_t _outgoingMavlinkChannel = std::numeric_limits<uint8_t>::max();
381
382 mavlink_signing_t _mockSigning{};
383 mavlink_signing_streams_t _mockSigningStreams{};
384
385 bool _connected = false;
386 bool _inNSH = false;
387
388 uint8_t _mavBaseMode = MAV_MODE_FLAG_MANUAL_INPUT_ENABLED | MAV_MODE_FLAG_CUSTOM_MODE_ENABLED;
389 uint32_t _mavCustomMode = PX4CustomMode::MANUAL;
390 uint8_t _mavState = MAV_STATE_STANDBY;
391
392 QElapsedTimer _runningTime;
393 static constexpr int kTestParamRequestListBatch = 25;
394 static constexpr int32_t _batteryMaxTimeRemaining = 15 * 60;
395 int8_t _battery1PctRemaining = 100;
396 int32_t _battery1TimeRemaining = _batteryMaxTimeRemaining;
397 MAV_BATTERY_CHARGE_STATE _battery1ChargeState = MAV_BATTERY_CHARGE_STATE_OK;
398 int8_t _battery2PctRemaining = 100;
399 int32_t _battery2TimeRemaining = _batteryMaxTimeRemaining;
400 MAV_BATTERY_CHARGE_STATE _battery2ChargeState = MAV_BATTERY_CHARGE_STATE_OK;
401
402 double _vehicleAltitudeAMSL = _defaultVehicleHomeAltitude;
403 std::atomic<bool> _commLost = false;
404 bool _mavlinkV2Upgraded = false;
405 bool _signingEnabled = false;
406 bool _highLatencyTransmissionEnabled = true;
407
408 int _sendHomePositionDelayCount = 10;
409 int _sendGPSPositionDelayCount = 100;
410
411 int _currentParamRequestListComponentIndex = -1;
412 int _currentParamRequestListParamIndex = -1;
413 QList<int> _paramRequestListComponentIds;
414 QStringList _paramRequestListParamNames;
418 QMutex _paramRequestListMutex;
419
420 // Mavlink standard modes worker information
421 int _availableModesWorkerNextModeIndex = 0;
425 QMutex _availableModesWorkerMutex;
426 uint8_t _availableModesMonitorSeqNumber = 0;
427
428 QString _logDownloadFilename;
429 bool _logsErased = false;
430 uint16_t _logDownloadId = 0;
431 uint32_t _logDownloadSize = 0;
432 uint32_t _logDownloadCurrentOffset = 0;
433 uint32_t _logDownloadBytesRemaining = 0;
437 QMutex _logDownloadMutex;
438
439 RequestMessageFailureMode_t _requestMessageFailureMode = FailRequestMessageNone;
440 mutable QMutex _requestMessageNoResponseMutex;
441 QSet<uint32_t> _requestMessageNoResponseIds;
442 ParamSetFailureMode_t _paramSetFailureMode = FailParamSetNone;
443 bool _paramSetFailureFirstAttemptPending = false;
444 ParamRequestReadFailureMode_t _paramRequestReadFailureMode = FailParamRequestReadNone;
445 bool _paramRequestReadFailureFirstAttemptPending = false;
446 bool _hashCheckNoResponse = false;
447 int _hashCheckRequestCount = 0;
448 bool _paramRequestListHashCheckSent = false;
449 bool _resetSysAutostartOnParamReset = false;
450
451 // Periodic OPEN_DRONE_ID_ARM_STATUS content (overridable via setRemoteIDArmStatus).
452 // Written by the test (main) thread, read by the 1Hz worker: guarded by _remoteIDArmStatusMutex.
453 QMutex _remoteIDArmStatusMutex;
454 uint8_t _remoteIDArmStatus = MAV_ODID_ARM_STATUS_GOOD_TO_ARM;
455 QString _remoteIDArmStatusError = QStringLiteral("No Error");
456
457 // APM compass calibration worker state
458 // Protects _apmCompassCalProgress: main thread writes 0 to start/stop,
459 // worker thread reads/increments each 100ms tick.
460 mutable QMutex _apmCompassCalMutex;
461 int _apmCompassCalProgress = -1;
462 int _apmCompassCalTickCount = 0;
463 bool _apmStaleFailedMagCalReportStreaming = false;
464 bool _apmMagCalStartFailureMode = false;
465
466 // APM accel calibration worker state
467 // Protects _apmAccelCalPos: main thread writes the starting pos,
468 // worker thread reads and advances through the sequence.
469 QMutex _apmAccelCalMutex;
471 static constexpr ACCELCAL_VEHICLE_POS kAPMAccelCalPosSequence[] = {
472 ACCELCAL_VEHICLE_POS_LEVEL,
473 ACCELCAL_VEHICLE_POS_LEFT,
474 ACCELCAL_VEHICLE_POS_RIGHT,
475 ACCELCAL_VEHICLE_POS_NOSEDOWN,
476 ACCELCAL_VEHICLE_POS_NOSEUP,
477 ACCELCAL_VEHICLE_POS_BACK,
478 };
479 int _apmAccelCalPosIndex = -1;
480 bool _apmAccelCalGotAck = false;
481 int _apmAccelCalTickCount = 0;
482
483 struct RCChannelOverride {
484 enum class State { Ignore, Overridden, Released } state = State::Ignore;
485 uint16_t value = 0;
486 };
487 static constexpr int kRcChannelOverrideChannelCount = 18;
488 std::array<RCChannelOverride, kRcChannelOverrideChannelCount> _rcChannelOverrides;
489
490 QMap<MAV_CMD, int> _receivedMavCommandCountMap;
491 QMap<MAV_CMD, QMap<int, int>> _receivedMavCommandByCompCountMap;
492 QMap<uint32_t, int> _receivedRequestMessageCountMap;
493 QMap<int, QMap<int, int>> _receivedRequestMessageByCompAndMsgCountMap;
494 QMap<uint32_t, int> _receivedMavlinkMessageCountMap;
495 QMap<uint32_t, mavlink_message_t> _lastReceivedMavlinkMessageMap;
496 QMap<int, QMap<QString, QVariant>> _mapParamName2Value;
497 QMap<int, QMap<QString, MAV_PARAM_TYPE>> _mapParamName2MavParamType;
498
499 struct ADSBVehicle {
500 QGeoCoordinate coordinate;
501 double angle = 0.0;
502 double altitude = 0.0;
503 };
504 QList<ADSBVehicle> _adsbVehicles;
505 QList<QGeoCoordinate> _adsbVehicleCoordinates;
506 static constexpr int _numberOfVehicles = 5;
507 double _adsbAngles[_numberOfVehicles]{};
508
509 static std::atomic<int> _nextVehicleSystemId;
510
511 // Vehicle position is set close to default Gazebo vehicle location. This allows for multi-vehicle
512 // testing of a gazebo vehicle and a mocklink vehicle
513 static constexpr double _defaultVehicleLatitude = 47.397;
514 static constexpr double _defaultVehicleLongitude = 8.5455;
515 static constexpr double _defaultVehicleHomeAltitude = 488.056;
516
517 static constexpr const char *_failParam = "COM_FLTMODE6";
518
519 static constexpr uint8_t _vehicleComponentId = MAV_COMP_ID_AUTOPILOT1;
520
521 static constexpr uint16_t _logDownloadLogId = 0;
522 static constexpr uint32_t _logDownloadFileSize = 1000;
523
524 static constexpr bool _mavlinkStarted = true;
525
529 inline static const QSet<QString> kAPMCalOffsetParams = {
530 QStringLiteral("COMPASS_OFS_X"), QStringLiteral("COMPASS_OFS_Y"), QStringLiteral("COMPASS_OFS_Z"),
531 QStringLiteral("COMPASS_OFS2_X"), QStringLiteral("COMPASS_OFS2_Y"), QStringLiteral("COMPASS_OFS2_Z"),
532 QStringLiteral("COMPASS_OFS3_X"), QStringLiteral("COMPASS_OFS3_Y"), QStringLiteral("COMPASS_OFS3_Z"),
533 QStringLiteral("INS_ACCOFFS_X"), QStringLiteral("INS_ACCOFFS_Y"), QStringLiteral("INS_ACCOFFS_Z"),
534 };
535
536 static QList<FlightMode_t> _availableFlightModes;
537
538 std::atomic<bool> _disconnectedEmitted{false};
539};
Config config
std::shared_ptr< LinkConfiguration > SharedLinkConfigurationPtr
Error error
struct __mavlink_message mavlink_message_t
struct __mavlink_command_long_t mavlink_command_long_t
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:16
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...