OscDataInfo.h 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. #ifndef _OSCDATAINFO_H_
  2. #define _OSCDATAINFO_H_
  3. #include <mutex>
  4. #include <vector>
  5. #include <QRect>
  6. #include <QColor>
  7. #include <QBrush>
  8. #include <QMap>
  9. #include "GlobalInfo.h"
  10. class OneOscilloscope;
  11. struct EyeDataT
  12. {
  13. bool isEyeData;
  14. unsigned char value;
  15. EyeDataT() : isEyeData(false), value(0) {}
  16. EyeDataT(bool isOpen, unsigned char val) : isEyeData(isOpen), value(val) {}
  17. EyeDataT& operator=(const EyeDataT& data)
  18. {
  19. isEyeData = data.isEyeData;
  20. value = data.value;
  21. return *this;
  22. }
  23. };
  24. /* 眼图数据点 */
  25. struct EyeDataSample
  26. {
  27. int x; /* X坐标? */
  28. int y; /* Y坐标? */
  29. double fCnt; /* 颜色深浅? */
  30. int Cnt; /* */
  31. unsigned char data;
  32. EyeDataSample() : x(0), y(0), fCnt(0.0), Cnt(0), data(0) {}
  33. EyeDataSample(int x, int y, double fCnt, int Cnt, unsigned char data)
  34. : x(x), y(y), fCnt(fCnt), Cnt(Cnt), data(data) {}
  35. EyeDataSample& operator=(const EyeDataSample& data)
  36. {
  37. x = data.x;
  38. y = data.y;
  39. fCnt = data.fCnt;
  40. Cnt = data.Cnt;
  41. this->data = data.data;
  42. return *this;
  43. }
  44. };
  45. /* 类型重命名 */
  46. using Vec2D = std::vector<std::vector<EyeDataSample>>;
  47. /**
  48. * @brief 眼图数据
  49. *
  50. */
  51. class EyeDataMatrix
  52. {
  53. public:
  54. EyeDataMatrix() : dataMatrix(g_HorPixel, std::vector<EyeDataSample>(g_VerPixel)) {}
  55. ~EyeDataMatrix() {}
  56. Vec2D dataMatrix;
  57. // EyeDataSample dataMatrix[g_HorPixel][256];
  58. std::mutex mutexEyeData;
  59. void initEyeData();
  60. void addData(int x, int y);
  61. void eyeStatisticalWeight();
  62. void eyeLessenTheBurden();
  63. std::shared_ptr<Vec2D> eyeZoomOut();
  64. private:
  65. double eyenWeightCoefficient = 0.99;
  66. bool eyeIsLessenTheBurden = true;
  67. double eyenWeightCoefficientMIN = 1E-06;
  68. };
  69. // extern EyeDataMatrix g_eyeDataMatrix;
  70. /**
  71. * @brief 绘制到窗口的眼图数据
  72. * 总共有g_HorPixel * 245个数据点充满屏幕,每个数据点是个矩形
  73. * 每个数据点的颜色深浅由fCnt决定,该点的数据越多,像素颜色越深
  74. *
  75. */
  76. struct EyeMapDataSample
  77. {
  78. bool isDraw; /* 是否绘制 */
  79. float x;
  80. float y;
  81. int Count; /* 像素点的个数(颜色深度),这里限制为799,不知道为什么 */
  82. unsigned char data; /* 数据值 */
  83. QRectF rect; /* 像素点的矩形区域 */
  84. QBrush brush; /* 颜色 */
  85. // EyeMapDataSample() : isDraw(false), x(0), y(0), Count(0), data(0), color(255, 255, 255) {}
  86. EyeMapDataSample() : isDraw(false), x(0), y(0), Count(0), data(0) {}
  87. EyeMapDataSample(EyeDataSample& data) : isDraw(false), x(data.x), y(data.y), Count(data.Cnt), data(data.data) {}
  88. EyeMapDataSample& operator=(const EyeMapDataSample& other) {
  89. x = other.x;
  90. y = other.y;
  91. Count = other.Count;
  92. isDraw = other.isDraw;
  93. rect = other.rect;
  94. data = other.data;
  95. brush = other.brush;
  96. return *this;
  97. }
  98. };
  99. using Vec2DMap = std::vector<std::vector<EyeMapDataSample>>;
  100. /**
  101. * @brief 眼图颜色矩阵
  102. *
  103. */
  104. class EyeColorMatrix
  105. {
  106. public:
  107. EyeColorMatrix() : dataMatrix(g_HorPixel, std::vector<EyeMapDataSample>(g_VerPixel)) {}
  108. ~EyeColorMatrix() {}
  109. /* 初始化数据点 */
  110. void initEyeMapData(int width, int height);
  111. void initEyeMapData();
  112. /* 拷贝数据到数组中 */
  113. void copyDataMatrix(Vec2D& data);
  114. /* 将Count数值与颜色对应 */
  115. void addColorBySample();
  116. /* 拷贝颜色数据到数组中 */
  117. void copyColorMatrix(Vec2DMap& data);
  118. public:
  119. Vec2DMap dataMatrix;
  120. std::mutex mutexEyeData;
  121. };
  122. #define OscParams OscilloscopeParameters::getInstance()
  123. /**
  124. * @brief 示波器全局设置,也包含这所有通道的数据指针
  125. * 单例模式
  126. *
  127. */
  128. class OscilloscopeParameters
  129. {
  130. private:
  131. OscilloscopeParameters() {}
  132. OscilloscopeParameters(const OscilloscopeParameters&) = delete;
  133. OscilloscopeParameters& operator=(const OscilloscopeParameters&) = delete;
  134. public:
  135. ~OscilloscopeParameters() {}
  136. static OscilloscopeParameters& getInstance()
  137. {
  138. static OscilloscopeParameters instance;
  139. return instance;
  140. }
  141. /* 示波器相关参数 */
  142. // int oneGridTime = 200; /* 一个时间格子的时间长度(单位ns) */
  143. // double SampleIntervalTime = 0; /* 采样点之间的时间间隔,单位ns(采样率的倒数,设置采样率的时候会设置) */
  144. /* 其他参数 */
  145. const int dataNumPerPixar = 1; /* 这个是SetInfo的第一个参数,固定是1,在眼图中会使用 */
  146. /* 眼图参数 */
  147. // int eyeMapWidth = g_HorPixel; /* 眼图x轴宽度(像素矩形的个数) */
  148. public:
  149. };
  150. /**
  151. * @brief 示波器全局数据,这里存储示波器实例和示波器需要传出的颜色矩阵数据
  152. *
  153. */
  154. #define GOscDataInfo OscilloscopeData::getInstance()
  155. class OscilloscopeData : public QObject
  156. {
  157. Q_OBJECT
  158. OscilloscopeData() {}
  159. OscilloscopeData(const OscilloscopeData&) = delete;
  160. OscilloscopeData& operator=(const OscilloscopeData&) = delete;
  161. public:
  162. ~OscilloscopeData();
  163. static OscilloscopeData& getInstance()
  164. {
  165. static OscilloscopeData instance;
  166. return instance;
  167. }
  168. /* 初始化示波器参数 */
  169. void initOscData();
  170. /* 获取示波器列表 */
  171. QMap<int, OneOscilloscope*>& getOsc() { return mapOsc; }
  172. /* 根据通道号查找示波器 */
  173. OneOscilloscope* findOsc(OscChnNum oscNum);
  174. /* 根据通道号设置电压范围 */
  175. void setVoltageRange(OscChnNum oscNum, OscVoltageRange range);
  176. /* 根据通道号设置时间刻度值 */
  177. void setTimeGridValue(OscChnNum oscNum, OscTimeGridValue value);
  178. /* 清空每个设备的数据矩阵 */
  179. void resetDevMatrix();
  180. /* 清空颜色矩阵 */
  181. // void resetColorMatrix(int width, int height);
  182. void resetColorMatrix();
  183. /* 暂停所有的采集 */
  184. void stopAllCapture();
  185. /* 开启所有的采集 */
  186. void startAllCapture();
  187. signals:
  188. void signal_updateOneEyeMap(int channel);
  189. /* 示波器离线了 */
  190. void signal_oscOffline(int oscNum);
  191. /* 示波器上线了 */
  192. void signal_oscOnline(int oscNum);
  193. private:
  194. /************ 数据相关 ************/
  195. /* 示波器类指针,int是示波器编号 */
  196. QMap<int, OneOscilloscope*> mapOsc;
  197. };
  198. #endif /* _OSCDATAINFO_H_ */