HSPScannerFSM.cpp 86 KB

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