OneOscData.h 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #ifndef _OneOscilloscopeData_H_
  2. #define _OneOscilloscopeData_H_
  3. #include <QObject>
  4. #include <QMap>
  5. #include "USBInterFace.h"
  6. #include "spdlog/spdlog.h"
  7. #include "GlobalInfo.h"
  8. #include "OscDataInfo.h"
  9. #include "RingQueue/RingQueue.hpp"
  10. #define OneOscData OneOscilloscopeData
  11. class OneOscilloscopeData : public QObject
  12. {
  13. Q_OBJECT
  14. const uint32_t BUFFER_SIZE = 1024 * 128 ; /* 缓冲区大小,OSCA02的缓冲区应该是128KB的SRAM */
  15. private:
  16. OneOscilloscopeData(const OneOscilloscopeData&) = delete;
  17. OneOscilloscopeData& operator=(const OneOscilloscopeData&) = delete;
  18. public:
  19. OneOscilloscopeData();
  20. ~OneOscilloscopeData();
  21. // static OneOscilloscopeData& getInstance()
  22. // {
  23. // static OneOscilloscopeData instance;
  24. // return instance;
  25. // }
  26. /* 初始化示波器 */
  27. void initOSC(int oscNum);
  28. /* 打开示波器 */
  29. bool openOSC();
  30. /* 关闭示波器 */
  31. void closeOSC();
  32. /* 示波器是否打开 */
  33. bool isOpen() { return m_isOpen; }
  34. /* 开始采集数据 */
  35. bool startCapture();
  36. /* 停止采集数据 */
  37. void stopCapture();
  38. /***** 设置示波器的功能命令 *****/
  39. /* 设置示波器的采样率 */
  40. void setSampleRate(OscSampleRate rate);
  41. /* 将示波器两个通道合并为一个通道 */
  42. void setChannelMerge(bool merge);
  43. /* 设置通道A输入量程 */
  44. void setChannelARange(OscVoltageRange range);
  45. /* 设置通道B输入量程 */
  46. void setChannelBRange(OscVoltageRange range);
  47. /* 设置通道耦合方式 */
  48. void setChannelCoupling(OscChannel channel, OscChannelCoupling coupling);
  49. /* 开启或关闭通道A触发 */
  50. void setChannelATrigger(bool enable);
  51. /* 开启外触发 */
  52. void setExternalTrigger(bool enable);
  53. /* 设置触发方式 */
  54. void setTriggerMode(OscTriggerMode mode);
  55. /* 设置触发电平 */
  56. void setTriggerLevel(unsigned char level);
  57. /* 设置触发灵敏度 */
  58. void setTriggerSensitivity(OscTriggerSensitivity sensitivity);
  59. /* 设置触发在缓冲区的哪个位置 */
  60. void setTriggerPosition(unsigned char lowByte, unsigned char highByte);
  61. /* 获取示波器不同档位下的零电压值 */
  62. void getZeroVoltage();
  63. /* 打印出零电压值 */
  64. void printZeroVoltage(OscChannel channel);
  65. /* 获取不同档位下电压校准系数 */
  66. void getVoltageCalibration();
  67. /* 打印出电压校准系数 */
  68. void printVoltageCalibration(OscChannel channel);
  69. // private:
  70. public:
  71. /* 采集数据,这个是子线程 */
  72. void threadCaptureData();
  73. /* 处理数据线程 */
  74. void threadSeparateData();
  75. /* 处理A通道数据 */
  76. void threadProcessData_A();
  77. /* 处理B通道数据 */
  78. void threadProcessData_B();
  79. /* 解析数据,眼图需要的数据 */
  80. void parseEyeMapData(OscChannel chn, unsigned char* buffer, unsigned int size);
  81. /* 设置零电压值和电压校准系数 */
  82. void setZeroVoltageAndCalibration(OscChannel chn, OscVoltageRange range);
  83. /* 校准电压 */
  84. inline double calibrationVoltageA(uint8_t& data);
  85. inline double calibrationVoltageB(uint8_t& data);
  86. /* 根据示波器编号获取示波器的数据矩阵指针 */
  87. bool getEyeDataMatrixPtr();
  88. private:
  89. std::shared_ptr<spdlog::logger> m_logger = nullptr;
  90. std::shared_ptr<USBInterface> m_usbInterface = nullptr;
  91. std::atomic_bool m_isOpen = false; /* 示波器是否打开 */
  92. std::atomic_bool m_runCapture = false; /* 采集数据的线程标志 */
  93. std::atomic_bool m_isRunCapture = false; /* 采集数据的线程运行标志,这个标志位作为线程运行的标志 */
  94. std::atomic_bool m_isCapturedData = false; /* 是否采集到数据 */
  95. std::condition_variable m_condCapture; /* 采集数据的条件变量 */
  96. std::condition_variable m_condBuffer_A; /* 通道A的条件变量 */
  97. std::condition_variable m_condBuffer_B; /* 通道B的条件变量 */
  98. std::mutex m_mutexBuffer; /* 互斥锁,用于保护采集到的数据 */
  99. std::mutex m_mutexBuffer_A; /* 互斥锁,用于保护采集到的数据 */
  100. std::mutex m_mutexBuffer_B; /* 互斥锁,用于保护采集到的数据 */
  101. unsigned char* m_devBuffer = nullptr; /* 设备缓冲区指针,拷贝数据用的 */
  102. unsigned char* m_buffer = nullptr; /* 缓冲区指针,用于存储拷贝出来的数据 */
  103. unsigned char* m_bufferChnA = nullptr; /* 通道A的缓冲区指针 */
  104. unsigned char* m_bufferChnB = nullptr; /* 通道B的缓冲区指针 */
  105. // RingQueue<unsigned char*> m_ringQueue; /* 环形队列,用于存储示波器采集到的数据 */
  106. int m_oscNum = 0; /* 示波器编号 */
  107. /************* 示波器控制相关 *************/
  108. unsigned char m_ctrlByte0 = 0; /* 控制字节0 */
  109. unsigned char m_ctrlByte1 = 0; /* 控制字节1 */
  110. QMap<OscVoltageRange, unsigned char> m_mapChAZeroVoltage; /* 通道A的零电压值 */
  111. QMap<OscVoltageRange, unsigned char> m_mapChBZeroVoltage; /* 通道B的零电压值 */
  112. QMap<OscVoltageRange, unsigned char> m_mapChAVoltageAmplitudeRatio; /* 通道A的电压校准系数 */
  113. QMap<OscVoltageRange, unsigned char> m_mapChBVoltageAmplitudeRatio; /* 通道B的电压校准系数 */
  114. unsigned char m_zeroVoltageA = 0; /* 通道A零电压值 */
  115. unsigned char m_zeroVoltageB = 0; /* 通道B零电压值 */
  116. char m_diffVoltageA = 0; /* 通道A零电压差值 */
  117. char m_diffVoltageB = 0; /* 通道B零电压差值 */
  118. double m_voltageCalibrationA = 0; /* 通道A电压校准系数 */
  119. double m_voltageCalibrationB = 0; /* 通道B电压校准系数 */
  120. double m_rangeRatioA = 0.0; /* 通道A量程比例 */
  121. double m_rangeRatioB = 0.0; /* 通道B量程比例 */
  122. /************* 数据指针 *************/
  123. EyeDataMatrix* m_eyeDataMatrix_A = nullptr; /* 眼图数据矩阵,A通道 */
  124. EyeDataMatrix* m_eyeDataMatrix_B = nullptr; /* 眼图数据矩阵,B通道 */
  125. EyeMapMatrix* m_eyeMapMatrix_A = nullptr; /* 眼图矩阵,A通道 */
  126. EyeMapMatrix* m_eyeMapMatrix_B = nullptr; /* 眼图矩阵,B通道 */
  127. };
  128. #endif /* _OneOscilloscopeData_H_ */