mod_ScannerSet.h 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. #ifndef _MOD_HSPSCANNER_H_
  2. #define _MOD_HSPSCANNER_H_
  3. #pragma once
  4. #include "modVer.h"
  5. #if defined(RVC_OS_LINUX)
  6. #include "SpTest.h"
  7. #endif //RVC_OS_LINUX
  8. #include "ScannerSetFSM.h"
  9. #include "EventCode.h"
  10. #include "ScannerSet_UserErrorCode.h"
  11. #include "HSPScanner_client_g.h"
  12. using namespace HSPScanner;
  13. using namespace ScannerSet;
  14. class CScannerEntity;
  15. class ScannerServerSession: public ScannerService_ServerSessionBase
  16. {
  17. public:
  18. ScannerServerSession(CScannerEntity *pEntity):m_pEntity(pEntity){}
  19. virtual ~ScannerServerSession(){}
  20. virtual void Handle_StartPreview(SpReqAnsContext<ScannerService_StartPreview_Req,
  21. ScannerService_StartPreview_Ans>::Pointer ctx);
  22. virtual void Handle_CancelPreview(SpReqAnsContext<ScannerService_CancelPreview_Req,
  23. ScannerService_CancelPreview_Ans>::Pointer ctx);
  24. virtual void Handle_ScanImage(SpReqAnsContext<ScannerService_ScanImage_Req,
  25. ScannerService_ScanImage_Ans>::Pointer ctx);
  26. virtual void Handle_SetWindowPos(SpReqAnsContext<ScannerService_SetWindowPos_Req,
  27. ScannerService_SetWindowPos_Ans>::Pointer ctx);
  28. virtual void Handle_SetProperty(SpReqAnsContext<ScannerService_SetProperty_Req,
  29. ScannerService_SetProperty_Ans>::Pointer ctx);
  30. virtual void Handle_ShowProperty(SpReqAnsContext<ScannerService_ShowProperty_Req,
  31. ScannerService_ShowProperty_Ans>::Pointer ctx);
  32. virtual void Handle_GetDevStatus(SpReqAnsContext<ScannerService_GetDevStatus_Req,
  33. ScannerService_GetDevStatus_Ans>::Pointer ctx);
  34. virtual void Handle_GetDevInfo(SpReqAnsContext<ScannerService_GetDevInfo_Req,
  35. ScannerService_GetDevInfo_Ans>::Pointer ctx);
  36. virtual void Handle_GetOnlineCameras(SpReqAnsContext<ScannerService_GetOnlineCameras_Req, ScannerService_GetOnlineCameras_Ans>::Pointer ctx);
  37. virtual void Handle_Exit(SpOnewayCallContext<ScannerService_Exit_Info>::Pointer ctx);
  38. private:
  39. CScannerEntity *m_pEntity;
  40. };
  41. class HSPScannerClient : public HSPScannerService_ClientBase
  42. {
  43. public:
  44. HSPScannerClient(CScannerEntity *pEntity);
  45. };
  46. class CScannerEntity : public CEntityBase, public IEntityStateListener
  47. {
  48. public:
  49. CScannerEntity() {}
  50. virtual ~CScannerEntity()
  51. {
  52. if(GetFunction()->HasPrivilege()) {
  53. CSmartPointer<IEntityFunction> pFunc = GetFunction();
  54. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  55. pFuncPrivilege->UnregistEntityStateEvent(m_fsm.GetChildEntityName());
  56. }
  57. }
  58. virtual const char *GetEntityName() const { return "ScannerSet"; }
  59. const char* GetEntityVersion() const { return MODULE_VERSION_FULL; }
  60. #if defined(RVC_OS_LINUX)
  61. ON_ENTITYT_TEST()
  62. #endif //RVC_OS_LINUX
  63. virtual CServerSessionBase* OnNewSession(const char* , const char * )
  64. {
  65. return new ScannerServerSession(this);
  66. }
  67. virtual void OnPreStart(CAutoArray<CSimpleStringA> strArgs,
  68. CSmartPointer<ITransactionContext> pTransactionContext)
  69. {
  70. ErrorCodeEnum erroCode = m_fsm.Init(this);
  71. pTransactionContext->SendAnswer(erroCode);
  72. }
  73. void OnStarted()
  74. {
  75. if(GetFunction()->HasPrivilege()) {
  76. CSmartPointer<IEntityFunction> pFunc = GetFunction();
  77. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  78. pFuncPrivilege->RegistEntityStateEvent(m_fsm.GetChildEntityName(), this);
  79. } else {
  80. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("cur entity has no priviledge!");
  81. }
  82. m_fsm.AfterInit();
  83. }
  84. virtual void OnPrePause(CSmartPointer<ITransactionContext> pTransactionContext)
  85. {
  86. LOG_FUNCTION();
  87. #ifdef TWINKLE_LOCAL_DEBUG
  88. const UINT result = UniTest(this);
  89. if(result != 0) {
  90. LogError(Severity_High, Error_Unexpect, result, CSimpleStringA::Format("line: %u", result));
  91. }
  92. #endif
  93. SpReqAnsContext<ScannerService_StartPreview_Req,
  94. ScannerService_StartPreview_Ans>::Pointer ctx =
  95. new SpReqAnsContext<ScannerService_StartPreview_Req,
  96. ScannerService_StartPreview_Ans>(pTransactionContext);
  97. Preview(ctx);
  98. pTransactionContext->SendAnswer(Error_Succeed);
  99. }
  100. virtual void OnPreContinue(CSmartPointer<ITransactionContext> pTransactionContext)
  101. {
  102. Exit(NULL);
  103. pTransactionContext->SendAnswer(Error_Succeed);
  104. }
  105. virtual void OnPreClose(EntityCloseCauseEnum eCloseCause,
  106. CSmartPointer<ITransactionContext> pTransactionContext)
  107. {
  108. ErrorCodeEnum erroCode = m_fsm.OnExit();
  109. pTransactionContext->SendAnswer(erroCode);
  110. }
  111. void Preview(SpReqAnsContext<ScannerService_StartPreview_Req,
  112. ScannerService_StartPreview_Ans>::Pointer ctx)
  113. {
  114. StartPreviewEvent* pEvent = new StartPreviewEvent();
  115. pEvent->m_ctx = ctx;
  116. m_fsm.PostEventFIFO(pEvent);
  117. }
  118. void CancelPreview(SpReqAnsContext<ScannerService_CancelPreview_Req,
  119. ScannerService_CancelPreview_Ans>::Pointer ctx)
  120. {
  121. StopPreviewEvent* pEvent = new StopPreviewEvent();
  122. pEvent->m_ctx = ctx;
  123. m_fsm.PostEventFIFO(pEvent);
  124. }
  125. void ScanImage(SpReqAnsContext<ScannerService_ScanImage_Req,
  126. ScannerService_ScanImage_Ans>::Pointer ctx)
  127. {
  128. ScanImageEvent* pEvent = new ScanImageEvent();
  129. pEvent->m_ctx = ctx;
  130. m_fsm.PostEventFIFO(pEvent);
  131. }
  132. void Exit(SpOnewayCallContext<ScannerService_Exit_Info>::Pointer ctx)
  133. {
  134. ErrorCodeEnum erroCode = m_fsm.OnDevExit();
  135. }
  136. void GetDevInfo(SpReqAnsContext<ScannerService_GetDevInfo_Req,
  137. ScannerService_GetDevInfo_Ans>::Pointer ctx)
  138. {
  139. m_fsm.GetDevInfo(ctx);
  140. return;
  141. }
  142. void SetWinPos(SpReqAnsContext<ScannerService_SetWindowPos_Req,
  143. ScannerService_SetWindowPos_Ans>::Pointer ctx)
  144. {
  145. static ScannerService_SetWindowPos_Req lastReq = {-1, -1, -1, -1, -1};
  146. if((ctx->Req.type != lastReq.type
  147. || ctx->Req.pointX != lastReq.pointX
  148. || ctx->Req.pointY != lastReq.pointY
  149. || ctx->Req.nWidth != lastReq.nWidth
  150. /*|| ctx->Req.reserved4 != lastReq.reserved4*/)) {
  151. lastReq.type = ctx->Req.type;
  152. lastReq.pointX = ctx->Req.pointX;
  153. lastReq.pointY = ctx->Req.pointY;
  154. lastReq.nWidth = ctx->Req.nWidth;
  155. lastReq.reserved4 = ctx->Req.reserved4;
  156. PendingTask* pTask = new PendingTask(&m_fsm);
  157. pTask->SetContext(ctx);
  158. GetFunction()->PostThreadPoolTask(pTask);
  159. } else {
  160. LogWarn(Severity_Low, Error_Debug, LOG_WARN_DUPLICATE_SETWINPOS
  161. , CSimpleStringA::Format("same request with last-one: %d,%d,%d,%d,%d"
  162. , ctx->Req.type, ctx->Req.pointX, ctx->Req.pointY, ctx->Req.nWidth, ctx->Req.reserved4));
  163. ctx->Answer(Error_Succeed);
  164. }
  165. }
  166. void SetProperty(SpReqAnsContext<ScannerService_SetProperty_Req,
  167. ScannerService_SetProperty_Ans>::Pointer ctx)
  168. {
  169. WaitingFSMForIdle();
  170. SetPropertyEvent* pEvent = new SetPropertyEvent();
  171. pEvent->m_ctx = ctx;
  172. m_fsm.PostEventFIFO(pEvent);
  173. }
  174. void ShowProperty(SpReqAnsContext<ScannerService_ShowProperty_Req,
  175. ScannerService_ShowProperty_Ans>::Pointer ctx)
  176. {
  177. ShowPropertyEvent* pEvent = new ShowPropertyEvent();
  178. pEvent->m_ctx = ctx;
  179. m_fsm.PostEventFIFO(pEvent);
  180. }
  181. void GetDevStatus(SpReqAnsContext<ScannerService_GetDevStatus_Req,
  182. ScannerService_GetDevStatus_Ans>::Pointer ctx)
  183. {
  184. m_fsm.GetDevStatus(ctx);
  185. return;
  186. }
  187. void OnSelfTest(EntityTestEnum eTestType, CSmartPointer<ITransactionContext> pTransactionContext)
  188. {
  189. m_fsm.SelfTest(eTestType, pTransactionContext);
  190. }
  191. virtual bool IsService() const { return true; }
  192. virtual bool IsMultiThread() const { return true; };
  193. void OnEntityStateHook(const char *pszEntityName,const char *pszTriggerEntity,
  194. EntityStateEnum eState,EntityStateEnum eLastState)
  195. {
  196. }
  197. void OnUserStateHook(const char *pszEntityName,DWORD dwState,DWORD dwLastState)
  198. {
  199. }
  200. void OnCeateConnection(const char *pszCallerEntity,const char *pszServiceEntity)
  201. {
  202. }
  203. void OnCloseConnection(const char *pszCallerEntity,const char *pszServiceEntity)
  204. {
  205. }
  206. void WaitingFSMForIdle()
  207. {
  208. static const int waitTimes = 30;
  209. static const int waitEachTimeout = 300;
  210. int waitCurrTimes = 0;
  211. while(m_fsm.IsWorking() && (++waitCurrTimes <= waitTimes)) {
  212. Sleep(waitEachTimeout);
  213. }
  214. if(waitCurrTimes > waitTimes) {
  215. LogWarn(Severity_Low, Error_TimeOut, 0, "Waiting FSM to Idle timeout!");
  216. }
  217. }
  218. private:
  219. CScannerFSM m_fsm;
  220. };
  221. HSPScannerClient::HSPScannerClient(CScannerEntity *pEntity)
  222. :HSPScannerService_ClientBase(pEntity)
  223. {
  224. }
  225. #endif