00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef INTERFACE_CONTROL_RT_COMPONENT_MODEL_CLASS
00011 #define INTERFACE_CONTROL_RT_COMPONENT_MODEL_CLASS
00012
00013 #include <iostream>
00014 #include <string>
00015 #include <rtm/CorbaNaming.h>
00016 #include <rtm/RTObject.h>
00017 #include <assert.h>
00018
00020
00024 class ORBvarManager
00025 {
00026 private:
00027 bool m_delete;
00028 static long s_exist_cnt;
00029
00030 public:
00031 static CORBA::ORB_var s_orb;
00032
00033 ORBvarManager(bool idelete = false)
00034 :m_delete(idelete)
00035 {
00036 if(s_exist_cnt == 0)ORBInit();
00037 s_exist_cnt++;
00038 };
00040 virtual ~ORBvarManager();
00041
00043 void static ORBInit()
00044 {
00045 if(s_exist_cnt > 0)return;
00046 int argc(0);
00047 char** argv(0);
00048 s_orb = CORBA::ORB_init(argc, argv);
00049 };
00051 void static ORBdestroy()
00052 {
00053 if(s_exist_cnt != 0)return;
00054 std::cout << __FUNCTION__ << std::endl;
00055 s_orb->destroy();
00056 };
00057 };
00058 CORBA::ORB_var ORBvarManager::s_orb;
00059 long ORBvarManager::s_exist_cnt(0);
00060
00061 ORBvarManager::~ORBvarManager()
00062 {
00063 s_exist_cnt--;
00064 if(s_exist_cnt == 0 && m_delete)ORBdestroy();
00065 }
00066
00067
00069 class RTCompControl : public ORBvarManager
00070 {
00071 public:
00073 RTCompControl(std::string OmniNameServerName,long port = -1)
00074 :ORBvarManager(),m_nameserver(s_orb,NameAndPort2str(OmniNameServerName,port).c_str())
00075 {
00076 };
00077
00079 RTCompControl(const RTCompControl& src)
00080 :ORBvarManager(),m_nameserver(src.m_nameserver),m_con(src.m_con),m_eclist(src.m_eclist)
00081 {
00082 };
00083
00085 virtual ~RTCompControl()
00086 {
00087 };
00088
00090 void SetRTComponent(std::string ComponentName)
00091 {
00092 m_con.setObject(m_nameserver.resolve(ComponentName.c_str()));
00093 m_eclist = m_con->get_execution_context_services();
00094 };
00095
00097 void Activate()
00098 {
00099 m_eclist[0]->activate_component(RTC::RTObject::_duplicate(m_con._ptr()));
00100 };
00101
00103 void Deactivate()
00104 {
00105 m_eclist[0]->deactivate_component(RTC::RTObject::_duplicate(m_con._ptr()));
00106 };
00107
00109 void Reset()
00110 {
00111 m_eclist[0]->reset_component(RTC::RTObject::_duplicate(m_con._ptr()));
00112 };
00113
00115 void SetNameServer(std::string OmniNameServerName, long OmniPort = -1)
00116 {
00117 m_nameserver.init(NameAndPort2str( OmniNameServerName, OmniPort).c_str());
00118 };
00119
00121 RTCompControl& operator=(const RTCompControl& right)
00122 {
00123 m_nameserver = right.m_nameserver;
00124 m_con = right.m_con;
00125 m_eclist = right.m_eclist;
00126 return *this;
00127 };
00128
00129 protected:
00130 RTC::CorbaNaming m_nameserver;
00131 RTC::CorbaConsumer<RTC::RTObject> m_con;
00132 RTC::ExecutionContextServiceList_var m_eclist;
00133
00135
00140 std::string NameAndPort2str(std::string name, long port)
00141 {
00142 if(port!=-1)
00143 {
00144 char PortStr[6];
00145 sprintf(PortStr,":%ld",port);
00146 name += PortStr;
00147 }
00148 return name;
00149 };
00150 };
00151
00152 #endif