47 Q_INVOKABLE
void setCommLost(
bool commLost) { _commLost = commLost; }
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; }
103 void clearReceivedMavCommandCounts() { _receivedMavCommandCountMap.clear(); _receivedMavCommandByCompCountMap.clear(); _receivedRequestMessageByCompAndMsgCountMap.clear(); }
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); }
113 if (!_lastReceivedMavlinkMessageMap.contains(messageId)) {
116 message = _lastReceivedMavlinkMessageMap.value(messageId);
132 QMutexLocker locker(&_requestMessageNoResponseMutex);
134 _requestMessageNoResponseIds.insert(messageId);
136 _requestMessageNoResponseIds.remove(messageId);
147 _paramSetFailureMode = mode;
158 _paramRequestReadFailureMode = mode;
189 void setInt32ParamValue(
int componentId,
const QString ¶mName, int32_t value) { _mapParamName2Value[componentId][paramName] = QVariant::fromValue(value); }
193 QVariant
paramValue(
int componentId,
const QString ¶mName)
const {
return _mapParamName2Value.value(componentId).value(paramName); }
234 void _writeBytes(
const QByteArray &bytes)
final;
235 void _writeBytesQueued(
const QByteArray &bytes);
240 uint8_t standard_mode;
241 uint32_t custom_mode;
246 bool _connect() final;
247 bool _allocateMavlinkChannel() final;
248 void _freeMavlinkChannel() final;
250 bool _incomingMavlinkChannelIsSet() const;
251 bool _outgoingMavlinkChannelIsSet() const;
254 void _resetParamsToDefaults();
255 void _applyAPMFreshFlashState();
258 float _floatUnionForParam(
int componentId, const QString ¶mName);
259 uint32_t _computeParamHash(
int componentId) const;
260 void _setParamFloatUnionIntoMap(
int componentId, const QString ¶mName,
float paramFloat);
263 void _handleIncomingNSHBytes(const
char *bytes,
int cBytes);
265 void _handleIncomingMavlinkBytes(const uint8_t *bytes,
int cBytes);
288 void _sendParamError(
int componentId, const
char *paramId, int16_t paramIndex, uint8_t errorCode);
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();
313 void _sendEscStatus();
314 void _sendRadioStatus();
315 void _sendAvailableModesMonitor();
316 void _sendAttitudeQuaternion();
317 void _sendAttitudeTarget();
318 void _sendLocalPositionNed();
319 void _sendPositionTargetLocalNed();
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);
333 void _startVideoStreamServer();
334 void _stopVideoStreamServer();
338 static QString _createRandomFile(uint32_t byteCount);
339 QString _createLogContentsFile(const QString &logName);
341 QThread *_workerThread =
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;
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;
361 const uint16_t _boardVendorId = 0;
362 const uint16_t _boardProductId = 0;
373 mutable QMutex _videoStreamMutex;
375 QString _videoStreamUri;
377 uint8_t _incomingMavlinkChannel = std::numeric_limits<uint8_t>::max();
378 QMutex _incomingMavlinkMutex;
380 uint8_t _outgoingMavlinkChannel = std::numeric_limits<uint8_t>::max();
382 mavlink_signing_t _mockSigning{};
383 mavlink_signing_streams_t _mockSigningStreams{};
385 bool _connected =
false;
388 uint8_t _mavBaseMode = MAV_MODE_FLAG_MANUAL_INPUT_ENABLED | MAV_MODE_FLAG_CUSTOM_MODE_ENABLED;
390 uint8_t _mavState = MAV_STATE_STANDBY;
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;
402 double _vehicleAltitudeAMSL = _defaultVehicleHomeAltitude;
403 std::atomic<bool> _commLost =
false;
404 bool _mavlinkV2Upgraded =
false;
405 bool _signingEnabled =
false;
406 bool _highLatencyTransmissionEnabled =
true;
408 int _sendHomePositionDelayCount = 10;
409 int _sendGPSPositionDelayCount = 100;
411 int _currentParamRequestListComponentIndex = -1;
412 int _currentParamRequestListParamIndex = -1;
413 QList<int> _paramRequestListComponentIds;
414 QStringList _paramRequestListParamNames;
418 QMutex _paramRequestListMutex;
421 int _availableModesWorkerNextModeIndex = 0;
425 QMutex _availableModesWorkerMutex;
426 uint8_t _availableModesMonitorSeqNumber = 0;
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;
440 mutable QMutex _requestMessageNoResponseMutex;
441 QSet<uint32_t> _requestMessageNoResponseIds;
443 bool _paramSetFailureFirstAttemptPending =
false;
445 bool _paramRequestReadFailureFirstAttemptPending =
false;
446 bool _hashCheckNoResponse =
false;
447 int _hashCheckRequestCount = 0;
448 bool _paramRequestListHashCheckSent =
false;
449 bool _resetSysAutostartOnParamReset =
false;
453 QMutex _remoteIDArmStatusMutex;
454 uint8_t _remoteIDArmStatus = MAV_ODID_ARM_STATUS_GOOD_TO_ARM;
455 QString _remoteIDArmStatusError = QStringLiteral(
"No Error");
460 mutable QMutex _apmCompassCalMutex;
461 int _apmCompassCalProgress = -1;
462 int _apmCompassCalTickCount = 0;
463 bool _apmStaleFailedMagCalReportStreaming =
false;
464 bool _apmMagCalStartFailureMode =
false;
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,
479 int _apmAccelCalPosIndex = -1;
480 bool _apmAccelCalGotAck =
false;
481 int _apmAccelCalTickCount = 0;
483 struct RCChannelOverride {
484 enum class State { Ignore, Overridden, Released } state = State::Ignore;
487 static constexpr int kRcChannelOverrideChannelCount = 18;
488 std::array<RCChannelOverride, kRcChannelOverrideChannelCount> _rcChannelOverrides;
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;
500 QGeoCoordinate coordinate;
502 double altitude = 0.0;
504 QList<ADSBVehicle> _adsbVehicles;
505 QList<QGeoCoordinate> _adsbVehicleCoordinates;
506 static constexpr int _numberOfVehicles = 5;
507 double _adsbAngles[_numberOfVehicles]{};
509 static std::atomic<int> _nextVehicleSystemId;
513 static constexpr double _defaultVehicleLatitude = 47.397;
514 static constexpr double _defaultVehicleLongitude = 8.5455;
515 static constexpr double _defaultVehicleHomeAltitude = 488.056;
517 static constexpr const char *_failParam =
"COM_FLTMODE6";
519 static constexpr uint8_t _vehicleComponentId = MAV_COMP_ID_AUTOPILOT1;
521 static constexpr uint16_t _logDownloadLogId = 0;
522 static constexpr uint32_t _logDownloadFileSize = 1000;
524 static constexpr bool _mavlinkStarted =
true;
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"),
536 static QList<FlightMode_t> _availableFlightModes;
538 std::atomic<bool> _disconnectedEmitted{
false};