38 void sendStatusTextMessages();
43 void disconnect() final;
45 Q_INVOKABLE
void setCommLost(
bool commLost) { _commLost = commLost; }
46 Q_INVOKABLE
void simulateConnectionRemoved();
74 void sendUnexpectedCommandAck(MAV_CMD command, MAV_RESULT ackResult);
82 void clearReceivedMavCommandCounts() { _receivedMavCommandCountMap.clear(); _receivedMavCommandByCompCountMap.clear(); _receivedRequestMessageByCompAndMsgCountMap.clear(); }
84 int receivedMavCommandCount(MAV_CMD command,
int compId)
const {
return _receivedMavCommandByCompCountMap.value(command).value(compId, 0); }
85 int receivedRequestMessageCount(
int compId,
int messageId)
const {
return _receivedRequestMessageByCompAndMsgCountMap.value(compId).value(messageId, 0); }
102 QMutexLocker locker(&_requestMessageNoResponseMutex);
104 _requestMessageNoResponseIds.insert(messageId);
106 _requestMessageNoResponseIds.remove(messageId);
116 _paramSetFailureMode = mode;
117 _paramSetFailureFirstAttemptPending = (mode == FailParamSetFirstAttemptNoAck);
126 _paramRequestReadFailureMode = mode;
127 _paramRequestReadFailureFirstAttemptPending = (mode == FailParamRequestReadFirstAttemptNoResponse);
136 void setMockParamValue(
int componentId,
const QString ¶mName,
float value);
138 static MockLink *startPX4MockLink(
bool sendStatusText,
bool enableCamera,
bool enableGimbal, MockConfiguration::FailureMode_t failureMode = MockConfiguration::FailNone);
139 static MockLink *startGenericMockLink(
bool sendStatusText,
bool enableCamera,
bool enableGimbal, MockConfiguration::FailureMode_t failureMode = MockConfiguration::FailNone);
140 static MockLink *startNoInitialConnectMockLink(
bool sendStatusText,
bool enableCamera,
bool enableGimbal, MockConfiguration::FailureMode_t failureMode = MockConfiguration::FailNone);
141 static MockLink *startAPMArduCopterMockLink(
bool sendStatusText,
bool enableCamera,
bool enableGimbal, MockConfiguration::FailureMode_t failureMode = MockConfiguration::FailNone);
142 static MockLink *startAPMArduPlaneMockLink(
bool sendStatusText,
bool enableCamera,
bool enableGimbal, MockConfiguration::FailureMode_t failureMode = MockConfiguration::FailNone);
143 static MockLink *startAPMArduSubMockLink(
bool sendStatusText,
bool enableCamera,
bool enableGimbal, MockConfiguration::FailureMode_t failureMode = MockConfiguration::FailNone);
144 static MockLink *startAPMArduRoverMockLink(
bool sendStatusText,
bool enableCamera,
bool enableGimbal, MockConfiguration::FailureMode_t failureMode = MockConfiguration::FailNone);
147 static constexpr MAV_CMD MAV_CMD_MOCKLINK_ALWAYS_RESULT_ACCEPTED = MAV_CMD_USER_1;
148 static constexpr MAV_CMD MAV_CMD_MOCKLINK_ALWAYS_RESULT_FAILED = MAV_CMD_USER_2;
149 static constexpr MAV_CMD MAV_CMD_MOCKLINK_SECOND_ATTEMPT_RESULT_ACCEPTED = MAV_CMD_USER_3;
150 static constexpr MAV_CMD MAV_CMD_MOCKLINK_SECOND_ATTEMPT_RESULT_FAILED = MAV_CMD_USER_4;
151 static constexpr MAV_CMD MAV_CMD_MOCKLINK_NO_RESPONSE = MAV_CMD_USER_5;
152 static constexpr MAV_CMD MAV_CMD_MOCKLINK_NO_RESPONSE_NO_RETRY =
static_cast<MAV_CMD
>(MAV_CMD_USER_5 + 1);
153 static constexpr MAV_CMD MAV_CMD_MOCKLINK_RESULT_IN_PROGRESS_ACCEPTED =
static_cast<MAV_CMD
>(MAV_CMD_USER_5 + 2);
154 static constexpr MAV_CMD MAV_CMD_MOCKLINK_RESULT_IN_PROGRESS_FAILED =
static_cast<MAV_CMD
>(MAV_CMD_USER_5 + 3);
155 static constexpr MAV_CMD MAV_CMD_MOCKLINK_RESULT_IN_PROGRESS_NO_ACK =
static_cast<MAV_CMD
>(MAV_CMD_USER_5 + 4);
163 void _writeBytes(
const QByteArray &bytes)
final;
164 void _writeBytesQueued(
const QByteArray &bytes);
169 uint8_t standard_mode;
170 uint32_t custom_mode;
175 bool _connect() final;
176 bool _allocateMavlinkChannel() final;
177 void _freeMavlinkChannel() final;
179 uint8_t _getMavlinkAuxChannel()
const {
return _mavlinkAuxChannel; }
180 bool _mavlinkAuxChannelIsSet()
const;
185 float _floatUnionForParam(
int componentId,
const QString ¶mName);
186 uint32_t _computeParamHash(
int componentId)
const;
187 void _setParamFloatUnionIntoMap(
int componentId,
const QString ¶mName,
float paramFloat);
190 void _handleIncomingNSHBytes(
const char *bytes,
int cBytes);
192 void _handleIncomingMavlinkBytes(
const uint8_t *bytes,
int cBytes);
203 void _handleInProgressCommandLong(
const mavlink_command_long_t &request);
204 void _handleCommandLongSetMessageInterval(
const mavlink_command_long_t &request,
bool &acccepted);
206 void _handlePreFlightCalibration(
const mavlink_command_long_t &request);
207 void _handleTakeoff(
const mavlink_command_long_t &request);
211 void _handleRequestMessage(
const mavlink_command_long_t &request,
bool &accepted,
bool &noAck);
212 void _handleRequestMessageAutopilotVersion(
const mavlink_command_long_t &request,
bool &accepted);
213 void _handleRequestMessageDebug(
const mavlink_command_long_t &request,
bool &accepted,
bool &noAck);
214 void _handleRequestMessageAvailableModes(
const mavlink_command_long_t &request,
bool &accepted);
216 void _sendHeartBeat();
217 void _sendHighLatency2();
218 void _sendHomePosition();
219 void _sendGpsRawInt();
220 void _sendGlobalPositionInt();
221 void _sendExtendedSysState();
222 void _sendVibration();
223 void _sendSysStatus();
224 void _sendBatteryStatus();
225 void _sendChunkedStatusText(uint16_t chunkId,
bool missingChunks);
226 void _sendStatusTextMessages();
227 void _respondWithAutopilotVersion();
228 void _sendRCChannels();
229 void _sendADSBVehicles();
230 void _sendGeneralMetaData();
231 void _sendRemoteIDArmStatus();
232 void _sendAvailableModesMonitor();
234 void _paramRequestListWorker();
235 void _logDownloadWorker();
236 void _availableModesWorker();
237 void _sendAvailableMode(uint8_t modeIndexOneBased);
238 int _availableModesCount()
const;
239 void _moveADSBVehicle(
int vehicleIndex);
241 static MockLink *_startMockLinkWorker(
const QString &configName, MAV_AUTOPILOT firmwareType, MAV_TYPE vehicleType,
bool sendStatusText,
bool enableCamera,
bool enableGimbal, MockConfiguration::FailureMode_t failureMode);
246 static QString _createRandomFile(uint32_t byteCount);
248 QThread *_workerThread =
nullptr;
252 const MAV_AUTOPILOT _firmwareType = MAV_AUTOPILOT_PX4;
253 const MAV_TYPE _vehicleType = MAV_TYPE_QUADROTOR;
254 const bool _sendStatusText =
false;
255 const bool _enableCamera =
false;
256 const bool _enableGimbal =
false;
257 const MockConfiguration::FailureMode_t _failureMode = MockConfiguration::FailNone;
258 const uint8_t _vehicleSystemId = 0;
259 const double _vehicleLatitude = 0.0;
260 const double _vehicleLongitude = 0.0;
264 const uint16_t _boardVendorId = 0;
265 const uint16_t _boardProductId = 0;
271 uint8_t _mavlinkAuxChannel = std::numeric_limits<uint8_t>::max();
272 QMutex _mavlinkAuxMutex;
274 bool _connected =
false;
277 uint8_t _mavBaseMode = MAV_MODE_FLAG_MANUAL_INPUT_ENABLED | MAV_MODE_FLAG_CUSTOM_MODE_ENABLED;
279 uint8_t _mavState = MAV_STATE_STANDBY;
281 QElapsedTimer _runningTime;
282 static constexpr int32_t _batteryMaxTimeRemaining = 15 * 60;
283 int8_t _battery1PctRemaining = 100;
284 int32_t _battery1TimeRemaining = _batteryMaxTimeRemaining;
285 MAV_BATTERY_CHARGE_STATE _battery1ChargeState = MAV_BATTERY_CHARGE_STATE_OK;
286 int8_t _battery2PctRemaining = 100;
287 int32_t _battery2TimeRemaining = _batteryMaxTimeRemaining;
288 MAV_BATTERY_CHARGE_STATE _battery2ChargeState = MAV_BATTERY_CHARGE_STATE_OK;
290 double _vehicleAltitudeAMSL = _defaultVehicleHomeAltitude;
291 bool _commLost =
false;
292 bool _highLatencyTransmissionEnabled =
true;
294 int _sendHomePositionDelayCount = 10;
295 int _sendGPSPositionDelayCount = 100;
297 int _currentParamRequestListComponentIndex = -1;
298 int _currentParamRequestListParamIndex = -1;
299 QList<int> _paramRequestListComponentIds;
300 QStringList _paramRequestListParamNames;
304 QMutex _paramRequestListMutex;
307 int _availableModesWorkerNextModeIndex = 0;
311 QMutex _availableModesWorkerMutex;
312 uint8_t _availableModesMonitorSeqNumber = 0;
314 QString _logDownloadFilename;
315 uint32_t _logDownloadCurrentOffset = 0;
316 uint32_t _logDownloadBytesRemaining = 0;
320 QMutex _logDownloadMutex;
322 RequestMessageFailureMode_t _requestMessageFailureMode = FailRequestMessageNone;
323 mutable QMutex _requestMessageNoResponseMutex;
324 QSet<uint32_t> _requestMessageNoResponseIds;
325 ParamSetFailureMode_t _paramSetFailureMode = FailParamSetNone;
326 bool _paramSetFailureFirstAttemptPending =
false;
327 ParamRequestReadFailureMode_t _paramRequestReadFailureMode = FailParamRequestReadNone;
328 bool _paramRequestReadFailureFirstAttemptPending =
false;
329 bool _hashCheckNoResponse =
false;
330 int _hashCheckRequestCount = 0;
331 bool _paramRequestListHashCheckSent =
false;
333 QMap<MAV_CMD, int> _receivedMavCommandCountMap;
334 QMap<MAV_CMD, QMap<int, int>> _receivedMavCommandByCompCountMap;
335 QMap<uint32_t, int> _receivedRequestMessageCountMap;
336 QMap<int, QMap<int, int>> _receivedRequestMessageByCompAndMsgCountMap;
337 QMap<uint32_t, int> _receivedMavlinkMessageCountMap;
338 QMap<int, QMap<QString, QVariant>> _mapParamName2Value;
339 QMap<int, QMap<QString, MAV_PARAM_TYPE>> _mapParamName2MavParamType;
342 QGeoCoordinate coordinate;
344 double altitude = 0.0;
346 QList<ADSBVehicle> _adsbVehicles;
347 QList<QGeoCoordinate> _adsbVehicleCoordinates;
348 static constexpr int _numberOfVehicles = 5;
349 double _adsbAngles[_numberOfVehicles]{};
351 static std::atomic<int> _nextVehicleSystemId;
355 static constexpr double _defaultVehicleLatitude = 47.397;
356 static constexpr double _defaultVehicleLongitude = 8.5455;
357 static constexpr double _defaultVehicleHomeAltitude = 488.056;
359 static constexpr const char *_failParam =
"COM_FLTMODE6";
361 static constexpr uint8_t _vehicleComponentId = MAV_COMP_ID_AUTOPILOT1;
363 static constexpr uint16_t _logDownloadLogId = 0;
364 static constexpr uint32_t _logDownloadFileSize = 1000;
366 static constexpr bool _mavlinkStarted =
true;
368 static QList<FlightMode_t> _availableFlightModes;
370 std::atomic<bool> _disconnectedEmitted{
false};