CardIssuerFSM.h 35 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169
  1. #ifndef __CARD_ISSUER_FSM_H
  2. #define __CARD_ISSUER_FSM_H
  3. #pragma once
  4. #include "SpFSM.h"
  5. #include "CardIssuerStand_server_g.h"
  6. //#include "GUIConsole_client_g.h"
  7. #include "HeartBeat_client_g.h"
  8. #include "AccessAuthorization_client_g.h"
  9. #include "DevFSMCommBase.hpp"
  10. #include "CardIssuerClass.h"
  11. #include "CardAssist.h"
  12. #include "ICDataElement.h"
  13. #include "IHttpFunc.h"
  14. #include "json/json.h"
  15. #define REFLECTION(var) #var
  16. using namespace CardIssuerStand;
  17. //using namespace GUIConsole;
  18. using namespace HeartBeat;
  19. using namespace AccessAuthorization;
  20. enum EvtType
  21. {
  22. USER_EVT_TEST = EVT_USER+1,
  23. USER_EVT_QUIT,
  24. USER_EVT_INIT,
  25. USER_EVT_INITFINISHED,
  26. USER_EVT_ACCEPT,
  27. USER_EVT_ACCEPT_CANCEL,
  28. USER_EVT_ACCEPTFINISHED,
  29. USER_EVT_ISSUE,
  30. USER_EVT_ISSUE_FINISHED,
  31. USER_EVT_EJECT,
  32. USER_EVT_CAPTURE,
  33. USER_EVT_EJECTFINISHED,
  34. USER_EVT_WAITFINISHED,
  35. USER_EVT_CAPTUREFINISHED,
  36. USER_EVT_WAITFETCHINGTIMEOUT,
  37. USER_EVT_PREONLINE,
  38. USER_EVT_POSTONLINE,
  39. USER_EVT_PREONLINEFINISHED,
  40. USER_EVT_POSTONLINEFINISHED,
  41. USER_EVT_RESET,
  42. USER_EVT_RESETFINISHED,
  43. USER_EVT_EXIT,
  44. USER_EVT_READ,
  45. USER_EVT_READ_FINISHED,
  46. USER_EVT_WRITE,
  47. USER_EVT_WRITE_FINISHED,
  48. USER_EVT_GET_MATERIAL_EX,
  49. USER_EVT_SET_MATERIAL_EX,
  50. USER_EVT_ISSUE_EX,
  51. USER_EVT_ISSUE_EX_FINISHED,
  52. USER_EVT_SAM_IC,
  53. USER_EVT_SAM_IC_FINISHED,
  54. USER_EVT_BACK_TO_INIT,
  55. };
  56. enum SAMICCommandType
  57. {
  58. //SAM
  59. SAMICCommand_SAM_Select = 0,
  60. SAMICCommand_SAM_Active,
  61. SAMICCommand_SAM_Deactivate,
  62. SAMICCommand_SAM_WarmReset,
  63. SAMICCommand_SAM_QueryStatus,
  64. SAMICCommand_SAM_Command,
  65. //IC
  66. SAMICCommand_IC_Active = 100,
  67. SAMICCommand_IC_Deactivate,
  68. SAMICCommand_IC_WarmReset,
  69. SAMICCommand_IC_Command,
  70. SAMICCommand_RFIC_Active,
  71. SAMICCommand_RFIC_Deactivate,
  72. SAMICCommand_RFIC_Command,
  73. };
  74. typedef int(*lpCMBdecodeMag2)(char* Mag2Data, char * data);
  75. typedef int(*lpCMBdecodeEx)( char* MagData, char * type, char * data);
  76. typedef int(__stdcall *pfEncryptDukptHSM)(unsigned char* EncryptedData, unsigned char* bdk, unsigned char* curksn, unsigned char* DecryptedData);
  77. typedef int(__stdcall *pfGetEncrypedData)(unsigned char* BDK, unsigned char* KSN, unsigned char*random, unsigned char* result);
  78. class CCardIssuerEntity;
  79. class CCardIssuerFSM;
  80. const int ONE_K = 1024;
  81. const int HOPPER_NUM = 12;
  82. struct Track2Data
  83. {
  84. int status;
  85. CSimpleStringA t2Account;
  86. CSimpleStringA t2Region;
  87. CSimpleStringA t2CardSerial;
  88. CSimpleStringA t2CVC;
  89. CSimpleStringA t2ExpireDate;
  90. };
  91. struct CMBBin
  92. {
  93. CSimpleStringA bin;//6 byte long
  94. bool bIC;//IC:true or mag:false
  95. bool bDC;//debit:true,credit:false
  96. };
  97. struct SCIRecord
  98. {
  99. CSimpleStringA name;
  100. CSimpleStringA remoteMac;
  101. };
  102. class CardInitFinishedEvent : public FSMEvent
  103. {
  104. public:
  105. CardInitFinishedEvent() : FSMEvent(USER_EVT_INITFINISHED){}
  106. ~CardInitFinishedEvent(){}
  107. SpReqAnsContext<CardIssuerStandService_Insert_Req,CardIssuerStandService_Insert_Ans>::Pointer ctx;
  108. protected:
  109. private:
  110. };
  111. class CardAcceptEvent : public FSMEvent
  112. {
  113. public:
  114. CardAcceptEvent() : FSMEvent(USER_EVT_ACCEPT) {}
  115. ~CardAcceptEvent() {}
  116. SpReqAnsContext<CardIssuerStandService_Insert_Req, CardIssuerStandService_Insert_Ans>::Pointer ctx;
  117. virtual void OnUnhandled()
  118. {
  119. if (ctx != NULL)
  120. {
  121. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("card accept unhandled");
  122. ctx->Answer(Error_InvalidState);
  123. }
  124. }
  125. };
  126. class CardIssueEvent : public FSMEvent
  127. {
  128. public:
  129. CardIssueEvent() : FSMEvent(USER_EVT_ISSUE) {}
  130. ~CardIssueEvent() {}
  131. SpReqAnsContext<CardIssuerStandService_Issue_Req, CardIssuerStandService_Issue_Ans>::Pointer ctx;
  132. virtual void OnUnhandled()
  133. {
  134. if (ctx != NULL)
  135. {
  136. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("card issue unhandled");
  137. ctx->Answer(Error_InvalidState);
  138. }
  139. }
  140. };
  141. class CancelAcceptEvent : public FSMEvent
  142. {
  143. public:
  144. CancelAcceptEvent() : FSMEvent(USER_EVT_ACCEPT_CANCEL) {}
  145. ~CancelAcceptEvent() {}
  146. virtual void OnUnhandled()
  147. {
  148. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("card cancel accept unhandled");
  149. }
  150. };
  151. class CardReadEvent : public FSMEvent
  152. {
  153. public:
  154. CardReadEvent() : FSMEvent(USER_EVT_READ) {}
  155. ~CardReadEvent() {}
  156. SpReqAnsContext<CardIssuerStandService_Read_Req, CardIssuerStandService_Read_Ans>::Pointer ctx;
  157. virtual void OnUnhandled()
  158. {
  159. if (ctx != NULL)
  160. {
  161. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("card read unhandled");
  162. ctx->Answer(Error_InvalidState);
  163. }
  164. }
  165. protected:
  166. private:
  167. };
  168. class CardReadFinishedEvent : public FSMEvent
  169. {
  170. public:
  171. CardReadFinishedEvent() : FSMEvent(USER_EVT_READ_FINISHED) {}
  172. ~CardReadFinishedEvent() {}
  173. SpReqAnsContext<CardIssuerStandService_Read_Req, CardIssuerStandService_Read_Ans>::Pointer ctx;
  174. virtual void OnUnhandled()
  175. {
  176. if (ctx != NULL)
  177. {
  178. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("card read unhandled(new)");
  179. }
  180. }
  181. protected:
  182. private:
  183. };
  184. class ResetDeviceEvent : public FSMEvent
  185. {
  186. public:
  187. ResetDeviceEvent() : FSMEvent(USER_EVT_RESET){}
  188. ~ResetDeviceEvent(){}
  189. protected:
  190. private:
  191. };
  192. class ResetFinishedEvent : public FSMEvent
  193. {
  194. public:
  195. ResetFinishedEvent() : FSMEvent(USER_EVT_RESETFINISHED){}
  196. ~ResetFinishedEvent(){}
  197. protected:
  198. private:
  199. };
  200. class PreOnlineEvent : public FSMEvent
  201. {
  202. public:
  203. PreOnlineEvent() : FSMEvent(USER_EVT_PREONLINE){}
  204. ~PreOnlineEvent(){}
  205. SpReqAnsContext<CardIssuerStandService_PreOnline_Req,CardIssuerStandService_PreOnline_Ans>::Pointer ctx;
  206. virtual void OnUnhandled()
  207. {
  208. if (ctx != NULL)
  209. ctx->Answer(Error_InvalidState);
  210. }
  211. protected:
  212. private:
  213. };
  214. class PostOnlineEvent : public FSMEvent
  215. {
  216. public:
  217. PostOnlineEvent() : FSMEvent(USER_EVT_POSTONLINE){}
  218. ~PostOnlineEvent(){}
  219. SpReqAnsContext<CardIssuerStandService_PostOnline_Req,CardIssuerStandService_PostOnline_Ans>::Pointer ctx;
  220. virtual void OnUnhandled()
  221. {
  222. if (ctx != NULL)
  223. ctx->Answer(Error_InvalidState);
  224. }
  225. protected:
  226. private:
  227. };
  228. class CardCaptureEvent : public FSMEvent
  229. {
  230. public:
  231. CardCaptureEvent() : FSMEvent(USER_EVT_CAPTURE){}
  232. ~CardCaptureEvent(){}
  233. SpReqAnsContext<CardIssuerStandService_Capture_Req,CardIssuerStandService_Capture_Ans>::Pointer ctx;
  234. virtual void OnUnhandled()
  235. {
  236. if (ctx != NULL)
  237. ctx->Answer(Error_InvalidState);
  238. }
  239. protected:
  240. private:
  241. };
  242. class CardEjectEvent : public FSMEvent
  243. {
  244. public:
  245. CardEjectEvent() : FSMEvent(USER_EVT_EJECT){}
  246. ~CardEjectEvent(){}
  247. SpReqAnsContext<CardIssuerStandService_Eject_Req,CardIssuerStandService_Eject_Ans>::Pointer ctx;
  248. virtual void OnUnhandled()
  249. {
  250. if (ctx != NULL)
  251. ctx->Answer(Error_InvalidState);
  252. }
  253. protected:
  254. private:
  255. };
  256. class CardWriteEvent : public FSMEvent
  257. {
  258. public:
  259. CardWriteEvent() : FSMEvent(USER_EVT_WRITE){}
  260. ~CardWriteEvent(){}
  261. SpReqAnsContext<CardIssuerStandService_WriteTrack_Req,CardIssuerStandService_WriteTrack_Ans>::Pointer ctx;
  262. virtual void OnUnhandled()
  263. {
  264. if (ctx != NULL)
  265. {
  266. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("card read unhandled");
  267. ctx->Answer(Error_InvalidState);
  268. }
  269. }
  270. protected:
  271. private:
  272. };
  273. class CardWriteFinishedEvent : public FSMEvent
  274. {
  275. public:
  276. CardWriteFinishedEvent() : FSMEvent(USER_EVT_WRITE_FINISHED){}
  277. ~CardWriteFinishedEvent(){}
  278. SpReqAnsContext<CardIssuerStandService_WriteTrack_Req,CardIssuerStandService_WriteTrack_Ans>::Pointer ctx;
  279. virtual void OnUnhandled()
  280. {
  281. if (ctx != NULL)
  282. {
  283. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("card read unhandled(new)");
  284. }
  285. }
  286. protected:
  287. private:
  288. };
  289. class GetMaterialExEvent : public FSMEvent
  290. {
  291. public:
  292. GetMaterialExEvent() : FSMEvent(USER_EVT_GET_MATERIAL_EX) {}
  293. ~GetMaterialExEvent() {}
  294. SpReqAnsContext<CardIssuerStandService_GetMaterialCountEx_Req, CardIssuerStandService_GetMaterialCountEx_Ans>::Pointer ctx;
  295. virtual void OnUnhandled()
  296. {
  297. if (ctx != NULL)
  298. ctx->Answer(Error_InvalidState);
  299. }
  300. protected:
  301. private:
  302. };
  303. class SetMaterialExEvent : public FSMEvent
  304. {
  305. public:
  306. SetMaterialExEvent() : FSMEvent(USER_EVT_SET_MATERIAL_EX){}
  307. ~SetMaterialExEvent(){}
  308. SpReqAnsContext<CardIssuerStandService_SetMaterialCountEx_Req, CardIssuerStandService_SetMaterialCountEx_Ans>::Pointer ctx;
  309. virtual void OnUnhandled()
  310. {
  311. if (ctx != NULL)
  312. ctx->Answer(Error_InvalidState);
  313. }
  314. protected:
  315. private:
  316. };
  317. class CardIssueExEvent : public FSMEvent
  318. {
  319. public:
  320. CardIssueExEvent() : FSMEvent(USER_EVT_ISSUE_EX){}
  321. ~CardIssueExEvent(){}
  322. SpReqAnsContext<CardIssuerStandService_IssueEx_Req, CardIssuerStandService_IssueEx_Ans>::Pointer ctx;
  323. virtual void OnUnhandled()
  324. {
  325. if (ctx != NULL)
  326. {
  327. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("card issue ex unhandled");
  328. ctx->Answer(Error_InvalidState);
  329. }
  330. }
  331. };
  332. class SAMICCommandEvent : public FSMEvent
  333. {
  334. public:
  335. SAMICCommandEvent() : FSMEvent(USER_EVT_SAM_IC){}
  336. ~SAMICCommandEvent(){}
  337. SpReqAnsContext<CardIssuerStandService_SAMICCommand_Req, CardIssuerStandService_SAMICCommand_Ans>::Pointer ctx;
  338. virtual void OnUnhandled()
  339. {
  340. if (ctx != NULL)
  341. {
  342. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("sam/ic unhandled");
  343. ctx->Answer(Error_InvalidState);
  344. }
  345. }
  346. };
  347. typedef struct EacQueryByEac_X1 {
  348. string xEacNbr;
  349. string xCltNbr;
  350. string xIacNbr;
  351. } EacQueryByEac_X1;
  352. typedef struct CQueryCardTypeReq : CHTTPReq {
  353. struct HEAD {
  354. int xHdrLen;
  355. string xIsuCnl;
  356. string xRtnCod;
  357. }HEAD;
  358. struct BODY {
  359. EacQueryByEac_X1 x1;
  360. }BODY;
  361. int X1Count;
  362. CQueryCardTypeReq() {
  363. X1Count = 1;
  364. }
  365. string ToJson() {
  366. Json::Value allElm,x1Arr;
  367. allElm[REFLECTION(HEAD)][REFLECTION(xHdrLen)] = HEAD.xHdrLen;
  368. allElm[REFLECTION(HEAD)][REFLECTION(xIsuCnl)] = HEAD.xIsuCnl;
  369. allElm[REFLECTION(HEAD)][REFLECTION(xRtnCod)] = HEAD.xRtnCod;
  370. for (int i = 0; i < X1Count; i++) {
  371. Json::Value x1Elm;
  372. Json::FastWriter fwX1Elm;//写入对象
  373. x1Elm[REFLECTION(xEacNbr)] = BODY.x1.xEacNbr.c_str();
  374. x1Elm[REFLECTION(xCltNbr)] = BODY.x1.xCltNbr.c_str();
  375. x1Elm[REFLECTION(xIacNbr)] = BODY.x1.xIacNbr.c_str();
  376. //string x1JsonStr = fwX1Elm.write(x1Elm);
  377. x1Arr[i] = x1Elm;
  378. }
  379. allElm[REFLECTION(BODY)][REFLECTION(EacQueryByEac_X1)] = x1Arr;
  380. Json::FastWriter writer;
  381. string ret = writer.write(allElm);
  382. return ret;
  383. }
  384. } CQueryCardTypeReq;
  385. typedef struct EacQueryByEac_Z1 {
  386. string zEacNbr;
  387. string zEacSts;
  388. string zEacTyp;
  389. string zEacNam;
  390. string zEacNik;
  391. string zEacCod;
  392. string zCltNbr;
  393. string zIacNbr;
  394. string zKeySeq;
  395. string zFndClt;
  396. string zFndIac;
  397. string zFndCpb;
  398. string zFndAtp;
  399. string zFpnClt;
  400. string zFpnIac;
  401. string zCtfCnr;
  402. string zCtfTyp;
  403. string zPsbTag;
  404. string zPsbFac;
  405. string zPsbNbr;
  406. string zPsbCod;
  407. string zPsbSeq;
  408. string zPsbMdm;
  409. string zCvcCod;
  410. string zCvcCd2;
  411. string zCvcIcd;
  412. string zMapBus;
  413. string zMapCnl;
  414. string zMapDpn;
  415. string zMapPwd;
  416. string zMapAut;
  417. string zWrmFlg;
  418. string zBlsFlg;
  419. string zNamFlg;
  420. string zActFlg;
  421. string zSlpFlg;
  422. string zFkcFlg;
  423. string zSnmFlg;
  424. string zWrfAll;
  425. string zWrfNdk;
  426. string zWrfZft;
  427. string zWrfDsk;
  428. string zPayLck;
  429. string zQryTag;
  430. string zFncTag;
  431. string zWdwTag;
  432. string zPayTag;
  433. string zTmpTag;
  434. string zExtTag;
  435. string zCtfTag;
  436. string zMskTag;
  437. string zStfFlg;
  438. string zSlaFlg;
  439. string zBatFlg;
  440. string zAgtFlg;
  441. string zAmgTag;
  442. string zCurTag;
  443. string zImgIdt;
  444. string zGrpFlg;
  445. string zOpnDat;
  446. string zOpnUsr;
  447. string zOpnChk;
  448. string zOpnAut;
  449. string zActDat;
  450. string zClsDat;
  451. string zClsUsr;
  452. string zClsChk;
  453. string zClsAut;
  454. string zDatEft;
  455. string zDatExp;
  456. string zBbkNbr;
  457. string zBrnNbr;
  458. string zBrnMng;
  459. string zCtyCod;
  460. }EacQueryByEac_Z1;
  461. typedef struct CQueryCardTypeRet : CHTTPRet {
  462. struct HEAD {
  463. string xTypCod;
  464. string xHdrLen;
  465. string xSysCod;
  466. string xDskSys;
  467. string xWkeCod;
  468. string xKeyVal;
  469. string xIsuCnl;
  470. string xEncCod;
  471. string xDalCod;
  472. string xCmmTyp;
  473. string xOrgIsu;
  474. string xPreIsu;
  475. string xEntUsr;
  476. string xUsrPwd;
  477. string xIsuDat;
  478. string xIsuTim;
  479. string xMacCod;
  480. string xRtnLvl;
  481. string xRtnCod;
  482. string xDevNbr;
  483. string xTlrNbr;
  484. string xRqsNbr;
  485. string xCmmRsv;
  486. string xDocSiz;
  487. string xItvTms;
  488. string xMsgFlg;
  489. string xAppRsv;
  490. }HEAD;
  491. struct BODY {
  492. EacQueryByEac_Z1 z1;
  493. }BODY;
  494. int Z1Count;
  495. CQueryCardTypeRet() : Z1Count(1) {
  496. }
  497. bool Parse(string strData) {
  498. Json::Value root,tmpZ1;
  499. Json::Reader reader;
  500. Json::Value::UInt index;
  501. if (!reader.parse(strData, root, false))
  502. {
  503. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("reader.parse false");//又不能打印,有什么太大意义?
  504. return false;
  505. }
  506. index = 0;
  507. HEAD.xRtnCod = root["HEAD"][REFLECTION(xRtnCod)].asCString();
  508. if (HEAD.xRtnCod.compare("SUC0000") == 0)
  509. {
  510. tmpZ1 = root["BODY"][REFLECTION(EacQueryByEac_Z1)];
  511. BODY.z1.zPsbMdm = tmpZ1[index][REFLECTION(zPsbMdm)].asCString();
  512. BODY.z1.zEacNbr = tmpZ1[index][REFLECTION(zEacNbr)].asCString();
  513. BODY.z1.zPsbSeq = tmpZ1[index][REFLECTION(zPsbSeq)].asCString();
  514. return true;
  515. }
  516. else
  517. return false;
  518. }
  519. } CQueryCardTypeRet;
  520. typedef struct CRegistSwallowCardReq : CHTTPReq {
  521. string cardNo;
  522. string cardType;
  523. string channel;
  524. string clearInstanceId;
  525. string deviceSciNo;
  526. string bankNo;
  527. string editTime;
  528. string editor;
  529. string fromFlag;
  530. string idKey;
  531. string informType;
  532. string psbCode;
  533. string reasonCode;
  534. string state;
  535. string structId;
  536. string swallowDate;
  537. string swallowTime;
  538. string terminalNo;
  539. string terminalType;
  540. string uuid;
  541. string ToJson() {
  542. Json::Value allElm, x1Arr;
  543. allElm[REFLECTION(cardNo)] = cardNo;
  544. allElm[REFLECTION(deviceSciNo)] = deviceSciNo;
  545. allElm[REFLECTION(reasonCode)] = reasonCode;
  546. allElm[REFLECTION(swallowDate)] = swallowDate;
  547. allElm[REFLECTION(swallowTime)] = swallowTime;
  548. allElm[REFLECTION(terminalNo)] = terminalNo;
  549. allElm[REFLECTION(terminalType)] = terminalType;
  550. Json::FastWriter writer;
  551. string ret = writer.write(allElm);
  552. return ret;
  553. }
  554. } CRegistSwallowCardReq;
  555. typedef struct CRegistSwallowCardRet : CHTTPRet {
  556. struct returnInfo {
  557. string returnCode;
  558. string errorMsg;
  559. }returnInfo;
  560. struct data {
  561. }data;
  562. bool Parse(string strData) {
  563. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(strData.c_str());
  564. Json::Value root, tmpZ1;
  565. Json::Reader reader;
  566. if (!reader.parse(strData, root, false))
  567. {
  568. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("reader.parse false");//又不能打印,有什么太大意义?
  569. return false;
  570. }
  571. if (!root["returnInfo"].isNull()) {
  572. returnInfo.returnCode = root["returnInfo"][REFLECTION(returnCode)].asCString();
  573. return true;
  574. }
  575. else {
  576. return false;//报文结构不对,解析失败
  577. }
  578. //returnInfo.returnCode = root["returnInfo"][REFLECTION(returnCode)].asCString();
  579. }
  580. } CRegistSwallowCardRet;
  581. // 同步卡库计数到后台服务实体类
  582. struct SyncMaterialCountInfo
  583. {
  584. CSimpleStringA strDeviceNo;
  585. unsigned int dwCardBoxNum;
  586. CAutoArray<bool> arrMaintainFlag;
  587. CAutoArray<CSimpleStringA> arrMaintainer;
  588. CAutoArray<unsigned int> arrMaintainTime;
  589. CAutoArray<CSimpleStringA> arrCardBoxNo;
  590. CAutoArray<CSimpleStringA> arrPsbCode;
  591. CAutoArray<CSimpleStringA> arrPsbName;
  592. CAutoArray<unsigned int> arrCardInit;
  593. CAutoArray<unsigned int> arrCardRemains;
  594. CAutoArray<unsigned int> arrCardIssued;
  595. CAutoArray<unsigned int> arrCardMixed;
  596. CAutoArray<unsigned int> arrCardPercent;
  597. };
  598. struct SyncMaterialCountReq1
  599. {
  600. char TerminalNo[16];
  601. char DeviceNo[16];
  602. char Material[16];
  603. DWORD CardBoxNum;
  604. };
  605. struct SyncMaterialCountReq2
  606. {
  607. bool bMaintain;
  608. char Maintainer[16];
  609. DWORD MaintainTime;
  610. char CardBoxNo[20];
  611. char PsbCode[8];
  612. char PsbName[128];
  613. DWORD CardInit;
  614. DWORD CardRemains;
  615. DWORD CardIssued;
  616. DWORD CardMixed;
  617. DWORD CardPercent;
  618. };
  619. struct SyncMaterialCountHTTPReq : CHTTPReq {
  620. SyncMaterialCountHTTPReq() { m_timeOut = 30; }
  621. SyncMaterialCountReq1 reqInfo;
  622. std::vector<SyncMaterialCountReq2> reqData;
  623. virtual string ToJson() {
  624. Json::Value root;
  625. Json::Value arrayObj;
  626. root["terminalNo"] = reqInfo.TerminalNo;
  627. root["deviceNo"] = reqInfo.DeviceNo;
  628. root["materiel"] = reqInfo.Material;
  629. root["cardBoxNum"] = (int)reqInfo.CardBoxNum;
  630. for (int i = 0; i <= reqInfo.CardBoxNum; i++)
  631. {
  632. Json::Value item;
  633. item["CardBoxNo"] = reqData[i].CardBoxNo;
  634. item["PsbCode"] = reqData[i].PsbCode;
  635. item["PsbName"] = reqData[i].PsbName;
  636. item["CardInit"] = (int)reqData[i].CardInit;
  637. item["CardRemains"] = (int)reqData[i].CardRemains;
  638. item["CardIssued"] = (int)reqData[i].CardIssued;
  639. item["CardMixed"] = (int)reqData[i].CardMixed;
  640. item["CardPercent"] = (int)reqData[i].CardPercent;
  641. item["Maintainer"] = reqData[i].Maintainer;
  642. if (reqData[i].MaintainTime == 0)
  643. item["MaintainTime"] = "";
  644. else {
  645. item["MaintainTime"] = CSmallDateTime::GetNow().ToTimeString().GetData();
  646. //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("MaintainTime:%d", (DWORD)CSmallDateTime::GetNow());
  647. }
  648. item["bMaintain"] = reqData[i].bMaintain;
  649. arrayObj.append(item);
  650. }
  651. root["cardIssueList"] = arrayObj;
  652. return root.toStyledString();
  653. }
  654. };
  655. struct SyncMaterialCountHTTPRet : CHTTPRet {
  656. string m_retStr;
  657. bool Parse(string strData) {
  658. m_retStr = strData;
  659. return true;
  660. }
  661. };
  662. class CCardIssuerFSM : public CCommDevFSM<CCardIssuerFSM, CardIssuerClass>
  663. {
  664. public:
  665. enum {s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s14};
  666. BEGIN_FSM_STATE(CCardIssuerFSM)
  667. FSM_STATE_ENTRY(s0,"Init",s0_on_entry,s0_on_exit,s0_on_event)
  668. FSM_STATE_ENTRY(s1,"Initializing",s1_on_entry,s1_on_exit,s1_on_event)
  669. FSM_STATE_ENTRY(s2,"Idle",s2_on_entry,s2_on_exit,s2_on_event)
  670. FSM_STATE_ENTRY(s3,"Accepting",s3_on_entry,s3_on_exit,s3_on_event)
  671. FSM_STATE_ENTRY(s4,"Hold",s4_on_entry,s4_on_exit,s4_on_event)
  672. FSM_STATE_ENTRY(s5,"Reading",s5_on_entry,s5_on_exit,s5_on_event)
  673. FSM_STATE_ENTRY(s6,"Ejecting",s6_on_entry,s6_on_exit,s6_on_event)
  674. FSM_STATE_ENTRY(s7,"WaitFetching",s7_on_entry,s7_on_exit,s7_on_event)
  675. FSM_STATE_ENTRY(s8,"Capturing",s8_on_entry,s8_on_exit,s8_on_event)
  676. FSM_STATE_ENTRY(s9,"Failed",s9_on_entry,s9_on_exit,s9_on_event)
  677. FSM_STATE_ENTRY(s10,"Issuing",s10_on_entry,s10_on_exit,s10_on_event)
  678. FSM_STATE_ENTRY(s11,"Writing",s11_on_entry,s11_on_exit,s11_on_event)
  679. FSM_STATE_ENTRY(s14, "SAMIC", s14_on_entry, s14_on_exit, s14_on_event)
  680. END_FSM_STATE()
  681. BEGIN_FSM_RULE(CCardIssuerFSM,s0)
  682. FSM_RULE_ENTRY(s0, s2, USER_EVT_TEST, 0)
  683. FSM_RULE_ENTRY(s0,s1,USER_EVT_INIT,0)
  684. FSM_RULE_ENTRY(s0, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  685. FSM_RULE_ENTRY(s1,s2,USER_EVT_INITFINISHED,0)
  686. FSM_RULE_ENTRY(s1,s9,USER_EVT_INITFINISHED,1)
  687. FSM_RULE_ENTRY(s1, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  688. FSM_RULE_ENTRY(s2,s3,USER_EVT_ACCEPT,0)
  689. // FSM_RULE_ENTRY(s2,s9,USER_EVT_ACCEPT,1)
  690. FSM_RULE_ENTRY(s2, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  691. FSM_RULE_ENTRY(s2,s10,USER_EVT_ISSUE,0)
  692. FSM_RULE_ENTRY(s2, s10, USER_EVT_ISSUE_EX, 0)
  693. FSM_RULE_ENTRY(s3,s4,USER_EVT_ACCEPTFINISHED,0)
  694. FSM_RULE_ENTRY(s3,s9,USER_EVT_ACCEPTFINISHED,1)
  695. FSM_RULE_ENTRY(s3,s2,USER_EVT_ACCEPTFINISHED,2)
  696. FSM_RULE_ENTRY(s3,s2,USER_EVT_ACCEPTFINISHED,3)
  697. FSM_RULE_ENTRY(s3,s7,USER_EVT_ACCEPTFINISHED,4)
  698. FSM_RULE_ENTRY(s3, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  699. FSM_RULE_ENTRY(s4,s5,USER_EVT_READ,0)
  700. FSM_RULE_ENTRY(s4,s6,USER_EVT_EJECT,0)
  701. FSM_RULE_ENTRY(s4,s6,USER_EVT_EXIT,0)
  702. FSM_RULE_ENTRY(s4,s8,USER_EVT_ACCEPT,0)
  703. FSM_RULE_ENTRY(s4,s8,USER_EVT_EXIT,1)
  704. FSM_RULE_ENTRY(s4,s8,USER_EVT_CAPTURE,0)
  705. FSM_RULE_ENTRY(s4,s11,USER_EVT_WRITE,0)
  706. FSM_RULE_ENTRY(s4, s14, USER_EVT_SAM_IC, 0)
  707. FSM_RULE_ENTRY(s4, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  708. FSM_RULE_ENTRY(s4, s2, USER_EVT_ISSUE_EX_FINISHED, 2)
  709. FSM_RULE_ENTRY(s4, s6, USER_EVT_ISSUE_EX_FINISHED, 6)
  710. FSM_RULE_ENTRY(s4, s5, USER_EVT_PREONLINE, 0)
  711. FSM_RULE_ENTRY(s4, s5, USER_EVT_POSTONLINE, 0)
  712. FSM_RULE_ENTRY(s5,s4,USER_EVT_READ_FINISHED,0)
  713. FSM_RULE_ENTRY(s5,s9,USER_EVT_READ_FINISHED,1)
  714. FSM_RULE_ENTRY(s5,s4,USER_EVT_READ_FINISHED,2)
  715. FSM_RULE_ENTRY(s5, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  716. FSM_RULE_ENTRY(s5, s4, USER_EVT_EXIT, 0)
  717. FSM_RULE_ENTRY(s5, s4, USER_EVT_PREONLINEFINISHED, 0)
  718. FSM_RULE_ENTRY(s5, s4, USER_EVT_POSTONLINEFINISHED, 0)
  719. FSM_RULE_ENTRY(s6,s7,USER_EVT_EJECTFINISHED,0)
  720. FSM_RULE_ENTRY(s6,s9,USER_EVT_EJECTFINISHED,1)
  721. FSM_RULE_ENTRY(s6, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  722. FSM_RULE_ENTRY(s7,s2,USER_EVT_WAITFINISHED,0)
  723. FSM_RULE_ENTRY(s7,s9,USER_EVT_WAITFINISHED,1)
  724. FSM_RULE_ENTRY(s7,s8,USER_EVT_WAITFINISHED,2)
  725. FSM_RULE_ENTRY(s7, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  726. FSM_RULE_ENTRY(s8,s2,USER_EVT_CAPTUREFINISHED,0)
  727. FSM_RULE_ENTRY(s8,s9,USER_EVT_CAPTUREFINISHED,1)
  728. FSM_RULE_ENTRY(s8, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  729. FSM_RULE_ENTRY(s9, s2, USER_EVT_RESETFINISHED, 0)
  730. FSM_RULE_ENTRY(s9, s0, USER_EVT_RESETFINISHED, 2)
  731. FSM_RULE_ENTRY(s9, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  732. FSM_RULE_ENTRY(s10,s4,USER_EVT_ISSUE_FINISHED,0)
  733. FSM_RULE_ENTRY(s10,s9,USER_EVT_ISSUE_FINISHED,1)
  734. FSM_RULE_ENTRY(s10,s2,USER_EVT_ISSUE_FINISHED,2)
  735. FSM_RULE_ENTRY(s10, s6, USER_EVT_ISSUE_EX_FINISHED, 6)
  736. FSM_RULE_ENTRY(s10, s4, USER_EVT_ISSUE_EX_FINISHED, 0)
  737. FSM_RULE_ENTRY(s10, s9, USER_EVT_ISSUE_EX_FINISHED, 1)
  738. FSM_RULE_ENTRY(s10, s2, USER_EVT_ISSUE_EX_FINISHED, 2)
  739. FSM_RULE_ENTRY(s10, s6, USER_EVT_ISSUE_EX_FINISHED, 6)
  740. FSM_RULE_ENTRY(s10, s2, USER_EVT_ISSUE_EX_FINISHED, 8)
  741. FSM_RULE_ENTRY(s10, s2, USER_EVT_EXIT, 0)
  742. FSM_RULE_ENTRY(s11,s4,USER_EVT_WRITE_FINISHED,0)
  743. FSM_RULE_ENTRY(s11,s4,USER_EVT_WRITE_FINISHED,1)
  744. FSM_RULE_ENTRY(s14, s4, USER_EVT_SAM_IC_FINISHED, 0)
  745. END_FSM_RULE()
  746. CCardIssuerFSM() : m_bCancelAccept(false),m_bWaitingAccept(false),
  747. m_bWaitAccepteMore(false),m_bExit(false),m_resetTimes(0),m_testResult(Error_Succeed)
  748. //,m_pTACReject(NULL),m_pIACOnline(NULL),m_pTACOnline(NULL),m_pIACDefault(NULL),m_pTACDefault(NULL)
  749. ,m_bCDA(false),m_pDataToARQC(NULL),m_bIssuingExit(false)
  750. ,m_bCardIssued(false),m_issueStatusFromFile(1),m_issueStatus(1),m_currCardNo("")
  751. , m_captureReason(""), m_machineType(1), m_currentHopper(1), m_hopperNum(1)
  752. , m_bSettingMaterial(false) , m_addCardNo(""), m_addCardSerial(""), m_hasCardWhileDevOpen(false)
  753. , m_bCancelByRFIC(false), m_devOpenFailedCount(0)
  754. , m_EacQueryHost(""),m_eacQueryFlag(0), m_bUseCardnoMismatch(false), m_ICRetryTimes(1)
  755. , m_bCardFromHopper(true), m_bStopUseRF(false),m_rfVendorList(""), m_bUseRFTillNext(false), m_csSwallowCardUrl(""), m_csSyncMaterialUrl("")
  756. {
  757. HARDWARE_ENTITY_RESET_ENTITYID(m_entCode, 0x203);
  758. cmdDecodeMag2 = NULL;
  759. cmdDecodeEx = NULL;
  760. m_aidList.Init(3);
  761. m_aidList[0] = "A000000333";
  762. m_aidList[1] = "A0000000108888";
  763. m_aidList[2] = "A000000790";
  764. }
  765. ~CCardIssuerFSM(){}
  766. virtual ErrorCodeEnum OnInit();
  767. virtual ErrorCodeEnum OnExit();
  768. void s0_on_entry();
  769. void s0_on_exit();
  770. unsigned int s0_on_event(FSMEvent* event);
  771. void s1_on_entry();
  772. void s1_on_exit();
  773. unsigned int s1_on_event(FSMEvent* event);
  774. void s2_on_entry();
  775. void s2_on_exit();
  776. unsigned int s2_on_event(FSMEvent* event);
  777. void s3_on_entry();
  778. void s3_on_exit();
  779. unsigned int s3_on_event(FSMEvent* event);
  780. void s4_on_entry();
  781. void s4_on_exit();
  782. unsigned int s4_on_event(FSMEvent* event);
  783. void s5_on_entry();
  784. void s5_on_exit();
  785. unsigned int s5_on_event(FSMEvent* event);
  786. void s6_on_entry();
  787. void s6_on_exit();
  788. unsigned int s6_on_event(FSMEvent* event);
  789. void s7_on_entry();
  790. void s7_on_exit();
  791. unsigned int s7_on_event(FSMEvent* event);
  792. void s8_on_entry();
  793. void s8_on_exit();
  794. unsigned int s8_on_event(FSMEvent* event);
  795. void s9_on_entry();
  796. void s9_on_exit();
  797. unsigned int s9_on_event(FSMEvent* event);
  798. void s10_on_entry();
  799. void s10_on_exit();
  800. unsigned int s10_on_event(FSMEvent* event);
  801. void s11_on_entry();
  802. void s11_on_exit();
  803. unsigned int s11_on_event(FSMEvent* event);
  804. void s14_on_entry();
  805. void s14_on_exit();
  806. unsigned int s14_on_event(FSMEvent* event);
  807. ErrorCodeEnum OpenDevice(BYTE btOpenType, const char *pDevSN);
  808. int Initial();
  809. bool GetDevStatus(bool bPrint=true);
  810. int UnAcceptCard();
  811. int CaptureCard(SpReqAnsContext<CardIssuerStandService_Capture_Req,CardIssuerStandService_Capture_Ans>::Pointer ctx);
  812. int EjectCard(SpReqAnsContext<CardIssuerStandService_Eject_Req,CardIssuerStandService_Eject_Ans>::Pointer ctx);
  813. int WaitFetchingCard();
  814. int ReadCard(SpReqAnsContext<CardIssuerStandService_Read_Req, CardIssuerStandService_Read_Ans>::Pointer ctx);
  815. int PreOnline(SpReqAnsContext<CardIssuerStandService_PreOnline_Req, CardIssuerStandService_PreOnline_Ans>::Pointer ctx);
  816. int PostOnline(SpReqAnsContext<CardIssuerStandService_PostOnline_Req, CardIssuerStandService_PostOnline_Ans>::Pointer ctx);
  817. int ReadCard_Contact(SpReqAnsContext<CardIssuerStandService_Read_Req,CardIssuerStandService_Read_Ans>::Pointer ctx, bool& bICOK);
  818. int PreOnline_Contact(SpReqAnsContext<CardIssuerStandService_PreOnline_Req,CardIssuerStandService_PreOnline_Ans>::Pointer ctx, bool& bICOK);
  819. int PostOnline_Contact(SpReqAnsContext<CardIssuerStandService_PostOnline_Req,CardIssuerStandService_PostOnline_Ans>::Pointer ctx, bool& bICOK);
  820. int ReadCard_RF(SpReqAnsContext<CardIssuerStandService_Read_Req, CardIssuerStandService_Read_Ans>::Pointer ctx);
  821. int PreOnline_RF(SpReqAnsContext<CardIssuerStandService_PreOnline_Req, CardIssuerStandService_PreOnline_Ans>::Pointer ctx);
  822. int PostOnline_RF(SpReqAnsContext<CardIssuerStandService_PostOnline_Req, CardIssuerStandService_PostOnline_Ans>::Pointer ctx);
  823. int Reset();
  824. int InternalAcceptCard();
  825. int AcceptCard(SpReqAnsContext<CardIssuerStandService_Insert_Req, CardIssuerStandService_Insert_Ans>::Pointer ctx);
  826. int IssueCard(SpReqAnsContext<CardIssuerStandService_Issue_Req, CardIssuerStandService_Issue_Ans>::Pointer ctx, SpReqAnsContext<CardIssuerStandService_IssueEx_Req, CardIssuerStandService_IssueEx_Ans>::Pointer ctxEx);
  827. int WriteCard(SpReqAnsContext<CardIssuerStandService_WriteTrack_Req,CardIssuerStandService_WriteTrack_Ans>::Pointer ctx);
  828. bool GetWaitFlag(){return m_bWaitingAccept;}
  829. void SetWaitMore(){m_bWaitAccepteMore = true;}
  830. void SetExitFlag(bool bFlag=true){m_bExit = bFlag;}
  831. bool FSMSetIssueFlag(int value=1);
  832. void FrontSetIssueFlag(bool bValue = true){ FSMSetIssueFlag(bValue); }
  833. int QueryIssueFlag(){ return m_issueStatus; }
  834. bool SetCardCaptured(const int num,bool bNewClear=false);
  835. bool SetCardIssued(const int num,const int hopper);
  836. bool SetCardRemains(const int num, const int hopper,bool bInit = false);
  837. bool SetCardMixed(const int num, const int hopper);
  838. ErrorCodeEnum MachineMoveCardBackNotHold();
  839. ErrorCodeEnum MachineMoveCardFrontGate(bool bInBussiness=false);
  840. void SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext);
  841. DevStateEnum GetDevState()
  842. {
  843. if ((m_eDevState == DEVICE_STATUS_NORMAL)
  844. && ((m_bHasHopper[0] && m_mixedEx[0] >= 3) || !m_bHasHopper[0])
  845. && ((m_bHasHopper[1] && m_mixedEx[1] >= 3) || !m_bHasHopper[1])
  846. && ((m_bHasHopper[2] && m_mixedEx[2] >= 3) || !m_bHasHopper[2]))
  847. return DEVICE_STATUS_MAINTAINCE;
  848. else
  849. return m_eDevState;
  850. }
  851. int QueryCardInfo();
  852. int SetDevStateAndSendMsg(const DevStateEnum eState, bool bForceSend = true);
  853. int UpdateLocalRunCfg(CAutoArray<int> hopperArr);
  854. int SyncDataToDB(bool bMaintain[12],bool bSetCaptured=true);//同步物料计数
  855. void SetHopperNum(int hopperNum);
  856. void DoExitWhenIdle();
  857. int SAMICCommand(SpReqAnsContext<CardIssuerStandService_SAMICCommand_Req, CardIssuerStandService_SAMICCommand_Ans>::Pointer ctx);
  858. bool WriteCardInfo(CSmartPointer<IConfigInfo> &cfgRun, const char *acc, const char* serial, int slot, bool bClear = false, bool bHasCard = false);
  859. bool ReadCardInfo(CSmartPointer<IConfigInfo> &cfgRun, CSimpleStringA &acc, CSimpleStringA &serial, int slot);
  860. void DecodeTracksData(const char *track2, DWORD dwT2size, const char *track3, DWORD dwT3size,char *&magData,bool bT2OK=true,bool bT3OK=true);
  861. int GetFSMState()
  862. {
  863. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("m_currentFSMState:%d", m_currentFSMState));
  864. return m_currentFSMState;
  865. }
  866. void GetCardInfo(int &findCard, int &cardPos)
  867. {
  868. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("<GetCardInfo>, findCard:%d, cardPos:%d", findCard, cardPos));
  869. findCard = m_findCard;
  870. cardPos = m_cardPos;
  871. }
  872. int SplitDevModelInfo();
  873. void SetCancelByRFICFlag(bool bCancel = true) { m_bCancelByRFIC = bCancel; }
  874. CSimpleStringA GetPreOnlineICCardNo() { return m_currCardNo; }
  875. void CloseAndClearDevObj(bool bCheckConnecting = true, bool bCloseOnly = false);
  876. bool GetDevInitFlag() { return m_bOpened; }
  877. bool GetDevInitingFlag() { return m_bOpening; }
  878. void SetEnterMainPage();
  879. static void HttpsLogCallBack(const char* logtxt);
  880. //0:unknow(havn't access microservice or access failed),1:both mag & ic ,2:mag only,3:ic only
  881. int JudgeCardType(CSimpleStringA cardno, bool &bMismatch);
  882. void QueryCIStatus(SpReqAnsContext<CardIssuerStandService_QueryCIStatus_Req, CardIssuerStandService_QueryCIStatus_Ans>::Pointer ctx);
  883. bool RegistCardWhileCaptureCard(CSimpleStringA cardno);
  884. bool SyncMaterialCount(IHttpFunc* client,SyncMaterialCountInfo syncInfo);
  885. protected:
  886. int m_iInsertTries;
  887. int m_resetTries;
  888. int m_ejectTries;
  889. private:
  890. ///
  891. int m_resetTimes;
  892. lpCMBdecodeMag2 cmdDecodeMag2;
  893. lpCMBdecodeEx cmdDecodeEx;
  894. bool m_bCancelAccept, m_bWaitingAccept, m_bWaitAccepteMore, m_bExit
  895. , m_bCDA, m_bIssuingExit, m_bCardIssued, m_bHasHopper[HOPPER_NUM]
  896. , m_bSettingMaterial, m_hasCardWhileDevOpen, m_bCancelByRFIC
  897. , m_bCardActiveNotify, m_bCardFromHopper, m_bUseCardnoMismatch, m_bStopUseRF;
  898. bool m_bUseRFTillNext;//if ReadCard by RF,the following PreOnline & PostOnline always use RF till the next card(insert/issue)
  899. ErrorCodeEnum m_testResult;
  900. int m_CardCaptured;
  901. int m_issueStatusFromFile, m_issueStatus/*the status maybe changed by Business call*/;
  902. //1:default, 2:SCI, 3:no cfg
  903. int m_machineType;
  904. WORD m_majorVerion, m_minorVerion;
  905. int m_currentHopper,m_devOpenFailedCount;
  906. int m_maxSlot,m_findCard,m_cardPos,m_currentFSMState,m_maxRetainCount, m_eacQueryFlag/*accout query*/
  907. ,m_ICRetryTimes;
  908. CSimpleStringA m_CardBoxNoEx[HOPPER_NUM], m_PsbCodeEx[HOPPER_NUM], m_PsbNameEx[HOPPER_NUM], m_MaintainerEx[HOPPER_NUM],m_csMaintainTimeEx[HOPPER_NUM];
  909. int m_CardInitEx[HOPPER_NUM], m_CardPercentEx[HOPPER_NUM], m_remainsEx[HOPPER_NUM], m_issuedEx[HOPPER_NUM], m_mixedEx[HOPPER_NUM],m_hopperNum;
  910. DWORD m_MaintainTimeEx[HOPPER_NUM];
  911. BYTE m_connectType, m_r1[128], m_r2[128], m_r3[128], m_priKey[ONE_K / 2], m_devPubKey[ONE_K / 2];
  912. CardIssuerStatus m_devStatus;
  913. DevStateEnum m_eDevState;
  914. CCardProcess *m_pCardProcess;
  915. CAutoArray<CSimpleStringA> m_aidList;
  916. char *m_pDataToARQC;
  917. long xxTest;
  918. CSimpleStringA m_currCardNo, m_captureReason, m_csMachineType, m_csSite, m_terminalNo, m_addCardNo, m_addCardSerial
  919. , m_csCM, m_rfVendorList, m_csRF;
  920. char m_AuthCode[2];
  921. vector<CMBBin> m_vBin;
  922. int SplitTrack2(CSimpleStringA pTrack2,Track2Data &decodeData);
  923. bool JustReadCardNo();
  924. bool IsValidCardNo(const char*,int);
  925. void GetVendorDllName(CSimpleStringA &dllName);
  926. bool AccountExchange(const char *origAcc, CSimpleStringA &acc,int dir=1);
  927. bool LoadCMBPrint(CSimpleStringA csBinPath);
  928. DevCategoryInfo m_devCat;
  929. bool ToRegistCaptureCardInfo();
  930. bool IfUseRf();
  931. CSimpleStringA m_EacQueryHost, m_csSwallowCardUrl, m_csSyncMaterialUrl;
  932. MagTracks m_magTracks;
  933. };
  934. struct InitTask : public ITaskSp
  935. {
  936. CCardIssuerFSM* fsm;
  937. InitTask(CCardIssuerFSM* f) : fsm(f) {}
  938. void Process()
  939. {
  940. FSMEvent *e = new FSMEvent(USER_EVT_INITFINISHED);
  941. e->param1 = fsm->Initial();
  942. fsm->PostEventFIFO(e);
  943. }
  944. };
  945. struct AcceptTask : public ITaskSp
  946. {
  947. CCardIssuerFSM* fsm;
  948. SpReqAnsContext<CardIssuerStandService_Insert_Req, CardIssuerStandService_Insert_Ans>::Pointer ctx;
  949. AcceptTask(CCardIssuerFSM* f) : fsm(f) {}
  950. void Process()
  951. {
  952. LOG_FUNCTION();
  953. FSMEvent *e = new FSMEvent(USER_EVT_ACCEPTFINISHED);
  954. e->param1 = fsm->AcceptCard(ctx);
  955. fsm->PostEventFIFO(e);
  956. }
  957. };
  958. struct IssueTask : public ITaskSp
  959. {
  960. CCardIssuerFSM* fsm;
  961. SpReqAnsContext<CardIssuerStandService_Issue_Req, CardIssuerStandService_Issue_Ans>::Pointer ctx;
  962. SpReqAnsContext<CardIssuerStandService_IssueEx_Req, CardIssuerStandService_IssueEx_Ans>::Pointer ctxEx;
  963. IssueTask(CCardIssuerFSM* f) : fsm(f) {}
  964. void Process()
  965. {
  966. LOG_FUNCTION();
  967. FSMEvent *e;
  968. if (ctx != NULL)
  969. e = new FSMEvent(USER_EVT_ISSUE_FINISHED);
  970. else if (ctxEx != NULL)
  971. e = new FSMEvent(USER_EVT_ISSUE_EX_FINISHED);
  972. else
  973. {
  974. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("IssueTask:ctx is null");
  975. return;
  976. }
  977. e->param1 = fsm->IssueCard(ctx,ctxEx);
  978. fsm->PostEventFIFO(e);
  979. }
  980. };
  981. struct ReadTask : public ITaskSp
  982. {
  983. SpReqAnsContext<CardIssuerStandService_Read_Req,CardIssuerStandService_Read_Ans>::Pointer ctx;
  984. CCardIssuerFSM* fsm;
  985. ReadTask(CCardIssuerFSM* f) : fsm(f) {}
  986. void Process()
  987. {
  988. CardReadFinishedEvent *e = new CardReadFinishedEvent();
  989. e->ctx = ctx;
  990. e->param1 = fsm->ReadCard(ctx);
  991. fsm->PostEventFIFO(e);
  992. }
  993. };
  994. struct PreOnlineTask : public ITaskSp
  995. {
  996. SpReqAnsContext<CardIssuerStandService_PreOnline_Req,CardIssuerStandService_PreOnline_Ans>::Pointer ctx;
  997. CCardIssuerFSM* fsm;
  998. PreOnlineTask(CCardIssuerFSM* f) : fsm(f) {}
  999. void Process()
  1000. {
  1001. FSMEvent *e = new FSMEvent(USER_EVT_PREONLINEFINISHED);
  1002. e->param1 = fsm->PreOnline(ctx);//oilyang@20220611 实际上,为简化处理,PreOnline函数默认返回0
  1003. fsm->PostEventFIFO(e);
  1004. }
  1005. };
  1006. struct PostOnlineTask : public ITaskSp
  1007. {
  1008. SpReqAnsContext<CardIssuerStandService_PostOnline_Req,CardIssuerStandService_PostOnline_Ans>::Pointer ctx;
  1009. CCardIssuerFSM* fsm;
  1010. PostOnlineTask(CCardIssuerFSM* f) : fsm(f) {}
  1011. void Process()
  1012. {
  1013. FSMEvent *e = new FSMEvent(USER_EVT_POSTONLINEFINISHED);
  1014. e->param1 = fsm->PostOnline(ctx);
  1015. fsm->PostEventFIFO(e);
  1016. }
  1017. };
  1018. struct CaptureTask : public ITaskSp
  1019. {
  1020. CCardIssuerFSM* fsm;
  1021. SpReqAnsContext<CardIssuerStandService_Capture_Req,CardIssuerStandService_Capture_Ans>::Pointer ctx;
  1022. CaptureTask(CCardIssuerFSM* f) : fsm(f) {}
  1023. void Process()
  1024. {
  1025. FSMEvent *e = new FSMEvent(USER_EVT_CAPTUREFINISHED);
  1026. e->param1 = fsm->CaptureCard(ctx);
  1027. fsm->PostEventFIFO(e);
  1028. }
  1029. };
  1030. struct EjectTask : public ITaskSp
  1031. {
  1032. SpReqAnsContext<CardIssuerStandService_Eject_Req,CardIssuerStandService_Eject_Ans>::Pointer ctx;
  1033. CCardIssuerFSM* fsm;
  1034. EjectTask(CCardIssuerFSM* f) : fsm(f) {}
  1035. void Process()
  1036. {
  1037. FSMEvent *e = new FSMEvent(USER_EVT_EJECTFINISHED);
  1038. e->param1 = fsm->EjectCard(ctx);
  1039. fsm->PostEventFIFO(e);
  1040. }
  1041. };
  1042. struct WaitFetchingTask : public ITaskSp
  1043. {
  1044. CCardIssuerFSM* fsm;
  1045. WaitFetchingTask(CCardIssuerFSM* f) : fsm(f) {}
  1046. void Process()
  1047. {
  1048. FSMEvent *e = new FSMEvent(USER_EVT_WAITFINISHED);
  1049. e->param1 = fsm->WaitFetchingCard();
  1050. fsm->PostEventFIFO(e);
  1051. }
  1052. };
  1053. struct ResetTask : public ITaskSp
  1054. {
  1055. CCardIssuerFSM* fsm;
  1056. ResetTask(CCardIssuerFSM* f) : fsm(f) {}
  1057. void Process()
  1058. {
  1059. ResetFinishedEvent *e = new ResetFinishedEvent();
  1060. e->param1 = fsm->Reset();
  1061. fsm->PostEventFIFO(e);
  1062. }
  1063. };
  1064. struct WriteTask : public ITaskSp
  1065. {
  1066. SpReqAnsContext<CardIssuerStandService_WriteTrack_Req,CardIssuerStandService_WriteTrack_Ans>::Pointer ctx;
  1067. CCardIssuerFSM* fsm;
  1068. WriteTask(CCardIssuerFSM* f) : fsm(f) {}
  1069. void Process()
  1070. {
  1071. CardWriteFinishedEvent *e = new CardWriteFinishedEvent();
  1072. e->ctx = ctx;
  1073. e->param1 = fsm->WriteCard(ctx);
  1074. fsm->PostEventFIFO(e);
  1075. }
  1076. };
  1077. struct DoExitWhenIdleTask : public ITaskSp
  1078. {
  1079. CCardIssuerFSM* fsm;
  1080. DoExitWhenIdleTask(CCardIssuerFSM* f) : fsm(f) {}
  1081. void Process()
  1082. {
  1083. fsm->DoExitWhenIdle();
  1084. }
  1085. };
  1086. struct SAMICCommandTask : public ITaskSp
  1087. {
  1088. CCardIssuerFSM* fsm;
  1089. SpReqAnsContext<CardIssuerStandService_SAMICCommand_Req, CardIssuerStandService_SAMICCommand_Ans>::Pointer ctx;
  1090. SAMICCommandTask(CCardIssuerFSM* f) : fsm(f) {}
  1091. void Process()
  1092. {
  1093. FSMEvent* e = new FSMEvent(USER_EVT_SAM_IC_FINISHED);
  1094. e->param1 = fsm->SAMICCommand(ctx);
  1095. fsm->PostEventFIFO(e);
  1096. }
  1097. };
  1098. struct RegistCaptureCardInfoTask : public ITaskSp
  1099. {
  1100. CCardIssuerFSM* fsm;
  1101. CSimpleStringA cardno;
  1102. RegistCaptureCardInfoTask(CCardIssuerFSM* f, CSimpleStringA cardno) : fsm(f),cardno(cardno) {}
  1103. void Process()
  1104. {
  1105. fsm->RegistCardWhileCaptureCard(cardno);
  1106. }
  1107. };
  1108. struct SyncMaterialCountTask : public ITaskSp
  1109. {
  1110. CCardIssuerFSM* fsm;
  1111. SyncMaterialCountInfo syncInfo;
  1112. SyncMaterialCountTask(CCardIssuerFSM* f, SyncMaterialCountInfo syncMaterialInfo){
  1113. fsm = f;
  1114. syncInfo = syncMaterialInfo;
  1115. }
  1116. void Process()
  1117. {
  1118. LOG_FUNCTION();
  1119. //同步物料信息
  1120. IHttpFunc* client;
  1121. client = create_http(fsm->HttpsLogCallBack);
  1122. bool ret = fsm->SyncMaterialCount(client,syncInfo);
  1123. client->Destory();
  1124. }
  1125. };
  1126. #endif //__CARD_ISSUER_FSM_H