123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- #ifndef _OSCDATAINFO_H_
- #define _OSCDATAINFO_H_
- #include <mutex>
- #include <vector>
- #include <QRect>
- #include <QColor>
- #include <QBrush>
- #include <QMap>
- #include "GlobalInfo.h"
- class OneOscilloscope;
- struct EyeDataT
- {
- bool isEyeData;
- unsigned char value;
- EyeDataT() : isEyeData(false), value(0) {}
- EyeDataT(bool isOpen, unsigned char val) : isEyeData(isOpen), value(val) {}
- EyeDataT& operator=(const EyeDataT& data)
- {
- isEyeData = data.isEyeData;
- value = data.value;
- return *this;
- }
- };
- /* 眼图数据点 */
- struct EyeDataSample
- {
- int x; /* X坐标? */
- int y; /* Y坐标? */
- double fCnt; /* 颜色深浅? */
- int Cnt; /* */
- unsigned char data;
- EyeDataSample() : x(0), y(0), fCnt(0.0), Cnt(0), data(0) {}
- EyeDataSample(int x, int y, double fCnt, int Cnt, unsigned char data)
- : x(x), y(y), fCnt(fCnt), Cnt(Cnt), data(data) {}
- EyeDataSample& operator=(const EyeDataSample& data)
- {
- x = data.x;
- y = data.y;
- fCnt = data.fCnt;
- Cnt = data.Cnt;
- this->data = data.data;
- return *this;
- }
- };
- /* 类型重命名 */
- using Vec2D = std::vector<std::vector<EyeDataSample>>;
- /**
- * @brief 眼图数据
- *
- */
- class EyeDataMatrix
- {
- public:
- EyeDataMatrix() : dataMatrix(g_HorPixel, std::vector<EyeDataSample>(g_VerPixel)) {}
- ~EyeDataMatrix() {}
- Vec2D dataMatrix;
- // EyeDataSample dataMatrix[g_HorPixel][256];
- std::mutex mutexEyeData;
-
- void initEyeData();
- void addData(int x, int y);
- void eyeStatisticalWeight();
- void eyeLessenTheBurden();
- std::shared_ptr<Vec2D> eyeZoomOut();
- private:
- double eyenWeightCoefficient = 0.99;
- bool eyeIsLessenTheBurden = true;
- double eyenWeightCoefficientMIN = 1E-06;
- };
- // extern EyeDataMatrix g_eyeDataMatrix;
- /**
- * @brief 绘制到窗口的眼图数据
- * 总共有g_HorPixel * 245个数据点充满屏幕,每个数据点是个矩形
- * 每个数据点的颜色深浅由fCnt决定,该点的数据越多,像素颜色越深
- *
- */
- struct EyeMapDataSample
- {
- bool isDraw; /* 是否绘制 */
- float x;
- float y;
- int Count; /* 像素点的个数(颜色深度),这里限制为799,不知道为什么 */
- unsigned char data; /* 数据值 */
- QRectF rect; /* 像素点的矩形区域 */
- QBrush brush; /* 颜色 */
- // EyeMapDataSample() : isDraw(false), x(0), y(0), Count(0), data(0), color(255, 255, 255) {}
- EyeMapDataSample() : isDraw(false), x(0), y(0), Count(0), data(0) {}
- EyeMapDataSample(EyeDataSample& data) : isDraw(false), x(data.x), y(data.y), Count(data.Cnt), data(data.data) {}
- EyeMapDataSample& operator=(const EyeMapDataSample& other) {
- x = other.x;
- y = other.y;
- Count = other.Count;
- isDraw = other.isDraw;
- rect = other.rect;
- data = other.data;
- brush = other.brush;
- return *this;
- }
- };
- using Vec2DMap = std::vector<std::vector<EyeMapDataSample>>;
- /**
- * @brief 眼图颜色矩阵
- *
- */
- class EyeColorMatrix
- {
- public:
- EyeColorMatrix() : dataMatrix(g_HorPixel, std::vector<EyeMapDataSample>(g_VerPixel)) {}
- ~EyeColorMatrix() {}
- /* 初始化数据点 */
- void initEyeMapData(int width, int height);
- void initEyeMapData();
- /* 拷贝数据到数组中 */
- void copyDataMatrix(Vec2D& data);
- /* 将Count数值与颜色对应 */
- void addColorBySample();
- /* 拷贝颜色数据到数组中 */
- void copyColorMatrix(Vec2DMap& data);
- public:
- Vec2DMap dataMatrix;
- std::mutex mutexEyeData;
- };
- #define OscParams OscilloscopeParameters::getInstance()
- /**
- * @brief 示波器全局设置,也包含这所有通道的数据指针
- * 单例模式
- *
- */
- class OscilloscopeParameters
- {
- private:
- OscilloscopeParameters() {}
- OscilloscopeParameters(const OscilloscopeParameters&) = delete;
- OscilloscopeParameters& operator=(const OscilloscopeParameters&) = delete;
- public:
- ~OscilloscopeParameters() {}
- static OscilloscopeParameters& getInstance()
- {
- static OscilloscopeParameters instance;
- return instance;
- }
- /* 示波器相关参数 */
- // int oneGridTime = 200; /* 一个时间格子的时间长度(单位ns) */
- // double SampleIntervalTime = 0; /* 采样点之间的时间间隔,单位ns(采样率的倒数,设置采样率的时候会设置) */
- /* 其他参数 */
- const int dataNumPerPixar = 1; /* 这个是SetInfo的第一个参数,固定是1,在眼图中会使用 */
- /* 眼图参数 */
- // int eyeMapWidth = g_HorPixel; /* 眼图x轴宽度(像素矩形的个数) */
- public:
-
- };
- /**
- * @brief 示波器全局数据,这里存储示波器实例和示波器需要传出的颜色矩阵数据
- *
- */
- #define GOscDataInfo OscilloscopeData::getInstance()
- class OscilloscopeData : public QObject
- {
- Q_OBJECT
- OscilloscopeData() {}
- OscilloscopeData(const OscilloscopeData&) = delete;
- OscilloscopeData& operator=(const OscilloscopeData&) = delete;
- public:
- ~OscilloscopeData();
- static OscilloscopeData& getInstance()
- {
- static OscilloscopeData instance;
- return instance;
- }
- /* 初始化示波器参数 */
- void initOscData();
- /* 获取示波器列表 */
- QMap<int, OneOscilloscope*>& getOsc() { return mapOsc; }
- /* 根据通道号查找示波器 */
- OneOscilloscope* findOsc(OscChnNum oscNum);
- /* 根据通道号设置电压范围 */
- void setVoltageRange(OscChnNum oscNum, OscVoltageRange range);
- /* 根据通道号设置时间刻度值 */
- void setTimeGridValue(OscChnNum oscNum, OscTimeGridValue value);
- /* 清空每个设备的数据矩阵 */
- void resetDevMatrix();
- /* 清空颜色矩阵 */
- // void resetColorMatrix(int width, int height);
- void resetColorMatrix();
- /* 暂停所有的采集 */
- void stopAllCapture();
- /* 开启所有的采集 */
- void startAllCapture();
- signals:
- void signal_updateOneEyeMap(int channel);
- /* 示波器离线了 */
- void signal_oscOffline(int oscNum);
- /* 示波器上线了 */
- void signal_oscOnline(int oscNum);
- private:
- /************ 数据相关 ************/
- /* 示波器类指针,int是示波器编号 */
- QMap<int, OneOscilloscope*> mapOsc;
- };
- #endif /* _OSCDATAINFO_H_ */
|