#include "stdafx.h" #include "SpBase.h" #include "SpHelper.h" #include "CardIssuerFSM.h" #include "GetDevInfoHelper.h" #include "EventCode.h" #include "RVCComm.h" //oilyang@20200522 go on using // deprecated!! [4/17/2020 16:15 @Gifur] #include "CardIssuer_UserErrorCode.h" //后续替代EventCode.h,暂时混合使用,时间太紧 #include "CardIssuer_msg_g.h" #include "ModuleMix.h" #include "publicFunExport.h" #pragma comment(lib, "libpublicFun.lib") #include #include #ifdef RVC_OS_WIN #define _ATL_NO_AUTOMATIC_NAMESPACE #include #endif //RVC_OS_WIN char tmpxx[1024]; char testIC[1024]; #include "CardIssuerClass.h" #include "mod_cardissuer.h" #include "stdafx.h" #include //oiltest@20200915 temp for GetTickCount #ifdef RVC_OS_WIN #define _ATL_NO_AUTOMATIC_NAMESPACE #include #include // Link to Bthprops.lib #include #pragma comment (lib, "Ws2_32.lib") #pragma comment (lib, "Bthprops.lib") #else #include #include #endif //RVC_OS_WIN unsigned long long GetTickCountRVC() { #ifdef RVC_OS_WIN return GetTickCount64(); #else struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); return (ts.tv_sec * 1000 + ts.tv_nsec / 1000000); #endif //RVC_OS_WIN } #define CARDREADER_INIT_COUNT 3 #define GET_DEV_STATUS_COUNT 1//oilyang@20180104 change from 3 to 1,no need to test 3 times const int TIMER1 = 1; const int TIMER_EJECT = 2; const int INSERT_INTERVAL = 300; const int EJECT_INTERVAL = 300; const int INSERT_TRY_NUM = 200; const int READ_TRY_NUM = 1;//oiltmp const int RESET_TRY_NUM = 3; const int WAIT_TRY_NUM = 120; const int WAIT_INTERVAL = 500; const int MAX_RESET_TIMEROUT = 5000; const int MAX_RESET_TIMES_PERIOD = 0;//oiltmp configure to ini file? const int READ_TRY_INTERVAL = 300; const int INIT_TRY_NUM = 3; const int ACCEPT_TRY_INTERVAL = 500; const int ACCEPT_TRY_NUM = 110; CRITICAL_SECTION g_sciRecord; class CCardIssuerEntity; void CCardIssuerFSM::s0_on_entry() { LOG_FUNCTION(); m_currentFSMState = 0; SetDevStateAndSendMsg(DEVICE_STATUS_NOT_READY); FSMEvent* e; e = new FSMEvent(USER_EVT_INIT); PostEventFIFO(e); } void CCardIssuerFSM::s0_on_exit() { LOG_FUNCTION(); } unsigned int CCardIssuerFSM::s0_on_event(FSMEvent* pEvt) { LOG_FUNCTION(); DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s0 evt (%d,%d)", pEvt->iEvt, pEvt->param1); switch (pEvt->iEvt) { case USER_EVT_INIT: { InitTask* task = new InitTask(this); GetEntityBase()->GetFunction()->PostThreadPoolTask(task); pEvt->SetHandled(); return 0; } break; case USER_EVT_QUIT: break; case USER_EVT_TEST: break; default: break; } return 0; } //Initializing void CCardIssuerFSM::s1_on_entry() { LOG_FUNCTION(); m_currentFSMState = 1; GetEntityBase()->GetFunction()->SetSysVar("CardStoreInUse", "N"); } void CCardIssuerFSM::s1_on_exit() { LOG_FUNCTION(); } unsigned int CCardIssuerFSM::s1_on_event(FSMEvent* event) { LOG_FUNCTION(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("s1 evt (%d,%d)", event->iEvt, event->param1)); if (event->iEvt == USER_EVT_INITFINISHED) { event->SetHandled(); int err = event->param1; if (err == 0) { return 0; } else { return 1; } }else if (event->iEvt == USER_EVT_QUIT) { event->SetHandled(); return 0; } return 0; } //Idle void CCardIssuerFSM::s2_on_entry() { LOG_FUNCTION(); ToLogWarnInfoAboutTermCustom(); m_currentFSMState = 2; GetEntityBase()->GetFunction()->SetUserDefineState(USER_CARDISSUER_IDLE); SetDevStateAndSendMsg(DEVICE_STATUS_NORMAL, false); m_resetTimes = 0; m_testResult = Error_Succeed; m_bIssuingExit = false; } void CCardIssuerFSM::s2_on_exit() { LOG_FUNCTION(); } unsigned int CCardIssuerFSM::s2_on_event(FSMEvent* pEvt) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("s2 evt (%d,%d)", pEvt->iEvt, pEvt->param1)); int ret = 0; switch (pEvt->iEvt) { case USER_EVT_ACCEPT: { CardAcceptEvent *cae = dynamic_cast(pEvt); m_bCancelAccept = false; AcceptTask* task = new AcceptTask(this); task->ctx = cae->ctx; GetEntityBase()->GetFunction()->PostThreadPoolTask(task); pEvt->SetHandled(); } break; case USER_EVT_ISSUE: case USER_EVT_ISSUE_EX: { IssueTask* task = new IssueTask(this); CardIssueEvent *cie = NULL; CardIssueExEvent *ciee = NULL; if (pEvt->iEvt == USER_EVT_ISSUE) { cie = dynamic_cast(pEvt); task->ctx = cie->ctx; task->ctxEx = NULL; } else { ciee = dynamic_cast(pEvt); task->ctxEx = ciee->ctx; task->ctx = NULL; } GetEntityBase()->GetFunction()->PostThreadPoolTask(task); pEvt->SetHandled(); } break; case USER_EVT_EXIT: { m_captureReason = "4001"; m_bExit = true; pEvt->SetHandled(); DoExitWhenIdleTask *task = new DoExitWhenIdleTask(this); GetEntityBase()->GetFunction()->PostThreadPoolTask(task); } break; case USER_EVT_QUIT: pEvt->SetHandled(); break; case USER_EVT_GET_MATERIAL_EX: { pEvt->SetHandled(); GetMaterialExEvent *pGMEE = dynamic_cast(pEvt); pGMEE->ctx->Ans.captured = m_CardCaptured; pGMEE->ctx->Ans.hasHopper.Init(m_hopperNum); pGMEE->ctx->Ans.CardBoxNo.Init(m_hopperNum); pGMEE->ctx->Ans.PsbCode.Init(m_hopperNum); pGMEE->ctx->Ans.PsbName.Init(m_hopperNum); pGMEE->ctx->Ans.Maintainer.Init(m_hopperNum); pGMEE->ctx->Ans.CardInit.Init(m_hopperNum); pGMEE->ctx->Ans.CardPercent.Init(m_hopperNum); pGMEE->ctx->Ans.remains.Init(m_hopperNum); pGMEE->ctx->Ans.issued.Init(m_hopperNum); pGMEE->ctx->Ans.mixed.Init(m_hopperNum); pGMEE->ctx->Ans.MaintainTime.Init(m_hopperNum); pGMEE->ctx->Ans.reserved1.Init(m_hopperNum); pGMEE->ctx->Ans.reserved2.Init(m_hopperNum); for (int i = 0; i < m_hopperNum; ++i) { pGMEE->ctx->Ans.hasHopper[i] = m_bHasHopper[i]; if (m_bHasHopper[i]) { pGMEE->ctx->Ans.CardBoxNo[i] = m_CardBoxNoEx[i]; pGMEE->ctx->Ans.PsbCode[i] = m_PsbCodeEx[i]; pGMEE->ctx->Ans.PsbName[i] = m_PsbNameEx[i]; pGMEE->ctx->Ans.Maintainer[i] = m_MaintainerEx[i]; pGMEE->ctx->Ans.CardInit[i] = m_CardInitEx[i]; pGMEE->ctx->Ans.CardPercent[i] = m_CardPercentEx[i]; pGMEE->ctx->Ans.remains[i] = m_remainsEx[i]; pGMEE->ctx->Ans.issued[i] = m_issuedEx[i]; pGMEE->ctx->Ans.mixed[i] = m_mixedEx[i]; pGMEE->ctx->Ans.MaintainTime[i] = ""; pGMEE->ctx->Ans.reserved1[i] = 0; pGMEE->ctx->Ans.reserved2[i] = ""; } else { pGMEE->ctx->Ans.CardBoxNo[i] = ""; pGMEE->ctx->Ans.PsbCode[i] = ""; pGMEE->ctx->Ans.PsbName[i] = ""; pGMEE->ctx->Ans.Maintainer[i] = ""; pGMEE->ctx->Ans.CardInit[i] = 0; pGMEE->ctx->Ans.CardPercent[i] = 0; pGMEE->ctx->Ans.remains[i] = 0; pGMEE->ctx->Ans.issued[i] = 0; pGMEE->ctx->Ans.mixed[i] = 0; pGMEE->ctx->Ans.MaintainTime[i] = ""; pGMEE->ctx->Ans.reserved1[i] = 0; pGMEE->ctx->Ans.reserved2[i] = ""; } DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("GetMaterial CardBoxNo (%d):%s, PsbCode:%s, PsbName:%s, CardInit:%d, remains:%d, issued:%d, mixed:%d,",i, pGMEE->ctx->Ans.CardBoxNo[i].GetData(), pGMEE->ctx->Ans.PsbCode[i].GetData(), pGMEE->ctx->Ans.PsbName[i].GetData(), pGMEE->ctx->Ans.CardInit[i], pGMEE->ctx->Ans.remains[i], pGMEE->ctx->Ans.issued[i], pGMEE->ctx->Ans.mixed[i]); } pGMEE->ctx->Ans.reserved2[0] = m_devCat.szVendor; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("captured:%d, szVendor:%s", m_CardCaptured, m_devCat.szVendor); pGMEE->ctx->Answer(Error_Succeed); } break; case USER_EVT_SET_MATERIAL_EX: { m_bSettingMaterial = true; pEvt->SetHandled(); CSmallDateTime currTime = CSmallDateTime::GetNow(); SetMaterialExEvent *pSMEE = dynamic_cast(pEvt); bool bSetCapture = false; if (pSMEE->ctx->Req.SetCaptured == 1) { m_CardCaptured = pSMEE->ctx->Req.captured; m_MaintainerEx[0] = pSMEE->ctx->Req.Maintainer[0]; m_MaintainTimeEx[0] = (DWORD)currTime; bSetCapture = SetCardCaptured(pSMEE->ctx->Req.captured,true); } DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("bSetCapture:%d, Req.SetCaptured:%d, Req.captured:%d, Req.Maintainer[0]:%s, Req.SetHopper.GetCount:%d", bSetCapture, pSMEE->ctx->Req.SetCaptured, pSMEE->ctx->Req.captured, pSMEE->ctx->Req.Maintainer[0].GetData(), pSMEE->ctx->Req.SetHopper.GetCount()); bool bMaintain[12]; memset(bMaintain, 0, 12); bool bNeedToSyncData = false; for (int i = 0; i < pSMEE->ctx->Req.SetHopper.GetCount(); ++i) { bMaintain[i] = false; if (pSMEE->ctx->Req.SetHopper[i] == 1) { bMaintain[i] = true; bNeedToSyncData = true; m_CardBoxNoEx[i] = pSMEE->ctx->Req.CardBoxNo[i]; m_PsbCodeEx[i] = pSMEE->ctx->Req.PsbCode[i]; m_PsbNameEx[i] = pSMEE->ctx->Req.PsbName[i]; m_MaintainerEx[i] = pSMEE->ctx->Req.Maintainer[i]; m_CardInitEx[i] = pSMEE->ctx->Req.CardInit[i]; m_CardPercentEx[i] = pSMEE->ctx->Req.CardPercent[i]; m_remainsEx[i] = pSMEE->ctx->Req.remains[i]; m_issuedEx[i] = pSMEE->ctx->Req.issued[i]; m_mixedEx[i] = pSMEE->ctx->Req.mixed[i]; m_MaintainTimeEx[i] = (DWORD)currTime; m_csMaintainTimeEx[i] = currTime.GetNow().ToTimeString(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SetMaterial, CardBoxNo:%s, PsbCode:%s, PsbName:%s, CardInit:%d, remains:%d, issued:%d, mixed:%d,", pSMEE->ctx->Req.CardBoxNo[i].GetData(), pSMEE->ctx->Req.PsbCode[i].GetData(), pSMEE->ctx->Req.PsbName[i].GetData(), pSMEE->ctx->Req.CardInit[i], pSMEE->ctx->Req.remains[i], pSMEE->ctx->Req.issued[i], pSMEE->ctx->Req.mixed[i]); } } pSMEE->ctx->Ans.reserved1.Init(1); pSMEE->ctx->Ans.reserved2.Init(1); pSMEE->ctx->Ans.reserved1[0] = 1; pSMEE->ctx->Ans.reserved2[0] = ""; UpdateLocalRunCfg(pSMEE->ctx->Req.SetHopper); pSMEE->ctx->Answer(Error_Succeed); m_bSettingMaterial = false; if (bNeedToSyncData) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SetMaterial, need to SyncDataToDB."); if (pSMEE->ctx->Req.SetCaptured == 1) SyncDataToDB(bMaintain); else SyncDataToDB(bMaintain, false); } } break; case USER_EVT_PREONLINE: { pEvt->SetHandled(); PreOnlineEvent* poe = dynamic_cast(pEvt); if (poe->ctx->Req.reserved1.GetLength() > 0 && _strnicmp("kaku#", (const char*)poe->ctx->Req.reserved1, 5) == 0) { PreOnlineTask* task = new PreOnlineTask(this); task->ctx = poe->ctx; GetEntityBase()->GetFunction()->PostThreadPoolTask(task); ret = 16; } break; } default: break; } return ret; } //Accepting void CCardIssuerFSM::s3_on_entry() { LOG_FUNCTION(); m_currentFSMState = 3; } void CCardIssuerFSM::s3_on_exit() { LOG_FUNCTION(); } unsigned int CCardIssuerFSM::s3_on_event(FSMEvent* pEvt) { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s3 evt(%d,%d)", pEvt->iEvt, pEvt->param1); int ret = 0; switch(pEvt->iEvt) { case USER_EVT_ACCEPTFINISHED: { pEvt->SetHandled(); switch(pEvt->param1) { case 0: case 1: case 2: case 3: case 4: ret = pEvt->param1; break; default: ret = 1; break; } } break; case USER_EVT_ACCEPT_CANCEL: m_bCancelAccept = true; //m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN); pEvt->SetHandled(); ret = 3; break; case USER_EVT_EXIT: m_captureReason = "4001"; m_bExit = true; pEvt->SetHandled(); break; case USER_EVT_QUIT: pEvt->SetHandled(); break; default: break; } return ret; } //Hold void CCardIssuerFSM::s4_on_entry() { LOG_FUNCTION(); m_currentFSMState = 4; GetEntityBase()->GetFunction()->SetUserDefineState(USER_CARDISSUER_HOLD); } void CCardIssuerFSM::s4_on_exit() { LOG_FUNCTION(); } unsigned int CCardIssuerFSM::s4_on_event(FSMEvent* pEvt) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("s4 evt (%d,%d)", pEvt->iEvt, pEvt->param1)); switch(pEvt->iEvt){ case USER_EVT_READ: { CardReadEvent* crne = dynamic_cast(pEvt); ReadTask* task = new ReadTask(this); task->ctx = crne->ctx; GetEntityBase()->GetFunction()->PostThreadPoolTask(task); pEvt->SetHandled(); return 0; } case USER_EVT_PREONLINE: { PreOnlineEvent* poe = dynamic_cast(pEvt); PreOnlineTask* task = new PreOnlineTask(this); task->ctx = poe->ctx; GetEntityBase()->GetFunction()->PostThreadPoolTask(task); pEvt->SetHandled(); return 0; } case USER_EVT_POSTONLINE: { PostOnlineEvent* poe = dynamic_cast(pEvt); PostOnlineTask* task = new PostOnlineTask(this); task->ctx = poe->ctx; GetEntityBase()->GetFunction()->PostThreadPoolTask(task); pEvt->SetHandled(); return 0; } case USER_EVT_CAPTURE: { CardCaptureEvent *cce = dynamic_cast(pEvt); CaptureTask *task= new CaptureTask(this); task->ctx = cce->ctx; GetEntityBase()->GetFunction()->PostThreadPoolTask(task); pEvt->SetHandled(); //oilyang@20171215 经与郭丹汪磊东宋锐讨论,目前不存在4022的情况,暂时以4019代替 //m_captureReason = "4022"; m_captureReason = "4019"; return 0; } case USER_EVT_EXIT: case USER_EVT_EJECT: case USER_EVT_ACCEPT: case USER_EVT_ACCEPT_CANCEL: { if (pEvt->iEvt == USER_EVT_ACCEPT) { CardAcceptEvent *cae = dynamic_cast(pEvt); CaptureTask *task= new CaptureTask(this); task->ctx = NULL; GetEntityBase()->GetFunction()->PostThreadPoolTask(task); pEvt->SetHandled(); cae->ctx->Answer(Error_Duplication); return 0; } if ((pEvt->iEvt == USER_EVT_EXIT) && m_issueStatus) { m_captureReason = "4001"; CardCaptureEvent *cce = dynamic_cast(pEvt); CaptureTask *task= new CaptureTask(this); task->ctx = NULL; GetEntityBase()->GetFunction()->PostThreadPoolTask(task); pEvt->SetHandled(); return 1; } CardEjectEvent *cee; if (pEvt->iEvt == USER_EVT_EJECT) cee = dynamic_cast(pEvt); EjectTask *task= new EjectTask(this); if (pEvt->iEvt == USER_EVT_EJECT) task->ctx = cee->ctx; else task->ctx = NULL; GetEntityBase()->GetFunction()->PostThreadPoolTask(task); pEvt->SetHandled(); return 0; } case USER_EVT_QUIT: { pEvt->SetHandled(); return 0; } case USER_EVT_GET_MATERIAL_EX: { pEvt->SetHandled(); GetMaterialExEvent *pGMEE = dynamic_cast(pEvt); pGMEE->ctx->Ans.captured = m_CardCaptured; pGMEE->ctx->Ans.hasHopper.Init(m_hopperNum); pGMEE->ctx->Ans.CardBoxNo.Init(m_hopperNum); pGMEE->ctx->Ans.PsbCode.Init(m_hopperNum); pGMEE->ctx->Ans.PsbName.Init(m_hopperNum); pGMEE->ctx->Ans.Maintainer.Init(m_hopperNum); pGMEE->ctx->Ans.CardInit.Init(m_hopperNum); pGMEE->ctx->Ans.CardPercent.Init(m_hopperNum); pGMEE->ctx->Ans.remains.Init(m_hopperNum); pGMEE->ctx->Ans.issued.Init(m_hopperNum); pGMEE->ctx->Ans.mixed.Init(m_hopperNum); pGMEE->ctx->Ans.MaintainTime.Init(m_hopperNum); pGMEE->ctx->Ans.reserved1.Init(m_hopperNum); pGMEE->ctx->Ans.reserved2.Init(m_hopperNum); for (int i = 0; i < m_hopperNum; ++i) { pGMEE->ctx->Ans.hasHopper[i] = m_bHasHopper[i]; if (m_bHasHopper[i]) { pGMEE->ctx->Ans.CardBoxNo[i] = m_CardBoxNoEx[i]; pGMEE->ctx->Ans.PsbCode[i] = m_PsbCodeEx[i]; pGMEE->ctx->Ans.PsbName[i] = m_PsbNameEx[i]; pGMEE->ctx->Ans.Maintainer[i] = m_MaintainerEx[i]; pGMEE->ctx->Ans.CardInit[i] = m_CardInitEx[i]; pGMEE->ctx->Ans.CardPercent[i] = m_CardPercentEx[i]; pGMEE->ctx->Ans.remains[i] = m_remainsEx[i]; pGMEE->ctx->Ans.issued[i] = m_issuedEx[i]; pGMEE->ctx->Ans.mixed[i] = m_mixedEx[i]; //to be added maintain time oiltmp pGMEE->ctx->Ans.MaintainTime[i] = ""; pGMEE->ctx->Ans.reserved1[i] = 0; pGMEE->ctx->Ans.reserved2[i] = ""; } else { pGMEE->ctx->Ans.CardBoxNo[i] = ""; pGMEE->ctx->Ans.PsbCode[i] = ""; pGMEE->ctx->Ans.PsbName[i] = ""; pGMEE->ctx->Ans.Maintainer[i] = ""; pGMEE->ctx->Ans.CardInit[i] = 0; pGMEE->ctx->Ans.CardPercent[i] = 0; pGMEE->ctx->Ans.remains[i] = 0; pGMEE->ctx->Ans.issued[i] = 0; pGMEE->ctx->Ans.mixed[i] = 0; pGMEE->ctx->Ans.MaintainTime[i] = ""; pGMEE->ctx->Ans.reserved1[i] = 0; pGMEE->ctx->Ans.reserved2[i] = ""; } DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("GetMaterial, CardBoxNo:%s, PsbCode:%s, PsbName:%s, CardInit:%d, remains:%d, issued:%d, mixed:%d,", pGMEE->ctx->Ans.CardBoxNo[i].GetData(), pGMEE->ctx->Ans.PsbCode[i].GetData(), pGMEE->ctx->Ans.PsbName[i].GetData(), pGMEE->ctx->Ans.CardInit[i], pGMEE->ctx->Ans.remains[i], pGMEE->ctx->Ans.issued[i], pGMEE->ctx->Ans.mixed[i])); } pGMEE->ctx->Ans.reserved2[0] = m_devCat.szVendor; pGMEE->ctx->Answer(Error_Succeed); } break; case USER_EVT_SET_MATERIAL_EX: { m_bSettingMaterial = true; pEvt->SetHandled(); //SetCardRemains???oiltmp CSmallDateTime currTime = CSmallDateTime::GetNow(); SetMaterialExEvent *pSMEE = dynamic_cast(pEvt); bool bSetCapture = false; if (pSMEE->ctx->Req.SetCaptured == 1) { m_CardCaptured = pSMEE->ctx->Req.captured; m_MaintainerEx[0] = pSMEE->ctx->Req.Maintainer[0]; m_MaintainTimeEx[0] = (DWORD)currTime; bSetCapture = SetCardCaptured(pSMEE->ctx->Req.captured,true); } DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("bSetCapture:%d, Req.SetCaptured:%d, Req.captured:%d, Req.Maintainer[0]:%s, Req.SetHopper.GetCount:%d", bSetCapture, pSMEE->ctx->Req.SetCaptured, pSMEE->ctx->Req.captured, pSMEE->ctx->Req.Maintainer[0].GetData(), pSMEE->ctx->Req.SetHopper.GetCount())); bool bMaintain[12]; memset(bMaintain, 0, 12); bool bNeedToSyncData = false; for (int i = 0; i < pSMEE->ctx->Req.SetHopper.GetCount(); ++i) { bMaintain[i] = false; if (pSMEE->ctx->Req.SetHopper[i] == 1) { bMaintain[i] = true; bNeedToSyncData = true; m_CardBoxNoEx[i] = pSMEE->ctx->Req.CardBoxNo[i]; m_PsbCodeEx[i] = pSMEE->ctx->Req.PsbCode[i]; m_PsbNameEx[i] = pSMEE->ctx->Req.PsbName[i]; m_MaintainerEx[i] = pSMEE->ctx->Req.Maintainer[i]; m_CardInitEx[i] = pSMEE->ctx->Req.CardInit[i]; m_CardPercentEx[i] = pSMEE->ctx->Req.CardPercent[i]; m_remainsEx[i] = pSMEE->ctx->Req.remains[i]; m_issuedEx[i] = pSMEE->ctx->Req.issued[i]; m_mixedEx[i] = pSMEE->ctx->Req.mixed[i]; m_MaintainTimeEx[i] = (DWORD)currTime; m_csMaintainTimeEx[i] = currTime.GetNow().ToTimeString(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("SetMaterial, CardBoxNo:%s, PsbCode:%s, PsbName:%s, CardInit:%d, remains:%d, issued:%d, mixed:%d,", pSMEE->ctx->Req.CardBoxNo[i].GetData(), pSMEE->ctx->Req.PsbCode[i].GetData(), pSMEE->ctx->Req.PsbName[i].GetData(), pSMEE->ctx->Req.CardInit[i], pSMEE->ctx->Req.remains[i], pSMEE->ctx->Req.issued[i], pSMEE->ctx->Req.mixed[i])); } } pSMEE->ctx->Ans.reserved1.Init(1); pSMEE->ctx->Ans.reserved2.Init(1); pSMEE->ctx->Ans.reserved1[0] = 0; pSMEE->ctx->Ans.reserved2[0] = ""; UpdateLocalRunCfg(pSMEE->ctx->Req.SetHopper); pSMEE->ctx->Answer(Error_Succeed); m_bSettingMaterial = false; if (bNeedToSyncData) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SetMaterial, need to SyncDataToDB."); if (pSMEE->ctx->Req.SetCaptured == 1) SyncDataToDB(bMaintain); else SyncDataToDB(bMaintain, false); } } break; case USER_EVT_WRITE: { CardWriteEvent* cwe = dynamic_cast(pEvt); WriteTask* task = new WriteTask(this); task->ctx = cwe->ctx; GetEntityBase()->GetFunction()->PostThreadPoolTask(task); pEvt->SetHandled(); } break; case USER_EVT_SAM_IC: { SAMICCommandEvent* sice = dynamic_cast(pEvt); SAMICCommandTask* task = new SAMICCommandTask(this); task->ctx = sice->ctx; GetEntityBase()->GetFunction()->PostThreadPoolTask(task); pEvt->SetHandled(); } break; case USER_EVT_ISSUE_EX: { IssueTask* task = new IssueTask(this); CardIssueExEvent *ciee = NULL; ciee = dynamic_cast(pEvt); task->ctxEx = ciee->ctx; task->ctx = NULL; GetEntityBase()->GetFunction()->PostThreadPoolTask(task); pEvt->SetHandled(); return pEvt->param1; } break; case USER_EVT_ISSUE_EX_FINISHED: pEvt->SetHandled(); return pEvt->param1; default: break; } return 0; } //Reading void CCardIssuerFSM::s5_on_entry() { LOG_FUNCTION(); m_currentFSMState = 5; GetEntityBase()->GetFunction()->SetUserDefineState(USER_CARDISSUER_READING); } void CCardIssuerFSM::s5_on_exit() { LOG_FUNCTION(); } unsigned int CCardIssuerFSM::s5_on_event(FSMEvent* pEvt) { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s5 evt (%d,%d)", pEvt->iEvt, pEvt->param1); int ret = 0; switch(pEvt->iEvt) { case USER_EVT_READ_FINISHED: { pEvt->SetHandled(); CardReadFinishedEvent *pCRNFE = dynamic_cast(pEvt); if (pCRNFE->param1 == 0) { pCRNFE->ctx->Answer(Error_Succeed); ret = 0; }else if (pCRNFE->param1 == 2) { pCRNFE->ctx->Answer(Error_DevMedia); ret = 2; } else { SetErrPackage("Read finished", m_csDevSN, Error_Unexpect, MEC_DEVAPI_CARDISSUER_GetDevStatus); if (IsInBusiness()) { pCRNFE->ctx->Answer(Error_Unexpect, AlarmDEC(true)); DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode("QLR040220303").setResultCode("RTA2322")("获取设备状态GetDevStatus失败"); } else { pCRNFE->ctx->Answer(Error_Unexpect, AlarmDEC()); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220303").setResultCode("RTA2322")("获取设备状态GetDevStatus失败"); } ret = 1; } } break; case USER_EVT_EXIT: { pEvt->SetHandled(); m_captureReason = "4001"; } break; case USER_EVT_QUIT: { pEvt->SetHandled(); ret = 0; } default: break; } return ret; } //Ejecting void CCardIssuerFSM::s6_on_entry() { LOG_FUNCTION(); m_currentFSMState = 6; } void CCardIssuerFSM::s6_on_exit() { LOG_FUNCTION(); } unsigned int CCardIssuerFSM::s6_on_event(FSMEvent* pEvt) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("s6 evt (%d,%d)", pEvt->iEvt, pEvt->param1)); if (pEvt->iEvt == USER_EVT_EJECTFINISHED){ pEvt->SetHandled(); if (pEvt->param1 == 0) return 0; else return 1; }else if (pEvt->iEvt == USER_EVT_QUIT) { pEvt->SetHandled(); return 0; } return 0; } //Waiting fetch void CCardIssuerFSM::s7_on_entry() { LOG_FUNCTION(); m_currentFSMState = 7; GetEntityBase()->GetFunction()->SetUserDefineState(USER_CARDISSUER_WAITFETCHING); WaitFetchingTask* task = new WaitFetchingTask(this); GetEntityBase()->GetFunction()->PostThreadPoolTask(task); } void CCardIssuerFSM::s7_on_exit() { LOG_FUNCTION(); } unsigned int CCardIssuerFSM::s7_on_event(FSMEvent* pEvt) { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s7 evt (%d, %d)", pEvt->iEvt, pEvt->param1); switch (pEvt->iEvt) { case USER_EVT_WAITFINISHED: { pEvt->SetHandled(); if (pEvt->param1 == 0) { FetchCard evt; evt.status = 0; SpSendBroadcast(m_pEntity->GetFunction(), SP_MSG_OF(FetchCard), SP_MSG_SIG_OF(FetchCard), evt); LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_OP, "CardIssuer op."); m_currCardNo = ""; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("客户取走卡片msg发送"); return 0; } else if (pEvt->param1 == 1) { FetchCard evt; evt.status = 1; SpSendBroadcast(m_pEntity->GetFunction(), SP_MSG_OF(FetchCard), SP_MSG_SIG_OF(FetchCard), evt); DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER)("取卡时设备故障"); return 1; } else { FetchCard evt; evt.status = 2; SpSendBroadcast(m_pEntity->GetFunction(), SP_MSG_OF(FetchCard), SP_MSG_SIG_OF(FetchCard), evt); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("客户未取卡超时msg发送"); m_captureReason = "4019"; LogWarn(Severity_Low, Error_NotInit, CardIssuer_UserErrorCode_Customer_Forget_Fectch_Card, "Customer forget fetch card."); CaptureTask* task = new CaptureTask(this); GetEntityBase()->GetFunction()->PostThreadPoolTask(task); return 2; } } case USER_EVT_QUIT: { pEvt->SetHandled(); return 0; } case USER_EVT_GET_MATERIAL_EX: { pEvt->SetHandled(); GetMaterialExEvent *pGMEE = dynamic_cast(pEvt); pGMEE->ctx->Ans.captured = m_CardCaptured; pGMEE->ctx->Ans.hasHopper.Init(m_hopperNum); pGMEE->ctx->Ans.CardBoxNo.Init(m_hopperNum); pGMEE->ctx->Ans.PsbCode.Init(m_hopperNum); pGMEE->ctx->Ans.PsbName.Init(m_hopperNum); pGMEE->ctx->Ans.Maintainer.Init(m_hopperNum); pGMEE->ctx->Ans.CardInit.Init(m_hopperNum); pGMEE->ctx->Ans.CardPercent.Init(m_hopperNum); pGMEE->ctx->Ans.remains.Init(m_hopperNum); pGMEE->ctx->Ans.issued.Init(m_hopperNum); pGMEE->ctx->Ans.mixed.Init(m_hopperNum); pGMEE->ctx->Ans.MaintainTime.Init(m_hopperNum); pGMEE->ctx->Ans.reserved1.Init(m_hopperNum); pGMEE->ctx->Ans.reserved2.Init(m_hopperNum); for (int i = 0; i < m_hopperNum; ++i) { pGMEE->ctx->Ans.hasHopper[i] = m_bHasHopper[i]; if (m_bHasHopper[i]) { pGMEE->ctx->Ans.CardBoxNo[i] = m_CardBoxNoEx[i]; pGMEE->ctx->Ans.PsbCode[i] = m_PsbCodeEx[i]; pGMEE->ctx->Ans.PsbName[i] = m_PsbNameEx[i]; pGMEE->ctx->Ans.Maintainer[i] = m_MaintainerEx[i]; pGMEE->ctx->Ans.CardInit[i] = m_CardInitEx[i]; pGMEE->ctx->Ans.CardPercent[i] = m_CardPercentEx[i]; pGMEE->ctx->Ans.remains[i] = m_remainsEx[i]; pGMEE->ctx->Ans.issued[i] = m_issuedEx[i]; pGMEE->ctx->Ans.mixed[i] = m_mixedEx[i]; //to be added maintain time oiltmp pGMEE->ctx->Ans.MaintainTime[i] = ""; pGMEE->ctx->Ans.reserved1[i] = 0; pGMEE->ctx->Ans.reserved2[i] = ""; } else { pGMEE->ctx->Ans.CardBoxNo[i] = ""; pGMEE->ctx->Ans.PsbCode[i] = ""; pGMEE->ctx->Ans.PsbName[i] = ""; pGMEE->ctx->Ans.Maintainer[i] = ""; pGMEE->ctx->Ans.CardInit[i] = 0; pGMEE->ctx->Ans.CardPercent[i] = 0; pGMEE->ctx->Ans.remains[i] = 0; pGMEE->ctx->Ans.issued[i] = 0; pGMEE->ctx->Ans.mixed[i] = 0; pGMEE->ctx->Ans.MaintainTime[i] = ""; pGMEE->ctx->Ans.reserved1[i] = 0; pGMEE->ctx->Ans.reserved2[i] = ""; } DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetMaterial, CardBoxNo:%s, PsbCode:%s, PsbName:%s, CardInit:%d, remains:%d, issued:%d, mixed:%d,", pGMEE->ctx->Ans.CardBoxNo[i].GetData(), pGMEE->ctx->Ans.PsbCode[i].GetData(), pGMEE->ctx->Ans.PsbName[i].GetData(), pGMEE->ctx->Ans.CardInit[i], pGMEE->ctx->Ans.remains[i], pGMEE->ctx->Ans.issued[i], pGMEE->ctx->Ans.mixed[i]); } pGMEE->ctx->Ans.reserved2[0] = m_devCat.szVendor; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("captured:%d, szVendor:%s", m_CardCaptured, m_devCat.szVendor); pGMEE->ctx->Answer(Error_Succeed); } break; case USER_EVT_SET_MATERIAL_EX: { m_bSettingMaterial = true; pEvt->SetHandled(); //SetCardRemains???oiltmp CSmallDateTime currTime = CSmallDateTime::GetNow(); SetMaterialExEvent *pSMEE = dynamic_cast(pEvt); bool bSetCapture = false; if (pSMEE->ctx->Req.SetCaptured == 1) { m_CardCaptured = pSMEE->ctx->Req.captured; m_MaintainerEx[0] = pSMEE->ctx->Req.Maintainer[0]; m_MaintainTimeEx[0] = (DWORD)currTime; bSetCapture = SetCardCaptured(pSMEE->ctx->Req.captured,true); } DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("bSetCapture:%d, Req.SetCaptured:%d, Req.captured:%d, Req.Maintainer[0]:%s, Req.SetHopper.GetCount:%d", bSetCapture, pSMEE->ctx->Req.SetCaptured, pSMEE->ctx->Req.captured, pSMEE->ctx->Req.Maintainer[0], pSMEE->ctx->Req.SetHopper.GetCount()); bool bMaintain[12]; memset(bMaintain, 0, 12); bool bNeedToSyncData = false; for (int i = 0; i < pSMEE->ctx->Req.SetHopper.GetCount(); ++i) { bMaintain[i] = false; if (pSMEE->ctx->Req.SetHopper[i] == 1) { bMaintain[i] = true; bNeedToSyncData = true; m_CardBoxNoEx[i] = pSMEE->ctx->Req.CardBoxNo[i]; m_PsbCodeEx[i] = pSMEE->ctx->Req.PsbCode[i]; m_PsbNameEx[i] = pSMEE->ctx->Req.PsbName[i]; m_MaintainerEx[i] = pSMEE->ctx->Req.Maintainer[i]; m_CardInitEx[i] = pSMEE->ctx->Req.CardInit[i]; m_CardPercentEx[i] = pSMEE->ctx->Req.CardPercent[i]; m_remainsEx[i] = pSMEE->ctx->Req.remains[i]; m_issuedEx[i] = pSMEE->ctx->Req.issued[i]; m_mixedEx[i] = pSMEE->ctx->Req.mixed[i]; m_MaintainTimeEx[i] = (DWORD)currTime; m_csMaintainTimeEx[i] = currTime.GetNow().ToTimeString(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SetMaterial, CardBoxNo:%s, PsbCode:%s, PsbName:%s, CardInit:%d, remains:%d, issued:%d, mixed:%d,", pSMEE->ctx->Req.CardBoxNo[i].GetData(), pSMEE->ctx->Req.PsbCode[i].GetData(), pSMEE->ctx->Req.PsbName[i].GetData(), pSMEE->ctx->Req.CardInit[i], pSMEE->ctx->Req.remains[i], pSMEE->ctx->Req.issued[i], pSMEE->ctx->Req.mixed[i]); } } pSMEE->ctx->Ans.reserved1.Init(1); pSMEE->ctx->Ans.reserved2.Init(1); pSMEE->ctx->Ans.reserved1[0] = 0; pSMEE->ctx->Ans.reserved2[0] = ""; UpdateLocalRunCfg(pSMEE->ctx->Req.SetHopper); pSMEE->ctx->Answer(Error_Succeed); m_bSettingMaterial = false; if (bNeedToSyncData) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SetMaterial, need to SyncDataToDB."); if (pSMEE->ctx->Req.SetCaptured == 1) SyncDataToDB(bMaintain); else SyncDataToDB(bMaintain, false); } } break; default: break; } return 0; } void CCardIssuerFSM::s8_on_entry() { LOG_FUNCTION(); m_currentFSMState = 8; } void CCardIssuerFSM::s8_on_exit() { LOG_FUNCTION(); } unsigned int CCardIssuerFSM::s8_on_event(FSMEvent* pEvt) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("s8 evt (%d,%d)", pEvt->iEvt, pEvt->param1)); if (pEvt->iEvt == USER_EVT_CAPTUREFINISHED){ pEvt->SetHandled(); if (pEvt->param1 == 0) return 0; else return 1; }else if (pEvt->iEvt == USER_EVT_QUIT) { pEvt->SetHandled(); return 0; } return 0; } //Failed void CCardIssuerFSM::s9_on_entry() { LOG_FUNCTION(); m_currentFSMState = 9; DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CardIssuer in fault state, need to reset."); GetEntityBase()->GetFunction()->SetUserDefineState(USER_CARDSWIPER_FAILED); SetDevStateAndSendMsg(DEVICE_STATUS_FAULT); FSMEvent *e = new FSMEvent(USER_EVT_RESET); PostEventFIFO(e); } void CCardIssuerFSM::s9_on_exit() { LOG_FUNCTION(); } unsigned int CCardIssuerFSM::s9_on_event(FSMEvent* pEvt) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("s9 evt (%d,%d)", pEvt->iEvt, pEvt->param1)); switch(pEvt->iEvt) { case USER_EVT_RESET: { pEvt->SetHandled(); m_resetTimes++; if((m_csMachineType.Compare("RVC.Stand2S", true) == 0 || m_csMachineType.Compare("RVC.Stand1SPlus", true) == 0) && m_resetTimes > MAX_RESET_TIMES_PERIOD) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("restart tried %d times, give up",m_resetTimes); m_testResult = Error_InvalidState; return 0; } ResetDeviceEvent* rde = dynamic_cast(pEvt); ResetTask* task = new ResetTask(this); GetEntityBase()->GetFunction()->PostThreadPoolTask(task); return 0; } break; case USER_EVT_RESETFINISHED: { ResetFinishedEvent *rfe = dynamic_cast(pEvt); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("reset finished, result:%d", rfe->param1); if (rfe->param1 == 0) return 0; else { m_testResult = Error_InvalidState; return 1; } } case USER_EVT_QUIT: pEvt->SetHandled(); return 0; case USER_EVT_ACCEPT_CANCEL: m_bCancelAccept = true; pEvt->SetHandled(); break; default: break; } return 0; } //Issuing void CCardIssuerFSM::s10_on_entry() { LOG_FUNCTION(); m_currentFSMState = 10; } void CCardIssuerFSM::s10_on_exit() { LOG_FUNCTION(); } unsigned int CCardIssuerFSM::s10_on_event(FSMEvent* pEvt) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("s10 evt (%d,%d)", pEvt->iEvt, pEvt->param1)); int ret = 0; switch(pEvt->iEvt) { case USER_EVT_ISSUE_FINISHED: pEvt->SetHandled(); ret = pEvt->param1; break; case USER_EVT_ISSUE_EX_FINISHED: pEvt->SetHandled(); ret = pEvt->param1; break; case USER_EVT_EXIT: pEvt->SetHandled(); m_captureReason = "4001"; m_bIssuingExit = true; break; case USER_EVT_ACCEPT_CANCEL: pEvt->SetHandled(); break; case USER_EVT_PREONLINE: { pEvt->SetHandled(); if (pEvt->iEvt == USER_EVT_PREONLINE) { PreOnlineEvent* poe = dynamic_cast(pEvt); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220327").setResultCode("RTA230Q")("卡库正在被其他机器跨机使用中"); poe->ctx->Answer(Error_Duplication); } } break; default: break; } return ret; } //Writing void CCardIssuerFSM::s11_on_entry() { LOG_FUNCTION(); m_currentFSMState = 11; } void CCardIssuerFSM::s11_on_exit() { LOG_FUNCTION(); } unsigned int CCardIssuerFSM::s11_on_event(FSMEvent* pEvt) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("s11(writing) evt (%d,%d)", pEvt->iEvt, pEvt->param1)); int ret = 0; switch(pEvt->iEvt) { case USER_EVT_WRITE_FINISHED: pEvt->SetHandled(); ret = pEvt->param1; break; case USER_EVT_EXIT: pEvt->SetHandled(); m_captureReason = "4001"; m_bIssuingExit = true; break; default: break; } return ret; } //SAMIC void CCardIssuerFSM::s14_on_entry() { LOG_FUNCTION(); m_currentFSMState = 14; } void CCardIssuerFSM::s14_on_exit() { LOG_FUNCTION(); } unsigned int CCardIssuerFSM::s14_on_event(FSMEvent* pEvt) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("s14 evt (%d,%d)", pEvt->iEvt, pEvt->param1)); int ret = 0; switch (pEvt->iEvt) { case USER_EVT_SAM_IC_FINISHED: pEvt->SetHandled(); break; default: break; } return ret; } ErrorCodeEnum CCardIssuerFSM::OnInit() { LOG_FUNCTION(); m_pCardProcess = new CCardProcess(); if (m_pCardProcess == NULL)//almost no use... { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("create card process failed."); return Error_Resource; } Load(); CSystemStaticInfo sysInfo; //oilyang 20160331 //so many function always return Error_Succeed,so is useless to process it. m_csMachineType = m_csSite = m_terminalNo = ""; GetEntityBase()->GetFunction()->GetSystemStaticInfo(sysInfo); m_csMachineType = sysInfo.strMachineType; m_csSite = sysInfo.strSite; m_terminalNo = sysInfo.strTerminalID; m_majorVerion = sysInfo.MachineVersion.GetMajor(); m_minorVerion = sysInfo.MachineVersion.GetMinor(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("CardIssuer, MachineType:%s, Site:%s, TerminalNo:%s, MachineVersion:%d.%d", m_csMachineType.GetData(), m_csSite.GetData(), m_terminalNo.GetData(), m_majorVerion, m_minorVerion)); m_devStatus.eMedia = CI_MEDIA_NOTPRESENT; m_bHasHopper[0] = false; m_bHasHopper[1] = false; m_bHasHopper[2] = false; InitializeCriticalSectionAndSpinCount(&g_sciRecord, 100); return Error_Succeed; } ErrorCodeEnum CCardIssuerFSM::OnExit() { LOG_FUNCTION(); ErrorCodeEnum eExit; long l_beginTime, l_endTime; if (m_hDevHelper != nullptr) { l_beginTime = GetTickCountRVC(); eExit = m_hDevHelper->GetDevStatus(m_devStatus); l_endTime = GetTickCountRVC(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetDevStatus").setCostTime(l_endTime - l_beginTime)("OnExit::GetDevStatus, m_devStatus.eMedia:%d, m_issueStatus:%d", m_devStatus.eMedia, m_issueStatus); if (eExit == Error_Succeed) { if (m_devStatus.eMedia == CI_MEDIA_PRESENT){ if (m_issueStatus) { LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_CaptureCard_OnExit, "OnExit, issue flag is 1, to capture card"); eExit = MachineMoveCardBackNotHold(); m_CardCaptured++; SetCardCaptured(m_CardCaptured); } else { LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_EjectCard_ByTerminal, "OnExit, issue flag is 0, to eject card"); MachineMoveCardFrontGate(); } } } l_beginTime = GetTickCountRVC(); eExit = m_hDevHelper->DevClose(); l_endTime = GetTickCountRVC(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DevClose").setCostTime(l_endTime - l_beginTime)("OnExit::DevClose"); if (eExit == Error_Succeed) DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("OnExit,读卡器关闭DevClose成功"); else DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("OnExit,读卡器关闭DevClose失败 eErr:%d", eExit); } FSMImpl::OnExit(); return Error_Succeed; } void TestShowRecvData(PBYTE hexBuf,DWORD len) { char* show = new char[MAX_TEST_SHOW]; ZeroMemory(show,MAX_TEST_SHOW); HexBuf2StrBuf(hexBuf,&show,len); delete[] show; } int FindHexCharPosition(LPBYTE data, BYTE hexChar, int len) { int notExist = -1,ret = 1,pos = 0; for (; pos < len; ++pos) { BYTE high = (*(data+pos))&0xf0; BYTE low = (*(data+pos))&0x0f; if ((high>>4) != hexChar) ret++; else return ret; if (low != hexChar) ret++; else return ret; } ret = notExist; return ret; } bool CCardIssuerFSM::GetDevStatus(bool bPrint) { int getDevInfoCount = 0; static unsigned int lightStatus = 0; ErrorCodeEnum errCode; long l_beginTime, l_endTime; do{ l_beginTime = GetTickCountRVC(); errCode = m_hDevHelper->GetDevStatus(m_devStatus); l_endTime = GetTickCountRVC(); //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetDevStatus").setCostTime(l_endTime - l_beginTime)("GetDevStatus::GetDevStatus"); if (bPrint) DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetDevStatus, GetDevStatus::eMedia: %d", m_devStatus.eMedia); if (Error_Succeed == errCode) { if (_strnicmp("RVC.CardPrinter", m_csMachineType, strlen("RVC.CardPrinter")) == 0) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("kaku tape(flat%d,concave:%d,gold:%d,silver:%d", m_devStatus.eKakuTape[0], m_devStatus.eKakuTape[1], m_devStatus.eKakuTape[2], m_devStatus.eKakuTape[3])); } return true; } else { DevErrorInfo devErrInfo; m_hDevHelper->GetLastErr(devErrInfo); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("GetDevStatus errMsg:%s", devErrInfo.szErrMsg)); getDevInfoCount++; Sleep(3000); } } while (getDevInfoCount < GET_DEV_STATUS_COUNT); return false; } int CCardIssuerFSM::Reset() { LOG_FUNCTION(); if (m_hDevHelper == nullptr) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("Maybe the m_hDevHelper have been released,switch to s0 to restart.")); return 2; } ErrorCodeEnum ec = m_hDevHelper->Reset(); if (ec == Error_Succeed) { if(GetDevStatus()) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("m_issueStatus: %d, m_CardCaptured:%d, m_devStatus.eMedia:%d, in Reset.", m_issueStatus, m_CardCaptured, m_devStatus.eMedia)); if (m_devStatus.eMedia == CI_MEDIA_PRESENT || m_devStatus.eMedia == CI_MEDIA_ENTERING) { ErrorCodeEnum eMoveErr; if (m_issueStatus) { //oiltmp to add 20131212 eMoveErr = MachineMoveCardBackNotHold(); LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_CaptureCard_Reset, "issue flag is 1, to capture card."); m_CardCaptured++; if (!SetCardCaptured(m_CardCaptured)) DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("set card captured failed."); } else { //oiltmp to add 20131212 eMoveErr = MachineMoveCardFrontGate(); LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_EjectCard_ByTerminal, "issue flag is 0, to eject card."); } if (eMoveErr == Error_Succeed) { return 0; } } else if (m_devStatus.eMedia == CI_MEDIA_NOTPRESENT) { return 0; } else { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("media position %d",m_devStatus.eMedia)); return 1; } } else { return 1; } } else { SetErrPackage("Reset::Reset", m_csDevSN, ec, MEC_DEVAPI_CARDISSUER_Reset); AlarmDEC(); return 1; } return 0; } void CCardIssuerFSM::ToLogWarnInfoAboutTermCustom() { LOG_FUNCTION(); ToLogWarnInfoAboutTerm(); CSmartPointer spConfigRoot; GetEntityBase()->GetFunction()->OpenConfig(Config_Root, spConfigRoot); CSimpleStringA strVendor(true); spConfigRoot->ReadConfigValue("Device.PinPad", "Vendor", strVendor); if(!m_csMachineType.Compare("RVC.Stand2S", true) && !strVendor.Compare("keba", true)) { //先读取系统变量是否有该值? CSimpleStringA deviceInfo(true); GetEntityBase()->GetFunction()->GetSysVar("kebaInfo", deviceInfo); //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("deviceInfo = %s", deviceInfo.GetData())); if(!deviceInfo.Compare("KEBA", true)) { //读取运行时信息,如果有值,不再写,如果没有值,读取告警的信息 //这中间会存在这里还在写,但其他模块已经要去读取该运行时的信息了,可能有先后顺序? CSimpleStringA strWarnMsg(true); CSimpleStringA szTypeInfo(true); CSimpleStringA deviceType(true); CSmartPointer spConfigRun; GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfigRun); spConfigRun->ReadConfigValue("Run", "WarnMsg", strWarnMsg); if(!strWarnMsg.IsNullOrEmpty()) { Json::Value root; Json::Reader reader; if(reader.parse((const char*)strWarnMsg, root)) { szTypeInfo = root.isMember("szType") ? CSimpleStringA(root["szType"].asCString()) : ""; if(!szTypeInfo.IsNullOrEmpty()) { deviceType = szTypeInfo.Compare("Keba.CardIssuer.ATC&Sankyo-V1.00.01", true) == 0 ? "E1080" : "E1000"; GetEntityBase()->GetFunction()->SetSysVar("kebaInfo", deviceType, true); //加个告警? LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_KebaDeviceInfo, deviceType.GetData()); } } } } } } bool CCardIssuerFSM::LoadCMBPrint(CSimpleStringA csBinPath) { if (cmdDecodeEx == NULL) { CSimpleStringA csCMBPrint(""); #ifdef RVC_OS_LINUX csCMBPrint = "libCMBPrint.so"; csCMBPrint = csBinPath + "/" + csCMBPrint; DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("cmbpath %s", (const char*)csCMBPrint); void* hr = NULL; hr = dlopen(csCMBPrint, RTLD_LAZY); if (hr == NULL) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Load CMBPrint failed(%s).", dlerror()); return false; } //pfunc_unpack = (PF_unpack)dlsym(hLib, "_Z6unpackPcS_i"); if ((cmdDecodeMag2 = (lpCMBdecodeMag2)dlsym(hr, "CMBdecodeMag2")) == NULL) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Get Mag2 address failed."); return false; } if ((cmdDecodeEx = (lpCMBdecodeEx)dlsym(hr, "CMBdecodeEx")) == NULL) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Get Mag23Ex address failed."); cmdDecodeMag2 = NULL; return false; } #else csCMBPrint = "CMBPrint.dll"; csCMBPrint = csBinPath + SPLIT_SLASH_STR + csCMBPrint; DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("cmbpath %s", (const char*)csCMBPrint); HMODULE hr = LoadLibraryA(csCMBPrint); if (hr == NULL) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Load CMBPrint failed(%d).", hr); return false; } if ((cmdDecodeMag2 = (lpCMBdecodeMag2)GetProcAddress(hr, "CMBdecodeMag2")) == NULL) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Get Mag2 address failed."); return false; } if ((cmdDecodeEx = (lpCMBdecodeEx)GetProcAddress(hr, "CMBdecodeEx")) == NULL) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Get Mag23Ex address failed."); cmdDecodeMag2 = NULL; return false; } #endif DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Load %s suc.", (const char*)csCMBPrint); } return true; } ErrorCodeEnum CCardIssuerFSM::OpenDevice(BYTE btOpenType, const char* pDevSN) { LOG_FUNCTION(); m_devOpenFailedCount++; ErrorCodeEnum eErrDev; CSimpleString errMsg(true); int initTries = 0; CSimpleStringA dllName; GetVendorDllName(dllName); CSmartPointer spEntityFunction = GetEntityBase()->GetFunction(); CSmartPointer spConfig, spConfigCS; CSimpleStringA csBinPath, csBackslash("\\"); ErrorCodeEnum eErrPath = spEntityFunction->GetPath("Bin", csBinPath); if (eErrPath != Error_Succeed) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("GetPath(bin) failed (%d) in OpenDevice.", eErrPath)); return Error_Param; } // [9/29/2019 14:13 @Gifur] CloseAndClearDevObj(false); auto pEntity = GET_DEV_ENTITY_BASE_POINTER(); pEntity->InitializeVendorLogSwitch(); eErrDev = m_hDevHelper.LoadUp(dllName); if (!IS_SUCCEED(eErrDev)) { errMsg = CSimpleStringA::Format("Load vendor adapter failed.%d", GetLastError()); LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_LoadLibraryA_Failed, errMsg.GetData()); GetEntityBase()->GetFunction()->ShowFatalError("加载厂商适配器失败!请检查root.ini配置是否正确。"); return Error_DevLoadFileFailed; } DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("Get ReleGet vendor function suc.")); for (int i = 0; i < HOPPER_NUM; ++i) { m_CardBoxNoEx[i] = ""; m_PsbCodeEx[i] = ""; m_PsbNameEx[i] = ""; m_MaintainerEx[i] = ""; m_CardInitEx[i] = 0; m_CardPercentEx[i] = 0; m_remainsEx[i] = 0; m_issuedEx[i] = 0; m_mixedEx[i] = 0; m_csMaintainTimeEx[i] = ""; m_MaintainTimeEx[i] = 0; } long l_beginTime,l_endTime; do { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("CreateDevComponent suc. m_port:%d, m_baudRate:%d, pDevSN:%s", m_port, m_baudRate, pDevSN)); l_beginTime = GetTickCountRVC(); eErrDev = m_hDevHelper->DevOpenEx(m_port, m_baudRate, btOpenType, pDevSN, m_connectType); l_endTime = GetTickCountRVC(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DevOpenEx").setCostTime(l_endTime - l_beginTime)("OpenDevice::DevOpenEx, openType:%d, connectType:%d", btOpenType, m_connectType); if (eErrDev == Error_Succeed) { ToLogRootINIInfo(); m_bOpened = true; m_devOpenFailedCount = 0; ZeroMemory(m_devCat.szModel, sizeof(m_devCat.szModel)); ZeroMemory(m_devCat.szType, sizeof(m_devCat.szType)); ZeroMemory(m_devCat.szVendor, sizeof(m_devCat.szVendor)); l_beginTime = GetTickCountRVC(); eErrDev = m_hDevHelper->GetDevCategory(m_devCat); l_endTime = GetTickCountRVC(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetDevCategory").setCostTime(l_endTime - l_beginTime)("OpenDevice::GetDevCategory"); if (eErrDev == Error_Succeed) { CSimpleStringA tmpVersion = CSimpleStringA::Format("%d.%d.%d.%d", m_devCat.version.wMajor, m_devCat.version.wMinor, m_devCat.version.wRevision, m_devCat.version.wBuild); int ret = SplitDevModelInfo(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("OpenDevice, szVendor:%s, szType:%s, szModel:%s, version:%s, ret:%d", m_devCat.szVendor, m_devCat.szType, m_devCat.szVendor, tmpVersion.GetData(), ret); m_adapterInfo.FulfillCategoryInfo(m_devCat); } else { SetErrPackage("OpenDevice::GetDevCategory", m_csDevSN, eErrDev, MEC_DEVAPI_CARDISSUER_GetDevCategory); AlarmDEC(); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CardIssuer启动失败(GetDevCategory failed.)"); ///*TODO: need to clear adapter object? (80374374@4/4/2023)*/ return Error_Unexpect; } if (!LoadCMBPrint(csBinPath)) { errMsg = CSimpleStringA::Format("CardIssuer启动失败:Load CMBPrint failed."); //LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_LoadLibraryA_CMBPrint_Failed, errMsg.GetData()); return Error_DevLoadFileFailed; } initTries = 0; break; } else { SetErrPackage("OpenDevice::DevOpenEx", m_csDevSN, eErrDev, MEC_DEVAPI_CARDISSUER_DevOpenEx); AlarmDEC(); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("CardIssuer启动失败:DevOpenEx failed.重试:%d", initTries)); Sleep(200); initTries++; } } while (initTries < INIT_TRY_NUM); if (initTries != 0) { errMsg = CSimpleStringA::Format("CardIssuer启动失败,have tried %d times!!!", initTries); LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_DevOpen_Failed, errMsg.GetData()); return Error_DevCommFailed; } else { eErrDev = spEntityFunction->OpenConfig(Config_Run, spConfig); if (eErrDev != Error_Succeed) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("CardIssuer启动失败:open run cfg file failed in OpenDevice.")); CloseAndClearDevObj(false); return eErrDev; } int ret = 0, isIssue = 99; spConfig->ReadConfigValueInt("all", "IsIssue", isIssue); spConfig->ReadConfigValueInt("all", "HopperNum", m_hopperNum); spConfig->ReadConfigValueInt("all", "CardCaptured", m_CardCaptured); if (btOpenType == DEV_OPEN_TYPE_COM) { //oiltest@20201118 for songrui if (m_csMachineType.Compare("RVC.CardPrinter") == 0) m_hopperNum = 5; else { if (m_connectType >= 1 && m_connectType <= 3) m_hopperNum = m_connectType; else { //oiltmp if "RVC.CardPrinter" the m_hopperNum is 6,where can this num come from? if (m_csMachineType.Compare("RVC.CardPrinter") == 0) m_hopperNum = 5; else m_hopperNum = 3; } } for (int i = 0; i < m_hopperNum; ++i) m_bHasHopper[i] = true; } DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("has %d hopper.", m_hopperNum)); char sec[2]; for (int i = 0; i < m_hopperNum; ++i) { ZeroMemory(sec, 2); _itoa(i + 1, (char*)sec, 10); spConfig->ReadConfigValue(sec, "CardBoxNo", m_CardBoxNoEx[i]); spConfig->ReadConfigValue(sec, "PsbCode", m_PsbCodeEx[i]); spConfig->ReadConfigValue(sec, "PsbName", m_PsbNameEx[i]); spConfig->ReadConfigValueInt(sec, "CardInit", m_CardInitEx[i]); spConfig->ReadConfigValueInt(sec, "CardRemains", m_remainsEx[i]); spConfig->ReadConfigValueInt(sec, "CardIssued", m_issuedEx[i]); spConfig->ReadConfigValueInt(sec, "CardMixed", m_mixedEx[i]); spConfig->ReadConfigValueInt(sec, "CardPercent", m_CardPercentEx[i]); spConfig->ReadConfigValue(sec, "Maintainer", m_MaintainerEx[i]); spConfig->ReadConfigValue(sec, "MaintainTime", m_csMaintainTimeEx[i]); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("init cardbox, CardBoxNo:%s, PsbCodeEx:%s, PsbNameEx:%s, CardInit:%d, CardRemains:%d, CardIssued:%d, CardMixed:%d", m_CardBoxNoEx[i].GetData(), m_PsbCodeEx[i].GetData(), m_PsbNameEx[i].GetData(), m_CardInitEx[i], m_remainsEx[i], m_issuedEx[i], m_mixedEx[i])); } if (m_hopperNum == 1 && btOpenType == DEV_OPEN_TYPE_COM)//oilyang 如果没有配置,使用原来的配置 { spConfig->ReadConfigValueInt("RunInfo", "CardRemains", m_remainsEx[0]); spConfig->ReadConfigValueInt("RunInfo", "CardIssued", m_issuedEx[0]); spConfig->ReadConfigValueInt("RunInfo", "CardCaptured", m_CardCaptured); spConfig->ReadConfigValueInt("RunInfo", "IsIssue", isIssue); spConfig->ReadConfigValueInt("RunInfo", "CardMixed", m_mixedEx[0]); spConfig->ReadConfigValueInt("RunInfo", "CardInit", m_CardInitEx[0]); spConfig->ReadConfigValueInt("RunInfo", "CardPercent", m_CardPercentEx[0]); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("use old record, CardRemains:%d, CardIssued:%d, CardCaptured:%d, IsIssue:%d, CardMixed:%d, CardInit:%d", m_remainsEx[0], m_issuedEx[0], m_CardCaptured, isIssue, m_mixedEx[0], m_CardInitEx[0])); } //oilyang 回写卡机配置 spConfig->WriteConfigValueInt("all", "IsIssue", isIssue); spConfig->WriteConfigValueInt("all", "HopperNum", m_hopperNum); spConfig->WriteConfigValueInt("1", "CardPercent", m_CardPercentEx[0]); spEntityFunction->OpenConfig(Config_CenterSetting, spConfigCS); int tmpCardnoMismatch = 0, tmpICRetryTimes = 1, tmpStopUseRF = 0; spConfigCS->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "EacQueryFlag", m_eacQueryFlag); spConfigCS->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "UseCardnoMismatch", tmpCardnoMismatch); spConfigCS->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "ICRetryTimes", tmpICRetryTimes); spConfigCS->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "StopUseRF", tmpStopUseRF); spConfigCS->ReadConfigValue(GetEntityBase()->GetEntityName(), "RFVendorList", m_rfVendorList); spConfigCS->ReadConfigValue(GetEntityBase()->GetEntityName(), "SwallowCardUrl", m_csSwallowCardUrl); if (0 != m_csSwallowCardUrl.GetLength()) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_csSwallowCardUrl:%s", m_csSwallowCardUrl.GetData()); } spConfigCS->ReadConfigValue(GetEntityBase()->GetEntityName(), "SyncMaterialUrl", m_csSyncMaterialUrl); if (0 != m_csSyncMaterialUrl.GetLength()) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_csSyncMaterialUrl:%s", m_csSyncMaterialUrl.GetData()); } spConfigCS->ReadConfigValue("Common", "EacQueryHost", m_EacQueryHost); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("EacQueryFlag:%d,EacQueryHost:%s,UseCardnoMismatch:%d,ICRetryTimes:%d" , m_eacQueryFlag, m_EacQueryHost.GetData(), tmpCardnoMismatch,tmpICRetryTimes); if (tmpCardnoMismatch == 1) m_bUseCardnoMismatch = true; if (tmpICRetryTimes > 0 && tmpICRetryTimes < 4) m_ICRetryTimes = tmpICRetryTimes; if (tmpStopUseRF == 1) m_bStopUseRF = true; m_issueStatusFromFile = m_issueStatus = isIssue; if (m_issueStatusFromFile == 0) m_bCardFromHopper = false; ret = UnAcceptCard(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ret: %d, isIssue: %d, m_hasCardWhileDevOpen:%d, m_issueStatusFromFile:%d", ret, isIssue, m_hasCardWhileDevOpen, m_issueStatusFromFile); if (ret == 0) { if (m_hasCardWhileDevOpen && m_issueStatusFromFile > 0) { //oilyang@20171220 遗留卡片已经被吞,重置数据 m_issueStatusFromFile = 0; m_currCardNo = m_addCardNo = ""; FSMSetIssueFlag(0); } //oilyang@20191219 获取吞卡箱容量,目前有便携卡机,大机 //超过5,认为是脏数据,用默认值3 CardIssuerStatus cis; if ((eErrDev = m_hDevHelper->GetDevStatus(cis)) != Error_Succeed) { SetErrPackage("OpenDevice::GetDevStatus", m_csDevSN, eErrDev, MEC_DEVAPI_CARDISSUER_GetDevStatus); AlarmDEC(); } else { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("device max retain count:%d, cis.eRetainBin:%d", cis.dwRetainCount, cis.eRetainBin); if (cis.dwRetainCount > 0 && cis.dwRetainCount <= 5) m_maxRetainCount = cis.dwRetainCount; else m_maxRetainCount = 3; if (cis.eRetainBin == CI_RETAINBIN_FULL) { LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_RETAIN_BIN_IS_FULL_SENSOR, "(sensor)retain bin is full!回收箱满了,请及时清理!"); } } LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_Open_Success, "读卡器打开成功"); return Error_Succeed; } else { LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_Open_Failed, "启动后检查卡机状态失败"); return Error_Unexpect; } } } void CCardIssuerFSM::Load() { LOG_FUNCTION(); CSmartPointer spConfig; ErrorCodeEnum eErrDev = GetEntityBase()->GetFunction()->OpenConfig(Config_Root, spConfig); if (spConfig == NULL) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(", open root.ini failed"); return; } CSimpleStringA csVendor(""); spConfig->ReadConfigValueInt("Device.CardIssuer", "Baudrate", m_baudRate); spConfig->ReadConfigValueInt("Device.CardIssuer", "Port", m_port); spConfig->ReadConfigValue("Device.CardIssuer", "Vendor", csVendor); HARDWARE_ENTITY_SET_VENDOR_NAME(m_entCode, csVendor); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("m_baudRate:%d, m_port:%d, csVendor:%s,", m_baudRate, m_port, csVendor.GetData())); m_csDevSN = ""; //for data migrate after dynamic bind SCI CSmartPointer spConfigRun; eErrDev = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfigRun); if (eErrDev != Error_Succeed) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(", open cfg file failed!"); } else { CSimpleStringA tmpNameRun(""), tmpNameRoot(""), tmpVendor(""); spConfigRun->ReadConfigValue("SCI", "name", tmpNameRun); spConfig->ReadConfigValue("Terminal", "DevSN", tmpNameRoot); spConfigRun->ReadConfigValue("SCI", "Vendor", tmpVendor); DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("tmpNameRun:%s, tmpNameRoot:%s, tmpVendor:%s", tmpNameRun.GetData(), tmpNameRoot.GetData(), tmpVendor.GetData()); } } int CCardIssuerFSM::Initial() { ErrorCodeEnum errCode = OpenDevice(DEV_OPEN_TYPE_COM,""); if (errCode != Error_Succeed) { DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("OpenDevice in Initial return failed with errCode:%d(0x%x)", errCode, errCode); CloseAndClearDevObj(false); m_bOpened = false; } return errCode; } int CCardIssuerFSM::UnAcceptCard() { LOG_FUNCTION(); ErrorCodeEnum eErr; CSimpleStringA errMsg(true); if (GetDevStatus()) { switch (m_devStatus.eMedia) { case CI_MEDIA_PRESENT: { m_hasCardWhileDevOpen = true; JustReadCardNo(); CSimpleStringA preFixNo(""); CSimpleStringA suffixNo(""); if (!m_currCardNo.IsNullOrEmpty() && m_currCardNo.GetLength() > 10) { preFixNo = m_currCardNo.SubString(0, 6); suffixNo = m_currCardNo.SubString(m_currCardNo.GetLength() - 4, 4); } if (m_currCardNo.GetLength() > 1) m_captureReason = "4014"; else m_captureReason = "0000"; //oilyang@20230313 根据卡片异常处理沟通会议(业务、深圳开发),实体启动发现有卡,一律吞卡 DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402203Z01").setResultCode("RTA23A1")("读卡器打开时,卡机有卡片,吞卡"); errMsg = CSimpleStringA::Format("读卡器有卡(吞卡):%d, CardNoLength:%d, CardNo:%s****%s", m_issueStatus, m_currCardNo.GetLength(), preFixNo.GetData(), suffixNo.GetData()); LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_CaptureCard_EntityOnStart, errMsg.GetData()); return CaptureCard(NULL); } case CI_MEDIA_JAMMED: case CI_MEDIA_ENTERING: LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_CardPosUnexpectedOnDevOpen, CSimpleStringA::Format("Unexpected CardStatusEnum:%d", m_devStatus.eMedia)); break; case CI_MEDIA_NOTPRESENT: return 0; default: break; } //oilyang@20230612 delete the following lines,as no need to GetDevStatus twice //long l_beginTime, l_endTime; //l_beginTime = GetTickCountRVC(); //eErr = m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN); //l_endTime = GetTickCountRVC(); //if (Error_Succeed != eErr){ // SetErrPackage("UnAcceptCard::SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN)", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_SetCardInType); // AlarmDEC(); //} //if (GetDevStatus()) // return 0; //else // return 1; } else { DevErrorInfo devErrorInfo; m_hDevHelper->GetLastErr(devErrorInfo); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("UnAcceptCard, GetDevStatus failed errMsg:%s", devErrorInfo.szErrMsg)); } return 1; } int CCardIssuerFSM::IssueCard(SpReqAnsContext::Pointer ctx, SpReqAnsContext::Pointer ctxEx) { LOG_FUNCTION(); if ((_strnicmp("RVC.PAD", m_csMachineType, strlen("RVC.PAD")) == 0 || (_strnicmp("RVC.Desk2S", m_csMachineType, strlen("RVC.Desk2S")) == 0 && m_majorVerion == 1 && m_minorVerion == 0)) && !m_bChannelOK) { LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_Has_Not_Build_SafeChannel, "发卡前还未建立安全通道"); if (ctxEx != NULL) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA230A")("IssueCard, 未建立安全通道"); ctxEx->Answer(TransECWithRepeat(Error_Unexpect), CardIssuer_UserErrorCode_No_Encryted_Channel); } else if (ctx != NULL) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA230A")("IssueCard, 未建立安全通道"); ctx->Answer(TransECWithRepeat(Error_Unexpect), CardIssuer_UserErrorCode_No_Encryted_Channel); } return 2; } CSimpleStringA errMsg(true); long l_beginTime, l_endTime; if (ctxEx != NULL) { //Req.hopper //89:从加卡箱移卡读卡 //88:卡片加到卡槽 //87:吞卡 //99:移卡读卡 //98:手工取卡 //100:清空卡库、卡库盘库吞到吞卡箱 DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("IssueCard, issue type:%d", ctxEx->Req.hopper)); ctxEx->Ans.reserved1.Init(2); //oiltmp 卡库独有吗? if (ctxEx->Req.hopper == 87)//签发失败,吞卡 { LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_CaptureCard_SignFailed, "sign failed, to capture card."); ToRegistCaptureCardInfo(); MachineMoveCardBackNotHold(); ctxEx->Answer(Error_Succeed); return 2; } //param Req.hopper is wrong if (ctxEx->Req.hopper < 1 || ctxEx->Req.hopper > 6){ errMsg = CSimpleStringA::Format("Issuer Card, the hopperNo(%d) is wrong!!!", ctxEx->Req.hopper); LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_Invalid_Hopper, errMsg.GetData()); return Error_Param; } DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("IssueCard, m_bHasHopper[ctxEx->Req.hopper - 1]:%d", m_bHasHopper[ctxEx->Req.hopper - 1])); if (!m_bHasHopper[ctxEx->Req.hopper - 1]) { switch (ctxEx->Req.hopper) { case 1: DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA230B")("未检测到卡箱1,请检测卡箱1是否放好"); ctxEx->Answer(Error_DevMedia, CardIssuer_UserErrorCode_NotHas_Hopper1); break; case 2: DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA230C")("未检测到卡箱2,请检测卡箱2是否放好"); ctxEx->Answer(Error_DevMedia, CardIssuer_UserErrorCode_NotHas_Hopper2); break; case 3: DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA230D")("未检测到卡箱3,请检测卡箱3是否放好"); ctxEx->Answer(Error_DevMedia, CardIssuer_UserErrorCode_NotHas_Hopper3); break; case 4: ctxEx->Answer(Error_DevMedia, CardIssuer_UserErrorCode_NotHas_Hopper4); break; case 5: ctxEx->Answer(Error_DevMedia, CardIssuer_UserErrorCode_NotHas_Hopper5); break; case 6: ctxEx->Answer(Error_DevMedia, CardIssuer_UserErrorCode_NotHas_Hopper6); break; } return 2; } m_currentHopper = ctxEx->Req.hopper; } else m_currentHopper = 1; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("IssueCard, current hopper:%d", m_currentHopper)); m_pCardProcess->DataInit(); if (m_mixedEx[m_currentHopper - 1] >= 3) { //all of the hoppers are wrong if (((m_bHasHopper[0] && m_mixedEx[0] >= 3) || !m_bHasHopper[0]) && ((m_bHasHopper[1] && m_mixedEx[1] >= 3) || !m_bHasHopper[1]) && ((m_bHasHopper[2] && m_mixedEx[2] >= 3) || !m_bHasHopper[2]) && ((m_bHasHopper[3] && m_mixedEx[1] >= 3) || !m_bHasHopper[3]) && ((m_bHasHopper[4] && m_mixedEx[1] >= 3) || !m_bHasHopper[4]) && ((m_bHasHopper[5] && m_mixedEx[1] >= 3) || !m_bHasHopper[5])) SetDevStateAndSendMsg(DEVICE_STATUS_MAINTAINCE); errMsg = CSimpleStringA::Format("the current card hopper %d may be wrong.mixedEx:%d", m_currentHopper, m_mixedEx[m_currentHopper-1]); DWORD dwTmpErrCode = CardIssuer_UserErrorCode_Hopper1_Mixed_Too_Much; if (m_currentHopper == 2) { dwTmpErrCode = CardIssuer_UserErrorCode_Hopper2_Mixed_Too_Much; DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA230S")("卡箱2连续吞卡超限,请及时执行清机"); } else if (m_currentHopper == 3) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA230T")("卡箱3连续吞卡超限,请及时执行清机"); dwTmpErrCode = CardIssuer_UserErrorCode_Hopper3_Mixed_Too_Much; } else DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA230R")("卡箱1连续吞卡超限,请及时执行清机"); LogWarn(Severity_Middle, Error_Unexpect, dwTmpErrCode, errMsg.GetData()); if (ctx != NULL) ctx->Answer(TransECWithRepeat(Error_DevMedia), dwTmpErrCode); else ctxEx->Answer(TransECWithRepeat(Error_DevMedia), dwTmpErrCode); return 2; } ErrorCodeEnum errCode; CardIssuerStatus cis; memset(&cis, 0, sizeof(CardIssuerStatus)); bool bEmpty = false; l_beginTime = GetTickCountRVC(); errCode = m_hDevHelper->GetDevStatus(cis); l_endTime = GetTickCountRVC(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetDevStatus").setCostTime(l_endTime - l_beginTime)("IssueCard::GetDevStatus"); if (errCode != Error_Succeed) { SetErrPackage("IssueCard::GetDevStatus", m_csDevSN, errCode, MEC_DEVAPI_CARDISSUER_GetDevStatus); AlarmDEC(); } else { if (cis.eIssuerBin[m_currentHopper - 1] == CI_ISSUEHOPPER_EMPTY || cis.eIssuerBin[m_currentHopper - 1] == CI_ISSUEHOPPER_NOTSUPP) bEmpty = true; } if (bEmpty || m_remainsEx[m_currentHopper - 1] <= 0) { CSimpleStringA warnInfo = CSimpleStringA::Format("IssuerCard, hopper%d no more cards to issue. LocalRecord CardremainsEx:%d, Vendor return:NoCard(%d), CardCount(%d)", m_currentHopper, m_remainsEx[m_currentHopper - 1], cis.eIssuerBin[m_currentHopper - 1], cis.dwIssuerCount[m_currentHopper - 1]); LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_No_More_Card_Issue, warnInfo.GetData()); DWORD dwUsrErrCode = 0; if (cis.eIssuerBin[m_currentHopper - 1] == CI_ISSUEHOPPER_NOTSUPP) { if (m_currentHopper == 1)//oiltmp MACRO? { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA230B")("未检测到卡箱1,请检测卡箱1是否放好"); dwUsrErrCode = CardIssuer_UserErrorCode_NotHas_Hopper1; } else if (m_currentHopper == 2) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA230C")("未检测到卡箱2,请检测卡箱2是否放好"); dwUsrErrCode = CardIssuer_UserErrorCode_NotHas_Hopper2; } else if (m_currentHopper == 3) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA230D")("未检测到卡箱3,请检测卡箱3是否放好"); dwUsrErrCode = CardIssuer_UserErrorCode_NotHas_Hopper3; } else if (m_currentHopper == 4) dwUsrErrCode = CardIssuer_UserErrorCode_NotHas_Hopper4; else if (m_currentHopper == 5) dwUsrErrCode = CardIssuer_UserErrorCode_NotHas_Hopper5; else if (m_currentHopper == 6) dwUsrErrCode = CardIssuer_UserErrorCode_NotHas_Hopper6; } else if (cis.eIssuerBin[m_currentHopper - 1] == CI_ISSUEHOPPER_EMPTY) { if (m_currentHopper == 1) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA230E")("卡箱1未检测到卡片,请检测卡箱1中卡片是否放好或卡片余量过低"); dwUsrErrCode = CardIssuer_UserErrorCode_NoCardInHopper1; } else if (m_currentHopper == 2) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA230F")("卡箱2未检测到卡片,请检测卡箱2中卡片是否放好或卡片余量过低"); dwUsrErrCode = CardIssuer_UserErrorCode_NoCardInHopper2; } else if (m_currentHopper == 3) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR040220320").setResultCode("RTA230G")("卡箱3未检测到卡片,请检测卡箱3中卡片是否放好或卡片余量过低"); dwUsrErrCode = CardIssuer_UserErrorCode_NoCardInHopper3; } else if (m_currentHopper == 4) dwUsrErrCode = CardIssuer_UserErrorCode_NoCardInHopper4; else if (m_currentHopper == 5) dwUsrErrCode = CardIssuer_UserErrorCode_NoCardInHopper5; else if (m_currentHopper == 6) dwUsrErrCode = CardIssuer_UserErrorCode_NoCardInHopper6; } else if (m_remainsEx[m_currentHopper - 1] <= 0) { if (m_currentHopper == 1) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA230H")("卡箱1本地计数无卡,请执行清机计划"); dwUsrErrCode = CardIssuer_UserErrorCode_NoCardRemains_Hopper1; } else if (m_currentHopper == 2) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA230J")("卡箱2本地计数无卡,请执行清机计划"); dwUsrErrCode = CardIssuer_UserErrorCode_NoCardRemains_Hopper2; } else if (m_currentHopper == 3) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA230K")("卡箱3本地计数无卡,请执行清机计划"); dwUsrErrCode = CardIssuer_UserErrorCode_NoCardRemains_Hopper3; } } if (ctx != NULL) ctx->Answer(Error_DevNotAvailable, dwUsrErrCode); else ctxEx->Answer(Error_DevNotAvailable, dwUsrErrCode); return 2; } //forbid front enter l_beginTime = GetTickCountRVC(); errCode = m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN); l_endTime = GetTickCountRVC(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetCardInType").setCostTime(l_endTime - l_beginTime)("IssueCard::SetCardInType"); if (errCode != Error_Succeed) { SetErrPackage("IssueCard::SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN)", m_csDevSN, errCode, MEC_DEVAPI_CARDISSUER_SetCardInType); AlarmDEC(); } FSMSetIssueFlag(1); //move card to holder l_beginTime = GetTickCountRVC(); errCode = m_hDevHelper->MoveCard(CI_MOVECARD_FROM_HOPPER, m_currentHopper); l_endTime = GetTickCountRVC(); //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("IssuerCard, m_currentHopper:%d", m_currentHopper); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::MoveCard").setCostTime(l_endTime - l_beginTime)("IssueCard::MoveCard, m_currentHopper:%d", m_currentHopper); m_bCardFromHopper = true; if (errCode != Error_Succeed) { FSMSetIssueFlag(2); SetErrPackage("IssueCard::MoveCard", m_csDevSN, errCode, MEC_DEVAPI_CARDISSUER_CI_MOVECARD_FROM_HOPPER); //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA2306")("从卡箱移动卡片到读卡器失败,请重试或检查是否有塞卡"); if (ctx != NULL) { if (IsInBusiness()) { ctx->Answer(Error_Unexpect, AlarmDEC(true)); DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA2306")("从卡箱移动卡片到读卡器失败,请重试或检查是否有塞卡"); } else { ctx->Answer(Error_Unexpect, AlarmDEC()); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA2306")("从卡箱移动卡片到读卡器失败,请重试或检查是否有塞卡"); } } else { if (IsInBusiness()) { ctxEx->Answer(Error_Unexpect, AlarmDEC(true)); DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA2306")("从卡箱移动卡片到读卡器失败,请重试或检查是否有塞卡"); } else { ctxEx->Answer(Error_Unexpect, AlarmDEC()); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA2306")("从卡箱移动卡片到读卡器失败,请重试或检查是否有塞卡"); } } //if (ctx != NULL) // ctx->Answer(Error_Unexpect, AlarmDEC(m_iInWhatPage == PageType_Other)); //else // ctxEx->Answer(Error_Unexpect, AlarmDEC(m_iInWhatPage == PageType_Other)); return 1; } LogWarn(Severity_Low, Error_Succeed, CardIssuer_UserErrorCode_MoveCard_FromHopper, "MoveCard from hopper suc."); m_issuedEx[m_currentHopper - 1]++; m_remainsEx[m_currentHopper - 1]--; //oilyang@20180809 增加对单卡槽多卡槽机器的使用及闲置的适配 if ((!m_bHasHopper[0] || m_CardPercentEx[0] == 0 || m_CardInitEx[0] == 0 || (100 * m_remainsEx[0] < m_CardPercentEx[0] * m_CardInitEx[0])) && (!m_bHasHopper[1] || m_CardPercentEx[1] == 0 || m_CardInitEx[1] == 0 || (100 * m_remainsEx[1] < m_CardPercentEx[1] * m_CardInitEx[1])) && (!m_bHasHopper[2] || m_CardPercentEx[2] == 0 || m_CardInitEx[2] == 0 || (100 * m_remainsEx[2] < m_CardPercentEx[2] * m_CardInitEx[2]))) { LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_FEW_CARD_REMAINS, "Few card remains."); } m_bSettingMaterial = true;//oilyang 借用于延迟同步,紧接着设置remains时更新到后台数据库 if (!SetCardIssued(m_issuedEx[m_currentHopper - 1], m_currentHopper)) DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("IssueCard, Set card issued failed."); m_bSettingMaterial = false; if (!SetCardRemains(m_remainsEx[m_currentHopper - 1], m_currentHopper)) DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("IssueCard, Set card remains failed."); m_bUseRFTillNext = false; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040220320")("IssueCard success."); Sleep(1000); ctxEx->Ans.reserved1[0] = ctxEx->Ans.reserved1[1] = 0; //oilyang@20170929 根据讨论结果,去掉调用 //GUIConsoleService_ClientBase *pGuiConsoleClient = NULL; //errCode = Error_Unexpect; //pGuiConsoleClient = new GUIConsoleService_ClientBase(dynamic_cast(GetEntityBase())); //if (pGuiConsoleClient != NULL) // errCode = pGuiConsoleClient->Connect(); //else // Dbg("pGuiConsoleClient is null?"); //if (errCode == Error_Succeed) //{ // if (pGuiConsoleClient) // { // GUIConsoleService_AddMaterialCounter_Req req; // GUIConsoleService_AddMaterialCounter_Ans ans; // req.strMaterialCode = "DebitCard"; // errCode = pGuiConsoleClient->AddMaterialCounter(req, ans, 10000); // Dbg("%d",errCode); // if (pGuiConsoleClient != NULL) // { // pGuiConsoleClient->GetFunction()->CloseSession(); // pGuiConsoleClient->SafeDelete(); // pGuiConsoleClient = NULL; // } // } //} if (m_bIssuingExit) { LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_CaptureCard_IssueExit, "Issuing exit, to capture card."); CaptureCard(NULL); } if (ctx != NULL) ctx->Answer(Error_Succeed); else ctxEx->Answer(Error_Succeed); return 0; } /** 0:succeed,1:failed [Gifur@2022516]*/ int CCardIssuerFSM::CaptureCard(SpReqAnsContext::Pointer ctx) { LOG_FUNCTION(); if (ctx != NULL) LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_CaptureCard_FromBusiness, "CaptureCard called from Business."); ErrorCodeEnum eErr; long l_beginTime, l_endTime; int ret = 0; //hr = m_pIDCard->IDC_Capture(); eErr = MachineMoveCardBackNotHold(); if (eErr == Error_Succeed) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040220304")(); bool bCaptured = ToRegistCaptureCardInfo(); m_currCardNo = m_addCardNo = ""; } else ret = 1; m_CardCaptured++; if (!SetCardCaptured(m_CardCaptured)) DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(", set card captured failed"); m_pCardProcess->DataInit(); if (Error_Succeed == eErr){ l_beginTime = GetTickCountRVC(); eErr = m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN); l_endTime = GetTickCountRVC(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetCardInType").setCostTime(l_endTime - l_beginTime)("CaptureCard::SetCardInType"); if (eErr != Error_Succeed) { SetErrPackage("CaptureCard::SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN)", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_SetCardInType); AlarmDEC(); } if (ctx != NULL) ctx->Answer(Error_Succeed); } else { if (ctx != NULL){ if (m_iInWhatPage == PageType_Other) { LogError(Severity_Middle, Error_Unexpect, 0x20300034, "CaptureCard failed"); DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode("QLR040220304").setResultCode("RTA2307")("吞卡失败,请检查吞卡箱是否已满或联系厂商检查是否有吞卡"); } else { LogWarn(Severity_Middle, Error_Unexpect, 0x20300034, "CaptureCard failed"); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220304").setResultCode("RTA2307")("吞卡失败,请检查吞卡箱是否已满或联系厂商检查是否有吞卡"); } ctx->Answer(Error_Unexpect, 0x20300034); } } DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Captured, ret:%d", ret); return ret; } /** 0:succeed,1:failed [Gifur@2022516]*/ int CCardIssuerFSM::EjectCard(SpReqAnsContext::Pointer ctx) { LOG_FUNCTION(); Sleep(300);//oilyang@20230106 for keba said "maybe we need stay for machine to prepare..." int ret = 0; ErrorCodeEnum eErr; eErr = MachineMoveCardFrontGate(ctx != NULL && m_iInWhatPage == PageType_Other); m_pCardProcess->DataInit(); if (Error_Succeed == eErr){ if (ctx != NULL) ctx->Answer(Error_Succeed); ret = 0; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040220305")(); } else { if (ctx != NULL){ ctx->Answer(Error_Exception, 0x20300035); } ret = 1; } DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("EjectCard, ret: %d", ret); return ret; } int CCardIssuerFSM::WaitFetchingCard() { LOG_FUNCTION(); //int waitTries = 0; DWORD dwStart, dwEnd; dwStart = GetTickCountRVC(); LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_GREEN_ON,"CardReader(fetch) warning on"); do { if (GetDevStatus(false)){ dwEnd = GetTickCountRVC(); if (m_devStatus.eMedia == CI_MEDIA_ENTERING){ Sleep(WAIT_INTERVAL); } else{ long l_beginTime, l_endTime; l_beginTime = GetTickCountRVC(); ErrorCodeEnum eErr = m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN); l_endTime = GetTickCountRVC(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetCardInType").setCostTime(l_endTime - l_beginTime)("WaitFetchingCard::SetCardInType"); if (eErr != Error_Succeed) { SetErrPackage("WaitFetchingCard::SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN)", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_SetCardInType); AlarmDEC(); } LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_GREEN_OFF,"CardReader(fetch) warning off"); return 0; } }else { LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_GREEN_OFF,"CardReader(fetch) warning off"); return 1; } }while ((dwEnd-dwStart) < 60*1000); LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_GREEN_OFF,"CardReader(fetch) warning off"); return 2; } int CCardIssuerFSM::InternalAcceptCard() { LOG_FUNCTION(); ErrorCodeEnum eErr = Error_Unexpect; int acceptTries = 0, err = 0; DWORD64 dwStart = GetTickCountRVC(); DWORD64 dwEnd = dwStart; long l_beginTime, l_endTime; m_bWaitingAccept = true; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("InternalAcceptCard, m_bExit:%d, m_bCancelAccept:%d, m_bWaitAccepteMore:%d, m_bCancelByRFIC:%d", m_bExit, m_bCancelAccept, m_bWaitAccepteMore, m_bCancelByRFIC)); bool bHasSetCardInType = false; do { if (m_bExit) { m_bCancelAccept = true; break; } if (m_bCancelAccept) { err = 3; goto Err; } if (m_bWaitAccepteMore) { acceptTries = 0; dwEnd = dwStart = GetTickCountRVC(); m_bWaitAccepteMore = false; } if (GetDevStatus(false)) { if (m_devStatus.eMedia == CI_MEDIA_PRESENT) { LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_OP, "CardIssuer op."); acceptTries = 0; goto Err; } if (m_devStatus.eMedia == CI_MEDIA_NOTPRESENT) { acceptTries++; Sleep(ACCEPT_TRY_INTERVAL); //oilyang@20230609 after sleep,to check if have been canceled in sleeping time if (m_bCancelAccept) { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("have been canceled in sleeping time"); err = 3; goto Err; } //hr = m_pIDCard->IDC_Accept(IDC_ALL_CARD,&lpCardData); if (!m_bCancelAccept && !bHasSetCardInType) { l_beginTime = GetTickCountRVC(); eErr = m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_ALL); l_endTime = GetTickCountRVC(); //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetCardInType").setCostTime(l_endTime - l_beginTime)("InternalAcceptCard::SetCardInType CI_CARD_IN_TYPE_ALL"); } if (Error_Succeed != eErr) { SetErrPackage("InternalAcceptCard::SetCardInType(CI_CARD_IN_TYPE_ALL)", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_SetCardInType); AlarmDEC(); } else { bHasSetCardInType = true; } } } else { err = 1; goto Err; } dwEnd = GetTickCountRVC(); } while ((dwEnd - dwStart) < 58 * 1000); err = 2; Err: m_bExit = false; m_bWaitingAccept = false; l_beginTime = GetTickCountRVC(); eErr = m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN); l_endTime = GetTickCountRVC(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetCardInType").setCostTime(l_endTime - l_beginTime)("InternalAcceptCard::SetCardInType CI_CARD_IN_TYPE_FORBIDDEN"); if (Error_Succeed != eErr) { SetErrPackage("InternalAcceptCard::SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN)", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_SetCardInType); AlarmDEC(); } if (m_bCancelAccept && err != 1) { //oilyang@20181210 add "if (!m_bCancelByRFIC)" //oilyang@20170612 if (!m_bCancelByRFIC) Sleep(500); if (GetDevStatus()) { if (m_devStatus.eMedia == CI_MEDIA_PRESENT) { err = 4; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(", Cancel InterAccept, eject card."); eErr = MachineMoveCardFrontGate(m_iInWhatPage == PageType_Other); if (Error_Succeed == eErr) { l_beginTime = GetTickCountRVC(); eErr = m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN); l_endTime = GetTickCountRVC(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetCardInType").setCostTime(l_endTime - l_beginTime)("InternalAcceptCard::SetCardInType CI_MEDIA_PRESENT CI_CARD_IN_TYPE_FORBIDDEN"); if (eErr != Error_Succeed) { SetErrPackage("InternalAcceptCard::SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN)", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_SetCardInType); AlarmDEC(); } } else { //吐卡失败,前面已有告警,这里不再告警 Dbg("InternalAcceptCard::MachineMoveCardFrontGate failed(0x%x)", eErr); err = 2; } } } else err = 2; } return err; } int CCardIssuerFSM::AcceptCard(SpReqAnsContext::Pointer ctx) { LOG_FUNCTION(); m_pCardProcess->DataInit(); m_bCancelByRFIC = false; LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_GREEN_ON,"CardReader warning on"); m_bWaitAccepteMore = false; int rc = InternalAcceptCard(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("AcceptCard::InternalAcceptCard, result:%d", rc)); LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_GREEN_OFF,"CardReader warning off"); if (rc == 0) { FSMSetIssueFlag(0); m_bCardFromHopper = false; if (ctx != NULL) { LogWarn(Severity_Low, Error_Succeed, CardIssuer_UserErrorCode_InsertCardSucceed, "AcceptCard, insert succeed"); m_bUseRFTillNext = false; ctx->Answer(Error_Succeed); } } else if(rc == 2) { if (ctx != NULL) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("AcceptCard, insert timeout"); ctx->Answer(Error_TimeOut); } } else if(rc == 3 || rc == 4) { if (ctx != NULL) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("AcceptCard, insert cancel"); ctx->Answer(Error_Cancel); } }else { if (ctx != NULL){ SetErrPackage("AcceptCard::InternalAcceptCard", m_csDevSN, Error_Unexpect, MEC_DEVAPI_CARDISSUER_GetDevStatus); if (IsInBusiness()) { DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode("QLR040220303").setResultCode("RTA2322")("获取设备状态GetDevStatus失败"); } else { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220303").setResultCode("RTA2322")("获取设备状态GetDevStatus失败"); } ctx->Answer(Error_Unexpect, AlarmDEC(m_iInWhatPage == PageType_Other)); } } return rc; } static CSimpleStringA GetStrData(TrackInfo trackInfo) { //LOG_FUNCTION(); CSimpleStringA strRet; switch (trackInfo.eStatus) { case CI_DATA_OK: strRet = (char*)trackInfo.data; break; case CI_DATA_INVALID: strRet = "无效数据"; break; //case CI_DATA_MISSING: default: strRet = "数据丢失"; } return strRet; } int CCardIssuerFSM::SplitTrack2(CSimpleStringA pTrack2,Track2Data &decodeData) { LOG_FUNCTION(); int dataLen = strlen(pTrack2); DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)(", pTrack2.len:%d", dataLen); if (pTrack2.GetLength() == 0) return -1; switch(dataLen) { case 28: decodeData.t2Region = CSimpleString(pTrack2,4); decodeData.t2Account = pTrack2.SubString(4,8); decodeData.t2CardSerial = pTrack2.SubString(14,8);//oilyang for 8 onecard decodeData.t2CVC = pTrack2.SubString(22,6); decodeData.t2ExpireDate = ""; break; case 31: decodeData.t2Account = CSimpleString(pTrack2,16); decodeData.t2CardSerial = pTrack2.SubString(16,1); decodeData.t2CVC = pTrack2.SubString(17,6); decodeData.t2Region = pTrack2.SubString(23,4); decodeData.t2ExpireDate = pTrack2.SubString(27,4); break; case 25://AE Card decodeData.t2Account = CSimpleString(pTrack2, 15); decodeData.t2CardSerial = pTrack2.SubString(15, 1); decodeData.t2CVC = pTrack2.SubString(16, 5); decodeData.t2ExpireDate = pTrack2.SubString(21, 4); decodeData.t2Region = ""; break; case 38: break; default: return -1; } decodeData.status = 0; return 0; } int CCardIssuerFSM::ReadCard(SpReqAnsContext::Pointer ctx) { bool bCtOK = false; memset(m_magTracks.track[0].data, 0, sizeof(m_magTracks.track[0].data)); memset(m_magTracks.track[1].data, 0, sizeof(m_magTracks.track[1].data)); memset(m_magTracks.track[2].data, 0, sizeof(m_magTracks.track[2].data)); int ret = ReadCard_Contact(ctx, bCtOK); if (ret == 2 || bCtOK) return ret; if (IfUseRf()) { m_bUseRFTillNext = true; return ReadCard_RF(ctx); } else return ret; } int CCardIssuerFSM::ReadCard_Contact(SpReqAnsContext::Pointer ctx, bool& bICOK) { bICOK = false; m_currCardNo = ""; ctx->Ans.ICType = 0; ErrorCodeEnum eErr, eMagReadErr; int activeCardType; bool bIC(false), bICSuc(false), bReadCardInfo(false); long l_beginTime, l_endTime; CSimpleString errMsg(""); errMsg = CSimpleString::Format("ReadCard, inParam: reserved1 for lightPos:%d, m_issueStatus:%d, m_currentHopper:%d", ctx->Req.reserved1, m_issueStatus, m_currentHopper); LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_ReadCard_Process, errMsg.GetData()); DWORD dwStart = GetTickCountRVC(); MagTracks magTracks; int readTries = 0; memset(magTracks.track[0].data, 0, sizeof(magTracks.track[0].data)); memset(magTracks.track[1].data, 0, sizeof(magTracks.track[1].data)); memset(magTracks.track[2].data, 0, sizeof(magTracks.track[2].data)); magTracks.eRange = CI_TRACK_RANGE_2_3; do { l_beginTime = GetTickCountRVC(); eMagReadErr = m_hDevHelper->MagRead(magTracks); l_endTime = GetTickCountRVC(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::MagRead").setCostTime(l_endTime - l_beginTime)("ReadCard_Contact::MagRead"); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("MagRead t2Status:%d, t3Status:%d, t2Len:%d, t3Len:%d", magTracks.track[1].eStatus, magTracks.track[2].eStatus, magTracks.track[1].dwSize, magTracks.track[2].dwSize); //oilyang@20230204 copy mag data for RF m_magTracks.eRange = magTracks.eRange; for (int i = 0; i < 3; ++i) { m_magTracks.track[i].eStatus = magTracks.track[i].eStatus; m_magTracks.track[i].eSource = magTracks.track[i].eSource; m_magTracks.track[i].dwSize = magTracks.track[i].dwSize; memcpy(m_magTracks.track[i].data, magTracks.track[i].data, sizeof(magTracks.track[i].data)); } ctx->Ans.t2Account = ctx->Ans.ICData = ""; readTries++; if (magTracks.track[1].dwSize > sizeof(magTracks.track[1].data) || magTracks.track[2].dwSize > sizeof(magTracks.track[2].data)) { errMsg = CSimpleString::Format("MagRead, trackSize maybe wrong:t2Size:%d(%d), t3Size:%d(%d)", magTracks.track[1].dwSize, sizeof(magTracks.track[1].data), magTracks.track[2].dwSize, sizeof(magTracks.track[2].data)); LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_TrackSize_Wrong, errMsg.GetData()); break; } if (Error_Succeed == eMagReadErr && magTracks.track[1].eStatus == CI_DATA_OK) { LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_OP, "CardIssuer op."); if (magTracks.track[1].dwSize > 40) { errMsg = CSimpleString::Format("MagRead, track2Size maybe wrong:t2Size:%d", magTracks.track[1].dwSize); LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_Track2Size_Wrong, errMsg.GetData()); ctx->Ans.status = 1; break; } ctx->Ans.track2 = (char*)magTracks.track[1].data; bool bT3OK = false; if (magTracks.track[2].eStatus == CI_DATA_OK) { bT3OK = true; ctx->Ans.track3 = (char*)magTracks.track[2].data; } Track2Data track2Data; track2Data.status = 0; track2Data.t2Account = ""; char* tmpMag2 = new char[256]; ZeroMemory(tmpMag2, 256); DecodeTracksData((const char*)magTracks.track[1].data, magTracks.track[1].dwSize, (const char*)magTracks.track[2].data, magTracks.track[2].dwSize, tmpMag2, true, bT3OK); int pos = 0; for (int i = 0; i < magTracks.track[1].dwSize; ++i, ++pos) { if (magTracks.track[1].data[i] == 0x3d || magTracks.track[1].data[i] == 0x3e || magTracks.track[1].data[i] == 0x44)// fixpoint (3d是=,3e是 >), 运通卡要考虑分隔符为D的情况 break; } DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleString::Format(", split pos:%d", pos)); if (pos <= 0 || pos == magTracks.track[1].dwSize) { ctx->Ans.status = 1; if (tmpMag2 != NULL) { delete[]tmpMag2; tmpMag2 = NULL; } break; } char* ddd = new char[40]; memset(ddd, 0, 40); memcpy(ddd, magTracks.track[1].data, pos); if (SplitTrack2(tmpMag2, track2Data) == 0) { ctx->Ans.status = track2Data.status; ctx->Ans.t2Account = track2Data.t2Account; ctx->Ans.t2Region = track2Data.t2Region; ctx->Ans.t2CardSerial = track2Data.t2CardSerial; ctx->Ans.t2CVC = track2Data.t2CVC; ctx->Ans.t2ExpireDate = track2Data.t2ExpireDate; bReadCardInfo = true; if (m_issueStatus) { //设置为mixed从读卡失败恢复为成功时才触发同步计数和写运行时 if (m_mixedEx[m_currentHopper - 1]!= 0) { m_mixedEx[m_currentHopper - 1] = 0; SetCardMixed(m_mixedEx[m_currentHopper - 1], m_currentHopper); } else { SetDevStateAndSendMsg(DEVICE_STATUS_NORMAL); } } } if (_strnicmp(track2Data.t2Account, ddd, strlen(ddd)) && (track2Data.t2Account.GetLength() != 8)) { ctx->Ans.status = 0; ctx->Ans.t2Account = (char*)ddd; ctx->Ans.t2Region = ""; ctx->Ans.t2CardSerial = ""; ctx->Ans.t2CVC = ""; ctx->Ans.t2ExpireDate = ""; bReadCardInfo = true; delete[]ddd; } if (tmpMag2 != NULL) { delete[]tmpMag2; tmpMag2 = NULL; } DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format(", t2Account len:%d, %s****%s", ctx->Ans.t2Account.GetLength(), (LPCTSTR)ctx->Ans.t2Account.SubString(0, 6), (LPCTSTR)ctx->Ans.t2Account.SubString(ctx->Ans.t2Account.GetLength() - 4, 4))); CSimpleStringA cardInfo(true); if (!ctx->Ans.track2.IsNullOrEmpty() && (pos + 8) < magTracks.track[1].dwSize) { cardInfo = CSimpleStringA::Format("cardServiceCode:%s", (ctx->Ans.track2.SubString(pos + 1, 7)).GetData()); LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_Track2_ServiceCode, cardInfo.GetData()); } cardInfo = CSimpleStringA::Format("cardBin:%s****%s", (LPCTSTR)ctx->Ans.t2Account.SubString(0, 6), (LPCTSTR)ctx->Ans.t2Account.SubString(ctx->Ans.t2Account.GetLength() - 4, 4)); LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_CardBin, cardInfo.GetData()); break; } } while (readTries < READ_TRY_NUM); m_currCardNo = ctx->Ans.t2Account; //oilyang@20230331 //1、发卡且读磁成功,不再继续检测IC,一律ICType=1,以便读取IC //2、其他情况(发卡未读到磁条或前端插卡),先查询户口系统进行卡片介质判定: // 2a:户口系统返回非纯磁条介质类型,ICType以户口为准(ICType影响后续IC读取,即:都会读IC) // 2b:其他情况(户口系统访问错(未走户口系统查或访问微服务失败或未返回介质类型或返回纯磁条卡),一律探测是否芯片卡 if (m_issueStatus && (Error_Succeed == eMagReadErr && magTracks.track[1].eStatus == CI_DATA_OK))//发卡默认给芯片卡,且读到磁道(考虑卡片放错) { ctx->Ans.ICType = 1; bICOK = true; } else { int cardTypeFromHost = 0; bool bMismatch = false; if (m_eacQueryFlag == 1) cardTypeFromHost = JudgeCardType(m_currCardNo, bMismatch); if (cardTypeFromHost > 0 && cardTypeFromHost != 2)//户口系统返回非纯磁条介质类型 { ctx->Ans.ICType = cardTypeFromHost; if (m_bUseCardnoMismatch && bMismatch) { bICOK = true; return 2; } } else//未访问户口系统或户口系统访问失败或户口未告知介质类型(包括插反卡) { int icRetryTimes = 0; while (1) {//for poor mag only card,we always retry... bIC = m_pCardProcess->DetectIfICCard(CARD_MACHINE_ISSUER, m_hDevHelper, activeCardType); if (!bIC) icRetryTimes++; else break; Sleep(500); if (icRetryTimes >= m_ICRetryTimes) break; } DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleString::Format(", bIC:%d", bIC)); if (Error_Succeed == eMagReadErr && magTracks.track[1].eStatus == CI_DATA_OK) { if (bIC) ctx->Ans.ICType = 1; else { ctx->Ans.ICType = 2; } } else { if (bIC) { bReadCardInfo = true; ctx->Ans.ICType = 3; LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_MaybeIC_Only, ", maybe ic only."); } else { //既没有读到磁条,又不是IC,很大概率是插反了 LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_Maybe_InsertCard_InWrongStyle, ", 既没读到磁条,又没检测到IC,可能插反了"); if (m_issueStatus) { m_mixedEx[m_currentHopper - 1]++; SetCardMixed(m_mixedEx[m_currentHopper - 1], m_currentHopper); } } } if (bIC) { l_beginTime = GetTickCountRVC(); eErr = m_hDevHelper->DeactivateICCard(); l_endTime = GetTickCountRVC(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DeactivateICCard").setCostTime(l_endTime - l_beginTime)("ReadCard_Contact::DeactivateICCard"); if (eErr != Error_Succeed) { SetErrPackage("ReadCard::DeactivateICCard", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_DeactivateICCard); AlarmDEC(); } eErr = m_hDevHelper->ReleaseIC(); if (eErr != Error_Succeed) { SetErrPackage("ReadCard::ReleaseIC", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_ReleaseIC); AlarmDEC(); } } } } CSimpleStringA cardType = CSimpleStringA::Format("cardType:%d", ctx->Ans.ICType); LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_CardType, cardType.GetData()); DWORD dwEnd = GetTickCountRVC(); DWORD dwCollapse = dwEnd - dwStart; if (!bReadCardInfo) { bICOK = false; ctx->Ans.status = 1; if (GetDevStatus()) return 0; else return 1; } bICOK = true; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040220303")("ReadCard suc."); return 0; } int CCardIssuerFSM::ReadCard_RF(SpReqAnsContext::Pointer ctx) { LOG_FUNCTION(); ErrorCodeEnum eErr, eMagReadErr; eErr = m_hDevHelper->MoveCard(CI_MOVECARD_RF_POSITION); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("MoveCard(CI_MOVECARD_RF_POSITION) return %d", eErr); ctx->Ans.ICType = 0; int activeCardType; bool bIC(false), bICSuc(false), bReadCardInfo(false); long l_beginTime, l_endTime; CSimpleString errMsg(""); errMsg = CSimpleString::Format("ReadCard, inParam: reserved1 for lightPos:%d, m_issueStatus:%d, m_currentHopper:%d", ctx->Req.reserved1, m_issueStatus, m_currentHopper); LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_ReadCard_Process, errMsg.GetData()); DWORD dwStart = GetTickCountRVC(); MagTracks magTracks; int readTries = 0; memset(magTracks.track[0].data, 0, sizeof(magTracks.track[0].data)); memset(magTracks.track[1].data, 0, sizeof(magTracks.track[1].data)); memset(magTracks.track[2].data, 0, sizeof(magTracks.track[2].data)); magTracks.eRange = CI_TRACK_RANGE_2_3; do { //oiltmp tricks...copy mag data //need to remove ,just for simple or lazy... eMagReadErr = Error_Succeed; magTracks.eRange = m_magTracks.eRange; for (int i = 0; i < 3; ++i) { magTracks.track[i].eStatus = m_magTracks.track[i].eStatus; magTracks.track[i].eSource = m_magTracks.track[i].eSource; magTracks.track[i].dwSize = m_magTracks.track[i].dwSize; memcpy(magTracks.track[i].data, m_magTracks.track[i].data, sizeof(m_magTracks.track[i].data)); } ctx->Ans.t2Account = ctx->Ans.ICData = ""; readTries++; if (magTracks.track[1].dwSize > sizeof(magTracks.track[1].data) || magTracks.track[2].dwSize > sizeof(magTracks.track[2].data)) { errMsg = CSimpleString::Format("MagRead, trackSize maybe wrong:t2Size:%d(%d), t3Size:%d(%d)", magTracks.track[1].dwSize, sizeof(magTracks.track[1].data), magTracks.track[2].dwSize, sizeof(magTracks.track[2].data)); LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_TrackSize_Wrong, errMsg.GetData()); break; } if (Error_Succeed == eMagReadErr && magTracks.track[1].eStatus == CI_DATA_OK) { LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_OP, "CardIssuer op."); if (magTracks.track[1].dwSize > 40) { errMsg = CSimpleString::Format("MagRead, track2Size maybe wrong:t2Size:%d", magTracks.track[1].dwSize); LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_Track2Size_Wrong, errMsg.GetData()); ctx->Ans.status = 1; break; } ctx->Ans.track2 = (char*)magTracks.track[1].data; bool bT3OK = false; if (magTracks.track[2].eStatus == CI_DATA_OK) { bT3OK = true; ctx->Ans.track3 = (char*)magTracks.track[2].data; } Track2Data track2Data; track2Data.status = 0; track2Data.t2Account = ""; char* tmpMag2 = new char[256]; ZeroMemory(tmpMag2, 256); DecodeTracksData((const char*)magTracks.track[1].data, magTracks.track[1].dwSize, (const char*)magTracks.track[2].data, magTracks.track[2].dwSize, tmpMag2, true, bT3OK); int pos = 0; for (int i = 0; i < magTracks.track[1].dwSize; ++i, ++pos) { if (magTracks.track[1].data[i] == 0x3d || magTracks.track[1].data[i] == 0x3e || magTracks.track[1].data[i] == 0x44)// fixpoint (3d是=,3e是 >), 运通卡要考虑分隔符为D的情况 break; } DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleString::Format(", split pos:%d", pos)); if (pos <= 0 || pos == magTracks.track[1].dwSize) { ctx->Ans.status = 1; if (tmpMag2 != NULL) { delete[]tmpMag2; tmpMag2 = NULL; } break; } char* ddd = new char[40]; memset(ddd, 0, 40); memcpy(ddd, magTracks.track[1].data, pos); if (SplitTrack2(tmpMag2, track2Data) == 0) { ctx->Ans.status = track2Data.status; ctx->Ans.t2Account = track2Data.t2Account; ctx->Ans.t2Region = track2Data.t2Region; ctx->Ans.t2CardSerial = track2Data.t2CardSerial; ctx->Ans.t2CVC = track2Data.t2CVC; ctx->Ans.t2ExpireDate = track2Data.t2ExpireDate; bReadCardInfo = true; if (m_issueStatus) { //设置为mixed从读卡失败恢复为0时才触发同步计数和写运行时 if (m_mixedEx[m_currentHopper - 1] != 0) { m_mixedEx[m_currentHopper - 1] = 0; SetCardMixed(m_mixedEx[m_currentHopper - 1], m_currentHopper); } else { SetDevStateAndSendMsg(DEVICE_STATUS_NORMAL); } } } if (_strnicmp(track2Data.t2Account, ddd, strlen(ddd)) && (track2Data.t2Account.GetLength() != 8)) { ctx->Ans.status = 0; ctx->Ans.t2Account = (char*)ddd; ctx->Ans.t2Region = ""; ctx->Ans.t2CardSerial = ""; ctx->Ans.t2CVC = ""; ctx->Ans.t2ExpireDate = ""; bReadCardInfo = true; delete[]ddd; } if (tmpMag2 != NULL) { delete[]tmpMag2; tmpMag2 = NULL; } DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format(", t2Account len:%d, %s****%s", ctx->Ans.t2Account.GetLength(), (LPCTSTR)ctx->Ans.t2Account.SubString(0, 6), (LPCTSTR)ctx->Ans.t2Account.SubString(ctx->Ans.t2Account.GetLength() - 4, 4))); CSimpleStringA cardInfo(true); if (!ctx->Ans.track2.IsNullOrEmpty() && (pos + 8) < magTracks.track[1].dwSize) { cardInfo = CSimpleStringA::Format("cardServiceCode:%s", (ctx->Ans.track2.SubString(pos + 1, 7)).GetData()); LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_Track2_ServiceCode, cardInfo.GetData()); } cardInfo = CSimpleStringA::Format("cardBin:%s****%s", (LPCTSTR)ctx->Ans.t2Account.SubString(0, 6), (LPCTSTR)ctx->Ans.t2Account.SubString(ctx->Ans.t2Account.GetLength() - 4, 4)); LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_CardBin, cardInfo.GetData()); break; } } while (readTries < READ_TRY_NUM); m_currCardNo = ctx->Ans.t2Account; if (m_issueStatus && (Error_Succeed == eMagReadErr && magTracks.track[1].eStatus == CI_DATA_OK))//发卡默认给芯片卡,且读到磁道(考虑卡片放错) { ctx->Ans.ICType = 1; } else { int cardTypeFromHost = 0; bool bMismatch = false; if (m_eacQueryFlag == 1) cardTypeFromHost = JudgeCardType(m_currCardNo, bMismatch); if (cardTypeFromHost > 0)//户口系统有返回卡片类型 { ctx->Ans.ICType = cardTypeFromHost; if (m_bUseCardnoMismatch && bMismatch) return 2; } else//未访问户口系统或户口系统访问失败(包括插反卡) { int icRetryTimes = 0; while (1) {//for poor mag only card,we always retry... bIC = m_pCardProcess->DetectIfICCard(CARD_MACHINE_ISSUER_RF, m_hDevHelper, activeCardType); if (!bIC) icRetryTimes++; else break; Sleep(500); if (icRetryTimes >= m_ICRetryTimes) break; } DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleString::Format(", bIC:%d", bIC)); if (!(bIC && activeCardType == 'A')) bIC = false; if (Error_Succeed == eMagReadErr && magTracks.track[1].eStatus == CI_DATA_OK) { if (bIC) ctx->Ans.ICType = 1; else { ctx->Ans.ICType = 2; } } else { if (bIC) { bReadCardInfo = true; ctx->Ans.ICType = 3; LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_MaybeIC_Only, ", maybe ic only."); } else { } } if (bIC) { l_beginTime = GetTickCountRVC(); eErr = m_hDevHelper->DeactContactlessICCard(); l_endTime = GetTickCountRVC(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DeactContactlessICCard").setCostTime(l_endTime - l_beginTime)("ReadCard_RF::DeactContactlessICCard"); if (eErr != Error_Succeed) { SetErrPackage("ReadCard::DeactContactlessICCard", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_DeactivateICCard); AlarmDEC(); } } } } CSimpleStringA cardType = CSimpleStringA::Format("cardType:%d", ctx->Ans.ICType); LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_CardType, cardType.GetData()); DWORD dwEnd = GetTickCountRVC(); DWORD dwCollapse = dwEnd - dwStart; if (!bReadCardInfo) { ctx->Ans.status = 1; if (GetDevStatus()) return 0; else return 1; } DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040220303")("ReadCard suc."); return 0; } int CCardIssuerFSM::PreOnline(SpReqAnsContext::Pointer ctx) { if (m_bUseRFTillNext) return PreOnline_RF(ctx); bool bCtOK = false; int ret = PreOnline_Contact(ctx, bCtOK); if (!bCtOK && IfUseRf()) return PreOnline_RF(ctx); else return ret; } int CCardIssuerFSM::PreOnline_Contact(SpReqAnsContext::Pointer ctx, bool& bICOK) { LOG_FUNCTION(); //oilyang@20220611 only return 0;if unexpected,process and return 0 bool bCrossPreOnline = false; long l_beginTime, l_endTime; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("PreOnline, bussiness data[%s], req.reserved1:%s", ctx->Req.businessData.GetData(), ctx->Req.reserved1.GetData()); CSimpleStringA csMagT2Track(""), csMagT3Track(""), csMagAccout(""), csMagRegion(""), csMagCardSerial(""), csMagCVC(""), csMagExpireDate(""); int slot = 0; m_pCardProcess->SplitBusinessData(ctx->Req.businessData,ctx->Req.businessData.GetLength()); m_pCardProcess->SplitBusinessData("DF690101",strlen("DF690101")); int activeCardType; //oilyang@20201014 add emv card support int retDetectAndRead = -1; ICData aidFromBus(false, 0x4f, 0x00); if (m_pCardProcess->FindTagValue(TAG_VECTOR_BUS, aidFromBus, false, 0) == -1) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(", the front BusinessData han't provide aid data."); int icRetryTimes = 0; while (1) { retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER, m_hDevHelper, m_aidList, activeCardType, m_issueStatus); if (retDetectAndRead == -1)//only retry for active ic card failed! icRetryTimes++; else break; Sleep(500); if (icRetryTimes >= m_ICRetryTimes) break; } } else { char* pAIDTmp = new char[64]; memset(pAIDTmp, 0, 64); HexBuf2StrBuf(aidFromBus.value, &pAIDTmp, aidFromBus.lenth); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(", the aid from bussiness is[%s],len:%d .", pAIDTmp, strlen(pAIDTmp)); CAutoArray preAIDs; preAIDs.Init(1); preAIDs[0] = (CSimpleStringA)pAIDTmp; int icRetryTimes = 0; while (1) { retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER, m_hDevHelper, preAIDs, activeCardType, m_issueStatus); if (retDetectAndRead == -1)//only retry for active ic card failed! icRetryTimes++; else break; Sleep(500); if (icRetryTimes >= m_ICRetryTimes) break; } if (pAIDTmp != NULL) delete[]pAIDTmp; } DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(", After invoke DetectAndReadICData, retDetectAndRead:%d, activeCardType:%d", retDetectAndRead, activeCardType); if (retDetectAndRead < 0) { CSimpleStringA xCardName(""); if (m_issueStatus && m_currentHopper - 1 >= 0) xCardName = m_PsbNameEx[m_currentHopper - 1]; if (retDetectAndRead == -1) { if (!IfUseRf()) { if (IsInBusiness()) { if (m_issueStatus) { DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA230V")("发卡时,检测卡片类型时上电失败"); LogError(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_IssueCard_ActiveICCard_Failed, "(IssueCard)PreOnline::DetectAndReadICData:DetectIfICCard"); ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_IssueCard_ActiveICCard_Failed); } else { DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode("QLR040220303").setResultCode("RTA230M")("检测卡片类型时上电失败"); LogError(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_ActiveICCard_Failed, "PreOnline::DetectAndReadICData:DetectIfICCard"); ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_ActiveICCard_Failed); } } else { if (m_issueStatus) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA230V")("发卡时,检测卡片类型时上电失败"); LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_IssueCard_ActiveICCard_Failed, "(IssueCard)PreOnline::DetectAndReadICData:DetectIfICCard"); ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_IssueCard_ActiveICCard_Failed); } else { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220303").setResultCode("RTA230M")("检测卡片类型时上电失败"); LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_ActiveICCard_Failed, "PreOnline::DetectAndReadICData:DetectIfICCard"); ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_ActiveICCard_Failed); } } } else //非终态,还有非接兜底 { if (m_issueStatus) DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA230V")("发卡时,检测卡片类型时上电失败"); else DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220303").setResultCode("RTA230M")("检测卡片类型时上电失败"); } } else if (retDetectAndRead == -2){ if (!IfUseRf()) { SetErrPackage(xCardName + " PreOnline::DetectAndReadICData:GetICDataFromCard(-2)", m_csDevSN, Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand); if (IsInBusiness()) { if (m_issueStatus) DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA2302")("读取IC数据失败"); else DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode("QLR040220303").setResultCode("RTA2302")("读取IC数据失败"); ctx->Answer(Error_Unexpect, AlarmDEC(true)); } else { if (m_issueStatus) DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA2302")("读取IC数据失败"); else DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220303").setResultCode("RTA2302")("读取IC数据失败"); ctx->Answer(Error_Unexpect, AlarmDEC()); } } else //非终态,还有非接兜底 { if (m_issueStatus) DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA2302")("读取IC数据失败"); else DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220303").setResultCode("RTA2302")("读取IC数据失败"); } }else if (retDetectAndRead == -3){ if (!IfUseRf()) { SetErrPackage(xCardName + " PreOnline::DetectAndReadICData:GetICDataFromCard(-3)", m_csDevSN, Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand); if (IsInBusiness()) { //TODO 完善日志(LogCode及ResultCode if (m_issueStatus) { DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA2302")("IC卡建立应用列表失败"); } else { DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode("QLR040220303").setResultCode("RTA2302")("IC卡建立应用列表失败"); } ctx->Answer(Error_Unexpect, AlarmDEC(true)); } else { //TODO 完善日志(LogCode及ResultCode if (m_issueStatus) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA2302")("IC卡建立应用列表失败"); } else { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220303").setResultCode("RTA2302")("IC卡建立应用列表失败"); } ctx->Answer(Error_Unexpect, AlarmDEC()); } } else //非终态,还有非接兜底 { //TODO 完善日志(LogCode及ResultCode if (m_issueStatus) DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA2302")("IC卡建立应用列表失败"); else DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220303").setResultCode("RTA2302")("IC卡建立应用列表失败"); } } bICOK = false; return 0; } m_pCardProcess->TermRiskManage(); CSimpleStringA taaResult; BYTE bt9f27 = 0; int retTAA = m_pCardProcess->TermActionAnalyze(CARD_MACHINE_ISSUER,m_hDevHelper,taaResult,true,m_bCDA,bt9f27); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(", TermActionAnalyze, retTAA:%d, taaResult:%s", retTAA, taaResult.GetData()); switch(retTAA) {//to be added oiltmp 20140929 case -1: //some data may be wrong break; case 1: //terminal trans break; case 2: //to do trans end "TransEnd" break; default: break; } ctx->Ans.result = taaResult; // Dbg("[%d,%d,%d,%d]",m_TVR[0],m_TVR[1],m_TVR[2],m_TVR[3]); //} if (ctx->Ans.result.GetLength() == 0) { if (!IfUseRf()) ctx->Answer(Error_Succeed); return 0; } //char tmpResult[1024,]result[1024]; //ZeroMemory(tmpResult,sizeof(tmpResult)); //ZeroMemory(result,sizeof(result)); //memcpy(tmpResult,ctx->Ans.result,ctx->Ans.result.GetLength()); string tmpResult,actionType,result = "",baseICData = ""; tmpResult = ctx->Ans.result; char *pSomeICData = new char[ONE_K]; ZeroMemory(pSomeICData, ONE_K); int lenRet = m_pCardProcess->ConstructARQCData(tmpResult.substr(6,4).c_str(),m_pDataToARQC,pSomeICData); baseICData = pSomeICData; if (pSomeICData != NULL) delete []pSomeICData; char arqcLen[8]; ZeroMemory(arqcLen,sizeof(arqcLen)); _itoa(lenRet,arqcLen,10); ICData appExpiryDate(false,0x5f,0x24); if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC,appExpiryDate,false,0) == -1) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(", can't find expire date"); if (!IfUseRf()) ctx->Answer(Error_Succeed); return 0; } char *pExpireDate = new char[12]; ZeroMemory(pExpireDate,12); HexBuf2StrBuf(appExpiryDate.value,&pExpireDate,appExpiryDate.lenth); ICData track2(false,0x57,0x00),ICCardSerial(false,0x5f,0x34); ErrorCodeEnum eErr = Error_Unexpect; string t2ICAccount(""),t2ICCardSerial(""),t2ICCVC(""),t2ICTrack2(""),cardType("0"); char *pICCardSerial = new char[4]; ZeroMemory(pICCardSerial,4); if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC,ICCardSerial,false) == -1) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(", can't find card serial."); } else { HexBuf2StrBuf(ICCardSerial.value,&pICCardSerial,ICCardSerial.lenth); } if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC,track2,false,0) == -1) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(", [ic]no track2 data"); eErr = m_hDevHelper->ReleaseIC(); if (eErr != Error_Succeed){ SetErrPackage("PreOnline::ReleaseIC", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_ReleaseIC); AlarmDEC(); } } else { int pos = FindHexCharPosition(track2.value,0x0d,track2.lenth); char *pICTrack2 = new char[128]; ZeroMemory(pICTrack2,128); HexBuf2StrBuf(track2.value,&pICTrack2,track2.lenth); pICTrack2[37] = '\0'; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format(", ic.track2, split pos:%d", pos)); char *ddd = new char[40]; memset(ddd,0,40); memcpy(ddd,pICTrack2,pos-1); char icTrack2Data[128]; ZeroMemory(icTrack2Data,sizeof(icTrack2Data)); Track2Data track2Data; track2Data.status = 0; track2Data.t2Account = ""; cmdDecodeMag2(pICTrack2,icTrack2Data); if (SplitTrack2(icTrack2Data,track2Data) == 0) { t2ICAccount = track2Data.t2Account; //t2ICCardSerial = track2Data.t2CardSerial; t2ICCVC = track2Data.t2CVC; t2ICTrack2 = pICTrack2; if (m_issueStatus) { //设置为mixed从读卡失败恢复为0时才触发同步计数和写运行时 if (m_mixedEx[m_currentHopper - 1] != 0) { m_mixedEx[m_currentHopper - 1] = 0; bool bSetMix = SetCardMixed(m_mixedEx[m_currentHopper - 1], m_currentHopper); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(", set %d card mixed %d,%d", m_currentHopper, bSetMix, m_mixedEx[m_currentHopper - 1]); } else { SetDevStateAndSendMsg(DEVICE_STATUS_NORMAL); } } } if (_strnicmp(track2Data.t2Account,ddd,strlen(ddd))) { t2ICCVC = ""; t2ICTrack2 = pICTrack2; t2ICAccount = (char*)ddd; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("count:%s,%s", t2ICAccount.substr(0, 6).c_str(), t2ICAccount.substr(t2ICAccount.length()-4, 4).c_str()); } t2ICCardSerial = pICCardSerial; delete []ddd; delete []pICTrack2; } //80 1e 80 0008 328ab54bfc986b85 07010103a0b000010a010000000000754048769000 if (m_pCardProcess->GetP1() == 0x1) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(", actionType:%s", actionType.c_str()); actionType = "ARQC"; } else actionType = ""; //【55域】 // 基本域: // 9F26 8b 应用密文AC // 9F27 1b 密文信息数据 // 9F10 max.32b 发卡行应用数据IAD // 9F37 4b 不可预知数 // 9F36 2b 应用交易计数器ATC // 95 5b 终端验证结果TVR // 9A 3cn 交易日期(6位有效数字,YYMMDD) // 9C 1cn 交易类型(2位有效数字) // 9F02 6cn 授权金额(12位有效数字) // 5F2A 2cn 交易货币代码(3位有效数字) // 82 2b 应用交互特征AIP // 9F1A 2cn 终端国家代码(3位有效数字) // 9F03 6cn 其他金额(12位有效数字) // 9F33 3b 终端性能 "E0C900" // 可选域: //添加9F26,9F27,9F10,9F33的数据 char *pCID = new char[4]; ZeroMemory(pCID, 4); HexBuf2StrBuf(&bt9f27, &pCID, 1); char *pIssueBankLen = new char[4]; ZeroMemory(pIssueBankLen, 4); int len9f10 = tmpResult.length() - 26 - 4; int lenHigh, lenLow; len9f10 = len9f10 / 2; lenHigh = len9f10 / 16; lenLow = len9f10 % 16; BYTE bt9f10; bt9f10 = (lenHigh<<4) + lenLow; HexBuf2StrBuf(&bt9f10, &pIssueBankLen, 1); baseICData += "9F2608" + tmpResult.substr(10, 16) + "9F2701" + pCID +"9F10" + pIssueBankLen + tmpResult.substr(26, tmpResult.length() - 26 - 4) + "9F3303" + "E0C900"; result = "ACTION," + actionType + "|" + "ATCCODE," + tmpResult.substr(6,4) + "|" + "ARQCCODE," + tmpResult.substr(10,16) + "|" + "MAC," + tmpResult.substr(26,tmpResult.length()-26-4) + "|" + "ARQCSIZE," + string(arqcLen) + "|" + "ARQCDATA," + m_pDataToARQC + "|EXPIREDATE," + pExpireDate + "|T2ACCOUNT," + t2ICAccount + "|T2CARDSERIAL," + t2ICCardSerial + "|T2CVC," + t2ICCVC + "|T2TRACK2," + t2ICTrack2 + "|CARDCAT," + cardType + "|ICTAGS," + baseICData + "|MAGT2," + (const char*)csMagT2Track + "|MAGT3," + (const char*)csMagT3Track + "|MAGACCOUNT," + (const char*)csMagAccout + "|MAGREGION," + (const char*)csMagRegion + "|MAGCARDSERIAL," + (const char*)csMagCardSerial+ "|MAGCVC," + (const char*)csMagCVC+ "|MAGEXPIREDATAE," + (const char*)csMagExpireDate; ctx->Ans.result = result.c_str(); string txtresult = ""; txtresult = "ACTION," + actionType + "|" + "ATCCODE," + tmpResult.substr(6,4) + "|" + "ARQCCODE," + tmpResult.substr(10,16) + "|" + "MAC," + tmpResult.substr(26,tmpResult.length()-26-4) + "|" + "ARQCSIZE," + string(arqcLen) + "|" + "ARQCDATA," + m_pDataToARQC + "|T2ACCOUNT(F6)," + t2ICAccount.substr(0, 6) + "|T2ACCOUNT(L4)," + t2ICAccount.substr(t2ICAccount.length()-4, 4) + "|T2CARDSERIAL(len)," + t2ICCardSerial + "|CARDCAT," + cardType; m_currCardNo = t2ICAccount.c_str(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(", data to host(less)[%s],baseICData length:%d", txtresult.c_str(), baseICData.length()); if (pCID != NULL) delete[]pCID; if (pIssueBankLen != NULL) delete[]pIssueBankLen; if (pExpireDate != NULL) delete []pExpireDate; if (m_pDataToARQC != NULL) { delete []m_pDataToARQC; m_pDataToARQC = NULL; } bICOK = true; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040220306")(); ctx->Answer(Error_Succeed); return 0; } int CCardIssuerFSM::PreOnline_RF(SpReqAnsContext::Pointer ctx) { LOG_FUNCTION(); long l_beginTime, l_endTime; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("(PreOnline) use cardissuer rf"); l_beginTime = GetTickCountRVC(); ErrorCodeEnum eErr = m_hDevHelper->MoveCard(CI_MOVECARD_RF_POSITION); l_endTime = GetTickCountRVC(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::MoveCard").setCostTime(l_endTime - l_beginTime)("PreOnline_RF::MoveCard, (CI_MOVECARD_RF_POSITION) return %d", eErr); //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("MoveCard(CI_MOVECARD_RF_POSITION) return %d", eErr); //oilyang@20220611 only return 0;if unexpected,process and return 0 bool bCrossPreOnline = false; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("PreOnline, bussiness data[%s], req.reserved1:%s", ctx->Req.businessData.GetData(), ctx->Req.reserved1.GetData()); CSimpleStringA csMagT2Track(""), csMagT3Track(""), csMagAccout(""), csMagRegion(""), csMagCardSerial(""), csMagCVC(""), csMagExpireDate(""); int slot = 0; m_pCardProcess->SplitBusinessData(ctx->Req.businessData, ctx->Req.businessData.GetLength()); m_pCardProcess->SplitBusinessData("DF690101", strlen("DF690101")); int activeCardType; //oilyang@20201014 add emv card support int retDetectAndRead = -1; ICData aidFromBus(false, 0x4f, 0x00); if (m_pCardProcess->FindTagValue(TAG_VECTOR_BUS, aidFromBus, false, 0) == -1) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(", the front BusinessData han't provide aid data."); int icRetryTimes = 0; while (1) { retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER_RF, m_hDevHelper, m_aidList, activeCardType, m_issueStatus); if (retDetectAndRead == -1)//only retry for active ic card failed! icRetryTimes++; else break; Sleep(500); if (icRetryTimes >= m_ICRetryTimes) break; } } else { char* pAIDTmp = new char[64]; memset(pAIDTmp, 0, 64); HexBuf2StrBuf(aidFromBus.value, &pAIDTmp, aidFromBus.lenth); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(", the aid from bussiness is[%s],len:%d .", pAIDTmp, strlen(pAIDTmp)); CAutoArray preAIDs; preAIDs.Init(1); preAIDs[0] = (CSimpleStringA)pAIDTmp; int icRetryTimes = 0; while (1) { retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER_RF, m_hDevHelper, preAIDs, activeCardType, m_issueStatus); if (retDetectAndRead == -1)//only retry for active ic card failed! icRetryTimes++; else break; Sleep(500); if (icRetryTimes >= m_ICRetryTimes) break; } if (pAIDTmp != NULL) delete[]pAIDTmp; } DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(", After invoke DetectAndReadICData, retDetectAndRead:%d, activeCardType:%d", retDetectAndRead, activeCardType); if (retDetectAndRead < 0) { CSimpleStringA xCardName(""); if (m_issueStatus && m_currentHopper - 1 >= 0) xCardName = m_PsbNameEx[m_currentHopper - 1]; if (retDetectAndRead == -1) { if (m_issueStatus) { if (IsInBusiness()) { DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA2327")("发卡时,检测卡片类型时上电失败(非接)"); LogError(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_IssueCard_ActiveRF_Failed, "(IssueCard)PreOnline_RF::DetectAndReadICData:DetectIfICCard"); } else { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA2327")("发卡时,检测卡片类型时上电失败(非接)"); LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_IssueCard_ActiveRF_Failed, "(IssueCard)PreOnline_RF::DetectAndReadICData:DetectIfICCard"); } ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_IssueCard_ActiveRF_Failed); } else { if (IsInBusiness()) { DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode("QLR040220303").setResultCode("RTA2326")("检测卡片类型时上电失败"); LogError(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_ActiveContactlessICCard_Failed, "PreOnline_RF::DetectAndReadICData:DetectIfICCard"); } else { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220303").setResultCode("RTA2326")("检测卡片类型时上电失败"); LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_ActiveContactlessICCard_Failed, "PreOnline_RF::DetectAndReadICData:DetectIfICCard"); } ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_ActiveContactlessICCard_Failed); } } else if (retDetectAndRead == -2) { //if (m_issueStatus) // DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA2302")("读取IC数据失败"); //else // DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220303").setResultCode("RTA2302")("读取IC数据失败"); SetErrPackage(xCardName + " PreOnline::DetectAndReadICData:GetICDataFromCard(-2)", m_csDevSN, Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand); //ctx->Answer(Error_Unexpect, AlarmDEC(m_iInWhatPage == PageType_Other)); if (IsInBusiness()) { if (m_issueStatus) DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA2302")("读取IC数据失败"); else DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode("QLR040220303").setResultCode("RTA2302")("读取IC数据失败"); ctx->Answer(Error_Unexpect, AlarmDEC(true)); } else { if (m_issueStatus) DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA2302")("读取IC数据失败"); else DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220303").setResultCode("RTA2302")("读取IC数据失败"); ctx->Answer(Error_Unexpect, AlarmDEC()); } } else if (retDetectAndRead == -3) { //if (m_issueStatus) // DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA2302")("读取IC数据失败"); //else // DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220303").setResultCode("RTA2302")("读取IC数据失败"); SetErrPackage(xCardName + " PreOnline::DetectAndReadICData:GetICDataFromCard(-3)", m_csDevSN, Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand); //ctx->Answer(Error_Unexpect, AlarmDEC(m_iInWhatPage == PageType_Other)); if (IsInBusiness()) { if (m_issueStatus) DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA2302")("IC卡建立应用列表失败"); else DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode("QLR040220303").setResultCode("RTA2302")("IC卡建立应用列表失败"); ctx->Answer(Error_Unexpect, AlarmDEC(true)); } else { if (m_issueStatus) DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA2302")("IC卡建立应用列表失败"); else DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220303").setResultCode("RTA2302")("IC卡建立应用列表失败"); ctx->Answer(Error_Unexpect, AlarmDEC()); } } return 0; } m_pCardProcess->TermRiskManage(); CSimpleStringA taaResult; BYTE bt9f27 = 0; int retTAA = m_pCardProcess->TermActionAnalyze(CARD_MACHINE_ISSUER_RF, m_hDevHelper, taaResult, true, m_bCDA, bt9f27); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(", TermActionAnalyze, retTAA:%d, taaResult:%s", retTAA, taaResult.GetData()); switch (retTAA) {//to be added oiltmp 20140929 case -1: //some data may be wrong break; case 1: //terminal trans break; case 2: //to do trans end "TransEnd" break; default: break; } ctx->Ans.result = taaResult; // Dbg("[%d,%d,%d,%d]",m_TVR[0],m_TVR[1],m_TVR[2],m_TVR[3]); //} if (ctx->Ans.result.GetLength() == 0) { ctx->Answer(Error_Succeed); return 0; } //char tmpResult[1024,]result[1024]; //ZeroMemory(tmpResult,sizeof(tmpResult)); //ZeroMemory(result,sizeof(result)); //memcpy(tmpResult,ctx->Ans.result,ctx->Ans.result.GetLength()); string tmpResult, actionType, result = "", baseICData = ""; tmpResult = ctx->Ans.result; char* pSomeICData = new char[ONE_K]; ZeroMemory(pSomeICData, ONE_K); int lenRet = m_pCardProcess->ConstructARQCData(tmpResult.substr(6, 4).c_str(), m_pDataToARQC, pSomeICData); baseICData = pSomeICData; if (pSomeICData != NULL) delete[]pSomeICData; char arqcLen[8]; ZeroMemory(arqcLen, sizeof(arqcLen)); _itoa(lenRet, arqcLen, 10); ICData appExpiryDate(false, 0x5f, 0x24); if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC, appExpiryDate, false, 0) == -1) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(", can't find expire date"); ctx->Answer(Error_Succeed); return 0; } char* pExpireDate = new char[12]; ZeroMemory(pExpireDate, 12); HexBuf2StrBuf(appExpiryDate.value, &pExpireDate, appExpiryDate.lenth); ICData track2(false, 0x57, 0x00), ICCardSerial(false, 0x5f, 0x34); string t2ICAccount(""), t2ICCardSerial(""), t2ICCVC(""), t2ICTrack2(""), cardType("0"); char* pICCardSerial = new char[4]; ZeroMemory(pICCardSerial, 4); if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC, ICCardSerial, false) == -1) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(", can't find card serial."); } else { HexBuf2StrBuf(ICCardSerial.value, &pICCardSerial, ICCardSerial.lenth); } if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC, track2, false, 0) == -1) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(", [ic]no track2 data"); } else { int pos = FindHexCharPosition(track2.value, 0x0d, track2.lenth); char* pICTrack2 = new char[128]; ZeroMemory(pICTrack2, 128); HexBuf2StrBuf(track2.value, &pICTrack2, track2.lenth); pICTrack2[37] = '\0'; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format(", ic.track2, split pos:%d", pos)); char* ddd = new char[40]; memset(ddd, 0, 40); memcpy(ddd, pICTrack2, pos - 1); char icTrack2Data[128]; ZeroMemory(icTrack2Data, sizeof(icTrack2Data)); Track2Data track2Data; track2Data.status = 0; track2Data.t2Account = ""; cmdDecodeMag2(pICTrack2, icTrack2Data); if (SplitTrack2(icTrack2Data, track2Data) == 0) { t2ICAccount = track2Data.t2Account; //t2ICCardSerial = track2Data.t2CardSerial; t2ICCVC = track2Data.t2CVC; t2ICTrack2 = pICTrack2; //oilyang@20230116 if we read by RF,we can't reset card mixed //if (m_issueStatus) //{ // m_mixedEx[m_currentHopper - 1] = 0; // bool bSetMix = SetCardMixed(m_mixedEx[m_currentHopper - 1], m_currentHopper); // DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(", set %d card mixed %d,%d", m_currentHopper, bSetMix, m_mixedEx[m_currentHopper - 1]); //} } if (_strnicmp(track2Data.t2Account, ddd, strlen(ddd))) { t2ICCVC = ""; t2ICTrack2 = pICTrack2; t2ICAccount = (char*)ddd; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("count:%s,%s", t2ICAccount.substr(0, 6).c_str(), t2ICAccount.substr(t2ICAccount.length() - 4, 4).c_str()); } t2ICCardSerial = pICCardSerial; delete[]ddd; delete[]pICTrack2; } //80 1e 80 0008 328ab54bfc986b85 07010103a0b000010a010000000000754048769000 if (m_pCardProcess->GetP1() == 0x1) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(", actionType:%s", actionType.c_str()); actionType = "ARQC"; } else actionType = ""; //【55域】 // 基本域: // 9F26 8b 应用密文AC // 9F27 1b 密文信息数据 // 9F10 max.32b 发卡行应用数据IAD // 9F37 4b 不可预知数 // 9F36 2b 应用交易计数器ATC // 95 5b 终端验证结果TVR // 9A 3cn 交易日期(6位有效数字,YYMMDD) // 9C 1cn 交易类型(2位有效数字) // 9F02 6cn 授权金额(12位有效数字) // 5F2A 2cn 交易货币代码(3位有效数字) // 82 2b 应用交互特征AIP // 9F1A 2cn 终端国家代码(3位有效数字) // 9F03 6cn 其他金额(12位有效数字) // 9F33 3b 终端性能 "E0C900" // 可选域: //添加9F26,9F27,9F10,9F33的数据 char* pCID = new char[4]; ZeroMemory(pCID, 4); HexBuf2StrBuf(&bt9f27, &pCID, 1); char* pIssueBankLen = new char[4]; ZeroMemory(pIssueBankLen, 4); int len9f10 = tmpResult.length() - 26 - 4; int lenHigh, lenLow; len9f10 = len9f10 / 2; lenHigh = len9f10 / 16; lenLow = len9f10 % 16; BYTE bt9f10; bt9f10 = (lenHigh << 4) + lenLow; HexBuf2StrBuf(&bt9f10, &pIssueBankLen, 1); baseICData += "9F2608" + tmpResult.substr(10, 16) + "9F2701" + pCID + "9F10" + pIssueBankLen + tmpResult.substr(26, tmpResult.length() - 26 - 4) + "9F3303" + "E0C900"; result = "ACTION," + actionType + "|" + "ATCCODE," + tmpResult.substr(6, 4) + "|" + "ARQCCODE," + tmpResult.substr(10, 16) + "|" + "MAC," + tmpResult.substr(26, tmpResult.length() - 26 - 4) + "|" + "ARQCSIZE," + string(arqcLen) + "|" + "ARQCDATA," + m_pDataToARQC + "|EXPIREDATE," + pExpireDate + "|T2ACCOUNT," + t2ICAccount + "|T2CARDSERIAL," + t2ICCardSerial + "|T2CVC," + t2ICCVC + "|T2TRACK2," + t2ICTrack2 + "|CARDCAT," + cardType + "|ICTAGS," + baseICData + "|MAGT2," + (const char*)csMagT2Track + "|MAGT3," + (const char*)csMagT3Track + "|MAGACCOUNT," + (const char*)csMagAccout + "|MAGREGION," + (const char*)csMagRegion + "|MAGCARDSERIAL," + (const char*)csMagCardSerial + "|MAGCVC," + (const char*)csMagCVC + "|MAGEXPIREDATAE," + (const char*)csMagExpireDate; ctx->Ans.result = result.c_str(); string txtresult = ""; txtresult = "ACTION," + actionType + "|" + "ATCCODE," + tmpResult.substr(6, 4) + "|" + "ARQCCODE," + tmpResult.substr(10, 16) + "|" + "MAC," + tmpResult.substr(26, tmpResult.length() - 26 - 4) + "|" + "ARQCSIZE," + string(arqcLen) + "|" + "ARQCDATA," + m_pDataToARQC + "|T2ACCOUNT(F6)," + t2ICAccount.substr(0, 6) + "|T2ACCOUNT(L4)," + t2ICAccount.substr(t2ICAccount.length() - 4, 4) + "|T2CARDSERIAL(len)," + t2ICCardSerial + "|CARDCAT," + cardType; m_currCardNo = t2ICAccount.c_str(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(", data to host(less)[%s],baseICData length:%d", txtresult.c_str(), baseICData.length()); if (pCID != NULL) delete[]pCID; if (pIssueBankLen != NULL) delete[]pIssueBankLen; if (pExpireDate != NULL) delete[]pExpireDate; if (m_pDataToARQC != NULL) { delete[]m_pDataToARQC; m_pDataToARQC = NULL; } LogWarn(Severity_Low, Error_Succeed, CardIssuer_UserErrorCode_ReadByRF, CSimpleStringA::Format("PreOnline_RF ok.iIssue:%d ", m_issueStatus)); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040220306")(); ctx->Answer(Error_Succeed); return 0; } int CCardIssuerFSM::PostOnline(SpReqAnsContext::Pointer ctx) { if (m_bUseRFTillNext) return PostOnline_RF(ctx); bool bCtOK = false; int ret = PostOnline_Contact(ctx, bCtOK); if (!bCtOK && IfUseRf()) return PostOnline_RF(ctx); else return ret; } int CCardIssuerFSM::PostOnline_Contact(SpReqAnsContext::Pointer ctx, bool& bICOK) { LOG_FUNCTION(); m_pCardProcess->DataInit(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(", post online data[%s]", (LPCTSTR)ctx->Req.data); m_pCardProcess->SplitOnlineReplyData(ctx->Req.data,strlen(ctx->Req.data)); int issBnkAuth = m_pCardProcess->IssueBankAuth(CARD_MACHINE_ISSUER,m_hDevHelper); CSimpleStringA csTransEnd; if (issBnkAuth == 0) { int transEnd = m_pCardProcess->TransEnd(CARD_MACHINE_ISSUER,m_hDevHelper,m_bCDA); if (transEnd == 0) csTransEnd = "TRANSEND,0"; else if (transEnd == 1) csTransEnd = "TRANSEND,1"; } else csTransEnd = "TRANSEND,1"; ctx->Ans.result = csTransEnd; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(", issBnkAuth:%d, csTransEnd:%s", issBnkAuth, csTransEnd.GetData()); //PBYTE pData = new BYTE[MAX_IC_BUFFER_SIZE]; //ZeroMemory(pData,MAX_IC_BUFFER_SIZE); //int size = StrBuf2HexBuf(ctx->Req.data,&pData); //if (size > 0) //m_pCardProcess->ExecuteIssuerScript(CARD_MACHINE_ISSUER,m_hDevHelper); //else //{ // Dbg("Wrong post on line data[%s]",ctx->Req.data); // ctx->Answer(Error_Unexpect); //} DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040220307")(); ctx->Answer(Error_Succeed); return 0; } int CCardIssuerFSM::PostOnline_RF(SpReqAnsContext::Pointer ctx) { LOG_FUNCTION(); m_pCardProcess->DataInit(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(", post online data[%s]", (LPCTSTR)ctx->Req.data); m_pCardProcess->SplitOnlineReplyData(ctx->Req.data, strlen(ctx->Req.data)); int issBnkAuth = m_pCardProcess->IssueBankAuth(CARD_MACHINE_ISSUER_RF, m_hDevHelper); CSimpleStringA csTransEnd; if (issBnkAuth == 0) { int transEnd = m_pCardProcess->TransEnd(CARD_MACHINE_ISSUER_RF, m_hDevHelper, m_bCDA); if (transEnd == 0) csTransEnd = "TRANSEND,0"; else if (transEnd == 1) csTransEnd = "TRANSEND,1"; } else csTransEnd = "TRANSEND,1"; ctx->Ans.result = csTransEnd; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(", issBnkAuth:%d, csTransEnd:%s", issBnkAuth, csTransEnd.GetData()); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040220307")(); ctx->Answer(Error_Succeed); return 0; } int CCardIssuerFSM::WriteCard(SpReqAnsContext::Pointer ctx) { LOG_FUNCTION(); ErrorCodeEnum eErr; int ret = 0; long l_beginTime, l_endTime; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("WriteCard,t1Len:%d, t2Len:%d, t3Len:%d", ctx->Req.track1.GetLength(), ctx->Req.track2.GetLength(), ctx->Req.track3.GetLength())); if (ctx->Req.track1.GetLength() <= 0 && ctx->Req.track2.GetLength() <= 0 && ctx->Req.track3.GetLength() <= 0) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(", write card param is null."); ctx->Answer(Error_Param); return ret; } else { l_beginTime = GetTickCountRVC(); eErr = m_hDevHelper->MoveCard(CI_MOVECARD_MAG_POSITION); l_endTime = GetTickCountRVC(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::MoveCard").setCostTime(l_endTime - l_beginTime)("WriteCard::MoveCard"); if (eErr != Error_Succeed) { SetErrPackage("WriteCard::MoveCard(CI_MOVECARD_MAG_POSITION)", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_CI_MOVECARD_MAG_POSITION); //DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220315").setResultCode("RTA2309")("从卡箱移动卡片到磁条写卡位置失败"); //ctx->Answer(Error_Unexpect, AlarmDEC(m_iInWhatPage == PageType_Other)); if (IsInBusiness()) { DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode("QLR040220315").setResultCode("RTA2309")("从卡箱移动卡片到磁条写卡位置失败"); ctx->Answer(Error_Unexpect, AlarmDEC(true)); } else { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220315").setResultCode("RTA2309")("从卡箱移动卡片到磁条写卡位置失败"); ctx->Answer(Error_Unexpect, AlarmDEC()); } return ret; } } MagTracks magTrack; ZeroMemory(magTrack.track[0].data, MAX_MAG_TRACK_SIZE); ZeroMemory(magTrack.track[1].data, MAX_MAG_TRACK_SIZE); ZeroMemory(magTrack.track[2].data, MAX_MAG_TRACK_SIZE); magTrack.track[0].dwSize = magTrack.track[1].dwSize = magTrack.track[2].dwSize = 0; magTrack.track[0].eStatus = magTrack.track[1].eStatus = magTrack.track[2].eStatus = CI_DATA_INVALID; TrackRange iT1, iT2, iT3; iT1 = iT2 = iT3 = CI_TRACK_RANGE_START; if (ctx->Req.track1.GetLength() > 0) { iT1 = CI_TRACK_RANGE_1; CSimpleStringA csT1 = CSimpleStringW2A(ctx->Req.track1); strncpy((char*)magTrack.track[0].data, csT1, csT1.GetLength()); magTrack.track[0].eSource = CI_TRACK_SOURCE_1; magTrack.track[0].eStatus = CI_DATA_OK; magTrack.track[0].dwSize = csT1.GetLength(); } if (ctx->Req.track2.GetLength() > 0) { iT2 = CI_TRACK_RANGE_2; CSimpleStringA csT2 = CSimpleStringW2A(ctx->Req.track2); strncpy((char*)magTrack.track[1].data, csT2, csT2.GetLength()); magTrack.track[1].eSource = CI_TRACK_SOURCE_2; magTrack.track[1].eStatus = CI_DATA_OK; magTrack.track[1].dwSize = csT2.GetLength(); } if (ctx->Req.track3.GetLength() > 0) { iT3 = CI_TRACK_RANGE_3; CSimpleStringA csT3 = CSimpleStringW2A(ctx->Req.track3); strncpy((char*)magTrack.track[2].data, csT3, csT3.GetLength()); magTrack.track[2].eSource = CI_TRACK_SOURCE_3; magTrack.track[2].eStatus = CI_DATA_OK; magTrack.track[2].dwSize = csT3.GetLength(); } //TrackRange eAll = iT2 | iT2; magTrack.eRange = TrackRange(iT1 | iT2 | iT3); l_beginTime = GetTickCountRVC(); eErr = m_hDevHelper->MagWrite(magTrack, AUTO_CO); l_endTime = GetTickCountRVC(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::MagWrite").setCostTime(l_endTime - l_beginTime)("WriteCard::MagWrite"); if (eErr != Error_Succeed) { SetErrPackage("WriteCard::MagWrite", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_MagWrite); AlarmDEC(); ret = 1; } DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040220315")("MagWrite ok"); ctx->Ans.result = ret; ctx->Answer(Error_Succeed); return ret; } void CCardIssuerFSM::SelfTest(EntityTestEnum eTestType,CSmartPointer pTransactionContext) { //for simple pTransactionContext->SendAnswer(m_testResult); } bool CCardIssuerFSM::FSMSetIssueFlag(int value) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("FSMSetIssueFlag, value:%d,from file:%d", value, m_issueStatusFromFile); if (value == 0 && m_issueStatusFromFile >1) { //oilyang@20171220 如果曾经卡片卡住,但启动时没有发现卡片,则更新本次发卡方向但不写文件,以防后续卡片被移动到卡槽 if (!m_hasCardWhileDevOpen) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("card jamed havn't been process."); m_issueStatus = 0; } else DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("insert succeed,but there maybe some card jamed..."); return true; } m_issueStatus = value; CSmartPointer spEntityFunction = GetEntityBase()->GetFunction(); CSmartPointer spConfig; ErrorCodeEnum eErrDev = spEntityFunction->OpenConfig(Config_Run, spConfig); if (eErrDev != Error_Succeed) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("(FSMSetIssueFlag)open cfg file failed!"); return false; } if (spConfig->WriteConfigValueInt("RunInfo", "IsIssue", value) == Error_Succeed && spConfig->WriteConfigValueInt("all", "IsIssue", value) == Error_Succeed) return true; else return false; } bool CCardIssuerFSM::SetCardCaptured(const int num,bool bClear) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(", num:%d, bClear:%d, m_maxRetainCount:%d, m_bSettingMaterial:%d", num, bClear, m_maxRetainCount, m_bSettingMaterial); if (num < 0) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(", wrong reset card captured"); return false; } CSmartPointer spEntityFunction = GetEntityBase()->GetFunction(); CSmartPointer spConfig; ErrorCodeEnum eErrDev = spEntityFunction->OpenConfig(Config_Run, spConfig); if (eErrDev != Error_Succeed) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(", open cfg file failed!"); return false; } m_CardCaptured = num; if (num >= m_maxRetainCount) LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_RETAIN_BIN_IS_FULL, ", 回收箱满了,请及时清理!"); if (spConfig->WriteConfigValueInt("RunInfo", "CardCaptured", num) == Error_Succeed && spConfig->WriteConfigValueInt("all", "CardCaptured", num) == Error_Succeed) { if (bClear && !m_bSettingMaterial) { bool bMaintain[12]; memset(bMaintain, 0, 12); SyncDataToDB(bMaintain); } return true; } else return false; } bool CCardIssuerFSM::SetCardIssued(const int num, const int hopper) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(", num :%d, hopper: %d, m_bSettingMaterial:%d", num, hopper, m_bSettingMaterial); CSmartPointer spEntityFunction = GetEntityBase()->GetFunction(); CSmartPointer spConfig; ErrorCodeEnum eErrDev = spEntityFunction->OpenConfig(Config_Run, spConfig); if (eErrDev != Error_Succeed) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(", open cfg file failed!"); return false; } char buf[8]; memset(buf, 0, 8); _itoa(hopper, (char*)buf, 10); CSimpleStringA section(buf); eErrDev = spConfig->WriteConfigValueInt(section, "CardIssued", num); if (eErrDev == Error_Succeed) { if (section.Compare("1") == 0) spConfig->WriteConfigValueInt("RunInfo", "CardIssued", num); //oilyang 回写新section if (hopper == 1) { int xNum = 0; spConfig->ReadConfigValueInt("all", "HopperNum", xNum); DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)(", xNum:%d", xNum); if (xNum == 0) spConfig->WriteConfigValueInt("all", "HopperNum", 1); } //oilyang@20170428 汪磊东要求单卡箱也要同步数据 //if (m_hopperNum != 1 && !m_bSettingMaterial) if (!m_bSettingMaterial) { bool bMaintain[12]; memset(bMaintain, 0, 12); SyncDataToDB(bMaintain,false); } return true; } else { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(", write CardIssued err:%d", eErrDev); return false; } } bool CCardIssuerFSM::SetCardRemains(const int num, const int hopper,bool bInit) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(", num:%d,, hopper:%d, bInit:%d, m_currentHopper:%d, m_bSettingMaterial:%d", num, hopper, bInit, m_currentHopper, m_bSettingMaterial); if (num == 0) { switch (hopper) { case 1: LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_NoCardRemains_Hopper1, "Hopper 1 No card remains."); break; case 2: LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_NoCardRemains_Hopper2, "Hopper 2 No card remains."); break; case 3: LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_NoCardRemains_Hopper3, "Hopper 3 No card remains."); break; case 4: LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_NoCardRemains_Hopper4, "Hopper 4 No card remains."); break; case 5: LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_NoCardRemains_Hopper5, "Hopper 5 No card remains."); break; case 6: LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_NoCardRemains_Hopper6, "Hopper 6 No card remains."); break; default: break; } } CSmartPointer spEntityFunction = GetEntityBase()->GetFunction(); CSmartPointer spConfig; ErrorCodeEnum eErrDev = spEntityFunction->OpenConfig(Config_Run, spConfig); if (eErrDev != Error_Succeed) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(", open cfg file failed!"); return false; } char buf[8]; memset(buf, 0, 8); _itoa(hopper, (char*)buf, 10); CSimpleStringA section(buf); eErrDev = spConfig->WriteConfigValueInt(section, "CardRemains", num); if (eErrDev == Error_Succeed) { if (bInit) { if (section.Compare("1") == 0) spConfig->WriteConfigValueInt("RunInfo", "CardInit", num); eErrDev = spConfig->WriteConfigValueInt(section, "CardInit", num); } if (section.Compare("1") == 0) spConfig->WriteConfigValueInt("RunInfo", "CardRemains", num); if (eErrDev != Error_Succeed) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(", write CardInit err:%d", eErrDev); return false; } //oilyang@20170428 汪磊东要求单卡箱也要同步数据 //if (m_hopperNum != 1 && !m_bSettingMaterial) if (!m_bSettingMaterial) { bool bMaintain[12]; memset(bMaintain, 0, 12); SyncDataToDB(bMaintain,false); } } else { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(", write CardRemains err:%d", eErrDev); return false; } return true; } bool CCardIssuerFSM::SetCardMixed(const int num, const int hopper) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(", num:%d, hopper:%d, m_bSettingMaterial:%d", num, hopper, m_bSettingMaterial); CSmartPointer spEntityFunction = GetEntityBase()->GetFunction(); CSmartPointer spConfig; ErrorCodeEnum eErrDev = spEntityFunction->OpenConfig(Config_Run, spConfig); if (eErrDev != Error_Succeed) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(", open cfg file failed!"); return false; } if (hopper < 1 || hopper > HOPPER_NUM) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("wrong hopper num:%d .", hopper)); return false; } if (num == 0) SetDevStateAndSendMsg(DEVICE_STATUS_NORMAL); else { CSimpleStringA errMsg = CSimpleStringA::Format("the current card hopper %d may be wrong.mixedEx:%d", hopper, m_mixedEx[hopper - 1]); DWORD dwTmpErrCode = CardIssuer_UserErrorCode_Hopper1_Mixed_Too_Much; if (hopper == 2) dwTmpErrCode = CardIssuer_UserErrorCode_Hopper2_Mixed_Too_Much; else if (hopper == 3) dwTmpErrCode = CardIssuer_UserErrorCode_Hopper3_Mixed_Too_Much; LogWarn(Severity_Middle, Error_Unexpect, dwTmpErrCode, errMsg.GetData()); } char buf[8]; memset(buf, 0, 8); _itoa(hopper, (char*)buf, 10); CSimpleStringA section(buf); eErrDev = spConfig->WriteConfigValueInt(section, "CardMixed", num); if (section.Compare("1") == 0) spConfig->WriteConfigValueInt("RunInfo", "CardMixed", num); if (eErrDev != Error_Succeed) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(", write CardMixed err:%d", eErrDev); return false; } //oilyang@20170428 汪磊东要求单卡箱也要同步数据 //if (m_hopperNum != 1 && !m_bSettingMaterial) if (!m_bSettingMaterial) { bool bMaintain[12]; memset(bMaintain, 0, 12); SyncDataToDB(bMaintain,false); } return true; } ErrorCodeEnum CCardIssuerFSM::MachineMoveCardBackNotHold() { LOG_FUNCTION(); long l_beginTime = GetTickCountRVC(); ErrorCodeEnum eMoveNotHold = m_hDevHelper->MoveCard(CI_MOVECARD_BACK_NOT_HOLD); long l_endTime = GetTickCountRVC(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::MoveCard").setCostTime(l_endTime - l_beginTime)("MachineMoveCardBackNotHold::MoveCard"); //2016-11-10 14:30:54 joseph if (eMoveNotHold != Error_Succeed) { SetErrPackage("MachineMoveCardBackNotHold::MoveCard(CI_MOVECARD_BACK_NOT_HOLD)", m_csDevSN, eMoveNotHold, MEC_DEVAPI_CARDISSUER_CI_MOVECARD_BACK_NOT_HOLD); AlarmDEC(); return eMoveNotHold; } return eMoveNotHold; } ErrorCodeEnum CCardIssuerFSM::MachineMoveCardFrontGate(bool bInBussiness) { LOG_FUNCTION(); long l_beginTime = GetTickCountRVC(); ErrorCodeEnum eMoveFrontGate = m_hDevHelper->MoveCard(CI_MOVECARD_FRONT_GATE); long l_endTime = GetTickCountRVC(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::MoveCard").setCostTime(l_endTime - l_beginTime)("MachineMoveCardFrontGate::MoveCard"); if (eMoveFrontGate != Error_Succeed){ if (m_bCardFromHopper) { SetErrPackage("MachineMoveCardFrontGate::MoveCard(CI_MOVECARD_FRONT_GATE)", m_csDevSN, eMoveFrontGate, MEC_DEVAPI_CARDISSUER_CI_MOVECARD_FRONT_GATE); if (bInBussiness) { DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode("QLR040220305").setResultCode("RTA2308")("发卡,卡片吐出失败,请联系厂商检查卡嘴是否没对齐或是否有塞卡"); } else { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040220305").setResultCode("RTA2308")("发卡,卡片吐出失败,请联系厂商检查卡嘴是否没对齐或是否有塞卡"); } } else { SetErrPackage("MachineMoveCardFrontGate::MoveCard(CI_MOVECARD_FRONT_GATE)", m_csDevSN, eMoveFrontGate, CardIssuer_UserErrorCode_MoveCardToGate_Failed); if (bInBussiness) { DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode("QLR040220305").setResultCode("RTA2301")("前端进卡,卡片吐出失败,请确认卡片是否平整"); } else { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040220305").setResultCode("RTA2301")("前端进卡,卡片吐出失败,请确认卡片是否平整"); } } AlarmDEC(bInBussiness); } return eMoveFrontGate; } int CCardIssuerFSM::QueryCardInfo() { int ret; if (m_hDevHelper == nullptr) ret = 1; else{ if(GetDevStatus()) ret = (m_devStatus.eMedia == CI_MEDIA_PRESENT) ? 2 : 0; else ret = 1; } DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("QueryCardInfo, ret:%d", ret); return ret; } int CCardIssuerFSM::SetDevStateAndSendMsg(const DevStateEnum eState, bool bForceSend) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SetDevStateAndSendMsg, m_eDevState:%d, eState:%d, bForceSend:%d", m_eDevState, eState, bForceSend); if(m_eDevState != eState || bForceSend) { SCIConnect evt; evt.status = m_eDevState = eState; SpSendBroadcast(m_pEntity->GetFunction(), SP_MSG_OF(SCIConnect), SP_MSG_SIG_OF(SCIConnect), evt); } return 0; } static char DecCh2HexCh(BYTE c) { if (c >= 0x0 && c <= 0x9) return c + '0'; else if (c >= 0xa && c <= 0xf) return c + 'a' - 10; else return 0; } int CCardIssuerFSM::UpdateLocalRunCfg(CAutoArray hopperArr) { LOG_FUNCTION(); CSmartPointer spEntityFunction = GetEntityBase()->GetFunction(); CSmartPointer spConfig; ErrorCodeEnum eErrDev = spEntityFunction->OpenConfig(Config_Run, spConfig); if (eErrDev != Error_Succeed) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("(UpdateLocalRunCfg)open cfg file failed!"); return false; } char sec[2]; for (int i = 0; i < hopperArr.GetCount(); ++i) { ZeroMemory(sec, 2); _itoa(i + 1, (char*)sec, 10); if (hopperArr[i] == 1) { spConfig->WriteConfigValue(sec, "CardBoxNo", m_CardBoxNoEx[i]); spConfig->WriteConfigValue(sec, "PsbCode", m_PsbCodeEx[i]); spConfig->WriteConfigValue(sec, "PsbName", m_PsbNameEx[i]); spConfig->WriteConfigValueInt(sec, "CardInit", m_CardInitEx[i]); spConfig->WriteConfigValueInt(sec, "CardRemains", m_remainsEx[i]); spConfig->WriteConfigValueInt(sec, "CardIssued", m_issuedEx[i]); spConfig->WriteConfigValueInt(sec, "CardMixed", m_mixedEx[i]); spConfig->WriteConfigValueInt(sec, "CardPercent", m_CardPercentEx[i]); spConfig->WriteConfigValue(sec, "Maintainer", m_MaintainerEx[i]); spConfig->WriteConfigValue(sec, "MaintainTime", m_csMaintainTimeEx[i]); if (i == 0 && hopperArr[0] == 1) { spConfig->WriteConfigValueInt("RunInfo", "CardInit", m_CardInitEx[i]); spConfig->WriteConfigValueInt("RunInfo", "CardRemains", m_remainsEx[i]); spConfig->WriteConfigValueInt("RunInfo", "CardIssued", m_issuedEx[i]); spConfig->WriteConfigValueInt("RunInfo", "CardMixed", m_mixedEx[i]); spConfig->WriteConfigValueInt("RunInfo", "CardPercent", m_CardPercentEx[i]); } DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("UpdateLocalRunCfg, sec:%s,CardBoxNo:%s,CardInit:%d,CardRemains:%d,CardIssued:%d", sec, m_CardBoxNoEx[i].GetData(), m_CardInitEx[i], m_remainsEx[i], m_issuedEx[i]); } } return 0; } int CCardIssuerFSM::SyncDataToDB(bool bMaintain[12], bool bSetCaptured) { LOG_FUNCTION(); //GUIConsoleService_ClientBase* pGuiConsoleClient = NULL; //pGuiConsoleClient = new GUIConsoleService_ClientBase((GetEntityBase())); //ErrorCodeEnum eConn = Error_Unexpect; //if (pGuiConsoleClient != NULL) //{ // eConn = pGuiConsoleClient->Connect(); // if (eConn != Error_Succeed) { // DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(", Connect to GUIConsole failed:%d", eConn); // pGuiConsoleClient->SafeDelete(); // } //} //else // DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(", create a guiconsole pointer failed."); //if (eConn != Error_Succeed) //{ // DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("SyncDataToDB can't connect to GUIConsole."); // pGuiConsoleClient = NULL; // return -1; //} SyncMaterialCountInfo info = {}; info.dwCardBoxNum = m_hopperNum; DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s",(const char*)m_csMachineType); info.strDeviceNo = m_terminalNo; DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(", to init sync info, CardBox Num:%d, m_csDevSN:%s", info.dwCardBoxNum, info.strDeviceNo.GetData()); info.arrMaintainFlag.Init(m_hopperNum+1); info.arrMaintainer.Init(m_hopperNum+1); info.arrMaintainTime.Init(m_hopperNum+1); info.arrCardBoxNo.Init(m_hopperNum+1); info.arrPsbCode.Init(m_hopperNum+1); info.arrPsbName.Init(m_hopperNum+1); info.arrCardInit.Init(m_hopperNum+1); info.arrCardRemains.Init(m_hopperNum+1); info.arrCardIssued.Init(m_hopperNum+1); info.arrCardMixed.Init(m_hopperNum+1); info.arrCardPercent.Init(m_hopperNum+1); for (int i = 0; i < m_hopperNum; ++i) { //[17:36 : 30.353][DEBUG] Debug: {0, SP01010101, 0, NX00000002, 47N2, IC金卡2, 100, 10, 1, 0, 10} info.arrMaintainFlag[i] = bMaintain[i]; info.arrMaintainer[i] = m_MaintainerEx[i]; info.arrMaintainTime[i] = m_MaintainTimeEx[i]; info.arrCardBoxNo[i] = m_CardBoxNoEx[i]; info.arrPsbCode[i] = m_PsbCodeEx[i]; info.arrPsbName[i] = m_PsbNameEx[i]; info.arrCardInit[i] = m_CardInitEx[i]; info.arrCardRemains[i] = m_remainsEx[i]; info.arrCardIssued[i] = m_issuedEx[i]; info.arrCardMixed[i] = m_mixedEx[i]; info.arrCardPercent[i] = m_CardPercentEx[i]; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("hopper(%d), Maintain:%d, MaintainerEx:%s, MaintainTimeEx:%d, CardBoxNoEx:%s, PsbCodeEx:%s, PsbNameEx:%s, CardInitEx:%d, RemainsEx:%d, IssuedEx:%d, MixedEx:%d, CardPercentEx:%d", i, bMaintain[i], m_MaintainerEx[i].GetData(), m_MaintainTimeEx[i], m_CardBoxNoEx[i].GetData(), m_PsbCodeEx[i].GetData(), m_PsbNameEx[i].GetData(), m_CardInitEx[i], m_remainsEx[i], m_issuedEx[i], m_mixedEx[i], m_CardPercentEx[i]); } { if (bSetCaptured) { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)(", bSetCaptured:%d", bSetCaptured); info.arrMaintainFlag[m_hopperNum] = 1; } else info.arrMaintainFlag[m_hopperNum] = 0; info.arrCardRemains[m_hopperNum] = m_CardCaptured; info.arrMaintainer[m_hopperNum] = m_MaintainerEx[0]; info.arrMaintainTime[m_hopperNum] = m_MaintainTimeEx[0]; info.arrCardBoxNo[m_hopperNum] = ""; info.arrPsbCode[m_hopperNum] = ""; info.arrPsbName[m_hopperNum] = ""; info.arrCardInit[m_hopperNum] = 0; info.arrCardIssued[m_hopperNum] = 0; info.arrCardMixed[m_hopperNum] = 0; info.arrCardPercent[m_hopperNum] = 0; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("MaintainFlag:%d, CardRemains:%d, Maintainer:%s, MaintainTime:%d", info.arrMaintainFlag[m_hopperNum], info.arrCardRemains[m_hopperNum], info.arrMaintainer[m_hopperNum].GetData(), info.arrMaintainTime[m_hopperNum]); } //if (pGuiConsoleClient != NULL) //{ // eConn = pGuiConsoleClient->SyncMaterialCount(info); // pGuiConsoleClient->GetFunction()->CloseSession(); // pGuiConsoleClient = NULL; // // if (eConn != Error_Succeed){ // CSimpleStringA errMsg = CSimpleStringA::Format(", SyncMaterialCount returned with errCode:%d", eConn); // LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_SyncMaterialCount_Failed, errMsg.GetData()); // return -2; // } //} //else //{ // DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("pGuiConsoleClient is null? unexpect error."); // return -3; //} //修改为起线程同步物料计数 //判断物料url地址是否存在 if (m_csSyncMaterialUrl.IsNullOrEmpty()) { LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_SyncMaterialCount_Failed, ", SyncMaterialUrl is empty"); return -1; } SyncMaterialCountTask* task = new SyncMaterialCountTask(this, info); ErrorCodeEnum err = GetEntityBase()->GetFunction()->PostThreadPoolTask(task); if (err != Error_Succeed) { CSimpleStringA errMsg = CSimpleStringA::Format(", create SyncMaterialCountTask thread fail. %d", (int)err); LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_SyncMaterialCount_Failed, errMsg.GetData()); return -2; } return 0; } void CCardIssuerFSM::SetHopperNum(int hopperNum) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("SetHopperNum, hopperNum:%d", hopperNum)); m_hopperNum = hopperNum; } void CCardIssuerFSM::DoExitWhenIdle() { ErrorCodeEnum eErr; CSimpleStringA errMsg(true); long l_beginTime, l_endTime; l_beginTime = GetTickCountRVC(); eErr = m_hDevHelper->GetDevStatus(m_devStatus); l_endTime = GetTickCountRVC(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetDevStatus").setCostTime(l_endTime - l_beginTime)("DoExitWhenIdle::GetDevStatus"); if (eErr == Error_Succeed) { if (m_devStatus.eMedia == CI_MEDIA_PRESENT || m_devStatus.eMedia == CI_MEDIA_ENTERING) { JustReadCardNo(); m_captureReason = "4001"; errMsg = CSimpleStringA::Format("DoExitWhenIdle, has card in machine, to capture card, CardNo:%s****%s", m_currCardNo.SubString(0, 6).GetData(), m_currCardNo.SubString(m_currCardNo.GetLength()-4, 4).GetData()); LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_CaptureCard_IdleExit, errMsg.GetData()); eErr = MachineMoveCardBackNotHold(); if (eErr == Error_Succeed) { bool bCaptured = ToRegistCaptureCardInfo(); m_CardCaptured++; bool bSetCapture = SetCardCaptured(m_CardCaptured); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("DoExitWhenIdle, to capture card. result:%d, m_CardCaptured:%d, bSetCapture:%d", bCaptured, m_CardCaptured, bSetCapture)); } } } } bool CCardIssuerFSM::JustReadCardNo() { ErrorCodeEnum eErr = Error_Unexpect; long l_beginTime, l_endTime; m_currCardNo = ""; bool bHasAccount = false; int activeCardType; bool bIC = m_pCardProcess->DetectIfICCard(CARD_MACHINE_ISSUER, m_hDevHelper, activeCardType); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("DetectIfICCard, bIC:%d, activeCardType:%d", bIC, activeCardType)); if (bIC) { //oilyang@20201014 add emv support int bGetICData = m_pCardProcess->GetICDataFromCard(CARD_MACHINE_ISSUER, m_hDevHelper, m_aidList); if(bGetICData != 0) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(CSimpleStringA::Format(" faile(%d)", bGetICData)); } ICData track2(false, 0x57, 0x00); string t2ICAccount(""), t2ICCardSerial(""), t2ICCVC(""), t2ICTrack2(""), cardType; if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC, track2, false, 0) == -1) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("JustReadCardNo::FindTagValue, can't find track2 in ic data"); } else { int pos = FindHexCharPosition(track2.value, 0x0d, track2.lenth); char *pICTrack2 = new char[128]; ZeroMemory(pICTrack2, 128); HexBuf2StrBuf(track2.value, &pICTrack2, track2.lenth); pICTrack2[37] = '\0'; char *ddd = new char[128]; memset(ddd, 0, 128); memcpy(ddd, pICTrack2, pos - 1); m_currCardNo = ddd; if (m_currCardNo.GetLength() > 1) bHasAccount = true; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format(", FindHexCharPosition, pos:%d, track2.lenth:%d, m_currCardNo.Len:%d", pos, track2.lenth, m_currCardNo.GetLength())); delete[]ddd; delete[]pICTrack2; } l_beginTime = GetTickCountRVC(); eErr = m_hDevHelper->DeactivateICCard(); l_endTime = GetTickCountRVC(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DeactivateICCard").setCostTime(l_endTime - l_beginTime)("JustReadCardNo::DeactivateICCard"); if (eErr != Error_Succeed){ SetErrPackage("JustReadCardNo::DeactivateICCard", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_DeactivateICCard); AlarmDEC(); } l_beginTime = GetTickCountRVC(); eErr = m_hDevHelper->ReleaseIC(); l_endTime = GetTickCountRVC(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ReleaseIC").setCostTime(l_endTime - l_beginTime)("JustReadCardNo::ReleaseIC"); if (eErr != Error_Succeed){ SetErrPackage("JustReadCardNo::ReleaseIC", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_ReleaseIC); AlarmDEC(); } } if (!bHasAccount) { MagTracks magTracks; memset(magTracks.track[0].data, 0, sizeof(magTracks.track[0].data)); memset(magTracks.track[1].data, 0, sizeof(magTracks.track[1].data)); memset(magTracks.track[2].data, 0, sizeof(magTracks.track[2].data)); l_beginTime = GetTickCountRVC(); eErr = m_hDevHelper->MagRead(magTracks); l_endTime = GetTickCountRVC(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::MagRead").setCostTime(l_endTime - l_beginTime)("JustReadCardNo::MagRead"); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("MagRead JustReadCardNo, track[1].eStatus:%d, track[2].sStatus:%d, t2.dwSize:%d, t3.dwSize:%d, t2Len:%d, t3Len:%d", magTracks.track[1].eStatus, magTracks.track[2].eStatus, magTracks.track[1].dwSize, magTracks.track[2].dwSize, strlen((const char*)magTracks.track[1].data), strlen((const char*)magTracks.track[2].data)); if (eErr == Error_Succeed) { if (magTracks.track[1].eStatus == CI_DATA_OK) { int pos = 0; for (int i = 0; i < magTracks.track[1].dwSize; ++i, ++pos) { if (magTracks.track[1].data[i] == 0x3d || magTracks.track[1].data[i] == 0x3e || magTracks.track[1].data[i] == 0x44) //fixpoint (=或>)? 运通卡考虑 = 和 D break; } char buf[128]; ZeroMemory(buf, 128); strncpy(buf, (char*)magTracks.track[1].data, pos); m_currCardNo = buf; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format(", split pos:%d, m_currCardNo.Len:%d", pos, m_currCardNo.GetLength())); if (m_currCardNo.GetLength() > 1) bHasAccount = true; } } else { SetErrPackage("JustReadCardNo::MagRead", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_MagRead); AlarmDEC(); } } if (m_currCardNo.GetLength() > 8) DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("JustReadCardNo, record the account (%d):%s****%s", m_currCardNo.GetLength(), m_currCardNo.SubString(0, 6).GetData(), m_currCardNo.SubString(m_currCardNo.GetLength() - 4, 4).GetData())); else{ CSimpleStringA errMsg = CSimpleStringA::Format("JustReadCardNo, AccountNo maybe wrong:%s(len:%d)", m_currCardNo.GetData(), m_currCardNo.GetLength()); LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_CardNo_Maybe_Wrong, errMsg.GetData()); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(errMsg.GetData()); } return true; } bool CCardIssuerFSM::RegistCardWhileCaptureCard(CSimpleStringA cardno) { CSmallDateTime currTime; CSimpleStringA csCurrTime = currTime.GetNow().ToTimeString(); CAutoArray arrTime; arrTime = csCurrTime.Split(' '); CSimpleStringA csDate, csTime; csDate = arrTime[0].SubString(0, 4) + arrTime[0].SubString(5, 2) + arrTime[0].SubString(8, 2); csTime = arrTime[1].SubString(0, 2) + arrTime[1].SubString(3, 2) + arrTime[1].SubString(6, 2); IHttpFunc* client; client = create_http(HttpsLogCallBack); CRegistSwallowCardReq qRegistCardReq; CRegistSwallowCardRet qRegistCardRet; qRegistCardReq.m_timeOut = 15;//15 second qRegistCardReq.m_url = m_csSwallowCardUrl.GetData(); qRegistCardReq.cardNo = cardno; if (IsValidCardNo(cardno.GetData(), cardno.GetLength())) { if (cardno.GetLength() > 0) qRegistCardReq.reasonCode = m_captureReason; else qRegistCardReq.reasonCode = "0000"; } else qRegistCardReq.reasonCode = "0001"; qRegistCardReq.swallowDate = csDate; qRegistCardReq.swallowTime = csTime; qRegistCardReq.deviceSciNo = m_csDevSN; qRegistCardReq.terminalNo = m_terminalNo; qRegistCardReq.terminalType = m_csMachineType; //qRegistCardReq.m_url = "http://55.13.170.50:8080/defa-gateway/dee1/EacQuery/queryByEac"; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("RegistCardWhileCaptureCard")(", 吞卡登记开始, SwallowDate:%s, SwallowTime:%s, cardNoLen:%d, m_currCardNo:%s****%s, m_captureReason:%s", csDate.GetData(), csTime.GetData(), cardno.GetLength(), cardno.SubString(0, 6).GetData(), cardno.SubString(cardno.GetLength() - 4, 4).GetData(), m_captureReason.GetData()); long beg = GetTickCountRVC(); bool ret = client->Post(qRegistCardReq, qRegistCardRet); long end = GetTickCountRVC(); if (ret) { bool bParse = qRegistCardRet.Parse(qRegistCardRet.m_resultData.c_str()); if (bParse) { if (qRegistCardRet.returnInfo.returnCode.compare("SUC0000") != 0) DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220304").setResultCode("RTA2341")("登记吞卡信息到后台失败:%s,%s" , qRegistCardRet.returnInfo.returnCode.c_str(), qRegistCardRet.returnInfo.errorMsg.c_str()); else DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040220304")("吞卡登记成功"); } else DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220304")("解析返回报文qRegistCardRet失败"); } else { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220304").setResultCode("RTA2340")("访问吞卡登记失败"); } client->Destory(); return true; } bool CCardIssuerFSM::SyncMaterialCount(IHttpFunc* client,SyncMaterialCountInfo syncInfo) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("SyncMaterialCount")(", 同步物料计数开始, DeviceNo = %s, CardBoxNum = %d", syncInfo.strDeviceNo, syncInfo.dwCardBoxNum); if (syncInfo.strDeviceNo == NULL || strlen(syncInfo.strDeviceNo) == 0) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("SyncMaterialCount")(", param [DeviceNo] invalid"); return false; } if (syncInfo.dwCardBoxNum <= 0) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("SyncMaterialCount")(", param [CardBoxNum] invalid"); return false; } if (m_csSyncMaterialUrl.GetLength() == 0) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("SyncMaterialCount")(", m_csSyncMaterialUrl is null"); return false; } CSystemStaticInfo info; m_pEntity->GetFunction()->GetSystemStaticInfo(info); SyncMaterialCountHTTPReq qTempReq; SyncMaterialCountHTTPRet qTempRet; qTempReq.m_url = m_csSyncMaterialUrl.GetData(); qTempReq.m_headers.emplace(std::make_pair("Content-Type", "application/json")); SyncMaterialCountReq1& req1 = qTempReq.reqInfo; #ifdef RVC_OS_WIN strncpy_s(req1.TerminalNo, sizeof(req1.TerminalNo), info.strTerminalID, _TRUNCATE); strncpy_s(req1.DeviceNo, sizeof(req1.DeviceNo), syncInfo.strDeviceNo, _TRUNCATE); strncpy_s(req1.Material, sizeof(req1.Material), "DebitCard", _TRUNCATE); #else strncpy(req1.TerminalNo, info.strTerminalID, sizeof(req1.TerminalNo)); strncpy(req1.DeviceNo, syncInfo.strDeviceNo, sizeof(req1.DeviceNo)); strncpy(req1.Material, "DebitCard", sizeof(req1.Material)); #endif //RVC_OS_WIN req1.CardBoxNum = syncInfo.dwCardBoxNum; for (int i = 0; i <= syncInfo.dwCardBoxNum; i++) { SyncMaterialCountReq2 pReq2; memset(&pReq2, 0, sizeof(SyncMaterialCountReq2)); pReq2.bMaintain = syncInfo.arrMaintainFlag[i]; if (syncInfo.arrMaintainFlag[i]) { #ifdef RVC_OS_WIN strncpy_s(pReq2.Maintainer, sizeof(pReq2.Maintainer), syncInfo.arrMaintainer[i], _TRUNCATE); #else strncpy(pReq2.Maintainer, syncInfo.arrMaintainer[i], sizeof(pReq2.Maintainer)); #endif //RVC_OS_WIN pReq2.MaintainTime = syncInfo.arrMaintainTime[i]; } #ifdef RVC_OS_WIN strncpy_s(pReq2.CardBoxNo, sizeof(pReq2.CardBoxNo), syncInfo.arrCardBoxNo[i], _TRUNCATE); strncpy_s(pReq2.PsbCode, sizeof(pReq2.PsbCode), syncInfo.arrPsbCode[i], _TRUNCATE); strncpy_s(pReq2.PsbName, sizeof(pReq2.PsbName), syncInfo.arrPsbName[i], _TRUNCATE); #else strncpy(pReq2.CardBoxNo, syncInfo.arrCardBoxNo[i], sizeof(pReq2.CardBoxNo)); strncpy(pReq2.PsbCode, syncInfo.arrPsbCode[i], sizeof(pReq2.PsbCode)); strncpy(pReq2.PsbName, syncInfo.arrPsbName[i], sizeof(pReq2.PsbName)); #endif //RVC_OS_WIN pReq2.CardInit = syncInfo.arrCardInit[i]; pReq2.CardRemains = syncInfo.arrCardRemains[i]; pReq2.CardIssued = syncInfo.arrCardIssued[i]; pReq2.CardMixed = syncInfo.arrCardMixed[i]; pReq2.CardPercent = syncInfo.arrCardPercent[i]; qTempReq.reqData.push_back(pReq2); } if (!client->Post(qTempReq, qTempRet)) { LogWarn(Severity_Middle, Error_Exception, CardIssuer_UserErrorCode_SyncMaterialCount_Failed, CSimpleStringA::Format(", http req fail,url=%s, err=%s", qTempReq.m_url.c_str(), qTempRet.m_errMsg.c_str()).GetData()); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402203Z02").setResultCode("RTA2330")("同步物料计数通讯失败"); return false;//通讯失败 } Json::Reader reader; Json::Value rootRet; if (!reader.parse(qTempRet.m_retStr, rootRet, false)) { LogWarn(Severity_Middle, Error_Exception, CardIssuer_UserErrorCode_SyncMaterialCount_Failed, CSimpleStringA::Format(", parse resp is fail, url=%s", qTempReq.m_url.c_str()).GetData()); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402203Z02").setResultCode("RTA2331")("同步物料计数解析返回报文失败"); return false;//解析失败 } if (rootRet["success"].isBool()) { bool isSucc = rootRet["success"].asBool(); if (isSucc){ //成功 DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("SyncMaterialCount")(", succ"); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402203Z02")("同步物料计数成功"); return true; } else { //失败 LogWarn(Severity_Middle, Error_Exception, CardIssuer_UserErrorCode_SyncMaterialCount_Failed, CSimpleStringA::Format(", is error, url=%s", qTempReq.m_url.c_str()).GetData()); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402203Z02").setResultCode("RTA2332")("同步物料计数失败"); return false; } } else { //参数不符合 LogWarn(Severity_Middle, Error_Exception, CardIssuer_UserErrorCode_SyncMaterialCount_Failed, CSimpleStringA::Format(", resp param is error, url=%s", qTempReq.m_url.c_str()).GetData()); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402203Z02").setResultCode("RTA2333")("同步物料计数返回参数不对"); return false; } } bool CCardIssuerFSM::IsValidCardNo(const char *pCardNo,int len) { //oilyang@20170207 卡号长度有限 len = (len > 32) ? 32 : len; for (int i = 0; i < len; ++i) { if (pCardNo[i] < 0x30 || pCardNo[i] > 0x39) { //not '0'-'9' DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(", CardNo is Invalid with illegal charactor:%c", pCardNo[i]); return false; } } return true; } int CCardIssuerFSM::SAMICCommand(SpReqAnsContext::Pointer ctx) { ErrorCodeEnum eErr = Error_Unexpect; long l_beginTime, l_endTime; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("", ctx->Req.cmdType)); switch (ctx->Req.cmdType) { case SAMICCommand_SAM_Select: l_beginTime = GetTickCountRVC(); eErr = m_hDevHelper->SAMSelect(ctx->Req.param1[0]); l_endTime = GetTickCountRVC(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SAMSelect").setCostTime(l_endTime - l_beginTime)("SAMICCommand::SAMSelect, req.param1:%d", ctx->Req.param1[0]); if(eErr) { SetErrPackage("SAMICCommand::SAMSelect", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_SAMSelect); AlarmDEC(); } break; case SAMICCommand_SAM_Active: l_beginTime = GetTickCountRVC(); eErr = m_hDevHelper->SAMActive(ctx->Req.param1[0]); l_endTime = GetTickCountRVC(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SAMActive").setCostTime(l_endTime - l_beginTime)("SAMICCommand::SAMActive, req.param1:%d", ctx->Req.param1[0]); if(eErr) { SetErrPackage("SAMICCommand::SAMActive", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_SAMActive); AlarmDEC(); } break; case SAMICCommand_SAM_Deactivate: l_beginTime = GetTickCountRVC(); eErr = m_hDevHelper->SAMDeactivate(); l_endTime = GetTickCountRVC(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SAMDeactivate").setCostTime(l_endTime - l_beginTime)("SAMICCommand::SAMDeactivate"); if(eErr) { SetErrPackage("SAMICCommand::SAMDeactivate", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_SAMDeactivate); AlarmDEC(); } break; case SAMICCommand_SAM_WarmReset: l_beginTime = GetTickCountRVC(); eErr = m_hDevHelper->SAMWarmReset(); l_endTime = GetTickCountRVC(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SAMWarmReset").setCostTime(l_endTime - l_beginTime)("SAMICCommand::SAMWarmReset"); if(eErr) { SetErrPackage("SAMICCommand::SAMWarmReset", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_SAMWarmReset); AlarmDEC(); } break; case SAMICCommand_SAM_QueryStatus: { SAMStatus samStatus; l_beginTime = GetTickCountRVC(); eErr = m_hDevHelper->SAMQueryStatus(samStatus); l_endTime = GetTickCountRVC(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SAMQueryStatus").setCostTime(l_endTime - l_beginTime)("SAMICCommand::SAMQueryStatus"); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SAMWarmReset isActive:%d, chosenOfSAM:%d", samStatus.isActive, samStatus.chosenOfSAM); if (eErr == Error_Succeed) { ctx->Ans.ret1.Init(2); ctx->Ans.ret1[0] = samStatus.isActive; ctx->Ans.ret1[1] = samStatus.chosenOfSAM; } else { SetErrPackage("SAMICCommand::SAMQueryStatus", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_SAMQueryStatus); AlarmDEC(); } } break; case SAMICCommand_SAM_Command: { CmdInfo sendBuf, recvBuf; BYTE *pTmp = new BYTE[MAX_IC_BUFFER_SIZE]; ZeroMemory(pTmp, MAX_IC_BUFFER_SIZE); int size = StrBuf2HexBuf(ctx->Req.param2[0], &pTmp); memcpy(sendBuf.data, pTmp, size); sendBuf.dwSize = size; l_beginTime = GetTickCountRVC(); eErr = m_hDevHelper->SAMCommand(sendBuf,recvBuf); l_endTime = GetTickCountRVC(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SAMCommand").setCostTime(l_endTime - l_beginTime)("SAMICCommand::SAMCommand"); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SAMCommand req.param2:%s, recvBuf.dwSize:%d", ctx->Req.param2[0].GetData(), recvBuf.dwSize); if (eErr == Error_Succeed) { char *pRet = new char[MAX_IC_BUFFER_SIZE]; ZeroMemory(pRet, MAX_IC_BUFFER_SIZE); //Dbg("%d",recvBuf.dwSize); HexBuf2StrBuf(recvBuf.data, (char**)&pRet, recvBuf.dwSize); ctx->Ans.ret1.Init(1); ctx->Ans.ret2.Init(1); ctx->Ans.ret1[0] = recvBuf.dwSize * 2; ctx->Ans.ret2[0] = pRet; delete[]pRet; } else { SetErrPackage("SAMICCommand::SAMCommand", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_SAMCommand); AlarmDEC(); } delete[]pTmp; } break; case SAMICCommand_IC_Active: { l_beginTime = GetTickCountRVC(); eErr = m_hDevHelper->ContactIC(); l_endTime = GetTickCountRVC(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ContactIC").setCostTime(l_endTime - l_beginTime)("SAMICCommand::ContactIC"); if (eErr == Error_Succeed) { CmdInfo atrBuf; l_beginTime =GetTickCountRVC(); eErr = m_hDevHelper->ActiveICCardATR(atrBuf); l_endTime =GetTickCountRVC(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ActiveICCardATR").setCostTime(l_endTime - l_beginTime)("SAMICCommand::ActiveICCardATR"); if (eErr == Error_Succeed) { BYTE* pTmp = new BYTE[MAX_IC_BUFFER_SIZE]; if (pTmp == NULL) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("new MAX_IC_BUFFER_SIZE failed"); eErr = Error_Unexpect; break; } ZeroMemory(pTmp, MAX_IC_BUFFER_SIZE); HexBuf2StrBuf(atrBuf.data, (char**)&pTmp, atrBuf.dwSize); ctx->Ans.ret1.Init(1); ctx->Ans.ret2.Init(1); ctx->Ans.ret1[0] = atrBuf.dwSize * 2; ctx->Ans.ret2[0] = CSimpleStringA((const char*)pTmp); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("AtrCtx: size=%d, content=%s, pTmp=%s", ctx->Ans.ret1[0], (LPCTSTR)ctx->Ans.ret2[0], (LPCTSTR)pTmp)); delete[] pTmp; pTmp = NULL; } else { SetErrPackage("SAMICCommand::ActiveICCardATR", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_ActiveICCardATR); AlarmDEC(); } } else { SetErrPackage("SAMICCommand::ContactIC", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_ContactIC); AlarmDEC(); } } break; case SAMICCommand_IC_Deactivate: eErr = m_hDevHelper->DeactivateICCard(); if (eErr != Error_Succeed){ l_beginTime = GetTickCountRVC(); eErr = m_hDevHelper->DeactivateICCard(); l_endTime = GetTickCountRVC(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DeactivateICCard").setCostTime(l_endTime - l_beginTime)("SAMICCommand::DeactivateICCard"); if(eErr != Error_Stoped) { SetErrPackage("SAMICCommand::DeactivateICCard", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_DeactivateICCard); AlarmDEC(); } } break; case SAMICCommand_IC_WarmReset: eErr = m_hDevHelper->WarmReset(); if (eErr != Error_Succeed) { SetErrPackage("SAMICCommand::WarmReset", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_WarmReset); AlarmDEC(); } break; case SAMICCommand_IC_Command: { CmdInfo sendBuf, recvBuf; BYTE *pTmp = new BYTE[MAX_IC_BUFFER_SIZE]; ZeroMemory(pTmp, MAX_IC_BUFFER_SIZE); int size = StrBuf2HexBuf(ctx->Req.param2[0], &pTmp); memcpy(sendBuf.data, pTmp, size); sendBuf.dwSize = size; l_beginTime = GetTickCountRVC(); eErr = m_hDevHelper->ICCommand(sendBuf, recvBuf); l_endTime = GetTickCountRVC(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ICCommand").setCostTime(l_endTime - l_beginTime)("SAMICCommand::ICCommand"); if(false)//oiltest@20201224 before deploy ,comment loging apdu content { char *pRet = new char[MAX_IC_BUFFER_SIZE]; if (pRet != NULL) { ZeroMemory(pRet, MAX_IC_BUFFER_SIZE); HexBuf2StrBuf(sendBuf.data, (char**)&pRet, size); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("ICCommand send data, %s", (const char*)pRet)); delete[] pRet; } } if (eErr == Error_Succeed) { if (recvBuf.dwSize > 0 && recvBuf.dwSize < 1024) { char* pRet = new char[MAX_IC_BUFFER_SIZE]; ZeroMemory(pRet, MAX_IC_BUFFER_SIZE); DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("ICCommand, recvBuf.dwSize:%d", recvBuf.dwSize); HexBuf2StrBuf(recvBuf.data, (char**)&pRet, recvBuf.dwSize); ctx->Ans.ret1.Init(1); ctx->Ans.ret2.Init(1); ctx->Ans.ret1[0] = recvBuf.dwSize * 2; ctx->Ans.ret2[0] = pRet; if (false)//oiltest before deploy ,comment loging apdu content { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("ICCommand, recvBuf.data:%s", pRet); } delete[]pRet; } } else { SetErrPackage("SAMICCommand::ICCommand", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_ICCommand); AlarmDEC(); //Dbg("ICCommand failed:%d", eErr); } delete[]pTmp; } break; case SAMICCommand_RFIC_Active: { char chType = 0; eErr = m_hDevHelper->ActiveContactlessICCard('A', 'B', 'M', chType); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ActiveContactlessICCard, chType:%d", chType); ctx->Ans.ret1.Init(1); if (eErr == Error_Succeed) { ctx->Ans.ret1[0] = chType; } else { SetErrPackage("SAMICCommand::ActiveContactlessICCard", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_ActiveContactlessICCard); AlarmDEC(); } } break; case SAMICCommand_RFIC_Deactivate: eErr = m_hDevHelper->DeactContactlessICCard(); if (eErr != Error_Succeed){ eErr = m_hDevHelper->DeactContactlessICCard(); if(eErr != Error_Succeed){ SetErrPackage("SAMICCommand::DeactContactlessICCard", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_DeactContactlessICCard); AlarmDEC(); } } break; case SAMICCommand_RFIC_Command: { CmdInfo sendBuf, recvBuf; BYTE* pTmp = new BYTE[MAX_IC_BUFFER_SIZE]; ZeroMemory(pTmp, MAX_IC_BUFFER_SIZE); int size = StrBuf2HexBuf(ctx->Req.param2[0], &pTmp); memcpy(sendBuf.data, pTmp, size); sendBuf.dwSize = size; eErr = m_hDevHelper->RFTypeABCommand(sendBuf, recvBuf); if (false)//oiltest@20201224 before deploy ,comment loging apdu content { char* pRet = new char[MAX_IC_BUFFER_SIZE]; if (pRet != NULL) { ZeroMemory(pRet, MAX_IC_BUFFER_SIZE); HexBuf2StrBuf(sendBuf.data, (char**)&pRet, size); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("RFTypeABCommand, return data:%s", (const char*)pRet); delete[] pRet; } } if (eErr == Error_Succeed) { if (recvBuf.dwSize > 0 && recvBuf.dwSize < 1024) { char* pRet = new char[MAX_IC_BUFFER_SIZE]; ZeroMemory(pRet, MAX_IC_BUFFER_SIZE); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("RFTypeABCommand, recvBuf.dwSize:%d", recvBuf.dwSize); HexBuf2StrBuf(recvBuf.data, (char**)&pRet, recvBuf.dwSize); ctx->Ans.ret1.Init(1); ctx->Ans.ret2.Init(1); ctx->Ans.ret1[0] = recvBuf.dwSize * 2; ctx->Ans.ret2[0] = pRet; delete[]pRet; } } else{ SetErrPackage("SAMICCommand::RFTypeABCommand", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_RFTypeABCommand); AlarmDEC(); } delete[]pTmp; } break; default: break; } ctx->Answer(eErr); return 0; } int CalcDelayFactor(int failedCount) { if ((failedCount % 7) == 0) { return 1; } else return 1 << (failedCount % 7); } void CCardIssuerFSM::GetVendorDllName(CSimpleStringA& strDevAdaptorPath) { auto pEntity = GET_DEV_ENTITY_BASE_POINTER(); pEntity->LoadVendorLibName(); FulfillAdapterInfoFrom(pEntity->vendorLibInfo); strDevAdaptorPath = m_adapterInfo.adapterFilePath; return; } bool CCardIssuerFSM::AccountExchange(const char *origAcc, CSimpleStringA &acc, int dir) { int len = strlen(origAcc); if (len < 8) { if (len > 4)//排除掉一些空格或者换行之类的干扰日志 DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(", account size error:%d", len); return false; } CSimpleStringA csTmp(' ',len+1); csTmp[len] = '\0'; if (dir) { int size, max; size = max = len / 4; if (len < 16) max = 4; for (int i = 0; i < max; i++) { csTmp[i * size] = *(origAcc + i); csTmp[i * size + 1] = *(origAcc + 4 + i); if (8 + i < len) csTmp[i * size + 2] = *(origAcc + 8 + i); if (12 + i < len) csTmp[i * size + 3] = *(origAcc + 12 + i); } if (len % 4 != 0) { for (int j = 4 * (len / 4); j < len; j++) csTmp[j] = *(origAcc + j); } acc = csTmp; } else { int size, max; size = max = len / 4; if (len < 16) max = 4; for (int i = 0; i < size; i++) { csTmp[i * 4] = *(origAcc + i); csTmp[i * 4 + 1] = *(origAcc + size + i); csTmp[i * 4 + 2] = *(origAcc + 2*size + i); csTmp[i * 4 + 3] = *(origAcc + 3*size + i); } if (len % 4 != 0) { for (int j = 4 * (len / 4); j < len; j++) csTmp[j] = *(origAcc + j); } acc = csTmp; } return true; } bool CCardIssuerFSM::WriteCardInfo(CSmartPointer &cfgRun, const char *acc, const char* serial, int slot, bool bClear, bool bHasCard) { char buf[8]; ZeroMemory(buf, 8); if (bClear || !bHasCard) { cfgRun->WriteConfigValue("OperateCardStore", _itoa(slot, buf, 10), "0,0,0"); return true; } CSimpleStringA csAcc(""); if (AccountExchange(acc, csAcc)) { CSimpleStringA tmp("1,"); csAcc = tmp + csAcc + "," + serial; cfgRun->WriteConfigValue("OperateCardStore", _itoa(slot, buf, 10), (const char*)csAcc); return true; } return false; } bool CCardIssuerFSM::ReadCardInfo(CSmartPointer &cfgRun, CSimpleStringA &acc, CSimpleStringA &serial, int slot) { char buf[8]; ZeroMemory(buf, 8); CSimpleStringA csAcc(""); cfgRun->ReadConfigValue("OperateCardStore", _itoa(slot, buf, 10), csAcc); CAutoArray arr = csAcc.Split(','); if (arr.GetCount() < 3) { //Dbg("data error.size:%d",arr.GetCount()); return false; } csAcc = arr[1]; serial = arr[2]; if(strlen(csAcc) < 8 || serial.GetLength() <= 0) { return false; } if (AccountExchange(csAcc, acc, 0)) { return true; } return false; } void CCardIssuerFSM::DecodeTracksData(const char *track2, DWORD dwT2size, const char *track3, DWORD dwT3size, char *&magData, bool bT2OK, bool bT3OK) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(", bT2OK:%d, bT3OK:%d, t2.size:%d(%d), t3.size:%d(%d)", bT2OK, bT3OK, dwT2size, strlen(track2), dwT3size, strlen(track3)); if (!bT2OK) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(", track2 data isn't ok."); return; } if (dwT2size <= 0 || strlen(track2) < 15)//fixpoint AE card is 15 { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(", track2 size maybe wrong."); return; } char tmpMag2_3[512] = { 0 };// , tmpMag2[256] = { 0 }; memcpy(tmpMag2_3, track2, dwT2size); char cardType[8]; ZeroMemory(cardType, 8); if (bT3OK && strlen(track3) > 1) { memcpy(tmpMag2_3 + dwT2size, "A", 1); memcpy(tmpMag2_3 + dwT2size + 1, track3, dwT3size); cmdDecodeEx(tmpMag2_3, cardType, magData); } DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(",cardType:%s", cardType); if (!bT3OK || strlen(cardType) < 4) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(", track3 data isn't ok or track3 size maybe wrong"); cmdDecodeMag2(tmpMag2_3, magData); } } int CCardIssuerFSM::SplitDevModelInfo() { LOG_FUNCTION(); if (strlen(m_devCat.szModel) < 3) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(", Wrong szModel:%s", m_devCat.szModel); return -1; } m_csCM = ""; CSimpleStringA csTmpModel(m_devCat.szModel); CAutoArray arrParam; arrParam.Init(16); arrParam = csTmpModel.Split('#'); for (int i = 0; i < arrParam.GetCount(); ++i) { if (_strnicmp(arrParam[i], "CM", 2) == 0) { m_csCM = arrParam[i].SubString(3, arrParam[i].GetLength() - 3); } } return 0; } void CCardIssuerFSM::CloseAndClearDevObj(bool bCheckConnecting, bool bCloseOnly) { LOG_FUNCTION(); ErrorCodeEnum ec = Error_Unexpect; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(", bCloseOnly:%d, m_bOpened:%d", bCloseOnly, m_bOpened); if (m_hDevHelper != nullptr && !bCloseOnly) { m_hDevHelper.TearDown(); m_bOpened = false;//硬件适配器关闭,则设置打开失败 } } int CCardIssuerFSM::JudgeCardType(CSimpleStringA cardno, bool& bMismatch) { if (cardno.GetLength() < 8) return 0; int cardType = 0; IHttpFunc* client; client = create_http(HttpsLogCallBack); CQueryCardTypeReq qCardTypeReq; CQueryCardTypeRet qCardTypeRet; //qCardTypeReq.m_printDbg = true;//oiltest qCardTypeReq.m_timeOut = 3;//3 second qCardTypeReq.m_url = m_EacQueryHost.GetData(); //qCardTypeReq.m_url = "http://55.13.170.50:8080/defa-gateway/dee1/EacQuery/queryByEac"; qCardTypeReq.HEAD.xHdrLen = 203; qCardTypeReq.HEAD.xIsuCnl = "X86"; qCardTypeReq.HEAD.xRtnCod = "SUC0000"; qCardTypeReq.BODY.x1.xCltNbr = ""; qCardTypeReq.BODY.x1.xEacNbr = cardno.GetData(); qCardTypeReq.BODY.x1.xIacNbr = ""; long beg = GetTickCountRVC(); bool ret = client->Post(qCardTypeReq, qCardTypeRet); long end = GetTickCountRVC(); if (ret) { bool bParse = qCardTypeRet.Parse(qCardTypeRet.m_resultData.c_str()); if (bParse) { if (qCardTypeRet.BODY.z1.zPsbMdm.compare("C") == 0) cardType = 2; else if (qCardTypeRet.BODY.z1.zPsbMdm.compare("I") == 0) cardType = 3; else if (qCardTypeRet.BODY.z1.zPsbMdm.compare("M") == 0) cardType = 1; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("Query card type from host is:%s,zPsbSeq:%s" , qCardTypeRet.BODY.z1.zPsbMdm.c_str(), qCardTypeRet.BODY.z1.zPsbSeq.c_str())); int eacLen = qCardTypeRet.BODY.z1.zEacNbr.length(); if (eacLen > 7 && cardno.Compare(qCardTypeRet.BODY.z1.zEacNbr.c_str()) != 0) { bMismatch = true; LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_Account_EAC_Mismatch, CSimpleStringA::Format("cardno:%s****%s EAC:%s****%s", cardno.SubString(0,6).GetData(), cardno.SubString(cardno.GetLength()-4, 4).GetData() , qCardTypeRet.BODY.z1.zEacNbr.substr(0, 6).c_str(), qCardTypeRet.BODY.z1.zEacNbr.substr(eacLen - 4, 4).c_str())); } } else DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("Query card type return false:%s",qCardTypeRet.HEAD.xRtnCod.c_str()));//也没必要知道什么错 oilyang@20220829 在功能可用之前,还是有必要的 } else { } client->Destory(); //oiltest for stupid http component!!! //if (cardno.IsStartWith("622580") || cardno.IsStartWith("622588") || cardno.IsStartWith("622609") // || cardno.IsStartWith("410062")) // return 3; return cardType; } void CCardIssuerFSM::HttpsLogCallBack(const char* logtxt) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("HttpsLogCallBack")("%s", logtxt); } void CCardIssuerFSM::QueryCIStatus(SpReqAnsContext::Pointer ctx) { if (m_hDevHelper == nullptr) ctx->Answer(Error_Unexpect); ErrorCodeEnum errCode; CardIssuerStatus cis; memset(&cis, 0, sizeof(CardIssuerStatus)); errCode = m_hDevHelper->GetDevStatus(cis); if (errCode != Error_Succeed) { SetErrPackage("QueryCiStatus::GetDevStatus", m_csDevSN, errCode, MEC_DEVAPI_CARDISSUER_GetDevStatus); AlarmDEC(); ctx->Answer(Error_Unexpect); } else { ctx->Ans.retainBin = cis.eRetainBin; ctx->Ans.hopperNo.Init(m_hopperNum); ctx->Ans.hopperStatus.Init(m_hopperNum); for (int i = 0; i < m_hopperNum; ++i) { ctx->Ans.hopperNo[i] = i; ctx->Ans.hopperStatus[i] = (int)cis.eIssuerBin[i]; } ctx->Answer(Error_Succeed); } return; } bool CCardIssuerFSM::ToRegistCaptureCardInfo() { //oilyang@20230214 no need to regist swallowed card info to system(according to meeting result,运营&财富平台) //if (m_currCardNo.GetLength() > 6) // DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("cardNoLen:%d, m_currCardNo:%s****%s, m_captureReason:%s", // m_currCardNo.GetLength(), m_currCardNo.SubString(0, 6).GetData(), // m_currCardNo.SubString(m_currCardNo.GetLength() - 4, 4).GetData(), m_captureReason.GetData())); //return true; //to check if url config if (m_csSwallowCardUrl.IsNullOrEmpty()) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220304").setResultCode("RTA230Z")("m_csSwallowCardUrl is empty. %s", m_csSwallowCardUrl.GetData()); return false; } RegistCaptureCardInfoTask* task = new RegistCaptureCardInfoTask(this, m_currCardNo); GetEntityBase()->GetFunction()->PostThreadPoolTask(task); return true; } bool CCardIssuerFSM::IfUseRf() { if (m_bStopUseRF) return false; CAutoArray arr = m_rfVendorList.Split('|'); //Dbg("%s,%d", m_rfVendorList.GetData(),arr.GetCount()); for (int i = 0; i < arr.GetCount(); ++i) { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s,%s", arr[i].GetData(), m_adapterInfo.adapterFilePath.GetData()); if (m_adapterInfo.adapterFilePath.IndexOf(arr[i].GetData()) > 0) return true; } return false; }