mod_ContactlessCard.h 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. #ifndef _MOD_CONTACTLESS_H
  2. #define _MOD_CONTACTLESS_H
  3. #pragma once
  4. #include "stdafx.h"
  5. #include "ContactlessFSM.h"
  6. #include "DevEntityCommBase.hpp"
  7. class CContactlessCardEntity;
  8. class ContactlessCardServerSession : public ContactlessCardService_ServerSessionBase
  9. {
  10. public:
  11. ContactlessCardServerSession(CContactlessCardEntity* pEntity):m_pEntity(pEntity){}
  12. virtual ~ContactlessCardServerSession(){}
  13. virtual void Handle_Insert(SpReqAnsContext<ContactlessCardService_Insert_Req, ContactlessCardService_Insert_Ans>::Pointer ctx);
  14. virtual void Handle_CancelInsert(SpOnewayCallContext<ContactlessCardService_CancelInsert_Info>::Pointer ctx);
  15. virtual void Handle_InsertWaitMore(SpOnewayCallContext<ContactlessCardService_InsertWaitMore_Info>::Pointer ctx);
  16. virtual void Handle_PreOnline(SpReqAnsContext<ContactlessCardService_PreOnline_Req, ContactlessCardService_PreOnline_Ans>::Pointer ctx);
  17. virtual void Handle_PostOnline(SpReqAnsContext<ContactlessCardService_PostOnline_Req, ContactlessCardService_PostOnline_Ans>::Pointer ctx);
  18. virtual void Handle_Eject(SpReqAnsContext<ContactlessCardService_Eject_Req, ContactlessCardService_Eject_Ans>::Pointer ctx);
  19. virtual void Handle_Exit(SpOnewayCallContext<ContactlessCardService_Exit_Info>::Pointer ctx);
  20. virtual void Handle_QueryCardInfo(SpReqAnsContext<ContactlessCardService_QueryCardInfo_Req, ContactlessCardService_QueryCardInfo_Ans>::Pointer ctx);
  21. virtual void Handle_GetDevInfo(SpReqAnsContext<ContactlessCardService_GetDevInfo_Req, ContactlessCardService_GetDevInfo_Ans>::Pointer ctx);
  22. //new interface
  23. virtual void Handle_CancelReadJS(SpOnewayCallContext<ContactlessCardService_CancelReadJS_Info>::Pointer ctx);
  24. virtual void Handle_ReadJS(SpReqAnsContext<ContactlessCardService_ReadJS_Req, ContactlessCardService_ReadJS_Ans>::Pointer ctx);
  25. virtual void Handle_PostOnlineJS(SpReqAnsContext<ContactlessCardService_PostOnlineJS_Req, ContactlessCardService_PostOnlineJS_Ans>::Pointer ctx);
  26. virtual void Handle_EjectJS(SpReqAnsContext<ContactlessCardService_EjectJS_Req, ContactlessCardService_EjectJS_Ans>::Pointer ctx);
  27. virtual void Handle_QueryHasCardJS(SpReqAnsContext<ContactlessCardService_QueryHasCardJS_Req, ContactlessCardService_QueryHasCardJS_Ans>::Pointer ctx);
  28. private:
  29. CContactlessCardEntity* m_pEntity;
  30. };
  31. class CContactlessCardEntity : public CDevAdptEntityBase, public ISysVarListener
  32. {
  33. public:
  34. CContactlessCardEntity()
  35. {
  36. }
  37. virtual ~CContactlessCardEntity(){}
  38. virtual const char *GetEntityName() const { return "ContactlessCard"; }
  39. virtual void OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPointer<ITransactionContext> pTransactionContext)
  40. {
  41. LOG_FUNCTION();
  42. ErrorCodeEnum eStart = m_fsm.Init(this);
  43. GetFunction()->RegistSysVarEvent("UIState", this);
  44. pTransactionContext->SendAnswer(Error_Succeed);
  45. }
  46. virtual void OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer<ITransactionContext> pTransactionContext)
  47. {
  48. ErrorCodeEnum Error = __OnStart(Error_Succeed);
  49. pTransactionContext->SendAnswer(Error);
  50. }
  51. virtual void OnPrePause(CSmartPointer<ITransactionContext> pTransactionContext)
  52. {
  53. ErrorCodeEnum Error = __OnPause(Error_Succeed);
  54. pTransactionContext->SendAnswer(Error);
  55. }
  56. virtual ErrorCodeEnum __OnStart(ErrorCodeEnum preOperationError)
  57. {
  58. return Error_Succeed;
  59. }
  60. virtual ErrorCodeEnum __OnPause(ErrorCodeEnum preOperationError)
  61. {
  62. return Error_Succeed;
  63. }
  64. virtual ErrorCodeEnum __OnClose(ErrorCodeEnum preOperationError)
  65. {
  66. return Error_Succeed;
  67. }
  68. void Insert(SpReqAnsContext<ContactlessCardService_Insert_Req, ContactlessCardService_Insert_Ans>::Pointer ctx)
  69. {
  70. LOG_FUNCTION();
  71. if(!m_fsm.GetDevInitFlag()){
  72. ctx->Answer(Error_DevNotAvailable, ContactlessCard_UserErrorCode_Read_OpenFailed);
  73. LogWarn(Severity_Middle, Error_DevNotAvailable, ContactlessCard_UserErrorCode_Read_OpenFailed, "ReadCard but DevOpen failed.");
  74. }
  75. else{
  76. m_fsm.SetExitFlag(false);
  77. CardAcceptEvent* e = new CardAcceptEvent();
  78. e->ctx = ctx;
  79. m_fsm.PostEventFIFO(e);
  80. }
  81. }
  82. void CancelInsert(SpOnewayCallContext<ContactlessCardService_CancelInsert_Info>::Pointer ctx)
  83. {
  84. LOG_FUNCTION();
  85. if(!m_fsm.GetDevInitFlag()){
  86. LogWarn(Severity_Middle, Error_DevNotAvailable, ContactlessCard_UserErrorCode_Cancel_OpenFailed, "CancelInsert but DevOpen failed.");
  87. }else{
  88. FSMEvent *evt = new FSMEvent(USER_EVT_ACCEPT_CANCEL);
  89. m_fsm.PostEventFIFO(evt);
  90. }
  91. }
  92. void InsertWaitMore(SpOnewayCallContext<ContactlessCardService_InsertWaitMore_Info>::Pointer ctx)
  93. {
  94. if (m_fsm.GetWaitFlag())
  95. m_fsm.SetWaitMore();
  96. }
  97. void PreOnline(SpReqAnsContext<ContactlessCardService_PreOnline_Req, ContactlessCardService_PreOnline_Ans>::Pointer ctx)
  98. {
  99. LOG_FUNCTION();
  100. PreOnlineEvent* e = new PreOnlineEvent();
  101. e->ctx = ctx;
  102. m_fsm.PostEventFIFO(e);
  103. }
  104. void PostOnline(SpReqAnsContext<ContactlessCardService_PostOnline_Req, ContactlessCardService_PostOnline_Ans>::Pointer ctx)
  105. {
  106. LOG_FUNCTION();
  107. PostOnlineEvent* e = new PostOnlineEvent();
  108. e->ctx = ctx;
  109. m_fsm.PostEventFIFO(e);
  110. }
  111. void Eject(SpReqAnsContext<ContactlessCardService_Eject_Req, ContactlessCardService_Eject_Ans>::Pointer ctx)
  112. {
  113. LOG_FUNCTION();
  114. CardEjectEvent* e = new CardEjectEvent();
  115. e->ctx = ctx;
  116. m_fsm.PostEventFIFO(e);
  117. }
  118. void Exit(SpOnewayCallContext<ContactlessCardService_Exit_Info>::Pointer ctx)
  119. {
  120. LOG_FUNCTION();
  121. if(!m_fsm.GetDevInitFlag()){
  122. LogWarn(Severity_Middle, Error_DevNotAvailable, ContactlessCard_UserErrorCode_Exit_OpenFailed, "Exit but DevOpen failed.");
  123. }else{
  124. FSMEvent *evt = new FSMEvent(USER_EVT_EXIT);
  125. m_fsm.PostEventFIFO(evt);
  126. }
  127. }
  128. void QueryCardInfo(SpReqAnsContext<ContactlessCardService_QueryCardInfo_Req, ContactlessCardService_QueryCardInfo_Ans>::Pointer ctx)
  129. {
  130. LOG_FUNCTION();
  131. QueryCardInfoEvent* e = new QueryCardInfoEvent();
  132. e->ctx = ctx;
  133. m_fsm.PostEventFIFO(e);
  134. }
  135. void GetDevInfo(SpReqAnsContext<ContactlessCardService_GetDevInfo_Req, ContactlessCardService_GetDevInfo_Ans>::Pointer ctx)
  136. {
  137. LOG_FUNCTION();
  138. ctx->Ans.state = m_fsm.GetDevState();
  139. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("GetDevInfo %d", ctx->Ans.state);
  140. if (m_fsm.GetDevInitingFlag()) {
  141. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetDevInfo device is opening,state return 0");
  142. ctx->Ans.state = DEVICE_STATUS_NOT_READY;
  143. ctx->Answer(Error_NotInit, ContactlessCard_UserErrorCode_DevOpen_Failed);
  144. }
  145. else {
  146. if (!m_fsm.GetDevInitFlag()) {
  147. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetDevInfo device is not open,state return 0");
  148. ctx->Ans.state = DEVICE_STATUS_NOT_READY;
  149. ctx->Answer(Error_DevNotAvailable, ContactlessCard_UserErrorCode_DevOpen_Failed);
  150. }
  151. else {
  152. ctx->Answer(Error_Succeed);
  153. }
  154. }
  155. }
  156. //new interface
  157. void CancelReadJS(SpOnewayCallContext<ContactlessCardService_CancelReadJS_Info>::Pointer ctx)
  158. {
  159. LOG_FUNCTION();
  160. if (!m_fsm.GetDevInitFlag()) {
  161. LogWarn(Severity_Middle, Error_DevNotAvailable, ContactlessCard_UserErrorCode_DevOpen_Failed, "CancelInsert but DevOpen failed.");
  162. }
  163. else {
  164. FSMEvent* evt = new FSMEvent(USER_EVT_JS_READ_CANCEL);
  165. m_fsm.PostEventFIFO(evt);
  166. }
  167. }
  168. void ReadJS(SpReqAnsContext<ContactlessCardService_ReadJS_Req, ContactlessCardService_ReadJS_Ans>::Pointer ctx)
  169. {
  170. LOG_FUNCTION();
  171. if (!m_fsm.GetDevInitFlag()) {
  172. ctx->Answer(Error_DevNotAvailable, ContactlessCard_UserErrorCode_DevOpen_Failed);
  173. }
  174. else if (_stricmp(m_fsm.GetCurrStateName(), "Idle") != 0) {
  175. DWORD errCode = m_fsm.GetFsmStateErrCode();
  176. int state = m_fsm.GetFSMState();
  177. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode(m_fsm.getRTACode(errCode))("ReadJS req is unhandled ,CurrState=%d", state);
  178. ctx->Answer(Error_Unexpect, errCode);
  179. }
  180. else {
  181. ReadJSEvent* pEvt = new ReadJSEvent();
  182. pEvt->ctx = ctx;
  183. m_fsm.PostEventFIFO(pEvt);
  184. }
  185. }
  186. void PostOnlineJS(SpReqAnsContext<ContactlessCardService_PostOnlineJS_Req, ContactlessCardService_PostOnlineJS_Ans>::Pointer ctx)
  187. {
  188. LOG_FUNCTION();
  189. if (!m_fsm.GetDevInitFlag()) {
  190. ctx->Answer(Error_DevNotAvailable, ContactlessCard_UserErrorCode_DevOpen_Failed);
  191. }
  192. else if (_stricmp(m_fsm.GetCurrStateName(), "Idle") != 0) {
  193. DWORD errCode = m_fsm.GetFsmStateErrCode();
  194. int state = m_fsm.GetFSMState();
  195. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode(m_fsm.getRTACode(errCode))("PostOnlineJS req is unhandled ,CurrState=%d", state);
  196. ctx->Answer(Error_Unexpect, errCode);
  197. }
  198. else {
  199. PostOnlineJSEvent* pEvt = new PostOnlineJSEvent();
  200. pEvt->ctx = ctx;
  201. m_fsm.PostEventFIFO(pEvt);
  202. }
  203. }
  204. void EjectJS(SpReqAnsContext<ContactlessCardService_EjectJS_Req, ContactlessCardService_EjectJS_Ans>::Pointer ctx)
  205. {
  206. LOG_FUNCTION();
  207. if (!m_fsm.GetDevInitFlag()) {
  208. ctx->Answer(Error_DevNotAvailable, ContactlessCard_UserErrorCode_DevOpen_Failed);
  209. }
  210. else if (_stricmp(m_fsm.GetCurrStateName(), "Idle") != 0) {
  211. DWORD errCode = m_fsm.GetFsmStateErrCode();
  212. int state = m_fsm.GetFSMState();
  213. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode(m_fsm.getRTACode(errCode))("EjectJS req is unhandled ,CurrState=%d", state);
  214. ctx->Answer(Error_Unexpect, errCode);
  215. }
  216. else {
  217. EjectJSEvent* e = new EjectJSEvent();
  218. e->ctx = ctx;
  219. m_fsm.PostEventFIFO(e);
  220. }
  221. }
  222. void QueryHasCardJS(SpReqAnsContext<ContactlessCardService_QueryHasCardJS_Req, ContactlessCardService_QueryHasCardJS_Ans>::Pointer ctx)
  223. {
  224. LOG_FUNCTION();
  225. if (!m_fsm.GetDevInitFlag()) {
  226. ctx->Answer(Error_DevNotAvailable, ContactlessCard_UserErrorCode_DevOpen_Failed);
  227. }
  228. else {
  229. m_fsm.QueryHasCardJS(ctx);
  230. }
  231. }
  232. virtual void OnSelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext)
  233. {
  234. m_fsm.SelfTest(eTestType,pTransactionContext);
  235. }
  236. virtual CServerSessionBase* OnNewSession(const char*,const char*)
  237. {
  238. return new ContactlessCardServerSession(this);
  239. }
  240. virtual void OnSysVarEvent(const char* pszKey, const char* pszValue, const char* pszOldValue, const char* pszEntityName);
  241. virtual bool IsService()const{return true;}
  242. virtual bool IsMultiThread()const{return true;}
  243. protected:
  244. private:
  245. CContactlessCardFSM m_fsm;
  246. private:
  247. };
  248. #endif //_MOD_CONTACTLESS_H