#ifndef _OSCDATAINFO_H_ #define _OSCDATAINFO_H_ #include #include #include #include #include #include #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>; /** * @brief 眼图数据 * */ class EyeDataMatrix { public: EyeDataMatrix() : dataMatrix(g_HorPixel, std::vector(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 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>; /** * @brief 眼图颜色矩阵 * */ class EyeColorMatrix { public: EyeColorMatrix() : dataMatrix(g_HorPixel, std::vector(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& 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 mapOsc; }; #endif /* _OSCDATAINFO_H_ */