diff --git a/src/uas/UAS.cc b/src/uas/UAS.cc index b47a1d3ef08c36c13cfbc32bd776562eac1cb6f7..38fdf67ddca82291896422cbab9ed3a07906c6e4 100644 --- a/src/uas/UAS.cc +++ b/src/uas/UAS.cc @@ -1344,6 +1344,7 @@ void UAS::receiveMessage(LinkInterface* link, mavlink_message_t message) setDistToWaypoint(p.wp_dist); setBearingToWaypoint(p.nav_bearing); emit navigationControllerErrorsChanged(this, p.alt_error, p.aspd_error, p.xtrack_error); + emit NavigationControllerDataChanged(this, p.nav_roll, p.nav_pitch, p.nav_bearing, p.target_bearing, p.wp_dist); } break; // Messages to ignore diff --git a/src/uas/UASInterface.h b/src/uas/UASInterface.h index c61c81e1e6f7df2f95124fef23b5ad83690d3156..46505013b057f7eaf523c0b24d9c1bbd738e3e16 100644 --- a/src/uas/UASInterface.h +++ b/src/uas/UASInterface.h @@ -544,6 +544,7 @@ signals: void velocityChanged_NED(UASInterface*, double vx, double vy, double vz, quint64 usec); void navigationControllerErrorsChanged(UASInterface*, double altitudeError, double speedError, double xtrackError); + void NavigationControllerDataChanged(UASInterface *uas, float navRoll, float navPitch, float navBearing, float targetBearing, float targetDist); void imageStarted(int imgid, int width, int height, int depth, int channels); void imageDataReceived(int imgid, const unsigned char* imageData, int length, int startIndex); diff --git a/src/ui/HSIDisplay.cc b/src/ui/HSIDisplay.cc index d865dcb0d72809788078fe6e9515ed2b56c6992f..8b233963ee0707741b23dacaf48c35548a077b09 100644 --- a/src/ui/HSIDisplay.cc +++ b/src/ui/HSIDisplay.cc @@ -94,6 +94,7 @@ HSIDisplay::HSIDisplay(QWidget *parent) : uiZSetCoordinate(0.0f), uiYawSet(0.0f), metricWidth(4.0), + crosstrackError(std::numeric_limits::quiet_NaN()), xCenterPos(0), yCenterPos(0), positionLock(false), @@ -412,9 +413,13 @@ void HSIDisplay::renderOverlay() paintText(tr("%1 m/s").arg(speed, 5, 'f', 2, '0'), valueColor, 2.2f, 12, topMargin+2, &painter); // Draw crosstrack error to top right - float crossTrackError = 0; paintText(tr("XTRACK"), labelColor, 2.2f, 54, topMargin+2, &painter); - paintText(tr("%1 m").arg(crossTrackError, 5, 'f', 2, '0'), valueColor, 2.2f, 67, topMargin+2, &painter); + if (!isnan(crosstrackError)) { + paintText(tr("%1 m").arg(crosstrackError, 5, 'f', 2, '0'), valueColor, 2.2f, 67, topMargin+2, &painter); + } else { + paintText(tr("-- m"), valueColor, 2.2f, 67, topMargin+2, &painter); + } + // Draw position to bottom left if (localAvailable > 0) @@ -945,6 +950,8 @@ void HSIDisplay::setActiveUAS(UASInterface* uas) disconnect(this->uas, SIGNAL(laserStatusChanged(bool,bool,bool)), this, SLOT(updateLaserStatus(bool,bool,bool))); disconnect(this->uas, SIGNAL(groundTruthSensorStatusChanged(bool,bool,bool)), this, SLOT(updateGroundTruthSensorStatus(bool,bool,bool))); disconnect(this->uas, SIGNAL(actuatorStatusChanged(bool,bool,bool)), this, SLOT(updateActuatorStatus(bool,bool,bool))); + disconnect(this->uas, &UASInterface::navigationControllerErrorsChanged, + this, &HSIDisplay::UpdateNavErrors); } if (uas) @@ -1003,6 +1010,8 @@ void HSIDisplay::setActiveUAS(UASInterface* uas) this, SLOT(updateGroundTruthSensorStatus(bool,bool,bool))); connect(uas, SIGNAL(actuatorStatusChanged(bool,bool,bool)), this, SLOT(updateActuatorStatus(bool,bool,bool))); + connect(uas, &UASInterface::navigationControllerErrorsChanged, + this, &HSIDisplay::UpdateNavErrors); statusClearTimer.start(3000); } else @@ -1159,6 +1168,15 @@ void HSIDisplay::updateLocalPosition(UASInterface*, double x, double y, double z localAvailable = usec; } +void HSIDisplay::UpdateNavErrors(UASInterface *uas, double altitudeError, double airspeedError, double crosstrackError) +{ + Q_UNUSED(altitudeError); + Q_UNUSED(airspeedError); + if (this->uas == uas) { + this->crosstrackError = crosstrackError; + } +} + void HSIDisplay::updateGlobalPosition(UASInterface*, double lat, double lon, double altAMSL, double altWGS84, quint64 usec) { Q_UNUSED(altAMSL); diff --git a/src/ui/HSIDisplay.h b/src/ui/HSIDisplay.h index 4185db79e67e2a7e09180a5fd645354d6d953af4..a99eab7850a00ded1817d0c5e6a7d5f99824410a 100644 --- a/src/ui/HSIDisplay.h +++ b/src/ui/HSIDisplay.h @@ -62,6 +62,7 @@ public slots: void updateLocalPosition(UASInterface*, double x, double y, double z, quint64 usec); void updateGlobalPosition(UASInterface*, double lat, double lon, double altAMSL, double altWGS84, quint64 usec); void updateSpeed(UASInterface* uas, double vx, double vy, double vz, quint64 time); + void UpdateNavErrors(UASInterface *uas, double altitudeError, double airspeedError, double crosstrackError); void updatePositionLock(UASInterface* uas, bool lock); void updateAttitudeControllerEnabled(bool enabled); void updatePositionXYControllerEnabled(bool enabled); @@ -341,6 +342,9 @@ protected: float uiYawSet; ///< Yaw Setpoint wanted by the UI double metricWidth; ///< Width the instrument represents in meters (the width of the ground shown by the widget) + // Navigation parameters + double crosstrackError; ///< The crosstrack error (m) reported by the UAS + // float xCenterPos; ///< X center of instrument in virtual coordinates float yCenterPos; ///< Y center of instrument in virtual coordinates diff --git a/src/ui/PrimaryFlightDisplay.cc b/src/ui/PrimaryFlightDisplay.cc index fc7fea5700faf0711ab5953ff748797b9789cada..a22c528ea5000ff15b870395c2745d370a4ebab7 100644 --- a/src/ui/PrimaryFlightDisplay.cc +++ b/src/ui/PrimaryFlightDisplay.cc @@ -121,7 +121,7 @@ PrimaryFlightDisplay::PrimaryFlightDisplay(QWidget *parent) : airSpeed(std::numeric_limits::quiet_NaN()), climbRate(std::numeric_limits::quiet_NaN()), - navigationCrosstrackError(0), + navigationCrosstrackError(std::numeric_limits::quiet_NaN()), navigationTargetBearing(std::numeric_limits::quiet_NaN()), layout(COMPASS_INTEGRATED), @@ -221,6 +221,7 @@ void PrimaryFlightDisplay::forgetUAS(UASInterface* uas) disconnect(this->uas, SIGNAL(speedChanged(UASInterface*, double, double, quint64)), this, SLOT(updateSpeed(UASInterface*, double, double, quint64))); disconnect(this->uas, SIGNAL(altitudeChanged(UASInterface*, double, double, double, double, quint64)), this, SLOT(updateAltitude(UASInterface*, double, double, double, quint64))); disconnect(this->uas, SIGNAL(navigationControllerErrorsChanged(UASInterface*, double, double, double)), this, SLOT(updateNavigationControllerErrors(UASInterface*, double, double, double))); + disconnect(this->uas, &UASInterface::NavigationControllerDataChanged, this, &PrimaryFlightDisplay::UpdateNavigationControllerData); } } @@ -244,6 +245,7 @@ void PrimaryFlightDisplay::setActiveUAS(UASInterface* uas) connect(uas, SIGNAL(speedChanged(UASInterface*, double, double, quint64)), this, SLOT(updateSpeed(UASInterface*, double, double, quint64))); connect(uas, SIGNAL(altitudeChanged(UASInterface*, double, double, double, double, quint64)), this, SLOT(updateAltitude(UASInterface*, double, double, double, double, quint64))); connect(uas, SIGNAL(navigationControllerErrorsChanged(UASInterface*, double, double, double)), this, SLOT(updateNavigationControllerErrors(UASInterface*, double, double, double))); + connect(uas, &UASInterface::NavigationControllerDataChanged, this, &PrimaryFlightDisplay::UpdateNavigationControllerData); // Set new UAS this->uas = uas; @@ -346,6 +348,16 @@ void PrimaryFlightDisplay::updateAltitude(UASInterface* uas, double _altitudeAMS climbRate = _climbRate; } +void PrimaryFlightDisplay::UpdateNavigationControllerData(UASInterface *uas, float navRoll, float navPitch, float navBearing, float targetBearing, float targetDistance) { + Q_UNUSED(navRoll); + Q_UNUSED(navPitch); + Q_UNUSED(navBearing); + Q_UNUSED(targetDistance); + if (this->uas == uas) { + this->navigationTargetBearing = targetBearing; + } +} + void PrimaryFlightDisplay::updateNavigationControllerErrors(UASInterface* uas, double altitudeError, double speedError, double xtrackError) { Q_UNUSED(uas); this->navigationAltitudeError = altitudeError; @@ -862,7 +874,8 @@ void PrimaryFlightDisplay::drawAICompassDisk(QPainter& painter, QRectF area, flo drawTextCenter(painter, s_digitalCompass, largeTextSize, 0, -radius*0.38-digitalCompassUpshift); // The CDI - if (shouldDisplayNavigationData() && !isnan(navigationTargetBearing) && !isinf(navigationCrosstrackError)) { + // We only display this navigation data if both the target bearing and crosstrack error are valid + if (shouldDisplayNavigationData() && !isnan(navigationTargetBearing) && !isnan(navigationCrosstrackError)) { painter.resetTransform(); painter.translate(area.center()); // TODO : Sign might be wrong? diff --git a/src/ui/PrimaryFlightDisplay.h b/src/ui/PrimaryFlightDisplay.h index 1961bd1305dd545b5f7a7e92d6dd402ebf731aef..23e183f82fea21d6ab5e76af6871a46f55606fab 100644 --- a/src/ui/PrimaryFlightDisplay.h +++ b/src/ui/PrimaryFlightDisplay.h @@ -21,6 +21,7 @@ public slots: void updateSpeed(UASInterface* uas, double _groundSpeed, double _airSpeed, quint64 timestamp); void updateAltitude(UASInterface* uas, double _altitudeAMSL, double _altitudeWGS84, double _altitudeRelative, double _climbRate, quint64 timestamp); void updateNavigationControllerErrors(UASInterface* uas, double altitudeError, double speedError, double xtrackError); + void UpdateNavigationControllerData(UASInterface *uas, float navRoll, float navPitch, float navBearing, float targetBearing, float targetDistance); /** @brief Set the currently monitored UAS */ void forgetUAS(UASInterface* uas);