50 Q_INVOKABLE
void setCommLost(
bool commLost) { _commLost = commLost; }
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; }
115 void clearReceivedMavCommandCounts() { _receivedMavCommandCountMap.clear(); _receivedMavCommandByCompCountMap.clear(); _receivedRequestMessageByCompAndMsgCountMap.clear(); }
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); }
125 if (!_lastReceivedMavlinkMessageMap.contains(messageId)) {
128 message = _lastReceivedMavlinkMessageMap.value(messageId);
151 QMutexLocker locker(&_requestMessageNoResponseMutex);
153 _requestMessageNoResponseIds.insert(messageId);
155 _requestMessageNoResponseIds.remove(messageId);
166 _paramSetFailureMode = mode;
177 _paramRequestReadFailureMode = mode;
210 void setInt32ParamValue(
int componentId,
const QString ¶mName, int32_t value) { _mapParamName2Value[componentId][paramName] = QVariant::fromValue(value); }
214 QVariant
paramValue(
int componentId,
const QString ¶mName)
const {
return _mapParamName2Value.value(componentId).value(paramName); }
257 void _writeBytes(
const QByteArray &bytes)
final;
258 void _writeBytesQueued(
const QByteArray &bytes);
263 uint8_t standard_mode;
264 uint32_t custom_mode;
269 bool _connect() final;
270 bool _allocateMavlinkChannel() final;
271 void _freeMavlinkChannel() final;
273 bool _incomingMavlinkChannelIsSet() const;
274 bool _outgoingMavlinkChannelIsSet() const;
277 void _resetParamsToDefaults();
278 void _applyAPMFreshFlashState();
281 float _floatUnionForParam(
int componentId, const QString ¶mName);
282 uint32_t _computeParamHash(
int componentId) const;
283 void _setParamFloatUnionIntoMap(
int componentId, const QString ¶mName,
float paramFloat);
286 void _handleIncomingNSHBytes(const
char *bytes,
int cBytes);
288 void _handleIncomingMavlinkBytes(const uint8_t *bytes,
int cBytes);
297 bool _shouldSkipParamSend(
int componentId, const QString ¶mName,
int paramIndex) const;
298 bool _shouldSkipParamRead(
int componentId, const QString ¶mName,
int paramIndex);
299 bool _hasNonDefaultParamComponent() const;
314 void _sendParamError(
int componentId, const
char *paramId, int16_t paramIndex, uint8_t errorCode);
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();
339 void _sendEscStatus();
340 void _sendRadioStatus();
341 void _sendAvailableModesMonitor();
342 void _sendAttitudeQuaternion();
343 void _sendAttitudeTarget();
344 void _sendLocalPositionNed();
345 void _sendPositionTargetLocalNed();
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);
359 void _startVideoStreamServer();
360 void _stopVideoStreamServer();
364 static QString _createRandomFile(uint32_t byteCount);
365 QString _createLogContentsFile(const QString &logName);
367 QThread *_workerThread =
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();
380 const
bool _stayMavlinkV1 = false;
381 const
bool _ftpCapability = false;
382 const
bool _sendRadioStatusEnabled = true;
383 const uint8_t _vehicleSystemId = 0;
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;
393 const uint16_t _boardVendorId = 0;
394 const uint16_t _boardProductId = 0;
402 struct AttitudeOverride {
403 bool enabled =
false;
404 float rollRad = 0.0f;
405 float pitchRad = 0.0f;
408 mutable QMutex _attitudeOverrideMutex;
409 AttitudeOverride _attitudeOverride;
415 mutable QMutex _videoStreamMutex;
417 QString _videoStreamUri;
419 uint8_t _incomingMavlinkChannel = std::numeric_limits<uint8_t>::max();
420 QMutex _incomingMavlinkMutex;
422 uint8_t _outgoingMavlinkChannel = std::numeric_limits<uint8_t>::max();
424 mavlink_signing_t _mockSigning{};
425 mavlink_signing_streams_t _mockSigningStreams{};
427 bool _connected =
false;
430 uint8_t _mavBaseMode = MAV_MODE_FLAG_MANUAL_INPUT_ENABLED | MAV_MODE_FLAG_CUSTOM_MODE_ENABLED;
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;
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;
450 int _sendHomePositionDelayCount = 10;
451 int _sendGPSPositionDelayCount = 100;
453 int _currentParamRequestListComponentIndex = -1;
454 int _currentParamRequestListParamIndex = -1;
455 QList<int> _paramRequestListComponentIds;
456 QStringList _paramRequestListParamNames;
460 QMutex _paramRequestListMutex;
463 int _availableModesWorkerNextModeIndex = 0;
467 QMutex _availableModesWorkerMutex;
470 std::atomic<uint8_t> _availableModesMonitorSeqNumber = 0;
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;
484 mutable QMutex _requestMessageNoResponseMutex;
485 QSet<uint32_t> _requestMessageNoResponseIds;
487 bool _paramSetFailureFirstAttemptPending =
false;
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;
498 QMutex _remoteIDArmStatusMutex;
499 uint8_t _remoteIDArmStatus = MAV_ODID_ARM_STATUS_GOOD_TO_ARM;
500 QString _remoteIDArmStatusError = QStringLiteral(
"No Error");
505 mutable QMutex _apmCompassCalMutex;
506 int _apmCompassCalProgress = -1;
507 int _apmCompassCalTickCount = 0;
508 bool _apmStaleFailedMagCalReportStreaming =
false;
509 bool _apmMagCalStartFailureMode =
false;
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,
524 int _apmAccelCalPosIndex = -1;
525 bool _apmAccelCalGotAck =
false;
526 int _apmAccelCalTickCount = 0;
528 struct RCChannelOverride {
529 enum class State { Ignore, Overridden, Released } state = State::Ignore;
532 static constexpr int kRcChannelOverrideChannelCount = 18;
533 std::array<RCChannelOverride, kRcChannelOverrideChannelCount> _rcChannelOverrides;
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;
547 double altitude = 0.0;
549 QList<ADSBVehicle> _adsbVehicles;
550 QList<QGeoCoordinate> _adsbVehicleCoordinates;
551 static constexpr int _numberOfVehicles = 5;
552 double _adsbAngles[_numberOfVehicles]{};
554 static std::atomic<int> _nextVehicleSystemId;
556 static constexpr const char *_failParam =
"COM_FLTMODE6";
558 static constexpr uint8_t _vehicleComponentId = MAV_COMP_ID_AUTOPILOT1;
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;
567 static constexpr uint16_t _logDownloadLogId = 0;
568 static constexpr uint32_t _logDownloadFileSize = 1000;
570 static constexpr bool _mavlinkStarted =
true;
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"),
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;
589 const QList<FlightMode_t> &_flightModeList()
const;
591 std::atomic<bool> _disconnectedEmitted{
false};