|
@@ -127,6 +127,7 @@ bool OscilloscopeData::startCapture()
|
|
|
m_runCapture = true;
|
|
|
CPPTP.add_task(&OscilloscopeData::threadCaptureData, this);
|
|
|
CPPTP.add_task(&OscilloscopeData::threadProcessData, this);
|
|
|
+ CPPTP.add_task(&OscilloscopeData::threadAddColorBySample, this);
|
|
|
return true;
|
|
|
}
|
|
|
|
|
@@ -148,22 +149,27 @@ void OscilloscopeData::setSampleRate(OscSampleRate rate)
|
|
|
if(rate == OscSampleRate::SR_49KHZ)
|
|
|
{
|
|
|
m_ctrlByte0 |= 0x0e;
|
|
|
+ OscParams.SampleIntervalTime = 20408.16;
|
|
|
}
|
|
|
else if(rate == OscSampleRate::SR_96KHZ)
|
|
|
{
|
|
|
m_ctrlByte0 |= 0x04;
|
|
|
+ OscParams.SampleIntervalTime = 10416.67;
|
|
|
}
|
|
|
else if(rate == OscSampleRate::SR_781KHZ)
|
|
|
{
|
|
|
m_ctrlByte0 |= 0x0c;
|
|
|
+ OscParams.SampleIntervalTime = 1280.0;
|
|
|
}
|
|
|
else if(rate == OscSampleRate::SR_12_5MHZ)
|
|
|
{
|
|
|
m_ctrlByte0 |= 0x08;
|
|
|
+ OscParams.SampleIntervalTime = 80.0;
|
|
|
}
|
|
|
else if(rate == OscSampleRate::SR_100MHZ)
|
|
|
{
|
|
|
m_ctrlByte0 |= 0x00;
|
|
|
+ OscParams.SampleIntervalTime = 10;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -630,9 +636,8 @@ void OscilloscopeData::threadCaptureData()
|
|
|
{
|
|
|
SPDLOG_LOGGER_INFO(m_logger, "开始采集数据线程");
|
|
|
m_isRunCapture = true;
|
|
|
- uint64_t count = 0;
|
|
|
// unsigned char* buffer = nullptr;
|
|
|
- // while(m_runCapture)
|
|
|
+ while(m_runCapture)
|
|
|
{
|
|
|
// SPDLOG_LOGGER_DEBUG(m_logger, "开始采集数据");
|
|
|
/* 开始采集数据 */
|
|
@@ -677,7 +682,7 @@ void OscilloscopeData::threadCaptureData()
|
|
|
void OscilloscopeData::threadProcessData()
|
|
|
{
|
|
|
SPDLOG_LOGGER_INFO(m_logger, "开始处理数据线程");
|
|
|
- // while(m_runCapture)
|
|
|
+ while(m_runCapture)
|
|
|
{
|
|
|
if(m_isCaptureData.load())
|
|
|
{
|
|
@@ -691,7 +696,7 @@ void OscilloscopeData::threadProcessData()
|
|
|
m_isCaptureData = false;
|
|
|
m_mutexCaptureData.unlock();
|
|
|
/* 处理数据 */
|
|
|
- SPDLOG_LOGGER_DEBUG(m_logger, "开始处理数据,通道A数据: {}, 通道B数据: {}", m_bufferChnA[32000], m_bufferChnB[32000]);
|
|
|
+ // SPDLOG_LOGGER_DEBUG(m_logger, "开始处理数据,通道A数据: {}, 通道B数据: {}", m_bufferChnA[32000], m_bufferChnB[32000]);
|
|
|
/* 矫正零电压值 */
|
|
|
}
|
|
|
/* 打印1000个数据 */
|
|
@@ -714,11 +719,14 @@ void OscilloscopeData::threadProcessData()
|
|
|
/* 根据采样点数添加颜色 */
|
|
|
void OscilloscopeData::threadAddColorBySample()
|
|
|
{
|
|
|
- // while(m_runCapture)
|
|
|
+ while(m_runCapture)
|
|
|
{
|
|
|
g_eyeMapMatrix.mutexEyeData.lock();
|
|
|
g_eyeMapMatrix.addColorBySample();
|
|
|
g_eyeMapMatrix.mutexEyeData.unlock();
|
|
|
+ // SPDLOG_LOGGER_DEBUG(m_logger, "添加颜色完成");
|
|
|
+ /* 延时一下,让别的线程拿到锁 */
|
|
|
+ std::this_thread::sleep_for(std::chrono::microseconds(10));
|
|
|
}
|
|
|
|
|
|
}
|
|
@@ -765,18 +773,28 @@ void OscilloscopeData::parseEyeMapData(unsigned char* buffer, unsigned int size)
|
|
|
/* ======================================================================== */
|
|
|
/* 将采样点添加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个时间格子长度 */
|
|
|
+ // double num7 = OscParams.dataNumPerPixar * OscParams.OscCurrentTimeScale / 100.0;
|
|
|
+ // /* num7 * OscOneGridTime是一个时间格子中采样点的个数 */
|
|
|
+ // long oneGridTime = num7 * OscParams.OscOneGridTime;
|
|
|
+ // if (oneGridTime % 2 != 0L)
|
|
|
+ // {
|
|
|
+ // oneGridTime++;
|
|
|
+ // }
|
|
|
+
|
|
|
+ /* 采样率为100MHz的时候,采样点间隔时间是10ns
|
|
|
+ * x轴时间是1000分度,当x轴整体时间是10us的时候,采样点和分辨率一一对应
|
|
|
+ * x轴时间大于10us,采样点比分辨率高,无需做什么操作
|
|
|
+ * x轴时间小于10us,采样点数量会小于1000,那么绘制的矩形小点间隔会比较长,这时候就需要进行插帧 */
|
|
|
+ /* 一个时间格子的采样率个数 */
|
|
|
+ int oneGridSa = OscParams.oneGridTime / OscParams.SampleIntervalTime; /* 当前一个格子中采样点的数目 */
|
|
|
+ int saTotal = oneGridSa * 10; /* 一个时间格子中采样点的总数 */
|
|
|
+ bool isNeedFrameInsertion = ( (oneGridSa * 10) < OscParams.eyeMapWidth ) ? true : false;
|
|
|
+
|
|
|
+ int num9 = (int)((double)oneGridSa * 0.25); /* 1/4个时间格子长度 */
|
|
|
/* 记录buffer的值,并添加bool */
|
|
|
std::vector<EyeDataT> vecData;
|
|
|
int numMulti = 0; /* 倍率,可能是1可能是30 */
|
|
|
- if (num7 >= 1.0)
|
|
|
+ if (isNeedFrameInsertion == false)
|
|
|
{
|
|
|
/* 将数据放入到list中,带有bool标志位,全部启用 */
|
|
|
for (int i = 0; i < bufferSize; i++)
|
|
@@ -813,8 +831,8 @@ void OscilloscopeData::parseEyeMapData(unsigned char* buffer, unsigned int size)
|
|
|
/* 四舍五入 */
|
|
|
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));
|
|
|
+ // flag2 = ((1 == random->bounded(0, 1)) ? true : false);
|
|
|
+ vecData.push_back(EyeDataT(true, b));
|
|
|
}
|
|
|
vecData.push_back(EyeDataT(true, b3));
|
|
|
}
|
|
@@ -825,13 +843,15 @@ void OscilloscopeData::parseEyeMapData(unsigned char* buffer, unsigned int size)
|
|
|
return;
|
|
|
}
|
|
|
num9 *= numMulti; /* 1/4个时间格子长度,乘以倍数 */
|
|
|
- /* oneGridTime2也是一个时间格子的长度,单位ns */
|
|
|
- long oneGridTime2 = oneGridTime * numMulti;
|
|
|
+ /* oneJumpSa是一个跳变沿的采样点个数 */
|
|
|
+ // long oneJumpSa = oneGridSa * numMulti;
|
|
|
+ long oneJumpSa = saTotal * numMulti;
|
|
|
+ // long oneJumpSa = 1000;
|
|
|
/* ======================================================================== */
|
|
|
/* 寻找波形,找到上升沿和下降沿 */
|
|
|
/* 存储下标 */
|
|
|
std::vector<int> listSub;
|
|
|
- int numDataSize = vecData.size() - num9;
|
|
|
+ size_t numDataSize = vecData.size() - num9;
|
|
|
bool flag3 = true;
|
|
|
/* 找到数组中的上升沿和下降沿,并记录其坐标
|
|
|
* 这里寻找上升沿和下降沿是检测的中间值,是每个跳变沿的中部
|
|
@@ -871,33 +891,32 @@ void OscilloscopeData::parseEyeMapData(unsigned char* buffer, unsigned int size)
|
|
|
return;
|
|
|
}
|
|
|
/* ======================================================================== */
|
|
|
+ /* 这里应该是根据跳变沿的中间值,取出完整的跳变沿
|
|
|
+ * 创建一个二维数组,每一行就是一个跳变沿 */
|
|
|
std::vector<std::vector<EyeDataT>> vec2DEyeData;
|
|
|
int jumpStart = 0; /* 跳变沿起点 */
|
|
|
- int jumpEnd = 0; /* 跳变沿终点 */
|
|
|
- int num16 = 0;
|
|
|
+ size_t jumpEnd = 0; /* 跳变沿终点 */
|
|
|
int num17 = 0;
|
|
|
- size_t numSubSize = listSub.size(); /* 跳变沿下标的个数 */
|
|
|
- num16 = (int)(oneGridTime2 / 3); /* */
|
|
|
+ size_t numSubSize = listSub.size(); /* 跳变沿下标的个数 */
|
|
|
+ int oneThirdSa = (int)(oneJumpSa / 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));
|
|
|
+ std::vector<EyeDataT> vecDataTmp(oneJumpSa, EyeDataT(false, 0));
|
|
|
|
|
|
- numSub1 = listSub[i]; /* 取出下标值 */
|
|
|
- numSub2 = numSub1 - num16; /* 下标往后倒退num16个值,是起点? */
|
|
|
+ numSub1 = listSub[i]; /* 取出下标值 */
|
|
|
+ numSub2 = numSub1 - oneThirdSa; /* 下标往后倒退1/3个时间格子的采样点数,当作起点 */
|
|
|
/* 判断是否小于0,这里是起点 */
|
|
|
jumpStart = numSub2;
|
|
|
if (jumpStart <= 0)
|
|
|
{
|
|
|
jumpStart = 0;
|
|
|
}
|
|
|
- /* 判断是否超出采样点的个数,这里是终点 */
|
|
|
- jumpEnd = numSub1 + num16 * 2;
|
|
|
+ /* 终点往后2/3个时间格子的采样点数,当作终点 */
|
|
|
+ jumpEnd = numSub1 + oneThirdSa * 2;
|
|
|
if (jumpEnd >= vecData.size())
|
|
|
{
|
|
|
jumpEnd = vecData.size() - 1;
|
|
@@ -918,10 +937,15 @@ void OscilloscopeData::parseEyeMapData(unsigned char* buffer, unsigned int size)
|
|
|
vecDataTmp[num17 + j].isEyeData = vecData[j].isEyeData;
|
|
|
vecDataTmp[num17 + j].value = vecData[j].value;
|
|
|
}
|
|
|
+ // for(j = 0; j < oneGridTime2; j++)
|
|
|
+ // {
|
|
|
+ // vecDataTmp[j].isEyeData = vecData[jumpStart + j].isEyeData;
|
|
|
+ // vecDataTmp[j].value = vecData[jumpStart + j].value;
|
|
|
+ // }
|
|
|
vec2DEyeData.push_back(vecDataTmp);
|
|
|
}
|
|
|
- listSub.clear();
|
|
|
- vecData.clear();
|
|
|
+ // listSub.clear();
|
|
|
+ // vecData.clear();
|
|
|
if (vec2DEyeData.size() <= 0)
|
|
|
{
|
|
|
return;
|
|
@@ -930,16 +954,18 @@ void OscilloscopeData::parseEyeMapData(unsigned char* buffer, unsigned int size)
|
|
|
int num18 = 0;
|
|
|
float num20 = 0.0;
|
|
|
/* 将数据拷贝到OscData的Matrix中 */
|
|
|
- int numTmp = 0;
|
|
|
+ size_t numTmp = 0;
|
|
|
int ValTmp = 0;
|
|
|
- /* 将跳变沿数据放入到全局变量中,并根据坐标进行排列 */
|
|
|
+ /* 将跳变沿数据放入到全局变量中,并根据坐标进行排列
|
|
|
+ * x轴是这个跳变沿根据时间平分1000份
|
|
|
+ * y轴是这个值 */
|
|
|
+ g_eyeDataMatrix.mutexEyeData.lock();
|
|
|
for (int i = 0; i < vec2DEyeData.size(); i++)
|
|
|
{
|
|
|
- /* 取出一个跳变沿 */
|
|
|
+ /* 取出一个跳变沿,将其分布在整个 1000 * 256像素的矩阵中 */
|
|
|
std::vector<EyeDataT>& vecTmp = vec2DEyeData[i];
|
|
|
numTmp = vecTmp.size();
|
|
|
- num20 = numTmp / 1000.f;
|
|
|
- g_eyeDataMatrix.mutexEyeData.lock();
|
|
|
+ num20 = numTmp / 1000.f; /* x轴方向1000分 */
|
|
|
for (int i = 0; i < numTmp; i++)
|
|
|
{
|
|
|
if (vecTmp[i].isEyeData)
|
|
@@ -950,12 +976,14 @@ void OscilloscopeData::parseEyeMapData(unsigned char* buffer, unsigned int size)
|
|
|
g_eyeDataMatrix.addData(num18, ValTmp);
|
|
|
}
|
|
|
}
|
|
|
- g_eyeDataMatrix.mutexEyeData.unlock();
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
g_eyeDataMatrix.eyeStatisticalWeight();
|
|
|
g_eyeDataMatrix.eyeLessenTheBurden();
|
|
|
vec2DEyeData.clear();
|
|
|
auto eyeData = g_eyeDataMatrix.eyeZoomOut();
|
|
|
+ g_eyeDataMatrix.mutexEyeData.unlock();
|
|
|
|
|
|
g_eyeMapMatrix.mutexEyeData.lock();
|
|
|
g_eyeMapMatrix.copyDataMatrix(*eyeData);
|