diff --git a/ChangeLog.md b/ChangeLog.md index eb939f2c03661a320a32e958e2ff8bbc8ef945c0..c5d56d6abf8b59bc71270bf6083571a0bb1f0c1f 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -8,6 +8,7 @@ Note: This file only contains high level features or important fixes. * Add support for specifying fixed RTK based station location in Settings/General. * Added Airmap integration to QGC * Add ESTIMATOR_STATUS values to new estimatorStatus Vehicle FactGroup. These are now available to display in instrument panel. +* Make Distance to GCS to available for display from instrument panel. ## 3.4 diff --git a/src/FlightMap/FlightMap.qml b/src/FlightMap/FlightMap.qml index 65fca29bea461f07dd467063b1966b28f7a9d99d..1da578c5424095dd19db2d90bc214ceb8721884f 100644 --- a/src/FlightMap/FlightMap.qml +++ b/src/FlightMap/FlightMap.qml @@ -34,7 +34,7 @@ Map { property string mapName: 'defaultMap' property bool isSatelliteMap: activeMapType.name.indexOf("Satellite") > -1 || activeMapType.name.indexOf("Hybrid") > -1 - property var gcsPosition: QtPositioning.coordinate() + property var gcsPosition: QGroundControl.qgcPositionManger.gcsPosition property bool userPanned: false ///< true: the user has manually panned the map property bool allowGCSLocationCenter: false ///< true: map will center/zoom to gcs location one time property bool allowVehicleLocationCenter: false ///< true: map will center/zoom to vehicle location one time @@ -80,19 +80,12 @@ Map { ExclusiveGroup { id: mapTypeGroup } - // Update ground station position - Connections { - target: QGroundControl.qgcPositionManger - - onLastPositionUpdated: { - if (valid && lastPosition.latitude && Math.abs(lastPosition.latitude) > 0.001 && lastPosition.longitude && Math.abs(lastPosition.longitude) > 0.001) { - gcsPosition = QtPositioning.coordinate(lastPosition.latitude,lastPosition.longitude) - if (!firstGCSPositionReceived && !firstVehiclePositionReceived && allowGCSLocationCenter) { - firstGCSPositionReceived = true - center = gcsPosition - zoomLevel = QGroundControl.flightMapInitialZoom - } - } + // Center map to gcs location + onGcsPositionChanged: { + if (gcsPosition.isValid && allowGCSLocationCenter && !firstGCSPositionReceived && !firstVehiclePositionReceived) { + firstGCSPositionReceived = true + center = gcsPosition + zoomLevel = QGroundControl.flightMapInitialZoom } } diff --git a/src/PositionManager/PositionManager.cpp b/src/PositionManager/PositionManager.cpp index c3ad173af98fc675bcbdbe02a2a4e41c83ada27f..146749ca34ae0cbc0cc39227dcaaa3d304cee0fc 100644 --- a/src/PositionManager/PositionManager.cpp +++ b/src/PositionManager/PositionManager.cpp @@ -60,7 +60,19 @@ void QGCPositionManager::setNmeaSourceDevice(QIODevice* device) void QGCPositionManager::_positionUpdated(const QGeoPositionInfo &update) { - emit lastPositionUpdated(update.isValid(), QVariant::fromValue(update.coordinate())); + QGeoCoordinate newGCSPosition = QGeoCoordinate(); + + if (update.isValid()) { + // Note that gcsPosition filters out possible crap values + if (qAbs(update.coordinate().latitude()) > 0.001 && qAbs(update.coordinate().longitude()) > 0.001) { + newGCSPosition = update.coordinate(); + } + } + if (newGCSPosition != _gcsPosition) { + _gcsPosition = newGCSPosition; + emit gcsPositionChanged(_gcsPosition); + } + emit positionInfoUpdated(update); } diff --git a/src/PositionManager/PositionManager.h b/src/PositionManager/PositionManager.h index c8fdadd1baec4d319ed39085a873a7c3a1ce6b63..692ae2324e2b71ada38798ca4aaeb0d9717a9778 100644 --- a/src/PositionManager/PositionManager.h +++ b/src/PositionManager/PositionManager.h @@ -25,6 +25,8 @@ public: QGCPositionManager(QGCApplication* app, QGCToolbox* toolbox); ~QGCPositionManager(); + Q_PROPERTY(QGeoCoordinate gcsPosition READ gcsPosition NOTIFY gcsPositionChanged) + enum QGCPositionSource { Simulated, InternalGPS, @@ -32,6 +34,8 @@ public: NmeaGPS }; + QGeoCoordinate gcsPosition(void) { return _gcsPosition; } + void setPositionSource(QGCPositionSource source); int updateInterval() const; @@ -45,13 +49,15 @@ private slots: void _error(QGeoPositionInfoSource::Error positioningError); signals: - void lastPositionUpdated(bool valid, QVariant lastPosition); + void gcsPositionChanged(QGeoCoordinate gcsPosition); void positionInfoUpdated(QGeoPositionInfo update); private: - int _updateInterval; - QGeoPositionInfoSource * _currentSource; - QGeoPositionInfoSource * _defaultSource; - QNmeaPositionInfoSource * _nmeaSource; - QGeoPositionInfoSource * _simulatedSource; + int _updateInterval; + QGeoCoordinate _gcsPosition; + + QGeoPositionInfoSource* _currentSource; + QGeoPositionInfoSource* _defaultSource; + QNmeaPositionInfoSource* _nmeaSource; + QGeoPositionInfoSource* _simulatedSource; }; diff --git a/src/Vehicle/Vehicle.cc b/src/Vehicle/Vehicle.cc index 9c662ab1b29e2c9ce7f1264d14112a3aa7268443..6ef17f959df3fb2ae7a4da18264c49cdb0d94e8b 100644 --- a/src/Vehicle/Vehicle.cc +++ b/src/Vehicle/Vehicle.cc @@ -39,6 +39,7 @@ #include "QGCCameraManager.h" #include "VideoReceiver.h" #include "VideoManager.h" +#include "PositionManager.h" #if defined(QGC_AIRMAP_ENABLED) #include "AirspaceVehicleManager.h" #endif @@ -69,6 +70,7 @@ const char* Vehicle::_altitudeAMSLFactName = "altitudeAMSL"; const char* Vehicle::_flightDistanceFactName = "flightDistance"; const char* Vehicle::_flightTimeFactName = "flightTime"; const char* Vehicle::_distanceToHomeFactName = "distanceToHome"; +const char* Vehicle::_distanceToGCSFactName = "distanceToGCS"; const char* Vehicle::_hobbsFactName = "hobbs"; const char* Vehicle::_gpsFactGroupName = "gps"; @@ -192,6 +194,7 @@ Vehicle::Vehicle(LinkInterface* link, , _flightDistanceFact (0, _flightDistanceFactName, FactMetaData::valueTypeDouble) , _flightTimeFact (0, _flightTimeFactName, FactMetaData::valueTypeElapsedTimeInSeconds) , _distanceToHomeFact (0, _distanceToHomeFactName, FactMetaData::valueTypeDouble) + , _distanceToGCSFact (0, _distanceToGCSFactName, FactMetaData::valueTypeDouble) , _hobbsFact (0, _hobbsFactName, FactMetaData::valueTypeString) , _gpsFactGroup(this) , _battery1FactGroup(this) @@ -385,6 +388,7 @@ Vehicle::Vehicle(MAV_AUTOPILOT firmwareType, , _flightDistanceFact (0, _flightDistanceFactName, FactMetaData::valueTypeDouble) , _flightTimeFact (0, _flightTimeFactName, FactMetaData::valueTypeElapsedTimeInSeconds) , _distanceToHomeFact (0, _distanceToHomeFactName, FactMetaData::valueTypeDouble) + , _distanceToGCSFact (0, _distanceToGCSFactName, FactMetaData::valueTypeDouble) , _hobbsFact (0, _hobbsFactName, FactMetaData::valueTypeString) , _gpsFactGroup(this) , _battery1FactGroup(this) @@ -405,9 +409,12 @@ void Vehicle::_commonInit(void) connect(_firmwarePlugin, &FirmwarePlugin::toolbarIndicatorsChanged, this, &Vehicle::toolBarIndicatorsChanged); connect(this, &Vehicle::coordinateChanged, this, &Vehicle::_updateDistanceToHome); + connect(this, &Vehicle::coordinateChanged, this, &Vehicle::_updateDistanceToGCS); connect(this, &Vehicle::homePositionChanged, this, &Vehicle::_updateDistanceToHome); connect(this, &Vehicle::hobbsMeterChanged, this, &Vehicle::_updateHobbsMeter); + connect(_toolbox->qgcPositionManager(), &QGCPositionManager::gcsPositionChanged, this, &Vehicle::_updateDistanceToGCS); + _missionManager = new MissionManager(this); connect(_missionManager, &MissionManager::error, this, &Vehicle::_missionManagerError); connect(_missionManager, &MissionManager::newMissionItemsAvailable, this, &Vehicle::_missionLoadComplete); @@ -453,6 +460,7 @@ void Vehicle::_commonInit(void) _addFact(&_flightDistanceFact, _flightDistanceFactName); _addFact(&_flightTimeFact, _flightTimeFactName); _addFact(&_distanceToHomeFact, _distanceToHomeFactName); + _addFact(&_distanceToGCSFact, _distanceToGCSFactName); _hobbsFact.setRawValue(QVariant(QString("0000:00:00"))); _addFact(&_hobbsFact, _hobbsFactName); @@ -3598,6 +3606,16 @@ void Vehicle::_updateDistanceToHome(void) } } +void Vehicle::_updateDistanceToGCS(void) +{ + QGeoCoordinate gcsPosition = _toolbox->qgcPositionManager()->gcsPosition(); + if (coordinate().isValid() && gcsPosition.isValid()) { + _distanceToGCSFact.setRawValue(coordinate().distanceTo(gcsPosition)); + } else { + _distanceToGCSFact.setRawValue(qQNaN()); + } +} + void Vehicle::_updateHobbsMeter(void) { _hobbsFact.setRawValue(hobbsMeter()); diff --git a/src/Vehicle/Vehicle.h b/src/Vehicle/Vehicle.h index 38bb64fb777b574282a569328746db4e9a010627..bb60a67e06cd399eaed86d6adb48e554fba92a0d 100644 --- a/src/Vehicle/Vehicle.h +++ b/src/Vehicle/Vehicle.h @@ -656,6 +656,7 @@ public: Q_PROPERTY(Fact* altitudeAMSL READ altitudeAMSL CONSTANT) Q_PROPERTY(Fact* flightDistance READ flightDistance CONSTANT) Q_PROPERTY(Fact* distanceToHome READ distanceToHome CONSTANT) + Q_PROPERTY(Fact* distanceToGCS READ distanceToGCS CONSTANT) Q_PROPERTY(Fact* hobbs READ hobbs CONSTANT) Q_PROPERTY(FactGroup* gps READ gpsFactGroup CONSTANT) @@ -945,6 +946,7 @@ public: Fact* altitudeAMSL (void) { return &_altitudeAMSLFact; } Fact* flightDistance (void) { return &_flightDistanceFact; } Fact* distanceToHome (void) { return &_distanceToHomeFact; } + Fact* distanceToGCS (void) { return &_distanceToGCSFact; } Fact* hobbs (void) { return &_hobbsFact; } FactGroup* gpsFactGroup (void) { return &_gpsFactGroup; } @@ -1190,6 +1192,7 @@ private slots: void _clearTrajectoryPoints(void); void _clearCameraTriggerPoints(void); void _updateDistanceToHome(void); + void _updateDistanceToGCS(void); void _updateHobbsMeter(void); void _vehicleParamLoaded(bool ready); void _sendQGCTimeToVehicle(void); @@ -1453,6 +1456,7 @@ private: Fact _flightDistanceFact; Fact _flightTimeFact; Fact _distanceToHomeFact; + Fact _distanceToGCSFact; Fact _hobbsFact; VehicleGPSFactGroup _gpsFactGroup; @@ -1480,6 +1484,7 @@ private: static const char* _flightDistanceFactName; static const char* _flightTimeFactName; static const char* _distanceToHomeFactName; + static const char* _distanceToGCSFactName; static const char* _hobbsFactName; static const char* _gpsFactGroupName; diff --git a/src/Vehicle/VehicleFact.json b/src/Vehicle/VehicleFact.json index b385571291d9761568ca574c5c22ede9a3b3334c..520c5048b1a2b5017b1453dc0ba1b0836547f75d 100644 --- a/src/Vehicle/VehicleFact.json +++ b/src/Vehicle/VehicleFact.json @@ -90,6 +90,13 @@ "decimalPlaces": 1, "units": "m" }, +{ + "name": "distanceToGCS", + "shortDescription": "Distance to GCS", + "type": "double", + "decimalPlaces": 1, + "units": "m" +}, { "name": "flightTime", "shortDescription": "Flight Time",