OscData.cpp 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919
  1. #include "OscData.h"
  2. #include <QApplication>
  3. #include <QRandomGenerator>
  4. #include "ThreadPool/ThreadPool.h"
  5. OscilloscopeData::OscilloscopeData()
  6. {
  7. }
  8. OscilloscopeData::~OscilloscopeData()
  9. {
  10. if(m_isOpen)
  11. {
  12. closeOSC();
  13. }
  14. if(m_buffer != nullptr)
  15. {
  16. delete[] m_buffer;
  17. m_buffer = nullptr;
  18. }
  19. if(m_bufferChnA != nullptr)
  20. {
  21. delete[] m_bufferChnA;
  22. m_bufferChnA = nullptr;
  23. }
  24. if(m_bufferChnB != nullptr)
  25. {
  26. delete[] m_bufferChnB;
  27. m_bufferChnB = nullptr;
  28. }
  29. }
  30. /* 初始化示波器 */
  31. void OscilloscopeData::initOsc()
  32. {
  33. m_logger = spdlog::get("OscData");
  34. if(m_logger == nullptr)
  35. {
  36. SPDLOG_ERROR("获取 OscData logger 失败");
  37. return;
  38. }
  39. m_usbInterface = std::make_shared<USBInterface>();
  40. if(!m_usbInterface->loadLib(QApplication::applicationDirPath()))
  41. {
  42. return;
  43. }
  44. /* 分配缓冲区内存 */
  45. m_buffer = new unsigned char[BUFFER_SIZE];
  46. m_bufferChnA = new unsigned char[BUFFER_SIZE / 2];
  47. m_bufferChnB = new unsigned char[BUFFER_SIZE / 2];
  48. }
  49. /* 打开示波器 */
  50. bool OscilloscopeData::openOSC()
  51. {
  52. if(m_usbInterface == nullptr)
  53. {
  54. SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
  55. return false;
  56. }
  57. /* 指定示波器设备型号,OSCA02是6 */
  58. m_usbInterface->specifyDevId(6);
  59. auto ret = m_usbInterface->devOpen();
  60. if(ret != 0)
  61. {
  62. SPDLOG_LOGGER_ERROR(m_logger, "打开示波器失败!");
  63. return false;
  64. }
  65. /* 获取缓冲区首指针 */
  66. m_devBuffer = m_usbInterface->bufferWR(-1);
  67. if(m_devBuffer == nullptr)
  68. {
  69. SPDLOG_LOGGER_ERROR(m_logger, "获取缓冲区指针失败!");
  70. return false;
  71. }
  72. /* 设置硬件触发命令,关闭外部触发,好像是有的设备需要,有的不需要 */
  73. m_ctrlByte1 &= 0xdf;
  74. m_ctrlByte1 |= 0x00;
  75. m_usbInterface->usbCtrlTrans(0x24, m_ctrlByte1);
  76. /* 设置触发位置在缓冲区中间 */
  77. m_usbInterface->usbCtrlTrans(0x18, 0xff);
  78. m_usbInterface->usbCtrlTrans(0x17, 0x7f);
  79. /* 设置缓冲区大小 */
  80. m_usbInterface->setInfo(BUFFER_SIZE);
  81. m_isOpen = true;
  82. return true;
  83. }
  84. /* 关闭示波器 */
  85. void OscilloscopeData::closeOSC()
  86. {
  87. if(m_runCapture)
  88. {
  89. stopCapture();
  90. }
  91. while (m_isRunCapture)
  92. {
  93. std::this_thread::sleep_for(std::chrono::milliseconds(5));
  94. }
  95. if(m_usbInterface != nullptr)
  96. {
  97. m_usbInterface->devClose();
  98. }
  99. m_isOpen = false;
  100. SPDLOG_INFO("示波器已关闭");
  101. }
  102. /* 开始采集数据 */
  103. bool OscilloscopeData::startCapture()
  104. {
  105. if(m_buffer == nullptr)
  106. {
  107. SPDLOG_LOGGER_ERROR(m_logger, "缓冲区指针为空!");
  108. return false;
  109. }
  110. /* 启动子线程 */
  111. m_runCapture = true;
  112. CPPTP.add_task(&OscilloscopeData::threadCaptureData, this);
  113. CPPTP.add_task(&OscilloscopeData::threadProcessData, this);
  114. return true;
  115. }
  116. /* 停止采集数据 */
  117. void OscilloscopeData::stopCapture()
  118. {
  119. m_runCapture = false;
  120. }
  121. /* 设置示波器的采样率 */
  122. void OscilloscopeData::setSampleRate(OscSampleRate rate)
  123. {
  124. if(m_usbInterface == nullptr)
  125. {
  126. SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
  127. return;
  128. }
  129. m_ctrlByte0 &= 0xf0;
  130. if(rate == OscSampleRate::SR_49KHZ)
  131. {
  132. m_ctrlByte0 |= 0x0e;
  133. }
  134. else if(rate == OscSampleRate::SR_96KHZ)
  135. {
  136. m_ctrlByte0 |= 0x04;
  137. }
  138. else if(rate == OscSampleRate::SR_781KHZ)
  139. {
  140. m_ctrlByte0 |= 0x0c;
  141. }
  142. else if(rate == OscSampleRate::SR_12_5MHZ)
  143. {
  144. m_ctrlByte0 |= 0x08;
  145. }
  146. else if(rate == OscSampleRate::SR_100MHZ)
  147. {
  148. m_ctrlByte0 |= 0x00;
  149. }
  150. else
  151. {
  152. SPDLOG_LOGGER_ERROR(m_logger, "采样率设置错误!");
  153. return;
  154. }
  155. m_usbInterface->usbCtrlTrans(0x94, m_ctrlByte0);
  156. }
  157. /**
  158. * @brief 将示波器两个通道合并为一个通道
  159. * 将AB两个通道的资源全部给A,B通道失效,A通道的采样率和带宽翻倍
  160. * @param merge 是否合并
  161. */
  162. void OscilloscopeData::setChannelMerge(bool merge)
  163. {
  164. if(m_usbInterface == nullptr)
  165. {
  166. SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
  167. return;
  168. }
  169. if(merge)
  170. {
  171. m_ctrlByte1 |= 0x80;
  172. }else {
  173. m_ctrlByte1 &= 0x7f;
  174. }
  175. m_usbInterface->usbCtrlTrans(0x24, m_ctrlByte1);
  176. }
  177. /* 设置通道A输入量程 */
  178. void OscilloscopeData::setChannelARange(OscChannelRange range)
  179. {
  180. if(m_usbInterface == nullptr)
  181. {
  182. SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
  183. return;
  184. }
  185. m_ctrlByte1 &= 0xf7;
  186. if(range == OscChannelRange::CR_100MV)
  187. {
  188. m_usbInterface->usbCtrlTrans(0x22, 0x06);
  189. }
  190. else if(range == OscChannelRange::CR_250MV)
  191. {
  192. m_usbInterface->usbCtrlTrans(0x22, 0x04);
  193. }
  194. else if(range == OscChannelRange::CR_500MV)
  195. {
  196. m_usbInterface->usbCtrlTrans(0x22, 0x02);
  197. }
  198. else if(range == OscChannelRange::CR_1V)
  199. {
  200. m_ctrlByte1 |= 0x08;
  201. m_usbInterface->usbCtrlTrans(0x22, 0x06);
  202. }
  203. else if(range == OscChannelRange::CR_2V5)
  204. {
  205. m_ctrlByte1 |= 0x08;
  206. m_usbInterface->usbCtrlTrans(0x22, 0x04);
  207. }
  208. else if(range == OscChannelRange::CR_5V)
  209. {
  210. m_ctrlByte1 |= 0x08;
  211. m_usbInterface->usbCtrlTrans(0x22, 0x02);
  212. }
  213. else if(range == OscChannelRange::CR_8V)
  214. {
  215. m_ctrlByte1 |= 0x08;
  216. m_usbInterface->usbCtrlTrans(0x22, 0x00);
  217. }
  218. m_usbInterface->usbCtrlTrans(0x24, m_ctrlByte1);
  219. }
  220. /* 设置通道B输入量程 */
  221. void OscilloscopeData::setChannelBRange(OscChannelRange range)
  222. {
  223. if(m_usbInterface == nullptr)
  224. {
  225. SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
  226. return;
  227. }
  228. m_ctrlByte1 &= 0xf9;
  229. if(range == OscChannelRange::CR_100MV)
  230. {
  231. m_ctrlByte1 |= 0x06;
  232. m_usbInterface->usbCtrlTrans(0x23, 0x40);
  233. }
  234. else if(range == OscChannelRange::CR_250MV)
  235. {
  236. m_ctrlByte1 |= 0x04;
  237. m_usbInterface->usbCtrlTrans(0x23, 0x40);
  238. }
  239. else if(range == OscChannelRange::CR_500MV)
  240. {
  241. m_ctrlByte1 |= 0x02;
  242. m_usbInterface->usbCtrlTrans(0x23, 0x40);
  243. }
  244. else if(range == OscChannelRange::CR_1V)
  245. {
  246. m_ctrlByte1 |= 0x06;
  247. m_usbInterface->usbCtrlTrans(0x23, 0x00);
  248. }
  249. else if(range == OscChannelRange::CR_2V5)
  250. {
  251. m_ctrlByte1 |= 0x04;
  252. m_usbInterface->usbCtrlTrans(0x23, 0x00);
  253. }
  254. else if(range == OscChannelRange::CR_5V)
  255. {
  256. m_ctrlByte1 |= 0x02;
  257. m_usbInterface->usbCtrlTrans(0x23, 0x00);
  258. }
  259. else if(range == OscChannelRange::CR_8V)
  260. {
  261. m_usbInterface->usbCtrlTrans(0x23, 0x00);
  262. }
  263. else
  264. {
  265. SPDLOG_LOGGER_ERROR(m_logger, "输入量程设置错误!");
  266. return;
  267. }
  268. m_usbInterface->usbCtrlTrans(0x24, m_ctrlByte1);
  269. }
  270. /**
  271. * @brief 设置通道耦合方式
  272. *
  273. * @param channel 通道
  274. * @param coupling 耦合方式,DC或者AC
  275. */
  276. void OscilloscopeData::setChannelCoupling(OscChannel channel, OscChannelCoupling coupling)
  277. {
  278. if(m_usbInterface == nullptr)
  279. {
  280. SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
  281. return;
  282. }
  283. if(channel == OscChannel::CH_A)
  284. {
  285. m_ctrlByte0 &= 0xef;
  286. if(coupling == OscChannelCoupling::DC) {
  287. m_ctrlByte0 |= 0x10;
  288. }
  289. else if(coupling == OscChannelCoupling::AC) {}
  290. else {
  291. SPDLOG_LOGGER_ERROR(m_logger, "耦合方式设置错误!");
  292. return;
  293. }
  294. m_usbInterface->usbCtrlTrans(0x94, m_ctrlByte0);
  295. }
  296. else if(channel == OscChannel::CH_B)
  297. {
  298. m_ctrlByte1 &= 0xef;
  299. if(coupling == OscChannelCoupling::AC) {
  300. m_ctrlByte1 |= 0x10;
  301. }
  302. else if(coupling == OscChannelCoupling::DC) {}
  303. else {
  304. SPDLOG_LOGGER_ERROR(m_logger, "耦合方式设置错误!");
  305. return;
  306. }
  307. m_usbInterface->usbCtrlTrans(0x24, m_ctrlByte1);
  308. }
  309. else
  310. {
  311. SPDLOG_LOGGER_ERROR(m_logger, "通道设置错误!");
  312. return;
  313. }
  314. }
  315. /* 开启或关闭通道A触发 */
  316. void OscilloscopeData::setChannelATrigger(bool enable)
  317. {
  318. if(m_usbInterface == nullptr)
  319. {
  320. SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
  321. return;
  322. }
  323. if(enable)
  324. {
  325. m_usbInterface->usbCtrlTrans(0xE7, 0x01);
  326. }
  327. else
  328. {
  329. m_usbInterface->usbCtrlTrans(0xE7, 0x00);
  330. }
  331. }
  332. /* 开启外触发 */
  333. void OscilloscopeData::setExternalTrigger(bool enable)
  334. {
  335. if(m_usbInterface == nullptr)
  336. {
  337. SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
  338. return;
  339. }
  340. if(enable)
  341. {
  342. m_usbInterface->usbCtrlTrans(0xE7, 0x01);
  343. m_ctrlByte1 &= 0xdf;
  344. m_ctrlByte1 |= 0x20;
  345. m_usbInterface->usbCtrlTrans(0x24, m_ctrlByte1);
  346. }
  347. else
  348. {
  349. m_usbInterface->usbCtrlTrans(0xE7, 0x00);
  350. m_ctrlByte1 &= 0xdf;
  351. m_ctrlByte1 |= 0x00;
  352. m_usbInterface->usbCtrlTrans(0x24, m_ctrlByte1);
  353. }
  354. }
  355. /* 设置触发方式 */
  356. void OscilloscopeData::setTriggerMode(OscTriggerMode mode)
  357. {
  358. if(m_usbInterface == nullptr)
  359. {
  360. SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
  361. return;
  362. }
  363. if(mode == OscTriggerMode::TM_RISE)
  364. {
  365. m_usbInterface->usbCtrlTrans(0xC5, 0x00);
  366. }
  367. else if (mode == OscTriggerMode::TM_DOWN)
  368. {
  369. m_usbInterface->usbCtrlTrans(0xC5, 0x01);
  370. }
  371. else if (mode == OscTriggerMode::TM_DOUBLE)
  372. {
  373. m_usbInterface->usbCtrlTrans(0xC5, 0x03);
  374. }
  375. }
  376. /**
  377. * @brief 设置触发电平
  378. *
  379. * @param level 0~255的值
  380. */
  381. void OscilloscopeData::setTriggerLevel(unsigned char level)
  382. {
  383. if(m_usbInterface == nullptr)
  384. {
  385. SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
  386. return;
  387. }
  388. m_usbInterface->usbCtrlTrans(0x16, level);
  389. }
  390. /* 设置触发灵敏度 */
  391. void OscilloscopeData::setTriggerSensitivity(OscTriggerSensitivity sensitivity)
  392. {
  393. if(m_usbInterface == nullptr)
  394. {
  395. SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
  396. return;
  397. }
  398. if(sensitivity == OscTriggerSensitivity::TS_LOW)
  399. {
  400. m_usbInterface->usbCtrlTrans(0x2b, 0);
  401. }
  402. else if(sensitivity == OscTriggerSensitivity::TS_HIGH)
  403. {
  404. m_usbInterface->usbCtrlTrans(0x2b, 1);
  405. }
  406. else
  407. {
  408. SPDLOG_LOGGER_ERROR(m_logger, "触发灵敏度设置错误!");
  409. return;
  410. }
  411. }
  412. /* 设置触发在缓冲区的哪个位置 */
  413. void OscilloscopeData::setTriggerPosition(unsigned char lowByte, unsigned char highByte)
  414. {
  415. if(m_usbInterface == nullptr)
  416. {
  417. SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
  418. return;
  419. }
  420. m_usbInterface->usbCtrlTrans(0x18, lowByte);
  421. m_usbInterface->usbCtrlTrans(0x17, highByte);
  422. }
  423. /* 获取示波器不同档位下的零电压值 */
  424. void OscilloscopeData::getZeroVoltage()
  425. {
  426. if(m_usbInterface == nullptr)
  427. {
  428. SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
  429. return;
  430. }
  431. /* 获取通道A零电压值 */
  432. unsigned char zeroVoltage = 0;
  433. /* 2V档位,正负8V量程 */
  434. zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x82);
  435. m_mapChAZeroVoltage.insert(OscChannelRange::CR_8V, zeroVoltage);
  436. /* 1V档位,正负5V量程 */
  437. zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x01);
  438. m_mapChAZeroVoltage.insert(OscChannelRange::CR_5V, zeroVoltage);
  439. /* 500mV档位,正负2.5V量程 */
  440. zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x0e);
  441. m_mapChAZeroVoltage.insert(OscChannelRange::CR_2V5, zeroVoltage);
  442. /* 200mV档位,正负1V量程 */
  443. zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x14);
  444. m_mapChAZeroVoltage.insert(OscChannelRange::CR_1V, zeroVoltage);
  445. /* 100mV档位,正负500mV量程 */
  446. zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x12);
  447. m_mapChAZeroVoltage.insert(OscChannelRange::CR_500MV, zeroVoltage);
  448. /* 50mV档位,正负250mV量程 */
  449. zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x10);
  450. m_mapChAZeroVoltage.insert(OscChannelRange::CR_250MV, zeroVoltage);
  451. /* 20mV档位,正负100mV量程 */
  452. zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0xa0);
  453. m_mapChAZeroVoltage.insert(OscChannelRange::CR_100MV, zeroVoltage);
  454. /* 获取通道B零电压值 */
  455. /* 2V档位,正负8V量程 */
  456. zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x72);
  457. m_mapChBZeroVoltage.insert(OscChannelRange::CR_8V, zeroVoltage);
  458. /* 1V档位,正负5V量程 */
  459. zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x02);
  460. m_mapChBZeroVoltage.insert(OscChannelRange::CR_5V, zeroVoltage);
  461. /* 500mV档位,正负2.5V量程 */
  462. zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x0f);
  463. m_mapChBZeroVoltage.insert(OscChannelRange::CR_2V5, zeroVoltage);
  464. /* 200mV档位,正负1V量程 */
  465. zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x15);
  466. m_mapChBZeroVoltage.insert(OscChannelRange::CR_1V, zeroVoltage);
  467. /* 100mV档位,正负500mV量程 */
  468. zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x13);
  469. m_mapChBZeroVoltage.insert(OscChannelRange::CR_500MV, zeroVoltage);
  470. /* 50mV档位,正负250mV量程 */
  471. zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0x11);
  472. m_mapChBZeroVoltage.insert(OscChannelRange::CR_250MV, zeroVoltage);
  473. /* 20mV档位,正负100mV量程 */
  474. zeroVoltage = m_usbInterface->usbCtrlTrans(0x90, 0xa1);
  475. m_mapChBZeroVoltage.insert(OscChannelRange::CR_100MV, zeroVoltage);
  476. }
  477. /* 打印出零电压值 */
  478. void OscilloscopeData::printZeroVoltage(OscChannel channel)
  479. {
  480. if(channel == OscChannel::CH_A)
  481. {
  482. for(auto it = m_mapChAZeroVoltage.begin(); it != m_mapChAZeroVoltage.end(); ++it)
  483. {
  484. SPDLOG_LOGGER_INFO(m_logger, "通道A {} 量程下的零电压值为: {}", static_cast<int>(it.key()), it.value());
  485. }
  486. }
  487. else if(channel == OscChannel::CH_B)
  488. {
  489. for(auto it = m_mapChBZeroVoltage.begin(); it != m_mapChBZeroVoltage.end(); ++it)
  490. {
  491. SPDLOG_LOGGER_INFO(m_logger, "通道B {} 量程下的零电压值为: {}", static_cast<int>(it.key()), it.value());
  492. }
  493. }
  494. else
  495. {
  496. SPDLOG_LOGGER_ERROR(m_logger, "通道设置错误!");
  497. return;
  498. }
  499. }
  500. /* 获取不同档位下电压校准系数 */
  501. void OscilloscopeData::getVoltageCalibration()
  502. {
  503. if (m_usbInterface == nullptr)
  504. {
  505. SPDLOG_LOGGER_ERROR(m_logger, "USBInterface指针为空!");
  506. return;
  507. }
  508. /* 获取通道A电压校准系数 */
  509. unsigned char voltageCalibration = 0;
  510. /* 2V档位,正负8V量程 */
  511. voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0xc2);
  512. m_mapChAVoltageCalibration.insert(OscChannelRange::CR_8V, voltageCalibration);
  513. /* 1V档位,正负5V量程 */
  514. voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x03);
  515. m_mapChAVoltageCalibration.insert(OscChannelRange::CR_5V, voltageCalibration);
  516. /* 500mV档位,正负2.5V量程 */
  517. voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x08);
  518. m_mapChAVoltageCalibration.insert(OscChannelRange::CR_2V5, voltageCalibration);
  519. /* 200mV档位,正负1V量程 */
  520. voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x06);
  521. m_mapChAVoltageCalibration.insert(OscChannelRange::CR_1V, voltageCalibration);
  522. /* 100mV档位,正负500mV量程 */
  523. voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x09);
  524. m_mapChAVoltageCalibration.insert(OscChannelRange::CR_500MV, voltageCalibration);
  525. /* 50mV档位,正负250mV量程 */
  526. voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x0a);
  527. m_mapChAVoltageCalibration.insert(OscChannelRange::CR_250MV, voltageCalibration);
  528. /* 20mV档位,正负100mV量程 */
  529. voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x2a);
  530. m_mapChAVoltageCalibration.insert(OscChannelRange::CR_100MV, voltageCalibration);
  531. /* 获取通道B电压校准系数 */
  532. /* 2V档位,正负8V量程 */
  533. voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0xd2);
  534. m_mapChBVoltageCalibration.insert(OscChannelRange::CR_8V, voltageCalibration);
  535. /* 1V档位,正负5V量程 */
  536. voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x04);
  537. m_mapChBVoltageCalibration.insert(OscChannelRange::CR_5V, voltageCalibration);
  538. /* 500mV档位,正负2.5V量程 */
  539. voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x0b);
  540. m_mapChBVoltageCalibration.insert(OscChannelRange::CR_2V5, voltageCalibration);
  541. /* 200mV档位,正负1V量程 */
  542. voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x07);
  543. m_mapChBVoltageCalibration.insert(OscChannelRange::CR_1V, voltageCalibration);
  544. /* 100mV档位,正负500mV量程 */
  545. voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x0c);
  546. m_mapChBVoltageCalibration.insert(OscChannelRange::CR_500MV, voltageCalibration);
  547. /* 50mV档位,正负250mV量程 */
  548. voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x0d);
  549. m_mapChBVoltageCalibration.insert(OscChannelRange::CR_250MV, voltageCalibration);
  550. /* 20mV档位,正负100mV量程 */
  551. voltageCalibration = m_usbInterface->usbCtrlTrans(0x90, 0x2d);
  552. m_mapChBVoltageCalibration.insert(OscChannelRange::CR_100MV, voltageCalibration);
  553. }
  554. /* 打印出电压校准系数 */
  555. void OscilloscopeData::printVoltageCalibration(OscChannel channel)
  556. {
  557. if(channel == OscChannel::CH_A)
  558. {
  559. for(auto it = m_mapChAVoltageCalibration.begin(); it != m_mapChAVoltageCalibration.end(); ++it)
  560. {
  561. SPDLOG_LOGGER_INFO(m_logger, "通道A {} 量程下的电压校准系数为: {}", static_cast<int>(it.key()), it.value());
  562. }
  563. }
  564. else if(channel == OscChannel::CH_B)
  565. {
  566. for(auto it = m_mapChBVoltageCalibration.begin(); it != m_mapChBVoltageCalibration.end(); ++it)
  567. {
  568. SPDLOG_LOGGER_INFO(m_logger, "通道B {} 量程下的电压校准系数为: {}", static_cast<int>(it.key()), it.value());
  569. }
  570. }
  571. else
  572. {
  573. SPDLOG_LOGGER_ERROR(m_logger, "通道设置错误!");
  574. return;
  575. }
  576. }
  577. /**
  578. * @brief 采集数据,这个是子线程
  579. *
  580. */
  581. void OscilloscopeData::threadCaptureData()
  582. {
  583. SPDLOG_LOGGER_INFO(m_logger, "开始采集数据线程");
  584. m_isRunCapture = true;
  585. uint64_t count = 0;
  586. // unsigned char* buffer = nullptr;
  587. // while(m_runCapture)
  588. {
  589. // SPDLOG_LOGGER_DEBUG(m_logger, "开始采集数据");
  590. /* 开始采集数据 */
  591. m_usbInterface->usbCtrlTransSimple(0x33);
  592. /* 清空数据缓冲区 */
  593. for(uint32_t i = 0; i < BUFFER_SIZE; i++)
  594. {
  595. m_buffer[i] = 0;
  596. }
  597. /* 查询数据是否采集完成(应该是填充满128KB的SRAM)
  598. * 注意,这里是十进制33,不是0x33 */
  599. while(m_usbInterface->usbCtrlTransSimple(0x50) != 33)
  600. {
  601. std::this_thread::sleep_for(std::chrono::microseconds(10));
  602. }
  603. // SPDLOG_LOGGER_DEBUG(m_logger, "硬件缓冲区已满");
  604. /* 将数据从示波器的SRAM中拷贝到电脑内存中,1次传输完成,设置超时时间1ms */
  605. m_usbInterface->readBulkData(BUFFER_SIZE, 1, 100, m_devBuffer);
  606. /* 等待传输完成 */
  607. auto ret = m_usbInterface->eventCheck(100);
  608. if(ret == 0x555)
  609. {
  610. SPDLOG_LOGGER_ERROR(m_logger, "数据传输超时!");
  611. // continue;
  612. }
  613. // SPDLOG_LOGGER_DEBUG(m_logger, "数据通过USB传输完成");
  614. /* 取出数据 */
  615. // buffer = m_ringQueue.back();
  616. m_mutexCaptureData.lock();
  617. std::memcpy(m_buffer, m_devBuffer, BUFFER_SIZE);
  618. m_isCaptureData = true;
  619. m_mutexCaptureData.unlock();
  620. /* 清空缓冲区 */
  621. m_usbInterface->resetPipe();
  622. // SPDLOG_LOGGER_DEBUG(m_logger, "count: {}", count++);
  623. }
  624. m_isRunCapture = false;
  625. }
  626. /* 处理数据线程 */
  627. void OscilloscopeData::threadProcessData()
  628. {
  629. SPDLOG_LOGGER_INFO(m_logger, "开始处理数据线程");
  630. // while(m_runCapture)
  631. {
  632. if(m_isCaptureData.load())
  633. {
  634. m_mutexCaptureData.lock();
  635. /* 分离通道AB的数据 */
  636. for(uint32_t i = 0; i < BUFFER_SIZE / 2; i++)
  637. {
  638. m_bufferChnA[i] = m_buffer[i * 2];
  639. m_bufferChnB[i] = m_buffer[i * 2 + 1];
  640. }
  641. m_isCaptureData = false;
  642. m_mutexCaptureData.unlock();
  643. /* 处理数据 */
  644. SPDLOG_LOGGER_DEBUG(m_logger, "开始处理数据,通道A数据: {}, 通道B数据: {}", m_bufferChnA[32000], m_bufferChnB[32000]);
  645. }
  646. /* 打印1000个数据 */
  647. // for(uint32_t i = 0; i < BUFFER_SIZE/2; i++)
  648. // {
  649. // if((m_bufferChnA[i] == 128) && (m_bufferChnB[i] == 128))
  650. // continue;
  651. // SPDLOG_LOGGER_DEBUG(m_logger, "A: {}, B: {}", m_bufferChnA[i], m_bufferChnB[i]);
  652. // }
  653. // SPDLOG_LOGGER_DEBUG(m_logger, "输出完成");
  654. parseEyeMapData(m_bufferChnA, BUFFER_SIZE / 2);
  655. std::this_thread::sleep_for(std::chrono::microseconds(10));
  656. }
  657. }
  658. /**
  659. * @brief 解析数据,眼图需要的数据,从C#代码中移植过来
  660. *
  661. * @param buffer 数据缓冲区
  662. * @param size 缓冲区大小,单位字节
  663. */
  664. void OscilloscopeData::parseEyeMapData(unsigned char* buffer, unsigned int size)
  665. {
  666. int bufferSize = size;
  667. uint8_t* array = buffer;
  668. int num2 = 0;
  669. int num3 = 0;
  670. int num4 = 0;
  671. uint8_t vaMax = 128;
  672. uint8_t vaMin = 128;
  673. uint8_t tmp = 128;
  674. num3 = bufferSize; /* 赋值,数据个数 */
  675. /* 数据预处理,找出最大值和最小值 */
  676. for (int i = 0; i < bufferSize; i++)
  677. {
  678. /* 取出这组数据的最大值和最小值 */
  679. tmp = array[i];
  680. if (tmp < vaMin)
  681. {
  682. vaMin = tmp;
  683. }
  684. if (tmp > vaMax)
  685. {
  686. vaMax = tmp;
  687. }
  688. }
  689. /* 取绝对值,小于15丢弃,应该是丢弃幅度小于15的数据 */
  690. int numAmp = std::abs(vaMax - vaMin);
  691. if (numAmp <= 15)
  692. {
  693. return;
  694. }
  695. /* 计算最大值和最小值的中间数 */
  696. uint8_t vaMid = (vaMax + vaMin) / 2;
  697. /* 根据全局设置,进行缩放和插值,num7,缩放系数,可能是 1.0 * 100.0 / 100 */
  698. // double num7 = globleVariables.g_GlobSetting_struc.g_dataNumPerPixar * globleVariables.g_GlobSetting_struc.g_Timescale / 100.0;
  699. double num7 = 1.0 * 100.0 / 100; /* 这一行不知道是什么值,暂时用这个代替 */
  700. /* num8屏幕像素数目? */
  701. // long num8 = (long)(num7 * (double)globleVariables.g_Screen_PixarPts);
  702. long num8 = 1600; /* 这一行不知道是什么值,暂时用这个代替 */
  703. if (num8 % 2 != 0L)
  704. {
  705. num8++;
  706. }
  707. /* num9,四分之一的像素数目? */
  708. int num9 = 0;
  709. num9 = (int)((double)num8 * 0.25);
  710. // List<pEyeDataT> list = new List<pEyeDataT>();
  711. std::vector<EyeDataT> vecData;
  712. int numMulti = 0; /* 倍率,可能是1可能是30 */
  713. if (num7 >= 1.0)
  714. {
  715. /* 将数据放入到list中,带有bool标志位 */
  716. for (int i = 0; i < bufferSize; i++)
  717. {
  718. vecData.push_back(EyeDataT(true, array[i]));
  719. }
  720. numMulti = 1;
  721. }
  722. else
  723. {
  724. // /* 缩放系数小于1.0,下面会进行插值 */
  725. // num3 = bufferSize - 1;
  726. // float num11 = 0.0;
  727. // // Random random = new Random();
  728. // QRandomGenerator* random = QRandomGenerator::global();
  729. // bool flag2 = false;
  730. // /* */
  731. // for (num2 = 0; num2 < num3; num2++)
  732. // {
  733. // b2 = array[num2]; /* 偶数位 */
  734. // b3 = array[num2 + 1]; /* 奇数位 */
  735. // /* 在b2和b3之间添加30个插值 */
  736. // num11 = (float)(b3 - b2) / 30.f; /* 将幅值分成30份 */
  737. // vecData.push_back(EyeDataT(true, b2));
  738. // num5 = 30;
  739. // for (num4 = 0; num4 < num5; num4++)
  740. // {
  741. // b = (byte)(Math.Round(num11 * (float)num4, MidpointRounding.AwayFromZero) + (double)(int)b2);
  742. // flag2 = ((1 == random.Next(1)) ? true : false);
  743. // list.Add(new pEyeDataT(flag2, b));
  744. // }
  745. // list.Add(new pEyeDataT(_bIsTure: true, b3));
  746. // }
  747. // numMulti = 30;
  748. }
  749. if (vecData.size() <= 0)
  750. {
  751. return;
  752. }
  753. /* 屏幕的像素数目的1/4 * (1或30)? */
  754. num9 *= numMulti; /* 这里的num9可能是400 */
  755. long num12 = num8 * numMulti; /* num12可能是1600 */
  756. // List<List<pEyeDataT>> list2 = new List<List<pEyeDataT>>();
  757. std::vector<std::vector<EyeDataT>> list2;
  758. // List<int> listSub = new List<int>();
  759. /* 存储下标 */
  760. std::vector<int> listSub;
  761. num3 = vecData.size() - num9;
  762. bool flag3 = true;
  763. /* 找到数组中的上升沿和下降沿,并记录其坐标 */
  764. uint8_t vaPre = 0;
  765. uint8_t va = 0;
  766. uint8_t vaNext = 0;
  767. for (int i = 10; i < num3; i++)
  768. {
  769. /* 取出相邻的三个值 */
  770. vaPre = vecData[i - 1].value;
  771. va = vecData[i].value;
  772. vaNext = vecData[i + 1].value;
  773. if (flag3)
  774. {
  775. /* 上升沿,b6 = b7,就是中间值 */
  776. if (vaPre <= vaMid && vaNext > vaMid)
  777. {
  778. listSub.push_back(i); /* 记录下标 */
  779. flag3 = !flag3; /* 不再检测上升沿,检测下降沿 */
  780. }
  781. }
  782. /* 下降沿 */
  783. else if (vaPre >= vaMid && vaNext < vaMid)
  784. {
  785. listSub.push_back(num2);
  786. flag3 = !flag3;
  787. }
  788. /* 采集到600个上升沿和下降沿 */
  789. if (listSub.size() >= 600)
  790. {
  791. break;
  792. }
  793. }
  794. if (listSub.size() <= 0)
  795. {
  796. return;
  797. }
  798. /* */
  799. int num13 = 0;
  800. int num14 = 0;
  801. int num15 = 0;
  802. int num16 = 0;
  803. int num17 = 0;
  804. num3 = listSub.size(); /* 下标的个数 */
  805. num16 = (int)(num12 / 3);
  806. /* */
  807. int num5 = 0;
  808. for (int i = 0; i < num3; i++)
  809. {
  810. std::vector<EyeDataT> vecDataTmp;
  811. for (num4 = 0; num4 < num12; num4++)
  812. {
  813. vecDataTmp.push_back(EyeDataT(false, 0));
  814. }
  815. num5 = listSub[i];
  816. num13 = num5 - num16;
  817. num14 = num13;
  818. if (num14 <= 0)
  819. {
  820. num14 = 0;
  821. }
  822. num15 = num5 + num16 * 2;
  823. if (num15 >= vecData.size())
  824. {
  825. num15 = vecData.size() - 1;
  826. }
  827. num17 = 0;
  828. if (num13 < 0)
  829. {
  830. num17 = std::abs(num13);
  831. }
  832. if (num13 > 0)
  833. {
  834. num17 = -num13;
  835. }
  836. for (num4 = num14; num4 < num15; num4++)
  837. {
  838. vecDataTmp[num17 + num4].isEyeData = vecData[num4].isEyeData;
  839. vecDataTmp[num17 + num4].value = vecData[num4].value;
  840. }
  841. list2.push_back(vecDataTmp);
  842. }
  843. listSub.clear();
  844. vecData.clear();
  845. if (list2.size() <= 0)
  846. {
  847. return;
  848. }
  849. int num18 = 0;
  850. int num19 = 0;
  851. float num20 = 0.0;
  852. for (int i = 0; i < list2.size(); i++)
  853. {
  854. std::vector<EyeDataT> list5 = list2[i];
  855. num3 = list5.size();
  856. num20 = num3;
  857. num20 /= 1000.f;
  858. g_eyeDataMatrix.mutexEyeData.lock();
  859. for (num4 = 0; num4 < num3; num4++)
  860. {
  861. if (list5[num4].isEyeData)
  862. {
  863. num5 = list5[num4].value;
  864. num19 = num5;
  865. num18 = (int)((float)num4 / num20);
  866. /* 将数据添加到眼图矩阵中 */
  867. // globleVariables.g_IeyeDataMatrix.eyeWeighted(num18, num19);
  868. g_eyeDataMatrix.addData(num18, num19);
  869. }
  870. }
  871. g_eyeDataMatrix.mutexEyeData.unlock();
  872. }
  873. // globleVariables.g_IeyeDataMatrix.eyeStatisticalWeight();
  874. g_eyeDataMatrix.eyeStatisticalWeight();
  875. // globleVariables.g_IeyeDataMatrix.eyeLessenTheBurden();
  876. g_eyeDataMatrix.eyeLessenTheBurden();
  877. list2.clear();
  878. // pEyeData[,] eyedata = globleVariables.g_IeyeDataMatrix.eyeZoomOut();
  879. // GraphView.m_eyedMatrux.EyeDataMatrixCopy(eyedata);
  880. }