123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661 |
- #include "OscData.h"
- #include <QApplication>
- #include "ThreadPool/ThreadPool.h"
- 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("获取 OscData logger 失败");
- return;
- }
- m_usbInterface = std::make_shared<USBInterface>();
- if(!m_usbInterface->loadLib(QApplication::applicationDirPath()))
- {
- return;
- }
- /* 分配缓冲区内存 */
- m_buffer = new unsigned char[BUFFER_SIZE];
- m_bufferChnA = new unsigned char[BUFFER_SIZE / 2];
- m_bufferChnB = new unsigned char[BUFFER_SIZE / 2];
- }
- /* 打开示波器 */
- bool OscilloscopeData::openOSC()
- {
- if(m_usbInterface == nullptr)
- {
- SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
- return false;
- }
- /* 指定示波器设备型号,OSCA02是6 */
- m_usbInterface->specifyDevId(6);
- auto ret = m_usbInterface->devOpen();
- if(ret != 0)
- {
- SPDLOG_LOGGER_ERROR(m_logger, "打开示波器失败!");
- return false;
- }
- /* 设置缓冲区大小 */
- m_usbInterface->setInfo(BUFFER_SIZE);
- /* 获取缓冲区首指针 */
- m_devBuffer = m_usbInterface->bufferWR(-1);
- if(m_devBuffer == nullptr)
- {
- SPDLOG_LOGGER_ERROR(m_logger, "获取缓冲区指针失败!");
- return false;
- }
- m_isOpen = true;
- return true;
- }
- /* 关闭示波器 */
- void OscilloscopeData::closeOSC()
- {
- if(m_runCapture)
- {
- stopCapture();
- }
- while (m_isRunCapture)
- {
- std::this_thread::sleep_for(std::chrono::milliseconds(5));
- }
- if(m_usbInterface != nullptr)
- {
- m_usbInterface->devClose();
- }
- m_isOpen = false;
- SPDLOG_INFO("示波器已关闭");
- }
- /* 开始采集数据 */
- bool OscilloscopeData::startCapture()
- {
- if(m_buffer == nullptr)
- {
- SPDLOG_LOGGER_ERROR(m_logger, "缓冲区指针为空!");
- return false;
- }
- /* 启动子线程 */
- m_runCapture = true;
- CPPTP.add_task(&OscilloscopeData::threadCaptureData, this);
- CPPTP.add_task(&OscilloscopeData::threadProcessData, this);
- return true;
- }
- /* 停止采集数据 */
- void OscilloscopeData::stopCapture()
- {
- m_runCapture = false;
- }
- /* 设置示波器的采样率 */
- void OscilloscopeData::setSampleRate(OscSampleRate rate)
- {
- if(m_usbInterface == nullptr)
- {
- SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
- return;
- }
- m_ctrlByte0 &= 0xf0;
- if(rate == OscSampleRate::SR_49KHZ)
- {
- m_ctrlByte0 |= 0x0e;
- }
- else if(rate == OscSampleRate::SR_96KHZ)
- {
- m_ctrlByte0 |= 0x04;
- }
- else if(rate == OscSampleRate::SR_781KHZ)
- {
- m_ctrlByte0 |= 0x0c;
- }
- else if(rate == OscSampleRate::SR_12_5MHZ)
- {
- m_ctrlByte0 |= 0x08;
- }
- else if(rate == OscSampleRate::SR_100MHZ)
- {
- m_ctrlByte0 |= 0x00;
- }
- else
- {
- SPDLOG_LOGGER_ERROR(m_logger, "采样率设置错误!");
- return;
- }
- m_usbInterface->usbCtrlTrans(0x94, m_ctrlByte0);
- }
- /**
- * @brief 将示波器两个通道合并为一个通道
- * 将AB两个通道的资源全部给A,B通道失效,A通道的采样率和带宽翻倍
- * @param merge 是否合并
- */
- void OscilloscopeData::setChannelMerge(bool merge)
- {
- if(m_usbInterface == nullptr)
- {
- SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
- return;
- }
- if(merge)
- {
- m_ctrlByte1 |= 0x80;
- }else {
- m_ctrlByte1 &= 0x7f;
- }
- 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 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)
- * 注意,这里是十进制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);
- /* 等待传输完成 */
- auto ret = m_usbInterface->eventCheck(100);
- if(ret == 0x555)
- {
- 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: {}", 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));
- }
- }
|