HSPScannerFSM.cpp 73 KB

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