HSPScannerFSM.cpp 88 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595
  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. #include "HSPSCanner_LogCode.h"
  16. #define RESET_TIMER_ID 1
  17. #define CHECK_CONNECT_TIMER_ID 2
  18. const int MILLISECOND_TO_RESET = 30 * 1000;
  19. const int MILLISECOND_TO_CHECK_CONNECT = 15 * 1000;
  20. const int MAX_PATH_SIZE = 256;
  21. const int MAX_IMAGEDATA_BUFSIZE = 1 * 1024 * 1024;
  22. const int MAX_IMAGEDATA_SUFFIX = 1024;
  23. const int MAX_ERROR_TIMES = 2;
  24. #define TEMP_WIDTH 1280
  25. #define T_STRINGY(var) case var: return #var; break;
  26. const char* EvtTypeToString(int nEvtType)
  27. {
  28. switch (nEvtType)
  29. {
  30. T_STRINGY(USER_EVT_STARTPREVIEW)
  31. T_STRINGY(USER_EVT_STARTPREVIEW_FINISHED)
  32. T_STRINGY(USER_EVT_SETPROPERTYINVIEW_FINISHED)
  33. T_STRINGY(USER_EVT_STARTPREVIEW_JS)
  34. T_STRINGY(USER_EVT_STARTPREVIEW_JS_DONE)
  35. T_STRINGY(USER_EVT_CANCELPREVIEW_JS)
  36. T_STRINGY(USER_EVT_CANCELPREVIEW_JS_DONE)
  37. T_STRINGY(USER_EVT_SCANIMAGE_JS)
  38. T_STRINGY(USER_EVT_SCANIMAGE_JS_DONE)
  39. T_STRINGY(USER_EVT_SETPARAM_JS)
  40. T_STRINGY(USER_EVT_STOPPREVIEW)
  41. T_STRINGY(USER_EVT_HIDEPREVIEW)
  42. T_STRINGY(USER_EVT_STOPPREVIEW_FINISHED)
  43. T_STRINGY(USER_EVT_SETWINPOS)
  44. T_STRINGY(USER_EVT_SETWINPOSFINISHED)
  45. T_STRINGY(USER_EVT_SCANIMAGE)
  46. T_STRINGY(USER_EVT_SCANIMAGE_EX)
  47. T_STRINGY(USER_EVT_SCANIMAGEFINISHED)
  48. T_STRINGY(USER_EVT_SHOWPROPERTY)
  49. T_STRINGY(USER_EVT_SHOWPROPERTY_FINISHED)
  50. T_STRINGY(USER_EVT_SETPROPERTY)
  51. T_STRINGY(USER_EVT_SETPROPERTY_FINISHED)
  52. T_STRINGY(USER_EVT_GETSTATUS)
  53. T_STRINGY(USER_EVT_GETINFO)
  54. T_STRINGY(USER_EVT_DISCONNECT)
  55. T_STRINGY(USER_EVT_RESET)
  56. T_STRINGY(USER_EVT_EXIT)
  57. T_STRINGY(USER_EVT_EXIT_FINISHED)
  58. T_STRINGY(USER_EVT_GOTOHELL)
  59. T_STRINGY(USER_EVT_QUIT)
  60. T_STRINGY(USER_EVT_INIT)
  61. T_STRINGY(USER_EVT_INIT_FINISHED)
  62. T_STRINGY(EVT_INTERNAL)
  63. T_STRINGY(EVT_TIMER)
  64. T_STRINGY(EVT_MAINPAGE_DISPLAY)
  65. T_STRINGY(EVT_USER)
  66. default:
  67. return "Unknown EventType";
  68. break;
  69. }
  70. }
  71. const char* ParamValToString(int nParamVal)
  72. {
  73. switch (nParamVal)
  74. {
  75. T_STRINGY(HSPS_BOOLVAL_FALSE)
  76. T_STRINGY(HSPS_BOOLVAL_TRUE)
  77. T_STRINGY(HSPS_COLOR_FULL)
  78. T_STRINGY(HSPS_COLOR_GREY)
  79. T_STRINGY(HSPS_ROTATE_NOANGLE)
  80. T_STRINGY(HSPS_ROTATE_LEFT)
  81. T_STRINGY(HSPS_ROTATE_MIRROR)
  82. T_STRINGY(HSPS_ROTATE_RIGHT)
  83. T_STRINGY(HSPS_SCAN_FULL)
  84. T_STRINGY(HSPS_SCAN_A4)
  85. T_STRINGY(HSPS_SCAN_IDCARD)
  86. T_STRINGY(HSPS_VIEW_HIDE)
  87. T_STRINGY(HSPS_VIEW_SHOW)
  88. default:
  89. return "Unknown ParamVal";
  90. }
  91. }
  92. #undef T_STRINGY
  93. ParamTypeValue Param_Color_Map[4] = { HSPS_COLOR_FULL, HSPS_COLOR_FULL , HSPS_COLOR_GREY , HSPS_COLOR_FULL };
  94. ParamTypeValue Param_Rotate_Map[5] = { HSPS_ROTATE_NOANGLE, HSPS_ROTATE_NOANGLE , HSPS_ROTATE_LEFT , HSPS_ROTATE_MIRROR,HSPS_ROTATE_RIGHT };
  95. ParamTypeValue Param_Scan_Map[4] = { HSPS_SCAN_FULL, HSPS_SCAN_FULL , HSPS_SCAN_A4 , HSPS_SCAN_IDCARD };
  96. ParamTypeValue Param_View_Map[3] = { HSPS_VIEW_SHOW, HSPS_VIEW_SHOW , HSPS_VIEW_HIDE };
  97. CSimpleStringA CombineJsonContext(const char* szMessage)
  98. {
  99. CSimpleStringA result(true);
  100. if (szMessage == NULL || strlen(szMessage) == 0) {
  101. return result;
  102. }
  103. result = CSimpleStringA::Format("{\"addition\": \"%s\"}", szMessage);
  104. return result;
  105. }
  106. CSimpleStringA CombineJsonContext4SetPreview(bool bOpen, const char* szMessage = NULL)
  107. {
  108. CSimpleStringA result(true);
  109. if (szMessage == NULL || strlen(szMessage) == 0) {
  110. if (bOpen) {
  111. result = CSimpleStringA::Format("{\"PreviewSwitch\": \"ON\"}");
  112. }
  113. else {
  114. result = CSimpleStringA::Format("{\"PreviewSwitch\": \"OFF\"}");
  115. }
  116. }
  117. else {
  118. if (bOpen) {
  119. result = CSimpleStringA::Format("{\"addition\": \"%s\", \"PreviewSwitch\": \"ON\"}", szMessage);
  120. }
  121. else {
  122. result = CSimpleStringA::Format("{\"addition\": \"%s\", \"PreviewSwitch\": \"OFF\"}", szMessage);
  123. }
  124. }
  125. return result;
  126. }
  127. CHSPScannerFSM::CHSPScannerFSM(void)
  128. :
  129. m_ecSelfTest(Error_Succeed),
  130. m_nFatalTimes(0),
  131. m_nSrcState(sIdle),
  132. m_desiredAction(USER_EVT_QUIT),
  133. dwLastUserCode(0),
  134. m_dwMaxImageSize(500), m_lightOn(false), m_dupFlag4ExitCancel(false)
  135. {
  136. HARDWARE_ENTITY_RESET_ENTITYID(m_entCode, 0x217);
  137. }
  138. CHSPScannerFSM::~CHSPScannerFSM(void)
  139. {
  140. }
  141. ErrorCodeEnum CHSPScannerFSM::OnInit()
  142. {
  143. ErrorCodeEnum erroCode = Error_Succeed;
  144. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Source Code complied at: %s %s", __DATE__, __TIME__);
  145. SetDevInitFlag(false);
  146. AddStateHooker(this);
  147. InitialMaxResizeValue();
  148. auto pEntity = GET_DEV_ENTITY_BASE_POINTER();
  149. pEntity->InitializeVendorLogSwitch();
  150. CSimpleStringA strNoUse(true);
  151. auto result = pEntity->ExtractVendorLibFullPath(strNoUse);
  152. if (FAILURED(result)) {
  153. //1255270002 2025-04-08 08:00:52.922 HSPScaner is not cofig now.
  154. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Fetch Vendor dllName failed %s(%s).", (LPCTSTR)strNoUse, SpStrError(result));
  155. SetDevInitingFlag(false);
  156. SetDevInitFlag(false);
  157. SetLastUserCode(LOG_ERR_HSPS_DEVOPEN_FAILED);
  158. PostEventLIFO(new FSMEvent(USER_EVT_GOTOHELL));
  159. }
  160. else {
  161. FulfillAdapterInfoFrom(pEntity->vendorLibInfo);
  162. PostEventLIFO(new FSMEvent(USER_EVT_INIT));
  163. }
  164. return Error_Succeed;
  165. }
  166. ErrorCodeEnum CHSPScannerFSM::OnExit()
  167. {
  168. if (m_hDevHelper) {
  169. ErrorCodeEnum errCode = Error_Succeed;
  170. m_hDevHelper.TearDown();
  171. return errCode;
  172. }
  173. return Error_Succeed;
  174. }
  175. void CHSPScannerFSM::s0_Idle_on_entry()
  176. {
  177. m_nFatalTimes = 0;
  178. m_ecSelfTest = Error_Succeed;
  179. }
  180. void CHSPScannerFSM::s0_Idle_on_exit()
  181. {
  182. }
  183. unsigned int CHSPScannerFSM::s0_Idle_on_event(FSMEvent* e)
  184. {
  185. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s0_Idle_on_event: %s, %d.", EvtTypeToString(e->iEvt), e->param1);
  186. unsigned int uRet = 0;
  187. switch (e->iEvt)
  188. {
  189. /** JS Component [Gifur@20241113]*/
  190. case USER_EVT_STARTPREVIEW_JS:
  191. {
  192. JS::StartPreviewTask* pTask = new JS::StartPreviewTask(this);
  193. JS::StartPreviewEvent* pEvt = dynamic_cast<JS::StartPreviewEvent*>(e);
  194. pTask->SetContext(pEvt->m_ctx);
  195. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  196. e->SetHandled();
  197. }
  198. break;
  199. case USER_EVT_STARTPREVIEW_JS_DONE:
  200. {
  201. uRet = e->param1;
  202. e->SetHandled();
  203. /** 相对于常规调用,JS版本不兜底 [Gifur@2025324]*/
  204. if (uRet == 1/* && ++m_nFatalTimes <= MAX_ERROR_TIMES*/)
  205. {
  206. uRet = 2;
  207. }
  208. else if (uRet == 0)
  209. {
  210. m_nFatalTimes = 0;
  211. }
  212. if (uRet == 2 && IsDevConnected() == 0)
  213. {
  214. PostEventFIFO(new FSMEvent(USER_EVT_DISCONNECT));
  215. }
  216. else if (uRet == 1) {
  217. m_desiredAction = USER_EVT_STARTPREVIEW;
  218. }
  219. }
  220. break;
  221. case USER_EVT_CANCELPREVIEW_JS:
  222. {
  223. //空闲状态收到取消预览的请求,直接返回成功
  224. JS::CancelPreviewEvent* pEvt = dynamic_cast<JS::CancelPreviewEvent*>(e);
  225. if (!pEvt->m_ctx->Req.hide) {
  226. pEvt->m_ctx->Answer(Error_Succeed);
  227. e->SetHandled();
  228. }
  229. }
  230. break;
  231. case USER_EVT_SETPARAM_JS:
  232. {
  233. JS::SetParamTask* pTask = new JS::SetParamTask(this);
  234. JS::SetParamEvent* pEvt = dynamic_cast<JS::SetParamEvent*>(e);
  235. pTask->SetContext(pEvt->m_ctx);
  236. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  237. e->SetHandled();
  238. }
  239. break;
  240. /** JS Component Done [Gifur@20241113]*/
  241. case USER_EVT_STARTPREVIEW:
  242. {
  243. StartPreviewTask* pTask = new StartPreviewTask(this);
  244. StartPreviewEvent* pEvt = dynamic_cast<StartPreviewEvent*>(e);
  245. pTask->SetContext(pEvt->m_ctx);
  246. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  247. e->SetHandled();
  248. }
  249. break;
  250. case USER_EVT_STARTPREVIEW_FINISHED:
  251. {
  252. uRet = e->param1;
  253. e->SetHandled();
  254. if(uRet == 1 && ++m_nFatalTimes <= MAX_ERROR_TIMES)
  255. {
  256. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("hold on, wait next time (%d/%d).", m_nFatalTimes, MAX_ERROR_TIMES);
  257. uRet = 2;
  258. }
  259. else if(uRet == 0)
  260. {
  261. m_nFatalTimes = 0;
  262. }
  263. if(uRet == 2 && IsDevConnected() == 0)
  264. {
  265. PostEventFIFO(new FSMEvent(USER_EVT_DISCONNECT));
  266. }
  267. else if(uRet == 1) {
  268. m_desiredAction = USER_EVT_STARTPREVIEW;
  269. }
  270. }
  271. break;
  272. /** 根据日志查看在空闲状态偶尔会收到取消预览的请求,兼容处理之(参照JS改造) [Gifur@2025613]*/
  273. case USER_EVT_STOPPREVIEW:
  274. {
  275. StopPreviewTask* pTask = new StopPreviewTask(this);
  276. StopPreviewEvent* pEvt = dynamic_cast<StopPreviewEvent*>(e);
  277. pEvt->m_ctx->Answer(Error_Succeed);
  278. }
  279. e->SetHandled();
  280. break;
  281. // Add after ST !!! --Josephus at 12:37:15 2016129
  282. case USER_EVT_SETWINPOS:
  283. {
  284. SetWinPosEvent* pEvt = dynamic_cast<SetWinPosEvent*>(e);
  285. if(pEvt->m_ctx->Req.type == 2)
  286. {//在s0状态,仅能用于设置位置和窗体大小
  287. SetWinPosTask* pTask = new SetWinPosTask(this);
  288. pTask->SetContext(pEvt->m_ctx);
  289. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  290. e->SetHandled();
  291. }
  292. }
  293. break;
  294. case USER_EVT_SETPROPERTY:
  295. {
  296. SetPropertyEvent* pEvt = dynamic_cast<SetPropertyEvent*>(e);
  297. SetProperty(pEvt->m_ctx);
  298. e->SetHandled();
  299. }
  300. break;
  301. case USER_EVT_DISCONNECT:
  302. {
  303. //jump auto.
  304. }
  305. e->SetHandled();
  306. break;
  307. case USER_EVT_GETSTATUS:
  308. {
  309. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  310. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  311. pTask->SetContext(pEvt->m_ctx);
  312. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  313. }
  314. e->SetHandled();
  315. break;
  316. case USER_EVT_GETINFO:
  317. {
  318. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  319. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  320. pTask->SetContext(pEvt->m_ctx);
  321. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  322. }
  323. e->SetHandled();
  324. break;
  325. case USER_EVT_INIT:
  326. e->SetHandled();
  327. break;
  328. case EVT_MAINPAGE_DISPLAY:
  329. case USER_EVT_EXIT:
  330. {
  331. ClearPictureFileSure();
  332. e->SetHandled();
  333. }
  334. break;
  335. case USER_EVT_GOTOHELL:
  336. e->SetHandled();
  337. break;
  338. default:
  339. break;
  340. }
  341. return uRet;
  342. }
  343. void CHSPScannerFSM::s1_Preview_on_entry()
  344. {
  345. m_dupFlag4ExitCancel = false;
  346. }
  347. void CHSPScannerFSM::s1_Preview_on_exit()
  348. {
  349. m_dupFlag4ExitCancel = false;
  350. }
  351. unsigned int CHSPScannerFSM::s1_Preview_on_event(FSMEvent* e)
  352. {
  353. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s1_Preview_on_event: %s(%d), %d.", EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  354. unsigned int uRet = 0;
  355. switch (e->iEvt)
  356. {
  357. /** JS Component [Gifur@20241113]*/
  358. case USER_EVT_STARTPREVIEW_JS:
  359. {
  360. JS::StartPreviewEvent* pEvt = dynamic_cast<JS::StartPreviewEvent*>(e);
  361. if (JS::PreviewSettings(pEvt->m_ctx->Req).IsAvailable()) {
  362. ErrorCodeEnum erroCode = SetPreviewProperty(JS::PreviewSettings(pEvt->m_ctx->Req), HSPScannerService_LogCode_StartPreviewJS);
  363. if (FAILURED(erroCode)) {
  364. pEvt->m_ctx->Answer(Error_Unexpect, GetLastUserCode());
  365. }
  366. else {
  367. pEvt->m_ctx->Answer(Error_Succeed);
  368. }
  369. }
  370. else {
  371. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("Require to preview when in previewing!!");
  372. pEvt->m_ctx->Answer(Error_Succeed);
  373. }
  374. e->SetHandled();
  375. }
  376. break;
  377. case USER_EVT_CANCELPREVIEW_JS:
  378. {
  379. JS::CancelPreviewTask* pTask = new JS::CancelPreviewTask(this);
  380. JS::CancelPreviewEvent* pEvt = dynamic_cast<JS::CancelPreviewEvent*>(e);
  381. pTask->SetContext(pEvt->m_ctx);
  382. if (!pEvt->m_ctx->Req.hide) {
  383. m_dupFlag4ExitCancel = true;
  384. }
  385. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  386. e->SetHandled();
  387. }
  388. break;
  389. case USER_EVT_CANCELPREVIEW_JS_DONE:
  390. {
  391. m_dupFlag4ExitCancel = false;
  392. if (e->param1 == 0) {//取消预览成功
  393. if (e->param2 == 1) uRet = 2; //仅仅是隐藏
  394. else {
  395. uRet = 1;
  396. }
  397. m_nFatalTimes = 0;
  398. }
  399. else {
  400. uRet = 3;
  401. if (e->param2 == 1) { m_desiredAction = USER_EVT_HIDEPREVIEW; }
  402. else {
  403. m_desiredAction = USER_EVT_STOPPREVIEW;
  404. }
  405. if (IsDevConnected() == 0) {
  406. PostEventFIFO(new FSMEvent(USER_EVT_DISCONNECT));
  407. }
  408. }
  409. e->SetHandled();
  410. }
  411. break;
  412. case USER_EVT_SCANIMAGE_JS:
  413. {
  414. JS::ScanImageTask* pTask = new JS::ScanImageTask(this);
  415. JS::ScanImageEvent* pEvt = dynamic_cast<JS::ScanImageEvent*>(e);
  416. pTask->SetContext(pEvt->m_ctx);
  417. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  418. e->SetHandled();
  419. }
  420. break;
  421. case USER_EVT_SCANIMAGE_JS_DONE:
  422. {
  423. if (e->param1 == 0) { //拍照成功
  424. if (e->param2 == 1) uRet = 2; //拍照后要求隐藏
  425. else uRet = 1; //拍照后没有其他动作
  426. m_nFatalTimes = 0;
  427. }
  428. else {
  429. uRet = 3;
  430. if (e->param2 == 1) m_desiredAction = USER_EVT_HIDEPREVIEW; else m_desiredAction = USER_EVT_STARTPREVIEW;
  431. }
  432. e->SetHandled();
  433. }
  434. break;
  435. case USER_EVT_SETPARAM_JS:
  436. {
  437. JS::SetParamTask* pTask = new JS::SetParamTask(this);
  438. JS::SetParamEvent* pEvt = dynamic_cast<JS::SetParamEvent*>(e);
  439. pTask->SetContext(pEvt->m_ctx);
  440. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  441. e->SetHandled();
  442. }
  443. break;
  444. /** JS Component Done [Gifur@20241113]*/
  445. case USER_EVT_STARTPREVIEW:
  446. {
  447. // Maybe Just SetProperty [Josephus in 15:44:43 2016/11/19]
  448. SetPropertyInPreviewTask* pTask = new SetPropertyInPreviewTask(this);
  449. StartPreviewEvent* pEvt = dynamic_cast<StartPreviewEvent*>(e);
  450. pTask->SetContext(pEvt->m_ctx);
  451. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  452. e->SetHandled();
  453. }
  454. break;
  455. case USER_EVT_SETPROPERTYINVIEW_FINISHED:
  456. {
  457. }
  458. e->SetHandled();
  459. break;
  460. case USER_EVT_STOPPREVIEW:
  461. {
  462. StopPreviewTask* pTask = new StopPreviewTask(this);
  463. StopPreviewEvent* pEvt = dynamic_cast<StopPreviewEvent*>(e);
  464. pTask->SetContext(pEvt->m_ctx);
  465. if (!pEvt->m_ctx->Req.bOnlyHide) {
  466. m_dupFlag4ExitCancel = true;
  467. }
  468. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  469. }
  470. e->SetHandled();
  471. break;
  472. case USER_EVT_STOPPREVIEW_FINISHED:
  473. {
  474. m_dupFlag4ExitCancel = false;
  475. uRet = e->param1;
  476. if((uRet == 0 || uRet == 4) && ++m_nFatalTimes <= MAX_ERROR_TIMES)
  477. {
  478. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("hold on, wait next time (%d/%d).", m_nFatalTimes, MAX_ERROR_TIMES);
  479. uRet = 3;
  480. }
  481. else if(uRet != 0)
  482. {
  483. m_nFatalTimes = 0;
  484. }
  485. if(uRet == 3 && IsDevConnected() == 0)
  486. {
  487. PostEventFIFO(new FSMEvent(USER_EVT_DISCONNECT));
  488. }
  489. //fault
  490. else if(uRet == 0) {
  491. m_desiredAction = USER_EVT_STOPPREVIEW;
  492. }
  493. else if(uRet == 4) {
  494. m_desiredAction = USER_EVT_HIDEPREVIEW;
  495. }
  496. }
  497. e->SetHandled();
  498. break;
  499. case USER_EVT_SCANIMAGE:
  500. {
  501. ScanImageTask* pTask = new ScanImageTask(this);
  502. ScanImageEvent* pEvt = dynamic_cast<ScanImageEvent*>(e);
  503. pTask->SetContext(pEvt->m_ctx);
  504. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  505. }
  506. e->SetHandled();
  507. break;
  508. case USER_EVT_SCANIMAGE_EX:
  509. {
  510. ScanImageExTask* pTask = new ScanImageExTask(this);
  511. ScanImageExEvent* pEvt = dynamic_cast<ScanImageExEvent*>(e);
  512. pTask->SetContext(pEvt->m_ctx);
  513. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  514. }
  515. e->SetHandled();
  516. break;
  517. case USER_EVT_SETPROPERTY:
  518. {
  519. SetPropertyEvent* pEvt = dynamic_cast<SetPropertyEvent*>(e);
  520. SetProperty(pEvt->m_ctx);
  521. }
  522. e->SetHandled();
  523. break;
  524. case USER_EVT_SHOWPROPERTY:
  525. {
  526. ShowPropertyTask* pTask = new ShowPropertyTask(this);
  527. ShowPropertyEvent* pEvt = dynamic_cast<ShowPropertyEvent*>(e);
  528. pTask->SetContext(pEvt->m_ctx);
  529. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  530. }
  531. e->SetHandled();
  532. break;
  533. case USER_EVT_SETWINPOS:
  534. {
  535. SetWinPosEvent* pEvt = dynamic_cast<SetWinPosEvent*>(e);
  536. SetWinPosTask* pTask = new SetWinPosTask(this);
  537. pTask->SetContext(pEvt->m_ctx);
  538. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  539. }
  540. e->SetHandled();
  541. break;
  542. case USER_EVT_DISCONNECT:
  543. {
  544. //jump auto.
  545. }
  546. e->SetHandled();
  547. break;
  548. case USER_EVT_GETSTATUS:
  549. {
  550. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  551. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  552. pTask->SetContext(pEvt->m_ctx);
  553. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  554. }
  555. e->SetHandled();
  556. break;
  557. case USER_EVT_GETINFO:
  558. {
  559. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  560. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  561. pTask->SetContext(pEvt->m_ctx);
  562. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  563. }
  564. e->SetHandled();
  565. break;
  566. case EVT_MAINPAGE_DISPLAY:
  567. case USER_EVT_EXIT:
  568. {
  569. e->SetHandled();
  570. if (m_dupFlag4ExitCancel) {
  571. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s::recv %s while CancelPreviewing", __FUNCTION__, EvtTypeToString(e->iEvt));
  572. uRet = 1;
  573. }
  574. }
  575. break;
  576. }
  577. return uRet;
  578. }
  579. void CHSPScannerFSM::s2_on_entry()
  580. {
  581. LOG_FUNCTION();
  582. }
  583. void CHSPScannerFSM::s2_on_exit()
  584. {
  585. }
  586. unsigned int CHSPScannerFSM::s2_on_event(FSMEvent* e)
  587. {
  588. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s2_on_event: %s(%d), %d.", EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  589. unsigned int uRet = 0;
  590. switch(e->iEvt)
  591. {
  592. case USER_EVT_SHOWPROPERTY_FINISHED:
  593. {
  594. }
  595. e->SetHandled();
  596. break;
  597. case USER_EVT_GETSTATUS:
  598. {
  599. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  600. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  601. pTask->SetContext(pEvt->m_ctx);
  602. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  603. }
  604. e->SetHandled();
  605. break;
  606. case USER_EVT_GETINFO:
  607. {
  608. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  609. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  610. pTask->SetContext(pEvt->m_ctx);
  611. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  612. }
  613. e->SetHandled();
  614. break;
  615. }
  616. return uRet;
  617. }
  618. void CHSPScannerFSM::s3_Failed_on_entry()
  619. {
  620. if (GetDevInitFlag()) {
  621. SetLastUserCode(HSPScanner_UserErrorCode_FSM_INVALID);
  622. const int nStatus = IsDevConnected();
  623. if (nStatus == 0) {
  624. PostEventFIFO(new FSMEvent(USER_EVT_DISCONNECT));
  625. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Enter s3_Failed by Disconnected");
  626. }
  627. else if (nStatus == 1) {
  628. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Enter s3_Failed by Others' reason");
  629. ScheduleTimer(RESET_TIMER_ID, MILLISECOND_TO_RESET / 6);
  630. }
  631. }
  632. else {
  633. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Enter s3_Failed by Device open failed");
  634. SetDevState(DEVICE_STATUS_FAULT);
  635. }
  636. }
  637. void CHSPScannerFSM::s3_Failed_on_exit()
  638. {
  639. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Leave s3_Failed");
  640. SetDevState(DEVICE_STATUS_NORMAL);
  641. m_ecSelfTest = Error_Succeed;
  642. m_nFatalTimes = 0;
  643. m_desiredAction = USER_EVT_QUIT;
  644. CancelTimer(RESET_TIMER_ID);
  645. }
  646. unsigned int CHSPScannerFSM::s3_Failed_on_event(FSMEvent* e)
  647. {
  648. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s3_Failed_on_event: %s(%d), %d.", EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  649. unsigned int uRet = 0;
  650. switch(e->iEvt)
  651. {
  652. /** JS Component [Gifur@20241112]*/
  653. case USER_EVT_STARTPREVIEW_JS:
  654. {
  655. JS::StartPreviewEvent* pEvt = dynamic_cast<JS::StartPreviewEvent*>(e);
  656. if (GetDevInitFlag()) {
  657. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_StartPreviewJS).setResultCode(MapCode2RTAString(GetLastUserCode()))("高拍仪模块出现异常");
  658. }
  659. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  660. e->SetHandled();
  661. }
  662. break;
  663. case USER_EVT_CANCELPREVIEW_JS:
  664. {
  665. JS::CancelPreviewEvent* pEvt = dynamic_cast<JS::CancelPreviewEvent*>(e);
  666. if (GetDevInitFlag()) {
  667. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_CancelPreviewJS).setResultCode(MapCode2RTAString(GetLastUserCode()))("高拍仪模块出现异常");
  668. }
  669. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  670. e->SetHandled();
  671. }
  672. break;
  673. case USER_EVT_SCANIMAGE_JS:
  674. {
  675. JS::ScanImageEvent* pEvt = dynamic_cast<JS::ScanImageEvent*>(e);
  676. if (GetDevInitFlag()) {
  677. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_ScanImageJS).setResultCode(MapCode2RTAString(GetLastUserCode()))("高拍仪模块出现异常");
  678. }
  679. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  680. e->SetHandled();
  681. }
  682. break;
  683. case USER_EVT_SETPARAM_JS:
  684. {
  685. JS::SetParamEvent* pEvt = dynamic_cast<JS::SetParamEvent*>(e);
  686. if (GetDevInitFlag()) {
  687. JS::SetParamTask* pTask = new JS::SetParamTask(this);
  688. pTask->SetContext(pEvt->m_ctx);
  689. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  690. e->SetHandled();
  691. }
  692. else {
  693. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  694. e->SetHandled();
  695. }
  696. }
  697. break;
  698. /** JS Compoent Done [Gifur@20241112]*/
  699. case USER_EVT_STARTPREVIEW:
  700. {
  701. StartPreviewEvent* pEvt = dynamic_cast<StartPreviewEvent*>(e);
  702. if (!GetDevInitFlag()) {
  703. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  704. } else {
  705. StartPreviewTask* pTask = new StartPreviewTask(this);
  706. pTask->SetContext(pEvt->m_ctx);
  707. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  708. }
  709. e->SetHandled();
  710. }
  711. break;
  712. case USER_EVT_STARTPREVIEW_FINISHED:
  713. {
  714. uRet = e->param1;
  715. e->SetHandled();
  716. }
  717. break;
  718. case USER_EVT_STOPPREVIEW:
  719. {
  720. if(GetDevInitFlag())
  721. {
  722. CancelTimer(RESET_TIMER_ID);
  723. StopPreviewEvent* pEvt = dynamic_cast<StopPreviewEvent*>(e);
  724. HspsDevStatus status = {0};
  725. ErrorCodeEnum erroCode = GetDevStatusFromAdapter(status);
  726. if (status.inPreview == 1) {
  727. StopPreviewTask* pTask = new StopPreviewTask(this);
  728. pTask->SetContext(pEvt->m_ctx);
  729. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  730. } else if (status.inShow == 1) {
  731. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  732. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_VIEW, HSPS_VIEW_HIDE);
  733. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  734. if (ISSUCCEEDED(erroCode)) {
  735. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_CancelPreview).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)("HSPS_VIEW_HIDE");
  736. } else {
  737. //RTA2N0Q
  738. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetParam, "DevAdapter::SetParam", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_CancelPreview, CombineJsonContext("HSPS_VIEW_HIDE"));
  739. SetLastUserCode(GetAlarmDEC());
  740. }
  741. pEvt->m_ctx->Answer(erroCode);
  742. FSMEvent* timerEvent = new FSMEvent(EVT_TIMER);
  743. timerEvent->param1 = RESET_TIMER_ID;
  744. PostEventFIFO(timerEvent);
  745. }
  746. } else {
  747. StopPreviewEvent* pEvt = dynamic_cast<StopPreviewEvent*>(e);
  748. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  749. }
  750. }
  751. e->SetHandled();
  752. break;
  753. case USER_EVT_STOPPREVIEW_FINISHED:
  754. {
  755. uRet = e->param1;
  756. if(uRet == 0) {
  757. m_desiredAction = USER_EVT_STOPPREVIEW;
  758. }
  759. else if(uRet == 4) {
  760. m_desiredAction = USER_EVT_HIDEPREVIEW;
  761. }
  762. FSMEvent* timerEvent = new FSMEvent(EVT_TIMER);
  763. timerEvent->param1 = RESET_TIMER_ID;
  764. PostEventFIFO(timerEvent);
  765. }
  766. e->SetHandled();
  767. break;
  768. case USER_EVT_RESET:
  769. {
  770. if (GetDevInitFlag()) {
  771. ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  772. ErrorCodeEnum erroCode = m_hDevHelper->Reset();
  773. ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  774. if (FAILURED(erroCode)) {
  775. //RTA2N0B
  776. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_Reset, "DevAdapter::Reset", __FUNCTION__, false, ullEnd - ullStart, CustomLogCode_Reset);
  777. SetDevState(DEVICE_STATUS_FAULT);
  778. uRet = 1;
  779. } else {
  780. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::Reset").setCostTime(ullEnd - ullStart)("Reset succ.");
  781. ullStart = SP::Module::Comm::RVCGetTickCount();
  782. ErrorCodeEnum eXYW = m_hDevHelper->SetViewPos(m_nRecX, m_nRecY, m_nRecW);
  783. ullEnd = SP::Module::Comm::RVCGetTickCount();
  784. if (FAILURED(eXYW)) {
  785. //RTA2N07
  786. SetErrorAndLog(eXYW, MEC_DEVAPI_HSPSCANNER_SetViewPos, "DevAdapter::SetViewPos", __FUNCTION__, false, ullEnd - ullStart, CustomLogCode_Reset);
  787. SetDevState(DEVICE_STATUS_FAULT);
  788. uRet = 1;
  789. e->SetHandled();
  790. break;
  791. } else {
  792. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetViewPos").setCostTime(ullEnd - ullStart)("x:%d, y:%d, w:%d", m_nRecX, m_nRecY, m_nRecW);
  793. }
  794. HspsDevStatus status = {0};
  795. erroCode = GetDevStatusFromAdapter(status);
  796. if (ISSUCCEEDED(erroCode) && status.inPreview == 1 && status.inShow == 1) {
  797. if (m_desiredAction == USER_EVT_STOPPREVIEW) {
  798. do
  799. {
  800. ullStart = SP::Module::Comm::RVCGetTickCount();
  801. erroCode = m_hDevHelper->SetPreview(0);
  802. ullEnd = SP::Module::Comm::RVCGetTickCount();
  803. if (erroCode == Error_Succeed) {
  804. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode(CustomLogCode_CancelPreview_Default).setAPI("DevAdapter::SetPreview").setCostTime(ullEnd - ullStart)(CombineJsonContext4SetPreview(false));
  805. } else {
  806. //RTA2N04
  807. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetPreview_Close, "DevAdapter::SetPreview", __FUNCTION__, false, ullEnd - ullStart, CustomLogCode_CancelPreview_Default, CombineJsonContext4SetPreview(false));
  808. }
  809. } while (false);
  810. do
  811. {
  812. HspsDevStatus retryStatus = { 0 };
  813. GetDevStatusFromAdapter(retryStatus);
  814. if (retryStatus.inPreview == 1) {
  815. ullStart = SP::Module::Comm::RVCGetTickCount();
  816. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_VIEW, HSPS_VIEW_HIDE);
  817. ullEnd = SP::Module::Comm::RVCGetTickCount();
  818. if (erroCode == Error_Succeed) {
  819. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)("HSPS_MODEL_VIEW, HSPS_VIEW_HIDE");
  820. }
  821. else {
  822. //RTA2N0Q
  823. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetParam, "DevAdapter::SetParam", __FUNCTION__, false, ullEnd - ullStart, CustomLogCode_Reset, CombineJsonContext("HSPS_VIEW_HIDE"));
  824. }
  825. }
  826. } while (false);
  827. } else if (m_desiredAction == USER_EVT_HIDEPREVIEW) {
  828. do
  829. {
  830. ullStart = SP::Module::Comm::RVCGetTickCount();
  831. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_VIEW, HSPS_VIEW_HIDE);
  832. ullEnd = SP::Module::Comm::RVCGetTickCount();
  833. if (erroCode == Error_Succeed) {
  834. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)("HSPS_VIEW_HIDE");
  835. } else {
  836. //RTA2N0Q
  837. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetParam, "DevAdapter::SetParam", __FUNCTION__, false, ullEnd - ullStart, CustomLogCode_Reset, CombineJsonContext("HSPS_VIEW_HIDE"));
  838. }
  839. } while (false);
  840. }
  841. else {
  842. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setLogCode(CustomLogCode_Reset)("Recover routine done");
  843. uRet = 2;
  844. }
  845. }
  846. if (FAILURED(erroCode)) {
  847. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Recover failed under desiration of %s", EvtTypeToString(m_desiredAction));
  848. SetDevState(DEVICE_STATUS_FAULT);
  849. uRet = 1;
  850. e->SetHandled();
  851. break;
  852. }
  853. }
  854. }
  855. }
  856. e->SetHandled();
  857. break;
  858. case EVT_TIMER:
  859. {
  860. if (e->param1 == RESET_TIMER_ID) {
  861. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Current Dev State:%d", GetDevState());
  862. FSMEvent* pEvt = new FSMEvent(USER_EVT_RESET);
  863. PostEventFIFO(pEvt);
  864. ScheduleTimer(RESET_TIMER_ID, MILLISECOND_TO_RESET);
  865. }
  866. }
  867. e->SetHandled();
  868. break;
  869. case USER_EVT_DISCONNECT:
  870. e->SetHandled();
  871. break;
  872. case USER_EVT_GETSTATUS:
  873. {
  874. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  875. if (!GetDevInitFlag()) {
  876. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  877. } else {
  878. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  879. pTask->SetContext(pEvt->m_ctx);
  880. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  881. }
  882. }
  883. e->SetHandled();
  884. break;
  885. case USER_EVT_GETINFO:
  886. {
  887. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  888. if (!GetDevInitFlag()) {
  889. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  890. e->SetHandled();
  891. }
  892. else {
  893. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  894. pTask->SetContext(pEvt->m_ctx);
  895. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  896. }
  897. }
  898. e->SetHandled();
  899. break;
  900. case USER_EVT_SETWINPOS:
  901. {
  902. SetWinPosEvent* pEvt = dynamic_cast<SetWinPosEvent*>(e);
  903. if (!GetDevInitFlag()) {
  904. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  905. e->SetHandled();
  906. }
  907. else {
  908. SetWinPosTask* pTask = new SetWinPosTask(this);
  909. pTask->SetContext(pEvt->m_ctx);
  910. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  911. e->SetHandled();
  912. }
  913. }
  914. break;
  915. }
  916. return uRet;
  917. }
  918. void CHSPScannerFSM::s4_ScanImage_on_entry()
  919. {
  920. }
  921. void CHSPScannerFSM::s4_ScanImage_on_exit()
  922. {
  923. }
  924. unsigned int CHSPScannerFSM::s4_ScanImage_on_event(FSMEvent* e)
  925. {
  926. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s4_on_event: %s(%d), %d.", EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  927. unsigned int uRet = 0;
  928. switch(e->iEvt)
  929. {
  930. /** JS Component [Gifur@20241114]*/
  931. //拍照应该是一瞬间的事情,这个状态很快会结束,JS改造不支持此状态
  932. /** JS Component Done [Gifur@20241114]*/
  933. case USER_EVT_SCANIMAGEFINISHED:
  934. {
  935. uRet = e->param1;
  936. if(uRet == 2 && ++m_nFatalTimes < MAX_ERROR_TIMES)
  937. {
  938. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("hold on, wait next time (%d/%d).", m_nFatalTimes, MAX_ERROR_TIMES);
  939. uRet = 5;
  940. }
  941. else if(uRet == 0)
  942. {
  943. m_nFatalTimes = 0;
  944. }
  945. if(uRet == 5 && IsDevConnected() == 0)
  946. {
  947. PostEventFIFO(new FSMEvent(USER_EVT_DISCONNECT));
  948. }
  949. else if(uRet == 2 || uRet == 4)
  950. {
  951. m_desiredAction = USER_EVT_SCANIMAGE;
  952. }
  953. }
  954. e->SetHandled();
  955. break;
  956. case USER_EVT_DISCONNECT:
  957. {
  958. //jump auto.
  959. }
  960. e->SetHandled();
  961. break;
  962. case USER_EVT_GETSTATUS:
  963. {
  964. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  965. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  966. pTask->SetContext(pEvt->m_ctx);
  967. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  968. }
  969. e->SetHandled();
  970. break;
  971. case USER_EVT_GETINFO:
  972. {
  973. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  974. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  975. pTask->SetContext(pEvt->m_ctx);
  976. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  977. }
  978. e->SetHandled();
  979. break;
  980. }
  981. return uRet;
  982. }
  983. void CHSPScannerFSM::s5_DeviceOff_on_entry()
  984. {
  985. SetDevState(DEVICE_STATUS_CONNECTING);
  986. SetLastUserCode(HSPScanner_UserErrorCode_DEVICE_OFFLINE);
  987. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode(MapCode2RTAString(GetLastUserCode()))("高拍仪断开连接!");
  988. m_ullTS4Disconnect = SP::Module::Comm::RVCGetTickCount();
  989. ScheduleTimer(CHECK_CONNECT_TIMER_ID, MILLISECOND_TO_CHECK_CONNECT);
  990. }
  991. void CHSPScannerFSM::s5_DeviceOff_on_exit()
  992. {
  993. SetLastUserCode();
  994. SetDevState(DEVICE_STATUS_NORMAL);
  995. CancelTimer(CHECK_CONNECT_TIMER_ID);
  996. }
  997. unsigned int CHSPScannerFSM::s5_DeviceOff_on_event(FSMEvent* e)
  998. {
  999. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s5_on_event: %s(%d), %d.", EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  1000. unsigned int uRet = 0;
  1001. switch(e->iEvt)
  1002. {
  1003. /** JS Component [Gifur@20241112]*/
  1004. case USER_EVT_STARTPREVIEW_JS:
  1005. {
  1006. JS::StartPreviewEvent* pEvt = dynamic_cast<JS::StartPreviewEvent*>(e);
  1007. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_StartPreviewJS).setResultCode(MapCode2RTAString(GetLastUserCode()))("[USER_EVT_STARTPREVIEW_JS] 高拍仪断开连接");
  1008. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  1009. pEvt->SetHandled();
  1010. }
  1011. break;
  1012. case USER_EVT_CANCELPREVIEW_JS:
  1013. {
  1014. JS::CancelPreviewEvent* pEvt = dynamic_cast<JS::CancelPreviewEvent*>(e);
  1015. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_CancelPreviewJS).setResultCode(MapCode2RTAString(GetLastUserCode()))("[USER_EVT_CANCELPREVIEW_JS] 高拍仪断开连接");
  1016. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  1017. pEvt->SetHandled();
  1018. }
  1019. break;
  1020. case USER_EVT_SCANIMAGE_JS:
  1021. {
  1022. JS::ScanImageEvent* pEvt = dynamic_cast<JS::ScanImageEvent*>(e);
  1023. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_ScanImageJS).setResultCode(MapCode2RTAString(GetLastUserCode()))("[USER_EVT_SCANIMAGE_JS] 高拍仪断开连接");
  1024. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  1025. pEvt->SetHandled();
  1026. }
  1027. break;
  1028. case USER_EVT_SETPARAM_JS:
  1029. {
  1030. JS::SetParamEvent* pEvt = dynamic_cast<JS::SetParamEvent*>(e);
  1031. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_SetParamJS).setResultCode(MapCode2RTAString(GetLastUserCode()))("[USER_EVT_SETPARAM_JS] 高拍仪断开连接");
  1032. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  1033. pEvt->SetHandled();
  1034. }
  1035. break;
  1036. /** JS Compoent Done [Gifur@20241112]*/
  1037. case EVT_TIMER:
  1038. {
  1039. if (e->param1 == CHECK_CONNECT_TIMER_ID) {
  1040. HspsDevStatus status = { 0 };
  1041. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  1042. ErrorCodeEnum eResult = m_hDevHelper->GetDevStatus(status);
  1043. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  1044. if (ISSUCCEEDED(eResult)) {
  1045. 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);
  1046. if (status.isConnected == 0) {
  1047. ScheduleTimer(CHECK_CONNECT_TIMER_ID, MILLISECOND_TO_CHECK_CONNECT);
  1048. }
  1049. else {
  1050. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setCostTime(SP::Module::Comm::RVCGetTickCount() - m_ullTS4Disconnect)("高拍仪恢复连接");
  1051. if (status.inShow == 1 && status.inPreview == 1) {
  1052. //回到预览状态
  1053. uRet = 2;
  1054. }
  1055. else if (status.inShow == 0 && status.inPreview == 1) {
  1056. uRet = 3;
  1057. }
  1058. else {
  1059. uRet = 1;
  1060. }
  1061. }
  1062. } else {
  1063. //RTA2N09
  1064. SetErrorAndLog(eResult, MEC_DEVAPI_HSPSCANNER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, false, ullEnd - ullStart);
  1065. }
  1066. e->SetHandled();
  1067. }
  1068. }
  1069. break;
  1070. case USER_EVT_GETSTATUS:
  1071. {
  1072. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  1073. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  1074. pTask->SetContext(pEvt->m_ctx);
  1075. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1076. }
  1077. e->SetHandled();
  1078. break;
  1079. case USER_EVT_GETINFO:
  1080. {
  1081. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  1082. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  1083. pTask->SetContext(pEvt->m_ctx);
  1084. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1085. }
  1086. e->SetHandled();
  1087. break;
  1088. case USER_EVT_SETWINPOS:
  1089. {
  1090. SetWinPosEvent* pEvt = dynamic_cast<SetWinPosEvent*>(e);
  1091. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  1092. }
  1093. e->SetHandled();
  1094. break;
  1095. }
  1096. return uRet;
  1097. }
  1098. void CHSPScannerFSM::s6_HidePreview_on_entry()
  1099. {
  1100. m_dupFlag4ExitCancel = false;
  1101. }
  1102. void CHSPScannerFSM::s6_HidePreview_on_exit()
  1103. {
  1104. m_dupFlag4ExitCancel = false;
  1105. }
  1106. unsigned int CHSPScannerFSM::s6_HidePreview_on_event(FSMEvent* e)
  1107. {
  1108. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s6_HidePreview_on_event: %s, %d.", EvtTypeToString(e->iEvt), e->param1);
  1109. unsigned int uRet = 0;
  1110. switch(e->iEvt)
  1111. {
  1112. /*JS Component*/
  1113. case USER_EVT_STARTPREVIEW_JS:
  1114. {
  1115. JS::StartPreviewEvent* pEvt = dynamic_cast<JS::StartPreviewEvent*>(e);
  1116. HspsDevStatus status = { 0 };
  1117. GetDevStatusFromAdapter(status);
  1118. JS::PreviewSettings settings(pEvt->m_ctx->Req);
  1119. settings.SetDisplay(true);
  1120. ErrorCodeEnum erroCode = SetPreviewProperty(settings, HSPScannerService_LogCode_StartPreviewJS);
  1121. if (FAILURED(erroCode)) {
  1122. pEvt->m_ctx->Answer(Error_Unexpect, GetLastUserCode());
  1123. uRet = 0;
  1124. }
  1125. else {
  1126. ToSwithLight();
  1127. pEvt->m_ctx->Answer(Error_Succeed);
  1128. uRet = 1;
  1129. }
  1130. e->SetHandled();
  1131. }
  1132. break;
  1133. case USER_EVT_CANCELPREVIEW_JS:
  1134. {
  1135. JS::CancelPreviewEvent* pEvt = dynamic_cast<JS::CancelPreviewEvent*>(e);
  1136. if (pEvt->m_ctx->Req.hide) {
  1137. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_CancelPreviewJS)("current state is already hide preview");
  1138. pEvt->m_ctx->Answer(Error_Succeed);
  1139. }
  1140. else {
  1141. m_dupFlag4ExitCancel = true;
  1142. JS::CancelPreviewTask* pTask = new JS::CancelPreviewTask(this);
  1143. pTask->SetContext(pEvt->m_ctx);
  1144. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1145. }
  1146. e->SetHandled();
  1147. }
  1148. break;
  1149. case USER_EVT_STARTPREVIEW_JS_DONE:
  1150. {
  1151. uRet = e->param1;
  1152. e->SetHandled();
  1153. }
  1154. break;
  1155. case USER_EVT_CANCELPREVIEW_JS_DONE:
  1156. {
  1157. m_dupFlag4ExitCancel = false;
  1158. uRet = e->param1;
  1159. e->SetHandled();
  1160. }
  1161. break;
  1162. case USER_EVT_SCANIMAGE_JS:
  1163. {
  1164. JS::ScanImageTask* pTask = new JS::ScanImageTask(this);
  1165. JS::ScanImageEvent* pEvt = dynamic_cast<JS::ScanImageEvent*>(e);
  1166. pTask->SetContext(pEvt->m_ctx);
  1167. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1168. e->SetHandled();
  1169. }
  1170. break;
  1171. case USER_EVT_SETPARAM_JS:
  1172. {
  1173. JS::SetParamTask* pTask = new JS::SetParamTask(this);
  1174. JS::SetParamEvent* pEvt = dynamic_cast<JS::SetParamEvent*>(e);
  1175. pTask->SetContext(pEvt->m_ctx);
  1176. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1177. e->SetHandled();
  1178. }
  1179. break;
  1180. /*JS Component Done*/
  1181. case USER_EVT_STARTPREVIEW:
  1182. {
  1183. StartPreviewTask* pTask = new StartPreviewTask(this);
  1184. StartPreviewEvent* pEvt = dynamic_cast<StartPreviewEvent*>(e);
  1185. pTask->SetContext(pEvt->m_ctx);
  1186. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1187. e->SetHandled();
  1188. }
  1189. break;
  1190. case USER_EVT_STARTPREVIEW_FINISHED:
  1191. {
  1192. uRet = e->param1;
  1193. e->SetHandled();
  1194. if (uRet == 1 && ++m_nFatalTimes < MAX_ERROR_TIMES) {
  1195. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("hold on, wait next time (%d/%d).", m_nFatalTimes, MAX_ERROR_TIMES);
  1196. uRet = 2;
  1197. } else if (uRet == 0) {
  1198. m_nFatalTimes = 0;
  1199. }
  1200. if (uRet == 2 && IsDevConnected() == 0) {
  1201. PostEventFIFO(new FSMEvent(USER_EVT_DISCONNECT));
  1202. } else if (uRet == 1) {
  1203. m_desiredAction = USER_EVT_STARTPREVIEW;
  1204. }
  1205. }
  1206. break;
  1207. case USER_EVT_SETPROPERTY:
  1208. {
  1209. SetPropertyEvent* pEvt = dynamic_cast<SetPropertyEvent*>(e);
  1210. SetProperty(pEvt->m_ctx);
  1211. e->SetHandled();
  1212. }
  1213. break;
  1214. case USER_EVT_STOPPREVIEW:
  1215. {
  1216. StopPreviewEvent* pEvt = dynamic_cast<StopPreviewEvent*>(e);
  1217. if(!pEvt->m_ctx->Req.bOnlyHide)
  1218. {//业务在s6状态仅能进行彻底取消预览的操作
  1219. m_dupFlag4ExitCancel = true;
  1220. StopPreviewTask* pTask = new StopPreviewTask(this);
  1221. pTask->SetContext(pEvt->m_ctx);
  1222. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1223. e->SetHandled();
  1224. }
  1225. }
  1226. break;
  1227. case USER_EVT_STOPPREVIEW_FINISHED:
  1228. {
  1229. m_dupFlag4ExitCancel = false;
  1230. uRet = e->param1;
  1231. if (uRet == 0 && ++m_nFatalTimes < MAX_ERROR_TIMES) {
  1232. uRet = 3;
  1233. } else if (uRet != 0) {
  1234. m_nFatalTimes = 0;
  1235. }
  1236. if (uRet == 3 && IsDevConnected() == 0) {
  1237. PostEventFIFO(new FSMEvent(USER_EVT_DISCONNECT));
  1238. }
  1239. }
  1240. e->SetHandled();
  1241. break;
  1242. case USER_EVT_SETWINPOS:
  1243. {
  1244. SetWinPosEvent* pEvt = dynamic_cast<SetWinPosEvent*>(e);
  1245. if(pEvt->m_ctx->Req.type == 2)
  1246. {//在s6状态,不允许进行显示和隐藏操作,业务必须通过XXXPreview来进行显示隐藏操作
  1247. SetWinPosTask* pTask = new SetWinPosTask(this);
  1248. pTask->SetContext(pEvt->m_ctx);
  1249. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1250. e->SetHandled();
  1251. }
  1252. }
  1253. break;
  1254. case USER_EVT_DISCONNECT:
  1255. {
  1256. //jump auto.
  1257. }
  1258. e->SetHandled();
  1259. break;
  1260. case USER_EVT_GETSTATUS:
  1261. {
  1262. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  1263. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  1264. pTask->SetContext(pEvt->m_ctx);
  1265. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1266. }
  1267. e->SetHandled();
  1268. break;
  1269. case USER_EVT_GETINFO:
  1270. {
  1271. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  1272. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  1273. pTask->SetContext(pEvt->m_ctx);
  1274. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1275. }
  1276. e->SetHandled();
  1277. break;
  1278. case EVT_MAINPAGE_DISPLAY:
  1279. case USER_EVT_EXIT:
  1280. {
  1281. e->SetHandled();
  1282. if (m_dupFlag4ExitCancel) {
  1283. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s::recv %s while CancelPreviewing", __FUNCTION__, EvtTypeToString(e->iEvt));
  1284. uRet = 1;
  1285. }
  1286. }
  1287. break;
  1288. }
  1289. return uRet;
  1290. }
  1291. void CHSPScannerFSM::s7_Exit_on_entry()
  1292. {
  1293. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Enter s7_Exit");
  1294. ExitClearTask* pTask = new ExitClearTask(this);
  1295. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1296. }
  1297. void CHSPScannerFSM::s7_Exit_on_exit()
  1298. {
  1299. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Leave s7_Exit");
  1300. }
  1301. //TODO: [Gifur@20241114]
  1302. unsigned int CHSPScannerFSM::s7_Exit_on_event(FSMEvent* e)
  1303. {
  1304. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s7_Exit_on_event: %s(%d), %d.", EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  1305. unsigned int uRet = 0;
  1306. switch(e->iEvt)
  1307. {
  1308. case USER_EVT_EXIT_FINISHED:
  1309. {
  1310. uRet = e->param1;
  1311. if (uRet == 1) {
  1312. HspsDevStatus status = { 0 };
  1313. if (ISSUCCEEDED(GetDevStatusFromAdapter(status))) {
  1314. if (status.inPreview) {
  1315. if (status.inShow)
  1316. uRet = 2;
  1317. else uRet = 3;
  1318. } else if (!status.isConnected) {
  1319. uRet = 4;
  1320. }
  1321. else {
  1322. uRet = 0;
  1323. }
  1324. }
  1325. }
  1326. }
  1327. e->SetHandled();
  1328. break;
  1329. case USER_EVT_GETSTATUS:
  1330. {
  1331. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  1332. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  1333. pTask->SetContext(pEvt->m_ctx);
  1334. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1335. }
  1336. e->SetHandled();
  1337. break;
  1338. case USER_EVT_GETINFO:
  1339. {
  1340. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  1341. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  1342. pTask->SetContext(pEvt->m_ctx);
  1343. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1344. }
  1345. e->SetHandled();
  1346. break;
  1347. default:
  1348. {
  1349. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("%s::UnHandle event ! %s", __FUNCTION__, EvtTypeToString(e->iEvt));
  1350. break;
  1351. }
  1352. }
  1353. return uRet;
  1354. }
  1355. void CHSPScannerFSM::s8_Init_on_entry()
  1356. {
  1357. SetLastUserCode(LOG_WARN_HSPS_OPENING_NOW);
  1358. GetEntityBase()->GetFunction()->PostThreadPoolTask(new InitTask(this));
  1359. }
  1360. void CHSPScannerFSM::s8_Init_on_exit()
  1361. {
  1362. }
  1363. unsigned int CHSPScannerFSM::s8_Init_on_event(FSMEvent* e)
  1364. {
  1365. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s8_Init_on_event: %s(%d), %d.", EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  1366. unsigned int uRet = 0;
  1367. switch (e->iEvt) {
  1368. /** JS Component [Gifur@20241112]*/
  1369. case USER_EVT_STARTPREVIEW_JS:
  1370. {
  1371. JS::StartPreviewEvent* pEvt = dynamic_cast<JS::StartPreviewEvent*>(e);
  1372. pEvt->SetHandled();
  1373. pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
  1374. }
  1375. break;
  1376. case USER_EVT_CANCELPREVIEW_JS:
  1377. {
  1378. JS::CancelPreviewEvent* pEvt = dynamic_cast<JS::CancelPreviewEvent*>(e);
  1379. pEvt->SetHandled();
  1380. pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
  1381. }
  1382. break;
  1383. case USER_EVT_SCANIMAGE_JS:
  1384. {
  1385. JS::ScanImageEvent* pEvt = dynamic_cast<JS::ScanImageEvent*>(e);
  1386. pEvt->SetHandled();
  1387. pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
  1388. }
  1389. break;
  1390. case USER_EVT_SETPARAM_JS:
  1391. {
  1392. JS::SetParamEvent* pEvt = dynamic_cast<JS::SetParamEvent*>(e);
  1393. pEvt->SetHandled();
  1394. pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
  1395. }
  1396. break;
  1397. /** JS Compoent Done [Gifur@20241112]*/
  1398. case USER_EVT_STARTPREVIEW:
  1399. {
  1400. StartPreviewEvent* pEvt = dynamic_cast<StartPreviewEvent*>(e);
  1401. pEvt->SetHandled();
  1402. pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
  1403. }
  1404. break;
  1405. case USER_EVT_STOPPREVIEW:
  1406. {
  1407. StopPreviewEvent* pEvt = dynamic_cast<StopPreviewEvent*>(e);
  1408. pEvt->SetHandled();
  1409. pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
  1410. }
  1411. break;
  1412. case USER_EVT_SCANIMAGE:
  1413. {
  1414. ScanImageEvent* pEvt = dynamic_cast<ScanImageEvent*>(e);
  1415. pEvt->SetHandled();
  1416. pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
  1417. }
  1418. break;
  1419. case USER_EVT_SCANIMAGE_EX:
  1420. {
  1421. ScanImageExEvent* pEvt = dynamic_cast<ScanImageExEvent*>(e);
  1422. pEvt->SetHandled();
  1423. pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
  1424. }
  1425. break;
  1426. case USER_EVT_SHOWPROPERTY:
  1427. {
  1428. ShowPropertyEvent* pEvt = dynamic_cast<ShowPropertyEvent*>(e);
  1429. pEvt->SetHandled();
  1430. pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
  1431. }
  1432. break;
  1433. case USER_EVT_SETPROPERTY:
  1434. {
  1435. SetPropertyEvent* pEvt = dynamic_cast<SetPropertyEvent*>(e);
  1436. pEvt->SetHandled();
  1437. pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
  1438. }
  1439. break;
  1440. case USER_EVT_SETWINPOS:
  1441. {
  1442. SetWinPosEvent* pEvt = dynamic_cast<SetWinPosEvent*>(e);
  1443. pEvt->SetHandled();
  1444. pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
  1445. }
  1446. break;
  1447. case USER_EVT_GETSTATUS:
  1448. {
  1449. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  1450. pEvt->SetHandled();
  1451. pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
  1452. }
  1453. break;
  1454. case USER_EVT_GOTOHELL:
  1455. {
  1456. e->SetHandled();
  1457. }
  1458. break;
  1459. case USER_EVT_INIT_FINISHED:
  1460. {
  1461. e->SetHandled();
  1462. }
  1463. break;
  1464. default:
  1465. break;
  1466. }
  1467. return uRet;
  1468. }
  1469. int CHSPScannerFSM::StartPreview(SpReqAnsContext<HSPScannerService_StartPreview_Req,
  1470. HSPScannerService_StartPreview_Ans>::Pointer ctx)
  1471. {
  1472. bool nRes = 0;
  1473. ErrorCodeEnum erroCode = Error_Unexpect;
  1474. SetLastUserCode();
  1475. if (ctx->Req.colorType || ctx->Req.scanType || ctx->Req.rotateType) {
  1476. const int retCode = SetPreviewParam(ctx->Req.colorType, ctx->Req.rotateType, ctx->Req.scanType);
  1477. if (retCode != 0)
  1478. {
  1479. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("SetPreviewParam return some wrong:0x%X", retCode);
  1480. erroCode = Error_DevCommFailed;
  1481. }
  1482. else {
  1483. erroCode = Error_Succeed;
  1484. }
  1485. }
  1486. HspsDevStatus status = { 0 };
  1487. erroCode = GetDevStatusFromAdapter(status);
  1488. if (ISSUCCEEDED(erroCode) && status.inPreview) {// 用于s6状态 [Josephus in 9:33:48 2016/11/22]
  1489. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  1490. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_VIEW, HSPS_VIEW_SHOW);
  1491. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  1492. if (ISSUCCEEDED(erroCode)) {
  1493. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_StartPreview).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)("HSPS_VIEW_SHOW");
  1494. } else {
  1495. //RTA2N0R
  1496. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetParam, "DevAdapter::SetParam", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_StartPreview, CombineJsonContext("HSPS_VIEW_SHOW"));
  1497. const DWORD dwCode = GetAlarmDEC();
  1498. CSimpleStringA tmpRTA(true), tmpDesc(true);
  1499. if (GetEntityBase()->GetFunction()->GetVTMErrMsg(dwCode, tmpDesc, tmpRTA) == Error_Succeed)
  1500. DbgToBeidou(ctx->link, "StartPreview::SetParam").setReturnCode(tmpRTA)();
  1501. SetLastUserCode(dwCode);
  1502. }
  1503. } else if (ISSUCCEEDED(erroCode)) {
  1504. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  1505. erroCode = m_hDevHelper->SetPreview(1);
  1506. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  1507. if (FAILURED(erroCode)) {
  1508. //RTA2N03
  1509. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetPreview_Open, "DevAdapter::SetPreview", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_StartPreview, CombineJsonContext4SetPreview(true, "StartPreview"));
  1510. SetLastUserCode(GetAlarmDEC());
  1511. } else {
  1512. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_StartPreview).setAPI("DevAdapter::SetPreview").setCostTime(ullEnd - ullStart)(CombineJsonContext4SetPreview(true, "StartPreview"));
  1513. }
  1514. }
  1515. if (FAILURED(erroCode)) {
  1516. nRes = 1;
  1517. } else {
  1518. /** 无论如何都打开一次灯,所以这里应该是有所冗余的 [Gifur@2025325]*/
  1519. ToSwithLight();
  1520. }
  1521. ctx->Answer(erroCode, GetLastUserCode());
  1522. return nRes;
  1523. }
  1524. int CHSPScannerFSM::StopPreview(SpReqAnsContext<HSPScannerService_CancelPreview_Req,
  1525. HSPScannerService_CancelPreview_Ans>::Pointer ctx)
  1526. {
  1527. ErrorCodeEnum erroCode = Error_Unexpect;
  1528. int nRes = 0;
  1529. if (ctx->Req.bOnlyHide) {
  1530. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  1531. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_VIEW, HSPS_VIEW_HIDE);
  1532. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  1533. if (ISSUCCEEDED(erroCode)) {
  1534. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_CancelPreview).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)("HSPS_VIEW_HIDE");
  1535. nRes = 1;
  1536. } else {
  1537. //RTA2N0Q
  1538. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetParam, "DevAdapter::SetParam", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_CancelPreview, CombineJsonContext("HSPS_VIEW_HIDE"));
  1539. SetLastUserCode(GetAlarmDEC());
  1540. nRes = 4;
  1541. }
  1542. }
  1543. else
  1544. {
  1545. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  1546. erroCode = m_hDevHelper->SetPreview(0);
  1547. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  1548. if (ISSUCCEEDED(erroCode)) {
  1549. nRes = 2;
  1550. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_CancelPreview).setAPI("DevAdapter::SetPreview").setCostTime(ullEnd - ullStart)(CombineJsonContext4SetPreview(false));
  1551. } else {
  1552. //RTA2N04
  1553. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetPreview_Close, "DevAdapter::SetPreview", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_CancelPreview, CombineJsonContext4SetPreview(false));
  1554. const DWORD dwCode = GetAlarmDEC();
  1555. CSimpleStringA tmpRTA(true), tmpDesc(true);
  1556. if (GetEntityBase()->GetFunction()->GetVTMErrMsg(dwCode, tmpDesc, tmpRTA) == Error_Succeed)
  1557. DbgToBeidou(ctx->link, __FUNCTION__).setReturnCode(tmpRTA)();
  1558. SetLastUserCode(dwCode);
  1559. }
  1560. }
  1561. if (ISSUCCEEDED(erroCode)) {
  1562. /** 取消预览时如果仅仅是隐藏也会关闭灯 [Gifur@2025325]*/
  1563. ToSwithLight(false);
  1564. }
  1565. ctx->Answer(erroCode, GetLastUserCode());
  1566. return nRes;
  1567. }
  1568. bool CHSPScannerFSM::ResizeImage(const CSimpleStringA& fileName, int kbSize, long& originSize, CSimpleStringA& retMsg)
  1569. {
  1570. double rate; //limit rate
  1571. int width;
  1572. int height;
  1573. originSize = 0;
  1574. const int imageSize = kbSize * 1024;
  1575. if (imageSize == 0) return TRUE;
  1576. FILE* fHandle = fopen(fileName.GetData(), "rb");
  1577. if (!fHandle) {
  1578. retMsg = CSimpleStringA::Format("fopen image %s failed: %d", fileName.GetData(), errno);
  1579. return FALSE;
  1580. }
  1581. fseek(fHandle, 0, SEEK_END);
  1582. long fileSize = ftell(fHandle);
  1583. fclose(fHandle);
  1584. originSize = fileSize;
  1585. if (fileSize <= (imageSize)) {
  1586. return TRUE;
  1587. }
  1588. CSimpleStringA backUpFile, backUpPath;
  1589. m_pEntity->GetFunction()->GetPath("Temp", backUpPath);
  1590. backUpFile = backUpPath + SPLIT_SLASH_STR + "backupHSPSCannerImage";
  1591. DeleteFileIfExisted(backUpFile);
  1592. fileutil_copy_file((LPCTSTR)backUpFile, (LPCTSTR)fileName);
  1593. bool success = TRUE;
  1594. while (fileSize > imageSize)
  1595. {
  1596. rate = (double)fileSize / imageSize;
  1597. rate = 1.0 / sqrt(rate); //width and height limit rate
  1598. cv::Mat img = cv::imread(fileName.GetData());
  1599. if (!img.data) {
  1600. retMsg = CSimpleStringA::Format("Opencv READ failed!");
  1601. success = FALSE;
  1602. break;
  1603. }
  1604. width = img.cols;
  1605. height = img.rows;
  1606. cv::resize(img, img, cv::Size(width * rate, height * rate));
  1607. const bool openwrite = cv::imwrite(fileName.GetData(), img);
  1608. if (!openwrite) {
  1609. retMsg = CSimpleStringA::Format("Opencv WRITE failed!");
  1610. success = FALSE;
  1611. break;
  1612. }
  1613. fHandle = fopen(fileName.GetData(), "rb");
  1614. fseek(fHandle, 0, SEEK_END);
  1615. fileSize = ftell(fHandle);
  1616. fclose(fHandle);
  1617. Sleep(2);
  1618. }
  1619. if (!success) {
  1620. fileutil_copy_file((LPCTSTR)fileName, (LPCTSTR)backUpFile); //recover original img
  1621. DeleteFileIfExisted(backUpFile);
  1622. return FALSE;
  1623. }
  1624. fileSize = fileSize / 1024;
  1625. DeleteFileIfExisted(backUpFile);
  1626. return TRUE;
  1627. }
  1628. int CHSPScannerFSM::ScanImage(SpReqAnsContext<HSPScannerService_ScanImage_Req,
  1629. HSPScannerService_ScanImage_Ans>::Pointer ctx)
  1630. {
  1631. int nRes = 0;
  1632. ErrorCodeEnum erroCode = Error_Unexpect;
  1633. CSimpleStringA csImageFile;
  1634. GetCurImageName(csImageFile);
  1635. BOOL bRet = DelAndGetNewFileName(csImageFile);
  1636. if (!bRet) {
  1637. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_ScanImage).setResultCode(MapCode2RTAString(HSPScanner_UserErrorCode_CLEAR_RESOURCE_FAILED))("Cleare previous image failed before ScanImage");
  1638. ctx->Answer(Error_Resource, HSPScanner_UserErrorCode_CLEAR_RESOURCE_FAILED);
  1639. return 1;
  1640. }
  1641. long pictureSize(0), resizeSize(0);
  1642. ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  1643. erroCode = m_hDevHelper->ScanImage((LPCTSTR)csImageFile);
  1644. ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  1645. if (ISSUCCEEDED(erroCode)) {
  1646. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::ScanImage").setCostTime(ullEnd - ullStart)();
  1647. CSimpleStringA resizeMsg(true);
  1648. if (ExistsFileA(csImageFile) && !ResizeImage(csImageFile, m_dwMaxImageSize, pictureSize, resizeMsg)) {
  1649. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setResultCode(MapCode2RTAString(LOG_WARN_HSPS_RESIZE_IMAGE_FILE_FAILED)).setAPI(__FUNCTION__)("Resize image failed:%s", resizeMsg.GetData());
  1650. }
  1651. ctx->Ans.filePath = csImageFile;
  1652. CBlob& cbData = ctx->Ans.imageData;
  1653. const DWORD tmpCode(HSPScanner_UserErrorCode_READ_IMAGE_FILE_FAILED);
  1654. FILE* fHandle = fopen(csImageFile, "rb");
  1655. if (fHandle) {
  1656. fseek(fHandle, 0, SEEK_END);
  1657. long fileSize = ftell(fHandle);
  1658. if (fileSize <= 0) {
  1659. LogWarn(Severity_Middle, Error_NotExist, HSPScanner_UserErrorCode_READ_IMAGE_FILE_ZERO, CSimpleStringA::Format("ftell(%s) error after invoking scanimage: %ld.", (LPCTSTR)csImageFile, fileSize));
  1660. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_ScanImage).setResultCode(MapCode2RTAString(HSPScanner_UserErrorCode_READ_IMAGE_FILE_ZERO))("ftell(%s) error after invoking scanimage: %ld.", (LPCTSTR)csImageFile, fileSize);
  1661. erroCode = Error_NotExist;
  1662. fclose(fHandle);
  1663. nRes = 4;
  1664. } else {
  1665. resizeSize = fileSize;
  1666. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("picture size:%ld", resizeSize);
  1667. cbData.Alloc(fileSize);
  1668. fseek(fHandle, 0, SEEK_SET);
  1669. fread(cbData.m_pData, 1, fileSize, fHandle);
  1670. fclose(fHandle);
  1671. }
  1672. } else {
  1673. erroCode = Error_Resource;
  1674. const int lasterr = errno;
  1675. LogWarn(Severity_Middle, Error_Resource, tmpCode, CSimpleStringA::Format("fopen(%s) failed after invoking scanimage: %d", (LPCTSTR)csImageFile, lasterr));
  1676. SetLastUserCode(tmpCode);
  1677. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_ScanImage).setResultCode(MapCode2RTAString(tmpCode))("fopen(%s) failed after invoking scanimage: %d", (LPCTSTR)csImageFile, lasterr);
  1678. nRes = 4;
  1679. }
  1680. if (ISSUCCEEDED(erroCode)) {
  1681. // Additional ChangeTo Hide --Josephus at 11:32:29 2016/11/22
  1682. if (true/*TODO: */) {
  1683. ullStart = SP::Module::Comm::RVCGetTickCount();
  1684. ErrorCodeEnum eHide = m_hDevHelper->SetParam(HSPS_MODEL_VIEW, HSPS_VIEW_HIDE);
  1685. ullEnd = SP::Module::Comm::RVCGetTickCount();
  1686. if (ISSUCCEEDED(eHide)) {
  1687. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)("HSPS_VIEW_HIDE");
  1688. nRes = 6;
  1689. } else {
  1690. //RTA2N0Q
  1691. SetErrorAndLog(eHide, MEC_DEVAPI_HSPSCANNER_SetParam, "DevAdapter::SetParam", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, "", CombineJsonContext("HSPS_VIEW_HIDE"));
  1692. }
  1693. /** 拍照成功虽然隐藏了但没有关闭灯 [Gifur@2025325]*/
  1694. }
  1695. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_ScanImage).setAPI(__FUNCTION__)("ScanImage succ, originalPicSize:%ld, resizePicSize:%ld", pictureSize, resizeSize);
  1696. }
  1697. ctx->Answer(erroCode, GetLastUserCode());
  1698. } else {
  1699. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_ScanImage, "DevAdapter::ScanImage", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_ScanImage);
  1700. SetLastUserCode(GetAlarmDEC());
  1701. ctx->Answer(erroCode, GetLastUserCode());
  1702. nRes = 2;
  1703. }
  1704. ClearPictureFileSure(1);
  1705. return nRes;
  1706. }
  1707. int CHSPScannerFSM::ScanImageEx(SpReqAnsContext<HSPScannerService_ScanImageEx_Req,
  1708. HSPScannerService_ScanImageEx_Ans>::Pointer ctx)
  1709. {
  1710. int nRes = 0;
  1711. ErrorCodeEnum erroCode = Error_Unexpect;
  1712. CSimpleStringA csImageFile;
  1713. GetCurImageName(csImageFile, true);
  1714. BOOL bRet = DelAndGetNewFileName(csImageFile);
  1715. if (!bRet) {
  1716. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setResultCode(MapCode2RTAString(HSPScanner_UserErrorCode_CLEAR_RESOURCE_FAILED))("Cleare previous image failed before ScanImageEx");
  1717. ctx->Answer(Error_Resource, HSPScanner_UserErrorCode_CLEAR_RESOURCE_FAILED);
  1718. return 1;
  1719. }
  1720. int len = 0;
  1721. BYTE* pBtImage = NULL;
  1722. LogWarn(Severity_Low, Error_Debug, LOG_DEBUG_HSPS_CRITICAL_OPERATION_SCANIMAGEEX_START, "to ScanImageEx...");
  1723. ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  1724. erroCode = m_hDevHelper->ScanImageEx(pBtImage, len, (LPCTSTR)csImageFile);
  1725. ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  1726. if(erroCode == Error_TooSmallBuffer) {
  1727. if (pBtImage) {
  1728. delete pBtImage;
  1729. pBtImage = NULL;
  1730. }
  1731. len += MAX_IMAGEDATA_SUFFIX;
  1732. pBtImage = new BYTE[len+1];
  1733. if (pBtImage == NULL) {
  1734. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode(HSPScannerService_LogCode_ScanImageEx).setResultCode("RTA2N0T")("new buffer[%d] failed %d.", len + 1, GetLastError());
  1735. ctx->Answer(Error_Resource);
  1736. return 3;
  1737. }
  1738. memset((void*)pBtImage, 0, len+1);
  1739. ullStart = SP::Module::Comm::RVCGetTickCount();
  1740. erroCode = m_hDevHelper->ScanImageEx(pBtImage, len, (LPCTSTR)csImageFile);
  1741. ullEnd = SP::Module::Comm::RVCGetTickCount();
  1742. if (erroCode == Error_Succeed) {
  1743. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::ScanImageEx").setCostTime(ullEnd - ullStart)("len: %d, btLen:%d.", len, strlen((const char*)pBtImage));
  1744. }
  1745. }
  1746. if (ISSUCCEEDED(erroCode)) {
  1747. long pictureSize(0);
  1748. CSimpleStringA resizeMsg(true);
  1749. if (ResizeImage(csImageFile, m_dwMaxImageSize, pictureSize, resizeMsg)) {
  1750. FILE* fHandle = fopen(csImageFile.GetData(), "rb");
  1751. fseek(fHandle, 0, SEEK_END);
  1752. len = ftell(fHandle);
  1753. fseek(fHandle, 0, SEEK_SET);
  1754. if (pBtImage) delete[] pBtImage;
  1755. pBtImage = new BYTE[len];
  1756. fread(pBtImage, 1, len, fHandle);
  1757. fclose(fHandle);
  1758. }
  1759. else {
  1760. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setResultCode(MapCode2RTAString(LOG_WARN_HSPS_RESIZE_IMAGE_FILE_FAILED)).setAPI(__FUNCTION__)("Resize image failed:%s", resizeMsg.GetData());
  1761. }
  1762. ctx->Ans.filePath = csImageFile;
  1763. CBlob& cbData = ctx->Ans.imageData;
  1764. cbData.Alloc((len + 1) * sizeof(BYTE));
  1765. memcpy_s(cbData.m_pData, cbData.m_iLength, pBtImage, len);
  1766. cbData.Resize(len);
  1767. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("ScanImageEx ctx: %s, %d.", (LPCTSTR)ctx->Ans.filePath, ctx->Ans.imageData.m_iLength);
  1768. // Additional ChangeTo Hide --Josephus at 11:29:03 2016/11/22
  1769. if (ISSUCCEEDED(erroCode)) {
  1770. ullStart = SP::Module::Comm::RVCGetTickCount();
  1771. ErrorCodeEnum eHide = m_hDevHelper->SetParam(HSPS_MODEL_VIEW, HSPS_VIEW_HIDE);
  1772. ullEnd = SP::Module::Comm::RVCGetTickCount();
  1773. if (ISSUCCEEDED(eHide)) {
  1774. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)("HSPS_VIEW_HIDE");
  1775. nRes = 6;
  1776. } else {
  1777. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart).setResultCode(MapCode2RTAString(HSPScanner_UserErrorCode_SetParam_Hide))("HSPS_VIEW_HIDE failed: %s", SpStrError(eHide));
  1778. }
  1779. 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);
  1780. }
  1781. ctx->Answer(erroCode);
  1782. } else {
  1783. //RTA2N06
  1784. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_ScanImageEx, "DevAdapter::ScanImageEx", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_ScanImageEx);
  1785. SetLastUserCode(GetAlarmDEC());
  1786. ctx->Answer(erroCode, GetLastUserCode());
  1787. nRes = 2;
  1788. }
  1789. if (pBtImage) {
  1790. delete pBtImage;
  1791. pBtImage = NULL;
  1792. }
  1793. ClearPictureFileSure(2);
  1794. return nRes;
  1795. }
  1796. int CHSPScannerFSM::ShowProperty(SpReqAnsContext<HSPScannerService_ShowProperty_Req,
  1797. HSPScannerService_ShowProperty_Ans>::Pointer ctx)
  1798. {
  1799. ErrorCodeEnum erroCode = Error_Succeed;
  1800. // Return ahead. [Josephus in 15:24:15 2016/11/21]
  1801. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  1802. ErrorCodeEnum ePos = m_hDevHelper->SetViewPos(730, 100, 540);
  1803. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  1804. if (FAILURED(ePos)) {
  1805. //RTA2N07
  1806. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetViewPos, "DevAdapter::SetViewPos", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_ShowProperty);
  1807. } else {
  1808. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_ShowProperty).setAPI("DevAdapter::SetViewPos").setCostTime(ullEnd - ullStart)();
  1809. }
  1810. ctx->Answer(erroCode);
  1811. DWORD dwStart = GetTickCount();
  1812. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Start to show Property dialog...");
  1813. erroCode = m_hDevHelper->SetProperty();
  1814. DWORD dwEnd = GetTickCount();
  1815. if (FAILURED(erroCode)) {
  1816. //RTA2N0U
  1817. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetProperty, "DevAdapter::SetProperty", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_ShowProperty);
  1818. } else {
  1819. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::SetProperty").setCostTime(dwEnd - dwStart)();
  1820. erroCode = m_hDevHelper->SetViewPos(m_nRecX, m_nRecY, m_nRecW);
  1821. }
  1822. return 0;
  1823. }
  1824. int CHSPScannerFSM::SetProperty(SpReqAnsContext<HSPScannerService_SetProperty_Req,
  1825. HSPScannerService_SetProperty_Ans>::Pointer ctx)
  1826. {
  1827. int nRes = 0;
  1828. ErrorCodeEnum erroCode = Error_Succeed;
  1829. int retCode = SetPreviewParam(ctx->Req.colorType, ctx->Req.rotateType, ctx->Req.scanType);
  1830. if (retCode != 0) {
  1831. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_SetProperty).setResultCode(MapCode2RTAString(GetLastUserCode()))("SetParam failed retCode: 0x%X", retCode);
  1832. } else {
  1833. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_SetProperty)("Set Property succ.");
  1834. }
  1835. ctx->Ans.retCode = retCode;
  1836. ctx->Answer(Error_Succeed);
  1837. return nRes;
  1838. }
  1839. int CHSPScannerFSM::SetWinPos(SpReqAnsContext<HSPScannerService_SetWinPos_Req,
  1840. HSPScannerService_SetWinPos_Ans>::Pointer ctx)
  1841. {
  1842. int nRes = 0;
  1843. ErrorCodeEnum erroCode = Error_Unexpect;
  1844. ParamTypeValue value = HSPS_VIEW_SHOW;
  1845. bool bSetCustom = false;
  1846. switch (ctx->Req.type) {
  1847. case 0: value = HSPS_VIEW_HIDE; break;
  1848. case 1: value = HSPS_VIEW_SHOW; break;
  1849. case 2: bSetCustom = true; break;
  1850. default:
  1851. {
  1852. 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);
  1853. ctx->Answer(Error_Param, HSPScanner_UserErrorCode_NOT_SUPPORT);
  1854. return nRes = 3;
  1855. }
  1856. break;
  1857. }
  1858. if (bSetCustom) {
  1859. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  1860. erroCode = m_hDevHelper->SetViewPos(ctx->Req.pointX, ctx->Req.pointY, ctx->Req.nWidth);
  1861. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  1862. if (ISSUCCEEDED(erroCode)) {
  1863. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::SetViewPos").setLogCode(HSPScannerService_LogCode_SetWinPos).setCostTime(ullEnd - ullStart)("x:%d, y:%d, w:%d", ctx->Req.pointX, ctx->Req.pointY, ctx->Req.nWidth);
  1864. m_nRecX = ctx->Req.pointX;
  1865. m_nRecY = ctx->Req.pointY;
  1866. m_nRecW = ctx->Req.nWidth;
  1867. } else {
  1868. //RTA2N07
  1869. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetViewPos, "DevAdapter::SetViewPos", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_SetWinPos);
  1870. SetLastUserCode(GetAlarmDEC());
  1871. nRes = 2;
  1872. }
  1873. } else {
  1874. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  1875. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_VIEW, value);
  1876. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  1877. if (ISSUCCEEDED(erroCode)) {
  1878. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::SetParam").setLogCode(HSPScannerService_LogCode_SetWinPos).setCostTime(ullEnd - ullStart)("%d", value);
  1879. } else {
  1880. //RTA2N02
  1881. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetParam, "DevAdapter::SetParam", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_SetWinPos);
  1882. SetLastUserCode(GetAlarmDEC());
  1883. nRes = 1;
  1884. }
  1885. }
  1886. if (!ISSUCCEEDED(erroCode)) {
  1887. CSimpleStringA tmpRTA(true), tmpDesc(true);
  1888. if (GetEntityBase()->GetFunction()->GetVTMErrMsg(GetLastUserCode(), tmpDesc, tmpRTA) == Error_Succeed)
  1889. DbgToBeidou(ctx->link, "SetWinPos").setReturnCode(tmpRTA)();
  1890. }
  1891. ctx->Answer(erroCode, GetLastUserCode());
  1892. return nRes;
  1893. }
  1894. //JS改造后,作为内部逻辑处理,没有使用该接口
  1895. int CHSPScannerFSM::GetDevStatus(SpReqAnsContext<HSPScannerService_GetDevStatus_Req,
  1896. HSPScannerService_GetDevStatus_Ans>::Pointer ctx)
  1897. {
  1898. int nRes = 0;
  1899. HspsDevStatus status = { 0 };
  1900. ErrorCodeEnum erroCode = GetDevStatusFromAdapter(status, true);
  1901. if (ISSUCCEEDED(erroCode)) {
  1902. ctx->Ans.connected = status.isConnected;
  1903. ctx->Ans.previewing = status.inPreview;
  1904. ctx->Ans.showing = status.inShow;
  1905. }
  1906. else {
  1907. nRes = 1;
  1908. }
  1909. ctx->Answer(erroCode, GetLastUserCode());
  1910. return nRes;
  1911. }
  1912. ErrorCodeEnum CHSPScannerFSM::GetDevStatusFromAdapter(HspsDevStatus& status, bool fromBusiness)
  1913. {
  1914. ErrorCodeEnum erroCode(Error_NotInit);
  1915. if (m_hDevHelper) {
  1916. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  1917. erroCode = m_hDevHelper->GetDevStatus(status);
  1918. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  1919. if (ISSUCCEEDED(erroCode)) {
  1920. DbgWithLink(LOG_LEVEL_DEBUG, fromBusiness ? LOG_TYPE_USER : LOG_TYPE_SYSTEM).setLogCode(fromBusiness ? HSPScannerService_LogCode_GetDevStatus : "").setAPI("DevAdapter::GetDevStatus").setCostTime(ullEnd - ullStart)("{\"connected\": %d, \"previewing\": %d, \"showing\": %d}", status.isConnected, status.inPreview, status.inShow);
  1921. }
  1922. else {
  1923. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, fromBusiness ? IsInBusiness() : false, ullEnd - ullStart, fromBusiness ? HSPScannerService_LogCode_GetDevStatus : "");
  1924. if (fromBusiness) SetLastUserCode(GetAlarmDEC());
  1925. }
  1926. }
  1927. return erroCode;
  1928. }
  1929. int CHSPScannerFSM::GetDevInfo(SpReqAnsContext<HSPScannerService_GetDevInfo_Req,
  1930. HSPScannerService_GetDevInfo_Ans>::Pointer ctx)
  1931. {
  1932. int nRes = 0;
  1933. if (m_bOpening) {
  1934. //如果打开还没有结束,GetDevInfo返回Error_NotInit
  1935. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_GetDevInfo).setResultCode(MapCode2RTAString(LOG_WARN_HSPS_OPENING_NOW)).setAPI(__FUNCTION__)("device is opening");
  1936. ctx->Answer(Error_NotInit, LOG_WARN_HSPS_OPENING_NOW);
  1937. nRes = 1;
  1938. } else if (!m_bOpened) {
  1939. //如果打开失败,GetDevInfo应该返回Error_DevNotAvailable
  1940. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_GetDevInfo).setAPI(__FUNCTION__).setResultCode(MapCode2RTAString(GetLastUserCode()))("高拍仪设备未打开");
  1941. ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  1942. nRes = 1;
  1943. } else {
  1944. //打开成功。GetDevInfo返回Error_Succeed,state放获取模块信息(GetDevCategory这个适配器接口调用)的返回值
  1945. DevCategoryInfo info = { 0 };
  1946. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  1947. ErrorCodeEnum erroCode = m_hDevHelper->GetDevCategory(info);
  1948. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  1949. ctx->Ans.state = (int)(erroCode);
  1950. if (ISSUCCEEDED(erroCode)) {
  1951. ctx->Ans.model = info.szModel;
  1952. ctx->Ans.type = info.szType;
  1953. ctx->Ans.version = CSimpleStringA::Format("%d.%d.%d.%d",
  1954. info.version.wMajor, info.version.wMinor, info.version.wRevision, info.version.wBuild);
  1955. 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"
  1956. , ctx->Ans.model.GetData(), ctx->Ans.state, ctx->Ans.type.GetData(), ctx->Ans.version.GetData());
  1957. }
  1958. else {
  1959. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_GetDevCategory, "DevAdapter::GetDevCategory", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_GetDevInfo);
  1960. SetLastUserCode(GetAlarmDEC());
  1961. nRes = 1;
  1962. }
  1963. ctx->Answer(Error_Succeed);
  1964. }
  1965. return nRes;
  1966. }
  1967. int CHSPScannerFSM::Initial()
  1968. {
  1969. SetDevInitingFlag(true);
  1970. SetDevInitFlag(false);
  1971. ErrorCodeEnum erroCode = LoadUpAdapterLibrary();
  1972. if (erroCode == Error_Succeed) {
  1973. if (Error_Succeed == (erroCode = TryToOpenDevice())) {
  1974. SetDevInitFlag(true);
  1975. SetDevState(DEVICE_STATUS_NORMAL);
  1976. SetDevInitingFlag(false);
  1977. return 0;
  1978. }
  1979. }
  1980. else if (erroCode == Error_NotExist) {
  1981. SetLastUserCode(HSPScanner_UserErrorCode_LOAD_DLLFILE_NOTEIXT);
  1982. }
  1983. else {
  1984. SetLastUserCode(HSPScanner_UserErrorCode_LOAD_DLLFILE_FAILED);
  1985. }
  1986. SetDevInitingFlag(false);
  1987. SetDevInitFlag(false);
  1988. return 1;
  1989. }
  1990. BOOL CHSPScannerFSM::GetCurImageName(CSimpleStringA& csImagName, bool bExt /*= false*/)
  1991. {
  1992. if (bExt) {
  1993. csImagName = "MaterialImageExt.jpg";
  1994. } else {
  1995. csImagName = "MaterialImage.jpg";
  1996. }
  1997. return TRUE;
  1998. }
  1999. BOOL CHSPScannerFSM::DelAndGetNewFileName(CSimpleStringA& csfileName, bool bInBusiness)
  2000. {
  2001. char fileName[MAX_PATH_SIZE] = {0};
  2002. memset(fileName, 0, sizeof(char)*MAX_PATH_SIZE);
  2003. strcpy_s(fileName, MAX_PATH_SIZE, (LPCTSTR)csfileName);
  2004. if (strlen(fileName) == 0 || strchr(fileName, (int)'*') != NULL) {
  2005. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Error input param");
  2006. return FALSE;
  2007. }
  2008. CSimpleStringA strPath, strAimPath;
  2009. m_pEntity->GetFunction()->GetPath("Dep", strPath);
  2010. strAimPath = strPath + SPLIT_SLASH_STR + fileName;
  2011. UpdateAndWarnFileFindInDepBak(strAimPath, fileName, HSPScanner_UserErrorCode_FindFile_in_DepBak);
  2012. csfileName = strAimPath;
  2013. if (ExistsFileA(csfileName)) {
  2014. if (RemoveFileA((LPCTSTR)strAimPath) != 0) {
  2015. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("DeleteFile(%s) suc.", (LPCTSTR)strAimPath);
  2016. return TRUE;
  2017. } else {
  2018. if (bInBusiness) {
  2019. DWORD lastErr = GetLastError();
  2020. if (lastErr == 5) {
  2021. Sleep(100);
  2022. if (!ExistsFileA(csfileName) || RemoveFileA((LPCTSTR)strAimPath) != 0) {
  2023. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("DeleteFile(%s) suc.", (LPCTSTR)strAimPath);
  2024. return TRUE;
  2025. }
  2026. lastErr = GetLastError();
  2027. }
  2028. LogError(Severity_Middle, Error_Unexpect, HSPScanner_UserErrorCode_CLEAR_RESOURCE_FAILED, CSimpleStringA::Format(
  2029. "DeleteFile(%s) failed before ScanImage, LastError(%d).", (LPCTSTR)strAimPath, lastErr));
  2030. } else {
  2031. LogWarn(Severity_High, Error_Unexpect, HSPScanner_UserErrorCode_CLEAR_RESOURCE_FAILED, CSimpleStringA::Format(
  2032. "DeleteFile(%s) failed, LastError(%d).", (LPCTSTR)strAimPath, GetLastError()));
  2033. }
  2034. return FALSE;
  2035. }
  2036. } else {
  2037. return TRUE;
  2038. }
  2039. }
  2040. ErrorCodeEnum CHSPScannerFSM::OnDevExit()
  2041. {
  2042. LOG_FUNCTION();
  2043. ErrorCodeEnum erroCode = Error_Succeed;
  2044. if(m_hDevHelper)
  2045. {
  2046. HspsDevStatus status = { 0 };
  2047. erroCode = GetDevStatusFromAdapter(status);
  2048. if (ISSUCCEEDED(erroCode) && status.isConnected)
  2049. {
  2050. if (status.inPreview) {
  2051. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Invoke cancelPreview...");
  2052. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  2053. erroCode = m_hDevHelper->SetPreview(0);
  2054. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  2055. if (ISSUCCEEDED(erroCode)) {
  2056. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode(__FUNCTION__).setLogCode(CustomLogCode_CancelPreview_Default).setAPI("DevAdapter::SetPreview").setCostTime(ullEnd - ullStart)(CombineJsonContext4SetPreview(false, "OnDevExit"));
  2057. ToSwithLight(false);
  2058. } else {
  2059. //RTA2N04
  2060. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetPreview_Close, "DevAdapter::SetPreview", __FUNCTION__, false, ullEnd - ullStart, CustomLogCode_CancelPreview_Default, CombineJsonContext4SetPreview(false));
  2061. }
  2062. }
  2063. } else if(ISSUCCEEDED(erroCode) && !status.isConnected){
  2064. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("HSPSCanner device is disconnected!");
  2065. }
  2066. }
  2067. ClearPictureFileSure();
  2068. return erroCode;
  2069. }
  2070. void CHSPScannerFSM::SelfTest(EntityTestEnum eTestType,
  2071. CSmartPointer<ITransactionContext> pTransactionContext)
  2072. {
  2073. OnHardwareShakeHand(pTransactionContext);
  2074. }
  2075. void CHSPScannerFSM::OnStateTrans(int iSrcState, int iDstState)
  2076. {
  2077. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("trans from %s to %s", GetStateName(iSrcState), GetStateName(iDstState));
  2078. m_nSrcState = iSrcState;
  2079. }
  2080. int CHSPScannerFSM::StartPreviewJS(SpReqAnsContext<HSPScannerService_StartPreviewJS_Req, HSPScannerService_StartPreviewJS_Ans>::Pointer ctx)
  2081. {
  2082. LOG_FUNCTION();
  2083. ErrorCodeEnum erroCode = Error_Unexpect;
  2084. int ret(0);
  2085. SetLastUserCode();
  2086. if(JS::PreviewSettings(ctx->Req).IsAvailable()) {
  2087. erroCode = SetPreviewProperty(JS::PreviewSettings(ctx->Req), HSPScannerService_LogCode_StartPreviewJS);
  2088. if (FAILURED(erroCode)) {
  2089. ctx->Answer(Error_Unexpect, GetLastUserCode());
  2090. return 1;
  2091. }
  2092. }
  2093. //TODO: [Gifur@2025318]
  2094. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_USER)("Start to Preview...");
  2095. ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  2096. erroCode = m_hDevHelper->SetPreview(1);
  2097. ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  2098. if (FAILURED(erroCode)) {
  2099. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetPreview_Open, "DevAdapter::SetPreview", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_StartPreviewJS, CombineJsonContext4SetPreview(true));
  2100. SetLastUserCode(GetAlarmDEC());
  2101. erroCode = Error_Unexpect;
  2102. ret = 1;
  2103. }
  2104. else {
  2105. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_StartPreviewJS).setAPI("DevAdapter::SetPreview").setCostTime(ullEnd - ullStart)(CombineJsonContext4SetPreview(true, "StartPreview"));
  2106. ToSwithLight();
  2107. }
  2108. ctx->Answer(erroCode, GetLastUserCode());
  2109. return ret;
  2110. }
  2111. int CHSPScannerFSM::CancelPreview(SpReqAnsContext<HSPScannerService_CancelPreviewJS_Req, HSPScannerService_CancelPreviewJS_Ans>::Pointer ctx)
  2112. {
  2113. LOG_FUNCTION();
  2114. ErrorCodeEnum erroCode = Error_Unexpect;
  2115. int ret(0);
  2116. SetLastUserCode();
  2117. if (ctx->Req.hide) {
  2118. erroCode = SetPreviewProperty(JS::PreviewSettings(false), HSPScannerService_LogCode_CancelPreviewJS);
  2119. if (FAILURED(erroCode)) {
  2120. ctx->Answer(Error_Unexpect, GetLastUserCode());
  2121. ret = 1;
  2122. }
  2123. else {
  2124. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_CancelPreviewJS)("HSPS_VIEW_HIDE");
  2125. ctx->Answer(Error_Succeed);
  2126. }
  2127. }
  2128. else {
  2129. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_USER)("Start to CancelPreview...");
  2130. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  2131. erroCode = m_hDevHelper->SetPreview(0);
  2132. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  2133. if (ISSUCCEEDED(erroCode)) {
  2134. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_CancelPreviewJS).setAPI("DevAdapter::SetPreview").setCostTime(ullEnd - ullStart)(CombineJsonContext4SetPreview(false, "JS::CancelPreview"));
  2135. ctx->Answer(Error_Succeed);
  2136. }
  2137. else {
  2138. //RTA2N04
  2139. SetErrorAndLog(erroCode, LOG_EVT_HSPS_CANCEL_PREVIEW_FAILED, "DevAdapter::SetPreview", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_CancelPreviewJS, CombineJsonContext4SetPreview(false));
  2140. SetLastUserCode(GetAlarmDEC());
  2141. ctx->Answer(Error_Unexpect, GetLastUserCode());
  2142. ret = 1;
  2143. }
  2144. }
  2145. if (ISSUCCEEDED(erroCode)) {
  2146. ToSwithLight(false);
  2147. }
  2148. return ret;
  2149. }
  2150. int CHSPScannerFSM::ScanImageJS(SpReqAnsContext<HSPScannerService_ScanImageJS_Req, HSPScannerService_ScanImageJS_Ans>::Pointer ctx)
  2151. {
  2152. LOG_FUNCTION();
  2153. ErrorCodeEnum erroCode = Error_Unexpect;
  2154. int ret(0);
  2155. SetLastUserCode();
  2156. CSimpleStringA csImageFile(true);
  2157. GetCurImageName(csImageFile);
  2158. DelAndGetNewFileName(csImageFile);
  2159. ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  2160. erroCode = m_hDevHelper->ScanImage((LPCTSTR)csImageFile);
  2161. ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  2162. if (ISSUCCEEDED(erroCode)) {
  2163. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::ScanImage").setCostTime(ullEnd - ullStart)();
  2164. long pictureSize(0), resizeSize(0);
  2165. CSimpleStringA resizeMsg(true);
  2166. if (ctx->Req.compress > 0 && ExistsFileA(csImageFile) && !ResizeImage(csImageFile, ctx->Req.compress/*KB*/, pictureSize, resizeMsg)) {
  2167. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setResultCode(MapCode2RTAString(LOG_WARN_HSPS_RESIZE_IMAGE_FILE_FAILED)).setAPI(__FUNCTION__).setLogCode(HSPScannerService_LogCode_ScanImageJS).setCostTime(ullEnd - ullStart)("Resize image failed:%s", resizeMsg.GetData());
  2168. SetLastUserCode(LOG_WARN_HSPS_RESIZE_IMAGE_FILE_FAILED);
  2169. erroCode = Error_Unexpect;
  2170. ret = 1;
  2171. }
  2172. else {
  2173. CSimpleStringA tmpMsg(true);
  2174. DWORD tmpCode(0);
  2175. CBlob& cbData = ctx->Ans.imageData;
  2176. FILE* fHandle = fopen(csImageFile, "rb");
  2177. if (fHandle) {
  2178. fseek(fHandle, 0, SEEK_END);
  2179. long fileSize = ftell(fHandle);
  2180. resizeSize = fileSize;
  2181. if (fileSize <= 0) {
  2182. tmpMsg = CSimpleStringA::Format("ftell(%s) error after invoking scanimage: %ld.", (LPCTSTR)csImageFile, fileSize);
  2183. tmpCode = HSPScanner_UserErrorCode_READ_IMAGE_FILE_ZERO;
  2184. }
  2185. else {
  2186. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("picture size:%ld", fileSize);
  2187. cbData.Alloc(fileSize);
  2188. fseek(fHandle, 0, SEEK_SET);
  2189. fread(cbData.m_pData, 1, fileSize, fHandle);
  2190. }
  2191. fclose(fHandle);
  2192. }
  2193. else {
  2194. tmpMsg = CSimpleStringA::Format("fopen(%s) error after invoking scanimage: %d.", (LPCTSTR)csImageFile, errno);
  2195. tmpCode = HSPScanner_UserErrorCode_READ_IMAGE_FILE_FAILED;
  2196. }
  2197. if (!tmpCode) {//Succ
  2198. if (ctx->Req.hide && FAILURED(SetPreviewProperty(JS::PreviewSettings(false), HSPScannerService_LogCode_ScanImageJS))) {
  2199. erroCode = Error_Unexpect;
  2200. ret = 1;
  2201. }
  2202. else {
  2203. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_ScanImageJS).setAPI(__FUNCTION__)("ScanImage succ, originalPicSize:%ld, resizePicSize:%ld", pictureSize, resizeSize);
  2204. }
  2205. }
  2206. else {
  2207. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_ScanImageJS).setResultCode(MapCode2RTAString(tmpCode))(tmpMsg.GetData());
  2208. SetLastUserCode(tmpCode);
  2209. erroCode = Error_Unexpect;
  2210. ret = 1;
  2211. }
  2212. }
  2213. }
  2214. else {
  2215. SetErrorAndLog(erroCode, LOG_EVT_HSPS_SCANIMAGE_FAILED, "DevAdapter::ScanImage", __FUNCTION__
  2216. , IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_ScanImageJS);
  2217. SetLastUserCode(GetAlarmDEC());
  2218. erroCode = Error_Unexpect;
  2219. ret = 1;
  2220. }
  2221. ctx->Answer(erroCode, GetLastUserCode());
  2222. ClearPictureFileSure(1);
  2223. return ret;
  2224. }
  2225. int CHSPScannerFSM::SetParam(SpReqAnsContext<HSPScannerService_SetParamJS_Req, HSPScannerService_SetParamJS_Ans>::Pointer ctx)
  2226. {
  2227. LOG_FUNCTION();
  2228. ErrorCodeEnum erroCode = Error_Unexpect;
  2229. int ret(0);
  2230. SetLastUserCode();
  2231. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("rotate:%d,scan:%d,color:%d,pos:%d,x:%d,y:%d,w:%d",
  2232. ctx->Req.rotate, ctx->Req.scan, ctx->Req.color, ctx->Req.pos, ctx->Req.pos_x, ctx->Req.pos_y, ctx->Req.pos_w);
  2233. erroCode = SetPreviewProperty(JS::PreviewSettings(ctx->Req), HSPScannerService_LogCode_SetParamJS);
  2234. if (FAILURED(erroCode)) ret = 1;
  2235. ctx->Answer(erroCode, GetLastUserCode());
  2236. return ret;
  2237. }
  2238. ErrorCodeEnum CHSPScannerFSM::SetPreviewProperty(const JS::PreviewSettings& val, const char* logCode)
  2239. {
  2240. ErrorCodeEnum erroCode(Error_Succeed);
  2241. const bool isBusiness = (logCode == NULL || strlen(logCode) == 0) ? false : IsInBusiness();
  2242. if (val.color > 0 && val.color < 4) {
  2243. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  2244. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_COLOR, Param_Color_Map[val.color]);
  2245. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  2246. if (ISSUCCEEDED(erroCode)) {
  2247. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)(ParamValToString(Param_Color_Map[val.color]));
  2248. }
  2249. else {
  2250. SetErrorAndLog(erroCode, HSPScanner_UserErrorCode_SetParam_Color, "DevAdapter::SetParam", __FUNCTION__, isBusiness, ullEnd - ullStart, logCode, CombineJsonContext(ParamValToString(Param_Color_Map[val.color])));
  2251. SetLastUserCode(GetAlarmDEC());
  2252. return Error_Unexpect;
  2253. }
  2254. }
  2255. //////////////////////////////////////////////////////////////////////////
  2256. if (val.rotate > 0 && val.rotate < 5) {
  2257. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  2258. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_ROTATE, Param_Rotate_Map[val.rotate]);
  2259. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  2260. if (ISSUCCEEDED(erroCode)) {
  2261. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)(ParamValToString(Param_Rotate_Map[val.rotate]));
  2262. }
  2263. else {
  2264. SetErrorAndLog(erroCode, HSPScanner_UserErrorCode_SetParam_Rotate, "DevAdapter::SetParam", __FUNCTION__, isBusiness, ullEnd - ullStart, logCode, CombineJsonContext(ParamValToString(Param_Rotate_Map[val.rotate])));
  2265. SetLastUserCode(GetAlarmDEC());
  2266. return Error_Unexpect;
  2267. }
  2268. }
  2269. //////////////////////////////////////////////////////////////////////////
  2270. if (val.scan > 0 && val.scan < 4) {
  2271. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  2272. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_SCANSIZE, Param_Scan_Map[val.scan]);
  2273. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  2274. if (ISSUCCEEDED(erroCode)) {
  2275. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)(ParamValToString(Param_Scan_Map[val.scan]));
  2276. }
  2277. else {
  2278. SetErrorAndLog(erroCode, HSPScanner_UserErrorCode_SetParam_Scan, "DevAdapter::SetParam", __FUNCTION__, isBusiness, ullEnd - ullStart, logCode, CombineJsonContext(ParamValToString(Param_Scan_Map[val.scan])));
  2279. SetLastUserCode(GetAlarmDEC());
  2280. return Error_Unexpect;
  2281. }
  2282. }
  2283. //////////////////////////////////////////////////////////////////////////
  2284. if (val.pos != 0) {
  2285. CSimpleStringA tmpParm = CSimpleStringA::Format("x:%d, y:%d, w:%d", val.pos_x, val.pos_y, val.pos_w);
  2286. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_USER)("Start to SetViewPos %s...", tmpParm.GetData());
  2287. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  2288. erroCode = m_hDevHelper->SetViewPos(val.pos_x, val.pos_y, val.pos_w);
  2289. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  2290. if (ISSUCCEEDED(erroCode)) {
  2291. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::SetViewPos").setCostTime(ullEnd - ullStart)(tmpParm);
  2292. m_nRecX = val.pos_x;
  2293. m_nRecY = val.pos_y;
  2294. m_nRecW = val.pos_w;
  2295. }
  2296. else {
  2297. //RTA2N07
  2298. SetErrorAndLog(erroCode, HSPScanner_UserErrorCode_SetParam_Position, "DevAdapter::SetViewPos", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, logCode, CombineJsonContext(tmpParm));
  2299. SetLastUserCode(GetAlarmDEC());
  2300. return Error_Unexpect;
  2301. }
  2302. }
  2303. //////////////////////////////////////////////////////////////////////////
  2304. if (val.view != 0) {
  2305. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  2306. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_VIEW, Param_View_Map[val.view]);
  2307. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  2308. if (ISSUCCEEDED(erroCode)) {
  2309. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)(ParamValToString(Param_View_Map[val.view]));
  2310. }
  2311. else {
  2312. SetErrorAndLog(erroCode, val.view == 1 ? HSPScanner_UserErrorCode_SetParam_View : HSPScanner_UserErrorCode_SetParam_Hide
  2313. , "DevAdapter::SetParam", __FUNCTION__, isBusiness, ullEnd - ullStart, logCode, CombineJsonContext(ParamValToString(Param_View_Map[val.view])));
  2314. SetLastUserCode(GetAlarmDEC());
  2315. return Error_Unexpect;
  2316. }
  2317. }
  2318. return erroCode;
  2319. }
  2320. void CHSPScannerFSM::ToSwithLight(bool turnOn /*= true*/)
  2321. {
  2322. if (m_lightOn != turnOn) {
  2323. if (turnOn) LogEvent(Severity_Middle, LOG_EVT_HSPS_LIGHT_ON, "HSPScanner warning on.");
  2324. else LogEvent(Severity_Middle, LOG_EVT_HSPS_LIGHT_OFF, "HSPScanner warning off.");
  2325. m_lightOn = turnOn;
  2326. }
  2327. }
  2328. //TODO: JS完全替换后,这个函数要废弃换成SetPreviewProperty替代 [Gifur@2025318]
  2329. int CHSPScannerFSM::SetPreviewParam(int colorType, int rotateType, int scanType, bool abortIfFault)
  2330. {
  2331. ErrorCodeEnum erroCode;
  2332. int retCode = 0;
  2333. if (colorType > 0 && colorType < 4) {
  2334. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  2335. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_COLOR, Param_Color_Map[colorType]);
  2336. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  2337. if (ISSUCCEEDED(erroCode)) {
  2338. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)(ParamValToString(Param_Color_Map[colorType]));
  2339. }
  2340. else {
  2341. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetParam, "DevAdapter::SetParam", __FUNCTION__, abortIfFault ? IsInBusiness() : false, ullEnd - ullStart, HSPScannerService_LogCode_SetProperty, CombineJsonContext(ParamValToString(Param_Color_Map[colorType])));
  2342. retCode |= 0x0001;
  2343. SetLastUserCode(GetAlarmDEC(MEC_DEVAPI_HSPSCANNER_SetParam));
  2344. }
  2345. }
  2346. //////////////////////////////////////////////////////////////////////////
  2347. if (rotateType > 0 && rotateType < 5) {
  2348. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  2349. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_ROTATE, Param_Rotate_Map[rotateType]);
  2350. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  2351. if (ISSUCCEEDED(erroCode)) {
  2352. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)(ParamValToString(Param_Rotate_Map[rotateType]));
  2353. }
  2354. else {
  2355. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetParam, "DevAdapter::SetParam", __FUNCTION__, abortIfFault ? IsInBusiness() : false, ullEnd - ullStart, HSPScannerService_LogCode_SetProperty, CombineJsonContext(ParamValToString(Param_Rotate_Map[rotateType])));
  2356. retCode |= 0x0002;
  2357. SetLastUserCode(GetAlarmDEC(MEC_DEVAPI_HSPSCANNER_SetParam));
  2358. }
  2359. }
  2360. //////////////////////////////////////////////////////////////////////////
  2361. if (scanType > 0 && scanType < 4) {
  2362. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  2363. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_SCANSIZE, Param_Scan_Map[scanType]);
  2364. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  2365. if (ISSUCCEEDED(erroCode)) {
  2366. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)(ParamValToString(Param_Scan_Map[scanType]));
  2367. }
  2368. else {
  2369. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetParam, "DevAdapter::SetParam", __FUNCTION__, abortIfFault ? IsInBusiness() : false, ullEnd - ullStart, HSPScannerService_LogCode_SetProperty, CombineJsonContext(ParamValToString(Param_Scan_Map[scanType])));
  2370. retCode |= 0x0004;
  2371. SetLastUserCode(GetAlarmDEC(MEC_DEVAPI_HSPSCANNER_SetParam));
  2372. }
  2373. }
  2374. return retCode;
  2375. }
  2376. ErrorCodeEnum CHSPScannerFSM::DeleteFileIfExisted(LPCTSTR fileName)
  2377. {
  2378. if (ExistsFileA(fileName)) {
  2379. if (RemoveFileA(fileName) != 0) {
  2380. return Error_Succeed;
  2381. }
  2382. else {
  2383. LogWarn(Severity_High, Error_Unexpect, HSPScanner_UserErrorCode_CLEAR_RESOURCE_FAILED, CSimpleStringA::Format(
  2384. "DeleteFile(%s) failed LastError(%d)", fileName, GetLastError()));
  2385. return Error_Unexpect;
  2386. }
  2387. }
  2388. else {
  2389. return Error_Succeed;
  2390. }
  2391. }
  2392. void CHSPScannerFSM::InitialMaxResizeValue()
  2393. {
  2394. CSmartPointer<IEntityFunction> spFunction = this->GetEntityBase()->GetFunction();
  2395. CSmartPointer<IConfigInfo> spConfig;
  2396. spFunction->OpenConfig(Config_CenterSetting, spConfig);
  2397. int kb = 0;
  2398. spConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "ImageMaxSize", kb);
  2399. if (kb > 0) {
  2400. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Get image max size from CS: %d", kb);
  2401. m_dwMaxImageSize = kb;
  2402. return;
  2403. }
  2404. }
  2405. ErrorCodeEnum CHSPScannerFSM::TryToOpenDevice()
  2406. {
  2407. ErrorCodeEnum result(Error_Succeed);
  2408. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to open device...");
  2409. ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  2410. result = m_hDevHelper->DevOpen();
  2411. ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  2412. if (FAILURED(result)) {
  2413. //RTA2N01 / 21700001
  2414. SetErrorAndLog(result, MEC_DEVAPI_HSPSCANNER_DevOpen, "DevAdapter::DevOpen", __FUNCTION__, false, ullEnd - ullStart);
  2415. SetLastUserCode(LOG_ERR_HSPS_DEVOPEN_FAILED);
  2416. }
  2417. else {
  2418. SetLastUserCode();
  2419. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DevOpen").setCostTime(ullEnd - ullStart)();
  2420. ullStart = SP::Module::Comm::RVCGetTickCount();
  2421. result = FulfillAdapterDevCategory();
  2422. ullEnd = SP::Module::Comm::RVCGetTickCount();
  2423. if (result != Error_Succeed) {
  2424. SetErrorAndLog(result, MEC_DEVAPI_HSPSCANNER_GetDevCategory, "DevAdapter::GetDevCategory", "FulfillAdapterDevCategory", false, ullEnd - ullStart);
  2425. }
  2426. m_nRecX = 0;
  2427. m_nRecY = 224;
  2428. m_nRecW = 1024;
  2429. ErrorCodeEnum ecInit = m_hDevHelper->SetViewPos(m_nRecX, m_nRecY, m_nRecW);
  2430. if (FAILURED(ecInit))
  2431. SetErrorAndLog(ecInit, MEC_DEVAPI_HSPSCANNER_SetViewPos, "DevAdapter::SetViewPos", __FUNCTION__, false);
  2432. ErrorCodeEnum ecInitScan = m_hDevHelper->SetParam(HSPS_MODEL_SCANSIZE, HSPS_SCAN_FULL);
  2433. if (FAILURED(ecInitScan))
  2434. SetErrorAndLog(ecInitScan, MEC_DEVAPI_HSPSCANNER_SetParam, "DevAdapter::SetParam", __FUNCTION__, false, 0, "", CombineJsonContext("HSPS_SCAN_FULL"));
  2435. ErrorCodeEnum ecInitRotate = m_hDevHelper->SetParam(HSPS_MODEL_ROTATE, HSPS_ROTATE_NOANGLE);
  2436. if (FAILURED(ecInitRotate))
  2437. SetErrorAndLog(ecInitRotate, MEC_DEVAPI_HSPSCANNER_SetParam, "DevAdapter::SetParam", __FUNCTION__, false, 0, "", CombineJsonContext("HSPS_ROTATE_NOANGLE"));
  2438. ErrorCodeEnum ecInitColor = m_hDevHelper->SetParam(HSPS_MODEL_COLOR, HSPS_COLOR_FULL);
  2439. if (FAILURED(ecInitColor))
  2440. SetErrorAndLog(ecInitColor, MEC_DEVAPI_HSPSCANNER_SetParam, "DevAdapter::SetParam", __FUNCTION__, false, 0, "", CombineJsonContext("HSPS_COLOR_FULL"));
  2441. }
  2442. return result;
  2443. }
  2444. LPCTSTR CHSPScannerFSM::MapCode2RTAString(DWORD dwValue)
  2445. {
  2446. static CSimpleStringA tmpRTA(true);
  2447. CSimpleStringA tmpDesc(true);
  2448. ErrorCodeEnum err(Error_Succeed);
  2449. tmpRTA = "";
  2450. if ((err=GetEntityBase()->GetFunction()->GetVTMErrMsg(dwValue, tmpDesc, tmpRTA)) == Error_Succeed) {
  2451. return tmpRTA.GetData();
  2452. }
  2453. else if (dwValue != 0) {
  2454. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("cannot found 0x%X from ResStatic: %s", dwValue, SpStrError(err));
  2455. }
  2456. /** 降级处理 [Gifur@2025325]*/
  2457. switch (dwValue) {
  2458. case 0x2170000C: /*未登记到资源管理平台*/
  2459. return "RTA2N0C";
  2460. break;
  2461. case 0x21700204: /*未登记到资源管理平台*/
  2462. return "RTA2N0S";
  2463. break;
  2464. case 0:
  2465. default:
  2466. return "SUC0000";
  2467. break;
  2468. }
  2469. }