#ifndef __CARD_ISSUER_FSM_H #define __CARD_ISSUER_FSM_H #pragma once #include "SpFSM.h" #include "CardIssuerStand_server_g.h" #include "HeartBeat_client_g.h" #include "AccessAuthorization_client_g.h" #include "HealthManager_client_g.h" #include "DevFSMCommBase.hpp" #include "CommEntityUtil.hpp" #include "CardIssuerClass.h" #include "CardAssist.h" #include "ICDataElement.h" #include "IHttpFunc.h" #include "json/json.h" #define REFLECTION(var) #var using namespace CardIssuerStand; //using namespace GUIConsole; using namespace HeartBeat; using namespace AccessAuthorization; enum EvtType { USER_EVT_TEST = EVT_USER+1, USER_EVT_QUIT, USER_EVT_INIT, USER_EVT_INITFINISHED, USER_EVT_ACCEPT, USER_EVT_ACCEPT_CANCEL, USER_EVT_ACCEPTFINISHED, USER_EVT_EJECT, USER_EVT_CAPTURE, USER_EVT_EJECTFINISHED, USER_EVT_WAITFINISHED, USER_EVT_CAPTUREFINISHED, USER_EVT_WAITFETCHINGTIMEOUT, USER_EVT_PREONLINE, USER_EVT_POSTONLINE, USER_EVT_PREONLINEFINISHED, USER_EVT_POSTONLINEFINISHED, USER_EVT_RESET, USER_EVT_RESETFINISHED, USER_EVT_EXIT, USER_EVT_READ, USER_EVT_READ_FINISHED, USER_EVT_GET_MATERIAL_EX, USER_EVT_SET_MATERIAL_EX, USER_EVT_ISSUE_EX, USER_EVT_ISSUE_EX_FINISHED, USER_EVT_BACK_TO_INIT, //新定义JS状态机事件枚举 USER_EVT_JS_CAPTURE, USER_EVT_JS_CAPTURE_FINISHED, USER_EVT_JS_EJECT, USER_EVT_JS_EJECT_FINISHED, USER_EVT_JS_POSTONLINE, USER_EVT_JS_POSTONLINE_FINISHED, USER_EVT_JS_ISSUE_FROM_BOX, USER_EVT_JS_ISSUE_FROM_BOX_FINISHED, USER_EVT_JS_READ, USER_EVT_JS_READ_FINISHED, USER_EVT_JS_INSERT, USER_EVT_JS_INSERT_FINISHED, USER_EVT_JS_INSERT_CANCEL, USER_EVT_JS_EXIT_MIAN_PAGE, USER_EVT_CHECK_CARD_FINISHED }; enum ReadMode { // ReadMode_MagOnly = 1, ReadMode_ICOnly_ContactICFirst = 2, ReadMode_ICOnly_RFFirst = 3, ReadMode_ICOnly_RFOnly = 4, ReadMode_MagIC_ContactICFirst = 5, ReadMode_MagIC_RFFirst = 6, ReadMode_MagIC_RFOnly = 7, }; enum CheckCardCase { CheckCard_OnOpen = 0, CheckCard_OnFail, CheckCard_OnMainPage, }; typedef int(*lpCMBdecodeMag2)(char* Mag2Data, char * data); typedef int(*lpCMBdecodeEx)( char* MagData, char * type, char * data); typedef int(__stdcall *pfEncryptDukptHSM)(unsigned char* EncryptedData, unsigned char* bdk, unsigned char* curksn, unsigned char* DecryptedData); typedef int(__stdcall *pfGetEncrypedData)(unsigned char* BDK, unsigned char* KSN, unsigned char*random, unsigned char* result); class CCardIssuerEntity; class CCardIssuerFSM; const int ONE_K = 1024; const int HOPPER_NUM = 12; struct Track2Data { int status; CSimpleStringA t2Account; CSimpleStringA t2Region; CSimpleStringA t2CardSerial; CSimpleStringA t2CVC; CSimpleStringA t2ExpireDate; }; struct CMBBin { CSimpleStringA bin;//6 byte long bool bIC;//IC:true or mag:false bool bDC;//debit:true,credit:false }; class CardInitFinishedEvent : public FSMEvent { public: CardInitFinishedEvent() : FSMEvent(USER_EVT_INITFINISHED){} ~CardInitFinishedEvent(){} SpReqAnsContext::Pointer ctx; protected: private: }; class CardAcceptEvent : public FSMEvent { public: CardAcceptEvent() : FSMEvent(USER_EVT_ACCEPT) {} ~CardAcceptEvent() {} SpReqAnsContext::Pointer ctx; }; class CancelAcceptEvent : public FSMEvent { public: CancelAcceptEvent() : FSMEvent(USER_EVT_ACCEPT_CANCEL) {} ~CancelAcceptEvent() {} }; class CardReadEvent : public FSMEvent { public: CardReadEvent() : FSMEvent(USER_EVT_READ) {} ~CardReadEvent() {} SpReqAnsContext::Pointer ctx; protected: private: }; class CardReadFinishedEvent : public FSMEvent { public: CardReadFinishedEvent() : FSMEvent(USER_EVT_READ_FINISHED) {} ~CardReadFinishedEvent() {} SpReqAnsContext::Pointer ctx; protected: private: }; class ResetDeviceEvent : public FSMEvent { public: ResetDeviceEvent() : FSMEvent(USER_EVT_RESET){} ~ResetDeviceEvent(){} protected: private: }; class ResetFinishedEvent : public FSMEvent { public: ResetFinishedEvent() : FSMEvent(USER_EVT_RESETFINISHED){} ~ResetFinishedEvent(){} protected: private: }; class PreOnlineEvent : public FSMEvent { public: PreOnlineEvent() : FSMEvent(USER_EVT_PREONLINE){} ~PreOnlineEvent(){} SpReqAnsContext::Pointer ctx; protected: private: }; class PostOnlineEvent : public FSMEvent { public: PostOnlineEvent() : FSMEvent(USER_EVT_POSTONLINE){} ~PostOnlineEvent(){} SpReqAnsContext::Pointer ctx; protected: private: }; class CardCaptureEvent : public FSMEvent { public: CardCaptureEvent() : FSMEvent(USER_EVT_CAPTURE){} ~CardCaptureEvent(){} SpReqAnsContext::Pointer ctx; protected: private: }; class CardEjectEvent : public FSMEvent { public: CardEjectEvent() : FSMEvent(USER_EVT_EJECT){} ~CardEjectEvent(){} SpReqAnsContext::Pointer ctx; protected: private: }; class GetMaterialExEvent : public FSMEvent { public: GetMaterialExEvent() : FSMEvent(USER_EVT_GET_MATERIAL_EX) {} ~GetMaterialExEvent() {} SpReqAnsContext::Pointer ctx; protected: private: }; class SetMaterialExEvent : public FSMEvent { public: SetMaterialExEvent() : FSMEvent(USER_EVT_SET_MATERIAL_EX){} ~SetMaterialExEvent(){} SpReqAnsContext::Pointer ctx; protected: private: }; class CardIssueExEvent : public FSMEvent { public: CardIssueExEvent() : FSMEvent(USER_EVT_ISSUE_EX){} ~CardIssueExEvent(){} SpReqAnsContext::Pointer ctx; }; #pragma region JS接口 event //JS接口 class EjectJSEvent : public FSMEvent { public: EjectJSEvent() : FSMEvent(USER_EVT_JS_EJECT) {} ~EjectJSEvent() {} SpReqAnsContext::Pointer ctx; }; class CaptureJSEvent : public FSMEvent { public: CaptureJSEvent() : FSMEvent(USER_EVT_JS_CAPTURE) {} ~CaptureJSEvent() {} SpReqAnsContext::Pointer ctx; }; class PostOnlineJSEvent : public FSMEvent { public: PostOnlineJSEvent() : FSMEvent(USER_EVT_JS_POSTONLINE) {} ~PostOnlineJSEvent() {} SpReqAnsContext::Pointer ctx; }; class IssueFromBoxJSEvent : public FSMEvent { public: IssueFromBoxJSEvent() : FSMEvent(USER_EVT_JS_ISSUE_FROM_BOX) {} ~IssueFromBoxJSEvent() {} SpReqAnsContext::Pointer ctx; }; class InsertJSEvent : public FSMEvent { public: InsertJSEvent() : FSMEvent(USER_EVT_JS_INSERT) {} ~InsertJSEvent() {} SpReqAnsContext::Pointer ctx; }; class CancelInsertJSEvent : public FSMEvent { public: CancelInsertJSEvent() : FSMEvent(USER_EVT_JS_INSERT_CANCEL) {} ~CancelInsertJSEvent() {} }; #pragma endregion JS接口 event typedef struct CRegistSwallowCardReq : CHTTPReq { string cardNo; string cardType; string channel; string clearInstanceId; string deviceSciNo; string bankNo; string editTime; string editor; string fromFlag; string idKey; string informType; string psbCode; string reasonCode; string state; string structId; string swallowDate; string swallowTime; string terminalNo; string terminalType; string uuid; string ToJson() { Json::Value allElm, x1Arr; allElm[REFLECTION(cardNo)] = cardNo; allElm[REFLECTION(deviceSciNo)] = deviceSciNo; allElm[REFLECTION(reasonCode)] = reasonCode; allElm[REFLECTION(swallowDate)] = swallowDate; allElm[REFLECTION(swallowTime)] = swallowTime; allElm[REFLECTION(terminalNo)] = terminalNo; allElm[REFLECTION(terminalType)] = terminalType; Json::FastWriter writer; string ret = writer.write(allElm); return ret; } } CRegistSwallowCardReq; typedef struct CRegistSwallowCardRet : CHTTPRet { struct returnInfo { string returnCode; string errorMsg; }returnInfo; struct data { }data; bool Parse(string strData) { //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(strData.c_str()); Json::Value root, tmpZ1; Json::Reader reader; if (!reader.parse(strData, root, false)) { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("reader.parse false"); return false; } if (!root["returnInfo"].isNull()) { returnInfo.returnCode = root["returnInfo"][REFLECTION(returnCode)].asCString(); return true; } else { return false;//报文结构不对,解析失败 } //returnInfo.returnCode = root["returnInfo"][REFLECTION(returnCode)].asCString(); } } CRegistSwallowCardRet; // 同步卡库计数到后台服务实体类 struct SyncMaterialCountInfo { CSimpleStringA strDeviceNo; unsigned int dwCardBoxNum; CAutoArray arrMaintainFlag; CAutoArray arrMaintainer; CAutoArray arrMaintainTime; CAutoArray arrCardBoxNo; CAutoArray arrPsbCode; CAutoArray arrPsbName; CAutoArray arrCardInit; CAutoArray arrCardRemains; CAutoArray arrCardIssued; CAutoArray arrCardMixed; CAutoArray arrCardPercent; }; struct SyncMaterialCountReq1 { char TerminalNo[16]; char DeviceNo[16]; char Material[16]; DWORD CardBoxNum; }; struct SyncMaterialCountReq2 { bool bMaintain; char Maintainer[16]; DWORD MaintainTime; char CardBoxNo[20]; char PsbCode[8]; char PsbName[128]; DWORD CardInit; DWORD CardRemains; DWORD CardIssued; DWORD CardMixed; DWORD CardPercent; }; struct SyncMaterialCountHTTPReq : CHTTPReq { SyncMaterialCountHTTPReq() { m_timeOut = 30; } SyncMaterialCountReq1 reqInfo; std::vector reqData; virtual string ToJson() { Json::Value root; Json::Value arrayObj; root["terminalNo"] = reqInfo.TerminalNo; root["deviceNo"] = reqInfo.DeviceNo; root["materiel"] = reqInfo.Material; root["cardBoxNum"] = (int)reqInfo.CardBoxNum; for (int i = 0; i <= reqInfo.CardBoxNum; i++) { Json::Value item; item["CardBoxNo"] = reqData[i].CardBoxNo; item["PsbCode"] = reqData[i].PsbCode; item["PsbName"] = reqData[i].PsbName; item["CardInit"] = (int)reqData[i].CardInit; item["CardRemains"] = (int)reqData[i].CardRemains; item["CardIssued"] = (int)reqData[i].CardIssued; item["CardMixed"] = (int)reqData[i].CardMixed; item["CardPercent"] = (int)reqData[i].CardPercent; item["Maintainer"] = reqData[i].Maintainer; if (reqData[i].MaintainTime == 0) item["MaintainTime"] = ""; else { item["MaintainTime"] = CSmallDateTime::GetNow().ToTimeString().GetData(); //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("MaintainTime:%d", (DWORD)CSmallDateTime::GetNow()); } item["bMaintain"] = reqData[i].bMaintain; arrayObj.append(item); } root["cardIssueList"] = arrayObj; return root.toStyledString(); } }; struct SyncMaterialCountHTTPRet : CHTTPRet { string m_retStr; bool Parse(string strData) { m_retStr = strData; return true; } }; class CCardIssuerFSM : public CCommDevFSM, public IFSMStateHooker { public: enum { s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12 }; BEGIN_FSM_STATE(CCardIssuerFSM) FSM_STATE_ENTRY(s0, "Init", s0_on_entry, s0_on_exit, s0_on_event) FSM_STATE_ENTRY(s1, "Initializing", s1_on_entry, s1_on_exit, s1_on_event) FSM_STATE_ENTRY(s2, "Idle", s2_on_entry, s2_on_exit, s2_on_event) FSM_STATE_ENTRY(s3, "Accepting", s3_on_entry, s3_on_exit, s3_on_event) FSM_STATE_ENTRY(s4, "Hold", s4_on_entry, s4_on_exit, s4_on_event) FSM_STATE_ENTRY(s5, "Reading", s5_on_entry, s5_on_exit, s5_on_event) FSM_STATE_ENTRY(s6, "Ejecting", s6_on_entry, s6_on_exit, s6_on_event) FSM_STATE_ENTRY(s7, "WaitFetching", s7_on_entry, s7_on_exit, s7_on_event) FSM_STATE_ENTRY(s8, "Capturing", s8_on_entry, s8_on_exit, s8_on_event) FSM_STATE_ENTRY(s9, "Failed", s9_on_entry, s9_on_exit, s9_on_event) FSM_STATE_ENTRY(s10, "Issuing", s10_on_entry, s10_on_exit, s10_on_event) FSM_STATE_ENTRY(s11, "ReadJSing", s11_on_entry, s11_on_exit, s11_on_event) FSM_STATE_ENTRY(s12, "IssueJSing", s12_on_entry, s12_on_exit, s12_on_event) END_FSM_STATE() BEGIN_FSM_RULE(CCardIssuerFSM, s0) FSM_RULE_ENTRY(s0, s2, USER_EVT_TEST, 0) FSM_RULE_ENTRY(s0, s1, USER_EVT_INIT, 0) FSM_RULE_ENTRY(s0, FSM_STATE_EXIT, USER_EVT_QUIT, 0) FSM_RULE_ENTRY(s1, s2, USER_EVT_INITFINISHED, 0) FSM_RULE_ENTRY(s1, s9, USER_EVT_INITFINISHED, 1) FSM_RULE_ENTRY(s1, FSM_STATE_EXIT, USER_EVT_QUIT, 0) FSM_RULE_ENTRY(s2, s3, USER_EVT_ACCEPT, 0) // FSM_RULE_ENTRY(s2,s9,USER_EVT_ACCEPT,1) FSM_RULE_ENTRY(s2, FSM_STATE_EXIT, USER_EVT_QUIT, 0) FSM_RULE_ENTRY(s2, s10, USER_EVT_ISSUE_EX, 0) FSM_RULE_ENTRY(s2, s3, USER_EVT_JS_INSERT, 0)//JS 插卡 FSM_RULE_ENTRY(s2, s12, USER_EVT_JS_ISSUE_FROM_BOX, 0)//JS 卡箱发卡 FSM_RULE_ENTRY(s3, s4, USER_EVT_ACCEPTFINISHED, 0) FSM_RULE_ENTRY(s3, s9, USER_EVT_ACCEPTFINISHED, 1)//设置进卡报错 FSM_RULE_ENTRY(s3, s2, USER_EVT_ACCEPTFINISHED, 2) FSM_RULE_ENTRY(s3, s2, USER_EVT_ACCEPTFINISHED, 3) FSM_RULE_ENTRY(s3, s7, USER_EVT_ACCEPTFINISHED, 4) FSM_RULE_ENTRY(s3, s9, USER_EVT_ACCEPTFINISHED, 5)//查询硬件报错 FSM_RULE_ENTRY(s3, FSM_STATE_EXIT, USER_EVT_QUIT, 0) FSM_RULE_ENTRY(s3, s4, USER_EVT_JS_INSERT_FINISHED, 0)//JS 插卡成功 FSM_RULE_ENTRY(s3, s9, USER_EVT_JS_INSERT_FINISHED, 1)//JS 设置进卡报错 FSM_RULE_ENTRY(s3, s2, USER_EVT_JS_INSERT_FINISHED, 2)//JS 超时 FSM_RULE_ENTRY(s3, s2, USER_EVT_JS_INSERT_FINISHED, 3)//JS 取消 FSM_RULE_ENTRY(s3, s6, USER_EVT_JS_INSERT_FINISHED, 4)//JS 取消时有卡,吐卡 FSM_RULE_ENTRY(s3, s9, USER_EVT_JS_INSERT_FINISHED, 5)//JS 查询硬件报错 FSM_RULE_ENTRY(s4, s5, USER_EVT_READ, 0) FSM_RULE_ENTRY(s4, s6, USER_EVT_EJECT, 0) FSM_RULE_ENTRY(s4, s8, USER_EVT_ACCEPT, 0)//??? FSM_RULE_ENTRY(s4, s8, USER_EVT_CAPTURE, 0) FSM_RULE_ENTRY(s4, FSM_STATE_EXIT, USER_EVT_QUIT, 0) FSM_RULE_ENTRY(s4, s5, USER_EVT_PREONLINE, 0) FSM_RULE_ENTRY(s4, s5, USER_EVT_POSTONLINE, 0) FSM_RULE_ENTRY(s4, s11, USER_EVT_JS_READ, 0)//JS 读卡 FSM_RULE_ENTRY(s4, s11, USER_EVT_JS_POSTONLINE, 0)//JS 联机后 FSM_RULE_ENTRY(s4, s6, USER_EVT_JS_EJECT, 0)//JS 吐卡 FSM_RULE_ENTRY(s4, s8, USER_EVT_JS_CAPTURE, 0)//JS 吞卡 FSM_RULE_ENTRY(s4, s2, USER_EVT_CHECK_CARD_FINISHED, 0) FSM_RULE_ENTRY(s4, s9, USER_EVT_CHECK_CARD_FINISHED, 1) FSM_RULE_ENTRY(s4, s6, EVT_MAINPAGE_DISPLAY, 0) FSM_RULE_ENTRY(s4, s8, EVT_MAINPAGE_DISPLAY, 1) FSM_RULE_ENTRY(s5, s4, USER_EVT_READ_FINISHED, 0) FSM_RULE_ENTRY(s5, s9, USER_EVT_READ_FINISHED, 1) FSM_RULE_ENTRY(s5, FSM_STATE_EXIT, USER_EVT_QUIT, 0) FSM_RULE_ENTRY(s5, s4, USER_EVT_PREONLINEFINISHED, 0) FSM_RULE_ENTRY(s5, s4, USER_EVT_POSTONLINEFINISHED, 0) FSM_RULE_ENTRY(s6, s7, USER_EVT_EJECTFINISHED, 0) FSM_RULE_ENTRY(s6, s9, USER_EVT_EJECTFINISHED, 1) FSM_RULE_ENTRY(s6, FSM_STATE_EXIT, USER_EVT_QUIT, 0) FSM_RULE_ENTRY(s6, s2, USER_EVT_JS_EJECT_FINISHED, 0)//JS 吐卡取卡成功,取卡超时吞卡成功 FSM_RULE_ENTRY(s6, s9, USER_EVT_JS_EJECT_FINISHED, 1)//JS 吐卡失败,取卡超时吞卡失败 FSM_RULE_ENTRY(s7, s2, USER_EVT_WAITFINISHED, 0) FSM_RULE_ENTRY(s7, s9, USER_EVT_WAITFINISHED, 1) FSM_RULE_ENTRY(s7, s8, USER_EVT_WAITFINISHED, 2) FSM_RULE_ENTRY(s7, FSM_STATE_EXIT, USER_EVT_QUIT, 0) FSM_RULE_ENTRY(s8, s2, USER_EVT_CAPTUREFINISHED, 0) FSM_RULE_ENTRY(s8, s9, USER_EVT_CAPTUREFINISHED, 1) FSM_RULE_ENTRY(s8, FSM_STATE_EXIT, USER_EVT_QUIT, 0) FSM_RULE_ENTRY(s8, s2, USER_EVT_JS_CAPTURE_FINISHED, 0)//JS 吞卡成功 FSM_RULE_ENTRY(s8, s9, USER_EVT_JS_CAPTURE_FINISHED, 1)//JS 吞卡失败 FSM_RULE_ENTRY(s9, s2, USER_EVT_CHECK_CARD_FINISHED, 0) FSM_RULE_ENTRY(s9, s4, USER_EVT_CHECK_CARD_FINISHED, 2) FSM_RULE_ENTRY(s10, s6, USER_EVT_ISSUE_EX_FINISHED, 6) FSM_RULE_ENTRY(s10, s4, USER_EVT_ISSUE_EX_FINISHED, 0) FSM_RULE_ENTRY(s10, s9, USER_EVT_ISSUE_EX_FINISHED, 1) FSM_RULE_ENTRY(s10, s2, USER_EVT_ISSUE_EX_FINISHED, 2) FSM_RULE_ENTRY(s10, s6, USER_EVT_ISSUE_EX_FINISHED, 6) FSM_RULE_ENTRY(s10, s2, USER_EVT_ISSUE_EX_FINISHED, 8) FSM_RULE_ENTRY(s11, s4, USER_EVT_JS_READ_FINISHED, 0)//JS 读卡结果返回 FSM_RULE_ENTRY(s11, s4, USER_EVT_JS_POSTONLINE_FINISHED, 0)//JS FSM_RULE_ENTRY(s12, s4, USER_EVT_JS_ISSUE_FROM_BOX_FINISHED, 0)//JS 发卡成功 FSM_RULE_ENTRY(s12, s2, USER_EVT_JS_ISSUE_FROM_BOX_FINISHED, 1)//JS 发卡失败 FSM_RULE_ENTRY(s12, s9, USER_EVT_JS_ISSUE_FROM_BOX_FINISHED, 2)//JS 发卡故障 FSM_RULE_ENTRY(s12, s8, USER_EVT_JS_ISSUE_FROM_BOX_FINISHED, 3)//JS 退回首页进行吞卡 END_FSM_RULE() CCardIssuerFSM() : m_bCancelAccept(false), m_bWaitingAccept(false), m_bWaitAccepteMore(false), m_bExit(false), m_resetTimes(0), m_testResult(Error_Succeed) //,m_pTACReject(NULL),m_pIACOnline(NULL),m_pTACOnline(NULL),m_pIACDefault(NULL),m_pTACDefault(NULL) , m_bCDA(false), m_pDataToARQC(NULL) , m_bCardIssued(false), m_issueStatus(1), m_currCardNo("") , m_captureReason(""), m_machineType(1), m_currentHopper(1), m_hopperNum(1) , m_bSettingMaterial(false), m_addCardSerial("") , m_bCancelByRFIC(false), m_devOpenFailedCount(0), m_bSingleMagOrIC(false) , m_bCardFromHopper(true), m_rfVendorList(""), m_bUseRFTillNext(false), m_csSwallowCardUrl(""), m_csSyncMaterialUrl("") , m_bCancelInsert(false), m_iCheckCardInInterval(200), m_bMainPageWhileWorking(false) { HARDWARE_ENTITY_RESET_ENTITYID(m_entCode, 0x203); cmdDecodeMag2 = NULL; cmdDecodeEx = NULL; m_aidList.Init(3); m_aidList[0] = "A000000333"; m_aidList[1] = "A0000000108888"; m_aidList[2] = "A000000790"; } ~CCardIssuerFSM() {} virtual ErrorCodeEnum OnInit(); virtual ErrorCodeEnum OnExit(); void s0_on_entry(); void s0_on_exit(); unsigned int s0_on_event(FSMEvent* event); void s1_on_entry(); void s1_on_exit(); unsigned int s1_on_event(FSMEvent* event); void s2_on_entry(); void s2_on_exit(); unsigned int s2_on_event(FSMEvent* event); void s3_on_entry(); void s3_on_exit(); unsigned int s3_on_event(FSMEvent* event); void s4_on_entry(); void s4_on_exit(); unsigned int s4_on_event(FSMEvent* event); void s5_on_entry(); void s5_on_exit(); unsigned int s5_on_event(FSMEvent* event); void s6_on_entry(); void s6_on_exit(); unsigned int s6_on_event(FSMEvent* event); void s7_on_entry(); void s7_on_exit(); unsigned int s7_on_event(FSMEvent* event); void s8_on_entry(); void s8_on_exit(); unsigned int s8_on_event(FSMEvent* event); void s9_on_entry(); void s9_on_exit(); unsigned int s9_on_event(FSMEvent* event); void s10_on_entry(); void s10_on_exit(); unsigned int s10_on_event(FSMEvent* event); void s11_on_entry(); void s11_on_exit(); unsigned int s11_on_event(FSMEvent* event); void s12_on_entry(); void s12_on_exit(); unsigned int s12_on_event(FSMEvent* event); ErrorCodeEnum OpenDevice(BYTE btOpenType, const char* pDevSN); int Initial(); int CheckIfHasCardOnCase(CheckCardCase eCase); int CaptureCard(SpReqAnsContext::Pointer ctx); int EjectCard(SpReqAnsContext::Pointer ctx); int WaitFetchingCard(); int ReadCard(SpReqAnsContext::Pointer ctx); int PreOnline(SpReqAnsContext::Pointer ctx); int PostOnline(SpReqAnsContext::Pointer ctx); int ReadCard_Contact(SpReqAnsContext::Pointer ctx, bool bContinue); int PreOnline_Contact(SpReqAnsContext::Pointer ctx, bool& bICOK); int PostOnline_Contact(SpReqAnsContext::Pointer ctx, bool& bICOK); int ReadCard_RF(SpReqAnsContext::Pointer ctx); int PreOnline_RF(SpReqAnsContext::Pointer ctx); int PostOnline_RF(SpReqAnsContext::Pointer ctx); int InternalAcceptCard(SpReqAnsContext::Pointer ctx); int AcceptCard(SpReqAnsContext::Pointer ctx); int IssueCard(SpReqAnsContext::Pointer ctxEx); bool GetWaitFlag() { return m_bWaitingAccept; } void SetWaitMore() { m_bWaitAccepteMore = true; } void SetExitFlag(bool bFlag = true) { m_bExit = bFlag; } void FSMSetIssueFlag(int value) { m_issueStatus = value; } int QueryIssueFlag() { return m_issueStatus; } bool SetCardCaptured(const int num, bool bNewClear = false); bool SetCardIssued(const int num, const int hopper); bool SetCardRemains(const int num, const int hopper, bool bInit = false); bool SetCardMixed(const int num, const int hopper); ErrorCodeEnum MachineMoveCardBackNotHold(); ErrorCodeEnum MachineMoveCardFrontGate(bool bInBussiness = false); void SelfTest(EntityTestEnum eTestType, CSmartPointer pTransactionContext); DevStateEnum GetDevState() const { if ((m_eDevState == DEVICE_STATUS_NORMAL) && ((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])) return DEVICE_STATUS_MAINTAINCE; else return m_eDevState; } int QueryCardPos(); int UpdateLocalRunCfg(CAutoArray hopperArr); int SyncDataToDB(bool bMaintain[12], bool bSetCaptured = true);//同步物料计数 void SetHopperNum(int hopperNum); void DecodeTracksData(const char* track2, DWORD dwT2size, const char* track3, DWORD dwT3size, char*& magData, bool bT2OK = true, bool bT3OK = true); void GetCardInfo(int& findCard, int& cardPos) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format(", findCard:%d, cardPos:%d", findCard, cardPos)); findCard = m_findCard; cardPos = m_cardPos; } int SplitDevModelInfo(); void SetCancelByRFICFlag(bool bCancel = true) { m_bCancelByRFIC = bCancel; } CSimpleStringA GetPreOnlineICCardNo() { return m_currCardNo; } void CloseAndClearDevObj(bool bCheckConnecting = true, bool bCloseOnly = false); static void HttpsLogCallBack(const char* logtxt); void QueryCIStatus(SpReqAnsContext::Pointer ctx); bool RegistCardWhileCaptureCard(CSimpleStringA cardno); bool SyncMaterialCount(IHttpFunc* client, SyncMaterialCountInfo syncInfo); protected: int m_iInsertTries; int m_resetTries; int m_ejectTries; private: /// int m_resetTimes; lpCMBdecodeMag2 cmdDecodeMag2; lpCMBdecodeEx cmdDecodeEx; bool m_bCancelAccept, m_bWaitingAccept, m_bWaitAccepteMore, m_bExit , m_bCDA, m_bCardIssued, m_bHasHopper[HOPPER_NUM] , m_bSettingMaterial, m_bCancelByRFIC, m_bSingleMagOrIC , m_bCardActiveNotify, m_bCardFromHopper, m_bMainPageWhileWorking/*Accepting、Read(JS)ing、Issue(JS)ing*/; bool m_bSupportRF, m_bUseRFTillNext;//if ReadCard by RF,the following PreOnline & PostOnline always use RF till the next card(insert/issue) ErrorCodeEnum m_testResult; int m_CardCaptured; int m_issueStatus/*the status maybe changed by Business call*/; //1:default, 2:SCI, 3:no cfg int m_machineType; int m_currentHopper, m_devOpenFailedCount; int m_maxSlot, m_findCard, m_cardPos, m_maxRetainCount, m_iCheckCardInInterval; CSimpleStringA m_CardBoxNoEx[HOPPER_NUM], m_PsbCodeEx[HOPPER_NUM], m_PsbNameEx[HOPPER_NUM], m_MaintainerEx[HOPPER_NUM], m_csMaintainTimeEx[HOPPER_NUM]; int m_CardInitEx[HOPPER_NUM], m_CardPercentEx[HOPPER_NUM], m_remainsEx[HOPPER_NUM], m_issuedEx[HOPPER_NUM], m_mixedEx[HOPPER_NUM], m_hopperNum; DWORD m_MaintainTimeEx[HOPPER_NUM]; BYTE m_connectType, m_r1[128], m_r2[128], m_r3[128], m_priKey[ONE_K / 2], m_devPubKey[ONE_K / 2]; CardIssuerStatus m_devStatus; CCardProcess* m_pCardProcess; CAutoArray m_aidList; char* m_pDataToARQC; long xxTest; CSimpleStringA m_currCardNo, m_captureReason, m_csMachineType, m_terminalNo, m_addCardSerial, m_rfVendorList, m_csRF; char m_AuthCode[2]; vector m_vBin; int SplitTrack2(CSimpleStringA pTrack2, Track2Data& decodeData); bool JustReadCardNo(); bool IsValidCardNo(const char*, int); void GetVendorDllName(CSimpleStringA& dllName); bool LoadCMBPrint(CSimpleStringA csBinPath); DevCategoryInfo m_devCat; bool ToRegistCaptureCardInfo(); void CheckSupportRf(); CSimpleStringA m_csSwallowCardUrl, m_csSyncMaterialUrl; MagTracks m_magTracks; public: int EjectJS(SpReqAnsContext::Pointer ctx); int CaptureJS(SpReqAnsContext::Pointer ctx); void QueryHasCardJS(SpReqAnsContext::Pointer ctx); int PostOnlineJS(SpReqAnsContext::Pointer ctx); int IssueFromBoxJS(SpReqAnsContext::Pointer ctx); int ReadJS(SpReqAnsContext::Pointer ctx); int InsertJS(SpReqAnsContext::Pointer ctx); int PostOnlineJS_Contact(SpReqAnsContext::Pointer ctx, bool& bICOK); int PostOnlineJS_RF(SpReqAnsContext::Pointer ctx); void ReadMag(SpReqAnsContext::Pointer ctx); int PreOnlineJS_ReadViaContact(SpReqAnsContext::Pointer ctx, bool bContinue); int PreOnlineJS_ReadViaRF(SpReqAnsContext::Pointer ctx, bool bContinue); int PreOnlineJS_ICDataProcess(SpReqAnsContext::Pointer ctx); CSimpleStringA MaskCardno(const char* cardno); void SetDoExitFlag(bool bFlag) { m_bDoExit = bFlag; } virtual void OnStateTrans(int iSrcState, int iDstState); CSimpleStringA getRTACode(DWORD dwUserCode) { CSimpleStringA rtaMsg = this->GetEntityBase()->GetFunction()->UserCodeToRTACode(dwUserCode); DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("rtaMsg=%s", rtaMsg.GetData()); return rtaMsg; } private: bool m_bCancelInsert; bool m_bDoExit; ULLINT m_ullBeginTime, m_ullEndTime; BYTE m_btCID/*9f27*/; void FSMEventDefaultProcess(FSMEvent* pEvt, DWORD dwUserCode); CSimpleStringA GetErrMsgByCode(DWORD dwCode); void GetDevApiCodeAndName(int retValue, DWORD& dwDevApiCode, CSimpleStringA& csDevApiName); }; class ReadJSEvent : public FSMEvent { public: ReadJSEvent() : FSMEvent(USER_EVT_JS_READ){} ~ReadJSEvent() {} SpReqAnsContext::Pointer ctx; }; struct InitTask : public ITaskSp { CCardIssuerFSM* fsm; InitTask(CCardIssuerFSM* f) : fsm(f) {} void Process() { FSMEvent *e = new FSMEvent(USER_EVT_INITFINISHED); e->param1 = fsm->Initial(); fsm->PostEventFIFO(e); } }; struct AcceptTask : public ITaskSp { CCardIssuerFSM* fsm; SpReqAnsContext::Pointer ctx; AcceptTask(CCardIssuerFSM* f) : fsm(f) {} void Process() { LOG_FUNCTION(); FSMEvent *e = new FSMEvent(USER_EVT_ACCEPTFINISHED); e->param1 = fsm->AcceptCard(ctx); fsm->PostEventFIFO(e); } }; struct IssueTask : public ITaskSp { CCardIssuerFSM* fsm; SpReqAnsContext::Pointer ctxEx; IssueTask(CCardIssuerFSM* f) : fsm(f) {} void Process() { LOG_FUNCTION(); FSMEvent *e = new FSMEvent(USER_EVT_ISSUE_EX_FINISHED); e->param1 = fsm->IssueCard(ctxEx); fsm->PostEventFIFO(e); } }; struct ReadTask : public ITaskSp { SpReqAnsContext::Pointer ctx; CCardIssuerFSM* fsm; ReadTask(CCardIssuerFSM* f) : fsm(f) {} void Process() { CardReadFinishedEvent *e = new CardReadFinishedEvent(); e->ctx = ctx; e->param1 = fsm->ReadCard(ctx); fsm->PostEventFIFO(e); } }; struct PreOnlineTask : public ITaskSp { SpReqAnsContext::Pointer ctx; CCardIssuerFSM* fsm; PreOnlineTask(CCardIssuerFSM* f) : fsm(f) {} void Process() { FSMEvent *e = new FSMEvent(USER_EVT_PREONLINEFINISHED); e->param1 = fsm->PreOnline(ctx);//oilyang@20220611 实际上,为简化处理,PreOnline函数默认返回0 fsm->PostEventFIFO(e); } }; struct PostOnlineTask : public ITaskSp { SpReqAnsContext::Pointer ctx; CCardIssuerFSM* fsm; PostOnlineTask(CCardIssuerFSM* f) : fsm(f) {} void Process() { FSMEvent *e = new FSMEvent(USER_EVT_POSTONLINEFINISHED); e->param1 = fsm->PostOnline(ctx); fsm->PostEventFIFO(e); } }; struct CaptureTask : public ITaskSp { CCardIssuerFSM* fsm; SpReqAnsContext::Pointer ctx; CaptureTask(CCardIssuerFSM* f) : fsm(f) {} void Process() { FSMEvent *e = new FSMEvent(USER_EVT_CAPTUREFINISHED); e->param1 = fsm->CaptureCard(ctx); fsm->PostEventFIFO(e); } }; struct EjectTask : public ITaskSp { SpReqAnsContext::Pointer ctx; CCardIssuerFSM* fsm; EjectTask(CCardIssuerFSM* f) : fsm(f) {} void Process() { FSMEvent *e = new FSMEvent(USER_EVT_EJECTFINISHED); e->param1 = fsm->EjectCard(ctx); fsm->PostEventFIFO(e); } }; struct WaitFetchingTask : public ITaskSp { CCardIssuerFSM* fsm; WaitFetchingTask(CCardIssuerFSM* f) : fsm(f) {} void Process() { FSMEvent *e = new FSMEvent(USER_EVT_WAITFINISHED); e->param1 = fsm->WaitFetchingCard(); fsm->PostEventFIFO(e); } }; struct DoCheckCardTask : public ITaskSp { CCardIssuerFSM* fsm; CheckCardCase eCase; DoCheckCardTask(CCardIssuerFSM* f, CheckCardCase eCase) : fsm(f) {} void Process() { FSMEvent* e = new FSMEvent(USER_EVT_CHECK_CARD_FINISHED); e->param1 = fsm->CheckIfHasCardOnCase(eCase); fsm->PostEventFIFO(e); } }; struct RegistCaptureCardInfoTask : public ITaskSp { CCardIssuerFSM* fsm; CSimpleStringA cardno; RegistCaptureCardInfoTask(CCardIssuerFSM* f, CSimpleStringA cardno) : fsm(f),cardno(cardno) {} void Process() { fsm->RegistCardWhileCaptureCard(cardno); } }; struct SyncMaterialCountTask : public ITaskSp { CCardIssuerFSM* fsm; SyncMaterialCountInfo syncInfo; SyncMaterialCountTask(CCardIssuerFSM* f, SyncMaterialCountInfo syncMaterialInfo){ fsm = f; syncInfo = syncMaterialInfo; } void Process() { LOG_FUNCTION(); //同步物料信息 IHttpFunc* client; client = create_http(fsm->HttpsLogCallBack); bool ret = fsm->SyncMaterialCount(client,syncInfo); client->Destory(); } }; #pragma region JS接口 工作线程 //吐卡 struct EjectJSTask : public ITaskSp { CCardIssuerFSM* fsm; SpReqAnsContext::Pointer ctx; EjectJSTask(CCardIssuerFSM* f) : fsm(f) {} void Process() { FSMEvent* e = new FSMEvent(USER_EVT_JS_EJECT_FINISHED); e->param1 = fsm->EjectJS(ctx); fsm->PostEventFIFO(e); } }; //吞卡 struct CaptureJSTask : public ITaskSp { CCardIssuerFSM* fsm; SpReqAnsContext::Pointer ctx; CaptureJSTask(CCardIssuerFSM* f) : fsm(f) {} void Process() { FSMEvent* e = new FSMEvent(USER_EVT_JS_CAPTURE_FINISHED); e->param1 = fsm->CaptureJS(ctx); fsm->PostEventFIFO(e); } }; //联机后处理 struct PostOnlineJSTask : public ITaskSp { CCardIssuerFSM* fsm; SpReqAnsContext::Pointer ctx; PostOnlineJSTask(CCardIssuerFSM* f) : fsm(f) {} void Process() { FSMEvent* e = new FSMEvent(USER_EVT_JS_POSTONLINE_FINISHED); e->param1 = fsm->PostOnlineJS(ctx); fsm->PostEventFIFO(e); } }; //卡箱发卡 struct IssueFromBoxJSTask : public ITaskSp { CCardIssuerFSM* fsm; SpReqAnsContext::Pointer ctx; IssueFromBoxJSTask(CCardIssuerFSM* f) : fsm(f) {} void Process() { FSMEvent* e = new FSMEvent(USER_EVT_JS_ISSUE_FROM_BOX_FINISHED); e->param1 = fsm->IssueFromBoxJS(ctx); fsm->PostEventFIFO(e); } }; //读卡 struct ReadJSTask : public ITaskSp { CCardIssuerFSM* fsm; SpReqAnsContext::Pointer ctx; ReadJSTask(CCardIssuerFSM* f) : fsm(f) {} void Process() { FSMEvent* e = new FSMEvent(USER_EVT_JS_READ_FINISHED); e->param1 = fsm->ReadJS(ctx); fsm->PostEventFIFO(e); } }; struct InsertJSTask : public ITaskSp { CCardIssuerFSM* fsm; SpReqAnsContext::Pointer ctx; InsertJSTask(CCardIssuerFSM* f) : fsm(f) {} void Process() { LOG_FUNCTION(); FSMEvent* e = new FSMEvent(USER_EVT_JS_INSERT_FINISHED); e->param1 = fsm->InsertJS(ctx); fsm->PostEventFIFO(e); } }; #pragma endregion JS接口 工作线程 #endif //__CARD_ISSUER_FSM_H