AlarmFSM.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421
  1. #pragma once
  2. #include "SpBase.h"
  3. #include "SpFSM.h"
  4. #include "SpSecureClient.h"
  5. #include "Alarm.h"
  6. #define USER_EVT_JMP_ALARMUP EVT_USER+1
  7. #define USER_EVT_JMP_ALARMSTATEUP EVT_USER+2
  8. #define USER_EVT_JMP_RELEASE EVT_USER+3
  9. #define USER_EVT_DISCONNECT EVT_USER+4
  10. #define USER_EVT_UPLOAD_ANS EVT_USER+5
  11. #define USER_EVT_ALARMSTATE_ANS EVT_USER+6
  12. #define USER_EVT_DISCONNECT_FAIL EVT_USER+7
  13. #define USER_EVT_DISCONNECT_SUCC EVT_USER+8
  14. #define USER_EVT_JMP_START EVT_USER+9
  15. #pragma pack(1)
  16. const int UPLOG_MAX_COUNT = 500;//队列长度
  17. //[StructName("ALARMUPLOAD")]
  18. struct AlarmUpload
  19. {
  20. char TerminalNo[16];
  21. char EntityName[32];
  22. char SN[20];
  23. unsigned long LifeID;
  24. unsigned long Item;
  25. unsigned long UserCode;
  26. char Level;
  27. char Description[512];
  28. };
  29. //[StructName("ALARMANS")]
  30. struct AlarmReply
  31. {
  32. int ResultCode;
  33. };
  34. // [StructName("ALARMSTATE")]
  35. struct AlarmStateUpload
  36. {
  37. char TerminalNo[16];
  38. unsigned __int64 SN;
  39. unsigned long LifeID;
  40. unsigned long Item;
  41. char Level;
  42. char Description[512];
  43. };
  44. //[StructName("ALARMSTATEANS")]
  45. struct AlarmStateReply
  46. {
  47. int ResultCode;
  48. };
  49. #pragma pack()
  50. enum AlarmCtlCode
  51. {
  52. Finish = 0, //完成
  53. Error = 1, //错误
  54. };
  55. struct AlarmAnsEvent : public FSMEvent
  56. {
  57. AlarmAnsEvent(BYTE *pBuf, int nLen) : FSMEvent(USER_EVT_UPLOAD_ANS)
  58. {
  59. memcpy(&m_reply, pBuf, sizeof(AlarmReply));
  60. }
  61. virtual ~AlarmAnsEvent() {}
  62. AlarmReply m_reply;
  63. };
  64. struct AlarmStateAnsEvent : public FSMEvent
  65. {
  66. AlarmStateAnsEvent(BYTE *pBuf, int nLen) : FSMEvent(USER_EVT_ALARMSTATE_ANS)
  67. {
  68. memcpy(&m_reply, pBuf, sizeof(AlarmStateReply));
  69. }
  70. virtual ~AlarmStateAnsEvent() {}
  71. AlarmStateReply m_reply;
  72. };
  73. class AlarmConnection;
  74. class AlarmFSM : public FSMImpl<AlarmFSM>, public IFSMStateHooker, public ISysVarListener
  75. {
  76. public:
  77. enum {s0,s1,s2,s3};
  78. BEGIN_FSM_STATE(AlarmFSM)
  79. FSM_STATE_ENTRY(s0,"Starting",s0_on_entry,s0_on_exit,s0_on_event)
  80. FSM_STATE_ENTRY(s1, "AlarmUp", s1_on_entry, s1_on_exit, s1_on_event)
  81. FSM_STATE_ENTRY(s2, "AlarmStateUp", s2_on_entry, s2_on_exit, s2_on_event)
  82. FSM_STATE_ENTRY(s3, "Release", s3_on_entry, s3_on_exit, s3_on_event)
  83. END_FSM_STATE()
  84. BEGIN_FSM_RULE(AlarmFSM,s0)
  85. FSM_RULE_ENTRY_ANY(s0, s1, USER_EVT_JMP_ALARMUP)
  86. //FSM_RULE_ENTRY_ANY(s0, s2, USER_EVT_JMP_ALARMSTATEUP)
  87. //FSM_RULE_ENTRY_ANY(s1, s3, USER_EVT_JMP_RELEASE)
  88. FSM_RULE_ENTRY_ANY(s1, s0, USER_EVT_JMP_START)
  89. //FSM_RULE_ENTRY_ANY(s1, s0, EVT_TIMER)
  90. //FSM_RULE_ENTRY_ANY(s2, s3, USER_EVT_JMP_RELEASE)
  91. //FSM_RULE_ENTRY_ANY(s2, s0, EVT_TIMER)
  92. //FSM_RULE_ENTRY_ANY(s3, s0, EVT_TIMER)
  93. //FSM_RULE_ENTRY_ANY(s3, s0, USER_EVT_DISCONNECT)
  94. END_FSM_RULE()
  95. AlarmFSM();
  96. ~AlarmFSM();
  97. virtual void OnStateTrans(int iSrcState, int iDstState);
  98. virtual void OnSysVarEvent(const char *pszKey, const char *pszValue,const char *pszOldValue,const char *pszEntityName);
  99. virtual ErrorCodeEnum OnInit();
  100. virtual ErrorCodeEnum OnExit();
  101. void s0_on_entry();
  102. void s0_on_exit();
  103. unsigned int s0_on_event(FSMEvent* event);
  104. void s1_on_entry();
  105. void s1_on_exit();
  106. unsigned int s1_on_event(FSMEvent* event);
  107. void s2_on_entry();
  108. void s2_on_exit();
  109. unsigned int s2_on_event(FSMEvent* event);
  110. void s3_on_entry();
  111. void s3_on_exit();
  112. unsigned int s3_on_event(FSMEvent* event);
  113. //增加告警
  114. void add_alarm(alarm_t*alarm);
  115. //设置告警状态
  116. void set_alarm_state(const CUUID nLogID,DWORD LifeId,const SeverityLevelEnum eLevel,
  117. DWORD Item,const char *pszMessage);
  118. //增加历史告警
  119. void add_UploadedAlarm(alarm_t*alarm);
  120. bool is_UploadedAlarm_empty();
  121. //是否是已上传告警
  122. bool find_UploadedAlarm(alarm_t*alarm);
  123. bool update_UploadedAlarm(alarmUpgraded_t*alarm);
  124. //告警状态标志位
  125. BOOL m_b_alarmstate;
  126. //增加告警新接口
  127. void add_NewAlarm(alarm_t*alarm);
  128. //增加告警取出消息新接口
  129. alarm_t* removeAlarm();
  130. void closeClientConn();
  131. bool SendAlarm();
  132. int m_iEachSend;//每次发送数量
  133. long m_iRec;//累计收到的告警数目
  134. long m_iSend;//累计队列发送总数
  135. long m_iThrow;//累计队列丢弃总数
  136. long m_iFail;//累计发送失败总次数
  137. long m_iSucc;//累计发送成功总次数
  138. vector<alarm_t*> m_NewUploading_alarm;//新的告警记录列表
  139. private:
  140. //获取告警数量
  141. bool is_alarm_empty();
  142. private:
  143. CRITICAL_SECTION cs;
  144. AlarmConnection *m_pConnection;
  145. struct list_head m_uploading_alarm;
  146. struct list_head m_uploaded_alarm;
  147. alarm_state_t m_uploading_alarmstate;
  148. CSimpleStringA m_terminalNo;
  149. int m_nDealWarningTime;
  150. };
  151. class AlarmConnection : public SpSecureClient
  152. {
  153. public:
  154. AlarmConnection(CEntityBase *pEntity, AlarmFSM *pFSM) : SpSecureClient(pEntity), m_pFSM(pFSM) {}
  155. virtual ~AlarmConnection() {}
  156. void SendAlarm(alarm_t*alarm)
  157. {
  158. AlarmUpload alarmup = {0};
  159. CSystemStaticInfo si;
  160. {
  161. m_pEntity->GetFunction()->GetSystemStaticInfo(si);
  162. }
  163. strcpy(alarmup.TerminalNo, si.strTerminalID);
  164. strcpy(alarmup.EntityName, alarm->EntityName);
  165. strcpy(alarmup.SN,alarm->SN);
  166. alarmup.LifeID = alarm->LifeID;
  167. alarmup.Item = alarm->Item;
  168. alarmup.UserCode = alarm->UserCode;
  169. alarmup.Level = alarm->Level;
  170. strcpy(alarmup.Description, alarm->Description);
  171. CSmartPointer<IPackage> pkt = CreateNewPackage("WARNING");
  172. pkt->AddStruct("WARNING", false, false, (LPBYTE)&alarmup, sizeof(AlarmUpload));
  173. //SendPackage(pkt);
  174. if (SendPackage(pkt) == "")
  175. {
  176. Dbg("send fail");
  177. m_pFSM->m_iFail++;//失败计数
  178. //发送失败,断开连接
  179. m_pFSM->PostEventFIFO(new FSMEvent(USER_EVT_DISCONNECT_FAIL));//失败,等下次发送
  180. }else{
  181. //Dbg("send succ");
  182. }
  183. }
  184. void SendAlarmState(alarm_state_t*alarmstate)
  185. {
  186. AlarmStateUpload alarmstate0 = {0};
  187. CSystemStaticInfo si;
  188. {
  189. m_pEntity->GetFunction()->GetSystemStaticInfo(si);
  190. }
  191. strcpy(&alarmstate0.TerminalNo[0], si.strTerminalID);
  192. alarmstate0.SN = alarmstate->SN;
  193. alarmstate0.LifeID = alarmstate->LifeID;
  194. alarmstate0.Level = alarmstate->Level;
  195. alarmstate0.Item = alarmstate->Item;
  196. strcpy(&alarmstate0.Description[0], alarmstate->Description);
  197. CSmartPointer<IPackage> pkt = CreateNewPackage("STATE");
  198. pkt->AddStruct("STATE", false, false, (LPBYTE)&alarmstate, sizeof(AlarmUpload));
  199. SendPackage(pkt);
  200. }
  201. protected:
  202. virtual void OnPkgAnswer(const CSmartPointer<IPackage> &pRecvPkg) {
  203. string serviceCode = pRecvPkg->GetServiceCode();
  204. if (serviceCode == "WARNING")
  205. {
  206. //Dbg("rece ans 1");
  207. DWORD dwSysCode, dwUserCode;
  208. string strErrMsg;
  209. ErrorCodeEnum rc = Error_Succeed;
  210. if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
  211. {
  212. rc = (ErrorCodeEnum)dwSysCode;
  213. LogWarn(Severity_Low, rc, dwUserCode, CSimpleStringA::Format("create packet Fail!, %s", strErrMsg.c_str()));
  214. //跳出连接
  215. OnDisconnect();
  216. }else{
  217. //Dbg("rece ans 2");
  218. int nLen = pRecvPkg->GetStructLen("WANS");
  219. if (nLen > 0)
  220. {
  221. BYTE *pBuf = new BYTE[nLen];
  222. memset(pBuf, 0, nLen);
  223. int nArrayNum = 0;
  224. if (pRecvPkg->GetStructData("WANS", pBuf, &nLen, &nArrayNum))
  225. {
  226. //Dbg("rece ans 3");
  227. FSMEvent *evt = new AlarmAnsEvent(pBuf, nLen);
  228. AlarmAnsEvent *ans = (AlarmAnsEvent *)evt;
  229. if (ans->m_reply.ResultCode == Finish)
  230. {
  231. //Dbg("send finish!");
  232. m_pFSM->m_iSucc++;//成功计数
  233. }
  234. else if (ans->m_reply.ResultCode == Error)
  235. {
  236. m_pFSM->m_iFail++;//失败计数
  237. Dbg("send error!");
  238. }
  239. delete evt;
  240. m_pFSM->PostEventFIFO(new FSMEvent(USER_EVT_UPLOAD_ANS));//继续发送
  241. }
  242. else
  243. {
  244. Dbg("create invalid alarm upans packet!");
  245. OnDisconnect();
  246. //跳出连接
  247. }
  248. delete pBuf;
  249. }
  250. }
  251. }
  252. else if (serviceCode == "STATE")
  253. {
  254. int nLen = pRecvPkg->GetStructLen("SANS");
  255. if (nLen > 0)
  256. {
  257. BYTE *pBuf = new BYTE[nLen];
  258. memset(pBuf, 0, nLen);
  259. int nArrayNum = 0;
  260. if (pRecvPkg->GetStructData("SANS", pBuf, &nLen, &nArrayNum))
  261. {
  262. FSMEvent *evt = new AlarmStateAnsEvent(pBuf, nLen);
  263. AlarmStateAnsEvent *ans = (AlarmStateAnsEvent *)evt;
  264. if (ans->m_reply.ResultCode == Finish)
  265. {
  266. Dbg("alarmstate upload finish!");
  267. }
  268. else if (ans->m_reply.ResultCode == Error)
  269. {
  270. Dbg("alarmstate upload error!");
  271. }
  272. delete evt;
  273. }
  274. else
  275. {
  276. Dbg("create invalid alarmstate upans packet!");
  277. OnDisconnect();
  278. }
  279. delete pBuf;
  280. }
  281. }
  282. else
  283. {
  284. Dbg("unknown service code!");
  285. OnDisconnect();
  286. //跳出连接
  287. }
  288. }
  289. virtual void OnDisconnect()
  290. {
  291. m_pFSM->m_iFail++;//失败计数
  292. m_pFSM->PostEventFIFO(new FSMEvent(USER_EVT_DISCONNECT_FAIL));
  293. }
  294. virtual void OnReceivePackage(IPackage *pRecvPkg)
  295. {
  296. //string serviceCode = pRecvPkg->GetServiceCode();
  297. //if (serviceCode == "WARNING")
  298. //{
  299. // Dbg("rece ans 1");
  300. // DWORD dwSysCode, dwUserCode;
  301. // string strErrMsg;
  302. // ErrorCodeEnum rc = Error_Succeed;
  303. // if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
  304. // {
  305. // rc = (ErrorCodeEnum)dwSysCode;
  306. // LogWarn(Severity_Low, rc, dwUserCode, CSimpleStringA::Format("create packet Fail!, %s", strErrMsg.c_str()));
  307. // //跳出连接
  308. // OnDisconnect();
  309. // }else{
  310. // Dbg("rece ans 2");
  311. // int nLen = pRecvPkg->GetStructLen("WANS");
  312. // if (nLen > 0)
  313. // {
  314. // BYTE *pBuf = new BYTE[nLen];
  315. // memset(pBuf, 0, nLen);
  316. // int nArrayNum = 0;
  317. // if (pRecvPkg->GetStructData("WANS", pBuf, &nLen, &nArrayNum))
  318. // {
  319. // Dbg("rece ans 3");
  320. // FSMEvent *evt = new AlarmAnsEvent(pBuf, nLen);
  321. // AlarmAnsEvent *ans = (AlarmAnsEvent *)evt;
  322. // if (ans->m_reply.ResultCode == Finish)
  323. // {
  324. // Dbg("alarm upload finish!");
  325. // }
  326. // else if (ans->m_reply.ResultCode == Error)
  327. // {
  328. // Dbg("alarm upload error!");
  329. // }
  330. // delete evt;
  331. // m_pFSM->PostEventFIFO(new FSMEvent(USER_EVT_UPLOAD_ANS));//继续发送
  332. // }
  333. // else
  334. // {
  335. // Dbg("create invalid alarm upans packet!");
  336. // OnDisconnect();
  337. // //跳出连接
  338. // }
  339. // delete pBuf;
  340. // }
  341. // }
  342. //}
  343. //else if (serviceCode == "STATE")
  344. //{
  345. // int nLen = pRecvPkg->GetStructLen("SANS");
  346. // if (nLen > 0)
  347. // {
  348. // BYTE *pBuf = new BYTE[nLen];
  349. // memset(pBuf, 0, nLen);
  350. // int nArrayNum = 0;
  351. // if (pRecvPkg->GetStructData("SANS", pBuf, &nLen, &nArrayNum))
  352. // {
  353. // FSMEvent *evt = new AlarmStateAnsEvent(pBuf, nLen);
  354. // AlarmStateAnsEvent *ans = (AlarmStateAnsEvent *)evt;
  355. // if (ans->m_reply.ResultCode == Finish)
  356. // {
  357. // Dbg("alarmstate upload finish!");
  358. // }
  359. // else if (ans->m_reply.ResultCode == Error)
  360. // {
  361. // Dbg("alarmstate upload error!");
  362. // }
  363. // delete evt;
  364. // }
  365. // else
  366. // {
  367. // Dbg("create invalid alarmstate upans packet!");
  368. // OnDisconnect();
  369. // }
  370. // delete pBuf;
  371. // }
  372. //}
  373. //else
  374. //{
  375. // Dbg("unknown service code!");
  376. // OnDisconnect();
  377. // //跳出连接
  378. //}
  379. }
  380. private:
  381. AlarmFSM *m_pFSM;
  382. };