OscData.cpp 32 KB

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