cardissuerimpl.cpp 36 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178
  1. #include "cardissuerimpl.h"
  2. #include <cstring>
  3. #include <cstdio>
  4. #include "sini.h"
  5. #include "public.h"
  6. CardIssuerClassImpl::CardIssuerClassImpl()
  7. :m_mode(0)
  8. {
  9. m_pDriver = new IDCSankyoImpl ();
  10. m_T = 0;
  11. m_bIsOpen = false;
  12. m_bCardRead = false;
  13. }
  14. CardIssuerClassImpl::~CardIssuerClassImpl()
  15. {
  16. if(NULL != m_pDriver)
  17. {
  18. delete m_pDriver;
  19. m_pDriver = NULL;
  20. }
  21. }
  22. int getFileVer(char* sFile, short& ch1, short& ch2)
  23. {
  24. ch1 = 0;
  25. ch2 = 0;
  26. char* pFind = strstr(sFile, ".so");
  27. char* pTemp = pFind;
  28. while (pTemp)
  29. {
  30. pFind = pTemp;
  31. pTemp = strstr(pFind + 3, ".so");
  32. }
  33. if (pFind == NULL) return 0;
  34. pTemp = pFind - 1;
  35. while(isdigit(*pTemp) && pTemp > sFile) pTemp--;
  36. if (*pTemp == '.')
  37. ch2 = atoi(pTemp+1);
  38. pTemp--;
  39. while(isdigit(*pTemp) && pTemp > sFile) pTemp--;
  40. if (*pTemp == '.')
  41. ch1 = atoi(pTemp+1);
  42. return 1;
  43. }
  44. ErrorCodeEnum CardIssuerClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
  45. {
  46. LOG4VTM_FUNCTION();
  47. if (!m_bIsOpen)
  48. return HandleDevError(DEVICE_NOT_OPEN, "GetDevCategory");
  49. char version[256];
  50. char sFwid[32];
  51. int iRt = m_pDriver->getFirmversion((unsigned char*)version);
  52. ErrorCodeEnum eRt = HandleDevError(iRt, "GetDevCategory");
  53. if(Error_Succeed == eRt)
  54. {
  55. strcpy(sFwid, version+18);
  56. }
  57. else
  58. strcpy(sFwid, "G422-72");
  59. char szType[] = {"PVER=ACT#MID=F5-5540"};
  60. char szModel[] = "CM=V2.0#FWID=%s#CID=00000000";
  61. memset(&devCategory, 0, sizeof(devCategory));
  62. strcpy(devCategory.szType ,szType);
  63. sprintf(devCategory.szModel , szModel, sFwid);
  64. strcpy(devCategory.szVendor , "cw");
  65. devCategory.version.wMajor = 1;
  66. devCategory.version.wMinor = 1;
  67. devCategory.version.wRevision = 0xffff;
  68. devCategory.version.wBuild = FILE_VERSION;
  69. //没有获取设备状态
  70. iRt = m_pDriver->getStatus();
  71. switch(iRt)
  72. {
  73. case CWINFO_IDC_S_EMPTY:
  74. case CWINFO_IDC_S_GATE:
  75. case CWINFO_IDC_S_INSIDE:
  76. devCategory.eState = DEVICE_STATUS_NORMAL;
  77. break;
  78. case 0x10:
  79. default:
  80. devCategory.eState = DEVICE_STATUS_NOT_READY;
  81. break;
  82. }
  83. return Error_Succeed;
  84. }
  85. ErrorCodeEnum CardIssuerClassImpl::DevOpen(DWORD dwPort, DWORD dwBaudRate)
  86. {
  87. LOG4VTM_FUNCTION();
  88. char sTemp[128] = { 0 };
  89. sprintf(sTemp, "DevOpen dwPort %d, dwBaudRate %d", dwPort, dwBaudRate);
  90. LOG4VTM(INFO, sTemp);
  91. ErrorCodeEnum eRt = Error_Succeed;
  92. m_bIsOpen = false;
  93. int iRt = 0;
  94. do
  95. {
  96. char sPort[16],sGet[32];
  97. sprintf(sPort, "COM%d", dwPort);
  98. SIni ini;
  99. if (ini.GetValueFromIniFile("/cashway/setting/cashway.ini", "Serial", sPort, sGet, 30))
  100. strcpy(sPort, sGet);
  101. iRt = m_pDriver->openPort(sPort, dwBaudRate, true);
  102. eRt = HandleDevError(iRt, "openPort");
  103. if(Error_Succeed != eRt) break;
  104. unsigned char version[64] = { 0 };
  105. iRt = m_pDriver->getFirmversion(version);
  106. eRt = HandleDevError(iRt, "getFirmversion");
  107. if(Error_Succeed != eRt) break;
  108. sprintf(sTemp, "Firmversion: %s", version);
  109. LOG4VTM(INFO, sTemp);
  110. m_bIsOpen = true;
  111. }while(0);
  112. sprintf(sTemp, "DevOpen openPort %d", iRt);
  113. LOG4VTM(INFO, sTemp);
  114. return eRt;
  115. }
  116. ErrorCodeEnum CardIssuerClassImpl::DevOpenEx(DWORD dwPort, DWORD dwBaudRate, BYTE btOpenType, const char* pDevSN, BYTE& btType)
  117. {
  118. LOG4VTM_FUNCTION();
  119. m_bIsOpen = false;
  120. char sTemp[128] = { 0 };
  121. sprintf(sTemp, "DevOpen dwPort %d, dwBaudRate %d", dwPort, dwBaudRate);
  122. LOG4VTM(INFO, sTemp);
  123. ErrorCodeEnum eRt = Error_Succeed;
  124. int iRt = 0;
  125. do
  126. {
  127. char sPort[16],sGet[32];
  128. sprintf(sPort, "COM%d", dwPort);
  129. SIni ini;
  130. if (ini.GetValueFromIniFile("/cashway/setting/cashway.ini", "Serial", sPort, sGet, 30))
  131. strcpy(sPort, sGet);
  132. iRt = m_pDriver->openPort(sPort, dwBaudRate, true);
  133. eRt = HandleDevError(iRt, "DevOpenEx openPort");
  134. if(Error_Succeed != eRt) break;
  135. iRt = m_pDriver->reset(RESET_TO_HOLD, PWR_OFF_TO_INSIDE);
  136. eRt = HandleDevError(iRt, "DevOpenEx reset");
  137. if(Error_Succeed != eRt) break;
  138. // unsigned char version[64] = { 0 };
  139. // iRt = m_pDriver->getFirmversion(version);
  140. // eRt = HandleDevError(iRt, "DevOpenEx getFirmversion");
  141. // if(Error_Succeed != eRt) break;
  142. // version[15]=0;
  143. // memcpy((char*)pDevSN, version, strlen((const char*)version));
  144. m_pDriver->resetCount();
  145. m_bIsOpen = true;
  146. }while(0);
  147. sprintf(sTemp, "DevOpen openPort %d", iRt);
  148. btType = 2;
  149. LOG4VTM(INFO, sTemp);
  150. return eRt;
  151. }
  152. ErrorCodeEnum CardIssuerClassImpl::Reset()
  153. {
  154. LOG4VTM_FUNCTION();
  155. ErrorCodeEnum eRt = Error_Succeed;
  156. int iRt = m_pDriver->reset(RESET_TO_HOLD, PWR_OFF_TO_INSIDE);
  157. eRt = HandleDevError(iRt, __FUNCTION__);
  158. return eRt;
  159. }
  160. ErrorCodeEnum CardIssuerClassImpl::DevClose()
  161. {
  162. LOG4VTM_FUNCTION();
  163. if (!m_bIsOpen)
  164. return HandleDevError(DEVICE_NOT_OPEN, "DevClose");
  165. m_pDriver->closePort();
  166. m_bIsOpen = false;
  167. return Error_Succeed;
  168. }
  169. ErrorCodeEnum CardIssuerClassImpl::GetDevStatus(CardIssuerStatus& devStatus)
  170. {
  171. LOG4VTM_FUNCTION();
  172. if (!m_bIsOpen)
  173. return HandleDevError(DEVICE_NOT_OPEN, "GetDevStatus");
  174. ErrorCodeEnum eRt = Error_Succeed;
  175. memset(&devStatus, 0, sizeof(devStatus));
  176. int iRt = 0;
  177. do
  178. {
  179. //get card reader status
  180. iRt = m_pDriver->getStatus();
  181. if(CWINFO_IDC_S_EMPTY == iRt)
  182. {
  183. devStatus.eMedia = CI_MEDIA_NOTPRESENT;
  184. }
  185. else if(CWINFO_IDC_S_GATE == iRt)
  186. {
  187. devStatus.eMedia = CI_MEDIA_ENTERING;
  188. }
  189. else if(CWINFO_IDC_S_INSIDE == iRt)
  190. {
  191. devStatus.eMedia = CI_MEDIA_PRESENT;
  192. }
  193. else if(0x10 == iRt)
  194. {
  195. devStatus.eMedia = CI_MEDIA_JAMMED;
  196. }
  197. else {
  198. eRt = HandleDevError(iRt, "GetDevStatus getStatus");
  199. break;
  200. }
  201. //*
  202. //get box status
  203. CUStatus cuStatus;
  204. RetainBinStatus rtStatus;
  205. iRt = m_pDriver->GetBoxStatus(cuStatus, rtStatus);
  206. eRt = HandleDevError(iRt, "GetDevStatus GetBoxStatus");
  207. if(Error_Succeed != eRt)
  208. {
  209. break;
  210. }
  211. if(rtStatus.BoxCount >= 1)
  212. {
  213. devStatus.dwRetainCount = 60;
  214. switch (rtStatus.status[0])
  215. {
  216. case O_Box_Ok:
  217. case O_Box_Empty:
  218. devStatus.eRetainBin = CI_RETAINBIN_OK;
  219. break;
  220. case O_Box_High:
  221. case O_Box_Full:
  222. devStatus.eRetainBin = CI_RETAINBIN_FULL;
  223. break;
  224. case O_Box_Miss:
  225. devStatus.eRetainBin = CI_RETAIN_NOTSUPP;
  226. break;
  227. default:
  228. devStatus.eRetainBin = CI_RETAIN_NOTSUPP;
  229. break;
  230. }
  231. }
  232. for (int i = 0; i < 3; i++)
  233. {
  234. if(i < cuStatus.BoxCount)
  235. {
  236. devStatus.dwIssuerCount[i] = 200;
  237. switch (cuStatus.status[i])
  238. {
  239. case O_Box_Ok:
  240. devStatus.eIssuerBin[i] = CI_ISSUEHOPPER_OK;
  241. break;
  242. case O_Box_Empty:
  243. devStatus.eIssuerBin[i] = CI_ISSUEHOPPER_EMPTY;
  244. break;
  245. case O_Box_Low:
  246. devStatus.eIssuerBin[i] = CI_ISSUEHOPPER_LOW;
  247. break;
  248. case O_Box_Miss:
  249. devStatus.eIssuerBin[i] = CI_ISSUEHOPPER_NOTSUPP;
  250. break;
  251. case O_Box_High:
  252. case O_Box_Full:
  253. devStatus.eIssuerBin[i] = CI_ISSUEHOPPER_OK;
  254. break;
  255. default:
  256. devStatus.eIssuerBin[i] = CI_ISSUEHOPPER_NOTSUPP;
  257. break;
  258. }
  259. }
  260. else
  261. {
  262. devStatus.dwIssuerCount[i] = 0;
  263. devStatus.eIssuerBin[i] = CI_ISSUEHOPPER_NOTSUPP;
  264. }
  265. }
  266. //*/
  267. }while(0);
  268. char outputParam[512] = { 0 };
  269. sprintf(outputParam, "GetDevStatus cardstatus(%s) retainBinStatus(%s) hopper1Status(%s) hopper2Status(%s) hopper3Status(%s)",
  270. FormatCardStatus(devStatus.eMedia), FormatRetainBinStatus(devStatus.eRetainBin), FormatCuBoxStatus(devStatus.eIssuerBin[0]),
  271. FormatCuBoxStatus(devStatus.eIssuerBin[1]), FormatCuBoxStatus(devStatus.eIssuerBin[2]));
  272. LOG4VTM(INFO, outputParam);
  273. return eRt;
  274. }
  275. ErrorCodeEnum CardIssuerClassImpl::GetDeviceSN(char*& pDevSN)
  276. {
  277. LOG4VTM_FUNCTION();
  278. if (!m_bIsOpen)
  279. return HandleDevError(DEVICE_NOT_OPEN, "GetDeviceSN");
  280. ErrorCodeEnum eRt = Error_Succeed;
  281. int iRt = 0;
  282. do
  283. {
  284. unsigned char version[64] = { 0 };
  285. iRt = m_pDriver->getFirmversion(version);
  286. eRt = HandleDevError(iRt, "GetDeviceSN getFirmversion");
  287. if(Error_Succeed != eRt)
  288. {
  289. break;
  290. }
  291. memcpy((char*)pDevSN, version, strlen((const char*)version));
  292. }while(0);
  293. char outputParam[128] = { 0 };
  294. sprintf(outputParam, "GetDeviceSN pDevSN(%s)", pDevSN);
  295. LOG4VTM(INFO, outputParam);
  296. return eRt;
  297. }
  298. ErrorCodeEnum CardIssuerClassImpl::MoveCard(CardPosEnum eCardPos, int hopperNo)
  299. {
  300. LOG4VTM_FUNCTION();
  301. if (!m_bIsOpen)
  302. return HandleDevError(DEVICE_NOT_OPEN, "MoveCard");
  303. char inputParam[128] = { 0 };
  304. sprintf(inputParam, "InputParam>> eCardPos(%s) hopperNo(%d)", FormatCardPosStatus(eCardPos), hopperNo);
  305. LOG4VTM(INFO, inputParam);
  306. ErrorCodeEnum eRt = Error_Succeed;
  307. int iRt = 0;
  308. m_bCardRead = false;
  309. eRt = ReleaseIC();
  310. if(CI_MOVECARD_FRONT_GATE == eCardPos)
  311. {
  312. iRt = m_pDriver->ejectCard();
  313. eRt = HandleDevError(iRt, "MoveCard ejectCard");
  314. return eRt;
  315. }
  316. if(CI_MOVECARD_RF_POSITION == eCardPos || CI_MOVECARD_IC_POSITION == eCardPos || CI_MOVECARD_MAG_POSITION == eCardPos)
  317. {
  318. // iRt = m_pDriver->moveCardToICRW();
  319. iRt = m_pDriver->reIntakeCard();
  320. eRt = HandleDevError(iRt, "MoveCard ToICRW");
  321. return eRt;
  322. }
  323. if(CI_MOVECARD_BACK_NOT_HOLD == eCardPos)
  324. {
  325. bool bOK = false;
  326. CUStatus cuStatus;
  327. RetainBinStatus rtStatus;
  328. iRt = m_pDriver->GetBoxStatus(cuStatus, rtStatus);
  329. eRt = HandleDevError(iRt, "GetBoxStatus");
  330. if(Error_Succeed != eRt)
  331. return eRt;
  332. switch (rtStatus.status[0])
  333. {
  334. case O_Box_Ok:
  335. case O_Box_Empty:
  336. case O_Box_Low:
  337. case O_Box_High:
  338. bOK = true;
  339. break;
  340. default:
  341. break;
  342. }
  343. if (!bOK)
  344. {
  345. eRt = HandleDevError(RETAIN_BIN_ERROR, "MoveCard retainCard");
  346. return eRt;
  347. }
  348. //需要先检测卡片位置,如果在入口需要先进入
  349. //没有获取设备状态
  350. iRt = m_pDriver->getStatus();
  351. switch(iRt)
  352. {
  353. case CWINFO_IDC_S_EMPTY:
  354. return HandleDevError(DEVICE_NO_MEDIA, "MoveCard retainCard");
  355. case CWINFO_IDC_S_GATE:
  356. m_pDriver->reIntakeCard();
  357. case CWINFO_IDC_S_INSIDE:
  358. iRt = m_pDriver->retainCard();
  359. return HandleDevError(iRt, "MoveCard DispensCard");
  360. default:
  361. return HandleDevError(DEVICE_NO_MEDIA, "MoveCard retainCard");
  362. }
  363. }
  364. if(CI_MOVECARD_FROM_HOPPER == eCardPos)
  365. {
  366. iRt = m_pDriver->DispensCard(hopperNo);
  367. return HandleDevError(iRt, "MoveCard DispensCard");
  368. }
  369. return HandleDevError(DEVICE_NOT_SUPP, "MoveCard DispensCard");
  370. }
  371. // Set card entry
  372. ErrorCodeEnum CardIssuerClassImpl::SetCardInType(CardInEnum eCardIn)
  373. {
  374. LOG4VTM_FUNCTION();
  375. if (!m_bIsOpen)
  376. return HandleDevError(DEVICE_NOT_OPEN, "SetCardInType");
  377. m_bCardRead = false;
  378. char sTemp[128] = { 0 };
  379. sprintf(sTemp, "SetCardInType eCardIn(%s)", FormatCardIn(eCardIn));
  380. LOG4VTM(INFO, sTemp);
  381. ErrorCodeEnum eRt = Error_Succeed;
  382. int iRt = 0;
  383. do
  384. {
  385. bool fluxInactive = false;
  386. if(CI_CARD_IN_TYPE_FORBIDDEN == eCardIn)
  387. {
  388. iRt = m_pDriver->denyCardIn();
  389. eRt = HandleDevError(iRt, "SetCardInType denyCardIn");
  390. if(Error_Succeed != eRt)
  391. {
  392. break;
  393. }
  394. }
  395. else if(CI_CARD_IN_TYPE_MAG == eCardIn || CI_CARD_IN_TYPE_ALL == eCardIn)
  396. {
  397. if(CI_CARD_IN_TYPE_ALL == eCardIn)
  398. {
  399. fluxInactive = true;
  400. }
  401. iRt = m_pDriver->waitCardIn(fluxInactive);
  402. eRt = HandleDevError(iRt, "SetCardInType waitCardIn");
  403. if(Error_Succeed != eRt)
  404. {
  405. break;
  406. }
  407. }
  408. }while(0);
  409. return eRt;
  410. }
  411. bool SetCardData(TrackInfo& track, char* sData, TrackSrcEnum eTrack)
  412. {
  413. track.eSource = eTrack;
  414. int iLen = strlen(sData);
  415. if(iLen)
  416. {
  417. track.eStatus = CI_DATA_OK;
  418. strcpy((char*)track.data, sData);
  419. track.dwSize = iLen;
  420. return true;
  421. }
  422. else
  423. {
  424. track.eStatus = CI_DATA_INVALID;
  425. track.data[0] = 0;
  426. track.dwSize = 0;
  427. return false;
  428. }
  429. }
  430. void CardIssuerClassImpl::ReadMagData()
  431. {
  432. memset(m_saMagData, 0, sizeof(m_saMagData));
  433. if (m_pDriver->getStatus() != CWINFO_IDC_S_INSIDE)
  434. {
  435. m_iReadReturn = DEVICE_NO_MEDIA;
  436. m_bCardRead = false;
  437. return;
  438. }
  439. // m_iReadCode = m_pDriver->readRawData(m_rawDataArr, 3);
  440. m_pDriver->readTrack(1, m_saMagData[0]);
  441. m_pDriver->readTrack(2, m_saMagData[1]);
  442. m_pDriver->readTrack(3, m_saMagData[2]);
  443. if (strlen(m_saMagData[0]) || strlen(m_saMagData[1]) || strlen(m_saMagData[2]))
  444. m_iReadReturn = 0;
  445. else
  446. m_iReadReturn = DEVICE_NO_DATA;
  447. m_bCardRead = true;
  448. }
  449. // Read data from magnetic track.
  450. ErrorCodeEnum CardIssuerClassImpl::MagRead(MagTracks& magTracks)
  451. {
  452. LOG4VTM_FUNCTION();
  453. if (!m_bIsOpen)
  454. return HandleDevError(DEVICE_NOT_OPEN, "MagRead");
  455. char sTemp[128] = { 0 };
  456. sprintf(sTemp, "MagRead eRange(%s)", FormatTrackRange(magTracks.eRange));
  457. LOG4VTM(INFO, sTemp);
  458. ErrorCodeEnum eRt = Error_Succeed;
  459. if (!m_bCardRead)
  460. ReadMagData();
  461. bool bReadSucc = false;
  462. //上层要求必须有数据长度,只有错误码会报错
  463. if (SetCardData(magTracks.track[0], m_saMagData[0], CI_TRACK_SOURCE_1))
  464. bReadSucc=true;
  465. if (SetCardData(magTracks.track[1], m_saMagData[1], CI_TRACK_SOURCE_2))
  466. bReadSucc=true;
  467. if (SetCardData(magTracks.track[2], m_saMagData[2], CI_TRACK_SOURCE_3))
  468. bReadSucc=true;
  469. eRt = HandleDevError(m_iReadReturn, "MagRead");
  470. sprintf(sTemp, "MagRead track%dlen(%d) track%dlen(%d) track%dlen(%d)",
  471. magTracks.track[0].eSource, magTracks.track[0].dwSize,
  472. magTracks.track[1].eSource, magTracks.track[1].dwSize,
  473. magTracks.track[2].eSource, magTracks.track[2].dwSize);
  474. LOG4VTM(INFO, sTemp);
  475. return bReadSucc ? Error_Succeed : eRt;
  476. }
  477. // Write data to magnetic track.
  478. ErrorCodeEnum CardIssuerClassImpl::MagWrite(MagTracks magTracks, MagWriteModeEnum eWriteMode)
  479. {
  480. LOG4VTM_FUNCTION();
  481. if (!m_bIsOpen)
  482. return HandleDevError(DEVICE_NOT_OPEN, "MagWrite");
  483. char sTemp[512] = { 0 };
  484. sprintf(sTemp, "MagWrite eRange(%s) track1[%d], track2[%d], track3[%d]", FormatTrackRange(magTracks.eRange),
  485. magTracks.track[0].dwSize, magTracks.track[1].dwSize, magTracks.track[2].dwSize);
  486. LOG4VTM(INFO, sTemp);
  487. ErrorCodeEnum eRt = Error_Succeed;
  488. int iRt = 0;
  489. do
  490. {
  491. bool btrack1 = false, btrack2 = false, btrack3 = false;
  492. if(CI_TRACK_RANGE_1 == magTracks.eRange || CI_TRACK_RANGE_1_2 == magTracks.eRange || CI_TRACK_RANGE_1_3 == magTracks.eRange || CI_TRACK_RANGE_1_2_3 == magTracks.eRange)
  493. {
  494. btrack1 = true;
  495. }
  496. if(CI_TRACK_RANGE_2 == magTracks.eRange || CI_TRACK_RANGE_1_2 == magTracks.eRange || CI_TRACK_RANGE_2_3 == magTracks.eRange || CI_TRACK_RANGE_1_2_3 == magTracks.eRange)
  497. {
  498. btrack2 = true;
  499. }
  500. if(CI_TRACK_RANGE_3 == magTracks.eRange || CI_TRACK_RANGE_2_3 == magTracks.eRange || CI_TRACK_RANGE_1_3 == magTracks.eRange || CI_TRACK_RANGE_1_2_3 == magTracks.eRange)
  501. {
  502. btrack3 = true;
  503. }
  504. IDCRawData rawDataArr[3];
  505. unsigned short itemsCount = 0;
  506. memset(rawDataArr, 0, sizeof(rawDataArr));
  507. for (int i = 0; i < MAX_MAG_TRACK_NUM; i++)
  508. {
  509. if(btrack1)
  510. {
  511. if(CI_TRACK_SOURCE_1 == magTracks.track[i].eSource)
  512. {
  513. rawDataArr[itemsCount].source = O_Source_Track1;
  514. rawDataArr[itemsCount].len = magTracks.track[i].dwSize;
  515. memcmp(rawDataArr[itemsCount].rawData, magTracks.track[i].data, magTracks.track[i].dwSize);
  516. itemsCount++;
  517. iRt = m_pDriver->setTrackData(magTracks.track[i].data, 1);
  518. eRt = HandleDevError(iRt, "MagWrite setTrackData 1");
  519. if(Error_Succeed != eRt)
  520. {
  521. break;
  522. }
  523. }
  524. }
  525. if(btrack2)
  526. {
  527. if(CI_TRACK_SOURCE_2 == magTracks.track[i].eSource)
  528. {
  529. rawDataArr[itemsCount].source = O_Source_Track2;
  530. rawDataArr[itemsCount].len = magTracks.track[i].dwSize;
  531. memcmp(rawDataArr[itemsCount].rawData, magTracks.track[i].data, magTracks.track[i].dwSize);
  532. itemsCount++;
  533. iRt = m_pDriver->setTrackData(magTracks.track[i].data, 2);
  534. eRt = HandleDevError(iRt, "MagWrite setTrackData 2");
  535. if(Error_Succeed != eRt)
  536. {
  537. break;
  538. }
  539. }
  540. }
  541. if(btrack3)
  542. {
  543. if(CI_TRACK_SOURCE_3 == magTracks.track[i].eSource)
  544. {
  545. rawDataArr[itemsCount].source = O_Source_Track3;
  546. rawDataArr[itemsCount].len = magTracks.track[i].dwSize;
  547. memcmp(rawDataArr[itemsCount].rawData, magTracks.track[i].data, magTracks.track[i].dwSize);
  548. itemsCount++;
  549. iRt = m_pDriver->setTrackData(magTracks.track[i].data, 3);
  550. eRt = HandleDevError(iRt, "MagWrite setTrackData 3");
  551. if(Error_Succeed != eRt)
  552. {
  553. break;
  554. }
  555. }
  556. }
  557. }
  558. iRt = m_pDriver->writeRawData(rawDataArr, itemsCount);
  559. eRt = HandleDevError(iRt, "MagWrite writeRawData");
  560. }while(0);
  561. return eRt;
  562. }
  563. // Active contact IC card
  564. ErrorCodeEnum CardIssuerClassImpl::ActiveICCard()
  565. {
  566. LOG4VTM_FUNCTION();
  567. if (!m_bIsOpen)
  568. return HandleDevError(DEVICE_NOT_OPEN, "ActiveICCard");
  569. ErrorCodeEnum eRt = Error_Succeed;
  570. int iRt = 0;
  571. do
  572. {
  573. IDCRawData chipATR;
  574. memset(&chipATR, 0, sizeof(chipATR));
  575. iRt = m_pDriver->icActive(&chipATR);
  576. eRt = HandleDevError(iRt, "ActiveICCard");
  577. if(Error_Succeed != eRt)
  578. {
  579. break;
  580. }
  581. unsigned char p = (chipATR.rawData[0] & 0xF0);
  582. char sTemp[256];
  583. sprintf(sTemp, "ActiveICCard Card type %02x", chipATR.rawData[0]);
  584. LOG4VTM(WARN, sTemp);
  585. if(p == 0xe0)
  586. m_T = 1;
  587. else if (p == 0x60)
  588. m_T = 0;
  589. else
  590. m_T = 0;
  591. }while(0);
  592. return eRt;
  593. }
  594. // Move IC card to contact position
  595. ErrorCodeEnum CardIssuerClassImpl::ContactIC()
  596. {
  597. LOG4VTM_FUNCTION();
  598. if (!m_bIsOpen)
  599. return HandleDevError(DEVICE_NOT_OPEN, "ContactIC");
  600. if (!m_bCardRead)
  601. ReadMagData();
  602. int iRt = m_pDriver->icPress();
  603. return HandleDevError(iRt, "ContactIC");
  604. // return Error_Succeed;
  605. }
  606. ErrorCodeEnum CardIssuerClassImpl::ReleaseIC()
  607. {
  608. LOG4VTM_FUNCTION();
  609. if (!m_bIsOpen)
  610. return HandleDevError(DEVICE_NOT_OPEN, "ReleaseIC");
  611. ErrorCodeEnum eRt = Error_Succeed;
  612. int iRt = 0;
  613. // iRt = m_pDriver->icDeactiveAndRelease();
  614. eRt = HandleDevError(iRt, "ReleaseIC");
  615. return eRt;
  616. }
  617. // Warm reset card(IC)
  618. ErrorCodeEnum CardIssuerClassImpl::WarmReset()
  619. {
  620. LOG4VTM_FUNCTION();
  621. if (!m_bIsOpen)
  622. return HandleDevError(DEVICE_NOT_OPEN, "WarmReset");
  623. ErrorCodeEnum eRt = Error_Succeed;
  624. int iRt = 0;
  625. do
  626. {
  627. IDCRawData chipATR;
  628. memset(&chipATR, 0, sizeof(chipATR));
  629. iRt = m_pDriver->icWarmReset(&chipATR);
  630. eRt = HandleDevError(iRt, "WarmReset");
  631. }while(0);
  632. return eRt;
  633. }
  634. ErrorCodeEnum CardIssuerClassImpl::ICCommand(CmdInfo sendBuf, CmdInfo& recvBuf)
  635. {
  636. LOG4VTM_FUNCTION();
  637. if (!m_bIsOpen)
  638. return HandleDevError(DEVICE_NOT_OPEN, "ICCommand");
  639. char sTemp[512] = { 0 };
  640. sprintf(sTemp, "ICCommand sendlen (%d)", sendBuf.dwSize);
  641. LOG4VTM(INFO, sTemp);
  642. ErrorCodeEnum eRt = Error_Succeed;
  643. int iRt = 0;
  644. do
  645. {
  646. IDCRawData chipInput;
  647. memset(&chipInput, 0, sizeof(chipInput));
  648. IDCRawData chipOutput;
  649. memset(&chipOutput, 0, sizeof(chipOutput));
  650. chipInput.len = sendBuf.dwSize;
  651. memcpy(chipInput.rawData, sendBuf.data, sendBuf.dwSize);
  652. ChipProtocolType type = O_Chip_T0;
  653. if(1 == m_T)
  654. type = O_Chip_T1;
  655. iRt = m_pDriver->icPPSExchange(type);
  656. eRt = HandleDevError(iRt, "ICCommand");
  657. if(Error_Succeed != eRt) break;
  658. iRt = m_pDriver->icCommunicate(&chipInput, &chipOutput);
  659. if(Error_Succeed != eRt) break;
  660. memcpy(recvBuf.data, chipOutput.rawData, chipOutput.len);
  661. recvBuf.dwSize = chipOutput.len;
  662. recvBuf.data[recvBuf.dwSize] = 0;
  663. }while(0);
  664. sprintf(sTemp, "ICCommand recvlen(%d)", recvBuf.dwSize);
  665. LOG4VTM(INFO, sTemp);
  666. return eRt;
  667. }
  668. ErrorCodeEnum CardIssuerClassImpl::GetLastErr(DevErrorInfo &devErrInfo)
  669. {
  670. memcpy(&devErrInfo, &m_DevErrInfo, sizeof(DevErrorInfo));
  671. return Error_Succeed;
  672. }
  673. char* CardIssuerClassImpl::FormatRetainBinStatus(RtBinStatusEnum status)
  674. {
  675. memset(m_pformatStatus, 0, 64);
  676. switch(status)
  677. {
  678. case CI_RETAINBIN_OK:
  679. sprintf(m_pformatStatus, "CI_RETAINBIN_OK");
  680. break;
  681. case CI_RETAIN_NOTSUPP:
  682. sprintf(m_pformatStatus, "CI_RETAIN_NOTSUPP");
  683. break;
  684. case CI_RETAINBIN_FULL:
  685. sprintf(m_pformatStatus, "CI_RETAINBIN_FULL");
  686. break;
  687. case CI_RETAINBIN_HIGH:
  688. sprintf(m_pformatStatus, "CI_RETAINBIN_HIGH");
  689. break;
  690. }
  691. return m_pformatStatus;
  692. }
  693. char* CardIssuerClassImpl::FormatCuBoxStatus(IssHopperStatusEnum status)
  694. {
  695. memset(m_pformatStatus, 0, 64);
  696. switch(status)
  697. {
  698. case CI_ISSUEHOPPER_OK:
  699. sprintf(m_pformatStatus, "CI_ISSUEHOPPER_OK");
  700. break;
  701. case CI_ISSUEHOPPER_NOTSUPP:
  702. sprintf(m_pformatStatus, "CI_ISSUEHOPPER_NOTSUPP");
  703. break;
  704. case CI_ISSUEHOPPER_EMPTY:
  705. sprintf(m_pformatStatus, "CI_ISSUEHOPPER_EMPTY");
  706. break;
  707. case CI_ISSUEHOPPER_LOW:
  708. sprintf(m_pformatStatus, "CI_ISSUEHOPPER_LOW");
  709. break;
  710. }
  711. return m_pformatStatus;
  712. }
  713. char* CardIssuerClassImpl::FormatCardPosStatus(CardPosEnum status)
  714. {
  715. memset(m_pformatStatus, 0, 64);
  716. switch(status)
  717. {
  718. case CI_MOVECARD_FRONT_GATE:
  719. sprintf(m_pformatStatus, "CI_MOVECARD_FRONT_GATE");
  720. break;
  721. case CI_MOVECARD_RF_POSITION:
  722. sprintf(m_pformatStatus, "CI_MOVECARD_RF_POSITION");
  723. break;
  724. case CI_MOVECARD_IC_POSITION:
  725. sprintf(m_pformatStatus, "CI_MOVECARD_IC_POSITION");
  726. break;
  727. case CI_MOVECARD_MAG_POSITION:
  728. sprintf(m_pformatStatus, "CI_MOVECARD_MAG_POSITION");
  729. break;
  730. case CI_MOVECARD_BACK_NOT_HOLD:
  731. sprintf(m_pformatStatus, "CI_MOVECARD_BACK_NOT_HOLD");
  732. break;
  733. case CI_MOVECARD_FROM_HOPPER:
  734. sprintf(m_pformatStatus, "CI_MOVECARD_FROM_HOPPER");
  735. break;
  736. case CI_MOVECARD_RETRIEVE:
  737. sprintf(m_pformatStatus, "CI_MOVECARD_RETRIEVE");
  738. break;
  739. }
  740. return m_pformatStatus;
  741. }
  742. char* CardIssuerClassImpl::FormatCardStatus(CardStatusEnum status)
  743. {
  744. memset(m_pformatStatus, 0, 64);
  745. switch(status)
  746. {
  747. case CI_MEDIA_NOTPRESENT:
  748. sprintf(m_pformatStatus, "CI_MEDIA_NOTPRESENT");
  749. break;
  750. case CI_MEDIA_PRESENT:
  751. sprintf(m_pformatStatus, "CI_MEDIA_PRESENT");
  752. break;
  753. case CI_MEDIA_JAMMED:
  754. sprintf(m_pformatStatus, "CI_MEDIA_JAMMED");
  755. break;
  756. default:
  757. sprintf(m_pformatStatus, "Unknown %d", status);
  758. break;
  759. }
  760. return m_pformatStatus;
  761. }
  762. char* CardIssuerClassImpl::FormatCardIn(CardInEnum status)
  763. {
  764. memset(m_pformatStatus, 0, 64);
  765. switch(status)
  766. {
  767. case CI_CARD_IN_TYPE_FORBIDDEN:
  768. sprintf(m_pformatStatus, "CI_CARD_IN_TYPE_FORBIDDEN");
  769. break;
  770. case CI_CARD_IN_TYPE_MAG:
  771. sprintf(m_pformatStatus, "CI_CARD_IN_TYPE_MAG");
  772. break;
  773. case CI_CARD_IN_TYPE_ALL:
  774. sprintf(m_pformatStatus, "CI_CARD_IN_TYPE_ALL");
  775. break;
  776. }
  777. return m_pformatStatus;
  778. }
  779. char* CardIssuerClassImpl::FormatTrackRange(TrackRange status)
  780. {
  781. memset(m_pformatStatus, 0, 64);
  782. switch(status)
  783. {
  784. case CI_TRACK_RANGE_1:
  785. sprintf(m_pformatStatus, "CI_TRACK_RANGE_1");
  786. break;
  787. case CI_TRACK_RANGE_2:
  788. sprintf(m_pformatStatus, "CI_TRACK_RANGE_2");
  789. break;
  790. case CI_TRACK_RANGE_3:
  791. sprintf(m_pformatStatus, "CI_TRACK_RANGE_3");
  792. break;
  793. case CI_TRACK_RANGE_1_2:
  794. sprintf(m_pformatStatus, "CI_TRACK_RANGE_1_2");
  795. break;
  796. case CI_TRACK_RANGE_2_3:
  797. sprintf(m_pformatStatus, "CI_TRACK_RANGE_2_3");
  798. break;
  799. case CI_TRACK_RANGE_1_3:
  800. sprintf(m_pformatStatus, "CI_TRACK_RANGE_1_3");
  801. break;
  802. case CI_TRACK_RANGE_1_2_3:
  803. sprintf(m_pformatStatus, "CI_TRACK_RANGE_1_2_3");
  804. break;
  805. default:
  806. sprintf(m_pformatStatus, "CI_TRACK_RANGE_Unk");
  807. break;
  808. }
  809. return m_pformatStatus;
  810. }
  811. ErrorCodeEnum CardIssuerClassImpl::HandleDevError(int nRt, LPCTSTR lpszFormat, ...)
  812. {
  813. ErrorCodeEnum eRt = Error_Succeed;
  814. char strErrInfo[80] = { 0 };
  815. switch (nRt)
  816. {
  817. case DEVICE_NOT_SUPP:
  818. eRt = Error_Stoped;
  819. sprintf(strErrInfo, "not support the command");
  820. break;
  821. case DEVICE_NO_MEDIA:
  822. eRt = Error_DevMedia;
  823. sprintf(strErrInfo, "no media error");
  824. break;
  825. case RETAIN_BIN_ERROR:
  826. eRt = Error_DevMedia;
  827. sprintf(strErrInfo, "RetainBin error");
  828. break;
  829. case DEVICE_NOT_OPEN:
  830. eRt = Error_Hardware;
  831. sprintf(strErrInfo, "device not opened");
  832. break;
  833. case DEVICE_NO_DATA:
  834. eRt = Error_Stoped;
  835. sprintf(strErrInfo, "read track no data");
  836. break;
  837. //成功
  838. case 0:
  839. eRt = Error_Succeed;
  840. sprintf(strErrInfo, "success");
  841. break;
  842. //正常情况
  843. case CWINFO_IDC_S_EMPTY:
  844. eRt = Error_Succeed;
  845. sprintf(strErrInfo, "no card.");
  846. break;
  847. case CWINFO_IDC_S_GATE:
  848. eRt = Error_Succeed;
  849. sprintf(strErrInfo, "card in the gate.");
  850. break;
  851. case CWINFO_IDC_S_INSIDE:
  852. eRt = Error_Succeed;
  853. sprintf(strErrInfo, "card inside.");
  854. break;
  855. case 0x01:
  856. eRt = Error_Stoped;
  857. sprintf(strErrInfo, "Parameter is not correct.");
  858. break;
  859. case 0x02:
  860. eRt = Error_Hardware;
  861. sprintf(strErrInfo, "Command execution is impossible.");
  862. break;
  863. case 0x03:
  864. eRt = Error_Hardware;
  865. sprintf(strErrInfo, "Hardware is not present.");
  866. break;
  867. case 0x04:
  868. eRt = Error_Stoped;
  869. sprintf(strErrInfo, "Command data error.");
  870. break;
  871. case 0x05:
  872. eRt = Error_Stoped;
  873. sprintf(strErrInfo, "Tried to card feed commands before the IC contact release command.");
  874. break;
  875. case 0x06:
  876. eRt = Error_Stoped;
  877. sprintf(strErrInfo, "ICRW does not have that decipher the data.");
  878. break;
  879. case 0x10:
  880. eRt = Error_DevMedia;
  881. sprintf(strErrInfo, "Card jam.");
  882. break;
  883. case 0x11:
  884. eRt = Error_Stoped;
  885. sprintf(strErrInfo, "Shutter failure.");
  886. break;
  887. case 0x12:
  888. eRt = Error_Stoped;
  889. sprintf(strErrInfo, "Sensor failure of PD1, PD2, PD3, PDI/Card remains inside.");
  890. break;
  891. case 0x13:
  892. eRt = Error_Stoped;
  893. sprintf(strErrInfo, "Irregular card length(LONG).");
  894. break;
  895. case 0x14:
  896. eRt = Error_Stoped;
  897. sprintf(strErrInfo, "Irregular card length(SHORT).");
  898. break;
  899. case 0x15:
  900. eRt = Error_Stoped;
  901. sprintf(strErrInfo, "F-ROM error.");
  902. break;
  903. case 0x16:
  904. eRt = Error_Stoped;
  905. sprintf(strErrInfo, "The card was moved forcibly.");
  906. break;
  907. case 0x17:
  908. eRt = Error_DevMedia;
  909. sprintf(strErrInfo, "Jam error at retrieve.");
  910. break;
  911. case 0x18:
  912. eRt = Error_Stoped;
  913. sprintf(strErrInfo, "SW1 or SW2 error.");
  914. break;
  915. case 0x19:
  916. eRt = Error_Stoped;
  917. sprintf(strErrInfo, "Card was not inserted from the rear.");
  918. break;
  919. case 0x20:
  920. eRt = Error_Stoped;
  921. sprintf(strErrInfo, "Read Error(Parity error).");
  922. break;
  923. case 0x21:
  924. eRt = Error_Stoped;
  925. sprintf(strErrInfo, "Read error.");
  926. break;
  927. case 0x22:
  928. eRt = Error_Stoped;
  929. sprintf(strErrInfo, "Write Error.");
  930. break;
  931. case 0x23:
  932. eRt = Error_Stoped;
  933. sprintf(strErrInfo, "Read Error(Only SS-ES-LRC).");
  934. break;
  935. case 0x24:
  936. eRt = Error_Stoped;
  937. sprintf(strErrInfo, "Read Error(no encode and/or no magnetic stripe).");
  938. break;
  939. case 0x25:
  940. eRt = Error_Stoped;
  941. sprintf(strErrInfo, "Write Verify Error(Quality error).");
  942. break;
  943. case 0x26:
  944. eRt = Error_Stoped;
  945. sprintf(strErrInfo, "Read Error(No SS).");
  946. break;
  947. case 0x27:
  948. eRt = Error_Stoped;
  949. sprintf(strErrInfo, "Read Error(No ES).");
  950. break;
  951. case 0x28:
  952. eRt = Error_Stoped;
  953. sprintf(strErrInfo, "Read Error(LRC error).");
  954. break;
  955. case 0x29:
  956. eRt = Error_Stoped;
  957. sprintf(strErrInfo, "Write Verify Error(Data discordance).");
  958. break;
  959. case 0x30:
  960. eRt = Error_Stoped;
  961. sprintf(strErrInfo, "Power Down.");
  962. break;
  963. case 0x40:
  964. eRt = Error_Stoped;
  965. sprintf(strErrInfo, "Card wos pulled out during capture.");
  966. break;
  967. case 0x41:
  968. eRt = Error_Stoped;
  969. sprintf(strErrInfo, "Failure IC contact solenoid or sensor ICD.");
  970. break;
  971. case 0x43:
  972. eRt = Error_Stoped;
  973. sprintf(strErrInfo, "Card could not be set to IC contact position.");
  974. break;
  975. case 0x45:
  976. eRt = Error_Stoped;
  977. sprintf(strErrInfo, "ICRW ejected the card forcibly.");
  978. break;
  979. case 0x46:
  980. eRt = Error_Stoped;
  981. sprintf(strErrInfo, "The ejected card has not been withdrawn until the specified time.");
  982. break;
  983. case 0x50:
  984. eRt = Error_Stoped;
  985. sprintf(strErrInfo, "Retract counter overflow.");
  986. break;
  987. case 0x51:
  988. eRt = Error_Stoped;
  989. sprintf(strErrInfo, "Motor error.");
  990. break;
  991. case 0x53:
  992. eRt = Error_Stoped;
  993. sprintf(strErrInfo, "Digital decode read error.");
  994. break;
  995. case 0x54:
  996. eRt = Error_Stoped;
  997. sprintf(strErrInfo, "Ant-fishing pin does not move correctly.");
  998. break;
  999. case 0x55:
  1000. eRt = Error_Stoped;
  1001. sprintf(strErrInfo, "command can not be executed since the pin is down.");
  1002. break;
  1003. case 0x58:
  1004. eRt = Error_Stoped;
  1005. sprintf(strErrInfo, "Anti-fishing pin is during the movement.");
  1006. break;
  1007. case 0x60:
  1008. eRt = Error_Stoped;
  1009. sprintf(strErrInfo, "Abnormal condition was found on the power-lin(Vcc) of IC card.");
  1010. break;
  1011. case 0x61:
  1012. eRt = Error_Stoped;
  1013. sprintf(strErrInfo, "Receiving error of ATR.");
  1014. break;
  1015. case 0x62:
  1016. eRt = Error_Stoped;
  1017. sprintf(strErrInfo, "Thespecified protocol does not agreee with that of IC card.");
  1018. break;
  1019. case 0x63:
  1020. eRt = Error_Stoped;
  1021. sprintf(strErrInfo, "IC card communication error(IC card does not respond).");
  1022. break;
  1023. case 0x64:
  1024. eRt = Error_Stoped;
  1025. sprintf(strErrInfo, "IC card communication error(Ohter than '63').");
  1026. break;
  1027. case 0x65:
  1028. eRt = Error_Stoped;
  1029. sprintf(strErrInfo, "HOST sends command for IC card communication before receiving ATR.");
  1030. break;
  1031. case 0x66:
  1032. eRt = Error_Stoped;
  1033. sprintf(strErrInfo, "Tried to communicate with IC card not supported in ICRW.");
  1034. break;
  1035. case 0x67:
  1036. eRt = Error_Stoped;
  1037. sprintf(strErrInfo, "Collision error of Contactless IC card(multiple cards detected)");
  1038. break;
  1039. case 0x69:
  1040. eRt = Error_Stoped;
  1041. sprintf(strErrInfo, "Tried to communicate with IC card not supported in Protocol EMV.");
  1042. break;
  1043. case 0xA0:
  1044. eRt = Error_DevMedia;
  1045. sprintf(strErrInfo, "The card does not exist at the hopper.");
  1046. break;
  1047. case 0xA1:
  1048. eRt = Error_DevMedia;
  1049. sprintf(strErrInfo, "There is a card at the lead line.");
  1050. break;
  1051. case 0xA2:
  1052. eRt = Error_DevMedia;
  1053. sprintf(strErrInfo, "Transmission error between MST and ICRW(time over).");
  1054. break;
  1055. case 0xA3:
  1056. eRt = Error_Stoped;
  1057. sprintf(strErrInfo, "Transmission error between MST and ICRW(retry error).");
  1058. break;
  1059. case 0xA4:
  1060. eRt = Error_Stoped;
  1061. sprintf(strErrInfo, "Transmission error between MST and ICT(retry error).");
  1062. break;
  1063. case 0xA5:
  1064. eRt = Error_DevMedia;
  1065. sprintf(strErrInfo, "The card jam at the hopper.");
  1066. break;
  1067. case 0xA6:
  1068. eRt = Error_Hardware;
  1069. sprintf(strErrInfo, "The hopping kicker could not return to the home position.");
  1070. break;
  1071. case 0xA7:
  1072. eRt = Error_Hardware;
  1073. sprintf(strErrInfo, "Motor error of MST.");
  1074. break;
  1075. case 0xA8:
  1076. eRt = Error_Hardware;
  1077. sprintf(strErrInfo, "SS sensor error of MST.");
  1078. break;
  1079. case 0xA9:
  1080. eRt = Error_DevMedia;
  1081. sprintf(strErrInfo, "The card does not exist at the slider.");
  1082. break;
  1083. case 0xAB:
  1084. eRt = Error_DevMedia;
  1085. sprintf(strErrInfo, "The reject-stacker does not exist./The reject-stacker was filled.");
  1086. break;
  1087. case 0xB0:
  1088. eRt = Error_Stoped;
  1089. sprintf(strErrInfo, "Not received initialize command.");
  1090. break;
  1091. case 0xFF:
  1092. eRt = Error_Stoped;
  1093. sprintf(strErrInfo, "A given command code is unidentified.");
  1094. break;
  1095. case CWERR_IDC_S_SOFT_UNK:
  1096. eRt = Error_Stoped;
  1097. sprintf(strErrInfo, "communation error.");
  1098. break;
  1099. default:
  1100. eRt = Error_Stoped;
  1101. sprintf(strErrInfo, "unknow errcode(%d).", nRt);
  1102. break;
  1103. }
  1104. char strInfo[300] = { 0 };
  1105. va_list arglist;
  1106. va_start(arglist, lpszFormat);
  1107. _vsnprintf(strInfo, 128, lpszFormat, arglist);
  1108. va_end(arglist);
  1109. sprintf(strInfo + strlen(strInfo), " %s", strErrInfo);
  1110. strInfo[200] = 0;
  1111. //对dwErrMsgLen字段进行拆分
  1112. // 高两字节存储硬件设备错误码 (dwErrMsgLen & 0xFFFF0000)
  1113. // 低两字节保留以前的作用即:存储错误信息字符串szErrMsg的实际有效长度
  1114. m_DevErrInfo.dwErrMsgLen = (eRt<<16)&0xFFFF0000;
  1115. m_DevErrInfo.dwErrMsgLen += strlen(m_DevErrInfo.szErrMsg)&0x0000FFFF;
  1116. sprintf(m_DevErrInfo.szErrMsg, "{\"ErrCode\":\"%04x\",\"Description\":\"%s\"}", eRt, strInfo);
  1117. // memset(m_DevErrInfo.szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  1118. // memcpy(m_DevErrInfo.szErrMsg, strErrInfo, strlen(strErrInfo));
  1119. if (eRt != Error_Succeed)
  1120. LOG4VTM(WARN, m_DevErrInfo.szErrMsg);
  1121. else
  1122. LOG4VTM(INFO, m_DevErrInfo.szErrMsg);
  1123. return eRt;
  1124. }