JHDGlobalDefine.h 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916
  1. #pragma once
  2. #include <queue>
  3. #include <string>
  4. #include<map>
  5. using namespace std;
  6. #define Nan 0x7fc00000
  7. #define INVLID_LOCATION (0)
  8. //物理量类型。
  9. //注意:不同的物理量可以有相同的单位,只是物理应用场景不同。
  10. //根据物理量类型可以确定单位
  11. enum PHYSICAL_TYPE {
  12. PTH_CUSTOM = 0, //自定义类型。是一个json对象字符串
  13. PTH_TEMP = 1, //温度,℃
  14. PTH_HUMIDITY = 2, //湿度,RH
  15. PTH_PRESSURE = 3, //压力,mPa
  16. PTH_ELECTRIC = 4, //电流,mA
  17. PTH_VOLTAGE = 5, //电压,V
  18. PTH_LIQUID = 6, //液位,mm
  19. PTH_DISTANCE = 7, //距离,mm
  20. PTH_DISPLACEMENT = 8,//位移,mm
  21. PTH_POWER = 9, //阻力,N
  22. PTH_GAP = 10, //缺口,mm
  23. PTH_GONGLV = 11, //功率
  24. PTH_ACCELERATION = 12,//加速度
  25. PTH_LUX = 13, //光强
  26. PTH_DISOLVED_OXYGEN = 14,//溶解氧
  27. PTH_GONGLV_COS = 15,//功率因数
  28. PTH_VIDEO = 16,//视频
  29. PTH_VOICE = 17,//语音
  30. PTH_AMOUNT = 18,//数量计数 默认个
  31. PTH_SPEED = 19,//速度 km/h
  32. PTH_LAST//始终保持在最后,用于记录类型总数
  33. };
  34. const CString PHYSICAL_TYPE_DESC[] = {
  35. _TEXT("自定义"), _TEXT("温度"), _TEXT("湿度"),
  36. _TEXT("压力"), _TEXT("电流"), _TEXT("电压"),
  37. _TEXT("液位"), _TEXT("距离"), _TEXT("位移"),
  38. _TEXT("阻力"), _TEXT("缺口"), _TEXT("功率"),
  39. _TEXT("加速度"), _TEXT("光强"), _TEXT("溶解氧"),
  40. _TEXT("功率因数"), _TEXT("视频"), _TEXT("语音"),
  41. _TEXT("计数"), _TEXT("速度")
  42. };
  43. //不取一些一般人都不认识的英文了,此枚举统一用拼音
  44. //枚举值存配置文件,不可修改,向后添加
  45. enum MONITOR_OBJ_TYPE {
  46. MOT_COMMON = 0,
  47. MOT_PROJECT = 1, //监控服务
  48. MOT_DaoCha = 2,//道岔
  49. MOT_ZZJ = 3,//转辙机
  50. MOT_QuDongDianLu = 4,//驱动电路
  51. MOT_MJQ = 5,//密检器
  52. MOT_STATION = 6, //站点
  53. MOT_MP_GROUP = 99,//监测点组 //这个类型后期考虑废弃了
  54. MOT_MP = 100,//监测点 看作某物理空间下的一个虚拟仪表 其中可进一步细分为“缺口监测点”、“阻力监测点”、“伤损指数监测点”等具体的监测点
  55. MOT_RAIL_GROUP = 101,//铁轨组 例如 尖轨、心轨、翼轨等等
  56. MOT_RAIL_PART = 102,//铁轨段 例如 尖轨下的某个区段等等
  57. MOT_AMO = 200,//活动监测对象
  58. MOT_MP_PROP = 301//监测点属性 虚拟仪表可以测量多项数据
  59. };
  60. namespace MO_TYPE {
  61. const string project = "project";
  62. const string station = "station";
  63. const string daocha = "daocha";
  64. const string zzj = "zzj";
  65. const string qddl = "qddl";
  66. const string mjq = "mjq";
  67. const string mp = "mp";
  68. const string rail_func = "rail_func";
  69. const string rail_part = "rail_part";
  70. const string mp_prop = "mp_prop";
  71. const string mp_group = "mp_group";
  72. };
  73. const map<string, string> MO_TYPE_DESC = {
  74. {MO_TYPE::project,"监控服务"},
  75. {MO_TYPE::station,"站点"},
  76. {MO_TYPE::daocha,"道岔"},
  77. {MO_TYPE::zzj,"转辙机"},
  78. {MO_TYPE::mp,"监测点"},
  79. {MO_TYPE::rail_func,"功能铁轨"},
  80. {MO_TYPE::rail_part,"铁轨区段"},
  81. {MO_TYPE::mp_prop,"监测点属性"},
  82. {MO_TYPE::mp_group,"监测点组"},
  83. {MO_TYPE::qddl,"驱动电路"},
  84. {MO_TYPE::mjq,"密检器"},
  85. {to_string(MOT_PROJECT), "监控服务"},
  86. {to_string(MOT_DaoCha), "道岔"},
  87. {to_string(MOT_ZZJ), "转辙机"},
  88. {to_string(MOT_QuDongDianLu), "驱动电路"},
  89. {to_string(MOT_MJQ), "密检器"},
  90. {to_string(MOT_STATION), "站点"},
  91. {to_string(MOT_MP_GROUP), "监测点组"},
  92. {to_string(MOT_MP), "监测点"},
  93. {to_string(MOT_RAIL_GROUP), "铁轨组"},
  94. {to_string(MOT_RAIL_PART), "铁轨段"},
  95. {to_string(MOT_AMO), "活动监测对象"},
  96. {to_string(MOT_MP_PROP), "监测点属性"},
  97. };
  98. //采集对象来自于一种采集设备,该采集设备专用于采集某一种监测对象,包含了约定的一组数据
  99. enum ACQ_OBJ_TYPE {
  100. AOT_UNKNOWN = 0,
  101. AOT_ZZJ_QDDL = 1,//驱动电路
  102. AOT_ZZJ_ZHENGDONG = 2,//转辙机基座振动
  103. AOT_ZZJ_ELECPARAM = 3,//转辙机电参数
  104. AOT_ZZJ_POWER = 4,//扳动阻力
  105. AOT_ZZJ_YY = 5,//扳动油压
  106. AOT_JIAYOU_PIPE_PRESSURE = 6,
  107. ACQ_LEFT_YOUYA = 7,//左转换油压
  108. ACQ_RIGHT_YOUYA = 8,//右转换油压
  109. ACQ_CHUAN_LEFT_YOUYA = 9,//串左转换油压
  110. ACQ_CHUAN_RIGHT_YOUYA = 10,//串右转换油压
  111. ACQ_FIRST_MOVE_PRESSURE = 11,//一动转换油压/阻力
  112. ACQ_SECOND_MOVE_PRESSURE = 12,//二动转换油压/阻力
  113. ACQ_THIRD_MOVE_PRESSURE = 13,//三动转换油压/阻力
  114. ACQ_CROSS_GAP = 14,//过车缺口
  115. ACQ_CROSS_MIETIE_GAP = 15,//过车密贴缺口
  116. ACQ_CROSS_CHILI_GAP = 16,//过车斥离缺口
  117. ACQ_CROSS_ZHENDONG = 17,//过车振动
  118. ACQ_MOVE_MIETIE_GAP = 18,//转换密贴缺口
  119. ACQ_MOVE_CHILI_GAP = 19,//转换斥离缺口
  120. ACQ_LOAD_OVER_UNUSUAL = 20,//负载监测过载异常曲线
  121. ACQ_LOAD_SHORT_UNUSUAL = 21,//负载监测短路异常曲线
  122. ACQ_LOAD_FIRE_UNUSUAL = 22,//负载监测打火异常曲线
  123. ACQ_LASTTYPE = 23,
  124. ACQ_MOVE_CROSS_WEIYI = 24, //扳动过车位移曲线 跟徐嘉庆定义调试
  125. };
  126. enum DATA_ATTRIBUTE_VAL_TYPE {
  127. DAVT_STR,
  128. DAVT_FLOAT,
  129. };
  130. //应用层协议类型
  131. enum APP_LAYER_PROTO_TYPE {
  132. PROTOCOL_UNKNOWN = 0,
  133. PROTOCOL_DSP,
  134. PROTOCOL_JDSP,//基于json的dsp协议也可以套在dsp协议内
  135. PROTOCOL_315,
  136. PROTOCOL_JEP,
  137. PROTOCOL_MODBUS_RTU,
  138. PROTOCOL_WEIBO,
  139. PROTOCOL_SIMPLE_AI,//仅用于信号灯单帧协议的测试通信
  140. PROTOCOL_WEBSOCKET,
  141. };
  142. //数据传输类型
  143. enum class TRANSPORT_CONTROL_PROTOCOL {
  144. TCR_UDP = 0x00,
  145. TCR_TCP,
  146. };
  147. //传输层协议类型
  148. //目前包含应用层数据用Can数据包分包传输的3种方式
  149. enum TRANSFER_LAYER_PROTO_TYPE
  150. {
  151. TLT_UNKNOWN = 0,
  152. TLT_NONE,//没有传输层协议
  153. TLT_CAN_LSPEED,//缺口,低速载波中继
  154. TLT_CAN_WEIBO,//驱动电路,维博
  155. TLT_CAN_SIGNAL,//仅用于信号灯单帧协议的测试通信
  156. TLT_WEB_SOCKET,
  157. };
  158. //Can综合监测网关硬件的实现不是透传的。但软件的实现把与Can传感器的通信抽象成是通过透传网关的JEP协议通信
  159. enum COMM_GATEWAY_TYPE {
  160. GW_UNKNOWN = 0,
  161. GW_CAN_TRANSPARENT = 1,//Can透传中继,将发送给中继的数据包原样发给中继下端的设备
  162. GW_CAN2JEP,//将Can包中的数据提取生成JEP数据包,发给设备;低速载波中继属于该类型
  163. GW_JEP_TRANSPARENT,
  164. };
  165. struct DATA_ATTRIBUTE_CONF {
  166. CString attribName;
  167. DATA_ATTRIBUTE_VAL_TYPE attribValType;
  168. std::vector<CString> attribValRange;
  169. };
  170. //数据属性一般是指数据采集时候的环境特征。因此采用attribute一词
  171. //property也用来表示属性,但一般表示对象的所有物品(原意为财产),因此选用attribute更精确
  172. struct DATA_ATTRIBUTE {
  173. CString attribName;
  174. CString attribVal;
  175. float attribfVal;
  176. DATA_ATTRIBUTE_VAL_TYPE GetType() {
  177. if (attribfVal == Nan)
  178. {
  179. return DAVT_STR;
  180. }
  181. return DAVT_FLOAT;
  182. }
  183. DATA_ATTRIBUTE()
  184. {
  185. attribfVal = Nan;
  186. }
  187. };
  188. //数据类型
  189. enum DATA_TYPE {
  190. DT_CUSTOM = 0,//自定义,表示为1个协议约定的json对象
  191. DT_ANALOG = 1,//模拟量
  192. DT_SWITCH = 2,//开关量
  193. DT_VIDEO = 3,//视频
  194. DT_LAST//始终保持在最后,用于记录类型总数
  195. };
  196. namespace sap {
  197. const string mp_data_type_label[] = { _TEXT("自定义"), _TEXT("模拟量"), _TEXT("开关量"), _TEXT("视频"), _TEXT("声音") };
  198. }
  199. //const CString g_strAcqTypeDescribe[] =
  200. //{
  201. // _TEXT("未指定"), _TEXT("扳动采集"), _TEXT("周期采集"), _TEXT("日常采集"),
  202. // _TEXT("即时采集"), _TEXT("过车采集"), _TEXT("全站采集"), _TEXT("微机监测请求")
  203. //};
  204. //全局数据通道
  205. struct GLOBAL_DATA_CHANNEL
  206. {
  207. CString strID;
  208. CString strLink_MP;
  209. GLOBAL_DATA_CHANNEL()
  210. {
  211. strID = "";
  212. strLink_MP = "";
  213. }
  214. };
  215. //设备的物理通信地址。如果是网关下设备,则是ip+id,如果是有ip的设备,则id=""无效
  216. struct EQP_COMM_ADDR {
  217. CString strIP;//设备通信地址
  218. CString id;//设备ID
  219. APP_LAYER_PROTO_TYPE proto;
  220. TRANSFER_LAYER_PROTO_TYPE tlProto;
  221. int AcqDevice_Type = -1; //根据设备类型(JHD_EPQ_TYPE)来决定他的CAN数据收发处理.与tlProto属于同种作用,后续不再抽象tlProto所代表的概念
  222. COMM_GATEWAY_TYPE gwType;
  223. TRANSPORT_CONTROL_PROTOCOL transport_mode = TRANSPORT_CONTROL_PROTOCOL::TCR_UDP; //id不为空 表示低速, 低速才有采用
  224. uint16_t port = 4011; //传输端口
  225. SOCKET sock;
  226. int GetID_int() {
  227. return _ttoi(id);
  228. }
  229. EQP_COMM_ADDR() {
  230. strIP = "";
  231. id = "";//0表示无效,ip即是设备地址
  232. proto = PROTOCOL_UNKNOWN;
  233. gwType = GW_UNKNOWN;
  234. tlProto = TLT_NONE;
  235. sock = 0;
  236. }
  237. EQP_COMM_ADDR(CString a, CString b) : strIP(a), id(b) {
  238. proto = PROTOCOL_UNKNOWN;
  239. gwType = GW_UNKNOWN;
  240. tlProto = TLT_NONE;
  241. }
  242. BOOL FromString(CString str)
  243. {
  244. int iPos = str.Find('/');
  245. if (iPos < 0)
  246. {
  247. strIP = str;
  248. }
  249. else
  250. {
  251. strIP = str.Left(iPos);
  252. id = str.Mid(iPos + 1, str.GetLength() - iPos - 1);
  253. }
  254. return TRUE;
  255. }
  256. CString ToString()
  257. {
  258. CString str;
  259. if (id == "")
  260. {
  261. str = strIP;
  262. }
  263. else {
  264. str.Format(_T("%s/%s"), strIP, id);
  265. }
  266. return str;
  267. }
  268. BOOL IsValid()
  269. {
  270. if (strIP.GetLength() > 0)
  271. return TRUE;
  272. return FALSE;
  273. }
  274. BOOL operator==(const EQP_COMM_ADDR& right)
  275. {
  276. if (strIP.Compare(right.strIP) == 0 && id == right.id)
  277. {
  278. return TRUE;
  279. }
  280. return FALSE;
  281. }
  282. friend bool operator<(const EQP_COMM_ADDR& left, const EQP_COMM_ADDR& right) {
  283. int ret = left.strIP.Compare(right.strIP);
  284. if (ret < 0) return true;
  285. else if (ret == 0 && left.id < right.id) return true;
  286. else return false;
  287. }
  288. };
  289. typedef enum recvPktType {
  290. RECV_PKT_UNKNOWN = -1,//未知
  291. RECV_PKT_UNCONF = 0,//未配置数据包
  292. RECV_PKT_ASYN,//通知包
  293. RECV_PKT_SYNC//响应包
  294. }RecvPktType;
  295. typedef enum EPACKET_DIR {//表示请求, 响应, 通知
  296. REQ = 0,
  297. RESP,
  298. NOTIFY
  299. }ePktDir;
  300. struct PKT_DATA {
  301. BYTE* m_DataBuf;
  302. int m_iDataBufLen;
  303. APP_LAYER_PROTO_TYPE proto;
  304. EQP_COMM_ADDR addr;
  305. recvPktType dealType;
  306. CString m_strCmdName;//命令名称
  307. CString m_strCmdContent;//命令内容概要
  308. CString m_strPktDetail;//命令包详细解析信息
  309. //表示请求, 响应, 通知
  310. ePktDir m_ePktDir;//数据包方向或类型
  311. virtual CString GetCmdID() { return _T(""); };
  312. virtual BOOL UnPack(LPVOID pBuf, int iBufLen, BOOL bGetCmdInfo = FALSE) { return TRUE; };
  313. virtual CString GetPktDesc() { return _T(""); };//包详细描述信息
  314. virtual CString GetCmdName() { return _T(""); };
  315. virtual BOOL UnPack() { return 0; };
  316. PKT_DATA(BYTE* p, int l)
  317. {
  318. m_DataBuf = new BYTE[l];
  319. memcpy(m_DataBuf, p, l);
  320. m_iDataBufLen = l;
  321. }
  322. PKT_DATA()
  323. {
  324. m_DataBuf = NULL;
  325. m_iDataBufLen = 0;
  326. dealType = RECV_PKT_UNKNOWN;
  327. }
  328. ~PKT_DATA()
  329. {
  330. if (m_DataBuf)
  331. delete []m_DataBuf;
  332. }
  333. PKT_DATA& operator=(const PKT_DATA& pd)
  334. {
  335. if (this == &pd) return *this;//自己不能拷贝
  336. this->m_iDataBufLen = pd.m_iDataBufLen;
  337. this->proto = pd.proto;
  338. this->addr = pd.addr;
  339. if (pd.m_iDataBufLen > 0)
  340. {
  341. if (this->m_DataBuf)
  342. delete this->m_DataBuf;
  343. this->m_DataBuf = new BYTE[pd.m_iDataBufLen];
  344. memcpy(this->m_DataBuf, pd.m_DataBuf, pd.m_iDataBufLen);
  345. }
  346. else
  347. {
  348. this->m_DataBuf = NULL;
  349. }
  350. return *this;
  351. }
  352. };
  353. struct PktQueue {
  354. HANDLE m_mutex;
  355. std::queue<PKT_DATA*> queueBufPacket;
  356. PktQueue() {
  357. m_mutex = CreateMutex(NULL, FALSE, NULL);
  358. }
  359. ~PktQueue() {
  360. if (m_mutex) {
  361. CloseHandle(m_mutex);
  362. m_mutex = NULL;
  363. }
  364. while (!queueBufPacket.empty()) {
  365. PKT_DATA* pkt = queueBufPacket.front();
  366. queueBufPacket.pop();
  367. delete pkt;
  368. }
  369. }
  370. bool Lock() {
  371. if (m_mutex) {
  372. WaitForSingleObject(m_mutex, INFINITE);
  373. return true;
  374. }
  375. return false;
  376. }
  377. void Unlock() {
  378. if (m_mutex) ReleaseMutex(m_mutex);
  379. }
  380. void Clear();
  381. PKT_DATA* Pop()
  382. {
  383. PKT_DATA* pkt = NULL;
  384. Lock();
  385. if (!queueBufPacket.empty()) {
  386. pkt = queueBufPacket.front();
  387. queueBufPacket.pop();
  388. Unlock();
  389. return pkt;
  390. }
  391. else {
  392. Unlock();
  393. return NULL;
  394. }
  395. }
  396. inline size_t size()
  397. {
  398. return queueBufPacket.size();
  399. }
  400. void Push(PKT_DATA* pkt)
  401. {
  402. Lock();
  403. queueBufPacket.push(pkt);
  404. Unlock();
  405. }
  406. };
  407. struct PIC_INFO {
  408. CString strJpgPath;
  409. int offsetFlag;//偏移标志
  410. float offsetVal;//偏移值
  411. float gapVal;//缺口值
  412. float standardVal;//标准值
  413. int iW;
  414. int iH;
  415. PIC_INFO() {
  416. strJpgPath = "";
  417. offsetFlag = 0;
  418. offsetVal = 0;
  419. gapVal = 0;
  420. standardVal = 0;
  421. iW = 0;
  422. iH = 0;
  423. }
  424. };
  425. struct REQ_PARAM {
  426. int iRetryCount;
  427. int iWaitTime; //mm单位
  428. CString strLogMsgWhenSend;
  429. CString strCmdID; //命令的标识,用来判断响应和请求是否匹配
  430. REQ_PARAM();
  431. };
  432. enum UI_STYLE {
  433. DB_FOR_MP = 0,
  434. DB_FOR_ZZJ
  435. };
  436. //微机监测扳动信号计算结果定反位标志: lutao 2016.12.28
  437. // 1.程序启动,标志 “未知”
  438. // 2.周期采集识别成功,更新标志位 “定位”或者“反位”
  439. // 3.收到扳动信号,如果标志位不是“未知”,则在扳动结束信号时更新该标记位定反位位置
  440. // 4.采集识别成功后, 比对识别结果定反位 和 计算结果定反位, 如果不一致,记录错误信息
  441. enum DAOCHA_POSITION {
  442. MP_UNKNOWN = 0,
  443. MP_FIX,
  444. MP_INVERT,
  445. MP_FIX2INVERT,
  446. MP_INVERT2FIX,
  447. };
  448. //WIF 下发的道岔状态
  449. enum class DAOCHA_STATUS_WIF : int8_t
  450. {
  451. DSW_UNKNOWN = -1,
  452. DSW_FIX = 0x00, //定位
  453. DSW_INVERT = 0x01, //反位
  454. DSW_MOVING = 0x02, //扳动中
  455. DSW_MOVED = 0x03, //扳动结束
  456. DSW_STRAIGHT_LEFT = 0x06, //直向左侧
  457. DSW_STRAIGHT_RIGHT = 0x07, //直向右侧
  458. DSW_STRAIGHT = 0x08, //直向
  459. };
  460. struct PLANE_TOPO_VIEW {
  461. //配置
  462. BOOL bShow;
  463. float fX;//相对于左下角的坐标
  464. float fY;
  465. float fW;
  466. float fH;
  467. CString shape;//取值为rect,circle,text,pic
  468. CString pic; //图标图片的路径
  469. CString strDisplayName;
  470. int iFontSize;
  471. //运行时
  472. BOOL bSel;//在界面上是否选中
  473. BOOL bCalWH;//计算尺寸
  474. RECT moRc; //mo在视图上的矩形位置
  475. void Init()
  476. {
  477. bShow = TRUE;
  478. fX = 50;//相对于左下角的坐标
  479. fY = 50;
  480. fW = 2;
  481. fH = 3;
  482. shape = "rect";
  483. iFontSize = 20;
  484. bSel = FALSE;
  485. bCalWH = FALSE;
  486. }
  487. PLANE_TOPO_VIEW()
  488. {
  489. Init();
  490. }
  491. };
  492. enum ALARM_EVENT_TYPE {
  493. AET_RECOVER = 0, //报警恢复
  494. AET_OCCUR = 1, //报警产生
  495. };
  496. enum ALARM_LEVEL {
  497. AL_UNKNOWN,
  498. AL_NORMAL,
  499. AL_PRE_ALARM,
  500. AL_ALARM, //不区分等级
  501. AL_ALARM_L4,
  502. AL_ALARM_L3,
  503. AL_ALARM_L2,
  504. AL_ALARM_L1, //一级等级最高
  505. };
  506. //Can总线协议
  507. //连续bit转换成字节,高位在前 ":"符号为取位域
  508. //取位域时,先取低位,再取高位
  509. struct NET_CAN_ORG //size = 5 bytes
  510. {
  511. BYTE DLC : 4;
  512. BYTE CAN : 4;
  513. BYTE ID29_25 : 5; //ID高位在前.是这个字节中的低5位
  514. BYTE Invalid : 3; //29个bit,4个字节中有3个bit无效
  515. BYTE ID24_17;
  516. BYTE ID16_9;
  517. BYTE ID8_1;
  518. };
  519. /*
  520. 比特序(bit order)
  521. 字节序是一个对象中的多个字节之间的顺序问题,比特序就是一个字节中的8个比特位(bit)之间的顺序问题。一般情况下系统的比特序和字节序是保持一致的。
  522. 一个字节由8个bit组成,这8个bit也存在如何排序的情况,跟字节序类似的有最高有效比特位、最低有效比特位。
  523. 比特序1 0 0 1 0 0 1 0在大端系统中最高有效比特位为1、最低有效比特位为0,字节的值为0x92。在小端系统中最高、最低有效比特位则相反为0、1,字节的值为0x49。
  524. 跟字节序类似,要想保持一个字节值不变那么就要使系统能正确的识别最高、最低有效比特位。
  525. */
  526. struct NET_CAN_HEAD_V2//size = 5 bytes
  527. {
  528. BYTE DLC : 4; //DLC 每帧字节数(1-8)
  529. BYTE r0 : 2; //bit4-5
  530. BYTE RTR : 1; //bit6
  531. BYTE IDE : 1; //bit7=1表示扩展帧=0表示标准帧
  532. BYTE Address1 : 1;
  533. BYTE B : 1; //广播 0:普通帧 1:广播帧
  534. BYTE G : 1; //优先级 0:高级 1:低级
  535. BYTE MS : 1; //M/S 0:自主帧 1:应答帧
  536. BYTE DIR : 1; //DIR 0:下发 1:上送
  537. BYTE R0 : 3; //头部预留3位置
  538. BYTE Type : 3; //Type 100,4 自主单帧 000,0 应答单帧 011,3,非结束多帧 010,2,结束多帧
  539. BYTE Address : 5;//地址
  540. BYTE InxFrame;//Index of frame 从0开始编号
  541. BYTE SumFrame;//Sum of frame
  542. NET_CAN_HEAD_V2()
  543. {
  544. r0 = 0;
  545. RTR = 0;
  546. IDE = 1;
  547. DLC = 0;
  548. Address1 = 0;
  549. B = 0;
  550. G = 0;
  551. MS = 0;
  552. DIR = 0x0;
  553. R0 = 0;
  554. Type = 0;
  555. Address = 0;
  556. SumFrame = 0x0;
  557. InxFrame = 0x0;
  558. }
  559. };
  560. struct CAN_PKT_V2//size = 13字节
  561. {
  562. NET_CAN_HEAD_V2 sHead;
  563. BYTE arrData[8];
  564. CAN_PKT_V2()
  565. {
  566. ZeroMemory(arrData, sizeof(arrData));
  567. }
  568. int getID()
  569. {
  570. BYTE bAddress = ((sHead.Address1) << 5) | (sHead.Address);
  571. return (int)bAddress;
  572. }
  573. };
  574. struct NET_CAN_HEAD_XIANGYUAN//size =3 bytes
  575. {
  576. BYTE DLC :4; //每帧字节数
  577. BYTE r0 : 2;
  578. BYTE RTR : 1; //帧类型,0数据帧,1远程帧
  579. BYTE FF : 1; //帧格式,0标准帧,扩展帧
  580. BYTE Temp1;
  581. BYTE Temp2;
  582. BYTE Address : 5; //采集机地址
  583. BYTE G : 1; //优先级,0高级,1低级
  584. BYTE MS : 1; //帧性质,0自主帧,1应答帧
  585. BYTE DIR : 1; //DIR方向位,0:上位机到模块,1:模块到上位机
  586. BYTE r1 : 5;
  587. BYTE Type : 3; //帧类型,100自主单帧,000应答单帧,011非结束多帧,010结束多帧
  588. NET_CAN_HEAD_XIANGYUAN()
  589. {
  590. DLC = 0;
  591. r0 = 0;
  592. RTR = 0;
  593. FF = 0;
  594. Address = 0;
  595. G = 0;
  596. MS = 0;
  597. DIR = 0;
  598. r1 = 0;
  599. Type = 4;
  600. Temp1 = 0;
  601. Temp2 = 0;
  602. }
  603. };
  604. struct CAN_PKT_XIANGYUAN//size = 13字节
  605. {
  606. NET_CAN_HEAD_XIANGYUAN sHead;
  607. BYTE arrData[8];
  608. CAN_PKT_XIANGYUAN()
  609. {
  610. ZeroMemory(arrData, sizeof(arrData));
  611. }
  612. int getID()
  613. {
  614. return (int)sHead.Address;
  615. }
  616. };
  617. enum ALARM_STATUS {
  618. AS_NORMAL = 0,
  619. AS_AlarmHigh,
  620. AS_ForeAlarmHigh,
  621. AS_ForeAlarmLow,
  622. AS_AlarmLow,
  623. };
  624. struct ALARM_LIMIT_CONF {
  625. float AlarmHigh; //告警上限
  626. float ForeAlarmHigh; //预警上限
  627. float FormAlarmLow; //预警下限
  628. float AlarmLow; //告警下限
  629. float GetConf(ALARM_STATUS as)
  630. {
  631. if (as == AS_AlarmHigh)
  632. {
  633. return AlarmHigh;
  634. }
  635. else if (as == AS_ForeAlarmHigh)
  636. {
  637. return ForeAlarmHigh;
  638. }
  639. else if (as == AS_ForeAlarmLow)
  640. {
  641. return FormAlarmLow;
  642. }
  643. else if (as == AS_AlarmLow)
  644. {
  645. return AlarmLow;
  646. }
  647. else
  648. {
  649. return 0;
  650. }
  651. }
  652. ALARM_LIMIT_CONF()
  653. {
  654. AlarmHigh = .0;
  655. ForeAlarmHigh = .0;
  656. FormAlarmLow = .0;
  657. AlarmLow = .0;
  658. };
  659. };
  660. typedef struct CGroupInfo_GWWY
  661. {
  662. bool bSensorKBGiven;//出厂时是否给出传感器KB值
  663. ALARM_LIMIT_CONF alcGuiju;//轨距
  664. ALARM_LIMIT_CONF alcPaxing;//爬行
  665. ALARM_LIMIT_CONF alcMitie;//密贴
  666. ALARM_LIMIT_CONF alcJBGHY;//基本轨横移
  667. //工务参数 相关基准值
  668. float m_standard_gj;
  669. float m_standard_mt;
  670. float m_standard_px;
  671. float m_standard_jbghy;
  672. float m_standard_kc;
  673. CGroupInfo_GWWY()
  674. {
  675. bSensorKBGiven = 0;
  676. alcGuiju.AlarmHigh = 18;
  677. alcGuiju.ForeAlarmHigh = 15;
  678. alcGuiju.FormAlarmLow = -15;
  679. alcGuiju.AlarmLow = -18;
  680. alcPaxing.AlarmHigh = 18;
  681. alcPaxing.ForeAlarmHigh = 15;
  682. alcPaxing.FormAlarmLow = -15;
  683. alcPaxing.AlarmLow = -18;
  684. alcMitie.AlarmHigh = 18;
  685. alcMitie.ForeAlarmHigh = 15;
  686. alcMitie.FormAlarmLow = -15;
  687. alcMitie.AlarmLow = -18;
  688. alcJBGHY.AlarmHigh = 18;
  689. alcJBGHY.ForeAlarmHigh = 15;
  690. alcJBGHY.FormAlarmLow = -15;
  691. alcJBGHY.AlarmLow = -18;
  692. m_standard_gj = 1435.0;
  693. m_standard_mt = .0;
  694. m_standard_px = .0;
  695. m_standard_jbghy=.0;
  696. m_standard_kc = 160.0;
  697. }
  698. }CGroupInfo_GWWY, * PCGroupInfo_GWWY;
  699. //应用服务器基类 Application Layer Server
  700. class CALServer {
  701. public:
  702. virtual BOOL OnRecvAppLayerData(BYTE* pData, int iLen, void* pCltInfo) { return 0; }
  703. virtual BOOL OnRecvAppLayerPkt(BYTE* pData, int iLen, void* pCltInfo) { return 0; }
  704. };
  705. struct APP_LAYER_CLIENT {
  706. int iTLProto; //应用层的传输层协议 可以是websocket websocket相对于 tcpServer 属于应用层数据。相对于jdsp,属于传输层协议
  707. int iALProto;
  708. APP_LAYER_CLIENT()
  709. {
  710. iTLProto = 0;
  711. iALProto = 0;
  712. }
  713. };
  714. //传输层服务器基类。Transportation Layer Server
  715. //当JDSP协议 套用在 DSP或者315中使用时 ,315服务被看作是JDSP服务的传输层服务
  716. //该类被AppLayerServer调用,因此参数中的clientInfo都是appClientInfo
  717. class CTLServer {
  718. public:
  719. virtual bool SendAppLayerData(BYTE* pData, int iLen, void* pAppLayerCltInfo) { return 0; }
  720. virtual vector<void*> GetSessionList() { vector<void*> v; return v; }
  721. };
  722. //OPEC体系
  723. class CControlExecutor {
  724. public:
  725. virtual BOOL ExecuteControl(CString strCtrlType,/*in*/vector<DATA_ATTRIBUTE>& ctrlParam, /*out*/vector<DATA_ATTRIBUTE>& executeInfo) { return 0; };
  726. };
  727. class CAcqEqp : public CControlExecutor
  728. {
  729. public:
  730. virtual BOOL ExecuteControl(CString strCtrlType,/*in*/vector<DATA_ATTRIBUTE>& ctrlParam, /*out*/vector<DATA_ATTRIBUTE>& executeInfo) { return 0; };
  731. };
  732. struct MP_ALARM_CONF_HIGHLOW_LIMIT {
  733. BOOL Enable_AH; //告警启用
  734. float alm_High; //告警上限
  735. BOOL Enable_PAH; //预警启用
  736. float prealm_High; //预警上限
  737. BOOL Enable_PAL; //预警启用
  738. float prealm_Low; //预警下限
  739. BOOL Enable_AL; //告警启用
  740. float alm_Low; //告警下限
  741. int highLevel; //告警上限等级
  742. int lowLevel; //告警下限等级
  743. MP_ALARM_CONF_HIGHLOW_LIMIT()
  744. {
  745. Enable_AH = 0;
  746. Enable_PAH = 0;
  747. Enable_PAL = 0;
  748. Enable_AL = 0;
  749. alm_High = 2;
  750. prealm_High = 1;
  751. prealm_Low = -1;
  752. alm_Low = -2;
  753. highLevel = 0;
  754. lowLevel = 0;
  755. }
  756. };
  757. struct MP_ATTRIB {
  758. CString m_strName;//监测点名称
  759. CString m_strUnit;//单位
  760. CString m_strPhysicalType;
  761. string m_strAlias;
  762. CString m_strCalFormula;
  763. CString low_limit;//值有效范围-低限
  764. CString high_limit;//值有效范围-高限
  765. };
  766. //监测点数据呈现方式:类似于伤损监测中采集的单条曲线数据和单频点数据,两个监测点:区段1&70KHZ
  767. enum MP_DISPLAYDATATYPE
  768. {
  769. eMP_DPT_UNKNOWN = 0,
  770. eMP_DPT_POINT,
  771. eMP_DPT_CURVE,
  772. };
  773. const CString MP_DISPLAYDATATYPE_DESC[] = {
  774. _TEXT(""),_TEXT("静态数据"),_TEXT("曲线数据"),
  775. };
  776. //zgw 伤损算法相关
  777. struct CPoint2D {
  778. int m_x = 0;
  779. int m_y = 0;
  780. CPoint2D() {
  781. }
  782. CPoint2D(int x, int y) {
  783. m_x = x;
  784. m_y = y;
  785. }
  786. };
  787. struct CPoint2DInfo {
  788. CPoint2D m_pt2d;
  789. string m_type="peak"; //peak valley
  790. CPoint2DInfo(int x, int y, string type) {
  791. m_pt2d.m_x = x;
  792. m_pt2d.m_y = y;
  793. m_type = type;
  794. }
  795. };
  796. ////