PortableScannerFSM.h 21 KB

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