ScannerSetFSM.cpp 75 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662
  1. #include "stdafx.h"
  2. #include "ScannerSetFSM.h"
  3. #include "EventCode.h"
  4. #include "SpIni.h"
  5. #include "toolkit.h"
  6. #include "iniutil.h"
  7. #include "path.h"
  8. #include "CommEntityUtil.hpp"
  9. #if defined(RVC_OS_WIN)
  10. #include "SetupApi.h"
  11. #include <process.h>
  12. #endif //RVC_OS_WIN
  13. #define CHECKDEV_TIMER_ID 1
  14. const int MILLISECOND_TO_CHECKDEV = 15 * 1000;
  15. const int MILLISECOND_TO_CHECK_CONNECT = 30 * 1000;
  16. const int MAX_PATH_SIZE = 256;
  17. const int MAX_ERROR_TIMES = 2;
  18. const int MILLISECOND_WAIT_TIMEOUT_DEFAULT = 10 * 1000;
  19. const int MILLISECOND_WAIT_TIMEOUT_STARTPREVIEW = 20 * 1000;
  20. const int MILLISECOND_WAIT_TIMEOUT_SCANIMAGE = 15 * 1000;
  21. using namespace HeartBeat;
  22. const char* EvtTypeToString(int nEvtType)
  23. {
  24. switch(nEvtType)
  25. {
  26. case USER_EVT_STARTPREVIEW: return "USER_EVT_STARTPREVIEW";
  27. break;
  28. case USER_EVT_STARTPREVIEW_FINISHED: return "USER_EVT_STARTPREVIEW_FINISHED";
  29. break;
  30. case USER_EVT_STOPPREVIEW: return "USER_EVT_STOPPREVIEW";
  31. break;
  32. case USER_EVT_STOPPREVIEW_FINISHED: return "USER_EVT_STOPPREVIEW_FINISHED";
  33. break;
  34. case USER_EVT_SETWINPOS: return "USER_EVT_SETWINPOS";
  35. break;
  36. case USER_EVT_SETWINPOS_FINISHED: return "USER_EVT_SETWINPOS_FINISHED";
  37. break;
  38. case USER_EVT_SCANIMAGE: return "USER_EVT_SCANIMAGE";
  39. break;
  40. case USER_EVT_SCANIMAGEFINISHED: return "USER_EVT_SCANIMAGEFINISHED";
  41. break;
  42. case USER_EVT_SETPROPERTY: return "USER_EVT_SETPROPERTY";
  43. break;
  44. case USER_EVT_SETPROPERTY_FINISHED: return "USER_EVT_SETPROPERTY_FINISHED";
  45. break;
  46. case USER_EVT_SHOWPROPERTY: return "USER_EVT_SHOWPROPERTY";
  47. break;
  48. case USER_EVT_SHOWPROPERTY_FINISHED: return "USER_EVT_SHOWPROPERTY_FINISHED";
  49. break;
  50. case USER_EVT_GETSTATUS: return "USER_EVT_GETSTATUS";
  51. break;
  52. case USER_EVT_GETSTATUS_FINISHED: return "USER_EVT_GETSTATUS_FINISHED";
  53. break;
  54. case USER_EVT_GETINFO: return "USER_EVT_GETINFO";
  55. break;
  56. case USER_EVT_GETINFO_FINISHED: return "USER_EVT_GETINFO_FINISHED";
  57. break;
  58. case USER_EVT_EXIT: return "USER_EVT_EXIT";
  59. break;
  60. case USER_EVT_QUIT: return "USER_EVT_QUIT";
  61. break;
  62. case USER_EVT_RESET: return "USER_EVT_RESET";
  63. break;
  64. case USER_EVT_DEV_INVALID: return "USER_EVT_DEV_INVALID";
  65. break;
  66. case USER_EVT_DEV_RECOVER: return "USER_EVT_DEV_RECOVER";
  67. break;
  68. case USER_EVT_OPERATING: return "USER_EVT_OPERATING";
  69. break;
  70. case EVT_TIMER: return "EVT_TIMER";
  71. break;
  72. default:
  73. return "Unknown EventType";
  74. break;
  75. }
  76. }
  77. CScannerFSM::CScannerFSM(void)
  78. :
  79. m_csMachineType(true),
  80. m_csSite(true),
  81. m_bPadMachine(false),
  82. m_bStand2SMachine(false),
  83. m_bDesk2SMachine(false),
  84. m_bJBMachine(false),
  85. m_bDesk1SMachine(false),
  86. m_bUsePortableScanner(false),
  87. m_pHSPSClient(NULL),
  88. m_pPortableClient(NULL),
  89. m_ecSelfTest(Error_Succeed),
  90. m_dwErroCode(0),
  91. m_nFatalTimes(0),
  92. m_nSrcState(s0),
  93. m_iEvt(-1)
  94. {
  95. ListEntry_InitHead(&ContextListHead);
  96. #if defined(RVC_OS_WIN)
  97. m_hrCoInited = CoInitializeEx(NULL, COINIT_MULTITHREADED);
  98. #endif //RVC_OS_WIN
  99. }
  100. CScannerFSM::~CScannerFSM(void)
  101. {
  102. ReleaseSuitableEntity();
  103. #if defined(RVC_OS_WIN)
  104. DestoryCamereBuckets(m_cameralist);
  105. if (m_hrCoInited == S_OK) {
  106. CoUninitialize();
  107. }
  108. #endif //RVC_OS_WIN
  109. if(m_bJBMachine) {
  110. DestoryMethodQueue();
  111. }
  112. }
  113. ErrorCodeEnum CScannerFSM::OnInit()
  114. {
  115. LOG_FUNCTION();
  116. ErrorCodeEnum erroCode = Error_Succeed;
  117. Dbg("Complied at: %s %s", __DATE__, __TIME__);
  118. CSmartPointer<IConfigInfo> spConfig;
  119. CSystemStaticInfo sysInfo;
  120. erroCode = GetEntityBase()->GetFunction()->GetSystemStaticInfo(sysInfo);
  121. if (FAILURED(erroCode))
  122. {
  123. Dbg("Get System Static info failed: %s.", SpStrError(erroCode));
  124. return Error_Unexpect;
  125. }
  126. m_csMachineType = sysInfo.strMachineType;
  127. m_csSite = sysInfo.strSite;
  128. m_strTerminalNo = sysInfo.strTerminalID;
  129. Dbg("MachineType:%s, Site:%s, TerminalID:%s.", (LPCTSTR)m_csMachineType, (LPCTSTR)m_csSite, (LPCTSTR)m_strTerminalNo);
  130. m_bPadMachine = !m_csMachineType.Compare("RVC.Pad", true);
  131. if(!m_bPadMachine) {
  132. m_bDesk2SMachine = !m_csMachineType.Compare("RVC.Desk2S", true);
  133. }
  134. m_bStand2SMachine = !m_csMachineType.Compare("RVC.Stand2S", true);
  135. m_bJBMachine = !m_csMachineType.Compare("RVC.IL", true);
  136. m_bDesk1SMachine = !m_csMachineType.Compare("RVC.Desk1S", true);
  137. #if defined(RVC_OS_WIN)
  138. if (m_bPadMachine || m_bDesk2SMachine || m_bDesk1SMachine) {
  139. m_bUsePortableScanner = true;
  140. LoadConfigAboutCamera();
  141. GetCameraInfors(m_cameralist);
  142. HANDLE hEvtThread = (HANDLE)_beginthreadex(NULL, 0, EventRevThread, this, 0, NULL);
  143. if (hEvtThread == NULL || hEvtThread == INVALID_HANDLE_VALUE) {
  144. Dbg("Create EventRevThread failed");
  145. } else {
  146. Sleep(100);
  147. LOG_ASSERT(gEventRevWnd != NULL);
  148. }
  149. }
  150. #endif //RVC_OS_WIN
  151. if(m_bJBMachine) {
  152. InitializeMehodQueue();
  153. }
  154. return erroCode;
  155. }
  156. ErrorCodeEnum CScannerFSM::OnExit()
  157. {
  158. return Error_Succeed;
  159. }
  160. void CScannerFSM::s0_on_entry()
  161. {
  162. LOG_FUNCTION();
  163. m_nFatalTimes = 0;
  164. if(m_bStand2SMachine) //Stand2S
  165. {
  166. ErrorCodeEnum erroCode = CheckHSPSConnectStatus();
  167. if(FAILED(erroCode)) {
  168. PostEventFIFO(new FSMEvent(USER_EVT_DEV_INVALID));
  169. }
  170. }
  171. else if(m_bUsePortableScanner)
  172. {
  173. ErrorCodeEnum erroCode = CheckPortableConnectStatus();
  174. if(FAILED(erroCode)) {
  175. PostEventFIFO(new FSMEvent(USER_EVT_DEV_INVALID));
  176. }
  177. }
  178. else if(m_bJBMachine) {
  179. ErrorCodeEnum errorCode = CheckHeartbeatConnectStatus();
  180. }
  181. else {
  182. PostEventFIFO(new FSMEvent(USER_EVT_DEV_INVALID));
  183. }
  184. m_ecSelfTest = Error_Succeed;
  185. }
  186. void CScannerFSM::s0_on_exit()
  187. {
  188. }
  189. unsigned int CScannerFSM::s0_on_event(FSMEvent* e)
  190. {
  191. Dbg("%s: %s(%d), %d.", __FUNCTION__, EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  192. unsigned int uRet = 0;
  193. switch(e->iEvt)
  194. {
  195. case USER_EVT_OPERATING:
  196. {
  197. OperatingEvent* pEvt = dynamic_cast<OperatingEvent*>(e);
  198. m_iEvt = pEvt->m_bindEvt;
  199. pEvt->SetHandled();
  200. }
  201. break;
  202. case USER_EVT_DEV_INVALID:
  203. {
  204. }
  205. e->SetHandled();
  206. break;
  207. case USER_EVT_STARTPREVIEW:
  208. {
  209. StartPreviewTask* pTask = new StartPreviewTask(this);
  210. StartPreviewEvent* pEvt = dynamic_cast<StartPreviewEvent*>(e);
  211. pTask->SetContext(pEvt->m_ctx);
  212. PostEventFIFO(new OperatingEvent(e->iEvt)); //operating event.
  213. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  214. e->SetHandled();
  215. }
  216. break;
  217. case USER_EVT_STOPPREVIEW:
  218. {
  219. StopPreviewTask* pTask = new StopPreviewTask(this);
  220. StopPreviewEvent* pEvt = dynamic_cast<StopPreviewEvent*>(e);
  221. pTask->SetContext(pEvt->m_ctx);
  222. PostEventFIFO(new OperatingEvent(e->iEvt)); //operating event.
  223. GetEntityBase()->GetFunction()->PostEntityTaskFIFO(pTask);
  224. }
  225. e->SetHandled();
  226. break;
  227. case USER_EVT_SCANIMAGE:
  228. {
  229. ScanImageTask* pTask = new ScanImageTask(this);
  230. ScanImageEvent* pEvt = dynamic_cast<ScanImageEvent*>(e);
  231. pTask->SetContext(pEvt->m_ctx);
  232. PostEventFIFO(new OperatingEvent(e->iEvt)); //operating event.
  233. GetEntityBase()->GetFunction()->PostEntityTaskFIFO(pTask);
  234. }
  235. e->SetHandled();
  236. break;
  237. case USER_EVT_SETPROPERTY:
  238. {
  239. SetPropertyEvent* pEvt = dynamic_cast<SetPropertyEvent*>(e);
  240. SetPropertyTask* pTask = new SetPropertyTask(this);
  241. pTask->SetContext(pEvt->m_ctx);
  242. PostEventFIFO(new OperatingEvent(e->iEvt)); //operating event.
  243. GetEntityBase()->GetFunction()->PostEntityTaskFIFO(pTask);
  244. }
  245. e->SetHandled();
  246. break;
  247. case USER_EVT_SHOWPROPERTY:
  248. {
  249. ShowPropertyEvent* pEvt = dynamic_cast<ShowPropertyEvent*>(e);
  250. ShowPropertyTask* pTask = new ShowPropertyTask(this);
  251. pTask->SetContext(pEvt->m_ctx);
  252. PostEventFIFO(new OperatingEvent(e->iEvt)); //operating event.
  253. GetEntityBase()->GetFunction()->PostEntityTaskFIFO(pTask);
  254. }
  255. e->SetHandled();
  256. break;
  257. case USER_EVT_SETWINPOS:
  258. {
  259. SetWinPosEvent* pEvt = dynamic_cast<SetWinPosEvent*>(e);
  260. SetWinPosTask* pTask = new SetWinPosTask(this);
  261. pTask->SetContext(pEvt->m_ctx);
  262. PostEventFIFO(new OperatingEvent(e->iEvt)); //operating event.
  263. GetEntityBase()->GetFunction()->PostEntityTaskFIFO(pTask);
  264. }
  265. e->SetHandled();
  266. break;
  267. case USER_EVT_GETSTATUS:
  268. {
  269. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  270. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  271. pTask->SetContext(pEvt->m_ctx);
  272. PostEventFIFO(new OperatingEvent(e->iEvt)); //operating event.
  273. GetEntityBase()->GetFunction()->PostEntityTaskFIFO(pTask);
  274. }
  275. e->SetHandled();
  276. break;
  277. case USER_EVT_GETINFO:
  278. {
  279. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  280. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  281. pTask->SetContext(pEvt->m_ctx);
  282. PostEventFIFO(new OperatingEvent(e->iEvt)); //operating event.
  283. GetEntityBase()->GetFunction()->PostEntityTaskFIFO(pTask);
  284. }
  285. e->SetHandled();
  286. break;
  287. case USER_EVT_CROSS_CALL:
  288. {
  289. CrossTermCallTask* pTask = new CrossTermCallTask(this);
  290. CrossTermCallEvent* pEvt = dynamic_cast<CrossTermCallEvent*>(e);
  291. pTask->SetContext(pEvt->m_ctx);
  292. PostEventFIFO(new OperatingEvent(e->iEvt)); //operating event.
  293. GetEntityBase()->GetFunction()->PostEntityTaskFIFO(pTask);
  294. }
  295. e->SetHandled();
  296. break;
  297. case USER_EVT_CROSS_CALL_ONEWAY:
  298. {
  299. CrossTermInvokeTask* pTask = new CrossTermInvokeTask(this);
  300. CrossTermInvokeEvent* pEvt = dynamic_cast<CrossTermInvokeEvent*>(e);
  301. pTask->SetContext(pEvt->m_ctx);
  302. PostEventFIFO(new OperatingEvent(e->iEvt)); //operating event.
  303. GetEntityBase()->GetFunction()->PostEntityTaskFIFO(pTask);
  304. }
  305. e->SetHandled();
  306. break;
  307. }
  308. return uRet;
  309. }
  310. void CScannerFSM::s1_on_entry()
  311. {
  312. LOG_FUNCTION();
  313. FSMEvent* evt = new FSMEvent(USER_EVT_ESTIMATE_FINISHED);
  314. evt->param1 = evt->param2 = 0;
  315. int flag = 0;
  316. #if defined(RVC_OS_WIN)
  317. CAutoArray<ScannerDeviceInfo> cameralist;
  318. bool bInnerUpdated = true;
  319. int devCount = GetCurrentCameraList(cameralist, bInnerUpdated);
  320. LOG_ASSERT(!bInnerUpdated || devCount == m_cameralist.size());
  321. if(devCount > 0) {
  322. for(int i=0; i<devCount; ++i) {
  323. //识别到高拍仪摄像头
  324. if(cameralist[i].devType == CAMTYPE_HSPS) {
  325. evt->param1 = CAMTYPE_HSPS;
  326. if(cameralist[i].bIdle) {
  327. //没有被占用呢,赶紧通知外接高拍仪实体将其占用了。
  328. }else {
  329. //确认是否被外接高拍仪实体占用,不是的话得告警查出是谁占用了。
  330. evt->param2 = 1;
  331. bool bHode = false;
  332. int devID = -1;
  333. bool bBusy = false;
  334. CSimpleStringA devName(true);
  335. if(ISSUCCEEDED(IsPortScanHoldDevice(bHode, devID, devName, bBusy))) {
  336. }
  337. }
  338. }
  339. }
  340. }
  341. #endif //RVC_OS_WIN
  342. evt->param1 = flag;
  343. PostEventFIFO(evt);
  344. m_nFatalTimes = 0;
  345. }
  346. void CScannerFSM::s1_on_exit()
  347. {
  348. }
  349. unsigned int CScannerFSM::s1_on_event(FSMEvent* e)
  350. {
  351. unsigned int uRet = 0;
  352. if(e->iEvt == USER_EVT_ESTIMATE_FINISHED) {
  353. e->SetHandled();
  354. if(e->param1 == CAMTYPE_HSPS) {
  355. if(e->param2 == 0) {
  356. //TODO:
  357. }
  358. }
  359. }
  360. return uRet;
  361. }
  362. void CScannerFSM::s2_on_entry()
  363. {
  364. LOG_FUNCTION();
  365. }
  366. void CScannerFSM::s2_on_exit()
  367. {
  368. m_iEvt = -1;
  369. }
  370. unsigned int CScannerFSM::s2_on_event(FSMEvent* e)
  371. {
  372. Dbg("%s: %s(%d), %s(%d), %d.", __FUNCTION__,
  373. EvtTypeToString(m_iEvt), m_iEvt, EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  374. unsigned int uRet = 0;
  375. switch(e->iEvt)
  376. {
  377. case USER_EVT_STARTPREVIEW_FINISHED:
  378. {
  379. if(m_iEvt == USER_EVT_STARTPREVIEW)
  380. {
  381. uRet = 1;
  382. e->SetHandled();
  383. }
  384. }
  385. break;
  386. case USER_EVT_STOPPREVIEW_FINISHED:
  387. {
  388. if(m_iEvt == USER_EVT_STOPPREVIEW)
  389. {
  390. uRet = 1;
  391. e->SetHandled();
  392. }
  393. }
  394. break;
  395. case USER_EVT_SCANIMAGEFINISHED:
  396. {
  397. if(m_iEvt == USER_EVT_SCANIMAGE)
  398. {
  399. uRet = 1;
  400. e->SetHandled();
  401. }
  402. }
  403. break;
  404. case USER_EVT_SETPROPERTY_FINISHED:
  405. {
  406. if(m_iEvt == USER_EVT_SETPROPERTY)
  407. {
  408. uRet = 1;
  409. e->SetHandled();
  410. }
  411. }
  412. break;
  413. case USER_EVT_SHOWPROPERTY_FINISHED:
  414. {
  415. if(m_iEvt == USER_EVT_SHOWPROPERTY)
  416. {
  417. uRet = 1;
  418. e->SetHandled();
  419. }
  420. }
  421. break;
  422. case USER_EVT_SETWINPOS_FINISHED:
  423. {
  424. if(m_iEvt == USER_EVT_SETWINPOS)
  425. {
  426. uRet = 1;
  427. e->SetHandled();
  428. }
  429. }
  430. break;
  431. case USER_EVT_GETSTATUS_FINISHED:
  432. {
  433. if(m_iEvt == USER_EVT_GETSTATUS)
  434. {
  435. uRet = 1;
  436. e->SetHandled();
  437. }
  438. }
  439. break;
  440. case USER_EVT_GETINFO_FINISHED:
  441. {
  442. if(m_iEvt == USER_EVT_GETINFO)
  443. {
  444. uRet = 1;
  445. e->SetHandled();
  446. }
  447. }
  448. break;
  449. }
  450. return uRet;
  451. }
  452. #pragma region Useless for current
  453. //2016-11-18
  454. void CScannerFSM::s3_on_entry()
  455. {
  456. LOG_FUNCTION();
  457. m_ecSelfTest = Error_Hardware;
  458. }
  459. void CScannerFSM::s3_on_exit()
  460. {
  461. m_ecSelfTest = Error_Succeed;
  462. m_nFatalTimes = 0;
  463. }
  464. unsigned int CScannerFSM::s3_on_event(FSMEvent* e)
  465. {
  466. Dbg("s3_on_event: %s(%d), %d.", EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  467. unsigned int uRet = 0;
  468. switch(e->iEvt)
  469. {
  470. //case USER_EVT_STARTPREVIEW:
  471. // {
  472. // StartPreviewTask* pTask = new StartPreviewTask(this);
  473. // StartPreviewEvent* pEvt = dynamic_cast<StartPreviewEvent*>(e);
  474. // pTask->SetContext(pEvt->m_ctx);
  475. // GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  476. // e->SetHandled();
  477. // }
  478. // break;
  479. //case USER_EVT_STARTPREVIEW_FINISHED:
  480. // {
  481. // uRet = e->param1;
  482. // e->SetHandled();
  483. // }
  484. // break;
  485. //case USER_EVT_RESET:
  486. // {
  487. // //TODO:......
  488. // }
  489. // e->SetHandled();
  490. // break;
  491. case USER_EVT_GETSTATUS:
  492. {
  493. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  494. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  495. pTask->SetContext(pEvt->m_ctx);
  496. GetEntityBase()->GetFunction()->PostEntityTaskFIFO(pTask);
  497. }
  498. e->SetHandled();
  499. break;
  500. case USER_EVT_GETINFO:
  501. {
  502. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  503. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  504. pTask->SetContext(pEvt->m_ctx);
  505. GetEntityBase()->GetFunction()->PostEntityTaskFIFO(pTask);
  506. }
  507. e->SetHandled();
  508. break;
  509. }
  510. return uRet;
  511. }
  512. #pragma endregion Useless for current
  513. void CScannerFSM::s4_on_entry()
  514. {
  515. LOG_FUNCTION();
  516. if(m_bStand2SMachine || m_bUsePortableScanner)
  517. {
  518. ScheduleTimer(CHECKDEV_TIMER_ID, MILLISECOND_TO_CHECKDEV);
  519. }
  520. else
  521. {
  522. Dbg("MachineType: %s, do nothing in this entity.", (LPCTSTR)m_csMachineType);
  523. }
  524. }
  525. void CScannerFSM::s4_on_exit()
  526. {
  527. if(m_bStand2SMachine || m_bUsePortableScanner)
  528. {
  529. CancelTimer(CHECKDEV_TIMER_ID);
  530. }
  531. }
  532. unsigned int CScannerFSM::s4_on_event(FSMEvent* e)
  533. {
  534. Dbg("%s: %s(%d), %d.", __FUNCTION__, EvtTypeToString(e->iEvt), e->iEvt, e->param1);
  535. unsigned int uRet = 0;
  536. switch(e->iEvt)
  537. {
  538. case USER_EVT_DEV_RECOVER:
  539. {
  540. }
  541. e->SetHandled();
  542. break;
  543. case EVT_TIMER:
  544. {
  545. if(e->param1 == CHECKDEV_TIMER_ID)
  546. {
  547. e->SetHandled();
  548. if(!m_bUsePortableScanner) {
  549. if(ISSUCCEEDED(CheckHSPSConnectStatus()))
  550. {
  551. PostEventFIFO(new FSMEvent(USER_EVT_DEV_RECOVER));
  552. break;
  553. }
  554. } else {
  555. if(ISSUCCEEDED(CheckPortableConnectStatus()))
  556. {
  557. PostEventFIFO(new FSMEvent(USER_EVT_DEV_RECOVER));
  558. break;
  559. }
  560. }
  561. ScheduleTimer(CHECKDEV_TIMER_ID, MILLISECOND_TO_CHECKDEV);
  562. }
  563. }
  564. break;
  565. case USER_EVT_GETSTATUS:
  566. {
  567. GetDevStatusTask* pTask = new GetDevStatusTask(this);
  568. GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
  569. pTask->SetContext(pEvt->m_ctx);
  570. GetEntityBase()->GetFunction()->PostEntityTaskFIFO(pTask);
  571. }
  572. e->SetHandled();
  573. break;
  574. case USER_EVT_GETINFO:
  575. {
  576. GetDevInfoTask* pTask = new GetDevInfoTask(this);
  577. GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
  578. pTask->SetContext(pEvt->m_ctx);
  579. GetEntityBase()->GetFunction()->PostEntityTaskFIFO(pTask);
  580. }
  581. e->SetHandled();
  582. break;
  583. }
  584. return uRet;
  585. }
  586. int CScannerFSM::StartPreview(SpReqAnsContext<ScannerService_StartPreview_Req,
  587. ScannerService_StartPreview_Ans>::Pointer ctx)
  588. {
  589. int nRes = 0;
  590. ErrorCodeEnum erroCode = Error_Unexpect;
  591. if(!IsSuitableEntityAvailable())
  592. {
  593. ctx->Answer(Error_Break);
  594. return 1;
  595. }
  596. if(m_bJBMachine) {
  597. LPVOID ptCtx = NULL;
  598. CBlob retBuf;
  599. CBlob sndBuf;
  600. SpObject2Blob(ctx->Req, sndBuf);
  601. SpObject2Blob(ctx->Ans, retBuf);
  602. ptCtx = TransferCtx(ctx);
  603. ctx.AddRef();
  604. Dbg("tmp Ctx: %p", ptCtx);
  605. auto ret = SendRequest2Heatbeat(ScannerService_Method_StartPreview,
  606. sndBuf, retBuf, &ptCtx);
  607. Dbg("SendRequest to Heatbeat return %d immediately", ret);
  608. ReleaseSuitableEntity();
  609. return ret == Error_Succeed ? 0 : 1;
  610. }
  611. if(m_bStand2SMachine) {
  612. HSPScannerService_StartPreview_Req req = {};
  613. HSPScannerService_StartPreview_Ans ans = {};
  614. req.rotateType = ctx->Req.rotateType;
  615. req.scanType = ctx->Req.scanType;
  616. req.colorType = ctx->Req.colorType;
  617. erroCode = m_pHSPSClient->StartPreview(req, ans, MILLISECOND_WAIT_TIMEOUT_STARTPREVIEW);
  618. if(FAILURED(erroCode)) {
  619. Dbg("StartPreview context failed 0x%x(%d).", erroCode, erroCode);
  620. nRes = 1;
  621. }
  622. else {
  623. ctx->Ans.retCode = ans.retCode;
  624. Dbg("StartPreview context suc, retCode: ans(%d), ctx(%d).", ans.retCode, ctx->Ans.retCode);
  625. }
  626. }
  627. else if(m_bUsePortableScanner) {
  628. PortableScannerService_StartPreview_Req req = {};
  629. PortableScannerService_StartPreview_Ans ans = {};
  630. req.rotateType = ctx->Req.rotateType;
  631. req.scanType = ctx->Req.scanType;
  632. req.colorType = ctx->Req.colorType;
  633. erroCode = m_pPortableClient->StartPreview(req, ans, MILLISECOND_WAIT_TIMEOUT_STARTPREVIEW);
  634. if(FAILURED(erroCode)) {
  635. Dbg("StartPreview context failed 0x%x(%d).", erroCode, erroCode); nRes = 1;
  636. }
  637. else {
  638. ctx->Ans.retCode = ans.retCode;
  639. Dbg("StartPreview context suc, retCode: ans(%d), ctx(%d).", ans.retCode, ctx->Ans.retCode);
  640. }
  641. }
  642. ctx->Answer(erroCode);
  643. ReleaseSuitableEntity();
  644. return nRes;
  645. }
  646. int CScannerFSM::StopPreview(SpReqAnsContext<ScannerService_CancelPreview_Req,
  647. ScannerService_CancelPreview_Ans>::Pointer ctx)
  648. {
  649. ErrorCodeEnum erroCode = Error_Unexpect;
  650. int nRes = 0;
  651. if(!IsSuitableEntityAvailable())
  652. {
  653. ctx->Answer(Error_Break);
  654. return 1;
  655. }
  656. if(m_bJBMachine) {
  657. LPVOID ptCtx = NULL;
  658. CBlob retBuf;
  659. CBlob sndBuf;
  660. SpObject2Blob(ctx->Req, sndBuf);
  661. SpObject2Blob(ctx->Ans, retBuf);
  662. ptCtx = TransferCtx(ctx);
  663. ctx.AddRef();
  664. Dbg("tmp Ctx: %p", ptCtx);
  665. auto ret = SendRequest2Heatbeat(ScannerService_Method_CancelPreview,
  666. sndBuf, retBuf, &ptCtx);
  667. Dbg("SendRequest to Heatbeat return %d immediately", ret);
  668. ReleaseSuitableEntity();
  669. return ret == Error_Succeed ? 0 : 1;
  670. }
  671. if(m_bStand2SMachine) {
  672. HSPScannerService_CancelPreview_Req req = {};
  673. HSPScannerService_CancelPreview_Ans ans = {};
  674. req.bOnlyHide = ctx->Req.reserved1 == 0 ? false : true;
  675. erroCode = m_pHSPSClient->CancelPreview(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT);
  676. ctx->Answer(erroCode);
  677. if(FAILURED(erroCode)) {
  678. Dbg("CancelPreview context failed 0x%x(%d).", erroCode, erroCode);
  679. nRes = 1;
  680. }else {
  681. Dbg("CancelPreview context suc.");
  682. }
  683. }else if(m_bUsePortableScanner) {
  684. PortableScannerService_CancelPreview_Req req = {};
  685. PortableScannerService_CancelPreview_Ans ans = {};
  686. req.bOnlyHide = ctx->Req.reserved1 == 0 ? false : true;
  687. erroCode = m_pPortableClient->CancelPreview(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT);
  688. ctx->Answer(erroCode);
  689. if(FAILURED(erroCode)) {
  690. Dbg("CancelPreview context failed 0x%x(%d).", erroCode, erroCode);
  691. nRes = 1;
  692. }else {
  693. Dbg("CancelPreview context suc.");
  694. }
  695. }
  696. ReleaseSuitableEntity();
  697. return nRes;
  698. }
  699. int CScannerFSM::ScanImage(SpReqAnsContext<ScannerService_ScanImage_Req,
  700. ScannerService_ScanImage_Ans>::Pointer ctx)
  701. {
  702. int nRes = 0;
  703. ErrorCodeEnum erroCode = Error_Unexpect;
  704. if(!IsSuitableEntityAvailable())
  705. {
  706. ctx->Answer(Error_Break);
  707. return 1;
  708. }
  709. if(m_bJBMachine) {
  710. LPVOID ptCtx = NULL;
  711. CBlob retBuf;
  712. CBlob sndBuf;
  713. SpObject2Blob(ctx->Req, sndBuf);
  714. SpObject2Blob(ctx->Ans, retBuf);
  715. ptCtx = TransferCtx(ctx);
  716. ctx.AddRef();
  717. Dbg("tmp Ctx: %p", ptCtx);
  718. auto ret = SendRequest2Heatbeat(ScannerService_Method_ScanImage,
  719. sndBuf, retBuf, &ptCtx);
  720. Dbg("SendRequest to Heatbeat return %d immediately", ret);
  721. ReleaseSuitableEntity();
  722. return ret == Error_Succeed ? 0 : 1;
  723. }
  724. if(ctx->Req.nWay == 0)
  725. {
  726. if(m_bStand2SMachine) {
  727. HSPScannerService_ScanImage_Req req = {};
  728. HSPScannerService_ScanImage_Ans ans = {};
  729. erroCode = m_pHSPSClient->ScanImage(req, ans, MILLISECOND_WAIT_TIMEOUT_SCANIMAGE);
  730. if(FAILURED(erroCode)) {
  731. Dbg("ScanImage context failed 0x%x(%d).", erroCode, erroCode);
  732. nRes = 1;
  733. } else {
  734. Dbg("ScanImage context suc.");
  735. ctx->Ans.filePath = ans.filePath;
  736. ctx->Ans.imageData = ans.imageData;
  737. }
  738. }else if(m_bUsePortableScanner) {
  739. PortableScannerService_ScanImage_Req req = {};
  740. PortableScannerService_ScanImage_Ans ans = {};
  741. erroCode = m_pPortableClient->ScanImage(req, ans, MILLISECOND_WAIT_TIMEOUT_SCANIMAGE);
  742. if(FAILURED(erroCode)) {
  743. Dbg("ScanImage context failed %s.", SpStrError(erroCode));
  744. nRes = 1;
  745. } else {
  746. Dbg("ScanImage context suc.");
  747. ctx->Ans.filePath = ans.filePath;
  748. ctx->Ans.imageData = ans.imageData;
  749. }
  750. }
  751. }
  752. else if(ctx->Req.nWay == 1)
  753. {
  754. if(m_bStand2SMachine) {
  755. HSPScannerService_ScanImageEx_Req req = {};
  756. HSPScannerService_ScanImageEx_Ans ans = {};
  757. erroCode = m_pHSPSClient->ScanImageEx(req, ans, MILLISECOND_WAIT_TIMEOUT_SCANIMAGE);
  758. if(FAILURED(erroCode)) {
  759. Dbg("ScanImageEx context failed %s.", SpStrError(erroCode));
  760. nRes = 1;
  761. } else {
  762. Dbg("ScanImageEx context suc.");
  763. ctx->Ans.filePath = ans.filePath;
  764. ctx->Ans.imageData = ans.imageData;
  765. }
  766. }
  767. else if(m_bUsePortableScanner) {
  768. PortableScannerService_ScanImageEx_Req req = {};
  769. PortableScannerService_ScanImageEx_Ans ans = {};
  770. erroCode = m_pPortableClient->ScanImageEx(req, ans, MILLISECOND_WAIT_TIMEOUT_SCANIMAGE);
  771. if(FAILURED(erroCode)) {
  772. Dbg("ScanImageEx context failed %s.", SpStrError(erroCode));
  773. nRes = 1;
  774. } else {
  775. Dbg("ScanImageEx context suc.");
  776. ctx->Ans.filePath = ans.filePath;
  777. ctx->Ans.imageData = ans.imageData;
  778. }
  779. }
  780. }
  781. ctx->Answer(erroCode);
  782. ReleaseSuitableEntity();
  783. return nRes;
  784. }
  785. int CScannerFSM::SetProperty(SpReqAnsContext<ScannerService_SetProperty_Req,
  786. ScannerService_SetProperty_Ans>::Pointer ctx)
  787. {
  788. ErrorCodeEnum erroCode = Error_Unexpect;
  789. int nRes = 0;
  790. if(!IsSuitableEntityAvailable())
  791. {
  792. ctx->Answer(Error_Break);
  793. return 1;
  794. }
  795. if(m_bJBMachine) {
  796. LPVOID ptCtx = NULL;
  797. CBlob retBuf;
  798. CBlob sndBuf;
  799. SpObject2Blob(ctx->Req, sndBuf);
  800. SpObject2Blob(ctx->Ans, retBuf);
  801. ptCtx = TransferCtx(ctx);
  802. ctx.AddRef();
  803. Dbg("tmp Ctx: %p", ptCtx);
  804. auto ret = SendRequest2Heatbeat(ScannerService_Method_SetProperty,
  805. sndBuf, retBuf, &ptCtx);
  806. Dbg("SendRequest to Heatbeat return %d immediately", ret);
  807. ReleaseSuitableEntity();
  808. return ret == Error_Succeed ? 0 : 1;
  809. }
  810. if(m_bStand2SMachine) {
  811. HSPScannerService_SetProperty_Req req = {};
  812. HSPScannerService_SetProperty_Ans ans = {};
  813. req.rotateType = ctx->Req.rotateType;
  814. req.scanType = ctx->Req.scanType;
  815. req.colorType = ctx->Req.colorType;
  816. erroCode = m_pHSPSClient->SetProperty(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT);
  817. if(FAILURED(erroCode)) {
  818. Dbg("SetProperty context failed %s.", SpStrError(erroCode));
  819. nRes = 1;
  820. } else {
  821. ctx->Ans.retCode = ans.retCode;
  822. Dbg("SetProperty context suc, retCode: ans(%d), ctx(%d).", ans.retCode, ctx->Ans.retCode);
  823. }
  824. }else if(m_bUsePortableScanner) {
  825. PortableScannerService_SetProperty_Req req = {};
  826. PortableScannerService_SetProperty_Ans ans = {};
  827. req.rotateType = ctx->Req.rotateType;
  828. req.scanType = ctx->Req.scanType;
  829. req.colorType = ctx->Req.colorType;
  830. erroCode = m_pPortableClient->SetProperty(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT);
  831. if(FAILURED(erroCode)) {
  832. Dbg("SetProperty context failed %s.", SpStrError(erroCode));
  833. nRes = 1;
  834. } else {
  835. ctx->Ans.retCode = ans.retCode;
  836. Dbg("SetProperty context suc, retCode: ans(%d), ctx(%d).", ans.retCode, ctx->Ans.retCode);
  837. }
  838. }
  839. ctx->Answer(erroCode);
  840. ReleaseSuitableEntity();
  841. return nRes;
  842. }
  843. int CScannerFSM::ShowLTProperty(SpReqAnsContext<ScannerService_ShowProperty_Req,
  844. ScannerService_ShowProperty_Ans>::Pointer ctx)
  845. {
  846. int nRes = 0;
  847. ErrorCodeEnum erroCode = Error_Succeed;
  848. int retCode = 0;
  849. if(!IsSuitableEntityAvailable())
  850. {
  851. ctx->Answer(Error_Break);
  852. return 1;
  853. }
  854. if(m_bJBMachine) {
  855. LPVOID ptCtx = NULL;
  856. CBlob retBuf;
  857. CBlob sndBuf;
  858. SpObject2Blob(ctx->Req, sndBuf);
  859. SpObject2Blob(ctx->Ans, retBuf);
  860. ptCtx = TransferCtx(ctx);
  861. ctx.AddRef();
  862. Dbg("tmp Ctx: %p", ptCtx);
  863. auto ret = SendRequest2Heatbeat(ScannerService_Method_ShowProperty,
  864. sndBuf, retBuf, &ptCtx);
  865. Dbg("SendRequest to Heatbeat return %d immediately", ret);
  866. ReleaseSuitableEntity();
  867. return ret == Error_Succeed ? 0 : 1;
  868. }
  869. if(m_bStand2SMachine) {
  870. HSPScannerService_ShowProperty_Req req = {};
  871. HSPScannerService_ShowProperty_Ans ans = {};
  872. erroCode = m_pHSPSClient->ShowProperty(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT);
  873. } else if(m_bUsePortableScanner) {
  874. PortableScannerService_ShowProperty_Req req = {};
  875. PortableScannerService_ShowProperty_Ans ans = {};
  876. erroCode = m_pPortableClient->ShowProperty(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT);
  877. }
  878. if(FAILURED(erroCode))
  879. {
  880. Dbg("ShowLTProperty context failed %s.", SpStrError(erroCode));
  881. nRes = 1;
  882. if(erroCode == Error_TimeOut)
  883. {
  884. Dbg("Error_Timeout ?? ignore and return Error_Succeed.");
  885. erroCode = Error_Succeed;
  886. nRes = 0;
  887. }
  888. }
  889. else {
  890. Dbg("ShowLTProperty context suc.");
  891. }
  892. ctx->Answer(erroCode);
  893. ReleaseSuitableEntity();
  894. return nRes;
  895. }
  896. int CScannerFSM::SetWinPos(SpReqAnsContext<ScannerService_SetWindowPos_Req,
  897. ScannerService_SetWindowPos_Ans>::Pointer ctx)
  898. {
  899. int nRes = 0;
  900. ErrorCodeEnum erroCode = Error_Unexpect;
  901. if(!IsSuitableEntityAvailable())
  902. {
  903. ctx->Answer(Error_Break);
  904. return 1;
  905. }
  906. if(m_bJBMachine) {
  907. LPVOID ptCtx = NULL;
  908. CBlob retBuf;
  909. CBlob sndBuf;
  910. SpObject2Blob(ctx->Req, sndBuf);
  911. SpObject2Blob(ctx->Ans, retBuf);
  912. ptCtx = TransferCtx(ctx);
  913. ctx.AddRef();
  914. Dbg("tmp Ctx: %p", ptCtx);
  915. auto ret = SendRequest2Heatbeat(ScannerService_Method_SetWindowPos,
  916. sndBuf, retBuf, &ptCtx);
  917. Dbg("SendRequest to Heatbeat return %d immediately", ret);
  918. ReleaseSuitableEntity();
  919. return ret == Error_Succeed ? 0 : 1;
  920. }
  921. if (m_bStand2SMachine) {
  922. HSPScannerService_SetWinPos_Req req = {};
  923. HSPScannerService_SetWinPos_Ans ans = {};
  924. req.type = ctx->Req.type;
  925. req.pointX = ctx->Req.pointX;
  926. req.pointY = ctx->Req.pointY;
  927. req.nWidth = ctx->Req.nWidth;
  928. erroCode = m_pHSPSClient->SetWinPos(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT);
  929. } else if(m_bUsePortableScanner) {
  930. PortableScannerService_SetWinPos_Req req = {};
  931. PortableScannerService_SetWinPos_Ans ans = {};
  932. req.type = ctx->Req.type;
  933. req.pointX = ctx->Req.pointX;
  934. req.pointY = ctx->Req.pointY;
  935. req.nWidth = ctx->Req.nWidth;
  936. erroCode = m_pPortableClient->SetWinPos(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT);
  937. }
  938. if(FAILURED(erroCode)) {
  939. Dbg("SetWinPos context failed %s.", SpStrError(erroCode));
  940. nRes = 1;
  941. } else {
  942. Dbg("SetWinPos context suc.");
  943. }
  944. ctx->Answer(erroCode);
  945. ReleaseSuitableEntity();
  946. return nRes;
  947. }
  948. int CScannerFSM::GetDevStatus(SpReqAnsContext<ScannerService_GetDevStatus_Req,
  949. ScannerService_GetDevStatus_Ans>::Pointer ctx)
  950. {
  951. int nRes = 0;
  952. ErrorCodeEnum erroCode = Error_Unexpect;
  953. if(!IsSuitableEntityAvailable())
  954. {
  955. ctx->Answer(Error_Break);
  956. return 1;
  957. }
  958. if(m_bJBMachine) {
  959. LPVOID ptCtx = NULL;
  960. CBlob retBuf;
  961. CBlob sndBuf;
  962. SpObject2Blob(ctx->Req, sndBuf);
  963. SpObject2Blob(ctx->Ans, retBuf);
  964. ptCtx = TransferCtx(ctx);
  965. ctx.AddRef();
  966. Dbg("tmp Ctx: %p", ptCtx);
  967. auto ret = SendRequest2Heatbeat(ScannerService_Method_GetDevStatus,
  968. sndBuf, retBuf, &ptCtx);
  969. Dbg("SendRequest to Heatbeat return %d immediately", ret);
  970. ReleaseSuitableEntity();
  971. return ret == Error_Succeed ? 0 : 1;
  972. }
  973. if(m_bStand2SMachine) {
  974. HSPScannerService_GetDevStatus_Req req = {};
  975. HSPScannerService_GetDevStatus_Ans ans = {};
  976. erroCode = m_pHSPSClient->GetDevStatus(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT);
  977. if(FAILURED(erroCode)) {Dbg("GetDevStatus context failed %s.", SpStrError(erroCode)); nRes = 1;}
  978. else
  979. {
  980. Dbg("GetDevStatus context suc.");
  981. Dbg("connected: %d\r\n\tshowing: %d\r\n\tpreview: %d.",
  982. ans.connected, ans.showing, ans.previewing);
  983. ctx->Ans.bInvalid = ans.connected == 0 ? false : true;
  984. ctx->Ans.bPreview = ans.previewing == 0 ? false : true;
  985. }
  986. } else if(m_bUsePortableScanner) {
  987. PortableScannerService_GetDevStatus_Req req = {};
  988. PortableScannerService_GetDevStatus_Ans ans = {};
  989. erroCode = m_pPortableClient->GetDevStatus(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT);
  990. if(FAILURED(erroCode)) {Dbg("GetDevStatus context failed %s.", SpStrError(erroCode)); nRes = 1;}
  991. else
  992. {
  993. Dbg("GetDevStatus context suc.");
  994. Dbg("connected: %d\r\n\tshowing: %d\r\n\tpreview: %d.",
  995. ans.connected, ans.showing, ans.previewing);
  996. ctx->Ans.bInvalid = ans.connected == 0 ? false : true;
  997. ctx->Ans.bPreview = ans.previewing == 0 ? false : true;
  998. }
  999. }
  1000. ctx->Answer(erroCode);
  1001. ReleaseSuitableEntity();
  1002. return nRes;
  1003. }
  1004. int CScannerFSM::GetDevInfo(SpReqAnsContext<ScannerService_GetDevInfo_Req,
  1005. ScannerService_GetDevInfo_Ans>::Pointer ctx)
  1006. {
  1007. int nRes = 0;
  1008. ErrorCodeEnum erroCode = Error_Unexpect;
  1009. if(!IsSuitableEntityAvailable())
  1010. {
  1011. ctx->Answer(Error_Break);
  1012. return 1;
  1013. }
  1014. if(m_bJBMachine) {
  1015. LPVOID ptCtx = NULL;
  1016. CBlob retBuf;
  1017. CBlob sndBuf;
  1018. SpObject2Blob(ctx->Req, sndBuf);
  1019. SpObject2Blob(ctx->Ans, retBuf);
  1020. ptCtx = TransferCtx(ctx);
  1021. ctx.AddRef();
  1022. Dbg("tmp Ctx: %p", ptCtx);
  1023. auto ret = SendRequest2Heatbeat(ScannerService_Method_GetDevInfo,
  1024. sndBuf, retBuf, &ptCtx);
  1025. Dbg("SendRequest to Heatbeat return %d immediately", ret);
  1026. ReleaseSuitableEntity();
  1027. return ret == Error_Succeed ? 0 : 1;
  1028. }
  1029. if(m_bStand2SMachine) {
  1030. HSPScannerService_GetDevInfo_Req req = {};
  1031. HSPScannerService_GetDevInfo_Ans ans = {};
  1032. erroCode = m_pHSPSClient->GetDevInfo(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT);
  1033. if(FAILURED(erroCode)) {Dbg("GetDevInfo context failed %s.", SpStrError(erroCode)); nRes = 1;}
  1034. else
  1035. {
  1036. Dbg("GetDevInfo context suc.");
  1037. Dbg("type: %s\r\n\tmodel: %s\r\n\tversion: %s\r\n\tstate:%d.",
  1038. (LPCTSTR)ans.type, (LPCTSTR)ans.model, (LPCTSTR)ans.version, ans.state);
  1039. ctx->Ans.type = ans.type;
  1040. ctx->Ans.model = ans.model;
  1041. ctx->Ans.version = ans.version;
  1042. ctx->Ans.state = ans.state;
  1043. }
  1044. }else if(m_bUsePortableScanner) {
  1045. PortableScannerService_GetDevInfo_Req req = {};
  1046. PortableScannerService_GetDevInfo_Ans ans = {};
  1047. erroCode = m_pPortableClient->GetDevInfo(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT);
  1048. if(FAILURED(erroCode)) {
  1049. Dbg("GetDevInfo context failed %s.", SpStrError(erroCode));
  1050. nRes = 1;
  1051. }
  1052. else
  1053. {
  1054. Dbg("GetDevInfo context suc.");
  1055. Dbg("type: %s\r\n\tmodel: %s\r\n\tversion: %s\r\n\tstate:%d.",
  1056. (LPCTSTR)ans.type, (LPCTSTR)ans.model, (LPCTSTR)ans.version, ans.state);
  1057. ctx->Ans.type = ans.type;
  1058. ctx->Ans.model = ans.model;
  1059. ctx->Ans.version = ans.version;
  1060. ctx->Ans.state = ans.state;
  1061. }
  1062. }
  1063. ctx->Answer(erroCode);
  1064. ReleaseSuitableEntity();
  1065. return nRes;
  1066. }
  1067. int CScannerFSM::GetOnlineDevices(SpReqAnsContext<ScannerService_GetOnlineCameras_Req,
  1068. ScannerService_GetOnlineCameras_Ans>::Pointer ctx)
  1069. {
  1070. if(m_bJBMachine) {
  1071. LPVOID ptCtx = NULL;
  1072. CBlob retBuf;
  1073. CBlob sndBuf;
  1074. SpObject2Blob(ctx->Req, sndBuf);
  1075. SpObject2Blob(ctx->Ans, retBuf);
  1076. ptCtx = TransferCtx(ctx);
  1077. ctx.AddRef();
  1078. Dbg("tmp Ctx: %p", ptCtx);
  1079. auto ret = SendRequest2Heatbeat(ScannerService_Method_GetOnlineCameras,
  1080. sndBuf, retBuf, &ptCtx);
  1081. Dbg("SendRequest to Heatbeat return %d immediately", ret);
  1082. ReleaseSuitableEntity();
  1083. return ret == Error_Succeed ? 0 : 1;
  1084. }
  1085. #if defined(RVC_OS_WIN)
  1086. int nCount = m_cameralist.size();
  1087. Dbg("Path3: Current camera count: %d", nCount);
  1088. ctx->Ans.devCount = nCount;
  1089. if (nCount > 0) {
  1090. ctx->Ans.devFriendlyNames.Init(nCount);
  1091. ctx->Ans.devType.Init(nCount);
  1092. for (int i = 0; i < nCount; ++i) {
  1093. ctx->Ans.devFriendlyNames[i] = m_cameralist[i]->szDevName;
  1094. ctx->Ans.devType[i] = GetRVCCameraType(m_cameralist[i]->szDevName);
  1095. Dbg("[%d]%s(%d)", i, (LPCTSTR)ctx->Ans.devFriendlyNames[i], ctx->Ans.devType[i]);
  1096. }
  1097. }
  1098. ctx->Answer(Error_Succeed);
  1099. return nCount;
  1100. #else
  1101. ctx->Answer(Error_NotSupport);
  1102. return 0;
  1103. #endif //RVC_OS_WIN
  1104. }
  1105. ErrorCodeEnum CScannerFSM::OnDevExit()
  1106. {
  1107. ErrorCodeEnum erroCode = Error_Unexpect;
  1108. int nRes = 0;
  1109. if(!IsSuitableEntityAvailable()) {
  1110. return Error_Break;
  1111. }
  1112. if(m_bJBMachine) {
  1113. LPVOID ptCtx = NULL;
  1114. CBlob retBuf;
  1115. CBlob sndBuf;
  1116. Dbg("tmp Ctx: %p", ptCtx);
  1117. auto ret = SendRequest2Heatbeat(ScannerService_Method_Exit,
  1118. sndBuf, retBuf, &ptCtx, false);
  1119. Dbg("SendRequest to Heatbeat return %d immediately", ret);
  1120. ReleaseSuitableEntity();
  1121. return ret;
  1122. }
  1123. if(m_bStand2SMachine) {
  1124. HSPScannerService_Exit_Info info = {};
  1125. erroCode = m_pHSPSClient->Exit();
  1126. }else if(m_bUsePortableScanner) {
  1127. PortableScannerService_Exit_Info info = {};
  1128. erroCode = m_pPortableClient->Exit();
  1129. }
  1130. return erroCode;
  1131. }
  1132. void CScannerFSM::SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext)
  1133. {
  1134. pTransactionContext->SendAnswer(m_ecSelfTest);
  1135. //m_ecSelfTest = Error_Succeed;
  1136. }
  1137. void CScannerFSM::OnStateTrans(int iSrcState, int iDstState)
  1138. {
  1139. m_nSrcState = iSrcState;
  1140. }
  1141. ErrorCodeEnum CScannerFSM::ConnectToHSPScanner()
  1142. {
  1143. if(m_pHSPSClient)
  1144. {
  1145. m_pHSPSClient->GetFunction()->CloseSession();
  1146. //m_pHSPSClient->SafeDelete();
  1147. m_pHSPSClient = NULL;
  1148. }
  1149. m_pHSPSClient = new CHSPSInnerClient(GetEntityBase());
  1150. ErrorCodeEnum erroCode = m_pHSPSClient->Connect();
  1151. if(FAILURED(erroCode))
  1152. {
  1153. m_pHSPSClient->SafeDelete();
  1154. m_pHSPSClient = NULL;
  1155. LogWarn(Severity_Middle, Error_InvalidState, LOG_EVT_SCANNERSET_HSPSCNT_FAILED,
  1156. "Connect to HSPScanner entity failed.");
  1157. GetHSPSInfo();
  1158. return Error_InvalidState;
  1159. }
  1160. return Error_Succeed;
  1161. }
  1162. ErrorCodeEnum CScannerFSM::GetHSPSInfo()
  1163. {
  1164. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  1165. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1166. CEntityRunInfo info = {0};
  1167. ErrorCodeEnum ecInfo = pFunc->GetEntityRunInfo("HSPScanner", info);
  1168. if(ISSUCCEEDED(ecInfo))
  1169. {
  1170. Dbg("HSPScanner: eState: %d.", info.eState);
  1171. }
  1172. return ecInfo;
  1173. }
  1174. ErrorCodeEnum CScannerFSM::CheckHSPSConnectStatus()
  1175. {
  1176. CHSPSInnerClient* pCheckClient = new CHSPSInnerClient(GetEntityBase());
  1177. ErrorCodeEnum erroCode = pCheckClient->Connect();
  1178. if(FAILURED(erroCode))
  1179. {
  1180. pCheckClient->SafeDelete();
  1181. pCheckClient = NULL;
  1182. LogWarn(Severity_Middle, Error_InvalidState, LOG_EVT_SCANNERSET_HSPSCNT_FAILED,
  1183. "HSPScanner entity is disconnectable.");
  1184. GetHSPSInfo();
  1185. return Error_InvalidState;
  1186. }
  1187. Dbg("HSPScanner entity is Connectable.");
  1188. pCheckClient->GetFunction()->CloseSession();
  1189. pCheckClient = NULL;
  1190. return Error_Succeed;
  1191. }
  1192. ErrorCodeEnum CScannerFSM::CheckPortableConnectStatus()
  1193. {
  1194. AvailableEntityCheck<CPortableScannerClient> checker;
  1195. bool bConnectable = checker(this->GetEntityBase());
  1196. if(!bConnectable) {
  1197. GetPortableScannerInfo();
  1198. }
  1199. return (bConnectable ? Error_Succeed : Error_InvalidState);
  1200. }
  1201. ErrorCodeEnum CScannerFSM::ConnectToPortableScanner()
  1202. {
  1203. if(m_pPortableClient) {
  1204. m_pPortableClient->GetFunction()->CloseSession();
  1205. //m_pPortableClient->SafeDelete();
  1206. m_pPortableClient = NULL;
  1207. }
  1208. m_pPortableClient = new CPortableScannerClient(GetEntityBase());
  1209. ErrorCodeEnum erroCode = m_pPortableClient->Connect();
  1210. if(FAILURED(erroCode)) {
  1211. m_pPortableClient->SafeDelete();
  1212. m_pPortableClient = NULL;
  1213. LogWarn(Severity_Middle, Error_InvalidState, LOG_WARN_CONNECT_PORTABLESCANNER_FAILED,
  1214. "Connect to Portable Scanner entity failed.");
  1215. GetPortableScannerInfo();
  1216. return Error_InvalidState;
  1217. }
  1218. //Dbg("Connect to Portable Scanner entity suc.");
  1219. return Error_Succeed;
  1220. }
  1221. static CSimpleStringA GetPrefixCameraName(CSimpleStringA& cameraFullConfigName)
  1222. {
  1223. auto results = cameraFullConfigName.Split(';');
  1224. LOG_ASSERT(results.GetCount() > 0);
  1225. return results[0];
  1226. }
  1227. ErrorCodeEnum CScannerFSM::LoadConfigAboutCamera()
  1228. {
  1229. for(int i=0; i<FIX_CAMERA_COUNTS; ++i) {
  1230. m_fixedCamera[i].strDevName = "";
  1231. m_fixedCamera[i].devType = CAMTYPE_UNKNOWN;
  1232. m_fixedCamera[i].bIdle = FALSE;
  1233. }
  1234. m_bEwsNameRefreshed = false;
  1235. CSmartPointer<IEntityFunction> spFunction = GetEntityBase()->GetFunction();
  1236. CSmartPointer<IConfigInfo> spConfig;
  1237. SpIniMappingTable table;
  1238. ErrorCodeEnum ec = spFunction->OpenConfig(Config_Root, spConfig);
  1239. CSimpleStringA strEnvCamera;
  1240. CSimpleStringA strOptCamera;
  1241. CSimpleStringA strEwsCamera;
  1242. int nEnvID = -1, nOptID = -1, nEwsID = -1;
  1243. if(ISSUCCEEDED(ec)) {
  1244. table.AddEntryString("Video", "EnvCamera", strEnvCamera, "$");
  1245. table.AddEntryString("Video", "OptCamera", strOptCamera, "$");
  1246. table.AddEntryString("Video", "EwsCamera", strEwsCamera, "$");
  1247. ec = table.Load(spConfig);
  1248. if(ISSUCCEEDED(ec)) {
  1249. nEnvID = strEnvCamera.GetLength() > 1 ? /*GetVideoDeviceID(strEnvCamera)*/ 0 : -2;
  1250. nOptID = strOptCamera.GetLength() > 1 ? /*GetVideoDeviceID(strOptCamera)*/ 0 : -2;
  1251. nEwsID = strEwsCamera.GetLength() > 1 ? /*GetVideoDeviceID(strEwsCamera)*/ 0 : -2;
  1252. {
  1253. Dbg("EnvID: [%d](%s)", nEnvID, strEnvCamera.GetData());
  1254. Dbg("OptID: [%d](%s)", nOptID, strOptCamera.GetData());
  1255. Dbg("EwsID: [%d](%s)", nEwsID, strEwsCamera.GetData());
  1256. m_fixedCamera[CAMTYPE_ENV-1].strDevName = strEnvCamera;
  1257. m_fixedCamera[CAMTYPE_ENV-1].devType = CAMTYPE_ENV;
  1258. m_fixedCamera[CAMTYPE_OPT-1].strDevName = strOptCamera;
  1259. m_fixedCamera[CAMTYPE_OPT-1].devType = CAMTYPE_OPT;
  1260. m_fixedCamera[CAMTYPE_EWS-1].strDevName = strEwsCamera;
  1261. m_fixedCamera[CAMTYPE_EWS-1].devType = CAMTYPE_EWS;
  1262. CSimpleStringA strEwsRealName;
  1263. m_strEwsRecordName = strEwsCamera;
  1264. if(nEwsID == 0 && FindEwsCameraName(strEwsRealName, strEwsCamera)) {
  1265. m_fixedCamera[CAMTYPE_EWS-1].strDevName = strEwsRealName;
  1266. m_fixedCamera[CAMTYPE_EWS-1].devType = CAMTYPE_EWS;
  1267. m_bEwsNameRefreshed = true;
  1268. }
  1269. }
  1270. if(nEnvID == -2 || nOptID == -2) {
  1271. CSimpleStringA strPath;
  1272. char lpValue[MAX_PATH] = {0};
  1273. if(GetEntityBase()->GetFunction()->GetPath("HardwareCfg", strPath) == Error_Succeed) {
  1274. int index = strPath.IndexOf("hardwarecfg");
  1275. Dbg("%s(%d)", strPath.GetData(), index);
  1276. if(index != -1) {
  1277. strPath[index] = '\0';
  1278. } else {
  1279. strPath[index] += SPLIT_SLASH;
  1280. }
  1281. CSimpleStringA strMCRunCfg = strPath + "runinfo" SPLIT_SLASH_STR "runcfg" SPLIT_SLASH_STR "MediaController.ini";
  1282. Dbg("%s", (LPCTSTR)strMCRunCfg);
  1283. if(nEnvID == -2) {
  1284. DWORD dwSize = inifile_read_str_s("Video", "FrontCamera", "$", lpValue, MAX_PATH, strMCRunCfg);
  1285. Dbg("Retrive env(front) camera: %s", lpValue);
  1286. if(strlen(lpValue) > 1) {
  1287. CSimpleStringA strValue(lpValue);
  1288. m_fixedCamera[CAMTYPE_ENV-1].strDevName = GetPrefixCameraName(strValue);
  1289. m_fixedCamera[CAMTYPE_ENV-1].devType = CAMTYPE_ENV;
  1290. Dbg("Found front camera name: %s", strEnvCamera.GetData());
  1291. }
  1292. }
  1293. if(nOptID == -2) {
  1294. DWORD dwSize = inifile_read_str_s("Video", "RearCamera", "$", lpValue, MAX_PATH, strMCRunCfg);
  1295. Dbg("Retrive opt(rear) camera from runtime config: %s", lpValue);
  1296. if(strlen(lpValue) > 1) {
  1297. CSimpleStringA strValue(lpValue);
  1298. m_fixedCamera[CAMTYPE_OPT-1].strDevName = GetPrefixCameraName(strValue);
  1299. m_fixedCamera[CAMTYPE_OPT-1].devType = CAMTYPE_OPT;
  1300. Dbg("Found rear camera name: %s", strOptCamera.GetData());
  1301. }
  1302. }
  1303. }
  1304. }
  1305. }
  1306. }
  1307. //Debug
  1308. for(int i=0; i<FIX_CAMERA_COUNTS; ++i) {
  1309. Dbg("[%d]%s:%d", m_fixedCamera[i].devType,
  1310. m_fixedCamera[i].strDevName.GetData(),m_fixedCamera[i].bIdle);
  1311. }
  1312. return ec;
  1313. }
  1314. bool CScannerFSM::IsPortableScannerDetected(LPCTSTR strDeviceID, BOOL& bUpstairOne)
  1315. {
  1316. //TODO: 根据良田和南天提供的设备标识名,判断插入的是否为高拍仪所有的摄像头
  1317. CSimpleStringA strDevice(strDeviceID);
  1318. bUpstairOne = FALSE;
  1319. LPCTSTR split = strrchr(strDeviceID, '#');
  1320. if(split != NULL) {
  1321. if(!_strnicmp(split+1, "upcamera", strlen("upcamera"))) {
  1322. bUpstairOne = TRUE;
  1323. return true;
  1324. }
  1325. else if(!_strnicmp(split+1, "downcamera", strlen("downcamera"))) {
  1326. return true;
  1327. }
  1328. }
  1329. return false;
  1330. }
  1331. int CScannerFSM::GetCurrentCameraList(
  1332. CAutoArray<ScannerDeviceInfo>& devInforLists,
  1333. bool bUpdatedRecord)
  1334. {
  1335. int nCount = 0;
  1336. #if defined(RVC_OS_WIN)
  1337. devInforLists.Clear();
  1338. if (!bUpdatedRecord) {
  1339. CAMERA_BUCKET buckets;
  1340. nCount = GetCameraInfors(buckets);
  1341. Dbg("Path1: Current camera count: %d", nCount);
  1342. if (nCount > 0) {
  1343. RefreshCameraBusyState(devInforLists, buckets, nCount);
  1344. DestoryCamereBuckets(buckets);
  1345. }
  1346. } else {
  1347. UpdateCameraInfors(m_cameralist);
  1348. nCount = m_cameralist.size();
  1349. Dbg("Path2: Current camera count: %d", nCount);
  1350. if (nCount > 0) {
  1351. RefreshCameraBusyState(devInforLists, m_cameralist, nCount);
  1352. }
  1353. }
  1354. #endif //RVC_OS_WIN
  1355. return nCount;
  1356. }
  1357. #if defined(RVC_OS_WIN)
  1358. void CScannerFSM::RefreshCameraBusyState(
  1359. CAutoArray<ScannerDeviceInfo>& devInforLists, const CAMERA_BUCKET& buckets, int bucketSize)
  1360. {
  1361. devInforLists.Init(bucketSize);
  1362. for(int i=0; i<bucketSize; ++i)
  1363. {
  1364. devInforLists[i].strDevName = buckets[i]->szDevName;
  1365. Dbg("[%d]%s(%s)", i, (LPCTSTR)devInforLists[i].strDevName, buckets[i]->szDevPath);
  1366. devInforLists[i].devType = GetRVCCameraType(devInforLists[i].strDevName);
  1367. if(TRUE && devInforLists[i].devType == CAMTYPE_HSPS)
  1368. devInforLists[i].bIdle = TRUE;
  1369. else
  1370. devInforLists[i].bIdle = (IsDeviceBusy(devInforLists[i].strDevName) == 0);
  1371. if(devInforLists[i].devType == CAMTYPE_HSPS && !devInforLists[i].bIdle) {
  1372. devInforLists[i].bIdle = TRUE;
  1373. Dbg("Reset hsps to idle!!");
  1374. }
  1375. }
  1376. }
  1377. #endif //RVC_OS_WIN
  1378. static BOOL IsTheSameDevice(CSimpleStringA& szRunDev, CSimpleStringA& szConfigDev)
  1379. {
  1380. if(szRunDev.IsNullOrEmpty() || szConfigDev.IsNullOrEmpty()) {
  1381. return FALSE;
  1382. }
  1383. if(szConfigDev.IsStartWith(szRunDev)) {
  1384. return TRUE;
  1385. }
  1386. return FALSE;
  1387. }
  1388. /*判断摄像头的类型(使用途径)*/
  1389. CapTypeEnum CScannerFSM::GetRVCCameraType(LPCTSTR lpcszDevName)
  1390. {
  1391. CapTypeEnum type = CAMTYPE_UNKNOWN;
  1392. BOOL bUpstairs = FALSE;
  1393. if(lpcszDevName == NULL || strlen(lpcszDevName) == 0) {
  1394. LOG_TRACE("invalid dev name.");
  1395. return type;
  1396. }
  1397. if(IsPortableScannerDetected(lpcszDevName, bUpstairs)) {
  1398. Dbg("Detect royal scanner type, up one: %d", bUpstairs);
  1399. return bUpstairs ? CAMTYPE_CIRCLE : CAMTYPE_HSPS;
  1400. } else {
  1401. bool bGet = false;
  1402. for(int i=0; i<FIX_CAMERA_COUNTS; ++i) {
  1403. CSimpleStringA strDevName(lpcszDevName);
  1404. if(IsTheSameDevice(strDevName, m_fixedCamera[i].strDevName)) {
  1405. type = m_fixedCamera[i].devType;
  1406. Dbg("Detect [%s] is %d", lpcszDevName, type);
  1407. bGet = true;
  1408. break;
  1409. }
  1410. }
  1411. if(!bGet && !m_bEwsNameRefreshed && m_strEwsRecordName.GetLength() > 1) {
  1412. if(IsEwsCamera(lpcszDevName)) {
  1413. Dbg("detect ews camera.");
  1414. m_fixedCamera[CAMTYPE_EWS-1].strDevName = lpcszDevName;
  1415. m_fixedCamera[CAMTYPE_EWS-1].devType = CAMTYPE_EWS;
  1416. m_bEwsNameRefreshed = true;
  1417. type = CAMTYPE_EWS;
  1418. }
  1419. }
  1420. }
  1421. return type;
  1422. }
  1423. void CScannerFSM::OnDeviceInsert()
  1424. {
  1425. if(!m_bUsePortableScanner) {
  1426. return;
  1427. }
  1428. #if defined(RVC_OS_WIN)
  1429. std::lock_guard<std::mutex> guard(mMtx);
  1430. CAMERA_BUCKET newBuckets;
  1431. int newCount = GetCameraInfors(newBuckets);
  1432. Dbg("OnDeviceInsert: %d VS %d", newCount, m_cameralist.size());
  1433. if(newCount > m_cameralist.size()) {
  1434. CAMERA_BUCKET diffBuckes;
  1435. int diffCount = ExclusiveCameraBuckes(newBuckets, m_cameralist, diffBuckes);
  1436. DisplayCameraInfos(diffBuckes);
  1437. if(diffCount > 0) {
  1438. {
  1439. int state = 0;
  1440. ScannerDeviceInfo info = {};
  1441. auto rc = IsPortScanHoldDevice(&info, state);
  1442. if(ISSUCCEEDED(rc)) {
  1443. Dbg("hold status: %d, devName: %s type:%d",
  1444. state, (LPCTSTR)info.strDevName, info.devType);
  1445. }
  1446. }
  1447. CAMERA_BUCKET_CITER citer = diffBuckes.cbegin();
  1448. while(citer != diffBuckes.cend()) {
  1449. if(CAMTYPE_HSPS == GetRVCCameraType((*citer)->szDevName)
  1450. /*risk: cannot open*/
  1451. && IsDeviceBusy((*citer)->szDevName) == 0
  1452. ) {
  1453. Dbg("Found new CAMTYPE_HSPS type scanner");
  1454. //Should be set advanced PortableHSPS directly ?
  1455. ScannerDeviceInfo newInfo;
  1456. int nDevID = GetAdvancedScannerDevice(&newInfo);
  1457. if(nDevID >= 0) {
  1458. if(!newInfo.strDevName.Compare((*citer)->szDevName)) {
  1459. auto ec = BindPSDevice(nDevID, newInfo.strDevName);
  1460. if(ISSUCCEEDED(ec)) {
  1461. Dbg("Bind Portable scanner -force succ.");
  1462. }else {
  1463. Dbg("Bind Portable scanner -force failed RC=0X%X", ec);
  1464. }
  1465. }
  1466. }
  1467. break;
  1468. }
  1469. citer++;
  1470. }
  1471. }
  1472. UpdateCameraInfors(m_cameralist);
  1473. }
  1474. #endif //RVC_OS_WIN
  1475. }
  1476. void CScannerFSM::OnDeviceRemoved()
  1477. {
  1478. if(!m_bUsePortableScanner) {
  1479. return;
  1480. }
  1481. #if defined(RVC_OS_WIN)
  1482. std::lock_guard<std::mutex> guard(mMtx);
  1483. CAMERA_BUCKET newBuckets;
  1484. int newCount = GetCameraInfors(newBuckets);
  1485. Dbg("OnDeviceRemoved: now %d VS before %d", newCount, m_cameralist.size());
  1486. if(newCount < m_cameralist.size()) {
  1487. CAMERA_BUCKET diffBuckes;
  1488. int diffCount = ExclusiveCameraBuckes(m_cameralist, newBuckets, diffBuckes);
  1489. DisplayCameraInfos(diffBuckes);
  1490. if(diffCount > 0) {
  1491. bool bReBind = false;
  1492. int state = 0;
  1493. ScannerDeviceInfo info = {};
  1494. auto rc = IsPortScanHoldDevice(&info, state);
  1495. if(ISSUCCEEDED(rc) && state > 0) {
  1496. CAMERA_BUCKET_CITER citer = diffBuckes.cbegin();
  1497. while(citer != diffBuckes.cend()) {
  1498. if(!info.strDevName.Compare((*citer)->szDevName)) {
  1499. ScannerDeviceInfo replacedInfo;
  1500. int nReplaceDevID = GetAdvancedScannerDevice(&replacedInfo);
  1501. if(nReplaceDevID >= 0) {
  1502. auto ec = BindPSDevice(nReplaceDevID, replacedInfo.strDevName);
  1503. if(ISSUCCEEDED(ec)) {
  1504. Dbg("Bind Portable scanner -force succ.");
  1505. }else {
  1506. Dbg("Bind Portable scanner -force failed RC=0X%X", ec);
  1507. }
  1508. }else {
  1509. Dbg("Thera are no any appropriate device, send drop message.");
  1510. auto rc = DropOffPortScannerDevice();
  1511. if(FAILURED(rc)) {
  1512. Dbg("Opps! DropOffPortScannerDevice failed RC=0x%X", rc);
  1513. }else {
  1514. bReBind = true;
  1515. }
  1516. }
  1517. break;
  1518. }else {
  1519. Dbg("removed one: %s", (*citer)->szDevName);
  1520. }
  1521. citer++;
  1522. }
  1523. }
  1524. }
  1525. UpdateCameraInfors(m_cameralist);
  1526. }
  1527. #endif //RVC_OS_WIN
  1528. }
  1529. void CScannerFSM::PSEntityPostCameraError(LPCTSTR lpcszCameraName)
  1530. {
  1531. if((!m_bUsePortableScanner) || lpcszCameraName == NULL) {
  1532. return;
  1533. }
  1534. CSimpleStringA strCameraName = lpcszCameraName;
  1535. if(strCameraName.GetLength() <= 0) {
  1536. ScannerDeviceInfo existed = {};
  1537. int state = 0;
  1538. if(Error_Succeed != IsPortScanHoldDevice(&existed, state)) {
  1539. Dbg("IsPortScanHoldDevice invoked failed");
  1540. return;
  1541. }
  1542. if(state == 0) {
  1543. Dbg("Occasion@1");
  1544. return;
  1545. }
  1546. strCameraName = existed.strDevName;
  1547. if(strCameraName.GetLength() <= 0) {
  1548. Dbg("Occasion@2");
  1549. return;
  1550. }
  1551. }
  1552. CAutoArray<CSimpleStringA> devNames;
  1553. devNames.Init(1);
  1554. devNames[0] = strCameraName;
  1555. ScannerDeviceInfo info;
  1556. ErrorCodeEnum ec = Error_Succeed;
  1557. int nDevID = GetAdvancedScannerDeviceEx(&info, devNames);
  1558. if(nDevID >= 0) {
  1559. ec = BindPSDevice(nDevID, info.strDevName);
  1560. if(ISSUCCEEDED(ec)) {
  1561. Dbg("wait a little...");
  1562. Sleep(200);
  1563. }
  1564. } else {
  1565. Dbg("There are no advanced device could be used, so drop off the current one");
  1566. auto rc = DropOffPortScannerDevice();
  1567. if(FAILURED(rc)) {
  1568. Dbg("Opps! DropOffPortScannerDevice failed RC=0x%X", rc);
  1569. }
  1570. ec = Error_DevNotAvailable;
  1571. }
  1572. }
  1573. ErrorCodeEnum CScannerFSM::IsPortScanHoldDevice(ScannerDeviceInfo* pInfo, int& curState)
  1574. {
  1575. if(pInfo == NULL) {
  1576. return Error_Param;
  1577. }
  1578. if((m_bUsePortableScanner) && ISSUCCEEDED(ConnectToPortableScanner())) {
  1579. PortableScannerService_GetDevStatus_Req req = {};
  1580. PortableScannerService_GetDevStatus_Ans ans = {};
  1581. auto ec = m_pPortableClient->GetDevStatus(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT);
  1582. ReleaseSuitableEntity();
  1583. if (FAILURED(ec)) {
  1584. Dbg("GetDevStatus failed %s.", SpStrError(ec));
  1585. }
  1586. else {
  1587. pInfo->devIdx = ans.devIndex;
  1588. pInfo->strDevName = ans.checkcode;
  1589. if(ans.connected == 0) {
  1590. curState = 0;
  1591. }else {
  1592. if(ans.previewing && ans.showing) {
  1593. curState = 6;
  1594. }else if(ans.previewing){
  1595. curState = 2;
  1596. }else if(ans.showing) {
  1597. curState = 4;
  1598. }else {
  1599. curState = 1;
  1600. }
  1601. }
  1602. Dbg("GetDevStatus: state:%d, devIdx:%d, devName:%s",
  1603. curState, pInfo->devIdx, (LPCTSTR)pInfo->strDevName);
  1604. pInfo->bIdle = (BOOL)curState;
  1605. pInfo->devType = (CapTypeEnum)ans.type;
  1606. }
  1607. ReleaseSuitableEntity();
  1608. return ec;
  1609. }
  1610. return Error_Unexpect;
  1611. }
  1612. ErrorCodeEnum CScannerFSM::IsPortScanHoldDevice(bool& hasHolden,
  1613. int& DevID,
  1614. CSimpleStringA& strDevName,
  1615. bool& bBusy)
  1616. {
  1617. if((m_bUsePortableScanner) && ISSUCCEEDED(ConnectToPortableScanner())) {
  1618. PortableScannerService_GetDevStatus_Req req = {};
  1619. PortableScannerService_GetDevStatus_Ans ans = {};
  1620. auto ec = m_pPortableClient->GetDevStatus(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT);
  1621. ReleaseSuitableEntity();
  1622. if (FAILURED(ec)) {
  1623. Dbg("GetDevStatus failed %s.", SpStrError(ec));
  1624. }
  1625. else
  1626. {
  1627. DevID = ans.devIndex;
  1628. strDevName = ans.checkcode;
  1629. if(ans.connected == 0) {
  1630. hasHolden = false;
  1631. }else {
  1632. hasHolden = true;
  1633. }
  1634. if(ans.previewing && ans.showing) {
  1635. bBusy = true;
  1636. }else {
  1637. bBusy = false;
  1638. }
  1639. Dbg("GetDevStatus succ: (%d)[%s]", DevID, (LPCTSTR)strDevName);
  1640. }
  1641. ReleaseSuitableEntity();
  1642. return ec;
  1643. }
  1644. return Error_Unexpect;
  1645. }
  1646. ErrorCodeEnum CScannerFSM::AttachCheck()
  1647. {
  1648. if(!m_bUsePortableScanner) {
  1649. return Error_Succeed;
  1650. }
  1651. ErrorCodeEnum ec = Error_Succeed;
  1652. ScannerDeviceInfo existed = {};
  1653. int state = 0;
  1654. ec = IsPortScanHoldDevice(&existed, state);
  1655. if(ISSUCCEEDED(ec)) {
  1656. if(state == 0) {
  1657. Dbg("Set available portable scanner before start preview.");
  1658. ScannerDeviceInfo info;
  1659. int nDevID = GetAdvancedScannerDevice(&info);
  1660. if(nDevID >= 0) {
  1661. ec = TryBindPSDevice(nDevID, info.strDevName);
  1662. if(ISSUCCEEDED(ec)) {
  1663. Dbg("wait a little...");
  1664. Sleep(200);
  1665. }
  1666. } else {
  1667. Dbg("There are no advanced device could be used.");
  1668. ec = Error_DevNotAvailable;
  1669. }
  1670. }else {
  1671. Dbg("PortableScanner holds device now, [%d](%s)",
  1672. existed.devIdx, (LPCTSTR)existed.strDevName);
  1673. }
  1674. }
  1675. return ec;
  1676. }
  1677. ErrorCodeEnum CScannerFSM::_BindPSDevice(int nDevID, LPCTSTR lpcszDevName, bool bForce)
  1678. {
  1679. if(!m_bUsePortableScanner) {
  1680. return Error_InvalidState;
  1681. }
  1682. auto rc = ConnectToPortableScanner();
  1683. if(ISSUCCEEDED(rc)) {
  1684. PortableScannerService_BindCameraDevice_Req req = {};
  1685. PortableScannerService_BindCameraDevice_Ans ans = {};
  1686. req.devId = nDevID;
  1687. req.devName = lpcszDevName;
  1688. req.type = (int)GetRVCCameraType(lpcszDevName);
  1689. req.force = bForce ? 1 : 0;
  1690. rc = m_pPortableClient->BindCameraDevice(req, ans, MILLISECOND_WAIT_TIMEOUT_DEFAULT);
  1691. if(ISSUCCEEDED(rc)) {
  1692. Dbg("Bind portable scan device (%d)[%s] suc, previous one: [%d](%s)",
  1693. req.devId, (LPCTSTR)req.devName,
  1694. ans.usedId, (LPCTSTR)ans.checkcode);
  1695. } else {
  1696. Dbg("Bind portable scan device failed %s.", SpStrError(rc));
  1697. }
  1698. }
  1699. return rc;
  1700. }
  1701. int CScannerFSM::GetAdvancedScannerDevice(ScannerDeviceInfo* pDevInfo)
  1702. {
  1703. CAutoArray<CSimpleStringA> emptys;
  1704. return GetAdvancedScannerDeviceEx(pDevInfo, emptys);
  1705. }
  1706. int CScannerFSM::GetAdvancedScannerDeviceEx(ScannerDeviceInfo* pDevInfo,
  1707. const CAutoArray<CSimpleStringA>& caForbitDeviceNames)
  1708. {
  1709. if(pDevInfo == NULL) {
  1710. Dbg("%s: Invalid param", __FUNCTION__);
  1711. return -2;
  1712. }
  1713. CAutoArray<ScannerDeviceInfo> cameralist;
  1714. bool bInnerUpdated = false;
  1715. int devCount = GetCurrentCameraList(cameralist, bInnerUpdated);
  1716. Dbg("Get current camera list returned: %d(devCount)", devCount);
  1717. int nHSPS = -1, nOpt = -1, nOptional = -1, nEws = -1;
  1718. bool bIgonre = false;
  1719. const bool bFilter = (caForbitDeviceNames.GetCount() > 0);
  1720. if(devCount > 0) {
  1721. //requirements: available,
  1722. for(int i=0; i<devCount; ++i) {
  1723. if(bFilter)
  1724. {
  1725. bIgonre = false;
  1726. for(int j=0, count=caForbitDeviceNames.GetCount(); j<count; ++j) {
  1727. if(cameralist[i].strDevName.Compare(caForbitDeviceNames[j]) == 0) {
  1728. bIgonre = true;
  1729. break;
  1730. }
  1731. }
  1732. if(bIgonre) {
  1733. Dbg("Ignore: [%d](%s)", i, (LPCTSTR)cameralist[i].strDevName);
  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. }
  1747. }
  1748. }
  1749. /*高拍仪 > 后摄(一般不进行配置,所以作用不大) > 非前置摄像头!!,有可能是 EWS 或者 后摄(如果没配置)或者未知其他摄像头,*/
  1750. int aim = nHSPS != -1 ? nHSPS : ( nOpt != -1 ? nOpt : (nOptional != -1 ? nOptional : nEws ) );
  1751. //int aim = nHSPS == -1 ? ( nOpt == -1 ? nOptional : nOpt ) : nHSPS;
  1752. if(aim != -1) {
  1753. pDevInfo->strDevName = cameralist[aim].strDevName;
  1754. pDevInfo->bIdle = FALSE;
  1755. Dbg("Ex Lucky choice device: %s", (LPCTSTR)pDevInfo->strDevName);
  1756. }else {
  1757. Dbg("Opps! no available advanced portable scanner.");
  1758. SendBroadcastAbout();
  1759. }
  1760. return aim;
  1761. }
  1762. ErrorCodeEnum CScannerFSM::DropOffPortScannerDevice()
  1763. {
  1764. ErrorCodeEnum rc = Error_Unexpect;
  1765. if((m_bUsePortableScanner) && ISSUCCEEDED(ConnectToPortableScanner())) {
  1766. rc = m_pPortableClient->DropOffDevice();
  1767. FreePortableScannerClient();
  1768. }
  1769. return rc;
  1770. }
  1771. void CScannerFSM::InitializeMehodQueue()
  1772. {
  1773. for (int idx=0; idx<SS_MAX_METHOD_COUNT; ++idx) {
  1774. ListEntry_InitHead(&m_methods[idx].ContextListHead);
  1775. m_methods[idx].dwSequence = 0;
  1776. m_methods[idx].dwMethodSig = (DWORD)-1;
  1777. }
  1778. m_methods[0].dwMethodSig = ScannerService_Method_StartPreview;
  1779. m_methods[1].dwMethodSig = ScannerService_Method_CancelPreview;
  1780. m_methods[2].dwMethodSig = ScannerService_Method_ScanImage;
  1781. m_methods[3].dwMethodSig = ScannerService_Method_SetWindowPos;
  1782. m_methods[4].dwMethodSig = ScannerService_Method_SetProperty;
  1783. m_methods[5].dwMethodSig = ScannerService_Method_ShowProperty;
  1784. m_methods[6].dwMethodSig = ScannerService_Method_GetDevStatus;
  1785. m_methods[7].dwMethodSig = ScannerService_Method_GetOnlineCameras;
  1786. m_methods[8].dwMethodSig = ScannerService_Method_CrossTermCall;
  1787. m_methods[9].dwMethodSig = ScannerService_Method_GetDevInfo;
  1788. m_methods[10].dwMethodSig = ScannerService_Method_Exit;
  1789. LOG_ASSERT(11 == SS_MAX_METHOD_COUNT);
  1790. }
  1791. void CScannerFSM::DestoryMethodQueue()
  1792. {
  1793. for (int idx=0; idx<SS_MAX_METHOD_COUNT; ++idx) {
  1794. while(!ListEntry_IsEmpty(&m_methods[idx].ContextListHead)) {
  1795. PLIST_ENTRY pListEntry = ListEntry_RemoveListTail(&m_methods[idx].ContextListHead);
  1796. PTC_CONTEXT_CALL_ITEM ptContextItem = CONTAINING_RECORD(pListEntry, TC_CONTEXT_CALL_ITEM, ListEntry);
  1797. if(ptContextItem != NULL) {
  1798. TWHeapFree(ptContextItem);
  1799. ptContextItem = NULL;
  1800. }
  1801. }
  1802. }
  1803. }
  1804. ErrorCodeEnum CScannerFSM::TryBindPSDevice(int nDevID, LPCTSTR lpcszDevName)
  1805. {
  1806. return _BindPSDevice(nDevID, lpcszDevName);
  1807. }
  1808. ErrorCodeEnum CScannerFSM::BindPSDevice(int nDevID, LPCTSTR lpcszDevName)
  1809. {
  1810. return _BindPSDevice(nDevID, lpcszDevName, true);
  1811. }
  1812. void CScannerFSM::SendBroadcastAbout()
  1813. {
  1814. if(!m_bUsePortableScanner) {
  1815. return;
  1816. }
  1817. EventMsg evt;
  1818. evt.eventType = 0;
  1819. evt.reserved2 = "无可用的摄像头或摄像头故障,请检查设备!";
  1820. Dbg("SpSendBroadcast(%d, %s)", evt.eventType, (LPCTSTR)evt.reserved2);
  1821. SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(EventMsg), SP_MSG_SIG_OF(EventMsg), evt);
  1822. }
  1823. ErrorCodeEnum CScannerFSM::CheckHeartbeatConnectStatus()
  1824. {
  1825. return Error_NotImpl;
  1826. }
  1827. ErrorCodeEnum CScannerFSM::ConnectToHeartbeat()
  1828. {
  1829. FreePortableScannerClient();
  1830. m_pHeartBeatClient = new CHeartBeatClient(GetEntityBase());
  1831. ErrorCodeEnum erroCode = m_pHeartBeatClient->Connect();
  1832. if(FAILURED(erroCode)) {
  1833. m_pHeartBeatClient->SafeDelete();
  1834. m_pHeartBeatClient = NULL;
  1835. LogWarn(Severity_Middle, Error_InvalidState, 0, "Connect to heatbeat entity failed.");
  1836. return Error_InvalidState;
  1837. }
  1838. return Error_Succeed;
  1839. }
  1840. bool CScannerFSM::GetAttachedTerminal(CSimpleStringA &csTerm)
  1841. {
  1842. auto ec = GetEntityBase()->GetFunction()->GetSysVar("AttachedTerminal", csTerm);
  1843. return (ec == Error_Succeed);
  1844. }
  1845. ErrorCodeEnum CScannerFSM::SendRequest2Heatbeat(
  1846. DWORD dwMethodSig, const CBlob& bbReq, CBlob& bbAns, PVOID* ptCtx, bool fTwoWay)
  1847. {
  1848. LOG_FUNCTION();
  1849. static PTC_ENTITY_INTERFACE_QUEUE ptInterfaceQueue = NULL;
  1850. static std::mutex mt4InterfaceQueue;
  1851. Dbg("dwMethodSigure: %d", dwMethodSig);
  1852. ErrorCodeEnum Error = Error_Succeed;
  1853. ptInterfaceQueue = NULL;
  1854. for (int i=0; i<SS_MAX_METHOD_COUNT; ++i) {
  1855. if(dwMethodSig == m_methods[i].dwMethodSig) {
  1856. ptInterfaceQueue = &m_methods[i];
  1857. break;
  1858. }
  1859. }
  1860. if(ptInterfaceQueue == NULL) {
  1861. return Error_MethodNotFound;
  1862. }
  1863. mt4InterfaceQueue.lock();
  1864. ptInterfaceQueue->dwSequence += 1;
  1865. mt4InterfaceQueue.unlock();
  1866. PTC_CONTEXT_CALL_ITEM ptContextItem = NULL;
  1867. if(ptCtx != NULL) {
  1868. ptContextItem = (PTC_CONTEXT_CALL_ITEM)TWHeapAlloc(sizeof(TC_CONTEXT_CALL_ITEM));
  1869. ptContextItem->dwRequestID = ptInterfaceQueue->dwSequence;
  1870. ptContextItem->Context = *ptCtx;
  1871. ListEntry_AddTail(&ptInterfaceQueue->ContextListHead, &ptContextItem->ListEntry);
  1872. } else {
  1873. Dbg("ptCtx is nullptr, ignore it !");
  1874. }
  1875. HeartBeatService_CrossTermCall_Req hb_ctc_req;
  1876. HeartBeatService_CrossTermCall_Ans hb_ctc_ans;
  1877. hb_ctc_req.type = (((int)ptInterfaceQueue->dwSequence << 16) | (ptInterfaceQueue->dwMethodSig & 0xFFFF));
  1878. hb_ctc_req.paramX = bbReq;
  1879. hb_ctc_req.isTwoWay = fTwoWay;
  1880. hb_ctc_req.nEntityID = 0x218; //ScannerSet在shell.ini里的值
  1881. hb_ctc_req.fromTerminalNo = m_strTerminalNo;
  1882. #ifdef TWINKLE_LOCAL_DEBUG
  1883. hb_ctc_req.toTerminalNo = "7715010050";
  1884. #else
  1885. GetAttachedTerminal(hb_ctc_req.toTerminalNo);
  1886. #endif
  1887. hb_ctc_req.param1 = "";
  1888. hb_ctc_req.param2 = "";
  1889. //TODO:
  1890. if(ISSUCCEEDED(Error = ConnectToHeartbeat())) {
  1891. Dbg("Start CrossTermCall %d", hb_ctc_req.paramX.m_iLength);
  1892. Error = m_pHeartBeatClient->CrossTermCall(hb_ctc_req, hb_ctc_ans, 20000);
  1893. Dbg("End CrossTermCall: %d", Error);
  1894. }
  1895. if(FAILURED(Error)) {
  1896. if(ptContextItem != NULL) {
  1897. ListEntry_DeleteNode(&ptContextItem->ListEntry);
  1898. TWHeapFree(ptContextItem);
  1899. ptContextItem = NULL;
  1900. }
  1901. } else {
  1902. Dbg("Invoke CrossTermCall succ, waitting for result...");
  1903. }
  1904. return Error;
  1905. }
  1906. // 简版机型,接收到回收包
  1907. ErrorCodeEnum CScannerFSM::ReceiveAnswer5Heartbeat(
  1908. const ScannerService_CrossTermCall_Req& req, ScannerService_CrossTermCall_Ans& ans)
  1909. {
  1910. LOG_FUNCTION();
  1911. ErrorCodeEnum Error = Error_Succeed;
  1912. static PTC_ENTITY_INTERFACE_QUEUE ptInterfaceQueue = NULL;
  1913. Dbg("ReceiveAnswer5Heartbeat: %d", ans.retCode);
  1914. ptInterfaceQueue = NULL;
  1915. DWORD dwMethodSig = (ans.retCode & 0xFFFF);
  1916. DWORD dwRequestID = (ans.retCode & 0xFFFF0000) >> 16;
  1917. for (int i=0; i<SS_MAX_METHOD_COUNT; ++i) {
  1918. if(dwMethodSig == m_methods[i].dwMethodSig) {
  1919. ptInterfaceQueue = &m_methods[i];
  1920. break;
  1921. }
  1922. }
  1923. if(ptInterfaceQueue == NULL) {
  1924. return Error_MethodNotFound;
  1925. }
  1926. PTC_CONTEXT_CALL_ITEM ptContextItem = NULL;
  1927. ListEntry_ForEach(ptContextItem, &(ptInterfaceQueue->ContextListHead), TC_CONTEXT_CALL_ITEM, ListEntry)
  1928. {
  1929. if(ptContextItem->dwRequestID == dwRequestID) {
  1930. break;
  1931. }
  1932. }
  1933. if(ptContextItem == NULL || &(ptContextItem->ListEntry) == &(ptInterfaceQueue->ContextListHead)) {
  1934. return Error_BridgeNotBind;
  1935. }
  1936. switch (dwMethodSig) {
  1937. case ScannerService_Method_StartPreview:
  1938. {
  1939. auto pt = reinterpret_cast<SpReqAnsContext<ScannerService_StartPreview_Req,
  1940. ScannerService_StartPreview_Ans>*>(ptContextItem->Context);
  1941. SpReqAnsContext<ScannerService_StartPreview_Req,
  1942. ScannerService_StartPreview_Ans>::Pointer ctx;
  1943. ctx.Attach(pt);
  1944. SpBlob2Object(ans.retParamX, ctx->Ans);
  1945. }
  1946. break;
  1947. case ScannerService_Method_CancelPreview:
  1948. {
  1949. auto pt = reinterpret_cast<SpReqAnsContext<ScannerService_CancelPreview_Req,
  1950. ScannerService_CancelPreview_Ans>*>(ptContextItem->Context);
  1951. SpReqAnsContext<ScannerService_CancelPreview_Req,
  1952. ScannerService_CancelPreview_Ans>::Pointer ctx;
  1953. ctx.Attach(pt);
  1954. SpBlob2Object(ans.retParamX, ctx->Ans);
  1955. }
  1956. break;
  1957. case ScannerService_Method_ScanImage:
  1958. {
  1959. auto pt = reinterpret_cast<SpReqAnsContext<ScannerService_ScanImage_Req,
  1960. ScannerService_ScanImage_Ans>*>(ptContextItem->Context);
  1961. SpReqAnsContext<ScannerService_ScanImage_Req,
  1962. ScannerService_ScanImage_Ans>::Pointer ctx;
  1963. ctx.Attach(pt);
  1964. SpBlob2Object(ans.retParamX, ctx->Ans);
  1965. }
  1966. break;
  1967. case ScannerService_Method_SetWindowPos:
  1968. {
  1969. auto pt = reinterpret_cast<SpReqAnsContext<ScannerService_SetWindowPos_Req,
  1970. ScannerService_SetWindowPos_Ans>*>(ptContextItem->Context);
  1971. SpReqAnsContext<ScannerService_SetWindowPos_Req,
  1972. ScannerService_SetWindowPos_Ans>::Pointer ctx;
  1973. ctx.Attach(pt);
  1974. SpBlob2Object(ans.retParamX, ctx->Ans);
  1975. }
  1976. break;
  1977. case ScannerService_Method_SetProperty:
  1978. {
  1979. auto pt = reinterpret_cast<SpReqAnsContext<ScannerService_SetProperty_Req,
  1980. ScannerService_SetProperty_Ans>*>(ptContextItem->Context);
  1981. SpReqAnsContext<ScannerService_SetProperty_Req,
  1982. ScannerService_SetProperty_Ans>::Pointer ctx;
  1983. ctx.Attach(pt);
  1984. SpBlob2Object(ans.retParamX, ctx->Ans);
  1985. }
  1986. break;
  1987. case ScannerService_Method_ShowProperty:
  1988. {
  1989. auto pt = reinterpret_cast<SpReqAnsContext<ScannerService_ShowProperty_Req,
  1990. ScannerService_ShowProperty_Ans>*>(ptContextItem->Context);
  1991. SpReqAnsContext<ScannerService_ShowProperty_Req,
  1992. ScannerService_ShowProperty_Ans>::Pointer ctx;
  1993. ctx.Attach(pt);
  1994. SpBlob2Object(ans.retParamX, ctx->Ans);
  1995. }
  1996. break;
  1997. case ScannerService_Method_GetDevStatus:
  1998. {
  1999. auto pt = reinterpret_cast<SpReqAnsContext<ScannerService_GetDevStatus_Req,
  2000. ScannerService_GetDevStatus_Ans>*>(ptContextItem->Context);
  2001. SpReqAnsContext<ScannerService_GetDevStatus_Req,
  2002. ScannerService_GetDevStatus_Ans>::Pointer ctx;
  2003. ctx.Attach(pt);
  2004. SpBlob2Object(ans.retParamX, ctx->Ans);
  2005. }
  2006. break;
  2007. case ScannerService_Method_GetOnlineCameras:
  2008. {
  2009. auto pt = reinterpret_cast<SpReqAnsContext<ScannerService_GetOnlineCameras_Req,
  2010. ScannerService_GetOnlineCameras_Ans>*>(ptContextItem->Context);
  2011. SpReqAnsContext<ScannerService_GetOnlineCameras_Req,
  2012. ScannerService_GetOnlineCameras_Ans>::Pointer ctx;
  2013. ctx.Attach(pt);
  2014. SpBlob2Object(ans.retParamX, ctx->Ans);
  2015. }
  2016. break;
  2017. case ScannerService_Method_GetDevInfo:
  2018. {
  2019. auto pt = reinterpret_cast<SpReqAnsContext<ScannerService_GetDevInfo_Req,
  2020. ScannerService_GetDevInfo_Ans>*>(ptContextItem->Context);
  2021. SpReqAnsContext<ScannerService_GetDevInfo_Req,
  2022. ScannerService_GetDevInfo_Ans>::Pointer ctx;
  2023. ctx.Attach(pt);
  2024. SpBlob2Object(ans.retParamX, ctx->Ans);
  2025. }
  2026. break;
  2027. case ScannerService_Method_Exit:
  2028. {
  2029. }
  2030. break;
  2031. default:
  2032. Error = Error_MethodNotFound;
  2033. break;
  2034. }
  2035. if(ptContextItem != NULL) {
  2036. ListEntry_DeleteNode(&ptContextItem->ListEntry);
  2037. TWHeapFree(ptContextItem);
  2038. ptContextItem = NULL;
  2039. }
  2040. return Error;
  2041. }
  2042. ErrorCodeEnum CScannerFSM::ReceiveAnswer5Heartbeat(
  2043. SpOnewayCallContext<ScannerService_CrossTermInvokeInfo_Info>::Pointer context)
  2044. {
  2045. LOG_FUNCTION();
  2046. ErrorCodeEnum Error = Error_Succeed;
  2047. static PTC_ENTITY_INTERFACE_QUEUE ptInterfaceQueue = NULL;
  2048. Dbg("ReceiveAnswer5Heartbeat: %d, type: 0x%08X", context->Info.result, context->Info.type);
  2049. ptInterfaceQueue = NULL;
  2050. ErrorCodeEnum ec = (ErrorCodeEnum)context->Info.result;
  2051. Dbg("Operation result: %d, %d", context->Info.result, ec);
  2052. DWORD dwMethodSig = (context->Info.type & 0xFFFF);
  2053. DWORD dwRequestID = (context->Info.type & 0xFFFF0000) >> 16;
  2054. for (int i=0; i<SS_MAX_METHOD_COUNT; ++i) {
  2055. if(dwMethodSig == m_methods[i].dwMethodSig) {
  2056. ptInterfaceQueue = &m_methods[i];
  2057. break;
  2058. }
  2059. }
  2060. if(ptInterfaceQueue == NULL) {
  2061. Dbg("Cannot found the method item !");
  2062. return Error_MethodNotFound;
  2063. }
  2064. PTC_CONTEXT_CALL_ITEM ptContextItem = NULL;
  2065. ListEntry_ForEach(ptContextItem, &(ptInterfaceQueue->ContextListHead), TC_CONTEXT_CALL_ITEM, ListEntry) {
  2066. if(ptContextItem->dwRequestID == dwRequestID) {
  2067. break;
  2068. }
  2069. }
  2070. if(ptContextItem == NULL || &(ptContextItem->ListEntry) == &(ptInterfaceQueue->ContextListHead)) {
  2071. Dbg("Cannot found the specified context item");
  2072. return Error_BridgeNotBind;
  2073. }
  2074. Dbg("method signature: %d", dwMethodSig);
  2075. switch (dwMethodSig) {
  2076. case ScannerService_Method_StartPreview:
  2077. {
  2078. auto pt = reinterpret_cast<SpReqAnsContext<ScannerService_StartPreview_Req,
  2079. ScannerService_StartPreview_Ans>*>(ptContextItem->Context);
  2080. SpReqAnsContext<ScannerService_StartPreview_Req,
  2081. ScannerService_StartPreview_Ans>::Pointer ctx;
  2082. ctx.Attach(pt);
  2083. SpBlob2Object(context->Info.paramX, ctx->Ans);
  2084. ctx->Answer(ec);
  2085. }
  2086. break;
  2087. case ScannerService_Method_CancelPreview:
  2088. {
  2089. auto pt = reinterpret_cast<SpReqAnsContext<ScannerService_CancelPreview_Req,
  2090. ScannerService_CancelPreview_Ans>*>(ptContextItem->Context);
  2091. SpReqAnsContext<ScannerService_CancelPreview_Req,
  2092. ScannerService_CancelPreview_Ans>::Pointer ctx;
  2093. ctx.Attach(pt);
  2094. SpBlob2Object(context->Info.paramX, ctx->Ans);
  2095. ctx->Answer(ec);
  2096. }
  2097. break;
  2098. case ScannerService_Method_ScanImage:
  2099. {
  2100. auto pt = reinterpret_cast<SpReqAnsContext<ScannerService_ScanImage_Req,
  2101. ScannerService_ScanImage_Ans>*>(ptContextItem->Context);
  2102. SpReqAnsContext<ScannerService_ScanImage_Req,
  2103. ScannerService_ScanImage_Ans>::Pointer ctx;
  2104. ctx.Attach(pt);
  2105. SpBlob2Object(context->Info.paramX, ctx->Ans);
  2106. ctx->Answer(ec);
  2107. }
  2108. break;
  2109. case ScannerService_Method_SetWindowPos:
  2110. {
  2111. auto pt = reinterpret_cast<SpReqAnsContext<ScannerService_SetWindowPos_Req,
  2112. ScannerService_SetWindowPos_Ans>*>(ptContextItem->Context);
  2113. SpReqAnsContext<ScannerService_SetWindowPos_Req,
  2114. ScannerService_SetWindowPos_Ans>::Pointer ctx;
  2115. ctx.Attach(pt);
  2116. SpBlob2Object(context->Info.paramX, ctx->Ans);
  2117. ctx->Answer(ec);
  2118. }
  2119. break;
  2120. case ScannerService_Method_SetProperty:
  2121. {
  2122. auto pt = reinterpret_cast<SpReqAnsContext<ScannerService_SetProperty_Req,
  2123. ScannerService_SetProperty_Ans>*>(ptContextItem->Context);
  2124. SpReqAnsContext<ScannerService_SetProperty_Req,
  2125. ScannerService_SetProperty_Ans>::Pointer ctx;
  2126. ctx.Attach(pt);
  2127. SpBlob2Object(context->Info.paramX, ctx->Ans);
  2128. ctx->Answer(ec);
  2129. }
  2130. break;
  2131. case ScannerService_Method_ShowProperty:
  2132. {
  2133. auto pt = reinterpret_cast<SpReqAnsContext<ScannerService_ShowProperty_Req,
  2134. ScannerService_ShowProperty_Ans>*>(ptContextItem->Context);
  2135. SpReqAnsContext<ScannerService_ShowProperty_Req,
  2136. ScannerService_ShowProperty_Ans>::Pointer ctx;
  2137. ctx.Attach(pt);
  2138. SpBlob2Object(context->Info.paramX, ctx->Ans);
  2139. ctx->Answer(ec);
  2140. }
  2141. break;
  2142. case ScannerService_Method_GetDevStatus:
  2143. {
  2144. auto pt = reinterpret_cast<SpReqAnsContext<ScannerService_GetDevStatus_Req,
  2145. ScannerService_GetDevStatus_Ans>*>(ptContextItem->Context);
  2146. SpReqAnsContext<ScannerService_GetDevStatus_Req,
  2147. ScannerService_GetDevStatus_Ans>::Pointer ctx;
  2148. ctx.Attach(pt);
  2149. SpBlob2Object(context->Info.paramX, ctx->Ans);
  2150. ctx->Answer(ec);
  2151. }
  2152. break;
  2153. case ScannerService_Method_GetOnlineCameras:
  2154. {
  2155. auto pt = reinterpret_cast<SpReqAnsContext<ScannerService_GetOnlineCameras_Req,
  2156. ScannerService_GetOnlineCameras_Ans>*>(ptContextItem->Context);
  2157. SpReqAnsContext<ScannerService_GetOnlineCameras_Req,
  2158. ScannerService_GetOnlineCameras_Ans>::Pointer ctx;
  2159. ctx.Attach(pt);
  2160. SpBlob2Object(context->Info.paramX, ctx->Ans);
  2161. ctx->Answer(ec);
  2162. }
  2163. break;
  2164. case ScannerService_Method_GetDevInfo:
  2165. {
  2166. auto pt = reinterpret_cast<SpReqAnsContext<ScannerService_GetDevInfo_Req,
  2167. ScannerService_GetDevInfo_Ans>*>(ptContextItem->Context);
  2168. Dbg("evt Ctx: %p", ptContextItem->Context);
  2169. SpReqAnsContext<ScannerService_GetDevInfo_Req,
  2170. ScannerService_GetDevInfo_Ans>::Pointer ctx;
  2171. Dbg("test1");
  2172. ctx.Attach(pt);
  2173. Dbg("test2");
  2174. SpBlob2Object(context->Info.paramX, ctx->Ans);
  2175. Dbg("rtype: %s\r\n\tmodel: %s\r\n\tversion: %s\r\n\tstate:%d.",
  2176. (LPCTSTR)ctx->Ans.type, (LPCTSTR)ctx->Ans.model, (LPCTSTR)ctx->Ans.version, ctx->Ans.state);
  2177. Dbg("test3: %d", ec);
  2178. Dbg("answer:%d", ctx->Answer(ec));
  2179. }
  2180. break;
  2181. case ScannerService_Method_Exit:
  2182. {
  2183. }
  2184. break;
  2185. default:
  2186. Dbg("eventually not found it: %d", dwMethodSig);
  2187. Error = Error_MethodNotFound;
  2188. break;
  2189. }
  2190. if(Error == Error_Succeed) {
  2191. }
  2192. if(ptContextItem != NULL) {
  2193. ListEntry_DeleteNode(&ptContextItem->ListEntry);
  2194. TWHeapFree(ptContextItem);
  2195. ptContextItem = NULL;
  2196. }
  2197. return Error;
  2198. }
  2199. //接收到心跳的操作请求,常规机型
  2200. ErrorCodeEnum CScannerFSM::ReceiveRequest5Heartbeat(
  2201. const ScannerService_CrossTermCall_Req& hcReq, ScannerService_CrossTermCall_Ans& hcAns)
  2202. {
  2203. LOG_FUNCTION();
  2204. ErrorCodeEnum Error = Error_Succeed;
  2205. Dbg("ReceiveRequest5Heartbeat: %d", hcReq.type);
  2206. hcAns.retCode = hcReq.type;
  2207. switch (hcReq.type & 0xFFFF) {
  2208. case ScannerService_Method_StartPreview:
  2209. {
  2210. DEFINE_PUPPET_CONTEXT_WITH_TYPE(ScannerService_StartPreview_Req, ScannerService_StartPreview_Ans);
  2211. if((Error = SpBlob2Object(hcReq.paramX, ctx->Req)) == Error_Succeed) {
  2212. Dbg("rotate:%d, scan:%d, color:%d, r1:%d, r2:%d, r3:%d, r4:%d", ctx->Req.rotateType, ctx->Req.scanType, ctx->Req.colorType,
  2213. ctx->Req.reserved1, ctx->Req.reserved2, ctx->Req.reserved3, ctx->Req.reserved4);
  2214. Error = this->AttachCheck();
  2215. if(ISSUCCEEDED(Error)) {
  2216. if(this->StartPreview(ctx) != 0) {
  2217. Error = Error_Unexpect;
  2218. } else {
  2219. Error = SpObject2Blob(ctx->Ans, hcAns.retParamX);
  2220. }
  2221. }else {
  2222. ctx->Answer(Error_DevNotAvailable);
  2223. /* //test
  2224. ctx->Ans.retCode = 1234;
  2225. ctx->Ans.reserved1 = 7890;
  2226. Error = Error_Succeed;
  2227. Dbg("Test test twtwt");
  2228. ctx->Answer(Error_Succeed);
  2229. Error = SpObject2Blob(ctx->Ans, hcAns.retParamX);
  2230. /**/
  2231. }
  2232. /**/
  2233. } else {
  2234. Dbg("SpBlob2Object in ReceiveRequest5Heartbeat failed: %d", Error);
  2235. }
  2236. /*
  2237. SpBuffer spbuf2;
  2238. ScannerService_StartPreview_Req scannerReq;
  2239. if(spbuf2.OpenRead((const char*)hcReq.paramX.m_pData, hcReq.paramX.m_iLength)) {
  2240. scannerReq.Serialize(spbuf2);
  2241. Dbg("rotate:%d, scan:%d, color:%d, r1:%d, r2:%d, r3:%d, r4:%d", scannerReq.rotateType, scannerReq.scanType, scannerReq.colorType,
  2242. scannerReq.reserved1, scannerReq.reserved2, scannerReq.reserved3, scannerReq.reserved4);
  2243. //The Test case. should invoke the real interface to
  2244. ScannerService_StartPreview_Ans scannerAns;
  2245. scannerAns.retCode = 1234;
  2246. scannerAns.reserved1 = 7890;
  2247. hcAns.retType = hcReq.type;
  2248. CAutoBuffer buf = SpObject2Buffer<ScannerService_StartPreview_Ans>(scannerAns);
  2249. SpBuffer spbuf;
  2250. if (!spbuf.OpenRead((const char*)&buf[0], buf.GetCount())) {
  2251. return Error_Unexpect;
  2252. }
  2253. hcAns.retParamX = spbuf.ToBlob();
  2254. } else {
  2255. Dbg("SpBuffer2Object in ReceiveRequest5Heartbeat failed: %d", Error);
  2256. }
  2257. /**/
  2258. }
  2259. break;
  2260. case ScannerService_Method_CancelPreview:
  2261. {
  2262. DEFINE_PUPPET_CONTEXT_WITH_TYPE(ScannerService_CancelPreview_Req, ScannerService_CancelPreview_Ans);
  2263. if((Error = SpBlob2Object(hcReq.paramX, ctx->Req)) == Error_Succeed) {
  2264. if(this->StopPreview(ctx) != 0) {
  2265. Error = Error_Unexpect;
  2266. } else {
  2267. Error = SpObject2Blob(ctx->Ans, hcAns.retParamX);
  2268. }
  2269. }
  2270. }
  2271. break;
  2272. case ScannerService_Method_ScanImage:
  2273. {
  2274. DEFINE_PUPPET_CONTEXT_WITH_TYPE(ScannerService_ScanImage_Req, ScannerService_ScanImage_Ans);
  2275. if((Error = SpBlob2Object(hcReq.paramX, ctx->Req)) == Error_Succeed) {
  2276. if(this->ScanImage(ctx) != 0) {
  2277. Error = Error_Unexpect;
  2278. } else {
  2279. Error = SpObject2Blob(ctx->Ans, hcAns.retParamX);
  2280. }
  2281. }
  2282. }
  2283. break;
  2284. case ScannerService_Method_SetWindowPos:
  2285. {
  2286. DEFINE_PUPPET_CONTEXT_WITH_TYPE(ScannerService_SetWindowPos_Req, ScannerService_SetWindowPos_Ans);
  2287. if((Error = SpBlob2Object(hcReq.paramX, ctx->Req)) == Error_Succeed) {
  2288. if(this->SetWinPos(ctx) != 0) {
  2289. Error = Error_Unexpect;
  2290. } else {
  2291. Error = SpObject2Blob(ctx->Ans, hcAns.retParamX);
  2292. }
  2293. }
  2294. }
  2295. break;
  2296. case ScannerService_Method_SetProperty:
  2297. {
  2298. DEFINE_PUPPET_CONTEXT_WITH_TYPE(ScannerService_SetProperty_Req, ScannerService_SetProperty_Ans);
  2299. if((Error = SpBlob2Object(hcReq.paramX, ctx->Req)) == Error_Succeed) {
  2300. if(this->SetProperty(ctx) != 0) {
  2301. Error = Error_Unexpect;
  2302. } else {
  2303. Error = SpObject2Blob(ctx->Ans, hcAns.retParamX);
  2304. }
  2305. }
  2306. }
  2307. break;
  2308. case ScannerService_Method_ShowProperty:
  2309. {
  2310. DEFINE_PUPPET_CONTEXT_WITH_TYPE(ScannerService_ShowProperty_Req, ScannerService_ShowProperty_Ans);
  2311. if((Error = SpBlob2Object(hcReq.paramX, ctx->Req)) == Error_Succeed) {
  2312. if(this->ShowLTProperty(ctx) != 0) {
  2313. Error = Error_Unexpect;
  2314. } else {
  2315. Error = SpObject2Blob(ctx->Ans, hcAns.retParamX);
  2316. }
  2317. }
  2318. }
  2319. break;
  2320. case ScannerService_Method_GetDevStatus:
  2321. {
  2322. DEFINE_PUPPET_CONTEXT_WITH_TYPE(ScannerService_GetDevStatus_Req, ScannerService_GetDevStatus_Ans);
  2323. if((Error = SpBlob2Object(hcReq.paramX, ctx->Req)) == Error_Succeed) {
  2324. if(this->GetDevStatus(ctx) != 0) {
  2325. Error = Error_Unexpect;
  2326. } else {
  2327. Error = SpObject2Blob(ctx->Ans, hcAns.retParamX);
  2328. }
  2329. }
  2330. }
  2331. break;
  2332. case ScannerService_Method_GetOnlineCameras:
  2333. {
  2334. DEFINE_PUPPET_CONTEXT_WITH_TYPE(ScannerService_GetOnlineCameras_Req, ScannerService_GetOnlineCameras_Ans);
  2335. if((Error = SpBlob2Object(hcReq.paramX, ctx->Req)) == Error_Succeed) {
  2336. this->GetOnlineDevices(ctx);
  2337. Error = SpObject2Blob(ctx->Ans, hcAns.retParamX);
  2338. }
  2339. }
  2340. break;
  2341. case ScannerService_Method_GetDevInfo:
  2342. {
  2343. DEFINE_PUPPET_CONTEXT_WITH_TYPE(ScannerService_GetDevInfo_Req, ScannerService_GetDevInfo_Ans);
  2344. if((Error = SpBlob2Object(hcReq.paramX, ctx->Req)) == Error_Succeed) {
  2345. if(this->GetDevInfo(ctx) != 0) {
  2346. Error = Error_Unexpect;
  2347. } else {
  2348. Error = SpObject2Blob(ctx->Ans, hcAns.retParamX);
  2349. }
  2350. }
  2351. }
  2352. break;
  2353. case ScannerService_Method_Exit:
  2354. Error = OnDevExit();
  2355. break;
  2356. default:
  2357. Error = Error_MethodNotFound;
  2358. break;
  2359. }
  2360. return Error;
  2361. }
  2362. namespace
  2363. {
  2364. #if defined(RVC_OS_WIN)
  2365. GUID* StrToGUID(const WCHAR* guid_string)
  2366. {
  2367. static char buffer[64];
  2368. memset(buffer, 0, sizeof(buffer));
  2369. GUID* guid = (GUID*)buffer;
  2370. WCHAR upperGuid[40 + 1] = { 0 };
  2371. for (int i = 0; i < 40 + 1; i++) {
  2372. upperGuid[i] = guid_string[i];
  2373. if (upperGuid[i] >= L'a' && upperGuid[i] <= L'z') {
  2374. upperGuid[i] += L'A' - L'a';
  2375. }
  2376. }
  2377. swscanf_s(upperGuid, L"{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
  2378. &guid->Data1,
  2379. &guid->Data2,
  2380. &guid->Data3,
  2381. &guid->Data4[0],
  2382. &guid->Data4[1],
  2383. &guid->Data4[2],
  2384. &guid->Data4[3],
  2385. &guid->Data4[4],
  2386. &guid->Data4[5],
  2387. &guid->Data4[6],
  2388. &guid->Data4[7]);
  2389. return guid; //TODO:
  2390. }
  2391. #endif //RVC_OS_WIN
  2392. }
  2393. bool CScannerFSM::FindEwsCameraName(CSimpleStringA& strRetrievedName,
  2394. const CSimpleStringA& strRootName)
  2395. {
  2396. if(strRootName.GetLength() <= 1) {
  2397. return false;
  2398. }
  2399. bool bRet = false;
  2400. #if defined(RVC_OS_WIN)
  2401. GUID deviceGuid = *StrToGUID(L"{6BDD1FC6-810F-11D0-BEC7-08002BE2092F}");
  2402. HDEVINFO hDev = SetupDiGetClassDevs(&deviceGuid, NULL, NULL, DIGCF_PRESENT);
  2403. if(INVALID_HANDLE_VALUE == hDev) {
  2404. return bRet;
  2405. }
  2406. SP_CLASSIMAGELIST_DATA _spImageData = {0};
  2407. _spImageData.cbSize = sizeof(SP_CLASSIMAGELIST_DATA);
  2408. SetupDiGetClassImageList(&_spImageData);
  2409. SP_DEVINFO_DATA DevInfo;
  2410. ZeroMemory(&DevInfo, sizeof(SP_DEVINFO_DATA));
  2411. DevInfo.cbSize = sizeof(SP_DEVINFO_DATA);
  2412. DWORD DeviceIndex = 0;
  2413. Dbg("Current EwsCamera: %s", strRootName.GetData());
  2414. while(SetupDiEnumDeviceInfo(hDev, DeviceIndex, &DevInfo)) {
  2415. int wImageIdx = 0;
  2416. if (SetupDiGetClassImageIndex(&_spImageData, &DevInfo.ClassGuid, &wImageIdx)) {
  2417. char szName[MAX_PATH] = {0};
  2418. //先获取获取设备名
  2419. bool bHere = false;
  2420. if(SetupDiGetDeviceInstanceId(hDev, &DevInfo, szName, MAX_PATH - 1, NULL)) {
  2421. Dbg("InstanceId: %s", szName);
  2422. if (0 == _stricmp(szName, strRootName.GetData())) {
  2423. bHere = true;
  2424. }
  2425. } else {
  2426. if (SetupDiGetDeviceRegistryProperty(
  2427. hDev,&DevInfo, SPDRP_DEVICEDESC, NULL, (PBYTE)szName, MAX_PATH - 1, 0)) {
  2428. Dbg("RegistryProperty: %s", szName);
  2429. if (0 == _stricmp(szName, strRootName.GetData())) {
  2430. bHere = true;
  2431. }
  2432. }
  2433. }
  2434. if(bHere){
  2435. Dbg("Enter SPDRP_FRIENDLYNAME routine.");
  2436. if (SetupDiGetDeviceRegistryProperty(
  2437. hDev, &DevInfo, SPDRP_FRIENDLYNAME, NULL, (PBYTE)szName, MAX_PATH - 1, 0)) {
  2438. Dbg("FriendName: %s", szName);
  2439. strRetrievedName = szName;
  2440. bRet = !!(strRetrievedName.GetLength() > 0);
  2441. }
  2442. break;
  2443. }
  2444. }
  2445. DeviceIndex++;
  2446. }
  2447. SetupDiDestroyClassImageList(&_spImageData);
  2448. if(hDev) {
  2449. SetupDiDestroyDeviceInfoList(hDev);
  2450. }
  2451. #endif //RVC_OS_WIN
  2452. return bRet;
  2453. }
  2454. //TODO(Gifur): draw out the same code with FindEwsCameraName
  2455. bool CScannerFSM::IsEwsCamera(LPCTSTR lpcszDevfriendlyName)
  2456. {
  2457. CSimpleStringA strRetrievedName(true);
  2458. CSimpleStringA strRootName(true);
  2459. bool bRet = FindEwsCameraName(strRetrievedName, m_strEwsRecordName);
  2460. if (bRet) {
  2461. if (strRetrievedName.Compare(lpcszDevfriendlyName, true) == 0) {
  2462. return true;
  2463. }
  2464. }
  2465. return false;
  2466. }