7#include <QtQml/QQmlEngine>
11 , _distanceMode (masterController->missionController()->globalAltitudeModeDefault())
12 , _knownCameraList (masterController->controllerVehicle()->staticCameraList())
13 , _metaDataMap (
FactMetaData::createMapFromJsonFile(QStringLiteral(
":/json/CameraCalc.FactMetaData.json"), this))
14 , _cameraNameFact (settingsGroup, _metaDataMap[cameraNameName])
15 , _valueSetIsDistanceFact (settingsGroup, _metaDataMap[valueSetIsDistanceName])
16 , _distanceToSurfaceFact (settingsGroup, _metaDataMap[distanceToSurfaceName])
17 , _imageDensityFact (settingsGroup, _metaDataMap[imageDensityName])
18 , _frontalOverlapFact (settingsGroup, _metaDataMap[frontalOverlapName])
19 , _sideOverlapFact (settingsGroup, _metaDataMap[sideOverlapName])
20 , _adjustedFootprintSideFact (settingsGroup, _metaDataMap[adjustedFootprintSideName])
21 , _adjustedFootprintFrontalFact (settingsGroup, _metaDataMap[adjustedFootprintFrontalName])
23 QQmlEngine::setObjectOwnership(
this, QQmlEngine::CppOwnership);
30 connect(&_adjustedFootprintSideFact, &
Fact::valueChanged,
this, &CameraCalc::_setDirty);
31 connect(&_adjustedFootprintFrontalFact, &
Fact::valueChanged,
this, &CameraCalc::_setDirty);
52 _cameraBrandList.append(xlatCustomCameraName());
53 for (
int cameraIndex=0; cameraIndex<_knownCameraList.count(); cameraIndex++) {
55 if (!_cameraBrandList.contains(cameraMetaData->brand)) {
56 _cameraBrandList.append(cameraMetaData->brand);
61 _setBrandModelFromCanonicalName(_cameraNameFact.rawValue().toString());
66void CameraCalc::_cameraNameChanged(
void)
72 QString cameraName = _cameraNameFact.rawValue().toString();
83 for (
int cameraIndex=0; cameraIndex<_knownCameraList.count(); cameraIndex++) {
85 if (cameraName == cameraMetaData->canonicalName) {
86 knownCameraMetaData = cameraMetaData;
91 if (!knownCameraMetaData) {
98 _disableRecalc =
true;
100 sensorWidth()->setRawValue (knownCameraMetaData->sensorWidth);
101 sensorHeight()->setRawValue (knownCameraMetaData->sensorHeight);
102 imageWidth()->setRawValue (knownCameraMetaData->imageWidth);
103 imageHeight()->setRawValue (knownCameraMetaData->imageHeight);
104 focalLength()->setRawValue (knownCameraMetaData->focalLength);
105 landscape()->setRawValue (knownCameraMetaData->landscape);
109 _disableRecalc =
false;
112 _recalcTriggerDistance();
119void CameraCalc::_recalcTriggerDistance(
void)
125 _disableRecalc =
true;
128 double sensorWidth = this->sensorWidth()->rawValue().toDouble();
132 double imageDensity = _imageDensityFact.rawValue().toDouble();
138 if (_valueSetIsDistanceFact.rawValue().toBool()) {
139 _imageDensityFact.setRawValue((_distanceToSurfaceFact.rawValue().toDouble() * sensorWidth * 100.0) / (
imageWidth *
focalLength));
141 _distanceToSurfaceFact.setRawValue((
imageWidth * _imageDensityFact.rawValue().toDouble() *
focalLength) / (sensorWidth * 100.0));
153 _adjustedFootprintSideFact.setRawValue (_imageFootprintSide * ((100.0 - _sideOverlapFact.rawValue().toDouble()) / 100.0));
154 _adjustedFootprintFrontalFact.setRawValue (_imageFootprintFrontal * ((100.0 - _frontalOverlapFact.rawValue().toDouble()) / 100.0));
159 _disableRecalc =
false;
182 QJsonObject json = originalJson;
194 int cameraSpec = json[_jsonCameraSpecTypeKeyDeprecated].toInt(CameraSpecNone);
195 if (cameraSpec == CameraSpecCustom) {
197 }
else if (cameraSpec == CameraSpecNone) {
200 json.remove(_jsonCameraSpecTypeKeyDeprecated);
207 if (deprecatedFollowTerrain) {
212 json.remove(_jsonDistanceToSurfaceRelativeKeyDeprecated);
216 errorString = tr(
"CameraCalc section version %1 not supported").arg(version);
220 QList<JsonHelper::KeyValidateInfo> keyInfoList1 = {
231 _disableRecalc = !forPresets;
235 QString canonicalCameraName = _validCanonicalCameraName(json[
cameraNameName].toString());
236 _cameraNameFact.setRawValue(canonicalCameraName);
245 QList<JsonHelper::KeyValidateInfo> keyInfoList2 = {
252 _disableRecalc =
false;
262 _disableRecalc =
false;
267 _disableRecalc =
false;
269 _setBrandModelFromCanonicalName(canonicalCameraName);
277 return "Custom Camera";
283 return "Manual (no camera specs)";
286QString CameraCalc::xlatCustomCameraName(
void)
288 return tr(
"Custom Camera");
293 return tr(
"Manual (no camera specs)");
298 if (altMode != _distanceMode) {
299 _distanceMode = altMode;
304void CameraCalc::_setDirty(
void)
313 if (cameraBrand != _cameraBrand) {
314 QString newCameraName = cameraBrand;
316 _cameraBrand = cameraBrand;
317 _cameraModel.clear();
321 for (
int cameraIndex=0; cameraIndex<_knownCameraList.count(); cameraIndex++) {
322 firstCameraMetaData = _knownCameraList[cameraIndex].value<
CameraMetaData*>();
323 if (firstCameraMetaData->brand == _cameraBrand) {
327 newCameraName = firstCameraMetaData->canonicalName;
328 _cameraModel = firstCameraMetaData->model;
333 _rebuildCameraModelList();
335 _cameraNameFact.setRawValue(newCameraName);
341 if (cameraModel != _cameraModel) {
342 _cameraModel = cameraModel;
345 for (
int cameraIndex=0; cameraIndex<_knownCameraList.count(); cameraIndex++) {
347 if (cameraMetaData->brand == _cameraBrand && cameraMetaData->model == _cameraModel) {
348 _cameraNameFact.setRawValue(cameraMetaData->canonicalName);
356void CameraCalc::_setBrandModelFromCanonicalName(
const QString& cameraName)
358 _cameraBrand = cameraName;
359 _cameraModel.clear();
360 _cameraModelList.clear();
363 for (
int cameraIndex=0; cameraIndex<_knownCameraList.count(); cameraIndex++) {
365 if (cameraMetaData->canonicalName == cameraName) {
366 _cameraBrand = cameraMetaData->brand;
367 _cameraModel = cameraMetaData->model;
375 _rebuildCameraModelList();
378void CameraCalc::_rebuildCameraModelList(
void)
380 _cameraModelList.clear();
382 for (
int cameraIndex=0; cameraIndex<_knownCameraList.count(); cameraIndex++) {
384 if (cameraMetaData->brand == _cameraBrand) {
385 _cameraModelList.append(cameraMetaData->model);
395 _disableRecalc =
true;
396 QString canonicalCameraName = _validCanonicalCameraName(cameraName);
397 _cameraNameFact.setRawValue(cameraName);
398 _disableRecalc =
true;
400 _setBrandModelFromCanonicalName(canonicalCameraName);
403QString CameraCalc::_validCanonicalCameraName(
const QString& cameraName)
405 QString canonicalCameraName = cameraName;
410 }
else if (cameraName == xlatCustomCameraName()) {
414 for (
int cameraIndex=0; cameraIndex<_knownCameraList.count(); cameraIndex++) {
416 if (cameraName == cameraMetaData->canonicalName || cameraName == cameraMetaData->deprecatedTranslatedName) {
417 return cameraMetaData->canonicalName;
425 return canonicalCameraName;
static constexpr const char * distanceModeName
void save(QJsonObject &json) const
void _setCameraNameFromV3TransectLoad(const QString &cameraName)
static constexpr const char * sideOverlapName
void cameraModelListChanged(void)
Fact * imageDensity(void)
QString xlatCustomCameraName READ xlatCustomCameraName static CONSTANT(QString xlatManualCameraName READ xlatManualCameraName CONSTANT) 1(bool isManualCamera READ isManualCamera NOTIFY isManualCameraChanged) 1(bool isCustomCamera READ isCustomCamera NOTIFY isCustomCameraChanged) 1(QString cameraBrand MEMBER _cameraBrand WRITE setCameraBrand NOTIFY cameraBrandChanged) 1(QString cameraModel MEMBER _cameraModel WRITE setCameraModel NOTIFY cameraModelChanged) 1(QStringList cameraBrandList MEMBER _cameraBrandList CONSTANT) 1(QStringList cameraModelList MEMBER _cameraModelList NOTIFY cameraModelListChanged) 1(Fact *valueSetIsDistance READ valueSetIsDistance CONSTANT) 1(Fact *distanceToSurface READ distanceToSurface CONSTANT) 1(Fact *imageDensity READ imageDensity CONSTANT) 1(Fact *frontalOverlap READ frontalOverlap CONSTANT) 1(Fact *sideOverlap READ sideOverlap CONSTANT) 1(Fact *adjustedFootprintSide READ adjustedFootprintSide CONSTANT) 1(Fact *adjustedFootprintFrontal READ adjustedFootprintFrontal CONSTANT) 1(QGroundControlQmlGlobal QStrin xlatManualCameraName)(void)
< User visible camera name for custom camera setting
CameraCalc(PlanMasterController *masterController, const QString &settingsGroup, QObject *parent=nullptr)
static constexpr const char * frontalOverlapName
static constexpr const char * adjustedFootprintFrontalName
bool isCustomCamera(void) const
bool isManualCamera(void) const
void setDistanceMode(QGroundControlQmlGlobal::AltMode altMode)
void imageFootprintSideChanged(double imageFootprintSide)
static constexpr const char * adjustedFootprintSideName
static constexpr const char * valueSetIsDistanceName
void cameraBrandChanged(void)
static constexpr const char * cameraNameName
void distanceModeChanged(int altMode)
void isCustomCameraChanged(void)
bool load(const QJsonObject &json, bool deprecatedFollowTerrain, QString &errorString, bool forPresets)
QGroundControlQmlGlobal::AltMode distanceMode(void) const
static QString canonicalCustomCameraName(void)
void setCameraBrand(const QString &cameraBrand)
static constexpr const char * distanceToSurfaceName
static constexpr const char * imageDensityName
void isManualCameraChanged(void)
Fact * valueSetIsDistance(void)
void cameraModelChanged(void)
void imageFootprintFrontalChanged(double imageFootprintFrontal)
void setCameraModel(const QString &cameraModel)
static QString canonicalManualCameraName(void)
SettingsFact * minTriggerInterval(void)
SettingsFact * imageHeight(void)
SettingsFact * fixedOrientation(void)
void save(QJsonObject &json) const
SettingsFact * focalLength(void)
void setDirty(bool dirty)
SettingsFact * sensorHeight(void)
SettingsFact * imageWidth(void)
bool load(const QJsonObject &json, QString &errorString)
SettingsFact * landscape(void)
void rawValueChanged(const QVariant &value)
void valueChanged(const QVariant &value)
This signal is only meant for use by the QT property system. It should not be connected to by client ...
Master controller for mission, fence, rally.
@ AltitudeModeCalcAboveTerrain
constexpr const char * jsonVersionKey
bool validateKeys(const QJsonObject &jsonObject, const QList< KeyValidateInfo > &keyInfo, QString &errorString)