ScannerSetFSM.cpp 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776
  1. #include "stdafx.h"
  2. #include "ScannerSetFSM.h"
  3. #include "EventCode.h"
  4. #include "SpIni.h"
  5. #include "toolkit.h"
  6. #include "iniutil.h"
  7. #include "CommEntityUtil.hpp"
  8. #include "path.h"
  9. #define CHECKDEV_TIMER_ID 1
  10. const int MILLISECOND_TO_CHECKDEV = 15 * 1000;
  11. const int MILLISECOND_TO_CHECK_CONNECT = 30 * 1000;
  12. const int MILLISECOND_WAIT_TIMEOUT_DEFAULT = 10 * 1000;
  13. const int MILLISECOND_WAIT_TIMEOUT_STARTPREVIEW = 20 * 1000;
  14. const int MILLISECOND_WAIT_TIMEOUT_SCANIMAGE = 15 * 1000;
  15. #define MODULE_VERION_FULL "2024.6"
  16. const char* EvtTypeToString(int nEvtType)
  17. {
  18. switch(nEvtType)
  19. {
  20. case USER_EVT_STARTPREVIEW: return "USER_EVT_STARTPREVIEW";
  21. break;
  22. case USER_EVT_STARTPREVIEW_FINISHED: return "USER_EVT_STARTPREVIEW_FINISHED";
  23. break;
  24. case USER_EVT_STOPPREVIEW: return "USER_EVT_STOPPREVIEW";
  25. break;
  26. case USER_EVT_STOPPREVIEW_FINISHED: return "USER_EVT_STOPPREVIEW_FINISHED";
  27. break;
  28. case USER_EVT_SETWINPOS: return "USER_EVT_SETWINPOS";
  29. break;
  30. case USER_EVT_SETWINPOS_FINISHED: return "USER_EVT_SETWINPOS_FINISHED";
  31. break;
  32. case USER_EVT_SCANIMAGE: return "USER_EVT_SCANIMAGE";
  33. break;
  34. case USER_EVT_SCANIMAGEFINISHED: return "USER_EVT_SCANIMAGEFINISHED";
  35. break;
  36. case USER_EVT_SETPROPERTY: return "USER_EVT_SETPROPERTY";
  37. break;
  38. case USER_EVT_SETPROPERTY_FINISHED: return "USER_EVT_SETPROPERTY_FINISHED";
  39. break;
  40. case USER_EVT_SHOWPROPERTY: return "USER_EVT_SHOWPROPERTY";
  41. break;
  42. case USER_EVT_SHOWPROPERTY_FINISHED: return "USER_EVT_SHOWPROPERTY_FINISHED";
  43. break;
  44. case USER_EVT_GETSTATUS: return "USER_EVT_GETSTATUS";
  45. break;
  46. case USER_EVT_GETSTATUS_FINISHED: return "USER_EVT_GETSTATUS_FINISHED";
  47. break;
  48. case USER_EVT_GETINFO: return "USER_EVT_GETINFO";
  49. break;
  50. case USER_EVT_GETINFO_FINISHED: return "USER_EVT_GETINFO_FINISHED";
  51. break;
  52. case USER_EVT_EXIT: return "USER_EVT_EXIT";
  53. break;
  54. case USER_EVT_QUIT: return "USER_EVT_QUIT";
  55. break;
  56. case USER_EVT_RESET: return "USER_EVT_RESET";
  57. break;
  58. case USER_EVT_DEV_INVALID: return "USER_EVT_DEV_INVALID";
  59. break;
  60. case USER_EVT_DEV_RECOVER: return "USER_EVT_DEV_RECOVER";
  61. break;
  62. case USER_EVT_OPERATING: return "USER_EVT_OPERATING";
  63. break;
  64. case EVT_TIMER: return "EVT_TIMER";
  65. break;
  66. default:
  67. return "Unknown EventType";
  68. break;
  69. }
  70. return "Unknown EventType";
  71. }
  72. static bool MapErrorCode2Level(ErrorCodeEnum ec)
  73. {
  74. return (ec == Error_IO || ec == Error_NetBroken || ec == Error_TimeOut);
  75. }
  76. CScannerFSM::CScannerFSM(void)
  77. :
  78. m_pHSPSClient(NULL),
  79. m_ecSelfTest(Error_Succeed),
  80. m_dwErroCode(0),
  81. m_nFatalTimes(0),
  82. m_nSrcState(s0),
  83. m_iEvt(-1)
  84. {
  85. }
  86. CScannerFSM::~CScannerFSM(void)
  87. {
  88. ReleaseSuitableEntity();
  89. }
  90. ErrorCodeEnum CScannerFSM::OnInit()
  91. {
  92. ErrorCodeEnum erroCode = Error_Succeed;
  93. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Version: %s, Complied at: %s %s", MODULE_VERION_FULL, __DATE__, __TIME__);
  94. return erroCode;
  95. }
  96. void CScannerFSM::AfterInit()
  97. {
  98. }
  99. ErrorCodeEnum CScannerFSM::OnExit()
  100. {
  101. return Error_Succeed;
  102. }
  103. void CScannerFSM::s0_on_entry()
  104. {
  105. m_nFatalTimes = 0;
  106. m_ecSelfTest = Error_Succeed;
  107. }
  108. void CScannerFSM::s0_on_exit()
  109. {
  110. }
  111. unsigned int CScannerFSM::s0_on_event(FSMEvent* e)
  112. {
  113. unsigned int uRet = 0;
  114. switch(e->iEvt)
  115. {
  116. case USER_EVT_OPERATING:
  117. {
  118. OperatingEvent* pEvt = dynamic_cast<OperatingEvent*>(e);
  119. m_iEvt = pEvt->m_bindEvt;
  120. pEvt->SetHandled();
  121. }
  122. break;
  123. case USER_EVT_DEV_INVALID:
  124. {
  125. }
  126. e->SetHandled();
  127. break;
  128. case USER_EVT_STARTPREVIEW:
  129. {
  130. StartPreviewTask* pTask = new StartPreviewTask(this);
  131. StartPreviewEvent* pEvt = dynamic_cast<StartPreviewEvent*>(e);
  132. pTask->SetContext(pEvt->m_ctx);
  133. PostEventFIFO(new OperatingEvent(e->iEvt)); //operating event.
  134. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  135. e->SetHandled();
  136. }
  137. break;
  138. case USER_EVT_STOPPREVIEW:
  139. {
  140. StopPreviewTask* pTask = new StopPreviewTask(this);
  141. StopPreviewEvent* pEvt = dynamic_cast<StopPreviewEvent*>(e);
  142. pTask->SetContext(pEvt->m_ctx);
  143. PostEventFIFO(new OperatingEvent(e->iEvt)); //operating event.
  144. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  145. }
  146. e->SetHandled();
  147. break;
  148. case USER_EVT_SCANIMAGE:
  149. {
  150. ScanImageTask* pTask = new ScanImageTask(this);
  151. ScanImageEvent* pEvt = dynamic_cast<ScanImageEvent*>(e);
  152. pTask->SetContext(pEvt->m_ctx);
  153. PostEventFIFO(new OperatingEvent(e->iEvt)); //operating event.
  154. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  155. }
  156. e->SetHandled();
  157. break;
  158. case USER_EVT_SETPROPERTY:
  159. {
  160. SetPropertyEvent* pEvt = dynamic_cast<SetPropertyEvent*>(e);
  161. SetPropertyTask* pTask = new SetPropertyTask(this);
  162. pTask->SetContext(pEvt->m_ctx);
  163. PostEventFIFO(new OperatingEvent(e->iEvt)); //operating event.
  164. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  165. }
  166. e->SetHandled();
  167. break;
  168. case USER_EVT_SHOWPROPERTY:
  169. {
  170. ShowPropertyEvent* pEvt = dynamic_cast<ShowPropertyEvent*>(e);
  171. ShowPropertyTask* pTask = new ShowPropertyTask(this);
  172. pTask->SetContext(pEvt->m_ctx);
  173. PostEventFIFO(new OperatingEvent(e->iEvt)); //operating event.
  174. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  175. }
  176. e->SetHandled();
  177. break;
  178. case USER_EVT_SETWINPOS:
  179. {
  180. SetWinPosEvent* pEvt = dynamic_cast<SetWinPosEvent*>(e);
  181. SetWinPosTask* pTask = new SetWinPosTask(this);
  182. pTask->SetContext(pEvt->m_ctx);
  183. PostEventFIFO(new OperatingEvent(e->iEvt)); //operating event.
  184. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  185. }
  186. e->SetHandled();
  187. break;
  188. case USER_EVT_GETSTATUS:
  189. {
  190. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  191. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  192. pTask->SetContext(pEvt->m_ctx);
  193. PostEventFIFO(new OperatingEvent(e->iEvt)); //operating event.
  194. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  195. }
  196. e->SetHandled();
  197. break;
  198. case USER_EVT_GETINFO:
  199. {
  200. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  201. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  202. pTask->SetContext(pEvt->m_ctx);
  203. PostEventFIFO(new OperatingEvent(e->iEvt)); //operating event.
  204. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  205. }
  206. e->SetHandled();
  207. break;
  208. default:
  209. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("unknown event id: %d", e->iEvt);
  210. }
  211. return uRet;
  212. }
  213. void CScannerFSM::s2_on_entry()
  214. {
  215. }
  216. void CScannerFSM::s2_on_exit()
  217. {
  218. m_iEvt = -1;
  219. }
  220. unsigned int CScannerFSM::s2_on_event(FSMEvent* e)
  221. {
  222. unsigned int uRet = 0;
  223. switch(e->iEvt)
  224. {
  225. case USER_EVT_STARTPREVIEW_FINISHED:
  226. {
  227. if(m_iEvt == USER_EVT_STARTPREVIEW)
  228. {
  229. uRet = 1;
  230. e->SetHandled();
  231. }
  232. }
  233. break;
  234. case USER_EVT_STOPPREVIEW_FINISHED:
  235. {
  236. if(m_iEvt == USER_EVT_STOPPREVIEW)
  237. {
  238. uRet = 1;
  239. e->SetHandled();
  240. }
  241. }
  242. break;
  243. case USER_EVT_SCANIMAGEFINISHED:
  244. {
  245. if(m_iEvt == USER_EVT_SCANIMAGE)
  246. {
  247. uRet = 1;
  248. e->SetHandled();
  249. }
  250. }
  251. break;
  252. case USER_EVT_SETPROPERTY_FINISHED:
  253. {
  254. if(m_iEvt == USER_EVT_SETPROPERTY)
  255. {
  256. uRet = 1;
  257. e->SetHandled();
  258. }
  259. }
  260. break;
  261. case USER_EVT_SHOWPROPERTY_FINISHED:
  262. {
  263. if(m_iEvt == USER_EVT_SHOWPROPERTY)
  264. {
  265. uRet = 1;
  266. e->SetHandled();
  267. }
  268. }
  269. break;
  270. case USER_EVT_SETWINPOS_FINISHED:
  271. {
  272. if(m_iEvt == USER_EVT_SETWINPOS)
  273. {
  274. uRet = 1;
  275. e->SetHandled();
  276. }
  277. }
  278. break;
  279. case USER_EVT_GETSTATUS_FINISHED:
  280. {
  281. if(m_iEvt == USER_EVT_GETSTATUS)
  282. {
  283. uRet = 1;
  284. e->SetHandled();
  285. }
  286. }
  287. break;
  288. case USER_EVT_GETINFO_FINISHED:
  289. {
  290. if(m_iEvt == USER_EVT_GETINFO)
  291. {
  292. uRet = 1;
  293. e->SetHandled();
  294. }
  295. }
  296. break;
  297. default:
  298. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("unknown event id: %d", e->iEvt);
  299. break;
  300. }
  301. return uRet;
  302. }
  303. void CScannerFSM::s4_on_entry()
  304. {
  305. ScheduleTimer(CHECKDEV_TIMER_ID, MILLISECOND_TO_CHECKDEV);
  306. }
  307. void CScannerFSM::s4_on_exit()
  308. {
  309. CancelTimer(CHECKDEV_TIMER_ID);
  310. }
  311. unsigned int CScannerFSM::s4_on_event(FSMEvent* e)
  312. {
  313. unsigned int uRet = 0;
  314. switch(e->iEvt)
  315. {
  316. case USER_EVT_DEV_RECOVER:
  317. {
  318. }
  319. e->SetHandled();
  320. break;
  321. case EVT_TIMER:
  322. {
  323. if(e->param1 == CHECKDEV_TIMER_ID)
  324. {
  325. e->SetHandled();
  326. if (ISSUCCEEDED(CheckHSPSConnectStatus()))
  327. {
  328. PostEventFIFO(new FSMEvent(USER_EVT_DEV_RECOVER));
  329. break;
  330. }
  331. ScheduleTimer(CHECKDEV_TIMER_ID, MILLISECOND_TO_CHECKDEV);
  332. }
  333. }
  334. break;
  335. case USER_EVT_GETSTATUS:
  336. {
  337. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  338. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  339. pTask->SetContext(pEvt->m_ctx);
  340. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  341. }
  342. e->SetHandled();
  343. break;
  344. case USER_EVT_GETINFO:
  345. {
  346. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  347. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  348. pTask->SetContext(pEvt->m_ctx);
  349. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  350. }
  351. e->SetHandled();
  352. break;
  353. }
  354. return uRet;
  355. }
  356. int CScannerFSM::StartPreview(SpReqAnsContext<ScannerService_StartPreview_Req,
  357. ScannerService_StartPreview_Ans>::Pointer ctx)
  358. {
  359. int nRes = 0;
  360. ErrorCodeEnum erroCode = Error_Unexpect;
  361. DWORD dwUserCode(0);
  362. if(!IsSuitableEntityAvailable())
  363. {
  364. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__).setLogCode(ScannerService_LogCode_StartPreview).setResultCode("RTA2O01")("entity HSPScanner is not available");
  365. ctx->Answer(Error_DevNotAvailable, LOG_WARN_MODULE_INVALID);
  366. return 1;
  367. }
  368. HSPScannerService_StartPreview_Req req = {};
  369. HSPScannerService_StartPreview_Ans ans = {};
  370. req.rotateType = ctx->Req.rotateType;
  371. req.scanType = ctx->Req.scanType;
  372. req.colorType = ctx->Req.colorType;
  373. erroCode = (*m_pHSPSClient)(EntityResource::getLink().upgradeLink())->StartPreview(req, ans, MILLISECOND_WAIT_TIMEOUT_STARTPREVIEW, dwUserCode);
  374. if (FAILURED(erroCode)) {
  375. nRes = 1;
  376. if (MapErrorCode2Level(erroCode)) {
  377. LogWarn(Severity_Middle, erroCode, LOG_ERR_SCANNERSET_API_INVOKE_StartPreview,
  378. CSimpleStringA::Format("StartPreview context failed, ErrCode:%s, userCode: 0x%08X.", SpStrError(erroCode), dwUserCode));
  379. erroCode = Error_DevNotAvailable;
  380. }
  381. else {
  382. LogWarn(Severity_Middle, erroCode, LOG_ERR_SCANNERSET_API_INVOKE_StartPreview,
  383. CSimpleStringA::Format("StartPreview context failed, ErrCode:%s, userCode: 0x%08X.", SpStrError(erroCode), dwUserCode));
  384. }
  385. }
  386. else {
  387. ctx->Ans.retCode = ans.retCode;
  388. }
  389. ctx->Answer(erroCode, dwUserCode);
  390. return nRes;
  391. }
  392. int CScannerFSM::StopPreview(SpReqAnsContext<ScannerService_CancelPreview_Req,
  393. ScannerService_CancelPreview_Ans>::Pointer ctx)
  394. {
  395. ErrorCodeEnum erroCode = Error_Unexpect;
  396. DWORD dwUserCode(0);
  397. int nRes = 0;
  398. if(!IsSuitableEntityAvailable())
  399. {
  400. //Error_DevNotAvailable,识别该错误码,并提示客户,但不纳入万笔硬件故障统计 主 题:Re: 【阅知】万笔业务故障web端优化
  401. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__).setLogCode(ScannerService_LogCode_CancelPreview).setResultCode("RTA2O01")("entity HSPScanner is not available");
  402. ctx->Answer(Error_DevNotAvailable, LOG_WARN_MODULE_INVALID);
  403. return 1;
  404. }
  405. HSPScannerService_CancelPreview_Req req = {};
  406. HSPScannerService_CancelPreview_Ans ans = {};
  407. req.bOnlyHide = ctx->Req.reserved1 == 0 ? false : true;
  408. erroCode = (*m_pHSPSClient)(EntityResource::getLink().upgradeLink())->CancelPreview(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT, dwUserCode);
  409. ctx->Answer(erroCode, dwUserCode);
  410. if (FAILURED(erroCode)) {
  411. LogWarn(Severity_Middle, erroCode, LOG_ERR_SCANNERSET_API_INVOKE_CancelPreview,
  412. CSimpleStringA::Format("CancelPreview context failed: ErrCode:%s, userCode: 0x%08X.", SpStrError(erroCode), dwUserCode));
  413. nRes = 1;
  414. }
  415. else {
  416. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_USER).setAPI(__FUNCTION__)("CancelPreview context suc.");
  417. }
  418. return nRes;
  419. }
  420. int CScannerFSM::ScanImage(SpReqAnsContext<ScannerService_ScanImage_Req,
  421. ScannerService_ScanImage_Ans>::Pointer ctx)
  422. {
  423. int nRes = 0;
  424. ErrorCodeEnum erroCode = Error_Unexpect;
  425. DWORD dwUserCode(0);
  426. if(!IsSuitableEntityAvailable())
  427. {
  428. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__).setLogCode(ScannerService_LogCode_ScanImage).setResultCode("RTA2O01")("entity HSPScanner is not available");
  429. ctx->Answer(Error_DevNotAvailable, LOG_WARN_MODULE_INVALID);
  430. return 1;
  431. }
  432. if(ctx->Req.nWay == 0)
  433. {
  434. HSPScannerService_ScanImage_Req req = {};
  435. HSPScannerService_ScanImage_Ans ans = {};
  436. erroCode = (*m_pHSPSClient)(EntityResource::getLink().upgradeLink())->ScanImage(req, ans, MILLISECOND_WAIT_TIMEOUT_SCANIMAGE, dwUserCode);
  437. if (FAILURED(erroCode)) {
  438. if (MapErrorCode2Level(erroCode)) {
  439. LogWarn(Severity_Middle, erroCode, LOG_ERR_SCANNERSET_API_INVOKE_ScanImage,
  440. CSimpleStringA::Format("ScanImage context failed, ErrCode:%s, userCode: 0x%08X.", SpStrError(erroCode), dwUserCode));
  441. erroCode = Error_DevNotAvailable;
  442. }
  443. else {
  444. LogWarn(Severity_Middle, erroCode, LOG_ERR_SCANNERSET_API_INVOKE_ScanImage,
  445. CSimpleStringA::Format("ScanImage context failed, ErrCode:%s, userCode: 0x%08X.", SpStrError(erroCode), dwUserCode));
  446. }
  447. nRes = 1;
  448. }
  449. else {
  450. ctx->Ans.filePath = ans.filePath;
  451. ctx->Ans.imageData = ans.imageData;
  452. }
  453. }
  454. else if(ctx->Req.nWay == 1)
  455. {
  456. HSPScannerService_ScanImageEx_Req req = {};
  457. HSPScannerService_ScanImageEx_Ans ans = {};
  458. erroCode = (*m_pHSPSClient)(EntityResource::getLink().upgradeLink())->ScanImageEx(req, ans, MILLISECOND_WAIT_TIMEOUT_SCANIMAGE, dwUserCode);
  459. if (FAILURED(erroCode)) {
  460. if (MapErrorCode2Level(erroCode)) {
  461. LogWarn(Severity_Middle, erroCode, LOG_ERR_SCANNERSET_API_INVOKE_ScanImageEx,
  462. CSimpleStringA::Format("ScanImageEx context failed, ErrCode:%s, userCode: 0x%08X.", SpStrError(erroCode), dwUserCode));
  463. erroCode = Error_DevNotAvailable;
  464. }
  465. else {
  466. LogWarn(Severity_Middle, erroCode, LOG_ERR_SCANNERSET_API_INVOKE_ScanImageEx,
  467. CSimpleStringA::Format("ScanImageEx context failed, ErrCode:%s, userCode: 0x%08X.", SpStrError(erroCode), dwUserCode));
  468. }
  469. nRes = 1;
  470. }
  471. else {
  472. ctx->Ans.filePath = ans.filePath;
  473. ctx->Ans.imageData = ans.imageData;
  474. }
  475. }
  476. else {
  477. erroCode = Error_Param;
  478. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__).setLogCode(ScannerService_LogCode_ScanImage).setResultCode("RTA2O01")("Invalid Param: Way:%d", ctx->Req.nWay);
  479. }
  480. ctx->Answer(erroCode, dwUserCode);
  481. return nRes;
  482. }
  483. int CScannerFSM::SetProperty(SpReqAnsContext<ScannerService_SetProperty_Req,
  484. ScannerService_SetProperty_Ans>::Pointer ctx)
  485. {
  486. ErrorCodeEnum erroCode = Error_Unexpect;
  487. DWORD dwUserCode(0);
  488. int nRes = 0;
  489. if(!IsSuitableEntityAvailable())
  490. {
  491. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__).setLogCode(ScannerService_LogCode_SetProperty).setResultCode("RTA2O01")("entity HSPScanner is not available");
  492. ctx->Answer(Error_DevNotAvailable, LOG_WARN_MODULE_INVALID);
  493. return 1;
  494. }
  495. HSPScannerService_SetProperty_Req req = {};
  496. HSPScannerService_SetProperty_Ans ans = {};
  497. req.rotateType = ctx->Req.rotateType;
  498. req.scanType = ctx->Req.scanType;
  499. req.colorType = ctx->Req.colorType;
  500. erroCode = (*m_pHSPSClient)(EntityResource::getLink().upgradeLink())->SetProperty(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT, dwUserCode);
  501. if (FAILURED(erroCode)) {
  502. LogWarn(Severity_Middle, erroCode, LOG_ERR_SCANNERSET_API_INVOKE_SetProperty,
  503. CSimpleStringA::Format("SetProperty context failed, ErrCode:%s, userCode: 0x%08X.", SpStrError(erroCode), dwUserCode));
  504. nRes = 1;
  505. }
  506. else {
  507. ctx->Ans.retCode = ans.retCode;
  508. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_USER)("SetProperty context suc, retCode: ans(%d), ctx(%d).", ans.retCode, ctx->Ans.retCode);
  509. }
  510. ctx->Answer(erroCode, dwUserCode);
  511. return nRes;
  512. }
  513. int CScannerFSM::ShowLTProperty(SpReqAnsContext<ScannerService_ShowProperty_Req,
  514. ScannerService_ShowProperty_Ans>::Pointer ctx)
  515. {
  516. int nRes = 0;
  517. ErrorCodeEnum erroCode = Error_Succeed;
  518. DWORD dwUserCode(0);
  519. int retCode = 0;
  520. if(!IsSuitableEntityAvailable())
  521. {
  522. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__).setLogCode(ScannerService_LogCode_ShowProperty).setResultCode("RTA2O01")("entity HSPScanner is not available");
  523. ctx->Answer(Error_DevNotAvailable, LOG_WARN_MODULE_INVALID);
  524. return 1;
  525. }
  526. HSPScannerService_ShowProperty_Req req = {};
  527. HSPScannerService_ShowProperty_Ans ans = {};
  528. erroCode = (*m_pHSPSClient)(EntityResource::getLink().upgradeLink())->ShowProperty(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT, dwUserCode);
  529. if (FAILURED(erroCode))
  530. {
  531. LogWarn(Severity_Middle, erroCode, LOG_ERR_SCANNERSET_API_INVOKE_ShowProperty,
  532. CSimpleStringA::Format("ShowLTProperty context failed, ErrCode:%s, userCode: 0x%08X.", SpStrError(erroCode), dwUserCode));
  533. nRes = 1;
  534. if (erroCode == Error_TimeOut)
  535. {
  536. erroCode = Error_Succeed;
  537. nRes = 0;
  538. }
  539. }
  540. else {
  541. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_USER)("ShowLTProperty context suc.");
  542. }
  543. ctx->Answer(erroCode, dwUserCode);
  544. return nRes;
  545. }
  546. int CScannerFSM::SetWinPos(SpReqAnsContext<ScannerService_SetWindowPos_Req,
  547. ScannerService_SetWindowPos_Ans>::Pointer ctx)
  548. {
  549. int nRes = 0;
  550. ErrorCodeEnum erroCode = Error_Unexpect;
  551. DWORD dwUserCode(0);
  552. if(!IsSuitableEntityAvailable())
  553. {
  554. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__).setLogCode(ScannerService_LogCode_SetWindowPos).setResultCode("RTA2O01")("entity HSPScanner is not available");
  555. ctx->Answer(Error_DevNotAvailable, LOG_WARN_MODULE_INVALID);
  556. return 1;
  557. }
  558. HSPScannerService_SetWinPos_Req req = {};
  559. HSPScannerService_SetWinPos_Ans ans = {};
  560. req.type = ctx->Req.type;
  561. req.pointX = ctx->Req.pointX;
  562. req.pointY = ctx->Req.pointY;
  563. req.nWidth = ctx->Req.nWidth;
  564. erroCode = (*m_pHSPSClient)(EntityResource::getLink().upgradeLink())->SetWinPos(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT, dwUserCode);
  565. if (FAILURED(erroCode)) {
  566. if (MapErrorCode2Level(erroCode)) {
  567. LogWarn(Severity_Middle, erroCode, LOG_ERR_SCANNERSET_API_INVOKE_SetWinPos,
  568. CSimpleStringA::Format("SetWinPos context failed, ErrCode:%s, userCode: 0x%08X.", SpStrError(erroCode), dwUserCode));
  569. erroCode = Error_DevNotAvailable;
  570. }
  571. else {
  572. LogWarn(Severity_Middle, erroCode, LOG_ERR_SCANNERSET_API_INVOKE_SetWinPos,
  573. CSimpleStringA::Format("SetWinPos context failed, ErrCode:%s, userCode: 0x%08X.", SpStrError(erroCode), dwUserCode));
  574. }
  575. nRes = 1;
  576. }
  577. else {
  578. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_USER)("SetWinPos context suc.");
  579. }
  580. ctx->Answer(erroCode, dwUserCode);
  581. return nRes;
  582. }
  583. int CScannerFSM::GetDevStatus(SpReqAnsContext<ScannerService_GetDevStatus_Req,
  584. ScannerService_GetDevStatus_Ans>::Pointer ctx)
  585. {
  586. int nRes = 0;
  587. ErrorCodeEnum erroCode = Error_Unexpect;
  588. DWORD dwUserCode(0);
  589. if(!IsSuitableEntityAvailable())
  590. {
  591. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__).setLogCode(ScannerService_LogCode_GetDevStatus).setResultCode("RTA2O01")("entity HSPScanner is not available");
  592. ctx->Answer(Error_DevNotAvailable, LOG_WARN_MODULE_INVALID);
  593. return 1;
  594. }
  595. HSPScannerService_GetDevStatus_Req req = {};
  596. HSPScannerService_GetDevStatus_Ans ans = {};
  597. erroCode = (*m_pHSPSClient)(EntityResource::getLink().upgradeLink())->GetDevStatus(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT, dwUserCode);
  598. if (FAILURED(erroCode)) {
  599. LogWarn(Severity_Middle, erroCode, LOG_ERR_SCANNERSET_API_INVOKE_GetDevStatus,
  600. CSimpleStringA::Format("GetDevStatus context failed, ErrCode:%s, userCode: 0x%08X.", SpStrError(erroCode), dwUserCode));
  601. }
  602. else {
  603. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_USER)("connected: %d, showing: %d, preview: %d.",
  604. ans.connected, ans.showing, ans.previewing);
  605. ctx->Ans.bInvalid = ans.connected == 0 ? false : true;
  606. ctx->Ans.bPreview = ans.previewing == 0 ? false : true;
  607. }
  608. ctx->Answer(erroCode, dwUserCode);
  609. return nRes;
  610. }
  611. int CScannerFSM::GetDevInfo(SpReqAnsContext<ScannerService_GetDevInfo_Req,
  612. ScannerService_GetDevInfo_Ans>::Pointer ctx)
  613. {
  614. int nRes = 0;
  615. ErrorCodeEnum erroCode = Error_Unexpect;
  616. DWORD dwUserCode(0);
  617. if(!IsSuitableEntityAvailable())
  618. {
  619. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__).setLogCode(ScannerService_LogCode_GetDevInfo).setResultCode("RTA2O01")("entity HSPScanner is not available");
  620. ctx->Answer(Error_DevNotAvailable, LOG_WARN_MODULE_INVALID);
  621. return 1;
  622. }
  623. HSPScannerService_GetDevInfo_Req req = {};
  624. HSPScannerService_GetDevInfo_Ans ans = {};
  625. erroCode = (*m_pHSPSClient)(EntityResource::getLink().upgradeLink())->GetDevInfo(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT, dwUserCode);
  626. if (FAILURED(erroCode)) {
  627. LogWarn(Severity_Middle, erroCode, LOG_ERR_SCANNERSET_API_INVOKE_GetDevInfo,
  628. CSimpleStringA::Format("GetDevInfo context failed, ErrCode:%s, userCode: 0x%08X.", SpStrError(erroCode), dwUserCode));
  629. nRes = 1;
  630. }
  631. else
  632. {
  633. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("type: %s, model: %s, version: %s, state:%d.",
  634. (LPCTSTR)ans.type, (LPCTSTR)ans.model, (LPCTSTR)ans.version, ans.state);
  635. ctx->Ans.type = ans.type;
  636. ctx->Ans.model = ans.model;
  637. ctx->Ans.version = ans.version;
  638. ctx->Ans.state = ans.state;
  639. }
  640. ctx->Answer(erroCode, dwUserCode);
  641. return nRes;
  642. }
  643. ErrorCodeEnum CScannerFSM::OnDevExit()
  644. {
  645. ErrorCodeEnum erroCode = Error_Unexpect;
  646. int nRes = 0;
  647. if(!IsSuitableEntityAvailable()) {
  648. return Error_DevNotAvailable;
  649. }
  650. HSPScannerService_Exit_Info info = {};
  651. erroCode = (*m_pHSPSClient)(EntityResource::getLink().upgradeLink())->Exit();
  652. return erroCode;
  653. }
  654. void CScannerFSM::SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext)
  655. {
  656. pTransactionContext->SendAnswer(m_ecSelfTest);
  657. }
  658. void CScannerFSM::OnStateTrans(int iSrcState, int iDstState)
  659. {
  660. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("FSM state from state %s to %s", GetStateName(iSrcState), GetStateName(iDstState));
  661. m_nSrcState = iSrcState;
  662. }
  663. ErrorCodeEnum CScannerFSM::ConnectToHSPScanner()
  664. {
  665. if (!IsHSPSConnectSessionOK()) {
  666. FreeHSPScannerClient();
  667. m_pHSPSClient = new CHSPSInnerClient(GetEntityBase());
  668. ErrorCodeEnum erroCode = m_pHSPSClient->Connect();
  669. if (FAILURED(erroCode)) {
  670. m_pHSPSClient->SafeDelete();
  671. m_pHSPSClient = NULL;
  672. LogWarn(Severity_Middle, Error_InvalidState, LOG_WARN_MODULE_INVALID,
  673. CSimpleStringA::Format("Connect to HSPScanner entity failed: %s", SpStrError(erroCode)));
  674. GetHSPSInfo();
  675. return Error_InvalidState;
  676. }
  677. }
  678. return Error_Succeed;
  679. }
  680. ErrorCodeEnum CScannerFSM::GetHSPSInfo()
  681. {
  682. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  683. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  684. CEntityRunInfo info = {0};
  685. ErrorCodeEnum ecInfo = pFunc->GetEntityRunInfo("HSPScanner", info);
  686. if (info.eState != EntityState_Idle) {
  687. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("HSPScanner entity illegal state: %d", (int)info.eState);
  688. }
  689. return ecInfo;
  690. }
  691. ErrorCodeEnum CScannerFSM::CheckHSPSConnectStatus()
  692. {
  693. CHSPSInnerClient* pCheckClient = new CHSPSInnerClient(GetEntityBase());
  694. ErrorCodeEnum erroCode = pCheckClient->Connect();
  695. if(FAILURED(erroCode))
  696. {
  697. pCheckClient->SafeDelete();
  698. pCheckClient = NULL;
  699. LogWarn(Severity_Low, Error_InvalidState, LOG_EVT_SCANNERSET_HSPSCNT_FAILED,
  700. "HSPScanner entity is disconnectable.");
  701. GetHSPSInfo();
  702. return Error_InvalidState;
  703. }
  704. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("HSPScanner entity is Connectable.");
  705. pCheckClient->GetFunction()->CloseSession();
  706. pCheckClient = NULL;
  707. return Error_Succeed;
  708. }
  709. bool CScannerFSM::IsHSPSConnectSessionOK()
  710. {
  711. return (m_pHSPSClient != NULL && !m_pHSPSClient->QuerySessionClosed());
  712. }