21#include <QtNetwork/QNetworkAccessManager>
25#include <QtCore/QSettings>
26#include <QtXml/QDomDocument>
27#include <QtXml/QDomNodeList>
28#include <QtQml/QQmlEngine>
29#include <QtNetwork/QNetworkReply>
41 , exclusions(exclusions_)
49 , targetParam(targetParam_)
50 , condition(condition_)
52 , optValues(optValues_)
58 QDomNamedNodeMap attrs = node.attributes();
62 QDomNode subNode = attrs.namedItem(tagName);
63 if(subNode.isNull()) {
66 target = subNode.nodeValue() !=
"0";
72 QDomNamedNodeMap attrs = node.attributes();
76 QDomNode subNode = attrs.namedItem(tagName);
77 if(subNode.isNull()) {
80 target = subNode.nodeValue().toInt();
84static bool read_attribute(QDomNode& node,
const char* tagName, QString& target)
86 QDomNamedNodeMap attrs = node.attributes();
90 QDomNode subNode = attrs.namedItem(tagName);
91 if(subNode.isNull()) {
94 target = subNode.nodeValue();
98static bool read_value(QDomNode& element,
const char* tagName, QString& target)
100 QDomElement de = element.firstChildElement(tagName);
112 QQmlEngine::setObjectOwnership(
this, QQmlEngine::CppOwnership);
116 _vendor = QString(
reinterpret_cast<const char*
>(info->vendor_name));
117 _modelName = QString(
reinterpret_cast<const char*
>(info->model_name));
118 _cacheFile = QString::asprintf(
"%s/%s_%s_%03d.xml",
126 if(info->cam_definition_uri[0] != 0) {
128 _handleDefinitionFile(info->cam_definition_uri);
148 constexpr int kCameraSettingsRefreshDelayMsecs = 1000;
160 qCDebug(VehicleCameraControlLog) <<
"Camera Info:";
161 qCDebug(VehicleCameraControlLog) <<
" vendor:" <<
vendor();
162 qCDebug(VehicleCameraControlLog) <<
" model:" <<
modelName();
163 qCDebug(VehicleCameraControlLog) <<
" version:" <<
version();
165 qCDebug(VehicleCameraControlLog) <<
" focal length:" <<
focalLength();
166 qCDebug(VehicleCameraControlLog) <<
" sensor size:" <<
sensorSize();
167 qCDebug(VehicleCameraControlLog) <<
" resolution:" <<
resolution();
168 qCDebug(VehicleCameraControlLog) <<
" captures video:" <<
capturesVideo();
169 qCDebug(VehicleCameraControlLog) <<
" captures photos:" <<
capturesPhotos();
170 qCDebug(VehicleCameraControlLog) <<
" has modes:" <<
hasModes();
171 qCDebug(VehicleCameraControlLog) <<
" has zoom:" <<
hasZoom();
172 qCDebug(VehicleCameraControlLog) <<
" has focus:" <<
hasFocus();
173 qCDebug(VehicleCameraControlLog) <<
" has tracking:" <<
hasTracking();
174 qCDebug(VehicleCameraControlLog) <<
" has video stream:" <<
hasVideoStream();
175 qCDebug(VehicleCameraControlLog) <<
" photos in video mode:" <<
photosInVideoMode();
176 qCDebug(VehicleCameraControlLog) <<
" video in photo mode:" <<
videoInPhotoMode();
196 qCDebug(VehicleCameraControlLog) <<
"_initWhenReady()";
198 qCDebug(VehicleCameraControlLog) <<
"Basic, MAVLink only messages, no parameters.";
239 return _mavlinkCameraInfo.flags & (CAMERA_CAP_FLAGS_CAPTURE_VIDEO | CAMERA_CAP_FLAGS_HAS_VIDEO_STREAM);
246 return _mavlinkCameraInfo.flags & (CAMERA_CAP_FLAGS_CAPTURE_IMAGE | CAMERA_CAP_FLAGS_HAS_VIDEO_STREAM);
291 return QString::asprintf(
"%d.%d.%d.%d", major, minor, patch, dev);
293 return QString::asprintf(
"%d.%d.%d", major, minor, patch);
298 return QTime(0, 0).addMSecs(
static_cast<int>(
recordTime())).toString(
"hh:mm:ss");
320 qCWarning(VehicleCameraControlLog) <<
"Camera does not support modes";
324 qCDebug(VehicleCameraControlLog) <<
"Camera set to video mode";
334 qCWarning(VehicleCameraControlLog) <<
"Camera does not support modes";
338 qCDebug(VehicleCameraControlLog) <<
"Camera set to photo mode";
348 qCWarning(VehicleCameraControlLog) <<
"Camera does not support modes";
352 qCWarning(VehicleCameraControlLog) <<
"Invalid camera mode" <<
cameraMode;
370 MAV_CMD_SET_CAMERA_MODE,
446 qCWarning(VehicleCameraControlLog) <<
"Take photo denied - photo capture is disabled";
450 qCWarning(VehicleCameraControlLog) <<
"Take photo denied - already capturing";
454 qCDebug(VehicleCameraControlLog) <<
"takePhoto()";
456 const bool canUseMavlinkImageCapture =
460 if (canUseMavlinkImageCapture) {
464 MAV_CMD_IMAGE_START_CAPTURE,
477 QTimer::singleShot(500,
this, [
this]() {
482 QGC::showAppMessage(tr(
"Timelapse photo capture is not supported on cameras without still capture capability"));
495 qCWarning(VehicleCameraControlLog) <<
"Stop taking photos requested - not currently capturing multiple photos";
499 qCDebug(VehicleCameraControlLog) <<
"Camera stop taking photos";
504 MAV_CMD_IMAGE_STOP_CAPTURE,
519 qCWarning(VehicleCameraControlLog) <<
"Start video denied - already recording";
523 qCWarning(VehicleCameraControlLog) <<
"Start video denied - video capture is disabled";
529 qCDebug(VehicleCameraControlLog) <<
"Start video recording:" << (useMavlinkCommand ?
"MAVLink command" :
"VideoManager");
531 if (useMavlinkCommand) {
534 MAV_CMD_VIDEO_START_CAPTURE,
552 qCWarning(VehicleCameraControlLog) <<
"Stop video recording requested - already idle";
558 qCDebug(VehicleCameraControlLog) <<
"Camera stop video recording" << (useMavlinkCommand ?
"MAVLink command" :
"VideoManager");
560 if (useMavlinkCommand) {
563 MAV_CMD_VIDEO_STOP_CAPTURE,
584 if(val < 0.0) val = 0.0;
585 if(val > 100.0) val = 100.0;
596 qCDebug(VehicleCameraControlLog) <<
"Camera set zoom level to" << level;
599 level = std::min(std::max(level, 0.0), 100.0);
603 MAV_CMD_SET_CAMERA_ZOOM,
606 static_cast<float>(level));
613 qCDebug(VehicleCameraControlLog) <<
"Camera set focus level to" << level;
616 level = std::min(std::max(level, 0.0), 100.0);
620 MAV_CMD_SET_CAMERA_FOCUS,
623 static_cast<float>(level));
631 qCDebug(VehicleCameraControlLog) <<
"resetSettings()";
635 MAV_CMD_RESET_CAMERA_SETTINGS,
644 qCDebug(VehicleCameraControlLog) <<
"formatCard()";
648 MAV_CMD_STORAGE_FORMAT,
658 qCDebug(VehicleCameraControlLog) <<
"Camera step zoom" << direction;
662 MAV_CMD_SET_CAMERA_ZOOM,
671 qCDebug(VehicleCameraControlLog) <<
"Camera start zoom" << direction;
675 MAV_CMD_SET_CAMERA_ZOOM,
677 ZOOM_TYPE_CONTINUOUS,
684 qCDebug(VehicleCameraControlLog) <<
"Camera stop zoom";
688 MAV_CMD_SET_CAMERA_ZOOM,
690 ZOOM_TYPE_CONTINUOUS,
697 qCDebug(VehicleCameraControlLog) <<
"Camera step focus" << direction;
701 MAV_CMD_SET_CAMERA_FOCUS,
710 qCDebug(VehicleCameraControlLog) <<
"Camera start focus" << direction;
714 MAV_CMD_SET_CAMERA_FOCUS,
716 FOCUS_TYPE_CONTINUOUS,
723 qCDebug(VehicleCameraControlLog) <<
"Camera stop focus";
727 MAV_CMD_SET_CAMERA_FOCUS,
729 FOCUS_TYPE_CONTINUOUS,
739 qCDebug(VehicleCameraControlLog) <<
" Sending REQUEST_MESSAGE:MAVLINK_MSG_ID_CAMERA_CAPTURE_STATUS";
742 MAV_CMD_REQUEST_MESSAGE,
744 MAVLINK_MSG_ID_CAMERA_CAPTURE_STATUS);
746 qCDebug(VehicleCameraControlLog) <<
" Sending MAV_CMD_REQUEST_CAMERA_CAPTURE_STATUS (legacy)";
749 MAV_CMD_REQUEST_CAMERA_CAPTURE_STATUS,
758 _updateRanges(pFact);
763 Q_UNUSED(failureCode);
769 if (result == MAV_RESULT_IN_PROGRESS) {
771 qCDebug(VehicleCameraControlLog) <<
"In progress response for" << command;
772 }
else if(result == MAV_RESULT_ACCEPTED) {
774 case MAV_CMD_RESET_CAMERA_SETTINGS:
783 case MAV_CMD_VIDEO_START_CAPTURE:
787 case MAV_CMD_VIDEO_STOP_CAPTURE:
791 case MAV_CMD_REQUEST_CAMERA_CAPTURE_STATUS:
794 case MAV_CMD_REQUEST_STORAGE_INFORMATION:
797 case MAV_CMD_IMAGE_START_CAPTURE:
800 case MAV_CMD_SET_CAMERA_ZOOM:
801 case MAV_CMD_SET_CAMERA_FOCUS:
807 if ((result == MAV_RESULT_TEMPORARILY_REJECTED) || (result == MAV_RESULT_FAILED)) {
808 if (result == MAV_RESULT_TEMPORARILY_REJECTED) {
809 qCDebug(VehicleCameraControlLog) <<
"Command temporarily rejected (MAV_RESULT_TEMPORARILY_REJECTED) for" << commandStr;
811 qCDebug(VehicleCameraControlLog) <<
"Command failed (MAV_RESULT_FAILED) for" << commandStr;
814 case MAV_CMD_RESET_CAMERA_SETTINGS:
816 qCDebug(VehicleCameraControlLog) <<
"Failed to reset camera settings";
818 case MAV_CMD_IMAGE_START_CAPTURE:
819 case MAV_CMD_IMAGE_STOP_CAPTURE:
823 qCDebug(VehicleCameraControlLog) <<
"Giving up start/stop image capture";
827 case MAV_CMD_REQUEST_CAMERA_CAPTURE_STATUS:
831 qCDebug(VehicleCameraControlLog) <<
"Giving up requesting capture status";
834 case MAV_CMD_REQUEST_STORAGE_INFORMATION:
838 qCDebug(VehicleCameraControlLog) <<
"Giving up requesting storage status";
892 qCDebug(VehicleCameraControlLog) <<
"Set Photo Status:" << captureStatus;
898bool VehicleCameraControl::_loadCameraDefinitionFile(QByteArray& bytes)
900 QByteArray originalData(bytes);
902 if(!_handleLocalization(bytes)) {
907 const QDomDocument::ParseResult result = doc.setContent(bytes, QDomDocument::ParseOption::Default);
909 qCCritical(VehicleCameraControlLog) <<
"Unable to parse camera definition file on line:" << result.errorLine;
910 qCCritical(VehicleCameraControlLog) << result.errorMessage;
914 QDomNodeList defElements = doc.elementsByTagName(
kDefnition);
915 if(!defElements.size() || !_loadConstants(defElements)) {
916 qCWarning(VehicleCameraControlLog) <<
"Unable to load camera constants from camera definition";
920 QDomNodeList paramElements = doc.elementsByTagName(
kParameters);
921 if(!paramElements.size()) {
922 qCDebug(VehicleCameraControlLog) <<
"No parameters to load from camera";
925 if(!_loadSettings(paramElements)) {
926 qCWarning(VehicleCameraControlLog) <<
"Unable to load camera parameters from camera definition";
931 qCDebug(VehicleCameraControlLog) <<
"Saving camera definition file" <<
_cacheFile;
933 if (!file.open(QIODevice::WriteOnly)) {
934 qWarning() << QString(
"Could not save cache file %1. Error: %2").arg(
_cacheFile).arg(file.errorString());
936 file.write(originalData);
942bool VehicleCameraControl::_loadConstants(
const QDomNodeList nodeList)
944 QDomNode node = nodeList.item(0);
957bool VehicleCameraControl::_loadSettings(
const QDomNodeList nodeList)
959 QDomNode node = nodeList.item(0);
960 QDomElement elem = node.toElement();
961 QDomNodeList parameters = elem.elementsByTagName(
kParameter);
963 for(
int i = 0; i < parameters.size(); i++) {
964 QDomNode parameterNode = parameters.item(i);
973 qCritical() <<
"Parameter entry missing parameter name";
978 for(
int i = 0; i < parameters.size(); i++) {
979 QDomNode parameterNode = parameters.item(i);
984 qCritical() << QString(
"Parameter %1 missing parameter type").arg(factName);
991 bool readOnly =
false;
994 bool writeOnly =
false;
997 if(readOnly && writeOnly) {
998 qCritical() << QString(
"Parameter %1 cannot be both read only and write only").arg(factName);
1004 qCritical() << QString(
"Unknown type for parameter %1").arg(factName);
1012 QString description;
1014 qCritical() << QString(
"Parameter %1 missing parameter description").arg(factName);
1018 QStringList updates = _loadUpdates(parameterNode);
1019 if(updates.size()) {
1020 qCDebug(VehicleCameraControlVerboseLog) <<
"Parameter" << factName <<
"requires updates for:" << updates;
1025 QQmlEngine::setObjectOwnership(metaData, QQmlEngine::CppOwnership);
1032 QDomElement optionElem = parameterNode.toElement();
1033 QDomNodeList optionsRoot = optionElem.elementsByTagName(
kOptions);
1034 if(optionsRoot.size()) {
1036 QDomNode optionsNode = optionsRoot.item(0);
1037 QDomElement optionsElem = optionsNode.toElement();
1038 QDomNodeList options = optionsElem.elementsByTagName(
kOption);
1039 for(
int optionIndex = 0; optionIndex < options.size(); optionIndex++) {
1040 QDomNode option = options.item(optionIndex);
1043 QVariant optVariant;
1044 if(!_loadNameValue(option, factName, metaData, optName, optValue, optVariant)) {
1052 QStringList exclusions = _loadExclusions(option);
1053 if(exclusions.size()) {
1054 qCDebug(VehicleCameraControlVerboseLog) <<
"New exclusions:" << factName << optValue << exclusions;
1056 QQmlEngine::setObjectOwnership(pExc, QQmlEngine::CppOwnership);
1060 if(!_loadRanges(option, factName, optValue)) {
1066 QString defaultValue;
1068 QVariant defaultVariant;
1073 qWarning() <<
"Invalid default value for" << factName
1074 <<
" type:" << metaData->
type()
1075 <<
" value:" << defaultValue
1081 qWarning() << QStringLiteral(
"Duplicate fact name:") << factName;
1088 QVariant typedValue;
1093 qWarning() <<
"Invalid min value for" << factName
1094 <<
" type:" << metaData->
type()
1095 <<
" value:" << attr
1104 QVariant typedValue;
1109 qWarning() <<
"Invalid max value for" << factName
1110 <<
" type:" << metaData->
type()
1111 <<
" value:" << attr
1120 QVariant typedValue;
1125 qWarning() <<
"Invalid step value for" << factName
1126 <<
" type:" << metaData->
type()
1127 <<
" value:" << attr
1136 QVariant typedValue;
1141 qWarning() <<
"Invalid decimal places value for" << factName
1142 <<
" type:" << metaData->
type()
1143 <<
" value:" << attr
1155 qCDebug(VehicleCameraControlLog) <<
"New parameter:" << factName << (readOnly ?
"ReadOnly" :
"Writable") << (writeOnly ?
"WriteOnly" :
"Readable");
1158 QQmlEngine::setObjectOwnership(pFact, QQmlEngine::CppOwnership);
1162 QQmlEngine::setObjectOwnership(pIO, QQmlEngine::CppOwnership);
1177bool VehicleCameraControl::_handleLocalization(QByteArray& bytes)
1180 const QDomDocument::ParseResult result = doc.setContent(bytes, QDomDocument::ParseOption::Default);
1182 qCritical() <<
"Unable to parse camera definition file on line:" << result.errorLine;
1183 qCritical() << result.errorMessage;
1187 QLocale locale = QLocale::system();
1188#if defined (Q_OS_MACOS)
1189 locale = QLocale(locale.name());
1191 QString localeName = locale.name().toLower().replace(
"-",
"_");
1192 qCDebug(VehicleCameraControlLog) <<
"Current locale:" << localeName;
1193 if(localeName ==
"en_us") {
1197 QDomNodeList locRoot = doc.elementsByTagName(
kLocalization);
1198 if(!locRoot.size()) {
1203 QDomNode node = locRoot.item(0);
1204 QDomElement elem = node.toElement();
1205 QDomNodeList locales = elem.elementsByTagName(
kLocale);
1206 for(
int i = 0; i < locales.size(); i++) {
1207 QDomNode localeNode = locales.item(i);
1210 qWarning() <<
"Localization entry is missing its name attribute";
1214 if(localeName == name.toLower().replace(
"-",
"_")) {
1215 return _replaceLocaleStrings(localeNode, bytes);
1219 localeName = localeName.left(3);
1220 for(
int i = 0; i < locales.size(); i++) {
1221 QDomNode localeNode = locales.item(i);
1224 if(name.toLower().startsWith(localeName)) {
1225 return _replaceLocaleStrings(localeNode, bytes);
1229 qWarning() <<
"No match for" << QLocale::system().name() <<
"in camera definition file";
1234bool VehicleCameraControl::_replaceLocaleStrings(
const QDomNode node, QByteArray& bytes)
1236 QDomElement stringElem = node.toElement();
1237 QDomNodeList strings = stringElem.elementsByTagName(
kStrings);
1238 for(
int i = 0; i < strings.size(); i++) {
1239 QDomNode stringNode = strings.item(i);
1244 QString o; o =
"\"" + original +
"\"";
1245 QString t; t =
"\"" + translated +
"\"";
1246 bytes.replace(o.toUtf8(), t.toUtf8());
1247 o =
">" + original +
"<";
1248 t =
">" + translated +
"<";
1249 bytes.replace(o.toUtf8(), t.toUtf8());
1259 for(
const QString& paramName:
_paramIO.keys()) {
1261 _paramIO[paramName]->setParamRequest();
1263 qCritical() <<
"QGCParamIO is NULL" << paramName;
1269 mavlink_msg_param_ext_request_list_pack_chan(
1272 sharedLink->mavlinkChannel(),
1275 static_cast<uint8_t
>(
compID()));
1278 qCDebug(VehicleCameraControlVerboseLog) <<
"Request all parameters";
1281QString VehicleCameraControl::_getParamName(
const char* param_id)
1284 char parameterNameWithNull[MAVLINK_MSG_PARAM_VALUE_FIELD_PARAM_ID_LEN + 1] = {};
1285 (void) strncpy(parameterNameWithNull, param_id, MAVLINK_MSG_PARAM_VALUE_FIELD_PARAM_ID_LEN);
1286 const QString parameterName(parameterNameWithNull);
1287 return parameterName;
1292 QString paramName = _getParamName(paramExtAck.param_id);
1293 qCDebug(VehicleCameraControlLog).noquote() <<
"Received PARAM_EXT_ACK:"
1294 <<
"\n\tParam name:" << paramName
1295 <<
"\n\tResult:" <<
static_cast<int>(paramExtAck.param_result)
1296 <<
"\n\tType:" <<
static_cast<int>(paramExtAck.param_type);
1298 if(!
_paramIO.contains(paramName)) {
1299 qCWarning(VehicleCameraControlLog) <<
"Received PARAM_EXT_ACK for unknown param:" << paramName;
1303 _paramIO[paramName]->handleParamAck(paramExtAck);
1305 qCritical() <<
"QGCParamIO is NULL" << paramName;
1311 QString paramName = _getParamName(paramExtValue.param_id);
1312 qCDebug(VehicleCameraControlLog).noquote() <<
"Received PARAM_EXT_VALUE:"
1313 <<
"\n\tParam name:" << paramName
1314 <<
"\n\tType:" <<
static_cast<int>(paramExtValue.param_type)
1315 <<
"\n\tIndex:" <<
static_cast<int>(paramExtValue.param_index)
1316 <<
"\n\tCount:" <<
static_cast<int>(paramExtValue.param_count);
1318 if(!
_paramIO.contains(paramName)) {
1319 qCWarning(VehicleCameraControlLog) <<
"Received PARAM_EXT_VALUE for unknown param:" << paramName;
1323 _paramIO[paramName]->handleParamValue(paramExtValue);
1325 qCritical() <<
"QGCParamIO is NULL" << paramName;
1329void VehicleCameraControl::_updateActiveList()
1332 QStringList exclusionList;
1337 if(param->value == option) {
1338 exclusionList << param->exclusions;
1344 if(!exclusionList.contains(key)) {
1349 qCDebug(VehicleCameraControlVerboseLog) <<
"Excluding" << exclusionList;
1359bool VehicleCameraControl::_processConditionTest(
const QString conditionTest)
1368 qCDebug(VehicleCameraControlVerboseLog) <<
"_processConditionTest(" << conditionTest <<
")";
1372 auto split = [&conditionTest](
const QString& sep ) {
1373 return conditionTest.split(sep, Qt::SkipEmptyParts);
1376 if(conditionTest.contains(
"!=")) {
1378 op = TEST_NOT_EQUAL;
1379 }
else if(conditionTest.contains(
"=")) {
1382 }
else if(conditionTest.contains(
">")) {
1385 }
else if(conditionTest.contains(
"<")) {
1389 if(test.size() == 2) {
1395 case TEST_NOT_EQUAL:
1405 qWarning() <<
"Invalid condition parameter:" << test[0] <<
"in" << conditionTest;
1409 qWarning() <<
"Invalid condition" << conditionTest;
1413bool VehicleCameraControl::_processCondition(
const QString condition)
1415 qCDebug(VehicleCameraControlVerboseLog) <<
"_processCondition(" << condition <<
")";
1418 if(!condition.isEmpty()) {
1419 QStringList scond = condition.split(
" ", Qt::SkipEmptyParts);
1420 while(scond.size()) {
1421 QString test = scond.first();
1422 scond.removeFirst();
1424 result = result && _processConditionTest(test);
1426 result = result || _processConditionTest(test);
1431 andOp = scond.first().toUpper() ==
"AND";
1432 scond.removeFirst();
1438void VehicleCameraControl::_updateRanges(
Fact* pFact)
1440 QMap<Fact*, QGCCameraOptionRange*> rangesSet;
1441 QMap<Fact*, QString> rangesReset;
1442 QStringList changedList;
1443 QStringList resetList;
1444 QStringList updates;
1448 if(!changedList.contains(pRange->targetParam) && (pRange->param == pFact->
name() || pRange->condition.contains(pFact->
name()))) {
1451 if(pRFact && pTFact) {
1456 if(pRange->value == option && _processCondition(pRange->condition)) {
1459 rangesSet[pTFact] = pRange;
1461 changedList << pRange->targetParam;
1468 if(!changedList.contains(pRange->targetParam) && (pRange->param == pFact->
name() || pRange->condition.contains(pFact->
name()))) {
1470 if(!resetList.contains(pRange->targetParam)) {
1473 rangesReset[pTFact] = pRange->targetParam;
1475 resetList << pRange->targetParam;
1481 f->setEnumInfo(rangesSet[f]->optNames, rangesSet[f]->optVariants);
1482 if(!updates.contains(f->name())) {
1483 emit f->enumsChanged();
1484 qCDebug(VehicleCameraControlVerboseLog) <<
"Limited set of options for:" << f->name() << rangesSet[f]->optNames;;
1485 updates << f->name();
1489 for (
Fact* f: rangesReset.
keys()) {
1491 if(!updates.contains(f->name())) {
1492 emit f->enumsChanged();
1493 qCDebug(VehicleCameraControlVerboseLog) <<
"Restore full set of options for:" << f->name() <<
_originalOptNames[f->name()];
1494 updates << f->name();
1526 qCDebug(VehicleCameraControlLog) <<
" Sending REQUEST_MESSAGE:MAVLINK_MSG_ID_CAMERA_SETTINGS";
1529 MAV_CMD_REQUEST_MESSAGE,
1531 MAVLINK_MSG_ID_CAMERA_SETTINGS);
1533 qCDebug(VehicleCameraControlLog) <<
" Sending MAV_CMD_REQUEST_CAMERA_SETTINGS (legacy)";
1536 MAV_CMD_REQUEST_CAMERA_SETTINGS,
1541 qCDebug(VehicleCameraControlLog) <<
"_requestCameraSettings() - RESTARTING already active timer";
1543 qCDebug(VehicleCameraControlLog) <<
"_requestCameraSettings() - starting timer";
1557 qCDebug(VehicleCameraControlLog) <<
" Sending REQUEST_MESSAGE:MAVLINK_MSG_ID_STORAGE_INFORMATION";
1560 MAV_CMD_REQUEST_MESSAGE,
1562 MAVLINK_MSG_ID_STORAGE_INFORMATION,
1565 qCDebug(VehicleCameraControlLog) <<
" Sending MAV_CMD_REQUEST_STORAGE_INFORMATION (legacy)";
1568 MAV_CMD_REQUEST_STORAGE_INFORMATION,
1573 qCDebug(VehicleCameraControlLog) <<
"_requestStorageInfo() - starting timer";
1580 qCDebug(VehicleCameraControlLog).noquote() <<
"Received CAMERA_SETTINGS - stopping timer, resetting retries:"
1581 <<
"\n\tMode:" << settings.mode_id
1582 <<
"\n\tZoom level:" << settings.zoomLevel
1583 <<
"\n\tFocus level:" << settings.focusLevel;
1589 qreal z =
static_cast<qreal
>(settings.zoomLevel);
1590 qreal f =
static_cast<qreal
>(settings.focusLevel);
1603 qCDebug(VehicleCameraControlLog) <<
"Received STORAGE_INFORMATION - stopping timer, resetting retries:"
1604 <<
"\n\tStorage id:" << storageInformation.storage_id
1605 <<
"\n\tStorage count:" << storageInformation.storage_count
1607 <<
"\n\tTotal capacity:" << storageInformation.total_capacity
1608 <<
"\n\tUsed capacity:" << storageInformation.used_capacity
1609 <<
"\n\tAvailable capacity:" << storageInformation.available_capacity;
1614 if(storageInformation.status == STORAGE_STATUS_READY) {
1615 uint32_t t =
static_cast<uint32_t
>(storageInformation.total_capacity);
1620 uint32_t a =
static_cast<uint32_t
>(storageInformation.available_capacity);
1634 qCDebug(VehicleCameraControlLog).noquote() <<
"Received BATTERY_STATUS:"
1635 <<
"\n\tBattery remaining (%):" << bs.battery_remaining;
1637 if(bs.battery_remaining >= 0 &&
_batteryRemaining !=
static_cast<int>(bs.battery_remaining)) {
1645 qCDebug(VehicleCameraControlLog).noquote() <<
"Received CAMERA_CAPTURE_STATUS - stopping timer, resetting retries:"
1648 <<
"\n\tInterval:" << cameraCaptureStatus.image_interval
1649 <<
"\n\tRecording time (ms):" << cameraCaptureStatus.recording_time_ms
1650 <<
"\n\tCapacity:" << cameraCaptureStatus.available_capacity;
1656 uint32_t a =
static_cast<uint32_t
>(cameraCaptureStatus.available_capacity);
1662 if(cameraCaptureStatus.recording_time_ms) {
1664 _recordTime = cameraCaptureStatus.recording_time_ms;
1665 _recTime =
_recTime.addMSecs(
_recTime.msecsTo(QTime::currentTime()) -
static_cast<int>(cameraCaptureStatus.recording_time_ms));
1687 qCDebug(VehicleCameraControlLog).noquote() <<
"Received VIDEO_STREAM_INFORMATION:"
1688 <<
"\n\tStream ID:" << videoStreamInformation.stream_id
1689 <<
"\n\tStream count:" << videoStreamInformation.count
1690 <<
"\n\tType:" <<
static_cast<int>(videoStreamInformation.type)
1691 <<
"\n\tFlags:" << Qt::hex << Qt::showbase << videoStreamInformation.flags << Qt::dec << Qt::noshowbase
1692 <<
"\n\tBitrate (bits/s):" << videoStreamInformation.bitrate
1693 <<
"\n\tFramerate (fps):" << videoStreamInformation.framerate
1694 <<
"\n\tResolution:" << videoStreamInformation.resolution_h <<
"x" << videoStreamInformation.resolution_v
1695 <<
"\n\tRotation (deg):" << videoStreamInformation.rotation
1696 <<
"\n\tHFOV (deg):" << videoStreamInformation.hfov
1697 <<
"\n\tURI:" << videoStreamInformation.uri;
1700 if(!
_findStream(videoStreamInformation.stream_id,
false)) {
1701 qCDebug(VehicleCameraControlLog) <<
"Create stream handler for stream ID:" << videoStreamInformation.stream_id;
1703 QQmlEngine::setObjectOwnership(pStream, QQmlEngine::CppOwnership);
1719 qCDebug(VehicleCameraControlLog) <<
"All stream handlers done";
1729 qCDebug(VehicleCameraControlLog) <<
"Received VIDEO_STREAM_STATUS - stopping timer, resetting retries:"
1730 <<
"\n\tStream ID:" << videoStreamStatus.stream_id
1731 <<
"\n\tFlags:" << Qt::hex << Qt::showbase << videoStreamStatus.flags << Qt::dec << Qt::noshowbase
1732 <<
"\n\tBitrate (bits/s):" << videoStreamStatus.bitrate
1733 <<
"\n\tFramerate (fps):" << videoStreamStatus.framerate
1734 <<
"\n\tResolution: " << videoStreamStatus.resolution_h <<
"x" << videoStreamStatus.resolution_v
1735 <<
"\n\tRotation (deg):" << videoStreamStatus.rotation
1736 <<
"\n\tHFOV (deg):" << videoStreamStatus.hfov;
1743 pInfo->
update(videoStreamStatus);
1749 qCDebug(VehicleCameraControlLog).noquote() <<
"Received CAMERA_TRACKING_IMAGE_STATUS:"
1750 <<
"\n\tTracking status:" <<
static_cast<int>(trackingImageStatus.tracking_status)
1751 <<
"\n\tTracking mode:" <<
static_cast<int>(trackingImageStatus.tracking_mode)
1752 <<
"\n\tPoint:" << trackingImageStatus.point_x <<
"," << trackingImageStatus.point_y
1753 <<
"\n\tRectangle:" << trackingImageStatus.rec_top_x <<
"," << trackingImageStatus.rec_top_y
1754 <<
" -> " << trackingImageStatus.rec_bottom_x <<
"," << trackingImageStatus.rec_bottom_y
1755 <<
"\n\tRadius:" << trackingImageStatus.radius;
1760 const bool isPoint = active && (
_trackingImageStatus.tracking_mode == CAMERA_TRACKING_MODE_POINT);
1763 qCDebug(VehicleCameraControlLog) <<
"Tracking off";
1767 }
else if (isPoint) {
1771 if (qIsNaN(radius) || radius <= 0) {
1774 radius = std::clamp(radius, 0.0, 1.0);
1776 qCDebug(VehicleCameraControlLog) <<
"Tracking Point [" << point <<
"] radius:" << radius;
1788 const QRectF rect = QRectF(QPointF(std::clamp(
static_cast<qreal
>(
_trackingImageStatus.rec_top_x), 0.0, 1.0),
1792 qCDebug(VehicleCameraControlLog) <<
"Tracking Rect [" << rect <<
"]";
1816 qCDebug(VehicleCameraControlLog)
1821 MAV_CMD_VIDEO_STOP_STREAMING,
1829 qCDebug(VehicleCameraControlLog)
1833 MAV_CMD_VIDEO_START_STREAMING,
1851 MAV_CMD_VIDEO_STOP_STREAMING,
1864 MAV_CMD_VIDEO_START_STREAMING,
1907 qCDebug(VehicleCameraControlLog) <<
"_requestStreamInfo() - stream:" << streamID <<
"retries:" <<
_videoStreamInfoRetries;
1911 qCDebug(VehicleCameraControlLog) <<
" Sending REQUEST_MESSAGE:MAVLINK_MSG_ID_VIDEO_STREAM_INFORMATION";
1914 MAV_CMD_REQUEST_MESSAGE,
1916 MAVLINK_MSG_ID_VIDEO_STREAM_INFORMATION,
1919 qCDebug(VehicleCameraControlLog) <<
" Sending MAV_CMD_REQUEST_VIDEO_STREAM_INFORMATION (legacy)";
1922 MAV_CMD_REQUEST_VIDEO_STREAM_INFORMATION,
1931 qCDebug(VehicleCameraControlLog) <<
"_requestStreamStatus() - stream:" << streamID <<
"retries:" <<
_videoStreamStatusRetries;
1935 qCDebug(VehicleCameraControlLog) <<
" Sending REQUEST_MESSAGE:MAVLINK_MSG_ID_VIDEO_STREAM_STATUS";
1938 MAV_CMD_REQUEST_MESSAGE,
1940 MAVLINK_MSG_ID_VIDEO_STREAM_STATUS,
1943 qCDebug(VehicleCameraControlLog) <<
" Sending MAV_CMD_REQUEST_VIDEO_STREAM_STATUS (legacy)";
1946 MAV_CMD_REQUEST_VIDEO_STREAM_STATUS,
1964 qCritical() <<
"Null QGCVideoStreamInfo instance";
1969 qWarning() <<
"Stream id not found:" << id;
1981 if(pStream->
name() == name) {
1995 qCWarning(VehicleCameraControlLog) <<
"Giving up requesting video stream info";
2017 qCWarning(VehicleCameraControlLog) <<
"Giving up requesting video stream status";
2032 qCWarning(VehicleCameraControlLog) <<
"Giving up requesting camera settings after" <<
_cameraSettingsRetries <<
"retries";
2036 qCDebug(VehicleCameraControlLog) <<
"_cameraSettingsTimeout() - calling _requestCameraSettings()";
2043 qCDebug(VehicleCameraControlLog) <<
"_storageInfoTimeout() - retries now:" <<
_storageInfoRetries;
2045 qCWarning(VehicleCameraControlLog) <<
"Giving up requesting storage info after" <<
_storageInfoRetries <<
"retries";
2049 qCDebug(VehicleCameraControlLog) <<
"_storageInfoTimeout() - calling _requestStorageInfo()";
2054VehicleCameraControl::_loadExclusions(QDomNode option)
2056 QStringList exclusionList;
2057 QDomElement optionElem = option.toElement();
2058 QDomNodeList excRoot = optionElem.elementsByTagName(
kExclusions);
2059 if(excRoot.size()) {
2061 QDomNode node = excRoot.item(0);
2062 QDomElement elem = node.toElement();
2063 QDomNodeList exclusions = elem.elementsByTagName(
kExclusion);
2064 for(
int i = 0; i < exclusions.size(); i++) {
2065 QString exclude = exclusions.item(i).toElement().text();
2066 if(!exclude.isEmpty()) {
2067 exclusionList << exclude;
2071 return exclusionList;
2075VehicleCameraControl::_loadUpdates(QDomNode option)
2077 QStringList updateList;
2078 QDomElement optionElem = option.toElement();
2079 QDomNodeList updateRoot = optionElem.elementsByTagName(
kUpdates);
2080 if(updateRoot.size()) {
2082 QDomNode node = updateRoot.item(0);
2083 QDomElement elem = node.toElement();
2084 QDomNodeList updates = elem.elementsByTagName(
kUpdate);
2085 for(
int i = 0; i < updates.size(); i++) {
2086 QString update = updates.item(i).toElement().text();
2087 if(!update.isEmpty()) {
2088 updateList << update;
2095bool VehicleCameraControl::_loadRanges(QDomNode option,
const QString factName, QString paramValue)
2097 QDomElement optionElem = option.toElement();
2099 if(rangeRoot.size()) {
2100 QDomNode node = rangeRoot.item(0);
2101 QDomElement elem = node.toElement();
2102 QDomNodeList parameterRanges = elem.elementsByTagName(
kParameterrange);
2104 for(
int i = 0; i < parameterRanges.size(); i++) {
2107 QDomNode paramRange = parameterRanges.item(i);
2109 qCritical() << QString(
"Malformed option range for parameter %1").arg(factName);
2113 QDomElement pelem = paramRange.toElement();
2114 QDomNodeList rangeOptions = pelem.elementsByTagName(
kRoption);
2115 QStringList optNames;
2116 QStringList optValues;
2118 for(
int rangeOptionIndex = 0; rangeOptionIndex < rangeOptions.size(); rangeOptionIndex++) {
2121 QDomNode roption = rangeOptions.item(rangeOptionIndex);
2123 qCritical() << QString(
"Malformed roption for parameter %1").arg(factName);
2127 qCritical() << QString(
"Malformed rvalue for parameter %1").arg(factName);
2130 optNames << optName;
2131 optValues << optValue;
2133 if(optNames.size()) {
2136 qCDebug(VehicleCameraControlVerboseLog) <<
"New range limit:" << factName << paramValue << param << condition << optNames << optValues;
2143void VehicleCameraControl::_processRanges()
2149 for(
int i = 0; i < pRange->optNames.size(); i++) {
2150 QVariant optVariant;
2153 qWarning() <<
"Invalid roption value, name:" << pRange->targetParam
2155 <<
" value:" << pRange->optValues[i]
2158 pRange->optVariants << optVariant;
2165bool VehicleCameraControl::_loadNameValue(QDomNode option,
const QString factName,
FactMetaData* metaData, QString& optName, QString& optValue, QVariant& optVariant)
2168 qCritical() << QString(
"Malformed option for parameter %1").arg(factName);
2172 qCritical() << QString(
"Malformed value for parameter %1").arg(factName);
2177 qWarning() <<
"Invalid option value, name:" << factName
2178 <<
" type:" << metaData->
type()
2179 <<
" value:" << optValue
2185void VehicleCameraControl::_handleDefinitionFile(
const QString &url)
2191 if (!xmlFile.exists() && url.startsWith(ftpPrefix, Qt::CaseInsensitive)) {
2192 qCDebug(VehicleCameraControlLog) <<
"No camera definition file cached, attempt ftp download";
2195 if (url.endsWith(
".lzma", Qt::CaseInsensitive)) { ext =
".lzma"; }
2196 if (url.endsWith(
".xz", Qt::CaseInsensitive)) { ext =
".xz"; }
2197 QString fileName = QString::asprintf(
"%s_%s_%03d.xml%s",
2198 _vendor.toStdString().c_str(),
2201 ext.toStdString().c_str());
2209 if (!xmlFile.exists()) {
2210 qCDebug(VehicleCameraControlLog) <<
"No camera definition file cached, attempt http download";
2214 if (!xmlFile.open(QIODevice::ReadOnly)) {
2215 qWarning() <<
"Could not read cached camera definition file:" <<
_cacheFile;
2219 QByteArray bytes = xmlFile.readAll();
2221 const QDomDocument::ParseResult result = doc.setContent(bytes, QDomDocument::ParseOption::Default);
2223 qWarning() <<
"Could not parse cached camera definition file:" <<
_cacheFile;
2228 qCDebug(VehicleCameraControlLog) <<
"Using cached camera definition file:" <<
_cacheFile;
2233void VehicleCameraControl::_httpRequest(
const QString &url)
2235 qCDebug(VehicleCameraControlLog) <<
"Request camera definition:" << url;
2240 QNetworkRequest request(QUrl::fromUserInput(url));
2241 request.setAttribute(QNetworkRequest::RedirectPolicyAttribute,
true);
2242 QSslConfiguration conf = request.sslConfiguration();
2243 conf.setPeerVerifyMode(QSslSocket::VerifyNone);
2244 request.setSslConfiguration(conf);
2251 QNetworkReply* reply = qobject_cast<QNetworkReply*>(sender());
2255 int err = reply->error();
2256 int http_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
2257 QByteArray data = reply->readAll();
2258 if(err == QNetworkReply::NoError && http_code == 200) {
2262 qWarning() << QString(
"Camera Definition (%1) download error: %2 status: %3").arg(
2263 reply->url().toDisplayString(),
2264 reply->errorString(),
2265 reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toString()
2272void VehicleCameraControl::_ftpDownloadComplete(
const QString& fileName,
const QString& errorMsg)
2274 qCDebug(VehicleCameraControlLog) <<
"FTP Download completed: " << fileName <<
", " << errorMsg;
2279 if (outputFileName.isEmpty()) {
2280 qCWarning(VehicleCameraControlLog) <<
"Inflate of compressed xml failed" << fileName;
2283 QFile xmlFile(outputFileName);
2285 if (!xmlFile.exists()) {
2286 qCDebug(VehicleCameraControlLog) <<
"No camera definition file present after ftp download completed";
2289 if (!xmlFile.open(QIODevice::ReadOnly)) {
2290 qWarning() <<
"Could not read downloaded camera definition file: " << fileName;
2295 QByteArray bytes = xmlFile.readAll();
2302 qCDebug(VehicleCameraControlLog) <<
"Parsing camera definition";
2303 _loadCameraDefinitionFile(data);
2305 qCDebug(VehicleCameraControlLog) <<
"No camera definition received, trying to search on our own...";
2306 QFile definitionFile;
2308 qCDebug(VehicleCameraControlLog) <<
"Found offline definition file for: " <<
_modelName <<
", loading: " << definitionFile.fileName();
2309 if (definitionFile.open(QIODevice::ReadOnly)) {
2310 QByteArray newData = definitionFile.readAll();
2311 _loadCameraDefinitionFile(newData);
2313 qCDebug(VehicleCameraControlLog) <<
"error opening offline definition file for: " <<
_modelName;
2316 qCDebug(VehicleCameraControlLog) <<
"No offline camera definition file found";
2324 for(
const QString& param:
_paramIO.keys()) {
2325 if(!
_paramIO[param]->paramDone()) {
2425 qCCritical(VehicleCameraControlLog) <<
"startTrackingRect called but camera does not have rectangle tracking capability";
2429 qCDebug(VehicleCameraControlLog) <<
"Start Tracking (Rectangle: ["
2430 <<
static_cast<float>(rec.x()) <<
", "
2431 <<
static_cast<float>(rec.y()) <<
"] - ["
2432 <<
static_cast<float>(rec.x() + rec.width()) <<
", "
2433 <<
static_cast<float>(rec.y() + rec.height()) <<
"]";
2436 MAV_CMD_CAMERA_TRACK_RECTANGLE,
2438 static_cast<float>(rec.x()),
2439 static_cast<float>(rec.y()),
2440 static_cast<float>(rec.x() + rec.width()),
2441 static_cast<float>(rec.y() + rec.height()));
2449 qCCritical(VehicleCameraControlLog) <<
"startTrackingPoint called but camera does not have point tracking capability";
2453 qCDebug(VehicleCameraControlLog) <<
"Start Tracking (Point: ["
2454 <<
static_cast<float>(point.x()) <<
", "
2455 <<
static_cast<float>(point.y()) <<
"], Radius: "
2456 <<
static_cast<float>(radius);
2459 MAV_CMD_CAMERA_TRACK_POINT,
2461 static_cast<float>(point.x()),
2462 static_cast<float>(point.y()),
2463 static_cast<float>(radius));
2470 qCDebug(VehicleCameraControlLog) <<
"Stop Tracking";
2474 MAV_CMD_CAMERA_STOP_TRACKING,
2479 MAV_CMD_SET_MESSAGE_INTERVAL,
2481 MAVLINK_MSG_ID_CAMERA_TRACKING_IMAGE_STATUS,
2501 MAV_CMD_SET_MESSAGE_INTERVAL,
2503 MAVLINK_MSG_ID_CAMERA_TRACKING_IMAGE_STATUS,
std::shared_ptr< LinkInterface > SharedLinkInterfacePtr
struct __mavlink_message mavlink_message_t
#define QGC_LOGGING_CATEGORY(name, categoryStr)
struct __mavlink_video_stream_information_t mavlink_video_stream_information_t
struct __mavlink_storage_information_t mavlink_storage_information_t
struct __mavlink_param_ext_value_t mavlink_param_ext_value_t
struct __mavlink_param_ext_ack_t mavlink_param_ext_ack_t
struct __mavlink_camera_information_t mavlink_camera_information_t
struct __mavlink_camera_settings_t mavlink_camera_settings_t
struct __mavlink_video_stream_status_t mavlink_video_stream_status_t
struct __mavlink_camera_tracking_image_status_t mavlink_camera_tracking_image_status_t
struct __mavlink_battery_status_t mavlink_battery_status_t
struct __mavlink_camera_capture_status_t mavlink_camera_capture_status_t
std::array< MsgOutKey, 4 > keys
static bool read_value(QDomNode &element, const char *tagName, QString &target)
static bool read_attribute(QDomNode &node, const char *tagName, bool &target)
static constexpr const char * mavlinkFTPScheme
void downloadComplete(const QString &file, const QString &errorMsg)
bool download(uint8_t fromCompId, const QString &fromURI, const QString &toDir, const QString &fileName="", bool checksize=true)
QMap< QString, FactMetaData * > _nameToFactMetaDataMap
Q_INVOKABLE Fact * getFact(const QString &name) const
void _addFactGroup(FactGroup *factGroup, const QString &name)
Q_INVOKABLE bool factExists(const QString &name) const
@ return true: if the fact exists in the group
void _addFact(Fact *fact, const QString &name)
A Fact is used to hold a single value within the system.
void setMetaData(FactMetaData *metaData, bool setDefaultFromMetaData=false)
void containerSetRawValue(const QVariant &value)
Value coming from Vehicle. This does NOT send a _containerRawValueChanged signal.
FactMetaData * metaData()
void setRawValue(const QVariant &value)
QString rawValueString() const
QStringList enumStrings() const
static int getComponentId()
static MAVLinkProtocol * instance()
Abstract base class for all camera controls: real and simulated.
void trackingImageRadiusChanged()
@ CapturePhotosStateDisabled
@ CapturePhotosStateCapturingSinglePhoto
@ CapturePhotosStateCapturingMultiplePhotos
void trackingImageIsPointChanged()
@ PHOTO_CAPTURE_INTERVAL_IDLE
@ PHOTO_CAPTURE_INTERVAL_IN_PROGRESS
@ PHOTO_CAPTURE_IN_PROGRESS
@ PHOTO_CAPTURE_STATUS_UNDEFINED
void batteryRemainingChanged()
void photoLapseCountChanged()
void videoCaptureStatusChanged()
void storageFreeChanged()
PhotoCaptureStatus _photoCaptureStatus() const
friend class QGCCameraParamIO
QString storageStatusToStr(uint8_t status)
PhotoCaptureMode _photoCaptureMode
void storageStatusChanged()
QString cameraModeToStr(CameraMode mode)
void photoCaptureStatusChanged()
QString captureImageStatusToStr(uint8_t image_status)
VideoCaptureStatus _videoCaptureStatusValue
void trackingEnabledChanged()
void storageTotalChanged()
void activeSettingsChanged()
VideoCaptureStatus _videoCaptureStatus() const
void capturePhotosStateChanged()
@ VIDEO_CAPTURE_STATUS_UNDEFINED
@ VIDEO_CAPTURE_STATUS_STOPPED
@ VIDEO_CAPTURE_STATUS_LAST
@ VIDEO_CAPTURE_STATUS_RUNNING
void trackingImageRectChanged()
void captureVideoStateChanged()
void trackingImageIsActiveChanged()
virtual CameraMode cameraMode() const
void trackingImagePointChanged()
void thermalOpacityChanged()
void currentStreamChanged()
void thermalModeChanged()
void streamLabelsChanged()
void thermalStreamChanged()
PhotoCaptureStatus _photoCaptureStatusValue
@ PHOTO_CAPTURE_TIMELAPSE
@ CaptureVideoStateDisabled
@ CaptureVideoStateCapturing
QString captureVideoStatusToStr(uint8_t video_status)
void dataReady(const QByteArray &data)
void photoCaptureModeChanged()
QTimer _videoRecordTimeUpdateTimer
static MissionCommandTree * instance()
QString rawName(MAV_CMD command) const
Returns the raw name for the specified command.
Camera option exclusions.
QGCCameraOptionRange(QObject *parent, QString param_, QString value_, QString targetParam_, QString condition_, QStringList optNames_, QStringList optValues_)
Camera parameter handler.
static QGCCorePlugin * instance()
static QString mavResultToString(uint8_t result)
Encapsulates the contents of a VIDEO_STREAM_INFORMATION message.
bool update(const mavlink_video_stream_status_t &info)
void append(QObject *object)
Caller maintains responsibility for object ownership and deletion.
int count() const override final
static SettingsManager * instance()
MAVLink Camera API controller - connected to a real mavlink v2 camera.
QTimer _cameraSettingsRefreshTimer
virtual void _storageInfoTimeout()
QStringList _updatesToRequest
QRectF _trackingImageRect
void handleParamExtValue(const mavlink_param_ext_value_t ¶mExtValue) override
Fact * shutterSpeed() override
static constexpr const char * kCAM_ISO
void setPhotoLapse(qreal interval) override
virtual void _downloadFinished()
virtual void _streamInfoTimeout()
static constexpr const char * kRoption
virtual void _streamStatusTimeout()
virtual void _requestAllParameters()
QSize resolution() const override
bool incomingParameter(Fact *pFact, QVariant &newValue) override
Allow controller to modify or invalidate incoming parameter.
QTimer _cameraSettingsTimer
QString storageFreeStr() const override
bool capturesPhotos() const override
Q_INVOKABLE void startZoom(int direction) override
static constexpr const char * kName
void setTrackingEnabled(bool set) override
QStringList activeSettings() const override
QList< QGCCameraOptionRange * > _optionRanges
static constexpr const char * kType
static constexpr const char * kModel
void setCameraMode(CameraMode cameraMode) override
Q_INVOKABLE void startTrackingRect(QRectF rec) override
Q_INVOKABLE void startTrackingPoint(QPointF point, double radius) override
bool validateParameter(Fact *pFact, QVariant &newValue) override
Allow controller to modify or invalidate parameter change.
mavlink_camera_tracking_image_status_t _trackingImageStatus
QGCVideoStreamInfo * thermalStreamInstance() override
static constexpr const char * kDescription
virtual void _checkForVideoStreams()
QString recordTimeStr() const override
Q_INVOKABLE void formatCard(int id=1) override
bool hasVideoStream() const override
virtual void _onVideoManagerRecordingChanged(bool recording)
bool _trackingImageIsPoint
int compID() const override
static constexpr const char * kUpdate
void setPhotoCaptureMode(PhotoCaptureMode mode) override
QmlObjectListModel _streams
CapturePhotosState capturePhotosState() const override
Q_INVOKABLE void toggleCameraMode() override
Fact * exposureMode() override
void setFocusLevel(qreal level) override
virtual void _requestStorageInfo()
bool _hasTrackingPointCapability
Q_INVOKABLE void stepFocus(int direction) override
Q_INVOKABLE void stepZoom(int direction) override
static constexpr const char * kDecimalPlaces
static constexpr const char * kOptions
bool hasTracking() const override
bool _hasTrackingRectCapability
Q_INVOKABLE bool toggleVideoRecording() override
virtual void _dataReady(QByteArray data)
virtual void _initWhenReady()
virtual void _requestParamUpdates()
int _videoStreamInfoRetries
Q_INVOKABLE bool takePhoto() override
static constexpr const char * kControl
static constexpr const char * kVersion
void setZoomLevel(qreal level) override
void handleVideoStreamInformation(const mavlink_video_stream_information_t &videoStreamInformation) override
QString vendor() const override
int _videoStreamStatusRetries
bool capturesVideo() const override
static constexpr const char * kWriteOnly
QString batteryRemainingStr() const override
VehicleCameraControl(const mavlink_camera_information_t *info, Vehicle *vehicle, int compID, QObject *parent=nullptr)
static constexpr const char * kCAM_EXPMODE
virtual void _cameraSettingsTimeout()
static constexpr const char * kPhotoLapse
void handleCameraCaptureStatus(const mavlink_camera_capture_status_t &cameraCaptureStatus) override
static constexpr const char * kCAM_APERTURE
static constexpr const char * kTranslated
Q_INVOKABLE void startFocus(int direction) override
bool autoStream() const override
static constexpr const char * kParameterranges
void setThermalOpacity(double val) override
void handleBatteryStatus(const mavlink_battery_status_t &bs) override
ThermalViewMode _thermalMode
QTimer _streamStatusTimer
static constexpr const char * kUnit
Q_INVOKABLE void stopFocus() override
static constexpr const char * kDefnition
static constexpr const char * kVendor
static constexpr const char * kOriginal
void setPhotoLapseCount(int count) override
QList< QGCCameraOptionExclusion * > _valueExclusions
QSizeF sensorSize() const override
Q_INVOKABLE void setCameraModePhoto() override
static constexpr const char * kCAM_SHUTTERSPD
virtual void _requestTrackingStatus()
static constexpr const char * kDefault
static constexpr const char * kMin
qreal focalLength() const override
virtual void _setCameraMode(CameraMode mode)
virtual void _requestStreamInfo(uint8_t streamID)
Q_INVOKABLE bool stopVideoRecording() override
void factChanged(Fact *pFact) override
Notify controller a parameter has changed.
QStringList _activeSettings
void handleVideoStreamStatus(const mavlink_video_stream_status_t &videoStreamStatus) override
QMap< QString, QGCCameraParamIO * > _paramIO
static constexpr const char * kPhotoLapseCount
static constexpr const char * kExclusions
static constexpr const char * kLocale
int version() const override
static constexpr const char * kCondition
static constexpr const char * kThermalMode
bool hasFocus() const override
Q_INVOKABLE void stopStream() override
static constexpr const char * kMax
QString firmwareVersion() const override
virtual void _mavCommandResult(int vehicleId, int component, int command, int result, int failureCode)
static constexpr const char * kStep
Q_INVOKABLE void resetSettings() override
virtual void _requestStreamStatus(uint8_t streamID)
Q_INVOKABLE bool startVideoRecording() override
Q_INVOKABLE void setCameraModeVideo() override
void handleParamExtAck(const mavlink_param_ext_ack_t ¶mExtAck) override
static constexpr const char * kOption
void handleTrackingImageStatus(const mavlink_camera_tracking_image_status_t &trackingImageStatus) override
QTimer _captureStatusTimer
virtual void _recTimerHandler()
static constexpr const char * kExclusion
void setThermalMode(ThermalViewMode mode) override
static constexpr const char * kStrings
QMap< QString, QVariantList > _originalOptValues
QMap< QString, QStringList > _originalOptNames
static constexpr const char * kPhotoMode
QStringList _streamLabels
static constexpr const char * kReadOnly
virtual void _requestCaptureStatus()
void handleStorageInformation(const mavlink_storage_information_t &storageInformation) override
bool hasModes() const override
bool trackingEnabled() const override
static constexpr const char * kParameter
static constexpr const char * kValue
virtual QGCVideoStreamInfo * _findStream(uint8_t streamID, bool report=true)
qreal _trackingImageRadius
CaptureVideoState captureVideoState() const override
static constexpr const char * kUpdates
int _cameraCaptureStatusRetries
void handleCameraSettings(const mavlink_camera_settings_t &settings) override
QMap< QString, QStringList > _requestUpdates
void _paramDone() override
Q_INVOKABLE void stopTracking() override
~VehicleCameraControl() override
Fact * aperture() override
static constexpr const char * kParameterrange
static constexpr const char * kParameters
Q_INVOKABLE void resumeStream() override
bool photosInVideoMode() const override
quint32 recordTime() const override
virtual void _requestCameraSettings()
static constexpr const char * kCAM_EV
bool isBasic() const override
int _cameraSettingsRetries
bool hasZoom() const override
StorageStatus _storageStatus
Q_INVOKABLE bool stopTakePhoto() override
void setCurrentStream(int stream) override
QNetworkAccessManager * _netManager
bool videoInPhotoMode() const override
Q_INVOKABLE void stopZoom() override
static constexpr const char * kLocalization
QString modelName() const override
virtual void _setPhotoCaptureStatus(PhotoCaptureStatus captureStatus)
static constexpr const char * kCAM_WBMODE
QGCVideoStreamInfo * currentStreamInstance() override
QPointF _trackingImagePoint
virtual void _setVideoCaptureStatus(VideoCaptureStatus captureStatus)
bool _trackingImageIsActive
mavlink_camera_information_t _mavlinkCameraInfo
static constexpr const char * kCAM_MODE
static constexpr const char * kThermalOpacity
WeakLinkInterfacePtr primaryLink() const
QGCCameraManager * cameraManager()
void sendMavCommand(int compId, MAV_CMD command, bool showError, float param1=0.0f, float param2=0.0f, float param3=0.0f, float param4=0.0f, float param5=0.0f, float param6=0.0f, float param7=0.0f)
VehicleLinkManager * vehicleLinkManager()
bool sendMessageOnLinkThreadSafe(LinkInterface *link, mavlink_message_t message)
FTPManager * ftpManager()
void mavCommandResult(int vehicleId, int targetComponent, int command, int ackResult, int failureCode)
Q_INVOKABLE void stopRecording()
Q_INVOKABLE void startRecording(const QString &videoFile=QString())
static VideoManager * instance()
void recordingChanged(bool recording)
Q_INVOKABLE void grabImage(const QString &imageFile=QString())
QString decompressIfNeeded(const QString &filePath, const QString &outputPath, bool removeOriginal)
void configureProxy(QNetworkAccessManager *manager)
Set up default proxy configuration on a network manager.
QString redactedUrlForLogging(const QUrl &url)
QString numberToString(quint64 number)
Decimal integer (e.g. "1,234,567").
QString bigSizeMBToString(quint64 sizeMB)
MB-scaled size, output in MB/GB/TB. Input is in MB.
void showAppMessage(const QString &message, const QString &title)
Modal application message. Queued if the UI isn't ready yet.