AlarmFSM.h 11 KB

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