mod_ContactlessCard.h 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  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. 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. if (ctx->Ans.state != DEVICE_STATUS_NORMAL) {
  153. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetDevInfo %d", ctx->Ans.state);
  154. }
  155. ctx->Answer(Error_Succeed);
  156. }
  157. }
  158. }
  159. //new interface
  160. void CancelReadJS(SpOnewayCallContext<ContactlessCardService_CancelReadJS_Info>::Pointer ctx)
  161. {
  162. LOG_FUNCTION();
  163. if (!m_fsm.GetDevInitFlag()) {
  164. LogWarn(Severity_Middle, Error_DevNotAvailable, ContactlessCard_UserErrorCode_DevOpen_Failed, "CancelInsert but DevOpen failed.");
  165. }
  166. else {
  167. FSMEvent* evt = new FSMEvent(USER_EVT_JS_READ_CANCEL);
  168. m_fsm.PostEventFIFO(evt);
  169. }
  170. }
  171. void ReadJS(SpReqAnsContext<ContactlessCardService_ReadJS_Req, ContactlessCardService_ReadJS_Ans>::Pointer ctx)
  172. {
  173. LOG_FUNCTION();
  174. if (!m_fsm.GetDevInitFlag()) {
  175. ctx->Answer(Error_DevNotAvailable, ContactlessCard_UserErrorCode_DevOpen_Failed);
  176. }
  177. else if (_stricmp(m_fsm.GetCurrStateName(), "Idle") != 0) {
  178. DWORD errCode = m_fsm.GetFsmStateErrCode();
  179. int state = m_fsm.GetFSMState();
  180. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode(m_fsm.getRTACode(errCode))("ReadJS req is unhandled ,CurrState=%d", state);
  181. ctx->Answer(Error_Unexpect, errCode);
  182. }
  183. else {
  184. ReadJSEvent* pEvt = new ReadJSEvent();
  185. pEvt->ctx = ctx;
  186. m_fsm.PostEventFIFO(pEvt);
  187. }
  188. }
  189. void PostOnlineJS(SpReqAnsContext<ContactlessCardService_PostOnlineJS_Req, ContactlessCardService_PostOnlineJS_Ans>::Pointer ctx)
  190. {
  191. LOG_FUNCTION();
  192. if (!m_fsm.GetDevInitFlag()) {
  193. ctx->Answer(Error_DevNotAvailable, ContactlessCard_UserErrorCode_DevOpen_Failed);
  194. }
  195. else if (_stricmp(m_fsm.GetCurrStateName(), "Idle") != 0) {
  196. DWORD errCode = m_fsm.GetFsmStateErrCode();
  197. int state = m_fsm.GetFSMState();
  198. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode(m_fsm.getRTACode(errCode))("PostOnlineJS req is unhandled ,CurrState=%d", state);
  199. ctx->Answer(Error_Unexpect, errCode);
  200. }
  201. else {
  202. PostOnlineJSEvent* pEvt = new PostOnlineJSEvent();
  203. pEvt->ctx = ctx;
  204. m_fsm.PostEventFIFO(pEvt);
  205. }
  206. }
  207. void EjectJS(SpReqAnsContext<ContactlessCardService_EjectJS_Req, ContactlessCardService_EjectJS_Ans>::Pointer ctx)
  208. {
  209. LOG_FUNCTION();
  210. if (!m_fsm.GetDevInitFlag()) {
  211. ctx->Answer(Error_DevNotAvailable, ContactlessCard_UserErrorCode_DevOpen_Failed);
  212. }
  213. else if (_stricmp(m_fsm.GetCurrStateName(), "Idle") != 0) {
  214. DWORD errCode = m_fsm.GetFsmStateErrCode();
  215. int state = m_fsm.GetFSMState();
  216. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode(m_fsm.getRTACode(errCode))("EjectJS req is unhandled ,CurrState=%d", state);
  217. ctx->Answer(Error_Unexpect, errCode);
  218. }
  219. else {
  220. EjectJSEvent* e = new EjectJSEvent();
  221. e->ctx = ctx;
  222. m_fsm.PostEventFIFO(e);
  223. }
  224. }
  225. void QueryHasCardJS(SpReqAnsContext<ContactlessCardService_QueryHasCardJS_Req, ContactlessCardService_QueryHasCardJS_Ans>::Pointer ctx)
  226. {
  227. LOG_FUNCTION();
  228. if (!m_fsm.GetDevInitFlag()) {
  229. ctx->Answer(Error_DevNotAvailable, ContactlessCard_UserErrorCode_DevOpen_Failed);
  230. }
  231. else {
  232. m_fsm.QueryHasCardJS(ctx);
  233. }
  234. }
  235. virtual void OnSelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext)
  236. {
  237. m_fsm.SelfTest(eTestType,pTransactionContext);
  238. }
  239. virtual CServerSessionBase* OnNewSession(const char*,const char*)
  240. {
  241. return new ContactlessCardServerSession(this);
  242. }
  243. virtual void OnSysVarEvent(const char* pszKey, const char* pszValue, const char* pszOldValue, const char* pszEntityName);
  244. virtual bool IsService()const{return true;}
  245. virtual bool IsMultiThread()const{return true;}
  246. protected:
  247. private:
  248. CContactlessCardFSM m_fsm;
  249. private:
  250. };
  251. #endif //_MOD_CONTACTLESS_H