ContactlessFSM.cpp 46 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523
  1. #include "stdafx.h"
  2. #include "ContactlessFSM.h"
  3. #include "EventCode.h"
  4. #include "ContactlessCard_msg_g.h"
  5. #include "ModuleMix.h"
  6. #include "ContactlessCard_UserErrorCode.h"
  7. #include "CommDevEntityErrorCode.h"
  8. #include <map>
  9. #include "publicFunExport.h"
  10. #ifdef RVC_OS_WIN
  11. #else
  12. #include <dlfcn.h>
  13. #endif //RVC_OS_WIN
  14. const int GET_DEV_STATUS_COUNT = 3;
  15. const int MAX_RESET_TIMES_PERIOD = 1000;//oiltest configure to ini file?
  16. const int MAX_RESET_TIMEROUT = 5000;
  17. const int WAIT_TRY_NUM = 120;
  18. const int WAIT_INTERVAL = 500;
  19. const int ACCEPT_TRY_INTERVAL = 500;
  20. const int ACCEPT_TRY_NUM = 110; // 500*110=55 seconds
  21. const int READ_TRY_NUM = 1;//oiltest
  22. const int INIT_TRY_NUM = 3;
  23. class CContactlessCardEntity;
  24. void CContactlessCardFSM::s0_on_entry()
  25. {
  26. LOG_FUNCTION();
  27. m_eDevState = DEVICE_STATUS_NOT_READY;
  28. FSMEvent *e = new FSMEvent(USER_EVT_INIT);
  29. PostEventFIFO(e);
  30. }
  31. void CContactlessCardFSM::s0_on_exit()
  32. {
  33. LOG_FUNCTION();
  34. }
  35. unsigned int CContactlessCardFSM::s0_on_event(FSMEvent* e)
  36. {
  37. LOG_FUNCTION();
  38. if (e->iEvt == USER_EVT_INIT) {
  39. InitTask* task = new InitTask(this);
  40. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  41. e->SetHandled();
  42. return 0;
  43. }else if (e->iEvt == USER_EVT_QUIT) {
  44. e->SetHandled();
  45. return 0;
  46. }
  47. return 0;
  48. }
  49. void CContactlessCardFSM::s1_on_entry()
  50. {
  51. LOG_FUNCTION();
  52. }
  53. void CContactlessCardFSM::s1_on_exit()
  54. {
  55. LOG_FUNCTION();
  56. }
  57. unsigned int CContactlessCardFSM::s1_on_event(FSMEvent* event)
  58. {
  59. LOG_FUNCTION();
  60. if (event->iEvt == USER_EVT_INITFINISHED) {
  61. event->SetHandled();
  62. int err = event->param1;
  63. if (err == 0) {
  64. return 0;
  65. } else {
  66. return 1;
  67. }
  68. }else if (event->iEvt == USER_EVT_QUIT) {
  69. event->SetHandled();
  70. return 0;
  71. }
  72. return 0;
  73. }
  74. //Idle
  75. void CContactlessCardFSM::s2_on_entry()
  76. {
  77. LOG_FUNCTION();
  78. m_eDevState = DEVICE_STATUS_NORMAL;
  79. m_resetTimes = 0;
  80. m_testResult = Error_Succeed;
  81. ToLogWarnInfoAboutTermCustom();
  82. }
  83. void CContactlessCardFSM::s2_on_exit()
  84. {
  85. LOG_FUNCTION();
  86. }
  87. unsigned int CContactlessCardFSM::s2_on_event(FSMEvent* pEvt)
  88. {
  89. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s2 evt(%d)",pEvt->iEvt);
  90. int ret = 0;
  91. switch(pEvt->iEvt)
  92. {
  93. case USER_EVT_ACCEPT:
  94. {
  95. CardAcceptEvent *cae = dynamic_cast<CardAcceptEvent*>(pEvt);
  96. m_bCancelAccept = false;
  97. AcceptTask* task = new AcceptTask(this);
  98. task->ctx = cae->ctx;
  99. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  100. pEvt->SetHandled();
  101. }
  102. break;
  103. case USER_EVT_QUERY_CARD_INFO:
  104. {
  105. pEvt->SetHandled();
  106. QueryCardInfoEvent *pQCIE = dynamic_cast<QueryCardInfoEvent*>(pEvt);
  107. QueryCardInfoTask* task = new QueryCardInfoTask(this);
  108. task->ctx = pQCIE->ctx;
  109. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  110. return 0;
  111. }
  112. case USER_EVT_EJECT:
  113. {
  114. CardEjectEvent *cee;
  115. if (pEvt->iEvt == USER_EVT_EJECT)
  116. cee = dynamic_cast<CardEjectEvent*>(pEvt);
  117. EjectTask *task= new EjectTask(this);
  118. if (pEvt->iEvt == USER_EVT_EJECT)
  119. task->ctx = cee->ctx;
  120. else
  121. task->ctx = NULL;
  122. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  123. pEvt->SetHandled();
  124. return 0;
  125. }
  126. case USER_EVT_EXIT:
  127. m_bExit = true;
  128. pEvt->SetHandled();
  129. break;
  130. case USER_EVT_QUIT:
  131. pEvt->SetHandled();
  132. break;
  133. default:
  134. break;
  135. }
  136. return ret;
  137. }
  138. //accepting
  139. void CContactlessCardFSM::s3_on_entry()
  140. {
  141. LOG_FUNCTION();
  142. }
  143. void CContactlessCardFSM::s3_on_exit()
  144. {
  145. LOG_FUNCTION();
  146. }
  147. unsigned int CContactlessCardFSM::s3_on_event(FSMEvent* pEvt)
  148. {
  149. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s3 evt (%d)(%d)",pEvt->iEvt,pEvt->param1);
  150. int ret = 0;
  151. switch(pEvt->iEvt)
  152. {
  153. case USER_EVT_ACCEPTFINISHED:
  154. {
  155. pEvt->SetHandled();
  156. switch(pEvt->param1)
  157. {
  158. case 0:
  159. case 1:
  160. case 2:
  161. case 3:
  162. case 4:
  163. ret = pEvt->param1;
  164. break;
  165. default:
  166. ret = 1;
  167. break;
  168. }
  169. }
  170. break;
  171. case USER_EVT_ACCEPT_CANCEL:
  172. m_bCancelAccept = true;
  173. pEvt->SetHandled();
  174. ret = 3;
  175. break;
  176. case USER_EVT_QUERY_CARD_INFO:
  177. {
  178. pEvt->SetHandled();
  179. QueryCardInfoEvent *pQCIE = dynamic_cast<QueryCardInfoEvent*>(pEvt);
  180. QueryCardInfoTask* task = new QueryCardInfoTask(this);
  181. task->ctx = pQCIE->ctx;
  182. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  183. return 0;
  184. }
  185. case USER_EVT_EXIT:
  186. m_bExit = true;
  187. pEvt->SetHandled();
  188. break;
  189. case USER_EVT_QUIT:
  190. pEvt->SetHandled();
  191. break;
  192. default:
  193. break;
  194. }
  195. return ret;
  196. }
  197. //Hold
  198. void CContactlessCardFSM::s4_on_entry()
  199. {
  200. LOG_FUNCTION();
  201. }
  202. void CContactlessCardFSM::s4_on_exit()
  203. {
  204. LOG_FUNCTION();
  205. }
  206. unsigned int CContactlessCardFSM::s4_on_event(FSMEvent* pEvt)
  207. {
  208. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s4 evt(%d,%d)",pEvt->iEvt,pEvt->param1);
  209. switch(pEvt->iEvt){
  210. case USER_EVT_ACCEPT:
  211. {
  212. CardAcceptEvent *cae = dynamic_cast<CardAcceptEvent*>(pEvt);
  213. m_bCancelAccept = false;
  214. AcceptTask* task = new AcceptTask(this);
  215. task->ctx = cae->ctx;
  216. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  217. pEvt->SetHandled();
  218. }
  219. break;
  220. case USER_EVT_PREONLINE:
  221. {
  222. PreOnlineEvent* poe = dynamic_cast<PreOnlineEvent*>(pEvt);
  223. PreOnlineTask* task = new PreOnlineTask(this);
  224. task->ctx = poe->ctx;
  225. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  226. pEvt->SetHandled();
  227. return 0;
  228. }
  229. case USER_EVT_POSTONLINE:
  230. {
  231. PostOnlineEvent* poe = dynamic_cast<PostOnlineEvent*>(pEvt);
  232. PostOnlineTask* task = new PostOnlineTask(this);
  233. task->ctx = poe->ctx;
  234. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  235. pEvt->SetHandled();
  236. return 0;
  237. }
  238. case USER_EVT_EXIT:
  239. case USER_EVT_EJECT:
  240. {
  241. pEvt->SetHandled();
  242. CardEjectEvent *cee;
  243. if (pEvt->iEvt == USER_EVT_EJECT)
  244. cee = dynamic_cast<CardEjectEvent*>(pEvt);
  245. EjectTask *task= new EjectTask(this);
  246. if (pEvt->iEvt == USER_EVT_EJECT)
  247. task->ctx = cee->ctx;
  248. else
  249. task->ctx = NULL;
  250. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  251. return 0;
  252. }
  253. case USER_EVT_QUERY_CARD_INFO:
  254. {
  255. pEvt->SetHandled();
  256. QueryCardInfoEvent *pQCIE = dynamic_cast<QueryCardInfoEvent*>(pEvt);
  257. QueryCardInfoTask* task = new QueryCardInfoTask(this);
  258. task->ctx = pQCIE->ctx;
  259. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  260. return 0;
  261. }
  262. case USER_EVT_QUERY_CARD_INFO_FINISHED:
  263. {
  264. pEvt->SetHandled();
  265. if (pEvt->param1 == 0)
  266. return 0;
  267. else
  268. return 1;
  269. }
  270. case USER_EVT_QUIT:
  271. {
  272. pEvt->SetHandled();
  273. return 0;
  274. }
  275. case USER_EVT_ACCEPT_CANCEL:
  276. m_bCancelAccept = true;
  277. pEvt->SetHandled();
  278. default:
  279. break;
  280. }
  281. return 0;
  282. }
  283. //Reading
  284. void CContactlessCardFSM::s5_on_entry()
  285. {
  286. LOG_FUNCTION();
  287. }
  288. void CContactlessCardFSM::s5_on_exit()
  289. {
  290. LOG_FUNCTION();
  291. }
  292. unsigned int CContactlessCardFSM::s5_on_event(FSMEvent* pEvt)
  293. {
  294. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s5 event(%d)",pEvt->iEvt);
  295. switch(pEvt->iEvt)
  296. {
  297. case USER_EVT_EXIT:
  298. {
  299. EjectTask *task= new EjectTask(this);
  300. task->ctx = NULL;
  301. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  302. pEvt->SetHandled();
  303. return 0;
  304. }
  305. break;
  306. case USER_EVT_QUIT:
  307. {
  308. pEvt->SetHandled();
  309. return 0;
  310. }
  311. default:
  312. break;
  313. }
  314. return 0;
  315. }
  316. //Ejecting
  317. void CContactlessCardFSM::s6_on_entry()
  318. {
  319. LOG_FUNCTION();
  320. }
  321. void CContactlessCardFSM::s6_on_exit()
  322. {
  323. LOG_FUNCTION();
  324. }
  325. unsigned int CContactlessCardFSM::s6_on_event(FSMEvent* pEvt)
  326. {
  327. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s6 evt(%d,%d)",pEvt->iEvt,pEvt->param1);
  328. int ret = 0;
  329. switch(pEvt->iEvt)
  330. {
  331. case USER_EVT_EJECTFINISHED:
  332. pEvt->SetHandled();
  333. ret = pEvt->param1;
  334. break;
  335. case USER_EVT_QUIT:
  336. case USER_EVT_EXIT:
  337. pEvt->SetHandled();
  338. break;
  339. default:
  340. break;
  341. }
  342. return ret;
  343. }
  344. void CContactlessCardFSM::s7_on_entry()
  345. {
  346. LOG_FUNCTION();
  347. WaitFetchingTask* task = new WaitFetchingTask(this);
  348. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  349. }
  350. void CContactlessCardFSM::s7_on_exit()
  351. {
  352. LOG_FUNCTION();
  353. }
  354. unsigned int CContactlessCardFSM::s7_on_event(FSMEvent* pEvt)
  355. {
  356. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s7 evt(%d)",pEvt->iEvt);
  357. switch(pEvt->iEvt)
  358. {
  359. case USER_EVT_WAITFINISHED:
  360. {
  361. pEvt->SetHandled();
  362. if (pEvt->param1 == 0) {
  363. FetchCard evt;
  364. evt.status = 0;
  365. SpSendBroadcast(m_pEntity->GetFunction(),SP_MSG_OF(FetchCard),SP_MSG_SIG_OF(FetchCard),evt);
  366. LogEvent(Severity_Middle,LOG_EVT_CONTACTLESS_CARD_OP,"CardIssuer op.");
  367. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("客户取走卡片msg发送");
  368. return 0;
  369. } else if (pEvt->param1 == 1) {
  370. //FetchCard evt;
  371. //evt.status = 1;
  372. //SpSendBroadcast(m_pEntity->GetFunction(),SP_MSG_OF(FetchCard),SP_MSG_SIG_OF(FetchCard),evt);
  373. //Dbg("取卡时设备故障");
  374. //return 1;
  375. } else {
  376. FetchCard evt;
  377. evt.status = 2;
  378. SpSendBroadcast(m_pEntity->GetFunction(),SP_MSG_OF(FetchCard),SP_MSG_SIG_OF(FetchCard),evt);
  379. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("客户未取卡超时msg发送");
  380. LogWarn(Severity_Middle, Error_NotInit, ContactlessCard_UserErrorCode_FORGET_FETCH, "Customer forget fetch card.");
  381. return 2;
  382. }
  383. }
  384. case USER_EVT_QUERY_CARD_INFO:
  385. {
  386. pEvt->SetHandled();
  387. QueryCardInfoEvent *pQCIE = dynamic_cast<QueryCardInfoEvent*>(pEvt);
  388. QueryCardInfoTask* task = new QueryCardInfoTask(this);
  389. task->ctx = pQCIE->ctx;
  390. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  391. return 0;
  392. }
  393. case USER_EVT_QUIT:
  394. {
  395. pEvt->SetHandled();
  396. return 0;
  397. }
  398. default:
  399. break;
  400. }
  401. return 0;
  402. }
  403. //capture
  404. void CContactlessCardFSM::s8_on_entry()
  405. {
  406. LOG_FUNCTION();
  407. }
  408. void CContactlessCardFSM::s8_on_exit()
  409. {
  410. LOG_FUNCTION();
  411. }
  412. unsigned int CContactlessCardFSM::s8_on_event(FSMEvent* pEvt)
  413. {
  414. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s8 evt(%d)",pEvt->iEvt);
  415. if (pEvt->iEvt == USER_EVT_CAPTUREFINISHED){
  416. pEvt->SetHandled();
  417. int err = pEvt->param1;
  418. if (err == 0)
  419. return 0;
  420. else
  421. return 1;
  422. }else if (pEvt->iEvt == USER_EVT_QUIT) {
  423. pEvt->SetHandled();
  424. return 0;
  425. }
  426. return 0;
  427. }
  428. void CContactlessCardFSM::s9_on_entry()
  429. {
  430. LOG_FUNCTION();
  431. m_eDevState = DEVICE_STATUS_FAULT;
  432. FSMEvent *e = new FSMEvent(USER_EVT_RESET);
  433. PostEventFIFO(e);
  434. }
  435. void CContactlessCardFSM::s9_on_exit()
  436. {
  437. LOG_FUNCTION();
  438. }
  439. unsigned int CContactlessCardFSM::s9_on_event(FSMEvent* pEvt)
  440. {
  441. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s9 evt(%d)(%d)",pEvt->iEvt, pEvt->param1);
  442. switch(pEvt->iEvt)
  443. {
  444. case USER_EVT_RESET:
  445. {
  446. pEvt->SetHandled();
  447. m_resetTimes++;
  448. if (m_resetTimes > MAX_RESET_TIMES_PERIOD)
  449. {
  450. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("restart tried %d times,give up",m_resetTimes);
  451. m_testResult = Error_InvalidState;
  452. LogWarn(Severity_Middle,Error_Unexpect, ContactlessCard_UserErrorCode_Reset_Failed,"reset failed more times");
  453. return 0;
  454. }
  455. ResetDeviceEvent* rde = dynamic_cast<ResetDeviceEvent*>(pEvt);
  456. ResetTask* task = new ResetTask(this);
  457. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  458. return 0;
  459. }
  460. break;
  461. case USER_EVT_RESETFINISHED:
  462. {
  463. ResetFinishedEvent *rfe = dynamic_cast<ResetFinishedEvent*>(pEvt);
  464. return rfe->param1;
  465. }
  466. case USER_EVT_QUERY_CARD_INFO:
  467. {
  468. pEvt->SetHandled();
  469. QueryCardInfoEvent *pQCIE = dynamic_cast<QueryCardInfoEvent*>(pEvt);
  470. QueryCardInfoTask* task = new QueryCardInfoTask(this);
  471. task->ctx = pQCIE->ctx;
  472. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  473. return 0;
  474. }
  475. case USER_EVT_QUIT:
  476. pEvt->SetHandled();
  477. return 0;
  478. case USER_EVT_ACCEPT_CANCEL:
  479. m_bCancelAccept = true;
  480. pEvt->SetHandled();
  481. break;
  482. default:
  483. break;
  484. }
  485. return 0;
  486. }
  487. ErrorCodeEnum CContactlessCardFSM::OnInit()
  488. {
  489. LOG_FUNCTION();
  490. auto pEntity = GET_DEV_ENTITY_BASE_POINTER();
  491. pEntity->InitializeVendorLogSwitch();
  492. FulfillAdapterInfoFrom(pEntity->vendorLibInfo);
  493. m_pCardProcess = new CCardProcess();
  494. if (m_pCardProcess == NULL)//almost no use...
  495. {
  496. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("create card process failed.");
  497. return Error_Resource;
  498. }
  499. CSystemStaticInfo sysInfo;
  500. m_csMachineType = "";
  501. GetEntityBase()->GetFunction()->GetSystemStaticInfo(sysInfo);
  502. m_csMachineType = sysInfo.strMachineType;
  503. m_bOpening = true;
  504. ErrorCodeEnum errCode = Load();
  505. if (errCode != Error_Succeed)
  506. {
  507. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Load failed(%d).",errCode);
  508. m_bOpening = false;
  509. return errCode;
  510. }
  511. devStatus.eMediaPos = CI_MEDIA_NOTPRESENT;
  512. m_bOpening = false;
  513. return Error_Succeed;
  514. }
  515. ErrorCodeEnum CContactlessCardFSM::OnExit()
  516. {
  517. LOG_FUNCTION();
  518. ErrorCodeEnum eExit;
  519. long l_beginTime, l_endTime;
  520. if (m_hDevHelper != nullptr)
  521. {
  522. l_beginTime = SP::Module::Comm::RVCGetTickCount();
  523. eExit = m_hDevHelper->GetDevStatus(devStatus);
  524. l_endTime = SP::Module::Comm::RVCGetTickCount();
  525. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("OnExit::GetDevStatus eMedia:%d, eErr:%d", devStatus.eMediaPos, eExit);
  526. if (eExit == Error_Succeed)
  527. {
  528. if (devStatus.eMediaPos == CI_MEDIA_PRESENT){
  529. }
  530. }
  531. l_beginTime = SP::Module::Comm::RVCGetTickCount();
  532. eExit = m_hDevHelper->DevClose();
  533. l_endTime = SP::Module::Comm::RVCGetTickCount();
  534. if (eExit == Error_Succeed) {
  535. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DevClose").setCostTime(l_endTime - l_beginTime)("读卡器关闭成功");
  536. }
  537. else{
  538. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("读卡器关闭失败");
  539. SetErrorAndLog(eExit, MEC_DEVAPI_RF_DevClose, "DevAdapter::DevClose", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
  540. }
  541. }
  542. FSMImpl<CContactlessCardFSM>::OnExit();
  543. return Error_Succeed;
  544. }
  545. ErrorCodeEnum CContactlessCardFSM::Load()
  546. {
  547. LOG_FUNCTION();
  548. ErrorCodeEnum hr;
  549. long l_beginTime, l_endTime;
  550. int initTries = 0;
  551. ErrorCodeEnum eErrDev = Error_Unexpect;
  552. CSimpleString errMsg(true);
  553. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  554. CSmartPointer<IConfigInfo> spConfig;
  555. CSimpleStringA csBinPath,csBackslash("\\");
  556. ErrorCodeEnum eErrPath = GetEntityBase()->GetFunction()->GetPath("Bin", csBinPath);
  557. if (eErrPath != Error_Succeed)
  558. {
  559. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Load, GetBasePath failed (%d).",eErrPath);
  560. return Error_Param;
  561. }
  562. LogWarn(Severity_Low, Error_Unexpect, ContactlessCard_UserErrorCode_RootInfo, m_adapterInfo.adapterFilePath.GetData());
  563. if (Error_Succeed != LoadUpAdapterLibrary()) {
  564. errMsg = "非接读卡器加载厂商适配器失败!请检查root.ini配置是否正确。";
  565. LogWarn(Severity_Middle, Error_Unexpect, ContactlessCard_UserErrorCode_DllLoadFailed, errMsg.GetData());
  566. return Error_DevLoadFileFailed;
  567. }
  568. do{
  569. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("open card issuer, port:%d, baudRate:%d", m_adapterInfo.GetPortInt(), m_adapterInfo.GetBaudrateInt());
  570. l_beginTime = SP::Module::Comm::RVCGetTickCount();
  571. hr = m_hDevHelper->DevOpen(m_adapterInfo.GetPortInt(), m_adapterInfo.GetBaudrateInt());
  572. l_endTime = SP::Module::Comm::RVCGetTickCount();
  573. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("port:%d, baudRate:%d, hr:%d",m_adapterInfo.GetPortInt(), m_adapterInfo.GetBaudrateInt(), hr);
  574. if (hr == Error_Succeed)
  575. {
  576. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DevOpen").setCostTime(l_endTime - l_beginTime)("ContactlessCard DevOpen succ , dwPort:%d, dwBaudRate:%d", m_adapterInfo.GetPortInt(), m_adapterInfo.GetBaudrateInt());
  577. ToLogRootINIInfo();
  578. m_bOpened = true;
  579. ZeroMemory(m_devCatInfo.szModel, sizeof(m_devCatInfo.szModel));
  580. ZeroMemory(m_devCatInfo.szType, sizeof(m_devCatInfo.szType));
  581. ZeroMemory(m_devCatInfo.szVendor, sizeof(m_devCatInfo.szVendor));
  582. l_beginTime = SP::Module::Comm::RVCGetTickCount();
  583. eErrDev = m_hDevHelper->GetDevCategory(m_devCatInfo);
  584. l_endTime = SP::Module::Comm::RVCGetTickCount();
  585. if(eErrDev == Error_Succeed)
  586. {
  587. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetDevCategory").setCostTime(l_endTime - l_beginTime)("OpenDevice, szVendor:%s, szType:%s, szModel:%s",m_devCatInfo.szVendor, m_devCatInfo.szType, m_devCatInfo.szModel);
  588. m_adapterInfo.FulfillCategoryInfo(m_devCatInfo);
  589. }
  590. else
  591. {
  592. SetErrorAndLog(eErrDev, MEC_DEVAPI_RF_GetDevCategory, "DevAdapter::GetDevCategory", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
  593. return Error_DevCommFailed;
  594. }
  595. //#ifdef RVC_OS_WIN
  596. // CSimpleStringA csCMBPrint("CMBPrint.dll");
  597. // csCMBPrint = csBinPath + csBackslash + csCMBPrint;
  598. // DbgInfo(CSimpleStringA::Format("cmbpath %s", (LPCTSTR)csCMBPrint));
  599. // HMODULE hr = LoadLibraryA(csCMBPrint);
  600. // if (hr == NULL)
  601. // {
  602. // DbgWarn(CSimpleStringA::Format("Load CMBPrint failed(%d).", hr));
  603. // return Error_DevLoadFileFailed;
  604. // }
  605. // if ((cmdDecodeMag2 = (lpCMBdecodeMag2)GetProcAddress(hr, "CMBdecodeMag2")) == NULL)
  606. // {
  607. // DbgWarn("Get Mag2 address failed.");
  608. // return Error_DevLoadFileFailed;
  609. // }
  610. // if ((cmdDecodeEx = (lpCMBdecodeEx)GetProcAddress(hr, "CMBdecodeEx")) == NULL)
  611. // {
  612. // DbgWarn("Get Mag23Ex address failed.");
  613. // return Error_DevLoadFileFailed;
  614. // }
  615. // initTries = 0;
  616. // break;
  617. //#else
  618. // CSimpleStringA csCMBPrint("libCMBPrint.so");
  619. // csCMBPrint = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s",
  620. // csBinPath.GetData(), csCMBPrint.GetData());
  621. // DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("cmbpath %s", csCMBPrint.GetData());
  622. //
  623. // toolkit_lib_t dlOpen;
  624. // int res = toolkit_dlopen(csCMBPrint, &dlOpen);
  625. // if (res != 0) {
  626. // DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("Load CMBPrint failed with error %s.", toolkit_dlerror(&dlOpen));
  627. // return Error_DevLoadFileFailed;
  628. // }
  629. //
  630. // if ((res = toolkit_dlsym(&dlOpen, "CMBdecodeMag2", (void**)&cmdDecodeMag2)) != 0) {
  631. // DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("Get Mag2 address failed.");
  632. // return Error_DevLoadFileFailed;
  633. // }
  634. //
  635. // if ((res = toolkit_dlsym(&dlOpen, "CMBdecodeEx", (void**)&cmdDecodeEx)) != 0) {
  636. // DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("Get Mag23Ex address failed.");
  637. // return Error_DevLoadFileFailed;
  638. // }
  639. //
  640. // initTries = 0;
  641. // break;
  642. //#endif // RVC_OS_WIN
  643. if (!LoadCMBPrint(csBinPath))
  644. {
  645. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Contactless 启动失败:Load CMBPrint failed.");
  646. //LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_LoadLibraryA_CMBPrint_Failed, errMsg.GetData());
  647. return Error_DevLoadFileFailed;
  648. }
  649. initTries = 0;
  650. break;
  651. } else {
  652. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("ContactlessCard DevOpen failed , dwPort:%d, dwBaudRate:%d", m_adapterInfo.GetPortInt(), m_adapterInfo.GetBaudrateInt());
  653. SetErrorAndLog(hr, MEC_DEVAPI_RF_DevOpen, "DevAdapter::DevOpen", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
  654. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("ContactlessCard 启动失败:DevOpen failed.重试:%d", initTries);
  655. initTries++;
  656. }
  657. } while (initTries < INIT_TRY_NUM);
  658. if (initTries != 0)
  659. {
  660. if (m_bOpened) {
  661. m_hDevHelper->DevClose();
  662. m_bOpened = false;
  663. }
  664. errMsg = CSimpleStringA::Format("非接读卡器启动失败,have tried %d times!!!", initTries);
  665. LogWarn(Severity_Middle, Error_Unexpect, ContactlessCard_UserErrorCode_DevOpen_Failed, errMsg.GetData());
  666. return Error_DevCommFailed;
  667. }
  668. else
  669. {
  670. eErrDev = spEntityFunction->OpenConfig(Config_Run, spConfig);
  671. if (eErrDev != Error_Succeed) {
  672. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Load, open run cfg file failed!");
  673. return eErrDev;
  674. }
  675. int ret = 0,isIssue = 0;
  676. if ((spConfig->ReadConfigValueInt("RunInfo","CardRemains",m_CardRemains) == Error_Succeed)
  677. && (spConfig->ReadConfigValueInt("RunInfo","CardIssued",m_CardIssued) == Error_Succeed)
  678. && (spConfig->ReadConfigValueInt("RunInfo","CardCaptured",m_CardCaptured) == Error_Succeed)
  679. && (spConfig->ReadConfigValueInt("RunInfo","IsIssue",isIssue) == Error_Succeed)
  680. && (spConfig->ReadConfigValueInt("RunInfo","CardMixed",m_CardMixed) == Error_Succeed)
  681. && (spConfig->ReadConfigValueInt("RunInfo","CardInit",m_CardInit) == Error_Succeed)
  682. && (spConfig->ReadConfigValueInt("RunInfo","CardPercent",m_CardPercent) == Error_Succeed))
  683. {
  684. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CardRemains:%d, m_CardIssued:%d, CardCaptured:%d, isIssue:%d, CardMixed:%d, CardInit:%d",
  685. m_CardRemains, m_CardIssued, m_CardCaptured, isIssue, m_CardMixed, m_CardInit);
  686. m_bIssued = !!(isIssue);
  687. //ret = UnAcceptCard();
  688. }
  689. else
  690. return Error_IO;
  691. if (ret == 0)
  692. {
  693. m_devInit = true;
  694. LogWarn(Severity_Low, Error_Unexpect, ContactlessCard_UserErrorCode_DevOpen_Success, "非接读卡器打开成功");
  695. return Error_Succeed;
  696. }
  697. else{
  698. LogWarn(Severity_Middle, Error_Unexpect, ContactlessCard_UserErrorCode_DevOpen_Failed, "非接读卡器打开失败1");
  699. return Error_Unexpect;
  700. }
  701. }
  702. }
  703. int CContactlessCardFSM::Initial()
  704. {
  705. return 0;
  706. }
  707. bool CContactlessCardFSM::GetDevStatus(bool bPrint)
  708. {
  709. int getDevInfoCount = 0;
  710. long l_beginTime, l_endTime;
  711. ErrorCodeEnum eErr;
  712. do{
  713. l_beginTime = SP::Module::Comm::RVCGetTickCount();
  714. eErr = m_hDevHelper->GetDevStatus(devStatus);
  715. l_endTime = SP::Module::Comm::RVCGetTickCount();
  716. if (bPrint)
  717. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetDevStatus eMedia:%d, eErr:%d", devStatus.eMediaPos, eErr);
  718. if (Error_Succeed == eErr) {
  719. return true;
  720. }
  721. else
  722. {
  723. DevErrorInfo devErrInfo;
  724. m_hDevHelper->GetLastErr(devErrInfo);
  725. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetDevStatus, errMsg:%s",devErrInfo.szErrMsg);
  726. getDevInfoCount++;
  727. Sleep(3000);
  728. }
  729. } while (getDevInfoCount < GET_DEV_STATUS_COUNT);
  730. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("getdevstatus to reset");
  731. eErr = m_hDevHelper->Reset();
  732. Sleep(MAX_RESET_TIMEROUT);
  733. if (eErr == Error_Succeed)
  734. {
  735. eErr = m_hDevHelper->GetDevStatus(devStatus);
  736. if (eErr == Error_Succeed && devStatus.eMediaPos == CI_MEDIA_PRESENT)
  737. {
  738. }
  739. }
  740. return false;
  741. }
  742. int CContactlessCardFSM::Reset()
  743. {
  744. LOG_FUNCTION();
  745. ErrorCodeEnum eErr;
  746. long l_beginTime, l_endTime;
  747. l_beginTime = SP::Module::Comm::RVCGetTickCount();
  748. eErr = m_hDevHelper->Reset();
  749. l_endTime = SP::Module::Comm::RVCGetTickCount();
  750. if (eErr == Error_Succeed)
  751. {
  752. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::Reset").setCostTime(l_endTime - l_beginTime)("Reset succ");
  753. l_beginTime = SP::Module::Comm::RVCGetTickCount();
  754. eErr = m_hDevHelper->GetDevStatus(devStatus);
  755. l_endTime = SP::Module::Comm::RVCGetTickCount();
  756. if (Error_Succeed == eErr)
  757. {
  758. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetDevStatus").setCostTime(l_endTime - l_beginTime)("Reset::GetDevStatus,eMedia:%d", devStatus.eMediaPos);
  759. return 0;
  760. }
  761. else{
  762. SetErrorAndLog(eErr, MEC_DEVAPI_RF_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
  763. return 2;
  764. }
  765. }
  766. else
  767. {
  768. SetErrorAndLog(eErr, MEC_DEVAPI_RF_Reset, "DevAdapter::Reset", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
  769. return 1;
  770. }
  771. }
  772. int CContactlessCardFSM::InternalAcceptCard()
  773. {
  774. LOG_FUNCTION();
  775. int acceptTries = 0, err = 0;
  776. m_bWaitingAccept = true;
  777. DWORD64 dwStart = SP::Module::Comm::RVCGetTickCount();
  778. DWORD64 dwEnd = dwStart;
  779. do {
  780. if (m_bExit) {
  781. m_bCancelAccept = true;
  782. break;
  783. }
  784. if (m_bCancelAccept) {
  785. err = 3;
  786. goto Err;
  787. }
  788. if (m_bWaitAccepteMore) {
  789. acceptTries = 0;
  790. m_bWaitAccepteMore = false;
  791. dwEnd = dwStart = SP::Module::Comm::RVCGetTickCount();
  792. }
  793. if (GetDevStatus(false)) {
  794. if (devStatus.eMediaPos == CI_MEDIA_RF) {
  795. LogEvent(Severity_Middle, LOG_EVT_CONTACTLESS_CARD_OP, "Contactless card op.");
  796. acceptTries = 0;
  797. goto Err;
  798. } else {
  799. acceptTries++;
  800. Sleep(ACCEPT_TRY_INTERVAL);
  801. }
  802. } else {
  803. err = 1;
  804. goto Err;
  805. }
  806. dwEnd = SP::Module::Comm::RVCGetTickCount();
  807. } while (dwEnd - dwStart <= 55 * 1000);
  808. err = 2;
  809. Err:
  810. m_bExit = false;
  811. m_bWaitingAccept = false;
  812. if (m_bCancelAccept && err != 1)
  813. {
  814. if (GetDevStatus())
  815. {
  816. if (devStatus.eMediaPos == CI_MEDIA_PRESENT)
  817. {
  818. err = 4;
  819. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("cancel eject......");
  820. }
  821. }
  822. else
  823. err = 2;
  824. }
  825. return err;
  826. }
  827. int FindHexCharPosition(LPBYTE data, BYTE hexChar, int len)
  828. {
  829. int notExist = -1,ret = 1,pos = 0;
  830. for (; pos < len; ++pos)
  831. {
  832. BYTE high = (*(data+pos))&0xf0;
  833. BYTE low = (*(data+pos))&0x0f;
  834. if ((high>>4) != hexChar)
  835. ret++;
  836. else
  837. return ret;
  838. if (low != hexChar)
  839. ret++;
  840. else
  841. return ret;
  842. }
  843. ret = notExist;
  844. return ret;
  845. }
  846. int CContactlessCardFSM::AcceptCard(SpReqAnsContext<ContactlessCardService_Insert_Req, ContactlessCardService_Insert_Ans>::Pointer ctx)
  847. {
  848. LOG_FUNCTION();
  849. long l_beginTime, l_endTime;
  850. ctx->Ans.ICType = 0;
  851. m_pCardProcess->DataInit();
  852. LogEvent(Severity_Middle,LOG_EVT_CONTACTLESS_CARD_GREEN_ON,"ContactCard green on");
  853. m_bWaitAccepteMore = false;
  854. int rc = InternalAcceptCard();
  855. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("InternalAcceptCard ret:%d", rc);
  856. LogEvent(Severity_Middle,LOG_EVT_CONTACTLESS_CARD_GREEN_OFF,"ContactCard green off");
  857. if (rc == 0) {
  858. //FSMSetIssueFlag(false);
  859. if (ctx != NULL)
  860. {
  861. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("insert error_succeed");
  862. //FetchCard evt;
  863. //evt.status = 3;//oilyang@20181210 用于通知CardIssuer取消插卡
  864. //SpSendBroadcast(m_pEntity->GetFunction(), SP_MSG_OF(FetchCard), SP_MSG_SIG_OF(FetchCard), evt);
  865. ctx->Ans.ICData = "";
  866. int activeCardType;
  867. //int retICData = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_RFIC, m_hDevHelper, "A000000333", activeCardType);
  868. //oilyang@20201014 add emv card support
  869. int retDetectAndRead = -1;
  870. if (!ctx->Req.aid.IsNullOrEmpty())
  871. {
  872. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("front business provide aid:[%s]",(const char*)ctx->Req.aid);
  873. CAutoArray<CSimpleStringA> aidReq;
  874. aidReq.Init(1);
  875. aidReq[0] = ctx->Req.aid;
  876. l_beginTime = SP::Module::Comm::RVCGetTickCount();
  877. retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_RFIC, m_hDevHelper, aidReq, activeCardType);
  878. l_endTime = SP::Module::Comm::RVCGetTickCount();
  879. }
  880. else {
  881. l_beginTime = SP::Module::Comm::RVCGetTickCount();
  882. retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_RFIC, m_hDevHelper, m_aidList, activeCardType);
  883. l_endTime = SP::Module::Comm::RVCGetTickCount();
  884. }
  885. if (retDetectAndRead < 0)
  886. {
  887. // -1和-2是上电或APDU交互失败,功能集循环调用
  888. if (retDetectAndRead == -1){
  889. if (!ctx->Req.reserved1.IsNullOrEmpty() && ctx->Req.reserved1.Compare("P") == 0) {
  890. SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_RF_ActiveContactlessICCard, "DevAdapter::ActiveContactlessICCard", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
  891. }
  892. ctx->Answer(Error_Interact, GetAlarmDEC());
  893. }
  894. else if (retDetectAndRead == -2){
  895. if (!ctx->Req.reserved1.IsNullOrEmpty() && ctx->Req.reserved1.Compare("P") == 0) {
  896. SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_RF_RFTypeABCommand, "DevAdapter::RFTypeABCommand", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
  897. }
  898. ctx->Answer(Error_Interact, GetAlarmDEC());
  899. }else if (retDetectAndRead == -3){
  900. if (!ctx->Req.reserved1.IsNullOrEmpty() && ctx->Req.reserved1.Compare("P") == 0) {
  901. SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_RF_RFTypeABCommand, "DevAdapter::RFTypeABCommand", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
  902. }
  903. ctx->Answer(Error_Interact, GetAlarmDEC());
  904. }
  905. return 2;
  906. }
  907. ctx->Ans.t2Account = ctx->Ans.ICData = "";
  908. ICData track2(false,0x57,0x00);
  909. ErrorCodeEnum eErr = Error_Unexpect;
  910. string t2ICAccount(""),t2ICCardSerial(""),t2ICCVC(""),t2ICTrack2(""),cardType;
  911. if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC,track2,false,0) == -1)
  912. {
  913. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("no track2 data in ic");
  914. l_beginTime = SP::Module::Comm::RVCGetTickCount();
  915. eErr = m_hDevHelper->HaltCard();
  916. l_endTime = SP::Module::Comm::RVCGetTickCount();
  917. if(Error_Succeed != eErr){
  918. if (!ctx->Req.reserved1.IsNullOrEmpty() && ctx->Req.reserved1.Compare("P") == 0) {
  919. SetErrorAndLog(eErr, MEC_DEVAPI_RF_HaltCard, "DevAdapter::HaltCard", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
  920. }
  921. }
  922. ctx->Answer(Error_Interact);//can't find track2,retry 20150128
  923. }
  924. else
  925. {
  926. int pos = FindHexCharPosition(track2.value, 0x0d, track2.lenth);
  927. char *pICTrack2 = new char[128];
  928. ZeroMemory(pICTrack2, 128);
  929. HexBuf2StrBuf(track2.value, &pICTrack2, track2.lenth);
  930. pICTrack2[37] = '\0';
  931. char *ddd = new char[128];
  932. memset(ddd, 0, 128);
  933. memcpy(ddd, pICTrack2, pos - 1);
  934. t2ICTrack2 = pICTrack2;
  935. t2ICAccount = (char*)ddd;//oiltest
  936. LogWarn(Severity_Low, Error_Succeed, ContactlessCard_UserErrorCode_ReadAccount, CSimpleStringA::Format("split pos:%d, card acount:%s,%s"
  937. , pos, t2ICAccount.substr(0, 6).c_str(), t2ICAccount.substr(t2ICAccount.length() - 4, 4).c_str()));
  938. ctx->Ans.ICData = ctx->Ans.t2Account = t2ICAccount.c_str();
  939. ctx->Ans.ICType = 4;
  940. ctx->Ans.status = 0;
  941. delete[]ddd;
  942. delete[]pICTrack2;
  943. //m_hDevHelper->DeactContactlessICCard();
  944. }
  945. ctx->Answer(Error_Succeed);
  946. }
  947. }
  948. else if(rc == 2)
  949. {
  950. if (ctx != NULL)
  951. ctx->Answer(Error_TimeOut);
  952. }
  953. else if(rc == 3 || rc == 4)
  954. {
  955. if (ctx != NULL)
  956. {
  957. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("insert cancel (%d)",rc);
  958. ctx->Answer(Error_Cancel);
  959. }
  960. }else
  961. {
  962. //oilyang@20221212
  963. //actully,we reach here only when calling GetDevStatus failed
  964. //we have ContactlessCard AND CardIssuer,no need to throw Error_Unexpect here
  965. if (ctx != NULL)
  966. ctx->Answer(Error_DevNotAvailable);
  967. }
  968. return rc;
  969. }
  970. static CSimpleStringA GetStrData(TrackInfo trackInfo)
  971. {
  972. //LOG_FUNCTION();
  973. CSimpleStringA strRet;
  974. switch (trackInfo.eStatus) {
  975. case CI_DATA_OK:
  976. strRet = (char*)trackInfo.data;
  977. break;
  978. case CI_DATA_INVALID:
  979. strRet = "无效数据";
  980. break;
  981. //case CI_DATA_MISSING:
  982. default:
  983. strRet = "数据丢失";
  984. }
  985. return strRet;
  986. }
  987. int CContactlessCardFSM::SplitTrack2(CSimpleStringA pTrack2,Track2Data &decodeData)
  988. {
  989. if (pTrack2.GetLength() == 0)
  990. return -1;
  991. int dataLen = strlen(pTrack2);
  992. switch(dataLen)
  993. {
  994. case 28:
  995. decodeData.t2Region = CSimpleString(pTrack2,4);
  996. decodeData.t2Account = pTrack2.SubString(4,8);
  997. decodeData.t2CardSerial = pTrack2.SubString(14,8);//oilyang for 8 onecard
  998. decodeData.t2CVC = pTrack2.SubString(22,6);
  999. decodeData.t2ExpireDate = "";
  1000. break;
  1001. case 31:
  1002. decodeData.t2Account = CSimpleString(pTrack2,16);
  1003. decodeData.t2CardSerial = pTrack2.SubString(16,1);
  1004. decodeData.t2CVC = pTrack2.SubString(17,6);
  1005. decodeData.t2Region = pTrack2.SubString(23,4);
  1006. decodeData.t2ExpireDate = pTrack2.SubString(27,4);
  1007. break;
  1008. case 25://AE Card
  1009. decodeData.t2Account = CSimpleString(pTrack2, 15);
  1010. decodeData.t2CardSerial = pTrack2.SubString(15, 1);
  1011. decodeData.t2CVC = pTrack2.SubString(16, 5);
  1012. decodeData.t2ExpireDate = pTrack2.SubString(21, 4);
  1013. decodeData.t2Region = "";
  1014. break;
  1015. case 38:
  1016. break;
  1017. default:
  1018. return -1;
  1019. }
  1020. decodeData.status = 0;
  1021. return 0;
  1022. }
  1023. int CContactlessCardFSM::PreOnline(SpReqAnsContext<ContactlessCardService_PreOnline_Req,ContactlessCardService_PreOnline_Ans>::Pointer ctx)
  1024. {
  1025. LOG_FUNCTION();
  1026. long l_beginTime, l_endTime;
  1027. m_pCardProcess->DataInit();
  1028. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PreOnline>, bus data[%s]", ctx->Req.businessData.GetData());
  1029. m_pCardProcess->SplitBusinessData(ctx->Req.businessData,ctx->Req.businessData.GetLength());
  1030. m_pCardProcess->SplitBusinessData("DF690101",strlen("DF690101"));
  1031. int activeCardType;
  1032. //oilyang@20201014 add emv card support
  1033. int retDetectAndRead = -1;
  1034. ICData aidFromBus(false, 0x4f, 0x00);
  1035. if (m_pCardProcess->FindTagValue(TAG_VECTOR_BUS, aidFromBus, false, 0) == -1)
  1036. {
  1037. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("the front BusinessData han't provide aid data.");
  1038. retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_RFIC, m_hDevHelper, m_aidList, activeCardType);
  1039. }
  1040. else {
  1041. char* pAIDTmp = new char[64];
  1042. memset(pAIDTmp, 0, 64);
  1043. HexBuf2StrBuf(aidFromBus.value, &pAIDTmp, aidFromBus.lenth);
  1044. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PreOnline>, the aid is[%s],len:%d .", pAIDTmp, strlen(pAIDTmp));
  1045. CAutoArray<CSimpleString> preAIDs;
  1046. preAIDs.Init(1);
  1047. preAIDs[0] = (CSimpleStringA)pAIDTmp;
  1048. l_beginTime = SP::Module::Comm::RVCGetTickCount();
  1049. retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_RFIC, m_hDevHelper, preAIDs, activeCardType);
  1050. l_endTime = SP::Module::Comm::RVCGetTickCount();
  1051. if (pAIDTmp != NULL)
  1052. delete[]pAIDTmp;
  1053. }
  1054. if (retDetectAndRead < 0)
  1055. {
  1056. // -1和-2是上电或APDU交互失败,功能集循环调用
  1057. if (retDetectAndRead == -1){
  1058. if (!ctx->Req.reserved1.IsNullOrEmpty() && ctx->Req.reserved1.Compare("P") == 0) {
  1059. SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_RF_ActiveContactlessICCard, "DevAdapter::ActiveContactlessICCard", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
  1060. }
  1061. ctx->Answer(Error_Interact, GetAlarmDEC());
  1062. }
  1063. else if (retDetectAndRead == -2){
  1064. if (!ctx->Req.reserved1.IsNullOrEmpty() && ctx->Req.reserved1.Compare("P") == 0) {
  1065. SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_RF_RFTypeABCommand, "DevAdapter::RFTypeABCommand", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
  1066. }
  1067. ctx->Answer(Error_Interact, GetAlarmDEC());
  1068. }else if (retDetectAndRead == -3){
  1069. if (!ctx->Req.reserved1.IsNullOrEmpty() && ctx->Req.reserved1.Compare("P") == 0) {
  1070. SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_RF_RFTypeABCommand, "DevAdapter::RFTypeABCommand", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
  1071. }
  1072. ctx->Answer(Error_Interact, GetAlarmDEC());
  1073. }
  1074. return 0;
  1075. }
  1076. //if (m_cardType == CI_CARDTYPE_IC)
  1077. //{
  1078. // ProcessRestrict();
  1079. // CardholderVerify();
  1080. m_pCardProcess->TermRiskManage();
  1081. CSimpleStringA taaResult;
  1082. BYTE bt9f27 = 0;
  1083. int retTAA = m_pCardProcess->TermActionAnalyze(CARD_MACHINE_RFIC,m_hDevHelper,taaResult,true,m_bCDA,bt9f27);
  1084. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("TermActionAnalyze %d",retTAA);
  1085. switch(retTAA)
  1086. {//to be added oiltest 20140929
  1087. case -1: //some data may be wrong
  1088. break;
  1089. case 1: //terminal trans
  1090. break;
  1091. case 2: //to do trans end "TransEnd"
  1092. break;
  1093. default:
  1094. break;
  1095. }
  1096. ctx->Ans.result = taaResult;
  1097. // Dbg("[%d,%d,%d,%d]",m_TVR[0],m_TVR[1],m_TVR[2],m_TVR[3]);
  1098. //}
  1099. if (ctx->Ans.result.GetLength() == 0)
  1100. {
  1101. ctx->Answer(Error_Succeed);
  1102. return 0;
  1103. }
  1104. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PreOnline>, term action analyze result[%s]",(const char*)ctx->Ans.result);
  1105. //char tmpResult[1024,]result[1024];
  1106. //ZeroMemory(tmpResult,sizeof(tmpResult));
  1107. //ZeroMemory(result,sizeof(result));
  1108. //memcpy(tmpResult,ctx->Ans.result,ctx->Ans.result.GetLength());
  1109. string tmpResult, actionType, result = "", baseICData = "";
  1110. tmpResult = ctx->Ans.result;
  1111. char *pSomeICData = new char[1024];
  1112. ZeroMemory(pSomeICData, 1024);
  1113. int lenRet = m_pCardProcess->ConstructARQCData(tmpResult.substr(6, 4).c_str(), m_pDataToARQC, pSomeICData);
  1114. baseICData = pSomeICData;
  1115. if (pSomeICData != NULL)
  1116. delete[]pSomeICData;
  1117. char arqcLen[8];
  1118. ZeroMemory(arqcLen,sizeof(arqcLen));
  1119. #ifdef RVC_OS_WIN
  1120. itoa(lenRet, arqcLen, 10);
  1121. #else
  1122. sprintf(arqcLen, "%d", lenRet);
  1123. #endif // RVC_OS_WIN
  1124. ICData appExpiryDate(false,0x5f,0x24);
  1125. if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC,appExpiryDate,false,0) == -1)
  1126. {
  1127. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("can't find expire date");
  1128. return 0;
  1129. }
  1130. char *pExpireDate = new char[12];
  1131. ZeroMemory(pExpireDate,12);
  1132. HexBuf2StrBuf(appExpiryDate.value,&pExpireDate,appExpiryDate.lenth);
  1133. ICData track2(false,0x57,0x00),ICCardSerial(false,0x5f,0x34);
  1134. ErrorCodeEnum eErr = Error_Unexpect;
  1135. string t2ICAccount(""),t2ICCardSerial(""),t2ICCVC(""),t2ICTrack2(""),cardType("0");
  1136. char *pICCardSerial = new char[4];
  1137. ZeroMemory(pICCardSerial,4);
  1138. if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC,ICCardSerial,false) == -1)
  1139. {
  1140. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("can't find card serial.");
  1141. }
  1142. else
  1143. {
  1144. HexBuf2StrBuf(ICCardSerial.value,&pICCardSerial,ICCardSerial.lenth);
  1145. }
  1146. if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC,track2,false,0) == -1)
  1147. {
  1148. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("no track2 data in ic");
  1149. }
  1150. else
  1151. {
  1152. int pos = FindHexCharPosition(track2.value,0x0d,track2.lenth);
  1153. char *pICTrack2 = new char[128];
  1154. ZeroMemory(pICTrack2,128);
  1155. HexBuf2StrBuf(track2.value,&pICTrack2,track2.lenth);
  1156. pICTrack2[37] = '\0';
  1157. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PreOnline>, split pos:%d", pos);
  1158. char *ddd = new char[40];
  1159. ZeroMemory(ddd,40);
  1160. memcpy(ddd,pICTrack2,pos-1);
  1161. char icTrack2Data[128];
  1162. ZeroMemory(icTrack2Data,sizeof(icTrack2Data));
  1163. Track2Data track2Data;
  1164. track2Data.status = 0;
  1165. track2Data.t2Account = "";
  1166. cmdDecodeMag2(pICTrack2,icTrack2Data);
  1167. if (SplitTrack2(icTrack2Data,track2Data) == 0)
  1168. {
  1169. t2ICAccount = track2Data.t2Account;
  1170. //t2ICCardSerial = track2Data.t2CardSerial;
  1171. t2ICCVC = track2Data.t2CVC;
  1172. t2ICTrack2 = pICTrack2;
  1173. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("done(ic).");
  1174. }
  1175. //}
  1176. if (strnicmp(track2Data.t2Account,ddd,strlen(ddd)))
  1177. {
  1178. t2ICCVC = "";
  1179. t2ICTrack2 = pICTrack2;
  1180. t2ICAccount = (char*)ddd;
  1181. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("contactless card countcount:%s,%s", t2ICAccount.substr(0, 6).c_str(), t2ICAccount.substr(t2ICAccount.length() - 4, 4).c_str());
  1182. }
  1183. t2ICCardSerial = pICCardSerial;
  1184. delete []ddd;
  1185. delete []pICTrack2;
  1186. }
  1187. //80 1e 80 0008 328ab54bfc986b85 07010103a0b000010a010000000000754048769000
  1188. if (m_pCardProcess->GetP1() == 0x1)
  1189. actionType = "ARQC";
  1190. else
  1191. actionType = "";
  1192. //【55域】
  1193. // 基本域:
  1194. // 9F26 8b 应用密文AC
  1195. // 9F27 1b 密文信息数据
  1196. // 9F10 max.32b 发卡行应用数据IAD
  1197. // 9F37 4b 不可预知数
  1198. // 9F36 2b 应用交易计数器ATC
  1199. // 95 5b 终端验证结果TVR
  1200. // 9A 3cn 交易日期(6位有效数字,YYMMDD)
  1201. // 9C 1cn 交易类型(2位有效数字)
  1202. // 9F02 6cn 授权金额(12位有效数字)
  1203. // 5F2A 2cn 交易货币代码(3位有效数字)
  1204. // 82 2b 应用交互特征AIP
  1205. // 9F1A 2cn 终端国家代码(3位有效数字)
  1206. // 9F03 6cn 其他金额(12位有效数字)
  1207. // 9F33 3b 终端性能 "E0C900"
  1208. // 可选域:
  1209. //添加9F26,9F27,9F10,9F33的数据
  1210. char *pCID = new char[4];
  1211. ZeroMemory(pCID, 4);
  1212. HexBuf2StrBuf(&bt9f27, &pCID, 1);
  1213. char *pIssueBankLen = new char[4];
  1214. ZeroMemory(pIssueBankLen, 4);
  1215. int len9f10 = tmpResult.length() - 26 - 4;
  1216. int lenHigh, lenLow;
  1217. len9f10 = len9f10 / 2;
  1218. lenHigh = len9f10 / 16;
  1219. lenLow = len9f10 % 16;
  1220. BYTE bt9f10;
  1221. bt9f10 = (lenHigh << 4) + lenLow;
  1222. HexBuf2StrBuf(&bt9f10, &pIssueBankLen, 1);
  1223. baseICData += "9F2608" + tmpResult.substr(10, 16) + "9F2701" + pCID + "9F10" + pIssueBankLen + tmpResult.substr(26, tmpResult.length() - 26 - 4) + "9F3303" + "E0C900";
  1224. result = "ACTION," + actionType + "|" + "ATCCODE," + tmpResult.substr(6, 4) + "|" + "ARQCCODE," + tmpResult.substr(10, 16) + "|"
  1225. + "MAC," + tmpResult.substr(26, tmpResult.length() - 26 - 4) + "|" + "ARQCSIZE," + string(arqcLen) + "|"
  1226. + "ARQCDATA," + m_pDataToARQC + "|EXPIREDATE," + pExpireDate + "|T2ACCOUNT," + t2ICAccount + "|T2CARDSERIAL," + t2ICCardSerial
  1227. + "|T2CVC," + t2ICCVC + "|T2TRACK2," + t2ICTrack2 + "|CARDCAT," + cardType + "|ICTAGS," + baseICData;
  1228. ctx->Ans.result = result.c_str();
  1229. string txtresult = "";
  1230. txtresult = "ACTION," + actionType + "|" + "ATCCODE," + tmpResult.substr(6, 4) + "|" + "ARQCCODE," + tmpResult.substr(10, 16) + "|"
  1231. + "MAC," + tmpResult.substr(26, tmpResult.length() - 26 - 4) + "|" + "ARQCSIZE," + string(arqcLen) + "|"
  1232. + "ARQCDATA," + m_pDataToARQC + "|T2ACCOUNT(F6)," + t2ICAccount.substr(0, 6) + "|T2ACCOUNT(L4)," + t2ICAccount.substr(t2ICAccount.length() - 4, 4)
  1233. + "|T2CARDSERIAL(len)," + t2ICCardSerial + "|CARDCAT," + cardType;
  1234. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("data to host(less)[%s],baseICData length:%d", txtresult.c_str(), baseICData.length());
  1235. if (m_pDataToARQC != NULL)
  1236. {
  1237. delete []m_pDataToARQC;
  1238. m_pDataToARQC = NULL;
  1239. }
  1240. ctx->Answer(Error_Succeed);
  1241. return 0;
  1242. }
  1243. int CContactlessCardFSM::PostOnline(SpReqAnsContext<ContactlessCardService_PostOnline_Req,ContactlessCardService_PostOnline_Ans>::Pointer ctx)
  1244. {
  1245. LOG_FUNCTION();
  1246. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("post online data[%s]",(LPCTSTR)ctx->Req.data);
  1247. m_pCardProcess->SplitOnlineReplyData(ctx->Req.data,strlen(ctx->Req.data));
  1248. int issBnkAuth = m_pCardProcess->IssueBankAuth(CARD_MACHINE_RFIC,m_hDevHelper);
  1249. CSimpleStringA csTransEnd;
  1250. if (issBnkAuth == 0)
  1251. {
  1252. int transEnd = m_pCardProcess->TransEnd(CARD_MACHINE_RFIC,m_hDevHelper,m_bCDA);
  1253. if (transEnd == 0)
  1254. csTransEnd = "TRANSEND,0";
  1255. else if (transEnd == 1)
  1256. csTransEnd = "TRANSEND,1";
  1257. }
  1258. else
  1259. csTransEnd = "TRANSEND,1";
  1260. ctx->Ans.result = csTransEnd;
  1261. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("PostOnline, issBnkAuth:%d, csTransEnd:%s", issBnkAuth, csTransEnd.GetData());
  1262. ctx->Answer(Error_Succeed);
  1263. return 0;
  1264. }
  1265. int CContactlessCardFSM::EjectCard(SpReqAnsContext<ContactlessCardService_Eject_Req,ContactlessCardService_Eject_Ans>::Pointer ctx)
  1266. {
  1267. LOG_FUNCTION();
  1268. m_pCardProcess->DataInit();
  1269. int ret = 0;
  1270. DWORD dwStart = SP::Module::Comm::RVCGetTickCount();
  1271. DWORD dwEnd = dwStart;
  1272. while(1)
  1273. {
  1274. if (m_bExit)
  1275. {
  1276. ret = 2;
  1277. break;
  1278. }
  1279. dwEnd = SP::Module::Comm::RVCGetTickCount();
  1280. if ((dwEnd-dwStart) > 58*1000)
  1281. {
  1282. ret = 2;
  1283. break;
  1284. }
  1285. ErrorCodeEnum eErr = m_hDevHelper->GetDevStatus(devStatus);
  1286. if (eErr == Error_Succeed)
  1287. {
  1288. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("EjectCard, devStatus.eMedia %d",devStatus.eMediaPos);
  1289. if (devStatus.eMediaPos == CI_MEDIA_RF || devStatus.eMediaPos == CI_MEDIA_NOTPRESENT)
  1290. {
  1291. if (devStatus.eMediaPos == CI_MEDIA_NOTPRESENT)
  1292. ret = 0;
  1293. else if (devStatus.eMediaPos == CI_MEDIA_RF)
  1294. ret = 1;
  1295. break;
  1296. }
  1297. }
  1298. Sleep(100);
  1299. }
  1300. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("eject return.");
  1301. if (ctx != NULL)
  1302. ctx->Answer(Error_Succeed);
  1303. return ret;
  1304. }
  1305. int CContactlessCardFSM::WaitFetchingCard()
  1306. {
  1307. LOG_FUNCTION();
  1308. int waitTries = 0;
  1309. LogEvent(Severity_Middle,LOG_EVT_CONTACTLESS_CARD_GREEN_ON,"ContactCard(fetch) warning on");
  1310. do {
  1311. if (GetDevStatus(false)){
  1312. if (devStatus.eMediaPos == CI_MEDIA_RF){
  1313. Sleep(WAIT_INTERVAL);
  1314. waitTries++;
  1315. }
  1316. else if (devStatus.eMediaPos == CI_MEDIA_NOTPRESENT){
  1317. waitTries = 0;
  1318. LogEvent(Severity_Middle,LOG_EVT_CONTACTLESS_CARD_GREEN_OFF,"ContactCard(fetch) warning off");
  1319. return 0;
  1320. }
  1321. }else
  1322. {
  1323. LogEvent(Severity_Middle,LOG_EVT_CONTACTLESS_CARD_GREEN_OFF,"ContactCard(fetch) warning off");
  1324. return 1;
  1325. }
  1326. }while (waitTries < WAIT_TRY_NUM);
  1327. LogEvent(Severity_Middle,LOG_EVT_CONTACTLESS_CARD_GREEN_OFF,"ContactCard(fetch) warning off");
  1328. return 2;
  1329. }
  1330. int CContactlessCardFSM::QueryCardInfo(SpReqAnsContext<ContactlessCardService_QueryCardInfo_Req, ContactlessCardService_QueryCardInfo_Ans>::Pointer ctx)
  1331. {
  1332. RFICReaderStatus devStatus;
  1333. long l_beginTime, l_endTime;
  1334. l_beginTime = SP::Module::Comm::RVCGetTickCount();
  1335. ErrorCodeEnum eErr = m_hDevHelper->GetDevStatus(devStatus);
  1336. l_endTime = SP::Module::Comm::RVCGetTickCount();
  1337. if (eErr != Error_Succeed)
  1338. {
  1339. SetErrorAndLog(eErr, MEC_DEVAPI_RF_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
  1340. ctx->Answer(TransECWithRepeat(Error_Unexpect));
  1341. return 1;
  1342. }
  1343. int ret = 0;
  1344. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetDevStatus").setCostTime(l_endTime - l_beginTime)("QueryCardInfo, eMedia pos:%d",devStatus.eMediaPos);
  1345. switch(devStatus.eMediaPos)
  1346. {
  1347. //case CI_MEDIA_IC:
  1348. // ret = 2;
  1349. // break;
  1350. //case CI_MEDIA_NOT_IC:
  1351. // ret = 3;
  1352. // break;
  1353. case CI_MEDIA_RF:
  1354. ret = 4;
  1355. break;
  1356. case CI_MEDIA_NOTPRESENT:
  1357. default:
  1358. ret = 0;
  1359. break;
  1360. }
  1361. ctx->Ans.position = ret;
  1362. ctx->Answer(Error_Succeed);
  1363. return ret;
  1364. }
  1365. void CContactlessCardFSM::ToLogWarnInfoAboutTermCustom()
  1366. {
  1367. LOG_FUNCTION();
  1368. ToLogWarnInfoAboutTerm();
  1369. }
  1370. bool CContactlessCardFSM::LoadCMBPrint(CSimpleStringA csBinPath)
  1371. {
  1372. if (cmdDecodeEx == NULL) {
  1373. CSimpleStringA csCMBPrint("");
  1374. #ifdef RVC_OS_WIN
  1375. csCMBPrint = "CMBPrint.dll";
  1376. csCMBPrint = csBinPath + SPLIT_SLASH_STR + csCMBPrint;
  1377. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("cmbpath %s", (const char*)csCMBPrint);
  1378. HMODULE hr = LoadLibraryA(csCMBPrint);
  1379. if (hr == NULL)
  1380. {
  1381. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Load CMBPrint failed(%d).", hr);
  1382. return false;
  1383. }
  1384. if ((cmdDecodeMag2 = (lpCMBdecodeMag2)GetProcAddress(hr, "CMBdecodeMag2")) == NULL)
  1385. {
  1386. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Get Mag2 address failed.");
  1387. return false;
  1388. }
  1389. if ((cmdDecodeEx = (lpCMBdecodeEx)GetProcAddress(hr, "CMBdecodeEx")) == NULL)
  1390. {
  1391. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Get Mag23Ex address failed.");
  1392. cmdDecodeMag2 = NULL;
  1393. return false;
  1394. }
  1395. #else
  1396. csCMBPrint = "libCMBPrint.so";
  1397. csCMBPrint = csBinPath + "/" + csCMBPrint;
  1398. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("cmbpath %s", (const char*)csCMBPrint);
  1399. void* hr = NULL;
  1400. hr = dlopen(csCMBPrint, RTLD_LAZY);
  1401. if (hr == NULL)
  1402. {
  1403. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Load CMBPrint failed(%s).", dlerror());
  1404. return false;
  1405. }
  1406. //pfunc_unpack = (PF_unpack)dlsym(hLib, "_Z6unpackPcS_i");
  1407. if ((cmdDecodeMag2 = (lpCMBdecodeMag2)dlsym(hr, "CMBdecodeMag2")) == NULL)
  1408. {
  1409. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Get Mag2 address failed.");
  1410. return false;
  1411. }
  1412. if ((cmdDecodeEx = (lpCMBdecodeEx)dlsym(hr, "CMBdecodeEx")) == NULL)
  1413. {
  1414. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Get Mag23Ex address failed.");
  1415. cmdDecodeMag2 = NULL;
  1416. return false;
  1417. }
  1418. #endif
  1419. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Load %s succ.", (const char*)csCMBPrint);
  1420. }
  1421. return true;
  1422. }
  1423. void CContactlessCardFSM::GetCardProcessLastErr(ErrorCodeEnum& eErrCode, CSimpleStringA& ApiName, CSimpleStringA& alarmMsg, CSimpleStringA& csErrMsgWithReturnCode)
  1424. {
  1425. if (m_pCardProcess == NULL) {
  1426. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetCardProcessLastErr m_pCardProcess is null");
  1427. eErrCode = Error_Null;
  1428. ApiName = "";
  1429. alarmMsg = "";
  1430. csErrMsgWithReturnCode = "";
  1431. return;
  1432. }
  1433. ErrorCodeEnum lastErrCode = Error_Succeed;
  1434. CSimpleStringA lastErrMsg = "";
  1435. CSimpleStringA lastApiName = "";
  1436. m_pCardProcess->getCardAssistLastErr(lastErrCode, lastErrMsg, lastApiName);
  1437. const CSimpleStringA alarmMsgStr = CSimpleStringA::Format("{\"Function\":\"%s\", \"DevApi\":\"%s\", \"ReturnCode\":\"%s\", \"Msg\":\"%s\", \"Context\":\"%s\"}"
  1438. , __FUNCTION__, lastApiName.GetData(), SpStrError(lastErrCode), lastErrMsg.GetData(), "");
  1439. std::map<std::string, std::string> msgInfo;
  1440. msgInfo["ReturnCode"] = SpStrError(lastErrCode);
  1441. msgInfo["ErrMsg"] = lastErrMsg.GetData();
  1442. msgInfo["Context"] = "";
  1443. std::pair<bool, std::string> strResult;
  1444. strResult = generateJsonStr(msgInfo);
  1445. CSimpleStringA csErrMsgWithReturnCodeStr = strResult.second.c_str();
  1446. eErrCode = lastErrCode;
  1447. ApiName = lastApiName;
  1448. alarmMsg = alarmMsgStr.GetData();
  1449. csErrMsgWithReturnCode = csErrMsgWithReturnCodeStr.GetData();
  1450. }