| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 | #ifndef __HJDATADEFINE__#define __HJDATADEFINE__#include "WinDef.h"#include <vector>enum class E_ZL_PROTOCAL : uint8_t{	ZL_KEEP,		 //心跳	ZL_MO,           //监测对象数据  //定时同步	ZL_MP,			 //监测点数据	ZL_RESIST_DATA,       //阻力数据	ZL_RESIST_REAL,  //下发实时阻力数据开始	ZL_TEMP_HUMI,		 //温湿度数据	ZL_ALARM_SET,	 //报警设置	ZL_ALARM_DATA,   //报警数据	ZL_ALARM_ACK,	 //报警受理	ZL_ALARM_HANDLE, //报警处理	ZL_SVG,			 //SVG同步	ZL_REFER,		 //参考同步	ZL_ALARM_UNACK, //未确认报警数据	ZL_MOVE,         //扳动数据	DL_ALARM_ACK = 0x50,	 //下发报警受理	DL_ALARM_HANDLE, //下发报警受理	DL_SYNC,         //下发同步	DL_SUB_NOTIFY,    //下发订阅实时	ZL_UNREALIZED,   //未实现};enum class OPT_TYPE{	OPT_SYNC = 0x00,  //同步帧	OPT_ADD = 0x01,  //增加帧	OPT_DEL = 0x02, //删除帧	OPT_UPDATE = 0x03, //修改帧	OPT_SELECT = 0x04, //查询帧	OPT_RECV = 0x05,   //应答帧};#pragma pack(push, 1)typedef struct tagOrDataInfo{	uint8_t readORset : 1;      //0 read 1 set	uint8_t requestORresponse : 1;     //0  request  1 response	uint8_t failORsucc : 1;    // 0  fail   1 succ	uint8_t source : 2;       // 0 web   1  vaservice  2  dataservice  3 super	OPT_TYPE opt : 3;           // 1. 增加	tagOrDataInfo() {};	tagOrDataInfo(bool readORset1, bool requestORresponse1, bool failORsucc1, uint8_t source1, OPT_TYPE opt1) 		: readORset(readORset1), requestORresponse(requestORresponse1), failORsucc(failORsucc1), source(source1), opt(opt1){};}OR_DATA_INFO, * LPOR_DATA_INFO;typedef struct tagHjDataHead2{	DWORD64 head;		//头部标识	DWORD len;			//数据内容的长度,等于包长度 – 21 – 2,后面数据长度为9 + len + 2	BYTE ver : 4;		//协议版本	BYTE res : 4;	E_ZL_PROTOCAL protocol;	//数据包的协议代码	BYTE subno;		//下级的编号	如果是数据中心发往数据服务,则为0	BYTE subpacknum;	//分包总数,0和1表示不分包	bool subpackend : 1;  //分包结束标记	BYTE subpackno : 7;  //分包编号	DWORD	packno;		//数据包编号	OR_DATA_INFO datainfo;}HJDATAHEAD2, *LPHJDATAHEAD2;typedef struct tagAllDISKSTATUS{	char	diskName;				//磁盘数量	int		total;					//所有磁盘总容量G	int		ofFree;				    //所有磁盘剩余容量G}AllDISKSTATUS, *LPAllDISKSTATUS;typedef struct tagGpuInfo{	char	name[20];	WORD    utilizationRate;   //千分制 GPU使用率	WORD    memusage;   //千分制 GPU显存使用率	WORD	temperature;	//0.1度  GPU温度	BYTE	decUtilization;		//解码使用率	BYTE    encUtilization;		//编码使用率	byte    reser[4];			//预留}GPUINFO;#define MAX_GPU_NUM     4					// 监控的GPU个数(NVIDIA定义的最多GPU个数是64,这里最多只监控4个)typedef struct _DISPLAY_INFO{	int         nGpuCount;                  // Gpu个数	int         nGpuUsages[MAX_GPU_NUM];    // Gpu占用率	DWORD       dwTotalMemory;              // 总显存大小(KB)	DWORD       dwFreeMemory;               // 空闲显存大小(KB)}DISPLAY_INFO;#define MAX_DISK_NUM    10typedef struct SERVER_STATUS{	DWORD64 osRunTime;	DWORD backTime;	WORD cpuUsage;   //千分制	GPUINFO gpuUsage[MAX_GPU_NUM];	WORD memUsage; // 千分制	AllDISKSTATUS diskUsage[MAX_DISK_NUM];	WORD cputemp;  //CPU温度  摄氏度	char ipAddr[16];}SERVERSTATUS, *HJSERVERSTATUS;enum class eDEVICE_TYPE : uint8_t{	DT_ALL = 0x00,	DT_GT_EDGE = 0x01, //高瞳盒子	DT_HJ_DOG = 0x02,  //慧景软件狗	DT_HJ_VA = 0x03,  //慧景VA};typedef struct tagDeviceDiscover{	eDEVICE_TYPE type = eDEVICE_TYPE::DT_ALL;	uint8_t r[31] = { 0 };};#pragma  pack(pop)class CHjDataConver{public:	//新协议	static int conver_sendpack(LPBYTE dest, LPBYTE src, DWORD srclen, BYTE subno, DWORD packno, E_ZL_PROTOCAL protocol, OR_DATA_INFO datainfo, BYTE ver = 0x01)	{		static DWORD64 headid = 0xABAAAAAAAAAAAAAA;		HJDATAHEAD2 head;		memset(&head, 0, sizeof(HJDATAHEAD2));		memcpy(&head.head, &headid, sizeof(DWORD64));		head.subno = subno;		head.len = htonl(srclen);		head.packno = htonl(packno);		head.protocol = protocol;		head.datainfo = datainfo;		head.ver = ver;		int j = 0;		memcpy(dest, &head, sizeof(HJDATAHEAD2));		j += sizeof(HJDATAHEAD2);		memcpy(dest + j, src, srclen);		j += srclen;		//check		dest[j++] = 0x00;		//end		dest[j++] = 0xab;		return j;	}		//收到一个完整数据包后校验数据	static bool conver_recvpack(LPBYTE pBuf, int& len)	{		if (pBuf == NULL) return false;		if (len	< sizeof(HJDATAHEAD2)) return false;		static DWORD64 headid = 0xABAAAAAAAAAAAAAA;		if ((*(DWORD64*)pBuf) != headid) return false;		if (pBuf[len - 1] != 0xab) return false;		BYTE check = 0;		if (pBuf[len - 2] != check) return false;		auto pHead = (HJDATAHEAD2*)pBuf;		pHead->len = htonl(pHead->len);		pHead->packno = htonl(pHead->packno);		return true;	}};//阻力零值补偿template<typename T>bool OffsetPowerCurve(T& mapData, int offset){	if (!offset || mapData.empty())		return false;	auto tFirst = mapData.begin()->first;	int count = mapData.size();	int avr = 0, sum = 0;	int cnt = 0;	//计算前1秒内的平均值	for (auto i = mapData.begin(); i != mapData.end() && i->first < tFirst + 1000; ++i, ++cnt)	{		sum += i->second;		avr = sum / (cnt + 1);	}	if (avr == 0) return false;	int zero = avr;	for (auto i = mapData.begin(); i != mapData.end(); ++i)	{		i->second = (WORD)(short)((short)i->second - zero + offset);	}	return true;}#endif
 |