ScannerSetFSM.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599
  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. #include "HSPScanner_client_g.h"
  9. using namespace HSPScanner;
  10. #include <mutex>
  11. #include "EventCode.h"
  12. #include "ScannerSet_UserErrorCode.h"
  13. #define ISSUCCEEDED(hr) ((hr) == Error_Succeed)
  14. #define FAILURED(hr) (!(ISSUCCEEDED(hr)))
  15. #define DECLARE_ENTITY_CLIENT_ENTITY(tEntityName, tEntityBaseName) \
  16. class C##tEntityName##Client : public tEntityBaseName##_ClientBase \
  17. { \
  18. public: \
  19. C##tEntityName##Client(CEntityBase *pEntity) \
  20. :tEntityBaseName##_ClientBase(pEntity) \
  21. {/*empty constructor*/ } \
  22. }
  23. class CHSPSInnerClient : public HSPScannerService_ClientBase
  24. {
  25. public:
  26. CHSPSInnerClient(CEntityBase *pEntity)
  27. :HSPScannerService_ClientBase(pEntity)
  28. {
  29. }
  30. };
  31. enum EvtType
  32. {
  33. USER_EVT_STARTPREVIEW = (EVT_USER + 1),
  34. USER_EVT_STARTPREVIEW_FINISHED,
  35. USER_EVT_STOPPREVIEW,
  36. USER_EVT_STOPPREVIEW_FINISHED,
  37. USER_EVT_SETWINPOS,
  38. USER_EVT_SETWINPOS_FINISHED,
  39. USER_EVT_SCANIMAGE,
  40. USER_EVT_SCANIMAGEFINISHED,
  41. USER_EVT_SETPROPERTY,
  42. USER_EVT_SETPROPERTY_FINISHED,
  43. USER_EVT_SHOWPROPERTY,
  44. USER_EVT_SHOWPROPERTY_FINISHED,
  45. USER_EVT_GETSTATUS,
  46. USER_EVT_GETSTATUS_FINISHED,
  47. USER_EVT_GETINFO,
  48. USER_EVT_GETINFO_FINISHED,
  49. USER_EVT_DEV_INVALID,
  50. USER_EVT_DEV_RECOVER,
  51. USER_EVT_OPERATING,
  52. USER_EVT_RESET,
  53. USER_EVT_EXIT,
  54. USER_EVT_QUIT,
  55. //////////////////////////////////////////////////////////////////////////
  56. USER_EVT_ESTIMATE,
  57. USER_EVT_ESTIMATE_FINISHED
  58. };
  59. class StartPreviewEvent : public FSMEvent
  60. {
  61. public:
  62. StartPreviewEvent() : FSMEvent(USER_EVT_STARTPREVIEW){}
  63. ~StartPreviewEvent(){}
  64. SpReqAnsContext<ScannerService_StartPreview_Req, ScannerService_StartPreview_Ans>::Pointer m_ctx;
  65. virtual void OnUnhandled()
  66. {
  67. if(m_ctx != NULL)
  68. {
  69. m_ctx->Answer(Error_InvalidState, LOG_WARN_FSM_INVALID);
  70. }
  71. }
  72. };
  73. class StopPreviewEvent : public FSMEvent
  74. {
  75. public:
  76. StopPreviewEvent() : FSMEvent(USER_EVT_STOPPREVIEW){}
  77. ~StopPreviewEvent(){}
  78. SpReqAnsContext<ScannerService_CancelPreview_Req,
  79. ScannerService_CancelPreview_Ans>::Pointer m_ctx;
  80. virtual void OnUnhandled()
  81. {
  82. if(m_ctx != NULL)
  83. {
  84. m_ctx->Answer(Error_InvalidState, LOG_WARN_FSM_INVALID);
  85. }
  86. }
  87. };
  88. class ScanImageEvent : public FSMEvent
  89. {
  90. public:
  91. ScanImageEvent() : FSMEvent(USER_EVT_SCANIMAGE){}
  92. ~ScanImageEvent(){}
  93. SpReqAnsContext<ScannerService_ScanImage_Req,
  94. ScannerService_ScanImage_Ans>::Pointer m_ctx;
  95. virtual void OnUnhandled()
  96. {
  97. if(m_ctx != NULL)
  98. {
  99. m_ctx->Answer(Error_InvalidState, LOG_WARN_FSM_INVALID);
  100. }
  101. }
  102. };
  103. class OperatingEvent: public FSMEvent
  104. {
  105. public:
  106. OperatingEvent(int iEvt):FSMEvent(USER_EVT_OPERATING),m_bindEvt(iEvt) {}
  107. ~OperatingEvent(){}
  108. int m_bindEvt;
  109. };
  110. class SetPropertyEvent : public FSMEvent
  111. {
  112. public:
  113. SetPropertyEvent() : FSMEvent(USER_EVT_SETPROPERTY){}
  114. ~SetPropertyEvent(){}
  115. SpReqAnsContext<ScannerService_SetProperty_Req,
  116. ScannerService_SetProperty_Ans>::Pointer m_ctx;
  117. virtual void OnUnhandled()
  118. {
  119. if(m_ctx != NULL)
  120. {
  121. m_ctx->Answer(Error_InvalidState, LOG_WARN_FSM_INVALID);
  122. }
  123. }
  124. };
  125. class ShowPropertyEvent : public FSMEvent
  126. {
  127. public:
  128. ShowPropertyEvent() : FSMEvent(USER_EVT_SHOWPROPERTY){}
  129. ~ShowPropertyEvent(){}
  130. SpReqAnsContext<ScannerService_ShowProperty_Req,
  131. ScannerService_ShowProperty_Ans>::Pointer m_ctx;
  132. virtual void OnUnhandled()
  133. {
  134. if(m_ctx != NULL)
  135. {
  136. m_ctx->Answer(Error_InvalidState, LOG_WARN_FSM_INVALID);
  137. }
  138. }
  139. };
  140. class SetWinPosEvent : public FSMEvent
  141. {
  142. public:
  143. SetWinPosEvent() : FSMEvent(USER_EVT_SETWINPOS){}
  144. ~SetWinPosEvent(){}
  145. SpReqAnsContext<ScannerService_SetWindowPos_Req,
  146. ScannerService_SetWindowPos_Ans>::Pointer m_ctx;
  147. virtual void OnUnhandled()
  148. {
  149. if(m_ctx != NULL)
  150. {
  151. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("set winpos unhandle!");
  152. m_ctx->Answer(Error_InvalidState, LOG_WARN_FSM_INVALID);
  153. }
  154. }
  155. };
  156. class GetDevStatusEvent : public FSMEvent
  157. {
  158. public:
  159. GetDevStatusEvent() : FSMEvent(USER_EVT_GETSTATUS){}
  160. ~GetDevStatusEvent(){}
  161. SpReqAnsContext<ScannerService_GetDevStatus_Req,
  162. ScannerService_GetDevStatus_Ans>::Pointer m_ctx;
  163. virtual void OnUnhandled()
  164. {
  165. if(m_ctx != NULL)
  166. {
  167. m_ctx->Answer(Error_InvalidState, LOG_WARN_FSM_INVALID);
  168. }
  169. }
  170. };
  171. class GetDevInfoEvent : public FSMEvent
  172. {
  173. public:
  174. GetDevInfoEvent() : FSMEvent(USER_EVT_GETINFO){}
  175. ~GetDevInfoEvent(){}
  176. SpReqAnsContext<ScannerService_GetDevInfo_Req,
  177. ScannerService_GetDevInfo_Ans>::Pointer m_ctx;
  178. virtual void OnUnhandled()
  179. {
  180. if(m_ctx != NULL)
  181. {
  182. m_ctx->Answer(Error_InvalidState, LOG_WARN_FSM_INVALID);
  183. }
  184. }
  185. };
  186. class CScannerFSM : public FSMImpl<CScannerFSM>, public IFSMStateHooker
  187. {
  188. public:
  189. CScannerFSM(void);
  190. ~CScannerFSM(void);
  191. virtual ErrorCodeEnum OnInit();
  192. virtual ErrorCodeEnum OnExit();
  193. void SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext);
  194. enum {s0, s2, s4};
  195. BEGIN_FSM_STATE(CScannerFSM)
  196. FSM_STATE_ENTRY(s0, "Idle", s0_on_entry, s0_on_exit, s0_on_event)
  197. FSM_STATE_ENTRY(s2, "Operating", s2_on_entry, s2_on_exit, s2_on_event)
  198. FSM_STATE_ENTRY(s4, "Invalid", s4_on_entry, s4_on_exit, s4_on_event)
  199. END_FSM_STATE()
  200. BEGIN_FSM_RULE(CScannerFSM, s0)
  201. FSM_RULE_ENTRY_ANY(s0, s4, USER_EVT_DEV_INVALID)
  202. FSM_RULE_ENTRY_ANY(s4, s0, USER_EVT_DEV_RECOVER)
  203. FSM_RULE_ENTRY_ANY(s0, s2, USER_EVT_OPERATING)
  204. /*S2 中所有处理结果都返回1,见 s2_on_event 实现*/
  205. FSM_RULE_ENTRY(s2, s0, USER_EVT_STARTPREVIEW_FINISHED, 1)
  206. FSM_RULE_ENTRY(s2, s0, USER_EVT_STOPPREVIEW_FINISHED, 1)
  207. FSM_RULE_ENTRY(s2, s0, USER_EVT_SCANIMAGEFINISHED, 1)
  208. FSM_RULE_ENTRY(s2, s0, USER_EVT_SETPROPERTY_FINISHED, 1)
  209. FSM_RULE_ENTRY(s2, s0, USER_EVT_SHOWPROPERTY_FINISHED, 1)
  210. FSM_RULE_ENTRY(s2, s0, USER_EVT_SETWINPOS_FINISHED, 1)
  211. END_FSM_RULE()
  212. virtual void s0_on_entry();
  213. virtual void s0_on_exit();
  214. virtual unsigned int s0_on_event(FSMEvent* e);
  215. virtual void s2_on_entry();
  216. virtual void s2_on_exit();
  217. virtual unsigned int s2_on_event(FSMEvent* e);
  218. virtual void s4_on_entry();
  219. virtual void s4_on_exit();
  220. virtual unsigned int s4_on_event(FSMEvent* e);
  221. virtual void OnStateTrans(int iSrcState, int iDstState);
  222. int StartPreview(SpReqAnsContext<ScannerService_StartPreview_Req,
  223. ScannerService_StartPreview_Ans>::Pointer ctx);
  224. int StopPreview(SpReqAnsContext<ScannerService_CancelPreview_Req,
  225. ScannerService_CancelPreview_Ans>::Pointer ctx);
  226. int ScanImage(SpReqAnsContext<ScannerService_ScanImage_Req,
  227. ScannerService_ScanImage_Ans>::Pointer ctx);
  228. int SetProperty(SpReqAnsContext<ScannerService_SetProperty_Req,
  229. ScannerService_SetProperty_Ans>::Pointer ctx);
  230. int ShowLTProperty(SpReqAnsContext<ScannerService_ShowProperty_Req,
  231. ScannerService_ShowProperty_Ans>::Pointer ctx);
  232. int SetWinPos(SpReqAnsContext<ScannerService_SetWindowPos_Req,
  233. ScannerService_SetWindowPos_Ans>::Pointer ctx);
  234. int GetDevStatus(SpReqAnsContext<ScannerService_GetDevStatus_Req,
  235. ScannerService_GetDevStatus_Ans>::Pointer ctx);
  236. int GetDevInfo(SpReqAnsContext<ScannerService_GetDevInfo_Req,
  237. ScannerService_GetDevInfo_Ans>::Pointer ctx);
  238. bool IsWorking() {
  239. return (GetCurrState()->id == s2);
  240. }
  241. const char* GetChildEntityName() {
  242. return "HSPSCanner";
  243. }
  244. ErrorCodeEnum OnDevExit();
  245. private:
  246. CHSPSInnerClient* m_pHSPSClient;
  247. ErrorCodeEnum m_ecSelfTest;
  248. DWORD m_dwErroCode;
  249. int m_nFatalTimes;
  250. int m_nSrcState;
  251. int m_iEvt;
  252. public:
  253. DWORD GetCustLastErrorCode() { return m_dwErroCode; }
  254. void SetCustLastErrorCode(DWORD dwVal = 0) { m_dwErroCode = dwVal; }
  255. public:
  256. bool IsHSPSConnectSessionOK();
  257. ErrorCodeEnum CheckHSPSConnectStatus();
  258. ErrorCodeEnum ConnectToHSPScanner();
  259. void FreeHSPScannerClient()
  260. {
  261. if(m_pHSPSClient)
  262. {
  263. m_pHSPSClient->GetFunction()->CloseSession();
  264. m_pHSPSClient = NULL;
  265. }
  266. }
  267. ErrorCodeEnum GetHSPSInfo();
  268. bool IsNoralEntityState(const EntityStateEnum& state) {
  269. if(state == EntityState_Idle || state == EntityState_Busy
  270. || state == EntityState_Pause
  271. || state == EntityState_UnLoading) {
  272. return true;
  273. }
  274. return false;
  275. }
  276. UINT UnitTest();
  277. void AfterInit();
  278. private:
  279. ErrorCodeEnum GetEntityCurState(EntityStateEnum& state, LPCTSTR lpcszEntityName)
  280. {
  281. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  282. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege =
  283. pFunc.ConvertCase<IEntityFunctionPrivilege>();
  284. CEntityRunInfo info = {0};
  285. ErrorCodeEnum ecInfo = pFunc->GetEntityRunInfo(lpcszEntityName, info);
  286. if(ISSUCCEEDED(ecInfo)) {
  287. state = info.eState;
  288. }
  289. return ecInfo;
  290. }
  291. bool IsSuitableEntityAvailable()
  292. {
  293. if(ISSUCCEEDED(ConnectToHSPScanner())) {
  294. return true;
  295. }
  296. return false;
  297. }
  298. void ReleaseSuitableEntity()
  299. {
  300. FreeHSPScannerClient();
  301. return;
  302. }
  303. ErrorCodeEnum LoadConfigAboutCamera();
  304. template <class TReq, class TAns>
  305. PVOID inline TransferCtx(CSmartPointer<SpReqAnsContext<TReq, TAns> > ctx)
  306. {
  307. return (PVOID)ctx.GetRawPointer();
  308. //return reinterpret_cast<PVOID>(ctx.GetRawPointer());
  309. }
  310. };
  311. struct StartPreviewTask : public ITaskSp
  312. {
  313. CScannerFSM* m_fsm;
  314. SpReqAnsContext<ScannerService_StartPreview_Req, ScannerService_StartPreview_Ans>::Pointer m_ctx;
  315. StartPreviewTask(CScannerFSM* fsm): m_fsm(fsm){}
  316. void Process()
  317. {
  318. FSMEvent* pEvt = new FSMEvent(USER_EVT_STARTPREVIEW_FINISHED);
  319. pEvt->param1 = m_fsm->StartPreview(m_ctx);
  320. m_fsm->PostEventFIFO(pEvt);
  321. return;
  322. }
  323. void SetContext(
  324. SpReqAnsContext<ScannerService_StartPreview_Req,
  325. ScannerService_StartPreview_Ans>::Pointer ctx)
  326. {
  327. m_ctx = ctx;
  328. return;
  329. }
  330. };
  331. struct StopPreviewTask : public ITaskSp
  332. {
  333. CScannerFSM* m_fsm;
  334. SpReqAnsContext<ScannerService_CancelPreview_Req,
  335. ScannerService_CancelPreview_Ans>::Pointer m_ctx;
  336. StopPreviewTask(CScannerFSM* fsm): m_fsm(fsm){}
  337. void Process()
  338. {
  339. FSMEvent* pEvt = new FSMEvent(USER_EVT_STOPPREVIEW_FINISHED);
  340. const bool bOnlyHide = m_ctx->Req.reserved1 == 0 ? false : true;
  341. pEvt->param1 = m_fsm->StopPreview(m_ctx);
  342. m_fsm->PostEventFIFO(pEvt);
  343. return;
  344. }
  345. void SetContext(
  346. SpReqAnsContext<ScannerService_CancelPreview_Req,
  347. ScannerService_CancelPreview_Ans>::Pointer ctx)
  348. {
  349. m_ctx = ctx;
  350. return;
  351. }
  352. };
  353. struct ScanImageTask : public ITaskSp
  354. {
  355. CScannerFSM* m_fsm;
  356. SpReqAnsContext<ScannerService_ScanImage_Req,
  357. ScannerService_ScanImage_Ans>::Pointer m_ctx;
  358. ScanImageTask(CScannerFSM* fsm): m_fsm(fsm){}
  359. void Process()
  360. {
  361. FSMEvent* pEvt = new FSMEvent(USER_EVT_SCANIMAGEFINISHED);
  362. pEvt->param1 = m_fsm->ScanImage(m_ctx);
  363. m_fsm->PostEventFIFO(pEvt);
  364. return;
  365. }
  366. void SetContext(
  367. SpReqAnsContext<ScannerService_ScanImage_Req,
  368. ScannerService_ScanImage_Ans>::Pointer ctx)
  369. {
  370. m_ctx = ctx;
  371. return;
  372. }
  373. };
  374. struct SetPropertyTask : public ITaskSp
  375. {
  376. CScannerFSM* m_fsm;
  377. SpReqAnsContext<ScannerService_SetProperty_Req,
  378. ScannerService_SetProperty_Ans>::Pointer m_ctx;
  379. SetPropertyTask(CScannerFSM* fsm): m_fsm(fsm){}
  380. void Process()
  381. {
  382. FSMEvent* pEvt = new FSMEvent(USER_EVT_SETPROPERTY_FINISHED);
  383. pEvt->param1 = m_fsm->SetProperty(m_ctx);
  384. m_fsm->PostEventFIFO(pEvt);
  385. return;
  386. }
  387. void SetContext(
  388. SpReqAnsContext<ScannerService_SetProperty_Req,
  389. ScannerService_SetProperty_Ans>::Pointer ctx)
  390. {
  391. m_ctx = ctx;
  392. return;
  393. }
  394. };
  395. struct ShowPropertyTask : public ITaskSp
  396. {
  397. CScannerFSM* m_fsm;
  398. SpReqAnsContext<ScannerService_ShowProperty_Req,
  399. ScannerService_ShowProperty_Ans>::Pointer m_ctx;
  400. ShowPropertyTask(CScannerFSM* fsm): m_fsm(fsm){}
  401. void Process()
  402. {
  403. FSMEvent* pEvt = new FSMEvent(USER_EVT_SHOWPROPERTY_FINISHED);
  404. pEvt->param1 = m_fsm->ShowLTProperty(m_ctx);
  405. m_fsm->PostEventFIFO(pEvt);
  406. return;
  407. }
  408. void SetContext(
  409. SpReqAnsContext<ScannerService_ShowProperty_Req,
  410. ScannerService_ShowProperty_Ans>::Pointer ctx)
  411. {
  412. m_ctx = ctx;
  413. return;
  414. }
  415. };
  416. struct PendingTask : public ITaskSp
  417. {
  418. CScannerFSM* m_fsm;
  419. SpReqAnsContext<ScannerService_SetWindowPos_Req,
  420. ScannerService_SetWindowPos_Ans>::Pointer m_ctx;
  421. PendingTask(CScannerFSM* fsm): m_fsm(fsm){}
  422. void Process()
  423. {
  424. WaitingFSMForIdle();
  425. SetWinPosEvent* pEvent = new SetWinPosEvent();
  426. pEvent->m_ctx = m_ctx;
  427. m_fsm->PostEventFIFO(pEvent);
  428. return;
  429. }
  430. void SetContext(
  431. SpReqAnsContext<ScannerService_SetWindowPos_Req,
  432. ScannerService_SetWindowPos_Ans>::Pointer ctx)
  433. {
  434. m_ctx = ctx;
  435. return;
  436. }
  437. private:
  438. void WaitingFSMForIdle()
  439. {
  440. static const int waitTimes = 30;
  441. static const int waitEachTimeout = 300;
  442. int waitCurrTimes = 0;
  443. while(m_fsm->IsWorking() && (++waitCurrTimes <= waitTimes)) {
  444. Sleep(waitEachTimeout);
  445. }
  446. if(waitCurrTimes > waitTimes) {
  447. LogWarn(Severity_Low, Error_TimeOut,
  448. LOG_EVT_SCANNERSET_HSPSCNT_TASK_TIMEOUT, "Waiting FSM to Idle timeout!");
  449. }
  450. }
  451. };
  452. struct SetWinPosTask : public ITaskSp
  453. {
  454. CScannerFSM* m_fsm;
  455. SpReqAnsContext<ScannerService_SetWindowPos_Req,
  456. ScannerService_SetWindowPos_Ans>::Pointer m_ctx;
  457. SetWinPosTask(CScannerFSM* fsm): m_fsm(fsm){}
  458. void Process()
  459. {
  460. FSMEvent* pEvt = new FSMEvent(USER_EVT_SETWINPOS_FINISHED);
  461. pEvt->param1 = m_fsm->SetWinPos(m_ctx);
  462. m_fsm->PostEventFIFO(pEvt);
  463. return;
  464. }
  465. void SetContext(
  466. SpReqAnsContext<ScannerService_SetWindowPos_Req,
  467. ScannerService_SetWindowPos_Ans>::Pointer ctx)
  468. {
  469. m_ctx = ctx;
  470. return;
  471. }
  472. };
  473. struct GetDevStatusTask : public ITaskSp
  474. {
  475. CScannerFSM* m_fsm;
  476. SpReqAnsContext<ScannerService_GetDevStatus_Req,
  477. ScannerService_GetDevStatus_Ans>::Pointer m_ctx;
  478. GetDevStatusTask(CScannerFSM* fsm): m_fsm(fsm){}
  479. void Process()
  480. {
  481. FSMEvent* pEvt = new FSMEvent(USER_EVT_GETSTATUS_FINISHED);
  482. m_fsm->GetDevStatus(m_ctx);
  483. m_fsm->PostEventFIFO(pEvt);
  484. return;
  485. }
  486. void SetContext(
  487. SpReqAnsContext<ScannerService_GetDevStatus_Req,
  488. ScannerService_GetDevStatus_Ans>::Pointer ctx)
  489. {
  490. m_ctx = ctx;
  491. return;
  492. }
  493. };
  494. struct GetDevInfoTask : public ITaskSp
  495. {
  496. CScannerFSM* m_fsm;
  497. SpReqAnsContext<ScannerService_GetDevInfo_Req,
  498. ScannerService_GetDevInfo_Ans>::Pointer m_ctx;
  499. GetDevInfoTask(CScannerFSM* fsm): m_fsm(fsm){}
  500. void Process()
  501. {
  502. FSMEvent* pEvt = new FSMEvent(USER_EVT_GETINFO_FINISHED);
  503. m_fsm->GetDevInfo(m_ctx);
  504. m_fsm->PostEventFIFO(pEvt);
  505. return;
  506. }
  507. void SetContext(
  508. SpReqAnsContext<ScannerService_GetDevInfo_Req,
  509. ScannerService_GetDevInfo_Ans>::Pointer ctx)
  510. {
  511. m_ctx = ctx;
  512. return;
  513. }
  514. };
  515. #endif //_SCANNERSET_FSM_H_