ScannerSetFSM.cpp 22 KB

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