ScannerSetFSM.h 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823
  1. #ifndef _SCANNERSET_FSM_H_
  2. #define _SCANNERSET_FSM_H_
  3. #pragma once
  4. #include "SpFSM.h"
  5. #include "ScannerSet_server_g.h"
  6. #include "ScannerSet_msg_g.h"
  7. using namespace ScannerSet;
  8. #define SS_MAX_METHOD_COUNT 11
  9. #include "HSPScanner_client_g.h"
  10. #include "PortableScanner_client_g.h"
  11. #include "MediaController_client_g.h"
  12. using namespace HSPScanner;
  13. using namespace PortableScanner;
  14. #if defined(RVC_OS_WIN)
  15. #include "CameraImpl.h"
  16. #else
  17. #include <mutex>
  18. #endif //RVC_OS_WIN
  19. #include "DeviceCrossHelper.h"
  20. #include "EventCode.h"
  21. #include "ScannerSet_UserErrorCode.h"
  22. #include "CameraOccupySysVar.hpp"
  23. #define ISSUCCEEDED(hr) ((hr) == Error_Succeed)
  24. #define FAILURED(hr) (!(ISSUCCEEDED(hr)))
  25. #define DECLARE_ENTITY_CLIENT_ENTITY(tEntityName, tEntityBaseName) \
  26. class C##tEntityName##Client : public tEntityBaseName##_ClientBase \
  27. { \
  28. public: \
  29. C##tEntityName##Client(CEntityBase *pEntity) \
  30. :tEntityBaseName##_ClientBase(pEntity) \
  31. {/*empty constructor*/ } \
  32. }
  33. class CHSPSInnerClient : public HSPScannerService_ClientBase
  34. {
  35. public:
  36. CHSPSInnerClient(CEntityBase *pEntity)
  37. :HSPScannerService_ClientBase(pEntity)
  38. {
  39. }
  40. };
  41. class CPortableScannerClient : public PortableScannerService_ClientBase
  42. {
  43. public:
  44. CPortableScannerClient(CEntityBase *pEntity)
  45. :PortableScannerService_ClientBase(pEntity)
  46. {
  47. }
  48. };
  49. class CMediaCtrlClient : public MediaController::MediaService_ClientBase
  50. {
  51. public:
  52. CMediaCtrlClient(CEntityBase *pEntity)
  53. :MediaController::MediaService_ClientBase(pEntity)
  54. {
  55. }
  56. };
  57. template<typename TEntity>
  58. struct AvailableEntityCheck {
  59. typedef TEntity Type;
  60. bool operator()(CEntityBase* base) {
  61. Type* pCheckClient = new Type(base);
  62. ErrorCodeEnum erroCode = pCheckClient->Connect();
  63. if(FAILURED(erroCode))
  64. {
  65. pCheckClient->SafeDelete();
  66. pCheckClient = NULL;
  67. return false;
  68. }
  69. pCheckClient->GetFunction()->CloseSession();
  70. pCheckClient = NULL;
  71. return true;
  72. }
  73. };
  74. struct ScannerDeviceInfo
  75. {
  76. CSimpleStringA strDevName;
  77. CapTypeEnum devType;
  78. BOOL bIdle;
  79. int devIdx;
  80. };
  81. enum EvtType
  82. {
  83. USER_EVT_STARTPREVIEW = (EVT_USER + 1),
  84. USER_EVT_STARTPREVIEW_FINISHED,
  85. USER_EVT_STOPPREVIEW,
  86. USER_EVT_STOPPREVIEW_FINISHED,
  87. USER_EVT_SETWINPOS,
  88. USER_EVT_SETWINPOS_FINISHED,
  89. USER_EVT_SCANIMAGE,
  90. USER_EVT_SCANIMAGEFINISHED,
  91. USER_EVT_SETPROPERTY,
  92. USER_EVT_SETPROPERTY_FINISHED,
  93. USER_EVT_SHOWPROPERTY,
  94. USER_EVT_SHOWPROPERTY_FINISHED,
  95. USER_EVT_GETSTATUS,
  96. USER_EVT_GETSTATUS_FINISHED,
  97. USER_EVT_GETINFO,
  98. USER_EVT_GETINFO_FINISHED,
  99. USER_EVT_CROSS_CALL,
  100. USER_EVT_CROSS_CALL_FINISHED,
  101. USER_EVT_CROSS_CALL_ONEWAY,
  102. USER_EVT_CROSS_CALL_ONEWAY_FINISHED,
  103. USER_EVT_DEV_INVALID,
  104. USER_EVT_DEV_RECOVER,
  105. USER_EVT_OPERATING,
  106. USER_EVT_RESET,
  107. USER_EVT_EXIT,
  108. USER_EVT_QUIT,
  109. //////////////////////////////////////////////////////////////////////////
  110. USER_EVT_ESTIMATE,
  111. USER_EVT_ESTIMATE_FINISHED,
  112. USER_EVT_CAMERA_INSERD,
  113. USER_EVT_CAMERA_REMOVED
  114. };
  115. class StartPreviewEvent : public FSMEvent
  116. {
  117. public:
  118. StartPreviewEvent() : FSMEvent(USER_EVT_STARTPREVIEW){}
  119. ~StartPreviewEvent(){}
  120. SpReqAnsContext<ScannerService_StartPreview_Req, ScannerService_StartPreview_Ans>::Pointer m_ctx;
  121. virtual void OnUnhandled()
  122. {
  123. if(m_ctx != NULL)
  124. {
  125. m_ctx->Answer(Error_InvalidState, LOG_WARN_FSM_INVALID);
  126. }
  127. }
  128. };
  129. class StopPreviewEvent : public FSMEvent
  130. {
  131. public:
  132. StopPreviewEvent() : FSMEvent(USER_EVT_STOPPREVIEW){}
  133. ~StopPreviewEvent(){}
  134. SpReqAnsContext<ScannerService_CancelPreview_Req,
  135. ScannerService_CancelPreview_Ans>::Pointer m_ctx;
  136. virtual void OnUnhandled()
  137. {
  138. if(m_ctx != NULL)
  139. {
  140. m_ctx->Answer(Error_InvalidState, LOG_WARN_FSM_INVALID);
  141. }
  142. }
  143. };
  144. class ScanImageEvent : public FSMEvent
  145. {
  146. public:
  147. ScanImageEvent() : FSMEvent(USER_EVT_SCANIMAGE){}
  148. ~ScanImageEvent(){}
  149. SpReqAnsContext<ScannerService_ScanImage_Req,
  150. ScannerService_ScanImage_Ans>::Pointer m_ctx;
  151. virtual void OnUnhandled()
  152. {
  153. if(m_ctx != NULL)
  154. {
  155. m_ctx->Answer(Error_InvalidState, LOG_WARN_FSM_INVALID);
  156. }
  157. }
  158. };
  159. class OperatingEvent: public FSMEvent
  160. {
  161. public:
  162. OperatingEvent(int iEvt):FSMEvent(USER_EVT_OPERATING),m_bindEvt(iEvt) {}
  163. ~OperatingEvent(){}
  164. int m_bindEvt;
  165. };
  166. class SetPropertyEvent : public FSMEvent
  167. {
  168. public:
  169. SetPropertyEvent() : FSMEvent(USER_EVT_SETPROPERTY){}
  170. ~SetPropertyEvent(){}
  171. SpReqAnsContext<ScannerService_SetProperty_Req,
  172. ScannerService_SetProperty_Ans>::Pointer m_ctx;
  173. virtual void OnUnhandled()
  174. {
  175. if(m_ctx != NULL)
  176. {
  177. m_ctx->Answer(Error_InvalidState, LOG_WARN_FSM_INVALID);
  178. }
  179. }
  180. };
  181. class ShowPropertyEvent : public FSMEvent
  182. {
  183. public:
  184. ShowPropertyEvent() : FSMEvent(USER_EVT_SHOWPROPERTY){}
  185. ~ShowPropertyEvent(){}
  186. SpReqAnsContext<ScannerService_ShowProperty_Req,
  187. ScannerService_ShowProperty_Ans>::Pointer m_ctx;
  188. virtual void OnUnhandled()
  189. {
  190. if(m_ctx != NULL)
  191. {
  192. m_ctx->Answer(Error_InvalidState, LOG_WARN_FSM_INVALID);
  193. }
  194. }
  195. };
  196. class SetWinPosEvent : public FSMEvent
  197. {
  198. public:
  199. SetWinPosEvent() : FSMEvent(USER_EVT_SETWINPOS){}
  200. ~SetWinPosEvent(){}
  201. SpReqAnsContext<ScannerService_SetWindowPos_Req,
  202. ScannerService_SetWindowPos_Ans>::Pointer m_ctx;
  203. virtual void OnUnhandled()
  204. {
  205. if(m_ctx != NULL)
  206. {
  207. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("set winpos unhandle!");
  208. m_ctx->Answer(Error_InvalidState, LOG_WARN_FSM_INVALID);
  209. }
  210. }
  211. };
  212. class GetDevStatusEvent : public FSMEvent
  213. {
  214. public:
  215. GetDevStatusEvent() : FSMEvent(USER_EVT_GETSTATUS){}
  216. ~GetDevStatusEvent(){}
  217. SpReqAnsContext<ScannerService_GetDevStatus_Req,
  218. ScannerService_GetDevStatus_Ans>::Pointer m_ctx;
  219. virtual void OnUnhandled()
  220. {
  221. if(m_ctx != NULL)
  222. {
  223. m_ctx->Answer(Error_InvalidState, LOG_WARN_FSM_INVALID);
  224. }
  225. }
  226. };
  227. class GetDevInfoEvent : public FSMEvent
  228. {
  229. public:
  230. GetDevInfoEvent() : FSMEvent(USER_EVT_GETINFO){}
  231. ~GetDevInfoEvent(){}
  232. SpReqAnsContext<ScannerService_GetDevInfo_Req,
  233. ScannerService_GetDevInfo_Ans>::Pointer m_ctx;
  234. virtual void OnUnhandled()
  235. {
  236. if(m_ctx != NULL)
  237. {
  238. m_ctx->Answer(Error_InvalidState, LOG_WARN_FSM_INVALID);
  239. }
  240. }
  241. };
  242. class CScannerFSM : public FSMImpl<CScannerFSM>, public IFSMStateHooker
  243. {
  244. public:
  245. CScannerFSM(void);
  246. ~CScannerFSM(void);
  247. virtual ErrorCodeEnum OnInit();
  248. virtual ErrorCodeEnum OnExit();
  249. void SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext);
  250. enum {s0, s1, s2, s3, s4};
  251. BEGIN_FSM_STATE(CScannerFSM)
  252. FSM_STATE_ENTRY(s0, "Idle", s0_on_entry, s0_on_exit, s0_on_event)
  253. FSM_STATE_ENTRY(s1, "Estimate", s1_on_entry, s1_on_exit, s1_on_event) //no used now!!!
  254. FSM_STATE_ENTRY(s2, "Operating", s2_on_entry, s2_on_exit, s2_on_event)
  255. FSM_STATE_ENTRY(s3, "Failed", s3_on_entry, s3_on_exit, s3_on_event)
  256. FSM_STATE_ENTRY(s4, "Invalid", s4_on_entry, s4_on_exit, s4_on_event)
  257. END_FSM_STATE()
  258. BEGIN_FSM_RULE(CScannerFSM, s0)
  259. FSM_RULE_ENTRY_ANY(s0, s4, USER_EVT_DEV_INVALID)
  260. FSM_RULE_ENTRY_ANY(s4, s0, USER_EVT_DEV_RECOVER)
  261. FSM_RULE_ENTRY_ANY(s0, s2, USER_EVT_OPERATING)
  262. /*S2 中所有处理结果都返回1,见 s2_on_event 实现*/
  263. FSM_RULE_ENTRY(s2, s0, USER_EVT_STARTPREVIEW_FINISHED, 1)
  264. FSM_RULE_ENTRY(s2, s0, USER_EVT_STOPPREVIEW_FINISHED, 1)
  265. FSM_RULE_ENTRY(s2, s0, USER_EVT_SCANIMAGEFINISHED, 1)
  266. FSM_RULE_ENTRY(s2, s0, USER_EVT_SETPROPERTY_FINISHED, 1)
  267. FSM_RULE_ENTRY(s2, s0, USER_EVT_SHOWPROPERTY_FINISHED, 1)
  268. FSM_RULE_ENTRY(s2, s0, USER_EVT_SETWINPOS_FINISHED, 1)
  269. END_FSM_RULE()
  270. virtual void s0_on_entry();
  271. virtual void s0_on_exit();
  272. virtual unsigned int s0_on_event(FSMEvent* e);
  273. virtual void s1_on_entry();
  274. virtual void s1_on_exit();
  275. virtual unsigned int s1_on_event(FSMEvent* e);
  276. virtual void s2_on_entry();
  277. virtual void s2_on_exit();
  278. virtual unsigned int s2_on_event(FSMEvent* e);
  279. virtual void s3_on_entry();
  280. virtual void s3_on_exit();
  281. virtual unsigned int s3_on_event(FSMEvent* e);
  282. virtual void s4_on_entry();
  283. virtual void s4_on_exit();
  284. virtual unsigned int s4_on_event(FSMEvent* e);
  285. virtual void OnStateTrans(int iSrcState, int iDstState);
  286. int StartPreview(SpReqAnsContext<ScannerService_StartPreview_Req,
  287. ScannerService_StartPreview_Ans>::Pointer ctx);
  288. int StopPreview(SpReqAnsContext<ScannerService_CancelPreview_Req,
  289. ScannerService_CancelPreview_Ans>::Pointer ctx);
  290. int ScanImage(SpReqAnsContext<ScannerService_ScanImage_Req,
  291. ScannerService_ScanImage_Ans>::Pointer ctx);
  292. int SetProperty(SpReqAnsContext<ScannerService_SetProperty_Req,
  293. ScannerService_SetProperty_Ans>::Pointer ctx);
  294. int ShowLTProperty(SpReqAnsContext<ScannerService_ShowProperty_Req,
  295. ScannerService_ShowProperty_Ans>::Pointer ctx);
  296. int SetWinPos(SpReqAnsContext<ScannerService_SetWindowPos_Req,
  297. ScannerService_SetWindowPos_Ans>::Pointer ctx);
  298. int GetDevStatus(SpReqAnsContext<ScannerService_GetDevStatus_Req,
  299. ScannerService_GetDevStatus_Ans>::Pointer ctx);
  300. int GetDevInfo(SpReqAnsContext<ScannerService_GetDevInfo_Req,
  301. ScannerService_GetDevInfo_Ans>::Pointer ctx);
  302. int GetOnlineDevices(SpReqAnsContext<ScannerService_GetOnlineCameras_Req,
  303. ScannerService_GetOnlineCameras_Ans>::Pointer ctx);
  304. ErrorCodeEnum DropOffPortScannerDevice(bool skipToCheck = true);
  305. void InitializeMehodQueue();
  306. void DestoryMethodQueue();
  307. ErrorCodeEnum OnDevExit();
  308. ErrorCodeEnum AttachCheck();
  309. ErrorCodeEnum AttachReleaseIfNecessary();
  310. bool IsWorking() {
  311. return (GetCurrState()->id == s2);
  312. }
  313. const char* GetChildEntityName() {
  314. if(m_bUsePortableScanner) {
  315. return "PortableScanner";
  316. } else {
  317. return "HSPSCanner";
  318. }
  319. }
  320. void OnChildEntityStateChange(const EntityStateEnum& oldState, const EntityStateEnum& curState);
  321. private:
  322. CSimpleStringA m_csMachineType;
  323. CSimpleStringA m_csSite;
  324. bool m_bPadMachine;
  325. bool m_bStand2SMachine;
  326. bool m_bDesk2SMachine;
  327. bool m_bUsePortableScanner;
  328. CHSPSInnerClient* m_pHSPSClient;
  329. CPortableScannerClient* m_pPortableClient;
  330. CMediaCtrlClient* m_pMediaControlClient;
  331. ErrorCodeEnum m_ecSelfTest;
  332. DWORD m_dwErroCode;
  333. int m_nFatalTimes;
  334. int m_nSrcState;
  335. CSimpleStringA m_strTerminalNo;
  336. int m_iEvt;
  337. HRESULT m_hrCoInited;
  338. #if defined(RVC_OS_WIN)
  339. CAMERA_BUCKET m_cameralist;
  340. CRITICAL_SECTION cs_devEvt;
  341. #else
  342. std::mutex mMtx;
  343. #endif //RVC_OS_WIN
  344. static const int FIX_CAMERA_COUNTS = 3;
  345. ScannerDeviceInfo m_fixedCamera[FIX_CAMERA_COUNTS];
  346. CSimpleStringA m_strEwsRecordName;
  347. bool m_bEwsNameRefreshed;
  348. LIST_ENTRY ContextListHead;
  349. TC_ENTITY_INTERFACE_QUEUE m_methods[SS_MAX_METHOD_COUNT];
  350. public:
  351. DWORD GetCustLastErrorCode() { return m_dwErroCode; }
  352. void SetCustLastErrorCode(DWORD dwVal = 0) { m_dwErroCode = dwVal; }
  353. void OnDeviceInsert();
  354. void OnDeviceRemoved();
  355. void PSEntityPostCameraError(LPCTSTR lpcszCameraName);
  356. public:
  357. bool IsHSPSConnectSessionOK();
  358. bool IsPortableConnectSessionOK();
  359. ErrorCodeEnum CheckHSPSConnectStatus();
  360. ErrorCodeEnum ConnectToHSPScanner();
  361. void FreeHSPScannerClient()
  362. {
  363. if(m_pHSPSClient)
  364. {
  365. m_pHSPSClient->GetFunction()->CloseSession();
  366. m_pHSPSClient = NULL;
  367. }
  368. }
  369. ErrorCodeEnum GetHSPSInfo();
  370. ErrorCodeEnum CheckPortableConnectStatus();
  371. ErrorCodeEnum ConnectToPortableScanner();
  372. void FreePortableScannerClient()
  373. {
  374. if(m_pPortableClient) {
  375. m_pPortableClient->GetFunction()->CloseSession();
  376. m_pPortableClient = NULL;
  377. }
  378. }
  379. bool IsNoralEntityState(const EntityStateEnum& state) {
  380. if(state == EntityState_Idle || state == EntityState_Busy
  381. || state == EntityState_Pause
  382. || state == EntityState_UnLoading) {
  383. return true;
  384. }
  385. return false;
  386. }
  387. ErrorCodeEnum GetPortableScannerInfo() {
  388. EntityStateEnum state = EntityState_NoStart;
  389. ErrorCodeEnum rc = GetEntityCurState(state, "PortableScanner");
  390. LogWarn(Severity_Low,Error_Debug,LOG_ERR_SCANNERSET_PORTABLESCANNER_STATE,
  391. CSimpleStringA::Format("PortableScanner entity state: %d(%u)", state, rc));
  392. if(rc == Error_Succeed && IsNoralEntityState(state)) {
  393. //let it empty.
  394. } else if(IsPortScanHoldEnvCameraFromSysVar()){
  395. HandleCamereAccessPriviledge(false, CAMTYPE_ENV, m_fixedCamera[CAMTYPE_ENV-1].strDevName);
  396. ClearPortScanHoldLimitedDevice(CAMTYPE_MAX);
  397. }
  398. return rc;
  399. }
  400. ErrorCodeEnum IsPortScanHoldDevice(ScannerDeviceInfo* pInfo, int& curState);
  401. ErrorCodeEnum IsPortScanHoldDevice(bool& hasHolden, int& DevID, CSimpleStringA& strDevName, bool& bBusy);
  402. bool IsPortScanHoldLimitedDevice(CapTypeEnum& devType);
  403. bool IsPortScanHoldEnvCameraFromSysVar()
  404. {
  405. CapTypeEnum devType(CAMTYPE_UNKNOWN);
  406. return (IsPortScanHoldLimitedDevice(devType) && devType == CAMTYPE_ENV);
  407. }
  408. void ClearPortScanHoldLimitedDevice(const CapTypeEnum& devType, const char* lpcszDevName = NULL);
  409. ErrorCodeEnum TryBindPSDevice(int nDevID, LPCTSTR lpcszDevName);
  410. ErrorCodeEnum BindPSDevice(int nDevID, LPCTSTR lpcszDevName);
  411. int GetAdvancedScannerDevice(ScannerDeviceInfo* pDevInfo);
  412. int GetAdvancedScannerDeviceEx(ScannerDeviceInfo* pDevInfo,
  413. const CAutoArray<CSimpleStringA>& caForbitDeviceNames);
  414. void SendBroadcastAbout();
  415. void WaitPortableReleaseCamera(int nCameraType, DWORD dwTimeoutMilSec = 3000);
  416. ErrorCodeEnum ConnectToMediaController();
  417. void FreeMediaControllerClient()
  418. {
  419. if(m_pMediaControlClient) {
  420. m_pMediaControlClient->GetFunction()->CloseSession();
  421. m_pMediaControlClient = NULL;
  422. }
  423. }
  424. ErrorCodeEnum GetMediaControllerInfo(EntityStateEnum& curState) {
  425. EntityStateEnum state = EntityState_NoStart;
  426. ErrorCodeEnum rc = GetEntityCurState(state, "MediaController");
  427. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("MediaController entity state: %d(%u)", state, rc);
  428. curState = state;
  429. return rc;
  430. }
  431. ErrorCodeEnum AccessCamerePriviledge(bool fWinOver, int nCameraType);
  432. ErrorCodeEnum HandleCamereAccessPriviledge(bool fWinOver, int nCameraType, const char* lpcszDevName);
  433. UINT UnitTest();
  434. void AfterInit();
  435. private:
  436. ErrorCodeEnum GetEntityCurState(EntityStateEnum& state, LPCTSTR lpcszEntityName)
  437. {
  438. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  439. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege =
  440. pFunc.ConvertCase<IEntityFunctionPrivilege>();
  441. CEntityRunInfo info = {0};
  442. ErrorCodeEnum ecInfo = pFunc->GetEntityRunInfo(lpcszEntityName, info);
  443. if(ISSUCCEEDED(ecInfo)) {
  444. state = info.eState;
  445. }
  446. return ecInfo;
  447. }
  448. bool IsSuitableEntityAvailable()
  449. {
  450. if((m_bStand2SMachine && ISSUCCEEDED(ConnectToHSPScanner()))
  451. || ( (m_bUsePortableScanner) && ISSUCCEEDED(ConnectToPortableScanner()))) {
  452. return true;
  453. }
  454. return false;
  455. }
  456. void ReleaseSuitableEntity()
  457. {
  458. if(m_bStand2SMachine) {
  459. FreeHSPScannerClient();
  460. }else if(m_bUsePortableScanner) {
  461. FreePortableScannerClient();
  462. }
  463. return;
  464. }
  465. ErrorCodeEnum LoadConfigAboutCamera();
  466. CapTypeEnum GetRVCCameraType(LPCTSTR lpcszDevName);
  467. /**
  468. * Determine that whether the camera named by %strDeviceID% is HSPS-Type
  469. * bUpstairOne is TRUE if the camera is pluggable by USB whereas is FALSE if fixed
  470. */
  471. bool IsPortableScannerDetected(LPCTSTR strDeviceID, BOOL& bUpstairOne);
  472. int GetCurrentCameraList(CAutoArray<ScannerDeviceInfo>& devInforLists, bool bUpdatedRecord = false);
  473. #if defined(RVC_OS_WIN)
  474. void RefreshCameraBusyState(CAutoArray<ScannerDeviceInfo>& devInforLists, const CAMERA_BUCKET& buckets, int bucketSize);
  475. #endif //RVC_OS_WIN
  476. ErrorCodeEnum _BindPSDevice(int nDevID, LPCTSTR lpcszDevName, bool bForce = false);
  477. bool FindEwsCameraName(CSimpleStringA& strRetrievedName, const CSimpleStringA& strRootName);
  478. bool IsEwsCamera(LPCTSTR lpcszDevfriendlyName);
  479. template <class TReq, class TAns>
  480. PVOID inline TransferCtx(CSmartPointer<SpReqAnsContext<TReq, TAns> > ctx)
  481. {
  482. return (PVOID)ctx.GetRawPointer();
  483. //return reinterpret_cast<PVOID>(ctx.GetRawPointer());
  484. }
  485. bool ShouldUsePortableScanner() const {
  486. return (m_bPadMachine || m_bDesk2SMachine);
  487. }
  488. };
  489. struct StartPreviewTask : public ITaskSp
  490. {
  491. CScannerFSM* m_fsm;
  492. SpReqAnsContext<ScannerService_StartPreview_Req, ScannerService_StartPreview_Ans>::Pointer m_ctx;
  493. StartPreviewTask(CScannerFSM* fsm): m_fsm(fsm){}
  494. void Process()
  495. {
  496. FSMEvent* pEvt = new FSMEvent(USER_EVT_STARTPREVIEW_FINISHED);
  497. auto rc = m_fsm->AttachCheck();
  498. if(ISSUCCEEDED(rc)) {
  499. pEvt->param1 = m_fsm->StartPreview(m_ctx);
  500. }else {
  501. m_ctx->Answer(rc, LOG_WARN_ATTACH_FAILED);
  502. pEvt->param1 = 10;
  503. }
  504. m_fsm->PostEventFIFO(pEvt);
  505. return;
  506. }
  507. void SetContext(
  508. SpReqAnsContext<ScannerService_StartPreview_Req,
  509. ScannerService_StartPreview_Ans>::Pointer ctx)
  510. {
  511. m_ctx = ctx;
  512. return;
  513. }
  514. };
  515. struct StopPreviewTask : public ITaskSp
  516. {
  517. CScannerFSM* m_fsm;
  518. SpReqAnsContext<ScannerService_CancelPreview_Req,
  519. ScannerService_CancelPreview_Ans>::Pointer m_ctx;
  520. StopPreviewTask(CScannerFSM* fsm): m_fsm(fsm){}
  521. void Process()
  522. {
  523. FSMEvent* pEvt = new FSMEvent(USER_EVT_STOPPREVIEW_FINISHED);
  524. const bool bOnlyHide = m_ctx->Req.reserved1 == 0 ? false : true;
  525. pEvt->param1 = m_fsm->StopPreview(m_ctx);
  526. if(!bOnlyHide) {
  527. m_fsm->AttachReleaseIfNecessary();
  528. }
  529. m_fsm->PostEventFIFO(pEvt);
  530. return;
  531. }
  532. void SetContext(
  533. SpReqAnsContext<ScannerService_CancelPreview_Req,
  534. ScannerService_CancelPreview_Ans>::Pointer ctx)
  535. {
  536. m_ctx = ctx;
  537. return;
  538. }
  539. };
  540. struct ScanImageTask : public ITaskSp
  541. {
  542. CScannerFSM* m_fsm;
  543. SpReqAnsContext<ScannerService_ScanImage_Req,
  544. ScannerService_ScanImage_Ans>::Pointer m_ctx;
  545. ScanImageTask(CScannerFSM* fsm): m_fsm(fsm){}
  546. void Process()
  547. {
  548. FSMEvent* pEvt = new FSMEvent(USER_EVT_SCANIMAGEFINISHED);
  549. pEvt->param1 = m_fsm->ScanImage(m_ctx);
  550. m_fsm->PostEventFIFO(pEvt);
  551. return;
  552. }
  553. void SetContext(
  554. SpReqAnsContext<ScannerService_ScanImage_Req,
  555. ScannerService_ScanImage_Ans>::Pointer ctx)
  556. {
  557. m_ctx = ctx;
  558. return;
  559. }
  560. };
  561. struct SetPropertyTask : public ITaskSp
  562. {
  563. CScannerFSM* m_fsm;
  564. SpReqAnsContext<ScannerService_SetProperty_Req,
  565. ScannerService_SetProperty_Ans>::Pointer m_ctx;
  566. SetPropertyTask(CScannerFSM* fsm): m_fsm(fsm){}
  567. void Process()
  568. {
  569. FSMEvent* pEvt = new FSMEvent(USER_EVT_SETPROPERTY_FINISHED);
  570. pEvt->param1 = m_fsm->SetProperty(m_ctx);
  571. m_fsm->PostEventFIFO(pEvt);
  572. return;
  573. }
  574. void SetContext(
  575. SpReqAnsContext<ScannerService_SetProperty_Req,
  576. ScannerService_SetProperty_Ans>::Pointer ctx)
  577. {
  578. m_ctx = ctx;
  579. return;
  580. }
  581. };
  582. struct ShowPropertyTask : public ITaskSp
  583. {
  584. CScannerFSM* m_fsm;
  585. SpReqAnsContext<ScannerService_ShowProperty_Req,
  586. ScannerService_ShowProperty_Ans>::Pointer m_ctx;
  587. ShowPropertyTask(CScannerFSM* fsm): m_fsm(fsm){}
  588. void Process()
  589. {
  590. FSMEvent* pEvt = new FSMEvent(USER_EVT_SHOWPROPERTY_FINISHED);
  591. pEvt->param1 = m_fsm->ShowLTProperty(m_ctx);
  592. m_fsm->PostEventFIFO(pEvt);
  593. return;
  594. }
  595. void SetContext(
  596. SpReqAnsContext<ScannerService_ShowProperty_Req,
  597. ScannerService_ShowProperty_Ans>::Pointer ctx)
  598. {
  599. m_ctx = ctx;
  600. return;
  601. }
  602. };
  603. struct PendingTask : public ITaskSp
  604. {
  605. CScannerFSM* m_fsm;
  606. SpReqAnsContext<ScannerService_SetWindowPos_Req,
  607. ScannerService_SetWindowPos_Ans>::Pointer m_ctx;
  608. PendingTask(CScannerFSM* fsm): m_fsm(fsm){}
  609. void Process()
  610. {
  611. LOG_FUNCTION();
  612. WaitingFSMForIdle();
  613. SetWinPosEvent* pEvent = new SetWinPosEvent();
  614. pEvent->m_ctx = m_ctx;
  615. m_fsm->PostEventFIFO(pEvent);
  616. return;
  617. }
  618. void SetContext(
  619. SpReqAnsContext<ScannerService_SetWindowPos_Req,
  620. ScannerService_SetWindowPos_Ans>::Pointer ctx)
  621. {
  622. m_ctx = ctx;
  623. return;
  624. }
  625. private:
  626. void WaitingFSMForIdle()
  627. {
  628. static const int waitTimes = 30;
  629. static const int waitEachTimeout = 300;
  630. int waitCurrTimes = 0;
  631. while(m_fsm->IsWorking() && (++waitCurrTimes <= waitTimes)) {
  632. Sleep(waitEachTimeout);
  633. }
  634. if(waitCurrTimes > waitTimes) {
  635. LogWarn(Severity_Low, Error_TimeOut,
  636. LOG_EVT_SCANNERSET_HSPSCNT_TASK_TIMEOUT, "Waiting FSM to Idle timeout!");
  637. }
  638. }
  639. };
  640. struct SetWinPosTask : public ITaskSp
  641. {
  642. CScannerFSM* m_fsm;
  643. SpReqAnsContext<ScannerService_SetWindowPos_Req,
  644. ScannerService_SetWindowPos_Ans>::Pointer m_ctx;
  645. SetWinPosTask(CScannerFSM* fsm): m_fsm(fsm){}
  646. void Process()
  647. {
  648. FSMEvent* pEvt = new FSMEvent(USER_EVT_SETWINPOS_FINISHED);
  649. pEvt->param1 = m_fsm->SetWinPos(m_ctx);
  650. m_fsm->PostEventFIFO(pEvt);
  651. return;
  652. }
  653. void SetContext(
  654. SpReqAnsContext<ScannerService_SetWindowPos_Req,
  655. ScannerService_SetWindowPos_Ans>::Pointer ctx)
  656. {
  657. m_ctx = ctx;
  658. return;
  659. }
  660. };
  661. struct GetDevStatusTask : public ITaskSp
  662. {
  663. CScannerFSM* m_fsm;
  664. SpReqAnsContext<ScannerService_GetDevStatus_Req,
  665. ScannerService_GetDevStatus_Ans>::Pointer m_ctx;
  666. GetDevStatusTask(CScannerFSM* fsm): m_fsm(fsm){}
  667. void Process()
  668. {
  669. FSMEvent* pEvt = new FSMEvent(USER_EVT_GETSTATUS_FINISHED);
  670. m_fsm->GetDevStatus(m_ctx);
  671. m_fsm->PostEventFIFO(pEvt);
  672. return;
  673. }
  674. void SetContext(
  675. SpReqAnsContext<ScannerService_GetDevStatus_Req,
  676. ScannerService_GetDevStatus_Ans>::Pointer ctx)
  677. {
  678. m_ctx = ctx;
  679. return;
  680. }
  681. };
  682. struct GetDevInfoTask : public ITaskSp
  683. {
  684. CScannerFSM* m_fsm;
  685. SpReqAnsContext<ScannerService_GetDevInfo_Req,
  686. ScannerService_GetDevInfo_Ans>::Pointer m_ctx;
  687. GetDevInfoTask(CScannerFSM* fsm): m_fsm(fsm){}
  688. void Process()
  689. {
  690. FSMEvent* pEvt = new FSMEvent(USER_EVT_GETINFO_FINISHED);
  691. m_fsm->GetDevInfo(m_ctx);
  692. m_fsm->PostEventFIFO(pEvt);
  693. return;
  694. }
  695. void SetContext(
  696. SpReqAnsContext<ScannerService_GetDevInfo_Req,
  697. ScannerService_GetDevInfo_Ans>::Pointer ctx)
  698. {
  699. m_ctx = ctx;
  700. return;
  701. }
  702. };
  703. #endif //_SCANNERSET_FSM_H_