46 Q_INVOKABLE
void setCommLost(
bool commLost) { _commLost = commLost; }
71 void setArmed(
bool armed) {
if (
armed) _mavBaseMode |= MAV_MODE_FLAG_SAFETY_ARMED;
else _mavBaseMode &= ~MAV_MODE_FLAG_SAFETY_ARMED; }
72 bool armed()
const {
return (_mavBaseMode & MAV_MODE_FLAG_SAFETY_ARMED) != 0; }
99 void clearReceivedMavCommandCounts() { _receivedMavCommandCountMap.clear(); _receivedMavCommandByCompCountMap.clear(); _receivedRequestMessageByCompAndMsgCountMap.clear(); }
101 int receivedMavCommandCount(MAV_CMD command,
int compId)
const {
return _receivedMavCommandByCompCountMap.value(command).value(compId, 0); }
102 int receivedRequestMessageCount(
int compId,
int messageId)
const {
return _receivedRequestMessageByCompAndMsgCountMap.value(compId).value(messageId, 0); }
120 QMutexLocker locker(&_requestMessageNoResponseMutex);
122 _requestMessageNoResponseIds.insert(messageId);
124 _requestMessageNoResponseIds.remove(messageId);
135 _paramSetFailureMode = mode;
146 _paramRequestReadFailureMode = mode;
165 void setInt32ParamValue(
int componentId,
const QString ¶mName, int32_t value) { _mapParamName2Value[componentId][paramName] = QVariant::fromValue(value); }
169 QVariant
paramValue(
int componentId,
const QString ¶mName)
const {
return _mapParamName2Value.value(componentId).value(paramName); }
197 void _writeBytes(
const QByteArray &bytes)
final;
198 void _writeBytesQueued(
const QByteArray &bytes);
203 uint8_t standard_mode;
204 uint32_t custom_mode;
209 bool _connect() final;
210 bool _allocateMavlinkChannel() final;
211 void _freeMavlinkChannel() final;
213 bool _incomingMavlinkChannelIsSet() const;
214 bool _outgoingMavlinkChannelIsSet() const;
217 void _resetParamsToDefaults();
220 float _floatUnionForParam(
int componentId, const QString ¶mName);
221 uint32_t _computeParamHash(
int componentId) const;
222 void _setParamFloatUnionIntoMap(
int componentId, const QString ¶mName,
float paramFloat);
225 void _handleIncomingNSHBytes(const
char *bytes,
int cBytes);
227 void _handleIncomingMavlinkBytes(const uint8_t *bytes,
int cBytes);
249 void _sendParamError(
int componentId, const
char *paramId, int16_t paramIndex, uint8_t errorCode);
255 void _sendHeartBeat();
256 void _sendHighLatency2();
257 void _sendHomePosition();
258 void _sendGpsRawInt();
259 void _sendGlobalPositionInt();
260 void _sendExtendedSysState();
261 void _sendVibration();
262 void _sendSysStatus();
263 void _sendBatteryStatus();
264 void _sendNamedValueFloats();
265 void _sendChunkedStatusText(uint16_t chunkId,
bool missingChunks);
266 void _sendStatusTextMessages();
267 void _respondWithAutopilotVersion();
268 void _sendRCChannels();
269 void _sendADSBVehicles();
270 void _sendGeneralMetaData();
271 void _sendRemoteIDArmStatus();
273 void _sendEscStatus();
274 void _sendRadioStatus();
275 void _sendAvailableModesMonitor();
276 void _sendAttitudeQuaternion();
277 void _sendAttitudeTarget();
278 void _sendLocalPositionNed();
279 void _sendPositionTargetLocalNed();
281 void _paramRequestListWorker();
282 void _logDownloadWorker();
283 void _availableModesWorker();
284 void _apmCompassCalWorker();
285 void _apmAccelCalWorker();
286 void _sendAvailableMode(uint8_t modeIndexOneBased);
287 int _availableModesCount() const;
288 void _moveADSBVehicle(
int vehicleIndex);
290 static
MockLink *_startMockLinkWorker(const QString &configName, MAV_AUTOPILOT firmwareType, MAV_TYPE vehicleType,
bool sendStatusText,
bool enableCamera,
bool enableGimbal,
MockConfiguration::FailureMode_t failureMode,
bool preloadMission = false);
295 static QString _createRandomFile(uint32_t byteCount);
297 QThread *_workerThread =
nullptr;
301 const MAV_AUTOPILOT _firmwareType = MAV_AUTOPILOT_PX4;
302 const MAV_TYPE _vehicleType = MAV_TYPE_QUADROTOR;
303 const
bool _sendStatusText = false;
304 const
bool _enableCamera = false;
305 const
bool _enableGimbal = false;
307 const uint8_t _vehicleSystemId = 0;
308 const
double _vehicleLatitude = 0.0;
309 const
double _vehicleLongitude = 0.0;
313 const uint16_t _boardVendorId = 0;
314 const uint16_t _boardProductId = 0;
321 uint8_t _incomingMavlinkChannel = std::numeric_limits<uint8_t>::max();
322 QMutex _incomingMavlinkMutex;
324 uint8_t _outgoingMavlinkChannel = std::numeric_limits<uint8_t>::max();
326 mavlink_signing_t _mockSigning{};
327 mavlink_signing_streams_t _mockSigningStreams{};
329 bool _connected =
false;
332 uint8_t _mavBaseMode = MAV_MODE_FLAG_MANUAL_INPUT_ENABLED | MAV_MODE_FLAG_CUSTOM_MODE_ENABLED;
334 uint8_t _mavState = MAV_STATE_STANDBY;
336 QElapsedTimer _runningTime;
337 static constexpr int kTestParamRequestListBatch = 25;
338 static constexpr int32_t _batteryMaxTimeRemaining = 15 * 60;
339 int8_t _battery1PctRemaining = 100;
340 int32_t _battery1TimeRemaining = _batteryMaxTimeRemaining;
341 MAV_BATTERY_CHARGE_STATE _battery1ChargeState = MAV_BATTERY_CHARGE_STATE_OK;
342 int8_t _battery2PctRemaining = 100;
343 int32_t _battery2TimeRemaining = _batteryMaxTimeRemaining;
344 MAV_BATTERY_CHARGE_STATE _battery2ChargeState = MAV_BATTERY_CHARGE_STATE_OK;
346 double _vehicleAltitudeAMSL = _defaultVehicleHomeAltitude;
347 std::atomic<bool> _commLost =
false;
348 bool _signingEnabled =
false;
349 bool _highLatencyTransmissionEnabled =
true;
351 int _sendHomePositionDelayCount = 10;
352 int _sendGPSPositionDelayCount = 100;
354 int _currentParamRequestListComponentIndex = -1;
355 int _currentParamRequestListParamIndex = -1;
356 QList<int> _paramRequestListComponentIds;
357 QStringList _paramRequestListParamNames;
361 QMutex _paramRequestListMutex;
364 int _availableModesWorkerNextModeIndex = 0;
368 QMutex _availableModesWorkerMutex;
369 uint8_t _availableModesMonitorSeqNumber = 0;
371 QString _logDownloadFilename;
372 uint32_t _logDownloadCurrentOffset = 0;
373 uint32_t _logDownloadBytesRemaining = 0;
377 QMutex _logDownloadMutex;
380 mutable QMutex _requestMessageNoResponseMutex;
381 QSet<uint32_t> _requestMessageNoResponseIds;
383 bool _paramSetFailureFirstAttemptPending =
false;
385 bool _paramRequestReadFailureFirstAttemptPending =
false;
386 bool _hashCheckNoResponse =
false;
387 int _hashCheckRequestCount = 0;
388 bool _paramRequestListHashCheckSent =
false;
389 bool _resetSysAutostartOnParamReset =
false;
394 QMutex _apmCompassCalMutex;
395 int _apmCompassCalProgress = -1;
396 int _apmCompassCalTickCount = 0;
401 QMutex _apmAccelCalMutex;
403 static constexpr ACCELCAL_VEHICLE_POS kAPMAccelCalPosSequence[] = {
404 ACCELCAL_VEHICLE_POS_LEVEL,
405 ACCELCAL_VEHICLE_POS_LEFT,
406 ACCELCAL_VEHICLE_POS_RIGHT,
407 ACCELCAL_VEHICLE_POS_NOSEDOWN,
408 ACCELCAL_VEHICLE_POS_NOSEUP,
409 ACCELCAL_VEHICLE_POS_BACK,
411 int _apmAccelCalPosIndex = -1;
412 bool _apmAccelCalGotAck =
false;
413 int _apmAccelCalTickCount = 0;
415 struct RCChannelOverride {
416 enum class State { Ignore, Overridden, Released } state = State::Ignore;
419 static constexpr int kRcChannelOverrideChannelCount = 18;
420 std::array<RCChannelOverride, kRcChannelOverrideChannelCount> _rcChannelOverrides;
422 QMap<MAV_CMD, int> _receivedMavCommandCountMap;
423 QMap<MAV_CMD, QMap<int, int>> _receivedMavCommandByCompCountMap;
424 QMap<uint32_t, int> _receivedRequestMessageCountMap;
425 QMap<int, QMap<int, int>> _receivedRequestMessageByCompAndMsgCountMap;
426 QMap<uint32_t, int> _receivedMavlinkMessageCountMap;
427 QMap<int, QMap<QString, QVariant>> _mapParamName2Value;
428 QMap<int, QMap<QString, MAV_PARAM_TYPE>> _mapParamName2MavParamType;
431 QGeoCoordinate coordinate;
433 double altitude = 0.0;
435 QList<ADSBVehicle> _adsbVehicles;
436 QList<QGeoCoordinate> _adsbVehicleCoordinates;
437 static constexpr int _numberOfVehicles = 5;
438 double _adsbAngles[_numberOfVehicles]{};
440 static std::atomic<int> _nextVehicleSystemId;
444 static constexpr double _defaultVehicleLatitude = 47.397;
445 static constexpr double _defaultVehicleLongitude = 8.5455;
446 static constexpr double _defaultVehicleHomeAltitude = 488.056;
448 static constexpr const char *_failParam =
"COM_FLTMODE6";
450 static constexpr uint8_t _vehicleComponentId = MAV_COMP_ID_AUTOPILOT1;
452 static constexpr uint16_t _logDownloadLogId = 0;
453 static constexpr uint32_t _logDownloadFileSize = 1000;
455 static constexpr bool _mavlinkStarted =
true;
460 inline static const QSet<QString> kAPMCalOffsetParams = {
461 QStringLiteral(
"COMPASS_OFS_X"), QStringLiteral(
"COMPASS_OFS_Y"), QStringLiteral(
"COMPASS_OFS_Z"),
462 QStringLiteral(
"COMPASS_OFS2_X"), QStringLiteral(
"COMPASS_OFS2_Y"), QStringLiteral(
"COMPASS_OFS2_Z"),
463 QStringLiteral(
"COMPASS_OFS3_X"), QStringLiteral(
"COMPASS_OFS3_Y"), QStringLiteral(
"COMPASS_OFS3_Z"),
464 QStringLiteral(
"INS_ACCOFFS_X"), QStringLiteral(
"INS_ACCOFFS_Y"), QStringLiteral(
"INS_ACCOFFS_Z"),
467 static QList<FlightMode_t> _availableFlightModes;
469 std::atomic<bool> _disconnectedEmitted{
false};