|
@@ -686,7 +686,7 @@ void OscilloscopeData::threadProcessData()
|
|
for(uint32_t i = 0; i < BUFFER_SIZE / 2; i++)
|
|
for(uint32_t i = 0; i < BUFFER_SIZE / 2; i++)
|
|
{
|
|
{
|
|
m_bufferChnA[i] = m_buffer[i * 2];
|
|
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_isCaptureData = false;
|
|
m_mutexCaptureData.unlock();
|
|
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, "A: {}, B: {}", m_bufferChnA[i], m_bufferChnB[i]);
|
|
// }
|
|
// }
|
|
// SPDLOG_LOGGER_DEBUG(m_logger, "输出完成");
|
|
// SPDLOG_LOGGER_DEBUG(m_logger, "输出完成");
|
|
|
|
+
|
|
|
|
+ /* 对零电平进行矫正 */
|
|
|
|
+
|
|
|
|
+ /* 处理眼图数据 */
|
|
parseEyeMapData(m_bufferChnA, BUFFER_SIZE / 2);
|
|
parseEyeMapData(m_bufferChnA, BUFFER_SIZE / 2);
|
|
std::this_thread::sleep_for(std::chrono::microseconds(10));
|
|
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)
|
|
void OscilloscopeData::parseEyeMapData(unsigned char* buffer, unsigned int size)
|
|
{
|
|
{
|
|
int bufferSize = size;
|
|
int bufferSize = size;
|
|
uint8_t* array = buffer;
|
|
uint8_t* array = buffer;
|
|
- int num2 = 0;
|
|
|
|
- int num3 = 0;
|
|
|
|
- int num4 = 0;
|
|
|
|
|
|
|
|
uint8_t vaMax = 128;
|
|
uint8_t vaMax = 128;
|
|
uint8_t vaMin = 128;
|
|
uint8_t vaMin = 128;
|
|
uint8_t tmp = 128;
|
|
uint8_t tmp = 128;
|
|
- num3 = bufferSize; /* 赋值,数据个数 */
|
|
|
|
|
|
|
|
/* 数据预处理,找出最大值和最小值 */
|
|
/* 数据预处理,找出最大值和最小值 */
|
|
for (int i = 0; i < bufferSize; i++)
|
|
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);
|
|
int numAmp = std::abs(vaMax - vaMin);
|
|
if (numAmp <= 15)
|
|
if (numAmp <= 15)
|
|
{
|
|
{
|
|
@@ -762,25 +762,23 @@ void OscilloscopeData::parseEyeMapData(unsigned char* buffer, unsigned int size)
|
|
/* 计算最大值和最小值的中间数 */
|
|
/* 计算最大值和最小值的中间数 */
|
|
uint8_t vaMid = (vaMax + vaMin) / 2;
|
|
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;
|
|
std::vector<EyeDataT> vecData;
|
|
int numMulti = 0; /* 倍率,可能是1可能是30 */
|
|
int numMulti = 0; /* 倍率,可能是1可能是30 */
|
|
if (num7 >= 1.0)
|
|
if (num7 >= 1.0)
|
|
{
|
|
{
|
|
- /* 将数据放入到list中,带有bool标志位 */
|
|
|
|
|
|
+ /* 将数据放入到list中,带有bool标志位,全部启用 */
|
|
for (int i = 0; i < bufferSize; i++)
|
|
for (int i = 0; i < bufferSize; i++)
|
|
{
|
|
{
|
|
vecData.push_back(EyeDataT(true, array[i]));
|
|
vecData.push_back(EyeDataT(true, array[i]));
|
|
@@ -789,50 +787,59 @@ void OscilloscopeData::parseEyeMapData(unsigned char* buffer, unsigned int size)
|
|
}
|
|
}
|
|
else
|
|
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)
|
|
if (vecData.size() <= 0)
|
|
{
|
|
{
|
|
return;
|
|
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;
|
|
std::vector<int> listSub;
|
|
- num3 = vecData.size() - num9;
|
|
|
|
|
|
+ int numDataSize = vecData.size() - num9;
|
|
bool flag3 = true;
|
|
bool flag3 = true;
|
|
- /* 找到数组中的上升沿和下降沿,并记录其坐标 */
|
|
|
|
|
|
+ /* 找到数组中的上升沿和下降沿,并记录其坐标
|
|
|
|
+ * 这里寻找上升沿和下降沿是检测的中间值,是每个跳变沿的中部
|
|
|
|
+ * 中间值理论上是零值 */
|
|
uint8_t vaPre = 0;
|
|
uint8_t vaPre = 0;
|
|
// uint8_t va = 0;
|
|
// uint8_t va = 0;
|
|
uint8_t vaNext = 0;
|
|
uint8_t vaNext = 0;
|
|
- for (int i = 10; i < num3; i++)
|
|
|
|
|
|
+ for (int i = 10; i < numDataSize; i++)
|
|
{
|
|
{
|
|
/* 取出相邻的三个值 */
|
|
/* 取出相邻的三个值 */
|
|
vaPre = vecData[i - 1].value;
|
|
vaPre = vecData[i - 1].value;
|
|
@@ -840,7 +847,7 @@ void OscilloscopeData::parseEyeMapData(unsigned char* buffer, unsigned int size)
|
|
vaNext = vecData[i + 1].value;
|
|
vaNext = vecData[i + 1].value;
|
|
if (flag3)
|
|
if (flag3)
|
|
{
|
|
{
|
|
- /* 上升沿,b6 = b7,就是中间值 */
|
|
|
|
|
|
+ /* 上升沿,就是中间值 */
|
|
if (vaPre <= vaMid && vaNext > vaMid)
|
|
if (vaPre <= vaMid && vaNext > vaMid)
|
|
{
|
|
{
|
|
listSub.push_back(i); /* 记录下标 */
|
|
listSub.push_back(i); /* 记录下标 */
|
|
@@ -850,7 +857,7 @@ void OscilloscopeData::parseEyeMapData(unsigned char* buffer, unsigned int size)
|
|
/* 下降沿 */
|
|
/* 下降沿 */
|
|
else if (vaPre >= vaMid && vaNext < vaMid)
|
|
else if (vaPre >= vaMid && vaNext < vaMid)
|
|
{
|
|
{
|
|
- listSub.push_back(num2);
|
|
|
|
|
|
+ listSub.push_back(i);
|
|
flag3 = !flag3;
|
|
flag3 = !flag3;
|
|
}
|
|
}
|
|
/* 采集到600个上升沿和下降沿 */
|
|
/* 采集到600个上升沿和下降沿 */
|
|
@@ -863,90 +870,93 @@ void OscilloscopeData::parseEyeMapData(unsigned char* buffer, unsigned int size)
|
|
{
|
|
{
|
|
return;
|
|
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 num16 = 0;
|
|
int num17 = 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;
|
|
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();
|
|
listSub.clear();
|
|
vecData.clear();
|
|
vecData.clear();
|
|
- if (list2.size() <= 0)
|
|
|
|
|
|
+ if (vec2DEyeData.size() <= 0)
|
|
{
|
|
{
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
+ /* ======================================================================== */
|
|
int num18 = 0;
|
|
int num18 = 0;
|
|
- int num19 = 0;
|
|
|
|
float num20 = 0.0;
|
|
float num20 = 0.0;
|
|
/* 将数据拷贝到OscData的Matrix中 */
|
|
/* 将数据拷贝到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();
|
|
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();
|
|
g_eyeDataMatrix.mutexEyeData.unlock();
|
|
}
|
|
}
|
|
- // globleVariables.g_IeyeDataMatrix.eyeStatisticalWeight();
|
|
|
|
g_eyeDataMatrix.eyeStatisticalWeight();
|
|
g_eyeDataMatrix.eyeStatisticalWeight();
|
|
- // globleVariables.g_IeyeDataMatrix.eyeLessenTheBurden();
|
|
|
|
g_eyeDataMatrix.eyeLessenTheBurden();
|
|
g_eyeDataMatrix.eyeLessenTheBurden();
|
|
- list2.clear();
|
|
|
|
- // pEyeData[,] eyedata = globleVariables.g_IeyeDataMatrix.eyeZoomOut();
|
|
|
|
|
|
+ vec2DEyeData.clear();
|
|
auto eyeData = g_eyeDataMatrix.eyeZoomOut();
|
|
auto eyeData = g_eyeDataMatrix.eyeZoomOut();
|
|
- // GraphView.m_eyedMatrux.EyeDataMatrixCopy(eyedata);
|
|
|
|
|
|
+
|
|
g_eyeMapMatrix.mutexEyeData.lock();
|
|
g_eyeMapMatrix.mutexEyeData.lock();
|
|
g_eyeMapMatrix.copyDataMatrix(*eyeData);
|
|
g_eyeMapMatrix.copyDataMatrix(*eyeData);
|
|
g_eyeMapMatrix.mutexEyeData.unlock();
|
|
g_eyeMapMatrix.mutexEyeData.unlock();
|