#include "stdafx.h" #include "SpBase.h" #include "sysvar.h" #include "mod_assistantchannel/AssistantChannel_client_g.h" using namespace AssistantChannel; #include "mod_assistantchannel/chan_protocol.h" #define LOG_EVT_SELFCHECK_ASSISTANTCHANNEL_IDLE 0x50500001 //协助通道重启 class CAgentInterpreterEntity; class CamSwitchChannelClient : public ChannelService_ClientBase { public: CamSwitchChannelClient(CAgentInterpreterEntity *pEntity); virtual void OnMessage(ErrorCodeEnum Error, ChannelService_State_Info &Msg, CSmartPointer pData); virtual void OnMessage(ErrorCodeEnum Error, ChannelService_Packet_Info &Msg, CSmartPointer pData); }; // code:0x906 class CAgentInterpreterEntity : public CEntityBase,public ILogListener { public: CAgentInterpreterEntity() : m_iCurrentOp(ACM_CAMSWITCH_AUTO) {} virtual ~CAgentInterpreterEntity() {} virtual const char *GetEntityName() const { return "AgentInterpreter"; } virtual void OnPreStart(CAutoArray strArgs,CSmartPointer pTransactionContext) { ErrorCodeEnum Error = __OnStart(Error_Succeed); pTransactionContext->SendAnswer(Error); } virtual void OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer pTransactionContext) { ErrorCodeEnum Error = __OnClose(Error_Succeed); pTransactionContext->SendAnswer(Error); } ErrorCodeEnum __OnStart(ErrorCodeEnum preOperationError) { ErrorCodeEnum Error; CSmartPointer pFunc = GetFunction(); int i = 0; m_arrListener.Init(1); pFunc->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_SELFCHECK_ASSISTANTCHANNEL_IDLE,NULL,false); //m_iCurrentOp = ACM_CAMSWITCH_AUTO; ChangeSysvar(ACM_CAMSWITCH_AUTO); // change to auto state anyway when started m_pCamSwitchChannel = new CamSwitchChannelClient(this); Error = m_pCamSwitchChannel->Connect(); if (Error != Error_Succeed) { m_pCamSwitchChannel->SafeDelete(); return Error; } { ChannelService_BeginState_Sub Sub; Error = m_pCamSwitchChannel->BeginState(Sub); if (Error != Error_Succeed) { LOG_TRACE("BeginState biz channel failed!"); m_pCamSwitchChannel->GetFunction()->CloseSession(); m_pCamSwitchChannel = NULL; } } { ChannelService_BeginRecv_Sub Sub; Sub.type = ACM_TYPE_CAMSWITCH; Error = m_pCamSwitchChannel->BeginRecv(Sub); if (Error != Error_Succeed) { m_pCamSwitchChannel->GetFunction()->CloseSession(); m_pCamSwitchChannel = NULL; return Error; } } return Error_Succeed; } virtual void OnLog(const CAutoArray &SubIDs, const CUUID nLogID,const LogTypeEnum eLogType, const SeverityLevelEnum eLevel, const DWORD dwSysError,const DWORD dwUserCode,const DWORD dwEntityInstanceID, const WORD wEntityDevelID, const CAutoArray &Param, const char *pszEntityName, const char *pszModuleName,const char *pszMessage) { if (dwUserCode == LOG_EVT_SELFCHECK_ASSISTANTCHANNEL_IDLE) { Dbg("recv LOG_EVT_SELFCHECK_ASSISTANTCHANNEL_IDLE"); if (m_pCamSwitchChannel!=NULL) { m_pCamSwitchChannel->GetFunction()->CloseSession(); m_pCamSwitchChannel = NULL; Dbg("Close AssistChannel Session "); } if (m_pCamSwitchChannel == NULL) { Dbg("ReConnection AssistChannel Session"); m_pCamSwitchChannel = new CamSwitchChannelClient(this); ErrorCodeEnum Error = m_pCamSwitchChannel->Connect(); if (Error != Error_Succeed) { m_pCamSwitchChannel->SafeDelete(); Dbg("AssistChannelClient connect fail!"); } if (Error == Error_Succeed) { ChannelService_BeginRecv_Sub Sub; Sub.type = ACM_TYPE_CAMSWITCH; Error = m_pCamSwitchChannel->BeginRecv(Sub); if (Error != Error_Succeed) { m_pCamSwitchChannel->GetFunction()->CloseSession(); m_pCamSwitchChannel = NULL; } } if (Error == Error_Succeed) { ChannelService_BeginState_Sub Sub; Error = m_pCamSwitchChannel->BeginState(Sub); if (Error != Error_Succeed) { LOG_TRACE("BeginState biz channel failed!"); m_pCamSwitchChannel->GetFunction()->CloseSession(); m_pCamSwitchChannel = NULL; } } } } } ErrorCodeEnum __OnClose(ErrorCodeEnum preOperationError) { CSmartPointer spFunction = GetFunction(); for (int i = 0; i < m_arrListener.GetCount(); ++i) { spFunction->UnsubscribeLog(m_arrListener[i]); } if (m_pCamSwitchChannel) { m_pCamSwitchChannel->GetFunction()->CloseSession(); m_pCamSwitchChannel = NULL; } return Error_Succeed; } ErrorCodeEnum SwitchCamera(int op) { if (m_iCurrentOp != op) { ChangeSysvar(op); m_iCurrentOp = op; } return Error_Succeed; } void ChangeSessionState(int on) { if (!on) { if (m_iCurrentOp != ACM_CAMSWITCH_AUTO) { ChangeSysvar(ACM_CAMSWITCH_AUTO); m_iCurrentOp = ACM_CAMSWITCH_AUTO; } } } private: ErrorCodeEnum ChangeSysvar(int op) { if (op == ACM_CAMSWITCH_AUTO) { Dbg("agent --> cam switch to auto"); GetFunction()->SetSysVar(SYSVAR_AGENTCAMERASWITCH, AGENTCAMERASWITCH_AUTO); } else if (op == ACM_CAMSWITCH_ENV) { Dbg("agent --> cam switch to env"); GetFunction()->SetSysVar(SYSVAR_AGENTCAMERASWITCH, AGENTCAMERASWITCH_ENV); } else if (op == ACM_CAMSWITCH_OPT) { Dbg("agent --> cam switch to opt"); GetFunction()->SetSysVar(SYSVAR_AGENTCAMERASWITCH, AGENTCAMERASWITCH_OPT); } else { _ASSERT(0); } return Error_Succeed; } private: CamSwitchChannelClient *m_pCamSwitchChannel; int m_iCurrentOp; CAutoArray m_arrListener; }; CamSwitchChannelClient::CamSwitchChannelClient( CAgentInterpreterEntity *pEntity ) : ChannelService_ClientBase(pEntity) { } void CamSwitchChannelClient::OnMessage(ErrorCodeEnum Error, ChannelService_State_Info &Msg, CSmartPointer pData) { if (Error == Error_Succeed) { CAgentInterpreterEntity *pEntity = static_cast(m_pEntityBase); if (Msg.state == eChannelState_Idle) { pEntity->ChangeSessionState(0); } else if (Msg.state == eChannelState_Connected) { pEntity->ChangeSessionState(1); } } } void CamSwitchChannelClient::OnMessage( ErrorCodeEnum Error, ChannelService_Packet_Info &Msg, CSmartPointer pData ) { LOG_FUNCTION(); if (Error == Error_Succeed) { CAgentInterpreterEntity *pEntity = static_cast(m_pEntityBase); pEntity->SwitchCamera(Msg.sub_type); } } SP_BEGIN_ENTITY_MAP() SP_ENTITY(CAgentInterpreterEntity) SP_END_ENTITY_MAP()