#include "CardIssuerStand_server_g.h" #include "CardIssuerStand_def_g.h" #include "CardIssuerStandFSM.h" #include "DevEntityCommBase.hpp" using namespace CardIssuerStand; class CCardIssuerEntity; class CardIssuerServerSession : public CardIssuerStandService_ServerSessionBase { public: CardIssuerServerSession(CCardIssuerEntity* pEntity):m_pEntity(pEntity){} virtual ~CardIssuerServerSession(){} virtual void Handle_Insert(SpReqAnsContext::Pointer ctx); virtual void Handle_Read(SpReqAnsContext::Pointer ctx); virtual void Handle_Capture(SpReqAnsContext::Pointer ctx); virtual void Handle_Eject(SpReqAnsContext::Pointer ctx); virtual void Handle_CancelInsert(SpOnewayCallContext::Pointer ctx); virtual void Handle_InsertWaitMore(SpOnewayCallContext::Pointer ctx); virtual void Handle_PreOnline(SpReqAnsContext::Pointer ctx); virtual void Handle_PostOnline(SpReqAnsContext::Pointer ctx); virtual void Handle_Exit(SpOnewayCallContext::Pointer ctx); virtual void Handle_QueryCardInfo(SpReqAnsContext::Pointer ctx); virtual void Handle_GetMaterialCountEx(SpReqAnsContext::Pointer ctx); virtual void Handle_SetMaterialCountEx(SpReqAnsContext::Pointer ctx); virtual void Handle_SetSomeFlag(SpReqAnsContext::Pointer ctx); virtual void Handle_IssueEx(SpReqAnsContext::Pointer ctx); virtual void Handle_QueryCIStatus(SpReqAnsContext::Pointer ctx); virtual void Handle_GetDevInfo(SpReqAnsContext::Pointer ctx); //JS接口定义 virtual void Handle_ReadJS(SpReqAnsContext::Pointer ctx); virtual void Handle_PostOnlineJS(SpReqAnsContext::Pointer ctx); virtual void Handle_EjectJS(SpReqAnsContext::Pointer ctx); virtual void Handle_CaptureJS(SpReqAnsContext::Pointer ctx); virtual void Handle_QueryHasCardJS(SpReqAnsContext::Pointer ctx); virtual void Handle_IssueFromBoxJS(SpReqAnsContext::Pointer ctx); virtual void Handle_InsertJS(SpReqAnsContext::Pointer ctx); virtual void Handle_CancelInsertJS(SpOnewayCallContext::Pointer ctx); private: CCardIssuerEntity* m_pEntity; }; class CCardIssuerEntity : public CDevAdptEntityBase, public ISysVarListener { public: CCardIssuerEntity() :bInitialized(false) { } virtual ~CCardIssuerEntity(){} virtual const char *GetEntityName() const { return "CardIssuerStand"; } virtual void OnPreStart(CAutoArray strArgs,CSmartPointer pTransactionContext) { LOG_FUNCTION(); ErrorCodeEnum eStart = m_fsm.Init(this); if (eStart == Error_Succeed) { } GetFunction()->RegistSysVarEvent("UIState", this); pTransactionContext->SendAnswer(eStart); } virtual void OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer pTransactionContext) { ErrorCodeEnum Error = __OnStart(Error_Succeed); pTransactionContext->SendAnswer(Error); } virtual void OnPrePause(CSmartPointer pTransactionContext) { ErrorCodeEnum Error = __OnPause(Error_Succeed,pTransactionContext); pTransactionContext->SendAnswer(Error); } virtual ErrorCodeEnum __OnStart(ErrorCodeEnum preOperationError) { return Error_Succeed; } virtual ErrorCodeEnum __OnPause(ErrorCodeEnum preOperationError, CSmartPointer pTransactionContext) { return Error_Succeed; } virtual ErrorCodeEnum __OnClose(ErrorCodeEnum preOperationError) { return Error_Succeed; } virtual void OnSelfTest(EntityTestEnum eTestType,CSmartPointer pTransactionContext) { m_fsm.SelfTest(eTestType,pTransactionContext); } virtual CServerSessionBase* OnNewSession(const char*,const char*) { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("A new connecting request arrived."); m_bNewSessionInit = true; return new CardIssuerServerSession(this); } void Insert(SpReqAnsContext::Pointer ctx) { LOG_FUNCTION(); if(!m_fsm.GetDevInitFlag()){ ctx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_DevOpen_Failed); }else{ m_bNewSessionInit = false; m_fsm.SetExitFlag(false); CardAcceptEvent *e = new CardAcceptEvent(); e->ctx = ctx; m_fsm.PostEventFIFO(e); } } void Read(SpReqAnsContext::Pointer ctx) { LOG_FUNCTION(); CardReadEvent* e = new CardReadEvent(); e->ctx = ctx; m_fsm.PostEventFIFO(e); } void Capture(SpReqAnsContext::Pointer ctx) { LOG_FUNCTION(); CardCaptureEvent* e = new CardCaptureEvent(); e->ctx = ctx; m_fsm.PostEventFIFO(e); } void Eject(SpReqAnsContext::Pointer ctx) { LOG_FUNCTION(); CardEjectEvent* e = new CardEjectEvent(); e->ctx = ctx; m_fsm.PostEventFIFO(e); } void CancelInsert(SpOnewayCallContext::Pointer ctx) { LOG_FUNCTION(); CancelAcceptEvent *e = new CancelAcceptEvent(); m_fsm.PostEventFIFO(e); } void InsertWaitMore(SpOnewayCallContext::Pointer ctx) { LOG_FUNCTION(); if (m_fsm.GetWaitFlag()) m_fsm.SetWaitMore(); } void PreOnline(SpReqAnsContext::Pointer ctx) { LOG_FUNCTION(); if (!m_fsm.GetDevInitFlag()) { ctx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_DevOpen_Failed); } else { PreOnlineEvent* e = new PreOnlineEvent(); e->ctx = ctx; m_fsm.PostEventFIFO(e); } } void PostOnline(SpReqAnsContext::Pointer ctx) { LOG_FUNCTION(); PostOnlineEvent* e = new PostOnlineEvent(); e->ctx = ctx; m_fsm.PostEventFIFO(e); } void Exit(SpOnewayCallContext::Pointer ctx) { LOG_FUNCTION(); m_bNewSessionInit = false; FSMEvent *evt = new FSMEvent(USER_EVT_EXIT); m_fsm.PostEventFIFO(evt); } void QueryCardInfo(SpReqAnsContext::Pointer ctx) { if (m_fsm.GetDevInitingFlag()) { ctx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_DeviceOpening); return; }else if (!m_fsm.GetDevInitFlag()) { ctx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_DevOpen_Failed); return; } if (m_bNewSessionInit) { FSMEvent *pEvt = new FSMEvent(USER_EVT_EXIT); m_fsm.PostEventFIFO(pEvt); ctx->Ans.position = CI_MEDIA_NOTPRESENT; ctx->Answer(Error_Succeed); } else { int ret = m_fsm.QueryCardPos(); if (ret != 1)//query hardware ok ctx->Ans.position = ret; else { if (_stricmp(m_fsm.GetCurrStateName(), "Hold") == 0) ctx->Ans.position = 2; else ctx->Ans.position = 0; } ctx->Answer(Error_Succeed); } } void GetMaterialCountEx(SpReqAnsContext::Pointer ctx) { m_bNewSessionInit = false; GetMaterialExEvent *pEvt = new GetMaterialExEvent(); pEvt->ctx = ctx; m_fsm.PostEventFIFO(pEvt); } void SetMaterialCountEx(SpReqAnsContext::Pointer ctx) { m_bNewSessionInit = false; SetMaterialExEvent *pEvt = new SetMaterialExEvent(); pEvt->ctx = ctx; m_fsm.PostEventFIFO(pEvt); } void SetSomeFlag(SpReqAnsContext::Pointer ctx) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("set issue flag to %d", ctx->Req.IssueBusiness); if (ctx->Req.IssueBusiness == 1) m_fsm.FSMSetIssueFlag(1); else if (ctx->Req.IssueBusiness == 0) m_fsm.FSMSetIssueFlag(0); else if (ctx->Req.IssueBusiness == 2)//oilyang@20170621 query issue direction { ctx->Ans.reserved1.Init(1); ctx->Ans.reserved1[0] = (m_fsm.QueryIssueFlag() ? 0 : 1);//according to yzx DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("issue direction:%d",ctx->Ans.reserved1[0]);//if 0 capture card eles eject card } else if (ctx->Req.IssueBusiness == 3)//oilyang@20181210 { m_fsm.SetCancelByRFICFlag(); } else if (ctx->Req.IssueBusiness == 4)//oilyang@20181220 get ic card account,for simple/lazy... { ctx->Ans.reserved2.Init(1); ctx->Ans.reserved2[0] = m_fsm.GetPreOnlineICCardNo(); DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("GetPreOnlineICCardNo:%d", ctx->Ans.reserved2[0].GetLength()); } if (ctx->Req.reserved1.GetCount() > 0) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("set hopper num:%d",ctx->Req.reserved1[0]); if (ctx->Req.reserved1[0] == 1) m_fsm.SetHopperNum(1); else if (ctx->Req.reserved1[0] == 3) m_fsm.SetHopperNum(3); } ctx->Answer(Error_Succeed); } void IssueEx(SpReqAnsContext::Pointer ctx) { LOG_FUNCTION(); if (!m_fsm.GetDevInitFlag()) { ctx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_DevOpen_Failed); } else { m_bNewSessionInit = false; CardIssueExEvent* pEvt = new CardIssueExEvent(); pEvt->ctx = ctx; m_fsm.PostEventFIFO(pEvt); } } void GetDevInfo(SpReqAnsContext::Pointer ctx) { LOG_FUNCTION(); ctx->Ans.state = m_fsm.GetDevState(); if (m_fsm.GetDevInitingFlag()) { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("GetDevInfo device is opening,state return 0"); ctx->Ans.state = DEVICE_STATUS_NOT_READY; ctx->Answer(Error_NotInit, CardIssuer_UserErrorCode_DeviceOpening); } else { //设备未正常打开时,直接报state=0; if (!m_fsm.GetDevInitFlag()) { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("GetDevInfo device is not open,state return 0"); ctx->Ans.state = DEVICE_STATUS_NOT_READY; ctx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_DevOpen_Failed); } else { if (ctx->Ans.state != DEVICE_STATUS_NORMAL) { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("GetDevInfo state=%d", ctx->Ans.state); } ctx->Answer(Error_Succeed); } } } void QueryCIStatus(SpReqAnsContext::Pointer ctx) { m_fsm.QueryCIStatus(ctx); } virtual void OnSysVarEvent(const char* pszKey, const char* pszValue, const char* pszOldValue, const char* pszEntityName); virtual bool IsService()const{return true;} virtual bool IsMultiThread()const{return true;} //JS接口实现 void ReadJS(SpReqAnsContext::Pointer ctx) { LOG_FUNCTION(); if (!m_fsm.GetDevInitFlag()) ctx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_DevOpen_Failed); else { ReadJSEvent* pEvt = new ReadJSEvent(); pEvt->ctx = ctx; m_fsm.PostEventFIFO(pEvt); } } void PostOnlineJS(SpReqAnsContext::Pointer ctx) { LOG_FUNCTION(); if (!m_fsm.GetDevInitFlag()) ctx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_DevOpen_Failed); else { PostOnlineJSEvent* pEvt = new PostOnlineJSEvent(); pEvt->ctx = ctx; m_fsm.PostEventFIFO(pEvt); } } void EjectJS(SpReqAnsContext::Pointer ctx) { LOG_FUNCTION(); if (!m_fsm.GetDevInitFlag()) ctx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_DevOpen_Failed); else { EjectJSEvent* e = new EjectJSEvent(); e->ctx = ctx; m_fsm.PostEventFIFO(e); } } void CaptureJS(SpReqAnsContext::Pointer ctx) { LOG_FUNCTION(); if (!m_fsm.GetDevInitFlag()) ctx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_DevOpen_Failed); else { CaptureJSEvent* e = new CaptureJSEvent(); e->ctx = ctx; m_fsm.PostEventFIFO(e); } } void QueryHasCardJS(SpReqAnsContext::Pointer ctx) { LOG_FUNCTION(); if (!m_fsm.GetDevInitFlag()) ctx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_DevOpen_Failed); else m_fsm.QueryHasCardJS(ctx); } void IssueFromBoxJS(SpReqAnsContext::Pointer ctx) { LOG_FUNCTION(); if (!m_fsm.GetDevInitFlag()) ctx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_DevOpen_Failed); else { IssueFromBoxJSEvent* pEvt = new IssueFromBoxJSEvent(); pEvt->ctx = ctx; m_fsm.PostEventFIFO(pEvt); } } void InsertJS(SpReqAnsContext::Pointer ctx) { LOG_FUNCTION(); if (!m_fsm.GetDevInitFlag()) ctx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_DevOpen_Failed); else { InsertJSEvent* pEvt = new InsertJSEvent(); pEvt->ctx = ctx; m_fsm.PostEventFIFO(pEvt); } } void CancelInsertJS(SpOnewayCallContext::Pointer ctx) { LOG_FUNCTION(); CancelInsertJSEvent* evt = new CancelInsertJSEvent(); m_fsm.PostEventFIFO(evt); } protected: private: CCardIssuerFSM m_fsm; bool bInitialized,m_bNewSessionInit; };