|
@@ -3,12 +3,32 @@
|
|
|
#include "ThreadPool/ThreadPool.h"
|
|
|
|
|
|
|
|
|
-OscData::OscData()
|
|
|
+OscilloscopeData::OscilloscopeData()
|
|
|
+{
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+OscilloscopeData::~OscilloscopeData()
|
|
|
+{
|
|
|
+ if(m_isOpen)
|
|
|
+ {
|
|
|
+ closeOSC();
|
|
|
+ }
|
|
|
+ if(m_buffer != nullptr)
|
|
|
+ {
|
|
|
+ delete[] m_buffer;
|
|
|
+ m_buffer = nullptr;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/* 初始化示波器 */
|
|
|
+void OscilloscopeData::initOsc()
|
|
|
{
|
|
|
m_logger = spdlog::get("OscData");
|
|
|
if(m_logger == nullptr)
|
|
|
{
|
|
|
- SPDLOG_ERROR("获取 OSC logger 失败");
|
|
|
+ SPDLOG_ERROR("获取 OscData logger 失败");
|
|
|
return;
|
|
|
}
|
|
|
m_usbInterface = std::make_shared<USBInterface>();
|
|
@@ -18,21 +38,18 @@ OscData::OscData()
|
|
|
}
|
|
|
/* 分配缓冲区内存 */
|
|
|
m_buffer = new unsigned char[BUFFER_SIZE];
|
|
|
+ m_bufferChnA = new unsigned char[BUFFER_SIZE / 2];
|
|
|
+ m_bufferChnB = new unsigned char[BUFFER_SIZE / 2];
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-OscData::~OscData()
|
|
|
+/* 打开示波器 */
|
|
|
+bool OscilloscopeData::openOSC()
|
|
|
{
|
|
|
- if(m_buffer != nullptr)
|
|
|
+ if(m_usbInterface == nullptr)
|
|
|
{
|
|
|
- delete[] m_buffer;
|
|
|
- m_buffer = nullptr;
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
|
|
|
+ return false;
|
|
|
}
|
|
|
-}
|
|
|
-
|
|
|
-/* 打开示波器 */
|
|
|
-bool OscData::openOSC()
|
|
|
-{
|
|
|
/* 指定示波器设备型号,OSCA02是6 */
|
|
|
m_usbInterface->specifyDevId(6);
|
|
|
auto ret = m_usbInterface->devOpen();
|
|
@@ -44,18 +61,18 @@ bool OscData::openOSC()
|
|
|
/* 设置缓冲区大小 */
|
|
|
m_usbInterface->setInfo(BUFFER_SIZE);
|
|
|
/* 获取缓冲区首指针 */
|
|
|
- m_buffer = m_usbInterface->bufferWR(-1);
|
|
|
- if(m_buffer == nullptr)
|
|
|
+ m_devBuffer = m_usbInterface->bufferWR(-1);
|
|
|
+ if(m_devBuffer == nullptr)
|
|
|
{
|
|
|
SPDLOG_LOGGER_ERROR(m_logger, "获取缓冲区指针失败!");
|
|
|
return false;
|
|
|
}
|
|
|
-
|
|
|
+ m_isOpen = true;
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
/* 关闭示波器 */
|
|
|
-void OscData::closeOSC()
|
|
|
+void OscilloscopeData::closeOSC()
|
|
|
{
|
|
|
if(m_runCapture)
|
|
|
{
|
|
@@ -69,10 +86,12 @@ void OscData::closeOSC()
|
|
|
{
|
|
|
m_usbInterface->devClose();
|
|
|
}
|
|
|
+ m_isOpen = false;
|
|
|
+ SPDLOG_INFO("示波器已关闭");
|
|
|
}
|
|
|
|
|
|
/* 开始采集数据 */
|
|
|
-bool OscData::startCapture()
|
|
|
+bool OscilloscopeData::startCapture()
|
|
|
{
|
|
|
if(m_buffer == nullptr)
|
|
|
{
|
|
@@ -81,18 +100,19 @@ bool OscData::startCapture()
|
|
|
}
|
|
|
/* 启动子线程 */
|
|
|
m_runCapture = true;
|
|
|
- CPPTP.add_task(&OscData::threadCaptureData, this);
|
|
|
+ CPPTP.add_task(&OscilloscopeData::threadCaptureData, this);
|
|
|
+ CPPTP.add_task(&OscilloscopeData::threadProcessData, this);
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
/* 停止采集数据 */
|
|
|
-void OscData::stopCapture()
|
|
|
+void OscilloscopeData::stopCapture()
|
|
|
{
|
|
|
m_runCapture = false;
|
|
|
}
|
|
|
|
|
|
/* 设置示波器的采样率 */
|
|
|
-void OscData::setSampleRate(OscSampleRate rate)
|
|
|
+void OscilloscopeData::setSampleRate(OscSampleRate rate)
|
|
|
{
|
|
|
if(m_usbInterface == nullptr)
|
|
|
{
|
|
@@ -133,7 +153,7 @@ void OscData::setSampleRate(OscSampleRate rate)
|
|
|
* 将AB两个通道的资源全部给A,B通道失效,A通道的采样率和带宽翻倍
|
|
|
* @param merge 是否合并
|
|
|
*/
|
|
|
-void OscData::setChannelMerge(bool merge)
|
|
|
+void OscilloscopeData::setChannelMerge(bool merge)
|
|
|
{
|
|
|
if(m_usbInterface == nullptr)
|
|
|
{
|
|
@@ -149,25 +169,448 @@ void OscData::setChannelMerge(bool merge)
|
|
|
m_usbInterface->usbCtrlTrans(0x24, m_ctrlByte1);
|
|
|
}
|
|
|
|
|
|
+/* 设置通道A输入量程 */
|
|
|
+void OscilloscopeData::setChannelARange(OscChannelRange range)
|
|
|
+{
|
|
|
+ if(m_usbInterface == nullptr)
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ m_ctrlByte1 &= 0xf7;
|
|
|
+ if(range == OscChannelRange::CR_100MV)
|
|
|
+ {
|
|
|
+ m_usbInterface->usbCtrlTrans(0x22, 0x06);
|
|
|
+ }
|
|
|
+ else if(range == OscChannelRange::CR_250MV)
|
|
|
+ {
|
|
|
+ m_usbInterface->usbCtrlTrans(0x22, 0x04);
|
|
|
+ }
|
|
|
+ else if(range == OscChannelRange::CR_500MV)
|
|
|
+ {
|
|
|
+ m_usbInterface->usbCtrlTrans(0x22, 0x02);
|
|
|
+ }
|
|
|
+ else if(range == OscChannelRange::CR_1V)
|
|
|
+ {
|
|
|
+ m_ctrlByte1 |= 0x08;
|
|
|
+ m_usbInterface->usbCtrlTrans(0x22, 0x06);
|
|
|
+ }
|
|
|
+ else if(range == OscChannelRange::CR_2V5)
|
|
|
+ {
|
|
|
+ m_ctrlByte1 |= 0x08;
|
|
|
+ m_usbInterface->usbCtrlTrans(0x22, 0x04);
|
|
|
+ }
|
|
|
+ else if(range == OscChannelRange::CR_5V)
|
|
|
+ {
|
|
|
+ m_ctrlByte1 |= 0x08;
|
|
|
+ m_usbInterface->usbCtrlTrans(0x22, 0x02);
|
|
|
+ }
|
|
|
+ else if(range == OscChannelRange::CR_8V)
|
|
|
+ {
|
|
|
+ m_ctrlByte1 |= 0x08;
|
|
|
+ m_usbInterface->usbCtrlTrans(0x22, 0x00);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "输入量程设置错误!");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ m_usbInterface->usbCtrlTrans(0x24, m_ctrlByte1);
|
|
|
+}
|
|
|
+
|
|
|
+/* 设置通道B输入量程 */
|
|
|
+void OscilloscopeData::setChannelBRange(OscChannelRange range)
|
|
|
+{
|
|
|
+ if(m_usbInterface == nullptr)
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ m_ctrlByte1 &= 0xf9;
|
|
|
+ if(range == OscChannelRange::CR_100MV)
|
|
|
+ {
|
|
|
+ m_ctrlByte1 |= 0x06;
|
|
|
+ m_usbInterface->usbCtrlTrans(0x23, 0x40);
|
|
|
+ }
|
|
|
+ else if(range == OscChannelRange::CR_250MV)
|
|
|
+ {
|
|
|
+ m_ctrlByte1 |= 0x04;
|
|
|
+ m_usbInterface->usbCtrlTrans(0x23, 0x40);
|
|
|
+ }
|
|
|
+ else if(range == OscChannelRange::CR_500MV)
|
|
|
+ {
|
|
|
+ m_ctrlByte1 |= 0x02;
|
|
|
+ m_usbInterface->usbCtrlTrans(0x23, 0x40);
|
|
|
+ }
|
|
|
+ else if(range == OscChannelRange::CR_1V)
|
|
|
+ {
|
|
|
+ m_ctrlByte1 |= 0x06;
|
|
|
+ m_usbInterface->usbCtrlTrans(0x23, 0x00);
|
|
|
+ }
|
|
|
+ else if(range == OscChannelRange::CR_2V5)
|
|
|
+ {
|
|
|
+ m_ctrlByte1 |= 0x04;
|
|
|
+ m_usbInterface->usbCtrlTrans(0x23, 0x00);
|
|
|
+ }
|
|
|
+ else if(range == OscChannelRange::CR_5V)
|
|
|
+ {
|
|
|
+ m_ctrlByte1 |= 0x02;
|
|
|
+ m_usbInterface->usbCtrlTrans(0x23, 0x00);
|
|
|
+ }
|
|
|
+ else if(range == OscChannelRange::CR_8V)
|
|
|
+ {
|
|
|
+ m_usbInterface->usbCtrlTrans(0x23, 0x00);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "输入量程设置错误!");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ m_usbInterface->usbCtrlTrans(0x24, m_ctrlByte1);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief 设置通道耦合方式
|
|
|
+ *
|
|
|
+ * @param channel 通道
|
|
|
+ * @param coupling 耦合方式,DC或者AC
|
|
|
+ */
|
|
|
+void OscilloscopeData::setChannelCoupling(OscChannel channel, OscChannelCoupling coupling)
|
|
|
+{
|
|
|
+ if(m_usbInterface == nullptr)
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if(channel == OscChannel::CH_A)
|
|
|
+ {
|
|
|
+ m_ctrlByte0 &= 0xef;
|
|
|
+ if(coupling == OscChannelCoupling::DC) {
|
|
|
+ m_ctrlByte0 |= 0x10;
|
|
|
+ }
|
|
|
+ else if(coupling == OscChannelCoupling::AC) {}
|
|
|
+ else {
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "耦合方式设置错误!");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ m_usbInterface->usbCtrlTrans(0x94, m_ctrlByte0);
|
|
|
+ }
|
|
|
+ else if(channel == OscChannel::CH_B)
|
|
|
+ {
|
|
|
+ m_ctrlByte1 &= 0xef;
|
|
|
+ if(coupling == OscChannelCoupling::AC) {
|
|
|
+ m_ctrlByte1 |= 0x10;
|
|
|
+ }
|
|
|
+ else if(coupling == OscChannelCoupling::DC) {}
|
|
|
+ else {
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "耦合方式设置错误!");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ m_usbInterface->usbCtrlTrans(0x24, m_ctrlByte1);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "通道设置错误!");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/* 开启或关闭通道A触发 */
|
|
|
+void OscilloscopeData::setChannelATrigger(bool enable)
|
|
|
+{
|
|
|
+ if(m_usbInterface == nullptr)
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if(enable)
|
|
|
+ {
|
|
|
+ m_usbInterface->usbCtrlTrans(0xE7, 0x01);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ m_usbInterface->usbCtrlTrans(0xE7, 0x00);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/* 开启外触发 */
|
|
|
+void OscilloscopeData::setExternalTrigger(bool enable)
|
|
|
+{
|
|
|
+ if(m_usbInterface == nullptr)
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if(enable)
|
|
|
+ {
|
|
|
+ m_usbInterface->usbCtrlTrans(0xE7, 0x01);
|
|
|
+ m_ctrlByte1 &= 0xdf;
|
|
|
+ m_ctrlByte1 |= 0x20;
|
|
|
+ m_usbInterface->usbCtrlTrans(0x24, m_ctrlByte1);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ m_usbInterface->usbCtrlTrans(0xE7, 0x00);
|
|
|
+ m_ctrlByte1 &= 0xdf;
|
|
|
+ m_usbInterface->usbCtrlTrans(0x24, m_ctrlByte1);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/* 设置触发方式 */
|
|
|
+void OscilloscopeData::setTriggerMode(OscTriggerMode mode)
|
|
|
+{
|
|
|
+ if(m_usbInterface == nullptr)
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if(mode == OscTriggerMode::TM_RISE)
|
|
|
+ {
|
|
|
+ m_usbInterface->usbCtrlTrans(0xC5, 0x00);
|
|
|
+ }
|
|
|
+ else if (mode == OscTriggerMode::TM_DOWN)
|
|
|
+ {
|
|
|
+ m_usbInterface->usbCtrlTrans(0xC5, 0x01);
|
|
|
+ }
|
|
|
+ else if (mode == OscTriggerMode::TM_DOUBLE)
|
|
|
+ {
|
|
|
+ m_usbInterface->usbCtrlTrans(0xC5, 0x03);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief 设置触发电平
|
|
|
+ *
|
|
|
+ * @param level 0~255的值
|
|
|
+ */
|
|
|
+void OscilloscopeData::setTriggerLevel(unsigned char level)
|
|
|
+{
|
|
|
+ if(m_usbInterface == nullptr)
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ m_usbInterface->usbCtrlTrans(0x16, level);
|
|
|
+}
|
|
|
+
|
|
|
+/* 设置触发灵敏度 */
|
|
|
+void OscilloscopeData::setTriggerSensitivity(OscTriggerSensitivity sensitivity)
|
|
|
+{
|
|
|
+ if(m_usbInterface == nullptr)
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if(sensitivity == OscTriggerSensitivity::TS_LOW)
|
|
|
+ {
|
|
|
+ m_usbInterface->usbCtrlTrans(0x2b, 0);
|
|
|
+ }
|
|
|
+ else if(sensitivity == OscTriggerSensitivity::TS_HIGH)
|
|
|
+ {
|
|
|
+ m_usbInterface->usbCtrlTrans(0x2b, 1);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "触发灵敏度设置错误!");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/* 设置触发在缓冲区的哪个位置 */
|
|
|
+void OscilloscopeData::setTriggerPosition(unsigned char lowByte, unsigned char highByte)
|
|
|
+{
|
|
|
+ if(m_usbInterface == nullptr)
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ m_usbInterface->usbCtrlTrans(0x18, lowByte);
|
|
|
+ m_usbInterface->usbCtrlTrans(0x17, highByte);
|
|
|
+}
|
|
|
+
|
|
|
+/* 获取示波器不同档位下的零电压值 */
|
|
|
+void OscilloscopeData::getZeroVoltage()
|
|
|
+{
|
|
|
+ if(m_usbInterface == nullptr)
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ /* 获取通道A零电压值 */
|
|
|
+ unsigned char zeroVoltage = 0;
|
|
|
+ /* 2V档位,正负8V量程 */
|
|
|
+ zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x82);
|
|
|
+ m_mapChAZeroVoltage.insert(OscChannelRange::CR_8V, zeroVoltage);
|
|
|
+ /* 1V档位,正负5V量程 */
|
|
|
+ zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x01);
|
|
|
+ m_mapChAZeroVoltage.insert(OscChannelRange::CR_5V, zeroVoltage);
|
|
|
+ /* 500mV档位,正负2.5V量程 */
|
|
|
+ zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x0e);
|
|
|
+ m_mapChAZeroVoltage.insert(OscChannelRange::CR_2V5, zeroVoltage);
|
|
|
+ /* 200mV档位,正负1V量程 */
|
|
|
+ zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x14);
|
|
|
+ m_mapChAZeroVoltage.insert(OscChannelRange::CR_1V, zeroVoltage);
|
|
|
+ /* 100mV档位,正负500mV量程 */
|
|
|
+ zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x12);
|
|
|
+ m_mapChAZeroVoltage.insert(OscChannelRange::CR_500MV, zeroVoltage);
|
|
|
+ /* 50mV档位,正负250mV量程 */
|
|
|
+ zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x10);
|
|
|
+ m_mapChAZeroVoltage.insert(OscChannelRange::CR_250MV, zeroVoltage);
|
|
|
+ /* 20mV档位,正负100mV量程 */
|
|
|
+ zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0xa0);
|
|
|
+ m_mapChAZeroVoltage.insert(OscChannelRange::CR_100MV, zeroVoltage);
|
|
|
+
|
|
|
+ /* 获取通道B零电压值 */
|
|
|
+ /* 2V档位,正负8V量程 */
|
|
|
+ zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x72);
|
|
|
+ m_mapChBZeroVoltage.insert(OscChannelRange::CR_8V, zeroVoltage);
|
|
|
+ /* 1V档位,正负5V量程 */
|
|
|
+ zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x02);
|
|
|
+ m_mapChBZeroVoltage.insert(OscChannelRange::CR_5V, zeroVoltage);
|
|
|
+ /* 500mV档位,正负2.5V量程 */
|
|
|
+ zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x0f);
|
|
|
+ m_mapChBZeroVoltage.insert(OscChannelRange::CR_2V5, zeroVoltage);
|
|
|
+ /* 200mV档位,正负1V量程 */
|
|
|
+ zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x15);
|
|
|
+ m_mapChBZeroVoltage.insert(OscChannelRange::CR_1V, zeroVoltage);
|
|
|
+ /* 100mV档位,正负500mV量程 */
|
|
|
+ zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x13);
|
|
|
+ m_mapChBZeroVoltage.insert(OscChannelRange::CR_500MV, zeroVoltage);
|
|
|
+ /* 50mV档位,正负250mV量程 */
|
|
|
+ zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x11);
|
|
|
+ m_mapChBZeroVoltage.insert(OscChannelRange::CR_250MV, zeroVoltage);
|
|
|
+ /* 20mV档位,正负100mV量程 */
|
|
|
+ zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0xa1);
|
|
|
+ m_mapChBZeroVoltage.insert(OscChannelRange::CR_100MV, zeroVoltage);
|
|
|
+}
|
|
|
+
|
|
|
+/* 打印出零电压值 */
|
|
|
+void OscilloscopeData::printZeroVoltage(OscChannel channel)
|
|
|
+{
|
|
|
+ if(channel == OscChannel::CH_A)
|
|
|
+ {
|
|
|
+ for(auto it = m_mapChAZeroVoltage.begin(); it != m_mapChAZeroVoltage.end(); ++it)
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "通道A {} 量程下的零电压值为: {}", static_cast<int>(it.key()), it.value());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(channel == OscChannel::CH_B)
|
|
|
+ {
|
|
|
+ for(auto it = m_mapChBZeroVoltage.begin(); it != m_mapChBZeroVoltage.end(); ++it)
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "通道B {} 量程下的零电压值为: {}", static_cast<int>(it.key()), it.value());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "通道设置错误!");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/* 获取不同档位下电压校准系数 */
|
|
|
+void OscilloscopeData::getVoltageCalibration()
|
|
|
+{
|
|
|
+ if (m_usbInterface == nullptr)
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ /* 获取通道A电压校准系数 */
|
|
|
+ unsigned char voltageCalibration = 0;
|
|
|
+ /* 2V档位,正负8V量程 */
|
|
|
+ voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0xc2);
|
|
|
+ m_mapChAVoltageCalibration.insert(OscChannelRange::CR_8V, voltageCalibration);
|
|
|
+ /* 1V档位,正负5V量程 */
|
|
|
+ voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x03);
|
|
|
+ m_mapChAVoltageCalibration.insert(OscChannelRange::CR_5V, voltageCalibration);
|
|
|
+ /* 500mV档位,正负2.5V量程 */
|
|
|
+ voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x08);
|
|
|
+ m_mapChAVoltageCalibration.insert(OscChannelRange::CR_2V5, voltageCalibration);
|
|
|
+ /* 200mV档位,正负1V量程 */
|
|
|
+ voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x06);
|
|
|
+ m_mapChAVoltageCalibration.insert(OscChannelRange::CR_1V, voltageCalibration);
|
|
|
+ /* 100mV档位,正负500mV量程 */
|
|
|
+ voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x09);
|
|
|
+ m_mapChAVoltageCalibration.insert(OscChannelRange::CR_500MV, voltageCalibration);
|
|
|
+ /* 50mV档位,正负250mV量程 */
|
|
|
+ voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x0a);
|
|
|
+ m_mapChAVoltageCalibration.insert(OscChannelRange::CR_250MV, voltageCalibration);
|
|
|
+ /* 20mV档位,正负100mV量程 */
|
|
|
+ voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x2a);
|
|
|
+ m_mapChAVoltageCalibration.insert(OscChannelRange::CR_100MV, voltageCalibration);
|
|
|
+
|
|
|
+ /* 获取通道B电压校准系数 */
|
|
|
+ /* 2V档位,正负8V量程 */
|
|
|
+ voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0xd2);
|
|
|
+ m_mapChBVoltageCalibration.insert(OscChannelRange::CR_8V, voltageCalibration);
|
|
|
+ /* 1V档位,正负5V量程 */
|
|
|
+ voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x04);
|
|
|
+ m_mapChBVoltageCalibration.insert(OscChannelRange::CR_5V, voltageCalibration);
|
|
|
+ /* 500mV档位,正负2.5V量程 */
|
|
|
+ voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x0b);
|
|
|
+ m_mapChBVoltageCalibration.insert(OscChannelRange::CR_2V5, voltageCalibration);
|
|
|
+ /* 200mV档位,正负1V量程 */
|
|
|
+ voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x07);
|
|
|
+ m_mapChBVoltageCalibration.insert(OscChannelRange::CR_1V, voltageCalibration);
|
|
|
+ /* 100mV档位,正负500mV量程 */
|
|
|
+ voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x0c);
|
|
|
+ m_mapChBVoltageCalibration.insert(OscChannelRange::CR_500MV, voltageCalibration);
|
|
|
+ /* 50mV档位,正负250mV量程 */
|
|
|
+ voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x0d);
|
|
|
+ m_mapChBVoltageCalibration.insert(OscChannelRange::CR_250MV, voltageCalibration);
|
|
|
+ /* 20mV档位,正负100mV量程 */
|
|
|
+ voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x2d);
|
|
|
+ m_mapChBVoltageCalibration.insert(OscChannelRange::CR_100MV, voltageCalibration);
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/* 打印出电压校准系数 */
|
|
|
+void OscilloscopeData::printVoltageCalibration(OscChannel channel)
|
|
|
+{
|
|
|
+ if(channel == OscChannel::CH_A)
|
|
|
+ {
|
|
|
+ for(auto it = m_mapChAVoltageCalibration.begin(); it != m_mapChAVoltageCalibration.end(); ++it)
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "通道A {} 量程下的电压校准系数为: {}", static_cast<int>(it.key()), it.value());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(channel == OscChannel::CH_B)
|
|
|
+ {
|
|
|
+ for(auto it = m_mapChBVoltageCalibration.begin(); it != m_mapChBVoltageCalibration.end(); ++it)
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "通道B {} 量程下的电压校准系数为: {}", static_cast<int>(it.key()), it.value());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "通道设置错误!");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
/**
|
|
|
* @brief 采集数据,这个是子线程
|
|
|
*
|
|
|
*/
|
|
|
-void OscData::threadCaptureData()
|
|
|
+void OscilloscopeData::threadCaptureData()
|
|
|
{
|
|
|
SPDLOG_LOGGER_INFO(m_logger, "开始采集数据线程");
|
|
|
m_isRunCapture = true;
|
|
|
uint64_t count = 0;
|
|
|
+ // unsigned char* buffer = nullptr;
|
|
|
while(m_runCapture)
|
|
|
{
|
|
|
+ // SPDLOG_LOGGER_DEBUG(m_logger, "开始采集数据");
|
|
|
/* 开始采集数据 */
|
|
|
m_usbInterface->usbCtrlTransSimple(0x33);
|
|
|
- /* 查询数据是否采集完成(应该是填充满128KB的SRAM) */
|
|
|
- while(m_usbInterface->usbCtrlTransSimple(0x50) != 0x33)
|
|
|
+ /* 查询数据是否采集完成(应该是填充满128KB的SRAM)
|
|
|
+ * 注意,这里是十进制33,不是0x33 */
|
|
|
+ while(m_usbInterface->usbCtrlTransSimple(0x50) != 33)
|
|
|
{
|
|
|
std::this_thread::sleep_for(std::chrono::microseconds(10));
|
|
|
}
|
|
|
+ // SPDLOG_LOGGER_DEBUG(m_logger, "硬件缓冲区已满");
|
|
|
/* 将数据从示波器的SRAM中拷贝到电脑内存中,1次传输完成,设置超时时间1ms */
|
|
|
m_usbInterface->readBulkData(BUFFER_SIZE, 1, 1, m_devBuffer);
|
|
|
/* 等待传输完成 */
|
|
@@ -177,13 +620,42 @@ void OscData::threadCaptureData()
|
|
|
SPDLOG_LOGGER_ERROR(m_logger, "数据传输超时!");
|
|
|
continue;
|
|
|
}
|
|
|
+ // SPDLOG_LOGGER_DEBUG(m_logger, "数据通过USB传输完成");
|
|
|
/* 取出数据 */
|
|
|
+ // buffer = m_ringQueue.back();
|
|
|
+ m_mutexCaptureData.lock();
|
|
|
std::memcpy(m_buffer, m_devBuffer, BUFFER_SIZE);
|
|
|
+ m_isCaptureData = true;
|
|
|
+ m_mutexCaptureData.unlock();
|
|
|
/* 清空缓冲区 */
|
|
|
m_usbInterface->resetPipe();
|
|
|
- SPDLOG_LOGGER_DEBUG(m_logger, "第 {} 次采集数据完成", count++);
|
|
|
+ // SPDLOG_LOGGER_DEBUG(m_logger, "count: {}", count++);
|
|
|
}
|
|
|
m_isRunCapture = false;
|
|
|
}
|
|
|
|
|
|
+/* 处理数据线程 */
|
|
|
+void OscilloscopeData::threadProcessData()
|
|
|
+{
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "开始处理数据线程");
|
|
|
+ while(m_runCapture)
|
|
|
+ {
|
|
|
+ if(m_isCaptureData.load())
|
|
|
+ {
|
|
|
+ m_mutexCaptureData.lock();
|
|
|
+ /* 分离通道AB的数据 */
|
|
|
+ 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_isCaptureData = false;
|
|
|
+ m_mutexCaptureData.unlock();
|
|
|
+ /* 处理数据 */
|
|
|
+ SPDLOG_LOGGER_DEBUG(m_logger, "开始处理数据,通道A数据: {}, 通道B数据: {}", m_bufferChnA[50], m_bufferChnB[50]);
|
|
|
+ }
|
|
|
+ std::this_thread::sleep_for(std::chrono::microseconds(10));
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
|