HSPScannerFSM.cpp 83 KB

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