HSPScannerFSM.h 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704
  1. #ifndef _HSPSCANNER_FSM_H_
  2. #define _HSPSCANNER_FSM_H_
  3. #pragma once
  4. #include "SpFSM.h"
  5. #include "HSPScannerClass.h"
  6. #include "HSPScanner_server_g.h"
  7. #include "DevFSMCommBase.hpp"
  8. #include "HSPSCanner_UserErrorCode.h"
  9. #if defined(_MSC_VER)
  10. #include <xstring>
  11. using namespace std;
  12. #else
  13. #include "DevErrorCode.h"
  14. #endif //_MSC_VER
  15. using namespace HSPScanner;
  16. #define ISSUCCEEDED(hr) ((hr) == Error_Succeed)
  17. #define FAILURED(hr) (!(ISSUCCEEDED(hr)))
  18. #define SAFE_FREE_LIBRARY(hModule) \
  19. do { \
  20. if(hModule){ \
  21. FreeLibrary(hModule); \
  22. hModule = NULL; \
  23. } \
  24. }while(0)
  25. enum EvtType
  26. {
  27. USER_EVT_STARTPREVIEW = (EVT_USER + 1),
  28. USER_EVT_STARTPREVIEW_FINISHED,
  29. USER_EVT_SETPROPERTYINVIEW_FINISHED,
  30. USER_EVT_STOPPREVIEW,
  31. USER_EVT_HIDEPREVIEW,
  32. USER_EVT_STOPPREVIEW_FINISHED,
  33. USER_EVT_SETWINPOS,
  34. USER_EVT_SETWINPOSFINISHED,
  35. USER_EVT_SCANIMAGE,
  36. USER_EVT_SCANIMAGE_EX,
  37. USER_EVT_SCANIMAGEFINISHED,
  38. USER_EVT_SHOWPROPERTY,
  39. USER_EVT_SHOWPROPERTY_FINISHED,
  40. USER_EVT_SETPROPERTY,
  41. USER_EVT_SETPROPERTY_FINISHED,
  42. USER_EVT_GETSTATUS,
  43. USER_EVT_GETINFO,
  44. USER_EVT_DISCONNECT,
  45. USER_EVT_RESET,
  46. USER_EVT_EXIT,
  47. USER_EVT_EXIT_FINISHED,
  48. USER_EVT_NOCFG,
  49. USER_EVT_GOTOHELL,
  50. USER_EVT_OPENSUCC,
  51. USER_EVT_QUIT
  52. };
  53. class StartPreviewEvent : public FSMEvent
  54. {
  55. public:
  56. StartPreviewEvent() : FSMEvent(USER_EVT_STARTPREVIEW){}
  57. ~StartPreviewEvent(){}
  58. SpReqAnsContext<HSPScannerService_StartPreview_Req, HSPScannerService_StartPreview_Ans>::Pointer m_ctx;
  59. virtual void OnUnhandled()
  60. {
  61. if(m_ctx != NULL)
  62. {
  63. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(HSPScannerService_LogCode_StartPreview).setResultCode("RTA2N0V")("Error_InvalidState");
  64. m_ctx->Answer(Error_InvalidState, HSPScanner_UserErrorCode_FSM_INVALID);
  65. }
  66. }
  67. };
  68. class StopPreviewEvent : public FSMEvent
  69. {
  70. public:
  71. StopPreviewEvent() : FSMEvent(USER_EVT_STOPPREVIEW){}
  72. ~StopPreviewEvent(){}
  73. SpReqAnsContext<HSPScannerService_CancelPreview_Req,
  74. HSPScannerService_CancelPreview_Ans>::Pointer m_ctx;
  75. virtual void OnUnhandled()
  76. {
  77. if(m_ctx != NULL)
  78. {
  79. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(HSPScannerService_LogCode_CancelPreview).setResultCode("RTA2N0V")("Error_InvalidState");
  80. m_ctx->Answer(Error_InvalidState, HSPScanner_UserErrorCode_FSM_INVALID);
  81. }
  82. }
  83. };
  84. class ScanImageEvent : public FSMEvent
  85. {
  86. public:
  87. ScanImageEvent() : FSMEvent(USER_EVT_SCANIMAGE){}
  88. ~ScanImageEvent(){}
  89. SpReqAnsContext<HSPScannerService_ScanImage_Req,
  90. HSPScannerService_ScanImage_Ans>::Pointer m_ctx;
  91. virtual void OnUnhandled()
  92. {
  93. if(m_ctx != NULL)
  94. {
  95. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(HSPScannerService_LogCode_ScanImage).setResultCode("RTA2N0V")("Error_InvalidState");
  96. m_ctx->Answer(Error_InvalidState, HSPScanner_UserErrorCode_FSM_INVALID);
  97. }
  98. }
  99. };
  100. class ScanImageExEvent : public FSMEvent
  101. {
  102. public:
  103. ScanImageExEvent() : FSMEvent(USER_EVT_SCANIMAGE_EX){}
  104. ~ScanImageExEvent(){}
  105. SpReqAnsContext<HSPScannerService_ScanImageEx_Req,
  106. HSPScannerService_ScanImageEx_Ans>::Pointer m_ctx;
  107. virtual void OnUnhandled()
  108. {
  109. if(m_ctx != NULL)
  110. {
  111. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(HSPScannerService_LogCode_ScanImageEx).setResultCode("RTA2N0V")("Error_InvalidState");
  112. m_ctx->Answer(Error_InvalidState, HSPScanner_UserErrorCode_FSM_INVALID);
  113. }
  114. }
  115. };
  116. class ShowPropertyEvent : public FSMEvent
  117. {
  118. public:
  119. ShowPropertyEvent() : FSMEvent(USER_EVT_SHOWPROPERTY){}
  120. ~ShowPropertyEvent(){}
  121. SpReqAnsContext<HSPScannerService_ShowProperty_Req,
  122. HSPScannerService_ShowProperty_Ans>::Pointer m_ctx;
  123. virtual void OnUnhandled()
  124. {
  125. if(m_ctx != NULL)
  126. {
  127. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(HSPScannerService_LogCode_ShowProperty).setResultCode("RTA2N0V")("Error_InvalidState");
  128. m_ctx->Answer(Error_InvalidState, HSPScanner_UserErrorCode_FSM_INVALID);
  129. }
  130. }
  131. };
  132. class SetPropertyEvent : public FSMEvent
  133. {
  134. public:
  135. SetPropertyEvent() : FSMEvent(USER_EVT_SETPROPERTY){}
  136. ~SetPropertyEvent(){}
  137. SpReqAnsContext<HSPScannerService_SetProperty_Req,
  138. HSPScannerService_SetProperty_Ans>::Pointer m_ctx;
  139. virtual void OnUnhandled()
  140. {
  141. if(m_ctx != NULL)
  142. {
  143. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(HSPScannerService_LogCode_SetProperty).setResultCode("RTA2N0V")("Error_InvalidState");
  144. m_ctx->Answer(Error_InvalidState, HSPScanner_UserErrorCode_FSM_INVALID);
  145. }
  146. }
  147. };
  148. class SetWinPosEvent : public FSMEvent
  149. {
  150. public:
  151. SetWinPosEvent() : FSMEvent(USER_EVT_SETWINPOS){}
  152. ~SetWinPosEvent(){}
  153. SpReqAnsContext<HSPScannerService_SetWinPos_Req,
  154. HSPScannerService_SetWinPos_Ans>::Pointer m_ctx;
  155. virtual void OnUnhandled()
  156. {
  157. if(m_ctx != NULL)
  158. {
  159. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(HSPScannerService_LogCode_SetWinPos).setResultCode("RTA2N0V")("Error_InvalidState");
  160. m_ctx->Answer(Error_InvalidState, HSPScanner_UserErrorCode_FSM_INVALID);
  161. }
  162. }
  163. };
  164. class GetDevStatusEvent : public FSMEvent
  165. {
  166. public:
  167. GetDevStatusEvent() : FSMEvent(USER_EVT_GETSTATUS){}
  168. ~GetDevStatusEvent(){}
  169. SpReqAnsContext<HSPScannerService_GetDevStatus_Req,
  170. HSPScannerService_GetDevStatus_Ans>::Pointer m_ctx;
  171. virtual void OnUnhandled()
  172. {
  173. if(m_ctx != NULL)
  174. {
  175. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(HSPScannerService_LogCode_GetDevStatus).setResultCode("RTA2N0V")("Error_InvalidState");
  176. m_ctx->Answer(Error_InvalidState, HSPScanner_UserErrorCode_FSM_INVALID);
  177. }
  178. }
  179. };
  180. class GetDevInfoEvent : public FSMEvent
  181. {
  182. public:
  183. GetDevInfoEvent() : FSMEvent(USER_EVT_GETINFO){}
  184. ~GetDevInfoEvent(){}
  185. SpReqAnsContext<HSPScannerService_GetDevInfo_Req,
  186. HSPScannerService_GetDevInfo_Ans>::Pointer m_ctx;
  187. virtual void OnUnhandled()
  188. {
  189. if(m_ctx != NULL)
  190. {
  191. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(HSPScannerService_LogCode_GetDevInfo).setResultCode("RTA2N0V")("Error_InvalidState");
  192. m_ctx->Answer(Error_InvalidState, HSPScanner_UserErrorCode_FSM_INVALID);
  193. }
  194. }
  195. };
  196. class CHSPScannerFSM : public CCommDevFSM<CHSPScannerFSM, CHSPSClass>, public IFSMStateHooker
  197. {
  198. public:
  199. CHSPScannerFSM(void);
  200. ~CHSPScannerFSM(void);
  201. virtual ErrorCodeEnum OnInit();
  202. virtual ErrorCodeEnum OnExit();
  203. void SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext);
  204. enum {s0, s1, s2, s3, s4, s5, s6, s7, s8};
  205. BEGIN_FSM_STATE(CHSPScannerFSM)
  206. FSM_STATE_ENTRY(s0, "Idle", s0_on_entry, s0_on_exit, s0_on_event)
  207. FSM_STATE_ENTRY(s1, "Previewing", s1_on_entry, s1_on_exit, s1_on_event)
  208. FSM_STATE_ENTRY(s2, "Property", s2_on_entry, s2_on_exit, s2_on_event)
  209. FSM_STATE_ENTRY(s3, "Failed", s3_on_entry, s3_on_exit, s3_on_event)
  210. FSM_STATE_ENTRY(s4, "Picturing", s4_on_entry, s4_on_exit, s4_on_event)
  211. FSM_STATE_ENTRY(s5, "DeviceOff", s5_on_entry, s5_on_exit, s5_on_event)
  212. FSM_STATE_ENTRY(s6, "HidPreviewing", s6_on_entry, s6_on_exit, s6_on_event)
  213. FSM_STATE_ENTRY(s7, "Exit", s7_on_entry, s7_on_exit, s7_on_event)
  214. FSM_STATE_ENTRY(s8, "Idiot", s8_on_entry, s8_on_exit, s8_on_event)
  215. END_FSM_STATE()
  216. BEGIN_FSM_RULE(CHSPScannerFSM, s0)
  217. //2 reserved in s0 state.
  218. FSM_RULE_ENTRY(s0, s1, USER_EVT_STARTPREVIEW_FINISHED, 0)
  219. FSM_RULE_ENTRY(s0, s3, USER_EVT_STARTPREVIEW_FINISHED, 1)
  220. FSM_RULE_ENTRY(s0, s0, USER_EVT_STARTPREVIEW_FINISHED, 2)
  221. FSM_RULE_ENTRY(s3, s1, USER_EVT_STARTPREVIEW_FINISHED, 0)
  222. FSM_RULE_ENTRY(s3, s0, USER_EVT_RESET, 0)
  223. FSM_RULE_ENTRY(s3, s3, USER_EVT_RESET, 1)
  224. FSM_RULE_ENTRY(s3, s1, USER_EVT_RESET, 2)
  225. FSM_RULE_ENTRY_ANY(s3, s0, USER_EVT_OPENSUCC)
  226. FSM_RULE_ENTRY(s1, s2, USER_EVT_SHOWPROPERTY, 0)
  227. FSM_RULE_ENTRY_ANY(s2, s1, USER_EVT_SHOWPROPERTY_FINISHED)
  228. //3 reserved in s1 state.
  229. FSM_RULE_ENTRY(s1, s3, USER_EVT_STOPPREVIEW_FINISHED, 0)
  230. FSM_RULE_ENTRY(s1, s3, USER_EVT_STOPPREVIEW_FINISHED, 4)
  231. // Try s6 state --Josephus at 10:10:05 2016/11/22
  232. //FSM_RULE_ENTRY(s1, s0, USER_EVT_STOPPREVIEW_FINISHED, 1) //隐藏
  233. FSM_RULE_ENTRY(s1, s6, USER_EVT_STOPPREVIEW_FINISHED, 1)
  234. FSM_RULE_ENTRY(s1, s0, USER_EVT_STOPPREVIEW_FINISHED, 2) //关闭预览
  235. FSM_RULE_ENTRY(s1, s1, USER_EVT_STOPPREVIEW_FINISHED, 3) //错误还不足够严重
  236. FSM_RULE_ENTRY(s1, s4, USER_EVT_SCANIMAGE, 0)
  237. FSM_RULE_ENTRY(s1, s4, USER_EVT_SCANIMAGE_EX, 0)
  238. //5 reserved in s4 state.
  239. FSM_RULE_ENTRY(s4, s1, USER_EVT_SCANIMAGEFINISHED, 1) //删除旧照片获取照片名称失败
  240. FSM_RULE_ENTRY(s4, s3, USER_EVT_SCANIMAGEFINISHED, 2) //拍摄返回失败
  241. FSM_RULE_ENTRY(s4, s1, USER_EVT_SCANIMAGEFINISHED, 3) //EX 分配资源失败
  242. FSM_RULE_ENTRY(s4, s3, USER_EVT_SCANIMAGEFINISHED, 4) //打开照片文件失败
  243. FSM_RULE_ENTRY(s4, s1, USER_EVT_SCANIMAGEFINISHED, 0) //成功拍摄
  244. // Try s6 state. --Josephus at 11:13:02 2016/11/22
  245. FSM_RULE_ENTRY(s4, s6, USER_EVT_SCANIMAGEFINISHED, 6) //成功拍摄且做了隐藏操作
  246. FSM_RULE_ENTRY(s4, s1, USER_EVT_SCANIMAGEFINISHED, 5)
  247. FSM_RULE_ENTRY_ANY(s3, s5, USER_EVT_DISCONNECT)
  248. FSM_RULE_ENTRY(s5, s0, EVT_TIMER, 1)
  249. FSM_RULE_ENTRY(s5, s1, EVT_TIMER, 2)
  250. FSM_RULE_ENTRY(s0, s5, USER_EVT_DISCONNECT, 0)
  251. FSM_RULE_ENTRY(s1, s5, USER_EVT_DISCONNECT, 0)
  252. FSM_RULE_ENTRY(s4, s5, USER_EVT_DISCONNECT, 0)
  253. FSM_RULE_ENTRY(s6, s5, USER_EVT_DISCONNECT, 0)
  254. FSM_RULE_ENTRY(s6, s1, USER_EVT_STARTPREVIEW_FINISHED, 0) //成功预览
  255. FSM_RULE_ENTRY(s6, s3, USER_EVT_STARTPREVIEW_FINISHED, 1) //预览失败
  256. FSM_RULE_ENTRY(s6, s6, USER_EVT_STARTPREVIEW_FINISHED, 2) // 错误还不足够严重
  257. FSM_RULE_ENTRY(s6, s0, USER_EVT_STOPPREVIEW_FINISHED, 2) //关闭预览
  258. FSM_RULE_ENTRY(s6, s3, USER_EVT_STOPPREVIEW_FINISHED, 0) //关闭预览失败
  259. FSM_RULE_ENTRY(s6, s6, USER_EVT_STOPPREVIEW_FINISHED, 3) //错误还不足够严重
  260. FSM_RULE_ENTRY_ANY(s1, s7, USER_EVT_EXIT)
  261. FSM_RULE_ENTRY_ANY(s2, s7, USER_EVT_EXIT)
  262. FSM_RULE_ENTRY_ANY(s6, s7, USER_EVT_EXIT)
  263. FSM_RULE_ENTRY(s7, s0, USER_EVT_EXIT_FINISHED, 0)
  264. FSM_RULE_ENTRY(s7, s3, USER_EVT_EXIT_FINISHED, 1)
  265. FSM_RULE_ENTRY_ANY(s0, s8, USER_EVT_NOCFG)
  266. FSM_RULE_ENTRY_ANY(s0, s3, USER_EVT_GOTOHELL)
  267. END_FSM_RULE()
  268. virtual void s0_on_entry();
  269. virtual void s0_on_exit();
  270. virtual unsigned int s0_on_event(FSMEvent* e);
  271. virtual void s1_on_entry();
  272. virtual void s1_on_exit();
  273. virtual unsigned int s1_on_event(FSMEvent* e);
  274. virtual void s2_on_entry();
  275. virtual void s2_on_exit();
  276. virtual unsigned int s2_on_event(FSMEvent* e);
  277. virtual void s3_on_entry();
  278. virtual void s3_on_exit();
  279. virtual unsigned int s3_on_event(FSMEvent* e);
  280. virtual void s4_on_entry();
  281. virtual void s4_on_exit();
  282. virtual unsigned int s4_on_event(FSMEvent* e);
  283. virtual void s5_on_entry();
  284. virtual void s5_on_exit();
  285. virtual unsigned int s5_on_event(FSMEvent* e);
  286. virtual void s6_on_entry();
  287. virtual void s6_on_exit();
  288. virtual unsigned int s6_on_event(FSMEvent* e);
  289. virtual void s7_on_entry();
  290. virtual void s7_on_exit();
  291. virtual unsigned int s7_on_event(FSMEvent* e);
  292. virtual void s8_on_entry() {
  293. m_eDevStatus = DEVICE_STATUS_NOCFG;
  294. SetLastUserCode(HSPScanner_UserErrorCode_DLLNAME_NOCFG);
  295. }
  296. virtual void s8_on_exit() {
  297. m_eDevStatus = DEVICE_STATUS_NORMAL;
  298. }
  299. virtual unsigned int s8_on_event(FSMEvent* e);
  300. virtual void OnStateTrans(int iSrcState, int iDstState);
  301. int StartPreview(SpReqAnsContext<HSPScannerService_StartPreview_Req,
  302. HSPScannerService_StartPreview_Ans>::Pointer ctx);
  303. int StopPreview(SpReqAnsContext<HSPScannerService_CancelPreview_Req,
  304. HSPScannerService_CancelPreview_Ans>::Pointer ctx);
  305. bool ResizeImage(const CSimpleStringA& fileName);
  306. int ScanImage(SpReqAnsContext<HSPScannerService_ScanImage_Req,
  307. HSPScannerService_ScanImage_Ans>::Pointer ctx);
  308. int ScanImageEx(SpReqAnsContext<HSPScannerService_ScanImageEx_Req,
  309. HSPScannerService_ScanImageEx_Ans>::Pointer ctx);
  310. int ShowProperty(SpReqAnsContext<HSPScannerService_ShowProperty_Req,
  311. HSPScannerService_ShowProperty_Ans>::Pointer ctx);
  312. int SetProperty(SpReqAnsContext<HSPScannerService_SetProperty_Req,
  313. HSPScannerService_SetProperty_Ans>::Pointer ctx);
  314. int SetWinPos(SpReqAnsContext<HSPScannerService_SetWinPos_Req,
  315. HSPScannerService_SetWinPos_Ans>::Pointer ctx);
  316. int GetDevStatus(SpReqAnsContext<HSPScannerService_GetDevStatus_Req,
  317. HSPScannerService_GetDevStatus_Ans>::Pointer ctx);
  318. int GetDevInfo(SpReqAnsContext<HSPScannerService_GetDevInfo_Req,
  319. HSPScannerService_GetDevInfo_Ans>::Pointer ctx);
  320. ErrorCodeEnum OnDevExit();
  321. void SetLastUserCode(DWORD dwCode = 0)
  322. {
  323. dwLastUserCode = dwCode;
  324. }
  325. DWORD GetLastUserCode() const
  326. {
  327. return dwLastUserCode;
  328. }
  329. LPCTSTR MapCode2RTAString(DWORD dwValue = 0);
  330. int SetPreviewParam(int colorType, int rotateType, int scanType, bool abortIfFault = false);
  331. private:
  332. int m_version, m_batch;
  333. ErrorCodeEnum m_ecSelfTest;
  334. DWORD m_dwErroCode;
  335. BOOL m_bOperating;
  336. int m_nTickTimes;
  337. int m_nFatalTimes;
  338. int m_nSrcState;
  339. int m_nRecX, m_nRecY, m_nRecW;
  340. DevStateEnum m_eDevStatus;
  341. EvtType m_desiredAction;
  342. CSimpleStringA m_csMachineType;
  343. DevCategoryInfo m_devCat;
  344. CSimpleStringA m_csDevNo;
  345. DWORD dwLastUserCode;
  346. DWORD m_dwMaxImageSize;
  347. public:
  348. DWORD GetCustLastErrorCode() { return m_dwErroCode; }
  349. void SetCustLastErrorCode(DWORD dwVal = 0) { m_dwErroCode = dwVal; }
  350. ErrorCodeEnum TryToOpenDevice();
  351. private:
  352. BOOL GetCurImageName(CSimpleStringA& csImagName, bool bExt = false);
  353. BOOL DelAndGetNewFileName(CSimpleStringA& csfileName, bool bInBusiness = false);
  354. ErrorCodeEnum DeleteFileIfExisted(LPCTSTR fileName);
  355. // --Josephus at 16:33:57 20161214
  356. // 0: disconnected;
  357. // 1: connected;
  358. // -1: invalid;
  359. int IsDevConnected()
  360. {
  361. if(!m_hDevHelper || !m_bOpened) return -1;
  362. HspsDevStatus status = {0};
  363. if(m_hDevHelper->GetDevStatus(status) == Error_Succeed)
  364. {
  365. if(status.isConnected == 0)
  366. return 0;
  367. else
  368. return 1;
  369. }
  370. return -1;
  371. }
  372. void InitialMaxResizeValue();
  373. };
  374. struct StartPreviewTask : public ITaskSp
  375. {
  376. CHSPScannerFSM* m_fsm;
  377. SpReqAnsContext<HSPScannerService_StartPreview_Req, HSPScannerService_StartPreview_Ans>::Pointer m_ctx;
  378. StartPreviewTask(CHSPScannerFSM* fsm): m_fsm(fsm){}
  379. void Process()
  380. {
  381. FSMEvent* pEvt = new FSMEvent(USER_EVT_STARTPREVIEW_FINISHED);
  382. pEvt->param1 = m_fsm->StartPreview(m_ctx);
  383. m_fsm->PostEventFIFO(pEvt);
  384. return;
  385. }
  386. void SetContext(
  387. SpReqAnsContext<HSPScannerService_StartPreview_Req,
  388. HSPScannerService_StartPreview_Ans>::Pointer ctx)
  389. {
  390. m_ctx = ctx;
  391. return;
  392. }
  393. };
  394. struct SetPropertyInPreviewTask : public ITaskSp
  395. {
  396. CHSPScannerFSM* m_fsm;
  397. SpReqAnsContext<HSPScannerService_StartPreview_Req, HSPScannerService_StartPreview_Ans>::Pointer m_ctx;
  398. SetPropertyInPreviewTask(CHSPScannerFSM* fsm): m_fsm(fsm){}
  399. void Process()
  400. {
  401. FSMEvent* pEvt = new FSMEvent(USER_EVT_SETPROPERTYINVIEW_FINISHED);
  402. ErrorCodeEnum eRet;
  403. const int retCode = m_fsm->SetPreviewParam(m_ctx->Req.colorType, m_ctx->Req.rotateType, m_ctx->Req.scanType);
  404. if (retCode == 0)
  405. {
  406. eRet = Error_Succeed;
  407. }
  408. else {
  409. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("SetPreviewParam return some wrong:0x%X", retCode);
  410. eRet = Error_DevCommFailed;
  411. }
  412. if (ISSUCCEEDED(eRet)) {
  413. pEvt->param1 = 0;
  414. m_ctx->Answer(eRet);
  415. }
  416. else {
  417. m_ctx->Answer(eRet, m_fsm->GetLastUserCode());
  418. pEvt->param1 = 1;
  419. }
  420. m_fsm->PostEventFIFO(pEvt);
  421. return;
  422. }
  423. void SetContext(
  424. SpReqAnsContext<HSPScannerService_StartPreview_Req,
  425. HSPScannerService_StartPreview_Ans>::Pointer ctx)
  426. {
  427. m_ctx = ctx;
  428. return;
  429. }
  430. };
  431. struct StopPreviewTask : public ITaskSp
  432. {
  433. CHSPScannerFSM* m_fsm;
  434. SpReqAnsContext<HSPScannerService_CancelPreview_Req,
  435. HSPScannerService_CancelPreview_Ans>::Pointer m_ctx;
  436. StopPreviewTask(CHSPScannerFSM* fsm): m_fsm(fsm){}
  437. void Process()
  438. {
  439. FSMEvent* pEvt = new FSMEvent(USER_EVT_STOPPREVIEW_FINISHED);
  440. pEvt->param1 = m_fsm->StopPreview(m_ctx);
  441. m_fsm->PostEventFIFO(pEvt);
  442. return;
  443. }
  444. void SetContext(
  445. SpReqAnsContext<HSPScannerService_CancelPreview_Req,
  446. HSPScannerService_CancelPreview_Ans>::Pointer ctx)
  447. {
  448. m_ctx = ctx;
  449. return;
  450. }
  451. };
  452. struct ScanImageTask : public ITaskSp
  453. {
  454. CHSPScannerFSM* m_fsm;
  455. SpReqAnsContext<HSPScannerService_ScanImage_Req,
  456. HSPScannerService_ScanImage_Ans>::Pointer m_ctx;
  457. ScanImageTask(CHSPScannerFSM* fsm): m_fsm(fsm){}
  458. void Process()
  459. {
  460. FSMEvent* pEvt = new FSMEvent(USER_EVT_SCANIMAGEFINISHED);
  461. pEvt->param1 = m_fsm->ScanImage(m_ctx);
  462. m_fsm->PostEventFIFO(pEvt);
  463. return;
  464. }
  465. void SetContext(
  466. SpReqAnsContext<HSPScannerService_ScanImage_Req,
  467. HSPScannerService_ScanImage_Ans>::Pointer ctx)
  468. {
  469. m_ctx = ctx;
  470. return;
  471. }
  472. };
  473. struct ScanImageExTask : public ITaskSp
  474. {
  475. CHSPScannerFSM* m_fsm;
  476. SpReqAnsContext<HSPScannerService_ScanImageEx_Req,
  477. HSPScannerService_ScanImageEx_Ans>::Pointer m_ctx;
  478. ScanImageExTask(CHSPScannerFSM* fsm): m_fsm(fsm){}
  479. void Process()
  480. {
  481. FSMEvent* pEvt = new FSMEvent(USER_EVT_SCANIMAGEFINISHED);
  482. pEvt->param1 = m_fsm->ScanImageEx(m_ctx);
  483. m_fsm->PostEventFIFO(pEvt);
  484. return;
  485. }
  486. void SetContext(
  487. SpReqAnsContext<HSPScannerService_ScanImageEx_Req,
  488. HSPScannerService_ScanImageEx_Ans>::Pointer ctx)
  489. {
  490. m_ctx = ctx;
  491. return;
  492. }
  493. };
  494. struct ShowPropertyTask : public ITaskSp
  495. {
  496. CHSPScannerFSM* m_fsm;
  497. SpReqAnsContext<HSPScannerService_ShowProperty_Req,
  498. HSPScannerService_ShowProperty_Ans>::Pointer m_ctx;
  499. ShowPropertyTask(CHSPScannerFSM* fsm): m_fsm(fsm){}
  500. void Process()
  501. {
  502. FSMEvent* pEvt = new FSMEvent(USER_EVT_SHOWPROPERTY_FINISHED);
  503. pEvt->param1 = m_fsm->ShowProperty(m_ctx);
  504. m_fsm->PostEventFIFO(pEvt);
  505. return;
  506. }
  507. void SetContext(
  508. SpReqAnsContext<HSPScannerService_ShowProperty_Req,
  509. HSPScannerService_ShowProperty_Ans>::Pointer ctx)
  510. {
  511. m_ctx = ctx;
  512. return;
  513. }
  514. };
  515. struct SetPropertyTask : public ITaskSp
  516. {
  517. CHSPScannerFSM* m_fsm;
  518. SpReqAnsContext<HSPScannerService_SetProperty_Req,
  519. HSPScannerService_SetProperty_Ans>::Pointer m_ctx;
  520. SetPropertyTask(CHSPScannerFSM* fsm): m_fsm(fsm){}
  521. void Process()
  522. {
  523. m_fsm->SetProperty(m_ctx);
  524. return;
  525. }
  526. void SetContext(
  527. SpReqAnsContext<HSPScannerService_SetProperty_Req,
  528. HSPScannerService_SetProperty_Ans>::Pointer ctx)
  529. {
  530. m_ctx = ctx;
  531. return;
  532. }
  533. };
  534. struct SetWinPosTask : public ITaskSp
  535. {
  536. CHSPScannerFSM* m_fsm;
  537. SpReqAnsContext<HSPScannerService_SetWinPos_Req,
  538. HSPScannerService_SetWinPos_Ans>::Pointer m_ctx;
  539. SetWinPosTask(CHSPScannerFSM* fsm): m_fsm(fsm){}
  540. void Process()
  541. {
  542. m_fsm->SetWinPos(m_ctx);
  543. return;
  544. }
  545. void SetContext(
  546. SpReqAnsContext<HSPScannerService_SetWinPos_Req,
  547. HSPScannerService_SetWinPos_Ans>::Pointer ctx)
  548. {
  549. m_ctx = ctx;
  550. return;
  551. }
  552. };
  553. struct GetDevStatusTask : public ITaskSp
  554. {
  555. CHSPScannerFSM* m_fsm;
  556. SpReqAnsContext<HSPScannerService_GetDevStatus_Req,
  557. HSPScannerService_GetDevStatus_Ans>::Pointer m_ctx;
  558. GetDevStatusTask(CHSPScannerFSM* fsm): m_fsm(fsm){}
  559. void Process()
  560. {
  561. m_fsm->GetDevStatus(m_ctx);
  562. return;
  563. }
  564. void SetContext(
  565. SpReqAnsContext<HSPScannerService_GetDevStatus_Req,
  566. HSPScannerService_GetDevStatus_Ans>::Pointer ctx)
  567. {
  568. m_ctx = ctx;
  569. return;
  570. }
  571. };
  572. struct GetDevInfoTask : public ITaskSp
  573. {
  574. CHSPScannerFSM* m_fsm;
  575. SpReqAnsContext<HSPScannerService_GetDevInfo_Req,
  576. HSPScannerService_GetDevInfo_Ans>::Pointer m_ctx;
  577. GetDevInfoTask(CHSPScannerFSM* fsm): m_fsm(fsm){}
  578. void Process()
  579. {
  580. m_fsm->GetDevInfo(m_ctx);
  581. return;
  582. }
  583. void SetContext(
  584. SpReqAnsContext<HSPScannerService_GetDevInfo_Req,
  585. HSPScannerService_GetDevInfo_Ans>::Pointer ctx)
  586. {
  587. m_ctx = ctx;
  588. return;
  589. }
  590. };
  591. struct OpenDeviceTask : public ITaskSp
  592. {
  593. CHSPScannerFSM* m_fsm;
  594. OpenDeviceTask(CHSPScannerFSM* fsm) : m_fsm(fsm) {}
  595. void Process()
  596. {
  597. if (!m_fsm->m_bOpened) {
  598. if (Error_Succeed == m_fsm->TryToOpenDevice()) {
  599. m_fsm->PostEventFIFO(new FSMEvent(USER_EVT_OPENSUCC));
  600. }
  601. }
  602. }
  603. };
  604. #endif //_HSPSCANNER_FSM_H_