PortableScannerFSM.h 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784
  1. #ifndef _PORTABLESCANNER_FSM_H__
  2. #define _PORTABLESCANNER_FSM_H__
  3. #pragma once
  4. #define SHIELD_APDATER_INTERFACE 1
  5. #include "SpFSM.h"
  6. #ifndef SHIELD_APDATER_INTERFACE
  7. #include "HSPScannerClass.h"
  8. #else
  9. enum DevStateEnum
  10. {
  11. DEVICE_STATUS_NOT_READY, //uninit
  12. DEVICE_STATUS_NORMAL, //normal
  13. DEVICE_STATUS_MAINTAINCE, //need to maintaince
  14. //ex:paper tray is empty,retain bin is full
  15. DEVICE_STATUS_FAULT, //cannot work
  16. DEVICE_STATUS_CONNECTING, //device connecting
  17. DEVICE_STATUS_NOCFG, //the vtm has no such device
  18. DEVICE_STATUS_NOTHOLD //Not hold the device.
  19. };
  20. #endif
  21. #include "PortableScanner_server_g.h"
  22. #include "UserEventCode.h"
  23. using namespace PortableScanner;
  24. class CDocScannerCap;
  25. /*
  26. enum CapTypeEnum {
  27. CAMTYPE_UNKNOWN = 0,
  28. CAMTYPE_ENV,
  29. CAMTYPE_OPT,
  30. CAMTYPE_EWS,
  31. CAMTYPE_HSPS,
  32. CAMTYPE_CIRCIE,
  33. CAMTYPE_MAX
  34. };
  35. */
  36. #ifndef SHIELD_APDATER_INTERFACE
  37. typedef ErrorCodeEnum ( *LpCreateDevCom)(DeviceBaseClass *&baseObj);
  38. typedef ErrorCodeEnum ( *LpReleaseDevCom)(DeviceBaseClass *&pBaseObj);
  39. #define SAFE_FREE_LIBRARY(hModule) \
  40. do { \
  41. if(hModule){ \
  42. FreeLibrary(hModule); \
  43. hModule = NULL; \
  44. } \
  45. }while(0)
  46. #endif
  47. #define ISSUCCEEDED(hr) ((hr) == Error_Succeed)
  48. #define FAILURED(hr) (!(ISSUCCEEDED(hr)))
  49. enum EvtType
  50. {
  51. USER_EVT_STARTPREVIEW = (EVT_USER + 1),
  52. USER_EVT_STARTPREVIEW_FINISHED,
  53. USER_EVT_SETPROPERTYINVIEW_FINISHED,
  54. USER_EVT_STOPPREVIEW,
  55. USER_EVT_HIDEPREVIEW,
  56. USER_EVT_STOPPREVIEW_FINISHED,
  57. USER_EVT_SETWINPOS,
  58. USER_EVT_SETWINPOSFINISHED,
  59. USER_EVT_SCANIMAGE,
  60. USER_EVT_SCANIMAGE_EX,
  61. USER_EVT_SCANIMAGEFINISHED,
  62. USER_EVT_SHOWPROPERTY,
  63. USER_EVT_SHOWPROPERTY_FINISHED,
  64. USER_EVT_SETPROPERTY,
  65. USER_EVT_SETPROPERTY_FINISHED,
  66. USER_EVT_GETSTATUS,
  67. USER_EVT_GETINFO,
  68. USER_EVT_DISCONNECT,
  69. USER_EVT_RESET,
  70. USER_EVT_EXIT,
  71. USER_EVT_EXIT_FINISHED,
  72. USER_EVT_NO_CONTAINS_DEVICE,
  73. USER_EVT_BIND_DEVICE,
  74. USER_EVT_BIND_DEVICE_FINISHED,
  75. USER_EVT_DROP_OFF_DEVICE,
  76. USER_EVT_ERROR_IN_PREVIEW,
  77. USER_EVT_QUIT
  78. };
  79. class BindDeviceEvent : public FSMEvent
  80. {
  81. public:
  82. BindDeviceEvent() : FSMEvent(USER_EVT_BIND_DEVICE){}
  83. ~BindDeviceEvent(){}
  84. SpReqAnsContext<PortableScannerService_BindCameraDevice_Req,
  85. PortableScannerService_BindCameraDevice_Ans>::Pointer m_ctx;
  86. virtual void OnUnhandled()
  87. {
  88. if(m_ctx != NULL)
  89. {
  90. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("BindDeviceEvent return InvalidState!");
  91. m_ctx->Answer(Error_InvalidState, LOG_ERROR_PORTABLESCANNER_INVALIDSTATE);
  92. }
  93. }
  94. };
  95. class StartPreviewEvent : public FSMEvent
  96. {
  97. public:
  98. StartPreviewEvent() : FSMEvent(USER_EVT_STARTPREVIEW){}
  99. ~StartPreviewEvent(){}
  100. SpReqAnsContext<PortableScannerService_StartPreview_Req,
  101. PortableScannerService_StartPreview_Ans>::Pointer m_ctx;
  102. virtual void OnUnhandled()
  103. {
  104. if(m_ctx != NULL)
  105. {
  106. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("StartPreviewEvent return InvalidState!");
  107. m_ctx->Answer(Error_InvalidState, LOG_ERROR_PORTABLESCANNER_INVALIDSTATE);
  108. }
  109. }
  110. };
  111. class StopPreviewEvent : public FSMEvent
  112. {
  113. public:
  114. StopPreviewEvent() : FSMEvent(USER_EVT_STOPPREVIEW){}
  115. ~StopPreviewEvent(){}
  116. SpReqAnsContext<PortableScannerService_CancelPreview_Req,
  117. PortableScannerService_CancelPreview_Ans>::Pointer m_ctx;
  118. virtual void OnUnhandled()
  119. {
  120. if(m_ctx != NULL)
  121. {
  122. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("StopPreviewEvent return InvalidState!");
  123. m_ctx->Answer(Error_InvalidState, LOG_ERROR_PORTABLESCANNER_INVALIDSTATE);
  124. }
  125. }
  126. };
  127. class ScanImageEvent : public FSMEvent
  128. {
  129. public:
  130. ScanImageEvent() : FSMEvent(USER_EVT_SCANIMAGE){}
  131. ~ScanImageEvent(){}
  132. SpReqAnsContext<PortableScannerService_ScanImage_Req,
  133. PortableScannerService_ScanImage_Ans>::Pointer m_ctx;
  134. virtual void OnUnhandled()
  135. {
  136. if(m_ctx != NULL)
  137. {
  138. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("ScanImageEvent return InvalidState!");
  139. m_ctx->Answer(Error_InvalidState, LOG_ERROR_PORTABLESCANNER_INVALIDSTATE);
  140. }
  141. }
  142. };
  143. class ScanImageExEvent : public FSMEvent
  144. {
  145. public:
  146. ScanImageExEvent() : FSMEvent(USER_EVT_SCANIMAGE_EX){}
  147. ~ScanImageExEvent(){}
  148. SpReqAnsContext<PortableScannerService_ScanImageEx_Req,
  149. PortableScannerService_ScanImageEx_Ans>::Pointer m_ctx;
  150. virtual void OnUnhandled()
  151. {
  152. if(m_ctx != NULL)
  153. {
  154. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("ScanImageExEvent return InvalidState!");
  155. m_ctx->Answer(Error_InvalidState, LOG_ERROR_PORTABLESCANNER_INVALIDSTATE);
  156. }
  157. }
  158. };
  159. class ShowPropertyEvent : public FSMEvent
  160. {
  161. public:
  162. ShowPropertyEvent() : FSMEvent(USER_EVT_SHOWPROPERTY){}
  163. ~ShowPropertyEvent(){}
  164. SpReqAnsContext<PortableScannerService_ShowProperty_Req,
  165. PortableScannerService_ShowProperty_Ans>::Pointer m_ctx;
  166. virtual void OnUnhandled()
  167. {
  168. if(m_ctx != NULL)
  169. {
  170. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("ShowPropertyEvent return InvalidState!");
  171. m_ctx->Answer(Error_InvalidState, LOG_ERROR_PORTABLESCANNER_INVALIDSTATE);
  172. }
  173. }
  174. };
  175. class SetPropertyEvent : public FSMEvent
  176. {
  177. public:
  178. SetPropertyEvent() : FSMEvent(USER_EVT_SETPROPERTY){}
  179. ~SetPropertyEvent(){}
  180. SpReqAnsContext<PortableScannerService_SetProperty_Req,
  181. PortableScannerService_SetProperty_Ans>::Pointer m_ctx;
  182. virtual void OnUnhandled()
  183. {
  184. if(m_ctx != NULL)
  185. {
  186. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("SetPropertyEvent return InvalidState!");
  187. m_ctx->Answer(Error_InvalidState, LOG_ERROR_PORTABLESCANNER_INVALIDSTATE);
  188. }
  189. }
  190. };
  191. class SetWinPosEvent : public FSMEvent
  192. {
  193. public:
  194. SetWinPosEvent() : FSMEvent(USER_EVT_SETWINPOS){}
  195. ~SetWinPosEvent(){}
  196. SpReqAnsContext<PortableScannerService_SetWinPos_Req,
  197. PortableScannerService_SetWinPos_Ans>::Pointer m_ctx;
  198. virtual void OnUnhandled()
  199. {
  200. if(m_ctx != NULL)
  201. {
  202. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("SetWinPosEvent return InvalidState!");
  203. m_ctx->Answer(Error_InvalidState, LOG_ERROR_PORTABLESCANNER_INVALIDSTATE);
  204. }
  205. }
  206. };
  207. class GetDevStatusEvent : public FSMEvent
  208. {
  209. public:
  210. GetDevStatusEvent() : FSMEvent(USER_EVT_GETSTATUS){}
  211. ~GetDevStatusEvent(){}
  212. SpReqAnsContext<PortableScannerService_GetDevStatus_Req,
  213. PortableScannerService_GetDevStatus_Ans>::Pointer m_ctx;
  214. virtual void OnUnhandled()
  215. {
  216. if(m_ctx != NULL)
  217. {
  218. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetDevStatusEvent return InvalidState!");
  219. m_ctx->Answer(Error_InvalidState, LOG_ERROR_PORTABLESCANNER_INVALIDSTATE);
  220. }
  221. }
  222. };
  223. class GetDevInfoEvent : public FSMEvent
  224. {
  225. public:
  226. GetDevInfoEvent() : FSMEvent(USER_EVT_GETINFO){}
  227. ~GetDevInfoEvent(){}
  228. SpReqAnsContext<PortableScannerService_GetDevInfo_Req,
  229. PortableScannerService_GetDevInfo_Ans>::Pointer m_ctx;
  230. virtual void OnUnhandled()
  231. {
  232. if(m_ctx != NULL)
  233. {
  234. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetDevInfoEvent return InvalidState!");
  235. m_ctx->Answer(Error_InvalidState, LOG_ERROR_PORTABLESCANNER_INVALIDSTATE);
  236. }
  237. }
  238. };
  239. class CPortableScannerFSM : public FSMImpl<CPortableScannerFSM>, public IFSMStateHooker
  240. {
  241. public:
  242. CPortableScannerFSM(void);
  243. ~CPortableScannerFSM(void);
  244. virtual ErrorCodeEnum OnInit();
  245. virtual ErrorCodeEnum OnExit();
  246. void SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext);
  247. enum {s0, s1, /*s2,*/ s3, s4, s5, s6, s7};
  248. BEGIN_FSM_STATE(CPortableScannerFSM)
  249. FSM_STATE_ENTRY(s0, "Idle", s0_on_entry, s0_on_exit, s0_on_event)
  250. FSM_STATE_ENTRY(s1, "Previewing", s1_on_entry, s1_on_exit, s1_on_event)
  251. FSM_STATE_ENTRY(s3, "Failed", s3_on_entry, s3_on_exit, s3_on_event)
  252. FSM_STATE_ENTRY(s4, "Picturing", s4_on_entry, s4_on_exit, s4_on_event)
  253. FSM_STATE_ENTRY(s5, "NotHold", s5_on_entry, s5_on_exit, s5_on_event)
  254. FSM_STATE_ENTRY(s6, "HidPreviewing", s6_on_entry, s6_on_exit, s6_on_event)
  255. FSM_STATE_ENTRY(s7, "Exit", s7_on_entry, s7_on_exit, s7_on_event)
  256. END_FSM_STATE()
  257. BEGIN_FSM_RULE(CPortableScannerFSM, s0)
  258. //2 reserved in s0 state.
  259. FSM_RULE_ENTRY(s0, s1, USER_EVT_STARTPREVIEW_FINISHED, 0)
  260. FSM_RULE_ENTRY(s0, s3, USER_EVT_STARTPREVIEW_FINISHED, 1)
  261. FSM_RULE_ENTRY(s0, s0, USER_EVT_STARTPREVIEW_FINISHED, 2)
  262. FSM_RULE_ENTRY(s0, s5, USER_EVT_DROP_OFF_DEVICE, 1)
  263. FSM_RULE_ENTRY(s0, s5, USER_EVT_BIND_DEVICE_FINISHED, 0)
  264. FSM_RULE_ENTRY(s0, s0, USER_EVT_BIND_DEVICE_FINISHED, 1)
  265. FSM_RULE_ENTRY(s0, s6, USER_EVT_BIND_DEVICE_FINISHED, 4)
  266. FSM_RULE_ENTRY(s0, s1, USER_EVT_BIND_DEVICE_FINISHED, 6)
  267. FSM_RULE_ENTRY(s3, s1, USER_EVT_STARTPREVIEW_FINISHED, 0)
  268. FSM_RULE_ENTRY(s3, s1, USER_EVT_RESET, 2)
  269. FSM_RULE_ENTRY(s3, s5, USER_EVT_DROP_OFF_DEVICE, 1)
  270. FSM_RULE_ENTRY(s3, s5, USER_EVT_BIND_DEVICE_FINISHED, 0)
  271. FSM_RULE_ENTRY(s3, s0, USER_EVT_BIND_DEVICE_FINISHED, 1)
  272. FSM_RULE_ENTRY(s3, s6, USER_EVT_BIND_DEVICE_FINISHED, 4)
  273. FSM_RULE_ENTRY(s3, s1, USER_EVT_BIND_DEVICE_FINISHED, 6)
  274. FSM_RULE_ENTRY(s3, s5, USER_EVT_RESET, 0)
  275. FSM_RULE_ENTRY(s3, s0, USER_EVT_RESET, 1)
  276. FSM_RULE_ENTRY(s3, s6, USER_EVT_RESET, 4)
  277. FSM_RULE_ENTRY(s3, s1, USER_EVT_RESET, 6)
  278. //3 reserved in s1 state.
  279. FSM_RULE_ENTRY(s1, s3, USER_EVT_STOPPREVIEW_FINISHED, 0)
  280. FSM_RULE_ENTRY(s1, s3, USER_EVT_STOPPREVIEW_FINISHED, 4)
  281. FSM_RULE_ENTRY(s1, s3, USER_EVT_ERROR_IN_PREVIEW, 0)
  282. // Try s6 state --Josephus at 10:10:05 2016/11/22
  283. //FSM_RULE_ENTRY(s1, s0, USER_EVT_STOPPREVIEW_FINISHED, 1) //隐藏
  284. FSM_RULE_ENTRY(s1, s6, USER_EVT_STOPPREVIEW_FINISHED, 1)
  285. FSM_RULE_ENTRY(s1, s0, USER_EVT_STOPPREVIEW_FINISHED, 2) //关闭预览
  286. FSM_RULE_ENTRY(s1, s1, USER_EVT_STOPPREVIEW_FINISHED, 3) //错误还不足够严重
  287. FSM_RULE_ENTRY(s1, s4, USER_EVT_SCANIMAGE, 0)
  288. FSM_RULE_ENTRY(s1, s4, USER_EVT_SCANIMAGE_EX, 0)
  289. FSM_RULE_ENTRY(s1, s5, USER_EVT_DROP_OFF_DEVICE, 1)
  290. FSM_RULE_ENTRY(s1, s5, USER_EVT_BIND_DEVICE_FINISHED, 0)
  291. FSM_RULE_ENTRY(s1, s0, USER_EVT_BIND_DEVICE_FINISHED, 1)
  292. FSM_RULE_ENTRY(s1, s6, USER_EVT_BIND_DEVICE_FINISHED, 4)
  293. FSM_RULE_ENTRY(s1, s1, USER_EVT_BIND_DEVICE_FINISHED, 6)
  294. //5 reserved in s4 state.
  295. FSM_RULE_ENTRY(s4, s1, USER_EVT_SCANIMAGEFINISHED, 1) //删除旧照片获取照片名称失败
  296. FSM_RULE_ENTRY(s4, s3, USER_EVT_SCANIMAGEFINISHED, 2) //拍摄返回失败
  297. FSM_RULE_ENTRY(s4, s1, USER_EVT_SCANIMAGEFINISHED, 3) //EX 分配资源失败
  298. FSM_RULE_ENTRY(s4, s3, USER_EVT_SCANIMAGEFINISHED, 4) //打开照片文件失败
  299. FSM_RULE_ENTRY(s4, s1, USER_EVT_SCANIMAGEFINISHED, 0) //成功拍摄
  300. // Try s6 state. --Josephus at 11:13:02 2016/11/22
  301. FSM_RULE_ENTRY(s4, s6, USER_EVT_SCANIMAGEFINISHED, 6) //成功拍摄且做了隐藏操作
  302. FSM_RULE_ENTRY(s4, s1, USER_EVT_SCANIMAGEFINISHED, 5)
  303. FSM_RULE_ENTRY(s6, s1, USER_EVT_STARTPREVIEW_FINISHED, 0) //成功预览
  304. FSM_RULE_ENTRY(s6, s3, USER_EVT_STARTPREVIEW_FINISHED, 1) //预览失败
  305. FSM_RULE_ENTRY(s6, s6, USER_EVT_STARTPREVIEW_FINISHED, 2) // 错误还不足够严重
  306. FSM_RULE_ENTRY(s6, s0, USER_EVT_STOPPREVIEW_FINISHED, 2) //关闭预览
  307. FSM_RULE_ENTRY(s6, s3, USER_EVT_STOPPREVIEW_FINISHED, 0) //关闭预览失败
  308. FSM_RULE_ENTRY(s6, s6, USER_EVT_STOPPREVIEW_FINISHED, 3) //错误还不足够严重
  309. FSM_RULE_ENTRY(s6, s5, USER_EVT_DROP_OFF_DEVICE, 1)
  310. FSM_RULE_ENTRY(s6, s5, USER_EVT_BIND_DEVICE_FINISHED, 0)
  311. FSM_RULE_ENTRY(s6, s0, USER_EVT_BIND_DEVICE_FINISHED, 1)
  312. FSM_RULE_ENTRY(s6, s6, USER_EVT_BIND_DEVICE_FINISHED, 4)
  313. FSM_RULE_ENTRY(s6, s1, USER_EVT_BIND_DEVICE_FINISHED, 6)
  314. FSM_RULE_ENTRY_ANY(s0, s7, USER_EVT_EXIT)
  315. FSM_RULE_ENTRY_ANY(s1, s7, USER_EVT_EXIT)
  316. FSM_RULE_ENTRY_ANY(s3, s7, USER_EVT_EXIT)
  317. FSM_RULE_ENTRY_ANY(s4, s7, USER_EVT_EXIT)
  318. FSM_RULE_ENTRY_ANY(s6, s7, USER_EVT_EXIT)
  319. FSM_RULE_ENTRY(s7, s0, USER_EVT_EXIT_FINISHED, 0)
  320. FSM_RULE_ENTRY(s7, s5, USER_EVT_EXIT_FINISHED, 1)
  321. FSM_RULE_ENTRY(s7, s3, USER_EVT_EXIT_FINISHED, 2)
  322. FSM_RULE_ENTRY_ANY(s0, s5, USER_EVT_NO_CONTAINS_DEVICE)
  323. FSM_RULE_ENTRY(s5, s5, USER_EVT_BIND_DEVICE_FINISHED, 0)
  324. FSM_RULE_ENTRY(s5, s0, USER_EVT_BIND_DEVICE_FINISHED, 1)
  325. FSM_RULE_ENTRY(s5, s6, USER_EVT_BIND_DEVICE_FINISHED, 4)
  326. FSM_RULE_ENTRY(s5, s1, USER_EVT_BIND_DEVICE_FINISHED, 6)
  327. END_FSM_RULE()
  328. virtual void s0_on_entry();
  329. virtual void s0_on_exit();
  330. virtual unsigned int s0_on_event(FSMEvent* e);
  331. virtual void s1_on_entry();
  332. virtual void s1_on_exit();
  333. virtual unsigned int s1_on_event(FSMEvent* e);
  334. //virtual void s2_on_entry();
  335. //virtual void s2_on_exit();
  336. //virtual unsigned int s2_on_event(FSMEvent* e);
  337. virtual void s3_on_entry();
  338. virtual void s3_on_exit();
  339. virtual unsigned int s3_on_event(FSMEvent* e);
  340. virtual void s4_on_entry();
  341. virtual void s4_on_exit();
  342. virtual unsigned int s4_on_event(FSMEvent* e);
  343. virtual void s5_on_entry();
  344. virtual void s5_on_exit();
  345. virtual unsigned int s5_on_event(FSMEvent* e);
  346. virtual void s6_on_entry();
  347. virtual void s6_on_exit();
  348. virtual unsigned int s6_on_event(FSMEvent* e);
  349. virtual void s7_on_entry();
  350. virtual void s7_on_exit();
  351. virtual unsigned int s7_on_event(FSMEvent* e);
  352. virtual void OnStateTrans(int iSrcState, int iDstState);
  353. int BindDevice(SpReqAnsContext<PortableScannerService_BindCameraDevice_Req,
  354. PortableScannerService_BindCameraDevice_Ans>::Pointer ctx);
  355. int StartPreview(SpReqAnsContext<PortableScannerService_StartPreview_Req,
  356. PortableScannerService_StartPreview_Ans>::Pointer ctx);
  357. /** Alaways return Error_Succeed Gifur@2022715]*/
  358. ErrorCodeEnum SetPreview(SpReqAnsContext<PortableScannerService_StartPreview_Req,
  359. PortableScannerService_StartPreview_Ans>::Pointer ctx);
  360. int StopPreview(SpReqAnsContext<PortableScannerService_CancelPreview_Req,
  361. PortableScannerService_CancelPreview_Ans>::Pointer ctx);
  362. int ScanImage(SpReqAnsContext<PortableScannerService_ScanImage_Req,
  363. PortableScannerService_ScanImage_Ans>::Pointer ctx);
  364. int ScanImageEx(SpReqAnsContext<PortableScannerService_ScanImageEx_Req,
  365. PortableScannerService_ScanImageEx_Ans>::Pointer ctx);
  366. int ShowProperty(SpReqAnsContext<PortableScannerService_ShowProperty_Req,
  367. PortableScannerService_ShowProperty_Ans>::Pointer ctx);
  368. int SetProperty(SpReqAnsContext<PortableScannerService_SetProperty_Req,
  369. PortableScannerService_SetProperty_Ans>::Pointer ctx);
  370. int SetWinPos(SpReqAnsContext<PortableScannerService_SetWinPos_Req,
  371. PortableScannerService_SetWinPos_Ans>::Pointer ctx);
  372. int GetDevStatus(SpReqAnsContext<PortableScannerService_GetDevStatus_Req,
  373. PortableScannerService_GetDevStatus_Ans>::Pointer ctx);
  374. int GetDevInfo(SpReqAnsContext<PortableScannerService_GetDevInfo_Req,
  375. PortableScannerService_GetDevInfo_Ans>::Pointer ctx);
  376. int OnDevExit();
  377. ErrorCodeEnum UnitTest();
  378. struct StuHSPSParam {
  379. ULONG resolutionX;
  380. ULONG resolutionY;
  381. UINT framePerSec;
  382. };
  383. ErrorCodeEnum GetHSPSParams(const CSimpleStringA& strSection, StuHSPSParam& param);
  384. private:
  385. #ifndef SHIELD_APDATER_INTERFACE
  386. int m_version, m_batch;
  387. HMODULE m_hVendorDll;
  388. LpCreateDevCom CreateDevComponent;
  389. LpReleaseDevCom ReleaseDevComponent;
  390. CHSPSClass* m_pHSPS;
  391. #endif
  392. ErrorCodeEnum m_ecSelfTest;
  393. DWORD m_dwErroCode;
  394. BOOL m_bOperating;
  395. int m_nTickTimes;
  396. int m_nFatalTimes;
  397. int m_nSrcState;
  398. int m_nRecX, m_nRecY, m_nRecW;
  399. CSimpleStringA m_cameraName;
  400. CSimpleStringA m_csDllName;
  401. DevStateEnum m_eDevStatus;
  402. EvtType m_desiredAction;
  403. CDocScannerCap* m_pCapture;
  404. CapTypeEnum m_capCurrentType;
  405. DWORD m_dwEntDevelID;
  406. DWORD m_dwMaxImageSize;
  407. BOOL m_fNotCloseCamereAtMainPage;
  408. CRITICAL_SECTION m_csOpenCamera;
  409. public:
  410. #ifndef SHIELD_APDATER_INTERFACE
  411. ErrorCodeEnum FetchVendorDllName(CSimpleStringA& csDllPath);
  412. ErrorCodeEnum LoadDllAndGetAddress(const char* szDllName);
  413. void GetAndDbgDevError();
  414. #endif
  415. DWORD GetCustLastErrorCode() { return m_dwErroCode; }
  416. void SetCustLastErrorCode(DWORD dwVal = 0) { m_dwErroCode = dwVal; }
  417. bool ResizeImage(CSimpleStringA fileName);
  418. private:
  419. BOOL GetCurImageName(CSimpleStringA& csImagName, bool bExt = false);
  420. BOOL DelAndGetNewFileName(CSimpleStringA& csfileName);
  421. ErrorCodeEnum DeleteFileIfExisted(LPCTSTR fileName);
  422. void RetrieveROIFromRunTime();
  423. void GetPortableResRatio(LPCTSTR lpcszDevName, StuHSPSParam& param);
  424. BOOL RetrieveVendorName(LPCTSTR lpcszDevName, CSimpleStringA& strVendorName);
  425. DWORD CombineEventCodeWithDevelID(DWORD dwEventCode) const
  426. {
  427. return (DWORD)((m_dwEntDevelID << 20) + dwEventCode);
  428. }
  429. DWORD CombineEventCodeWithDevID(DWORD dwDevID, DWORD dwEventCode) const
  430. {
  431. return (DWORD)((dwDevID << 16) + dwEventCode);
  432. }
  433. DWORD GetPortableDevID(LPCTSTR lpcszDevName);
  434. void FireLogEventMsg(DWORD dwUserPlainCode, LPCTSTR lpcszMessage);
  435. void InitialMaxResizeValue();
  436. };
  437. struct BindDeviceTask : public ITaskSp
  438. {
  439. CPortableScannerFSM* m_fsm;
  440. SpReqAnsContext<PortableScannerService_BindCameraDevice_Req, PortableScannerService_BindCameraDevice_Ans>::Pointer m_ctx;
  441. BindDeviceTask(CPortableScannerFSM* fsm): m_fsm(fsm){}
  442. void Process()
  443. {
  444. FSMEvent* pEvt = new FSMEvent(USER_EVT_BIND_DEVICE_FINISHED);
  445. pEvt->param1 = m_fsm->BindDevice(m_ctx);
  446. pEvt->param2 = 0;
  447. m_fsm->PostEventFIFO(pEvt);
  448. return;
  449. }
  450. void SetContext(
  451. SpReqAnsContext<PortableScannerService_BindCameraDevice_Req,
  452. PortableScannerService_BindCameraDevice_Ans>::Pointer ctx)
  453. {
  454. m_ctx = ctx;
  455. return;
  456. }
  457. };
  458. struct StartPreviewTask : public ITaskSp
  459. {
  460. CPortableScannerFSM* m_fsm;
  461. SpReqAnsContext<PortableScannerService_StartPreview_Req, PortableScannerService_StartPreview_Ans>::Pointer m_ctx;
  462. StartPreviewTask(CPortableScannerFSM* fsm): m_fsm(fsm){}
  463. void Process()
  464. {
  465. FSMEvent* pEvt = new FSMEvent(USER_EVT_STARTPREVIEW_FINISHED);
  466. pEvt->param1 = m_fsm->StartPreview(m_ctx);
  467. m_fsm->PostEventFIFO(pEvt);
  468. return;
  469. }
  470. void SetContext(
  471. SpReqAnsContext<PortableScannerService_StartPreview_Req,
  472. PortableScannerService_StartPreview_Ans>::Pointer ctx)
  473. {
  474. m_ctx = ctx;
  475. return;
  476. }
  477. };
  478. struct SetPropertyInPreviewTask : public ITaskSp
  479. {
  480. CPortableScannerFSM* m_fsm;
  481. SpReqAnsContext<PortableScannerService_StartPreview_Req, PortableScannerService_StartPreview_Ans>::Pointer m_ctx;
  482. SetPropertyInPreviewTask(CPortableScannerFSM* fsm): m_fsm(fsm){}
  483. void Process()
  484. {
  485. FSMEvent* pEvt = new FSMEvent(USER_EVT_SETPROPERTYINVIEW_FINISHED);
  486. ErrorCodeEnum eRet = m_fsm->SetPreview(m_ctx);
  487. m_ctx->Answer(eRet);
  488. if(ISSUCCEEDED(eRet))
  489. pEvt->param1 = 0;
  490. else
  491. pEvt->param1 = 1;
  492. m_fsm->PostEventFIFO(pEvt);
  493. return;
  494. }
  495. void SetContext(
  496. SpReqAnsContext<PortableScannerService_StartPreview_Req,
  497. PortableScannerService_StartPreview_Ans>::Pointer ctx)
  498. {
  499. m_ctx = ctx;
  500. return;
  501. }
  502. };
  503. struct StopPreviewTask : public ITaskSp
  504. {
  505. CPortableScannerFSM* m_fsm;
  506. SpReqAnsContext<PortableScannerService_CancelPreview_Req,
  507. PortableScannerService_CancelPreview_Ans>::Pointer m_ctx;
  508. StopPreviewTask(CPortableScannerFSM* fsm): m_fsm(fsm){}
  509. void Process()
  510. {
  511. FSMEvent* pEvt = new FSMEvent(USER_EVT_STOPPREVIEW_FINISHED);
  512. pEvt->param1 = m_fsm->StopPreview(m_ctx);
  513. m_fsm->PostEventFIFO(pEvt);
  514. return;
  515. }
  516. void SetContext(
  517. SpReqAnsContext<PortableScannerService_CancelPreview_Req,
  518. PortableScannerService_CancelPreview_Ans>::Pointer ctx)
  519. {
  520. m_ctx = ctx;
  521. return;
  522. }
  523. };
  524. struct ScanImageTask : public ITaskSp
  525. {
  526. CPortableScannerFSM* m_fsm;
  527. SpReqAnsContext<PortableScannerService_ScanImage_Req,
  528. PortableScannerService_ScanImage_Ans>::Pointer m_ctx;
  529. ScanImageTask(CPortableScannerFSM* fsm): m_fsm(fsm){}
  530. void Process()
  531. {
  532. FSMEvent* pEvt = new FSMEvent(USER_EVT_SCANIMAGEFINISHED);
  533. pEvt->param1 = m_fsm->ScanImage(m_ctx);
  534. m_fsm->PostEventFIFO(pEvt);
  535. return;
  536. }
  537. void SetContext(
  538. SpReqAnsContext<PortableScannerService_ScanImage_Req,
  539. PortableScannerService_ScanImage_Ans>::Pointer ctx)
  540. {
  541. m_ctx = ctx;
  542. return;
  543. }
  544. };
  545. struct ScanImageExTask : public ITaskSp
  546. {
  547. CPortableScannerFSM* m_fsm;
  548. SpReqAnsContext<PortableScannerService_ScanImageEx_Req,
  549. PortableScannerService_ScanImageEx_Ans>::Pointer m_ctx;
  550. ScanImageExTask(CPortableScannerFSM* fsm): m_fsm(fsm){}
  551. void Process()
  552. {
  553. FSMEvent* pEvt = new FSMEvent(USER_EVT_SCANIMAGEFINISHED);
  554. pEvt->param1 = m_fsm->ScanImageEx(m_ctx);
  555. m_fsm->PostEventFIFO(pEvt);
  556. return;
  557. }
  558. void SetContext(
  559. SpReqAnsContext<PortableScannerService_ScanImageEx_Req,
  560. PortableScannerService_ScanImageEx_Ans>::Pointer ctx)
  561. {
  562. m_ctx = ctx;
  563. return;
  564. }
  565. };
  566. struct ShowPropertyTask : public ITaskSp
  567. {
  568. CPortableScannerFSM* m_fsm;
  569. SpReqAnsContext<PortableScannerService_ShowProperty_Req,
  570. PortableScannerService_ShowProperty_Ans>::Pointer m_ctx;
  571. ShowPropertyTask(CPortableScannerFSM* fsm): m_fsm(fsm){}
  572. void Process()
  573. {
  574. FSMEvent* pEvt = new FSMEvent(USER_EVT_SHOWPROPERTY_FINISHED);
  575. pEvt->param1 = m_fsm->ShowProperty(m_ctx);
  576. m_fsm->PostEventFIFO(pEvt);
  577. return;
  578. }
  579. void SetContext(
  580. SpReqAnsContext<PortableScannerService_ShowProperty_Req,
  581. PortableScannerService_ShowProperty_Ans>::Pointer ctx)
  582. {
  583. m_ctx = ctx;
  584. return;
  585. }
  586. };
  587. struct SetPropertyTask : public ITaskSp
  588. {
  589. CPortableScannerFSM* m_fsm;
  590. SpReqAnsContext<PortableScannerService_SetProperty_Req,
  591. PortableScannerService_SetProperty_Ans>::Pointer m_ctx;
  592. SetPropertyTask(CPortableScannerFSM* fsm): m_fsm(fsm){}
  593. void Process()
  594. {
  595. m_fsm->SetProperty(m_ctx);
  596. return;
  597. }
  598. void SetContext(
  599. SpReqAnsContext<PortableScannerService_SetProperty_Req,
  600. PortableScannerService_SetProperty_Ans>::Pointer ctx)
  601. {
  602. m_ctx = ctx;
  603. return;
  604. }
  605. };
  606. struct SetWinPosTask : public ITaskSp
  607. {
  608. CPortableScannerFSM* m_fsm;
  609. SpReqAnsContext<PortableScannerService_SetWinPos_Req,
  610. PortableScannerService_SetWinPos_Ans>::Pointer m_ctx;
  611. SetWinPosTask(CPortableScannerFSM* fsm): m_fsm(fsm){}
  612. void Process()
  613. {
  614. m_fsm->SetWinPos(m_ctx);
  615. return;
  616. }
  617. void SetContext(
  618. SpReqAnsContext<PortableScannerService_SetWinPos_Req,
  619. PortableScannerService_SetWinPos_Ans>::Pointer ctx)
  620. {
  621. m_ctx = ctx;
  622. return;
  623. }
  624. };
  625. struct GetDevStatusTask : public ITaskSp
  626. {
  627. CPortableScannerFSM* m_fsm;
  628. SpReqAnsContext<PortableScannerService_GetDevStatus_Req,
  629. PortableScannerService_GetDevStatus_Ans>::Pointer m_ctx;
  630. GetDevStatusTask(CPortableScannerFSM* fsm): m_fsm(fsm){}
  631. void Process()
  632. {
  633. m_fsm->GetDevStatus(m_ctx);
  634. if(m_ctx->Ans.connected == 0 && m_fsm->GetCurrState()->id != CPortableScannerFSM::s5) {
  635. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Detect that not have device attached and not stay in NotHold situation");
  636. m_fsm->PostEventFIFO(new FSMEvent(USER_EVT_NO_CONTAINS_DEVICE));
  637. }
  638. return;
  639. }
  640. void SetContext(
  641. SpReqAnsContext<PortableScannerService_GetDevStatus_Req,
  642. PortableScannerService_GetDevStatus_Ans>::Pointer ctx)
  643. {
  644. m_ctx = ctx;
  645. return;
  646. }
  647. };
  648. struct GetDevInfoTask : public ITaskSp
  649. {
  650. CPortableScannerFSM* m_fsm;
  651. SpReqAnsContext<PortableScannerService_GetDevInfo_Req,
  652. PortableScannerService_GetDevInfo_Ans>::Pointer m_ctx;
  653. GetDevInfoTask(CPortableScannerFSM* fsm): m_fsm(fsm){}
  654. void Process()
  655. {
  656. m_fsm->GetDevInfo(m_ctx);
  657. return;
  658. }
  659. void SetContext(
  660. SpReqAnsContext<PortableScannerService_GetDevInfo_Req,
  661. PortableScannerService_GetDevInfo_Ans>::Pointer ctx)
  662. {
  663. m_ctx = ctx;
  664. return;
  665. }
  666. };
  667. #endif //_PORTABLESCANNER_FSM_H__