22#include <QtNetwork/QNetworkAccessManager>
26#include <QtCore/QSettings>
27#include <QtXml/QDomDocument>
28#include <QtXml/QDomNodeList>
29#include <QtQml/QQmlEngine>
30#include <QtNetwork/QNetworkReply>
42 , exclusions(exclusions_)
50 , targetParam(targetParam_)
51 , condition(condition_)
53 , optValues(optValues_)
59 QDomNamedNodeMap attrs = node.attributes();
63 QDomNode subNode = attrs.namedItem(tagName);
64 if(subNode.isNull()) {
67 target = subNode.nodeValue() !=
"0";
73 QDomNamedNodeMap attrs = node.attributes();
77 QDomNode subNode = attrs.namedItem(tagName);
78 if(subNode.isNull()) {
81 target = subNode.nodeValue().toInt();
85static bool read_attribute(QDomNode& node,
const char* tagName, QString& target)
87 QDomNamedNodeMap attrs = node.attributes();
91 QDomNode subNode = attrs.namedItem(tagName);
92 if(subNode.isNull()) {
95 target = subNode.nodeValue();
99static bool read_value(QDomNode& element,
const char* tagName, QString& target)
101 QDomElement de = element.firstChildElement(tagName);
113 QQmlEngine::setObjectOwnership(
this, QQmlEngine::CppOwnership);
117 _vendor = QString(
reinterpret_cast<const char*
>(info->vendor_name));
118 _modelName = QString(
reinterpret_cast<const char*
>(info->model_name));
119 _cacheFile = QString::asprintf(
"%s/%s_%s_%03d.xml",
127 if(info->cam_definition_uri[0] != 0) {
129 _handleDefinitionFile(info->cam_definition_uri);
149 constexpr int kCameraSettingsRefreshDelayMsecs = 1000;
161 qCDebug(VehicleCameraControlLog) <<
"Camera Info:";
162 qCDebug(VehicleCameraControlLog) <<
" vendor:" <<
vendor();
163 qCDebug(VehicleCameraControlLog) <<
" model:" <<
modelName();
164 qCDebug(VehicleCameraControlLog) <<
" version:" <<
version();
166 qCDebug(VehicleCameraControlLog) <<
" focal length:" <<
focalLength();
167 qCDebug(VehicleCameraControlLog) <<
" sensor size:" <<
sensorSize();
168 qCDebug(VehicleCameraControlLog) <<
" resolution:" <<
resolution();
169 qCDebug(VehicleCameraControlLog) <<
" captures video:" <<
capturesVideo();
170 qCDebug(VehicleCameraControlLog) <<
" captures photos:" <<
capturesPhotos();
171 qCDebug(VehicleCameraControlLog) <<
" has modes:" <<
hasModes();
172 qCDebug(VehicleCameraControlLog) <<
" has zoom:" <<
hasZoom();
173 qCDebug(VehicleCameraControlLog) <<
" has focus:" <<
hasFocus();
174 qCDebug(VehicleCameraControlLog) <<
" has tracking:" <<
hasTracking();
175 qCDebug(VehicleCameraControlLog) <<
" has video stream:" <<
hasVideoStream();
176 qCDebug(VehicleCameraControlLog) <<
" photos in video mode:" <<
photosInVideoMode();
177 qCDebug(VehicleCameraControlLog) <<
" video in photo mode:" <<
videoInPhotoMode();
197 qCDebug(VehicleCameraControlLog) <<
"_initWhenReady()";
199 qCDebug(VehicleCameraControlLog) <<
"Basic, MAVLink only messages, no parameters.";
240 return _mavlinkCameraInfo.flags & (CAMERA_CAP_FLAGS_CAPTURE_VIDEO | CAMERA_CAP_FLAGS_HAS_VIDEO_STREAM);
247 return _mavlinkCameraInfo.flags & (CAMERA_CAP_FLAGS_CAPTURE_IMAGE | CAMERA_CAP_FLAGS_HAS_VIDEO_STREAM);
292 return QString::asprintf(
"%d.%d.%d.%d", major, minor, patch, dev);
294 return QString::asprintf(
"%d.%d.%d", major, minor, patch);
299 return QTime(0, 0).addMSecs(
static_cast<int>(
recordTime())).toString(
"hh:mm:ss");
321 qCWarning(VehicleCameraControlLog) <<
"Camera does not support modes";
325 qCDebug(VehicleCameraControlLog) <<
"Camera set to video mode";
335 qCWarning(VehicleCameraControlLog) <<
"Camera does not support modes";
339 qCDebug(VehicleCameraControlLog) <<
"Camera set to photo mode";
349 qCWarning(VehicleCameraControlLog) <<
"Camera does not support modes";
353 qCWarning(VehicleCameraControlLog) <<
"Invalid camera mode" <<
cameraMode;
371 MAV_CMD_SET_CAMERA_MODE,
447 qCWarning(VehicleCameraControlLog) <<
"Take photo denied - photo capture is disabled";
451 qCWarning(VehicleCameraControlLog) <<
"Take photo denied - already capturing";
455 qCDebug(VehicleCameraControlLog) <<
"takePhoto()";
457 const bool canUseMavlinkImageCapture =
461 if (canUseMavlinkImageCapture) {
464 MAV_CMD_IMAGE_START_CAPTURE,
476 QTimer::singleShot(500,
this, [
this]() {
481 QGC::showAppMessage(tr(
"Timelapse photo capture is not supported on cameras without still capture capability"));
494 qCWarning(VehicleCameraControlLog) <<
"Stop taking photos requested - not currently capturing multiple photos";
498 qCDebug(VehicleCameraControlLog) <<
"Camera stop taking photos";
503 MAV_CMD_IMAGE_STOP_CAPTURE,
518 qCWarning(VehicleCameraControlLog) <<
"Start video denied - already recording";
522 qCWarning(VehicleCameraControlLog) <<
"Start video denied - video capture is disabled";
528 qCDebug(VehicleCameraControlLog) <<
"Start video recording:" << (useMavlinkCommand ?
"MAVLink command" :
"VideoManager");
530 if (useMavlinkCommand) {
533 MAV_CMD_VIDEO_START_CAPTURE,
551 qCWarning(VehicleCameraControlLog) <<
"Stop video recording requested - already idle";
557 qCDebug(VehicleCameraControlLog) <<
"Camera stop video recording" << (useMavlinkCommand ?
"MAVLink command" :
"VideoManager");
559 if (useMavlinkCommand) {
562 MAV_CMD_VIDEO_STOP_CAPTURE,
583 if(val < 0.0) val = 0.0;
584 if(val > 100.0) val = 100.0;
595 qCDebug(VehicleCameraControlLog) <<
"Camera set zoom level to" << level;
598 level = std::min(std::max(level, 0.0), 100.0);
602 MAV_CMD_SET_CAMERA_ZOOM,
605 static_cast<float>(level));
612 qCDebug(VehicleCameraControlLog) <<
"Camera set focus level to" << level;
615 level = std::min(std::max(level, 0.0), 100.0);
619 MAV_CMD_SET_CAMERA_FOCUS,
622 static_cast<float>(level));
630 qCDebug(VehicleCameraControlLog) <<
"resetSettings()";
634 MAV_CMD_RESET_CAMERA_SETTINGS,
643 qCDebug(VehicleCameraControlLog) <<
"formatCard()";
647 MAV_CMD_STORAGE_FORMAT,
657 qCDebug(VehicleCameraControlLog) <<
"Camera step zoom" << direction;
661 MAV_CMD_SET_CAMERA_ZOOM,
670 qCDebug(VehicleCameraControlLog) <<
"Camera start zoom" << direction;
674 MAV_CMD_SET_CAMERA_ZOOM,
676 ZOOM_TYPE_CONTINUOUS,
683 qCDebug(VehicleCameraControlLog) <<
"Camera stop zoom";
687 MAV_CMD_SET_CAMERA_ZOOM,
689 ZOOM_TYPE_CONTINUOUS,
696 qCDebug(VehicleCameraControlLog) <<
"Camera step focus" << direction;
700 MAV_CMD_SET_CAMERA_FOCUS,
709 qCDebug(VehicleCameraControlLog) <<
"Camera start focus" << direction;
713 MAV_CMD_SET_CAMERA_FOCUS,
715 FOCUS_TYPE_CONTINUOUS,
722 qCDebug(VehicleCameraControlLog) <<
"Camera stop focus";
726 MAV_CMD_SET_CAMERA_FOCUS,
728 FOCUS_TYPE_CONTINUOUS,
738 qCDebug(VehicleCameraControlLog) <<
" Sending REQUEST_MESSAGE:MAVLINK_MSG_ID_CAMERA_CAPTURE_STATUS";
741 MAV_CMD_REQUEST_MESSAGE,
743 MAVLINK_MSG_ID_CAMERA_CAPTURE_STATUS);
745 qCDebug(VehicleCameraControlLog) <<
" Sending MAV_CMD_REQUEST_CAMERA_CAPTURE_STATUS (legacy)";
748 MAV_CMD_REQUEST_CAMERA_CAPTURE_STATUS,
757 _updateRanges(pFact);
762 Q_UNUSED(failureCode);
768 if (result == MAV_RESULT_IN_PROGRESS) {
770 qCDebug(VehicleCameraControlLog) <<
"In progress response for" << command;
771 }
else if(result == MAV_RESULT_ACCEPTED) {
773 case MAV_CMD_RESET_CAMERA_SETTINGS:
782 case MAV_CMD_VIDEO_START_CAPTURE:
786 case MAV_CMD_VIDEO_STOP_CAPTURE:
790 case MAV_CMD_REQUEST_CAMERA_CAPTURE_STATUS:
793 case MAV_CMD_REQUEST_STORAGE_INFORMATION:
796 case MAV_CMD_IMAGE_START_CAPTURE:
799 case MAV_CMD_SET_CAMERA_ZOOM:
800 case MAV_CMD_SET_CAMERA_FOCUS:
806 if ((result == MAV_RESULT_TEMPORARILY_REJECTED) || (result == MAV_RESULT_FAILED)) {
807 if (result == MAV_RESULT_TEMPORARILY_REJECTED) {
808 qCDebug(VehicleCameraControlLog) <<
"Command temporarily rejected (MAV_RESULT_TEMPORARILY_REJECTED) for" << commandStr;
810 qCDebug(VehicleCameraControlLog) <<
"Command failed (MAV_RESULT_FAILED) for" << commandStr;
813 case MAV_CMD_RESET_CAMERA_SETTINGS:
815 qCDebug(VehicleCameraControlLog) <<
"Failed to reset camera settings";
817 case MAV_CMD_IMAGE_START_CAPTURE:
818 case MAV_CMD_IMAGE_STOP_CAPTURE:
822 qCDebug(VehicleCameraControlLog) <<
"Giving up start/stop image capture";
826 case MAV_CMD_REQUEST_CAMERA_CAPTURE_STATUS:
830 qCDebug(VehicleCameraControlLog) <<
"Giving up requesting capture status";
833 case MAV_CMD_REQUEST_STORAGE_INFORMATION:
837 qCDebug(VehicleCameraControlLog) <<
"Giving up requesting storage status";
891 qCDebug(VehicleCameraControlLog) <<
"Set Photo Status:" << captureStatus;
897bool VehicleCameraControl::_loadCameraDefinitionFile(QByteArray& bytes)
899 QByteArray originalData(bytes);
901 if(!_handleLocalization(bytes)) {
906 const QDomDocument::ParseResult result = doc.setContent(bytes, QDomDocument::ParseOption::Default);
908 qCCritical(VehicleCameraControlLog) <<
"Unable to parse camera definition file on line:" << result.errorLine;
909 qCCritical(VehicleCameraControlLog) << result.errorMessage;
913 QDomNodeList defElements = doc.elementsByTagName(
kDefnition);
914 if(!defElements.size() || !_loadConstants(defElements)) {
915 qCWarning(VehicleCameraControlLog) <<
"Unable to load camera constants from camera definition";
919 QDomNodeList paramElements = doc.elementsByTagName(
kParameters);
920 if(!paramElements.size()) {
921 qCDebug(VehicleCameraControlLog) <<
"No parameters to load from camera";
924 if(!_loadSettings(paramElements)) {
925 qCWarning(VehicleCameraControlLog) <<
"Unable to load camera parameters from camera definition";
930 qCDebug(VehicleCameraControlLog) <<
"Saving camera definition file" <<
_cacheFile;
932 if (!file.open(QIODevice::WriteOnly)) {
933 qWarning() << QString(
"Could not save cache file %1. Error: %2").arg(
_cacheFile).arg(file.errorString());
935 file.write(originalData);
941bool VehicleCameraControl::_loadConstants(
const QDomNodeList nodeList)
943 QDomNode node = nodeList.item(0);
956bool VehicleCameraControl::_loadSettings(
const QDomNodeList nodeList)
958 QDomNode node = nodeList.item(0);
959 QDomElement elem = node.toElement();
960 QDomNodeList parameters = elem.elementsByTagName(
kParameter);
962 for(
int i = 0; i < parameters.size(); i++) {
963 QDomNode parameterNode = parameters.item(i);
972 qCritical() <<
"Parameter entry missing parameter name";
977 for(
int i = 0; i < parameters.size(); i++) {
978 QDomNode parameterNode = parameters.item(i);
983 qCritical() << QString(
"Parameter %1 missing parameter type").arg(factName);
990 bool readOnly =
false;
993 bool writeOnly =
false;
996 if(readOnly && writeOnly) {
997 qCritical() << QString(
"Parameter %1 cannot be both read only and write only").arg(factName);
1003 qCritical() << QString(
"Unknown type for parameter %1").arg(factName);
1011 QString description;
1013 qCritical() << QString(
"Parameter %1 missing parameter description").arg(factName);
1017 QStringList updates = _loadUpdates(parameterNode);
1018 if(updates.size()) {
1019 qCDebug(VehicleCameraControlVerboseLog) <<
"Parameter" << factName <<
"requires updates for:" << updates;
1024 QQmlEngine::setObjectOwnership(metaData, QQmlEngine::CppOwnership);
1031 QDomElement optionElem = parameterNode.toElement();
1032 QDomNodeList optionsRoot = optionElem.elementsByTagName(
kOptions);
1033 if(optionsRoot.size()) {
1035 QDomNode optionsNode = optionsRoot.item(0);
1036 QDomElement optionsElem = optionsNode.toElement();
1037 QDomNodeList options = optionsElem.elementsByTagName(
kOption);
1038 for(
int optionIndex = 0; optionIndex < options.size(); optionIndex++) {
1039 QDomNode option = options.item(optionIndex);
1042 QVariant optVariant;
1043 if(!_loadNameValue(option, factName, metaData, optName, optValue, optVariant)) {
1051 QStringList exclusions = _loadExclusions(option);
1052 if(exclusions.size()) {
1053 qCDebug(VehicleCameraControlVerboseLog) <<
"New exclusions:" << factName << optValue << exclusions;
1055 QQmlEngine::setObjectOwnership(pExc, QQmlEngine::CppOwnership);
1059 if(!_loadRanges(option, factName, optValue)) {
1065 QString defaultValue;
1067 QVariant defaultVariant;
1072 qWarning() <<
"Invalid default value for" << factName
1073 <<
" type:" << metaData->
type()
1074 <<
" value:" << defaultValue
1080 qWarning() << QStringLiteral(
"Duplicate fact name:") << factName;
1087 QVariant typedValue;
1092 qWarning() <<
"Invalid min value for" << factName
1093 <<
" type:" << metaData->
type()
1094 <<
" value:" << attr
1103 QVariant typedValue;
1108 qWarning() <<
"Invalid max value for" << factName
1109 <<
" type:" << metaData->
type()
1110 <<
" value:" << attr
1119 QVariant typedValue;
1124 qWarning() <<
"Invalid step value for" << factName
1125 <<
" type:" << metaData->
type()
1126 <<
" value:" << attr
1135 QVariant typedValue;
1140 qWarning() <<
"Invalid decimal places value for" << factName
1141 <<
" type:" << metaData->
type()
1142 <<
" value:" << attr
1154 qCDebug(VehicleCameraControlLog) <<
"New parameter:" << factName << (readOnly ?
"ReadOnly" :
"Writable") << (writeOnly ?
"WriteOnly" :
"Readable");
1157 QQmlEngine::setObjectOwnership(pFact, QQmlEngine::CppOwnership);
1161 QQmlEngine::setObjectOwnership(pIO, QQmlEngine::CppOwnership);
1176bool VehicleCameraControl::_handleLocalization(QByteArray& bytes)
1179 const QDomDocument::ParseResult result = doc.setContent(bytes, QDomDocument::ParseOption::Default);
1181 qCritical() <<
"Unable to parse camera definition file on line:" << result.errorLine;
1182 qCritical() << result.errorMessage;
1186 QLocale locale = QLocale::system();
1187#if defined (Q_OS_MACOS)
1188 locale = QLocale(locale.name());
1190 QString localeName = locale.name().toLower().replace(
"-",
"_");
1191 qCDebug(VehicleCameraControlLog) <<
"Current locale:" << localeName;
1192 if(localeName ==
"en_us") {
1196 QDomNodeList locRoot = doc.elementsByTagName(
kLocalization);
1197 if(!locRoot.size()) {
1202 QDomNode node = locRoot.item(0);
1203 QDomElement elem = node.toElement();
1204 QDomNodeList locales = elem.elementsByTagName(
kLocale);
1205 for(
int i = 0; i < locales.size(); i++) {
1206 QDomNode localeNode = locales.item(i);
1209 qWarning() <<
"Localization entry is missing its name attribute";
1213 if(localeName == name.toLower().replace(
"-",
"_")) {
1214 return _replaceLocaleStrings(localeNode, bytes);
1218 localeName = localeName.left(3);
1219 for(
int i = 0; i < locales.size(); i++) {
1220 QDomNode localeNode = locales.item(i);
1223 if(name.toLower().startsWith(localeName)) {
1224 return _replaceLocaleStrings(localeNode, bytes);
1228 qWarning() <<
"No match for" << QLocale::system().name() <<
"in camera definition file";
1233bool VehicleCameraControl::_replaceLocaleStrings(
const QDomNode node, QByteArray& bytes)
1235 QDomElement stringElem = node.toElement();
1236 QDomNodeList strings = stringElem.elementsByTagName(
kStrings);
1237 for(
int i = 0; i < strings.size(); i++) {
1238 QDomNode stringNode = strings.item(i);
1243 QString o; o =
"\"" + original +
"\"";
1244 QString t; t =
"\"" + translated +
"\"";
1245 bytes.replace(o.toUtf8(), t.toUtf8());
1246 o =
">" + original +
"<";
1247 t =
">" + translated +
"<";
1248 bytes.replace(o.toUtf8(), t.toUtf8());
1258 for(
const QString& paramName:
_paramIO.keys()) {
1260 _paramIO[paramName]->setParamRequest();
1262 qCritical() <<
"QGCParamIO is NULL" << paramName;
1268 mavlink_msg_param_ext_request_list_pack_chan(
1271 sharedLink->mavlinkChannel(),
1274 static_cast<uint8_t
>(
compID()));
1277 qCDebug(VehicleCameraControlVerboseLog) <<
"Request all parameters";
1280QString VehicleCameraControl::_getParamName(
const char* param_id)
1283 char parameterNameWithNull[MAVLINK_MSG_PARAM_VALUE_FIELD_PARAM_ID_LEN + 1] = {};
1284 (void) strncpy(parameterNameWithNull, param_id, MAVLINK_MSG_PARAM_VALUE_FIELD_PARAM_ID_LEN);
1285 const QString parameterName(parameterNameWithNull);
1286 return parameterName;
1291 QString paramName = _getParamName(paramExtAck.param_id);
1292 qCDebug(VehicleCameraControlLog).noquote() <<
"Received PARAM_EXT_ACK:"
1293 <<
"\n\tParam name:" << paramName
1294 <<
"\n\tResult:" <<
static_cast<int>(paramExtAck.param_result)
1295 <<
"\n\tType:" <<
static_cast<int>(paramExtAck.param_type);
1297 if(!
_paramIO.contains(paramName)) {
1298 qCWarning(VehicleCameraControlLog) <<
"Received PARAM_EXT_ACK for unknown param:" << paramName;
1302 _paramIO[paramName]->handleParamAck(paramExtAck);
1304 qCritical() <<
"QGCParamIO is NULL" << paramName;
1310 QString paramName = _getParamName(paramExtValue.param_id);
1311 qCDebug(VehicleCameraControlLog).noquote() <<
"Received PARAM_EXT_VALUE:"
1312 <<
"\n\tParam name:" << paramName
1313 <<
"\n\tType:" <<
static_cast<int>(paramExtValue.param_type)
1314 <<
"\n\tIndex:" <<
static_cast<int>(paramExtValue.param_index)
1315 <<
"\n\tCount:" <<
static_cast<int>(paramExtValue.param_count);
1317 if(!
_paramIO.contains(paramName)) {
1318 qCWarning(VehicleCameraControlLog) <<
"Received PARAM_EXT_VALUE for unknown param:" << paramName;
1322 _paramIO[paramName]->handleParamValue(paramExtValue);
1324 qCritical() <<
"QGCParamIO is NULL" << paramName;
1328void VehicleCameraControl::_updateActiveList()
1331 QStringList exclusionList;
1336 if(param->value == option) {
1337 exclusionList << param->exclusions;
1343 if(!exclusionList.contains(key)) {
1348 qCDebug(VehicleCameraControlVerboseLog) <<
"Excluding" << exclusionList;
1358bool VehicleCameraControl::_processConditionTest(
const QString conditionTest)
1367 qCDebug(VehicleCameraControlVerboseLog) <<
"_processConditionTest(" << conditionTest <<
")";
1371 auto split = [&conditionTest](
const QString& sep ) {
1372 return conditionTest.split(sep, Qt::SkipEmptyParts);
1375 if(conditionTest.contains(
"!=")) {
1377 op = TEST_NOT_EQUAL;
1378 }
else if(conditionTest.contains(
"=")) {
1381 }
else if(conditionTest.contains(
">")) {
1384 }
else if(conditionTest.contains(
"<")) {
1388 if(test.size() == 2) {
1394 case TEST_NOT_EQUAL:
1404 qWarning() <<
"Invalid condition parameter:" << test[0] <<
"in" << conditionTest;
1408 qWarning() <<
"Invalid condition" << conditionTest;
1412bool VehicleCameraControl::_processCondition(
const QString condition)
1414 qCDebug(VehicleCameraControlVerboseLog) <<
"_processCondition(" << condition <<
")";
1417 if(!condition.isEmpty()) {
1418 QStringList scond = condition.split(
" ", Qt::SkipEmptyParts);
1419 while(scond.size()) {
1420 QString test = scond.first();
1421 scond.removeFirst();
1423 result = result && _processConditionTest(test);
1425 result = result || _processConditionTest(test);
1430 andOp = scond.first().toUpper() ==
"AND";
1431 scond.removeFirst();
1437void VehicleCameraControl::_updateRanges(
Fact* pFact)
1439 QMap<Fact*, QGCCameraOptionRange*> rangesSet;
1440 QMap<Fact*, QString> rangesReset;
1441 QStringList changedList;
1442 QStringList resetList;
1443 QStringList updates;
1447 if(!changedList.contains(pRange->targetParam) && (pRange->param == pFact->
name() || pRange->condition.contains(pFact->
name()))) {
1450 if(pRFact && pTFact) {
1455 if(pRange->value == option && _processCondition(pRange->condition)) {
1458 rangesSet[pTFact] = pRange;
1460 changedList << pRange->targetParam;
1467 if(!changedList.contains(pRange->targetParam) && (pRange->param == pFact->
name() || pRange->condition.contains(pFact->
name()))) {
1469 if(!resetList.contains(pRange->targetParam)) {
1472 rangesReset[pTFact] = pRange->targetParam;
1474 resetList << pRange->targetParam;
1479 for (
Fact* f: rangesSet.keys()) {
1480 f->setEnumInfo(rangesSet[f]->optNames, rangesSet[f]->optVariants);
1481 if(!updates.contains(f->name())) {
1482 emit f->enumsChanged();
1483 qCDebug(VehicleCameraControlVerboseLog) <<
"Limited set of options for:" << f->name() << rangesSet[f]->optNames;;
1484 updates << f->name();
1488 for (
Fact* f: rangesReset.keys()) {
1490 if(!updates.contains(f->name())) {
1491 emit f->enumsChanged();
1492 qCDebug(VehicleCameraControlVerboseLog) <<
"Restore full set of options for:" << f->name() <<
_originalOptNames[f->name()];
1493 updates << f->name();
1525 qCDebug(VehicleCameraControlLog) <<
" Sending REQUEST_MESSAGE:MAVLINK_MSG_ID_CAMERA_SETTINGS";
1528 MAV_CMD_REQUEST_MESSAGE,
1530 MAVLINK_MSG_ID_CAMERA_SETTINGS);
1532 qCDebug(VehicleCameraControlLog) <<
" Sending MAV_CMD_REQUEST_CAMERA_SETTINGS (legacy)";
1535 MAV_CMD_REQUEST_CAMERA_SETTINGS,
1540 qCDebug(VehicleCameraControlLog) <<
"_requestCameraSettings() - RESTARTING already active timer";
1542 qCDebug(VehicleCameraControlLog) <<
"_requestCameraSettings() - starting timer";
1556 qCDebug(VehicleCameraControlLog) <<
" Sending REQUEST_MESSAGE:MAVLINK_MSG_ID_STORAGE_INFORMATION";
1559 MAV_CMD_REQUEST_MESSAGE,
1561 MAVLINK_MSG_ID_STORAGE_INFORMATION,
1564 qCDebug(VehicleCameraControlLog) <<
" Sending MAV_CMD_REQUEST_STORAGE_INFORMATION (legacy)";
1567 MAV_CMD_REQUEST_STORAGE_INFORMATION,
1572 qCDebug(VehicleCameraControlLog) <<
"_requestStorageInfo() - starting timer";
1579 qCDebug(VehicleCameraControlLog).noquote() <<
"Received CAMERA_SETTINGS - stopping timer, resetting retries:"
1580 <<
"\n\tMode:" << settings.mode_id
1581 <<
"\n\tZoom level:" << settings.zoomLevel
1582 <<
"\n\tFocus level:" << settings.focusLevel;
1588 qreal z =
static_cast<qreal
>(settings.zoomLevel);
1589 qreal f =
static_cast<qreal
>(settings.focusLevel);
1602 qCDebug(VehicleCameraControlLog) <<
"Received STORAGE_INFORMATION - stopping timer, resetting retries:"
1603 <<
"\n\tStorage id:" << storageInformation.storage_id
1604 <<
"\n\tStorage count:" << storageInformation.storage_count
1606 <<
"\n\tTotal capacity:" << storageInformation.total_capacity
1607 <<
"\n\tUsed capacity:" << storageInformation.used_capacity
1608 <<
"\n\tAvailable capacity:" << storageInformation.available_capacity;
1613 if(storageInformation.status == STORAGE_STATUS_READY) {
1614 uint32_t t =
static_cast<uint32_t
>(storageInformation.total_capacity);
1619 uint32_t a =
static_cast<uint32_t
>(storageInformation.available_capacity);
1633 qCDebug(VehicleCameraControlLog).noquote() <<
"Received BATTERY_STATUS:"
1634 <<
"\n\tBattery remaining (%):" << bs.battery_remaining;
1636 if(bs.battery_remaining >= 0 &&
_batteryRemaining !=
static_cast<int>(bs.battery_remaining)) {
1644 qCDebug(VehicleCameraControlLog).noquote() <<
"Received CAMERA_CAPTURE_STATUS - stopping timer, resetting retries:"
1647 <<
"\n\tInterval:" << cameraCaptureStatus.image_interval
1648 <<
"\n\tRecording time (ms):" << cameraCaptureStatus.recording_time_ms
1649 <<
"\n\tCapacity:" << cameraCaptureStatus.available_capacity;
1655 uint32_t a =
static_cast<uint32_t
>(cameraCaptureStatus.available_capacity);
1661 if(cameraCaptureStatus.recording_time_ms) {
1663 _recordTime = cameraCaptureStatus.recording_time_ms;
1664 _recTime =
_recTime.addMSecs(
_recTime.msecsTo(QTime::currentTime()) -
static_cast<int>(cameraCaptureStatus.recording_time_ms));
1684 const QString photoPath = photoDir +
"/" + QDateTime::currentDateTime().toString(
"yyyy-MM-dd_hh.mm.ss.zzz") +
".jpg";
1691 qCDebug(VehicleCameraControlLog).noquote() <<
"Received VIDEO_STREAM_INFORMATION:"
1692 <<
"\n\tStream ID:" << videoStreamInformation.stream_id
1693 <<
"\n\tStream count:" << videoStreamInformation.count
1694 <<
"\n\tType:" <<
static_cast<int>(videoStreamInformation.type)
1695 <<
"\n\tFlags:" << Qt::hex << Qt::showbase << videoStreamInformation.flags << Qt::dec << Qt::noshowbase
1696 <<
"\n\tBitrate (bits/s):" << videoStreamInformation.bitrate
1697 <<
"\n\tFramerate (fps):" << videoStreamInformation.framerate
1698 <<
"\n\tResolution:" << videoStreamInformation.resolution_h <<
"x" << videoStreamInformation.resolution_v
1699 <<
"\n\tRotation (deg):" << videoStreamInformation.rotation
1700 <<
"\n\tHFOV (deg):" << videoStreamInformation.hfov
1701 <<
"\n\tURI:" << videoStreamInformation.uri;
1704 if(!
_findStream(videoStreamInformation.stream_id,
false)) {
1705 qCDebug(VehicleCameraControlLog) <<
"Create stream handler for stream ID:" << videoStreamInformation.stream_id;
1707 QQmlEngine::setObjectOwnership(pStream, QQmlEngine::CppOwnership);
1723 qCDebug(VehicleCameraControlLog) <<
"All stream handlers done";
1733 qCDebug(VehicleCameraControlLog) <<
"Received VIDEO_STREAM_STATUS - stopping timer, resetting retries:"
1734 <<
"\n\tStream ID:" << videoStreamStatus.stream_id
1735 <<
"\n\tFlags:" << Qt::hex << Qt::showbase << videoStreamStatus.flags << Qt::dec << Qt::noshowbase
1736 <<
"\n\tBitrate (bits/s):" << videoStreamStatus.bitrate
1737 <<
"\n\tFramerate (fps):" << videoStreamStatus.framerate
1738 <<
"\n\tResolution: " << videoStreamStatus.resolution_h <<
"x" << videoStreamStatus.resolution_v
1739 <<
"\n\tRotation (deg):" << videoStreamStatus.rotation
1740 <<
"\n\tHFOV (deg):" << videoStreamStatus.hfov;
1747 pInfo->
update(videoStreamStatus);
1753 qCDebug(VehicleCameraControlLog).noquote() <<
"Received CAMERA_TRACKING_IMAGE_STATUS:"
1754 <<
"\n\tTracking status:" <<
static_cast<int>(trackingImageStatus.tracking_status)
1755 <<
"\n\tTracking mode:" <<
static_cast<int>(trackingImageStatus.tracking_mode)
1756 <<
"\n\tPoint:" << trackingImageStatus.point_x <<
"," << trackingImageStatus.point_y
1757 <<
"\n\tRectangle:" << trackingImageStatus.rec_top_x <<
"," << trackingImageStatus.rec_top_y
1758 <<
" -> " << trackingImageStatus.rec_bottom_x <<
"," << trackingImageStatus.rec_bottom_y
1759 <<
"\n\tRadius:" << trackingImageStatus.radius;
1764 const bool isPoint = active && (
_trackingImageStatus.tracking_mode == CAMERA_TRACKING_MODE_POINT);
1767 qCDebug(VehicleCameraControlLog) <<
"Tracking off";
1771 }
else if (isPoint) {
1775 if (qIsNaN(radius) || radius <= 0) {
1778 radius = std::clamp(radius, 0.0, 1.0);
1780 qCDebug(VehicleCameraControlLog) <<
"Tracking Point [" << point <<
"] radius:" << radius;
1792 const QRectF rect = QRectF(QPointF(std::clamp(
static_cast<qreal
>(
_trackingImageStatus.rec_top_x), 0.0, 1.0),
1796 qCDebug(VehicleCameraControlLog) <<
"Tracking Rect [" << rect <<
"]";
1820 qCDebug(VehicleCameraControlLog) <<
"Stopping stream:" << pInfo->
uri();
1824 MAV_CMD_VIDEO_STOP_STREAMING,
1832 qCDebug(VehicleCameraControlLog) <<
"Starting stream:" << pInfo->
uri();
1835 MAV_CMD_VIDEO_START_STREAMING,
1853 MAV_CMD_VIDEO_STOP_STREAMING,
1866 MAV_CMD_VIDEO_START_STREAMING,
1909 qCDebug(VehicleCameraControlLog) <<
"_requestStreamInfo() - stream:" << streamID <<
"retries:" <<
_videoStreamInfoRetries;
1913 qCDebug(VehicleCameraControlLog) <<
" Sending REQUEST_MESSAGE:MAVLINK_MSG_ID_VIDEO_STREAM_INFORMATION";
1916 MAV_CMD_REQUEST_MESSAGE,
1918 MAVLINK_MSG_ID_VIDEO_STREAM_INFORMATION,
1921 qCDebug(VehicleCameraControlLog) <<
" Sending MAV_CMD_REQUEST_VIDEO_STREAM_INFORMATION (legacy)";
1924 MAV_CMD_REQUEST_VIDEO_STREAM_INFORMATION,
1933 qCDebug(VehicleCameraControlLog) <<
"_requestStreamStatus() - stream:" << streamID <<
"retries:" <<
_videoStreamStatusRetries;
1937 qCDebug(VehicleCameraControlLog) <<
" Sending REQUEST_MESSAGE:MAVLINK_MSG_ID_VIDEO_STREAM_STATUS";
1940 MAV_CMD_REQUEST_MESSAGE,
1942 MAVLINK_MSG_ID_VIDEO_STREAM_STATUS,
1945 qCDebug(VehicleCameraControlLog) <<
" Sending MAV_CMD_REQUEST_VIDEO_STREAM_STATUS (legacy)";
1948 MAV_CMD_REQUEST_VIDEO_STREAM_STATUS,
1966 qCritical() <<
"Null QGCVideoStreamInfo instance";
1971 qWarning() <<
"Stream id not found:" << id;
1983 if(pStream->
name() == name) {
1997 qCWarning(VehicleCameraControlLog) <<
"Giving up requesting video stream info";
2019 qCWarning(VehicleCameraControlLog) <<
"Giving up requesting video stream status";
2034 qCWarning(VehicleCameraControlLog) <<
"Giving up requesting camera settings after" <<
_cameraSettingsRetries <<
"retries";
2038 qCDebug(VehicleCameraControlLog) <<
"_cameraSettingsTimeout() - calling _requestCameraSettings()";
2045 qCDebug(VehicleCameraControlLog) <<
"_storageInfoTimeout() - retries now:" <<
_storageInfoRetries;
2047 qCWarning(VehicleCameraControlLog) <<
"Giving up requesting storage info after" <<
_storageInfoRetries <<
"retries";
2051 qCDebug(VehicleCameraControlLog) <<
"_storageInfoTimeout() - calling _requestStorageInfo()";
2056VehicleCameraControl::_loadExclusions(QDomNode option)
2058 QStringList exclusionList;
2059 QDomElement optionElem = option.toElement();
2060 QDomNodeList excRoot = optionElem.elementsByTagName(
kExclusions);
2061 if(excRoot.size()) {
2063 QDomNode node = excRoot.item(0);
2064 QDomElement elem = node.toElement();
2065 QDomNodeList exclusions = elem.elementsByTagName(
kExclusion);
2066 for(
int i = 0; i < exclusions.size(); i++) {
2067 QString exclude = exclusions.item(i).toElement().text();
2068 if(!exclude.isEmpty()) {
2069 exclusionList << exclude;
2073 return exclusionList;
2077VehicleCameraControl::_loadUpdates(QDomNode option)
2079 QStringList updateList;
2080 QDomElement optionElem = option.toElement();
2081 QDomNodeList updateRoot = optionElem.elementsByTagName(
kUpdates);
2082 if(updateRoot.size()) {
2084 QDomNode node = updateRoot.item(0);
2085 QDomElement elem = node.toElement();
2086 QDomNodeList updates = elem.elementsByTagName(
kUpdate);
2087 for(
int i = 0; i < updates.size(); i++) {
2088 QString update = updates.item(i).toElement().text();
2089 if(!update.isEmpty()) {
2090 updateList << update;
2097bool VehicleCameraControl::_loadRanges(QDomNode option,
const QString factName, QString paramValue)
2099 QDomElement optionElem = option.toElement();
2101 if(rangeRoot.size()) {
2102 QDomNode node = rangeRoot.item(0);
2103 QDomElement elem = node.toElement();
2104 QDomNodeList parameterRanges = elem.elementsByTagName(
kParameterrange);
2106 for(
int i = 0; i < parameterRanges.size(); i++) {
2109 QDomNode paramRange = parameterRanges.item(i);
2111 qCritical() << QString(
"Malformed option range for parameter %1").arg(factName);
2115 QDomElement pelem = paramRange.toElement();
2116 QDomNodeList rangeOptions = pelem.elementsByTagName(
kRoption);
2117 QStringList optNames;
2118 QStringList optValues;
2120 for(
int rangeOptionIndex = 0; rangeOptionIndex < rangeOptions.size(); rangeOptionIndex++) {
2123 QDomNode roption = rangeOptions.item(rangeOptionIndex);
2125 qCritical() << QString(
"Malformed roption for parameter %1").arg(factName);
2129 qCritical() << QString(
"Malformed rvalue for parameter %1").arg(factName);
2132 optNames << optName;
2133 optValues << optValue;
2135 if(optNames.size()) {
2138 qCDebug(VehicleCameraControlVerboseLog) <<
"New range limit:" << factName << paramValue << param << condition << optNames << optValues;
2145void VehicleCameraControl::_processRanges()
2151 for(
int i = 0; i < pRange->optNames.size(); i++) {
2152 QVariant optVariant;
2155 qWarning() <<
"Invalid roption value, name:" << pRange->targetParam
2157 <<
" value:" << pRange->optValues[i]
2160 pRange->optVariants << optVariant;
2167bool VehicleCameraControl::_loadNameValue(QDomNode option,
const QString factName,
FactMetaData* metaData, QString& optName, QString& optValue, QVariant& optVariant)
2170 qCritical() << QString(
"Malformed option for parameter %1").arg(factName);
2174 qCritical() << QString(
"Malformed value for parameter %1").arg(factName);
2179 qWarning() <<
"Invalid option value, name:" << factName
2180 <<
" type:" << metaData->
type()
2181 <<
" value:" << optValue
2187void VehicleCameraControl::_handleDefinitionFile(
const QString &url)
2193 if (!xmlFile.exists() && url.startsWith(ftpPrefix, Qt::CaseInsensitive)) {
2194 qCDebug(VehicleCameraControlLog) <<
"No camera definition file cached, attempt ftp download";
2197 if (url.endsWith(
".lzma", Qt::CaseInsensitive)) { ext =
".lzma"; }
2198 if (url.endsWith(
".xz", Qt::CaseInsensitive)) { ext =
".xz"; }
2199 QString fileName = QString::asprintf(
"%s_%s_%03d.xml%s",
2200 _vendor.toStdString().c_str(),
2203 ext.toStdString().c_str());
2211 if (!xmlFile.exists()) {
2212 qCDebug(VehicleCameraControlLog) <<
"No camera definition file cached, attempt http download";
2216 if (!xmlFile.open(QIODevice::ReadOnly)) {
2217 qWarning() <<
"Could not read cached camera definition file:" <<
_cacheFile;
2221 QByteArray bytes = xmlFile.readAll();
2223 const QDomDocument::ParseResult result = doc.setContent(bytes, QDomDocument::ParseOption::Default);
2225 qWarning() <<
"Could not parse cached camera definition file:" <<
_cacheFile;
2230 qCDebug(VehicleCameraControlLog) <<
"Using cached camera definition file:" <<
_cacheFile;
2235void VehicleCameraControl::_httpRequest(
const QString &url)
2237 qCDebug(VehicleCameraControlLog) <<
"Request camera definition:" << url;
2242 QNetworkRequest request(QUrl::fromUserInput(url));
2243 request.setAttribute(QNetworkRequest::RedirectPolicyAttribute,
true);
2244 QSslConfiguration conf = request.sslConfiguration();
2245 conf.setPeerVerifyMode(QSslSocket::VerifyNone);
2246 request.setSslConfiguration(conf);
2253 QNetworkReply* reply = qobject_cast<QNetworkReply*>(sender());
2257 int err = reply->error();
2258 int http_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
2259 QByteArray data = reply->readAll();
2260 if(err == QNetworkReply::NoError && http_code == 200) {
2264 qWarning() << QString(
"Camera Definition (%1) download error: %2 status: %3").arg(
2265 reply->url().toDisplayString(),
2266 reply->errorString(),
2267 reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toString()
2274void VehicleCameraControl::_ftpDownloadComplete(
const QString& fileName,
const QString& errorMsg)
2276 qCDebug(VehicleCameraControlLog) <<
"FTP Download completed: " << fileName <<
", " << errorMsg;
2281 if (outputFileName.isEmpty()) {
2282 qCWarning(VehicleCameraControlLog) <<
"Inflate of compressed xml failed" << fileName;
2285 QFile xmlFile(outputFileName);
2287 if (!xmlFile.exists()) {
2288 qCDebug(VehicleCameraControlLog) <<
"No camera definition file present after ftp download completed";
2291 if (!xmlFile.open(QIODevice::ReadOnly)) {
2292 qWarning() <<
"Could not read downloaded camera definition file: " << fileName;
2297 QByteArray bytes = xmlFile.readAll();
2304 qCDebug(VehicleCameraControlLog) <<
"Parsing camera definition";
2305 _loadCameraDefinitionFile(data);
2307 qCDebug(VehicleCameraControlLog) <<
"No camera definition received, trying to search on our own...";
2308 QFile definitionFile;
2310 qCDebug(VehicleCameraControlLog) <<
"Found offline definition file for: " <<
_modelName <<
", loading: " << definitionFile.fileName();
2311 if (definitionFile.open(QIODevice::ReadOnly)) {
2312 QByteArray newData = definitionFile.readAll();
2313 _loadCameraDefinitionFile(newData);
2315 qCDebug(VehicleCameraControlLog) <<
"error opening offline definition file for: " <<
_modelName;
2318 qCDebug(VehicleCameraControlLog) <<
"No offline camera definition file found";
2326 for(
const QString& param:
_paramIO.keys()) {
2327 if(!
_paramIO[param]->paramDone()) {
2427 qCCritical(VehicleCameraControlLog) <<
"startTrackingRect called but camera does not have rectangle tracking capability";
2431 qCDebug(VehicleCameraControlLog) <<
"Start Tracking (Rectangle: ["
2432 <<
static_cast<float>(rec.x()) <<
", "
2433 <<
static_cast<float>(rec.y()) <<
"] - ["
2434 <<
static_cast<float>(rec.x() + rec.width()) <<
", "
2435 <<
static_cast<float>(rec.y() + rec.height()) <<
"]";
2438 MAV_CMD_CAMERA_TRACK_RECTANGLE,
2440 static_cast<float>(rec.x()),
2441 static_cast<float>(rec.y()),
2442 static_cast<float>(rec.x() + rec.width()),
2443 static_cast<float>(rec.y() + rec.height()));
2451 qCCritical(VehicleCameraControlLog) <<
"startTrackingPoint called but camera does not have point tracking capability";
2455 qCDebug(VehicleCameraControlLog) <<
"Start Tracking (Point: ["
2456 <<
static_cast<float>(point.x()) <<
", "
2457 <<
static_cast<float>(point.y()) <<
"], Radius: "
2458 <<
static_cast<float>(radius);
2461 MAV_CMD_CAMERA_TRACK_POINT,
2463 static_cast<float>(point.x()),
2464 static_cast<float>(point.y()),
2465 static_cast<float>(radius));
2472 qCDebug(VehicleCameraControlLog) <<
"Stop Tracking";
2476 MAV_CMD_CAMERA_STOP_TRACKING,
2481 MAV_CMD_SET_MESSAGE_INTERVAL,
2483 MAVLINK_MSG_ID_CAMERA_TRACKING_IMAGE_STATUS,
2503 MAV_CMD_SET_MESSAGE_INTERVAL,
2505 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_camera_information_t mavlink_camera_information_t
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)
virtual PhotoCaptureMode photoCaptureMode() const
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
@ 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()
AppSettings * appSettings() const
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)
bool ensureDirectoryExists(const QString &path)
void configureProxy(QNetworkAccessManager *manager)
Set up default proxy configuration on a network manager.
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.