[openrtm-commit:03100] r3184 - branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm
openrtm @ openrtm.org
openrtm @ openrtm.org
2018年 1月 23日 (火) 09:15:43 JST
Author: miyamoto
Date: 2018-01-23 09:15:43 +0900 (Tue, 23 Jan 2018)
New Revision: 3184
Modified:
branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/FactoryInit.cpp
branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/InPort.h
branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/InPortBase.cpp
branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/InPortBase.h
branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/InPortConnector.cpp
branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/InPortConnector.h
branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/OutPort.h
branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/OutPortBase.cpp
branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/OutPortBase.h
branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/OutPortConnector.cpp
branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/OutPortConnector.h
Log:
[incompat,->RELENG_1_2] refs #4428
Modified: branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/FactoryInit.cpp
===================================================================
--- branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/FactoryInit.cpp 2018-01-22 23:46:55 UTC (rev 3183)
+++ branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/FactoryInit.cpp 2018-01-23 00:15:43 UTC (rev 3184)
@@ -37,6 +37,8 @@
#include <rtm/OutPortCorbaCdrProvider.h>
#include <rtm/InPortDirectProvider.h>
#include <rtm/InPortDirectConsumer.h>
+#include <rtm/OutPortDirectProvider.h>
+#include <rtm/OutPortDirectConsumer.h>
#include <rtm/InPortSHMProvider.h>
#include <rtm/InPortSHMConsumer.h>
#include <rtm/OutPortSHMProvider.h>
@@ -70,6 +72,8 @@
OutPortCorbaCdrProviderInit();
InPortDirectProviderInit();
InPortDirectConsumerInit();
+ OutPortDirectProviderInit();
+ OutPortDirectConsumerInit();
InPortSHMProviderInit();
InPortSHMConsumerInit();
OutPortSHMProviderInit();
Modified: branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/InPort.h
===================================================================
--- branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/InPort.h 2018-01-22 23:46:55 UTC (rev 3183)
+++ branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/InPort.h 2018-01-23 00:15:43 UTC (rev 3184)
@@ -435,35 +435,47 @@
return false;
}
- // In single-buffer mode, all connectors share the same buffer. This
- // means that we only need to read from the first connector to get data
- // received by any connector.
- ret = m_connectors[0]->read(cdr);
- m_status[0] = ret;
+
}
- if (ret == PORT_OK)
- {
- Guard guard(m_valueMutex);
- RTC_DEBUG(("data read succeeded"));
- m_value <<= cdr;
- if (m_OnReadConvert != 0)
- {
- m_value = (*m_OnReadConvert)(m_value);
- RTC_DEBUG(("OnReadConvert called"));
- return true;
- }
- return true;
- }
- else if (ret == BUFFER_EMPTY)
- {
- RTC_WARN(("buffer empty"));
- return false;
- }
- else if (ret == BUFFER_TIMEOUT)
- {
- RTC_WARN(("buffer read timeout"));
- return false;
- }
+
+ if (!m_connectors[0]->getDirectData(m_value))
+ {
+ {
+ Guard guard(m_connectorsMutex);
+ // In single-buffer mode, all connectors share the same buffer. This
+ // means that we only need to read from the first connector to get data
+ // received by any connector.
+ ret = m_connectors[0]->read(cdr);
+ }
+ m_status[0] = ret;
+ if (ret == PORT_OK)
+ {
+ Guard guard(m_valueMutex);
+ RTC_DEBUG(("data read succeeded"));
+ m_value <<= cdr;
+ if (m_OnReadConvert != 0)
+ {
+ m_value = (*m_OnReadConvert)(m_value);
+ RTC_DEBUG(("OnReadConvert called"));
+ return true;
+ }
+ return true;
+ }
+ else if (ret == BUFFER_EMPTY)
+ {
+ RTC_WARN(("buffer empty"));
+ return false;
+ }
+ else if (ret == BUFFER_TIMEOUT)
+ {
+ RTC_WARN(("buffer read timeout"));
+ return false;
+ }
+ }
+ else
+ {
+ return true;
+ }
RTC_ERROR(("unknown retern value from buffer.read()"));
return false;
}
Modified: branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/InPortBase.cpp
===================================================================
--- branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/InPortBase.cpp 2018-01-22 23:46:55 UTC (rev 3183)
+++ branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/InPortBase.cpp 2018-01-23 00:15:43 UTC (rev 3184)
@@ -1015,6 +1015,25 @@
// endian type set
connector->setEndian(m_littleEndian);
+
+
+ if (coil::normalize(prop["interface_type"]) == "direct")
+ {
+ OutPortBase* outport = getLocalOutPort(profile);
+ if (outport == NULL)
+ {
+ RTC_DEBUG(("interface_type is direct, "
+ "but a peer InPort servant could not be obtained."));
+ delete connector;
+ return 0;
+ }
+
+
+ connector->setOutPort(outport);
+
+
+ }
+
m_connectors.push_back(connector);
RTC_PARANOID(("connector push backed: %d", m_connectors.size()));
return connector;
@@ -1033,6 +1052,43 @@
return m_listeners;
}
+ /*!
+ * @if jp
+ * @brief ¥í¡¼¥«¥ë¤Î¥Ô¥¢OutPort¤ò¼èÆÀ
+ * @else
+ * @brief Getting local peer OutPort if available
+ * @endif
+ */
+ OutPortBase*
+ InPortBase::getLocalOutPort(const ConnectorInfo& profile)
+ {
+ RTC_DEBUG(("Trying direct port connection."));
+ CORBA::ORB_var orb = ::RTC::Manager::instance().getORB();
+ RTC_DEBUG(("Current connector profile: name=%s, id=%s",
+ profile.name.c_str(), profile.id.c_str()));
+ // finding peer port object
+ for (size_t i = 0; i < profile.ports.size(); ++i)
+ {
+ CORBA::Object_var obj;
+ obj = orb->string_to_object(profile.ports[i].c_str());
+ if (getPortRef()->_is_equivalent(obj)) { continue; }
+ RTC_DEBUG(("Peer port found: %s.", profile.ports[i].c_str()));
+ try
+ {
+ PortableServer::POA_var poa = ::RTC::Manager::instance().getPOA();
+ OutPortBase* outport = dynamic_cast<OutPortBase*>
+ (poa->reference_to_servant(obj));
+ RTC_DEBUG(("OutPortBase servant pointer is obtained."));
+ return outport;
+ }
+ catch (...)
+ {
+ RTC_DEBUG(("Peer port might be a remote port"));
+ }
+ }
+ return NULL;
+ }
+
ReturnCode_t InPortBase::notify_connect(ConnectorProfile& connector_profile)
throw (CORBA::SystemException)
{
Modified: branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/InPortBase.h
===================================================================
--- branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/InPortBase.h 2018-01-22 23:46:55 UTC (rev 3183)
+++ branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/InPortBase.h 2018-01-23 00:15:43 UTC (rev 3184)
@@ -24,6 +24,7 @@
#include <rtm/DataPortStatus.h>
#include <rtm/CdrBufferBase.h>
#include <rtm/ConnectorListener.h>
+#include <rtm/OutPortBase.h>
#ifdef WIN32
#pragma warning( push )
@@ -821,6 +822,14 @@
createConnector(const ConnectorProfile& cprof, coil::Properties& prop,
OutPortConsumer* consumer);
protected:
+ /*!
+ * @if jp
+ * @brief ¥í¡¼¥«¥ë¤Î¥Ô¥¢OutPort¤ò¼èÆÀ
+ * @else
+ * @brief Getting local peer OutPort if available
+ * @endif
+ */
+ OutPortBase* getLocalOutPort(const ConnectorInfo& profile);
/*!
* @if jp
* @brief ¥Ð¥Ã¥Õ¥¡¥â¡¼¥É
Modified: branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/InPortConnector.cpp
===================================================================
--- branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/InPortConnector.cpp 2018-01-22 23:46:55 UTC (rev 3183)
+++ branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/InPortConnector.cpp 2018-01-23 00:15:43 UTC (rev 3184)
@@ -18,6 +18,7 @@
*/
#include <rtm/InPortConnector.h>
+#include <rtm/OutPort.h>
namespace RTC
{
@@ -32,7 +33,7 @@
ConnectorListeners& listeners,
CdrBufferBase* buffer)
: rtclog("InPortConnector"), m_profile(info),
- m_listeners(listeners), m_buffer(buffer), m_littleEndian(true)
+ m_listeners(listeners), m_buffer(buffer), m_littleEndian(true), m_directOutPort(NULL), m_outPortListeners(NULL)
{
}
@@ -153,4 +154,19 @@
return m_littleEndian;
}
+ bool InPortConnector::setOutPort(OutPortBase* directOutPort)
+ {
+ {
+ if (directOutPort == NULL)
+ {
+ return false;
+ }
+ m_directOutPort = directOutPort;
+
+ m_outPortListeners = &(m_directOutPort->getListeners());
+ m_directOutPort->getListeners();
+ return true;
+ }
+ };
+
}; // namespace RTC
Modified: branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/InPortConnector.h
===================================================================
--- branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/InPortConnector.h 2018-01-22 23:46:55 UTC (rev 3183)
+++ branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/InPortConnector.h 2018-01-23 00:15:43 UTC (rev 3184)
@@ -23,8 +23,10 @@
#include <rtm/ConnectorListener.h>
#include <rtm/ConnectorBase.h>
+
namespace RTC
{
+ class OutPortBase;
/*!
* @if jp
* @class InPortConnector
@@ -232,6 +234,66 @@
*/
virtual bool isLittleEndian();
+
+ /*!
+ * @if jp
+ * @brief ¥Ç¡¼¥¿¤ò¥À¥¤¥ì¥¯¥È¤Ë½ñ¤¹þ¤à¤¿¤á¤ÎOutPort¤Î¥µ¡¼¥Ð¥ó¥È¤òÀßÄꤹ¤ë
+ *
+ * @param directOutPort OutPort¤Î¥µ¡¼¥Ð¥ó¥È
+ *
+ * @return True: ÀßÄê¤ËÀ®¸ù False: ´û¤ËÀßÄêºÑ¤ß¤Î¤¿¤á¼ºÇÔ
+ *
+ * @else
+ * @brief
+ *
+ * @param directOutPort
+ *
+ * @return true: little endian, false: big endian
+ *
+ * @endif
+ */
+ bool setOutPort(OutPortBase* directOutPort);
+
+ template <typename DataType>
+ bool getDirectData(DataType &data)
+ {
+ if (m_directOutPort == NULL)
+ {
+ return false;
+ }
+ OutPort<DataType>* outport;
+ outport = static_cast<OutPort<DataType>*>(m_directOutPort);
+
+
+ if (outport->isEmpty())
+ {
+ m_listeners.
+ connector_[ON_BUFFER_EMPTY].notify(m_profile);
+ m_outPortListeners->
+ connector_[ON_SENDER_EMPTY].notify(m_profile);
+ RTC_PARANOID(("ON_BUFFER_EMPTY(InPort,OutPort), "
+ "ON_SENDER_EMPTY(InPort,OutPort) "
+ "callback called in direct mode."));
+ }
+ outport->read(data);
+ m_outPortListeners->connectorData_[ON_BUFFER_READ].notify(m_profile, data);
+ RTC_TRACE(("ON_BUFFER_READ(OutPort), "));
+ RTC_TRACE(("callback called in direct mode."));
+ m_outPortListeners->connectorData_[ON_SEND].notify(m_profile, data);
+ RTC_TRACE(("ON_SEND(OutPort), "));
+ RTC_TRACE(("callback called in direct mode."));
+ m_listeners.connectorData_[ON_RECEIVED].notify(m_profile, data);
+ RTC_TRACE(("ON_RECEIVED(InPort), "));
+ RTC_TRACE(("callback called in direct mode."));
+ m_listeners.connectorData_[ON_SEND].notify(m_profile, data);
+ RTC_TRACE(("ON_BUFFER_WRITE(InPort), "));
+ RTC_TRACE(("callback called in direct mode."));
+
+
+ return true;
+
+ };
+
protected:
/*!
* @if jp
@@ -281,6 +343,14 @@
* @endif
*/
ConnectorListeners* m_outPortListeners;
+ /*!
+ * @if jp
+ * @brief Ʊ°ì¥×¥í¥»¥¹¾å¤Î¥Ô¥¢OutPort¤Î¥Ý¥¤¥ó¥¿
+ * @else
+ * @brief OutProt pointer to the peer in the same process
+ * @endif
+ */
+ OutPortBase* m_directOutPort;
};
}; // namespace RTC
Modified: branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/OutPort.h
===================================================================
--- branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/OutPort.h 2018-01-22 23:46:55 UTC (rev 3183)
+++ branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/OutPort.h 2018-01-23 00:15:43 UTC (rev 3184)
@@ -106,6 +106,7 @@
class OutPort
: public OutPortBase
{
+ typedef coil::Guard<coil::Mutex> Guard;
public:
/*!
* @if jp
@@ -136,7 +137,7 @@
#else
: OutPortBase(name, ::CORBA_Util::toRepositoryId<DataType>()),
#endif
- m_value(value), m_onWrite(0), m_onWriteConvert(0)
+ m_value(value), m_onWrite(0), m_onWriteConvert(0), m_directNewData(false)
{
this->addConnectorDataListener(ON_BUFFER_WRITE,
@@ -216,6 +217,7 @@
RTC_TRACE(("OnWrite called"));
}
+
bool result(true);
std::vector<const char *> disconnect_ids;
{
@@ -228,18 +230,27 @@
for (size_t i(0), len(conn_size); i < len; ++i)
{
+
ReturnCode ret;
- if (m_onWriteConvert != NULL)
- {
- RTC_DEBUG(("m_connectors.OnWriteConvert called"));
- ret = m_connectors[i]->write(((*m_onWriteConvert)(value)));
- }
- else
- {
- RTC_DEBUG(("m_connectors.write called"));
- ret = m_connectors[i]->write(value);
- }
+ if (!m_connectors[i]->directMode())
+ {
+ if (m_onWriteConvert != NULL)
+ {
+ RTC_DEBUG(("m_connectors.OnWriteConvert called"));
+ ret = m_connectors[i]->write(((*m_onWriteConvert)(value)));
+ }
+ else
+ {
+ RTC_DEBUG(("m_connectors.write called"));
+ ret = m_connectors[i]->write(value);
+ }
+ }
+ else
+ {
+ ret = PORT_OK;
+ }
m_status[i] = ret;
+
if (ret == PORT_OK) { continue; }
result = false;
@@ -285,6 +296,7 @@
*/
bool write()
{
+ Guard guard(m_valueMutex);
return write(m_value);
}
@@ -463,6 +475,40 @@
{
m_onWriteConvert = on_wconvert;
}
+
+
+ /*!
+ * @if jp
+ *
+ * @brief ¥Ç¡¼¥¿¤ò¥À¥¤¥ì¥¯¥È¤ËÆɤ߹þ¤à
+ *
+ * @param data Æɤ߹þ¤à¥Ç¡¼¥¿
+ *
+ * @else
+ *
+ * @brief
+ *
+ * @param data
+ *
+ * @endif
+ */
+ void read(DataType& data)
+ {
+ Guard guard(m_valueMutex);
+ m_directNewData = false;
+ if (m_onWriteConvert != NULL)
+ {
+ data = (*m_onWriteConvert)(m_value);
+ }
+ else
+ {
+ data = m_value;
+ }
+ }
+ bool isEmpty()
+ {
+ return false;
+ }
private:
std::string m_typename;
@@ -498,6 +544,9 @@
DataPortStatusList m_status;
CORBA::Long m_propValueIndex;
+
+ coil::Mutex m_valueMutex;
+ bool m_directNewData;
};
}; // namespace RTC
Modified: branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/OutPortBase.cpp
===================================================================
--- branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/OutPortBase.cpp 2018-01-22 23:46:55 UTC (rev 3183)
+++ branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/OutPortBase.cpp 2018-01-23 00:15:43 UTC (rev 3184)
@@ -29,6 +29,8 @@
#include <rtm/OutPortBase.h>
#include <rtm/PublisherBase.h>
+#include <rtm/InPortBase.h>
+
namespace RTC
{
/*!
@@ -1047,6 +1049,12 @@
}
RTC_TRACE(("OutPortPullConnector created"));
+
+ if (coil::normalize(prop["interface_type"]) == "direct")
+ {
+ connector->setDirectMode();
+ }
+
m_connectors.push_back(connector);
RTC_PARANOID(("connector pushback done: size = %d", m_connectors.size()));
return connector;
@@ -1130,4 +1138,9 @@
return PortBase::notify_connect(connector_profile);
}
+ ConnectorListeners& OutPortBase::getListeners()
+ {
+ return m_listeners;
+ }
+
}; // end of namespace RTM
Modified: branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/OutPortBase.h
===================================================================
--- branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/OutPortBase.h 2018-01-22 23:46:55 UTC (rev 3183)
+++ branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/OutPortBase.h 2018-01-23 00:15:43 UTC (rev 3184)
@@ -781,7 +781,26 @@
connect(ConnectorProfile& connector_profile)
throw (CORBA::SystemException);
+ /*!
+ * @if jp
+ * @brief ¥ê¥¹¥Ê¥Û¥ë¥À¤ò¼èÆÀ¤¹¤ë
+ *
+ * InPortBase¤¬ÊÝ»ý¤¹¤ë¥ê¥¹¥Ê¥Û¥ë¥À¤òÊÖ¤¹¡£
+ *
+ * @return ConnectorListeners
+ *
+ * @else
+ * @brief Getting listeners holder
+ *
+ * This operation returns listeners holder.
+ *
+ * @return ConnectorListeners
+ *
+ * @endif
+ */
+ virtual ConnectorListeners& getListeners();
+
protected:
/*!
* @if jp
@@ -1021,6 +1040,7 @@
virtual ReturnCode_t notify_connect(ConnectorProfile& connector_profile)
throw (CORBA::SystemException);
+
protected:
/*!
* @if jp
@@ -1030,6 +1050,8 @@
* @endif
*/
InPortBase* getLocalInPort(const ConnectorInfo& profile);
+
+
/*!
Modified: branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/OutPortConnector.cpp
===================================================================
--- branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/OutPortConnector.cpp 2018-01-22 23:46:55 UTC (rev 3183)
+++ branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/OutPortConnector.cpp 2018-01-23 00:15:43 UTC (rev 3184)
@@ -18,6 +18,7 @@
*/
#include <rtm/OutPortConnector.h>
+#include <rtm/InPortBase.h>
namespace RTC
{
@@ -31,7 +32,7 @@
OutPortConnector::OutPortConnector(ConnectorInfo& info,
ConnectorListeners& listeners)
: rtclog("OutPortConnector"), m_profile(info), m_littleEndian(true),
- m_directInPort(NULL), m_listeners(listeners)
+ m_directInPort(NULL), m_listeners(listeners), m_directMode(false)
{
}
@@ -133,4 +134,47 @@
return m_littleEndian;
}
+ /*!
+ * @if jp
+ * @brief ¥À¥¤¥ì¥¯¥ÈÀܳ¥â¡¼¥É¤ËÀßÄê
+ *
+ *
+ * @else
+ * @brief
+ *
+ *
+ * @endif
+ */
+ void OutPortConnector::setDirectMode()
+ {
+ m_directMode = true;
+ }
+
+ /*!
+ * @if jp
+ * @brief ¥À¥¤¥ì¥¯¥ÈÀܳ¥â¡¼¥É¤«¤ÎȽÄê
+ *
+ * @return True¡§¥À¥¤¥ì¥¯¥ÈÀܳ¥â¡¼¥É,false¡§¤½¤ì°Ê³°
+ *
+ * @else
+ * @brief
+ *
+ *
+ * @endif
+ */
+ bool OutPortConnector::directMode()
+ {
+ return m_directMode;
+ }
+
+ bool OutPortConnector::setInPort(InPortBase* directInPort)
+ {
+ if (directInPort == NULL)
+ {
+ return false;
+ }
+ m_directInPort = directInPort;
+ m_inPortListeners = &(m_directInPort->getListeners());
+ return true;
+ }
}; // namespace RTC
Modified: branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/OutPortConnector.h
===================================================================
--- branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/OutPortConnector.h 2018-01-22 23:46:55 UTC (rev 3183)
+++ branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/OutPortConnector.h 2018-01-23 00:15:43 UTC (rev 3184)
@@ -22,12 +22,13 @@
#include <rtm/SystemLogger.h>
#include <rtm/ConnectorBase.h>
-#include <rtm/InPortBase.h>
-#include <rtm/InPort.h>
+#include <rtm/ConnectorListener.h>
+
namespace RTC
{
+ class InPortBase;
/*!
* @if jp
* @class OutPortConnector
@@ -255,16 +256,32 @@
return write(m_cdr);
}
- bool setInPort(InPortBase* directInPort)
- {
- if (directInPort == NULL)
- {
- return false;
- }
- m_directInPort = directInPort;
- m_inPortListeners = &(m_directInPort->getListeners());
- return true;
- }
+ bool setInPort(InPortBase* directInPort);
+ /*!
+ * @if jp
+ * @brief ¥À¥¤¥ì¥¯¥ÈÀܳ¥â¡¼¥É¤ËÀßÄê
+ *
+ *
+ * @else
+ * @brief
+ *
+ *
+ * @endif
+ */
+ virtual void setDirectMode();
+ /*!
+ * @if jp
+ * @brief ¥À¥¤¥ì¥¯¥ÈÀܳ¥â¡¼¥É¤«¤ÎȽÄê
+ *
+ * @return True¡§¥À¥¤¥ì¥¯¥ÈÀܳ¥â¡¼¥É,false¡§¤½¤ì°Ê³°
+ *
+ * @else
+ * @brief
+ *
+ *
+ * @endif
+ */
+ virtual bool directMode();
protected:
/*!
* @if jp
@@ -326,6 +343,8 @@
*/
ConnectorListeners* m_inPortListeners;
+ bool m_directMode;
+
};
}; // namespace RTC
More information about the openrtm-commit
mailing list