|
@@ -1,6 +1,7 @@
|
|
|
#include "OneOscData.h"
|
|
|
#include <QApplication>
|
|
|
#include <QRandomGenerator>
|
|
|
+#include <chrono>
|
|
|
|
|
|
#include "ThreadPool/ThreadPool.h"
|
|
|
|
|
@@ -82,6 +83,9 @@ void OneOscilloscopeData::initOSC(int oscNum)
|
|
|
m_buffer = new unsigned char[BUFFER_SIZE];
|
|
|
m_bufferChnA = new unsigned char[BUFFER_SIZE / 2];
|
|
|
m_bufferChnB = new unsigned char[BUFFER_SIZE / 2];
|
|
|
+
|
|
|
+ /* 设置默认的初始化参数 */
|
|
|
+ m_oneTimeGrid = 200;
|
|
|
}
|
|
|
|
|
|
/* 打开示波器 */
|
|
@@ -157,6 +161,12 @@ bool OneOscilloscopeData::startCapture()
|
|
|
SPDLOG_LOGGER_ERROR(m_logger, "缓冲区指针为空!");
|
|
|
return false;
|
|
|
}
|
|
|
+ /* 判断示波器是否已经打开成功 */
|
|
|
+ if(!m_isOpen)
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "示波器{}未打开!", m_oscNum);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
/* 启动子线程 */
|
|
|
m_runCapture = true;
|
|
|
CPPTP.add_task(&OneOscilloscopeData::threadCaptureData, this);
|
|
@@ -176,9 +186,9 @@ void OneOscilloscopeData::stopCapture()
|
|
|
m_runCapture = false;
|
|
|
while (m_isRunCapture)
|
|
|
{
|
|
|
- std::this_thread::sleep_for(std::chrono::milliseconds(5));
|
|
|
+ std::this_thread::sleep_for(std::chrono::milliseconds(1));
|
|
|
}
|
|
|
- SPDLOG_LOGGER_INFO(m_logger, "停止采集数据");
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "示波器{}已停止采集数据", m_oscNum);
|
|
|
}
|
|
|
|
|
|
/* 设置示波器的采样率 */
|
|
@@ -193,27 +203,27 @@ void OneOscilloscopeData::setSampleRate(OscSampleRate rate)
|
|
|
if(rate == OscSampleRate::SR_49KHZ)
|
|
|
{
|
|
|
m_ctrlByte0 |= 0x0e;
|
|
|
- OscParams.SampleIntervalTime = 20408.16;
|
|
|
+ m_SampleIntervalTime.store(20408.16);
|
|
|
}
|
|
|
else if(rate == OscSampleRate::SR_96KHZ)
|
|
|
{
|
|
|
m_ctrlByte0 |= 0x04;
|
|
|
- OscParams.SampleIntervalTime = 10416.67;
|
|
|
+ m_SampleIntervalTime.store(10416.67);
|
|
|
}
|
|
|
else if(rate == OscSampleRate::SR_781KHZ)
|
|
|
{
|
|
|
m_ctrlByte0 |= 0x0c;
|
|
|
- OscParams.SampleIntervalTime = 1280.0;
|
|
|
+ m_SampleIntervalTime.store(1280.0);
|
|
|
}
|
|
|
else if(rate == OscSampleRate::SR_12_5MHZ)
|
|
|
{
|
|
|
m_ctrlByte0 |= 0x08;
|
|
|
- OscParams.SampleIntervalTime = 80.0;
|
|
|
+ m_SampleIntervalTime.store(80.0);
|
|
|
}
|
|
|
else if(rate == OscSampleRate::SR_100MHZ)
|
|
|
{
|
|
|
m_ctrlByte0 |= 0x00;
|
|
|
- OscParams.SampleIntervalTime = 10;
|
|
|
+ m_SampleIntervalTime.store(10);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -511,6 +521,14 @@ void OneOscilloscopeData::setTriggerPosition(unsigned char lowByte, unsigned cha
|
|
|
m_usbInterface->usbCtrlTrans(0x17, highByte);
|
|
|
}
|
|
|
|
|
|
+/* 设置时间刻度 */
|
|
|
+void OneOscilloscopeData::setTimeGridValue(OscTimeGridValue value)
|
|
|
+{
|
|
|
+ m_oneTimeGrid = static_cast<int>(value);
|
|
|
+ /* 修改时间刻度理论上需要清空已有的缓存 */
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
/* 获取示波器不同档位下的零电压值 */
|
|
|
void OneOscilloscopeData::getZeroVoltage()
|
|
|
{
|
|
@@ -680,6 +698,8 @@ void OneOscilloscopeData::threadCaptureData()
|
|
|
{
|
|
|
SPDLOG_LOGGER_INFO(m_logger, "开始采集数据线程");
|
|
|
m_isRunCapture = true;
|
|
|
+ /* 这个记录等待数据的时间间隔,超过一定时间就认为设备离线了 */
|
|
|
+ std::chrono::steady_clock::time_point timePoint = std::chrono::steady_clock::now();
|
|
|
// unsigned char* buffer = nullptr;
|
|
|
while(m_runCapture)
|
|
|
{
|
|
@@ -693,9 +713,18 @@ void OneOscilloscopeData::threadCaptureData()
|
|
|
}
|
|
|
/* 查询数据是否采集完成(应该是填充满128KB的SRAM)
|
|
|
* 注意,这里是十进制33,不是0x33 */
|
|
|
+ timePoint = std::chrono::steady_clock::now();
|
|
|
while(m_usbInterface->usbCtrlTransSimple(0x50) != 33)
|
|
|
{
|
|
|
std::this_thread::sleep_for(std::chrono::microseconds(10));
|
|
|
+ /* 如果超过1s还没有数据,就认为设备离线了 */
|
|
|
+ if(std::chrono::duration_cast<std::chrono::seconds>(std::chrono::steady_clock::now() - timePoint).count() > 1)
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "示波器{}离线!", m_oscNum);
|
|
|
+ m_isConnected.store(false);
|
|
|
+ m_isRunCapture = false;
|
|
|
+ return;
|
|
|
+ }
|
|
|
}
|
|
|
// SPDLOG_LOGGER_DEBUG(m_logger, "硬件缓冲区已满");
|
|
|
/* 将数据从示波器的SRAM中拷贝到电脑内存中,1次传输完成,设置超时时间1ms */
|
|
@@ -804,7 +833,7 @@ void OneOscilloscopeData::threadProcessData_B()
|
|
|
* x轴时间是1000分度,当x轴整体时间是10us的时候,采样点和分辨率一一对应
|
|
|
* x轴时间大于10us,采样点比分辨率高,无需做什么操作
|
|
|
* x轴时间小于10us,采样点数量会小于1000,那么绘制的矩形小点间隔会比较长,这时候就需要进行插帧
|
|
|
- * 2、屏幕中显示多少波形和波形的频率及时间屏幕可以现实的时间长度有关,波形的频率未知,所以这里只能通过调整时间长度来调整波形
|
|
|
+ * 2、屏幕中显示多少波形和波形的频率及时间屏幕可以显示的时间长度有关,波形的频率未知,所以这里只能通过调整时间长度来调整波形
|
|
|
* 在屏幕中显示的数目
|
|
|
* 3、当时间长度变小,小到整个屏幕的采样点数目不足1000的时候,就需要进行插值,插值到1000附近
|
|
|
*
|
|
@@ -864,23 +893,16 @@ void OneOscilloscopeData::parseEyeMapData(OscChannel chn, unsigned char* buffer,
|
|
|
|
|
|
/* ======================================================================== */
|
|
|
/* 将采样点添加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++;
|
|
|
- // }
|
|
|
|
|
|
/* 采样率为100MHz的时候,采样点间隔时间是10ns
|
|
|
* x轴时间是1000分度,当x轴整体时间是10us的时候,采样点和分辨率一一对应
|
|
|
* x轴时间大于10us,采样点比分辨率高,无需做什么操作
|
|
|
* x轴时间小于10us,采样点数量会小于1000,那么绘制的矩形小点间隔会比较长,这时候就需要进行插帧 */
|
|
|
/* 一个时间格子的采样率个数 */
|
|
|
- int oneGridSa = OscParams.oneGridTime / OscParams.SampleIntervalTime; /* 当前一个格子中采样点的数目 */
|
|
|
+ int oneGridSa = m_oneTimeGrid / m_SampleIntervalTime; /* 当前一个格子中采样点的数目 */
|
|
|
int saTotal = oneGridSa * 10; /* 一个时间格子中采样点的总数 */
|
|
|
- bool isNeedFrameInsertion = ( saTotal < OscParams.eyeMapWidth ) ? true : false;
|
|
|
+ /* 采样点个数小于颜色矩阵x方向的个数,就进行插帧 */
|
|
|
+ bool isNeedFrameInsertion = ( saTotal < g_HorPixel ) ? true : false;
|
|
|
|
|
|
int num9 = (int)((double)oneGridSa * 0.25); /* 1/4个时间格子长度 */
|
|
|
/* 记录buffer的值,并添加bool */
|