ContactlessFSM.cpp 34 KB

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