ContactlessFSM.h 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552
  1. #ifndef _CONTACTLESS_FSM_H
  2. #define _CONTACTLESS_FSM_H
  3. #pragma once
  4. #include "SpFSM.h"
  5. #include "CommEntityUtil.hpp"
  6. #include "DevFSMCommBase.hpp"
  7. #include "RFICClass.h"
  8. #include "CardAssist.h"
  9. #include "ICDataElement.h"
  10. #include "ContactlessCard_server_g.h"
  11. #include "ContactlessCard_msg_g.h"
  12. #include "ContactlessCard_UserErrorCode.h"
  13. #include "json/json.h"
  14. enum EvtType
  15. {
  16. USER_EVT_TEST = EVT_USER+1,
  17. USER_EVT_QUIT,
  18. USER_EVT_INIT,
  19. USER_EVT_INITFINISHED,
  20. USER_EVT_ACCEPT,
  21. USER_EVT_ACCEPT_CANCEL,
  22. USER_EVT_ACCEPTFINISHED,
  23. USER_EVT_EJECT,
  24. USER_EVT_EJECTFINISHED,
  25. USER_EVT_WAITFINISHED,
  26. USER_EVT_CAPTUREFINISHED,
  27. USER_EVT_WAITFETCHINGTIMEOUT,
  28. USER_EVT_PREONLINE,
  29. USER_EVT_POSTONLINE,
  30. USER_EVT_PREONLINEFINISHED,
  31. USER_EVT_POSTONLINEFINISHED,
  32. USER_EVT_RESET,
  33. USER_EVT_RESETFINISHED,
  34. USER_EVT_EXIT,
  35. USER_EVT_READ,
  36. USER_EVT_READ_FINISHED,
  37. USER_EVT_QUERY_CARD_INFO,
  38. USER_EVT_QUERY_CARD_INFO_FINISHED,
  39. //new
  40. USER_EVT_JS_READ,
  41. USER_EVT_JS_READ_FINISHED,
  42. USER_EVT_JS_EJECT,
  43. USER_EVT_JS_EJECTFINISHED,
  44. USER_EVT_JS_POSTONLINE,
  45. USER_EVT_JS_POSTONLINEFINISHED,
  46. USER_EVT_JS_READ_CANCEL
  47. };
  48. using namespace ContactlessCard;
  49. #ifdef RVC_OS_WIN
  50. typedef int(*lpCMBdecodeMag2)(char* Mag2Data, char * data);
  51. typedef int(*lpCMBdecodeEx)( char* MagData, char * type, char * data);
  52. #else
  53. using lpCMBdecodeMag2 = int(*)(char* mag2Data, char* data);
  54. using lpCMBdecodeEx = int(*)(char* magData, char* type, char* data);
  55. #endif
  56. class CContactlessCardEntity;
  57. class CContactlessCardFSM;
  58. struct Track2Data
  59. {
  60. int status;
  61. CSimpleStringA t2Account;
  62. CSimpleStringA t2Region;
  63. CSimpleStringA t2CardSerial;
  64. CSimpleStringA t2CVC;
  65. CSimpleStringA t2ExpireDate;
  66. };
  67. struct CMBBin
  68. {
  69. CSimpleStringA bin;//6 byte long
  70. bool bIC;//IC:true or mag:false
  71. bool bDC;//debit:true,credit:false
  72. };
  73. class CardAcceptEvent : public FSMEvent
  74. {
  75. public:
  76. CardAcceptEvent() : FSMEvent(USER_EVT_ACCEPT){}
  77. ~CardAcceptEvent(){}
  78. SpReqAnsContext<ContactlessCardService_Insert_Req, ContactlessCardService_Insert_Ans>::Pointer ctx;
  79. virtual void OnUnhandled()
  80. {
  81. if (ctx != NULL)
  82. {
  83. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("card accept unhandled");
  84. ctx->Answer(Error_InvalidState);
  85. }
  86. }
  87. };
  88. class PreOnlineEvent : public FSMEvent
  89. {
  90. public:
  91. PreOnlineEvent() : FSMEvent(USER_EVT_PREONLINE){}
  92. ~PreOnlineEvent(){}
  93. SpReqAnsContext<ContactlessCardService_PreOnline_Req,ContactlessCardService_PreOnline_Ans>::Pointer ctx;
  94. virtual void OnUnhandled()
  95. {
  96. if (ctx != NULL)
  97. ctx->Answer(Error_InvalidState);
  98. }
  99. protected:
  100. private:
  101. };
  102. class PostOnlineEvent : public FSMEvent
  103. {
  104. public:
  105. PostOnlineEvent() : FSMEvent(USER_EVT_POSTONLINE){}
  106. ~PostOnlineEvent(){}
  107. SpReqAnsContext<ContactlessCardService_PostOnline_Req,ContactlessCardService_PostOnline_Ans>::Pointer ctx;
  108. virtual void OnUnhandled()
  109. {
  110. if (ctx != NULL)
  111. ctx->Answer(Error_InvalidState);
  112. }
  113. protected:
  114. private:
  115. };
  116. class CardEjectEvent : public FSMEvent
  117. {
  118. public:
  119. CardEjectEvent() : FSMEvent(USER_EVT_EJECT){}
  120. ~CardEjectEvent(){}
  121. SpReqAnsContext<ContactlessCardService_Eject_Req,ContactlessCardService_Eject_Ans>::Pointer ctx;
  122. virtual void OnUnhandled()
  123. {
  124. if (ctx != NULL)
  125. ctx->Answer(Error_InvalidState);
  126. }
  127. protected:
  128. private:
  129. };
  130. class ResetDeviceEvent : public FSMEvent
  131. {
  132. public:
  133. ResetDeviceEvent() : FSMEvent(USER_EVT_RESET){}
  134. ~ResetDeviceEvent(){}
  135. protected:
  136. private:
  137. };
  138. class ResetFinishedEvent : public FSMEvent
  139. {
  140. public:
  141. ResetFinishedEvent() : FSMEvent(USER_EVT_RESETFINISHED){}
  142. ~ResetFinishedEvent(){}
  143. protected:
  144. private:
  145. };
  146. class QueryCardInfoEvent : public FSMEvent
  147. {
  148. public:
  149. QueryCardInfoEvent() : FSMEvent(USER_EVT_QUERY_CARD_INFO){}
  150. ~QueryCardInfoEvent(){}
  151. SpReqAnsContext<ContactlessCardService_QueryCardInfo_Req,ContactlessCardService_QueryCardInfo_Ans>::Pointer ctx;
  152. virtual void OnUnhandled()
  153. {
  154. if (ctx != NULL)
  155. ctx->Answer(Error_InvalidState);
  156. }
  157. protected:
  158. private:
  159. };
  160. //new
  161. class EjectJSEvent : public FSMEvent
  162. {
  163. public:
  164. EjectJSEvent() : FSMEvent(USER_EVT_JS_EJECT) {}
  165. ~EjectJSEvent() {}
  166. SpReqAnsContext<ContactlessCardService_EjectJS_Req, ContactlessCardService_EjectJS_Ans>::Pointer ctx;
  167. virtual void OnUnhandled()
  168. {
  169. if (ctx != NULL) {
  170. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("EjectJS unhandled");
  171. //ctx->Answer(Error_InvalidState);
  172. }
  173. }
  174. protected:
  175. private:
  176. };
  177. class PostOnlineJSEvent : public FSMEvent
  178. {
  179. public:
  180. PostOnlineJSEvent() : FSMEvent(USER_EVT_JS_POSTONLINE) {}
  181. ~PostOnlineJSEvent() {}
  182. SpReqAnsContext<ContactlessCardService_PostOnlineJS_Req, ContactlessCardService_PostOnlineJS_Ans>::Pointer ctx;
  183. virtual void OnUnhandled()
  184. {
  185. if (ctx != NULL) {
  186. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PostOnlineJS unhandled");
  187. //ctx->Answer(Error_InvalidState);
  188. }
  189. }
  190. protected:
  191. private:
  192. };
  193. class ReadJSEvent : public FSMEvent
  194. {
  195. public:
  196. ReadJSEvent() : FSMEvent(USER_EVT_JS_READ) {}
  197. ~ReadJSEvent() {}
  198. SpReqAnsContext<ContactlessCardService_ReadJS_Req, ContactlessCardService_ReadJS_Ans>::Pointer ctx;
  199. virtual void OnUnhandled()
  200. {
  201. if (ctx != NULL) {
  202. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("ReadJS unhandled");
  203. //ctx->Answer(Error_InvalidState);
  204. }
  205. }
  206. protected:
  207. private:
  208. };
  209. class CContactlessCardFSM : public CCommDevFSM<CContactlessCardFSM, RFICClass>
  210. {
  211. public:
  212. enum {s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11};
  213. BEGIN_FSM_STATE(CContactlessCardFSM)
  214. FSM_STATE_ENTRY(s0, "Init", s0_on_entry, s0_on_exit, s0_on_event)
  215. FSM_STATE_ENTRY(s1, "Initializing", s1_on_entry, s1_on_exit, s1_on_event)
  216. FSM_STATE_ENTRY(s2, "Idle", s2_on_entry, s2_on_exit, s2_on_event)
  217. FSM_STATE_ENTRY(s3, "Accepting", s3_on_entry, s3_on_exit, s3_on_event)
  218. FSM_STATE_ENTRY(s4, "Hold", s4_on_entry, s4_on_exit, s4_on_event)
  219. FSM_STATE_ENTRY(s5, "Reading", s5_on_entry, s5_on_exit, s5_on_event)
  220. FSM_STATE_ENTRY(s6, "Ejecting", s6_on_entry, s6_on_exit, s6_on_event)
  221. FSM_STATE_ENTRY(s7, "WaitFetching", s7_on_entry, s7_on_exit, s7_on_event)
  222. FSM_STATE_ENTRY(s8, "Capturing", s8_on_entry, s8_on_exit, s8_on_event)
  223. FSM_STATE_ENTRY(s9, "Failed", s9_on_entry, s9_on_exit, s9_on_event)
  224. FSM_STATE_ENTRY(s10, "ReadJs", s10_on_entry, s10_on_exit, s10_on_event)
  225. FSM_STATE_ENTRY(s11, "EjectJs", s11_on_entry, s11_on_exit, s11_on_event)
  226. END_FSM_STATE()
  227. BEGIN_FSM_RULE(CContactlessCardFSM,s0)
  228. FSM_RULE_ENTRY(s0,s1,USER_EVT_INIT,0)
  229. FSM_RULE_ENTRY(s0, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  230. FSM_RULE_ENTRY(s1,s2,USER_EVT_INITFINISHED,0)
  231. FSM_RULE_ENTRY(s1,s9,USER_EVT_INITFINISHED,1)
  232. FSM_RULE_ENTRY(s1, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  233. FSM_RULE_ENTRY(s2,s3,USER_EVT_ACCEPT,0)
  234. FSM_RULE_ENTRY(s2, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  235. FSM_RULE_ENTRY(s2, s6, USER_EVT_EJECT, 0)
  236. FSM_RULE_ENTRY(s2, s10, USER_EVT_JS_READ, 0)//JS ¶Á¿¨
  237. FSM_RULE_ENTRY(s2, s10, USER_EVT_JS_POSTONLINE, 0)//JS Áª»úºó
  238. FSM_RULE_ENTRY(s2, s11, USER_EVT_JS_EJECT, 0)//JS Í¿¨
  239. FSM_RULE_ENTRY(s3,s4,USER_EVT_ACCEPTFINISHED,0)
  240. FSM_RULE_ENTRY(s3,s9,USER_EVT_ACCEPTFINISHED,1)
  241. FSM_RULE_ENTRY(s3,s2,USER_EVT_ACCEPTFINISHED,2)
  242. FSM_RULE_ENTRY(s3,s2,USER_EVT_ACCEPTFINISHED,3)
  243. FSM_RULE_ENTRY(s3,s7,USER_EVT_ACCEPTFINISHED,4)
  244. FSM_RULE_ENTRY(s3, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  245. FSM_RULE_ENTRY(s4,s6,USER_EVT_EJECT,0)
  246. FSM_RULE_ENTRY(s4,s6,USER_EVT_EXIT,0)
  247. FSM_RULE_ENTRY(s4,s2,USER_EVT_QUERY_CARD_INFO_FINISHED,0)
  248. FSM_RULE_ENTRY(s4, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  249. FSM_RULE_ENTRY(s5,s4,USER_EVT_READ_FINISHED,0)
  250. FSM_RULE_ENTRY(s5,s9,USER_EVT_READ_FINISHED,1)
  251. FSM_RULE_ENTRY(s5,s2,USER_EVT_READ_FINISHED,2)
  252. FSM_RULE_ENTRY(s5, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  253. FSM_RULE_ENTRY(s5, s6, USER_EVT_EXIT, 0)
  254. FSM_RULE_ENTRY(s6,s7,USER_EVT_EJECTFINISHED,1)
  255. FSM_RULE_ENTRY(s6,s7,USER_EVT_EJECTFINISHED,0)
  256. FSM_RULE_ENTRY(s6,s7,USER_EVT_EJECTFINISHED,2)
  257. FSM_RULE_ENTRY(s6,s2,USER_EVT_EXIT,0)
  258. FSM_RULE_ENTRY(s6, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  259. FSM_RULE_ENTRY(s7,s2,USER_EVT_WAITFINISHED,0)
  260. FSM_RULE_ENTRY(s7,s2,USER_EVT_WAITFINISHED,2)
  261. FSM_RULE_ENTRY(s7, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  262. FSM_RULE_ENTRY(s8, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  263. FSM_RULE_ENTRY(s9, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  264. FSM_RULE_ENTRY(s9, s2, USER_EVT_RESETFINISHED, 0)
  265. FSM_RULE_ENTRY(s9, s2, USER_EVT_RESETFINISHED, 1)
  266. FSM_RULE_ENTRY(s10, s2, USER_EVT_JS_READ_FINISHED, 0)
  267. FSM_RULE_ENTRY(s10, s2, USER_EVT_JS_POSTONLINEFINISHED, 0)
  268. FSM_RULE_ENTRY(s11, s2, USER_EVT_JS_EJECTFINISHED, 0)
  269. FSM_RULE_ENTRY(s11, s2, USER_EVT_JS_EJECTFINISHED, 1)
  270. FSM_RULE_ENTRY(s11, s2, USER_EVT_JS_EJECTFINISHED, 2)
  271. END_FSM_RULE()
  272. CContactlessCardFSM() : m_bCancelAccept(false), m_bWaitingAccept(false),
  273. m_bWaitAccepteMore(false), m_bExit(false), m_resetTimes(0), m_testResult(Error_Succeed)
  274. , m_bCDA(false), m_pDataToARQC(NULL), m_csMachineType(true), m_csDevNo(""), m_devInit(false), m_repeatErrTimes(0),
  275. m_bCancelRead(false),m_bPageExit(false), m_bNeedReset(true)
  276. {
  277. HARDWARE_ENTITY_RESET_ENTITYID(m_entCode, 0x213);
  278. cmdDecodeMag2 = NULL;
  279. cmdDecodeEx = NULL;
  280. m_aidList.Init(3);
  281. m_aidList[0] = "A000000333";
  282. m_aidList[1] = "A0000000108888";
  283. m_aidList[2] = "A000000790";
  284. }
  285. ~CContactlessCardFSM(){}
  286. virtual ErrorCodeEnum OnInit();
  287. virtual ErrorCodeEnum OnExit();
  288. void s0_on_entry();
  289. void s0_on_exit();
  290. unsigned int s0_on_event(FSMEvent* event);
  291. void s1_on_entry();
  292. void s1_on_exit();
  293. unsigned int s1_on_event(FSMEvent* event);
  294. void s2_on_entry();
  295. void s2_on_exit();
  296. unsigned int s2_on_event(FSMEvent* event);
  297. void s3_on_entry();
  298. void s3_on_exit();
  299. unsigned int s3_on_event(FSMEvent* event);
  300. void s4_on_entry();
  301. void s4_on_exit();
  302. unsigned int s4_on_event(FSMEvent* event);
  303. void s5_on_entry();
  304. void s5_on_exit();
  305. unsigned int s5_on_event(FSMEvent* event);
  306. void s6_on_entry();
  307. void s6_on_exit();
  308. unsigned int s6_on_event(FSMEvent* event);
  309. void s7_on_entry();
  310. void s7_on_exit();
  311. unsigned int s7_on_event(FSMEvent* event);
  312. void s8_on_entry();
  313. void s8_on_exit();
  314. unsigned int s8_on_event(FSMEvent* event);
  315. void s9_on_entry();
  316. void s9_on_exit();
  317. unsigned int s9_on_event(FSMEvent* event);
  318. void s10_on_entry();
  319. void s10_on_exit();
  320. unsigned int s10_on_event(FSMEvent* event);
  321. void s11_on_entry();
  322. void s11_on_exit();
  323. unsigned int s11_on_event(FSMEvent* event);
  324. int Initial();
  325. ErrorCodeEnum Load();
  326. bool GetDevStatus(bool bPrint=true);
  327. int InternalAcceptCard();
  328. int AcceptCard(SpReqAnsContext<ContactlessCardService_Insert_Req, ContactlessCardService_Insert_Ans>::Pointer ctx);
  329. //int ReadCard(SpReqAnsContext<ContactlessCardService_Read_Req,ContactlessCardService_Read_Ans>::Pointer ctx);
  330. int PreOnline(SpReqAnsContext<ContactlessCardService_PreOnline_Req,ContactlessCardService_PreOnline_Ans>::Pointer ctx);
  331. int PostOnline(SpReqAnsContext<ContactlessCardService_PostOnline_Req,ContactlessCardService_PostOnline_Ans>::Pointer ctx);
  332. int EjectCard(SpReqAnsContext<ContactlessCardService_Eject_Req,ContactlessCardService_Eject_Ans>::Pointer ctx);
  333. int Reset();
  334. int WaitFetchingCard();
  335. int QueryCardInfo(SpReqAnsContext<ContactlessCardService_QueryCardInfo_Req, ContactlessCardService_QueryCardInfo_Ans>::Pointer ctx);
  336. bool GetWaitFlag(){return m_bWaitingAccept;}
  337. void SetWaitMore(){m_bWaitAccepteMore = true;}
  338. void SetExitFlag(bool bFlag=true){m_bExit = bFlag;}
  339. bool LoadCMBPrint(CSimpleStringA csBinPath);
  340. void GetCardProcessLastErr(ErrorCodeEnum& eErrCode, CSimpleStringA& lastApiName, CSimpleStringA& alarmMsg, CSimpleStringA& csErrMsgWithReturnCode);
  341. void SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext)
  342. {
  343. pTransactionContext->SendAnswer(m_testResult);
  344. }
  345. //new interface
  346. int GetFSMState()
  347. {
  348. //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_currentFSMState:%d", m_currentFSMState);
  349. return m_currentFSMState;
  350. }
  351. DWORD GetFsmStateErrCode();
  352. void QueryHasCardJS(SpReqAnsContext<ContactlessCardService_QueryHasCardJS_Req, ContactlessCardService_QueryHasCardJS_Ans>::Pointer ctx);
  353. int EjectJS(SpReqAnsContext<ContactlessCardService_EjectJS_Req, ContactlessCardService_EjectJS_Ans>::Pointer ctx);
  354. int ReadJS(SpReqAnsContext<ContactlessCardService_ReadJS_Req, ContactlessCardService_ReadJS_Ans>::Pointer ctx);
  355. int PostOnlineJS(SpReqAnsContext<ContactlessCardService_PostOnlineJS_Req, ContactlessCardService_PostOnlineJS_Ans>::Pointer ctx);
  356. int InternalAcceptCardJS();
  357. int PreOnlineJS(SpReqAnsContext<ContactlessCardService_ReadJS_Req, ContactlessCardService_ReadJS_Ans>::Pointer ctx);
  358. protected:
  359. int m_iInsertTries;
  360. int m_resetTries;
  361. int m_ejectTries;
  362. private:
  363. ///
  364. int m_resetTimes;
  365. lpCMBdecodeMag2 cmdDecodeMag2;
  366. lpCMBdecodeEx cmdDecodeEx;
  367. bool m_devInit, m_bCancelAccept, m_bWaitingAccept, m_bWaitAccepteMore, m_bExit, m_bIssued;
  368. ErrorCodeEnum m_testResult;
  369. CSimpleStringA m_csMachineType;
  370. DevCategoryInfo m_devCatInfo;
  371. int m_CardInit,m_CardRemains,m_CardIssued,m_CardCaptured,m_CardMixed,m_CardPercent;
  372. RFICReaderStatus devStatus;
  373. CCardProcess *m_pCardProcess;
  374. char *m_pDataToARQC;
  375. long xxTest;
  376. CAutoArray<CSimpleStringA> m_aidList;
  377. char m_AuthCode[2];
  378. bool m_bCDA;
  379. CSimpleStringA m_csDevNo;
  380. int SplitTrack2(CSimpleStringA pTrack2,Track2Data &decodeData);
  381. int m_repeatErrTimes;
  382. int m_currentFSMState;
  383. //new
  384. bool m_bCancelRead;
  385. bool m_bPageExit;
  386. bool m_bNeedReset;
  387. };
  388. struct InitTask : public ITaskSp
  389. {
  390. CContactlessCardFSM* fsm;
  391. InitTask(CContactlessCardFSM* f) : fsm(f) {}
  392. void Process()
  393. {
  394. FSMEvent *e = new FSMEvent(USER_EVT_INITFINISHED);
  395. e->param1 = fsm->Initial();
  396. fsm->PostEventFIFO(e);
  397. }
  398. };
  399. struct AcceptTask : public ITaskSp
  400. {
  401. CContactlessCardFSM* fsm;
  402. SpReqAnsContext<ContactlessCardService_Insert_Req, ContactlessCardService_Insert_Ans>::Pointer ctx;
  403. AcceptTask(CContactlessCardFSM* f) : fsm(f) {}
  404. void Process()
  405. {
  406. LOG_FUNCTION();
  407. FSMEvent *e = new FSMEvent(USER_EVT_ACCEPTFINISHED);
  408. e->param1 = fsm->AcceptCard(ctx);
  409. fsm->PostEventFIFO(e);
  410. }
  411. };
  412. struct PreOnlineTask : public ITaskSp
  413. {
  414. SpReqAnsContext<ContactlessCardService_PreOnline_Req,ContactlessCardService_PreOnline_Ans>::Pointer ctx;
  415. CContactlessCardFSM* fsm;
  416. PreOnlineTask(CContactlessCardFSM* f) : fsm(f) {}
  417. void Process()
  418. {
  419. FSMEvent *e = new FSMEvent(USER_EVT_PREONLINEFINISHED);
  420. e->param1 = fsm->PreOnline(ctx);
  421. fsm->PostEventFIFO(e);
  422. }
  423. };
  424. struct PostOnlineTask : public ITaskSp
  425. {
  426. SpReqAnsContext<ContactlessCardService_PostOnline_Req,ContactlessCardService_PostOnline_Ans>::Pointer ctx;
  427. CContactlessCardFSM* fsm;
  428. PostOnlineTask(CContactlessCardFSM* f) : fsm(f) {}
  429. void Process()
  430. {
  431. FSMEvent *e = new FSMEvent(USER_EVT_POSTONLINEFINISHED);
  432. e->param1 = fsm->PostOnline(ctx);
  433. fsm->PostEventFIFO(e);
  434. }
  435. };
  436. struct EjectTask : public ITaskSp
  437. {
  438. SpReqAnsContext<ContactlessCardService_Eject_Req,ContactlessCardService_Eject_Ans>::Pointer ctx;
  439. CContactlessCardFSM* fsm;
  440. EjectTask(CContactlessCardFSM* f) : fsm(f) {}
  441. void Process()
  442. {
  443. FSMEvent *e = new FSMEvent(USER_EVT_EJECTFINISHED);
  444. e->param1 = fsm->EjectCard(ctx);
  445. fsm->PostEventFIFO(e);
  446. }
  447. };
  448. struct WaitFetchingTask : public ITaskSp
  449. {
  450. CContactlessCardFSM* fsm;
  451. WaitFetchingTask(CContactlessCardFSM* f) : fsm(f) {}
  452. void Process()
  453. {
  454. FSMEvent *e = new FSMEvent(USER_EVT_WAITFINISHED);
  455. e->param1 = fsm->WaitFetchingCard();
  456. fsm->PostEventFIFO(e);
  457. }
  458. };
  459. struct ResetTask : public ITaskSp
  460. {
  461. CContactlessCardFSM* fsm;
  462. ResetTask(CContactlessCardFSM* f) : fsm(f) {}
  463. void Process()
  464. {
  465. ResetFinishedEvent *e = new ResetFinishedEvent();
  466. e->param1 = fsm->Reset();
  467. fsm->PostEventFIFO(e);
  468. }
  469. };
  470. struct QueryCardInfoTask : public ITaskSp
  471. {
  472. SpReqAnsContext<ContactlessCardService_QueryCardInfo_Req,ContactlessCardService_QueryCardInfo_Ans>::Pointer ctx;
  473. CContactlessCardFSM* fsm;
  474. QueryCardInfoTask(CContactlessCardFSM* f) : fsm(f) {}
  475. void Process()
  476. {
  477. FSMEvent *e = new FSMEvent(USER_EVT_QUERY_CARD_INFO_FINISHED);
  478. e->param1 = fsm->QueryCardInfo(ctx);
  479. fsm->PostEventFIFO(e);
  480. }
  481. };
  482. struct EjectJSTask : public ITaskSp
  483. {
  484. SpReqAnsContext<ContactlessCardService_EjectJS_Req, ContactlessCardService_EjectJS_Ans>::Pointer ctx;
  485. CContactlessCardFSM* fsm;
  486. EjectJSTask(CContactlessCardFSM* f) : fsm(f) {}
  487. void Process()
  488. {
  489. FSMEvent* e = new FSMEvent(USER_EVT_JS_EJECTFINISHED);
  490. e->param1 = fsm->EjectJS(ctx);
  491. fsm->PostEventFIFO(e);
  492. }
  493. };
  494. struct ReadJSTask : public ITaskSp
  495. {
  496. SpReqAnsContext<ContactlessCardService_ReadJS_Req, ContactlessCardService_ReadJS_Ans>::Pointer ctx;
  497. CContactlessCardFSM* fsm;
  498. ReadJSTask(CContactlessCardFSM* f) : fsm(f) {}
  499. void Process()
  500. {
  501. FSMEvent* e = new FSMEvent(USER_EVT_JS_READ_FINISHED);
  502. e->param1 = fsm->ReadJS(ctx);
  503. fsm->PostEventFIFO(e);
  504. }
  505. };
  506. struct PostOnlineJSTask : public ITaskSp
  507. {
  508. SpReqAnsContext<ContactlessCardService_PostOnlineJS_Req, ContactlessCardService_PostOnlineJS_Ans>::Pointer ctx;
  509. CContactlessCardFSM* fsm;
  510. PostOnlineJSTask(CContactlessCardFSM* f) : fsm(f) {}
  511. void Process()
  512. {
  513. FSMEvent* e = new FSMEvent(USER_EVT_JS_POSTONLINEFINISHED);
  514. e->param1 = fsm->PostOnlineJS(ctx);
  515. fsm->PostEventFIFO(e);
  516. }
  517. };
  518. #endif //_CONTACTLESS_FSM_H