Преглед на файлове

V0.2.3
1、可以绘制出眼图

Apple преди 4 месеца
родител
ревизия
f57114a742
променени са 5 файла, в които са добавени 163 реда и са изтрити 118 реда
  1. 122 112
      EyeMap/OscData.cpp
  2. 6 6
      EyeMap/eyemap.cpp
  3. 1 0
      GlobalInfo/GlobalInfo.cpp
  4. 33 0
      GlobalInfo/GlobalInfo.h
  5. 1 0
      oscwidget.cpp

+ 122 - 112
EyeMap/OscData.cpp

@@ -686,7 +686,7 @@ void OscilloscopeData::threadProcessData()
             for(uint32_t i = 0; i < BUFFER_SIZE / 2; i++)
             {
                 m_bufferChnA[i] = m_buffer[i * 2];
-                m_bufferChnB[i] = m_buffer[i * 2 + 1];
+                // m_bufferChnB[i] = m_buffer[i * 2 + 1];
             }
             m_isCaptureData = false;
             m_mutexCaptureData.unlock();
@@ -702,6 +702,10 @@ void OscilloscopeData::threadProcessData()
         //     SPDLOG_LOGGER_DEBUG(m_logger, "A: {}, B: {}", m_bufferChnA[i], m_bufferChnB[i]);
         // }
         // SPDLOG_LOGGER_DEBUG(m_logger, "输出完成");
+
+        /* 对零电平进行矫正 */
+
+        /* 处理眼图数据 */
         parseEyeMapData(m_bufferChnA, BUFFER_SIZE / 2);
         std::this_thread::sleep_for(std::chrono::microseconds(10));
     }
@@ -719,24 +723,20 @@ void OscilloscopeData::threadAddColorBySample()
     
 }
 
-/**
- * @brief 解析数据,眼图需要的数据,从C#代码中移植过来
+/** 
+ * @brief 解析数据,眼图需要的数据,从C#代码中移植过来 
  * 
- * @param buffer 数据缓冲区
- * @param size 缓冲区大小,单位字节
- */
+ * @param buffer 数据缓冲区 
+ * @param size 缓冲区大小,单位字节 
+ */ 
 void OscilloscopeData::parseEyeMapData(unsigned char* buffer, unsigned int size)
 {
     int bufferSize = size;
     uint8_t* array = buffer;
-    int num2 = 0;
-    int num3 = 0;
-    int num4 = 0;
 
     uint8_t vaMax = 128;
     uint8_t vaMin = 128;
     uint8_t tmp = 128;
-    num3 = bufferSize; /* 赋值,数据个数 */
 
     /* 数据预处理,找出最大值和最小值 */
     for (int i = 0; i < bufferSize; i++)
@@ -753,7 +753,7 @@ void OscilloscopeData::parseEyeMapData(unsigned char* buffer, unsigned int size)
         }
     }
 
-    /* 取绝对值,小于15丢弃,应该是丢弃幅度小于15的数据 */
+    /* 取绝对值,小于15丢弃,丢弃幅度小于15的数据,这部分可能不是触发的数据 */
     int numAmp = std::abs(vaMax - vaMin);
     if (numAmp <= 15)
     {
@@ -762,25 +762,23 @@ void OscilloscopeData::parseEyeMapData(unsigned char* buffer, unsigned int size)
     /* 计算最大值和最小值的中间数 */
     uint8_t vaMid = (vaMax + vaMin) / 2;
 
-    /* 根据全局设置,进行缩放和插值,num7,缩放系数,可能是 1.0 * 100.0 / 100 */
-    // double num7 = globleVariables.g_GlobSetting_struc.g_dataNumPerPixar * globleVariables.g_GlobSetting_struc.g_Timescale / 100.0;
-    double num7 = 1.0 * 100.0 / 100;        /* 这一行不知道是什么值,暂时用这个代替 */
-    /* num8屏幕像素数目? */
-    // long num8 = (long)(num7 * (double)globleVariables.g_Screen_PixarPts);
-    long num8 = 1600;        /* 这一行不知道是什么值,暂时用这个代替 */
-    if (num8 % 2 != 0L)
-    {
-        num8++;
-    }
-    /* num9,四分之一的像素数目? */
-    int num9 = 0;
-    num9 = (int)((double)num8 * 0.25);
-    // List<pEyeDataT> list = new List<pEyeDataT>();
+    /* ======================================================================== */
+    /* 将采样点添加bool值,如果时间很短,就进行插值,每个采样点之间插入30个值 */
+    /* 时间尺度,OscCurrentTimeScale = 100,num7 = 1.0,100MHz下每个采样点间距10ns */
+    double num7 = OscParams.dataNumPerPixar * OscParams.OscCurrentTimeScale / 100.0;
+    /* num7 * OscOneGridTime是一个时间格子中采样点的个数 */
+    long oneGridTime = num7 * OscParams.OscOneGridTime;
+    if (oneGridTime % 2 != 0L)
+    {
+        oneGridTime++;
+    }
+    int num9 = (int)((double)oneGridTime * 0.25);       /* 1/4个时间格子长度 */
+    /* 记录buffer的值,并添加bool */
     std::vector<EyeDataT> vecData;
     int numMulti = 0;    /* 倍率,可能是1可能是30 */
     if (num7 >= 1.0)
     {
-        /* 将数据放入到list中,带有bool标志位 */
+        /* 将数据放入到list中,带有bool标志位,全部启用 */
         for (int i = 0; i < bufferSize; i++)
         {
             vecData.push_back(EyeDataT(true, array[i]));
@@ -789,50 +787,59 @@ void OscilloscopeData::parseEyeMapData(unsigned char* buffer, unsigned int size)
     }
     else
     {
-        // /* 缩放系数小于1.0,下面会进行插值 */
-        // num3 = bufferSize - 1;
-        // float num11 = 0.0;
-        // // Random random = new Random();
-        // QRandomGenerator* random = QRandomGenerator::global();
-        // bool flag2 = false;
-        // /*  */
-        // for (num2 = 0; num2 < num3; num2++)
-        // {
-        //     b2 = array[num2];			/* 偶数位 */
-        //     b3 = array[num2 + 1];		/* 奇数位 */
-        //     /* 在b2和b3之间添加30个插值 */
-        //     num11 = (float)(b3 - b2) / 30.f; /* 将幅值分成30份 */
-        //     vecData.push_back(EyeDataT(true, b2));
-        //     num5 = 30;
-        //     for (num4 = 0; num4 < num5; num4++)
-        //     {
-        //         b = (byte)(Math.Round(num11 * (float)num4, MidpointRounding.AwayFromZero) + (double)(int)b2);
-        //         flag2 = ((1 == random.Next(1)) ? true : false);
-        //         list.Add(new pEyeDataT(flag2, b));
-        //     }
-        //     list.Add(new pEyeDataT(_bIsTure: true, b3));
-        // }
-        // numMulti = 30;
+        /* 缩放系数小于1.0,下面会进行插值 */
+        int numTmp = bufferSize - 1;
+        float num11 = 0.0;
+
+        bool flag2 = false;
+        /*  */
+        uint8_t b2 = 0;
+        uint8_t b3 = 0;
+        uint8_t b = 0;
+        int num5 = 0;
+        /* 进行插值,每个采样点之间插30个值 */
+        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(flag2, b));
+            }
+            vecData.push_back(EyeDataT(true, b3));
+        }
+        numMulti = 30;
     }
     if (vecData.size() <= 0)
     {
         return;
     }
-    /* 屏幕的像素数目的1/4 * (1或30)? */
-    num9 *= numMulti;          /* 这里的num9可能是400 */
-    long num12 = num8 * numMulti;  /* num12可能是1600 */
-    // List<List<pEyeDataT>> list2 = new List<List<pEyeDataT>>();
-    std::vector<std::vector<EyeDataT>> list2;
-    // List<int> listSub = new List<int>();
+    num9 *= numMulti;          /* 1/4个时间格子长度,乘以倍数 */
+    /* oneGridTime2也是一个时间格子的长度,单位ns */
+    long oneGridTime2 = oneGridTime * numMulti;
+    /* ======================================================================== */
+    /* 寻找波形,找到上升沿和下降沿 */
     /* 存储下标 */
     std::vector<int> listSub;
-    num3 = vecData.size() - num9;
+    int numDataSize = vecData.size() - num9;
     bool flag3 = true;
-    /* 找到数组中的上升沿和下降沿,并记录其坐标 */
+    /* 找到数组中的上升沿和下降沿,并记录其坐标
+     * 这里寻找上升沿和下降沿是检测的中间值,是每个跳变沿的中部
+     * 中间值理论上是零值 */
     uint8_t vaPre = 0;
     // uint8_t va = 0;
     uint8_t vaNext = 0;
-    for (int i = 10; i < num3; i++)
+    for (int i = 10; i < numDataSize; i++)
     {
         /* 取出相邻的三个值 */
         vaPre = vecData[i - 1].value;
@@ -840,7 +847,7 @@ void OscilloscopeData::parseEyeMapData(unsigned char* buffer, unsigned int size)
         vaNext = vecData[i + 1].value;
         if (flag3)
         {
-            /* 上升沿,b6 = b7,就是中间值 */
+            /* 上升沿,就是中间值 */
             if (vaPre <= vaMid && vaNext > vaMid)
             {
                 listSub.push_back(i);		/* 记录下标 */
@@ -850,7 +857,7 @@ void OscilloscopeData::parseEyeMapData(unsigned char* buffer, unsigned int size)
         /* 下降沿 */
         else if (vaPre >= vaMid && vaNext < vaMid)
         {
-            listSub.push_back(num2);
+            listSub.push_back(i);
             flag3 = !flag3;
         }
         /* 采集到600个上升沿和下降沿 */
@@ -863,90 +870,93 @@ void OscilloscopeData::parseEyeMapData(unsigned char* buffer, unsigned int size)
     {
         return;
     }
-    /*  */
-    int num13 = 0;
-    int num14 = 0;
-    int num15 = 0;
+    /* ======================================================================== */
+    std::vector<std::vector<EyeDataT>> vec2DEyeData;
+    int jumpStart = 0;      /* 跳变沿起点 */
+    int jumpEnd = 0;        /* 跳变沿终点 */
     int num16 = 0;
     int num17 = 0;
-    num3 = listSub.size();		/* 下标的个数 */
-    num16 = (int)(num12 / 3);
-    /*  */
-    int num5 = 0;
-    for (int i = 0; i < num3; i++)
-    {
-        std::vector<EyeDataT> vecDataTmp;
-        for (num4 = 0; num4 < num12; num4++)
-        {
-            vecDataTmp.push_back(EyeDataT(false, 0));
-        }
-        num5 = listSub[i];
-        num13 = num5 - num16;
-        num14 = num13;
-        if (num14 <= 0)
+    size_t numSubSize = listSub.size();    /* 跳变沿下标的个数 */
+    num16 = (int)(oneGridTime2 / 3);           /*  */
+    int numSub1 = 0;
+    int numSub2 = 0;
+    /* 这里应该是根据跳变沿的中间值,取出完整的跳变沿
+     * 创建一个二维数组,每一行就是一个跳变沿 */
+    for (int i = 0; i < numSubSize; i++)
+    {
+        int j = 0;
+        /* 这一个数组就是一个跳变沿,num12是一个跳变沿所有的采样点的个数 */
+        std::vector<EyeDataT> vecDataTmp(oneGridTime2, EyeDataT(false, 0));
+
+        numSub1 = listSub[i];           /* 取出下标值 */
+        numSub2 = numSub1 - num16;      /* 下标往后倒退num16个值,是起点? */
+        /* 判断是否小于0,这里是起点 */
+        jumpStart = numSub2;
+        if (jumpStart <= 0)
         {
-            num14 = 0;
+            jumpStart = 0;
         }
-        num15 = num5 + num16 * 2;
-        if (num15 >= vecData.size())
+        /* 判断是否超出采样点的个数,这里是终点 */
+        jumpEnd = numSub1 + num16 * 2;
+        if (jumpEnd >= vecData.size())
         {
-            num15 = vecData.size() - 1;
+            jumpEnd = vecData.size() - 1;
         }
+        /* 这里为了去掉jumpStart前面的值,让vecDataTmp从0开始计数 */
         num17 = 0;
-        if (num13 < 0)
+        if (numSub2 < 0)
         {
-            num17 = std::abs(num13);
+            num17 = std::abs(numSub2);
         }
-        if (num13 > 0)
+        if (numSub2 > 0)
         {
-            num17 = -num13;
+            num17 = -numSub2;
         }
-        for (num4 = num14; num4 < num15; num4++)
+        /* num14是起点,num15是终点,num17应该是个负值,num17+j从0开始计数 */
+        for (j = jumpStart; j < jumpEnd; j++)
         {
-            vecDataTmp[num17 + num4].isEyeData = vecData[num4].isEyeData;
-            vecDataTmp[num17 + num4].value = vecData[num4].value;
+            vecDataTmp[num17 + j].isEyeData = vecData[j].isEyeData;
+            vecDataTmp[num17 + j].value = vecData[j].value;
         }
-        list2.push_back(vecDataTmp);
+        vec2DEyeData.push_back(vecDataTmp);
     }
     listSub.clear();
     vecData.clear();
-    if (list2.size() <= 0)
+    if (vec2DEyeData.size() <= 0)
     {
         return;
     }
+    /* ======================================================================== */
     int num18 = 0;
-    int num19 = 0;
     float num20 = 0.0;
     /* 将数据拷贝到OscData的Matrix中 */
-    for (int i = 0; i < list2.size(); i++)
-    {
-        std::vector<EyeDataT> list5 = list2[i];
-        num3 = list5.size();
-        num20 = num3;
-        num20 /= 1000.f;
+    int numTmp = 0;
+    int ValTmp = 0;
+    /* 将跳变沿数据放入到全局变量中,并根据坐标进行排列 */
+    for (int i = 0; i < vec2DEyeData.size(); i++)
+    {
+        /* 取出一个跳变沿 */
+        std::vector<EyeDataT>& vecTmp = vec2DEyeData[i];
+        numTmp = vecTmp.size();
+        num20 = numTmp / 1000.f;
         g_eyeDataMatrix.mutexEyeData.lock();
-        for (num4 = 0; num4 < num3; num4++)
+        for (int i = 0; i < numTmp; i++)
         {
-            if (list5[num4].isEyeData)
+            if (vecTmp[i].isEyeData)
             {
-                num5 = list5[num4].value;
-                num19 = num5;
-                num18 = (int)((float)num4 / num20);
+                ValTmp = vecTmp[i].value;
+                num18 = (int)((float)i / num20);
                 /* 将数据添加到眼图矩阵中 */
-                // globleVariables.g_IeyeDataMatrix.eyeWeighted(num18, num19);
-                g_eyeDataMatrix.addData(num18, num19);
+                g_eyeDataMatrix.addData(num18, ValTmp);
             }
         }
         g_eyeDataMatrix.mutexEyeData.unlock();
     }
-    // globleVariables.g_IeyeDataMatrix.eyeStatisticalWeight();
     g_eyeDataMatrix.eyeStatisticalWeight();
-    // globleVariables.g_IeyeDataMatrix.eyeLessenTheBurden();
     g_eyeDataMatrix.eyeLessenTheBurden();
-    list2.clear();
-    // pEyeData[,] eyedata = globleVariables.g_IeyeDataMatrix.eyeZoomOut();
+    vec2DEyeData.clear();
     auto eyeData = g_eyeDataMatrix.eyeZoomOut();
-    // GraphView.m_eyedMatrux.EyeDataMatrixCopy(eyedata);
+
     g_eyeMapMatrix.mutexEyeData.lock();
     g_eyeMapMatrix.copyDataMatrix(*eyeData);
     g_eyeMapMatrix.mutexEyeData.unlock();

+ 6 - 6
EyeMap/eyemap.cpp

@@ -45,14 +45,14 @@ void EyeMap::paintEvent(QPaintEvent *event)
     pen.setWidth(1);
     pen.setStyle(Qt::SolidLine);
     QBrush brush;
-    brush.setColor(Qt::yellow);
+    brush.setColor(Qt::white);
     brush.setStyle(Qt::SolidPattern);
     
     painter.setRenderHint(QPainter::Antialiasing, true);
     /* 绘制背景 */
     painter.setPen(pen);
     painter.setBrush(brush);
-    // painter.drawRect(0, 0, 1600, 900);
+    painter.drawRect(0, 0, this->width(), this->height());
     /* 绘制刻度 */
 
     /* 绘制网格 */
@@ -64,10 +64,10 @@ void EyeMap::paintEvent(QPaintEvent *event)
     {
         for(int j = 0; j < 256; j++)
         {
-            // if(g_eyeMapMatrix.dataMatrix[i][j].isDraw == false)
-            // {
-            //     continue;
-            // }
+            if(g_eyeMapMatrix.dataMatrix[i][j].isDraw == false)
+            {
+                continue;
+            }
             painter.setBrush(QBrush(g_eyeMapMatrix.dataMatrix[i][j].color));
             painter.drawRect(g_eyeMapMatrix.dataMatrix[i][j].rect);
         }

+ 1 - 0
GlobalInfo/GlobalInfo.cpp

@@ -136,6 +136,7 @@ void EyeMapMatrix::copyDataMatrix(Vec2D& data)
                 {
                     dataMatrix[i][j].Count = data[i][j].fCnt;
                 }
+                dataMatrix[i][j].isDraw = true;
             }
         }
     }

+ 33 - 0
GlobalInfo/GlobalInfo.h

@@ -178,4 +178,37 @@ extern EyeMapMatrix g_eyeMapMatrix;
 
 
 
+#define OscParams OscilloscopeParameters::getInstance()
+/**
+ * @brief 示波器全局设置,这是个单例类
+ * 
+ */
+class OscilloscopeParameters
+{
+private:
+    OscilloscopeParameters() {}
+    OscilloscopeParameters(const OscilloscopeParameters&) = delete;
+    OscilloscopeParameters& operator=(const OscilloscopeParameters&) = delete;
+public:
+    ~OscilloscopeParameters() {}
+    static OscilloscopeParameters& getInstance()
+    {
+        static OscilloscopeParameters instance;
+        return instance;
+    }
+
+    /* 示波器相关参数 */
+    int OscCurrentTimeScale = 100;  /* 时间尺度,不知道啥意思,可能和采样率有关 */
+    int OscOneGridTime = 1000;      /* 每格子的时间(单位ns) */
+
+    /* 显示相关 */
+    int TimeGridNum = 10;           /* 10个时间格子 */
+    int VolatileGridNum = 10;       /* 10个电压格子 */
+
+    /* 其他参数 */
+    const int dataNumPerPixar = 1;  /* 这个是SetInfo的第一个参数,固定是1,在眼图中会使用 */
+
+};
+
+
 #endif /* GLOBALINFO_H */

+ 1 - 0
oscwidget.cpp

@@ -67,6 +67,7 @@ OscWidget::~OscWidget()
 
 void OscWidget::on_pBtn_capOne_clicked()
 {
+    OscParams.OscOneGridTime = 200;       /* 每格时间0.2us */
     SPDLOG_LOGGER_INFO(m_logger, "采集一次数据");
     OscData.threadCaptureData();
     OscData.threadProcessData();