mod_agentip.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. #include "stdafx.h"
  2. #include "SpBase.h"
  3. #include "sysvar.h"
  4. #include "mod_assistantchannel/AssistantChannel_client_g.h"
  5. using namespace AssistantChannel;
  6. #include "mod_assistantchannel/chan_protocol.h"
  7. #include "../include/EventCode.h"
  8. class CAgentInterpreterEntity;
  9. class CamSwitchChannelClient : public ChannelService_ClientBase
  10. {
  11. public:
  12. CamSwitchChannelClient(CAgentInterpreterEntity *pEntity);
  13. virtual void OnMessage(ErrorCodeEnum Error, ChannelService_State_Info &Msg, CSmartPointer<IReleasable> pData);
  14. virtual void OnMessage(ErrorCodeEnum Error, ChannelService_Packet_Info &Msg, CSmartPointer<IReleasable> pData);
  15. };
  16. // code:0x906
  17. class CAgentInterpreterEntity : public CEntityBase, public ILogListener, public ITimerListener
  18. {
  19. public:
  20. CAgentInterpreterEntity() : m_iCurrentOp(ACM_CAMSWITCH_AUTO), m_bConnectAssist(false), m_pCamSwitchChannel(NULL) {}
  21. virtual ~CAgentInterpreterEntity() {}
  22. virtual const char *GetEntityName() const { return "AgentInterpreter"; }
  23. virtual void OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPointer<ITransactionContext> pTransactionContext)
  24. {
  25. ErrorCodeEnum Error = __OnStart(Error_Succeed);
  26. pTransactionContext->SendAnswer(Error);
  27. }
  28. virtual void OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer<ITransactionContext> pTransactionContext)
  29. {
  30. ErrorCodeEnum Error = __OnClose(Error_Succeed);
  31. pTransactionContext->SendAnswer(Error);
  32. }
  33. ErrorCodeEnum __OnStart(ErrorCodeEnum preOperationError)
  34. {
  35. CSmartPointer<IEntityFunction> pFunc = GetFunction();
  36. int i = 0;
  37. m_arrListener.Init(1);
  38. pFunc->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_MOD_ASSISCHAN_STARTED_SUCCESS,NULL,false);
  39. //m_iCurrentOp = ACM_CAMSWITCH_AUTO;
  40. ChangeSysvar(ACM_CAMSWITCH_AUTO); // change to auto state anyway when started
  41. return Error_Succeed;
  42. }
  43. void OnStarted()
  44. {
  45. m_pCamSwitchChannel = new CamSwitchChannelClient(this);
  46. if (Error_Succeed == ConnectAssistChannel()) {
  47. m_bConnectAssist = true;
  48. }
  49. else {
  50. GetFunction()->SetTimer(1, this, 3150);
  51. }
  52. }
  53. virtual void OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogID,const LogTypeEnum eLogType, const SeverityLevelEnum eLevel,
  54. const DWORD dwSysError,const DWORD dwUserCode,const DWORD dwEntityInstanceID, const WORD wEntityDevelID,
  55. const CAutoArray<DWORD> &Param, const char *pszEntityName, const char *pszModuleName,const char *pszMessage, const linkContext &pLinkInfo)
  56. {
  57. if (dwUserCode == LOG_EVT_MOD_ASSISCHAN_STARTED_SUCCESS)
  58. {
  59. Sleep(959);
  60. if (m_pCamSwitchChannel != NULL){
  61. m_pCamSwitchChannel->GetFunction()->CloseSession();
  62. m_pCamSwitchChannel = NULL;
  63. m_bConnectAssist = false;
  64. }
  65. if (Error_Succeed == ConnectAssistChannel()) {
  66. m_bConnectAssist = true;
  67. }
  68. else {
  69. GetFunction()->SetTimer(1, this, 3150);
  70. }
  71. }
  72. }
  73. ErrorCodeEnum __OnClose(ErrorCodeEnum preOperationError)
  74. {
  75. CSmartPointer<IEntityFunction> spFunction = GetFunction();
  76. for (int i = 0; i < m_arrListener.GetCount(); ++i)
  77. {
  78. spFunction->UnsubscribeLog(m_arrListener[i]);
  79. }
  80. if (m_pCamSwitchChannel) {
  81. m_pCamSwitchChannel->GetFunction()->CloseSession();
  82. m_pCamSwitchChannel = NULL;
  83. }
  84. return Error_Succeed;
  85. }
  86. ErrorCodeEnum SwitchCamera(int op)
  87. {
  88. if (m_iCurrentOp != op) {
  89. ChangeSysvar(op);
  90. m_iCurrentOp = op;
  91. }
  92. return Error_Succeed;
  93. }
  94. void ChangeSessionState(int on)
  95. {
  96. if (!on) {
  97. if (m_iCurrentOp != ACM_CAMSWITCH_AUTO) {
  98. ChangeSysvar(ACM_CAMSWITCH_AUTO);
  99. m_iCurrentOp = ACM_CAMSWITCH_AUTO;
  100. }
  101. }
  102. }
  103. private:
  104. ErrorCodeEnum ChangeSysvar(int op)
  105. {
  106. if (op == ACM_CAMSWITCH_AUTO) {
  107. GetFunction()->SetSysVar(SYSVAR_AGENTCAMERASWITCH, AGENTCAMERASWITCH_AUTO);
  108. }
  109. else if (op == ACM_CAMSWITCH_ENV) {
  110. GetFunction()->SetSysVar(SYSVAR_AGENTCAMERASWITCH, AGENTCAMERASWITCH_ENV);
  111. }
  112. else if (op == ACM_CAMSWITCH_OPT) {
  113. GetFunction()->SetSysVar(SYSVAR_AGENTCAMERASWITCH, AGENTCAMERASWITCH_OPT);
  114. }
  115. else {
  116. _ASSERT(0);
  117. }
  118. return Error_Succeed;
  119. }
  120. ErrorCodeEnum ConnectAssistChannel()
  121. {
  122. if (m_pCamSwitchChannel == NULL){
  123. m_pCamSwitchChannel = new CamSwitchChannelClient(this);
  124. }
  125. ErrorCodeEnum Error = m_pCamSwitchChannel->Connect();
  126. if (Error != Error_Succeed){
  127. m_pCamSwitchChannel = NULL;
  128. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("AssistChannelClient connect failed!");
  129. return Error;
  130. }
  131. if (Error == Error_Succeed)
  132. {
  133. ChannelService_BeginRecv_Sub Sub;
  134. Sub.type = ACM_TYPE_CAMSWITCH;
  135. Error = (*m_pCamSwitchChannel)(EntityResource::getLink().upgradeLink())->BeginRecv(Sub);
  136. if (Error != Error_Succeed) {
  137. m_pCamSwitchChannel->GetFunction()->CloseSession();
  138. m_pCamSwitchChannel = NULL;
  139. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Register ACM_TYPE_CAMSWITCH failed!");
  140. return Error;
  141. }
  142. }
  143. if (Error == Error_Succeed)
  144. {
  145. ChannelService_BeginState_Sub Sub;
  146. Error = (*m_pCamSwitchChannel)(EntityResource::getLink().upgradeLink())->BeginState(Sub);
  147. if (Error != Error_Succeed) {
  148. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("BeginState biz channel failed!");
  149. m_pCamSwitchChannel->GetFunction()->CloseSession();
  150. m_pCamSwitchChannel = NULL;
  151. return Error;
  152. }
  153. }
  154. return Error;
  155. }
  156. void OnTimeout(DWORD dwTimerID)
  157. {
  158. if (1 == dwTimerID)
  159. {
  160. if (!m_bConnectAssist) {
  161. if (Error_Succeed == ConnectAssistChannel()) {
  162. m_bConnectAssist = true;
  163. }
  164. }
  165. if (m_bConnectAssist) {
  166. GetFunction()->KillTimer(1);
  167. }
  168. }
  169. }
  170. private:
  171. CamSwitchChannelClient *m_pCamSwitchChannel;
  172. int m_iCurrentOp;
  173. CAutoArray<CUUID> m_arrListener;
  174. bool m_bConnectAssist;
  175. };
  176. CamSwitchChannelClient::CamSwitchChannelClient( CAgentInterpreterEntity *pEntity ) : ChannelService_ClientBase(pEntity)
  177. {
  178. }
  179. void CamSwitchChannelClient::OnMessage(ErrorCodeEnum Error, ChannelService_State_Info &Msg, CSmartPointer<IReleasable> pData)
  180. {
  181. if (Error == Error_Succeed) {
  182. CAgentInterpreterEntity *pEntity = static_cast<CAgentInterpreterEntity*>(m_pEntityBase);
  183. if (Msg.state == eChannelState_Idle) {
  184. pEntity->ChangeSessionState(0);
  185. } else if (Msg.state == eChannelState_Connected) {
  186. pEntity->ChangeSessionState(1);
  187. }
  188. }
  189. }
  190. void CamSwitchChannelClient::OnMessage( ErrorCodeEnum Error, ChannelService_Packet_Info &Msg, CSmartPointer<IReleasable> pData )
  191. {
  192. if (Error == Error_Succeed) {
  193. CAgentInterpreterEntity *pEntity = static_cast<CAgentInterpreterEntity*>(m_pEntityBase);
  194. pEntity->SwitchCamera(Msg.sub_type);
  195. }
  196. }
  197. SP_BEGIN_ENTITY_MAP()
  198. SP_ENTITY(CAgentInterpreterEntity)
  199. SP_END_ENTITY_MAP()