Kaynağa Gözat

update screen from fifo data

xuqiang 4 ay önce
ebeveyn
işleme
281d3b11cd
3 değiştirilmiş dosya ile 31 ekleme ve 10 silme
  1. 4 1
      include/datafifo.h
  2. 14 1
      src/datafifo.cpp
  3. 13 8
      src/mainwindow.cpp

+ 4 - 1
include/datafifo.h

@@ -17,7 +17,10 @@ public:
 private:
     QThread m_thread;
     bool m_isRunning;
-    
+
+signals:
+    void updateScreen(const QJsonObject &obj);
+
 private slots:
     void doWork();
 

+ 14 - 1
src/datafifo.cpp

@@ -2,6 +2,10 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
+#include <QJsonObject>
+#include <QJsonArray>
+#include <QJsonDocument>
+#include <QDebug>
 #include <fcntl.h>
 #include "logger.h"
 
@@ -64,7 +68,16 @@ void DataFifo::doWork()
     while (m_isRunning) {
         n = getline(&line, &len, stream);
         if(n > 0) {
-            LOG_INFO("read size: {}, buffer size: {}, data: {}", n, len, line);
+            LOG_DEBUG("read size: {}, buffer size: {}, data: {}", n, len, line);
+            QByteArray byteArray(line, n);
+            QJsonParseError error;
+            QJsonDocument doc = QJsonDocument::fromJson(byteArray, &error);
+            if(error.error == QJsonParseError::NoError && doc.isObject()) {
+                QJsonObject obj = doc.object();
+                emit updateScreen(obj);
+            } else {
+                LOG_ERROR("data fifo: invalid json");
+            }
         } else if (n == 0) {
             // FIFO 写端关闭时 read 返回 0
             LOG_INFO("writer closed. exiting.");

+ 13 - 8
src/mainwindow.cpp

@@ -25,6 +25,9 @@ MainWindow::MainWindow(QWidget *parent)
     HttpServer &httpServer = AppContext::instance().httpServer();
     connect(&httpServer, &HttpServer::monitorConfigureUpdate, this, &MainWindow::onConfigureUpdate);
     connect(&httpServer, &HttpServer::reloadCanvas, this, &MainWindow::onReloadCanvas);
+
+    DataFifo &dataFifo = AppContext::instance().dataFifo();
+    connect(&dataFifo, &DataFifo::updateScreen, this, &MainWindow::onUpdateScreen);
 }
 
 MainWindow::~MainWindow()
@@ -160,13 +163,15 @@ void MainWindow::onUpdateScreen(const QJsonObject &obj)
 
             for(auto parameter : widgetParameters)
             {
-                QMetaObject::invokeMethod(
-                    pAbstractWidget,
-                    "setValue",
-                    Qt::AutoConnection,
-                    Q_ARG(QString, parameter),
-                    Q_ARG(QVariant, obj[parameter].toVariant()),
-                    Q_ARG(QString, Utils::timestamp()));
+                if(obj.contains(parameter)) {
+                    QMetaObject::invokeMethod(
+                        pAbstractWidget,
+                        "setValue",
+                        Qt::AutoConnection,
+                        Q_ARG(QString, parameter),
+                        Q_ARG(QVariant, obj[parameter].toVariant()),
+                        Q_ARG(QString, Utils::timestamp()));
+                }
             }
 
             if(pCanvas == m_pStackedWidget->currentWidget()) {
@@ -177,7 +182,7 @@ void MainWindow::onUpdateScreen(const QJsonObject &obj)
     }
 
     qint64 duration = timer.elapsed(); // 获取经过的毫秒数
-    LOG_DEBUG("update screen duration: {}ms", duration);
+    LOG_INFO("update screen duration: {}ms", duration);
 }
 
 void MainWindow::onPageSwitdh(int state)