mod_ContactlessCard.h 9.9 KB

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