HSPScannerFSM.cpp 74 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109
  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_desiredAction(USER_EVT_QUIT),
  184. dwLastUserCode(0),
  185. m_dwMaxImageSize(500),
  186. m_csMachineType(true)
  187. {
  188. HARDWARE_ENTITY_RESET_ENTITYID(m_entCode, 0x217);
  189. m_FirstStart = TRUE;
  190. }
  191. CHSPScannerFSM::~CHSPScannerFSM(void)
  192. {
  193. }
  194. ErrorCodeEnum CHSPScannerFSM::OnInit()
  195. {
  196. LOG_FUNCTION();
  197. ErrorCodeEnum erroCode = Error_Succeed;
  198. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Source Code complied at: %s %s", __DATE__, __TIME__);
  199. CSystemStaticInfo sysInfo;
  200. GetEntityBase()->GetFunction()->GetSystemStaticInfo(sysInfo);
  201. m_csMachineType = sysInfo.strMachineType;
  202. InitialMaxResizeValue();
  203. auto pEntity = GET_DEV_ENTITY_BASE_POINTER();
  204. pEntity->InitializeVendorLogSwitch();
  205. CSimpleStringA strNoUse(true);
  206. auto result = pEntity->ExtractVendorLibFullPath(strNoUse);
  207. if (result == Error_NotConfig) {
  208. PostEventLIFO(new FSMEvent(USER_EVT_NOCFG));
  209. m_bOpening = false;
  210. return Error_Succeed;
  211. }
  212. if (FAILURED(result)) {
  213. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Fetch Vendor dllName failed %s(%s).", (LPCTSTR)strNoUse, SpStrError(result));
  214. goto FAIL;
  215. }
  216. FulfillAdapterInfoFrom(pEntity->vendorLibInfo);
  217. LogWarn(Severity_Low, Error_Unexpect, HSPScanner_UserErrorCode_ROOT_INFO, (LPCTSTR)m_adapterInfo.adapterFilePath);
  218. erroCode = LoadUpAdapterLibrary();
  219. if (erroCode == Error_Succeed) {
  220. if (Error_Succeed == (erroCode = TryToOpenDevice())) {
  221. SetDevState(DEVICE_STATUS_NORMAL);
  222. return erroCode;
  223. }
  224. }
  225. else if (erroCode == Error_NotExist) {
  226. SetLastUserCode(HSPScanner_UserErrorCode_LOAD_DLLFILE_NOTEIXT);
  227. }
  228. else {
  229. SetLastUserCode(HSPScanner_UserErrorCode_LOAD_DLLFILE_FAILED);
  230. }
  231. FAIL:
  232. SetDevInitFlag(false);
  233. m_bOpening = false;
  234. PostEventLIFO(new FSMEvent(USER_EVT_GOTOHELL));
  235. return Error_Succeed;
  236. }
  237. ErrorCodeEnum CHSPScannerFSM::OnExit()
  238. {
  239. if (m_hDevHelper) {
  240. ErrorCodeEnum errCode = Error_Succeed;
  241. m_hDevHelper.TearDown();
  242. return errCode;
  243. }
  244. return Error_Succeed;
  245. }
  246. void CHSPScannerFSM::s0_on_entry()
  247. {
  248. m_bOperating = FALSE;
  249. m_nFatalTimes = 0;
  250. m_ecSelfTest = Error_Succeed;
  251. }
  252. void CHSPScannerFSM::s0_on_exit()
  253. {
  254. m_bOperating = FALSE;
  255. }
  256. unsigned int CHSPScannerFSM::s0_on_event(FSMEvent* e)
  257. {
  258. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s0_on_event: %s(%d), %d.", EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  259. unsigned int uRet = 0;
  260. switch(e->iEvt)
  261. {
  262. case USER_EVT_STARTPREVIEW:
  263. {
  264. StartPreviewTask* pTask = new StartPreviewTask(this);
  265. StartPreviewEvent* pEvt = dynamic_cast<StartPreviewEvent*>(e);
  266. pTask->SetContext(pEvt->m_ctx);
  267. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  268. e->SetHandled();
  269. }
  270. break;
  271. case USER_EVT_STARTPREVIEW_FINISHED:
  272. {
  273. uRet = e->param1;
  274. e->SetHandled();
  275. if(uRet == 1 && ++m_nFatalTimes <= MAX_ERROR_TIMES)
  276. {
  277. uRet = 2;
  278. }
  279. else if(uRet == 0)
  280. {
  281. m_nFatalTimes = 0;
  282. }
  283. if(uRet == 2 && IsDevConnected() == 0)
  284. {
  285. PostEventFIFO(new FSMEvent(USER_EVT_DISCONNECT));
  286. }
  287. else if(uRet == 1) {
  288. m_desiredAction = USER_EVT_STARTPREVIEW;
  289. }
  290. }
  291. break;
  292. // Add after ST !!! --Josephus at 12:37:15 2016129
  293. case USER_EVT_SETWINPOS:
  294. {
  295. SetWinPosEvent* pEvt = dynamic_cast<SetWinPosEvent*>(e);
  296. if(pEvt->m_ctx->Req.type == 2)
  297. {//在s0状态,仅能用于设置位置和窗体大小
  298. SetWinPosTask* pTask = new SetWinPosTask(this);
  299. pTask->SetContext(pEvt->m_ctx);
  300. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  301. e->SetHandled();
  302. }
  303. }
  304. break;
  305. case USER_EVT_SETPROPERTY:
  306. {
  307. SetPropertyEvent* pEvt = dynamic_cast<SetPropertyEvent*>(e);
  308. SetProperty(pEvt->m_ctx);
  309. e->SetHandled();
  310. }
  311. break;
  312. case USER_EVT_DISCONNECT:
  313. {
  314. //jump auto.
  315. }
  316. e->SetHandled();
  317. break;
  318. case USER_EVT_GETSTATUS:
  319. {
  320. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  321. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  322. pTask->SetContext(pEvt->m_ctx);
  323. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  324. }
  325. e->SetHandled();
  326. break;
  327. case USER_EVT_GETINFO:
  328. {
  329. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  330. if (!m_bOpened) {
  331. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_GetDevInfo).setResultCode(MapCode2RTAString(GetLastUserCode()))("高拍仪设备未打开");
  332. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  333. }
  334. else {
  335. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  336. pTask->SetContext(pEvt->m_ctx);
  337. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  338. }
  339. }
  340. e->SetHandled();
  341. break;
  342. case USER_EVT_NOCFG:
  343. {
  344. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("HSPScaner is not cofig now.");
  345. }
  346. break;
  347. case USER_EVT_EXIT:
  348. {
  349. e->SetHandled();
  350. CSimpleStringA strNoUsed(true);
  351. GetCurImageName(strNoUsed);
  352. DelAndGetNewFileName(strNoUsed);
  353. GetCurImageName(strNoUsed, true);
  354. DelAndGetNewFileName(strNoUsed);
  355. }
  356. break;
  357. case USER_EVT_GOTOHELL:
  358. e->SetHandled();
  359. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("HSPScaner init failed!");
  360. break;
  361. default:
  362. {
  363. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("UnHandle event ! %d", e->iEvt);
  364. }
  365. break;
  366. }
  367. return uRet;
  368. }
  369. void CHSPScannerFSM::s1_on_entry()
  370. {
  371. LOG_FUNCTION();
  372. }
  373. void CHSPScannerFSM::s1_on_exit()
  374. {
  375. }
  376. unsigned int CHSPScannerFSM::s1_on_event(FSMEvent* e)
  377. {
  378. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s1_on_event: %s(%d), %d.", EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  379. unsigned int uRet = 0;
  380. switch(e->iEvt)
  381. {
  382. case USER_EVT_STARTPREVIEW:
  383. {
  384. // Maybe Just SetProperty [Josephus in 15:44:43 2016/11/19]
  385. SetPropertyInPreviewTask* pTask = new SetPropertyInPreviewTask(this);
  386. StartPreviewEvent* pEvt = dynamic_cast<StartPreviewEvent*>(e);
  387. pTask->SetContext(pEvt->m_ctx);
  388. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  389. e->SetHandled();
  390. }
  391. break;
  392. case USER_EVT_SETPROPERTYINVIEW_FINISHED:
  393. {
  394. }
  395. e->SetHandled();
  396. break;
  397. case USER_EVT_STOPPREVIEW:
  398. {
  399. StopPreviewTask* pTask = new StopPreviewTask(this);
  400. StopPreviewEvent* pEvt = dynamic_cast<StopPreviewEvent*>(e);
  401. pTask->SetContext(pEvt->m_ctx);
  402. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  403. }
  404. e->SetHandled();
  405. break;
  406. case USER_EVT_STOPPREVIEW_FINISHED:
  407. {
  408. uRet = e->param1;
  409. if((uRet == 0 || uRet == 4) && ++m_nFatalTimes <= MAX_ERROR_TIMES)
  410. {
  411. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("hold on, wait next time (%d/%d).", m_nFatalTimes, MAX_ERROR_TIMES);
  412. uRet = 3;
  413. }
  414. else if(uRet != 0)
  415. {
  416. m_nFatalTimes = 0;
  417. }
  418. if(uRet == 3 && IsDevConnected() == 0)
  419. {
  420. PostEventFIFO(new FSMEvent(USER_EVT_DISCONNECT));
  421. }
  422. else if(uRet == 0) {
  423. m_desiredAction = USER_EVT_STOPPREVIEW;
  424. }
  425. else if(uRet == 4) {
  426. m_desiredAction = USER_EVT_HIDEPREVIEW;
  427. }
  428. }
  429. e->SetHandled();
  430. break;
  431. case USER_EVT_SCANIMAGE:
  432. {
  433. ScanImageTask* pTask = new ScanImageTask(this);
  434. ScanImageEvent* pEvt = dynamic_cast<ScanImageEvent*>(e);
  435. pTask->SetContext(pEvt->m_ctx);
  436. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  437. }
  438. e->SetHandled();
  439. break;
  440. case USER_EVT_SCANIMAGE_EX:
  441. {
  442. ScanImageExTask* pTask = new ScanImageExTask(this);
  443. ScanImageExEvent* pEvt = dynamic_cast<ScanImageExEvent*>(e);
  444. pTask->SetContext(pEvt->m_ctx);
  445. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  446. }
  447. e->SetHandled();
  448. break;
  449. case USER_EVT_SETPROPERTY:
  450. {
  451. SetPropertyEvent* pEvt = dynamic_cast<SetPropertyEvent*>(e);
  452. SetProperty(pEvt->m_ctx);
  453. }
  454. e->SetHandled();
  455. break;
  456. case USER_EVT_SHOWPROPERTY:
  457. {
  458. ShowPropertyTask* pTask = new ShowPropertyTask(this);
  459. ShowPropertyEvent* pEvt = dynamic_cast<ShowPropertyEvent*>(e);
  460. pTask->SetContext(pEvt->m_ctx);
  461. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  462. }
  463. e->SetHandled();
  464. break;
  465. case USER_EVT_SETWINPOS:
  466. {
  467. SetWinPosEvent* pEvt = dynamic_cast<SetWinPosEvent*>(e);
  468. SetWinPosTask* pTask = new SetWinPosTask(this);
  469. pTask->SetContext(pEvt->m_ctx);
  470. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  471. }
  472. e->SetHandled();
  473. break;
  474. case USER_EVT_DISCONNECT:
  475. {
  476. //jump auto.
  477. }
  478. e->SetHandled();
  479. break;
  480. case USER_EVT_GETSTATUS:
  481. {
  482. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  483. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  484. pTask->SetContext(pEvt->m_ctx);
  485. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  486. }
  487. e->SetHandled();
  488. break;
  489. case USER_EVT_GETINFO:
  490. {
  491. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  492. if (!m_bOpened) {
  493. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_GetDevInfo).setResultCode(MapCode2RTAString(GetLastUserCode()))("高拍仪设备未打开");
  494. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  495. }
  496. else {
  497. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  498. pTask->SetContext(pEvt->m_ctx);
  499. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  500. }
  501. }
  502. e->SetHandled();
  503. break;
  504. }
  505. return uRet;
  506. }
  507. void CHSPScannerFSM::s2_on_entry()
  508. {
  509. LOG_FUNCTION();
  510. }
  511. void CHSPScannerFSM::s2_on_exit()
  512. {
  513. }
  514. unsigned int CHSPScannerFSM::s2_on_event(FSMEvent* e)
  515. {
  516. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s2_on_event: %s(%d), %d.", EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  517. unsigned int uRet = 0;
  518. switch(e->iEvt)
  519. {
  520. case USER_EVT_SHOWPROPERTY_FINISHED:
  521. {
  522. }
  523. e->SetHandled();
  524. break;
  525. case USER_EVT_GETSTATUS:
  526. {
  527. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  528. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  529. pTask->SetContext(pEvt->m_ctx);
  530. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  531. }
  532. e->SetHandled();
  533. break;
  534. case USER_EVT_GETINFO:
  535. {
  536. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  537. if (!m_bOpened) {
  538. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_GetDevInfo).setResultCode(MapCode2RTAString(GetLastUserCode()))("高拍仪设备未打开");
  539. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  540. }
  541. else {
  542. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  543. pTask->SetContext(pEvt->m_ctx);
  544. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  545. }
  546. }
  547. e->SetHandled();
  548. break;
  549. }
  550. return uRet;
  551. }
  552. void CHSPScannerFSM::s3_on_entry()
  553. {
  554. LOG_FUNCTION();
  555. SetDevState(DEVICE_STATUS_FAULT);
  556. m_nTickTimes = 0;
  557. m_bOperating = FALSE;
  558. const int nStatus = IsDevConnected();
  559. if (nStatus == 0) {
  560. PostEventFIFO(new FSMEvent(USER_EVT_DISCONNECT));
  561. } else {
  562. if (nStatus != -1) {
  563. ScheduleTimer(RESET_TIMER_ID, MILLISECOND_TO_RESET / 6);
  564. }
  565. }
  566. }
  567. void CHSPScannerFSM::s3_on_exit()
  568. {
  569. SetDevState(DEVICE_STATUS_NORMAL);
  570. m_bOperating = FALSE;
  571. m_ecSelfTest = Error_Succeed;
  572. m_nFatalTimes = 0;
  573. m_desiredAction = USER_EVT_QUIT;
  574. CancelTimer(RESET_TIMER_ID);
  575. }
  576. unsigned int CHSPScannerFSM::s3_on_event(FSMEvent* e)
  577. {
  578. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s3_on_event: %s(%d), %d.", EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  579. unsigned int uRet = 0;
  580. switch(e->iEvt)
  581. {
  582. case USER_EVT_STARTPREVIEW:
  583. {
  584. StartPreviewEvent* pEvt = dynamic_cast<StartPreviewEvent*>(e);
  585. if (!m_bOpened) {
  586. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_StartPreview).setResultCode(MapCode2RTAString(GetLastUserCode()))("高拍仪设备未打开");
  587. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  588. } else {
  589. StartPreviewTask* pTask = new StartPreviewTask(this);
  590. pTask->SetContext(pEvt->m_ctx);
  591. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  592. }
  593. e->SetHandled();
  594. }
  595. break;
  596. case USER_EVT_STARTPREVIEW_FINISHED:
  597. {
  598. uRet = e->param1;
  599. e->SetHandled();
  600. }
  601. break;
  602. case USER_EVT_STOPPREVIEW:
  603. {
  604. if(m_hDevHelper && m_bOpened)
  605. {
  606. CancelTimer(RESET_TIMER_ID);
  607. StopPreviewEvent* pEvt = dynamic_cast<StopPreviewEvent*>(e);
  608. HspsDevStatus status = {0};
  609. ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  610. ErrorCodeEnum erroCode = m_hDevHelper->GetDevStatus(status);
  611. ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  612. if (erroCode == Error_Succeed) {
  613. 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);
  614. } else {
  615. //RTA2N09
  616. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, IsInBusiness(), ullEnd - ullStart);
  617. }
  618. if (status.inPreview == 1) {
  619. StopPreviewTask* pTask = new StopPreviewTask(this);
  620. pTask->SetContext(pEvt->m_ctx);
  621. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  622. } else if (status.inShow == 1) {
  623. ullStart = SP::Module::Comm::RVCGetTickCount();
  624. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_VIEW, HSPS_VIEW_HIDE);
  625. ullEnd = SP::Module::Comm::RVCGetTickCount();
  626. if (ISSUCCEEDED(erroCode)) {
  627. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_CancelPreview).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)("HSPS_VIEW_HIDE");
  628. } else {
  629. //RTA2N0Q
  630. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetParam, "DevAdapter::SetParam", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_CancelPreview, CombineJsonContext("HSPS_VIEW_HIDE failed"));
  631. SetLastUserCode(GetAlarmDEC());
  632. }
  633. pEvt->m_ctx->Answer(TransECWithRepeat(erroCode));
  634. FSMEvent* timerEvent = new FSMEvent(EVT_TIMER);
  635. timerEvent->param1 = RESET_TIMER_ID;
  636. PostEventFIFO(timerEvent);
  637. }
  638. } else if (!m_bOpened) {
  639. StopPreviewEvent* pEvt = dynamic_cast<StopPreviewEvent*>(e);
  640. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_CancelPreview).setResultCode(MapCode2RTAString(GetLastUserCode()))("高拍仪设备未打开");
  641. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  642. }
  643. }
  644. e->SetHandled();
  645. break;
  646. case USER_EVT_STOPPREVIEW_FINISHED:
  647. {
  648. uRet = e->param1;
  649. if(uRet == 0) {
  650. m_desiredAction = USER_EVT_STOPPREVIEW;
  651. }
  652. else if(uRet == 4) {
  653. m_desiredAction = USER_EVT_HIDEPREVIEW;
  654. }
  655. FSMEvent* timerEvent = new FSMEvent(EVT_TIMER);
  656. timerEvent->param1 = RESET_TIMER_ID;
  657. PostEventFIFO(timerEvent);
  658. }
  659. e->SetHandled();
  660. break;
  661. case USER_EVT_OPENSUCC:
  662. ///*TODO(80374374@9/2/2022): */
  663. e->SetHandled();
  664. break;
  665. case USER_EVT_RESET:
  666. {
  667. if (m_bOpened) {
  668. ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  669. ErrorCodeEnum erroCode = m_hDevHelper->Reset();
  670. ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  671. if (FAILURED(erroCode)) {
  672. //RTA2N0B
  673. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_Reset, "DevAdapter::Reset", __FUNCTION__, false, ullEnd - ullStart, HSPScannerService_CustomLogCode_Reset);
  674. m_ecSelfTest = Error_InvalidState;
  675. uRet = 1;
  676. } else {
  677. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::Reset").setCostTime(ullEnd - ullStart)("Reset");
  678. ullStart = SP::Module::Comm::RVCGetTickCount();
  679. ErrorCodeEnum eXYW = m_hDevHelper->SetViewPos(m_nRecX, m_nRecY, m_nRecW);
  680. ullEnd = SP::Module::Comm::RVCGetTickCount();
  681. if (FAILURED(eXYW)) {
  682. //RTA2N07
  683. SetErrorAndLog(eXYW, MEC_DEVAPI_HSPSCANNER_SetViewPos, "DevAdapter::SetViewPos", __FUNCTION__, false, ullEnd - ullStart, HSPScannerService_CustomLogCode_Reset);
  684. uRet = 1;
  685. m_ecSelfTest = Error_InvalidState;
  686. e->SetHandled();
  687. break;
  688. } else {
  689. 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));
  690. }
  691. HspsDevStatus status = {0};
  692. do
  693. {
  694. ullStart = SP::Module::Comm::RVCGetTickCount();
  695. erroCode = m_hDevHelper->GetDevStatus(status);
  696. ullEnd = SP::Module::Comm::RVCGetTickCount();
  697. if (erroCode == Error_Succeed) {
  698. 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);
  699. } else {
  700. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, false, ullEnd - ullStart, HSPScannerService_CustomLogCode_Reset);
  701. }
  702. } while (false);
  703. if (status.inPreview == 1 && status.inShow == 1) {
  704. if (m_desiredAction == USER_EVT_STOPPREVIEW) {
  705. do
  706. {
  707. ullStart = SP::Module::Comm::RVCGetTickCount();
  708. erroCode = m_hDevHelper->SetPreview(0);
  709. ullEnd = SP::Module::Comm::RVCGetTickCount();
  710. if (erroCode == Error_Succeed) {
  711. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::CancelPreview").setCostTime(ullEnd - ullStart)();
  712. } else {
  713. //RTA2N04
  714. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetPreview_Close, "DevAdapter::CancelPreview", __FUNCTION__, false, ullEnd - ullStart, HSPScannerService_CustomLogCode_Reset);
  715. }
  716. } while (false);
  717. {
  718. HspsDevStatus retryStatus = { 0 };
  719. do
  720. {
  721. ullStart = SP::Module::Comm::RVCGetTickCount();
  722. const ErrorCodeEnum tmpErr = m_hDevHelper->GetDevStatus(retryStatus);
  723. ullEnd = SP::Module::Comm::RVCGetTickCount();
  724. if (tmpErr == Error_Succeed) {
  725. 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);
  726. } else {
  727. //
  728. SetErrorAndLog(tmpErr, MEC_DEVAPI_HSPSCANNER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, false, ullEnd - ullStart, HSPScannerService_CustomLogCode_Reset);
  729. }
  730. } while (false);
  731. if (retryStatus.inPreview == 1) {
  732. do
  733. {
  734. ullStart = SP::Module::Comm::RVCGetTickCount();
  735. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_VIEW, HSPS_VIEW_HIDE);
  736. ullEnd = SP::Module::Comm::RVCGetTickCount();
  737. if (erroCode == Error_Succeed) {
  738. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)("HSPS_MODEL_VIEW, HSPS_VIEW_HIDE");
  739. } else {
  740. //RTA2N0Q
  741. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetParam, "DevAdapter::SetParam", __FUNCTION__, false, ullEnd - ullStart, HSPScannerService_CustomLogCode_Reset, CombineJsonContext("HSPS_VIEW_HIDE"));
  742. }
  743. } while (false);
  744. }
  745. }
  746. } else if (m_desiredAction == USER_EVT_HIDEPREVIEW) {
  747. do
  748. {
  749. ullStart = SP::Module::Comm::RVCGetTickCount();
  750. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_VIEW, HSPS_VIEW_HIDE);
  751. ullEnd = SP::Module::Comm::RVCGetTickCount();
  752. if (erroCode == Error_Succeed) {
  753. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)("HSPS_VIEW_HIDE");
  754. } else {
  755. //RTA2N0Q
  756. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetParam, "DevAdapter::SetParam", __FUNCTION__, false, ullEnd - ullStart, HSPScannerService_CustomLogCode_Reset, CombineJsonContext("HSPS_VIEW_HIDE"));
  757. }
  758. } while (false);
  759. }
  760. if (FAILURED(erroCode)) {
  761. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Recover failed under desiration of %s", EvtTypeToString(m_desiredAction));
  762. uRet = 1;
  763. m_ecSelfTest = Error_InvalidState;
  764. e->SetHandled();
  765. break;
  766. }
  767. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode(HSPScannerService_CustomLogCode_Reset)("Recover routine done");
  768. uRet = 2;
  769. }
  770. }
  771. }
  772. }
  773. e->SetHandled();
  774. break;
  775. case EVT_TIMER:
  776. {
  777. if (e->param1 == RESET_TIMER_ID) {
  778. FSMEvent* pEvt = new FSMEvent(USER_EVT_RESET);
  779. PostEventFIFO(pEvt);
  780. ScheduleTimer(RESET_TIMER_ID, MILLISECOND_TO_RESET);
  781. }
  782. }
  783. e->SetHandled();
  784. break;
  785. case USER_EVT_DISCONNECT:
  786. e->SetHandled();
  787. break;
  788. case USER_EVT_GETSTATUS:
  789. {
  790. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  791. if (!m_bOpened) {
  792. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_GetDevStatus).setResultCode(MapCode2RTAString(GetLastUserCode()))("高拍仪设备未打开");
  793. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  794. } else {
  795. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  796. pTask->SetContext(pEvt->m_ctx);
  797. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  798. }
  799. }
  800. e->SetHandled();
  801. break;
  802. case USER_EVT_GETINFO:
  803. {
  804. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  805. if (!m_bOpened) {
  806. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_GetDevInfo).setResultCode(MapCode2RTAString(GetLastUserCode()))("高拍仪设备未打开");
  807. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  808. } else {
  809. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  810. pTask->SetContext(pEvt->m_ctx);
  811. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  812. }
  813. }
  814. e->SetHandled();
  815. break;
  816. case USER_EVT_SETWINPOS:
  817. {
  818. SetWinPosEvent* pEvt = dynamic_cast<SetWinPosEvent*>(e);
  819. if (!m_bOpened) {
  820. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_SetWinPos).setResultCode(MapCode2RTAString(GetLastUserCode()))("高拍仪设备未打开");
  821. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  822. e->SetHandled();
  823. }
  824. }
  825. break;
  826. }
  827. return uRet;
  828. }
  829. void CHSPScannerFSM::s4_on_entry()
  830. {
  831. }
  832. void CHSPScannerFSM::s4_on_exit()
  833. {
  834. }
  835. unsigned int CHSPScannerFSM::s4_on_event(FSMEvent* e)
  836. {
  837. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s4_on_event: %s(%d), %d.", EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  838. unsigned int uRet = 0;
  839. switch(e->iEvt)
  840. {
  841. case USER_EVT_SCANIMAGEFINISHED:
  842. {
  843. uRet = e->param1;
  844. if(uRet == 2 && ++m_nFatalTimes < MAX_ERROR_TIMES)
  845. {
  846. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("hold on, wait next time (%d/%d).", m_nFatalTimes, MAX_ERROR_TIMES);
  847. uRet = 5;
  848. }
  849. else if(uRet == 0)
  850. {
  851. m_nFatalTimes = 0;
  852. }
  853. if(uRet == 5 && IsDevConnected() == 0)
  854. {
  855. PostEventFIFO(new FSMEvent(USER_EVT_DISCONNECT));
  856. }
  857. else if(uRet == 2 || uRet == 4)
  858. {
  859. m_desiredAction = USER_EVT_SCANIMAGE;
  860. }
  861. }
  862. e->SetHandled();
  863. break;
  864. case USER_EVT_DISCONNECT:
  865. {
  866. //jump auto.
  867. }
  868. e->SetHandled();
  869. break;
  870. case USER_EVT_GETSTATUS:
  871. {
  872. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  873. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  874. pTask->SetContext(pEvt->m_ctx);
  875. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  876. }
  877. e->SetHandled();
  878. break;
  879. case USER_EVT_GETINFO:
  880. {
  881. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  882. if (!m_bOpened) {
  883. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_GetDevInfo).setResultCode(MapCode2RTAString(GetLastUserCode()))("高拍仪设备未打开");
  884. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  885. }
  886. else {
  887. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  888. pTask->SetContext(pEvt->m_ctx);
  889. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  890. }
  891. }
  892. e->SetHandled();
  893. break;
  894. }
  895. return uRet;
  896. }
  897. void CHSPScannerFSM::s5_on_entry()
  898. {
  899. SetDevState(DEVICE_STATUS_MAINTAINCE);
  900. LogEvent(Severity_Middle,LOG_EVT_HSPS_LOST_CONNECT,"高拍仪断开连接!");
  901. SetLastUserCode(HSPScanner_UserErrorCode_DEVICE_OFFLINE);
  902. ScheduleTimer(CHECK_CONNECT_TIMER_ID, MILLISECOND_TO_CHECK_CONNECT);
  903. }
  904. void CHSPScannerFSM::s5_on_exit()
  905. {
  906. SetLastUserCode();
  907. SetDevState(DEVICE_STATUS_NORMAL);
  908. CancelTimer(CHECK_CONNECT_TIMER_ID);
  909. }
  910. unsigned int CHSPScannerFSM::s5_on_event(FSMEvent* e)
  911. {
  912. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s5_on_event: %s(%d), %d.", EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  913. unsigned int uRet = 0;
  914. switch(e->iEvt)
  915. {
  916. case EVT_TIMER:
  917. {
  918. if (e->param1 == CHECK_CONNECT_TIMER_ID) {
  919. HspsDevStatus status = { 0 };
  920. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  921. ErrorCodeEnum eResult = m_hDevHelper->GetDevStatus(status);
  922. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  923. if (ISSUCCEEDED(eResult)) {
  924. 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);
  925. if (status.isConnected == 0) {
  926. ScheduleTimer(CHECK_CONNECT_TIMER_ID, MILLISECOND_TO_CHECK_CONNECT);
  927. } else if (status.inShow == 1 && status.inPreview == 1) {
  928. //回到预览状态
  929. uRet = 2;
  930. } else {
  931. uRet = 1;
  932. }
  933. } else {
  934. //RTA2N09
  935. SetErrorAndLog(eResult, MEC_DEVAPI_HSPSCANNER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, false, ullEnd - ullStart);
  936. }
  937. e->SetHandled();
  938. }
  939. }
  940. break;
  941. case USER_EVT_GETSTATUS:
  942. {
  943. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  944. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  945. pTask->SetContext(pEvt->m_ctx);
  946. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  947. }
  948. e->SetHandled();
  949. break;
  950. case USER_EVT_GETINFO:
  951. {
  952. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  953. if (!m_bOpened) {
  954. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_GetDevInfo).setResultCode(MapCode2RTAString(GetLastUserCode()))("高拍仪设备未打开");
  955. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  956. }
  957. else {
  958. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  959. pTask->SetContext(pEvt->m_ctx);
  960. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  961. }
  962. }
  963. e->SetHandled();
  964. break;
  965. case USER_EVT_SETWINPOS:
  966. {
  967. SetWinPosEvent* pEvt = dynamic_cast<SetWinPosEvent*>(e);
  968. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  969. }
  970. e->SetHandled();
  971. break;
  972. }
  973. return uRet;
  974. }
  975. void CHSPScannerFSM::s6_on_entry()
  976. {
  977. }
  978. void CHSPScannerFSM::s6_on_exit()
  979. {
  980. }
  981. unsigned int CHSPScannerFSM::s6_on_event(FSMEvent* e)
  982. {
  983. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s6_on_event: %s(%d), %d.", EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  984. unsigned int uRet = 0;
  985. switch(e->iEvt)
  986. {
  987. case USER_EVT_STARTPREVIEW:
  988. {
  989. StartPreviewTask* pTask = new StartPreviewTask(this);
  990. StartPreviewEvent* pEvt = dynamic_cast<StartPreviewEvent*>(e);
  991. pTask->SetContext(pEvt->m_ctx);
  992. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  993. e->SetHandled();
  994. }
  995. break;
  996. case USER_EVT_STARTPREVIEW_FINISHED:
  997. {
  998. uRet = e->param1;
  999. e->SetHandled();
  1000. if (uRet == 1 && ++m_nFatalTimes < MAX_ERROR_TIMES) {
  1001. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("hold on, wait next time (%d/%d).", m_nFatalTimes, MAX_ERROR_TIMES);
  1002. uRet = 2;
  1003. } else if (uRet == 0) {
  1004. m_nFatalTimes = 0;
  1005. }
  1006. if (uRet == 2 && IsDevConnected() == 0) {
  1007. PostEventFIFO(new FSMEvent(USER_EVT_DISCONNECT));
  1008. } else if (uRet == 1) {
  1009. m_desiredAction = USER_EVT_STARTPREVIEW;
  1010. }
  1011. }
  1012. break;
  1013. case USER_EVT_SETPROPERTY:
  1014. {
  1015. SetPropertyEvent* pEvt = dynamic_cast<SetPropertyEvent*>(e);
  1016. SetProperty(pEvt->m_ctx);
  1017. e->SetHandled();
  1018. }
  1019. break;
  1020. case USER_EVT_STOPPREVIEW:
  1021. {
  1022. StopPreviewEvent* pEvt = dynamic_cast<StopPreviewEvent*>(e);
  1023. if(!pEvt->m_ctx->Req.bOnlyHide)
  1024. {//业务在s6状态仅能进行彻底取消预览的操作
  1025. StopPreviewTask* pTask = new StopPreviewTask(this);
  1026. pTask->SetContext(pEvt->m_ctx);
  1027. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1028. e->SetHandled();
  1029. }
  1030. }
  1031. break;
  1032. case USER_EVT_STOPPREVIEW_FINISHED:
  1033. {
  1034. uRet = e->param1;
  1035. if (uRet == 0 && ++m_nFatalTimes < MAX_ERROR_TIMES) {
  1036. uRet = 3;
  1037. } else if (uRet != 0) {
  1038. m_nFatalTimes = 0;
  1039. }
  1040. if (uRet == 3 && IsDevConnected() == 0) {
  1041. PostEventFIFO(new FSMEvent(USER_EVT_DISCONNECT));
  1042. }
  1043. }
  1044. e->SetHandled();
  1045. break;
  1046. case USER_EVT_SETWINPOS:
  1047. {
  1048. SetWinPosEvent* pEvt = dynamic_cast<SetWinPosEvent*>(e);
  1049. if(pEvt->m_ctx->Req.type == 2)
  1050. {//在s6状态,不允许进行显示和隐藏操作,业务必须通过XXXPreview来进行显示隐藏操作
  1051. SetWinPosTask* pTask = new SetWinPosTask(this);
  1052. pTask->SetContext(pEvt->m_ctx);
  1053. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1054. e->SetHandled();
  1055. }
  1056. }
  1057. break;
  1058. case USER_EVT_DISCONNECT:
  1059. {
  1060. //jump auto.
  1061. }
  1062. e->SetHandled();
  1063. break;
  1064. case USER_EVT_GETSTATUS:
  1065. {
  1066. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  1067. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  1068. pTask->SetContext(pEvt->m_ctx);
  1069. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1070. }
  1071. e->SetHandled();
  1072. break;
  1073. case USER_EVT_GETINFO:
  1074. {
  1075. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  1076. if (!m_bOpened) {
  1077. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_GetDevInfo).setResultCode(MapCode2RTAString(GetLastUserCode()))("高拍仪设备未打开");
  1078. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  1079. }
  1080. else {
  1081. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  1082. pTask->SetContext(pEvt->m_ctx);
  1083. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1084. }
  1085. }
  1086. e->SetHandled();
  1087. break;
  1088. }
  1089. return uRet;
  1090. }
  1091. void CHSPScannerFSM::s7_on_entry()
  1092. {
  1093. LOG_FUNCTION();
  1094. FSMEvent* pEvt = new FSMEvent(USER_EVT_EXIT_FINISHED);
  1095. if (ISSUCCEEDED(OnDevExit())) {
  1096. pEvt->param1 = 0;
  1097. } else {
  1098. pEvt->param1 = 1;
  1099. }
  1100. PostEventFIFO(pEvt);
  1101. }
  1102. void CHSPScannerFSM::s7_on_exit()
  1103. {
  1104. if(m_hDevHelper && m_bOpened)
  1105. {
  1106. HspsDevStatus status = {0};
  1107. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  1108. ErrorCodeEnum erroCode = m_hDevHelper->GetDevStatus(status);
  1109. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  1110. if (erroCode == Error_Succeed) {
  1111. 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);
  1112. } else {
  1113. //RTA2N09
  1114. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, false, ullEnd - ullStart);
  1115. }
  1116. /** nothing to do now, plan to remove it? Gifur@2024220]*/
  1117. }
  1118. }
  1119. unsigned int CHSPScannerFSM::s7_on_event(FSMEvent* e)
  1120. {
  1121. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s7_on_event: %s(%d), %d.", EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  1122. unsigned int uRet = 0;
  1123. switch(e->iEvt)
  1124. {
  1125. case USER_EVT_EXIT_FINISHED:
  1126. {
  1127. uRet = e->param1;
  1128. if (uRet == 1) {
  1129. m_desiredAction = USER_EVT_EXIT;
  1130. }
  1131. }
  1132. e->SetHandled();
  1133. break;
  1134. case USER_EVT_GETSTATUS:
  1135. {
  1136. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  1137. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  1138. pTask->SetContext(pEvt->m_ctx);
  1139. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1140. }
  1141. e->SetHandled();
  1142. break;
  1143. case USER_EVT_GETINFO:
  1144. {
  1145. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  1146. if (!m_bOpened) {
  1147. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_GetDevInfo).setResultCode(MapCode2RTAString(GetLastUserCode()))("高拍仪设备未打开");
  1148. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  1149. }
  1150. else {
  1151. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  1152. pTask->SetContext(pEvt->m_ctx);
  1153. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1154. }
  1155. }
  1156. e->SetHandled();
  1157. break;
  1158. }
  1159. return uRet;
  1160. }
  1161. unsigned int CHSPScannerFSM::s8_on_event(FSMEvent* e)
  1162. {
  1163. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s8_on_event: %s(%d), %d.", EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  1164. unsigned int uRet = 0;
  1165. switch (e->iEvt) {
  1166. case USER_EVT_STARTPREVIEW:
  1167. {
  1168. StartPreviewEvent* pEvt = dynamic_cast<StartPreviewEvent*>(e);
  1169. pEvt->SetHandled();
  1170. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_StartPreview).setResultCode(MapCode2RTAString(GetLastUserCode()))("NOCFG");
  1171. pEvt->m_ctx->Answer(Error_InvalidState, GetLastUserCode());
  1172. }
  1173. break;
  1174. case USER_EVT_STOPPREVIEW:
  1175. {
  1176. StopPreviewEvent* pEvt = dynamic_cast<StopPreviewEvent*>(e);
  1177. pEvt->SetHandled();
  1178. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_CancelPreview).setResultCode(MapCode2RTAString(GetLastUserCode()))("NOCFG");
  1179. pEvt->m_ctx->Answer(Error_InvalidState, GetLastUserCode());
  1180. }
  1181. break;
  1182. case USER_EVT_SCANIMAGE:
  1183. {
  1184. ScanImageEvent* pEvt = dynamic_cast<ScanImageEvent*>(e);
  1185. pEvt->SetHandled();
  1186. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_ScanImage).setResultCode(MapCode2RTAString(GetLastUserCode()))("NOCFG");
  1187. pEvt->m_ctx->Answer(Error_InvalidState, GetLastUserCode());
  1188. }
  1189. break;
  1190. case USER_EVT_SCANIMAGE_EX:
  1191. {
  1192. ScanImageExEvent* pEvt = dynamic_cast<ScanImageExEvent*>(e);
  1193. pEvt->SetHandled();
  1194. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_ScanImageEx).setResultCode(MapCode2RTAString(GetLastUserCode()))("NOCFG");
  1195. pEvt->m_ctx->Answer(Error_InvalidState, GetLastUserCode());
  1196. }
  1197. break;
  1198. case USER_EVT_SHOWPROPERTY:
  1199. {
  1200. ShowPropertyEvent* pEvt = dynamic_cast<ShowPropertyEvent*>(e);
  1201. pEvt->SetHandled();
  1202. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_ShowProperty).setResultCode(MapCode2RTAString(GetLastUserCode()))("NOCFG");
  1203. pEvt->m_ctx->Answer(Error_InvalidState, GetLastUserCode());
  1204. }
  1205. break;
  1206. case USER_EVT_SETPROPERTY:
  1207. {
  1208. SetPropertyEvent* pEvt = dynamic_cast<SetPropertyEvent*>(e);
  1209. pEvt->SetHandled();
  1210. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_SetProperty).setResultCode(MapCode2RTAString(GetLastUserCode()))("NOCFG");
  1211. pEvt->m_ctx->Answer(Error_InvalidState, GetLastUserCode());
  1212. }
  1213. break;
  1214. case USER_EVT_SETWINPOS:
  1215. {
  1216. SetWinPosEvent* pEvt = dynamic_cast<SetWinPosEvent*>(e);
  1217. pEvt->SetHandled();
  1218. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_SetWinPos).setResultCode(MapCode2RTAString(GetLastUserCode()))("NOCFG");
  1219. pEvt->m_ctx->Answer(Error_InvalidState, GetLastUserCode());
  1220. }
  1221. break;
  1222. case USER_EVT_GETSTATUS:
  1223. {
  1224. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  1225. pEvt->SetHandled();
  1226. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_GetDevStatus).setResultCode(MapCode2RTAString(GetLastUserCode()))("NOCFG");
  1227. pEvt->m_ctx->Answer(Error_InvalidState, GetLastUserCode());
  1228. }
  1229. break;
  1230. case USER_EVT_GETINFO:
  1231. {
  1232. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  1233. if (!m_bOpened) {
  1234. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_GetDevInfo).setResultCode(MapCode2RTAString(GetLastUserCode()))("高拍仪设备未打开");
  1235. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  1236. }
  1237. else {
  1238. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  1239. pTask->SetContext(pEvt->m_ctx);
  1240. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1241. }
  1242. }
  1243. e->SetHandled();
  1244. break;
  1245. default:
  1246. break;
  1247. }
  1248. return uRet;
  1249. }
  1250. int CHSPScannerFSM::StartPreview(SpReqAnsContext<HSPScannerService_StartPreview_Req,
  1251. HSPScannerService_StartPreview_Ans>::Pointer ctx)
  1252. {
  1253. bool nRes = 0;
  1254. ErrorCodeEnum erroCode = Error_Unexpect;
  1255. SetLastUserCode();
  1256. if (ctx->Req.colorType || ctx->Req.scanType || ctx->Req.rotateType) {
  1257. const int retCode = SetPreviewParam(ctx->Req.colorType, ctx->Req.rotateType, ctx->Req.scanType);
  1258. if (retCode != 0)
  1259. {
  1260. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("SetPreviewParam return some wrong:0x%X", retCode);
  1261. erroCode = Error_DevCommFailed;
  1262. }
  1263. else {
  1264. erroCode = Error_Succeed;
  1265. }
  1266. }
  1267. HspsDevStatus status = { 0 };
  1268. ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  1269. erroCode = m_hDevHelper->GetDevStatus(status);
  1270. ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  1271. if (erroCode == Error_Succeed) {
  1272. 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);
  1273. }
  1274. if (ISSUCCEEDED(erroCode) && status.inPreview) {// 用于s6状态 [Josephus in 9:33:48 2016/11/22]
  1275. ullStart = SP::Module::Comm::RVCGetTickCount();
  1276. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_VIEW, HSPS_VIEW_SHOW);
  1277. ullEnd = SP::Module::Comm::RVCGetTickCount();
  1278. if (ISSUCCEEDED(erroCode)) {
  1279. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_StartPreview).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)("HSPS_VIEW_SHOW");
  1280. } else {
  1281. //RTA2N0R
  1282. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetParam, "DevAdapter::SetParam", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_StartPreview, CombineJsonContext("HSPS_VIEW_SHOW"));
  1283. const DWORD dwCode = GetAlarmDEC();
  1284. CSimpleStringA tmpRTA(true), tmpDesc(true);
  1285. if (GetEntityBase()->GetFunction()->GetVTMErrMsg(dwCode, tmpDesc, tmpRTA) == Error_Succeed)
  1286. DbgToBeidou(ctx->link, "StartPreview::SetParam").setReturnCode(tmpRTA)();
  1287. SetLastUserCode(dwCode);
  1288. }
  1289. } else if (ISSUCCEEDED(erroCode)) {
  1290. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("Start to SetPreview(1)...");
  1291. ullStart = SP::Module::Comm::RVCGetTickCount();
  1292. erroCode = m_hDevHelper->SetPreview(1);
  1293. ullEnd = SP::Module::Comm::RVCGetTickCount();
  1294. if (FAILURED(erroCode)) {
  1295. //RTA2N03
  1296. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetPreview_Open, "DevAdapter::SetPreview", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_StartPreview, CombineJsonContext("StartPreview::SetPreview(1)"));
  1297. SetLastUserCode(GetAlarmDEC());
  1298. } else {
  1299. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_StartPreview).setAPI("DevAdapter::SetPreview").setCostTime(ullEnd - ullStart)("StartPreview::SetPreview(1)");
  1300. }
  1301. } else {
  1302. //RTA2N09
  1303. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_StartPreview, CombineJsonContext("GetDevStatus"));
  1304. SetLastUserCode(GetAlarmDEC());
  1305. }
  1306. if (FAILURED(erroCode)) {
  1307. nRes = 1;
  1308. } else {
  1309. LogEvent(Severity_Middle, LOG_EVT_HSPS_LIGHT_ON, "HSPScanner warning on.");
  1310. }
  1311. ctx->Answer(TransECWithRepeat(erroCode), GetLastUserCode());
  1312. return nRes;
  1313. }
  1314. int CHSPScannerFSM::StopPreview(SpReqAnsContext<HSPScannerService_CancelPreview_Req,
  1315. HSPScannerService_CancelPreview_Ans>::Pointer ctx)
  1316. {
  1317. ErrorCodeEnum erroCode = Error_Unexpect;
  1318. int nRes = 0;
  1319. if (ctx->Req.bOnlyHide) {
  1320. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  1321. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_VIEW, HSPS_VIEW_HIDE);
  1322. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  1323. if (ISSUCCEEDED(erroCode)) {
  1324. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_CancelPreview).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)("HSPS_VIEW_HIDE");
  1325. nRes = 1;
  1326. } else {
  1327. //RTA2N0Q
  1328. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetParam, "DevAdapter::SetParam", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_CancelPreview, CombineJsonContext("HSPS_VIEW_HIDE"));
  1329. SetLastUserCode(GetAlarmDEC());
  1330. nRes = 4;
  1331. }
  1332. }
  1333. else
  1334. {
  1335. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_USER)("Start to SetPreview(0).");
  1336. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  1337. erroCode = m_hDevHelper->SetPreview(0);
  1338. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  1339. if (ISSUCCEEDED(erroCode)) {
  1340. nRes = 2;
  1341. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_CancelPreview).setAPI("DevAdapter::CancelPreview").setCostTime(ullEnd - ullStart)("SetPreview(0) succ");
  1342. LogWarn(Severity_Low, Error_Debug, LOG_EVT_HSPSCANNER_SetPreview_Close, "cancelPreview succ.");
  1343. } else {
  1344. //RTA2N04
  1345. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetPreview_Close, "DevAdapter::CancelPreview", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_CancelPreview, CombineJsonContext("SetPreview(0)"));
  1346. const DWORD dwCode = GetAlarmDEC();
  1347. CSimpleStringA tmpRTA(true), tmpDesc(true);
  1348. if (GetEntityBase()->GetFunction()->GetVTMErrMsg(dwCode, tmpDesc, tmpRTA) == Error_Succeed)
  1349. DbgToBeidou(ctx->link, __FUNCTION__).setReturnCode(tmpRTA)();
  1350. SetLastUserCode(dwCode);
  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. else {
  1687. CSimpleStringA tmpRTA(true), tmpDesc(true);
  1688. if (GetEntityBase()->GetFunction()->GetVTMErrMsg(GetLastUserCode(), tmpDesc, tmpRTA) == Error_Succeed)
  1689. DbgToBeidou(ctx->link, "SetWinPos").setReturnCode(tmpRTA)();
  1690. }
  1691. ctx->Answer(TransECWithRepeat(erroCode), GetLastUserCode());
  1692. return nRes;
  1693. }
  1694. int CHSPScannerFSM::GetDevStatus(SpReqAnsContext<HSPScannerService_GetDevStatus_Req,
  1695. HSPScannerService_GetDevStatus_Ans>::Pointer ctx)
  1696. {
  1697. int nRes = 0;
  1698. HspsDevStatus status = {0};
  1699. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  1700. ErrorCodeEnum erroCode = m_hDevHelper->GetDevStatus(status);
  1701. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  1702. if (ISSUCCEEDED(erroCode)) {
  1703. 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);
  1704. ctx->Ans.connected = status.isConnected;
  1705. ctx->Ans.previewing = status.inPreview;
  1706. ctx->Ans.showing = status.inShow;
  1707. } else {
  1708. //RTA2N09
  1709. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_GetDevStatus);
  1710. SetLastUserCode(GetAlarmDEC());
  1711. nRes = 1;
  1712. }
  1713. ctx->Answer(TransECWithRepeat(erroCode), GetLastUserCode());
  1714. return nRes;
  1715. }
  1716. int CHSPScannerFSM::GetDevInfo(SpReqAnsContext<HSPScannerService_GetDevInfo_Req,
  1717. HSPScannerService_GetDevInfo_Ans>::Pointer ctx)
  1718. {
  1719. int nRes = 0;
  1720. if (m_bOpening) {
  1721. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_GetDevInfo).setAPI(__FUNCTION__)("device is opening");
  1722. ctx->Answer(Error_NotInit);
  1723. nRes = 1;
  1724. } else if (!m_bOpened) {
  1725. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_GetDevInfo).setAPI(__FUNCTION__).setResultCode(MapCode2RTAString(GetLastUserCode()))("高拍仪设备未打开");
  1726. ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  1727. nRes = 1;
  1728. } else {
  1729. DevCategoryInfo info = { 0 };
  1730. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  1731. ErrorCodeEnum erroCode = m_hDevHelper->GetDevCategory(info);
  1732. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  1733. ctx->Ans.state = (int)erroCode;
  1734. if (ISSUCCEEDED(erroCode)) {
  1735. ctx->Ans.model = info.szModel;
  1736. ctx->Ans.type = info.szType;
  1737. ctx->Ans.version = CSimpleStringA::Format("%d.%d.%d.%d",
  1738. info.version.wMajor, info.version.wMinor, info.version.wRevision, info.version.wBuild);
  1739. 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"
  1740. , ctx->Ans.model.GetData(), ctx->Ans.state, ctx->Ans.type.GetData(), ctx->Ans.version.GetData());
  1741. }
  1742. else {
  1743. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_GetDevCategory, "DevAdapter::GetDevCategory", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_GetDevInfo);
  1744. SetLastUserCode(GetAlarmDEC());
  1745. nRes = 1;
  1746. }
  1747. ctx->Answer(Error_Succeed);
  1748. }
  1749. return nRes;
  1750. }
  1751. BOOL CHSPScannerFSM::GetCurImageName(CSimpleStringA& csImagName, bool bExt /*= false*/)
  1752. {
  1753. if (bExt) {
  1754. csImagName = "MaterialImageExt.jpg";
  1755. } else {
  1756. csImagName = "MaterialImage.jpg";
  1757. }
  1758. return TRUE;
  1759. }
  1760. BOOL CHSPScannerFSM::DelAndGetNewFileName(CSimpleStringA& csfileName, bool bInBusiness)
  1761. {
  1762. char fileName[MAX_PATH_SIZE] = {0};
  1763. memset(fileName, 0, sizeof(char)*MAX_PATH_SIZE);
  1764. strcpy_s(fileName, MAX_PATH_SIZE, (LPCTSTR)csfileName);
  1765. if (strlen(fileName) == 0 || strchr(fileName, (int)'*') != NULL) {
  1766. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Error input param");
  1767. return FALSE;
  1768. }
  1769. CSimpleStringA strPath, strAimPath;
  1770. m_pEntity->GetFunction()->GetPath("Dep", strPath);
  1771. strAimPath = strPath + SPLIT_SLASH_STR + fileName;
  1772. UpdateAndWarnFileFindInDepBak(strAimPath, fileName, HSPScanner_UserErrorCode_FindFile_in_DepBak);
  1773. #if 0
  1774. ///*TODO(80374374@10/11/2022): 这段代码上线一段时间后要去除,因为从这个版本开始这个文件就不生成在这个目录了 */
  1775. if (ExistsFileA(strAimPath)) {
  1776. if (DeleteFileA((LPCTSTR)strAimPath) != 0) {
  1777. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("DeleteFile(%s) suc.", (LPCTSTR)strAimPath);
  1778. } else {
  1779. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("DeleteFile(%s) failed LastError(%d).", (LPCTSTR)strAimPath, GetLastError());
  1780. }
  1781. }
  1782. strPath.Clear();
  1783. GetEntityBase()->GetFunction()->GetPath("Temp", strPath);
  1784. strAimPath = strPath + SPLIT_SLASH_STR + fileName;
  1785. #endif
  1786. // Add [Josephus in 17:04:27 2016/10/25]
  1787. csfileName = strAimPath;
  1788. if (ExistsFileA(csfileName)) {
  1789. if (RemoveFileA((LPCTSTR)strAimPath) != 0) {
  1790. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("DeleteFile(%s) suc.", (LPCTSTR)strAimPath);
  1791. return TRUE;
  1792. } else {
  1793. if (bInBusiness) {
  1794. DWORD lastErr = GetLastError();
  1795. if (lastErr == 5) {
  1796. Sleep(100);
  1797. if (!ExistsFileA(csfileName) || RemoveFileA((LPCTSTR)strAimPath) != 0) {
  1798. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("DeleteFile(%s) suc.", (LPCTSTR)strAimPath);
  1799. return TRUE;
  1800. }
  1801. lastErr = GetLastError();
  1802. }
  1803. LogError(Severity_Middle, Error_Unexpect, HSPScanner_UserErrorCode_CLEAR_RESOURCE_FAILED, CSimpleStringA::Format(
  1804. "DeleteFile(%s) failed before ScanImage, LastError(%d).", (LPCTSTR)strAimPath, lastErr));
  1805. } else {
  1806. LogWarn(Severity_High, Error_Unexpect, HSPScanner_UserErrorCode_CLEAR_RESOURCE_FAILED, CSimpleStringA::Format(
  1807. "DeleteFile(%s) failed, LastError(%d).", (LPCTSTR)strAimPath, GetLastError()));
  1808. }
  1809. return FALSE;
  1810. }
  1811. } else {
  1812. return TRUE;
  1813. }
  1814. }
  1815. ErrorCodeEnum CHSPScannerFSM::OnDevExit()
  1816. {
  1817. LOG_FUNCTION();
  1818. ErrorCodeEnum erroCode = Error_Succeed;
  1819. if(m_hDevHelper)
  1820. {
  1821. HspsDevStatus status = {0};
  1822. ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  1823. erroCode = m_hDevHelper->GetDevStatus(status);
  1824. ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  1825. if (erroCode == Error_Succeed) {
  1826. 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);
  1827. } else {
  1828. //RTA2N09
  1829. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, false, ullEnd - ullStart);
  1830. }
  1831. if(ISSUCCEEDED(erroCode) && status.isConnected)
  1832. {
  1833. if (status.inPreview) {
  1834. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Invoke cancelPreview...");
  1835. ullStart = SP::Module::Comm::RVCGetTickCount();
  1836. erroCode = m_hDevHelper->SetPreview(0);
  1837. ullEnd = SP::Module::Comm::RVCGetTickCount();
  1838. if (ISSUCCEEDED(erroCode)) {
  1839. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode(__FUNCTION__).setAPI("DevAdapter::CancelPreview").setCostTime(ullEnd - ullStart)();
  1840. LogEvent(Severity_Middle, LOG_EVT_HSPS_LIGHT_OFF, "HSPScanner warning off.");
  1841. ///*TODO: (80374374@2/20/2024)*/
  1842. LogWarn(Severity_Low, Error_Debug, LOG_EVT_HSPSCANNER_SetPreview_Close, "cancelPreview succ.");
  1843. } else {
  1844. //RTA2N04
  1845. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetPreview_Close, "DevAdapter::CancelPreview", __FUNCTION__, false, ullEnd - ullStart, "", CombineJsonContext("OnDevExit::SetPreview(0)"));
  1846. }
  1847. }
  1848. } else if(ISSUCCEEDED(erroCode) && !status.isConnected){
  1849. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("HSPSCanner device is disconnected!");
  1850. }
  1851. }
  1852. CSimpleStringA strNoUsed(true);
  1853. GetCurImageName(strNoUsed);
  1854. DelAndGetNewFileName(strNoUsed);
  1855. GetCurImageName(strNoUsed, true);
  1856. DelAndGetNewFileName(strNoUsed);
  1857. return erroCode;
  1858. }
  1859. void CHSPScannerFSM::SelfTest(EntityTestEnum eTestType,
  1860. CSmartPointer<ITransactionContext> pTransactionContext)
  1861. {
  1862. static int openFailedCount = 0;
  1863. if (GetCurrState()->id == CHSPScannerFSM::s3) {
  1864. if (!m_bOpened && !m_bOpening) {
  1865. if (!(bool)m_hDevHelper) {
  1866. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("hsps is not opened, , let selftest to restart it!");
  1867. pTransactionContext->SendAnswer(Error_InvalidState);
  1868. return;
  1869. }
  1870. openFailedCount++;
  1871. if (openFailedCount > 3) {
  1872. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("try to open device exceed limited times, let selftest to restart it! %d", openFailedCount);
  1873. pTransactionContext->SendAnswer(Error_InvalidState);
  1874. return;
  1875. }
  1876. OpenDeviceTask* pTask = new OpenDeviceTask(this);
  1877. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1878. } else if (m_bOpened && openFailedCount != 0) {
  1879. openFailedCount = 0;
  1880. }
  1881. }
  1882. if (m_ecSelfTest != Error_Succeed) {
  1883. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("selftest returned %s", SpStrError(m_ecSelfTest));
  1884. }
  1885. pTransactionContext->SendAnswer(m_ecSelfTest);
  1886. }
  1887. void CHSPScannerFSM::OnStateTrans(int iSrcState, int iDstState)
  1888. {
  1889. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("trans from %s to %s", GetStateName(iSrcState), GetStateName(iDstState));
  1890. m_nSrcState = iSrcState;
  1891. }
  1892. int CHSPScannerFSM::SetPreviewParam(int colorType, int rotateType, int scanType, bool abortIfFault)
  1893. {
  1894. ErrorCodeEnum erroCode;
  1895. int retCode = 0;
  1896. if (colorType > 0 && colorType < 4) {
  1897. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  1898. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_COLOR, Param_Color_Map[colorType]);
  1899. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  1900. if (ISSUCCEEDED(erroCode)) {
  1901. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)(ParamValToString(Param_Color_Map[colorType]));
  1902. }
  1903. else {
  1904. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetParam, "DevAdapter::SetParam", __FUNCTION__, abortIfFault ? IsInBusiness() : false, ullEnd - ullStart, HSPScannerService_LogCode_SetProperty, CombineJsonContext(ParamValToString(Param_Color_Map[colorType])));
  1905. retCode |= 0x0001;
  1906. SetLastUserCode(GetAlarmDEC(MEC_DEVAPI_HSPSCANNER_SetParam));
  1907. }
  1908. }
  1909. //////////////////////////////////////////////////////////////////////////
  1910. if (rotateType > 0 && rotateType < 5) {
  1911. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  1912. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_ROTATE, Param_Rotate_Map[rotateType]);
  1913. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  1914. if (ISSUCCEEDED(erroCode)) {
  1915. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)(ParamValToString(Param_Rotate_Map[rotateType]));
  1916. }
  1917. else {
  1918. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetParam, "DevAdapter::SetParam", __FUNCTION__, abortIfFault ? IsInBusiness() : false, ullEnd - ullStart, HSPScannerService_LogCode_SetProperty, CombineJsonContext(ParamValToString(Param_Rotate_Map[rotateType])));
  1919. retCode |= 0x0002;
  1920. SetLastUserCode(GetAlarmDEC(MEC_DEVAPI_HSPSCANNER_SetParam));
  1921. }
  1922. }
  1923. //////////////////////////////////////////////////////////////////////////
  1924. if (scanType > 0 && scanType < 4) {
  1925. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  1926. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_SCANSIZE, Param_Scan_Map[scanType]);
  1927. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  1928. if (ISSUCCEEDED(erroCode)) {
  1929. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)(ParamValToString(Param_Scan_Map[scanType]));
  1930. }
  1931. else {
  1932. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetParam, "DevAdapter::SetParam", __FUNCTION__, abortIfFault ? IsInBusiness() : false, ullEnd - ullStart, HSPScannerService_LogCode_SetProperty, CombineJsonContext(ParamValToString(Param_Scan_Map[scanType])));
  1933. retCode |= 0x0004;
  1934. SetLastUserCode(GetAlarmDEC(MEC_DEVAPI_HSPSCANNER_SetParam));
  1935. }
  1936. }
  1937. return retCode;
  1938. }
  1939. ErrorCodeEnum CHSPScannerFSM::DeleteFileIfExisted(LPCTSTR fileName)
  1940. {
  1941. if (ExistsFileA(fileName)) {
  1942. if (RemoveFileA(fileName) != 0) {
  1943. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("DeleteFile(%s) suc.", fileName);
  1944. return Error_Succeed;
  1945. } else {
  1946. LogWarn(Severity_High, Error_Unexpect, HSPScanner_UserErrorCode_CLEAR_RESOURCE_FAILED, CSimpleStringA::Format(
  1947. "DeleteFile(%s) failed LastError(%d) at ResizeImage proc", fileName, GetLastError()));
  1948. return Error_Unexpect;
  1949. }
  1950. } else {
  1951. return Error_Succeed;
  1952. }
  1953. }
  1954. void CHSPScannerFSM::InitialMaxResizeValue()
  1955. {
  1956. CSmartPointer<IEntityFunction> spFunction = this->GetEntityBase()->GetFunction();
  1957. CSmartPointer<IConfigInfo> spConfig;
  1958. spFunction->OpenConfig(Config_CenterSetting, spConfig);
  1959. int kb = 0;
  1960. spConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "ImageMaxSize", kb);
  1961. if (kb > 0) {
  1962. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Get image max size from CS: %d", kb);
  1963. m_dwMaxImageSize = kb;
  1964. return;
  1965. }
  1966. }
  1967. ErrorCodeEnum CHSPScannerFSM::TryToOpenDevice()
  1968. {
  1969. ErrorCodeEnum result(Error_Succeed);
  1970. ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  1971. result = m_hDevHelper->DevOpen();
  1972. ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  1973. m_bOpening = false;
  1974. if (FAILURED(result)) {
  1975. //RTA2N01
  1976. SetErrorAndLog(result, MEC_DEVAPI_HSPSCANNER_DevOpen, "DevAdapter::DevOpen", __FUNCTION__, false, ullEnd - ullStart);
  1977. SetLastUserCode(LOG_ERR_HSPS_DEVOPEN_FAILED);
  1978. } else {
  1979. SetDevInitFlag();
  1980. SetLastUserCode();
  1981. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DevOpen").setCostTime(ullEnd - ullStart)("Open HSPS succ");
  1982. ullStart = SP::Module::Comm::RVCGetTickCount();
  1983. result = FulfillAdapterDevCategory();
  1984. ullEnd = SP::Module::Comm::RVCGetTickCount();
  1985. if (result != Error_Succeed) {
  1986. SetErrorAndLog(result, MEC_DEVAPI_HSPSCANNER_GetDevCategory, "DevAdapter::GetDevCategory", "FulfillAdapterDevCategory", false, ullEnd - ullStart);
  1987. }
  1988. m_nRecX = 0;
  1989. m_nRecY = 224;
  1990. m_nRecW = 1024;
  1991. ErrorCodeEnum ecInit = m_hDevHelper->SetViewPos(m_nRecX, m_nRecY, m_nRecW);
  1992. ErrorCodeEnum ecInitScan = m_hDevHelper->SetParam(HSPS_MODEL_SCANSIZE, HSPS_SCAN_FULL);
  1993. ErrorCodeEnum ecInitRotate = m_hDevHelper->SetParam(HSPS_MODEL_ROTATE, HSPS_ROTATE_NOANGLE);
  1994. ErrorCodeEnum ecInitColor = m_hDevHelper->SetParam(HSPS_MODEL_COLOR, HSPS_COLOR_FULL);
  1995. if (FAILURED(ecInit) || FAILURED(ecInitScan) || FAILURED(ecInitRotate) || FAILURED(ecInitColor)) {
  1996. 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));
  1997. }
  1998. SetDevState(DEVICE_STATUS_NORMAL);
  1999. }
  2000. return result;
  2001. }