From 5813730601b2bf949676fffefa4eafca13185dcc Mon Sep 17 00:00:00 2001 From: LM Date: Mon, 21 Nov 2011 12:09:23 +0100 Subject: [PATCH] Improving state updates for multiple MAVs, fixed Google Maps and Google Earth --- images/earth.html | 20 +-- src/comm/MAVLinkSimulationMAV.cc | 4 +- src/comm/QGCFlightGearLink.cc | 2 +- src/comm/UDPLink.cc | 2 +- src/uas/PxQuadMAV.cc | 15 ++- src/uas/UAS.cc | 24 ++-- src/ui/HDDisplay.cc | 4 +- src/ui/QGCMAVLinkInspector.cc | 7 -- src/ui/map3D/QGCGoogleEarthView.cc | 13 +- src/ui/uas/UASView.cc | 189 +++++++++++++++++++---------- src/ui/uas/UASView.h | 3 + 11 files changed, 177 insertions(+), 106 deletions(-) diff --git a/images/earth.html b/images/earth.html index c4d38665f..6fb7be68e 100644 --- a/images/earth.html +++ b/images/earth.html @@ -417,7 +417,9 @@ function createAircraft(id, type, color) planeOrient = ge.createOrientation(''); planeModel.setOrientation(planeOrient); - planeLink.setHref('http://qgroundcontrol.org/_media/users/models/sfly-hex.dae'); + //planeLink.setHref('http://www.asl.ethz.ch/people/rudink/senseSoarDummy.dae'); + //planeLink.setHref('http://qgroundcontrol.org/_media/users/models/sfly-hex.dae'); + planeLink.setHref('http://qgroundcontrol.org/_media/users/models/ascent-park-glider.dae'); planeModel.setLink(planeLink); planeModel.setAltitudeMode (ge.ALTITUDE_ABSOLUTE); @@ -578,18 +580,16 @@ function setAircraftPositionAttitude(id, lat, lon, alt, roll, pitch, yaw) currAlt = trueGroundAlt+0.1; } // Interpolate between t-1 and t and set new states - lastLat = lastLat*0.8+currLat*0.2; - lastLon = lastLon*0.8+currLon*0.2; - lastAlt = lastAlt*0.8+currAlt*0.2; - //currFollowHeading = ((yaw/M_PI)+1.0)*360.0; + lastLat = lastLat*0.5+currLat*0.5; + lastLon = lastLon*0.5+currLon*0.5; + lastAlt = lastAlt*0.5+currAlt*0.5; - - // FIXME Currently invalid conversion from right-handed z-down to z-up frame - planeOrient.setRoll(((roll/M_PI))*180.0+180.0); - planeOrient.setTilt(((pitch/M_PI))*180.0+180.0); + planeOrient.setRoll(+((roll/M_PI))*180.0); + planeOrient.setTilt(-((pitch/M_PI))*180.0); planeOrient.setHeading(((yaw/M_PI))*180.0-90.0); + planeModel.setOrientation(planeOrient); - currFollowHeading = ((yaw/M_PI))*180.0; + currFollowHeading = currFollowHeading*0.95+0.05*(((yaw/M_PI))*180.0); planeLoc.setLatitude(lastLat); planeLoc.setLongitude(lastLon); diff --git a/src/comm/MAVLinkSimulationMAV.cc b/src/comm/MAVLinkSimulationMAV.cc index 08af21112..519924400 100644 --- a/src/comm/MAVLinkSimulationMAV.cc +++ b/src/comm/MAVLinkSimulationMAV.cc @@ -14,10 +14,10 @@ MAVLinkSimulationMAV::MAVLinkSimulationMAV(MAVLinkSimulationLink *parent, int sy timer1Hz(0), latitude(lat), longitude(lon), - altitude(0.0), + altitude(550.0), x(lat), y(lon), - z(550), + z(altitude), roll(0.0), pitch(0.0), yaw(0.0), diff --git a/src/comm/QGCFlightGearLink.cc b/src/comm/QGCFlightGearLink.cc index be3d3774d..5301dc9c5 100644 --- a/src/comm/QGCFlightGearLink.cc +++ b/src/comm/QGCFlightGearLink.cc @@ -188,7 +188,7 @@ void QGCFlightGearLink::writeBytes(const char* data, qint64 size) void QGCFlightGearLink::readBytes() { const qint64 maxLength = 65536; - static char data[maxLength]; + char data[maxLength]; QHostAddress sender; quint16 senderPort; diff --git a/src/comm/UDPLink.cc b/src/comm/UDPLink.cc index 0d17c0f61..f3cb8d4ad 100644 --- a/src/comm/UDPLink.cc +++ b/src/comm/UDPLink.cc @@ -210,7 +210,7 @@ void UDPLink::writeBytes(const char* data, qint64 size) void UDPLink::readBytes() { const qint64 maxLength = 65536; - static char data[maxLength]; + char data[maxLength]; QHostAddress sender; quint16 senderPort; diff --git a/src/uas/PxQuadMAV.cc b/src/uas/PxQuadMAV.cc index b3c0faf07..57271b35d 100644 --- a/src/uas/PxQuadMAV.cc +++ b/src/uas/PxQuadMAV.cc @@ -42,9 +42,12 @@ void PxQuadMAV::receiveMessage(LinkInterface* link, mavlink_message_t message) #ifdef MAVLINK_ENABLED_PIXHAWK mavlink_message_t* msg = &message; - if (message.sysid == uasId) { - switch (message.msgid) { - case MAVLINK_MSG_ID_RAW_AUX: { + if (message.sysid == uasId) + { + switch (message.msgid) + { + case MAVLINK_MSG_ID_RAW_AUX: + { mavlink_raw_aux_t raw; mavlink_msg_raw_aux_decode(&message, &raw); quint64 time = getUnixTime(0); @@ -52,14 +55,16 @@ void PxQuadMAV::receiveMessage(LinkInterface* link, mavlink_message_t message) emit valueChanged(uasId, "Temperature", "raw", raw.temp, time); } break; - case MAVLINK_MSG_ID_IMAGE_TRIGGERED: { + case MAVLINK_MSG_ID_IMAGE_TRIGGERED: + { // FIXME Kind of a hack to load data from disk mavlink_image_triggered_t img; mavlink_msg_image_triggered_decode(&message, &img); emit imageStarted(img.timestamp); } break; - case MAVLINK_MSG_ID_PATTERN_DETECTED: { + case MAVLINK_MSG_ID_PATTERN_DETECTED: + { mavlink_pattern_detected_t detected; mavlink_msg_pattern_detected_decode(&message, &detected); QByteArray b; diff --git a/src/uas/UAS.cc b/src/uas/UAS.cc index 7143951c5..6bd406530 100644 --- a/src/uas/UAS.cc +++ b/src/uas/UAS.cc @@ -232,6 +232,9 @@ void UAS::receiveMessage(LinkInterface* link, mavlink_message_t message) case MAV_TYPE_QUADROTOR: setAirframe(UASInterface::QGC_AIRFRAME_CHEETAH); break; + case MAV_TYPE_HEXAROTOR: + setAirframe(UASInterface::QGC_AIRFRAME_HEXCOPTER); + break; default: // Do nothing break; @@ -338,8 +341,6 @@ void UAS::receiveMessage(LinkInterface* link, mavlink_message_t message) emit loadChanged(this,state.load/10.0f); - - currentVoltage = state.voltage_battery/1000.0f; lpVoltage = filterVoltage(currentVoltage); @@ -463,7 +464,8 @@ void UAS::receiveMessage(LinkInterface* link, mavlink_message_t message) emit globalPositionChanged(this, latitude, longitude, altitude, time); emit speedChanged(this, speedX, speedY, speedZ, time); // Set internal state - if (!positionLock) { + if (!positionLock) + { // If position was not locked before, notify positive GAudioOutput::instance()->notifyPositive(); } @@ -483,29 +485,35 @@ void UAS::receiveMessage(LinkInterface* link, mavlink_message_t message) // quint64 time = getUnixTime(pos.time_usec); quint64 time = getUnixTime(pos.time_usec); - if (pos.fix_type > 2) { + if (pos.fix_type > 2) + { emit globalPositionChanged(this, pos.lat/(double)1E7, pos.lon/(double)1E7, pos.alt/1000.0, time); latitude = pos.lat/(double)1E7; longitude = pos.lon/(double)1E7; altitude = pos.alt/1000.0; positionLock = true; + isGlobalPositionKnown = true; // Check for NaN int alt = pos.alt; - if (alt != alt) { + if (!isnan(alt) && !isinf(alt)) + { alt = 0; - emit textMessageReceived(uasId, message.compid, 255, "GCS ERROR: RECEIVED NaN FOR ALTITUDE"); + emit textMessageReceived(uasId, message.compid, 255, "GCS ERROR: RECEIVED NaN or Inf FOR ALTITUDE"); } // FIXME REMOVE LATER emit valueChanged(uasId, "altitude", "m", pos.alt/(double)1E3, time); // Smaller than threshold and not NaN float vel = pos.vel/100.0f; - if (vel < 1000000 && !isnan(vel) && !isinf(vel)) { + if (vel < 1000000 && !isnan(vel) && !isinf(vel)) + { // FIXME REMOVE LATER emit valueChanged(uasId, "speed", "m/s", vel, time); //qDebug() << "GOT GPS RAW"; // emit speedChanged(this, (double)pos.v, 0.0, 0.0, time); - } else { + } + else + { emit textMessageReceived(uasId, message.compid, 255, QString("GCS ERROR: RECEIVED INVALID SPEED OF %1 m/s").arg(vel)); } } diff --git a/src/ui/HDDisplay.cc b/src/ui/HDDisplay.cc index 020eae995..bedc2f83f 100644 --- a/src/ui/HDDisplay.cc +++ b/src/ui/HDDisplay.cc @@ -186,9 +186,9 @@ void HDDisplay::triggerUpdate() void HDDisplay::paintEvent(QPaintEvent * event) { Q_UNUSED(event); - static quint64 interval = 0; + quint64 interval = 0; //qDebug() << "INTERVAL:" << MG::TIME::getGroundTimeNow() - interval << __FILE__ << __LINE__; - interval = MG::TIME::getGroundTimeNow(); + interval = QGC::groundTimeMilliseconds(); renderOverlay(); } diff --git a/src/ui/QGCMAVLinkInspector.cc b/src/ui/QGCMAVLinkInspector.cc index 10733f4f8..a65ebb4d0 100644 --- a/src/ui/QGCMAVLinkInspector.cc +++ b/src/ui/QGCMAVLinkInspector.cc @@ -41,7 +41,6 @@ void QGCMAVLinkInspector::refreshView() messageName = messageName.arg(messageInfo[msg->msgid].name).arg(messagesHz.value(msg->msgid, 0), 2, 'f', 0).arg(msg->msgid); if (!treeWidgetItems.contains(msg->msgid)) { - QStringList fields; fields << messageName; QTreeWidgetItem* widget = new QTreeWidgetItem(fields); @@ -72,8 +71,6 @@ void QGCMAVLinkInspector::receiveMessage(LinkInterface* link,mavlink_message_t m { Q_UNUSED(link); // Only overwrite if system filter is set -// int filterValue = ui->systemComboBox()->value().toInt(); -// if (filterValue != ) memcpy(receivedMessages+message.msgid, &message, sizeof(mavlink_message_t)); float msgHz = 0.0f; @@ -85,14 +82,10 @@ void QGCMAVLinkInspector::receiveMessage(LinkInterface* link,mavlink_message_t m { msgHz = 1; } - //qDebug() << "DIFF:" << receiveTime - lastMessageUpdate.value(message.msgid); float newHz = 0.001f*msgHz+0.999f*messagesHz.value(message.msgid, 1); - qDebug() << "HZ" << newHz; messagesHz.insert(message.msgid, newHz); } - //qDebug() << "MSGHZ:" << messagesHz.value(message.msgid, 1000); - lastMessageUpdate.insert(message.msgid, receiveTime); } diff --git a/src/ui/map3D/QGCGoogleEarthView.cc b/src/ui/map3D/QGCGoogleEarthView.cc index a05dc0bb9..b9dbb0d8b 100644 --- a/src/ui/map3D/QGCGoogleEarthView.cc +++ b/src/ui/map3D/QGCGoogleEarthView.cc @@ -284,8 +284,6 @@ void QGCGoogleEarthView::updateGlobalPosition(UASInterface* uas, double lat, dou { Q_UNUSED(usec); javaScript(QString("addTrailPosition(%1, %2, %3, %4);").arg(uas->getUASID()).arg(lat, 0, 'f', 22).arg(lon, 0, 'f', 22).arg(alt, 0, 'f', 22)); - - //qDebug() << QString("addTrailPosition(%1, %2, %3, %4);").arg(uas->getUASID()).arg(lat, 0, 'f', 15).arg(lon, 0, 'f', 15).arg(alt, 0, 'f', 15); } void QGCGoogleEarthView::clearTrails() @@ -614,7 +612,8 @@ void QGCGoogleEarthView::updateState() #if (QGC_EVENTLOOP_DEBUG) qDebug() << "EVENTLOOP:" << __FILE__ << __LINE__; #endif - if (gEarthInitialized) { + if (gEarthInitialized) + { int uasId = 0; double lat = 47.3769; double lon = 8.549444; @@ -628,6 +627,8 @@ void QGCGoogleEarthView::updateState() QList mavs = UASManager::instance()->getUASList(); foreach (UASInterface* currMav, mavs) { + // Only update if known + if (!currMav->globalPositionKnown()) continue; uasId = currMav->getUASID(); lat = currMav->getLatitude(); lon = currMav->getLongitude(); @@ -640,9 +641,9 @@ void QGCGoogleEarthView::updateState() javaScript(QString("setAircraftPositionAttitude(%1, %2, %3, %4, %6, %7, %8);") .arg(uasId) - .arg(lat, 0, 'f', 15) - .arg(lon, 0, 'f', 15) - .arg(alt, 0, 'f', 15) + .arg(lat, 0, 'f', 22) + .arg(lon, 0, 'f', 22) + .arg(alt, 0, 'f', 22) .arg(roll, 0, 'f', 9) .arg(pitch, 0, 'f', 9) .arg(yaw, 0, 'f', 9)); diff --git a/src/ui/uas/UASView.cc b/src/ui/uas/UASView.cc index 74dae8c9b..680fa8b6c 100644 --- a/src/ui/uas/UASView.cc +++ b/src/ui/uas/UASView.cc @@ -35,7 +35,6 @@ This file is part of the PIXHAWK project #include #include "QGC.h" -#include "MG.h" #include "UASManager.h" #include "UASView.h" #include "UASWaypointManager.h" @@ -65,6 +64,7 @@ UASView::UASView(UASInterface* uas, QWidget *parent) : alt(0), groundDistance(0), localFrame(false), + globalFrameKnown(false), removeAction(new QAction("Delete this system", this)), renameAction(new QAction("Rename..", this)), selectAction(new QAction("Control this system", this )), @@ -72,6 +72,8 @@ UASView::UASView(UASInterface* uas, QWidget *parent) : selectAirframeAction(new QAction("Choose Airframe", this)), setBatterySpecsAction(new QAction("Set Battery Options", this)), lowPowerModeEnabled(true), + generalUpdateCount(0), + filterTime(0), m_ui(new Ui::UASView) { // FIXME XXX @@ -127,9 +129,12 @@ UASView::UASView(UASInterface* uas, QWidget *parent) : // Set static values // Name - if (uas->getUASName() == "") { + if (uas->getUASName() == "") + { m_ui->nameLabel->setText(tr("UAS") + QString::number(uas->getUASID())); - } else { + } + else + { m_ui->nameLabel->setText(uas->getUASName()); } @@ -141,7 +146,9 @@ UASView::UASView(UASInterface* uas, QWidget *parent) : if (lowPowerModeEnabled) { refreshTimer->start(updateInterval*3); - } else { + } + else + { refreshTimer->start(updateInterval); } @@ -194,10 +201,13 @@ void UASView::setBackgroundColor() QColor uasColor = uas->getColor(); QString colorstyle; QString borderColor = "#4A4A4F"; - if (isActive) { + if (isActive) + { borderColor = "#FA4A4F"; uasColor = uasColor.darker(475); - } else { + } + else + { uasColor = uasColor.darker(675); } colorstyle = colorstyle.sprintf("QGroupBox { border-radius: 12px; padding: 0px; margin: 0px; background-color: #%02X%02X%02X; border: 2px solid %s; }", @@ -207,14 +217,16 @@ void UASView::setBackgroundColor() void UASView::setUASasActive(bool active) { - if (active) { + if (active) + { UASManager::instance()->setActiveUAS(this->uas); } } void UASView::updateActiveUAS(UASInterface* uas, bool active) { - if (uas == this->uas) { + if (uas == this->uas) + { this->isActive = active; setBackgroundColor(); } @@ -239,22 +251,25 @@ void UASView::mouseDoubleClickEvent (QMouseEvent * event) void UASView::enterEvent(QEvent* event) { - if (event->type() == QEvent::MouseMove) { + if (event->type() == QEvent::MouseMove) + { emit uasInFocus(uas); - if (uas != UASManager::instance()->getActiveUAS()) { + if (uas != UASManager::instance()->getActiveUAS()) + { grabMouse(QCursor(Qt::PointingHandCursor)); } } - // qDebug() << __FILE__ << __LINE__ << "IN FOCUS"; - if (event->type() == QEvent::MouseButtonDblClick) { + if (event->type() == QEvent::MouseButtonDblClick) + { // qDebug() << __FILE__ << __LINE__ << "UAS CLICKED!"; } } void UASView::leaveEvent(QEvent* event) { - if (event->type() == QEvent::MouseMove) { + if (event->type() == QEvent::MouseMove) + { emit uasOutFocus(uas); releaseMouse(); } @@ -300,9 +315,11 @@ void UASView::updateName(const QString& name) */ void UASView::setSystemType(UASInterface* uas, unsigned int systemType) { - if (uas == this->uas) { + if (uas == this->uas) + { // Set matching icon - switch (systemType) { + switch (systemType) + { case 0: m_ui->typeButton->setIcon(QIcon(":/images/mavs/generic.svg")); break; @@ -354,9 +371,7 @@ void UASView::updateLocalPosition(UASInterface* uas, double x, double y, double this->x = x; this->y = y; this->z = z; - if (!localFrame) { - localFrame = true; - } + localFrame = true; } void UASView::updateGlobalPosition(UASInterface* uas, double lon, double lat, double alt, quint64 usec) @@ -366,6 +381,7 @@ void UASView::updateGlobalPosition(UASInterface* uas, double lon, double lat, do this->lon = lon; this->lat = lat; this->alt = alt; + globalFrameKnown = true; } void UASView::updateSpeed(UASInterface*, double x, double y, double z, quint64 usec) @@ -386,8 +402,10 @@ void UASView::setWaypoint(int uasId, int id, double x, double y, double z, doubl Q_UNUSED(z); Q_UNUSED(yaw); Q_UNUSED(autocontinue); - if (uasId == this->uas->getUASID()) { - if (current) { + if (uasId == this->uas->getUASID()) + { + if (current) + { m_ui->waypointLabel->setText(tr("WP") + QString::number(id)); } } @@ -395,14 +413,16 @@ void UASView::setWaypoint(int uasId, int id, double x, double y, double z, doubl void UASView::selectWaypoint(int uasId, int id) { - if (uasId == this->uas->getUASID()) { + if (uasId == this->uas->getUASID()) + { m_ui->waypointLabel->setText(tr("WP") + QString::number(id)); } } void UASView::updateThrust(UASInterface* uas, double thrust) { - if (this->uas == uas) { + if (this->uas == uas) + { this->thrust = thrust; } } @@ -410,7 +430,8 @@ void UASView::updateThrust(UASInterface* uas, double thrust) void UASView::updateBattery(UASInterface* uas, double voltage, double percent, int seconds) { Q_UNUSED(voltage); - if (this->uas == uas) { + if (this->uas == uas) + { timeRemaining = seconds; chargeLevel = percent; } @@ -418,7 +439,8 @@ void UASView::updateBattery(UASInterface* uas, double voltage, double percent, i void UASView::updateState(UASInterface* uas, QString uasState, QString stateDescription) { - if (this->uas == uas) { + if (this->uas == uas) + { state = uasState; stateDesc = stateDescription; } @@ -426,7 +448,8 @@ void UASView::updateState(UASInterface* uas, QString uasState, QString stateDesc void UASView::updateLoad(UASInterface* uas, double load) { - if (this->uas == uas) { + if (this->uas == uas) + { this->load = load; } } @@ -437,7 +460,8 @@ void UASView::contextMenuEvent (QContextMenuEvent* event) menu.addAction(selectAction); menu.addSeparator(); menu.addAction(renameAction); - if (timeout) { + if (timeout) + { menu.addAction(removeAction); } menu.addAction(hilAction); @@ -448,7 +472,8 @@ void UASView::contextMenuEvent (QContextMenuEvent* event) void UASView::setBatterySpecs() { - if (uas) { + if (uas) + { bool ok; QString newName = QInputDialog::getText(this, tr("Set Battery Specifications for %1").arg(uas->getUASName()), tr("Specs: (empty,warn,full), e.g. (9V,9.5V,12.6V) or just warn level in percent (e.g. 15%) to use estimate from MAV"), QLineEdit::Normal, @@ -460,7 +485,8 @@ void UASView::setBatterySpecs() void UASView::rename() { - if (uas) { + if (uas) + { bool ok; QString newName = QInputDialog::getText(this, tr("Rename System %1").arg(uas->getUASName()), tr("System Name:"), QLineEdit::Normal, @@ -472,7 +498,8 @@ void UASView::rename() void UASView::selectAirframe() { - if (uas) { + if (uas) + { // Get list of airframes from UAS QStringList airframes; airframes << "Generic" @@ -484,12 +511,14 @@ void UASView::selectAirframe() << "Reaper" << "Predator" << "Coaxial" - << "Pteryx"; + << "Pteryx" + << "Asctec Firefly"; bool ok; QString item = QInputDialog::getItem(this, tr("Select Airframe for %1").arg(uas->getUASName()), tr("Airframe"), airframes, uas->getAirframe(), false, &ok); - if (ok && !item.isEmpty()) { + if (ok && !item.isEmpty()) + { // Set this airframe as UAS airframe uas->setAirframe(airframes.indexOf(item)); } @@ -501,15 +530,15 @@ void UASView::refresh() //setUpdatesEnabled(false); //setUpdatesEnabled(true); //repaint(); + //qDebug() << "UPDATING UAS WIDGET!" << uas->getUASName(); - static quint64 lastupdate = 0; - //// qDebug() << "UASVIEW update diff: " << MG::TIME::getGroundTimeNow() - lastupdate; - lastupdate = MG::TIME::getGroundTimeNow(); - // FIXME - static int generalUpdateCount = 0; + quint64 lastupdate = 0; + //// qDebug() << "UASVIEW update diff: " << MG::TIME::getGroundTimeNow() - lastupdate; + lastupdate = QGC::groundTimeMilliseconds(); - if (generalUpdateCount == 4) { + if (generalUpdateCount == 4) + { #if (QGC_EVENTLOOP_DEBUG) // qDebug() << "EVENTLOOP:" << __FILE__ << __LINE__; #endif @@ -525,29 +554,48 @@ void UASView::refresh() m_ui->thrustBar->setValue(this->thrust); // Position - QString position; - position = position.sprintf("%05.1f %05.1f %06.1f m", x, y, z); - m_ui->positionLabel->setText(position); - QString globalPosition; - QString latIndicator; - if (lat > 0) { - latIndicator = "N"; - } else { - latIndicator = "S"; + // If global position is known, prefer it over local coordinates + + if (!globalFrameKnown && localFrame) + { + QString position; + position = position.sprintf("%05.1f %05.1f %06.1f m", x, y, z); + m_ui->positionLabel->setText(position); } - QString lonIndicator; - if (lon > 0) { - lonIndicator = "E"; - } else { - lonIndicator = "W"; + + if (globalFrameKnown) + { + QString globalPosition; + QString latIndicator; + if (lat > 0) + { + latIndicator = "N"; + } + else + { + latIndicator = "S"; + } + QString lonIndicator; + if (lon > 0) + { + lonIndicator = "E"; + } + else + { + lonIndicator = "W"; + } + + globalPosition = globalPosition.sprintf("%05.1f%s %05.1f%s %06.1f m", lon, lonIndicator.toStdString().c_str(), lat, latIndicator.toStdString().c_str(), alt); + m_ui->positionLabel->setText(globalPosition); } - globalPosition = globalPosition.sprintf("%05.1f%s %05.1f%s %06.1f m", lon, lonIndicator.toStdString().c_str(), lat, latIndicator.toStdString().c_str(), alt); - m_ui->positionLabel->setText(globalPosition); // Altitude - if (groundDistance == 0 && alt != 0) { + if (groundDistance == 0 && alt != 0) + { m_ui->groundDistanceLabel->setText(QString("%1 m").arg(alt, 6, 'f', 1, '0')); - } else { + } + else + { m_ui->groundDistanceLabel->setText(QString("%1 m").arg(groundDistance, 6, 'f', 1, '0')); } @@ -558,9 +606,10 @@ void UASView::refresh() // Thrust m_ui->thrustBar->setValue(thrust * 100); - if(this->timeRemaining > 1 && this->timeRemaining < QGC::MAX_FLIGHT_TIME) { + if(this->timeRemaining > 1 && this->timeRemaining < QGC::MAX_FLIGHT_TIME) + { // Filter output to get a higher stability - static double filterTime = static_cast(this->timeRemaining); + filterTime = static_cast(this->timeRemaining); filterTime = 0.8 * filterTime + 0.2 * static_cast(this->timeRemaining); int sec = static_cast(filterTime - static_cast(filterTime / 60.0f) * 60); int min = static_cast(filterTime / 60); @@ -569,7 +618,9 @@ void UASView::refresh() QString timeText; timeText = timeText.sprintf("%02d:%02d:%02d", hours, min, sec); m_ui->timeRemainingLabel->setText(timeText); - } else { + } + else + { m_ui->timeRemainingLabel->setText(tr("Calc..")); } @@ -588,29 +639,37 @@ void UASView::refresh() QString colorstyle("QGroupBox { border-radius: 5px; padding: 2px; margin: 0px; border: 0px; background-color: %1; }"); - if (timeout) { + if (timeout) + { // CRITICAL CONDITION, NO HEARTBEAT QString borderColor = "#FFFF00"; - if (isActive) { + if (isActive) + { borderColor = "#FA4A4F"; } - if (iconIsRed) { + if (iconIsRed) + { QColor warnColor(Qt::red); m_ui->heartbeatIcon->setStyleSheet(colorstyle.arg(warnColor.name())); QString style = QString("QGroupBox { border-radius: 12px; padding: 0px; margin: 0px; border: 2px solid %1; background-color: %2; }").arg(borderColor, warnColor.name()); m_ui->uasViewFrame->setStyleSheet(style); - } else { + } + else + { QColor warnColor(Qt::black); m_ui->heartbeatIcon->setStyleSheet(colorstyle.arg(warnColor.name())); QString style = QString("QGroupBox { border-radius: 12px; padding: 0px; margin: 0px; border: 2px solid %1; background-color: %2; }").arg(borderColor, warnColor.name()); m_ui->uasViewFrame->setStyleSheet(style); refreshTimer->setInterval(errorUpdateInterval); + refreshTimer->start(); } iconIsRed = !iconIsRed; - } else { + } + else + { if (!lowPowerModeEnabled) { // Fade heartbeat icon @@ -620,6 +679,7 @@ void UASView::refresh() //m_ui->heartbeatIcon->setAutoFillBackground(true); m_ui->heartbeatIcon->setStyleSheet(colorstyle.arg(heartbeatColor.name())); refreshTimer->setInterval(updateInterval); + refreshTimer->start(); } } //setUpdatesEnabled(true); @@ -630,7 +690,8 @@ void UASView::refresh() void UASView::changeEvent(QEvent *e) { QWidget::changeEvent(e); - switch (e->type()) { + switch (e->type()) + { case QEvent::LanguageChange: m_ui->retranslateUi(this); break; diff --git a/src/ui/uas/UASView.h b/src/ui/uas/UASView.h index de83cb783..44b10fac9 100644 --- a/src/ui/uas/UASView.h +++ b/src/ui/uas/UASView.h @@ -117,6 +117,7 @@ protected: float alt; float groundDistance; bool localFrame; + bool globalFrameKnown; QAction* removeAction; QAction* renameAction; QAction* selectAction; @@ -126,6 +127,8 @@ protected: static const int updateInterval = 800; static const int errorUpdateInterval = 200; bool lowPowerModeEnabled; ///< Low power mode reduces update rates + unsigned int generalUpdateCount; ///< Skip counter for updates + double filterTime; ///< Filter time estimate of battery void mouseDoubleClickEvent (QMouseEvent * event); -- 2.22.0