| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916 | #pragma once#include <queue>#include <string>#include<map>using namespace std;#define Nan 0x7fc00000#define INVLID_LOCATION (0)//物理量类型。//注意:不同的物理量可以有相同的单位,只是物理应用场景不同。//根据物理量类型可以确定单位enum PHYSICAL_TYPE {	PTH_CUSTOM = 0,		//自定义类型。是一个json对象字符串	PTH_TEMP = 1,		//温度,℃	PTH_HUMIDITY = 2,	//湿度,RH	PTH_PRESSURE = 3,	//压力,mPa	PTH_ELECTRIC = 4,	//电流,mA	PTH_VOLTAGE = 5,	//电压,V	PTH_LIQUID = 6,		//液位,mm	PTH_DISTANCE = 7,	//距离,mm	PTH_DISPLACEMENT = 8,//位移,mm	PTH_POWER = 9,       //阻力,N	PTH_GAP = 10,        //缺口,mm	PTH_GONGLV = 11,	//功率	PTH_ACCELERATION = 12,//加速度	PTH_LUX = 13,		//光强	PTH_DISOLVED_OXYGEN = 14,//溶解氧	PTH_GONGLV_COS = 15,//功率因数	PTH_VIDEO = 16,//视频	PTH_VOICE = 17,//语音	PTH_AMOUNT = 18,//数量计数 默认个	PTH_SPEED = 19,//速度 km/h	PTH_LAST//始终保持在最后,用于记录类型总数};const CString PHYSICAL_TYPE_DESC[] = {	 _TEXT("自定义"),   _TEXT("温度"),   _TEXT("湿度"),	_TEXT("压力"),   _TEXT("电流"),   _TEXT("电压"),	_TEXT("液位"),   _TEXT("距离"),   _TEXT("位移"),	_TEXT("阻力"),   _TEXT("缺口"),   _TEXT("功率"),	_TEXT("加速度"), _TEXT("光强"),	  _TEXT("溶解氧"),	_TEXT("功率因数"), _TEXT("视频"),	  _TEXT("语音"),	 _TEXT("计数"), _TEXT("速度")};//不取一些一般人都不认识的英文了,此枚举统一用拼音//枚举值存配置文件,不可修改,向后添加enum MONITOR_OBJ_TYPE {	MOT_COMMON = 0,	MOT_PROJECT = 1, //监控服务	MOT_DaoCha = 2,//道岔	MOT_ZZJ = 3,//转辙机	MOT_QuDongDianLu = 4,//驱动电路	MOT_MJQ = 5,//密检器	MOT_STATION = 6, //站点		MOT_MP_GROUP = 99,//监测点组 //这个类型后期考虑废弃了	MOT_MP = 100,//监测点 看作某物理空间下的一个虚拟仪表 其中可进一步细分为“缺口监测点”、“阻力监测点”、“伤损指数监测点”等具体的监测点	MOT_RAIL_GROUP = 101,//铁轨组 例如 尖轨、心轨、翼轨等等	MOT_RAIL_PART = 102,//铁轨段 例如 尖轨下的某个区段等等	MOT_AMO = 200,//活动监测对象	MOT_MP_PROP = 301//监测点属性  虚拟仪表可以测量多项数据};namespace MO_TYPE {	const string project = "project";	const string station = "station";	const string daocha = "daocha";	const string zzj = "zzj";	const string qddl = "qddl";	const string mjq = "mjq";	const string mp = "mp";	const string rail_func = "rail_func";	const string rail_part = "rail_part";	const string mp_prop = "mp_prop";	const string mp_group = "mp_group";};const map<string, string> MO_TYPE_DESC = {	{MO_TYPE::project,"监控服务"},	{MO_TYPE::station,"站点"},	{MO_TYPE::daocha,"道岔"},	{MO_TYPE::zzj,"转辙机"},	{MO_TYPE::mp,"监测点"},	{MO_TYPE::rail_func,"功能铁轨"},	{MO_TYPE::rail_part,"铁轨区段"},	{MO_TYPE::mp_prop,"监测点属性"},	{MO_TYPE::mp_group,"监测点组"},	{MO_TYPE::qddl,"驱动电路"},	{MO_TYPE::mjq,"密检器"},	{to_string(MOT_PROJECT), "监控服务"},	{to_string(MOT_DaoCha), "道岔"},	{to_string(MOT_ZZJ), "转辙机"},	{to_string(MOT_QuDongDianLu), "驱动电路"},	{to_string(MOT_MJQ), "密检器"},	{to_string(MOT_STATION), "站点"},	{to_string(MOT_MP_GROUP), "监测点组"},	{to_string(MOT_MP), "监测点"},	{to_string(MOT_RAIL_GROUP), "铁轨组"},	{to_string(MOT_RAIL_PART), "铁轨段"},	{to_string(MOT_AMO), "活动监测对象"},	{to_string(MOT_MP_PROP), "监测点属性"},};//采集对象来自于一种采集设备,该采集设备专用于采集某一种监测对象,包含了约定的一组数据enum ACQ_OBJ_TYPE {	AOT_UNKNOWN = 0,	AOT_ZZJ_QDDL = 1,//驱动电路	AOT_ZZJ_ZHENGDONG = 2,//转辙机基座振动	AOT_ZZJ_ELECPARAM = 3,//转辙机电参数	AOT_ZZJ_POWER = 4,//扳动阻力	AOT_ZZJ_YY = 5,//扳动油压	AOT_JIAYOU_PIPE_PRESSURE = 6,	ACQ_LEFT_YOUYA = 7,//左转换油压	ACQ_RIGHT_YOUYA = 8,//右转换油压	ACQ_CHUAN_LEFT_YOUYA = 9,//串左转换油压	ACQ_CHUAN_RIGHT_YOUYA = 10,//串右转换油压	ACQ_FIRST_MOVE_PRESSURE = 11,//一动转换油压/阻力	ACQ_SECOND_MOVE_PRESSURE = 12,//二动转换油压/阻力	ACQ_THIRD_MOVE_PRESSURE = 13,//三动转换油压/阻力	ACQ_CROSS_GAP = 14,//过车缺口	ACQ_CROSS_MIETIE_GAP = 15,//过车密贴缺口	ACQ_CROSS_CHILI_GAP = 16,//过车斥离缺口	ACQ_CROSS_ZHENDONG = 17,//过车振动	ACQ_MOVE_MIETIE_GAP = 18,//转换密贴缺口	ACQ_MOVE_CHILI_GAP = 19,//转换斥离缺口	ACQ_LOAD_OVER_UNUSUAL = 20,//负载监测过载异常曲线	ACQ_LOAD_SHORT_UNUSUAL = 21,//负载监测短路异常曲线	ACQ_LOAD_FIRE_UNUSUAL = 22,//负载监测打火异常曲线	ACQ_LASTTYPE = 23,	ACQ_MOVE_CROSS_WEIYI = 24,  //扳动过车位移曲线 跟徐嘉庆定义调试};enum DATA_ATTRIBUTE_VAL_TYPE {	DAVT_STR,	DAVT_FLOAT,};//应用层协议类型enum APP_LAYER_PROTO_TYPE {	PROTOCOL_UNKNOWN = 0,	PROTOCOL_DSP,	PROTOCOL_JDSP,//基于json的dsp协议也可以套在dsp协议内	PROTOCOL_315,	PROTOCOL_JEP,	PROTOCOL_MODBUS_RTU,	PROTOCOL_WEIBO,	PROTOCOL_SIMPLE_AI,//仅用于信号灯单帧协议的测试通信	PROTOCOL_WEBSOCKET,};//数据传输类型enum class TRANSPORT_CONTROL_PROTOCOL {	TCR_UDP = 0x00,	TCR_TCP,};//传输层协议类型//目前包含应用层数据用Can数据包分包传输的3种方式enum TRANSFER_LAYER_PROTO_TYPE{	TLT_UNKNOWN = 0,	TLT_NONE,//没有传输层协议	TLT_CAN_LSPEED,//缺口,低速载波中继	TLT_CAN_WEIBO,//驱动电路,维博	TLT_CAN_SIGNAL,//仅用于信号灯单帧协议的测试通信	TLT_WEB_SOCKET,};//Can综合监测网关硬件的实现不是透传的。但软件的实现把与Can传感器的通信抽象成是通过透传网关的JEP协议通信enum COMM_GATEWAY_TYPE {	GW_UNKNOWN = 0,	GW_CAN_TRANSPARENT = 1,//Can透传中继,将发送给中继的数据包原样发给中继下端的设备	GW_CAN2JEP,//将Can包中的数据提取生成JEP数据包,发给设备;低速载波中继属于该类型	GW_JEP_TRANSPARENT,};struct DATA_ATTRIBUTE_CONF {	CString attribName;	DATA_ATTRIBUTE_VAL_TYPE attribValType;	std::vector<CString> attribValRange;};//数据属性一般是指数据采集时候的环境特征。因此采用attribute一词//property也用来表示属性,但一般表示对象的所有物品(原意为财产),因此选用attribute更精确struct DATA_ATTRIBUTE {	CString attribName;	CString attribVal;	float attribfVal;	DATA_ATTRIBUTE_VAL_TYPE GetType() {		if (attribfVal == Nan)		{			return DAVT_STR;		}		return DAVT_FLOAT;	}	DATA_ATTRIBUTE()	{		attribfVal = Nan;	}};//数据类型enum DATA_TYPE {	DT_CUSTOM = 0,//自定义,表示为1个协议约定的json对象	DT_ANALOG = 1,//模拟量	DT_SWITCH = 2,//开关量	DT_VIDEO = 3,//视频	DT_LAST//始终保持在最后,用于记录类型总数};namespace sap {	const string mp_data_type_label[] = { _TEXT("自定义"), _TEXT("模拟量"), _TEXT("开关量"), _TEXT("视频"), _TEXT("声音") };}//const CString g_strAcqTypeDescribe[] =//{//	_TEXT("未指定"), _TEXT("扳动采集"), _TEXT("周期采集"), _TEXT("日常采集"),//	_TEXT("即时采集"), _TEXT("过车采集"), _TEXT("全站采集"), _TEXT("微机监测请求")//};//全局数据通道struct GLOBAL_DATA_CHANNEL{	CString strID;	CString strLink_MP;	GLOBAL_DATA_CHANNEL()	{		strID = "";		strLink_MP = "";	}};//设备的物理通信地址。如果是网关下设备,则是ip+id,如果是有ip的设备,则id=""无效struct EQP_COMM_ADDR {	CString strIP;//设备通信地址	CString id;//设备ID	APP_LAYER_PROTO_TYPE proto;	TRANSFER_LAYER_PROTO_TYPE tlProto;	int AcqDevice_Type = -1;   //根据设备类型(JHD_EPQ_TYPE)来决定他的CAN数据收发处理.与tlProto属于同种作用,后续不再抽象tlProto所代表的概念	COMM_GATEWAY_TYPE gwType;	TRANSPORT_CONTROL_PROTOCOL transport_mode = TRANSPORT_CONTROL_PROTOCOL::TCR_UDP; //id不为空 表示低速, 低速才有采用	uint16_t port = 4011; //传输端口	SOCKET sock;	int GetID_int() {		return _ttoi(id);	}	EQP_COMM_ADDR() {		strIP = "";		id = "";//0表示无效,ip即是设备地址		proto = PROTOCOL_UNKNOWN;		gwType = GW_UNKNOWN;		tlProto = TLT_NONE;		sock = 0;	}	EQP_COMM_ADDR(CString a, CString b) : strIP(a), id(b) {		proto = PROTOCOL_UNKNOWN;		gwType = GW_UNKNOWN;		tlProto = TLT_NONE;	}	BOOL FromString(CString str)	{		int iPos = str.Find('/');		if (iPos < 0)		{			strIP = str;		}		else		{			strIP = str.Left(iPos);			id = str.Mid(iPos + 1, str.GetLength() - iPos - 1);		}		return TRUE;	}	CString ToString()	{		CString str;		if (id == "")		{			str = strIP;		}		else {			str.Format(_T("%s/%s"), strIP, id);		}		return str;	}	BOOL IsValid()	{		if (strIP.GetLength() > 0)			return TRUE;		return FALSE;	}	BOOL operator==(const EQP_COMM_ADDR& right)	{		if (strIP.Compare(right.strIP) == 0 && id == right.id)		{			return TRUE;		}		return FALSE;	}	friend bool operator<(const EQP_COMM_ADDR& left, const EQP_COMM_ADDR& right) {		int ret = left.strIP.Compare(right.strIP);		if (ret < 0) return true;		else if (ret == 0 && left.id < right.id) return true;		else return false;	}};typedef enum recvPktType {	RECV_PKT_UNKNOWN = -1,//未知	RECV_PKT_UNCONF = 0,//未配置数据包	RECV_PKT_ASYN,//通知包	RECV_PKT_SYNC//响应包}RecvPktType;typedef enum EPACKET_DIR {//表示请求, 响应, 通知	REQ = 0,	RESP,	NOTIFY}ePktDir;struct PKT_DATA {	BYTE* m_DataBuf;	int m_iDataBufLen;	APP_LAYER_PROTO_TYPE proto;	EQP_COMM_ADDR addr;	recvPktType dealType;	CString m_strCmdName;//命令名称	CString m_strCmdContent;//命令内容概要	CString m_strPktDetail;//命令包详细解析信息	//表示请求, 响应, 通知	ePktDir m_ePktDir;//数据包方向或类型	virtual CString GetCmdID() { return _T(""); };	virtual BOOL UnPack(LPVOID pBuf, int iBufLen, BOOL bGetCmdInfo = FALSE) { return TRUE; };	virtual CString GetPktDesc() { return _T(""); };//包详细描述信息	virtual CString GetCmdName() { return _T(""); };	virtual BOOL UnPack() { return 0; };	PKT_DATA(BYTE* p, int l)	{		m_DataBuf = new BYTE[l];		memcpy(m_DataBuf, p, l);		m_iDataBufLen = l;	}	PKT_DATA()	{		m_DataBuf = NULL;		m_iDataBufLen = 0;		dealType = RECV_PKT_UNKNOWN;	}	~PKT_DATA()	{		if (m_DataBuf)			delete []m_DataBuf;	}	PKT_DATA& operator=(const PKT_DATA& pd)	{		if (this == &pd) return *this;//自己不能拷贝		this->m_iDataBufLen = pd.m_iDataBufLen;		this->proto = pd.proto;		this->addr = pd.addr;		if (pd.m_iDataBufLen > 0)		{			if (this->m_DataBuf)				delete this->m_DataBuf;			this->m_DataBuf = new BYTE[pd.m_iDataBufLen];			memcpy(this->m_DataBuf, pd.m_DataBuf, pd.m_iDataBufLen);		}		else		{			this->m_DataBuf = NULL;		}		return *this;	}};struct PktQueue {	HANDLE m_mutex;	std::queue<PKT_DATA*> queueBufPacket;	PktQueue() {		m_mutex = CreateMutex(NULL, FALSE, NULL);	}	~PktQueue() {		if (m_mutex) {			CloseHandle(m_mutex);			m_mutex = NULL;		}		while (!queueBufPacket.empty()) {			PKT_DATA* pkt = queueBufPacket.front();			queueBufPacket.pop();			delete pkt;		}	}	bool Lock() {		if (m_mutex) {			WaitForSingleObject(m_mutex, INFINITE);			return true;		}		return false;	}	void Unlock() {		if (m_mutex) ReleaseMutex(m_mutex);	}	void Clear();	PKT_DATA* Pop()	{		PKT_DATA* pkt = NULL;		Lock();		if (!queueBufPacket.empty()) {			pkt = queueBufPacket.front();			queueBufPacket.pop();			Unlock();			return pkt;		}		else {			Unlock();			return NULL;		}	}	inline size_t size()	{		return queueBufPacket.size();	}	void Push(PKT_DATA* pkt)	{		Lock();		queueBufPacket.push(pkt);		Unlock();	}};struct PIC_INFO {	CString strJpgPath;	int offsetFlag;//偏移标志	float offsetVal;//偏移值	float gapVal;//缺口值	float standardVal;//标准值	int iW;	int iH;	PIC_INFO() {		strJpgPath = "";		offsetFlag = 0;		offsetVal = 0;		gapVal = 0;		standardVal = 0;		iW = 0;		iH = 0;	}};struct REQ_PARAM {	int iRetryCount;	int iWaitTime; //mm单位	CString strLogMsgWhenSend;	CString strCmdID; //命令的标识,用来判断响应和请求是否匹配	REQ_PARAM();};enum UI_STYLE {	DB_FOR_MP = 0,	DB_FOR_ZZJ};//微机监测扳动信号计算结果定反位标志: lutao 2016.12.28//	1.程序启动,标志 “未知”//	2.周期采集识别成功,更新标志位 “定位”或者“反位”//	3.收到扳动信号,如果标志位不是“未知”,则在扳动结束信号时更新该标记位定反位位置//	4.采集识别成功后, 比对识别结果定反位 和 计算结果定反位, 如果不一致,记录错误信息enum DAOCHA_POSITION {	MP_UNKNOWN = 0,	MP_FIX,	MP_INVERT,	MP_FIX2INVERT,	MP_INVERT2FIX,};//WIF 下发的道岔状态enum class DAOCHA_STATUS_WIF : int8_t{	DSW_UNKNOWN = -1,	DSW_FIX = 0x00,	//定位	DSW_INVERT = 0x01, //反位	DSW_MOVING = 0x02, //扳动中	DSW_MOVED = 0x03, //扳动结束	DSW_STRAIGHT_LEFT = 0x06,	//直向左侧	DSW_STRAIGHT_RIGHT = 0x07,	//直向右侧	DSW_STRAIGHT = 0x08,	//直向};struct PLANE_TOPO_VIEW {	//配置	BOOL bShow;	float fX;//相对于左下角的坐标	float fY;	float fW;	float fH;	CString shape;//取值为rect,circle,text,pic	CString pic; //图标图片的路径	CString strDisplayName;	int iFontSize;	//运行时	BOOL bSel;//在界面上是否选中	BOOL bCalWH;//计算尺寸	RECT moRc;  //mo在视图上的矩形位置	void Init()	{		bShow = TRUE;		fX = 50;//相对于左下角的坐标		fY = 50;		fW = 2;		fH = 3;		shape = "rect";		iFontSize = 20;		bSel = FALSE;		bCalWH = FALSE;	}	PLANE_TOPO_VIEW()	{		Init();	}};enum ALARM_EVENT_TYPE {	AET_RECOVER = 0, //报警恢复	AET_OCCUR = 1, //报警产生};enum ALARM_LEVEL {	AL_UNKNOWN,	AL_NORMAL,	AL_PRE_ALARM,	AL_ALARM, //不区分等级	AL_ALARM_L4,	AL_ALARM_L3,	AL_ALARM_L2,	AL_ALARM_L1, //一级等级最高};//Can总线协议//连续bit转换成字节,高位在前  ":"符号为取位域//取位域时,先取低位,再取高位struct NET_CAN_ORG  //size = 5 bytes{	BYTE DLC : 4;	BYTE CAN : 4;	BYTE ID29_25 : 5;  //ID高位在前.是这个字节中的低5位	BYTE Invalid : 3;  //29个bit,4个字节中有3个bit无效	BYTE ID24_17;	BYTE ID16_9;	BYTE ID8_1;};/*比特序(bit order)字节序是一个对象中的多个字节之间的顺序问题,比特序就是一个字节中的8个比特位(bit)之间的顺序问题。一般情况下系统的比特序和字节序是保持一致的。一个字节由8个bit组成,这8个bit也存在如何排序的情况,跟字节序类似的有最高有效比特位、最低有效比特位。比特序1 0 0 1 0 0 1 0在大端系统中最高有效比特位为1、最低有效比特位为0,字节的值为0x92。在小端系统中最高、最低有效比特位则相反为0、1,字节的值为0x49。跟字节序类似,要想保持一个字节值不变那么就要使系统能正确的识别最高、最低有效比特位。*/struct NET_CAN_HEAD_V2//size = 5 bytes{	BYTE DLC : 4;   //DLC 每帧字节数(1-8)	BYTE r0 : 2;   //bit4-5	BYTE RTR : 1;  //bit6	BYTE IDE : 1;  //bit7=1表示扩展帧=0表示标准帧	BYTE Address1 : 1;	BYTE B : 1;       //广播   0:普通帧  1:广播帧	BYTE G : 1;       //优先级  0:高级  1:低级	BYTE MS : 1;      //M/S   0:自主帧 1:应答帧	BYTE DIR : 1;     //DIR   0:下发  1:上送	BYTE R0 : 3;      //头部预留3位置	BYTE Type : 3;    //Type   100,4 自主单帧   000,0 应答单帧  011,3,非结束多帧  010,2,结束多帧	BYTE Address : 5;//地址	BYTE InxFrame;//Index of frame  从0开始编号	BYTE SumFrame;//Sum of frame	NET_CAN_HEAD_V2()	{		r0 = 0;		RTR = 0;		IDE = 1;		DLC = 0;		Address1 = 0;		B = 0;		G = 0;		MS = 0;		DIR = 0x0;		R0 = 0;		Type = 0;		Address = 0;		SumFrame = 0x0;		InxFrame = 0x0;	}};struct CAN_PKT_V2//size = 13字节{	NET_CAN_HEAD_V2 sHead;	BYTE arrData[8];	CAN_PKT_V2()	{		ZeroMemory(arrData, sizeof(arrData));	}	int getID()	{		BYTE bAddress = ((sHead.Address1) << 5) | (sHead.Address);		return (int)bAddress;	}};struct NET_CAN_HEAD_XIANGYUAN//size =3 bytes{	BYTE DLC :4;		//每帧字节数	BYTE r0 : 2;	BYTE RTR : 1;		//帧类型,0数据帧,1远程帧	BYTE FF : 1;		//帧格式,0标准帧,扩展帧	BYTE Temp1;	BYTE Temp2;	BYTE Address : 5;	//采集机地址	BYTE G : 1;			//优先级,0高级,1低级	BYTE MS : 1;		//帧性质,0自主帧,1应答帧	BYTE DIR : 1;		//DIR方向位,0:上位机到模块,1:模块到上位机	BYTE r1 : 5;			BYTE Type : 3;		//帧类型,100自主单帧,000应答单帧,011非结束多帧,010结束多帧	NET_CAN_HEAD_XIANGYUAN()	{		DLC = 0;		r0 = 0;		RTR = 0;		FF = 0;		Address = 0;		G = 0;		MS = 0;		DIR = 0;		r1 = 0;		Type = 4;		Temp1 = 0;		Temp2 = 0;	}};struct CAN_PKT_XIANGYUAN//size = 13字节{	NET_CAN_HEAD_XIANGYUAN sHead;	BYTE arrData[8];	CAN_PKT_XIANGYUAN()	{		ZeroMemory(arrData, sizeof(arrData));	}	int getID()	{		return (int)sHead.Address;	}};enum ALARM_STATUS {	AS_NORMAL = 0,	AS_AlarmHigh,	AS_ForeAlarmHigh,	AS_ForeAlarmLow,	AS_AlarmLow,};struct ALARM_LIMIT_CONF {	float AlarmHigh;		//告警上限	float ForeAlarmHigh;	//预警上限	float FormAlarmLow;		//预警下限	float AlarmLow;			//告警下限	float GetConf(ALARM_STATUS as)	{		if (as == AS_AlarmHigh)		{			return AlarmHigh;		}		else if (as == AS_ForeAlarmHigh)		{			return ForeAlarmHigh;		}		else if (as == AS_ForeAlarmLow)		{			return FormAlarmLow;		}		else if (as == AS_AlarmLow)		{			return AlarmLow;		}		else		{			return 0;		}	}	ALARM_LIMIT_CONF()	{		AlarmHigh = .0;		ForeAlarmHigh = .0;		FormAlarmLow = .0;		AlarmLow = .0;	};};typedef struct CGroupInfo_GWWY{	bool bSensorKBGiven;//出厂时是否给出传感器KB值	ALARM_LIMIT_CONF alcGuiju;//轨距	ALARM_LIMIT_CONF alcPaxing;//爬行	ALARM_LIMIT_CONF alcMitie;//密贴	ALARM_LIMIT_CONF alcJBGHY;//基本轨横移	//工务参数 相关基准值	float m_standard_gj;	float m_standard_mt;	float m_standard_px;	float m_standard_jbghy;	float m_standard_kc;	CGroupInfo_GWWY()	{		bSensorKBGiven = 0;		alcGuiju.AlarmHigh = 18;		alcGuiju.ForeAlarmHigh = 15;		alcGuiju.FormAlarmLow = -15;		alcGuiju.AlarmLow = -18;		alcPaxing.AlarmHigh = 18;		alcPaxing.ForeAlarmHigh = 15;		alcPaxing.FormAlarmLow = -15;		alcPaxing.AlarmLow = -18;		alcMitie.AlarmHigh = 18;		alcMitie.ForeAlarmHigh = 15;		alcMitie.FormAlarmLow = -15;		alcMitie.AlarmLow = -18;		alcJBGHY.AlarmHigh = 18;		alcJBGHY.ForeAlarmHigh = 15;		alcJBGHY.FormAlarmLow = -15;		alcJBGHY.AlarmLow = -18;		m_standard_gj = 1435.0;		m_standard_mt = .0;		m_standard_px = .0;		m_standard_jbghy=.0;		m_standard_kc = 160.0;	}}CGroupInfo_GWWY, * PCGroupInfo_GWWY;//应用服务器基类 Application Layer Serverclass CALServer {public:	virtual BOOL OnRecvAppLayerData(BYTE* pData, int iLen, void* pCltInfo) { return 0; }	virtual BOOL OnRecvAppLayerPkt(BYTE* pData, int iLen, void* pCltInfo) { return 0; }};struct APP_LAYER_CLIENT {	int iTLProto; //应用层的传输层协议 可以是websocket  websocket相对于 tcpServer 属于应用层数据。相对于jdsp,属于传输层协议	int iALProto;	APP_LAYER_CLIENT()	{		iTLProto = 0;		iALProto = 0;	}};//传输层服务器基类。Transportation Layer Server//当JDSP协议 套用在 DSP或者315中使用时 ,315服务被看作是JDSP服务的传输层服务//该类被AppLayerServer调用,因此参数中的clientInfo都是appClientInfoclass CTLServer {public:	virtual bool SendAppLayerData(BYTE* pData, int iLen, void* pAppLayerCltInfo) { return 0; }	virtual vector<void*> GetSessionList() { vector<void*> v; return v; }};//OPEC体系class CControlExecutor {public:	virtual BOOL ExecuteControl(CString strCtrlType,/*in*/vector<DATA_ATTRIBUTE>& ctrlParam, /*out*/vector<DATA_ATTRIBUTE>& executeInfo) { return 0; };};class CAcqEqp : public CControlExecutor{public:	virtual BOOL ExecuteControl(CString strCtrlType,/*in*/vector<DATA_ATTRIBUTE>& ctrlParam, /*out*/vector<DATA_ATTRIBUTE>& executeInfo) { return 0; };};struct MP_ALARM_CONF_HIGHLOW_LIMIT {	BOOL Enable_AH;			//告警启用	float alm_High;			//告警上限	BOOL Enable_PAH;		//预警启用	float prealm_High;		//预警上限	BOOL Enable_PAL;		//预警启用	float prealm_Low;		//预警下限	BOOL Enable_AL;			//告警启用	float alm_Low;			//告警下限	int highLevel;			//告警上限等级	int lowLevel;			//告警下限等级	MP_ALARM_CONF_HIGHLOW_LIMIT()	{		Enable_AH = 0;		Enable_PAH = 0;		Enable_PAL = 0;		Enable_AL = 0;		alm_High = 2;		prealm_High = 1;		prealm_Low = -1;		alm_Low = -2;		highLevel = 0;		lowLevel = 0;	}};struct MP_ATTRIB {	CString m_strName;//监测点名称	CString m_strUnit;//单位	CString m_strPhysicalType;	string m_strAlias;	CString m_strCalFormula;	CString low_limit;//值有效范围-低限	CString high_limit;//值有效范围-高限};//监测点数据呈现方式:类似于伤损监测中采集的单条曲线数据和单频点数据,两个监测点:区段1&70KHZenum MP_DISPLAYDATATYPE{	eMP_DPT_UNKNOWN = 0,	eMP_DPT_POINT,	eMP_DPT_CURVE,};const CString MP_DISPLAYDATATYPE_DESC[] = {	_TEXT(""),_TEXT("静态数据"),_TEXT("曲线数据"),};//zgw 伤损算法相关struct  CPoint2D {	int m_x = 0;	int m_y = 0;	CPoint2D() {	}	CPoint2D(int x, int y) {		m_x = x;		m_y = y;	}};struct  CPoint2DInfo {	CPoint2D m_pt2d;	string m_type="peak"; //peak valley	CPoint2DInfo(int x, int y, string type) {		m_pt2d.m_x = x;		m_pt2d.m_y = y;		m_type = type;	}};////
 |