GlobalInfo.h 5.5 KB

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