HSPScannerFSM.cpp 87 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509
  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__)("%s::UnHandle event ! %d", __FUNCTION__, 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. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Enter s3_Failed");
  568. if (GetDevInitFlag()) {
  569. SetLastUserCode(HSPScanner_UserErrorCode_FSM_INVALID);
  570. const int nStatus = IsDevConnected();
  571. if (nStatus == 0) {
  572. PostEventFIFO(new FSMEvent(USER_EVT_DISCONNECT));
  573. }
  574. else if (nStatus == 1) {
  575. ScheduleTimer(RESET_TIMER_ID, MILLISECOND_TO_RESET / 6);
  576. }
  577. }
  578. else {
  579. SetDevState(DEVICE_STATUS_FAULT);
  580. }
  581. }
  582. void CHSPScannerFSM::s3_Failed_on_exit()
  583. {
  584. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Leave s3_Failed");
  585. SetDevState(DEVICE_STATUS_NORMAL);
  586. m_ecSelfTest = Error_Succeed;
  587. m_nFatalTimes = 0;
  588. m_desiredAction = USER_EVT_QUIT;
  589. CancelTimer(RESET_TIMER_ID);
  590. }
  591. unsigned int CHSPScannerFSM::s3_Failed_on_event(FSMEvent* e)
  592. {
  593. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s3_Failed_on_event: %s(%d), %d.", EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  594. unsigned int uRet = 0;
  595. switch(e->iEvt)
  596. {
  597. /** JS Component [Gifur@20241112]*/
  598. case USER_EVT_STARTPREVIEW_JS:
  599. {
  600. JS::StartPreviewEvent* pEvt = dynamic_cast<JS::StartPreviewEvent*>(e);
  601. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_StartPreviewJS).setResultCode(MapCode2RTAString(GetLastUserCode()))(GetDevInitFlag()? "高拍仪模块出现异常" : "高拍仪模块未打开");
  602. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  603. e->SetHandled();
  604. }
  605. break;
  606. case USER_EVT_CANCELPREVIEW_JS:
  607. {
  608. JS::CancelPreviewEvent* pEvt = dynamic_cast<JS::CancelPreviewEvent*>(e);
  609. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_CancelPreviewJS).setResultCode(MapCode2RTAString(GetLastUserCode()))(GetDevInitFlag() ? "高拍仪模块出现异常" : "高拍仪模块未打开");
  610. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  611. e->SetHandled();
  612. }
  613. break;
  614. case USER_EVT_SCANIMAGE_JS:
  615. {
  616. JS::ScanImageEvent* pEvt = dynamic_cast<JS::ScanImageEvent*>(e);
  617. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_ScanImageJS).setResultCode(MapCode2RTAString(GetLastUserCode()))(GetDevInitFlag() ? "高拍仪模块出现异常" : "高拍仪模块未打开");
  618. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  619. e->SetHandled();
  620. }
  621. break;
  622. case USER_EVT_SETPARAM_JS:
  623. {
  624. JS::SetParamEvent* pEvt = dynamic_cast<JS::SetParamEvent*>(e);
  625. if (GetDevInitFlag()) {
  626. JS::SetParamTask* pTask = new JS::SetParamTask(this);
  627. pTask->SetContext(pEvt->m_ctx);
  628. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  629. e->SetHandled();
  630. }
  631. else {
  632. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_SetParamJS).setResultCode(MapCode2RTAString(GetLastUserCode()))("高拍仪模块未打开");
  633. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  634. e->SetHandled();
  635. }
  636. }
  637. break;
  638. /** JS Compoent Done [Gifur@20241112]*/
  639. case USER_EVT_STARTPREVIEW:
  640. {
  641. StartPreviewEvent* pEvt = dynamic_cast<StartPreviewEvent*>(e);
  642. if (!GetDevInitFlag()) {
  643. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_StartPreview).setResultCode(MapCode2RTAString(GetLastUserCode()))("高拍仪模块未打开");
  644. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  645. } else {
  646. StartPreviewTask* pTask = new StartPreviewTask(this);
  647. pTask->SetContext(pEvt->m_ctx);
  648. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  649. }
  650. e->SetHandled();
  651. }
  652. break;
  653. case USER_EVT_STARTPREVIEW_FINISHED:
  654. {
  655. uRet = e->param1;
  656. e->SetHandled();
  657. }
  658. break;
  659. case USER_EVT_STOPPREVIEW:
  660. {
  661. if(GetDevInitFlag())
  662. {
  663. CancelTimer(RESET_TIMER_ID);
  664. StopPreviewEvent* pEvt = dynamic_cast<StopPreviewEvent*>(e);
  665. HspsDevStatus status = {0};
  666. ErrorCodeEnum erroCode = GetDevStatusFromAdapter(status);
  667. if (status.inPreview == 1) {
  668. StopPreviewTask* pTask = new StopPreviewTask(this);
  669. pTask->SetContext(pEvt->m_ctx);
  670. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  671. } else if (status.inShow == 1) {
  672. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  673. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_VIEW, HSPS_VIEW_HIDE);
  674. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  675. if (ISSUCCEEDED(erroCode)) {
  676. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_CancelPreview).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)("HSPS_VIEW_HIDE");
  677. } else {
  678. //RTA2N0Q
  679. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetParam, "DevAdapter::SetParam", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_CancelPreview, CombineJsonContext("HSPS_VIEW_HIDE failed"));
  680. SetLastUserCode(GetAlarmDEC());
  681. }
  682. pEvt->m_ctx->Answer(TransECWithRepeat(erroCode));
  683. FSMEvent* timerEvent = new FSMEvent(EVT_TIMER);
  684. timerEvent->param1 = RESET_TIMER_ID;
  685. PostEventFIFO(timerEvent);
  686. }
  687. } else {
  688. StopPreviewEvent* pEvt = dynamic_cast<StopPreviewEvent*>(e);
  689. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_CancelPreview).setResultCode(MapCode2RTAString(GetLastUserCode()))("高拍仪设备未打开");
  690. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  691. }
  692. }
  693. e->SetHandled();
  694. break;
  695. case USER_EVT_STOPPREVIEW_FINISHED:
  696. {
  697. uRet = e->param1;
  698. if(uRet == 0) {
  699. m_desiredAction = USER_EVT_STOPPREVIEW;
  700. }
  701. else if(uRet == 4) {
  702. m_desiredAction = USER_EVT_HIDEPREVIEW;
  703. }
  704. FSMEvent* timerEvent = new FSMEvent(EVT_TIMER);
  705. timerEvent->param1 = RESET_TIMER_ID;
  706. PostEventFIFO(timerEvent);
  707. }
  708. e->SetHandled();
  709. break;
  710. case USER_EVT_RESET:
  711. {
  712. if (GetDevInitFlag()) {
  713. ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  714. ErrorCodeEnum erroCode = m_hDevHelper->Reset();
  715. ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  716. if (FAILURED(erroCode)) {
  717. //RTA2N0B
  718. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_Reset, "DevAdapter::Reset", __FUNCTION__, false, ullEnd - ullStart, HSPScannerService_CustomLogCode_Reset);
  719. SetDevState(DEVICE_STATUS_FAULT);
  720. uRet = 1;
  721. } else {
  722. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::Reset").setCostTime(ullEnd - ullStart)("Reset succ.");
  723. ullStart = SP::Module::Comm::RVCGetTickCount();
  724. ErrorCodeEnum eXYW = m_hDevHelper->SetViewPos(m_nRecX, m_nRecY, m_nRecW);
  725. ullEnd = SP::Module::Comm::RVCGetTickCount();
  726. if (FAILURED(eXYW)) {
  727. //RTA2N07
  728. SetErrorAndLog(eXYW, MEC_DEVAPI_HSPSCANNER_SetViewPos, "DevAdapter::SetViewPos", __FUNCTION__, false, ullEnd - ullStart, HSPScannerService_CustomLogCode_Reset);
  729. SetDevState(DEVICE_STATUS_FAULT);
  730. uRet = 1;
  731. e->SetHandled();
  732. break;
  733. } else {
  734. 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);
  735. }
  736. HspsDevStatus status = {0};
  737. erroCode = GetDevStatusFromAdapter(status);
  738. if (ISSUCCEEDED(erroCode) && status.inPreview == 1 && status.inShow == 1) {
  739. if (m_desiredAction == USER_EVT_STOPPREVIEW) {
  740. do
  741. {
  742. ullStart = SP::Module::Comm::RVCGetTickCount();
  743. erroCode = m_hDevHelper->SetPreview(0);
  744. ullEnd = SP::Module::Comm::RVCGetTickCount();
  745. if (erroCode == Error_Succeed) {
  746. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::CancelPreview").setCostTime(ullEnd - ullStart)();
  747. } else {
  748. //RTA2N04
  749. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetPreview_Close, "DevAdapter::CancelPreview", __FUNCTION__, false, ullEnd - ullStart, HSPScannerService_CustomLogCode_Reset);
  750. }
  751. } while (false);
  752. do
  753. {
  754. HspsDevStatus retryStatus = { 0 };
  755. GetDevStatusFromAdapter(retryStatus);
  756. if (retryStatus.inPreview == 1) {
  757. ullStart = SP::Module::Comm::RVCGetTickCount();
  758. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_VIEW, HSPS_VIEW_HIDE);
  759. ullEnd = SP::Module::Comm::RVCGetTickCount();
  760. if (erroCode == Error_Succeed) {
  761. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)("HSPS_MODEL_VIEW, HSPS_VIEW_HIDE");
  762. }
  763. else {
  764. //RTA2N0Q
  765. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetParam, "DevAdapter::SetParam", __FUNCTION__, false, ullEnd - ullStart, HSPScannerService_CustomLogCode_Reset, CombineJsonContext("HSPS_VIEW_HIDE"));
  766. }
  767. }
  768. } while (false);
  769. } else if (m_desiredAction == USER_EVT_HIDEPREVIEW) {
  770. do
  771. {
  772. ullStart = SP::Module::Comm::RVCGetTickCount();
  773. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_VIEW, HSPS_VIEW_HIDE);
  774. ullEnd = SP::Module::Comm::RVCGetTickCount();
  775. if (erroCode == Error_Succeed) {
  776. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)("HSPS_VIEW_HIDE");
  777. } else {
  778. //RTA2N0Q
  779. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetParam, "DevAdapter::SetParam", __FUNCTION__, false, ullEnd - ullStart, HSPScannerService_CustomLogCode_Reset, CombineJsonContext("HSPS_VIEW_HIDE"));
  780. }
  781. } while (false);
  782. }
  783. else {
  784. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setLogCode(HSPScannerService_CustomLogCode_Reset)("Recover routine done");
  785. uRet = 2;
  786. }
  787. }
  788. if (FAILURED(erroCode)) {
  789. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Recover failed under desiration of %s", EvtTypeToString(m_desiredAction));
  790. SetDevState(DEVICE_STATUS_FAULT);
  791. uRet = 1;
  792. e->SetHandled();
  793. break;
  794. }
  795. }
  796. }
  797. }
  798. e->SetHandled();
  799. break;
  800. case EVT_TIMER:
  801. {
  802. if (e->param1 == RESET_TIMER_ID) {
  803. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Current Dev State:%d", GetDevState());
  804. FSMEvent* pEvt = new FSMEvent(USER_EVT_RESET);
  805. PostEventFIFO(pEvt);
  806. ScheduleTimer(RESET_TIMER_ID, MILLISECOND_TO_RESET);
  807. }
  808. }
  809. e->SetHandled();
  810. break;
  811. case USER_EVT_DISCONNECT:
  812. e->SetHandled();
  813. break;
  814. case USER_EVT_GETSTATUS:
  815. {
  816. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  817. if (!GetDevInitFlag()) {
  818. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_GetDevStatus).setResultCode(MapCode2RTAString(GetLastUserCode()))("高拍仪设备未打开");
  819. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  820. } else {
  821. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  822. pTask->SetContext(pEvt->m_ctx);
  823. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  824. }
  825. }
  826. e->SetHandled();
  827. break;
  828. case USER_EVT_GETINFO:
  829. {
  830. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  831. if (!GetDevInitFlag()) {
  832. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_GetDevInfo).setResultCode(MapCode2RTAString(GetLastUserCode()))("高拍仪设备未打开");
  833. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  834. e->SetHandled();
  835. }
  836. else {
  837. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  838. pTask->SetContext(pEvt->m_ctx);
  839. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  840. }
  841. }
  842. e->SetHandled();
  843. break;
  844. case USER_EVT_SETWINPOS:
  845. {
  846. SetWinPosEvent* pEvt = dynamic_cast<SetWinPosEvent*>(e);
  847. if (!GetDevInitFlag()) {
  848. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_SetWinPos).setResultCode(MapCode2RTAString(GetLastUserCode()))("高拍仪设备未打开");
  849. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  850. e->SetHandled();
  851. }
  852. else {
  853. SetWinPosTask* pTask = new SetWinPosTask(this);
  854. pTask->SetContext(pEvt->m_ctx);
  855. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  856. e->SetHandled();
  857. }
  858. }
  859. break;
  860. }
  861. return uRet;
  862. }
  863. void CHSPScannerFSM::s4_ScanImage_on_entry()
  864. {
  865. }
  866. void CHSPScannerFSM::s4_ScanImage_on_exit()
  867. {
  868. }
  869. unsigned int CHSPScannerFSM::s4_ScanImage_on_event(FSMEvent* e)
  870. {
  871. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s4_on_event: %s(%d), %d.", EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  872. unsigned int uRet = 0;
  873. switch(e->iEvt)
  874. {
  875. /** JS Component [Gifur@20241114]*/
  876. //拍照应该是一瞬间的事情,这个状态很快会结束,JS改造不支持此状态
  877. /** JS Component Done [Gifur@20241114]*/
  878. case USER_EVT_SCANIMAGEFINISHED:
  879. {
  880. uRet = e->param1;
  881. if(uRet == 2 && ++m_nFatalTimes < MAX_ERROR_TIMES)
  882. {
  883. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("hold on, wait next time (%d/%d).", m_nFatalTimes, MAX_ERROR_TIMES);
  884. uRet = 5;
  885. }
  886. else if(uRet == 0)
  887. {
  888. m_nFatalTimes = 0;
  889. }
  890. if(uRet == 5 && IsDevConnected() == 0)
  891. {
  892. PostEventFIFO(new FSMEvent(USER_EVT_DISCONNECT));
  893. }
  894. else if(uRet == 2 || uRet == 4)
  895. {
  896. m_desiredAction = USER_EVT_SCANIMAGE;
  897. }
  898. }
  899. e->SetHandled();
  900. break;
  901. case USER_EVT_DISCONNECT:
  902. {
  903. //jump auto.
  904. }
  905. e->SetHandled();
  906. break;
  907. case USER_EVT_GETSTATUS:
  908. {
  909. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  910. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  911. pTask->SetContext(pEvt->m_ctx);
  912. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  913. }
  914. e->SetHandled();
  915. break;
  916. case USER_EVT_GETINFO:
  917. {
  918. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  919. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  920. pTask->SetContext(pEvt->m_ctx);
  921. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  922. }
  923. e->SetHandled();
  924. break;
  925. }
  926. return uRet;
  927. }
  928. void CHSPScannerFSM::s5_DeviceOff_on_entry()
  929. {
  930. SetDevState(DEVICE_STATUS_CONNECTING);
  931. LogWarn(Severity_Low, Error_DevNotAvailable, HSPScanner_UserErrorCode_DEVICE_OFFLINE, "高拍仪断开连接!");
  932. SetLastUserCode(HSPScanner_UserErrorCode_DEVICE_OFFLINE);
  933. ScheduleTimer(CHECK_CONNECT_TIMER_ID, MILLISECOND_TO_CHECK_CONNECT);
  934. }
  935. void CHSPScannerFSM::s5_DeviceOff_on_exit()
  936. {
  937. SetLastUserCode();
  938. SetDevState(DEVICE_STATUS_NORMAL);
  939. CancelTimer(CHECK_CONNECT_TIMER_ID);
  940. }
  941. unsigned int CHSPScannerFSM::s5_DeviceOff_on_event(FSMEvent* e)
  942. {
  943. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s5_on_event: %s(%d), %d.", EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  944. unsigned int uRet = 0;
  945. switch(e->iEvt)
  946. {
  947. /** JS Component [Gifur@20241112]*/
  948. case USER_EVT_STARTPREVIEW_JS:
  949. {
  950. JS::StartPreviewEvent* pEvt = dynamic_cast<JS::StartPreviewEvent*>(e);
  951. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_StartPreviewJS).setResultCode(MapCode2RTAString(GetLastUserCode()))("[USER_EVT_STARTPREVIEW_JS] 高拍仪断开连接");
  952. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  953. pEvt->SetHandled();
  954. }
  955. break;
  956. case USER_EVT_CANCELPREVIEW_JS:
  957. {
  958. JS::CancelPreviewEvent* pEvt = dynamic_cast<JS::CancelPreviewEvent*>(e);
  959. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_CancelPreviewJS).setResultCode(MapCode2RTAString(GetLastUserCode()))("[USER_EVT_CANCELPREVIEW_JS] 高拍仪断开连接");
  960. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  961. pEvt->SetHandled();
  962. }
  963. break;
  964. case USER_EVT_SCANIMAGE_JS:
  965. {
  966. JS::ScanImageEvent* pEvt = dynamic_cast<JS::ScanImageEvent*>(e);
  967. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_ScanImageJS).setResultCode(MapCode2RTAString(GetLastUserCode()))("[USER_EVT_SCANIMAGE_JS] 高拍仪断开连接");
  968. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  969. pEvt->SetHandled();
  970. }
  971. break;
  972. case USER_EVT_SETPARAM_JS:
  973. {
  974. JS::SetParamEvent* pEvt = dynamic_cast<JS::SetParamEvent*>(e);
  975. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_SetParamJS).setResultCode(MapCode2RTAString(GetLastUserCode()))("[USER_EVT_SETPARAM_JS] 高拍仪断开连接");
  976. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  977. pEvt->SetHandled();
  978. }
  979. break;
  980. /** JS Compoent Done [Gifur@20241112]*/
  981. case EVT_TIMER:
  982. {
  983. if (e->param1 == CHECK_CONNECT_TIMER_ID) {
  984. HspsDevStatus status = { 0 };
  985. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  986. ErrorCodeEnum eResult = m_hDevHelper->GetDevStatus(status);
  987. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  988. if (ISSUCCEEDED(eResult)) {
  989. 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);
  990. if (status.isConnected == 0) {
  991. ScheduleTimer(CHECK_CONNECT_TIMER_ID, MILLISECOND_TO_CHECK_CONNECT);
  992. }
  993. else if (status.inShow == 1 && status.inPreview == 1) {
  994. //回到预览状态
  995. uRet = 2;
  996. } else if(status.inShow == 0 && status.inPreview == 1) {
  997. uRet = 3;
  998. } else {
  999. uRet = 1;
  1000. }
  1001. } else {
  1002. //RTA2N09
  1003. SetErrorAndLog(eResult, MEC_DEVAPI_HSPSCANNER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, false, ullEnd - ullStart);
  1004. }
  1005. e->SetHandled();
  1006. }
  1007. }
  1008. break;
  1009. case USER_EVT_GETSTATUS:
  1010. {
  1011. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  1012. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  1013. pTask->SetContext(pEvt->m_ctx);
  1014. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1015. }
  1016. e->SetHandled();
  1017. break;
  1018. case USER_EVT_GETINFO:
  1019. {
  1020. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  1021. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  1022. pTask->SetContext(pEvt->m_ctx);
  1023. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1024. }
  1025. e->SetHandled();
  1026. break;
  1027. case USER_EVT_SETWINPOS:
  1028. {
  1029. SetWinPosEvent* pEvt = dynamic_cast<SetWinPosEvent*>(e);
  1030. pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  1031. }
  1032. e->SetHandled();
  1033. break;
  1034. }
  1035. return uRet;
  1036. }
  1037. void CHSPScannerFSM::s6_HidePreview_on_entry()
  1038. {
  1039. }
  1040. void CHSPScannerFSM::s6_HidePreview_on_exit()
  1041. {
  1042. }
  1043. unsigned int CHSPScannerFSM::s6_HidePreview_on_event(FSMEvent* e)
  1044. {
  1045. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s6_HidePreview_on_event: %s(%d), %d.", EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  1046. unsigned int uRet = 0;
  1047. switch(e->iEvt)
  1048. {
  1049. /*JS Component*/
  1050. case USER_EVT_STARTPREVIEW_JS:
  1051. {
  1052. JS::StartPreviewEvent* pEvt = dynamic_cast<JS::StartPreviewEvent*>(e);
  1053. HspsDevStatus status = { 0 };
  1054. GetDevStatusFromAdapter(status);
  1055. JS::PreviewSettings settings(pEvt->m_ctx->Req);
  1056. settings.SetDisplay(true);
  1057. ErrorCodeEnum erroCode = SetPreviewProperty(settings, HSPScannerService_LogCode_StartPreviewJS);
  1058. if (FAILURED(erroCode)) {
  1059. pEvt->m_ctx->Answer(Error_Unexpect, GetLastUserCode());
  1060. uRet = 0;
  1061. }
  1062. else {
  1063. ToSwithLight();
  1064. pEvt->m_ctx->Answer(Error_Succeed);
  1065. uRet = 1;
  1066. }
  1067. e->SetHandled();
  1068. }
  1069. break;
  1070. case USER_EVT_CANCELPREVIEW_JS:
  1071. {
  1072. JS::CancelPreviewEvent* pEvt = dynamic_cast<JS::CancelPreviewEvent*>(e);
  1073. if (pEvt->m_ctx->Req.hide) {
  1074. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_CancelPreviewJS)("current state is already hide preview");
  1075. pEvt->m_ctx->Answer(Error_Succeed);
  1076. }
  1077. else {
  1078. JS::CancelPreviewTask* pTask = new JS::CancelPreviewTask(this);
  1079. pTask->SetContext(pEvt->m_ctx);
  1080. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1081. }
  1082. e->SetHandled();
  1083. }
  1084. break;
  1085. case USER_EVT_STARTPREVIEW_JS_DONE:
  1086. {
  1087. uRet = e->param1;
  1088. e->SetHandled();
  1089. }
  1090. break;
  1091. case USER_EVT_SCANIMAGE_JS:
  1092. {
  1093. JS::ScanImageTask* pTask = new JS::ScanImageTask(this);
  1094. JS::ScanImageEvent* pEvt = dynamic_cast<JS::ScanImageEvent*>(e);
  1095. pTask->SetContext(pEvt->m_ctx);
  1096. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1097. e->SetHandled();
  1098. }
  1099. break;
  1100. case USER_EVT_SETPARAM_JS:
  1101. {
  1102. JS::SetParamTask* pTask = new JS::SetParamTask(this);
  1103. JS::SetParamEvent* pEvt = dynamic_cast<JS::SetParamEvent*>(e);
  1104. pTask->SetContext(pEvt->m_ctx);
  1105. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1106. e->SetHandled();
  1107. }
  1108. break;
  1109. /*JS Component Done*/
  1110. case USER_EVT_STARTPREVIEW:
  1111. {
  1112. StartPreviewTask* pTask = new StartPreviewTask(this);
  1113. StartPreviewEvent* pEvt = dynamic_cast<StartPreviewEvent*>(e);
  1114. pTask->SetContext(pEvt->m_ctx);
  1115. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1116. e->SetHandled();
  1117. }
  1118. break;
  1119. case USER_EVT_STARTPREVIEW_FINISHED:
  1120. {
  1121. uRet = e->param1;
  1122. e->SetHandled();
  1123. if (uRet == 1 && ++m_nFatalTimes < MAX_ERROR_TIMES) {
  1124. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("hold on, wait next time (%d/%d).", m_nFatalTimes, MAX_ERROR_TIMES);
  1125. uRet = 2;
  1126. } else if (uRet == 0) {
  1127. m_nFatalTimes = 0;
  1128. }
  1129. if (uRet == 2 && IsDevConnected() == 0) {
  1130. PostEventFIFO(new FSMEvent(USER_EVT_DISCONNECT));
  1131. } else if (uRet == 1) {
  1132. m_desiredAction = USER_EVT_STARTPREVIEW;
  1133. }
  1134. }
  1135. break;
  1136. case USER_EVT_SETPROPERTY:
  1137. {
  1138. SetPropertyEvent* pEvt = dynamic_cast<SetPropertyEvent*>(e);
  1139. SetProperty(pEvt->m_ctx);
  1140. e->SetHandled();
  1141. }
  1142. break;
  1143. case USER_EVT_STOPPREVIEW:
  1144. {
  1145. StopPreviewEvent* pEvt = dynamic_cast<StopPreviewEvent*>(e);
  1146. if(!pEvt->m_ctx->Req.bOnlyHide)
  1147. {//业务在s6状态仅能进行彻底取消预览的操作
  1148. StopPreviewTask* pTask = new StopPreviewTask(this);
  1149. pTask->SetContext(pEvt->m_ctx);
  1150. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1151. e->SetHandled();
  1152. }
  1153. }
  1154. break;
  1155. case USER_EVT_STOPPREVIEW_FINISHED:
  1156. {
  1157. uRet = e->param1;
  1158. if (uRet == 0 && ++m_nFatalTimes < MAX_ERROR_TIMES) {
  1159. uRet = 3;
  1160. } else if (uRet != 0) {
  1161. m_nFatalTimes = 0;
  1162. }
  1163. if (uRet == 3 && IsDevConnected() == 0) {
  1164. PostEventFIFO(new FSMEvent(USER_EVT_DISCONNECT));
  1165. }
  1166. }
  1167. e->SetHandled();
  1168. break;
  1169. case USER_EVT_SETWINPOS:
  1170. {
  1171. SetWinPosEvent* pEvt = dynamic_cast<SetWinPosEvent*>(e);
  1172. if(pEvt->m_ctx->Req.type == 2)
  1173. {//在s6状态,不允许进行显示和隐藏操作,业务必须通过XXXPreview来进行显示隐藏操作
  1174. SetWinPosTask* pTask = new SetWinPosTask(this);
  1175. pTask->SetContext(pEvt->m_ctx);
  1176. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1177. e->SetHandled();
  1178. }
  1179. }
  1180. break;
  1181. case USER_EVT_DISCONNECT:
  1182. {
  1183. //jump auto.
  1184. }
  1185. e->SetHandled();
  1186. break;
  1187. case USER_EVT_GETSTATUS:
  1188. {
  1189. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  1190. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  1191. pTask->SetContext(pEvt->m_ctx);
  1192. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1193. }
  1194. e->SetHandled();
  1195. break;
  1196. case USER_EVT_GETINFO:
  1197. {
  1198. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  1199. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  1200. pTask->SetContext(pEvt->m_ctx);
  1201. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1202. }
  1203. e->SetHandled();
  1204. break;
  1205. }
  1206. return uRet;
  1207. }
  1208. void CHSPScannerFSM::s7_Exit_on_entry()
  1209. {
  1210. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Enter s7_Exit");
  1211. ExitClearTask* pTask = new ExitClearTask(this);
  1212. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1213. }
  1214. void CHSPScannerFSM::s7_Exit_on_exit()
  1215. {
  1216. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Leave s7_Exit");
  1217. }
  1218. //TODO: [Gifur@20241114]
  1219. unsigned int CHSPScannerFSM::s7_Exit_on_event(FSMEvent* e)
  1220. {
  1221. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s7_Exit_on_event: %s(%d), %d.", EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  1222. unsigned int uRet = 0;
  1223. switch(e->iEvt)
  1224. {
  1225. case USER_EVT_EXIT_FINISHED:
  1226. {
  1227. uRet = e->param1;
  1228. if (uRet == 1) {
  1229. HspsDevStatus status = { 0 };
  1230. if (ISSUCCEEDED(GetDevStatusFromAdapter(status))) {
  1231. if (status.inPreview) {
  1232. if (status.inShow)
  1233. uRet = 2;
  1234. else uRet = 3;
  1235. } else if (!status.isConnected) {
  1236. uRet = 4;
  1237. }
  1238. else {
  1239. uRet = 0;
  1240. }
  1241. }
  1242. }
  1243. }
  1244. e->SetHandled();
  1245. break;
  1246. case USER_EVT_GETSTATUS:
  1247. {
  1248. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  1249. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  1250. pTask->SetContext(pEvt->m_ctx);
  1251. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1252. }
  1253. e->SetHandled();
  1254. break;
  1255. case USER_EVT_GETINFO:
  1256. {
  1257. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  1258. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  1259. pTask->SetContext(pEvt->m_ctx);
  1260. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1261. }
  1262. e->SetHandled();
  1263. break;
  1264. default:
  1265. {
  1266. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("%s::UnHandle event ! %d", __FUNCTION__, e->iEvt);
  1267. break;
  1268. }
  1269. }
  1270. return uRet;
  1271. }
  1272. void CHSPScannerFSM::s8_Init_on_entry()
  1273. {
  1274. SetLastUserCode(LOG_WARN_HSPS_OPENING_NOW);
  1275. GetEntityBase()->GetFunction()->PostThreadPoolTask(new InitTask(this));
  1276. }
  1277. void CHSPScannerFSM::s8_Init_on_exit()
  1278. {
  1279. }
  1280. unsigned int CHSPScannerFSM::s8_Init_on_event(FSMEvent* e)
  1281. {
  1282. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s8_Init_on_event: %s(%d), %d.", EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  1283. unsigned int uRet = 0;
  1284. switch (e->iEvt) {
  1285. /** JS Component [Gifur@20241112]*/
  1286. case USER_EVT_STARTPREVIEW_JS:
  1287. {
  1288. JS::StartPreviewEvent* pEvt = dynamic_cast<JS::StartPreviewEvent*>(e);
  1289. pEvt->SetHandled();
  1290. pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
  1291. }
  1292. break;
  1293. case USER_EVT_CANCELPREVIEW_JS:
  1294. {
  1295. JS::CancelPreviewEvent* pEvt = dynamic_cast<JS::CancelPreviewEvent*>(e);
  1296. pEvt->SetHandled();
  1297. pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
  1298. }
  1299. break;
  1300. case USER_EVT_SCANIMAGE_JS:
  1301. {
  1302. JS::ScanImageEvent* pEvt = dynamic_cast<JS::ScanImageEvent*>(e);
  1303. pEvt->SetHandled();
  1304. pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
  1305. }
  1306. break;
  1307. case USER_EVT_SETPARAM_JS:
  1308. {
  1309. JS::SetParamEvent* pEvt = dynamic_cast<JS::SetParamEvent*>(e);
  1310. pEvt->SetHandled();
  1311. pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
  1312. }
  1313. break;
  1314. /** JS Compoent Done [Gifur@20241112]*/
  1315. case USER_EVT_STARTPREVIEW:
  1316. {
  1317. StartPreviewEvent* pEvt = dynamic_cast<StartPreviewEvent*>(e);
  1318. pEvt->SetHandled();
  1319. pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
  1320. }
  1321. break;
  1322. case USER_EVT_STOPPREVIEW:
  1323. {
  1324. StopPreviewEvent* pEvt = dynamic_cast<StopPreviewEvent*>(e);
  1325. pEvt->SetHandled();
  1326. pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
  1327. }
  1328. break;
  1329. case USER_EVT_SCANIMAGE:
  1330. {
  1331. ScanImageEvent* pEvt = dynamic_cast<ScanImageEvent*>(e);
  1332. pEvt->SetHandled();
  1333. pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
  1334. }
  1335. break;
  1336. case USER_EVT_SCANIMAGE_EX:
  1337. {
  1338. ScanImageExEvent* pEvt = dynamic_cast<ScanImageExEvent*>(e);
  1339. pEvt->SetHandled();
  1340. pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
  1341. }
  1342. break;
  1343. case USER_EVT_SHOWPROPERTY:
  1344. {
  1345. ShowPropertyEvent* pEvt = dynamic_cast<ShowPropertyEvent*>(e);
  1346. pEvt->SetHandled();
  1347. pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
  1348. }
  1349. break;
  1350. case USER_EVT_SETPROPERTY:
  1351. {
  1352. SetPropertyEvent* pEvt = dynamic_cast<SetPropertyEvent*>(e);
  1353. pEvt->SetHandled();
  1354. pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
  1355. }
  1356. break;
  1357. case USER_EVT_SETWINPOS:
  1358. {
  1359. SetWinPosEvent* pEvt = dynamic_cast<SetWinPosEvent*>(e);
  1360. pEvt->SetHandled();
  1361. pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
  1362. }
  1363. break;
  1364. case USER_EVT_GETSTATUS:
  1365. {
  1366. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  1367. pEvt->SetHandled();
  1368. pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
  1369. }
  1370. break;
  1371. case USER_EVT_GOTOHELL:
  1372. {
  1373. e->SetHandled();
  1374. }
  1375. break;
  1376. case USER_EVT_INIT_FINISHED:
  1377. {
  1378. e->SetHandled();
  1379. }
  1380. break;
  1381. default:
  1382. break;
  1383. }
  1384. return uRet;
  1385. }
  1386. int CHSPScannerFSM::StartPreview(SpReqAnsContext<HSPScannerService_StartPreview_Req,
  1387. HSPScannerService_StartPreview_Ans>::Pointer ctx)
  1388. {
  1389. bool nRes = 0;
  1390. ErrorCodeEnum erroCode = Error_Unexpect;
  1391. SetLastUserCode();
  1392. if (ctx->Req.colorType || ctx->Req.scanType || ctx->Req.rotateType) {
  1393. const int retCode = SetPreviewParam(ctx->Req.colorType, ctx->Req.rotateType, ctx->Req.scanType);
  1394. if (retCode != 0)
  1395. {
  1396. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("SetPreviewParam return some wrong:0x%X", retCode);
  1397. erroCode = Error_DevCommFailed;
  1398. }
  1399. else {
  1400. erroCode = Error_Succeed;
  1401. }
  1402. }
  1403. HspsDevStatus status = { 0 };
  1404. erroCode = GetDevStatusFromAdapter(status);
  1405. if (ISSUCCEEDED(erroCode) && status.inPreview) {// 用于s6状态 [Josephus in 9:33:48 2016/11/22]
  1406. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  1407. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_VIEW, HSPS_VIEW_SHOW);
  1408. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  1409. if (ISSUCCEEDED(erroCode)) {
  1410. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_StartPreview).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)("HSPS_VIEW_SHOW");
  1411. } else {
  1412. //RTA2N0R
  1413. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetParam, "DevAdapter::SetParam", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_StartPreview, CombineJsonContext("HSPS_VIEW_SHOW"));
  1414. const DWORD dwCode = GetAlarmDEC();
  1415. CSimpleStringA tmpRTA(true), tmpDesc(true);
  1416. if (GetEntityBase()->GetFunction()->GetVTMErrMsg(dwCode, tmpDesc, tmpRTA) == Error_Succeed)
  1417. DbgToBeidou(ctx->link, "StartPreview::SetParam").setReturnCode(tmpRTA)();
  1418. SetLastUserCode(dwCode);
  1419. }
  1420. } else if (ISSUCCEEDED(erroCode)) {
  1421. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_USER)("Start to SetPreview(1)...");
  1422. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  1423. erroCode = m_hDevHelper->SetPreview(1);
  1424. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  1425. if (FAILURED(erroCode)) {
  1426. //RTA2N03
  1427. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetPreview_Open, "DevAdapter::SetPreview", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_StartPreview, CombineJsonContext("StartPreview::SetPreview(1)"));
  1428. SetLastUserCode(GetAlarmDEC());
  1429. } else {
  1430. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_StartPreview).setAPI("DevAdapter::SetPreview").setCostTime(ullEnd - ullStart)("StartPreview::SetPreview(1)");
  1431. }
  1432. }
  1433. if (FAILURED(erroCode)) {
  1434. nRes = 1;
  1435. } else {
  1436. /** 无论如何都打开一次灯,所以这里应该是有所冗余的 [Gifur@2025325]*/
  1437. ToSwithLight();
  1438. }
  1439. ctx->Answer(TransECWithRepeat(erroCode), GetLastUserCode());
  1440. return nRes;
  1441. }
  1442. int CHSPScannerFSM::StopPreview(SpReqAnsContext<HSPScannerService_CancelPreview_Req,
  1443. HSPScannerService_CancelPreview_Ans>::Pointer ctx)
  1444. {
  1445. ErrorCodeEnum erroCode = Error_Unexpect;
  1446. int nRes = 0;
  1447. if (ctx->Req.bOnlyHide) {
  1448. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  1449. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_VIEW, HSPS_VIEW_HIDE);
  1450. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  1451. if (ISSUCCEEDED(erroCode)) {
  1452. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_CancelPreview).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)("HSPS_VIEW_HIDE");
  1453. nRes = 1;
  1454. } else {
  1455. //RTA2N0Q
  1456. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetParam, "DevAdapter::SetParam", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_CancelPreview, CombineJsonContext("HSPS_VIEW_HIDE"));
  1457. SetLastUserCode(GetAlarmDEC());
  1458. nRes = 4;
  1459. }
  1460. }
  1461. else
  1462. {
  1463. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_USER)("Start to SetPreview(0).");
  1464. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  1465. erroCode = m_hDevHelper->SetPreview(0);
  1466. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  1467. if (ISSUCCEEDED(erroCode)) {
  1468. nRes = 2;
  1469. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_CancelPreview).setAPI("DevAdapter::CancelPreview").setCostTime(ullEnd - ullStart)("SetPreview(0) succ");
  1470. } else {
  1471. //RTA2N04
  1472. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetPreview_Close, "DevAdapter::CancelPreview", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_CancelPreview, CombineJsonContext("SetPreview(0)"));
  1473. const DWORD dwCode = GetAlarmDEC();
  1474. CSimpleStringA tmpRTA(true), tmpDesc(true);
  1475. if (GetEntityBase()->GetFunction()->GetVTMErrMsg(dwCode, tmpDesc, tmpRTA) == Error_Succeed)
  1476. DbgToBeidou(ctx->link, __FUNCTION__).setReturnCode(tmpRTA)();
  1477. SetLastUserCode(dwCode);
  1478. }
  1479. }
  1480. if (ISSUCCEEDED(erroCode)) {
  1481. /** 取消预览时如果仅仅是隐藏也会关闭灯 [Gifur@2025325]*/
  1482. ToSwithLight(false);
  1483. }
  1484. ctx->Answer(TransECWithRepeat(erroCode), GetLastUserCode());
  1485. return nRes;
  1486. }
  1487. bool CHSPScannerFSM::ResizeImage(const CSimpleStringA& fileName, int kbSize)
  1488. {
  1489. double rate; //limit rate
  1490. int width;
  1491. int height;
  1492. bool success = TRUE;
  1493. const int imageSize = kbSize * 1024;
  1494. FILE* fHandle = fopen(fileName.GetData(), "rb");
  1495. if (!fHandle) {
  1496. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI(__FUNCTION__)("fopen image %s for resize failed: %d", fileName.GetData(), errno);
  1497. return FALSE;
  1498. }
  1499. fseek(fHandle, 0, SEEK_END);
  1500. long fileSize = ftell(fHandle);
  1501. fclose(fHandle);
  1502. if (fileSize <= (imageSize)) {
  1503. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_USER)("File(%s)(%u<=%u) no need resize.", (LPCTSTR)fileName, fileSize, imageSize);
  1504. return TRUE;
  1505. }
  1506. CSimpleStringA backUpFile, backUpPath;
  1507. m_pEntity->GetFunction()->GetPath("Temp", backUpPath);
  1508. backUpFile = backUpPath + SPLIT_SLASH_STR + "backupHSPSCannerImage";
  1509. DeleteFileIfExisted(backUpFile);
  1510. #ifndef _WIN32
  1511. fileutil_copy_file((LPCTSTR)backUpFile, (LPCTSTR)fileName);
  1512. #else
  1513. CopyFileA(fileName, backUpFile, FALSE);
  1514. #endif //NOT _WIN32
  1515. while (fileSize > imageSize)
  1516. {
  1517. rate = (double)fileSize / imageSize;
  1518. rate = 1.0 / sqrt(rate); //width and height limit rate
  1519. cv::Mat img = cv::imread(fileName.GetData());
  1520. if (!img.data) {
  1521. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI(__FUNCTION__)("Opencv READ failed!");
  1522. success = FALSE;
  1523. break;
  1524. }
  1525. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_USER)("to resize %lf rate...", rate);
  1526. width = img.cols;
  1527. height = img.rows;
  1528. cv::resize(img, img, cv::Size(width * rate, height * rate));
  1529. const bool openwrite = cv::imwrite(fileName.GetData(), img);
  1530. if (!openwrite) {
  1531. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Opencv WRITE failed!");
  1532. success = FALSE;
  1533. break;
  1534. }
  1535. fHandle = fopen(fileName.GetData(), "rb");
  1536. fseek(fHandle, 0, SEEK_END);
  1537. fileSize = ftell(fHandle);
  1538. fclose(fHandle);
  1539. Sleep(2);
  1540. }
  1541. if (!success) {
  1542. #ifndef _WIN32
  1543. ///*TODO(80374374@3/3/2023): */
  1544. fileutil_copy_file((LPCTSTR)fileName, (LPCTSTR)backUpFile); //recover original img
  1545. #endif //NOT _WIN32
  1546. CopyFileA(backUpFile, fileName, FALSE);
  1547. DeleteFileIfExisted(backUpFile);
  1548. return FALSE;
  1549. }
  1550. fileSize = fileSize / 1024;
  1551. DeleteFileIfExisted(backUpFile);
  1552. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_USER)("HSPScanner resize image succeed, SIZE : %d KB.", fileSize);
  1553. return TRUE;
  1554. }
  1555. int CHSPScannerFSM::ScanImage(SpReqAnsContext<HSPScannerService_ScanImage_Req,
  1556. HSPScannerService_ScanImage_Ans>::Pointer ctx)
  1557. {
  1558. int nRes = 0;
  1559. ErrorCodeEnum erroCode = Error_Unexpect;
  1560. CSimpleStringA csImageFile;
  1561. GetCurImageName(csImageFile);
  1562. BOOL bRet = DelAndGetNewFileName(csImageFile);
  1563. if (!bRet) {
  1564. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_ScanImage).setResultCode(MapCode2RTAString(HSPScanner_UserErrorCode_CLEAR_RESOURCE_FAILED))("Cleare previous image failed before ScanImage");
  1565. ctx->Answer(TransECWithRepeat(Error_Resource), HSPScanner_UserErrorCode_CLEAR_RESOURCE_FAILED);
  1566. return 1;
  1567. }
  1568. ///*TODO: (80374374@2/20/2024)*/
  1569. ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  1570. erroCode = m_hDevHelper->ScanImage((LPCTSTR)csImageFile);
  1571. ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  1572. if (ISSUCCEEDED(erroCode)) {
  1573. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ScanImage").setCostTime(ullEnd - ullStart)("DevAdapter::ScanImage succ");
  1574. ///*TODO: (80374374@2/20/2024)*/
  1575. if (!ResizeImage(csImageFile, m_dwMaxImageSize)) {
  1576. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setResultCode(MapCode2RTAString(LOG_WARN_HSPS_RESIZE_IMAGE_FILE_FAILED)).setAPI(__FUNCTION__)("HSPScanner resize image failed");
  1577. }
  1578. ctx->Ans.filePath = csImageFile;
  1579. CBlob& cbData = ctx->Ans.imageData;
  1580. const DWORD tmpCode(HSPScanner_UserErrorCode_READ_IMAGE_FILE_FAILED);
  1581. FILE* fHandle = fopen(csImageFile, "rb");
  1582. if (fHandle) {
  1583. fseek(fHandle, 0, SEEK_END);
  1584. long fileSize = ftell(fHandle);
  1585. if (fileSize <= 0) {
  1586. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_ScanImage).setResultCode(MapCode2RTAString(tmpCode))("ftell(%s) error after invoking scanimage: %ld.", (LPCTSTR)csImageFile, fileSize);
  1587. erroCode = Error_NotExist;
  1588. fclose(fHandle);
  1589. nRes = 4;
  1590. } else {
  1591. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("picture size:%ld", fileSize);
  1592. cbData.Alloc(fileSize);
  1593. fseek(fHandle, 0, SEEK_SET);
  1594. fread(cbData.m_pData, 1, fileSize, fHandle);
  1595. fclose(fHandle);
  1596. }
  1597. } else {
  1598. erroCode = Error_Resource;
  1599. const int lasterr = errno;
  1600. LogWarn(Severity_Middle, Error_Resource, tmpCode, CSimpleStringA::Format("fopen(%s) failed after invoking scanimage: %d", (LPCTSTR)csImageFile, lasterr));
  1601. SetLastUserCode(tmpCode);
  1602. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_ScanImage).setResultCode(MapCode2RTAString(tmpCode))("fopen(%s) failed after invoking scanimage: %d", (LPCTSTR)csImageFile, lasterr);
  1603. nRes = 4;
  1604. }
  1605. if (ISSUCCEEDED(erroCode)) {
  1606. // Additional ChangeTo Hide --Josephus at 11:32:29 2016/11/22
  1607. if (true/*TODO: */) {
  1608. ullStart = SP::Module::Comm::RVCGetTickCount();
  1609. ErrorCodeEnum eHide = m_hDevHelper->SetParam(HSPS_MODEL_VIEW, HSPS_VIEW_HIDE);
  1610. ullEnd = SP::Module::Comm::RVCGetTickCount();
  1611. if (ISSUCCEEDED(eHide)) {
  1612. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)("Hide Preview Dialog");
  1613. nRes = 6;
  1614. } else {
  1615. //RTA2N0Q
  1616. SetErrorAndLog(eHide, MEC_DEVAPI_HSPSCANNER_SetParam, "DevAdapter::SetParam", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_ScanImage, CombineJsonContext("HSPS_VIEW_HIDE"));
  1617. }
  1618. /** 拍照成功虽然隐藏了但没有关闭灯 [Gifur@2025325]*/
  1619. }
  1620. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_ScanImage).setAPI(__FUNCTION__)("ScanImage succ");
  1621. }
  1622. ctx->Answer(TransECWithRepeat(erroCode), GetLastUserCode());
  1623. } else {
  1624. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_ScanImage, "DevAdapter::ScanImage", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_ScanImage);
  1625. SetLastUserCode(GetAlarmDEC());
  1626. ctx->Answer(TransECWithRepeat(erroCode), GetLastUserCode());
  1627. nRes = 2;
  1628. }
  1629. return nRes;
  1630. }
  1631. int CHSPScannerFSM::ScanImageEx(SpReqAnsContext<HSPScannerService_ScanImageEx_Req,
  1632. HSPScannerService_ScanImageEx_Ans>::Pointer ctx)
  1633. {
  1634. int nRes = 0;
  1635. ErrorCodeEnum erroCode = Error_Unexpect;
  1636. CSimpleStringA csImageFile;
  1637. GetCurImageName(csImageFile, true);
  1638. BOOL bRet = DelAndGetNewFileName(csImageFile);
  1639. if (!bRet) {
  1640. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setResultCode(MapCode2RTAString(HSPScanner_UserErrorCode_CLEAR_RESOURCE_FAILED))("Cleare previous image failed before ScanImageEx");
  1641. ctx->Answer(TransECWithRepeat(Error_Resource), HSPScanner_UserErrorCode_CLEAR_RESOURCE_FAILED);
  1642. return 1;
  1643. }
  1644. int len = 0;
  1645. BYTE* pBtImage = NULL;
  1646. LogWarn(Severity_Low, Error_Debug, LOG_DEBUG_HSPS_CRITICAL_OPERATION_SCANIMAGEEX_START, "to ScanImageEx...");
  1647. ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  1648. erroCode = m_hDevHelper->ScanImageEx(pBtImage, len, (LPCTSTR)csImageFile);
  1649. ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  1650. if(erroCode == Error_TooSmallBuffer) {
  1651. if (pBtImage) {
  1652. delete pBtImage;
  1653. pBtImage = NULL;
  1654. }
  1655. len += MAX_IMAGEDATA_SUFFIX;
  1656. pBtImage = new BYTE[len+1];
  1657. if (pBtImage == NULL) {
  1658. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode(HSPScannerService_LogCode_ScanImageEx).setResultCode("RTA2N0T")("new buffer[%d] failed %d.", len + 1, GetLastError());
  1659. ctx->Answer(Error_Resource);
  1660. return 3;
  1661. }
  1662. memset((void*)pBtImage, 0, len+1);
  1663. ullStart = SP::Module::Comm::RVCGetTickCount();
  1664. erroCode = m_hDevHelper->ScanImageEx(pBtImage, len, (LPCTSTR)csImageFile);
  1665. ullEnd = SP::Module::Comm::RVCGetTickCount();
  1666. if (erroCode == Error_Succeed) {
  1667. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::ScanImageEx").setCostTime(ullEnd - ullStart)("ScanImageEx suc %d, %d.", len, strlen((const char*)pBtImage));
  1668. }
  1669. }
  1670. if (ISSUCCEEDED(erroCode)) {
  1671. if (ResizeImage(csImageFile, m_dwMaxImageSize)) {
  1672. FILE* fHandle = fopen(csImageFile.GetData(), "rb");
  1673. fseek(fHandle, 0, SEEK_END);
  1674. len = ftell(fHandle);
  1675. fseek(fHandle, 0, SEEK_SET);
  1676. if (pBtImage) delete[] pBtImage;
  1677. pBtImage = new BYTE[len];
  1678. fread(pBtImage, 1, len, fHandle);
  1679. fclose(fHandle);
  1680. }
  1681. else {
  1682. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setResultCode(MapCode2RTAString(LOG_WARN_HSPS_RESIZE_IMAGE_FILE_FAILED)).setAPI(__FUNCTION__)("HSPScanner resize image failed");
  1683. }
  1684. ctx->Ans.filePath = csImageFile;
  1685. CBlob& cbData = ctx->Ans.imageData;
  1686. cbData.Alloc((len + 1) * sizeof(BYTE));
  1687. memcpy_s(cbData.m_pData, cbData.m_iLength, pBtImage, len);
  1688. cbData.Resize(len);
  1689. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("ScanImageEx ctx: %s, %d.", (LPCTSTR)ctx->Ans.filePath, ctx->Ans.imageData.m_iLength);
  1690. // Additional ChangeTo Hide --Josephus at 11:29:03 2016/11/22
  1691. if (ISSUCCEEDED(erroCode)) {
  1692. ullStart = SP::Module::Comm::RVCGetTickCount();
  1693. ErrorCodeEnum eHide = m_hDevHelper->SetParam(HSPS_MODEL_VIEW, HSPS_VIEW_HIDE);
  1694. ullEnd = SP::Module::Comm::RVCGetTickCount();
  1695. if (ISSUCCEEDED(eHide)) {
  1696. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)("Hide Preview Dialog");
  1697. nRes = 6;
  1698. } else {
  1699. 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));
  1700. }
  1701. 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);
  1702. }
  1703. ctx->Answer(TransECWithRepeat(erroCode));
  1704. } else {
  1705. //RTA2N06
  1706. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_ScanImageEx, "DevAdapter::ScanImageEx", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_ScanImageEx);
  1707. SetLastUserCode(GetAlarmDEC());
  1708. ctx->Answer(TransECWithRepeat(erroCode), GetLastUserCode());
  1709. nRes = 2;
  1710. }
  1711. if (pBtImage) {
  1712. delete pBtImage;
  1713. pBtImage = NULL;
  1714. }
  1715. return nRes;
  1716. }
  1717. int CHSPScannerFSM::ShowProperty(SpReqAnsContext<HSPScannerService_ShowProperty_Req,
  1718. HSPScannerService_ShowProperty_Ans>::Pointer ctx)
  1719. {
  1720. ErrorCodeEnum erroCode = Error_Succeed;
  1721. // Return ahead. [Josephus in 15:24:15 2016/11/21]
  1722. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  1723. ErrorCodeEnum ePos = m_hDevHelper->SetViewPos(730, 100, 540);
  1724. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  1725. if (FAILURED(ePos)) {
  1726. //RTA2N07
  1727. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetViewPos, "DevAdapter::SetViewPos", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_ShowProperty);
  1728. } else {
  1729. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_ShowProperty).setAPI("DevAdapter::SetViewPos").setCostTime(ullEnd - ullStart)();
  1730. }
  1731. ctx->Answer(TransECWithRepeat(erroCode));
  1732. DWORD dwStart = GetTickCount();
  1733. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Start to show Property dialog...");
  1734. erroCode = m_hDevHelper->SetProperty();
  1735. DWORD dwEnd = GetTickCount();
  1736. if (FAILURED(erroCode)) {
  1737. //RTA2N0U
  1738. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetProperty, "DevAdapter::SetProperty", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_ShowProperty);
  1739. } else {
  1740. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::SetProperty").setCostTime(dwEnd - dwStart)();
  1741. erroCode = m_hDevHelper->SetViewPos(m_nRecX, m_nRecY, m_nRecW);
  1742. }
  1743. return 0;
  1744. }
  1745. int CHSPScannerFSM::SetProperty(SpReqAnsContext<HSPScannerService_SetProperty_Req,
  1746. HSPScannerService_SetProperty_Ans>::Pointer ctx)
  1747. {
  1748. int nRes = 0;
  1749. ErrorCodeEnum erroCode = Error_Succeed;
  1750. int retCode = SetPreviewParam(ctx->Req.colorType, ctx->Req.rotateType, ctx->Req.scanType);
  1751. if (retCode != 0) {
  1752. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_SetProperty).setResultCode(MapCode2RTAString(GetLastUserCode()))("SetParam failed retCode: 0x%X", retCode);
  1753. } else {
  1754. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_SetProperty)("Set Property succ.");
  1755. }
  1756. ctx->Ans.retCode = retCode;
  1757. ctx->Answer(Error_Succeed);
  1758. return nRes;
  1759. }
  1760. int CHSPScannerFSM::SetWinPos(SpReqAnsContext<HSPScannerService_SetWinPos_Req,
  1761. HSPScannerService_SetWinPos_Ans>::Pointer ctx)
  1762. {
  1763. int nRes = 0;
  1764. ErrorCodeEnum erroCode = Error_Unexpect;
  1765. ParamTypeValue value = HSPS_VIEW_SHOW;
  1766. bool bSetCustom = false;
  1767. switch (ctx->Req.type) {
  1768. case 0: value = HSPS_VIEW_HIDE; break;
  1769. case 1: value = HSPS_VIEW_SHOW; break;
  1770. case 2: bSetCustom = true; break;
  1771. default:
  1772. {
  1773. 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);
  1774. ctx->Answer(Error_Param, HSPScanner_UserErrorCode_NOT_SUPPORT);
  1775. return nRes = 3;
  1776. }
  1777. break;
  1778. }
  1779. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_USER)("SetWinPos: %s(%d).", ParamValToString(value), value);
  1780. if (bSetCustom) {
  1781. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_USER)("Start to SetViewPos x(%d), y(%d), w(%d), reserved(%d).",
  1782. ctx->Req.pointX, ctx->Req.pointY, ctx->Req.nWidth, ctx->Req.reserved4);
  1783. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  1784. erroCode = m_hDevHelper->SetViewPos(ctx->Req.pointX, ctx->Req.pointY, ctx->Req.nWidth);
  1785. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  1786. if (ISSUCCEEDED(erroCode)) {
  1787. 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);
  1788. m_nRecX = ctx->Req.pointX;
  1789. m_nRecY = ctx->Req.pointY;
  1790. m_nRecW = ctx->Req.nWidth;
  1791. } else {
  1792. //RTA2N07
  1793. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetViewPos, "DevAdapter::SetViewPos", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_SetWinPos);
  1794. SetLastUserCode(GetAlarmDEC());
  1795. nRes = 2;
  1796. }
  1797. } else {
  1798. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  1799. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_VIEW, value);
  1800. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  1801. if (ISSUCCEEDED(erroCode)) {
  1802. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)("%d", value);
  1803. } else {
  1804. //RTA2N02
  1805. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetParam, "DevAdapter::SetParam", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_SetWinPos);
  1806. SetLastUserCode(GetAlarmDEC());
  1807. nRes = 1;
  1808. }
  1809. }
  1810. if (ISSUCCEEDED(erroCode)) {
  1811. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_SetWinPos)("SetWinPos succ.");
  1812. }
  1813. else {
  1814. CSimpleStringA tmpRTA(true), tmpDesc(true);
  1815. if (GetEntityBase()->GetFunction()->GetVTMErrMsg(GetLastUserCode(), tmpDesc, tmpRTA) == Error_Succeed)
  1816. DbgToBeidou(ctx->link, "SetWinPos").setReturnCode(tmpRTA)();
  1817. }
  1818. ctx->Answer(TransECWithRepeat(erroCode), GetLastUserCode());
  1819. return nRes;
  1820. }
  1821. //JS改造后,作为内部逻辑处理,没有使用该接口
  1822. int CHSPScannerFSM::GetDevStatus(SpReqAnsContext<HSPScannerService_GetDevStatus_Req,
  1823. HSPScannerService_GetDevStatus_Ans>::Pointer ctx)
  1824. {
  1825. int nRes = 0;
  1826. HspsDevStatus status = { 0 };
  1827. ErrorCodeEnum erroCode = GetDevStatusFromAdapter(status, true);
  1828. if (ISSUCCEEDED(erroCode)) {
  1829. ctx->Ans.connected = status.isConnected;
  1830. ctx->Ans.previewing = status.inPreview;
  1831. ctx->Ans.showing = status.inShow;
  1832. }
  1833. else {
  1834. nRes = 1;
  1835. }
  1836. ctx->Answer(TransECWithRepeat(erroCode), GetLastUserCode());
  1837. return nRes;
  1838. }
  1839. ErrorCodeEnum CHSPScannerFSM::GetDevStatusFromAdapter(HspsDevStatus& status, bool fromBusiness)
  1840. {
  1841. ErrorCodeEnum erroCode(Error_NotInit);
  1842. if (m_hDevHelper) {
  1843. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  1844. erroCode = m_hDevHelper->GetDevStatus(status);
  1845. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  1846. if (ISSUCCEEDED(erroCode)) {
  1847. 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);
  1848. }
  1849. else {
  1850. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, fromBusiness ? IsInBusiness() : false, ullEnd - ullStart, fromBusiness ? HSPScannerService_LogCode_GetDevStatus : "");
  1851. if (fromBusiness) SetLastUserCode(GetAlarmDEC());
  1852. }
  1853. }
  1854. return erroCode;
  1855. }
  1856. int CHSPScannerFSM::GetDevInfo(SpReqAnsContext<HSPScannerService_GetDevInfo_Req,
  1857. HSPScannerService_GetDevInfo_Ans>::Pointer ctx)
  1858. {
  1859. int nRes = 0;
  1860. if (m_bOpening) {
  1861. //如果打开还没有结束,GetDevInfo返回Error_NotInit
  1862. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_GetDevInfo).setResultCode(MapCode2RTAString(LOG_WARN_HSPS_OPENING_NOW)).setAPI(__FUNCTION__)("device is opening");
  1863. ctx->Answer(Error_NotInit, LOG_WARN_HSPS_OPENING_NOW);
  1864. nRes = 1;
  1865. } else if (!m_bOpened) {
  1866. //如果打开失败,GetDevInfo应该返回Error_DevNotAvailable
  1867. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_GetDevInfo).setAPI(__FUNCTION__).setResultCode(MapCode2RTAString(GetLastUserCode()))("高拍仪设备未打开");
  1868. ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
  1869. nRes = 1;
  1870. } else {
  1871. //打开成功。GetDevInfo返回Error_Succeed,state放获取模块信息(GetDevCategory这个适配器接口调用)的返回值
  1872. DevCategoryInfo info = { 0 };
  1873. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  1874. ErrorCodeEnum erroCode = m_hDevHelper->GetDevCategory(info);
  1875. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  1876. ctx->Ans.state = (int)(erroCode);
  1877. if (ISSUCCEEDED(erroCode)) {
  1878. ctx->Ans.model = info.szModel;
  1879. ctx->Ans.type = info.szType;
  1880. ctx->Ans.version = CSimpleStringA::Format("%d.%d.%d.%d",
  1881. info.version.wMajor, info.version.wMinor, info.version.wRevision, info.version.wBuild);
  1882. 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"
  1883. , ctx->Ans.model.GetData(), ctx->Ans.state, ctx->Ans.type.GetData(), ctx->Ans.version.GetData());
  1884. }
  1885. else {
  1886. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_GetDevCategory, "DevAdapter::GetDevCategory", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_GetDevInfo);
  1887. SetLastUserCode(GetAlarmDEC());
  1888. nRes = 1;
  1889. }
  1890. ctx->Answer(Error_Succeed);
  1891. }
  1892. return nRes;
  1893. }
  1894. int CHSPScannerFSM::Initial()
  1895. {
  1896. SetDevInitingFlag(true);
  1897. SetDevInitFlag(false);
  1898. ErrorCodeEnum erroCode = LoadUpAdapterLibrary();
  1899. if (erroCode == Error_Succeed) {
  1900. if (Error_Succeed == (erroCode = TryToOpenDevice())) {
  1901. SetDevInitFlag(true);
  1902. SetDevState(DEVICE_STATUS_NORMAL);
  1903. SetDevInitingFlag(false);
  1904. return 0;
  1905. }
  1906. }
  1907. else if (erroCode == Error_NotExist) {
  1908. SetLastUserCode(HSPScanner_UserErrorCode_LOAD_DLLFILE_NOTEIXT);
  1909. }
  1910. else {
  1911. SetLastUserCode(HSPScanner_UserErrorCode_LOAD_DLLFILE_FAILED);
  1912. }
  1913. SetDevInitingFlag(false);
  1914. SetDevInitFlag(false);
  1915. return 1;
  1916. }
  1917. BOOL CHSPScannerFSM::GetCurImageName(CSimpleStringA& csImagName, bool bExt /*= false*/)
  1918. {
  1919. if (bExt) {
  1920. csImagName = "MaterialImageExt.jpg";
  1921. } else {
  1922. csImagName = "MaterialImage.jpg";
  1923. }
  1924. return TRUE;
  1925. }
  1926. BOOL CHSPScannerFSM::DelAndGetNewFileName(CSimpleStringA& csfileName, bool bInBusiness)
  1927. {
  1928. char fileName[MAX_PATH_SIZE] = {0};
  1929. memset(fileName, 0, sizeof(char)*MAX_PATH_SIZE);
  1930. strcpy_s(fileName, MAX_PATH_SIZE, (LPCTSTR)csfileName);
  1931. if (strlen(fileName) == 0 || strchr(fileName, (int)'*') != NULL) {
  1932. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Error input param");
  1933. return FALSE;
  1934. }
  1935. CSimpleStringA strPath, strAimPath;
  1936. m_pEntity->GetFunction()->GetPath("Dep", strPath);
  1937. strAimPath = strPath + SPLIT_SLASH_STR + fileName;
  1938. UpdateAndWarnFileFindInDepBak(strAimPath, fileName, HSPScanner_UserErrorCode_FindFile_in_DepBak);
  1939. #if 0
  1940. ///*TODO(80374374@10/11/2022): 这段代码上线一段时间后要去除,因为从这个版本开始这个文件就不生成在这个目录了 */
  1941. if (ExistsFileA(strAimPath)) {
  1942. if (DeleteFileA((LPCTSTR)strAimPath) != 0) {
  1943. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("DeleteFile(%s) suc.", (LPCTSTR)strAimPath);
  1944. } else {
  1945. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("DeleteFile(%s) failed LastError(%d).", (LPCTSTR)strAimPath, GetLastError());
  1946. }
  1947. }
  1948. strPath.Clear();
  1949. GetEntityBase()->GetFunction()->GetPath("Temp", strPath);
  1950. strAimPath = strPath + SPLIT_SLASH_STR + fileName;
  1951. #endif
  1952. // Add [Josephus in 17:04:27 2016/10/25]
  1953. csfileName = strAimPath;
  1954. if (ExistsFileA(csfileName)) {
  1955. if (RemoveFileA((LPCTSTR)strAimPath) != 0) {
  1956. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("DeleteFile(%s) suc.", (LPCTSTR)strAimPath);
  1957. return TRUE;
  1958. } else {
  1959. if (bInBusiness) {
  1960. DWORD lastErr = GetLastError();
  1961. if (lastErr == 5) {
  1962. Sleep(100);
  1963. if (!ExistsFileA(csfileName) || RemoveFileA((LPCTSTR)strAimPath) != 0) {
  1964. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("DeleteFile(%s) suc.", (LPCTSTR)strAimPath);
  1965. return TRUE;
  1966. }
  1967. lastErr = GetLastError();
  1968. }
  1969. LogError(Severity_Middle, Error_Unexpect, HSPScanner_UserErrorCode_CLEAR_RESOURCE_FAILED, CSimpleStringA::Format(
  1970. "DeleteFile(%s) failed before ScanImage, LastError(%d).", (LPCTSTR)strAimPath, lastErr));
  1971. } else {
  1972. LogWarn(Severity_High, Error_Unexpect, HSPScanner_UserErrorCode_CLEAR_RESOURCE_FAILED, CSimpleStringA::Format(
  1973. "DeleteFile(%s) failed, LastError(%d).", (LPCTSTR)strAimPath, GetLastError()));
  1974. }
  1975. return FALSE;
  1976. }
  1977. } else {
  1978. return TRUE;
  1979. }
  1980. }
  1981. ErrorCodeEnum CHSPScannerFSM::OnDevExit()
  1982. {
  1983. LOG_FUNCTION();
  1984. ErrorCodeEnum erroCode = Error_Succeed;
  1985. if(m_hDevHelper)
  1986. {
  1987. HspsDevStatus status = { 0 };
  1988. erroCode = GetDevStatusFromAdapter(status);
  1989. if (ISSUCCEEDED(erroCode) && status.isConnected)
  1990. {
  1991. if (status.inPreview) {
  1992. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Invoke cancelPreview...");
  1993. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  1994. erroCode = m_hDevHelper->SetPreview(0);
  1995. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  1996. if (ISSUCCEEDED(erroCode)) {
  1997. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode(__FUNCTION__).setAPI("DevAdapter::CancelPreview").setCostTime(ullEnd - ullStart)("OnDevExit::SetPreview(0)");
  1998. ToSwithLight(false);
  1999. } else {
  2000. //RTA2N04
  2001. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetPreview_Close, "DevAdapter::CancelPreview", __FUNCTION__, false, ullEnd - ullStart, "", CombineJsonContext("OnDevExit::SetPreview(0)"));
  2002. }
  2003. }
  2004. } else if(ISSUCCEEDED(erroCode) && !status.isConnected){
  2005. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("HSPSCanner device is disconnected!");
  2006. }
  2007. }
  2008. ClearPictureFileSure();
  2009. return erroCode;
  2010. }
  2011. void CHSPScannerFSM::SelfTest(EntityTestEnum eTestType,
  2012. CSmartPointer<ITransactionContext> pTransactionContext)
  2013. {
  2014. OnHardwareShakeHand(pTransactionContext);
  2015. }
  2016. void CHSPScannerFSM::OnStateTrans(int iSrcState, int iDstState)
  2017. {
  2018. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("trans from %s to %s", GetStateName(iSrcState), GetStateName(iDstState));
  2019. m_nSrcState = iSrcState;
  2020. }
  2021. int CHSPScannerFSM::StartPreviewJS(SpReqAnsContext<HSPScannerService_StartPreviewJS_Req, HSPScannerService_StartPreviewJS_Ans>::Pointer ctx)
  2022. {
  2023. LOG_FUNCTION();
  2024. ErrorCodeEnum erroCode = Error_Unexpect;
  2025. int ret(0);
  2026. SetLastUserCode();
  2027. if(JS::PreviewSettings(ctx->Req).IsAvailable()) {
  2028. erroCode = SetPreviewProperty(JS::PreviewSettings(ctx->Req), HSPScannerService_LogCode_StartPreviewJS);
  2029. if (FAILURED(erroCode)) {
  2030. ctx->Answer(Error_Unexpect, GetLastUserCode());
  2031. return 1;
  2032. }
  2033. }
  2034. //TODO: [Gifur@2025318]
  2035. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_USER)("Start to Preview...");
  2036. ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  2037. erroCode = m_hDevHelper->SetPreview(1);
  2038. ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  2039. if (FAILURED(erroCode)) {
  2040. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetPreview_Open, "DevAdapter::SetPreview", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_StartPreviewJS, CombineJsonContext("StartPreview::SetPreview(1)"));
  2041. SetLastUserCode(GetAlarmDEC());
  2042. erroCode = Error_Unexpect;
  2043. ret = 1;
  2044. }
  2045. else {
  2046. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_StartPreviewJS).setAPI("DevAdapter::SetPreview").setCostTime(ullEnd - ullStart)("StartPreview::SetPreview(1)");
  2047. ToSwithLight();
  2048. }
  2049. ctx->Answer(erroCode, GetLastUserCode());
  2050. return ret;
  2051. }
  2052. int CHSPScannerFSM::CancelPreview(SpReqAnsContext<HSPScannerService_CancelPreviewJS_Req, HSPScannerService_CancelPreviewJS_Ans>::Pointer ctx)
  2053. {
  2054. LOG_FUNCTION();
  2055. ErrorCodeEnum erroCode = Error_Unexpect;
  2056. int ret(0);
  2057. SetLastUserCode();
  2058. if (ctx->Req.hide) {
  2059. erroCode = SetPreviewProperty(JS::PreviewSettings(false), HSPScannerService_LogCode_CancelPreviewJS);
  2060. if (FAILURED(erroCode)) {
  2061. ctx->Answer(Error_Unexpect, GetLastUserCode());
  2062. ret = 1;
  2063. }
  2064. else {
  2065. ctx->Answer(Error_Succeed);
  2066. }
  2067. }
  2068. else {
  2069. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_USER)("Start to CancelPreview...");
  2070. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  2071. erroCode = m_hDevHelper->SetPreview(0);
  2072. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  2073. if (ISSUCCEEDED(erroCode)) {
  2074. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_CancelPreviewJS).setAPI("DevAdapter::CancelPreview").setCostTime(ullEnd - ullStart)("SetPreview(0) succ");
  2075. ctx->Answer(Error_Succeed);
  2076. }
  2077. else {
  2078. //RTA2N04
  2079. SetErrorAndLog(erroCode, LOG_EVT_HSPS_CANCEL_PREVIEW_FAILED, "DevAdapter::CancelPreview", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_CancelPreviewJS, CombineJsonContext("SetPreview(0)"));
  2080. SetLastUserCode(GetAlarmDEC());
  2081. ctx->Answer(Error_Unexpect, GetLastUserCode());
  2082. ret = 1;
  2083. }
  2084. }
  2085. if (ISSUCCEEDED(erroCode)) {
  2086. ToSwithLight(false);
  2087. }
  2088. return ret;
  2089. }
  2090. int CHSPScannerFSM::ScanImageJS(SpReqAnsContext<HSPScannerService_ScanImageJS_Req, HSPScannerService_ScanImageJS_Ans>::Pointer ctx)
  2091. {
  2092. LOG_FUNCTION();
  2093. ErrorCodeEnum erroCode = Error_Unexpect;
  2094. int ret(0);
  2095. SetLastUserCode();
  2096. CSimpleStringA csImageFile(true);
  2097. GetCurImageName(csImageFile);
  2098. DelAndGetNewFileName(csImageFile);
  2099. ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  2100. erroCode = m_hDevHelper->ScanImage((LPCTSTR)csImageFile);
  2101. ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  2102. if (ISSUCCEEDED(erroCode)) {
  2103. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ScanImage").setCostTime(ullEnd - ullStart)("DevAdapter::ScanImage succ");
  2104. if (ctx->Req.compress > 0 && !ResizeImage(csImageFile, ctx->Req.compress/*KB*/)) {
  2105. 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");
  2106. SetLastUserCode(LOG_WARN_HSPS_RESIZE_IMAGE_FILE_FAILED);
  2107. erroCode = Error_Unexpect;
  2108. ret = 1;
  2109. }
  2110. else {
  2111. CSimpleStringA tmpMsg(true);
  2112. CBlob& cbData = ctx->Ans.imageData;
  2113. FILE* fHandle = fopen(csImageFile, "rb");
  2114. if (fHandle) {
  2115. fseek(fHandle, 0, SEEK_END);
  2116. long fileSize = ftell(fHandle);
  2117. if (fileSize <= 0) {
  2118. tmpMsg = CSimpleStringA::Format("ftell(%s) error after invoking scanimage: %ld.", (LPCTSTR)csImageFile, fileSize);
  2119. }
  2120. else {
  2121. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("picture size:%ld", fileSize);
  2122. cbData.Alloc(fileSize);
  2123. fseek(fHandle, 0, SEEK_SET);
  2124. fread(cbData.m_pData, 1, fileSize, fHandle);
  2125. }
  2126. fclose(fHandle);
  2127. }
  2128. else {
  2129. tmpMsg = CSimpleStringA::Format("fopen(%s) error after invoking scanimage: %d.", (LPCTSTR)csImageFile, errno);
  2130. }
  2131. if (tmpMsg.IsNullOrEmpty()) {
  2132. //Succ
  2133. if (ctx->Req.hide && FAILURED(SetPreviewProperty(JS::PreviewSettings(false), HSPScannerService_LogCode_ScanImageJS))) {
  2134. erroCode = Error_Unexpect;
  2135. ret = 1;
  2136. }
  2137. else {
  2138. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_ScanImageJS).setAPI(__FUNCTION__)("ScanImage succ");
  2139. }
  2140. }
  2141. else {
  2142. const DWORD tmpCode(HSPScanner_UserErrorCode_READ_IMAGE_FILE_FAILED);
  2143. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_ScanImageJS).setResultCode(MapCode2RTAString(tmpCode))(tmpMsg.GetData());
  2144. SetLastUserCode(tmpCode);
  2145. erroCode = Error_Unexpect;
  2146. ret = 1;
  2147. }
  2148. }
  2149. }
  2150. else {
  2151. SetErrorAndLog(erroCode, LOG_EVT_HSPS_SCANIMAGE_FAILED, "DevAdapter::ScanImage", __FUNCTION__
  2152. , IsInBusiness(), ullEnd - ullStart, HSPScannerService_LogCode_ScanImageJS);
  2153. SetLastUserCode(GetAlarmDEC());
  2154. erroCode = Error_Unexpect;
  2155. ret = 1;
  2156. }
  2157. ctx->Answer(erroCode, GetLastUserCode());
  2158. return ret;
  2159. }
  2160. int CHSPScannerFSM::SetParam(SpReqAnsContext<HSPScannerService_SetParamJS_Req, HSPScannerService_SetParamJS_Ans>::Pointer ctx)
  2161. {
  2162. LOG_FUNCTION();
  2163. ErrorCodeEnum erroCode = Error_Unexpect;
  2164. int ret(0);
  2165. SetLastUserCode();
  2166. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("rotate:%d,scan:%d,color:%d,pos:%d,x:%d,y:%d,w:%d",
  2167. ctx->Req.rotate, ctx->Req.scan, ctx->Req.color, ctx->Req.pos, ctx->Req.pos_x, ctx->Req.pos_y, ctx->Req.pos_w);
  2168. erroCode = SetPreviewProperty(JS::PreviewSettings(ctx->Req), HSPScannerService_LogCode_SetParamJS);
  2169. if (FAILURED(erroCode)) ret = 1;
  2170. ctx->Answer(erroCode, GetLastUserCode());
  2171. return ret;
  2172. }
  2173. ErrorCodeEnum CHSPScannerFSM::SetPreviewProperty(const JS::PreviewSettings& val, const char* logCode)
  2174. {
  2175. ErrorCodeEnum erroCode(Error_Succeed);
  2176. const bool isBusiness = (logCode == NULL || strlen(logCode) == 0) ? false : IsInBusiness();
  2177. if (val.color > 0 && val.color < 4) {
  2178. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  2179. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_COLOR, Param_Color_Map[val.color]);
  2180. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  2181. if (ISSUCCEEDED(erroCode)) {
  2182. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)(ParamValToString(Param_Color_Map[val.color]));
  2183. }
  2184. else {
  2185. SetErrorAndLog(erroCode, HSPScanner_UserErrorCode_SetParam_Color, "DevAdapter::SetParam", __FUNCTION__, isBusiness, ullEnd - ullStart, logCode, CombineJsonContext(ParamValToString(Param_Color_Map[val.color])));
  2186. SetLastUserCode(GetAlarmDEC());
  2187. return Error_Unexpect;
  2188. }
  2189. }
  2190. //////////////////////////////////////////////////////////////////////////
  2191. if (val.rotate > 0 && val.rotate < 5) {
  2192. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  2193. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_ROTATE, Param_Rotate_Map[val.rotate]);
  2194. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  2195. if (ISSUCCEEDED(erroCode)) {
  2196. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)(ParamValToString(Param_Rotate_Map[val.rotate]));
  2197. }
  2198. else {
  2199. SetErrorAndLog(erroCode, HSPScanner_UserErrorCode_SetParam_Rotate, "DevAdapter::SetParam", __FUNCTION__, isBusiness, ullEnd - ullStart, logCode, CombineJsonContext(ParamValToString(Param_Rotate_Map[val.rotate])));
  2200. SetLastUserCode(GetAlarmDEC());
  2201. return Error_Unexpect;
  2202. }
  2203. }
  2204. //////////////////////////////////////////////////////////////////////////
  2205. if (val.scan > 0 && val.scan < 4) {
  2206. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  2207. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_SCANSIZE, Param_Scan_Map[val.scan]);
  2208. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  2209. if (ISSUCCEEDED(erroCode)) {
  2210. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)(ParamValToString(Param_Scan_Map[val.scan]));
  2211. }
  2212. else {
  2213. SetErrorAndLog(erroCode, HSPScanner_UserErrorCode_SetParam_Scan, "DevAdapter::SetParam", __FUNCTION__, isBusiness, ullEnd - ullStart, logCode, CombineJsonContext(ParamValToString(Param_Scan_Map[val.scan])));
  2214. SetLastUserCode(GetAlarmDEC());
  2215. return Error_Unexpect;
  2216. }
  2217. }
  2218. //////////////////////////////////////////////////////////////////////////
  2219. if (val.pos != 0) {
  2220. CSimpleStringA tmpParm = CSimpleStringA::Format("x(%d), y(%d), w(%d)", val.pos_x, val.pos_y, val.pos_w);
  2221. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_USER)("Start to SetViewPos %s...", tmpParm.GetData());
  2222. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  2223. erroCode = m_hDevHelper->SetViewPos(val.pos_x, val.pos_y, val.pos_w);
  2224. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  2225. if (ISSUCCEEDED(erroCode)) {
  2226. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::SetViewPos").setCostTime(ullEnd - ullStart)(tmpParm);
  2227. m_nRecX = val.pos_x;
  2228. m_nRecY = val.pos_y;
  2229. m_nRecW = val.pos_w;
  2230. }
  2231. else {
  2232. //RTA2N07
  2233. SetErrorAndLog(erroCode, HSPScanner_UserErrorCode_SetParam_Position, "DevAdapter::SetViewPos", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, logCode, CombineJsonContext(tmpParm));
  2234. SetLastUserCode(GetAlarmDEC());
  2235. return Error_Unexpect;
  2236. }
  2237. }
  2238. //////////////////////////////////////////////////////////////////////////
  2239. if (val.view != 0) {
  2240. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  2241. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_VIEW, Param_View_Map[val.view]);
  2242. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  2243. if (ISSUCCEEDED(erroCode)) {
  2244. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)(ParamValToString(Param_View_Map[val.view]));
  2245. }
  2246. else {
  2247. SetErrorAndLog(erroCode, val.view == 1 ? HSPScanner_UserErrorCode_SetParam_View : HSPScanner_UserErrorCode_SetParam_Hide
  2248. , "DevAdapter::SetParam", __FUNCTION__, isBusiness, ullEnd - ullStart, logCode, CombineJsonContext(ParamValToString(Param_View_Map[val.view])));
  2249. SetLastUserCode(GetAlarmDEC());
  2250. return Error_Unexpect;
  2251. }
  2252. }
  2253. return erroCode;
  2254. }
  2255. void CHSPScannerFSM::ToSwithLight(bool turnOn /*= true*/)
  2256. {
  2257. if (m_lightOn != turnOn) {
  2258. if (turnOn) LogEvent(Severity_Middle, LOG_EVT_HSPS_LIGHT_ON, "HSPScanner warning on.");
  2259. else LogEvent(Severity_Middle, LOG_EVT_HSPS_LIGHT_OFF, "HSPScanner warning off.");
  2260. m_lightOn = turnOn;
  2261. }
  2262. }
  2263. //TODO: JS完全替换后,这个函数要废弃换成SetPreviewProperty替代 [Gifur@2025318]
  2264. int CHSPScannerFSM::SetPreviewParam(int colorType, int rotateType, int scanType, bool abortIfFault)
  2265. {
  2266. ErrorCodeEnum erroCode;
  2267. int retCode = 0;
  2268. if (colorType > 0 && colorType < 4) {
  2269. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  2270. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_COLOR, Param_Color_Map[colorType]);
  2271. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  2272. if (ISSUCCEEDED(erroCode)) {
  2273. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)(ParamValToString(Param_Color_Map[colorType]));
  2274. }
  2275. else {
  2276. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetParam, "DevAdapter::SetParam", __FUNCTION__, abortIfFault ? IsInBusiness() : false, ullEnd - ullStart, HSPScannerService_LogCode_SetProperty, CombineJsonContext(ParamValToString(Param_Color_Map[colorType])));
  2277. retCode |= 0x0001;
  2278. SetLastUserCode(GetAlarmDEC(MEC_DEVAPI_HSPSCANNER_SetParam));
  2279. }
  2280. }
  2281. //////////////////////////////////////////////////////////////////////////
  2282. if (rotateType > 0 && rotateType < 5) {
  2283. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  2284. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_ROTATE, Param_Rotate_Map[rotateType]);
  2285. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  2286. if (ISSUCCEEDED(erroCode)) {
  2287. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)(ParamValToString(Param_Rotate_Map[rotateType]));
  2288. }
  2289. else {
  2290. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetParam, "DevAdapter::SetParam", __FUNCTION__, abortIfFault ? IsInBusiness() : false, ullEnd - ullStart, HSPScannerService_LogCode_SetProperty, CombineJsonContext(ParamValToString(Param_Rotate_Map[rotateType])));
  2291. retCode |= 0x0002;
  2292. SetLastUserCode(GetAlarmDEC(MEC_DEVAPI_HSPSCANNER_SetParam));
  2293. }
  2294. }
  2295. //////////////////////////////////////////////////////////////////////////
  2296. if (scanType > 0 && scanType < 4) {
  2297. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  2298. erroCode = m_hDevHelper->SetParam(HSPS_MODEL_SCANSIZE, Param_Scan_Map[scanType]);
  2299. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  2300. if (ISSUCCEEDED(erroCode)) {
  2301. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)(ParamValToString(Param_Scan_Map[scanType]));
  2302. }
  2303. else {
  2304. SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetParam, "DevAdapter::SetParam", __FUNCTION__, abortIfFault ? IsInBusiness() : false, ullEnd - ullStart, HSPScannerService_LogCode_SetProperty, CombineJsonContext(ParamValToString(Param_Scan_Map[scanType])));
  2305. retCode |= 0x0004;
  2306. SetLastUserCode(GetAlarmDEC(MEC_DEVAPI_HSPSCANNER_SetParam));
  2307. }
  2308. }
  2309. return retCode;
  2310. }
  2311. ErrorCodeEnum CHSPScannerFSM::DeleteFileIfExisted(LPCTSTR fileName)
  2312. {
  2313. if (ExistsFileA(fileName)) {
  2314. if (RemoveFileA(fileName) != 0) {
  2315. return Error_Succeed;
  2316. }
  2317. else {
  2318. LogWarn(Severity_High, Error_Unexpect, HSPScanner_UserErrorCode_CLEAR_RESOURCE_FAILED, CSimpleStringA::Format(
  2319. "DeleteFile(%s) failed LastError(%d) at ResizeImage proc", fileName, GetLastError()));
  2320. return Error_Unexpect;
  2321. }
  2322. }
  2323. else {
  2324. return Error_Succeed;
  2325. }
  2326. }
  2327. void CHSPScannerFSM::InitialMaxResizeValue()
  2328. {
  2329. CSmartPointer<IEntityFunction> spFunction = this->GetEntityBase()->GetFunction();
  2330. CSmartPointer<IConfigInfo> spConfig;
  2331. spFunction->OpenConfig(Config_CenterSetting, spConfig);
  2332. int kb = 0;
  2333. spConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "ImageMaxSize", kb);
  2334. if (kb > 0) {
  2335. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Get image max size from CS: %d", kb);
  2336. m_dwMaxImageSize = kb;
  2337. return;
  2338. }
  2339. }
  2340. ErrorCodeEnum CHSPScannerFSM::TryToOpenDevice()
  2341. {
  2342. ErrorCodeEnum result(Error_Succeed);
  2343. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("to open device...");
  2344. ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  2345. result = m_hDevHelper->DevOpen();
  2346. ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  2347. if (FAILURED(result)) {
  2348. //RTA2N01 / 21700001
  2349. SetErrorAndLog(result, MEC_DEVAPI_HSPSCANNER_DevOpen, "DevAdapter::DevOpen", __FUNCTION__, false, ullEnd - ullStart);
  2350. SetLastUserCode(LOG_ERR_HSPS_DEVOPEN_FAILED);
  2351. }
  2352. else {
  2353. SetLastUserCode();
  2354. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DevOpen").setCostTime(ullEnd - ullStart)("Open HSPS succ");
  2355. ullStart = SP::Module::Comm::RVCGetTickCount();
  2356. result = FulfillAdapterDevCategory();
  2357. ullEnd = SP::Module::Comm::RVCGetTickCount();
  2358. if (result != Error_Succeed) {
  2359. SetErrorAndLog(result, MEC_DEVAPI_HSPSCANNER_GetDevCategory, "DevAdapter::GetDevCategory", "FulfillAdapterDevCategory", false, ullEnd - ullStart);
  2360. }
  2361. m_nRecX = 0;
  2362. m_nRecY = 224;
  2363. m_nRecW = 1024;
  2364. ErrorCodeEnum ecInit = m_hDevHelper->SetViewPos(m_nRecX, m_nRecY, m_nRecW);
  2365. ErrorCodeEnum ecInitScan = m_hDevHelper->SetParam(HSPS_MODEL_SCANSIZE, HSPS_SCAN_FULL);
  2366. ErrorCodeEnum ecInitRotate = m_hDevHelper->SetParam(HSPS_MODEL_ROTATE, HSPS_ROTATE_NOANGLE);
  2367. ErrorCodeEnum ecInitColor = m_hDevHelper->SetParam(HSPS_MODEL_COLOR, HSPS_COLOR_FULL);
  2368. if (FAILURED(ecInit) || FAILURED(ecInitScan) || FAILURED(ecInitRotate) || FAILURED(ecInitColor)) {
  2369. 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));
  2370. }
  2371. }
  2372. return result;
  2373. }
  2374. LPCTSTR CHSPScannerFSM::MapCode2RTAString(DWORD dwValue)
  2375. {
  2376. static CSimpleStringA tmpRTA(true);
  2377. CSimpleStringA tmpDesc(true);
  2378. ErrorCodeEnum err(Error_Succeed);
  2379. tmpRTA = "";
  2380. if ((err=GetEntityBase()->GetFunction()->GetVTMErrMsg(dwValue, tmpDesc, tmpRTA)) == Error_Succeed) {
  2381. return tmpRTA.GetData();
  2382. }
  2383. else if (dwValue != 0) {
  2384. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("cannot found 0x%X from ResStatic: %s", dwValue, SpStrError(err));
  2385. }
  2386. /** 降级处理 [Gifur@2025325]*/
  2387. switch (dwValue) {
  2388. case 0x2170000C: /*未登记到资源管理平台*/
  2389. return "RTA2N0C";
  2390. break;
  2391. case 0:
  2392. default:
  2393. return "SUC0000";
  2394. break;
  2395. }
  2396. }