GlobalInfo.h 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. #ifndef GLOBALINFO_H
  2. #define GLOBALINFO_H
  3. #include <mutex>
  4. #include <vector>
  5. #include <QRect>
  6. #include <QColor>
  7. /* 示波器通道 */
  8. enum class OscChannel
  9. {
  10. CH_A = 0,
  11. CH_B,
  12. };
  13. /* 示波器通道耦合方式 */
  14. enum class OscChannelCoupling
  15. {
  16. AC = 0,
  17. DC,
  18. };
  19. /* 示波器采样率,目前就只要这些 */
  20. enum class OscSampleRate
  21. {
  22. SR_49KHZ = 0,
  23. SR_96KHZ,
  24. SR_781KHZ,
  25. SR_12_5MHZ,
  26. SR_100MHZ,
  27. };
  28. /* 示波器通道的输入档位 */
  29. enum class OscChannelRange
  30. {
  31. CR_100MV = 0,
  32. CR_250MV,
  33. CR_500MV,
  34. CR_1V,
  35. CR_2V5,
  36. CR_5V,
  37. CR_8V,
  38. };
  39. /* 触发方式 */
  40. enum class OscTriggerMode
  41. {
  42. TM_RISE = 0, /* 上升沿触发 */
  43. TM_DOWN, /* 下降沿触发 */
  44. TM_DOUBLE, /* 双边沿触发 */
  45. };
  46. /* 触发灵敏度 */
  47. enum class OscTriggerSensitivity
  48. {
  49. TS_LOW = 0, /* 低灵敏度 */
  50. TS_HIGH, /* 高灵敏度 */
  51. };
  52. struct EyeDataT
  53. {
  54. bool isEyeData;
  55. unsigned char value;
  56. EyeDataT() : isEyeData(false), value(0) {}
  57. EyeDataT(bool isOpen, unsigned char val) : isEyeData(isOpen), value(val) {}
  58. EyeDataT& operator=(const EyeDataT& data)
  59. {
  60. isEyeData = data.isEyeData;
  61. value = data.value;
  62. return *this;
  63. }
  64. };
  65. /* 眼图数据点 */
  66. struct EyeDataSample
  67. {
  68. int x; /* X坐标? */
  69. int y; /* Y坐标? */
  70. double fCnt; /* 颜色深浅? */
  71. int Cnt; /* */
  72. unsigned char data;
  73. EyeDataSample() : x(0), y(0), fCnt(0.0), Cnt(0), data(0) {}
  74. EyeDataSample(int x, int y, double fCnt, int Cnt, unsigned char data)
  75. : x(x), y(y), fCnt(fCnt), Cnt(Cnt), data(data) {}
  76. EyeDataSample& operator=(const EyeDataSample& data)
  77. {
  78. x = data.x;
  79. y = data.y;
  80. fCnt = data.fCnt;
  81. Cnt = data.Cnt;
  82. this->data = data.data;
  83. return *this;
  84. }
  85. };
  86. /* 类型重命名 */
  87. using Vec2D = std::vector<std::vector<EyeDataSample>>;
  88. /**
  89. * @brief 眼图数据
  90. *
  91. */
  92. class EyeDataMatrix
  93. {
  94. public:
  95. EyeDataMatrix();
  96. ~EyeDataMatrix() {}
  97. Vec2D dataMatrix;
  98. // EyeDataSample dataMatrix[1000][256];
  99. std::mutex mutexEyeData;
  100. void addData(int x, int y);
  101. void eyeStatisticalWeight();
  102. void eyeLessenTheBurden();
  103. std::shared_ptr<Vec2D> eyeZoomOut();
  104. private:
  105. double eyenWeightCoefficient = 0.99;
  106. bool eyeIsLessenTheBurden = true;
  107. double eyenWeightCoefficientMIN = 1E-06;
  108. };
  109. extern EyeDataMatrix g_eyeDataMatrix;
  110. /**
  111. * @brief 绘制到窗口的眼图数据
  112. * 总共有1000 * 245个数据点充满屏幕,每个数据点是个矩形
  113. * 每个数据点的颜色深浅由fCnt决定,该点的数据越多,像素颜色越深
  114. *
  115. */
  116. struct EyeMapDataSample
  117. {
  118. bool isDraw; /* 是否绘制 */
  119. int x;
  120. int y;
  121. int Count; /* 像素点的个数(颜色深度),这里限制为799,不知道为什么 */
  122. unsigned char data; /* 数据值 */
  123. QRect rect; /* 像素点的矩形区域 */
  124. QColor color; /* 颜色 */
  125. EyeMapDataSample() : isDraw(false), x(0), y(0), Count(0), data(0), color(255, 255, 255) {}
  126. EyeMapDataSample(EyeDataSample& data) : isDraw(false), x(data.x), y(data.y), Count(data.Cnt), data(data.data) {}
  127. EyeMapDataSample& operator=(const EyeMapDataSample& data) {
  128. x = data.x;
  129. y = data.y;
  130. Count = data.Count;
  131. isDraw = data.isDraw;
  132. rect = data.rect;
  133. return *this;
  134. }
  135. };
  136. using Vec2DMap = std::vector<std::vector<EyeMapDataSample>>;
  137. /**
  138. * @brief 眼图数据矩阵
  139. *
  140. */
  141. class EyeMapMatrix
  142. {
  143. public:
  144. EyeMapMatrix() : dataMatrix(1000, std::vector<EyeMapDataSample>(256)) {}
  145. ~EyeMapMatrix() {}
  146. Vec2DMap dataMatrix;
  147. std::mutex mutexEyeData;
  148. /* 初始化数据点 */
  149. void initEyeMapData(int width, int height);
  150. /* 拷贝数据到数组中 */
  151. void copyDataMatrix(Vec2D& data);
  152. /* 将Count数值与颜色对应 */
  153. void addColorBySample();
  154. };
  155. extern EyeMapMatrix g_eyeMapMatrix;
  156. #define OscParams OscilloscopeParameters::getInstance()
  157. /**
  158. * @brief 示波器全局设置,这是个单例类
  159. *
  160. */
  161. class OscilloscopeParameters
  162. {
  163. private:
  164. OscilloscopeParameters() {}
  165. OscilloscopeParameters(const OscilloscopeParameters&) = delete;
  166. OscilloscopeParameters& operator=(const OscilloscopeParameters&) = delete;
  167. public:
  168. ~OscilloscopeParameters() {}
  169. static OscilloscopeParameters& getInstance()
  170. {
  171. static OscilloscopeParameters instance;
  172. return instance;
  173. }
  174. /* 示波器相关参数 */
  175. int OscCurrentTimeScale = 100; /* 时间尺度,不知道啥意思,可能和采样率有关 */
  176. int OscOneGridTime = 1000; /* 每格子的时间(单位ns) */
  177. /* 显示相关 */
  178. int TimeGridNum = 10; /* 10个时间格子 */
  179. int VolatileGridNum = 10; /* 10个电压格子 */
  180. /* 其他参数 */
  181. const int dataNumPerPixar = 1; /* 这个是SetInfo的第一个参数,固定是1,在眼图中会使用 */
  182. };
  183. #endif /* GLOBALINFO_H */