Browse Source

V0.4
1、基本可以随着时间进行缩放了
2、重新采集渲染还有些问题

Apple 4 months ago
parent
commit
dc8acf19e0
6 changed files with 142 additions and 41 deletions
  1. 65 21
      EyeMap/OscData.cpp
  2. 17 2
      GlobalInfo/GlobalInfo.cpp
  3. 2 2
      GlobalInfo/GlobalInfo.h
  4. 40 11
      oscwidget.cpp
  5. 4 1
      oscwidget.h
  6. 14 4
      oscwidget.ui

+ 65 - 21
EyeMap/OscData.cpp

@@ -103,10 +103,7 @@ void OscilloscopeData::closeOSC()
     {
         stopCapture();
     }
-    while (m_isRunCapture)
-    {
-        std::this_thread::sleep_for(std::chrono::milliseconds(5));
-    }
+    
     if(m_usbInterface != nullptr)
     {
         m_usbInterface->devClose();
@@ -134,7 +131,16 @@ bool OscilloscopeData::startCapture()
 /* 停止采集数据 */
 void OscilloscopeData::stopCapture()
 {
+    if(!m_runCapture)
+    {
+        return;
+    }
     m_runCapture = false;
+    while (m_isRunCapture)
+    {
+        std::this_thread::sleep_for(std::chrono::milliseconds(5));
+    }
+    SPDLOG_LOGGER_INFO(m_logger, "停止采集数据");
 }
 
 /* 设置示波器的采样率 */
@@ -676,6 +682,7 @@ void OscilloscopeData::threadCaptureData()
 
     }
     m_isRunCapture = false;
+    SPDLOG_LOGGER_INFO(m_logger, "采集数据线程结束");
 }
 
 /* 处理数据线程 */
@@ -714,11 +721,13 @@ void OscilloscopeData::threadProcessData()
         parseEyeMapData(m_bufferChnA, BUFFER_SIZE / 2);
         std::this_thread::sleep_for(std::chrono::microseconds(10));
     }
+    SPDLOG_LOGGER_INFO(m_logger, "处理数据线程结束");
 }
 
 /* 根据采样点数添加颜色 */
 void OscilloscopeData::threadAddColorBySample()
 {
+    SPDLOG_LOGGER_INFO(m_logger, "开始添加颜色线程");
     while(m_runCapture)
     {
         g_eyeMapMatrix.mutexEyeData.lock();
@@ -728,11 +737,18 @@ void OscilloscopeData::threadAddColorBySample()
         /* 延时一下,让别的线程拿到锁 */
         std::this_thread::sleep_for(std::chrono::microseconds(10));
     }
-    
+    SPDLOG_LOGGER_INFO(m_logger, "添加颜色线程结束");
 }
 
 /** 
  * @brief 解析数据,眼图需要的数据,从C#代码中移植过来 
+ *        1、采样率为100MHz的时候,采样点间隔时间是10ns
+ *          x轴时间是1000分度,当x轴整体时间是10us的时候,采样点和分辨率一一对应
+ *          x轴时间大于10us,采样点比分辨率高,无需做什么操作
+ *          x轴时间小于10us,采样点数量会小于1000,那么绘制的矩形小点间隔会比较长,这时候就需要进行插帧
+ *        2、屏幕中显示多少波形和波形的频率及时间屏幕可以现实的时间长度有关,波形的频率未知,所以这里只能通过调整时间长度来调整波形
+ *          在屏幕中显示的数目
+ *        3、当时间长度变小,小到整个屏幕的采样点数目不足1000的时候,就需要进行插值,插值到1000附近
  * 
  * @param buffer 数据缓冲区 
  * @param size 缓冲区大小,单位字节 
@@ -788,7 +804,7 @@ void OscilloscopeData::parseEyeMapData(unsigned char* buffer, unsigned int size)
     /* 一个时间格子的采样率个数 */
     int oneGridSa = OscParams.oneGridTime / OscParams.SampleIntervalTime;       /* 当前一个格子中采样点的数目 */
     int saTotal = oneGridSa * 10;       /* 一个时间格子中采样点的总数 */
-    bool isNeedFrameInsertion = ( (oneGridSa * 10) < OscParams.eyeMapWidth ) ? true : false;
+    bool isNeedFrameInsertion = ( saTotal < OscParams.eyeMapWidth ) ? true : false;
 
     int num9 = (int)((double)oneGridSa * 0.25);       /* 1/4个时间格子长度 */
     /* 记录buffer的值,并添加bool */
@@ -816,35 +832,63 @@ void OscilloscopeData::parseEyeMapData(unsigned char* buffer, unsigned int size)
         uint8_t b = 0;
         int num5 = 0;
         /* 进行插值,每个采样点之间插30个值 */
-        for (int i = 0; i < numTmp; i++)
+        // for (int i = 0; i < numTmp; i++)
+        // {
+        //     b2 = array[i];			/* 偶数位 */
+        //     b3 = array[i + 1];		/* 奇数位 */
+        //     /* 在b2和b3之间添加30个插值 */
+        //     num11 = (float)(b3 - b2) / 30.f; /* 将幅值分成30份 */
+        //     vecData.push_back(EyeDataT(true, b2));
+        //     num5 = 30;
+        //     /* Qt的全局随机数生成器 */
+        //     auto random = QRandomGenerator::global();
+        //     for (int j = 0; j < num5; j++)
+        //     {
+        //         /* 四舍五入 */
+        //         b = std::round((num11 * (float)j) + (int)b2);
+        //         // flag2 = ((1 == random.Next(1)) ? true : false);
+        //         // flag2 = ((1 == random->bounded(0, 1)) ? true : false);
+        //         vecData.push_back(EyeDataT(true, b));
+        //     }
+        //     vecData.push_back(EyeDataT(true, b3));
+        // }
+        /* 进行插值,每个采样点之间插值 */
+        int numMulti2 = 0;
+        double numMulti1 = 1000.0 / saTotal;
+        if(numMulti1 > 1.0 && numMulti1 < 2.0)
+        {
+            numMulti2 = 1;
+        }
+        else if(numMulti1 > 2.0 && numMulti1 < 3.0)
         {
-            b2 = array[i];			/* 偶数位 */
-            b3 = array[i + 1];		/* 奇数位 */
-            /* 在b2和b3之间添加30个插值 */
-            num11 = (float)(b3 - b2) / 30.f; /* 将幅值分成30份 */
+            numMulti2 = 2;
+        }
+        else if(numMulti1 > 3.0)
+        {
+            numMulti2 = std::round(numMulti1);
+        }
+        for(int i = 0; i < numTmp; i++)
+        {
+            b2 = array[i];
+            b3 = array[i + 1];
+            num11 = (float)(b3 - b2) / numMulti2;
             vecData.push_back(EyeDataT(true, b2));
-            num5 = 30;
-            /* Qt的全局随机数生成器 */
-            auto random = QRandomGenerator::global();
-            for (int j = 0; j < num5; j++)
+            for(int j = 0; j < numMulti2; j++)
             {
-                /* 四舍五入 */
                 b = std::round((num11 * (float)j) + (int)b2);
-                // flag2 = ((1 == random.Next(1)) ? true : false);
-                // flag2 = ((1 == random->bounded(0, 1)) ? true : false);
                 vecData.push_back(EyeDataT(true, b));
             }
             vecData.push_back(EyeDataT(true, b3));
         }
-        numMulti = 30;
+
+        numMulti = numMulti2;
     }
     if (vecData.size() <= 0)
     {
         return;
     }
     num9 *= numMulti;          /* 1/4个时间格子长度,乘以倍数 */
-    /* oneJumpSa是一个跳变沿的采样点个数 */
-    // long oneJumpSa = oneGridSa * numMulti;
+    /* 这里决定着时间的缩放关系,saTotal是整个显示区域的采样点个数 */
     long oneJumpSa = saTotal * numMulti;
     // long oneJumpSa = 1000;
     /* ======================================================================== */

+ 17 - 2
GlobalInfo/GlobalInfo.cpp

@@ -7,9 +7,21 @@ EyeMapMatrix g_eyeMapMatrix;
 
 
 
-EyeDataMatrix::EyeDataMatrix() : dataMatrix(1000, std::vector<EyeDataSample>(256))
-{
 
+
+void EyeDataMatrix::initEyeData()
+{
+    mutexEyeData.lock();
+    for(int i = 0; i < 1000; i++)
+    {
+        for(int j = 0; j < 256; j++)
+        {
+            dataMatrix[i][j].fCnt = 0.0;
+            dataMatrix[i][j].data = 0;
+            dataMatrix[i][j].Cnt = 0;
+        }
+    }
+    mutexEyeData.unlock();
 }
 
 
@@ -113,6 +125,7 @@ std::shared_ptr<Vec2D> EyeDataMatrix::eyeZoomOut()
 /* 初始化数据点 */
 void EyeMapMatrix::initEyeMapData(int width, int height)
 {
+    mutexEyeData.lock();
     double saH = height / 256.0;
     double saW = width / 1000.0;
     for(int i = 0; i < 1000; i++)
@@ -122,8 +135,10 @@ void EyeMapMatrix::initEyeMapData(int width, int height)
             dataMatrix[i][j].x = (int)(i * saW);
             dataMatrix[i][j].y = (int)(j * saH);
             dataMatrix[i][j].rect = QRect(dataMatrix[i][j].x, dataMatrix[i][j].y, (int)saW, (int)saH);
+            dataMatrix[i][j].brush = QBrush(QColor(255, 255, 255));
         }
     }
+    mutexEyeData.unlock();
 }
 
 /* 拷贝数据到数组中 */

+ 2 - 2
GlobalInfo/GlobalInfo.h

@@ -106,14 +106,14 @@ class EyeDataMatrix
 {   
 
 public:
-    EyeDataMatrix();
+    EyeDataMatrix() : dataMatrix(1000, std::vector<EyeDataSample>(256)) {}
     ~EyeDataMatrix() {}
 
     Vec2D dataMatrix;
     // EyeDataSample dataMatrix[1000][256];
     std::mutex mutexEyeData;
     
-
+    void initEyeData();
     void addData(int x, int y);
     void eyeStatisticalWeight();
     void eyeLessenTheBurden();

+ 40 - 11
oscwidget.cpp

@@ -20,7 +20,26 @@ OscWidget::OscWidget(QWidget *parent) :
 
     /* 设置眼图窗口 */
     m_eyeMap = new EyeMap(ui->widget_display);
-
+    /* 添加下拉框的选项 */
+    ui->comboBox_time->addItem("0.05us");
+    ui->comboBox_time->addItem("0.1us");
+    ui->comboBox_time->addItem("0.2us");
+    ui->comboBox_time->addItem("0.5us");
+    ui->comboBox_time->addItem("1us");
+    ui->comboBox_time->addItem("2us");
+    ui->comboBox_time->addItem("5us");
+    ui->comboBox_time->addItem("10us");
+    ui->comboBox_time->addItem("20us");
+    
+    m_mapTime.insert("0.05us", 50);
+    m_mapTime.insert("0.1us", 100);
+    m_mapTime.insert("0.2us", 200);
+    m_mapTime.insert("0.5us", 500);
+    m_mapTime.insert("1us", 1000);
+    m_mapTime.insert("2us", 2000);
+    m_mapTime.insert("5us", 5000);
+    m_mapTime.insert("10us", 10000);
+    m_mapTime.insert("20us", 20000);
     
 
     SPDLOG_LOGGER_INFO(m_logger, "EyeMap 初始化成功");
@@ -65,19 +84,29 @@ OscWidget::~OscWidget()
 }
 
 
-void OscWidget::on_pBtn_capOne_clicked()
+void OscWidget::on_pBtn_startCap_clicked()
 {
-    SPDLOG_LOGGER_INFO(m_logger, "采集一次数据");
-    // OscData.threadCaptureData();
-    // OscData.threadProcessData();
-    // OscData.threadAddColorBySample();
-    
-    update();
+    SPDLOG_LOGGER_INFO(m_logger, "开始采集数据");
+    OscParams.oneGridTime = m_mapTime[ui->comboBox_time->currentText()];
+    OscData.startCapture();
 }
 
-void OscWidget::on_pBtn_startCap_clicked()
+void OscWidget::on_pBtn_resetCap_clicked()
 {
-    SPDLOG_LOGGER_INFO(m_logger, "开始采集数据");
-    OscParams.oneGridTime = 200;       /* 每格时间0.2us */
+    SPDLOG_LOGGER_INFO(m_logger, "重新采集数据");
+    OscData.stopCapture();
+    g_eyeMapMatrix.initEyeMapData(ui->widget_display->width(), ui->widget_display->height());
+    g_eyeDataMatrix.initEyeData();
+    update();
+    OscParams.oneGridTime = m_mapTime[ui->comboBox_time->currentText()];
     OscData.startCapture();
 }
+
+void OscWidget::on_pBtn_stopCap_clicked()
+{
+    SPDLOG_LOGGER_INFO(m_logger, "停止采集");
+    OscData.stopCapture();
+    
+    update();
+}
+

+ 4 - 1
oscwidget.h

@@ -18,13 +18,16 @@ public:
     ~OscWidget();
 
 private slots:
-    void on_pBtn_capOne_clicked();
+    
     void on_pBtn_startCap_clicked();
+    void on_pBtn_resetCap_clicked();
+    void on_pBtn_stopCap_clicked();
 
 private:
     Ui::OscWidget *ui;
     std::shared_ptr<spdlog::logger> m_logger = nullptr;
     EyeMap* m_eyeMap = nullptr;
+    QMap<QString, int> m_mapTime;
 };
 
 #endif // OSCWIDGET_H

+ 14 - 4
oscwidget.ui

@@ -48,14 +48,24 @@
    <item>
     <widget class="QWidget" name="widget" native="true">
      <layout class="QGridLayout" name="gridLayout">
-      <item row="0" column="0">
-       <widget class="QPushButton" name="pBtn_capOne">
+      <item row="3" column="1">
+       <widget class="QComboBox" name="comboBox_time"/>
+      </item>
+      <item row="2" column="1">
+       <widget class="QPushButton" name="pBtn_resetCap">
+        <property name="text">
+         <string>重新采集</string>
+        </property>
+       </widget>
+      </item>
+      <item row="3" column="0">
+       <widget class="QPushButton" name="pBtn_stopCap">
         <property name="text">
-         <string>采集一次数据</string>
+         <string>停止采集</string>
         </property>
        </widget>
       </item>
-      <item row="0" column="1">
+      <item row="2" column="0">
        <widget class="QPushButton" name="pBtn_startCap">
         <property name="text">
          <string>开始采集</string>