ScannerSetFSM.cpp 70 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271
  1. #include "stdafx.h"
  2. #include "ScannerSetFSM.h"
  3. #include "EventCode.h"
  4. #include "SpIni.h"
  5. #if defined(RVC_OS_WIN)
  6. #include "CameraImpl.h"
  7. #include "SetupApi.h"
  8. #pragma comment(lib, "SetupAPI.lib")
  9. #else
  10. #include "toolkit.h"
  11. #include "iniutil.h"
  12. #include "CommEntityUtil.hpp"
  13. #endif //RVC_OS_WIN
  14. #include "path.h"
  15. #define CHECKDEV_TIMER_ID 1
  16. const int MILLISECOND_TO_CHECKDEV = 15 * 1000;
  17. const int MILLISECOND_TO_CHECK_CONNECT = 30 * 1000;
  18. const int MAX_PATH_SIZE = 256;
  19. const int MAX_ERROR_TIMES = 2;
  20. const int MILLISECOND_WAIT_TIMEOUT_DEFAULT = 10 * 1000;
  21. const int MILLISECOND_WAIT_TIMEOUT_STARTPREVIEW = 20 * 1000;
  22. const int MILLISECOND_WAIT_TIMEOUT_SCANIMAGE = 15 * 1000;
  23. #define MODULE_VERION_FULL "1.0.0.9"
  24. const char* EvtTypeToString(int nEvtType)
  25. {
  26. switch(nEvtType)
  27. {
  28. case USER_EVT_STARTPREVIEW: return "USER_EVT_STARTPREVIEW";
  29. break;
  30. case USER_EVT_STARTPREVIEW_FINISHED: return "USER_EVT_STARTPREVIEW_FINISHED";
  31. break;
  32. case USER_EVT_STOPPREVIEW: return "USER_EVT_STOPPREVIEW";
  33. break;
  34. case USER_EVT_STOPPREVIEW_FINISHED: return "USER_EVT_STOPPREVIEW_FINISHED";
  35. break;
  36. case USER_EVT_SETWINPOS: return "USER_EVT_SETWINPOS";
  37. break;
  38. case USER_EVT_SETWINPOS_FINISHED: return "USER_EVT_SETWINPOS_FINISHED";
  39. break;
  40. case USER_EVT_SCANIMAGE: return "USER_EVT_SCANIMAGE";
  41. break;
  42. case USER_EVT_SCANIMAGEFINISHED: return "USER_EVT_SCANIMAGEFINISHED";
  43. break;
  44. case USER_EVT_SETPROPERTY: return "USER_EVT_SETPROPERTY";
  45. break;
  46. case USER_EVT_SETPROPERTY_FINISHED: return "USER_EVT_SETPROPERTY_FINISHED";
  47. break;
  48. case USER_EVT_SHOWPROPERTY: return "USER_EVT_SHOWPROPERTY";
  49. break;
  50. case USER_EVT_SHOWPROPERTY_FINISHED: return "USER_EVT_SHOWPROPERTY_FINISHED";
  51. break;
  52. case USER_EVT_GETSTATUS: return "USER_EVT_GETSTATUS";
  53. break;
  54. case USER_EVT_GETSTATUS_FINISHED: return "USER_EVT_GETSTATUS_FINISHED";
  55. break;
  56. case USER_EVT_GETINFO: return "USER_EVT_GETINFO";
  57. break;
  58. case USER_EVT_GETINFO_FINISHED: return "USER_EVT_GETINFO_FINISHED";
  59. break;
  60. case USER_EVT_EXIT: return "USER_EVT_EXIT";
  61. break;
  62. case USER_EVT_QUIT: return "USER_EVT_QUIT";
  63. break;
  64. case USER_EVT_RESET: return "USER_EVT_RESET";
  65. break;
  66. case USER_EVT_DEV_INVALID: return "USER_EVT_DEV_INVALID";
  67. break;
  68. case USER_EVT_DEV_RECOVER: return "USER_EVT_DEV_RECOVER";
  69. break;
  70. case USER_EVT_OPERATING: return "USER_EVT_OPERATING";
  71. break;
  72. case EVT_TIMER: return "EVT_TIMER";
  73. break;
  74. default:
  75. return "Unknown EventType";
  76. break;
  77. }
  78. return "Unknown EventType";
  79. }
  80. const char* CameraTypeToString(CapTypeEnum devType)
  81. {
  82. switch(devType) {
  83. case CAMTYPE_UNKNOWN:
  84. return "[Default]";
  85. break;
  86. case CAMTYPE_ENV:
  87. return "[ENV]";
  88. break;
  89. case CAMTYPE_OPT:
  90. return "[OPT]";
  91. break;
  92. case CAMTYPE_EWS:
  93. return "[EWS]";
  94. break;
  95. case CAMTYPE_HSPS:
  96. return "[HSPS]";
  97. break;
  98. case CAMTYPE_CIRCLE:
  99. return "[CIRCLE]";
  100. break;
  101. case CAMTYPE_MAX:
  102. default:
  103. break;
  104. }
  105. return "[Unregonized]";
  106. }
  107. static bool MapErrorCode2Level(ErrorCodeEnum ec)
  108. {
  109. return (ec == Error_IO || ec == Error_NetBroken || ec == Error_TimeOut);
  110. }
  111. CScannerFSM::CScannerFSM(void)
  112. :
  113. m_csMachineType(true),
  114. m_csSite(true),
  115. m_bPadMachine(false),
  116. m_bStand2SMachine(false),
  117. m_bDesk2SMachine(false),
  118. m_bUsePortableScanner(false),
  119. m_pHSPSClient(NULL),
  120. m_pPortableClient(NULL),
  121. m_pMediaControlClient(NULL),
  122. m_ecSelfTest(Error_Succeed),
  123. m_dwErroCode(0),
  124. m_nFatalTimes(0),
  125. m_nSrcState(s0),
  126. m_iEvt(-1)
  127. {
  128. ListEntry_InitHead(&ContextListHead);
  129. #if defined(RVC_OS_WIN)
  130. InitializeCriticalSection(&cs_devEvt);
  131. m_hrCoInited = CoInitializeEx(NULL, COINIT_MULTITHREADED);
  132. #endif //RVC_OS_WIN
  133. }
  134. CScannerFSM::~CScannerFSM(void)
  135. {
  136. ReleaseSuitableEntity();
  137. #if defined(RVC_OS_WIN)
  138. DestoryCamereBuckets(m_cameralist);
  139. DeleteCriticalSection(&cs_devEvt);
  140. if (m_hrCoInited == S_OK) {
  141. CoUninitialize();
  142. }
  143. #endif //RVC_OS_WIN
  144. FreeMediaControllerClient();
  145. }
  146. ErrorCodeEnum CScannerFSM::OnInit()
  147. {
  148. ErrorCodeEnum erroCode = Error_Succeed;
  149. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Version: %s, Complied at: %s %s", MODULE_VERION_FULL, __DATE__, __TIME__);
  150. CSmartPointer<IConfigInfo> spConfig;
  151. CSystemStaticInfo sysInfo;
  152. GetEntityBase()->GetFunction()->GetSystemStaticInfo(sysInfo);
  153. m_csMachineType = sysInfo.strMachineType;
  154. m_csSite = sysInfo.strSite;
  155. m_strTerminalNo = sysInfo.strTerminalID;
  156. m_bPadMachine = !m_csMachineType.Compare("RVC.Pad", true);
  157. if(!m_bPadMachine) {
  158. m_bDesk2SMachine = !m_csMachineType.Compare("RVC.Desk2S", true);
  159. }
  160. m_bStand2SMachine = !m_csMachineType.Compare("RVC.Stand2S", true);
  161. #if defined(_MSC_VER)
  162. if(ShouldUsePortableScanner()) {
  163. m_bUsePortableScanner = true;
  164. LoadConfigAboutCamera();
  165. GetCameraInfors(m_cameralist);
  166. HANDLE hEvtThread = (HANDLE)_beginthreadex(NULL, 0, EventRevThread, this, 0, NULL);
  167. if(hEvtThread == NULL || hEvtThread == INVALID_HANDLE_VALUE) {
  168. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Create EventRevThread failed");
  169. } else {
  170. int times = 0;
  171. while(gEventRevWnd == NULL && times < 10) {
  172. Sleep(200);
  173. times++;
  174. }
  175. if(times >= 10 && gEventRevWnd == NULL) {
  176. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("event recv windows handle is null");
  177. }
  178. }
  179. }
  180. #endif //_MSC_VER
  181. return erroCode;
  182. }
  183. void CScannerFSM::AfterInit()
  184. {
  185. if (m_bDesk2SMachine && IsPortScanHoldEnvCameraFromSysVar()) {
  186. ScannerDeviceInfo existed = {};
  187. int state = 0;
  188. ErrorCodeEnum ec1 = IsPortScanHoldDevice(&existed, state);
  189. if (ISSUCCEEDED(ec1)) {
  190. if (state == 0 || existed.devType != CAMTYPE_ENV) {
  191. AccessCamerePriviledge(false, CAMTYPE_ENV);
  192. }
  193. }
  194. }
  195. }
  196. ErrorCodeEnum CScannerFSM::OnExit()
  197. {
  198. return Error_Succeed;
  199. }
  200. void CScannerFSM::s0_on_entry()
  201. {
  202. m_nFatalTimes = 0;
  203. m_ecSelfTest = Error_Succeed;
  204. }
  205. void CScannerFSM::s0_on_exit()
  206. {
  207. }
  208. unsigned int CScannerFSM::s0_on_event(FSMEvent* e)
  209. {
  210. unsigned int uRet = 0;
  211. switch(e->iEvt)
  212. {
  213. case USER_EVT_OPERATING:
  214. {
  215. OperatingEvent* pEvt = dynamic_cast<OperatingEvent*>(e);
  216. m_iEvt = pEvt->m_bindEvt;
  217. pEvt->SetHandled();
  218. }
  219. break;
  220. case USER_EVT_DEV_INVALID:
  221. {
  222. }
  223. e->SetHandled();
  224. break;
  225. case USER_EVT_STARTPREVIEW:
  226. {
  227. StartPreviewTask* pTask = new StartPreviewTask(this);
  228. StartPreviewEvent* pEvt = dynamic_cast<StartPreviewEvent*>(e);
  229. pTask->SetContext(pEvt->m_ctx);
  230. PostEventFIFO(new OperatingEvent(e->iEvt)); //operating event.
  231. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  232. e->SetHandled();
  233. }
  234. break;
  235. case USER_EVT_STOPPREVIEW:
  236. {
  237. StopPreviewTask* pTask = new StopPreviewTask(this);
  238. StopPreviewEvent* pEvt = dynamic_cast<StopPreviewEvent*>(e);
  239. pTask->SetContext(pEvt->m_ctx);
  240. PostEventFIFO(new OperatingEvent(e->iEvt)); //operating event.
  241. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  242. }
  243. e->SetHandled();
  244. break;
  245. case USER_EVT_SCANIMAGE:
  246. {
  247. ScanImageTask* pTask = new ScanImageTask(this);
  248. ScanImageEvent* pEvt = dynamic_cast<ScanImageEvent*>(e);
  249. pTask->SetContext(pEvt->m_ctx);
  250. PostEventFIFO(new OperatingEvent(e->iEvt)); //operating event.
  251. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  252. }
  253. e->SetHandled();
  254. break;
  255. case USER_EVT_SETPROPERTY:
  256. {
  257. SetPropertyEvent* pEvt = dynamic_cast<SetPropertyEvent*>(e);
  258. SetPropertyTask* pTask = new SetPropertyTask(this);
  259. pTask->SetContext(pEvt->m_ctx);
  260. PostEventFIFO(new OperatingEvent(e->iEvt)); //operating event.
  261. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  262. }
  263. e->SetHandled();
  264. break;
  265. case USER_EVT_SHOWPROPERTY:
  266. {
  267. ShowPropertyEvent* pEvt = dynamic_cast<ShowPropertyEvent*>(e);
  268. ShowPropertyTask* pTask = new ShowPropertyTask(this);
  269. pTask->SetContext(pEvt->m_ctx);
  270. PostEventFIFO(new OperatingEvent(e->iEvt)); //operating event.
  271. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  272. }
  273. e->SetHandled();
  274. break;
  275. case USER_EVT_SETWINPOS:
  276. {
  277. SetWinPosEvent* pEvt = dynamic_cast<SetWinPosEvent*>(e);
  278. SetWinPosTask* pTask = new SetWinPosTask(this);
  279. pTask->SetContext(pEvt->m_ctx);
  280. PostEventFIFO(new OperatingEvent(e->iEvt)); //operating event.
  281. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  282. }
  283. e->SetHandled();
  284. break;
  285. case USER_EVT_GETSTATUS:
  286. {
  287. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  288. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  289. pTask->SetContext(pEvt->m_ctx);
  290. PostEventFIFO(new OperatingEvent(e->iEvt)); //operating event.
  291. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  292. }
  293. e->SetHandled();
  294. break;
  295. case USER_EVT_GETINFO:
  296. {
  297. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  298. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  299. pTask->SetContext(pEvt->m_ctx);
  300. PostEventFIFO(new OperatingEvent(e->iEvt)); //operating event.
  301. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  302. }
  303. e->SetHandled();
  304. break;
  305. case USER_EVT_CROSS_CALL:
  306. break;
  307. case USER_EVT_CROSS_CALL_ONEWAY:
  308. break;
  309. }
  310. return uRet;
  311. }
  312. /** No use for now [80374374@2022615]*/
  313. void CScannerFSM::s1_on_entry()
  314. {
  315. LOG_FUNCTION();
  316. FSMEvent* evt = new FSMEvent(USER_EVT_ESTIMATE_FINISHED);
  317. evt->param1 = evt->param2 = 0;
  318. #if defined(RVC_OS_WIN)
  319. CAutoArray<ScannerDeviceInfo> cameralist;
  320. bool bInnerUpdated = true;
  321. int devCount = GetCurrentCameraList(cameralist, bInnerUpdated);
  322. LOG_ASSERT(!bInnerUpdated || devCount == m_cameralist.size());
  323. int flag = 0;
  324. if(devCount > 0) {
  325. for(int i=0; i<devCount; ++i) {
  326. //识别到高拍仪摄像头
  327. if(cameralist[i].devType == CAMTYPE_HSPS) {
  328. evt->param1 = CAMTYPE_HSPS;
  329. if(cameralist[i].bIdle) {
  330. //没有被占用呢,赶紧通知外接高拍仪实体将其占用了。
  331. }else {
  332. //确认是否被外接高拍仪实体占用,不是的话得告警查出是谁占用了。
  333. evt->param2 = 1;
  334. bool bHode = false;
  335. int devID = -1;
  336. bool bBusy = false;
  337. CSimpleStringA devName(true);
  338. if(ISSUCCEEDED(IsPortScanHoldDevice(bHode, devID, devName, bBusy))) {
  339. }
  340. }
  341. }
  342. }
  343. }
  344. evt->param1 = flag;
  345. #endif //RVC_OS_WIN
  346. PostEventFIFO(evt);
  347. m_nFatalTimes = 0;
  348. }
  349. /** No use for now [80374374@2022615]*/
  350. void CScannerFSM::s1_on_exit()
  351. {
  352. }
  353. /** No use for now [80374374@2022615]*/
  354. unsigned int CScannerFSM::s1_on_event(FSMEvent* e)
  355. {
  356. unsigned int uRet = 0;
  357. if(e->iEvt == USER_EVT_ESTIMATE_FINISHED) {
  358. e->SetHandled();
  359. if(e->param1 == CAMTYPE_HSPS) {
  360. if(e->param2 == 0) {
  361. //TODO:
  362. }
  363. }
  364. }
  365. return uRet;
  366. }
  367. void CScannerFSM::s2_on_entry()
  368. {
  369. }
  370. void CScannerFSM::s2_on_exit()
  371. {
  372. m_iEvt = -1;
  373. }
  374. unsigned int CScannerFSM::s2_on_event(FSMEvent* e)
  375. {
  376. unsigned int uRet = 0;
  377. switch(e->iEvt)
  378. {
  379. case USER_EVT_STARTPREVIEW_FINISHED:
  380. {
  381. if(m_iEvt == USER_EVT_STARTPREVIEW)
  382. {
  383. //uRet = e->param1;
  384. uRet = 1;
  385. e->SetHandled();
  386. }
  387. }
  388. break;
  389. case USER_EVT_STOPPREVIEW_FINISHED:
  390. {
  391. if(m_iEvt == USER_EVT_STOPPREVIEW)
  392. {
  393. //uRet = e->param1;
  394. uRet = 1;
  395. e->SetHandled();
  396. }
  397. }
  398. break;
  399. case USER_EVT_SCANIMAGEFINISHED:
  400. {
  401. if(m_iEvt == USER_EVT_SCANIMAGE)
  402. {
  403. //uRet = e->param1;
  404. uRet = 1;
  405. e->SetHandled();
  406. }
  407. }
  408. break;
  409. case USER_EVT_SETPROPERTY_FINISHED:
  410. {
  411. if(m_iEvt == USER_EVT_SETPROPERTY)
  412. {
  413. //uRet = e->param1;
  414. uRet = 1;
  415. e->SetHandled();
  416. }
  417. }
  418. break;
  419. case USER_EVT_SHOWPROPERTY_FINISHED:
  420. {
  421. if(m_iEvt == USER_EVT_SHOWPROPERTY)
  422. {
  423. //uRet = e->param1;
  424. uRet = 1;
  425. e->SetHandled();
  426. }
  427. }
  428. break;
  429. case USER_EVT_SETWINPOS_FINISHED:
  430. {
  431. if(m_iEvt == USER_EVT_SETWINPOS)
  432. {
  433. //uRet = e->param1;
  434. uRet = 1;
  435. e->SetHandled();
  436. }
  437. }
  438. break;
  439. case USER_EVT_GETSTATUS_FINISHED:
  440. {
  441. if(m_iEvt == USER_EVT_GETSTATUS)
  442. {
  443. uRet = 1;
  444. e->SetHandled();
  445. }
  446. }
  447. break;
  448. case USER_EVT_GETINFO_FINISHED:
  449. {
  450. if(m_iEvt == USER_EVT_GETINFO)
  451. {
  452. uRet = 1;
  453. e->SetHandled();
  454. }
  455. }
  456. break;
  457. }
  458. return uRet;
  459. }
  460. #pragma region Useless for current
  461. //2016-11-18
  462. void CScannerFSM::s3_on_entry()
  463. {
  464. LOG_FUNCTION();
  465. m_ecSelfTest = Error_Hardware;
  466. }
  467. void CScannerFSM::s3_on_exit()
  468. {
  469. m_ecSelfTest = Error_Succeed;
  470. m_nFatalTimes = 0;
  471. }
  472. unsigned int CScannerFSM::s3_on_event(FSMEvent* e)
  473. {
  474. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("s3_on_event: %s(%d), %d.", EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  475. unsigned int uRet = 0;
  476. switch(e->iEvt)
  477. {
  478. case USER_EVT_GETSTATUS:
  479. {
  480. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  481. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  482. pTask->SetContext(pEvt->m_ctx);
  483. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  484. }
  485. e->SetHandled();
  486. break;
  487. case USER_EVT_GETINFO:
  488. {
  489. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  490. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  491. pTask->SetContext(pEvt->m_ctx);
  492. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  493. }
  494. e->SetHandled();
  495. break;
  496. }
  497. return uRet;
  498. }
  499. #pragma endregion Useless for current
  500. void CScannerFSM::s4_on_entry()
  501. {
  502. if(m_bStand2SMachine || m_bUsePortableScanner)
  503. {
  504. ScheduleTimer(CHECKDEV_TIMER_ID, MILLISECOND_TO_CHECKDEV);
  505. }
  506. }
  507. void CScannerFSM::s4_on_exit()
  508. {
  509. if(m_bStand2SMachine || m_bUsePortableScanner)
  510. {
  511. CancelTimer(CHECKDEV_TIMER_ID);
  512. }
  513. }
  514. unsigned int CScannerFSM::s4_on_event(FSMEvent* e)
  515. {
  516. unsigned int uRet = 0;
  517. switch(e->iEvt)
  518. {
  519. case USER_EVT_DEV_RECOVER:
  520. {
  521. }
  522. e->SetHandled();
  523. break;
  524. case EVT_TIMER:
  525. {
  526. if(e->param1 == CHECKDEV_TIMER_ID)
  527. {
  528. e->SetHandled();
  529. if(!m_bUsePortableScanner) {
  530. if(ISSUCCEEDED(CheckHSPSConnectStatus()))
  531. {
  532. PostEventFIFO(new FSMEvent(USER_EVT_DEV_RECOVER));
  533. break;
  534. }
  535. } else {
  536. if(ISSUCCEEDED(CheckPortableConnectStatus()))
  537. {
  538. PostEventFIFO(new FSMEvent(USER_EVT_DEV_RECOVER));
  539. break;
  540. }
  541. }
  542. ScheduleTimer(CHECKDEV_TIMER_ID, MILLISECOND_TO_CHECKDEV);
  543. }
  544. }
  545. break;
  546. case USER_EVT_GETSTATUS:
  547. {
  548. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  549. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  550. pTask->SetContext(pEvt->m_ctx);
  551. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  552. }
  553. e->SetHandled();
  554. break;
  555. case USER_EVT_GETINFO:
  556. {
  557. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  558. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  559. pTask->SetContext(pEvt->m_ctx);
  560. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  561. }
  562. e->SetHandled();
  563. break;
  564. }
  565. return uRet;
  566. }
  567. int CScannerFSM::StartPreview(SpReqAnsContext<ScannerService_StartPreview_Req,
  568. ScannerService_StartPreview_Ans>::Pointer ctx)
  569. {
  570. int nRes = 0;
  571. ErrorCodeEnum erroCode = Error_Unexpect;
  572. DWORD dwUserCode(0);
  573. if(!IsSuitableEntityAvailable())
  574. {
  575. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setAPI(__FUNCTION__).setLogCode(ScannerService_LogCode_StartPreview).setResultCode("RTA2O01")();
  576. ctx->Answer(Error_DevNotAvailable, LOG_WARN_MODULE_INVALID);
  577. return 1;
  578. }
  579. if(m_bStand2SMachine) {
  580. HSPScannerService_StartPreview_Req req = {};
  581. HSPScannerService_StartPreview_Ans ans = {};
  582. req.rotateType = ctx->Req.rotateType;
  583. req.scanType = ctx->Req.scanType;
  584. req.colorType = ctx->Req.colorType;
  585. erroCode = (*m_pHSPSClient)(EntityResource::getLink().upgradeLink())->StartPreview(req, ans, MILLISECOND_WAIT_TIMEOUT_STARTPREVIEW, dwUserCode);
  586. if (FAILURED(erroCode)) {
  587. nRes = 1;
  588. if (MapErrorCode2Level(erroCode)) {
  589. LogWarn(Severity_Middle, erroCode, LOG_ERR_SCANNERSET_API_INVOKE_StartPreview,
  590. CSimpleStringA::Format("StartPreview context failed, ErrCode:%s, userCode: 0x%08X.", SpStrError(erroCode), dwUserCode));
  591. erroCode = Error_DevNotAvailable;
  592. } else {
  593. LogWarn(Severity_Middle, erroCode, LOG_ERR_SCANNERSET_API_INVOKE_StartPreview,
  594. CSimpleStringA::Format("StartPreview context failed, ErrCode:%s, userCode: 0x%08X.", SpStrError(erroCode), dwUserCode));
  595. }
  596. } else {
  597. ctx->Ans.retCode = ans.retCode;
  598. }
  599. }
  600. else if(m_bUsePortableScanner) {
  601. PortableScannerService_StartPreview_Req req = {};
  602. PortableScannerService_StartPreview_Ans ans = {};
  603. req.rotateType = ctx->Req.rotateType;
  604. req.scanType = ctx->Req.scanType;
  605. req.colorType = ctx->Req.colorType;
  606. erroCode = (*m_pPortableClient)(EntityResource::getLink().upgradeLink())->StartPreview(req, ans, MILLISECOND_WAIT_TIMEOUT_STARTPREVIEW, dwUserCode);
  607. if(FAILURED(erroCode)) {
  608. LogWarn(Severity_Middle, erroCode, LOG_ERR_SCANNERSET_API_INVOKE_StartPreview,
  609. CSimpleStringA::Format("StartPreview context failed, ErrCode:%s, userCode: 0x%08X.", SpStrError(erroCode), dwUserCode));
  610. nRes = 1;
  611. }
  612. else {
  613. ctx->Ans.retCode = ans.retCode;
  614. }
  615. }
  616. ctx->Answer(erroCode, dwUserCode);
  617. return nRes;
  618. }
  619. int CScannerFSM::StopPreview(SpReqAnsContext<ScannerService_CancelPreview_Req,
  620. ScannerService_CancelPreview_Ans>::Pointer ctx)
  621. {
  622. ErrorCodeEnum erroCode = Error_Unexpect;
  623. DWORD dwUserCode(0);
  624. int nRes = 0;
  625. if(!IsSuitableEntityAvailable())
  626. {
  627. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setAPI(__FUNCTION__).setLogCode(ScannerService_LogCode_CancelPreview).setResultCode("RTA2O01")();
  628. ctx->Answer(Error_DevNotAvailable, LOG_WARN_MODULE_INVALID);
  629. return 1;
  630. }
  631. if(m_bStand2SMachine) {
  632. HSPScannerService_CancelPreview_Req req = {};
  633. HSPScannerService_CancelPreview_Ans ans = {};
  634. req.bOnlyHide = ctx->Req.reserved1 == 0 ? false : true;
  635. erroCode = (*m_pHSPSClient)(EntityResource::getLink().upgradeLink())->CancelPreview(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT, dwUserCode);
  636. ctx->Answer(erroCode, dwUserCode);
  637. if (FAILURED(erroCode)) {
  638. LogWarn(Severity_Middle, erroCode, LOG_ERR_SCANNERSET_API_INVOKE_CancelPreview,
  639. CSimpleStringA::Format("CancelPreview context failed: ErrCode:%s, userCode: 0x%08X.", SpStrError(erroCode), dwUserCode));
  640. nRes = 1;
  641. } else {
  642. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_USER).setAPI(__FUNCTION__)("CancelPreview context suc.");
  643. }
  644. }else if(m_bUsePortableScanner) {
  645. PortableScannerService_CancelPreview_Req req = {};
  646. PortableScannerService_CancelPreview_Ans ans = {};
  647. req.bOnlyHide = ctx->Req.reserved1 == 0 ? false : true;
  648. erroCode = (*m_pPortableClient)(EntityResource::getLink().upgradeLink())->CancelPreview(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT, dwUserCode);
  649. ctx->Answer(erroCode, dwUserCode);
  650. if(FAILURED(erroCode)) {
  651. LogWarn(Severity_Middle, erroCode, LOG_ERR_SCANNERSET_API_INVOKE_CancelPreview,
  652. CSimpleStringA::Format("CancelPreview context failed, ErrCode:%s, userCode: 0x%08X.", SpStrError(erroCode), dwUserCode));
  653. nRes = 1;
  654. }else {
  655. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_USER).setAPI(__FUNCTION__)("CancelPreview context suc.");
  656. }
  657. }
  658. return nRes;
  659. }
  660. int CScannerFSM::ScanImage(SpReqAnsContext<ScannerService_ScanImage_Req,
  661. ScannerService_ScanImage_Ans>::Pointer ctx)
  662. {
  663. int nRes = 0;
  664. ErrorCodeEnum erroCode = Error_Unexpect;
  665. DWORD dwUserCode(0);
  666. if(!IsSuitableEntityAvailable())
  667. {
  668. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setAPI(__FUNCTION__).setLogCode(ScannerService_LogCode_ScanImage).setResultCode("RTA2O01")();
  669. ctx->Answer(Error_DevNotAvailable, LOG_WARN_MODULE_INVALID);
  670. return 1;
  671. }
  672. if(ctx->Req.nWay == 0)
  673. {
  674. if(m_bStand2SMachine) {
  675. HSPScannerService_ScanImage_Req req = {};
  676. HSPScannerService_ScanImage_Ans ans = {};
  677. erroCode = (*m_pHSPSClient)(EntityResource::getLink().upgradeLink())->ScanImage(req, ans, MILLISECOND_WAIT_TIMEOUT_SCANIMAGE, dwUserCode);
  678. if(FAILURED(erroCode)) {
  679. if (MapErrorCode2Level(erroCode)) {
  680. LogWarn(Severity_Middle, erroCode, LOG_ERR_SCANNERSET_API_INVOKE_ScanImage,
  681. CSimpleStringA::Format("ScanImage context failed, ErrCode:%s, userCode: 0x%08X.", SpStrError(erroCode), dwUserCode));
  682. erroCode = Error_DevNotAvailable;
  683. } else {
  684. LogWarn(Severity_Middle, erroCode, LOG_ERR_SCANNERSET_API_INVOKE_ScanImage,
  685. CSimpleStringA::Format("ScanImage context failed, ErrCode:%s, userCode: 0x%08X.", SpStrError(erroCode), dwUserCode));
  686. }
  687. nRes = 1;
  688. } else {
  689. ctx->Ans.filePath = ans.filePath;
  690. ctx->Ans.imageData = ans.imageData;
  691. }
  692. }else if(m_bUsePortableScanner) {
  693. PortableScannerService_ScanImage_Req req = {};
  694. PortableScannerService_ScanImage_Ans ans = {};
  695. erroCode = (*m_pPortableClient)(EntityResource::getLink().upgradeLink())->ScanImage(req, ans, MILLISECOND_WAIT_TIMEOUT_SCANIMAGE, dwUserCode);
  696. if(FAILURED(erroCode)) {
  697. if (MapErrorCode2Level(erroCode)) {
  698. LogWarn(Severity_Middle, erroCode, LOG_ERR_SCANNERSET_API_INVOKE_ScanImage,
  699. CSimpleStringA::Format("ScanImage context failed, ErrCode:%s, userCode: 0x%08X.", SpStrError(erroCode), dwUserCode));
  700. erroCode = Error_DevNotAvailable;
  701. } else {
  702. LogWarn(Severity_Middle, erroCode, LOG_ERR_SCANNERSET_API_INVOKE_ScanImage,
  703. CSimpleStringA::Format("ScanImage context failed, ErrCode:%s, userCode: 0x%08X.", SpStrError(erroCode), dwUserCode));
  704. }
  705. nRes = 1;
  706. } else {
  707. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_USER).setAPI(__FUNCTION__)("ScanImage context suc.");
  708. ctx->Ans.filePath = ans.filePath;
  709. ctx->Ans.imageData = ans.imageData;
  710. }
  711. }
  712. }
  713. else if(ctx->Req.nWay == 1)
  714. {
  715. if(m_bStand2SMachine) {
  716. HSPScannerService_ScanImageEx_Req req = {};
  717. HSPScannerService_ScanImageEx_Ans ans = {};
  718. erroCode = (*m_pHSPSClient)(EntityResource::getLink().upgradeLink())->ScanImageEx(req, ans, MILLISECOND_WAIT_TIMEOUT_SCANIMAGE, dwUserCode);
  719. if(FAILURED(erroCode)) {
  720. if (MapErrorCode2Level(erroCode)) {
  721. LogWarn(Severity_Middle, erroCode, LOG_ERR_SCANNERSET_API_INVOKE_ScanImageEx,
  722. CSimpleStringA::Format("ScanImageEx context failed, ErrCode:%s, userCode: 0x%08X.", SpStrError(erroCode), dwUserCode));
  723. erroCode = Error_DevNotAvailable;
  724. } else {
  725. LogWarn(Severity_Middle, erroCode, LOG_ERR_SCANNERSET_API_INVOKE_ScanImageEx,
  726. CSimpleStringA::Format("ScanImageEx context failed, ErrCode:%s, userCode: 0x%08X.", SpStrError(erroCode), dwUserCode));
  727. }
  728. nRes = 1;
  729. } else {
  730. ctx->Ans.filePath = ans.filePath;
  731. ctx->Ans.imageData = ans.imageData;
  732. }
  733. }
  734. else if(m_bUsePortableScanner) {
  735. PortableScannerService_ScanImageEx_Req req = {};
  736. PortableScannerService_ScanImageEx_Ans ans = {};
  737. erroCode = (*m_pPortableClient)(EntityResource::getLink().upgradeLink())->ScanImageEx(req, ans, MILLISECOND_WAIT_TIMEOUT_SCANIMAGE, dwUserCode);
  738. if(FAILURED(erroCode)) {
  739. if (MapErrorCode2Level(erroCode)) {
  740. LogWarn(Severity_Middle, erroCode, LOG_ERR_SCANNERSET_API_INVOKE_ScanImageEx,
  741. CSimpleStringA::Format("ScanImageEx context failed, ErrCode:%s, userCode: 0x%08X.", SpStrError(erroCode), dwUserCode));
  742. erroCode = Error_DevNotAvailable;
  743. } else {
  744. LogWarn(Severity_Middle, erroCode, LOG_ERR_SCANNERSET_API_INVOKE_ScanImageEx,
  745. CSimpleStringA::Format("ScanImageEx context failed, ErrCode:%s, userCode: 0x%08X.", SpStrError(erroCode), dwUserCode));
  746. }
  747. nRes = 1;
  748. } else {
  749. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_USER)("ScanImageEx context suc.");
  750. ctx->Ans.filePath = ans.filePath;
  751. ctx->Ans.imageData = ans.imageData;
  752. }
  753. }
  754. }
  755. ctx->Answer(erroCode, dwUserCode);
  756. return nRes;
  757. }
  758. int CScannerFSM::SetProperty(SpReqAnsContext<ScannerService_SetProperty_Req,
  759. ScannerService_SetProperty_Ans>::Pointer ctx)
  760. {
  761. ErrorCodeEnum erroCode = Error_Unexpect;
  762. DWORD dwUserCode(0);
  763. int nRes = 0;
  764. if(!IsSuitableEntityAvailable())
  765. {
  766. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setAPI(__FUNCTION__).setLogCode(ScannerService_LogCode_SetProperty).setResultCode("RTA2O01")();
  767. ctx->Answer(Error_DevNotAvailable, LOG_WARN_MODULE_INVALID);
  768. return 1;
  769. }
  770. if(m_bStand2SMachine) {
  771. HSPScannerService_SetProperty_Req req = {};
  772. HSPScannerService_SetProperty_Ans ans = {};
  773. req.rotateType = ctx->Req.rotateType;
  774. req.scanType = ctx->Req.scanType;
  775. req.colorType = ctx->Req.colorType;
  776. erroCode = (*m_pHSPSClient)(EntityResource::getLink().upgradeLink())->SetProperty(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT, dwUserCode);
  777. if(FAILURED(erroCode)) {
  778. LogWarn(Severity_Middle, erroCode, LOG_ERR_SCANNERSET_API_INVOKE_SetProperty,
  779. CSimpleStringA::Format("SetProperty context failed, ErrCode:%s, userCode: 0x%08X.", SpStrError(erroCode), dwUserCode));
  780. nRes = 1;
  781. } else {
  782. ctx->Ans.retCode = ans.retCode;
  783. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_USER)("SetProperty context suc, retCode: ans(%d), ctx(%d).", ans.retCode, ctx->Ans.retCode);
  784. }
  785. }else if(m_bUsePortableScanner) {
  786. PortableScannerService_SetProperty_Req req = {};
  787. PortableScannerService_SetProperty_Ans ans = {};
  788. req.rotateType = ctx->Req.rotateType;
  789. req.scanType = ctx->Req.scanType;
  790. req.colorType = ctx->Req.colorType;
  791. erroCode = (*m_pPortableClient)(EntityResource::getLink().upgradeLink())->SetProperty(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT, dwUserCode);
  792. if(FAILURED(erroCode)) {
  793. LogWarn(Severity_Middle, erroCode, LOG_ERR_SCANNERSET_API_INVOKE_SetProperty,
  794. CSimpleStringA::Format("SetProperty context failed, ErrCode:%s, userCode: 0x%08X.", SpStrError(erroCode), dwUserCode));
  795. nRes = 1;
  796. } else {
  797. ctx->Ans.retCode = ans.retCode;
  798. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_USER)("SetProperty context suc, retCode: ans(%d), ctx(%d).", ans.retCode, ctx->Ans.retCode);
  799. }
  800. }
  801. ctx->Answer(erroCode, dwUserCode);
  802. return nRes;
  803. }
  804. int CScannerFSM::ShowLTProperty(SpReqAnsContext<ScannerService_ShowProperty_Req,
  805. ScannerService_ShowProperty_Ans>::Pointer ctx)
  806. {
  807. int nRes = 0;
  808. ErrorCodeEnum erroCode = Error_Succeed;
  809. DWORD dwUserCode(0);
  810. int retCode = 0;
  811. if(!IsSuitableEntityAvailable())
  812. {
  813. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setAPI(__FUNCTION__).setLogCode(ScannerService_LogCode_ShowProperty).setResultCode("RTA2O01")();
  814. ctx->Answer(Error_DevNotAvailable, LOG_WARN_MODULE_INVALID);
  815. return 1;
  816. }
  817. if(m_bStand2SMachine) {
  818. HSPScannerService_ShowProperty_Req req = {};
  819. HSPScannerService_ShowProperty_Ans ans = {};
  820. erroCode = (*m_pHSPSClient)(EntityResource::getLink().upgradeLink())->ShowProperty(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT, dwUserCode);
  821. } else if(m_bUsePortableScanner) {
  822. PortableScannerService_ShowProperty_Req req = {};
  823. PortableScannerService_ShowProperty_Ans ans = {};
  824. erroCode = (*m_pPortableClient)(EntityResource::getLink().upgradeLink())->ShowProperty(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT, dwUserCode);
  825. }
  826. if(FAILURED(erroCode))
  827. {
  828. LogWarn(Severity_Middle, erroCode, LOG_ERR_SCANNERSET_API_INVOKE_ShowProperty,
  829. CSimpleStringA::Format("ShowLTProperty context failed, ErrCode:%s, userCode: 0x%08X.", SpStrError(erroCode), dwUserCode));
  830. nRes = 1;
  831. if(erroCode == Error_TimeOut)
  832. {
  833. erroCode = Error_Succeed;
  834. nRes = 0;
  835. }
  836. }
  837. else {
  838. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_USER)("ShowLTProperty context suc.");
  839. }
  840. ctx->Answer(erroCode, dwUserCode);
  841. return nRes;
  842. }
  843. int CScannerFSM::SetWinPos(SpReqAnsContext<ScannerService_SetWindowPos_Req,
  844. ScannerService_SetWindowPos_Ans>::Pointer ctx)
  845. {
  846. int nRes = 0;
  847. ErrorCodeEnum erroCode = Error_Unexpect;
  848. DWORD dwUserCode(0);
  849. if(!IsSuitableEntityAvailable())
  850. {
  851. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setAPI(__FUNCTION__).setLogCode(ScannerService_LogCode_SetWindowPos).setResultCode("RTA2O01")();
  852. ctx->Answer(Error_DevNotAvailable, LOG_WARN_MODULE_INVALID);
  853. return 1;
  854. }
  855. if (m_bStand2SMachine) {
  856. HSPScannerService_SetWinPos_Req req = {};
  857. HSPScannerService_SetWinPos_Ans ans = {};
  858. req.type = ctx->Req.type;
  859. req.pointX = ctx->Req.pointX;
  860. req.pointY = ctx->Req.pointY;
  861. req.nWidth = ctx->Req.nWidth;
  862. erroCode = (*m_pHSPSClient)(EntityResource::getLink().upgradeLink())->SetWinPos(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT, dwUserCode);
  863. } else if(m_bUsePortableScanner) {
  864. PortableScannerService_SetWinPos_Req req = {};
  865. PortableScannerService_SetWinPos_Ans ans = {};
  866. req.type = ctx->Req.type;
  867. req.pointX = ctx->Req.pointX;
  868. req.pointY = ctx->Req.pointY;
  869. req.nWidth = ctx->Req.nWidth;
  870. erroCode = (*m_pPortableClient)(EntityResource::getLink().upgradeLink())->SetWinPos(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT, dwUserCode);
  871. }
  872. if(FAILURED(erroCode)) {
  873. if (MapErrorCode2Level(erroCode)) {
  874. LogWarn(Severity_Middle, erroCode, LOG_ERR_SCANNERSET_API_INVOKE_SetWinPos,
  875. CSimpleStringA::Format("SetWinPos context failed, ErrCode:%s, userCode: 0x%08X.", SpStrError(erroCode), dwUserCode));
  876. erroCode = Error_DevNotAvailable;
  877. } else {
  878. LogWarn(Severity_Middle, erroCode, LOG_ERR_SCANNERSET_API_INVOKE_SetWinPos,
  879. CSimpleStringA::Format("SetWinPos context failed, ErrCode:%s, userCode: 0x%08X.", SpStrError(erroCode), dwUserCode));
  880. }
  881. nRes = 1;
  882. } else {
  883. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_USER)("SetWinPos context suc.");
  884. }
  885. ctx->Answer(erroCode, dwUserCode);
  886. return nRes;
  887. }
  888. int CScannerFSM::GetDevStatus(SpReqAnsContext<ScannerService_GetDevStatus_Req,
  889. ScannerService_GetDevStatus_Ans>::Pointer ctx)
  890. {
  891. int nRes = 0;
  892. ErrorCodeEnum erroCode = Error_Unexpect;
  893. DWORD dwUserCode(0);
  894. if(!IsSuitableEntityAvailable())
  895. {
  896. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setAPI(__FUNCTION__).setLogCode(ScannerService_LogCode_GetDevStatus).setResultCode("RTA2O01")();
  897. ctx->Answer(Error_DevNotAvailable, LOG_WARN_MODULE_INVALID);
  898. return 1;
  899. }
  900. if(m_bStand2SMachine) {
  901. HSPScannerService_GetDevStatus_Req req = {};
  902. HSPScannerService_GetDevStatus_Ans ans = {};
  903. erroCode = (*m_pHSPSClient)(EntityResource::getLink().upgradeLink())->GetDevStatus(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT, dwUserCode);
  904. if(FAILURED(erroCode)) {
  905. LogWarn(Severity_Middle, erroCode, LOG_ERR_SCANNERSET_API_INVOKE_GetDevStatus,
  906. CSimpleStringA::Format("GetDevStatus context failed, ErrCode:%s, userCode: 0x%08X.", SpStrError(erroCode), dwUserCode));
  907. } else {
  908. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_USER)("connected: %d, showing: %d, preview: %d.",
  909. ans.connected, ans.showing, ans.previewing);
  910. ctx->Ans.bInvalid = ans.connected == 0 ? false : true;
  911. ctx->Ans.bPreview = ans.previewing == 0 ? false : true;
  912. }
  913. } else if(m_bUsePortableScanner) {
  914. PortableScannerService_GetDevStatus_Req req = {};
  915. PortableScannerService_GetDevStatus_Ans ans = {};
  916. erroCode = (*m_pPortableClient)(EntityResource::getLink().upgradeLink())->GetDevStatus(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT, dwUserCode);
  917. if(FAILURED(erroCode)) {
  918. LogWarn(Severity_Middle, erroCode, LOG_ERR_SCANNERSET_API_INVOKE_GetDevStatus,
  919. CSimpleStringA::Format("GetDevStatus context failed, ErrCode:%s, userCode: 0x%08X.", SpStrError(erroCode), dwUserCode));
  920. }
  921. else
  922. {
  923. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("connected: %d, showing: %d, preview: %d.",
  924. ans.connected, ans.showing, ans.previewing);
  925. ctx->Ans.bInvalid = ans.connected == 0 ? false : true;
  926. ctx->Ans.bPreview = ans.previewing == 0 ? false : true;
  927. }
  928. }
  929. ctx->Answer(erroCode, dwUserCode);
  930. return nRes;
  931. }
  932. int CScannerFSM::GetDevInfo(SpReqAnsContext<ScannerService_GetDevInfo_Req,
  933. ScannerService_GetDevInfo_Ans>::Pointer ctx)
  934. {
  935. int nRes = 0;
  936. ErrorCodeEnum erroCode = Error_Unexpect;
  937. DWORD dwUserCode(0);
  938. if(!IsSuitableEntityAvailable())
  939. {
  940. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setAPI(__FUNCTION__).setLogCode(ScannerService_LogCode_GetDevInfo).setResultCode("RTA2O01")();
  941. ctx->Answer(Error_DevNotAvailable, LOG_WARN_MODULE_INVALID);
  942. return 1;
  943. }
  944. if(m_bStand2SMachine) {
  945. HSPScannerService_GetDevInfo_Req req = {};
  946. HSPScannerService_GetDevInfo_Ans ans = {};
  947. erroCode = (*m_pHSPSClient)(EntityResource::getLink().upgradeLink())->GetDevInfo(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT, dwUserCode);
  948. if(FAILURED(erroCode)) {
  949. LogWarn(Severity_Middle, erroCode, LOG_ERR_SCANNERSET_API_INVOKE_GetDevInfo,
  950. CSimpleStringA::Format("GetDevInfo context failed, ErrCode:%s, userCode: 0x%08X.", SpStrError(erroCode), dwUserCode));
  951. nRes = 1;
  952. }
  953. else
  954. {
  955. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("type: %s, model: %s, version: %s, state:%d.",
  956. (LPCTSTR)ans.type, (LPCTSTR)ans.model, (LPCTSTR)ans.version, ans.state);
  957. ctx->Ans.type = ans.type;
  958. ctx->Ans.model = ans.model;
  959. ctx->Ans.version = ans.version;
  960. ctx->Ans.state = ans.state;
  961. }
  962. } else if(m_bUsePortableScanner) {
  963. PortableScannerService_GetDevInfo_Req req = {};
  964. PortableScannerService_GetDevInfo_Ans ans = {};
  965. erroCode = (*m_pPortableClient)(EntityResource::getLink().upgradeLink())->GetDevInfo(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT, dwUserCode);
  966. if(FAILURED(erroCode)) {
  967. LogWarn(Severity_Middle, erroCode, LOG_ERR_SCANNERSET_API_INVOKE_GetDevInfo,
  968. CSimpleStringA::Format("GetDevInfo context failed, ErrCode:%s, userCode: 0x%08X.", SpStrError(erroCode), dwUserCode));
  969. nRes = 1;
  970. }
  971. else
  972. {
  973. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("type: %s, model: %s, version: %s, state:%d.",
  974. (LPCTSTR)ans.type, (LPCTSTR)ans.model, (LPCTSTR)ans.version, ans.state);
  975. ctx->Ans.type = ans.type;
  976. ctx->Ans.model = ans.model;
  977. ctx->Ans.version = ans.version;
  978. ctx->Ans.state = ans.state;
  979. }
  980. }
  981. ctx->Answer(erroCode, dwUserCode);
  982. return nRes;
  983. }
  984. int CScannerFSM::GetOnlineDevices(SpReqAnsContext<ScannerService_GetOnlineCameras_Req,
  985. ScannerService_GetOnlineCameras_Ans>::Pointer ctx)
  986. {
  987. #if defined(_MSC_VER)
  988. CAutoArray<ScannerDeviceInfo> cameralist;
  989. if(FALSE) {
  990. UpdateCameraInfors(m_cameralist);
  991. }
  992. int nCount = m_cameralist.size();
  993. ctx->Ans.devCount = nCount;
  994. if(nCount > 0) {
  995. ctx->Ans.devFriendlyNames.Init(nCount);
  996. ctx->Ans.devType.Init(nCount);
  997. for(int i=0; i<nCount; ++i) {
  998. ctx->Ans.devFriendlyNames[i] = m_cameralist[i]->szDevName;
  999. ctx->Ans.devType[i] = GetRVCCameraType(m_cameralist[i]->szDevName);
  1000. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("[%d]%s(%s)", i, (LPCTSTR)ctx->Ans.devFriendlyNames[i], CameraTypeToString((CapTypeEnum)ctx->Ans.devType[i]));
  1001. }
  1002. }
  1003. ctx->Answer(Error_Succeed);
  1004. return nCount;
  1005. #else
  1006. ctx->Answer(Error_NotSupport);
  1007. return 0;
  1008. #endif //_MSC_VER
  1009. }
  1010. ErrorCodeEnum CScannerFSM::OnDevExit()
  1011. {
  1012. ErrorCodeEnum erroCode = Error_Unexpect;
  1013. int nRes = 0;
  1014. if(!IsSuitableEntityAvailable()) {
  1015. return Error_DevNotAvailable;
  1016. }
  1017. if(m_bStand2SMachine) {
  1018. HSPScannerService_Exit_Info info = {};
  1019. erroCode = (*m_pHSPSClient)(EntityResource::getLink().upgradeLink())->Exit();
  1020. }else if(m_bUsePortableScanner) {
  1021. PortableScannerService_Exit_Info info = {};
  1022. erroCode = (*m_pPortableClient)(EntityResource::getLink().upgradeLink())->Exit();
  1023. if(erroCode == Error_Succeed && IsPortScanHoldEnvCameraFromSysVar()) {
  1024. WaitPortableReleaseCamera(CAMTYPE_ENV);
  1025. AccessCamerePriviledge(false, CAMTYPE_ENV);
  1026. }
  1027. }
  1028. return erroCode;
  1029. }
  1030. void CScannerFSM::SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext)
  1031. {
  1032. pTransactionContext->SendAnswer(m_ecSelfTest);
  1033. }
  1034. void CScannerFSM::OnStateTrans(int iSrcState, int iDstState)
  1035. {
  1036. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("FSM state from state %s to %s", GetStateName(iSrcState), GetStateName(iDstState));
  1037. m_nSrcState = iSrcState;
  1038. }
  1039. ErrorCodeEnum CScannerFSM::ConnectToHSPScanner()
  1040. {
  1041. if (!IsHSPSConnectSessionOK()) {
  1042. FreeHSPScannerClient();
  1043. m_pHSPSClient = new CHSPSInnerClient(GetEntityBase());
  1044. ErrorCodeEnum erroCode = m_pHSPSClient->Connect();
  1045. if (FAILURED(erroCode)) {
  1046. m_pHSPSClient->SafeDelete();
  1047. m_pHSPSClient = NULL;
  1048. LogWarn(Severity_Middle, Error_InvalidState, LOG_WARN_MODULE_INVALID,
  1049. CSimpleStringA::Format("Connect to HSPScanner entity failed: %s", SpStrError(erroCode)));
  1050. GetHSPSInfo();
  1051. return Error_InvalidState;
  1052. }
  1053. }
  1054. return Error_Succeed;
  1055. }
  1056. ErrorCodeEnum CScannerFSM::GetHSPSInfo()
  1057. {
  1058. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  1059. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1060. CEntityRunInfo info = {0};
  1061. ErrorCodeEnum ecInfo = pFunc->GetEntityRunInfo("HSPScanner", info);
  1062. if (info.eState != EntityState_Idle) {
  1063. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("HSPScanner entity illegal state: %d", (int)info.eState);
  1064. }
  1065. return ecInfo;
  1066. }
  1067. ErrorCodeEnum CScannerFSM::CheckHSPSConnectStatus()
  1068. {
  1069. CHSPSInnerClient* pCheckClient = new CHSPSInnerClient(GetEntityBase());
  1070. ErrorCodeEnum erroCode = pCheckClient->Connect();
  1071. if(FAILURED(erroCode))
  1072. {
  1073. pCheckClient->SafeDelete();
  1074. pCheckClient = NULL;
  1075. LogWarn(Severity_Low, Error_InvalidState, LOG_EVT_SCANNERSET_HSPSCNT_FAILED,
  1076. "HSPScanner entity is disconnectable.");
  1077. GetHSPSInfo();
  1078. return Error_InvalidState;
  1079. }
  1080. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("HSPScanner entity is Connectable.");
  1081. pCheckClient->GetFunction()->CloseSession();
  1082. pCheckClient = NULL;
  1083. return Error_Succeed;
  1084. }
  1085. ErrorCodeEnum CScannerFSM::CheckPortableConnectStatus()
  1086. {
  1087. AvailableEntityCheck<CPortableScannerClient> checker;
  1088. bool bConnectable = checker(this->GetEntityBase());
  1089. if(!bConnectable) {
  1090. GetPortableScannerInfo();
  1091. }
  1092. return (bConnectable ? Error_Succeed : Error_InvalidState);
  1093. }
  1094. ErrorCodeEnum CScannerFSM::ConnectToPortableScanner()
  1095. {
  1096. if (!IsPortableConnectSessionOK()) {
  1097. FreePortableScannerClient();
  1098. m_pPortableClient = new CPortableScannerClient(GetEntityBase());
  1099. ErrorCodeEnum erroCode = m_pPortableClient->Connect();
  1100. if (FAILURED(erroCode)) {
  1101. m_pPortableClient->SafeDelete();
  1102. m_pPortableClient = NULL;
  1103. LogWarn(Severity_Middle, Error_InvalidState, LOG_WARN_MODULE_INVALID,
  1104. CSimpleStringA::Format("Connect to Portable Scanner entity failed: %s", SpStrError(erroCode)));
  1105. GetPortableScannerInfo();
  1106. return Error_DevNotAvailable;
  1107. }
  1108. }
  1109. return Error_Succeed;
  1110. }
  1111. static CSimpleStringA GetPrefixCameraName(CSimpleStringA& cameraFullConfigName)
  1112. {
  1113. auto results = cameraFullConfigName.Split(';');
  1114. LOG_ASSERT(results.GetCount() > 0);
  1115. return results[0];
  1116. }
  1117. ErrorCodeEnum CScannerFSM::LoadConfigAboutCamera()
  1118. {
  1119. for(int i=0; i<FIX_CAMERA_COUNTS; ++i) {
  1120. m_fixedCamera[i].strDevName = "";
  1121. m_fixedCamera[i].devType = CAMTYPE_UNKNOWN;
  1122. m_fixedCamera[i].bIdle = FALSE;
  1123. }
  1124. m_bEwsNameRefreshed = false;
  1125. CSmartPointer<IEntityFunction> spFunction = GetEntityBase()->GetFunction();
  1126. CSmartPointer<IConfigInfo> spConfig;
  1127. SpIniMappingTable table;
  1128. ErrorCodeEnum ec = spFunction->OpenConfig(Config_Root, spConfig);
  1129. CSimpleStringA strEnvCamera;
  1130. CSimpleStringA strOptCamera;
  1131. CSimpleStringA strEwsCamera;
  1132. int nEnvID = -1, nOptID = -1, nEwsID = -1;
  1133. if(ISSUCCEEDED(ec)) {
  1134. //环境摄像头 核身,交易录像,上(大机),前置(PAD),客户感知触发开启摄像头,连线
  1135. table.AddEntryString("Video", "EnvCamera", strEnvCamera, "$");
  1136. //操作摄像头,仅大机,下摄像头,连线
  1137. table.AddEntryString("Video", "OptCamera", strOptCamera, "$");
  1138. // 外部广角摄像头,全程双录、销售录像
  1139. table.AddEntryString("Video", "EwsCamera", strEwsCamera, "$");
  1140. ec = table.Load(spConfig);
  1141. if(ISSUCCEEDED(ec)) {
  1142. nEnvID = strEnvCamera.GetLength() > 1 ? /*GetVideoDeviceID(strEnvCamera)*/ 0 : -2;
  1143. nOptID = strOptCamera.GetLength() > 1 ? /*GetVideoDeviceID(strOptCamera)*/ 0 : -2;
  1144. nEwsID = strEwsCamera.GetLength() > 1 ? /*GetVideoDeviceID(strEwsCamera)*/ 0 : -2;
  1145. {
  1146. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("EnvID: [%d](%s)", nEnvID, strEnvCamera.GetData());
  1147. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("OptID: [%d](%s)", nOptID, strOptCamera.GetData());
  1148. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("EwsID: [%d](%s)", nEwsID, strEwsCamera.GetData());
  1149. m_fixedCamera[CAMTYPE_ENV-1].strDevName = strEnvCamera;
  1150. m_fixedCamera[CAMTYPE_ENV-1].devType = CAMTYPE_ENV;
  1151. m_fixedCamera[CAMTYPE_OPT-1].strDevName = strOptCamera;
  1152. m_fixedCamera[CAMTYPE_OPT-1].devType = CAMTYPE_OPT;
  1153. m_fixedCamera[CAMTYPE_EWS-1].strDevName = strEwsCamera;
  1154. m_fixedCamera[CAMTYPE_EWS-1].devType = CAMTYPE_EWS;
  1155. CSimpleStringA strEwsRealName;
  1156. m_strEwsRecordName = strEwsCamera;
  1157. if(nEwsID == 0 && FindEwsCameraName(strEwsRealName, strEwsCamera)) {
  1158. m_fixedCamera[CAMTYPE_EWS-1].strDevName = strEwsRealName;
  1159. m_fixedCamera[CAMTYPE_EWS-1].devType = CAMTYPE_EWS;
  1160. m_bEwsNameRefreshed = true;
  1161. }
  1162. }
  1163. if(nEnvID == -2 || nOptID == -2) {
  1164. CSimpleStringA strPath;
  1165. char lpValue[MAX_PATH] = {0};
  1166. if(GetEntityBase()->GetFunction()->GetPath("HardwareCfg", strPath) == Error_Succeed) {
  1167. int index = strPath.IndexOf("hardwarecfg");
  1168. if(index != -1) {
  1169. strPath[index] = '\0';
  1170. } else {
  1171. strPath[index] += SPLIT_SLASH;
  1172. }
  1173. CSimpleStringA strMCRunCfg = strPath + "runinfo" SPLIT_SLASH_STR "runcfg" SPLIT_SLASH_STR "MediaController.ini";
  1174. if(nEnvID == -2) {
  1175. #if defined(_MSC_VER)
  1176. DWORD dwSize = ::GetPrivateProfileStringA("Video", "FrontCamera", "$",
  1177. lpValue, MAX_PATH, strMCRunCfg);
  1178. #else
  1179. DWORD dwSize = inifile_read_str_s("Video", "FrontCamera", "$", lpValue, MAX_PATH, strMCRunCfg);
  1180. #endif //_MSC_VER
  1181. if(strlen(lpValue) > 1) {
  1182. CSimpleStringA strValue(lpValue);
  1183. m_fixedCamera[CAMTYPE_ENV-1].strDevName = GetPrefixCameraName(strValue);
  1184. m_fixedCamera[CAMTYPE_ENV-1].devType = CAMTYPE_ENV;
  1185. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Found front camera name from runinfo: %s", m_fixedCamera[CAMTYPE_ENV - 1].strDevName.GetData());
  1186. }
  1187. }
  1188. if(nOptID == -2) {
  1189. #if defined(_MSC_VER)
  1190. DWORD dwSize = ::GetPrivateProfileStringA("Video", "RearCamera", "$", lpValue, MAX_PATH, strMCRunCfg);
  1191. #else
  1192. DWORD dwSize = inifile_read_str_s("Video", "RearCamera", "$", lpValue, MAX_PATH, strMCRunCfg);
  1193. #endif //_MSC_VER
  1194. if(strlen(lpValue) > 1) {
  1195. CSimpleStringA strValue(lpValue);
  1196. m_fixedCamera[CAMTYPE_OPT-1].strDevName = GetPrefixCameraName(strValue);
  1197. m_fixedCamera[CAMTYPE_OPT-1].devType = CAMTYPE_OPT;
  1198. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Found rear camera name from runinfo: %s", m_fixedCamera[CAMTYPE_OPT - 1].strDevName.GetData());
  1199. }
  1200. }
  1201. }
  1202. }
  1203. }
  1204. }
  1205. //Debug
  1206. std::string strDebug;
  1207. for(int i=0; i<FIX_CAMERA_COUNTS; ++i) {
  1208. CSimpleStringA tmp = CSimpleStringA::Format("[%s]%s: %d", CameraTypeToString(m_fixedCamera[i].devType),
  1209. m_fixedCamera[i].strDevName.GetData(),m_fixedCamera[i].bIdle);
  1210. if(i != 0) strDebug += "$$";
  1211. strDebug += tmp.GetData();
  1212. }
  1213. LogWarn(Severity_Low, Error_Debug, LOG_ERR_SCANNERSET_CONFIGURE_CAMERA, strDebug.c_str());
  1214. return ec;
  1215. }
  1216. bool CScannerFSM::IsPortableScannerDetected(LPCTSTR strDeviceID, BOOL& bUpstairOne)
  1217. {
  1218. //TODO: 根据良田和南天提供的设备标识名,判断插入的是否为高拍仪所有的摄像头
  1219. CSimpleStringA strDevice(strDeviceID);
  1220. bUpstairOne = FALSE;
  1221. LPCTSTR split = strrchr(strDeviceID, '#');
  1222. if(split != NULL) {
  1223. if(!_strnicmp(split+1, "upcamera", strlen("upcamera"))) {
  1224. bUpstairOne = TRUE;
  1225. return true;
  1226. }
  1227. else if(!_strnicmp(split+1, "downcamera", strlen("downcamera"))) {
  1228. return true;
  1229. }
  1230. }
  1231. return false;
  1232. }
  1233. int CScannerFSM::GetCurrentCameraList(
  1234. CAutoArray<ScannerDeviceInfo>& devInforLists,
  1235. bool bUpdatedRecord)
  1236. {
  1237. int nCount = 0;
  1238. #if defined(RVC_OS_WIN)
  1239. devInforLists.Clear();
  1240. if (!bUpdatedRecord) {
  1241. CAMERA_BUCKET buckets;
  1242. nCount = GetCameraInfors(buckets);
  1243. if (nCount > 0) {
  1244. RefreshCameraBusyState(devInforLists, buckets, nCount);
  1245. DestoryCamereBuckets(buckets);
  1246. }
  1247. } else {
  1248. UpdateCameraInfors(m_cameralist);
  1249. nCount = m_cameralist.size();
  1250. if (nCount > 0) {
  1251. RefreshCameraBusyState(devInforLists, m_cameralist, nCount);
  1252. }
  1253. }
  1254. #endif //RVC_OS_WIN
  1255. return nCount;
  1256. }
  1257. #if defined(RVC_OS_WIN)
  1258. void CScannerFSM::RefreshCameraBusyState(
  1259. CAutoArray<ScannerDeviceInfo>& devInforLists, const CAMERA_BUCKET& buckets, int bucketSize)
  1260. {
  1261. devInforLists.Init(bucketSize);
  1262. for(int i=0; i<bucketSize; ++i)
  1263. {
  1264. devInforLists[i].strDevName = buckets[i]->szDevName;
  1265. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("[%d]%s(%s)", i, (LPCTSTR)devInforLists[i].strDevName, buckets[i]->szDevPath);
  1266. devInforLists[i].devType = GetRVCCameraType(devInforLists[i].strDevName);
  1267. if(TRUE && devInforLists[i].devType == CAMTYPE_HSPS)
  1268. devInforLists[i].bIdle = TRUE;
  1269. else
  1270. devInforLists[i].bIdle = (IsDeviceBusy(devInforLists[i].strDevName) == 0);
  1271. }
  1272. }
  1273. #endif //RVC_OS_WIN
  1274. static BOOL IsTheSameDevice(CSimpleStringA& szRunDev, CSimpleStringA& szConfigDev)
  1275. {
  1276. if(szRunDev.IsNullOrEmpty() || szConfigDev.IsNullOrEmpty()) {
  1277. return FALSE;
  1278. }
  1279. if(szConfigDev.IsStartWith(szRunDev)) {
  1280. return TRUE;
  1281. }
  1282. return FALSE;
  1283. }
  1284. /*判断摄像头的类型(使用途径)*/
  1285. CapTypeEnum CScannerFSM::GetRVCCameraType(LPCTSTR lpcszDevName)
  1286. {
  1287. CapTypeEnum type = CAMTYPE_UNKNOWN;
  1288. BOOL bUpstairs = FALSE;
  1289. if(lpcszDevName == NULL || strlen(lpcszDevName) == 0) {
  1290. LOG_TRACE("invalid dev name.");
  1291. return type;
  1292. }
  1293. if(IsPortableScannerDetected(lpcszDevName, bUpstairs)) {
  1294. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Detect royal scanner type, up one: %d", bUpstairs);
  1295. return bUpstairs ? CAMTYPE_CIRCLE : CAMTYPE_HSPS;
  1296. } else {
  1297. bool bGet = false;
  1298. for(int i=0; i<FIX_CAMERA_COUNTS; ++i) {
  1299. CSimpleStringA strTemp(lpcszDevName);
  1300. if(IsTheSameDevice(strTemp, m_fixedCamera[i].strDevName)) {
  1301. type = m_fixedCamera[i].devType;
  1302. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Detect [%s] is %s", lpcszDevName, CameraTypeToString(type));
  1303. bGet = true;
  1304. break;
  1305. }
  1306. }
  1307. if(!bGet && !m_bEwsNameRefreshed && m_strEwsRecordName.GetLength() > 1) {
  1308. if(IsEwsCamera(lpcszDevName)) {
  1309. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("detect ews camera.");
  1310. m_fixedCamera[CAMTYPE_EWS-1].strDevName = lpcszDevName;
  1311. m_fixedCamera[CAMTYPE_EWS-1].devType = CAMTYPE_EWS;
  1312. m_bEwsNameRefreshed = true;
  1313. type = CAMTYPE_EWS;
  1314. }
  1315. }
  1316. }
  1317. return type;
  1318. }
  1319. void CScannerFSM::OnDeviceInsert()
  1320. {
  1321. if(!m_bUsePortableScanner) {
  1322. return;
  1323. }
  1324. #if defined(RVC_OS_WIN)
  1325. EnterCriticalSection(&cs_devEvt);
  1326. CAMERA_BUCKET newBuckets;
  1327. int newCount = GetCameraInfors(newBuckets);
  1328. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("OnDeviceInsert: %d VS %d", newCount, m_cameralist.size());
  1329. if(newCount > m_cameralist.size()) {
  1330. CAMERA_BUCKET diffBuckes;
  1331. int diffCount = ExclusiveCameraBuckes(newBuckets, m_cameralist, diffBuckes);
  1332. DisplayCameraInfos(diffBuckes);
  1333. if(diffCount > 0) {
  1334. {
  1335. int state = 0;
  1336. ScannerDeviceInfo info = {};
  1337. auto rc = IsPortScanHoldDevice(&info, state);
  1338. if(ISSUCCEEDED(rc)) {
  1339. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("hold status: %d, devName: %s type:%d",
  1340. state, (LPCTSTR)info.strDevName, info.devType);
  1341. }
  1342. }
  1343. CAMERA_BUCKET_CITER citer = diffBuckes.cbegin();
  1344. while(citer != diffBuckes.cend()) {
  1345. if(CAMTYPE_HSPS == GetRVCCameraType((*citer)->szDevName)
  1346. /*risk: cannot open*/
  1347. && IsDeviceBusy((*citer)->szDevName) == 0
  1348. ) {//设备是高拍仪才进行绑定
  1349. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Found new CAMTYPE_HSPS type scanner");
  1350. //Should be set advanced PortableHSPS directly ?
  1351. ScannerDeviceInfo newInfo;
  1352. int nDevID = GetAdvancedScannerDevice(&newInfo);
  1353. if(nDevID >= 0) {
  1354. if(!newInfo.strDevName.Compare((*citer)->szDevName)) {
  1355. auto ec = BindPSDevice(nDevID, newInfo.strDevName);
  1356. if(ISSUCCEEDED(ec)) {
  1357. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Bind Portable scanner -force succ.");
  1358. }else {
  1359. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Bind Portable scanner -force failed RC=0X%X", ec);
  1360. }
  1361. }
  1362. }
  1363. break;
  1364. }
  1365. citer++;
  1366. }
  1367. DestoryCamereBuckets(diffBuckes);
  1368. }
  1369. UpdateCameraInfors(m_cameralist);
  1370. }
  1371. DestoryCamereBuckets(newBuckets);
  1372. LeaveCriticalSection(&cs_devEvt);
  1373. #endif //RVC_OS_WIN
  1374. }
  1375. void CScannerFSM::OnDeviceRemoved()
  1376. {
  1377. if(!m_bUsePortableScanner) {
  1378. return;
  1379. }
  1380. #if defined(RVC_OS_WIN)
  1381. EnterCriticalSection(&cs_devEvt);
  1382. CAMERA_BUCKET newBuckets;
  1383. int newCount = GetCameraInfors(newBuckets);
  1384. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("OnDeviceRemoved: now %d VS before %d", newCount, m_cameralist.size());
  1385. if(newCount < m_cameralist.size()) {
  1386. CAMERA_BUCKET diffBuckes;
  1387. int diffCount = ExclusiveCameraBuckes(m_cameralist, newBuckets, diffBuckes);
  1388. DisplayCameraInfos(diffBuckes);
  1389. if(diffCount > 0) {
  1390. bool bReBind = false;
  1391. int state = 0;
  1392. ScannerDeviceInfo info = {};
  1393. auto rc = IsPortScanHoldDevice(&info, state);
  1394. if(ISSUCCEEDED(rc) && state > 0) {//之前有设备绑定重新用其他设备进行绑定
  1395. CAMERA_BUCKET_CITER citer = diffBuckes.cbegin();
  1396. while(citer != diffBuckes.cend()) {
  1397. if(!info.strDevName.Compare((*citer)->szDevName)) {//绑定的设备被移除了
  1398. ScannerDeviceInfo replacedInfo;
  1399. int nReplaceDevID = GetAdvancedScannerDevice(&replacedInfo);
  1400. if(nReplaceDevID >= 0) {
  1401. auto ec = BindPSDevice(nReplaceDevID, replacedInfo.strDevName);
  1402. if(ISSUCCEEDED(ec)) {
  1403. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Bind Portable scanner -force succ.");
  1404. }else {
  1405. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Bind Portable scanner -force failed RC=0X%X", ec);
  1406. }
  1407. } else {
  1408. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Thera are no any appropriate device, send drop message.");
  1409. auto rc = DropOffPortScannerDevice();
  1410. if(FAILURED(rc)) {
  1411. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("Opps! Drop Off PortScanner Device failed RC=0x%X", rc);
  1412. }else {
  1413. if(info.devType == CAMTYPE_ENV) {
  1414. WaitPortableReleaseCamera(CAMTYPE_ENV);
  1415. AccessCamerePriviledge(false, CAMTYPE_ENV);
  1416. }
  1417. bReBind = true;
  1418. }
  1419. }
  1420. break;
  1421. }else {
  1422. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("removed one: %s", (*citer)->szDevName);
  1423. }
  1424. citer++;
  1425. }
  1426. }
  1427. DestoryCamereBuckets(diffBuckes);
  1428. }
  1429. UpdateCameraInfors(m_cameralist);
  1430. }
  1431. DestoryCamereBuckets(newBuckets);
  1432. LeaveCriticalSection(&cs_devEvt);
  1433. #endif //RVC_OS_WIN
  1434. }
  1435. void CScannerFSM::PSEntityPostCameraError(LPCTSTR lpcszCameraName)
  1436. {
  1437. if((!m_bUsePortableScanner) || lpcszCameraName == NULL) {
  1438. return;
  1439. }
  1440. CSimpleStringA strCameraName = lpcszCameraName;
  1441. if(strCameraName.GetLength() <= 0) {
  1442. ScannerDeviceInfo existed = {};
  1443. int state = 0;
  1444. if(Error_Succeed != IsPortScanHoldDevice(&existed, state)) {
  1445. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("IsPortScanHoldDevice invoked failed");
  1446. return;
  1447. }
  1448. if(state == 0) {
  1449. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Occasion@1");
  1450. return;
  1451. }
  1452. strCameraName = existed.strDevName;
  1453. if(strCameraName.GetLength() <= 0) {
  1454. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Occasion@2");
  1455. return;
  1456. }
  1457. }
  1458. CAutoArray<CSimpleStringA> devNames;
  1459. devNames.Init(1);
  1460. devNames[0] = strCameraName;
  1461. ScannerDeviceInfo info;
  1462. ErrorCodeEnum ec = Error_Succeed;
  1463. int nDevID = GetAdvancedScannerDeviceEx(&info, devNames);
  1464. if(nDevID >= 0) {
  1465. ec = BindPSDevice(nDevID, info.strDevName);
  1466. if(ISSUCCEEDED(ec)) {
  1467. Sleep(200);
  1468. }
  1469. } else {
  1470. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("There are no advanced device could be used, so drop off the current one");
  1471. auto rc = DropOffPortScannerDevice(!m_bDesk2SMachine);
  1472. if(FAILURED(rc)) {
  1473. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Opps! Drop Off PortScanner Device failed RC=0x%X", rc);
  1474. }
  1475. ec = Error_DevNotAvailable;
  1476. }
  1477. }
  1478. bool CScannerFSM::IsHSPSConnectSessionOK()
  1479. {
  1480. return (m_pHSPSClient != NULL && !m_pHSPSClient->QuerySessionClosed());
  1481. }
  1482. bool CScannerFSM::IsPortableConnectSessionOK()
  1483. {
  1484. return (m_pPortableClient != NULL && !m_pPortableClient->QuerySessionClosed());
  1485. }
  1486. ErrorCodeEnum CScannerFSM::IsPortScanHoldDevice(ScannerDeviceInfo* pInfo, int& curState)
  1487. {
  1488. if(pInfo == NULL) {
  1489. return Error_Param;
  1490. }
  1491. if(IsSuitableEntityAvailable()) {
  1492. PortableScannerService_GetDevStatus_Req req = {};
  1493. PortableScannerService_GetDevStatus_Ans ans = {};
  1494. auto ec = (*m_pPortableClient)(EntityResource::getLink().upgradeLink())->GetDevStatus(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT);
  1495. if(FAILURED(ec)) {
  1496. if (MapErrorCode2Level(ec)) {
  1497. LogWarn(Severity_Middle, ec, LOG_ERR_SCANNERSET_API_INVOKE_GetDevStatus,
  1498. CSimpleStringA::Format("GetDevStatus failed 0x%x(%d).", ec, ec));
  1499. ec = Error_DevNotAvailable;
  1500. } else {
  1501. LogWarn(Severity_Middle, ec, LOG_ERR_SCANNERSET_API_INVOKE_GetDevStatus,
  1502. CSimpleStringA::Format("GetDevStatus failed 0x%x(%d).", ec, ec));
  1503. }
  1504. } else {
  1505. pInfo->devIdx = ans.devIndex;
  1506. pInfo->strDevName = ans.checkcode;
  1507. if(ans.connected == 0) {
  1508. curState = 0;
  1509. }else {
  1510. if(ans.previewing && ans.showing) {
  1511. curState = 6;
  1512. }else if(ans.previewing){
  1513. curState = 2;
  1514. }else if(ans.showing) {
  1515. curState = 4;
  1516. }else {
  1517. curState = 1;
  1518. }
  1519. }
  1520. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetDevStatus: state:%d, devIdx:%d, devName:%s",
  1521. curState, pInfo->devIdx, (LPCTSTR)pInfo->strDevName);
  1522. pInfo->bIdle = (BOOL)curState;
  1523. pInfo->devType = (CapTypeEnum)ans.type;
  1524. }
  1525. return ec;
  1526. } else {
  1527. LogWarn(Severity_Middle, Error_DevNotAvailable, LOG_WARN_ATTACH_FAILED, "Connect to PortableScanner entity failed!");
  1528. return Error_DevNotAvailable;
  1529. }
  1530. }
  1531. ErrorCodeEnum CScannerFSM::IsPortScanHoldDevice(bool& hasHolden,
  1532. int& DevID,
  1533. CSimpleStringA& strDevName,
  1534. bool& bBusy)
  1535. {
  1536. if(IsSuitableEntityAvailable()) {
  1537. PortableScannerService_GetDevStatus_Req req = {};
  1538. PortableScannerService_GetDevStatus_Ans ans = {};
  1539. auto ec = (*m_pPortableClient)(EntityResource::getLink().upgradeLink())->GetDevStatus(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT);
  1540. if(FAILURED(ec)) {
  1541. LogWarn(Severity_Middle, ec, LOG_ERR_SCANNERSET_API_INVOKE_GetDevStatus,
  1542. CSimpleStringA::Format("GetDevStatus failed 0x%x(%d).", ec, ec));
  1543. } else {
  1544. DevID = ans.devIndex;
  1545. strDevName = ans.checkcode;
  1546. if(ans.connected == 0) {
  1547. hasHolden = false;
  1548. }else {
  1549. hasHolden = true;
  1550. }
  1551. if(ans.previewing && ans.showing) {
  1552. bBusy = true;
  1553. }else {
  1554. bBusy = false;
  1555. }
  1556. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetDevStatus succ: (%d)[%s]", DevID, (LPCTSTR)strDevName);
  1557. }
  1558. return ec;
  1559. } else {
  1560. return Error_DevNotAvailable;
  1561. }
  1562. }
  1563. bool CScannerFSM::IsPortScanHoldLimitedDevice(CapTypeEnum& devType)
  1564. {
  1565. bool result(false);
  1566. if(!m_bDesk2SMachine) return result;
  1567. for(int i=0; i<FIX_CAMERA_COUNTS; ++i) {
  1568. if(!m_fixedCamera[i].strDevName.IsNullOrEmpty() && m_fixedCamera[i].strDevName.Compare("$") != 0) {
  1569. CSimpleStringA owner;
  1570. ErrorCodeEnum rc1 = GetCameraOccpuiedStatus(GetEntityBase(),
  1571. GetPrefixCameraName(m_fixedCamera[i].strDevName), owner);
  1572. if(!owner.IsNullOrEmpty() && owner.Compare("PortableScanner") == 0) {
  1573. devType = m_fixedCamera[i].devType;
  1574. result = true;
  1575. break;
  1576. }
  1577. }
  1578. }
  1579. return result;
  1580. }
  1581. void CScannerFSM::ClearPortScanHoldLimitedDevice(const CapTypeEnum& devType, const char* lpcszDevName)
  1582. {
  1583. if(CAMTYPE_UNKNOWN < devType && devType < CAMTYPE_MAX) {
  1584. if(!m_fixedCamera[devType-1].strDevName.IsNullOrEmpty()) {
  1585. OccpyCameraStruct item(GetPrefixCameraName(m_fixedCamera[devType-1].strDevName), "PortableScanner");
  1586. RemoveOccpuiedCamera(item, GetEntityBase()->GetFunction());
  1587. }
  1588. } else if(devType == CAMTYPE_MAX) {
  1589. OccpyCameraStruct item("*", "PortableScanner");
  1590. RemoveOccpuiedCamera(item, GetEntityBase()->GetFunction());
  1591. } else if(devType == CAMTYPE_UNKNOWN && lpcszDevName != NULL) {
  1592. OccpyCameraStruct item(lpcszDevName, "PortableScanner");
  1593. RemoveOccpuiedCamera(item, GetEntityBase()->GetFunction());
  1594. }
  1595. }
  1596. ErrorCodeEnum CScannerFSM::AttachCheck()
  1597. {
  1598. if(!m_bUsePortableScanner) {
  1599. return Error_Succeed;
  1600. }
  1601. ErrorCodeEnum ec = Error_Succeed;
  1602. ScannerDeviceInfo existed = {};
  1603. int state = 0;
  1604. ec = IsPortScanHoldDevice(&existed, state);
  1605. if(ISSUCCEEDED(ec)) {
  1606. if(state == 0) {
  1607. ScannerDeviceInfo info;
  1608. int nDevID = GetAdvancedScannerDevice(&info);
  1609. if(nDevID >= 0) {
  1610. ec = TryBindPSDevice(nDevID, info.strDevName);
  1611. if(ISSUCCEEDED(ec)) {
  1612. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("AttachCheck::TryBindPSDevice [%d][%s] succ", nDevID, info.strDevName.GetData());
  1613. Sleep(200);
  1614. } else {
  1615. /** 为抹平 Level3 所加的告警 Gifur@2023222]*/
  1616. if (ec != Error_DevNotAvailable) {
  1617. LogError(Severity_Middle, ec, LOG_ERR_SCANNERSET_BIND_CAMERA, CSimpleStringA::Format("AttachCheck::TryBindPSDevice [%d][%s] failed: %s", nDevID, info.strDevName.GetData(), SpStrError(ec)));
  1618. }
  1619. }
  1620. } else {
  1621. LogWarn(Severity_Middle, Error_DevNotAvailable, LOG_WARN_ATTACH_FAILED, "There are no advanced device could be used.");
  1622. ec = Error_DevNotAvailable;
  1623. }
  1624. }else {
  1625. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("PortableScanner holds device now, [%d](%s)",
  1626. existed.devIdx, (LPCTSTR)existed.strDevName);
  1627. }
  1628. }
  1629. return ec;
  1630. }
  1631. ErrorCodeEnum CScannerFSM::AttachReleaseIfNecessary()
  1632. {
  1633. if(m_bDesk2SMachine) {
  1634. ErrorCodeEnum ec = Error_Succeed;
  1635. ScannerDeviceInfo existed = {};
  1636. int state = 0;
  1637. ec = IsPortScanHoldDevice(&existed, state);
  1638. if(existed.devType == CAMTYPE_ENV && DropOffPortScannerDevice() == Error_Succeed) {
  1639. WaitPortableReleaseCamera(CAMTYPE_ENV);
  1640. AccessCamerePriviledge(false, CAMTYPE_ENV);
  1641. }
  1642. }
  1643. return Error_Succeed;
  1644. }
  1645. void CScannerFSM::OnChildEntityStateChange(const EntityStateEnum& oldState, const EntityStateEnum& curState)
  1646. {
  1647. if(m_bDesk2SMachine) {
  1648. if(IsNoralEntityState(oldState) && !IsNoralEntityState(curState)) {
  1649. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PortableScnner is dead!");
  1650. if(IsPortScanHoldEnvCameraFromSysVar()) {
  1651. AccessCamerePriviledge(false, CAMTYPE_ENV);
  1652. }
  1653. }
  1654. }
  1655. }
  1656. ErrorCodeEnum CScannerFSM::_BindPSDevice(int nDevID, LPCTSTR lpcszDevName, bool bForce)
  1657. {
  1658. if(!m_bUsePortableScanner) {
  1659. return Error_InvalidState;
  1660. }
  1661. auto rc = ConnectToPortableScanner();
  1662. if(ISSUCCEEDED(rc)) {
  1663. PortableScannerService_BindCameraDevice_Req req = {};
  1664. PortableScannerService_BindCameraDevice_Ans ans = {};
  1665. req.devId = nDevID;
  1666. req.devName = lpcszDevName;
  1667. req.type = (int)GetRVCCameraType(lpcszDevName);
  1668. req.force = bForce ? 1 : 0;
  1669. if(CAMTYPE_ENV == req.type) {
  1670. rc = AccessCamerePriviledge(true, CAMTYPE_ENV);
  1671. if(rc != Error_Succeed && rc != Error_Param) {
  1672. LogWarn(Severity_Middle, rc, LOG_ERR_SCANNERSET_HSPSCNT_ACCESS_ENV_FAILED, "get access env camera priviledge failed!");
  1673. return rc;
  1674. }
  1675. }
  1676. DWORD dwUserCode(0);
  1677. rc = (*m_pPortableClient)(EntityResource::getLink().upgradeLink())->BindCameraDevice(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT, dwUserCode);
  1678. if(ISSUCCEEDED(rc)) {
  1679. LogWarn(Severity_Low, rc, LOG_ERR_SCANNERSET_BIND_CAMERA,
  1680. CSimpleStringA::Format("Bind portable scan device (%d)[%s] suc, previous one: (%d)[%s]",
  1681. req.devId, (LPCTSTR)req.devName,
  1682. ans.usedId, (LPCTSTR)ans.checkcode));
  1683. if(CAMTYPE_ENV == GetRVCCameraType(ans.checkcode)) {
  1684. AccessCamerePriviledge(false, CAMTYPE_ENV);
  1685. } else {
  1686. ClearPortScanHoldLimitedDevice(CAMTYPE_UNKNOWN, ans.checkcode);
  1687. }
  1688. OccpyCameraStruct curItem(req.devName, "PortableScanner");
  1689. AppendOccpuiedCamera(curItem, GetEntityBase()->GetFunction());
  1690. } else {
  1691. if (MapErrorCode2Level(rc)) {
  1692. LogWarn(Severity_Middle, rc, LOG_ERR_SCANNERSET_API_INVOKE_BindCameraDevice, CSimpleStringA::Format("Bind portable scan device failed, ErrCode:%s, userCode: 0x%08X.", SpStrError(rc), dwUserCode));
  1693. rc = Error_DevNotAvailable;
  1694. } else {
  1695. LogWarn(Severity_Middle, rc, LOG_ERR_SCANNERSET_API_INVOKE_BindCameraDevice, CSimpleStringA::Format("Bind portable scan device failed, ErrCode:%s, userCode: 0x%08X.", SpStrError(rc), dwUserCode));
  1696. }
  1697. }
  1698. } else {
  1699. //LogWarn(Severity_Middle, rc, LOG_WARN_CONNECT_PORTABLESCANNER_FAILED,
  1700. // CSimpleStringA::Format("Connect to portable scan entity failed for BindDevice, EC = %u", rc));
  1701. }
  1702. return rc;
  1703. }
  1704. int CScannerFSM::GetAdvancedScannerDevice(ScannerDeviceInfo* pDevInfo)
  1705. {
  1706. CAutoArray<CSimpleStringA> emptys;
  1707. return GetAdvancedScannerDeviceEx(pDevInfo, emptys);
  1708. }
  1709. int CScannerFSM::GetAdvancedScannerDeviceEx(ScannerDeviceInfo* pDevInfo,
  1710. const CAutoArray<CSimpleStringA>& caForbitDeviceNames)
  1711. {
  1712. if(pDevInfo == NULL) {
  1713. return -2;
  1714. }
  1715. CAutoArray<ScannerDeviceInfo> cameralist;
  1716. bool bInnerUpdated = false;
  1717. const int devCount = GetCurrentCameraList(cameralist, bInnerUpdated);
  1718. int nHSPS = -1, nOpt = -1, nOptional = -1, nEws = -1, nEnv = -1;
  1719. bool bIgonre = false;
  1720. const bool bFilter = (caForbitDeviceNames.GetCount() > 0);
  1721. if(devCount > 0) {
  1722. //requirements: available,
  1723. for(int i=0; i<devCount; ++i) {
  1724. if(bFilter)
  1725. {
  1726. bIgonre = false;
  1727. for(int j=0, count=caForbitDeviceNames.GetCount(); j<count; ++j) {
  1728. if(cameralist[i].strDevName.Compare(caForbitDeviceNames[j]) == 0) {
  1729. bIgonre = true;
  1730. break;
  1731. }
  1732. }
  1733. if(bIgonre) {
  1734. continue;
  1735. }
  1736. }
  1737. if(cameralist[i].bIdle && cameralist[i].devType == CAMTYPE_HSPS) {
  1738. nHSPS = i;
  1739. break;
  1740. }else if(cameralist[i].bIdle && cameralist[i].devType == CAMTYPE_OPT) {
  1741. nOpt = i;
  1742. }else if(cameralist[i].bIdle && cameralist[i].devType == CAMTYPE_EWS) {
  1743. nEws = i;
  1744. }else if(cameralist[i].bIdle && cameralist[i].devType != CAMTYPE_ENV && nOptional == -1) {
  1745. nOptional = i;
  1746. }else if(cameralist[i].bIdle && cameralist[i].devType == CAMTYPE_ENV) {
  1747. nEnv = i;
  1748. }
  1749. }
  1750. }
  1751. /*高拍仪 > 后摄(一般不进行配置,所以作用不大) > 非前置摄像头!!,有可能是 EWS 或者 后摄(如果没配置)或者未知其他摄像头,*/
  1752. int aim = nHSPS != -1 ? nHSPS : ( nOpt != -1 ? nOpt : (nOptional != -1 ? nOptional : nEws ) );
  1753. if(aim != -1) {
  1754. pDevInfo->strDevName = cameralist[aim].strDevName;
  1755. pDevInfo->bIdle = FALSE;
  1756. pDevInfo->devType = cameralist[aim].devType;
  1757. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Ex Lucky choice device: %s", (LPCTSTR)pDevInfo->strDevName);
  1758. } else if(m_bDesk2SMachine && devCount == 1 && nEnv != -1) {
  1759. aim = nEnv;
  1760. pDevInfo->strDevName = cameralist[nEnv].strDevName;
  1761. pDevInfo->bIdle = FALSE;
  1762. pDevInfo->devType = cameralist[nEnv].devType;
  1763. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("!!!!! Desk2S at single camera: choice env camera: %s", (LPCTSTR)pDevInfo->strDevName);
  1764. } else {
  1765. LogWarn(Severity_Middle, Error_DevNotAvailable, LOG_ERR_SCANNERSET_NO_AVAILABLE_CAMERA,
  1766. CSimpleStringA::Format("Opps! no available advanced portable scanner. %d", devCount));
  1767. SendBroadcastAbout();
  1768. }
  1769. return aim;
  1770. }
  1771. ErrorCodeEnum CScannerFSM::DropOffPortScannerDevice(bool skipToCheck)
  1772. {
  1773. ErrorCodeEnum rc = Error_Unexpect;
  1774. if((m_bUsePortableScanner) && ISSUCCEEDED(rc = ConnectToPortableScanner())) {
  1775. ScannerDeviceInfo preDev = {};
  1776. preDev.devType = CAMTYPE_UNKNOWN;
  1777. if(!skipToCheck) {
  1778. int state = 0;
  1779. IsPortScanHoldDevice(&preDev, state);
  1780. }
  1781. rc = (*m_pPortableClient)(EntityResource::getLink().upgradeLink())->DropOffDevice();
  1782. if(rc == Error_Succeed) {
  1783. if(preDev.devType == CAMTYPE_ENV) { //not skip to check!!!!
  1784. WaitPortableReleaseCamera(CAMTYPE_ENV);
  1785. AccessCamerePriviledge(false, CAMTYPE_ENV);
  1786. } else {
  1787. ClearPortScanHoldLimitedDevice(CAMTYPE_MAX);
  1788. }
  1789. }
  1790. FreePortableScannerClient();
  1791. }
  1792. return rc;
  1793. }
  1794. void CScannerFSM::InitializeMehodQueue()
  1795. {
  1796. for (int idx=0; idx<SS_MAX_METHOD_COUNT; ++idx) {
  1797. ListEntry_InitHead(&m_methods[idx].ContextListHead);
  1798. m_methods[idx].dwSequence = 0;
  1799. m_methods[idx].dwMethodSig = (DWORD)-1;
  1800. }
  1801. m_methods[0].dwMethodSig = ScannerService_Method_StartPreview;
  1802. m_methods[1].dwMethodSig = ScannerService_Method_CancelPreview;
  1803. m_methods[2].dwMethodSig = ScannerService_Method_ScanImage;
  1804. m_methods[3].dwMethodSig = ScannerService_Method_SetWindowPos;
  1805. m_methods[4].dwMethodSig = ScannerService_Method_SetProperty;
  1806. m_methods[5].dwMethodSig = ScannerService_Method_ShowProperty;
  1807. m_methods[6].dwMethodSig = ScannerService_Method_GetDevStatus;
  1808. m_methods[7].dwMethodSig = ScannerService_Method_GetOnlineCameras;
  1809. m_methods[8].dwMethodSig = ScannerService_Method_CrossTermCall;
  1810. m_methods[9].dwMethodSig = ScannerService_Method_GetDevInfo;
  1811. m_methods[10].dwMethodSig = ScannerService_Method_Exit;
  1812. }
  1813. void CScannerFSM::DestoryMethodQueue()
  1814. {
  1815. for (int idx=0; idx<SS_MAX_METHOD_COUNT; ++idx) {
  1816. while(!ListEntry_IsEmpty(&m_methods[idx].ContextListHead)) {
  1817. PLIST_ENTRY pListEntry = ListEntry_RemoveListTail(&m_methods[idx].ContextListHead);
  1818. PTC_CONTEXT_CALL_ITEM ptContextItem = CONTAINING_RECORD(pListEntry, TC_CONTEXT_CALL_ITEM, ListEntry);
  1819. if(ptContextItem != NULL) {
  1820. TWHeapFree(ptContextItem);
  1821. ptContextItem = NULL;
  1822. }
  1823. }
  1824. }
  1825. }
  1826. ErrorCodeEnum CScannerFSM::TryBindPSDevice(int nDevID, LPCTSTR lpcszDevName)
  1827. {
  1828. return _BindPSDevice(nDevID, lpcszDevName);
  1829. }
  1830. ErrorCodeEnum CScannerFSM::BindPSDevice(int nDevID, LPCTSTR lpcszDevName)
  1831. {
  1832. return _BindPSDevice(nDevID, lpcszDevName, true);
  1833. }
  1834. void CScannerFSM::SendBroadcastAbout()
  1835. {
  1836. if(!m_bUsePortableScanner) {
  1837. return;
  1838. }
  1839. EventMsg evt;
  1840. evt.eventType = 0;
  1841. evt.reserved2 = "无可用的摄像头或摄像头故障,请检查设备!";
  1842. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SpSendBroadcast(%d, %s)", evt.eventType, (LPCTSTR)evt.reserved2);
  1843. SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(EventMsg), SP_MSG_SIG_OF(EventMsg), evt);
  1844. }
  1845. void CScannerFSM::WaitPortableReleaseCamera(int nCameraType, DWORD dwTimeoutMilSec)
  1846. {
  1847. const DWORD eachTimeElaspe = 300;
  1848. int times = 0;
  1849. while (times * eachTimeElaspe < dwTimeoutMilSec)
  1850. {
  1851. int state = 0;
  1852. ErrorCodeEnum ec = Error_Succeed;
  1853. ScannerDeviceInfo existed = {};
  1854. ec = IsPortScanHoldDevice(&existed, state);
  1855. if(existed.devType == nCameraType) {
  1856. Sleep(eachTimeElaspe);
  1857. times++;
  1858. } else {
  1859. break;
  1860. }
  1861. }
  1862. }
  1863. ErrorCodeEnum CScannerFSM::ConnectToMediaController()
  1864. {
  1865. FreeMediaControllerClient();
  1866. m_pMediaControlClient = new CMediaCtrlClient(GetEntityBase());
  1867. ErrorCodeEnum erroCode = m_pMediaControlClient->Connect();
  1868. if(FAILURED(erroCode)) {
  1869. m_pMediaControlClient->SafeDelete();
  1870. m_pMediaControlClient = NULL;
  1871. LogWarn(Severity_Middle, Error_InvalidState, LOG_ERR_SCANNERSET_CONNECT_MEDIACONTRLLER_FAILED,
  1872. CSimpleStringA::Format("Connect to mediacontroller entity failed: 0x%X", erroCode));
  1873. return Error_InvalidState;
  1874. }
  1875. return Error_Succeed;
  1876. }
  1877. ErrorCodeEnum CScannerFSM::AccessCamerePriviledge(bool fWinOver, int nCameraType)
  1878. {
  1879. CSimpleStringA strDevName = m_fixedCamera[nCameraType-1].strDevName;
  1880. if(strDevName.IsNullOrEmpty() || strDevName == "$")
  1881. return Error_Param;
  1882. CSimpleStringA tmp = GetPrefixCameraName(strDevName);
  1883. strDevName = tmp;
  1884. ErrorCodeEnum result = HandleCamereAccessPriviledge(fWinOver, nCameraType, strDevName);
  1885. if(!fWinOver) {
  1886. ClearPortScanHoldLimitedDevice((CapTypeEnum)nCameraType);
  1887. }
  1888. return result;
  1889. }
  1890. ErrorCodeEnum CScannerFSM::HandleCamereAccessPriviledge(bool fWinOver, int nCameraType, const char* lpcszDevName)
  1891. {
  1892. #if defined(_MSC_VER)
  1893. ErrorCodeEnum result = ConnectToMediaController();
  1894. if(result == Error_Succeed) {
  1895. MediaController::MediaService_ManipulateMediaDevice_Req req = {};
  1896. MediaController::MediaService_ManipulateMediaDevice_Ans ans = {};
  1897. req.cmdType = fWinOver ? 0 : 1;
  1898. req.devType = nCameraType;
  1899. req.reserved1 = 0;
  1900. req.reserved2 = "";
  1901. result = (*m_pMediaControlClient)(EntityResource::getLink().upgradeLink())->ManipulateMediaDevice(req, ans, 20 * 1000);
  1902. if(result == Error_Succeed) {
  1903. if(ans.retCode != 0) {
  1904. result = Error_Unexpect;
  1905. }
  1906. }
  1907. if(result != Error_Succeed) {
  1908. LogWarn(Severity_Middle, result, LOG_ERR_SCANNERSET_MEDIACONTROLLER_MANIPULATE_FAILED,
  1909. CSimpleStringA::Format("Manipulate media device failed: ec: %s, ret: %d", SpStrError(result), ans.retCode));
  1910. }
  1911. } else {
  1912. EntityStateEnum state;
  1913. result = GetMediaControllerInfo(state);
  1914. if(result == Error_Succeed && IsNoralEntityState(state) && fWinOver) {
  1915. result = Error_Resource;
  1916. }
  1917. }
  1918. if(result != Error_Succeed) {
  1919. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("%s 0x%X", fWinOver ? "GetIt":"GiveUp", result);
  1920. } else {
  1921. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("%s %s succ !", fWinOver ? "GetIt":"GiveUp",CameraTypeToString((CapTypeEnum)nCameraType));
  1922. }
  1923. return result;
  1924. #else
  1925. return Error_NotSupport;
  1926. #endif //_MSC_VER
  1927. }
  1928. UINT CScannerFSM::UnitTest()
  1929. {
  1930. ScannerDeviceInfo info;
  1931. int nDevID = GetAdvancedScannerDevice(&info);
  1932. return 0;
  1933. }
  1934. #if defined(RVC_OS_WIN)
  1935. GUID* StrToGUID(const WCHAR *guid_string)
  1936. {
  1937. char buffer[64];
  1938. GUID* guid = (GUID*) buffer;
  1939. WCHAR upperGuid[40+1]={0};
  1940. for (int i =0 ; i < 40+1; i++)
  1941. {
  1942. upperGuid[i] = guid_string[i];
  1943. if (upperGuid[i]>=L'a' && upperGuid[i]<=L'z')
  1944. {
  1945. upperGuid[i] += L'A' - L'a';
  1946. }
  1947. }
  1948. swscanf_s(upperGuid, L"{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
  1949. &guid->Data1,
  1950. &guid->Data2,
  1951. &guid->Data3,
  1952. &guid->Data4[0],
  1953. &guid->Data4[1],
  1954. &guid->Data4[2],
  1955. &guid->Data4[3],
  1956. &guid->Data4[4],
  1957. &guid->Data4[5],
  1958. &guid->Data4[6],
  1959. &guid->Data4[7]);
  1960. return guid;
  1961. }
  1962. #endif //RVC_OS_WIN
  1963. bool CScannerFSM::FindEwsCameraName(CSimpleStringA& strRetrievedName,
  1964. const CSimpleStringA& strRootName)
  1965. {
  1966. if(strRootName.GetLength() <= 1) {
  1967. return false;
  1968. }
  1969. bool bRet = false;
  1970. #if defined(RVC_OS_WIN)
  1971. GUID deviceGuid = *StrToGUID(L"{6BDD1FC6-810F-11D0-BEC7-08002BE2092F}");
  1972. HDEVINFO hDev = SetupDiGetClassDevs(&deviceGuid, NULL, NULL, DIGCF_PRESENT);
  1973. if(INVALID_HANDLE_VALUE == hDev) {
  1974. return bRet;
  1975. }
  1976. SP_CLASSIMAGELIST_DATA _spImageData = {0};
  1977. _spImageData.cbSize = sizeof(SP_CLASSIMAGELIST_DATA);
  1978. SetupDiGetClassImageList(&_spImageData);
  1979. SP_DEVINFO_DATA DevInfo;
  1980. ZeroMemory(&DevInfo, sizeof(SP_DEVINFO_DATA));
  1981. DevInfo.cbSize = sizeof(SP_DEVINFO_DATA);
  1982. DWORD DeviceIndex = 0;
  1983. while(SetupDiEnumDeviceInfo(hDev, DeviceIndex, &DevInfo)) {
  1984. int wImageIdx = 0;
  1985. if (SetupDiGetClassImageIndex(&_spImageData, &DevInfo.ClassGuid, &wImageIdx)) {
  1986. char szName[MAX_PATH] = {0};
  1987. //先获取获取设备名
  1988. bool bHere = false;
  1989. if(SetupDiGetDeviceInstanceId(hDev, &DevInfo, szName, MAX_PATH - 1, NULL)) {
  1990. if (0 == _stricmp(szName, strRootName.GetData())) {
  1991. bHere = true;
  1992. }
  1993. } else {
  1994. if (SetupDiGetDeviceRegistryProperty(
  1995. hDev,&DevInfo, SPDRP_DEVICEDESC, NULL, (PBYTE)szName, MAX_PATH - 1, 0)) {
  1996. if (0 == _stricmp(szName, strRootName.GetData())) {
  1997. bHere = true;
  1998. }
  1999. }
  2000. }
  2001. if(bHere){
  2002. if (SetupDiGetDeviceRegistryProperty(
  2003. hDev, &DevInfo, SPDRP_FRIENDLYNAME, NULL, (PBYTE)szName, MAX_PATH - 1, 0)) {
  2004. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("FriendName: %s", szName);
  2005. strRetrievedName = szName;
  2006. bRet = !!(strRetrievedName.GetLength() > 0);
  2007. }
  2008. break;
  2009. }
  2010. }
  2011. DeviceIndex++;
  2012. }
  2013. SetupDiDestroyClassImageList(&_spImageData);
  2014. if(hDev) {
  2015. SetupDiDestroyDeviceInfoList(hDev);
  2016. }
  2017. #endif //RVC_OS_WIN
  2018. return bRet;
  2019. }
  2020. bool CScannerFSM::IsEwsCamera(LPCTSTR lpcszDevfriendlyName)
  2021. {
  2022. bool bRet = false;
  2023. #if defined(RVC_OS_WIN)
  2024. GUID deviceGuid = *StrToGUID(L"{6BDD1FC6-810F-11D0-BEC7-08002BE2092F}");
  2025. HDEVINFO hDev = SetupDiGetClassDevs(&deviceGuid, NULL, NULL, DIGCF_PRESENT);
  2026. if(INVALID_HANDLE_VALUE == hDev) {
  2027. return bRet;
  2028. }
  2029. SP_CLASSIMAGELIST_DATA _spImageData = {0};
  2030. _spImageData.cbSize = sizeof(SP_CLASSIMAGELIST_DATA);
  2031. SetupDiGetClassImageList(&_spImageData);
  2032. SP_DEVINFO_DATA DevInfo;
  2033. ZeroMemory(&DevInfo, sizeof(SP_DEVINFO_DATA));
  2034. DevInfo.cbSize = sizeof(SP_DEVINFO_DATA);
  2035. DWORD DeviceIndex = 0;
  2036. while(SetupDiEnumDeviceInfo(hDev, DeviceIndex, &DevInfo)) {
  2037. int wImageIdx = 0;
  2038. if (SetupDiGetClassImageIndex(&_spImageData, &DevInfo.ClassGuid, &wImageIdx)) {
  2039. char szName[MAX_PATH] = {0};
  2040. bool bHere = false;
  2041. if(SetupDiGetDeviceInstanceId(hDev, &DevInfo, szName, MAX_PATH - 1, NULL)) {
  2042. if (!_stricmp(szName, m_strEwsRecordName.GetData())) {
  2043. bHere = true;
  2044. }
  2045. } else {
  2046. if (SetupDiGetDeviceRegistryProperty(
  2047. hDev,&DevInfo, SPDRP_DEVICEDESC, NULL, (PBYTE)szName, MAX_PATH - 1, 0)) {
  2048. if (!_stricmp(szName, m_strEwsRecordName.GetData())) {
  2049. bHere = true;
  2050. }
  2051. }
  2052. }
  2053. if(bHere){
  2054. if (SetupDiGetDeviceRegistryProperty(
  2055. hDev,&DevInfo, SPDRP_FRIENDLYNAME, NULL, (PBYTE)szName, MAX_PATH - 1, 0)) {
  2056. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("FriendName: %s", szName);
  2057. if(!_stricmp(szName, lpcszDevfriendlyName)) {
  2058. bRet = true;
  2059. }
  2060. }
  2061. break;
  2062. }
  2063. }
  2064. DeviceIndex++;
  2065. }
  2066. SetupDiDestroyClassImageList(&_spImageData);
  2067. if(hDev) {
  2068. SetupDiDestroyDeviceInfoList(hDev);
  2069. }
  2070. #endif //RVC_OS_WIN
  2071. return bRet;
  2072. }