HSPScannerFSM.cpp 58 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026
  1. #include "stdafx.h"
  2. #include "HSPScannerFSM.h"
  3. #include "EventCode.h"
  4. #include "HSPSCanner_UserErrorCode.h"
  5. #include "GetDevInfoHelper.h"
  6. #include "CommDevEntityErrorCode.h"
  7. #include "fileutil.h"
  8. #include <winpr/sysinfo.h>
  9. #include "opencv.hpp"
  10. #include <math.h>
  11. #define RESET_TIMER_ID 1
  12. #define CHECK_CONNECT_TIMER_ID 2
  13. const int MILLISECOND_TO_RESET = 30 * 1000;
  14. const int MILLISECOND_TO_CHECK_CONNECT = 15 * 1000;
  15. const int MAX_PATH_SIZE = 256;
  16. const int MAX_IMAGEDATA_BUFSIZE = 1 * 1024*1024;
  17. const int MAX_IMAGEDATA_SUFFIX = 1024;
  18. const int MAX_ERROR_TIMES = 2;
  19. #define TEMP_WIDTH 1280
  20. #define T_STRINGY(var) case var: return #var; break;
  21. const char* EvtTypeToString(int nEvtType)
  22. {
  23. switch(nEvtType)
  24. {
  25. T_STRINGY(USER_EVT_STARTPREVIEW)
  26. T_STRINGY(USER_EVT_STARTPREVIEW_FINISHED)
  27. T_STRINGY(USER_EVT_STOPPREVIEW)
  28. T_STRINGY(USER_EVT_STOPPREVIEW_FINISHED)
  29. T_STRINGY(USER_EVT_SETWINPOS)
  30. T_STRINGY(USER_EVT_SETWINPOSFINISHED)
  31. T_STRINGY(USER_EVT_SCANIMAGE)
  32. T_STRINGY(USER_EVT_SCANIMAGE_EX)
  33. T_STRINGY(USER_EVT_SCANIMAGEFINISHED)
  34. T_STRINGY(USER_EVT_SETPROPERTY)
  35. T_STRINGY(USER_EVT_SETPROPERTY_FINISHED)
  36. T_STRINGY(USER_EVT_GETSTATUS)
  37. T_STRINGY(USER_EVT_GETINFO)
  38. T_STRINGY(USER_EVT_DISCONNECT)
  39. T_STRINGY(USER_EVT_EXIT)
  40. T_STRINGY(USER_EVT_QUIT)
  41. T_STRINGY(USER_EVT_RESET)
  42. T_STRINGY(USER_EVT_EXIT_FINISHED)
  43. T_STRINGY(USER_EVT_SHOWPROPERTY)
  44. T_STRINGY(USER_EVT_SHOWPROPERTY_FINISHED)
  45. T_STRINGY(EVT_TIMER)
  46. T_STRINGY(USER_EVT_SETPROPERTYINVIEW_FINISHED)
  47. T_STRINGY(USER_EVT_NOCFG)
  48. T_STRINGY(USER_EVT_HIDEPREVIEW)
  49. T_STRINGY(USER_EVT_GOTOHELL)
  50. default:
  51. return "Unknown EventType";
  52. break;
  53. }
  54. }
  55. const char* ParamValToString(int nParamVal)
  56. {
  57. switch(nParamVal)
  58. {
  59. T_STRINGY(HSPS_BOOLVAL_FALSE)
  60. T_STRINGY(HSPS_BOOLVAL_TRUE)
  61. T_STRINGY(HSPS_COLOR_FULL)
  62. T_STRINGY(HSPS_COLOR_GREY)
  63. T_STRINGY(HSPS_ROTATE_NOANGLE)
  64. T_STRINGY(HSPS_ROTATE_LEFT)
  65. T_STRINGY(HSPS_ROTATE_MIRROR)
  66. T_STRINGY(HSPS_ROTATE_RIGHT)
  67. T_STRINGY(HSPS_SCAN_FULL)
  68. T_STRINGY(HSPS_SCAN_A4)
  69. T_STRINGY(HSPS_SCAN_IDCARD)
  70. T_STRINGY(HSPS_VIEW_HIDE)
  71. T_STRINGY(HSPS_VIEW_SHOW)
  72. default:
  73. return "Unknown ParamVal";
  74. }
  75. }
  76. #undef T_STRINGY
  77. CHSPScannerFSM::CHSPScannerFSM(void)
  78. :
  79. m_version(0),
  80. m_batch(0),
  81. m_ecSelfTest(Error_Succeed),
  82. m_dwErroCode(0),
  83. m_bOperating(FALSE),
  84. m_nTickTimes(0),
  85. m_nFatalTimes(0),
  86. m_nSrcState(s0),
  87. m_csDllName(""),
  88. m_csDllFullPath(""),
  89. m_csDevNo(""),
  90. m_csPort(""),
  91. m_csBuadrate(""),
  92. m_eDevStatus(DEVICE_STATUS_NOT_READY),
  93. m_desiredAction(USER_EVT_QUIT),
  94. m_bOpened(false),
  95. m_bOpening(false),
  96. m_contiErrTimes(0),
  97. dwLastUserCode(0),
  98. m_dwMaxImageSize(500)
  99. {
  100. HARDWARE_ENTITY_RESET_ENTITYID(m_entCode, 0x217);
  101. m_FirstStart = TRUE;
  102. m_errPkg.msgHead = "";
  103. m_errPkg.devSN = "";
  104. m_errPkg.devErrCode = Error_Unexpect;
  105. m_errPkg.apiErrCode = Error_Succeed;
  106. ZeroMemory(&m_adapterInfo, sizeof(m_adapterInfo));
  107. }
  108. CHSPScannerFSM::~CHSPScannerFSM(void)
  109. {
  110. }
  111. ErrorCodeEnum CHSPScannerFSM::OnInit()
  112. {
  113. LOG_FUNCTION();
  114. GET_DEV_ENTITY_BASE_POINTER()->InitializeVendorLogSwitch();
  115. ErrorCodeEnum erroCode = Error_Succeed;
  116. m_csDllFullPath.Clear();
  117. auto pEntity = GET_DEV_ENTITY_BASE_POINTER();
  118. CSystemStaticInfo sysInfo;
  119. m_csMachineType = "";
  120. GetEntityBase()->GetFunction()->GetSystemStaticInfo(sysInfo);
  121. m_csMachineType = sysInfo.strMachineType;
  122. InitialMaxResizeValue();
  123. auto result = pEntity->ExtractVendorLibFullPath(m_csDllFullPath);
  124. if (result == Error_NotConfig) {
  125. PostEventLIFO(new FSMEvent(USER_EVT_NOCFG));
  126. return Error_Succeed;
  127. }
  128. if(FAILURED(result)) {
  129. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Fetch Vendor dllName failed %s.", (LPCTSTR)m_csDllFullPath);
  130. goto FAIL;
  131. }
  132. LogWarn(Severity_Low, Error_Unexpect, HSPScanner_UserErrorCode_ROOT_INFO, (LPCTSTR)m_csDllFullPath);
  133. m_adapterInfo.adapterFileName = m_csDllFullPath;
  134. m_csDllName = pEntity->GetVendorLibName();
  135. HARDWARE_ENTITY_SET_VENDOR_NAME(m_entCode, pEntity->vendorLibInfo.strVendor);
  136. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("VendorDllName: %s.", (LPCTSTR)m_csDllFullPath);
  137. result = m_hDevHelper.LoadUp(m_csDllFullPath);
  138. if (result != Error_Succeed) {
  139. #ifdef RVC_OS_WIN
  140. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s - GLE=%u", (LPCTSTR)pEntity->GetVendorLibName(), GetLastError());
  141. #endif
  142. } else {
  143. if (Error_Succeed == (erroCode = TryToOpenDevice())) {
  144. m_eDevStatus = DEVICE_STATUS_NORMAL;
  145. return erroCode;
  146. }
  147. }
  148. FAIL:
  149. PostEventLIFO(new FSMEvent(USER_EVT_GOTOHELL));
  150. return Error_Succeed;
  151. }
  152. ErrorCodeEnum CHSPScannerFSM::OnExit()
  153. {
  154. if(m_hDevHelper)
  155. {
  156. ErrorCodeEnum errCode = Error_Succeed;
  157. m_hDevHelper.TearDown();
  158. return errCode;
  159. }
  160. return Error_Succeed;
  161. }
  162. void CHSPScannerFSM::s0_on_entry()
  163. {
  164. m_bOperating = FALSE;
  165. m_nFatalTimes = 0;
  166. m_ecSelfTest = Error_Succeed;
  167. if (m_FirstStart) {
  168. m_FirstStart = FALSE;
  169. ToLogRootINIInfo(this);
  170. ToLogWarnInfoAboutTerm(this, m_adapterInfo);
  171. }
  172. }
  173. void CHSPScannerFSM::s0_on_exit()
  174. {
  175. m_bOperating = FALSE;
  176. }
  177. unsigned int CHSPScannerFSM::s0_on_event(FSMEvent* e)
  178. {
  179. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s0_on_event: %s(%d), %d.", EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  180. unsigned int uRet = 0;
  181. switch(e->iEvt)
  182. {
  183. case USER_EVT_STARTPREVIEW:
  184. {
  185. StartPreviewTask* pTask = new StartPreviewTask(this);
  186. StartPreviewEvent* pEvt = dynamic_cast<StartPreviewEvent*>(e);
  187. pTask->SetContext(pEvt->m_ctx);
  188. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  189. e->SetHandled();
  190. }
  191. break;
  192. case USER_EVT_STARTPREVIEW_FINISHED:
  193. {
  194. uRet = e->param1;
  195. e->SetHandled();
  196. if(uRet == 1 && ++m_nFatalTimes <= MAX_ERROR_TIMES)
  197. {
  198. uRet = 2;
  199. }
  200. else if(uRet == 0)
  201. {
  202. m_nFatalTimes = 0;
  203. }
  204. if(uRet == 2 && IsDevConnected() == 0)
  205. {
  206. PostEventFIFO(new FSMEvent(USER_EVT_DISCONNECT));
  207. }
  208. else if(uRet == 1) {
  209. m_desiredAction = USER_EVT_STARTPREVIEW;
  210. }
  211. }
  212. break;
  213. // Add after ST !!! --Josephus at 12:37:15 2016129
  214. case USER_EVT_SETWINPOS:
  215. {
  216. SetWinPosEvent* pEvt = dynamic_cast<SetWinPosEvent*>(e);
  217. if(pEvt->m_ctx->Req.type == 2)
  218. {//在s0状态,仅能用于设置位置和窗体大小
  219. SetWinPosTask* pTask = new SetWinPosTask(this);
  220. pTask->SetContext(pEvt->m_ctx);
  221. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  222. e->SetHandled();
  223. }
  224. }
  225. break;
  226. case USER_EVT_SETPROPERTY:
  227. {
  228. SetPropertyEvent* pEvt = dynamic_cast<SetPropertyEvent*>(e);
  229. SetProperty(pEvt->m_ctx);
  230. e->SetHandled();
  231. }
  232. break;
  233. case USER_EVT_DISCONNECT:
  234. {
  235. //jump auto.
  236. }
  237. e->SetHandled();
  238. break;
  239. case USER_EVT_GETSTATUS:
  240. {
  241. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  242. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  243. pTask->SetContext(pEvt->m_ctx);
  244. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  245. }
  246. e->SetHandled();
  247. break;
  248. case USER_EVT_GETINFO:
  249. {
  250. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  251. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  252. pTask->SetContext(pEvt->m_ctx);
  253. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  254. }
  255. e->SetHandled();
  256. break;
  257. case USER_EVT_NOCFG:
  258. {
  259. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("HSPScaner is not cofig now.");
  260. }
  261. break;
  262. case USER_EVT_EXIT:
  263. {
  264. e->SetHandled();
  265. CSimpleStringA strNoUsed(true);
  266. GetCurImageName(strNoUsed);
  267. DelAndGetNewFileName(strNoUsed);
  268. GetCurImageName(strNoUsed, true);
  269. DelAndGetNewFileName(strNoUsed);
  270. }
  271. break;
  272. case USER_EVT_GOTOHELL:
  273. e->SetHandled();
  274. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("HSPScaner init failed!");
  275. break;
  276. default:
  277. {
  278. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("UnHandle event ! %d", e->iEvt);
  279. }
  280. break;
  281. }
  282. return uRet;
  283. }
  284. void CHSPScannerFSM::s1_on_entry()
  285. {
  286. LOG_FUNCTION();
  287. }
  288. void CHSPScannerFSM::s1_on_exit()
  289. {
  290. }
  291. unsigned int CHSPScannerFSM::s1_on_event(FSMEvent* e)
  292. {
  293. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s1_on_event: %s(%d), %d.", EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  294. unsigned int uRet = 0;
  295. switch(e->iEvt)
  296. {
  297. case USER_EVT_STARTPREVIEW:
  298. {
  299. // Maybe Just SetProperty [Josephus in 15:44:43 2016/11/19]
  300. SetPropertyInPreviewTask* pTask = new SetPropertyInPreviewTask(this);
  301. StartPreviewEvent* pEvt = dynamic_cast<StartPreviewEvent*>(e);
  302. pTask->SetContext(pEvt->m_ctx);
  303. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  304. e->SetHandled();
  305. }
  306. break;
  307. case USER_EVT_SETPROPERTYINVIEW_FINISHED:
  308. {
  309. }
  310. e->SetHandled();
  311. break;
  312. case USER_EVT_STOPPREVIEW:
  313. {
  314. StopPreviewTask* pTask = new StopPreviewTask(this);
  315. StopPreviewEvent* pEvt = dynamic_cast<StopPreviewEvent*>(e);
  316. pTask->SetContext(pEvt->m_ctx);
  317. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  318. }
  319. e->SetHandled();
  320. break;
  321. case USER_EVT_STOPPREVIEW_FINISHED:
  322. {
  323. uRet = e->param1;
  324. if((uRet == 0 || uRet == 4) && ++m_nFatalTimes <= MAX_ERROR_TIMES)
  325. {
  326. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("hold on, wait next time (%d/%d).", m_nFatalTimes, MAX_ERROR_TIMES);
  327. uRet = 3;
  328. }
  329. else if(uRet != 0)
  330. {
  331. m_nFatalTimes = 0;
  332. }
  333. if(uRet == 3 && IsDevConnected() == 0)
  334. {
  335. PostEventFIFO(new FSMEvent(USER_EVT_DISCONNECT));
  336. }
  337. else if(uRet == 0) {
  338. m_desiredAction = USER_EVT_STOPPREVIEW;
  339. }
  340. else if(uRet == 4) {
  341. m_desiredAction = USER_EVT_HIDEPREVIEW;
  342. }
  343. }
  344. e->SetHandled();
  345. break;
  346. case USER_EVT_SCANIMAGE:
  347. {
  348. ScanImageTask* pTask = new ScanImageTask(this);
  349. ScanImageEvent* pEvt = dynamic_cast<ScanImageEvent*>(e);
  350. pTask->SetContext(pEvt->m_ctx);
  351. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  352. }
  353. e->SetHandled();
  354. break;
  355. case USER_EVT_SCANIMAGE_EX:
  356. {
  357. ScanImageExTask* pTask = new ScanImageExTask(this);
  358. ScanImageExEvent* pEvt = dynamic_cast<ScanImageExEvent*>(e);
  359. pTask->SetContext(pEvt->m_ctx);
  360. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  361. }
  362. e->SetHandled();
  363. break;
  364. case USER_EVT_SETPROPERTY:
  365. {
  366. SetPropertyEvent* pEvt = dynamic_cast<SetPropertyEvent*>(e);
  367. SetProperty(pEvt->m_ctx);
  368. }
  369. e->SetHandled();
  370. break;
  371. case USER_EVT_SHOWPROPERTY:
  372. {
  373. ShowPropertyTask* pTask = new ShowPropertyTask(this);
  374. ShowPropertyEvent* pEvt = dynamic_cast<ShowPropertyEvent*>(e);
  375. pTask->SetContext(pEvt->m_ctx);
  376. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  377. }
  378. e->SetHandled();
  379. break;
  380. case USER_EVT_SETWINPOS:
  381. {
  382. SetWinPosEvent* pEvt = dynamic_cast<SetWinPosEvent*>(e);
  383. SetWinPosTask* pTask = new SetWinPosTask(this);
  384. pTask->SetContext(pEvt->m_ctx);
  385. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  386. }
  387. e->SetHandled();
  388. break;
  389. case USER_EVT_DISCONNECT:
  390. {
  391. //jump auto.
  392. }
  393. e->SetHandled();
  394. break;
  395. case USER_EVT_GETSTATUS:
  396. {
  397. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  398. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  399. pTask->SetContext(pEvt->m_ctx);
  400. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  401. }
  402. e->SetHandled();
  403. break;
  404. case USER_EVT_GETINFO:
  405. {
  406. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  407. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  408. pTask->SetContext(pEvt->m_ctx);
  409. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  410. }
  411. e->SetHandled();
  412. break;
  413. }
  414. return uRet;
  415. }
  416. void CHSPScannerFSM::s2_on_entry()
  417. {
  418. LOG_FUNCTION();
  419. }
  420. void CHSPScannerFSM::s2_on_exit()
  421. {
  422. }
  423. unsigned int CHSPScannerFSM::s2_on_event(FSMEvent* e)
  424. {
  425. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s2_on_event: %s(%d), %d.", EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  426. unsigned int uRet = 0;
  427. switch(e->iEvt)
  428. {
  429. case USER_EVT_SHOWPROPERTY_FINISHED:
  430. {
  431. }
  432. e->SetHandled();
  433. break;
  434. case USER_EVT_GETSTATUS:
  435. {
  436. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  437. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  438. pTask->SetContext(pEvt->m_ctx);
  439. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  440. }
  441. e->SetHandled();
  442. break;
  443. case USER_EVT_GETINFO:
  444. {
  445. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  446. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  447. pTask->SetContext(pEvt->m_ctx);
  448. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  449. }
  450. e->SetHandled();
  451. break;
  452. }
  453. return uRet;
  454. }
  455. void CHSPScannerFSM::s3_on_entry()
  456. {
  457. LOG_FUNCTION();
  458. m_eDevStatus = DEVICE_STATUS_FAULT;
  459. m_nTickTimes = 0;
  460. m_bOperating = FALSE;
  461. const int nStatus = IsDevConnected();
  462. if (nStatus == 0) {
  463. PostEventFIFO(new FSMEvent(USER_EVT_DISCONNECT));
  464. } else {
  465. if (nStatus != -1) {
  466. ScheduleTimer(RESET_TIMER_ID, MILLISECOND_TO_RESET / 6);
  467. }
  468. }
  469. }
  470. void CHSPScannerFSM::s3_on_exit()
  471. {
  472. m_eDevStatus = DEVICE_STATUS_NORMAL;
  473. m_bOperating = FALSE;
  474. m_ecSelfTest = Error_Succeed;
  475. m_nFatalTimes = 0;
  476. m_desiredAction = USER_EVT_QUIT;
  477. CancelTimer(RESET_TIMER_ID);
  478. }
  479. unsigned int CHSPScannerFSM::s3_on_event(FSMEvent* e)
  480. {
  481. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s3_on_event: %s(%d), %d.", EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  482. unsigned int uRet = 0;
  483. switch(e->iEvt)
  484. {
  485. case USER_EVT_STARTPREVIEW:
  486. {
  487. StartPreviewEvent* pEvt = dynamic_cast<StartPreviewEvent*>(e);
  488. if (!m_bOpened) {
  489. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  490. } else {
  491. StartPreviewTask* pTask = new StartPreviewTask(this);
  492. pTask->SetContext(pEvt->m_ctx);
  493. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  494. }
  495. e->SetHandled();
  496. }
  497. break;
  498. case USER_EVT_STARTPREVIEW_FINISHED:
  499. {
  500. uRet = e->param1;
  501. e->SetHandled();
  502. }
  503. break;
  504. case USER_EVT_STOPPREVIEW:
  505. {
  506. if(m_hDevHelper && m_bOpened)
  507. {
  508. CancelTimer(RESET_TIMER_ID);
  509. StopPreviewEvent* pEvt = dynamic_cast<StopPreviewEvent*>(e);
  510. HspsDevStatus status = {0};
  511. ErrorCodeEnum erroCode = m_hDevHelper->GetDevStatus(status);
  512. if(status.inPreview == 1)
  513. {
  514. StopPreviewTask* pTask = new StopPreviewTask(this);
  515. pTask->SetContext(pEvt->m_ctx);
  516. GetEntityBase()->GetFunction()->PostEntityTaskFIFO(pTask);
  517. }
  518. else if(status.inShow == 1)
  519. {
  520. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_VIEW, HSPS_VIEW_HIDE);
  521. pEvt->m_ctx->Answer((erroCode));
  522. FSMEvent* timerEvent = new FSMEvent(EVT_TIMER);
  523. timerEvent->param1 = RESET_TIMER_ID;
  524. PostEventFIFO(timerEvent);
  525. }
  526. } else if (!m_bOpened) {
  527. StopPreviewEvent* pEvt = dynamic_cast<StopPreviewEvent*>(e);
  528. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  529. }
  530. }
  531. e->SetHandled();
  532. break;
  533. case USER_EVT_STOPPREVIEW_FINISHED:
  534. {
  535. uRet = e->param1;
  536. if(uRet == 0) {
  537. m_desiredAction = USER_EVT_STOPPREVIEW;
  538. }
  539. else if(uRet == 4) {
  540. m_desiredAction = USER_EVT_HIDEPREVIEW;
  541. }
  542. FSMEvent* timerEvent = new FSMEvent(EVT_TIMER);
  543. timerEvent->param1 = RESET_TIMER_ID;
  544. PostEventFIFO(timerEvent);
  545. }
  546. e->SetHandled();
  547. break;
  548. case USER_EVT_OPENSUCC:
  549. ///*TODO(80374374@9/2/2022): */
  550. e->SetHandled();
  551. break;
  552. case USER_EVT_RESET:
  553. {
  554. if (m_bOpened) {
  555. ErrorCodeEnum erroCode = m_hDevHelper->Reset();
  556. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Reset operation returned %s.", SpStrError(erroCode));
  557. if(FAILURED(erroCode))
  558. {
  559. LOG_HSPSCANNER_ERROR_MSG_MACRO(erroCode, Reset);
  560. m_ecSelfTest = Error_InvalidState;
  561. uRet = 1;
  562. }
  563. else
  564. {
  565. ErrorCodeEnum eXYW = m_hDevHelper->SetViewPos(m_nRecX, m_nRecY, m_nRecW);
  566. if(FAILURED(eXYW))
  567. {
  568. LOG_HSPSCANNER_ERROR_MSG_MACRO(eXYW, SetViewPos);
  569. uRet = 1;
  570. m_ecSelfTest = Error_InvalidState;
  571. e->SetHandled();
  572. break;
  573. }
  574. HspsDevStatus status = {0};
  575. CSimpleStringA strFuncName(true);
  576. erroCode = m_hDevHelper->GetDevStatus(status);
  577. if(status.inPreview == 1 && status.inShow == 1)
  578. {
  579. if(m_desiredAction == USER_EVT_STOPPREVIEW)
  580. {
  581. erroCode = m_hDevHelper->SetPreview(0);
  582. strFuncName = "SetPreview";
  583. UpdateDEC(MEC_DEVAPI_HSPSCANNER_SetPreview_Close);
  584. {
  585. HspsDevStatus retryStatus = {0};
  586. m_hDevHelper->GetDevStatus(retryStatus);
  587. if(retryStatus.inPreview == 1)
  588. {
  589. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_VIEW, HSPS_VIEW_HIDE);
  590. UpdateDEC(MEC_DEVAPI_HSPSCANNER_SetParam);
  591. strFuncName = "SetParam";
  592. }
  593. }
  594. }
  595. else if(m_desiredAction == USER_EVT_HIDEPREVIEW)
  596. {
  597. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_VIEW, HSPS_VIEW_HIDE);
  598. UpdateDEC(MEC_DEVAPI_HSPSCANNER_SetParam);
  599. strFuncName = "SetParam";
  600. }
  601. if(FAILURED(erroCode))
  602. {
  603. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Recover failed under desiration of %s", EvtTypeToString(m_desiredAction));
  604. LogErrMsg(strFuncName, erroCode, 0, TRUE);
  605. uRet = 1;
  606. m_ecSelfTest = Error_InvalidState;
  607. e->SetHandled();
  608. break;
  609. }
  610. uRet = 2;
  611. }
  612. }
  613. }
  614. }
  615. e->SetHandled();
  616. break;
  617. case EVT_TIMER:
  618. {
  619. if (e->param1 == RESET_TIMER_ID) {
  620. FSMEvent* pEvt = new FSMEvent(USER_EVT_RESET);
  621. PostEventFIFO(pEvt);
  622. ScheduleTimer(RESET_TIMER_ID, MILLISECOND_TO_RESET);
  623. }
  624. }
  625. e->SetHandled();
  626. break;
  627. case USER_EVT_DISCONNECT:
  628. e->SetHandled();
  629. break;
  630. case USER_EVT_GETSTATUS:
  631. {
  632. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  633. if (!m_bOpened) {
  634. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  635. } else {
  636. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  637. pTask->SetContext(pEvt->m_ctx);
  638. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  639. }
  640. }
  641. e->SetHandled();
  642. break;
  643. case USER_EVT_GETINFO:
  644. {
  645. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  646. if (!m_bOpened) {
  647. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  648. } else {
  649. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  650. pTask->SetContext(pEvt->m_ctx);
  651. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  652. }
  653. }
  654. e->SetHandled();
  655. break;
  656. case USER_EVT_SETWINPOS:
  657. {
  658. SetWinPosEvent* pEvt = dynamic_cast<SetWinPosEvent*>(e);
  659. if (!m_bOpened) {
  660. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  661. e->SetHandled();
  662. }
  663. }
  664. break;
  665. }
  666. return uRet;
  667. }
  668. void CHSPScannerFSM::s4_on_entry()
  669. {
  670. LOG_FUNCTION();
  671. }
  672. void CHSPScannerFSM::s4_on_exit()
  673. {
  674. }
  675. unsigned int CHSPScannerFSM::s4_on_event(FSMEvent* e)
  676. {
  677. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s4_on_event: %s(%d), %d.", EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  678. unsigned int uRet = 0;
  679. switch(e->iEvt)
  680. {
  681. case USER_EVT_SCANIMAGEFINISHED:
  682. {
  683. uRet = e->param1;
  684. if(uRet == 2 && ++m_nFatalTimes < MAX_ERROR_TIMES)
  685. {
  686. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("hold on, wait next time (%d/%d).", m_nFatalTimes, MAX_ERROR_TIMES);
  687. uRet = 5;
  688. }
  689. else if(uRet == 0)
  690. {
  691. m_nFatalTimes = 0;
  692. }
  693. if(uRet == 5 && IsDevConnected() == 0)
  694. {
  695. PostEventFIFO(new FSMEvent(USER_EVT_DISCONNECT));
  696. }
  697. else if(uRet == 2 || uRet == 4)
  698. {
  699. m_desiredAction = USER_EVT_SCANIMAGE;
  700. }
  701. }
  702. e->SetHandled();
  703. break;
  704. case USER_EVT_DISCONNECT:
  705. {
  706. //jump auto.
  707. }
  708. e->SetHandled();
  709. break;
  710. case USER_EVT_GETSTATUS:
  711. {
  712. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  713. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  714. pTask->SetContext(pEvt->m_ctx);
  715. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  716. }
  717. e->SetHandled();
  718. break;
  719. case USER_EVT_GETINFO:
  720. {
  721. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  722. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  723. pTask->SetContext(pEvt->m_ctx);
  724. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  725. }
  726. e->SetHandled();
  727. break;
  728. }
  729. return uRet;
  730. }
  731. void CHSPScannerFSM::s5_on_entry()
  732. {
  733. m_eDevStatus = DEVICE_STATUS_MAINTAINCE;
  734. LogEvent(Severity_Middle,LOG_EVT_HSPS_LOST_CONNECT,"高拍仪断开连接!");
  735. SetLastUserCode(HSPScanner_UserErrorCode_DEVICE_OFFLINE);
  736. ScheduleTimer(CHECK_CONNECT_TIMER_ID, MILLISECOND_TO_CHECK_CONNECT);
  737. }
  738. void CHSPScannerFSM::s5_on_exit()
  739. {
  740. SetLastUserCode();
  741. m_eDevStatus = DEVICE_STATUS_NORMAL;
  742. CancelTimer(CHECK_CONNECT_TIMER_ID);
  743. }
  744. unsigned int CHSPScannerFSM::s5_on_event(FSMEvent* e)
  745. {
  746. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s5_on_event: %s(%d), %d.", EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  747. unsigned int uRet = 0;
  748. switch(e->iEvt)
  749. {
  750. case EVT_TIMER:
  751. {
  752. if(e->param1 == CHECK_CONNECT_TIMER_ID)
  753. {
  754. HspsDevStatus status = {0};
  755. ErrorCodeEnum eResult = m_hDevHelper->GetDevStatus(status);
  756. if(ISSUCCEEDED(eResult))
  757. {
  758. if(status.isConnected == 0)
  759. {
  760. ScheduleTimer(CHECK_CONNECT_TIMER_ID, MILLISECOND_TO_CHECK_CONNECT);
  761. }
  762. else if(status.inShow == 1 && status.inPreview == 1)
  763. {
  764. //回到预览状态
  765. uRet = 2;
  766. }
  767. else
  768. {
  769. uRet = 1;
  770. }
  771. }
  772. e->SetHandled();
  773. }
  774. }
  775. break;
  776. case USER_EVT_GETSTATUS:
  777. {
  778. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  779. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  780. pTask->SetContext(pEvt->m_ctx);
  781. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  782. }
  783. e->SetHandled();
  784. break;
  785. case USER_EVT_GETINFO:
  786. {
  787. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  788. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  789. pTask->SetContext(pEvt->m_ctx);
  790. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  791. }
  792. e->SetHandled();
  793. break;
  794. case USER_EVT_SETWINPOS:
  795. {
  796. SetWinPosEvent* pEvt = dynamic_cast<SetWinPosEvent*>(e);
  797. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  798. }
  799. e->SetHandled();
  800. break;
  801. }
  802. return uRet;
  803. }
  804. void CHSPScannerFSM::s6_on_entry()
  805. {
  806. LOG_FUNCTION();
  807. }
  808. void CHSPScannerFSM::s6_on_exit()
  809. {
  810. }
  811. unsigned int CHSPScannerFSM::s6_on_event(FSMEvent* e)
  812. {
  813. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s6_on_event: %s(%d), %d.", EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  814. unsigned int uRet = 0;
  815. switch(e->iEvt)
  816. {
  817. case USER_EVT_STARTPREVIEW:
  818. {
  819. StartPreviewTask* pTask = new StartPreviewTask(this);
  820. StartPreviewEvent* pEvt = dynamic_cast<StartPreviewEvent*>(e);
  821. pTask->SetContext(pEvt->m_ctx);
  822. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  823. e->SetHandled();
  824. }
  825. break;
  826. case USER_EVT_STARTPREVIEW_FINISHED:
  827. {
  828. uRet = e->param1;
  829. e->SetHandled();
  830. if(uRet == 1 && ++m_nFatalTimes < MAX_ERROR_TIMES)
  831. {
  832. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("hold on, wait next time (%d/%d).", m_nFatalTimes, MAX_ERROR_TIMES);
  833. uRet = 2;
  834. }
  835. else if(uRet == 0)
  836. {
  837. m_nFatalTimes = 0;
  838. }
  839. if(uRet == 2 && IsDevConnected() == 0)
  840. {
  841. PostEventFIFO(new FSMEvent(USER_EVT_DISCONNECT));
  842. }
  843. else if(uRet == 1)
  844. {
  845. m_desiredAction = USER_EVT_STARTPREVIEW;
  846. }
  847. }
  848. break;
  849. case USER_EVT_SETPROPERTY:
  850. {
  851. SetPropertyEvent* pEvt = dynamic_cast<SetPropertyEvent*>(e);
  852. SetProperty(pEvt->m_ctx);
  853. e->SetHandled();
  854. }
  855. break;
  856. case USER_EVT_STOPPREVIEW:
  857. {
  858. StopPreviewEvent* pEvt = dynamic_cast<StopPreviewEvent*>(e);
  859. if(!pEvt->m_ctx->Req.bOnlyHide)
  860. {//业务在s6状态仅能进行彻底取消预览的操作
  861. StopPreviewTask* pTask = new StopPreviewTask(this);
  862. pTask->SetContext(pEvt->m_ctx);
  863. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  864. e->SetHandled();
  865. }
  866. }
  867. break;
  868. case USER_EVT_STOPPREVIEW_FINISHED:
  869. {
  870. uRet = e->param1;
  871. if(uRet == 0 && ++m_nFatalTimes < MAX_ERROR_TIMES)
  872. {
  873. uRet = 3;
  874. }
  875. else if(uRet != 0)
  876. {
  877. m_nFatalTimes = 0;
  878. }
  879. if(uRet == 3 && IsDevConnected() == 0)
  880. {
  881. PostEventFIFO(new FSMEvent(USER_EVT_DISCONNECT));
  882. }
  883. }
  884. e->SetHandled();
  885. break;
  886. case USER_EVT_SETWINPOS:
  887. {
  888. SetWinPosEvent* pEvt = dynamic_cast<SetWinPosEvent*>(e);
  889. if(pEvt->m_ctx->Req.type == 2)
  890. {//在s6状态,不允许进行显示和隐藏操作,业务必须通过XXXPreview来进行显示隐藏操作
  891. SetWinPosTask* pTask = new SetWinPosTask(this);
  892. pTask->SetContext(pEvt->m_ctx);
  893. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  894. e->SetHandled();
  895. }
  896. }
  897. break;
  898. case USER_EVT_DISCONNECT:
  899. {
  900. //jump auto.
  901. }
  902. e->SetHandled();
  903. break;
  904. case USER_EVT_GETSTATUS:
  905. {
  906. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  907. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  908. pTask->SetContext(pEvt->m_ctx);
  909. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  910. }
  911. e->SetHandled();
  912. break;
  913. case USER_EVT_GETINFO:
  914. {
  915. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  916. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  917. pTask->SetContext(pEvt->m_ctx);
  918. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  919. }
  920. e->SetHandled();
  921. break;
  922. }
  923. return uRet;
  924. }
  925. void CHSPScannerFSM::s7_on_entry()
  926. {
  927. LOG_FUNCTION();
  928. FSMEvent* pEvt = new FSMEvent(USER_EVT_EXIT_FINISHED);
  929. if(ISSUCCEEDED(OnDevExit()))
  930. {
  931. pEvt->param1 = 0;
  932. }
  933. else
  934. {
  935. pEvt->param1 = 1;
  936. }
  937. PostEventFIFO(pEvt);
  938. }
  939. void CHSPScannerFSM::s7_on_exit()
  940. {
  941. if(m_hDevHelper && m_bOpened)
  942. {
  943. HspsDevStatus status = {0};
  944. ErrorCodeEnum erroCode = m_hDevHelper->GetDevStatus(status);
  945. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Get status(%d): Connected(%d), Preview(%d), Show(%d).",
  946. erroCode, status.isConnected, status.inPreview, status.inShow);
  947. }
  948. }
  949. unsigned int CHSPScannerFSM::s7_on_event(FSMEvent* e)
  950. {
  951. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s7_on_event: %s(%d), %d.", EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  952. unsigned int uRet = 0;
  953. switch(e->iEvt)
  954. {
  955. case USER_EVT_EXIT_FINISHED:
  956. {
  957. uRet = e->param1;
  958. if(uRet == 1)
  959. {
  960. m_desiredAction = USER_EVT_EXIT;
  961. }
  962. }
  963. e->SetHandled();
  964. break;
  965. case USER_EVT_GETSTATUS:
  966. {
  967. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  968. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  969. pTask->SetContext(pEvt->m_ctx);
  970. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  971. }
  972. e->SetHandled();
  973. break;
  974. case USER_EVT_GETINFO:
  975. {
  976. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  977. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  978. pTask->SetContext(pEvt->m_ctx);
  979. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  980. }
  981. e->SetHandled();
  982. break;
  983. }
  984. return uRet;
  985. }
  986. unsigned int CHSPScannerFSM::s8_on_event(FSMEvent* e)
  987. {
  988. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s8_on_event: %s(%d), %d.", EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  989. unsigned int uRet = 0;
  990. if(e->iEvt == USER_EVT_GETINFO) {
  991. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  992. pEvt->m_ctx->Ans.model = "";
  993. pEvt->m_ctx->Ans.state = DEVICE_STATUS_NOCFG;
  994. pEvt->m_ctx->Ans.type = "";
  995. pEvt->m_ctx->Ans.version = "";
  996. pEvt->m_ctx->Answer(Error_Succeed);
  997. e->SetHandled();
  998. } else {
  999. switch (e->iEvt) {
  1000. case USER_EVT_STARTPREVIEW:
  1001. {
  1002. StartPreviewEvent* pEvt = dynamic_cast<StartPreviewEvent*>(e);
  1003. pEvt->SetHandled();
  1004. pEvt->m_ctx->Answer(Error_InvalidState, GetLastUserCode());
  1005. }
  1006. break;
  1007. case USER_EVT_STOPPREVIEW:
  1008. {
  1009. StopPreviewEvent* pEvt = dynamic_cast<StopPreviewEvent*>(e);
  1010. pEvt->SetHandled();
  1011. pEvt->m_ctx->Answer(Error_InvalidState, GetLastUserCode());
  1012. }
  1013. break;
  1014. case USER_EVT_SCANIMAGE:
  1015. {
  1016. ScanImageEvent* pEvt = dynamic_cast<ScanImageEvent*>(e);
  1017. pEvt->SetHandled();
  1018. pEvt->m_ctx->Answer(Error_InvalidState, GetLastUserCode());
  1019. }
  1020. break;
  1021. case USER_EVT_SCANIMAGE_EX:
  1022. {
  1023. ScanImageExEvent* pEvt = dynamic_cast<ScanImageExEvent*>(e);
  1024. pEvt->SetHandled();
  1025. pEvt->m_ctx->Answer(Error_InvalidState, GetLastUserCode());
  1026. }
  1027. break;
  1028. case USER_EVT_SHOWPROPERTY:
  1029. {
  1030. ShowPropertyEvent* pEvt = dynamic_cast<ShowPropertyEvent*>(e);
  1031. pEvt->SetHandled();
  1032. pEvt->m_ctx->Answer(Error_InvalidState, GetLastUserCode());
  1033. }
  1034. break;
  1035. case USER_EVT_SETPROPERTY:
  1036. {
  1037. SetPropertyEvent* pEvt = dynamic_cast<SetPropertyEvent*>(e);
  1038. pEvt->SetHandled();
  1039. pEvt->m_ctx->Answer(Error_InvalidState, GetLastUserCode());
  1040. }
  1041. break;
  1042. case USER_EVT_SETWINPOS:
  1043. {
  1044. SetWinPosEvent* pEvt = dynamic_cast<SetWinPosEvent*>(e);
  1045. pEvt->SetHandled();
  1046. pEvt->m_ctx->Answer(Error_InvalidState, GetLastUserCode());
  1047. }
  1048. break;
  1049. case USER_EVT_GETSTATUS:
  1050. {
  1051. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  1052. pEvt->SetHandled();
  1053. pEvt->m_ctx->Answer(Error_InvalidState, GetLastUserCode());
  1054. }
  1055. break;
  1056. default:
  1057. break;
  1058. }
  1059. }
  1060. return uRet;
  1061. }
  1062. int CHSPScannerFSM::StartPreview(SpReqAnsContext<HSPScannerService_StartPreview_Req,
  1063. HSPScannerService_StartPreview_Ans>::Pointer ctx)
  1064. {
  1065. bool nRes = 0;
  1066. ErrorCodeEnum erroCode = Error_Unexpect;
  1067. SetLastUserCode();
  1068. if(ctx->Req.colorType || ctx->Req.scanType || ctx->Req.rotateType)
  1069. {
  1070. erroCode = SetPreview(ctx);
  1071. }
  1072. HspsDevStatus status = {0};
  1073. erroCode = m_hDevHelper->GetDevStatus(status);
  1074. if(ISSUCCEEDED(erroCode) && status.inPreview)
  1075. {// 用于s6状态 [Josephus in 9:33:48 2016/11/22]
  1076. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_VIEW, HSPS_VIEW_SHOW);
  1077. }
  1078. else if(ISSUCCEEDED(erroCode))
  1079. {
  1080. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Start to SetPreview(1).");
  1081. const DWORD consdwBegin = GetTickCount();
  1082. erroCode = m_hDevHelper->SetPreview(1);
  1083. const DWORD consdwEnd = GetTickCount();
  1084. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("SetPreview")
  1085. .setBeginTime(consdwBegin).setEndTime(consdwEnd)("End to SetPreview(1) returned %s.", SpStrError(erroCode));
  1086. if(FAILURED(erroCode)) {
  1087. SetErrPackage(m_errPkg, "StartPreview::SetPreview(1)", m_csDevNo, erroCode, MEC_DEVAPI_HSPSCANNER_SetPreview_Open);
  1088. SetLastUserCode(AlarmDEC(m_errPkg, true));
  1089. }
  1090. }
  1091. else
  1092. {
  1093. SetErrPackage(m_errPkg, "StartPreview::GetDevStatus", m_csDevNo, erroCode, MEC_DEVAPI_HSPSCANNER_GetDevStatus);
  1094. SetLastUserCode(AlarmDEC(m_errPkg, true));
  1095. }
  1096. if(FAILURED(erroCode))
  1097. {
  1098. nRes = 1;
  1099. }
  1100. else
  1101. {
  1102. LogEvent(Severity_Middle, LOG_EVT_HSPS_LIGHT_ON, "HSPScanner warning on.");
  1103. }
  1104. ctx->Answer((erroCode), GetLastUserCode());
  1105. return nRes;
  1106. }
  1107. int CHSPScannerFSM::StopPreview(SpReqAnsContext<HSPScannerService_CancelPreview_Req,
  1108. HSPScannerService_CancelPreview_Ans>::Pointer ctx)
  1109. {
  1110. ErrorCodeEnum erroCode = Error_Unexpect;
  1111. int nRes = 0;
  1112. if(ctx->Req.bOnlyHide)
  1113. {
  1114. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_VIEW, HSPS_VIEW_HIDE);
  1115. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("End to SetParam(HSPS_MODEL_VIEW, HSPS_VIEW_HIDE) returned %d(0x%x).", erroCode, erroCode);
  1116. if(ISSUCCEEDED(erroCode))
  1117. {
  1118. nRes = 1;
  1119. }
  1120. else
  1121. {
  1122. SetErrPackage(m_errPkg, "Hide Preview", m_csDevNo, erroCode, MEC_DEVAPI_HSPSCANNER_SetParam);
  1123. SetLastUserCode(AlarmDEC(m_errPkg, true));
  1124. nRes = 4;
  1125. }
  1126. }
  1127. else
  1128. {
  1129. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_USER)("Start to SetPreview(0).");
  1130. const DWORD consdwBegin = GetTickCount();
  1131. erroCode = m_hDevHelper->SetPreview(0);
  1132. const DWORD consdwEnd = GetTickCount();
  1133. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("SetPreview").setBeginTime(consdwBegin).setEndTime(consdwEnd)("End to SetPreview(0) reuturned %d(0x%x).", erroCode, erroCode);
  1134. if(ISSUCCEEDED(erroCode))
  1135. {
  1136. nRes = 2;
  1137. } else {
  1138. SetErrPackage(m_errPkg, "StopPreview::SetPreview(0)", m_csDevNo, erroCode, MEC_DEVAPI_HSPSCANNER_SetPreview_Close);
  1139. SetLastUserCode(AlarmDEC(m_errPkg, true));
  1140. }
  1141. }
  1142. if(ISSUCCEEDED(erroCode))
  1143. {
  1144. LogEvent(Severity_Middle, LOG_EVT_HSPS_LIGHT_OFF, "HSPScanner warning off.");
  1145. }
  1146. ctx->Answer((erroCode), GetLastUserCode());
  1147. return nRes;
  1148. }
  1149. bool CHSPScannerFSM::ResizeImage(CSimpleStringA fileName)
  1150. {
  1151. LOG_FUNCTION();
  1152. double rate; //limit rate
  1153. int width;
  1154. int height;
  1155. bool success = TRUE;
  1156. const int imageSize = m_dwMaxImageSize * 1024;
  1157. FILE* fHandle = fopen(fileName.GetData(), "rb");
  1158. if (!fHandle)
  1159. {
  1160. LogWarn(Severity_Middle, Error_Unexpect, LOG_EVT_HSPS_READ_IMAGE_FILE_FAILED
  1161. , CSimpleStringA::Format("Read image %s failed: %d", fileName.GetData(), errno));
  1162. return FALSE;
  1163. }
  1164. fseek(fHandle, 0, SEEK_END);
  1165. long fileSize = ftell(fHandle);
  1166. fclose(fHandle);
  1167. if (fileSize <= (imageSize)) {
  1168. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("File(%s)(%u<=%u) no need resize.", (LPCTSTR)fileName, fileSize, imageSize);
  1169. return TRUE;
  1170. }
  1171. CSimpleStringA backUpFile, backUpPath;
  1172. m_pEntity->GetFunction()->GetPath("Temp", backUpPath);
  1173. backUpFile = backUpPath + SPLIT_SLASH_STR + "backupHSPSCannerImage";
  1174. DeleteFileIfExisted(backUpFile);
  1175. fileutil_copy_file((LPCTSTR)backUpFile, (LPCTSTR)fileName);
  1176. while (fileSize > imageSize)
  1177. {
  1178. rate = (double)fileSize / imageSize;
  1179. rate = 1.0 / sqrt(rate); //width and height limit rate
  1180. cv::Mat img = cv::imread(fileName.GetData());
  1181. if (!img.data) {
  1182. LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_HSPS_OPENCV_READ_FAILED, "Opencv READ failed!");
  1183. success = FALSE;
  1184. break;
  1185. }
  1186. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_USER)("to resize %lf rate...", rate);
  1187. width = img.cols;
  1188. height = img.rows;
  1189. cv::resize(img, img, cv::Size(width * rate, height * rate));
  1190. const bool openwrite = cv::imwrite(fileName.GetData(), img);
  1191. if (!openwrite) {
  1192. LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_HSPS_OPENCV_WRITE_FAILED, "Opencv WRITE failed!");
  1193. success = FALSE;
  1194. break;
  1195. }
  1196. fHandle = fopen(fileName.GetData(), "rb");
  1197. fseek(fHandle, 0, SEEK_END);
  1198. fileSize = ftell(fHandle);
  1199. fclose(fHandle);
  1200. Sleep(2);
  1201. }
  1202. if (!success) {
  1203. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("Resize Image failed.");
  1204. fileutil_copy_file((LPCTSTR)fileName, (LPCTSTR)backUpFile); //recover original img
  1205. CopyFileA(backUpFile, fileName, FALSE);
  1206. DeleteFileIfExisted(backUpFile);
  1207. return FALSE;
  1208. }
  1209. fileSize = fileSize / 1024;
  1210. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("Resize Image suc.");
  1211. DeleteFileIfExisted(backUpFile);
  1212. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_HSPS_RESIZE_FUNCTION_SUCCEED,
  1213. CSimpleStringA::Format("HSPScanner resize image succeed, SIZE : %d KB.", fileSize));
  1214. return TRUE;
  1215. }
  1216. int CHSPScannerFSM::ScanImage(SpReqAnsContext<HSPScannerService_ScanImage_Req,
  1217. HSPScannerService_ScanImage_Ans>::Pointer ctx)
  1218. {
  1219. int nRes = 0;
  1220. ErrorCodeEnum erroCode = Error_Unexpect;
  1221. CSimpleStringA csImageFile;
  1222. GetCurImageName(csImageFile);
  1223. BOOL bRet = DelAndGetNewFileName(csImageFile);
  1224. if(!bRet)
  1225. {
  1226. ctx->Answer((Error_Resource), HSPScanner_UserErrorCode_IMAGE_CLEAR);
  1227. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER)("Create imgPath failed.");
  1228. return 1;
  1229. }
  1230. LogWarn(Severity_Low, Error_Debug, LOG_DEBUG_HSPS_CRITICAL_OPERATION_SCANIMAGE, "to ScanImage...");
  1231. const DWORD consdwBegin = GetTickCount();
  1232. erroCode = m_hDevHelper->ScanImage((LPCTSTR)csImageFile);
  1233. const DWORD consdwEnd = GetTickCount();
  1234. if(ISSUCCEEDED(erroCode))
  1235. {
  1236. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("ScanImage").setBeginTime(consdwBegin).setEndTime(consdwEnd)("scan image succ.");
  1237. LogWarn(Severity_Low, Error_Debug, LOG_DEBUG_HSPS_CRITICAL_OPERATION_SCANIMAGE, "ScanImage succ");
  1238. if (!ResizeImage(csImageFile)) {
  1239. LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_HSPS_RESIZE_IMAGE_FILE_FAILED, "HSPScanner resize image failed.");
  1240. }
  1241. ctx->Ans.filePath = csImageFile;
  1242. CBlob& cbData = ctx->Ans.imageData;
  1243. FILE* fHandle = fopen(csImageFile, "rb");
  1244. if(fHandle)
  1245. {
  1246. fseek(fHandle, 0, SEEK_END);
  1247. long fileSize = ftell(fHandle);
  1248. if(fileSize <= 0) {
  1249. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER)("filesize(%s) error: %ld.", (LPCTSTR)csImageFile, fileSize);
  1250. erroCode = Error_NotExist;
  1251. fclose(fHandle);
  1252. nRes = 4;
  1253. }
  1254. else
  1255. {
  1256. cbData.Alloc(fileSize);
  1257. fseek(fHandle, 0, SEEK_SET);
  1258. fread(cbData.m_pData, 1, fileSize, fHandle);
  1259. fclose(fHandle);
  1260. }
  1261. }
  1262. else
  1263. {
  1264. erroCode = Error_Resource;
  1265. LogError(Severity_High, Error_Resource, HSPScanner_UserErrorCode_READ_IMAGE_FILE_FAILED,
  1266. CSimpleStringA::Format("fopen(%s) failed: %d, %s", (LPCTSTR)csImageFile, errno, strerror(errno))
  1267. );
  1268. SetLastUserCode(HSPScanner_UserErrorCode_READ_IMAGE_FILE_FAILED);
  1269. nRes = 4;
  1270. }
  1271. if(ISSUCCEEDED(erroCode))
  1272. {
  1273. // Additional ChangeTo Hide --Josephus at 11:32:29 2016/11/22
  1274. if(true/*TODO: */)
  1275. {
  1276. ErrorCodeEnum eHide = m_hDevHelper->SetParam(HSPS_MODEL_VIEW, HSPS_VIEW_HIDE);
  1277. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("SetParam(HSPS_MODEL_VIEW, HSPS_VIEW_HIDE) returned %s", SpStrError(eHide));
  1278. if(ISSUCCEEDED(eHide))
  1279. {
  1280. nRes = 6;
  1281. }
  1282. }
  1283. }
  1284. ctx->Answer((erroCode), GetLastUserCode());
  1285. }
  1286. else
  1287. {
  1288. SetErrPackage(m_errPkg, "ScanImage::ScanImage", m_csDevNo, erroCode, MEC_DEVAPI_HSPSCANNER_ScanImage);
  1289. SetLastUserCode(AlarmDEC(m_errPkg, true));
  1290. ctx->Answer((erroCode), GetLastUserCode());
  1291. return 2;
  1292. }
  1293. return nRes;
  1294. }
  1295. int CHSPScannerFSM::ScanImageEx(SpReqAnsContext<HSPScannerService_ScanImageEx_Req,
  1296. HSPScannerService_ScanImageEx_Ans>::Pointer ctx)
  1297. {
  1298. int nRes = 0;
  1299. ErrorCodeEnum erroCode = Error_Unexpect;
  1300. CSimpleStringA csImageFile;
  1301. GetCurImageName(csImageFile, true);
  1302. BOOL bRet = DelAndGetNewFileName(csImageFile);
  1303. if(!bRet)
  1304. {
  1305. ctx->Answer((Error_Resource), HSPScanner_UserErrorCode_IMAGE_CLEAR);
  1306. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER)("Create imgPath failed.");
  1307. return 1;
  1308. }
  1309. #if 0
  1310. int len = MAX_IMAGEDATA_BUFSIZE;
  1311. BYTE* pBtImage = new BYTE[len+1];
  1312. if(pBtImage == NULL)
  1313. {
  1314. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("new buffer[%d] failed %d.", len+1, GetLastError());
  1315. ctx->Answer(Error_Resource);
  1316. return 3;
  1317. }
  1318. memset((void*)pBtImage, 0, len+1);
  1319. #else
  1320. int len = 0;
  1321. BYTE* pBtImage = NULL;
  1322. #endif
  1323. LogWarn(Severity_Low, Error_Debug, LOG_DEBUG_HSPS_CRITICAL_OPERATION_SCANIMAGEEX, "to ScanImageEx...");
  1324. int nOldLen = len;
  1325. const DWORD consdwBegin = GetTickCount();
  1326. erroCode = m_hDevHelper->ScanImageEx(pBtImage, len, (LPCTSTR)csImageFile);
  1327. if(erroCode == Error_TooSmallBuffer)
  1328. {
  1329. if(pBtImage)
  1330. {
  1331. delete pBtImage;
  1332. pBtImage = NULL;
  1333. }
  1334. len += MAX_IMAGEDATA_SUFFIX;
  1335. pBtImage = new BYTE[len+1];
  1336. if(pBtImage == NULL)
  1337. {
  1338. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER)("new buffer[%d] failed %d.", len+1, GetLastError());
  1339. ctx->Answer(Error_Resource);
  1340. return 3;
  1341. }
  1342. memset((void*)pBtImage, 0, len+1);
  1343. erroCode = m_hDevHelper->ScanImageEx(pBtImage, len, (LPCTSTR)csImageFile);
  1344. }
  1345. const DWORD consdwEnd = GetTickCount();
  1346. if(ISSUCCEEDED(erroCode))
  1347. {
  1348. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setBeginTime(consdwBegin).setEndTime(consdwEnd)("ScanImageEx suc %d, %d.", len, strlen((const char*)pBtImage));
  1349. LogWarn(Severity_Low, Error_Debug, LOG_DEBUG_HSPS_CRITICAL_OPERATION_SCANIMAGEEX, CSimpleStringA::Format("ScanImageEx suc %d, %d.", len, strlen((const char*)pBtImage)));
  1350. if (ResizeImage(csImageFile)) {
  1351. FILE* fHandle = fopen(csImageFile.GetData(), "rb");
  1352. fseek(fHandle, 0, SEEK_END);
  1353. len = ftell(fHandle);
  1354. fseek(fHandle, 0, SEEK_SET);
  1355. if (pBtImage) delete[] pBtImage;
  1356. pBtImage = new BYTE[len];
  1357. fread(pBtImage, 1, len, fHandle);
  1358. fclose(fHandle);
  1359. } else {
  1360. LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_HSPS_RESIZE_IMAGEEX_FILE_FAILED, "HSPScanner resize imageEX faild.");
  1361. }
  1362. ctx->Ans.filePath = csImageFile;
  1363. CBlob& cbData = ctx->Ans.imageData;
  1364. #if 1
  1365. cbData.Alloc((len+1)*sizeof(BYTE));
  1366. memcpy_s(cbData.m_pData, cbData.m_iLength, pBtImage, len);
  1367. cbData.Resize(len);
  1368. #else
  1369. FILE* fHandle = fopen(csImageFile, "rb");
  1370. if(fHandle)
  1371. {
  1372. fseek(fHandle, 0, SEEK_END);
  1373. long fileSize = ftell(fHandle);
  1374. cbData.Alloc(fileSize);
  1375. fseek(fHandle, 0, SEEK_SET);
  1376. fread(cbData.m_pData, 1, fileSize, fHandle);
  1377. fclose(fHandle);
  1378. }
  1379. else
  1380. {
  1381. LOG_TRACE("fopen(%s) failed.", (LPCTSTR)csImageFile);
  1382. erroCode = Error_IO;
  1383. GetAndDbgDevError();
  1384. SetLastUserCode(HSPScanner_UserErrorCode_READ_IMAGE_FILE_FAILED);
  1385. nRes = 4;
  1386. }
  1387. #endif
  1388. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("ScanImageEx ctx: %s, %d.", (LPCTSTR)ctx->Ans.filePath, ctx->Ans.imageData.m_iLength);
  1389. // Additional ChangeTo Hide --Josephus at 11:29:03 2016/11/22
  1390. if(ISSUCCEEDED(erroCode))
  1391. {
  1392. ErrorCodeEnum eHide = m_hDevHelper->SetParam(HSPS_MODEL_VIEW, HSPS_VIEW_HIDE);
  1393. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("SetParam(HSPS_MODEL_VIEW, HSPS_VIEW_HIDE) returned %s", SpStrError(eHide));
  1394. if(ISSUCCEEDED(eHide))
  1395. {
  1396. nRes = 6;
  1397. }
  1398. }
  1399. ctx->Answer((erroCode));
  1400. }
  1401. else
  1402. {
  1403. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER)("ScanImageEx failed returned %s, %d, %d.", SpStrError(erroCode), len, strlen((const char*)pBtImage));
  1404. SetErrPackage(m_errPkg, "ScanImageEx::ScanImageEx", m_csDevNo, erroCode, MEC_DEVAPI_HSPSCANNER_ScanImageEx);
  1405. SetLastUserCode(AlarmDEC(m_errPkg, true));
  1406. ctx->Answer((erroCode), GetLastUserCode());
  1407. nRes = 2;
  1408. }
  1409. if(pBtImage)
  1410. {
  1411. delete pBtImage;
  1412. pBtImage = NULL;
  1413. }
  1414. return nRes;
  1415. }
  1416. int CHSPScannerFSM::ShowProperty(SpReqAnsContext<HSPScannerService_ShowProperty_Req,
  1417. HSPScannerService_ShowProperty_Ans>::Pointer ctx)
  1418. {
  1419. int nRes = 0;
  1420. ErrorCodeEnum erroCode = Error_Succeed;
  1421. // Return ahead. [Josephus in 15:24:15 2016/11/21]
  1422. ErrorCodeEnum ePos = m_hDevHelper->SetViewPos(730, 100, 540);
  1423. ctx->Answer((erroCode));
  1424. DWORD dwStart = GetTickCount();
  1425. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Start to show Property dialog...");
  1426. erroCode = m_hDevHelper->SetProperty();
  1427. DWORD dwEnd = GetTickCount();
  1428. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setBeginTime(dwStart).setEndTime(dwEnd)("End to show Property dialog! used: %ums.", dwEnd - dwStart);
  1429. if(ISSUCCEEDED(ePos))
  1430. {
  1431. erroCode = m_hDevHelper->SetViewPos(m_nRecX, m_nRecY, m_nRecW);
  1432. }
  1433. return 0;
  1434. }
  1435. int CHSPScannerFSM::SetProperty(SpReqAnsContext<HSPScannerService_SetProperty_Req,
  1436. HSPScannerService_SetProperty_Ans>::Pointer ctx)
  1437. {
  1438. int nRes = 0;
  1439. ErrorCodeEnum erroCode = Error_Succeed;
  1440. int retCode = 0;
  1441. //////////////////////////////////////////////////////////////////////////
  1442. if(ctx->Req.colorType == 1)
  1443. {
  1444. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_COLOR, HSPS_COLOR_FULL);
  1445. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("SetParam(HSPS_MODEL_COLOR, HSPS_COLOR_FULL) returned %d.", erroCode);
  1446. }
  1447. else if(ctx->Req.colorType == 2)
  1448. {
  1449. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_COLOR, HSPS_COLOR_GREY);
  1450. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("SetParam(HSPS_MODEL_COLOR, HSPS_COLOR_GREY) returned %d.", erroCode);
  1451. }
  1452. if(FAILURED(erroCode))
  1453. {
  1454. retCode |= 0x0001;
  1455. //GetAndDbgDevError();
  1456. SetErrPackage(m_errPkg, "SetProperty::SetParam", m_csDevNo, erroCode, MEC_DEVAPI_HSPSCANNER_SetParam);
  1457. SetLastUserCode(AlarmDEC(m_errPkg));
  1458. erroCode = Error_Succeed;
  1459. }
  1460. //////////////////////////////////////////////////////////////////////////
  1461. if(ctx->Req.rotateType == 1)
  1462. {
  1463. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_ROTATE, HSPS_ROTATE_NOANGLE);
  1464. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("SetParam(HSPS_MODEL_ROTATE, HSPS_ROTATE_NOANGLE) returned %d.", erroCode);
  1465. }
  1466. else if(ctx->Req.rotateType == 2)
  1467. {
  1468. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_ROTATE, HSPS_ROTATE_LEFT);
  1469. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("SetParam(HSPS_MODEL_ROTATE, HSPS_ROTATE_LEFT) returned %d.", erroCode);
  1470. }
  1471. else if(ctx->Req.rotateType == 3)
  1472. {
  1473. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_ROTATE, HSPS_ROTATE_MIRROR);
  1474. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("SetParam(HSPS_MODEL_ROTATE, HSPS_ROTATE_MIRROR) returned %d.", erroCode);
  1475. }
  1476. else if(ctx->Req.rotateType == 4)
  1477. {
  1478. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_ROTATE, HSPS_ROTATE_RIGHT);
  1479. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("SetParam(HSPS_MODEL_ROTATE, HSPS_ROTATE_RIGHT) returned %d.", erroCode);
  1480. }
  1481. if(FAILURED(erroCode))
  1482. {
  1483. retCode |= 0x0002;
  1484. SetErrPackage(m_errPkg, "SetProperty::SetParam", m_csDevNo, erroCode, MEC_DEVAPI_HSPSCANNER_SetParam);
  1485. SetLastUserCode(AlarmDEC(m_errPkg));
  1486. erroCode = Error_Succeed;
  1487. }
  1488. //////////////////////////////////////////////////////////////////////////
  1489. if(ctx->Req.scanType == 1)
  1490. {
  1491. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_SCANSIZE, HSPS_SCAN_FULL);
  1492. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("SetParam(HSPS_MODEL_SCANSIZE, HSPS_SCAN_FULL) returned %d.", erroCode);
  1493. }
  1494. else if(ctx->Req.scanType == 2)
  1495. {
  1496. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_SCANSIZE, HSPS_SCAN_A4);
  1497. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("SetParam(HSPS_MODEL_SCANSIZE, HSPS_SCAN_A4) returned %d.", erroCode);
  1498. }
  1499. else if(ctx->Req.scanType == 3)
  1500. {
  1501. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_SCANSIZE, HSPS_SCAN_IDCARD);
  1502. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("SetParam(HSPS_MODEL_SCANSIZE, HSPS_SCAN_IDCARD) returned %d.", erroCode);
  1503. }
  1504. if(FAILURED(erroCode))
  1505. {
  1506. retCode |= 0x0004;
  1507. SetErrPackage(m_errPkg, "SetProperty::SetParam", m_csDevNo, erroCode, MEC_DEVAPI_HSPSCANNER_SetParam);
  1508. SetLastUserCode(AlarmDEC(m_errPkg));
  1509. erroCode = Error_Succeed;
  1510. }
  1511. ctx->Ans.retCode = retCode;
  1512. ctx->Answer(Error_Succeed);
  1513. return nRes;
  1514. }
  1515. int CHSPScannerFSM::SetWinPos(SpReqAnsContext<HSPScannerService_SetWinPos_Req,
  1516. HSPScannerService_SetWinPos_Ans>::Pointer ctx)
  1517. {
  1518. int nRes = 0;
  1519. ErrorCodeEnum erroCode = Error_Unexpect;
  1520. ParamTypeValue value = HSPS_VIEW_SHOW;
  1521. bool bSetCustom = false;
  1522. switch(ctx->Req.type)
  1523. {
  1524. case 0: value = HSPS_VIEW_HIDE; break;
  1525. case 1: value = HSPS_VIEW_SHOW; break;
  1526. case 2: bSetCustom = true; break;
  1527. default:
  1528. {
  1529. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("invalid param for SetWinPos operation type(%d).", ctx->Req.type);
  1530. ctx->Answer(Error_Param, HSPScanner_UserErrorCode_NOT_SUPPORT);
  1531. return nRes = 3;
  1532. }
  1533. break;
  1534. }
  1535. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_USER)("SetWinPos: %s(%d).", ParamValToString(value), value);
  1536. if(bSetCustom)
  1537. {
  1538. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("Start to SetViewPos x(%d), y(%d), w(%d), reserved(%d).",
  1539. ctx->Req.pointX, ctx->Req.pointY, ctx->Req.nWidth, ctx->Req.reserved4);
  1540. erroCode = m_hDevHelper->SetViewPos(ctx->Req.pointX, ctx->Req.pointY, ctx->Req.nWidth);
  1541. if(FAILURED(erroCode))
  1542. {
  1543. SetErrPackage(m_errPkg, "SetWinPos::SetViewPos", m_csDevNo, erroCode, MEC_DEVAPI_HSPSCANNER_SetViewPos);
  1544. SetLastUserCode(AlarmDEC(m_errPkg));
  1545. nRes = 2;
  1546. }
  1547. else
  1548. {
  1549. m_nRecX = ctx->Req.pointX;
  1550. m_nRecY = ctx->Req.pointY;
  1551. m_nRecW = ctx->Req.nWidth;
  1552. }
  1553. }
  1554. else
  1555. {
  1556. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_VIEW, value);
  1557. if(FAILURED(erroCode))
  1558. {
  1559. SetErrPackage(m_errPkg, "SetWinPos::SetParam", m_csDevNo, erroCode, MEC_DEVAPI_HSPSCANNER_SetParam);
  1560. SetLastUserCode(AlarmDEC(m_errPkg));
  1561. nRes = 1;
  1562. }
  1563. }
  1564. ctx->Answer((erroCode), GetLastUserCode());
  1565. return nRes;
  1566. }
  1567. int CHSPScannerFSM::GetDevStatus(SpReqAnsContext<HSPScannerService_GetDevStatus_Req,
  1568. HSPScannerService_GetDevStatus_Ans>::Pointer ctx)
  1569. {
  1570. int nRes = 0;
  1571. HspsDevStatus status = {0};
  1572. ErrorCodeEnum erroCode = m_hDevHelper->GetDevStatus(status);
  1573. if(ISSUCCEEDED(erroCode))
  1574. {
  1575. ctx->Ans.connected = status.isConnected;
  1576. ctx->Ans.previewing = status.inPreview;
  1577. ctx->Ans.showing = status.inShow;
  1578. }
  1579. else
  1580. {
  1581. SetErrPackage(m_errPkg, "GetDevStatus::GetDevStatus", m_csDevNo, erroCode, MEC_DEVAPI_HSPSCANNER_GetDevStatus);
  1582. SetLastUserCode(AlarmDEC(m_errPkg));
  1583. nRes = 1;
  1584. }
  1585. ctx->Answer((erroCode), GetLastUserCode());
  1586. return nRes;
  1587. }
  1588. int CHSPScannerFSM::GetDevInfo(SpReqAnsContext<HSPScannerService_GetDevInfo_Req,
  1589. HSPScannerService_GetDevInfo_Ans>::Pointer ctx)
  1590. {
  1591. int nRes = 0;
  1592. DevCategoryInfo info = {0};
  1593. ErrorCodeEnum erroCode = m_hDevHelper->GetDevCategory(info);
  1594. if(ISSUCCEEDED(erroCode))
  1595. {
  1596. ctx->Ans.model = info.szModel;
  1597. ctx->Ans.state = (int)info.eState;
  1598. ctx->Ans.type = info.szType;
  1599. ctx->Ans.version = CSimpleStringA::Format("%d.%d.%d.%d",
  1600. info.version.wMajor, info.version.wMinor, info.version.wRevision, info.version.wBuild);
  1601. }
  1602. else
  1603. {
  1604. SetErrPackage(m_errPkg, "GetDevInfo::GetDevCategory", m_csDevNo, erroCode, MEC_DEVAPI_HSPSCANNER_GetDevCategory);
  1605. SetLastUserCode(AlarmDEC(m_errPkg));
  1606. nRes = 1;
  1607. }
  1608. {
  1609. ctx->Ans.state = (int)m_eDevStatus;
  1610. }
  1611. ctx->Answer((erroCode), GetLastUserCode());
  1612. return nRes;
  1613. }
  1614. BOOL CHSPScannerFSM::GetCurImageName(CSimpleStringA& csImagName, bool bExt /*= false*/)
  1615. {
  1616. if (bExt) {
  1617. csImagName = "MaterialImageExt.jpg";
  1618. } else {
  1619. csImagName = "MaterialImage.jpg";
  1620. }
  1621. return TRUE;
  1622. }
  1623. BOOL CHSPScannerFSM::DelAndGetNewFileName(CSimpleStringA& csfileName)
  1624. {
  1625. LOG_FUNCTION();
  1626. char fileName[MAX_PATH_SIZE] = {0};
  1627. memset(fileName, 0, sizeof(char)*MAX_PATH_SIZE);
  1628. strcpy_s(fileName, MAX_PATH_SIZE, (LPCTSTR)csfileName);
  1629. if(strlen(fileName) == 0 || strchr(fileName, (int)'*') != NULL)
  1630. {
  1631. return FALSE;
  1632. }
  1633. CSimpleStringA strPath, strAimPath;
  1634. ErrorCodeEnum erroCode = m_pEntity->GetFunction()->GetPath("Dep", strPath);
  1635. strAimPath = strPath + SPLIT_SLASH_STR + fileName;
  1636. ///*TODO(80374374@10/11/2022): 这段代码上线一段时间后要去除,因为从这个版本开始这个文件就不生成在这个目录了 */
  1637. if (ExistsFileA(strAimPath)) {
  1638. if (DeleteFileA((LPCTSTR)strAimPath) != 0) {
  1639. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("DeleteFile(%s) suc.", (LPCTSTR)strAimPath);
  1640. } else {
  1641. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("DeleteFile(%s) failed LastError(%d).", (LPCTSTR)strAimPath, GetLastError());
  1642. }
  1643. }
  1644. strPath.Clear();
  1645. GetEntityBase()->GetFunction()->GetPath("Temp", strPath);
  1646. strAimPath = strPath + SPLIT_SLASH_STR + fileName;
  1647. // Add [Josephus in 17:04:27 2016/10/25]
  1648. csfileName = strAimPath;
  1649. if (ExistsFileA(csfileName)) {
  1650. if (RemoveFileA((LPCTSTR)strAimPath) != 0) {
  1651. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("DeleteFile(%s) suc.", (LPCTSTR)strAimPath);
  1652. return TRUE;
  1653. } else {
  1654. LogWarn(Severity_High, Error_Unexpect, HSPScanner_UserErrorCode_CLEAR_RESOURCE_FAILED, CSimpleStringA::Format(
  1655. "DeleteFile(%s) failed LastError(%d).", (LPCTSTR)strAimPath, GetLastError()));
  1656. return FALSE;
  1657. }
  1658. } else {
  1659. return TRUE;
  1660. }
  1661. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("DeleteFile(%s) Unexpect GetLastError(%d).", (LPCTSTR)strAimPath, GetLastError());
  1662. return FALSE;
  1663. }
  1664. ErrorCodeEnum CHSPScannerFSM::OnDevExit()
  1665. {
  1666. LOG_FUNCTION();
  1667. ErrorCodeEnum erroCode = Error_Succeed;
  1668. if(m_hDevHelper)
  1669. {
  1670. HspsDevStatus status = {0};
  1671. erroCode = m_hDevHelper->GetDevStatus(status);
  1672. if(ISSUCCEEDED(erroCode) && status.isConnected)
  1673. {
  1674. if(status.inPreview)
  1675. {
  1676. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Invoke cancelPreview...");
  1677. erroCode = m_hDevHelper->SetPreview(0);
  1678. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Close Preview OnDevExit returned %s", SpStrError(erroCode));
  1679. if(ISSUCCEEDED(erroCode)) {
  1680. LogEvent(Severity_Middle, LOG_EVT_HSPS_LIGHT_OFF, "HSPScanner warning off.");
  1681. } else {
  1682. SetErrPackage(m_errPkg, "OnDevExit::SetPreview(0)", m_csDevNo, erroCode, MEC_DEVAPI_HSPSCANNER_SetPreview_Close);
  1683. AlarmDEC(m_errPkg);
  1684. }
  1685. }
  1686. } else if (!FAILURED(erroCode)) {
  1687. SetErrPackage(m_errPkg, "OnDevExit::GetDevStatus", m_csDevNo, erroCode, MEC_DEVAPI_HSPSCANNER_GetDevStatus);
  1688. AlarmDEC(m_errPkg);
  1689. } else {
  1690. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("HSPSCanner device is disconnected!");
  1691. }
  1692. }
  1693. CSimpleStringA strNoUsed(true);
  1694. GetCurImageName(strNoUsed);
  1695. DelAndGetNewFileName(strNoUsed);
  1696. GetCurImageName(strNoUsed, true);
  1697. DelAndGetNewFileName(strNoUsed);
  1698. return erroCode;
  1699. }
  1700. UINT CHSPScannerFSM::UnitTest(LPCTSTR testTag)
  1701. {
  1702. #ifdef TWINKLE_LOCAL_DEBUG
  1703. LOG_FUNCTION();
  1704. do
  1705. {
  1706. UploadVendorDllInfo();
  1707. }while(false);
  1708. #endif //TWINKLE_LOCAL_DEBUG
  1709. return 0;
  1710. }
  1711. void CHSPScannerFSM::SelfTest(EntityTestEnum eTestType,
  1712. CSmartPointer<ITransactionContext> pTransactionContext)
  1713. {
  1714. static int openFailedCount = 0;
  1715. if (GetCurrState()->id == CHSPScannerFSM::s3) {
  1716. if (!m_bOpened && !m_bOpening) {
  1717. if (!(bool)m_hDevHelper) {
  1718. pTransactionContext->SendAnswer(Error_InvalidState);
  1719. return;
  1720. }
  1721. openFailedCount++;
  1722. if (openFailedCount > 3) {
  1723. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("try to open device exceed limited times, let selftest to restart it! %d", openFailedCount);
  1724. pTransactionContext->SendAnswer(Error_InvalidState);
  1725. return;
  1726. }
  1727. OpenDeviceTask* pTask = new OpenDeviceTask(this);
  1728. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1729. } else if (m_bOpened && openFailedCount != 0) {
  1730. openFailedCount = 0;
  1731. }
  1732. }
  1733. pTransactionContext->SendAnswer(m_ecSelfTest);
  1734. }
  1735. void CHSPScannerFSM::OnStateTrans(int iSrcState, int iDstState)
  1736. {
  1737. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("trans from %s to %s", GetStateName(iSrcState), GetStateName(iDstState));
  1738. m_nSrcState = iSrcState;
  1739. }
  1740. ErrorCodeEnum CHSPScannerFSM::SetPreview(SpReqAnsContext<HSPScannerService_StartPreview_Req,
  1741. HSPScannerService_StartPreview_Ans>::Pointer ctx)
  1742. {
  1743. int nRes = 0;
  1744. ErrorCodeEnum erroCode = Error_Succeed;
  1745. int retCode = 0;
  1746. //////////////////////////////////////////////////////////////////////////
  1747. if(ctx->Req.colorType == 1)
  1748. {
  1749. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_COLOR, HSPS_COLOR_FULL);
  1750. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("SetParam(HSPS_MODEL_COLOR, HSPS_COLOR_FULL) returned %d.", erroCode);
  1751. }
  1752. else if(ctx->Req.colorType == 2)
  1753. {
  1754. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_COLOR, HSPS_COLOR_GREY);
  1755. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("SetParam(HSPS_MODEL_COLOR, HSPS_COLOR_GREY) returned %d.", erroCode);
  1756. }
  1757. if(FAILURED(erroCode))
  1758. {
  1759. retCode |= 0x0001;
  1760. SetErrPackage(m_errPkg, "SetPreview::SetParam", m_csDevNo, erroCode, MEC_DEVAPI_HSPSCANNER_SetParam);
  1761. SetLastUserCode(AlarmDEC(m_errPkg));
  1762. erroCode = Error_Succeed;
  1763. }
  1764. //////////////////////////////////////////////////////////////////////////
  1765. if(ctx->Req.rotateType == 1)
  1766. {
  1767. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_ROTATE, HSPS_ROTATE_NOANGLE);
  1768. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("SetParam(HSPS_MODEL_ROTATE, HSPS_ROTATE_NOANGLE) returned %d.", erroCode);
  1769. }
  1770. else if(ctx->Req.rotateType == 2)
  1771. {
  1772. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_ROTATE, HSPS_ROTATE_LEFT);
  1773. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("SetParam(HSPS_MODEL_ROTATE, HSPS_ROTATE_LEFT) returned %d.", erroCode);
  1774. }
  1775. else if(ctx->Req.rotateType == 3)
  1776. {
  1777. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_ROTATE, HSPS_ROTATE_MIRROR);
  1778. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("SetParam(HSPS_MODEL_ROTATE, HSPS_ROTATE_MIRROR) returned %d.", erroCode);
  1779. }
  1780. else if(ctx->Req.rotateType == 4)
  1781. {
  1782. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_ROTATE, HSPS_ROTATE_RIGHT);
  1783. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("SetParam(HSPS_MODEL_ROTATE, HSPS_ROTATE_RIGHT) returned %d.", erroCode);
  1784. }
  1785. if(FAILURED(erroCode))
  1786. {
  1787. retCode |= 0x0002;
  1788. SetErrPackage(m_errPkg, "SetPreview::SetParam", m_csDevNo, erroCode, MEC_DEVAPI_HSPSCANNER_SetParam);
  1789. SetLastUserCode(AlarmDEC(m_errPkg));
  1790. erroCode = Error_Succeed;
  1791. }
  1792. //////////////////////////////////////////////////////////////////////////
  1793. if(ctx->Req.scanType == 1)
  1794. {
  1795. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_SCANSIZE, HSPS_SCAN_FULL);
  1796. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("SetParam(HSPS_MODEL_SCANSIZE, HSPS_SCAN_FULL) returned %d.", erroCode);
  1797. }
  1798. else if(ctx->Req.scanType == 2)
  1799. {
  1800. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_SCANSIZE, HSPS_SCAN_A4);
  1801. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("SetParam(HSPS_MODEL_SCANSIZE, HSPS_SCAN_A4) returned %d.", erroCode);
  1802. }
  1803. else if(ctx->Req.scanType == 3)
  1804. {
  1805. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_SCANSIZE, HSPS_SCAN_IDCARD);
  1806. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("SetParam(HSPS_MODEL_SCANSIZE, HSPS_SCAN_IDCARD) returned %d.", erroCode);
  1807. }
  1808. if(FAILURED(erroCode))
  1809. {
  1810. retCode |= 0x0004;
  1811. SetErrPackage(m_errPkg, "SetPreview::SetParam", m_csDevNo, erroCode, MEC_DEVAPI_HSPSCANNER_SetParam);
  1812. SetLastUserCode(AlarmDEC(m_errPkg));
  1813. erroCode = Error_Succeed;
  1814. }
  1815. ctx->Ans.retCode = retCode;
  1816. ctx->Ans.reserved1 = 404040404;
  1817. if(retCode == 0)
  1818. {
  1819. return Error_Succeed;
  1820. }
  1821. return Error_DevCommFailed;
  1822. }
  1823. ErrorCodeEnum CHSPScannerFSM::DeleteFileIfExisted(LPCTSTR fileName)
  1824. {
  1825. ErrorCodeEnum erroCode = Error_Unexpect;
  1826. if (ExistsFileA(fileName)) {
  1827. if (RemoveFileA(fileName) != 0) {
  1828. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("DeleteFile(%s) suc.", fileName);
  1829. return Error_Succeed;
  1830. } else {
  1831. LogWarn(Severity_High, Error_Unexpect, HSPScanner_UserErrorCode_CLEAR_RESOURCE_FAILED, CSimpleStringA::Format(
  1832. "DeleteFile(%s) failed LastError(%d).", fileName, GetLastError()));
  1833. return Error_Unexpect;
  1834. }
  1835. } else {
  1836. return Error_Succeed;
  1837. }
  1838. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("DeleteFile(%s) Unexpect GetLastError(%d).", fileName, GetLastError());
  1839. return Error_Unexpect;
  1840. }
  1841. void CHSPScannerFSM::InitialMaxResizeValue()
  1842. {
  1843. CSmartPointer<IEntityFunction> spFunction = this->GetEntityBase()->GetFunction();
  1844. CSmartPointer<IConfigInfo> spConfig;
  1845. ErrorCodeEnum erroCode = Error_Unexpect;
  1846. spFunction->OpenConfig(Config_CenterSetting, spConfig);
  1847. int kb = 0;
  1848. spConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "ImageMaxSize", kb);
  1849. if (kb > 0) {
  1850. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_HSPS_READ_CONFIG_FILE_FAILED, CSimpleStringA::Format("Get image max size from CS: %d", kb));
  1851. m_dwMaxImageSize = kb;
  1852. return;
  1853. }
  1854. }
  1855. ErrorCodeEnum CHSPScannerFSM::TryToOpenDevice()
  1856. {
  1857. ErrorCodeEnum result(Error_Succeed);
  1858. m_bOpening = true;
  1859. result = m_hDevHelper->DevOpen();
  1860. if (FAILURED(result)) {
  1861. SetErrPackage(m_errPkg, "OnInit::DevOpen", m_csDevNo, result, MEC_DEVAPI_HSPSCANNER_DevOpen);
  1862. AlarmDEC(m_errPkg);
  1863. SetLastUserCode(LOG_ERR_HSPS_DEVOPEN_FAILED);
  1864. } else {
  1865. SetLastUserCode();
  1866. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Open HSPS succ");
  1867. ZeroMemory(m_devCat.szModel, sizeof(m_devCat.szModel));
  1868. ZeroMemory(m_devCat.szType, sizeof(m_devCat.szType));
  1869. ZeroMemory(m_devCat.szVendor, sizeof(m_devCat.szVendor));
  1870. result = m_hDevHelper->GetDevCategory(m_devCat);
  1871. if (result == Error_Succeed) {
  1872. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("szVendor:%s,szType:%s,szModel:%s,version:%d.%d.%d.%d", m_devCat.szVendor
  1873. , m_devCat.szType, m_devCat.szModel, m_devCat.version.wMajor, m_devCat.version.wMinor, m_devCat.version.wRevision, m_devCat.version.wBuild);
  1874. m_adapterInfo.devCatInfo = m_devCat;
  1875. } else {
  1876. SetErrPackage(m_errPkg, "OnInit::GetDevCategory", m_csDevNo, result, MEC_DEVAPI_HSPSCANNER_GetDevCategory);
  1877. AlarmDEC(m_errPkg);
  1878. }
  1879. m_bOpened = true;
  1880. {
  1881. m_nRecX = 1280;
  1882. m_nRecY = 0;
  1883. m_nRecW = 1920;
  1884. ErrorCodeEnum ecInit = m_hDevHelper->SetViewPos(m_nRecX, m_nRecY, m_nRecW);
  1885. ErrorCodeEnum ecInitScan = m_hDevHelper->SetParam(HSPS_MODEL_SCANSIZE, HSPS_SCAN_FULL);
  1886. ErrorCodeEnum ecInitRotate = m_hDevHelper->SetParam(HSPS_MODEL_ROTATE, HSPS_ROTATE_NOANGLE);
  1887. ErrorCodeEnum ecInitColor = m_hDevHelper->SetParam(HSPS_MODEL_COLOR, HSPS_COLOR_FULL);
  1888. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("ViewPos: %s, Scan: %s, rotate: %s, color: %s.", SpStrError(ecInit), SpStrError(ecInitScan), SpStrError(ecInitRotate), SpStrError(ecInitColor));
  1889. }
  1890. m_eDevStatus = DEVICE_STATUS_NORMAL;
  1891. }
  1892. m_bOpening = false;
  1893. return result;
  1894. }