diff --git a/src/uas/UASMessageHandler.cc b/src/uas/UASMessageHandler.cc index f982db157ac61b131a7079d8aa2b2f9935ced052..0db804144841667ec62459ebfd13d64708415c85 100644 --- a/src/uas/UASMessageHandler.cc +++ b/src/uas/UASMessageHandler.cc @@ -49,6 +49,7 @@ UASMessageHandler::UASMessageHandler(QObject *parent) { connect(UASManager::instance(), SIGNAL(activeUASSet(UASInterface*)), this, SLOT(setActiveUAS(UASInterface*))); emit textMessageReceived(NULL); + emit textMessageCountChanged(0); } UASMessageHandler::~UASMessageHandler() @@ -67,6 +68,7 @@ void UASMessageHandler::clearMessages() _warningCount = 0; _normalCount = 0; _mutex.unlock(); + emit textMessageCountChanged(0); } void UASMessageHandler::setActiveUAS(UASInterface* uas) @@ -160,8 +162,10 @@ void UASMessageHandler::handleTextMessage(int, int compId, int severity, QString UASMessage* message = new UASMessage(compId, severity, text); message->_setFormatedText(QString("

[%2 - COMP:%3]%4 %5

").arg(style).arg(dateString).arg(compId).arg(severityText).arg(text)); _messages.append(message); + int count = _messages.count(); _mutex.unlock(); emit textMessageReceived(message); + emit textMessageCountChanged(count); } int UASMessageHandler::getErrorCount() { diff --git a/src/uas/UASMessageHandler.h b/src/uas/UASMessageHandler.h index 45b780d241b6102258548cb2672c1c9dcc559666..616ff3f2100395c33b844227d0c4b07f024db897 100644 --- a/src/uas/UASMessageHandler.h +++ b/src/uas/UASMessageHandler.h @@ -127,6 +127,11 @@ signals: * @param message A pointer to the message. NULL if resetting (new UAS assigned) */ void textMessageReceived(UASMessage* message); + /** + * @brief Sent out when the message count changes + * @param count The new message count + */ + void textMessageCountChanged(int count); private: // Stores the UAS that we're currently receiving messages from. UASInterface* _activeUAS; diff --git a/src/ui/toolbar/MainToolBar.cc b/src/ui/toolbar/MainToolBar.cc index b71e9b378072ea9e0338b9a0f02ec907dfec5cec..2cb078ff74b4c453ae149ec0eb9391de2a59f2ff 100644 --- a/src/ui/toolbar/MainToolBar.cc +++ b/src/ui/toolbar/MainToolBar.cc @@ -48,12 +48,14 @@ MainToolBar::MainToolBar() , _waypointDistance(0.0) , _currentWaypoint(0) , _currentMessageCount(0) + , _messageCount(0) , _currentErrorCount(0) , _currentWarningCount(0) , _currentNormalCount(0) , _currentMessageType(MessageNone) , _satelliteCount(-1) - , _dotsPerInch(72.0) + , _dotsPerInch(96.0) // Default to Windows as it's more likely not to report below + , _satelliteLock(0) , _rollDownMessages(0) { setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); @@ -68,8 +70,12 @@ MainToolBar::MainToolBar() } // Get screen DPI to manage font sizes on different platforms QScreen *srn = QGuiApplication::screens().at(0); // TODO: Find current monitor as opposed to picking first one - _dotsPerInch = (qreal)srn->logicalDotsPerInch(); // Font point sizes are based on Mac 72dpi - + if(srn && srn->logicalDotsPerInch() > 50.0) { + _dotsPerInch = (qreal)srn->logicalDotsPerInch(); // Font point sizes are based on Mac 72dpi + } else { + qWarning() << "System not reporting logical DPI."; + } + // Give the QML code a way to reach us setContextPropertyObject("mainToolBar", this); setSource(QUrl::fromUserInput("qrc:/qml/MainToolBar.qml")); setVisible(true); @@ -187,7 +193,7 @@ void MainToolBar::onEnterMessageArea(int x, int y) _currentMessageCount = 0; _currentMessageType = MessageNone; if(count != _currentMessageCount) { - emit messageCountChanged(0); + emit newMessageCountChanged(0); } if(type != _currentMessageType) { emit messageTypeChanged(MessageNone); @@ -258,14 +264,15 @@ void MainToolBar::_setActiveUAS(UASInterface* active) // If switching the UAS, disconnect the existing one. if (_mav) { - disconnect(UASMessageHandler::instance(), &UASMessageHandler::textMessageReceived, this, &MainToolBar::_handleTextMessage); - disconnect(_mav, &UASInterface::heartbeatTimeout, this, &MainToolBar::_heartbeatTimeout); - disconnect(_mav, &UASInterface::batteryChanged, this, &MainToolBar::_updateBatteryRemaining); - disconnect(_mav, &UASInterface::modeChanged, this, &MainToolBar::_updateMode); - disconnect(_mav, &UASInterface::nameChanged, this, &MainToolBar::_updateName); - disconnect(_mav, &UASInterface::systemTypeSet, this, &MainToolBar::_setSystemType); - disconnect(_mav, SIGNAL(statusChanged(UASInterface*,QString,QString)), this, SLOT(_updateState(UASInterface*,QString,QString))); - disconnect(_mav, SIGNAL(armingChanged(bool)), this, SLOT(_updateArmingState(bool))); + disconnect(UASMessageHandler::instance(), &UASMessageHandler::textMessageCountChanged, this, &MainToolBar::_handleTextMessage); + disconnect(_mav, &UASInterface::heartbeatTimeout, this, &MainToolBar::_heartbeatTimeout); + disconnect(_mav, &UASInterface::batteryChanged, this, &MainToolBar::_updateBatteryRemaining); + disconnect(_mav, &UASInterface::modeChanged, this, &MainToolBar::_updateMode); + disconnect(_mav, &UASInterface::nameChanged, this, &MainToolBar::_updateName); + disconnect(_mav, &UASInterface::systemTypeSet, this, &MainToolBar::_setSystemType); + disconnect(_mav, &UASInterface::localizationChanged, this, &MainToolBar::_setSatLoc); + disconnect(_mav, SIGNAL(statusChanged(UASInterface*,QString,QString)), this, SLOT(_updateState(UASInterface*,QString,QString))); + disconnect(_mav, SIGNAL(armingChanged(bool)), this, SLOT(_updateArmingState(bool))); if (_mav->getWaypointManager()) { disconnect(_mav->getWaypointManager(), &UASWaypointManager::currentWaypointChanged, this, &MainToolBar::_updateCurrentWaypoint); @@ -282,12 +289,13 @@ void MainToolBar::_setActiveUAS(UASInterface* active) { _setSystemType(_mav, _mav->getSystemType()); _updateArmingState(_mav->isArmed()); - connect(UASMessageHandler::instance(), &UASMessageHandler::textMessageReceived, this, &MainToolBar::_handleTextMessage); + connect(UASMessageHandler::instance(), &UASMessageHandler::textMessageCountChanged, this, &MainToolBar::_handleTextMessage); connect(_mav, &UASInterface::heartbeatTimeout, this, &MainToolBar::_heartbeatTimeout); connect(_mav, &UASInterface::batteryChanged, this, &MainToolBar::_updateBatteryRemaining); connect(_mav, &UASInterface::modeChanged, this, &MainToolBar::_updateMode); connect(_mav, &UASInterface::nameChanged, this, &MainToolBar::_updateName); connect(_mav, &UASInterface::systemTypeSet, this, &MainToolBar::_setSystemType); + connect(_mav, &UASInterface::localizationChanged, this, &MainToolBar::_setSatLoc); connect(_mav, SIGNAL(statusChanged(UASInterface*,QString,QString)), this, SLOT(_updateState(UASInterface*, QString,QString))); connect(_mav, SIGNAL(armingChanged(bool)), this, SLOT(_updateArmingState(bool))); if (_mav->getWaypointManager()) @@ -315,6 +323,7 @@ void MainToolBar::_updateArmingState(bool armed) void MainToolBar::_updateBatteryRemaining(UASInterface*, double voltage, double, double percent, int) { + if(percent < 0.0) { percent = 0.0; } @@ -510,11 +519,25 @@ void MainToolBar::_heartbeatTimeout(bool timeout, unsigned int ms) } } -void MainToolBar::_handleTextMessage(UASMessage*) +void MainToolBar::_handleTextMessage(int newCount) { + // Reset? + if(!newCount) { + _currentMessageCount = 0; + _currentNormalCount = 0; + _currentWarningCount = 0; + _currentErrorCount = 0; + _messageCount = 0; + _currentMessageType = MessageNone; + emit newMessageCountChanged(0); + emit messageTypeChanged(MessageNone); + emit messageCountChanged(0); + return; + } + UASMessageHandler* pMh = UASMessageHandler::instance(); Q_ASSERT(pMh); - MessageType_t type = _currentMessageType; + MessageType_t type = newCount ? _currentMessageType : MessageNone; int errorCount = _currentErrorCount; int warnCount = _currentWarningCount; int normalCount = _currentNormalCount; @@ -542,14 +565,19 @@ void MainToolBar::_handleTextMessage(UASMessage*) int count = _currentErrorCount + _currentWarningCount + _currentNormalCount; if(count != _currentMessageCount) { _currentMessageCount = count; - // Display current total message count - emit messageCountChanged(count); + // Display current total new messages count + emit newMessageCountChanged(count); } if(type != _currentMessageType) { _currentMessageType = type; // Update message level emit messageTypeChanged(type); } + // Update message count (all messages) + if(newCount != _messageCount) { + _messageCount = newCount; + emit messageCountChanged(_messageCount); + } } void MainToolBar::_updateWaypointDistance(double distance) @@ -570,10 +598,20 @@ void MainToolBar::_updateCurrentWaypoint(quint16 id) void MainToolBar::_setSatelliteCount(double val, QString) { - if(val < 0.0) val = 0.0; - if(val > 99.0) val = 99.0; + // I'm assuming that a negative value or over 99 means there is no GPS + if(val < 0.0) val = -1.0; + if(val > 99.0) val = -1.0; if(_satelliteCount != (int)val) { _satelliteCount = (int)val; emit satelliteCountChanged(_satelliteCount); } } + +void MainToolBar::_setSatLoc(UASInterface*, int fix) +{ + // fix 0: lost, 1: at least one satellite, but no GPS fix, 2: 2D lock, 3: 3D lock + if(_satelliteLock != fix) { + _satelliteLock = fix; + emit satelliteLockChanged(_satelliteLock); + } +} diff --git a/src/ui/toolbar/MainToolBar.h b/src/ui/toolbar/MainToolBar.h index d21a7599d2517b2f1b652915940263d94f0836bf..3764b1b77e6e6c525649329d01572c3b42cdc3aa 100644 --- a/src/ui/toolbar/MainToolBar.h +++ b/src/ui/toolbar/MainToolBar.h @@ -78,6 +78,7 @@ public: Q_PROPERTY(unsigned int heartbeatTimeout READ heartbeatTimeout NOTIFY heartbeatTimeoutChanged) Q_PROPERTY(QString currentMode READ currentMode NOTIFY currentModeChanged) Q_PROPERTY(MessageType_t messageType READ messageType NOTIFY messageTypeChanged) + Q_PROPERTY(int newMessageCount READ newMessageCount NOTIFY newMessageCountChanged) Q_PROPERTY(int messageCount READ messageCount NOTIFY messageCountChanged) Q_PROPERTY(QString currentConfig READ currentConfig NOTIFY currentConfigChanged) Q_PROPERTY(QString systemPixmap READ systemPixmap NOTIFY systemPixmapChanged) @@ -86,6 +87,7 @@ public: Q_PROPERTY(bool mavPresent READ mavPresent NOTIFY mavPresentChanged) Q_PROPERTY(QString currentState READ currentState NOTIFY currentStateChanged) Q_PROPERTY(double dotsPerInch READ dotsPerInch NOTIFY dotsPerInchChanged) + Q_PROPERTY(int satelliteLock READ satelliteLock NOTIFY satelliteLockChanged) int connectionCount () { return _connectionCount; } double batteryVoltage () { return _batteryVoltage; } @@ -96,7 +98,8 @@ public: unsigned int heartbeatTimeout () { return _currentHeartbeatTimeout; } QString currentMode () { return _currentMode; } MessageType_t messageType () { return _currentMessageType; } - int messageCount () { return _currentMessageCount; } + int newMessageCount () { return _currentMessageCount; } + int messageCount () { return _messageCount; } QString currentConfig () { return _currentConfig; } QString systemPixmap () { return _systemPixmap; } int satelliteCount () { return _satelliteCount; } @@ -104,6 +107,7 @@ public: bool mavPresent () { return _mav != NULL; } QString currentState () { return _currentState; } double dotsPerInch () { return _dotsPerInch; } + int satelliteLock () { return _satelliteLock; } void setCurrentView (int currentView); @@ -117,6 +121,7 @@ signals: void heartbeatTimeoutChanged (unsigned int hbTimeout); void currentModeChanged (); void messageTypeChanged (MessageType_t type); + void newMessageCountChanged (int count); void messageCountChanged (int count); void currentConfigChanged (QString config); void systemPixmapChanged (QPixmap pix); @@ -125,6 +130,7 @@ signals: void mavPresentChanged (bool present); void currentStateChanged (QString state); void dotsPerInchChanged (); + void satelliteLockChanged (int lock); private slots: void _setActiveUAS (UASInterface* active); @@ -138,11 +144,13 @@ private slots: void _updateName (const QString& name); void _setSystemType (UASInterface* uas, unsigned int systemType); void _heartbeatTimeout (bool timeout, unsigned int ms); - void _handleTextMessage (UASMessage* message); + void _handleTextMessage (int newCount); void _updateCurrentWaypoint (quint16 id); void _updateWaypointDistance (double distance); void _setSatelliteCount (double val, QString name); void _leaveMessageView (); + void _setSatLoc (UASInterface* uas, int fix); + private: void _updateConnection (LinkInterface *disconnectedLink = NULL); @@ -166,6 +174,7 @@ private: double _waypointDistance; quint16 _currentWaypoint; int _currentMessageCount; + int _messageCount; int _currentErrorCount; int _currentWarningCount; int _currentNormalCount; @@ -173,6 +182,7 @@ private: int _satelliteCount; QStringList _connectedList; qreal _dotsPerInch; + int _satelliteLock; UASMessageViewRollDown* _rollDownMessages; }; diff --git a/src/ui/toolbar/MainToolBar.qml b/src/ui/toolbar/MainToolBar.qml index 93b1e3481d932781714d9a4e1776f8e83f80c762..17f1e44143374a6415380745c2bfe8c9e1fda596 100644 --- a/src/ui/toolbar/MainToolBar.qml +++ b/src/ui/toolbar/MainToolBar.qml @@ -44,11 +44,12 @@ Rectangle { property int cellRadius: 3 property double dpiFactor: (72.0 / mainToolBar.dotsPerInch); - property var colorBlue: "#1a6eaa" - property var colorGreen: "#00d930" - property var colorRed: "#a81a1b" - property var colorOrange: "#a76f26" - property var colorWhite: "#f0f0f0" + property var colorBlue: "#1a6eaa" + property var colorGreen: "#079527" + property var colorGreenText: "#00d930" + property var colorRed: "#a81a1b" + property var colorOrange: "#a76f26" + property var colorWhite: "#f0f0f0" id: toolBarHolder color: qgcPal.windowShade @@ -88,6 +89,29 @@ Rectangle { return "qrc:/files/images/status/battery_100.svg"; } + function getBatteryColor() { + if (mainToolBar.batteryPercent > 40.0) + return colorGreen; + if(mainToolBar.batteryPercent > 0.01) + return colorRed; + // This means there is no battery level data + return colorBlue; + } + + function getSatelliteColor() { + // No GPS data + if (mainToolBar.satelliteCount < 0) + return qgcPal.button + // No Lock + if(mainToolBar.satelliteLock < 2) + return colorRed; + // 2D Lock + if(mainToolBar.satelliteLock === 2) + return colorBlue; + // Lock is 3D or more + return colorGreen; + } + function showMavStatus() { return (mainToolBar.mavPresent && mainToolBar.heartbeatTimeout === 0 && mainToolBar.connectionCount > 0); } @@ -164,7 +188,7 @@ Rectangle { Rectangle { id: messages - width: (mainToolBar.messageCount > 99) ? 70 : 60 + width: (mainToolBar.newMessageCount > 99) ? 70 : 60 height: cellHeight visible: (mainToolBar.connectionCount > 0) anchors.verticalCenter: parent.verticalCenter @@ -191,7 +215,7 @@ Rectangle { width: messages.width - messageIcon.width Text { id: messageText - text: (mainToolBar.messageCount > 0) ? mainToolBar.messageCount : '' + text: (mainToolBar.newMessageCount > 0) ? mainToolBar.newMessageCount : '' font.pointSize: 14 * dpiFactor font.weight: Font.DemiBold anchors.verticalCenter: parent.verticalCenter @@ -204,7 +228,7 @@ Rectangle { Image { id: dropDown source: "QGroundControl/Controls/arrow-down.png" - visible: (messages.showTriangle) + visible: (messages.showTriangle) && (mainToolBar.messageCount > 0) anchors.bottom: parent.bottom anchors.right: parent.right anchors.bottomMargin: 3 @@ -228,12 +252,11 @@ Rectangle { messages.showTriangle = true; mouseOffTimer.start(); } - onExited: { - messages.showTriangle = false; - } onClicked: { - var p = mapToItem(toolBarHolder, mouseX, mouseY); - mainToolBar.onEnterMessageArea(p.x, p.y); + if(mainToolBar.messageCount > 0) { + var p = mapToItem(toolBarHolder, mouseX, mouseY); + mainToolBar.onEnterMessageArea(p.x, p.y); + } } } @@ -262,9 +285,9 @@ Rectangle { id: satelitte width: 60 height: cellHeight - visible: showMavStatus() + visible: showMavStatus(); anchors.verticalCenter: parent.verticalCenter - color: (mainToolBar.satelliteCount < 3) ? colorRed : colorBlue + color: getSatelliteColor(); radius: cellRadius border.color: "#00000000" border.width: 0 @@ -282,7 +305,7 @@ Rectangle { Text { id: satelitteText - text: mainToolBar.satelliteCount + text: (mainToolBar.satelliteCount > 0) ? mainToolBar.satelliteCount : '' font.pointSize: 14 * dpiFactor font.weight: Font.DemiBold anchors.verticalCenter: parent.verticalCenter @@ -299,7 +322,7 @@ Rectangle { height: cellHeight visible: showMavStatus() anchors.verticalCenter: parent.verticalCenter - color: (mainToolBar.batteryPercent > 40.0 || mainToolBar.batteryPercent < 0.01) ? colorBlue : colorRed + color: (mainToolBar.batteryPercent > 40.0 || mainToolBar.batteryPercent < 0.01) ? colorGreen : colorRed radius: cellRadius border.color: "#00000000" border.width: 0 @@ -317,7 +340,7 @@ Rectangle { Text { id: batteryText - text: mainToolBar.batteryVoltage.toFixed(2) + ' V'; + text: mainToolBar.batteryVoltage.toFixed(1) + ' V'; font.pointSize: 14 * dpiFactor font.weight: Font.DemiBold anchors.verticalCenter: parent.verticalCenter @@ -329,11 +352,10 @@ Rectangle { } Column { - anchors.verticalCenter: parent.verticalCenter - spacing: cellSpacerSize visible: showMavStatus() - height: cellHeight * 0.75 - width: 80 + height: cellHeight * 0.85 + width: 80 + anchors.verticalCenter: parent.verticalCenter Rectangle { id: armedStatus @@ -349,9 +371,8 @@ Rectangle { text: (mainToolBar.systemArmed) ? qsTr("ARMED") : qsTr("DISARMED") font.pointSize: 12 * dpiFactor font.weight: Font.DemiBold - anchors.horizontalCenter: parent.horizontalCenter - anchors.verticalCenter: parent.verticalCenter - color: (mainToolBar.systemArmed) ? colorRed : colorGreen + anchors.centerIn: parent + color: (mainToolBar.systemArmed) ? colorRed : colorGreenText } } @@ -369,9 +390,8 @@ Rectangle { text: mainToolBar.currentState font.pointSize: 12 * dpiFactor font.weight: Font.DemiBold - anchors.horizontalCenter: parent.horizontalCenter - anchors.verticalCenter: parent.verticalCenter - color: (mainToolBar.currentState === "STANDBY") ? colorGreen : colorRed + anchors.centerIn: parent + color: (mainToolBar.currentState === "STANDBY") ? colorGreenText : colorRed } }