Commit eab5fe7c authored by DonLakeFlyer's avatar DonLakeFlyer

Save fact settings for new Transect code

parent be3901a8
[
{
"name": "CameraName",
"shortDescription": "Camera name.",
"type": "string",
"defaultValue": "Manual (no camera specs)"
},
{
"name": "ValueSetIsDistance",
"shortDescription": "Value specified is distance to surface.",
......
......@@ -14,46 +14,39 @@
#include <QQmlEngine>
const char* CameraCalc::_valueSetIsDistanceName = "ValueSetIsDistance";
const char* CameraCalc::_distanceToSurfaceName = "DistanceToSurface";
const char* CameraCalc::_distanceToSurfaceRelativeName = "DistanceToSurfaceRelative";
const char* CameraCalc::_imageDensityName = "ImageDensity";
const char* CameraCalc::_frontalOverlapName = "FrontalOverlap";
const char* CameraCalc::_sideOverlapName = "SideOverlap";
const char* CameraCalc::_adjustedFootprintFrontalName = "AdjustedFootprintFrontal";
const char* CameraCalc::_adjustedFootprintSideName = "AdjustedFootprintSide";
const char* CameraCalc::_jsonCameraNameKey = "CameraName";
const char* CameraCalc::cameraNameName = "CameraName";
const char* CameraCalc::valueSetIsDistanceName = "ValueSetIsDistance";
const char* CameraCalc::distanceToSurfaceName = "DistanceToSurface";
const char* CameraCalc::distanceToSurfaceRelativeName = "DistanceToSurfaceRelative";
const char* CameraCalc::imageDensityName = "ImageDensity";
const char* CameraCalc::frontalOverlapName = "FrontalOverlap";
const char* CameraCalc::sideOverlapName = "SideOverlap";
const char* CameraCalc::adjustedFootprintFrontalName = "AdjustedFootprintFrontal";
const char* CameraCalc::adjustedFootprintSideName = "AdjustedFootprintSide";
const char* CameraCalc::_jsonCameraSpecTypeKey = "CameraSpecType";
CameraCalc::CameraCalc(Vehicle* vehicle, QObject* parent)
CameraCalc::CameraCalc(Vehicle* vehicle, QString settingsGroup, QObject* parent)
: CameraSpec (parent)
, _vehicle (vehicle)
, _dirty (false)
, _cameraName (manualCameraName())
, _disableRecalc (false)
, _distanceToSurfaceRelative (true)
, _metaDataMap (FactMetaData::createMapFromJsonFile(QStringLiteral(":/json/CameraCalc.FactMetaData.json"), this))
, _valueSetIsDistanceFact (0, _valueSetIsDistanceName, FactMetaData::valueTypeBool)
, _distanceToSurfaceFact (0, _distanceToSurfaceName, FactMetaData::valueTypeDouble)
, _imageDensityFact (0, _imageDensityName, FactMetaData::valueTypeDouble)
, _frontalOverlapFact (0, _frontalOverlapName, FactMetaData::valueTypeDouble)
, _sideOverlapFact (0, _sideOverlapName, FactMetaData::valueTypeDouble)
, _adjustedFootprintSideFact (0, _adjustedFootprintSideName, FactMetaData::valueTypeDouble)
, _adjustedFootprintFrontalFact (0, _adjustedFootprintFrontalName, FactMetaData::valueTypeDouble)
, _cameraNameFact (settingsGroup, _metaDataMap[cameraNameName])
, _valueSetIsDistanceFact (settingsGroup, _metaDataMap[valueSetIsDistanceName])
, _distanceToSurfaceFact (settingsGroup, _metaDataMap[distanceToSurfaceName])
, _imageDensityFact (settingsGroup, _metaDataMap[imageDensityName])
, _frontalOverlapFact (settingsGroup, _metaDataMap[frontalOverlapName])
, _sideOverlapFact (settingsGroup, _metaDataMap[sideOverlapName])
, _adjustedFootprintSideFact (settingsGroup, _metaDataMap[adjustedFootprintSideName])
, _adjustedFootprintFrontalFact (settingsGroup, _metaDataMap[adjustedFootprintFrontalName])
, _imageFootprintSide (0)
, _imageFootprintFrontal (0)
, _knownCameraList (_vehicle->staticCameraList())
{
QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership);
_valueSetIsDistanceFact.setMetaData (_metaDataMap[_valueSetIsDistanceName], true /* setDefaultFromMetaData */);
_distanceToSurfaceFact.setMetaData (_metaDataMap[_distanceToSurfaceName], true);
_imageDensityFact.setMetaData (_metaDataMap[_imageDensityName], true);
_frontalOverlapFact.setMetaData (_metaDataMap[_frontalOverlapName], true);
_sideOverlapFact.setMetaData (_metaDataMap[_sideOverlapName], true);
_adjustedFootprintSideFact.setMetaData (_metaDataMap[_adjustedFootprintSideName], true);
_adjustedFootprintFrontalFact.setMetaData (_metaDataMap[_adjustedFootprintFrontalName], true);
connect(&_valueSetIsDistanceFact, &Fact::valueChanged, this, &CameraCalc::_setDirty);
connect(&_distanceToSurfaceFact, &Fact::valueChanged, this, &CameraCalc::_setDirty);
connect(&_imageDensityFact, &Fact::valueChanged, this, &CameraCalc::_setDirty);
......@@ -61,11 +54,12 @@ CameraCalc::CameraCalc(Vehicle* vehicle, QObject* parent)
connect(&_sideOverlapFact, &Fact::valueChanged, this, &CameraCalc::_setDirty);
connect(&_adjustedFootprintSideFact, &Fact::valueChanged, this, &CameraCalc::_setDirty);
connect(&_adjustedFootprintFrontalFact, &Fact::valueChanged, this, &CameraCalc::_setDirty);
connect(this, &CameraCalc::cameraNameChanged, this, &CameraCalc::_setDirty);
connect(&_cameraNameFact, &Fact::valueChanged, this, &CameraCalc::_setDirty);
connect(this, &CameraCalc::distanceToSurfaceRelativeChanged, this, &CameraCalc::_setDirty);
connect(this, &CameraCalc::cameraNameChanged, this, &CameraCalc::_recalcTriggerDistance);
connect(this, &CameraCalc::cameraNameChanged, this, &CameraCalc::_adjustDistanceToSurfaceRelative);
connect(&_cameraNameFact, &Fact::valueChanged, this, &CameraCalc::_cameraNameChanged);
connect(&_cameraNameFact, &Fact::valueChanged, this, &CameraCalc::isManualCameraChanged);
connect(&_cameraNameFact, &Fact::valueChanged, this, &CameraCalc::isCustomCameraChanged);
connect(&_distanceToSurfaceFact, &Fact::rawValueChanged, this, &CameraCalc::_recalcTriggerDistance);
connect(&_imageDensityFact, &Fact::rawValueChanged, this, &CameraCalc::_recalcTriggerDistance);
......@@ -84,57 +78,64 @@ void CameraCalc::setDirty(bool dirty)
}
}
void CameraCalc::setCameraName(QString cameraName)
void CameraCalc::_cameraNameChanged(void)
{
if (cameraName != _cameraName) {
_cameraName = cameraName;
if (_disableRecalc) {
return;
}
if (_cameraName == manualCameraName() || _cameraName == customCameraName()) {
QString cameraName = _cameraNameFact.rawValue().toString();
// Validate known camera name
bool foundKnownCamera = false;
CameraMetaData* cameraMetaData = NULL;
if (!isManualCamera() && !isCustomCamera()) {
for (int cameraIndex=0; cameraIndex<_knownCameraList.count(); cameraIndex++) {
cameraMetaData = _knownCameraList[cameraIndex].value<CameraMetaData*>();
if (cameraName == cameraMetaData->name()) {
foundKnownCamera = true;
break;
}
}
if (!foundKnownCamera) {
// This will cause another camera changed signal which will recurse back to this routine
_cameraNameFact.setRawValue(customCameraName());
return;
}
}
_disableRecalc = true;
if (foundKnownCamera) {
sensorWidth()->setRawValue (cameraMetaData->sensorWidth());
sensorHeight()->setRawValue (cameraMetaData->sensorHeight());
imageWidth()->setRawValue (cameraMetaData->imageWidth());
imageHeight()->setRawValue (cameraMetaData->imageHeight());
focalLength()->setRawValue (cameraMetaData->focalLength());
landscape()->setRawValue (cameraMetaData->landscape());
fixedOrientation()->setRawValue (cameraMetaData->fixedOrientation());
minTriggerInterval()->setRawValue (cameraMetaData->minTriggerInterval());
} else {
if (isManualCamera() || isCustomCamera()) {
// These values are unknown for these types
fixedOrientation()->setRawValue(false);
minTriggerInterval()->setRawValue(0);
if (_cameraName == manualCameraName()) {
if (isManualCamera()) {
valueSetIsDistance()->setRawValue(false);
}
} else {
// This should be a known camera name. Update camera specs to new camera
bool foundKnownCamera = false;
CameraMetaData* cameraMetaData = NULL;
for (int cameraIndex=0; cameraIndex<_knownCameraList.count(); cameraIndex++) {
cameraMetaData = _knownCameraList[cameraIndex].value<CameraMetaData*>();
if (cameraName == cameraMetaData->name()) {
foundKnownCamera = true;
break;
}
}
_disableRecalc = true;
if (foundKnownCamera) {
sensorWidth()->setRawValue (cameraMetaData->sensorWidth());
sensorHeight()->setRawValue (cameraMetaData->sensorHeight());
imageWidth()->setRawValue (cameraMetaData->imageWidth());
imageHeight()->setRawValue (cameraMetaData->imageHeight());
focalLength()->setRawValue (cameraMetaData->focalLength());
landscape()->setRawValue (cameraMetaData->landscape());
fixedOrientation()->setRawValue (cameraMetaData->fixedOrientation());
minTriggerInterval()->setRawValue (cameraMetaData->minTriggerInterval());
} else {
// We don't know this camera, switch back to custom
_cameraName = customCameraName();
fixedOrientation()->setRawValue(false);
minTriggerInterval()->setRawValue(0);
}
_disableRecalc = false;
qWarning() << "Internal Error: Not known camera, but now manual or custom either";
}
emit cameraNameChanged(_cameraName);
}
_disableRecalc = false;
_recalcTriggerDistance();
_adjustDistanceToSurfaceRelative();
}
void CameraCalc::_recalcTriggerDistance(void)
{
if (_disableRecalc || _cameraName == manualCameraName()) {
if (_disableRecalc || isManualCamera()) {
return;
}
......@@ -178,18 +179,18 @@ void CameraCalc::_recalcTriggerDistance(void)
void CameraCalc::save(QJsonObject& json) const
{
json[JsonHelper::jsonVersionKey] = 1;
json[_adjustedFootprintSideName] = _adjustedFootprintSideFact.rawValue().toDouble();
json[_adjustedFootprintFrontalName] = _adjustedFootprintFrontalFact.rawValue().toDouble();
json[_distanceToSurfaceName] = _distanceToSurfaceFact.rawValue().toDouble();
json[_distanceToSurfaceRelativeName] = _distanceToSurfaceRelative;
json[_jsonCameraNameKey] = _cameraName;
json[adjustedFootprintSideName] = _adjustedFootprintSideFact.rawValue().toDouble();
json[adjustedFootprintFrontalName] = _adjustedFootprintFrontalFact.rawValue().toDouble();
json[distanceToSurfaceName] = _distanceToSurfaceFact.rawValue().toDouble();
json[distanceToSurfaceRelativeName] = _distanceToSurfaceRelative;
json[cameraNameName] = _cameraNameFact.rawValue().toString();
if (_cameraName != manualCameraName()) {
if (!isManualCamera()) {
CameraSpec::save(json);
json[_valueSetIsDistanceName] = _valueSetIsDistanceFact.rawValue().toBool();
json[_imageDensityName] = _imageDensityFact.rawValue().toDouble();
json[_frontalOverlapName] = _frontalOverlapFact.rawValue().toDouble();
json[_sideOverlapName] = _sideOverlapFact.rawValue().toDouble();
json[valueSetIsDistanceName] = _valueSetIsDistanceFact.rawValue().toBool();
json[imageDensityName] = _imageDensityFact.rawValue().toDouble();
json[frontalOverlapName] = _frontalOverlapFact.rawValue().toDouble();
json[sideOverlapName] = _sideOverlapFact.rawValue().toDouble();
}
}
......@@ -204,9 +205,9 @@ bool CameraCalc::load(const QJsonObject& json, QString& errorString)
// _jsonCameraNameKey only set if CameraSpecKnown
int cameraSpec = v1Json[_jsonCameraSpecTypeKey].toInt(CameraSpecNone);
if (cameraSpec == CameraSpecCustom) {
v1Json[_jsonCameraNameKey] = customCameraName();
v1Json[cameraNameName] = customCameraName();
} else if (cameraSpec == CameraSpecNone) {
v1Json[_jsonCameraNameKey] = manualCameraName();
v1Json[cameraNameName] = manualCameraName();
}
v1Json.remove(_jsonCameraSpecTypeKey);
v1Json[JsonHelper::jsonVersionKey] = 1;
......@@ -219,11 +220,11 @@ bool CameraCalc::load(const QJsonObject& json, QString& errorString)
}
QList<JsonHelper::KeyValidateInfo> keyInfoList1 = {
{ _jsonCameraNameKey, QJsonValue::String, true },
{ _adjustedFootprintSideName, QJsonValue::Double, true },
{ _adjustedFootprintFrontalName, QJsonValue::Double, true },
{ _distanceToSurfaceName, QJsonValue::Double, true },
{ _distanceToSurfaceRelativeName, QJsonValue::Bool, true },
{ cameraNameName, QJsonValue::String, true },
{ adjustedFootprintSideName, QJsonValue::Double, true },
{ adjustedFootprintFrontalName, QJsonValue::Double, true },
{ distanceToSurfaceName, QJsonValue::Double, true },
{ distanceToSurfaceRelativeName, QJsonValue::Bool, true },
};
if (!JsonHelper::validateKeys(v1Json, keyInfoList1, errorString)) {
return false;
......@@ -231,29 +232,29 @@ bool CameraCalc::load(const QJsonObject& json, QString& errorString)
_disableRecalc = true;
setCameraName(v1Json[_jsonCameraNameKey].toString());
_adjustedFootprintSideFact.setRawValue (v1Json[_adjustedFootprintSideName].toDouble());
_adjustedFootprintFrontalFact.setRawValue (v1Json[_adjustedFootprintFrontalName].toDouble());
_distanceToSurfaceFact.setRawValue (v1Json[_distanceToSurfaceName].toDouble());
_cameraNameFact.setRawValue (v1Json[cameraNameName].toString());
_adjustedFootprintSideFact.setRawValue (v1Json[adjustedFootprintSideName].toDouble());
_adjustedFootprintFrontalFact.setRawValue (v1Json[adjustedFootprintFrontalName].toDouble());
_distanceToSurfaceFact.setRawValue (v1Json[distanceToSurfaceName].toDouble());
_distanceToSurfaceRelative = v1Json[_distanceToSurfaceRelativeName].toBool();
_distanceToSurfaceRelative = v1Json[distanceToSurfaceRelativeName].toBool();
if (_cameraName != manualCameraName()) {
if (!isManualCamera()) {
QList<JsonHelper::KeyValidateInfo> keyInfoList2 = {
{ _valueSetIsDistanceName, QJsonValue::Bool, true },
{ _imageDensityName, QJsonValue::Double, true },
{ _frontalOverlapName, QJsonValue::Double, true },
{ _sideOverlapName, QJsonValue::Double, true },
{ valueSetIsDistanceName, QJsonValue::Bool, true },
{ imageDensityName, QJsonValue::Double, true },
{ frontalOverlapName, QJsonValue::Double, true },
{ sideOverlapName, QJsonValue::Double, true },
};
if (!JsonHelper::validateKeys(v1Json, keyInfoList2, errorString)) {
return false;
_disableRecalc = false;
}
_valueSetIsDistanceFact.setRawValue (v1Json[_valueSetIsDistanceName].toBool());
_imageDensityFact.setRawValue (v1Json[_imageDensityName].toDouble());
_frontalOverlapFact.setRawValue (v1Json[_frontalOverlapName].toDouble());
_sideOverlapFact.setRawValue (v1Json[_sideOverlapName].toDouble());
_valueSetIsDistanceFact.setRawValue (v1Json[valueSetIsDistanceName].toBool());
_imageDensityFact.setRawValue (v1Json[imageDensityName].toDouble());
_frontalOverlapFact.setRawValue (v1Json[frontalOverlapName].toDouble());
_sideOverlapFact.setRawValue (v1Json[sideOverlapName].toDouble());
if (!CameraSpec::load(v1Json, errorString)) {
return false;
......
......@@ -10,6 +10,7 @@
#pragma once
#include "CameraSpec.h"
#include "SettingsFact.h"
class Vehicle;
......@@ -18,12 +19,13 @@ class CameraCalc : public CameraSpec
Q_OBJECT
public:
CameraCalc(Vehicle* vehicle, QObject* parent = NULL);
CameraCalc(Vehicle* vehicle, QString settingsGroup, QObject* parent = NULL);
Q_PROPERTY(QString cameraName READ cameraName WRITE setCameraName NOTIFY cameraNameChanged)
Q_PROPERTY(QString customCameraName READ customCameraName CONSTANT) ///< Camera name for custom camera setting
Q_PROPERTY(QString manualCameraName READ manualCameraName CONSTANT) ///< Camera name for manual camera setting
Q_PROPERTY(bool isManualCamera READ isManualCamera NOTIFY cameraNameChanged) ///< true: using manual camera
Q_PROPERTY(bool isManualCamera READ isManualCamera NOTIFY isManualCameraChanged)
Q_PROPERTY(bool isCustomCamera READ isCustomCamera NOTIFY isCustomCameraChanged)
Q_PROPERTY(Fact* cameraName READ cameraName CONSTANT)
Q_PROPERTY(Fact* valueSetIsDistance READ valueSetIsDistance CONSTANT) ///< true: distance specified, resolution calculated
Q_PROPERTY(Fact* distanceToSurface READ distanceToSurface CONSTANT) ///< Distance to surface for image foot print calculation
Q_PROPERTY(Fact* imageDensity READ imageDensity CONSTANT) ///< Image density on surface (cm/px)
......@@ -39,9 +41,8 @@ public:
static QString customCameraName(void);
static QString manualCameraName(void);
QString cameraName(void) const { return _cameraName; }
void setCameraName(QString cameraName);
Fact* cameraName (void) { return &_cameraNameFact; }
Fact* valueSetIsDistance (void) { return &_valueSetIsDistanceFact; }
Fact* distanceToSurface (void) { return &_distanceToSurfaceFact; }
Fact* imageDensity (void) { return &_imageDensityFact; }
......@@ -59,7 +60,8 @@ public:
const Fact* adjustedFootprintFrontal (void) const { return &_adjustedFootprintFrontalFact; }
bool dirty (void) const { return _dirty; }
bool isManualCamera (void) { return cameraName() == manualCameraName(); }
bool isManualCamera (void) const { return _cameraNameFact.rawValue().toString() == manualCameraName(); }
bool isCustomCamera (void) const { return _cameraNameFact.rawValue().toString() == customCameraName(); }
double imageFootprintSide (void) const { return _imageFootprintSide; }
double imageFootprintFrontal (void) const { return _imageFootprintFrontal; }
bool distanceToSurfaceRelative (void) const { return _distanceToSurfaceRelative; }
......@@ -70,50 +72,52 @@ public:
void save(QJsonObject& json) const;
bool load(const QJsonObject& json, QString& errorString);
static const char* cameraNameName;
static const char* valueSetIsDistanceName;
static const char* distanceToSurfaceName;
static const char* distanceToSurfaceRelativeName;
static const char* imageDensityName;
static const char* frontalOverlapName;
static const char* sideOverlapName;
static const char* adjustedFootprintSideName;
static const char* adjustedFootprintFrontalName;
signals:
void cameraNameChanged (QString cameraName);
void dirtyChanged (bool dirty);
void imageFootprintSideChanged (double imageFootprintSide);
void imageFootprintFrontalChanged (double imageFootprintFrontal);
void distanceToSurfaceRelativeChanged (bool distanceToSurfaceRelative);
void isManualCameraChanged (void);
void isCustomCameraChanged (void);
private slots:
void _recalcTriggerDistance (void);
void _adjustDistanceToSurfaceRelative (void);
void _setDirty (void);
void _cameraNameChanged (void);
private:
Vehicle* _vehicle;
bool _dirty;
QString _cameraName;
bool _disableRecalc;
bool _distanceToSurfaceRelative;
QMap<QString, FactMetaData*> _metaDataMap;
Fact _valueSetIsDistanceFact;
Fact _distanceToSurfaceFact;
Fact _imageDensityFact;
Fact _frontalOverlapFact;
Fact _sideOverlapFact;
Fact _adjustedFootprintSideFact;
Fact _adjustedFootprintFrontalFact;
SettingsFact _cameraNameFact;
SettingsFact _valueSetIsDistanceFact;
SettingsFact _distanceToSurfaceFact;
SettingsFact _imageDensityFact;
SettingsFact _frontalOverlapFact;
SettingsFact _sideOverlapFact;
SettingsFact _adjustedFootprintSideFact;
SettingsFact _adjustedFootprintFrontalFact;
double _imageFootprintSide;
double _imageFootprintFrontal;
QVariantList _knownCameraList;
static const char* _valueSetIsDistanceName;
static const char* _distanceToSurfaceName;
static const char* _distanceToSurfaceRelativeName;
static const char* _imageDensityName;
static const char* _frontalOverlapName;
static const char* _sideOverlapName;
static const char* _adjustedFootprintSideName;
static const char* _adjustedFootprintFrontalName;
static const char* _jsonCameraNameKey;
// The following are deprecated usage and only included in order to convert older formats
enum CameraSpecType {
......
......@@ -21,7 +21,7 @@ void CameraCalcTest::init(void)
UnitTest::init();
_offlineVehicle = new Vehicle(MAV_AUTOPILOT_PX4, MAV_TYPE_QUADROTOR, qgcApp()->toolbox()->firmwarePluginManager(), this);
_cameraCalc = new CameraCalc(_offlineVehicle, this);
_cameraCalc = new CameraCalc(_offlineVehicle, "CameraCalcUnitTest" /* settingsGroup */, this);
_rgSignals[cameraNameChangedIndex] = SIGNAL(cameraNameChanged(QString));
_rgSignals[dirtyChangedIndex] = SIGNAL(dirtyChanged(bool));
......@@ -81,7 +81,7 @@ void CameraCalcTest::_testDirty(void)
}
rgFacts.clear();
_cameraCalc->setCameraName(_cameraCalc->customCameraName());
_cameraCalc->cameraName()->setRawValue(_cameraCalc->customCameraName());
QVERIFY(_cameraCalc->dirty());
_multiSpy->clearAllSignals();
......
......@@ -34,6 +34,14 @@
"min": 1,
"defaultValue": 1
},
{
"name": "StructureHeight",
"shortDescription": "Height of structure being scanned.",
"type": "double",
"units": "m",
"min": 1,
"defaultValue": 100
},
{
"name": "Layer distance",
"shortDescription": "Distance between each layer.",
......
......@@ -21,18 +21,18 @@
QGC_LOGGING_CATEGORY(StructureScanComplexItemLog, "StructureScanComplexItemLog")
const char* StructureScanComplexItem::_altitudeFactName = "Altitude";
const char* StructureScanComplexItem::_structureHeightFactName = "StructureHeight";
const char* StructureScanComplexItem::_layersFactName = "Layers";
const char* StructureScanComplexItem::settingsGroup = "StructureScan";
const char* StructureScanComplexItem::altitudeName = "Altitude";
const char* StructureScanComplexItem::structureHeightName = "StructureHeight";
const char* StructureScanComplexItem::layersName = "Layers";
const char* StructureScanComplexItem::jsonComplexItemTypeValue = "StructureScan";
const char* StructureScanComplexItem::_jsonCameraCalcKey = "CameraCalc";
const char* StructureScanComplexItem::_jsonAltitudeRelativeKey = "altitudeRelative";
QMap<QString, FactMetaData*> StructureScanComplexItem::_metaDataMap;
const char* StructureScanComplexItem::jsonComplexItemTypeValue = "StructureScan";
const char* StructureScanComplexItem::_jsonCameraCalcKey = "CameraCalc";
const char* StructureScanComplexItem::_jsonAltitudeRelativeKey = "altitudeRelative";
StructureScanComplexItem::StructureScanComplexItem(Vehicle* vehicle, bool flyView, QObject* parent)
: ComplexMissionItem (vehicle, flyView, parent)
, _metaDataMap (FactMetaData::createMapFromJsonFile(QStringLiteral(":/json/StructureScan.SettingsGroup.json"), this /* QObject parent */))
, _sequenceNumber (0)
, _dirty (false)
, _altitudeRelative (true)
......@@ -41,22 +41,13 @@ StructureScanComplexItem::StructureScanComplexItem(Vehicle* vehicle, bool flyVie
, _scanDistance (0.0)
, _cameraShots (0)
, _cameraMinTriggerInterval (0)
, _cameraCalc (vehicle)
, _altitudeFact (0, _altitudeFactName, FactMetaData::valueTypeDouble)
, _layersFact (0, _layersFactName, FactMetaData::valueTypeUint32)
, _cameraCalc (vehicle, settingsGroup)
, _altitudeFact (settingsGroup, _metaDataMap[altitudeName])
, _structureHeightFact (settingsGroup, _metaDataMap[structureHeightName])
, _layersFact (settingsGroup, _metaDataMap[layersName])
{
_editorQml = "qrc:/qml/StructureScanEditor.qml";
if (_metaDataMap.isEmpty()) {
_metaDataMap = FactMetaData::createMapFromJsonFile(QStringLiteral(":/json/StructureScan.SettingsGroup.json"), NULL /* QObject parent */);
}
_altitudeFact.setMetaData (_metaDataMap[_altitudeFactName]);
_layersFact.setMetaData (_metaDataMap[_layersFactName]);
_altitudeFact.setRawValue (_altitudeFact.rawDefaultValue());
_layersFact.setRawValue (_layersFact.rawDefaultValue());
_altitudeFact.setRawValue(qgcApp()->toolbox()->settingsManager()->appSettings()->defaultMissionItemAltitude()->rawValue());
connect(&_altitudeFact, &Fact::valueChanged, this, &StructureScanComplexItem::_setDirty);
......@@ -143,10 +134,10 @@ void StructureScanComplexItem::save(QJsonArray& missionItems)
saveObject[VisualMissionItem::jsonTypeKey] = VisualMissionItem::jsonTypeComplexItemValue;
saveObject[ComplexMissionItem::jsonComplexItemTypeKey] = jsonComplexItemTypeValue;
saveObject[_altitudeFactName] = _altitudeFact.rawValue().toDouble();
saveObject[_structureHeightFactName] = _structureHeightFact.rawValue().toDouble();
saveObject[_jsonAltitudeRelativeKey] = _altitudeRelative;
saveObject[_layersFactName] = _layersFact.rawValue().toDouble();
saveObject[altitudeName] = _altitudeFact.rawValue().toDouble();
saveObject[structureHeightName] = _structureHeightFact.rawValue().toDouble();
saveObject[_jsonAltitudeRelativeKey] = _altitudeRelative;
saveObject[layersName] = _layersFact.rawValue().toDouble();
QJsonObject cameraCalcObject;
_cameraCalc.save(cameraCalcObject);
......@@ -173,10 +164,10 @@ bool StructureScanComplexItem::load(const QJsonObject& complexObject, int sequen
{ VisualMissionItem::jsonTypeKey, QJsonValue::String, true },
{ ComplexMissionItem::jsonComplexItemTypeKey, QJsonValue::String, true },
{ QGCMapPolygon::jsonPolygonKey, QJsonValue::Array, true },
{ _altitudeFactName, QJsonValue::Double, true },
{ _structureHeightFactName, QJsonValue::Double, true },
{ altitudeName, QJsonValue::Double, true },
{ structureHeightName, QJsonValue::Double, true },
{ _jsonAltitudeRelativeKey, QJsonValue::Bool, true },
{ _layersFactName, QJsonValue::Double, true },
{ layersName, QJsonValue::Double, true },
{ _jsonCameraCalcKey, QJsonValue::Object, true },
};
if (!JsonHelper::validateKeys(complexObject, keyInfoList, errorString)) {
......@@ -205,8 +196,8 @@ bool StructureScanComplexItem::load(const QJsonObject& complexObject, int sequen
return false;
}
_altitudeFact.setRawValue (complexObject[_altitudeFactName].toDouble());
_layersFact.setRawValue (complexObject[_layersFactName].toDouble());
_altitudeFact.setRawValue (complexObject[altitudeName].toDouble());
_layersFact.setRawValue (complexObject[layersName].toDouble());
_altitudeRelative = complexObject[_jsonAltitudeRelativeKey].toBool(true);
if (!_structurePolygon.loadFromJson(complexObject, true /* required */, errorString)) {
......
......@@ -92,6 +92,11 @@ public:
static const char* jsonComplexItemTypeValue;
static const char* settingsGroup;
static const char* altitudeName;
static const char* structureHeightName;
static const char* layersName;
signals:
void cameraShotsChanged (int cameraShots);
void timeBetweenShotsChanged (void);
......@@ -115,6 +120,8 @@ private:
void _setCameraShots(int cameraShots);
double _triggerDistance(void) const;
QMap<QString, FactMetaData*> _metaDataMap;
int _sequenceNumber;
bool _dirty;
QGCMapPolygon _structurePolygon;
......@@ -130,15 +137,10 @@ private:
double _cruiseSpeed;
CameraCalc _cameraCalc;
static QMap<QString, FactMetaData*> _metaDataMap;
Fact _altitudeFact;
Fact _structureHeightFact;
Fact _layersFact;
static const char* _altitudeFactName;
static const char* _structureHeightFactName;
static const char* _layersFactName;
SettingsFact _altitudeFact;
SettingsFact _structureHeightFact;
SettingsFact _layersFact;
static const char* _jsonCameraCalcKey;
static const char* _jsonAltitudeRelativeKey;
......
......@@ -92,7 +92,7 @@ void StructureScanComplexItemTest::_initItem(void)
mapPolygon->appendVertex(vertex);
}
_structureScanItem->cameraCalc()->setCameraName(CameraCalc::manualCameraName());
_structureScanItem->cameraCalc()->cameraName()->setRawValue(CameraCalc::manualCameraName());
_structureScanItem->layers()->setCookedValue(2);
_structureScanItem->setDirty(false);
......@@ -109,7 +109,7 @@ void StructureScanComplexItemTest::_validateItem(StructureScanComplexItem* item)
QCOMPARE(expectedVertex, actualVertex);
}
QCOMPARE(_structureScanItem->cameraCalc()->cameraName() , CameraCalc::manualCameraName());
QVERIFY(_structureScanItem->cameraCalc()->isManualCamera());
QCOMPARE(item->layers()->cookedValue().toInt(), 2);
}
......
......@@ -257,7 +257,7 @@ bool SurveyComplexItem::_loadV3(const QJsonObject& complexObject, int sequenceNu
_cameraCalc.adjustedFootprintFrontal()->setRawValue (complexObject[_jsonV3CameraTriggerDistanceKey].toDouble());
if (manualGrid) {
_cameraCalc.setCameraName(_cameraCalc.manualCameraName());
_cameraCalc.cameraName()->setRawValue(_cameraCalc.manualCameraName());
} else {
if (!complexObject.contains(_jsonV3CameraObjectKey)) {
errorString = tr("%1 but %2 object is missing").arg("manualGrid = false").arg("camera");
......@@ -292,7 +292,7 @@ bool SurveyComplexItem::_loadV3(const QJsonObject& complexObject, int sequenceNu
return false;
}
_cameraCalc.setCameraName (cameraObject[_jsonV3CameraNameKey].toString());
_cameraCalc.cameraName()->setRawValue (cameraObject[_jsonV3CameraNameKey].toString());
_cameraCalc.landscape()->setRawValue (cameraObject[_jsonV3CameraOrientationLandscapeKey].toBool(true));
_cameraCalc.frontalOverlap()->setRawValue (cameraObject[_jsonV3FrontalOverlapKey].toInt());
_cameraCalc.sideOverlap()->setRawValue (cameraObject[_jsonV3SideOverlapKey].toInt());
......
......@@ -40,7 +40,6 @@ const int TransectStyleComplexItem::_terrainQueryTimeoutMsecs = 1000
TransectStyleComplexItem::TransectStyleComplexItem(Vehicle* vehicle, bool flyView, QString settingsGroup, QObject* parent)
: ComplexMissionItem (vehicle, flyView, parent)
, _settingsGroup (settingsGroup)
, _sequenceNumber (0)
, _dirty (false)
, _terrainPolyPathQuery (NULL)
......@@ -48,17 +47,17 @@ TransectStyleComplexItem::TransectStyleComplexItem(Vehicle* vehicle, bool flyVie
, _complexDistance (0)
, _cameraShots (0)
, _cameraMinTriggerInterval (0)
, _cameraCalc (vehicle)
, _cameraCalc (vehicle, settingsGroup)
, _followTerrain (false)
, _loadedMissionItemsParent (NULL)
, _metaDataMap (FactMetaData::createMapFromJsonFile(QStringLiteral(":/json/TransectStyle.SettingsGroup.json"), this))
, _turnAroundDistanceFact (_settingsGroup, _metaDataMap[_vehicle->multiRotor() ? turnAroundDistanceMultiRotorName : turnAroundDistanceName])
, _cameraTriggerInTurnAroundFact (_settingsGroup, _metaDataMap[cameraTriggerInTurnAroundName])
, _hoverAndCaptureFact (_settingsGroup, _metaDataMap[hoverAndCaptureName])
, _refly90DegreesFact (_settingsGroup, _metaDataMap[refly90DegreesName])
, _terrainAdjustToleranceFact (_settingsGroup, _metaDataMap[terrainAdjustToleranceName])
, _terrainAdjustMaxClimbRateFact (_settingsGroup, _metaDataMap[terrainAdjustMaxClimbRateName])
, _terrainAdjustMaxDescentRateFact (_settingsGroup, _metaDataMap[terrainAdjustMaxDescentRateName])
, _turnAroundDistanceFact (settingsGroup, _metaDataMap[_vehicle->multiRotor() ? turnAroundDistanceMultiRotorName : turnAroundDistanceName])
, _cameraTriggerInTurnAroundFact (settingsGroup, _metaDataMap[cameraTriggerInTurnAroundName])
, _hoverAndCaptureFact (settingsGroup, _metaDataMap[hoverAndCaptureName])
, _refly90DegreesFact (settingsGroup, _metaDataMap[refly90DegreesName])
, _terrainAdjustToleranceFact (settingsGroup, _metaDataMap[terrainAdjustToleranceName])
, _terrainAdjustMaxClimbRateFact (settingsGroup, _metaDataMap[terrainAdjustMaxClimbRateName])
, _terrainAdjustMaxDescentRateFact (settingsGroup, _metaDataMap[terrainAdjustMaxDescentRateName])
{
_terrainQueryTimer.setInterval(_terrainQueryTimeoutMsecs);
_terrainQueryTimer.setSingleShot(true);
......
......@@ -143,7 +143,6 @@ protected:
bool _hasTurnaround (void) const;
double _turnaroundDistance (void) const;
QString _settingsGroup;
int _sequenceNumber;
bool _dirty;
QGeoCoordinate _coordinate;
......
......@@ -38,11 +38,11 @@ Column {
_cameraList.push(_vehicle.staticCameraList[i].name)
}
gridTypeCombo.model = _cameraList
var knownCameraIndex = gridTypeCombo.find(cameraCalc.cameraName)
var knownCameraIndex = gridTypeCombo.find(cameraCalc.cameraName.value)
if (knownCameraIndex !== -1) {
gridTypeCombo.currentIndex = knownCameraIndex
} else {
console.log("Internal error: Known camera not found", cameraCalc.cameraName)
console.log("Internal error: Known camera not found", cameraCalc.cameraName.value)
gridTypeCombo.currentIndex = _gridTypeCustomCamera
}
}
......@@ -73,7 +73,7 @@ Column {
anchors.right: parent.right
model: _cameraList
currentIndex: -1
onActivated: cameraCalc.cameraName = gridTypeCombo.textAt(index)
onActivated: cameraCalc.cameraName.value = gridTypeCombo.textAt(index)
} // QGCComboxBox
// Camera based grid ui
......@@ -81,7 +81,7 @@ Column {
anchors.left: parent.left
anchors.right: parent.right
spacing: _margin
visible: cameraCalc.cameraName !== cameraCalc.manualCameraName
visible: !cameraCalc.isManualCamera
Row {
spacing: _margin
......@@ -111,7 +111,7 @@ Column {
anchors.left: parent.left
anchors.right: parent.right
spacing: _margin
visible: cameraCalc.cameraName === cameraCalc.customCameraName
visible: cameraCalc.isCustomCamera
RowLayout {
anchors.left: parent.left
......@@ -282,7 +282,7 @@ Column {
columnSpacing: _margin
rowSpacing: _margin
columns: 2
visible: cameraCalc.cameraName === cameraCalc.manualCameraName
visible: cameraCalc.isManualCamera
QGCLabel { text: distanceToSurfaceLabel }
FactTextField {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment