HSPScannerFSM.cpp 66 KB

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