OscData.cpp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661
  1. #include "OscData.h"
  2. #include <QApplication>
  3. #include "ThreadPool/ThreadPool.h"
  4. OscilloscopeData::OscilloscopeData()
  5. {
  6. }
  7. OscilloscopeData::~OscilloscopeData()
  8. {
  9. if(m_isOpen)
  10. {
  11. closeOSC();
  12. }
  13. if(m_buffer != nullptr)
  14. {
  15. delete[] m_buffer;
  16. m_buffer = nullptr;
  17. }
  18. }
  19. /* 初始化示波器 */
  20. void OscilloscopeData::initOsc()
  21. {
  22. m_logger = spdlog::get("OscData");
  23. if(m_logger == nullptr)
  24. {
  25. SPDLOG_ERROR("获取 OscData logger 失败");
  26. return;
  27. }
  28. m_usbInterface = std::make_shared<USBInterface>();
  29. if(!m_usbInterface->loadLib(QApplication::applicationDirPath()))
  30. {
  31. return;
  32. }
  33. /* 分配缓冲区内存 */
  34. m_buffer = new unsigned char[BUFFER_SIZE];
  35. m_bufferChnA = new unsigned char[BUFFER_SIZE / 2];
  36. m_bufferChnB = new unsigned char[BUFFER_SIZE / 2];
  37. }
  38. /* 打开示波器 */
  39. bool OscilloscopeData::openOSC()
  40. {
  41. if(m_usbInterface == nullptr)
  42. {
  43. SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
  44. return false;
  45. }
  46. /* 指定示波器设备型号,OSCA02是6 */
  47. m_usbInterface->specifyDevId(6);
  48. auto ret = m_usbInterface->devOpen();
  49. if(ret != 0)
  50. {
  51. SPDLOG_LOGGER_ERROR(m_logger, "打开示波器失败!");
  52. return false;
  53. }
  54. /* 设置缓冲区大小 */
  55. m_usbInterface->setInfo(BUFFER_SIZE);
  56. /* 获取缓冲区首指针 */
  57. m_devBuffer = m_usbInterface->bufferWR(-1);
  58. if(m_devBuffer == nullptr)
  59. {
  60. SPDLOG_LOGGER_ERROR(m_logger, "获取缓冲区指针失败!");
  61. return false;
  62. }
  63. m_isOpen = true;
  64. return true;
  65. }
  66. /* 关闭示波器 */
  67. void OscilloscopeData::closeOSC()
  68. {
  69. if(m_runCapture)
  70. {
  71. stopCapture();
  72. }
  73. while (m_isRunCapture)
  74. {
  75. std::this_thread::sleep_for(std::chrono::milliseconds(5));
  76. }
  77. if(m_usbInterface != nullptr)
  78. {
  79. m_usbInterface->devClose();
  80. }
  81. m_isOpen = false;
  82. SPDLOG_INFO("示波器已关闭");
  83. }
  84. /* 开始采集数据 */
  85. bool OscilloscopeData::startCapture()
  86. {
  87. if(m_buffer == nullptr)
  88. {
  89. SPDLOG_LOGGER_ERROR(m_logger, "缓冲区指针为空!");
  90. return false;
  91. }
  92. /* 启动子线程 */
  93. m_runCapture = true;
  94. CPPTP.add_task(&OscilloscopeData::threadCaptureData, this);
  95. CPPTP.add_task(&OscilloscopeData::threadProcessData, this);
  96. return true;
  97. }
  98. /* 停止采集数据 */
  99. void OscilloscopeData::stopCapture()
  100. {
  101. m_runCapture = false;
  102. }
  103. /* 设置示波器的采样率 */
  104. void OscilloscopeData::setSampleRate(OscSampleRate rate)
  105. {
  106. if(m_usbInterface == nullptr)
  107. {
  108. SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
  109. return;
  110. }
  111. m_ctrlByte0 &= 0xf0;
  112. if(rate == OscSampleRate::SR_49KHZ)
  113. {
  114. m_ctrlByte0 |= 0x0e;
  115. }
  116. else if(rate == OscSampleRate::SR_96KHZ)
  117. {
  118. m_ctrlByte0 |= 0x04;
  119. }
  120. else if(rate == OscSampleRate::SR_781KHZ)
  121. {
  122. m_ctrlByte0 |= 0x0c;
  123. }
  124. else if(rate == OscSampleRate::SR_12_5MHZ)
  125. {
  126. m_ctrlByte0 |= 0x08;
  127. }
  128. else if(rate == OscSampleRate::SR_100MHZ)
  129. {
  130. m_ctrlByte0 |= 0x00;
  131. }
  132. else
  133. {
  134. SPDLOG_LOGGER_ERROR(m_logger, "采样率设置错误!");
  135. return;
  136. }
  137. m_usbInterface->usbCtrlTrans(0x94, m_ctrlByte0);
  138. }
  139. /**
  140. * @brief 将示波器两个通道合并为一个通道
  141. * 将AB两个通道的资源全部给A,B通道失效,A通道的采样率和带宽翻倍
  142. * @param merge 是否合并
  143. */
  144. void OscilloscopeData::setChannelMerge(bool merge)
  145. {
  146. if(m_usbInterface == nullptr)
  147. {
  148. SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
  149. return;
  150. }
  151. if(merge)
  152. {
  153. m_ctrlByte1 |= 0x80;
  154. }else {
  155. m_ctrlByte1 &= 0x7f;
  156. }
  157. m_usbInterface->usbCtrlTrans(0x24, m_ctrlByte1);
  158. }
  159. /* 设置通道A输入量程 */
  160. void OscilloscopeData::setChannelARange(OscChannelRange range)
  161. {
  162. if(m_usbInterface == nullptr)
  163. {
  164. SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
  165. return;
  166. }
  167. m_ctrlByte1 &= 0xf7;
  168. if(range == OscChannelRange::CR_100MV)
  169. {
  170. m_usbInterface->usbCtrlTrans(0x22, 0x06);
  171. }
  172. else if(range == OscChannelRange::CR_250MV)
  173. {
  174. m_usbInterface->usbCtrlTrans(0x22, 0x04);
  175. }
  176. else if(range == OscChannelRange::CR_500MV)
  177. {
  178. m_usbInterface->usbCtrlTrans(0x22, 0x02);
  179. }
  180. else if(range == OscChannelRange::CR_1V)
  181. {
  182. m_ctrlByte1 |= 0x08;
  183. m_usbInterface->usbCtrlTrans(0x22, 0x06);
  184. }
  185. else if(range == OscChannelRange::CR_2V5)
  186. {
  187. m_ctrlByte1 |= 0x08;
  188. m_usbInterface->usbCtrlTrans(0x22, 0x04);
  189. }
  190. else if(range == OscChannelRange::CR_5V)
  191. {
  192. m_ctrlByte1 |= 0x08;
  193. m_usbInterface->usbCtrlTrans(0x22, 0x02);
  194. }
  195. else if(range == OscChannelRange::CR_8V)
  196. {
  197. m_ctrlByte1 |= 0x08;
  198. m_usbInterface->usbCtrlTrans(0x22, 0x00);
  199. }
  200. else
  201. {
  202. SPDLOG_LOGGER_ERROR(m_logger, "输入量程设置错误!");
  203. return;
  204. }
  205. m_usbInterface->usbCtrlTrans(0x24, m_ctrlByte1);
  206. }
  207. /* 设置通道B输入量程 */
  208. void OscilloscopeData::setChannelBRange(OscChannelRange range)
  209. {
  210. if(m_usbInterface == nullptr)
  211. {
  212. SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
  213. return;
  214. }
  215. m_ctrlByte1 &= 0xf9;
  216. if(range == OscChannelRange::CR_100MV)
  217. {
  218. m_ctrlByte1 |= 0x06;
  219. m_usbInterface->usbCtrlTrans(0x23, 0x40);
  220. }
  221. else if(range == OscChannelRange::CR_250MV)
  222. {
  223. m_ctrlByte1 |= 0x04;
  224. m_usbInterface->usbCtrlTrans(0x23, 0x40);
  225. }
  226. else if(range == OscChannelRange::CR_500MV)
  227. {
  228. m_ctrlByte1 |= 0x02;
  229. m_usbInterface->usbCtrlTrans(0x23, 0x40);
  230. }
  231. else if(range == OscChannelRange::CR_1V)
  232. {
  233. m_ctrlByte1 |= 0x06;
  234. m_usbInterface->usbCtrlTrans(0x23, 0x00);
  235. }
  236. else if(range == OscChannelRange::CR_2V5)
  237. {
  238. m_ctrlByte1 |= 0x04;
  239. m_usbInterface->usbCtrlTrans(0x23, 0x00);
  240. }
  241. else if(range == OscChannelRange::CR_5V)
  242. {
  243. m_ctrlByte1 |= 0x02;
  244. m_usbInterface->usbCtrlTrans(0x23, 0x00);
  245. }
  246. else if(range == OscChannelRange::CR_8V)
  247. {
  248. m_usbInterface->usbCtrlTrans(0x23, 0x00);
  249. }
  250. else
  251. {
  252. SPDLOG_LOGGER_ERROR(m_logger, "输入量程设置错误!");
  253. return;
  254. }
  255. m_usbInterface->usbCtrlTrans(0x24, m_ctrlByte1);
  256. }
  257. /**
  258. * @brief 设置通道耦合方式
  259. *
  260. * @param channel 通道
  261. * @param coupling 耦合方式,DC或者AC
  262. */
  263. void OscilloscopeData::setChannelCoupling(OscChannel channel, OscChannelCoupling coupling)
  264. {
  265. if(m_usbInterface == nullptr)
  266. {
  267. SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
  268. return;
  269. }
  270. if(channel == OscChannel::CH_A)
  271. {
  272. m_ctrlByte0 &= 0xef;
  273. if(coupling == OscChannelCoupling::DC) {
  274. m_ctrlByte0 |= 0x10;
  275. }
  276. else if(coupling == OscChannelCoupling::AC) {}
  277. else {
  278. SPDLOG_LOGGER_ERROR(m_logger, "耦合方式设置错误!");
  279. return;
  280. }
  281. m_usbInterface->usbCtrlTrans(0x94, m_ctrlByte0);
  282. }
  283. else if(channel == OscChannel::CH_B)
  284. {
  285. m_ctrlByte1 &= 0xef;
  286. if(coupling == OscChannelCoupling::AC) {
  287. m_ctrlByte1 |= 0x10;
  288. }
  289. else if(coupling == OscChannelCoupling::DC) {}
  290. else {
  291. SPDLOG_LOGGER_ERROR(m_logger, "耦合方式设置错误!");
  292. return;
  293. }
  294. m_usbInterface->usbCtrlTrans(0x24, m_ctrlByte1);
  295. }
  296. else
  297. {
  298. SPDLOG_LOGGER_ERROR(m_logger, "通道设置错误!");
  299. return;
  300. }
  301. }
  302. /* 开启或关闭通道A触发 */
  303. void OscilloscopeData::setChannelATrigger(bool enable)
  304. {
  305. if(m_usbInterface == nullptr)
  306. {
  307. SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
  308. return;
  309. }
  310. if(enable)
  311. {
  312. m_usbInterface->usbCtrlTrans(0xE7, 0x01);
  313. }
  314. else
  315. {
  316. m_usbInterface->usbCtrlTrans(0xE7, 0x00);
  317. }
  318. }
  319. /* 开启外触发 */
  320. void OscilloscopeData::setExternalTrigger(bool enable)
  321. {
  322. if(m_usbInterface == nullptr)
  323. {
  324. SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
  325. return;
  326. }
  327. if(enable)
  328. {
  329. m_usbInterface->usbCtrlTrans(0xE7, 0x01);
  330. m_ctrlByte1 &= 0xdf;
  331. m_ctrlByte1 |= 0x20;
  332. m_usbInterface->usbCtrlTrans(0x24, m_ctrlByte1);
  333. }
  334. else
  335. {
  336. m_usbInterface->usbCtrlTrans(0xE7, 0x00);
  337. m_ctrlByte1 &= 0xdf;
  338. m_usbInterface->usbCtrlTrans(0x24, m_ctrlByte1);
  339. }
  340. }
  341. /* 设置触发方式 */
  342. void OscilloscopeData::setTriggerMode(OscTriggerMode mode)
  343. {
  344. if(m_usbInterface == nullptr)
  345. {
  346. SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
  347. return;
  348. }
  349. if(mode == OscTriggerMode::TM_RISE)
  350. {
  351. m_usbInterface->usbCtrlTrans(0xC5, 0x00);
  352. }
  353. else if (mode == OscTriggerMode::TM_DOWN)
  354. {
  355. m_usbInterface->usbCtrlTrans(0xC5, 0x01);
  356. }
  357. else if (mode == OscTriggerMode::TM_DOUBLE)
  358. {
  359. m_usbInterface->usbCtrlTrans(0xC5, 0x03);
  360. }
  361. }
  362. /**
  363. * @brief 设置触发电平
  364. *
  365. * @param level 0~255的值
  366. */
  367. void OscilloscopeData::setTriggerLevel(unsigned char level)
  368. {
  369. if(m_usbInterface == nullptr)
  370. {
  371. SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
  372. return;
  373. }
  374. m_usbInterface->usbCtrlTrans(0x16, level);
  375. }
  376. /* 设置触发灵敏度 */
  377. void OscilloscopeData::setTriggerSensitivity(OscTriggerSensitivity sensitivity)
  378. {
  379. if(m_usbInterface == nullptr)
  380. {
  381. SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
  382. return;
  383. }
  384. if(sensitivity == OscTriggerSensitivity::TS_LOW)
  385. {
  386. m_usbInterface->usbCtrlTrans(0x2b, 0);
  387. }
  388. else if(sensitivity == OscTriggerSensitivity::TS_HIGH)
  389. {
  390. m_usbInterface->usbCtrlTrans(0x2b, 1);
  391. }
  392. else
  393. {
  394. SPDLOG_LOGGER_ERROR(m_logger, "触发灵敏度设置错误!");
  395. return;
  396. }
  397. }
  398. /* 设置触发在缓冲区的哪个位置 */
  399. void OscilloscopeData::setTriggerPosition(unsigned char lowByte, unsigned char highByte)
  400. {
  401. if(m_usbInterface == nullptr)
  402. {
  403. SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
  404. return;
  405. }
  406. m_usbInterface->usbCtrlTrans(0x18, lowByte);
  407. m_usbInterface->usbCtrlTrans(0x17, highByte);
  408. }
  409. /* 获取示波器不同档位下的零电压值 */
  410. void OscilloscopeData::getZeroVoltage()
  411. {
  412. if(m_usbInterface == nullptr)
  413. {
  414. SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
  415. return;
  416. }
  417. /* 获取通道A零电压值 */
  418. unsigned char zeroVoltage = 0;
  419. /* 2V档位,正负8V量程 */
  420. zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x82);
  421. m_mapChAZeroVoltage.insert(OscChannelRange::CR_8V, zeroVoltage);
  422. /* 1V档位,正负5V量程 */
  423. zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x01);
  424. m_mapChAZeroVoltage.insert(OscChannelRange::CR_5V, zeroVoltage);
  425. /* 500mV档位,正负2.5V量程 */
  426. zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x0e);
  427. m_mapChAZeroVoltage.insert(OscChannelRange::CR_2V5, zeroVoltage);
  428. /* 200mV档位,正负1V量程 */
  429. zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x14);
  430. m_mapChAZeroVoltage.insert(OscChannelRange::CR_1V, zeroVoltage);
  431. /* 100mV档位,正负500mV量程 */
  432. zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x12);
  433. m_mapChAZeroVoltage.insert(OscChannelRange::CR_500MV, zeroVoltage);
  434. /* 50mV档位,正负250mV量程 */
  435. zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x10);
  436. m_mapChAZeroVoltage.insert(OscChannelRange::CR_250MV, zeroVoltage);
  437. /* 20mV档位,正负100mV量程 */
  438. zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0xa0);
  439. m_mapChAZeroVoltage.insert(OscChannelRange::CR_100MV, zeroVoltage);
  440. /* 获取通道B零电压值 */
  441. /* 2V档位,正负8V量程 */
  442. zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x72);
  443. m_mapChBZeroVoltage.insert(OscChannelRange::CR_8V, zeroVoltage);
  444. /* 1V档位,正负5V量程 */
  445. zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x02);
  446. m_mapChBZeroVoltage.insert(OscChannelRange::CR_5V, zeroVoltage);
  447. /* 500mV档位,正负2.5V量程 */
  448. zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x0f);
  449. m_mapChBZeroVoltage.insert(OscChannelRange::CR_2V5, zeroVoltage);
  450. /* 200mV档位,正负1V量程 */
  451. zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x15);
  452. m_mapChBZeroVoltage.insert(OscChannelRange::CR_1V, zeroVoltage);
  453. /* 100mV档位,正负500mV量程 */
  454. zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x13);
  455. m_mapChBZeroVoltage.insert(OscChannelRange::CR_500MV, zeroVoltage);
  456. /* 50mV档位,正负250mV量程 */
  457. zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x11);
  458. m_mapChBZeroVoltage.insert(OscChannelRange::CR_250MV, zeroVoltage);
  459. /* 20mV档位,正负100mV量程 */
  460. zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0xa1);
  461. m_mapChBZeroVoltage.insert(OscChannelRange::CR_100MV, zeroVoltage);
  462. }
  463. /* 打印出零电压值 */
  464. void OscilloscopeData::printZeroVoltage(OscChannel channel)
  465. {
  466. if(channel == OscChannel::CH_A)
  467. {
  468. for(auto it = m_mapChAZeroVoltage.begin(); it != m_mapChAZeroVoltage.end(); ++it)
  469. {
  470. SPDLOG_LOGGER_INFO(m_logger, "通道A {} 量程下的零电压值为: {}", static_cast<int>(it.key()), it.value());
  471. }
  472. }
  473. else if(channel == OscChannel::CH_B)
  474. {
  475. for(auto it = m_mapChBZeroVoltage.begin(); it != m_mapChBZeroVoltage.end(); ++it)
  476. {
  477. SPDLOG_LOGGER_INFO(m_logger, "通道B {} 量程下的零电压值为: {}", static_cast<int>(it.key()), it.value());
  478. }
  479. }
  480. else
  481. {
  482. SPDLOG_LOGGER_ERROR(m_logger, "通道设置错误!");
  483. return;
  484. }
  485. }
  486. /* 获取不同档位下电压校准系数 */
  487. void OscilloscopeData::getVoltageCalibration()
  488. {
  489. if (m_usbInterface == nullptr)
  490. {
  491. SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
  492. return;
  493. }
  494. /* 获取通道A电压校准系数 */
  495. unsigned char voltageCalibration = 0;
  496. /* 2V档位,正负8V量程 */
  497. voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0xc2);
  498. m_mapChAVoltageCalibration.insert(OscChannelRange::CR_8V, voltageCalibration);
  499. /* 1V档位,正负5V量程 */
  500. voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x03);
  501. m_mapChAVoltageCalibration.insert(OscChannelRange::CR_5V, voltageCalibration);
  502. /* 500mV档位,正负2.5V量程 */
  503. voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x08);
  504. m_mapChAVoltageCalibration.insert(OscChannelRange::CR_2V5, voltageCalibration);
  505. /* 200mV档位,正负1V量程 */
  506. voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x06);
  507. m_mapChAVoltageCalibration.insert(OscChannelRange::CR_1V, voltageCalibration);
  508. /* 100mV档位,正负500mV量程 */
  509. voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x09);
  510. m_mapChAVoltageCalibration.insert(OscChannelRange::CR_500MV, voltageCalibration);
  511. /* 50mV档位,正负250mV量程 */
  512. voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x0a);
  513. m_mapChAVoltageCalibration.insert(OscChannelRange::CR_250MV, voltageCalibration);
  514. /* 20mV档位,正负100mV量程 */
  515. voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x2a);
  516. m_mapChAVoltageCalibration.insert(OscChannelRange::CR_100MV, voltageCalibration);
  517. /* 获取通道B电压校准系数 */
  518. /* 2V档位,正负8V量程 */
  519. voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0xd2);
  520. m_mapChBVoltageCalibration.insert(OscChannelRange::CR_8V, voltageCalibration);
  521. /* 1V档位,正负5V量程 */
  522. voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x04);
  523. m_mapChBVoltageCalibration.insert(OscChannelRange::CR_5V, voltageCalibration);
  524. /* 500mV档位,正负2.5V量程 */
  525. voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x0b);
  526. m_mapChBVoltageCalibration.insert(OscChannelRange::CR_2V5, voltageCalibration);
  527. /* 200mV档位,正负1V量程 */
  528. voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x07);
  529. m_mapChBVoltageCalibration.insert(OscChannelRange::CR_1V, voltageCalibration);
  530. /* 100mV档位,正负500mV量程 */
  531. voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x0c);
  532. m_mapChBVoltageCalibration.insert(OscChannelRange::CR_500MV, voltageCalibration);
  533. /* 50mV档位,正负250mV量程 */
  534. voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x0d);
  535. m_mapChBVoltageCalibration.insert(OscChannelRange::CR_250MV, voltageCalibration);
  536. /* 20mV档位,正负100mV量程 */
  537. voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x2d);
  538. m_mapChBVoltageCalibration.insert(OscChannelRange::CR_100MV, voltageCalibration);
  539. }
  540. /* 打印出电压校准系数 */
  541. void OscilloscopeData::printVoltageCalibration(OscChannel channel)
  542. {
  543. if(channel == OscChannel::CH_A)
  544. {
  545. for(auto it = m_mapChAVoltageCalibration.begin(); it != m_mapChAVoltageCalibration.end(); ++it)
  546. {
  547. SPDLOG_LOGGER_INFO(m_logger, "通道A {} 量程下的电压校准系数为: {}", static_cast<int>(it.key()), it.value());
  548. }
  549. }
  550. else if(channel == OscChannel::CH_B)
  551. {
  552. for(auto it = m_mapChBVoltageCalibration.begin(); it != m_mapChBVoltageCalibration.end(); ++it)
  553. {
  554. SPDLOG_LOGGER_INFO(m_logger, "通道B {} 量程下的电压校准系数为: {}", static_cast<int>(it.key()), it.value());
  555. }
  556. }
  557. else
  558. {
  559. SPDLOG_LOGGER_ERROR(m_logger, "通道设置错误!");
  560. return;
  561. }
  562. }
  563. /**
  564. * @brief 采集数据,这个是子线程
  565. *
  566. */
  567. void OscilloscopeData::threadCaptureData()
  568. {
  569. SPDLOG_LOGGER_INFO(m_logger, "开始采集数据线程");
  570. m_isRunCapture = true;
  571. uint64_t count = 0;
  572. // unsigned char* buffer = nullptr;
  573. while(m_runCapture)
  574. {
  575. // SPDLOG_LOGGER_DEBUG(m_logger, "开始采集数据");
  576. /* 开始采集数据 */
  577. m_usbInterface->usbCtrlTransSimple(0x33);
  578. /* 查询数据是否采集完成(应该是填充满128KB的SRAM)
  579. * 注意,这里是十进制33,不是0x33 */
  580. while(m_usbInterface->usbCtrlTransSimple(0x50) != 33)
  581. {
  582. std::this_thread::sleep_for(std::chrono::microseconds(10));
  583. }
  584. // SPDLOG_LOGGER_DEBUG(m_logger, "硬件缓冲区已满");
  585. /* 将数据从示波器的SRAM中拷贝到电脑内存中,1次传输完成,设置超时时间1ms */
  586. m_usbInterface->readBulkData(BUFFER_SIZE, 1, 1, m_devBuffer);
  587. /* 等待传输完成 */
  588. auto ret = m_usbInterface->eventCheck(100);
  589. if(ret == 0x555)
  590. {
  591. SPDLOG_LOGGER_ERROR(m_logger, "数据传输超时!");
  592. continue;
  593. }
  594. // SPDLOG_LOGGER_DEBUG(m_logger, "数据通过USB传输完成");
  595. /* 取出数据 */
  596. // buffer = m_ringQueue.back();
  597. m_mutexCaptureData.lock();
  598. std::memcpy(m_buffer, m_devBuffer, BUFFER_SIZE);
  599. m_isCaptureData = true;
  600. m_mutexCaptureData.unlock();
  601. /* 清空缓冲区 */
  602. m_usbInterface->resetPipe();
  603. // SPDLOG_LOGGER_DEBUG(m_logger, "count: {}", count++);
  604. }
  605. m_isRunCapture = false;
  606. }
  607. /* 处理数据线程 */
  608. void OscilloscopeData::threadProcessData()
  609. {
  610. SPDLOG_LOGGER_INFO(m_logger, "开始处理数据线程");
  611. while(m_runCapture)
  612. {
  613. if(m_isCaptureData.load())
  614. {
  615. m_mutexCaptureData.lock();
  616. /* 分离通道AB的数据 */
  617. for(uint32_t i = 0; i < BUFFER_SIZE / 2; i++)
  618. {
  619. m_bufferChnA[i] = m_buffer[i * 2];
  620. m_bufferChnB[i] = m_buffer[i * 2 + 1];
  621. }
  622. m_isCaptureData = false;
  623. m_mutexCaptureData.unlock();
  624. /* 处理数据 */
  625. SPDLOG_LOGGER_DEBUG(m_logger, "开始处理数据,通道A数据: {}, 通道B数据: {}", m_bufferChnA[50], m_bufferChnB[50]);
  626. }
  627. std::this_thread::sleep_for(std::chrono::microseconds(10));
  628. }
  629. }