HSPScannerFSM.cpp 73 KB

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