QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
EditPositionDialogController.cc
Go to the documentation of this file.
2#include "QGCGeo.h"
4#include "Vehicle.h"
6
7QGC_LOGGING_CATEGORY(EditPositionDialogControllerLog, "QMLControls.EditPositionDialogController")
8
9QMap<QString, FactMetaData*> EditPositionDialogController::_metaDataMap;
10
12 : QObject(parent)
13 , _latitudeFact(new Fact(0, _latitudeFactName, FactMetaData::valueTypeDouble, this))
14 , _longitudeFact(new Fact(0, _longitudeFactName, FactMetaData::valueTypeDouble, this))
15 , _zoneFact(new Fact(0, _zoneFactName, FactMetaData::valueTypeUint8, this))
16 , _hemisphereFact(new Fact(0, _hemisphereFactName, FactMetaData::valueTypeUint8, this))
17 , _eastingFact(new Fact(0, _eastingFactName, FactMetaData::valueTypeDouble, this))
18 , _northingFact(new Fact(0, _northingFactName, FactMetaData::valueTypeDouble, this))
19 , _mgrsFact(new Fact(0, _mgrsFactName, FactMetaData::valueTypeString, this))
20{
21 // qCDebug(EditPositionDialogControllerLog) << Q_FUNC_INFO << this;
22
23 if (_metaDataMap.isEmpty()) {
24 _metaDataMap = FactMetaData::createMapFromJsonFile(QStringLiteral(":/json/EditPositionDialog.FactMetaData.json"), nullptr /* QObject parent */);
25 }
26
27 _latitudeFact->setMetaData(_metaDataMap[_latitudeFactName]);
28 _longitudeFact->setMetaData(_metaDataMap[_longitudeFactName]);
29 _zoneFact->setMetaData(_metaDataMap[_zoneFactName]);
30 _hemisphereFact->setMetaData(_metaDataMap[_hemisphereFactName]);
31 _eastingFact->setMetaData(_metaDataMap[_eastingFactName]);
32 _northingFact->setMetaData(_metaDataMap[_northingFactName]);
33 _mgrsFact->setMetaData(_metaDataMap[_mgrsFactName]);
34}
35
36EditPositionDialogController::~EditPositionDialogController()
37{
38 // qCDebug(EditPositionDialogControllerLog) << Q_FUNC_INFO << this;
39}
40
41void EditPositionDialogController::setCoordinate(QGeoCoordinate coordinate)
42{
43 if (!coordinate.isValid()) {
44 qCWarning(EditPositionDialogControllerLog) << "Attempt to set invalid coordinate";
45 return;
46 }
47
48 if (coordinate == _coordinate) {
49 return;
50 }
51
52 const bool wasInvalid = !_coordinate.isValid();
53 _coordinate = coordinate;
54
55 // Do not emit on the initial invalid->valid transition to prevent
56 // onCoordinateChanged handlers from firing on initial dialog setup.
57 if (!wasInvalid) {
58 emit coordinateChanged(_coordinate);
59 }
60}
61
62void EditPositionDialogController::initValues()
63{
64 if (!_coordinate.isValid()) {
65 return;
66 }
67
68 _latitudeFact->setRawValue(_coordinate.latitude());
69 _longitudeFact->setRawValue(_coordinate.longitude());
70
71 double easting, northing;
72 const int zone = QGCGeo::convertGeoToUTM(_coordinate, easting, northing);
73 if ((zone >= 1) && (zone <= 60)) {
74 _zoneFact->setRawValue(zone);
75 _hemisphereFact->setRawValue(_coordinate.latitude() < 0);
76 _eastingFact->setRawValue(easting);
77 _northingFact->setRawValue(northing);
78 }
79
80 const QString mgrs = QGCGeo::convertGeoToMGRS(_coordinate);
81 if (!mgrs.isEmpty()) {
82 _mgrsFact->setRawValue(mgrs);
83 }
84}
85
86void EditPositionDialogController::setFromGeo()
87{
88 QGeoCoordinate newCoordinate = _coordinate;
89 newCoordinate.setLatitude(_latitudeFact->rawValue().toDouble());
90 newCoordinate.setLongitude(_longitudeFact->rawValue().toDouble());
91 setCoordinate(newCoordinate);
92}
93
94void EditPositionDialogController::setFromUTM()
95{
96 qCDebug(EditPositionDialogControllerLog) << _eastingFact->rawValue().toDouble() << _northingFact->rawValue().toDouble() << _zoneFact->rawValue().toInt() << (_hemisphereFact->rawValue().toInt() == 1);
97 QGeoCoordinate newCoordinate;
98 if (QGCGeo::convertUTMToGeo(_eastingFact->rawValue().toDouble(), _northingFact->rawValue().toDouble(), _zoneFact->rawValue().toInt(), _hemisphereFact->rawValue().toInt() == 1, newCoordinate)) {
99 qCDebug(EditPositionDialogControllerLog) << _eastingFact->rawValue().toDouble() << _northingFact->rawValue().toDouble() << _zoneFact->rawValue().toInt() << (_hemisphereFact->rawValue().toInt() == 1) << newCoordinate;
100 setCoordinate(newCoordinate);
101 } else {
102 initValues();
103 }
104}
105
106void EditPositionDialogController::setFromMGRS()
107{
108 QGeoCoordinate newCoordinate;
109 if (QGCGeo::convertMGRSToGeo(_mgrsFact->rawValue().toString(), newCoordinate)) {
110 setCoordinate(newCoordinate);
111 } else {
112 initValues();
113 }
114}
115
116void EditPositionDialogController::setFromVehicle()
117{
118 setCoordinate(MultiVehicleManager::instance()->activeVehicle()->coordinate());
119}
Geographic coordinate conversion utilities using GeographicLib.
#define QGC_LOGGING_CATEGORY(name, categoryStr)
void coordinateChanged(QGeoCoordinate coordinate)
static QMap< QString, FactMetaData * > createMapFromJsonFile(const QString &jsonFilename, QObject *metaDataParent)
A Fact is used to hold a single value within the system.
Definition Fact.h:19
QString convertGeoToMGRS(const QGeoCoordinate &coord)
Definition QGCGeo.cc:179
int convertGeoToUTM(const QGeoCoordinate &coord, double &easting, double &northing)
Definition QGCGeo.cc:148
bool convertUTMToGeo(double easting, double northing, int zone, bool southhemi, QGeoCoordinate &coord)
Definition QGCGeo.cc:161
bool convertMGRSToGeo(const QString &mgrs, QGeoCoordinate &coord)
Definition QGCGeo.cc:205