|
@@ -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;
|
|
|
/* ======================================================================== */
|