[openrtm-commit:01745] r767 - trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/port
openrtm @ openrtm.org
openrtm @ openrtm.org
2016年 2月 22日 (月) 22:24:37 JST
Author: win-ei
Date: 2016-02-22 22:24:37 +0900 (Mon, 22 Feb 2016)
New Revision: 767
Added:
trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/port/ConnectorDataListenerArgumentDataRef.java
trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/port/InPortDirectConsumer.java
trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/port/InPortDirectProvider.java
Log:
Direct data put mode has been implemented as a new interface_type=direct. Callbacks have been implemented.
Added: trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/port/ConnectorDataListenerArgumentDataRef.java
===================================================================
--- trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/port/ConnectorDataListenerArgumentDataRef.java (rev 0)
+++ trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/port/ConnectorDataListenerArgumentDataRef.java 2016-02-22 13:24:37 UTC (rev 767)
@@ -0,0 +1,26 @@
+package jp.go.aist.rtm.RTC.port;
+
+ /**
+ * {@.ja ConnectorDataListenerArgumentDataRef クラス}
+ * {@.en ConnectorDataListenerArgumentDataRef class}
+ *
+ *
+ */
+public class ConnectorDataListenerArgumentDataRef<DataType> {
+ /**
+ * {@.ja コンストラクタ}
+ * {@.en Constructor}
+ *
+ */
+ public ConnectorDataListenerArgumentDataRef(ConnectorBase.ConnectorInfo info,
+ DataType data){
+ m_info = info;
+ m_data = data;
+ }
+ public ConnectorBase.ConnectorInfo m_info;
+ public DataType m_data;
+}
+
+
+
+
Added: trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/port/InPortDirectConsumer.java
===================================================================
--- trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/port/InPortDirectConsumer.java (rev 0)
+++ trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/port/InPortDirectConsumer.java 2016-02-22 13:24:37 UTC (rev 767)
@@ -0,0 +1,439 @@
+package jp.go.aist.rtm.RTC.port;
+
+import jp.go.aist.rtm.RTC.InPortConsumerFactory;
+import jp.go.aist.rtm.RTC.ObjectCreator;
+import jp.go.aist.rtm.RTC.ObjectDestructor;
+import jp.go.aist.rtm.RTC.log.Logbuf;
+//import jp.go.aist.rtm.RTC.util.NVUtil;
+//import jp.go.aist.rtm.RTC.util.ORBUtil;
+import jp.go.aist.rtm.RTC.util.Properties;
+
+//import org.omg.CORBA.BAD_OPERATION;
+//import org.omg.CORBA.TCKind;
+import org.omg.CORBA.portable.OutputStream;
+
+import _SDOPackage.NVListHolder;
+
+/**
+ * {@.ja InPortDirectConsumer クラス}
+ * {@.en InPortDirectConsumer class}
+ * <p>
+ * {@.ja データ転送に CORBA の OpenRTM::InPortCdr インターフェースを利用し
+ * た、push 型データフロー型を実現する InPort コンシューマクラス。}
+ * {@.en This is an implementation class of the input port Consumer </p>
+ * that uses CORBA for means of communication. </p>
+ * The InPort consumer class which uses the OpenRTM::InPortCdr
+ * interface in CORBA for data transfer and realizes a push-type
+ * dataflow.}
+ */
+
+public class InPortDirectConsumer implements InPortConsumer, ObjectCreator<InPortConsumer>, ObjectDestructor {
+ /**
+ * {@.ja コンストラクタ}
+ * {@.en Constructor}
+ * <p>
+ * {@.en buffer 当該コンシューマに割り当てるバッファオブジェクト}
+ * {@.en buffer The buffer object that is attached to this Consumer}
+ *
+ */
+ public InPortDirectConsumer() {
+ //super(OpenRTM.InPortCdr.class);
+ rtcout = new Logbuf("InPortDirectConsumer");
+ //m_orb = ORBUtil.getOrb();
+ }
+ /**
+ * {@.ja 設定初期化}
+ * {@.en Initializing configuration}
+ * <p>
+ * {@.ja InPortConsumerの各種設定を行う。実装クラスでは、与えられた
+ * Propertiesから必要な情報を取得して各種設定を行う。この init() 関
+ * 数は、InPortProvider生成直後および、接続時にそれぞれ呼ばれる可
+ * 能性がある。したがって、この関数は複数回呼ばれることを想定して記
+ * 述されるべきである。}
+ * {@.en This operation would be called to configure in initialization.
+ * In the concrete class, configuration should be performed
+ * getting appropriate information from the given Properties data.
+ * This function might be called right after instantiation and
+ * connection sequence respectivly. Therefore, this function
+ * should be implemented assuming multiple call.}
+ *
+ * @param prop
+ * {@.ja 設定情報}
+ * {@.en Configuration information}
+ */
+ public void init(Properties prop) {
+ m_properties = prop;
+ }
+
+ /**
+ * <p> Send data to the destination port </p>
+ * <p> Pure virtual function to send data to the destination port. </p>
+ *
+ */
+ /**
+ * {@.ja 接続先へのデータ送信}
+ * {@.en Send data to the destination port}
+ * <p>
+ * {@.ja 接続先のポートへデータを送信するための純粋仮想関数。
+ *
+ * この関数は、以下のリターンコードを返す。
+ * <ul>
+ * <li>- PORT_OK: 正常終了。
+ * <li>- PORT_ERROR: データ送信の過程で何らかのエラーが発生した。
+ * <li>- SEND_FULL: データを送信したが、相手側バッファがフルだった。
+ * <li>- SEND_TIMEOUT:データを送信したが、相手側バッファがタイムアウトした。
+ * <li>- UNKNOWN_ERROR:原因不明のエラー</ul>}
+ * {@.en Pure virtual function to send data to the destination port.
+ *
+ * This function might the following return codes
+ * <ul>
+ * <li>- PORT_OK: Normal return
+ * <li>- PORT_ERROR: Error occurred in data transfer process
+ * <li>- SEND_FULL: Buffer full although OutPort tried to send data
+ * <li>- SEND_TIMEOUT: Timeout although OutPort tried to send data
+ * <li>- UNKNOWN_ERROR: Unknown error</ul>}
+ *
+ * @param data
+ * {@.ja 送信するデータ}
+ * {@.en Data sent by this operation.}
+ * @return
+ * {@.ja リターンコード}
+ * {@.en ReturnCode}
+ */
+ public ReturnCode put(final OutputStream data) {
+ rtcout.println(Logbuf.PARANOID, "put(): never called.");
+
+ return ReturnCode.UNKNOWN_ERROR;
+ }
+ /**
+ * {@.ja InterfaceProfile情報を公開する}
+ * {@.en Publish InterfaceProfile information}
+ * <p>
+ * {@.ja InterfaceProfile情報を公開する。
+ * 引数で指定するプロパティ情報内の NameValue オブジェクトの
+ * dataport.interface_type 値を調べ、当該ポートに設定されている
+ * インターフェースタイプと一致する場合のみ情報を取得する。}
+ * {@.en Publish interfaceProfile information.
+ * Check the dataport.interface_type value of the NameValue object
+ * specified by an argument in property information and get information
+ * only when the interface type of the specified port is matched.}
+ *
+ * @param properties
+ * {@.ja InterfaceProfile情報を受け取るプロパティ}
+ * {@.en Properties to get InterfaceProfile information}
+ */
+ public void publishInterfaceProfile(NVListHolder properties) {
+ return;
+ }
+ /**
+ * {@.ja データ送信通知への登録}
+ * {@.en Subscribe to the data sending notification}
+ * <p>
+ * {@.ja 指定されたプロパティに基づいて、データ送出通知の受け取り
+ * に登録する。}
+ * {@.en Subscribe to the data sending notification based on specified
+ * property information.}
+ *
+ * @param properties
+ * {@.ja 登録情報}
+ * {@.en Information for subscription}
+ *
+ * @return
+ * {@.ja 登録処理結果(登録成功:true、登録失敗:false)}
+ * {@.en Subscription result (Successful:true, Failed:false)}
+ */
+ public boolean subscribeInterface(final NVListHolder properties) {
+ rtcout.println(Logbuf.TRACE, "subscribeInterface(): do nothing");
+ return true;
+ }
+
+ /**
+ * {@.ja データ送信通知からの登録解除}
+ * {@.en Unsubscribe the data send notification}
+ * <p>
+ * {@.ja データ送出通知の受け取りから登録を解除する。}
+ * {@.en Unsubscribe the data send notification.}
+ *
+ * @param properties
+ * {@.ja 登録解除情報}
+ * {@.en Information for unsubscription}
+ */
+ public void unsubscribeInterface(final NVListHolder properties) {
+ rtcout.println(Logbuf.TRACE, "unsubscribeInterface(): do nothing");
+ }
+
+ /**
+ * {@.ja IOR文字列からオブジェクト参照を取得する}
+ * {@.en Getting object reference fromn IOR string}
+ * @param properties
+ * {@.ja Information for subscription}
+ * {@.en Information for subscription}
+ *
+ * @return
+ * {@.ja true: 正常取得, false: 取得失敗}
+ * {@.en true: succeeded, false: failed}
+ */
+/*
+ private boolean subscribeFromIor(final NVListHolder properties) {
+ rtcout.println(Logbuf.TRACE, "subscribeFromIor()");
+
+ int index;
+ index = NVUtil.find_index(properties,
+ "dataport.corba_cdr.inport_ior");
+ if (index < 0) {
+ rtcout.println(Logbuf.ERROR, "inport_ior not found");
+ return false;
+ }
+ rtcout.println(Logbuf.DEBUG, "index:"+index);
+
+ final String ior;
+
+ try {
+ rtcout.println(Logbuf.DEBUG,
+ "type:"+properties.value[index].value.type());
+ if( properties.value[index].value.type().kind() ==
+ TCKind.tk_wstring ) {
+ ior = properties.value[index].value.extract_wstring();
+ } else {
+ ior = properties.value[index].value.extract_string();
+ }
+ }
+ catch(BAD_OPERATION e) {
+ rtcout.println(Logbuf.ERROR, "inport_ior has no string");
+ return false;
+ }
+
+ ORB orb = ORBUtil.getOrb();
+ org.omg.CORBA.Object obj = orb.string_to_object(ior);
+
+ if (obj==null) {
+ rtcout.println(Logbuf.ERROR, "invalid IOR string has been passed");
+ return false;
+ }
+
+ if (!super.setObject(obj)) {
+ rtcout.println(Logbuf.WARN, "Setting object to consumer failed.");
+ return false;
+ }
+ return true;
+ }
+*/
+ /**
+ * {@.ja Anyから直接オブジェクト参照を取得する}
+ * {@.en Getting object reference fromn Any directry}
+ * @param properties
+ * {@.ja Information for subscription}
+ * {@.en Information for subscription}
+ * @return
+ * {@.ja true: 正常取得, false: 取得失敗}
+ * {@.en true: succeeded, false: failed}
+ *
+ */
+/*
+ private boolean subscribeFromRef(final NVListHolder properties) {
+ rtcout.println(Logbuf.TRACE, "subscribeFromRef()");
+ int index;
+ index = NVUtil.find_index(properties,
+ "dataport.corba_cdr.inport_ref");
+ if (index < 0) {
+ rtcout.println(Logbuf.ERROR, "inport_ref not found");
+ return false;
+ }
+
+ org.omg.CORBA.Object obj;
+ try {
+ obj = properties.value[index].value.extract_Object();
+ }
+ catch(BAD_OPERATION e){
+ rtcout.println(Logbuf.ERROR, "prop[inport_ref] is not objref");
+ return true;
+ }
+
+ if (obj==null) {
+ rtcout.println(Logbuf.ERROR, "prop[inport_ref] is not objref");
+ return false;
+ }
+
+ if (!super.setObject(obj)) {
+ rtcout.println(Logbuf.ERROR, "Setting object to consumer failed.");
+ return false;
+ }
+ return true;
+ }
+*/
+ /**
+ * {@.ja 接続解除(IOR版)}
+ * {@.en ubsubscribing (IOR version)}
+ *
+ * @param properties
+ * {@.ja Information for unsubscription}
+ * {@.en Information for unsubscription}
+ *
+ * @return
+ * {@.ja true: 正常取得, false: 取得失敗}
+ * {@.en true: succeeded, false: failed}
+ */
+/*
+ private boolean unsubscribeFromIor(final NVListHolder properties) {
+ rtcout.println(Logbuf.TRACE, "unsubscribeFromIor()");
+ int index;
+ index = NVUtil.find_index(properties,
+ "dataport.corba_cdr.inport_ior");
+ if (index < 0) {
+ rtcout.println(Logbuf.ERROR, "inport_ior not found");
+ return false;
+ }
+
+ final String ior;
+ try {
+ if( properties.value[index].value.type().kind() ==
+ TCKind.tk_wstring ) {
+ ior = properties.value[index].value.extract_wstring();
+ } else {
+ ior = properties.value[index].value.extract_string();
+ }
+ }
+ catch(BAD_OPERATION e) {
+ rtcout.println(Logbuf.ERROR, "inport_ior has no string");
+ return false;
+ }
+
+ ORB orb = ORBUtil.getOrb();
+ org.omg.CORBA.Object var = orb.string_to_object(ior);
+ if (!(_ptr()._is_equivalent(var))) {
+ rtcout.println(Logbuf.ERROR, "connector property inconsistency");
+ return false;
+ }
+
+ releaseObject();
+ return true;
+ }
+*/
+ /**
+ * {@.ja 接続解除(Object reference版)}
+ * {@.en ubsubscribing (Object reference version)}
+ *
+ * @param properties
+ * {@.ja Information for unsubscription}
+ * {@.en Information for unsubscription}
+ * @return
+ * {@.ja true: 正常取得, false: 取得失敗}
+ * {@.en true: succeeded, false: failed}
+ */
+/*
+ private boolean unsubscribeFromRef(final NVListHolder properties) {
+ rtcout.println(Logbuf.TRACE, "unsubscribeFromRef()");
+ int index;
+ index = NVUtil.find_index(properties,
+ "dataport.corba_cdr.inport_ref");
+ if (index < 0) {
+ return false;
+ }
+
+ org.omg.CORBA.Object obj;
+ try {
+ obj = properties.value[index].value.extract_Object();
+ }
+ catch(BAD_OPERATION e){
+ rtcout.println(Logbuf.ERROR, "prop[inport_ref] is not objref");
+ return false;
+ }
+
+ if (!(_ptr()._is_equivalent(obj))) {
+ rtcout.println(Logbuf.ERROR, "connector property inconsistency");
+ return false;
+ }
+
+ releaseObject();
+ return true;
+ }
+*/
+ /**
+ * {@.ja PortStatusをReturnCodeに変換する。}
+ * {@.en Converts PortStatus into ReturnCode.}
+ *
+ * @param status
+ * {@.ja PortStatus}
+ * {@.en PortStatus}
+ * @return
+ * {@.ja ReturnCode}
+ * {@.en ReturnCode}
+ */
+ protected ReturnCode convertReturn(OpenRTM.PortStatus status) {
+ switch (status.value()) {
+ case 0:
+ return ReturnCode.PORT_OK;
+ case 1:
+ return ReturnCode.PORT_ERROR;
+ case 2:
+ return ReturnCode.BUFFER_FULL;
+ case 3:
+ return ReturnCode.BUFFER_EMPTY;
+ case 4:
+ return ReturnCode.BUFFER_TIMEOUT;
+ default:
+ return ReturnCode.UNKNOWN_ERROR;
+ }
+ }
+
+ /**
+ * {@.ja InPortDirectConsumer を生成する}
+ * {@.en Creats InPortDirectConsumer}
+ *
+ * @return
+ * {@.ja 生成されたInPortConsumer}
+ * {@.en Object Created instances}
+ *
+ *
+ */
+ public InPortConsumer creator_() {
+ return new InPortDirectConsumer();
+ }
+ /**
+ * {@.ja Object を破棄する}
+ * {@.en Destructs Object}
+ *
+ * @param obj
+ * {@.ja 破棄するインタスタンス}
+ * {@.en The target instances for destruction}
+ *
+ */
+ public void destructor_(Object obj) {
+ obj = null;
+ }
+ /**
+ * {@.ja モジュール初期化関数}
+ * {@.en Module initialization}
+ * <p>
+ * {@.ja InPortDirectConsumer のファクトリを登録する初期化関数。}
+ * {@.en This initialization function registers InPortDirectConsumer's
+ * factory.}
+ */
+ public static void InPortDirectConsumerInit() {
+ final InPortConsumerFactory<InPortConsumer,String> factory
+ = InPortConsumerFactory.instance();
+
+ factory.addFactory("direct",
+ new InPortDirectConsumer(),
+ new InPortDirectConsumer());
+
+ }
+ /**
+ * {@.ja Connectorを設定する。}
+ * {@.en set Connector}
+ *
+ * @param connector
+ * {@.ja OutPortConnector}
+ * {@.en OutPortConnector}
+ */
+ public void setConnector(OutPortConnector connector) {
+ m_connector = connector;
+ }
+
+ private Logbuf rtcout;
+ private Properties m_properties;
+ private OutPortConnector m_connector;
+// private ORB m_orb;
+
+}
+
Added: trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/port/InPortDirectProvider.java
===================================================================
--- trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/port/InPortDirectProvider.java (rev 0)
+++ trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/port/InPortDirectProvider.java 2016-02-22 13:24:37 UTC (rev 767)
@@ -0,0 +1,631 @@
+package jp.go.aist.rtm.RTC.port;
+
+import jp.go.aist.rtm.RTC.InPortProviderFactory;
+import jp.go.aist.rtm.RTC.ObjectCreator;
+import jp.go.aist.rtm.RTC.ObjectDestructor;
+import jp.go.aist.rtm.RTC.buffer.BufferBase;
+import jp.go.aist.rtm.RTC.log.Logbuf;
+//import jp.go.aist.rtm.RTC.util.CORBA_SeqUtil;
+import jp.go.aist.rtm.RTC.util.NVListHolderFactory;
+import jp.go.aist.rtm.RTC.util.NVUtil;
+//import jp.go.aist.rtm.RTC.util.ORBUtil;
+//import jp.go.aist.rtm.RTC.util.POAUtil;
+import jp.go.aist.rtm.RTC.util.Properties;
+
+import org.omg.CORBA.ORB;
+import org.omg.CORBA.SystemException;
+import org.omg.CORBA.portable.OutputStream;
+
+//import OpenRTM.InPortCdrPOA;
+import _SDOPackage.NVListHolder;
+
+
+/**
+ * {@.ja InPortDirectProvider クラス}
+ * {@.en InPortDirectProvider class}
+ * <p>
+ * {@.ja データ転送に CORBA の OpenRTM::InPortCdr インターフェースを利用し
+ * た、push 型データフロー型を実現する InPort プロバイダクラス。}
+ * {@.en This is an implementation class of the input port Provider
+ * that uses CORBA for means of communication.}
+ *
+ *
+ */
+public class InPortDirectProvider implements InPortProvider, ObjectCreator<InPortProvider>, ObjectDestructor {
+ /**
+ * {@.ja コンストラクタ}
+ * {@.en Constructor}
+ *
+ *
+ */
+ public InPortDirectProvider() {
+ m_buffer = null;
+ rtcout = new Logbuf("InPortDirectProvider");
+ // PortProfile setting
+ setInterfaceType("direct");
+
+/*
+ // ConnectorProfile setting
+ m_objref = this._this();
+
+ // set InPort's reference
+ ORB orb = ORBUtil.getOrb();
+ CORBA_SeqUtil.push_back(m_properties,
+ NVUtil.newNVString("dataport.corba_cdr.inport_ior",
+ orb.object_to_string(m_objref)));
+ CORBA_SeqUtil.push_back(m_properties,
+ NVUtil.newNV("dataport.corba_cdr.inport_ref",
+ m_objref, OpenRTM.InPortCdr.class ));
+
+ m_orb = ORBUtil.getOrb();
+*/
+
+ }
+ /**
+ * {@.ja 当該OpenRTM.InPortCdrのCORBAオブジェクト参照を取得する。}
+ * {@.en Gets CORBA object referense of this OpenRTM.InPortCdr}
+ *
+ * @return
+ * {@.ja 当該PortのCORBAオブジェクト参照}
+ * {@.en CORBA object referense of this OpenRTM.InPortCdr}
+ *
+ */
+/*
+ public OpenRTM.InPortCdr _this() {
+
+ if (this.m_objref == null) {
+ try {
+ this.m_objref =
+ OpenRTM.InPortCdrHelper.narrow(POAUtil.getRef(this));
+ } catch (Exception e) {
+ rtcout.println(Logbuf.WARN, "The exception was caught.");
+ throw new IllegalStateException(e);
+ }
+ }
+
+ return this.m_objref;
+ }
+*/
+ /**
+ * {@.ja 設定初期化}
+ * {@.en Initializing configuration}
+ * <p>
+ * {@.ja InPortDirectProvider の各種設定を行う。与えられた
+ * Propertiesから必要な情報を取得して各種設定を行う。この init() 関
+ * 数は、InPortProvider生成直後および、接続時にそれぞれ呼ばれる可
+ * 能性がある。したがって、この関数は複数回呼ばれることを想定して記
+ * 述されるべきである。}
+ * {@.en This operation would be called to configure in initialization.
+ * In the concrete class, configuration should be performed
+ * getting appropriate information from the given Properties data.
+ * This function might be called right after instantiation and
+ * connection sequence respectivly. Therefore, this function
+ * should be implemented assuming multiple call.}
+ *
+ * @param prop
+ * {@.ja 設定情報}
+ * {@.en Configuration information}
+ */
+ public void init(Properties prop){
+ }
+ /**
+ * {@.ja バッファをセットする}
+ * {@.en Setting outside buffer's pointer}
+ * <p>
+ * {@.ja OutPortProvider がデータを取り出すバッファをセットする。
+ * すでにセットされたバッファがある場合、以前のバッファへの
+ * ポインタに対して上書きされる。
+ * OutPortProviderはバッファの所有権を仮定していないので、
+ * バッファの削除はユーザの責任で行わなければならない。}
+ * {@.en A pointer to a buffer from which OutPortProvider retrieve data.
+ * If already buffer is set, previous buffer's pointer will be
+ * overwritten by the given pointer to a buffer. Since
+ * OutPortProvider does not assume ownership of the buffer
+ * pointer, destructor of the buffer should be done by user.}
+ *
+ * @param buffer
+ * {@.ja OutPortProviderがデータを取り出すバッファへのポインタ}
+ * {@.en A pointer to a data buffer to be used by OutPortProvider}
+ */
+ public void setBuffer(BufferBase<OutputStream> buffer) {
+ m_buffer = buffer;
+ }
+
+ /**
+ * {@.ja [CORBA interface] バッファにデータを書き込む}
+ * {@.en [CORBA interface] Write data into the buffer}
+ *
+ * <p>
+ * {@.ja 設定されたバッファにデータを書き込む。}
+ * {@.en Write data into the specified buffer.}
+ * </p>
+ *
+ * @param data
+ * {@.ja 書込対象データ}
+ * {@.en The target data for writing}
+ *
+ */
+ public OpenRTM.PortStatus put(byte[] data)
+ throws SystemException {
+
+ rtcout.println(Logbuf.PARANOID, "InPortDirectProvider.put()");
+/*
+ if (m_buffer == null) {
+ EncapsOutputStreamExt cdr
+ = new EncapsOutputStreamExt(m_orb,m_connector.isLittleEndian());
+ cdr.write_octet_array(data, 0, data.length);
+ onReceiverError(cdr);
+ return OpenRTM.PortStatus.PORT_ERROR;
+ }
+
+
+ rtcout.println(Logbuf.PARANOID, "received data size: "+data.length);
+
+
+ EncapsOutputStreamExt cdr
+ = new EncapsOutputStreamExt(m_orb,m_connector.isLittleEndian());
+ cdr.write_octet_array(data, 0, data.length);
+
+ int len = cdr.getByteArray().length;
+ rtcout.println(Logbuf.PARANOID, "converted CDR data size: "+len);
+ onReceived(cdr);
+ jp.go.aist.rtm.RTC.buffer.ReturnCode ret = m_buffer.write(cdr);
+ return convertReturn(ret,cdr);
+*/
+ return OpenRTM.PortStatus.from_int(
+ OpenRTM.PortStatus._UNKNOWN_ERROR);
+ }
+
+ /**
+ * {@.ja [CORBA interface] バッファにデータを書き込む}
+ * {@.en [CORBA interface] Write data into the buffer}
+ * <p>
+ * {@.ja 設定されたバッファにデータを書き込む。}
+ * {@.en Write data into the specified buffer.}
+ *
+ * @param data
+ * {@.ja 書込対象データ}
+ * {@.en The target data for writing}
+ *
+ * @return
+ * {@.ja ステータス}
+ * {@.en Prot status}
+ */
+ public OpenRTM.PortStatus put(final OpenRTM.CdrDataHolder data)
+ throws SystemException {
+ return put(data.value);
+
+ }
+ /**
+ * {@.ja リターンコード変換}
+ * {p.en Return codes conversion}
+ *
+ * @param status
+ * {@.ja ReturnCode}
+ * {@.en ReturnCode}
+ * @return
+ * {@.ja PortStatus}
+ * {@.en PortStatus}
+ */
+ protected OpenRTM.PortStatus
+ convertReturn(jp.go.aist.rtm.RTC.buffer.ReturnCode status,
+ final EncapsOutputStreamExt data) {
+ switch (status) {
+ case BUFFER_OK:
+ onBufferWrite(data);
+ return OpenRTM.PortStatus.from_int(OpenRTM.PortStatus._PORT_OK);
+ case BUFFER_ERROR:
+ onReceiverError(data);
+ return OpenRTM.PortStatus.from_int(
+ OpenRTM.PortStatus._PORT_ERROR);
+
+ case BUFFER_FULL:
+ onBufferFull(data);
+ onReceiverFull(data);
+ return OpenRTM.PortStatus.from_int(
+ OpenRTM.PortStatus._BUFFER_FULL);
+
+ case BUFFER_EMPTY:
+ // never come here
+ return OpenRTM.PortStatus.from_int(
+ OpenRTM.PortStatus._BUFFER_EMPTY);
+ case TIMEOUT:
+ onBufferWriteTimeout(data);
+ onReceiverTimeout(data);
+ return OpenRTM.PortStatus.from_int(
+ OpenRTM.PortStatus._BUFFER_TIMEOUT);
+ case PRECONDITION_NOT_MET:
+ onReceiverError(data);
+ return OpenRTM.PortStatus.from_int(
+ OpenRTM.PortStatus._PORT_ERROR);
+ default:
+ onReceiverError(data);
+ return OpenRTM.PortStatus.from_int(
+ OpenRTM.PortStatus._UNKNOWN_ERROR);
+ }
+ }
+
+ private Logbuf rtcout;
+
+ /**
+ * {@.ja InPortDirectProvider を生成する}
+ * {@.en Creats InPortDirectProvider}
+ *
+ * @return
+ * {@.ja 生成されたInPortProvider}
+ * {@.en Object Created instances}
+ *
+ */
+ public InPortProvider creator_() {
+ return new InPortDirectProvider();
+ }
+ /**
+ * {@.ja InPortDirectProvider を破棄する}
+ * {@.en Destructs InPortDirectProvider}
+ *
+ * @param obj
+ * {@.ja 破棄するインタスタンス}
+ * {@.en The target instances for destruction}
+ *
+ */
+ public void destructor_(Object obj) {
+/*
+ try{
+ byte[] oid
+ = _default_POA().servant_to_id((InPortDirectProvider)obj);
+ _default_POA().deactivate_object(oid);
+ }
+ catch(Exception e){
+ e.printStackTrace();
+ }
+*/
+ obj = null;
+ }
+
+ /**
+ * {@.ja モジュール初期化関数}
+ * {@.en Module initialization}
+ * <p>
+ * {@.ja InPortCorbaCdrConsumer のファクトリを登録する初期化関数。}
+ * {@.en This initialization function registers InPortCorbaCdrConsumer's
+ * factory.}
+ */
+ public static void InPortDirectProviderInit() {
+ final InPortProviderFactory<InPortProvider,String> factory
+ = InPortProviderFactory.instance();
+
+ factory.addFactory("direct",
+ new InPortDirectProvider(),
+ new InPortDirectProvider());
+
+ }
+ /**
+ * <p>InterfaceProfile情報を公開します。</p>
+ *
+ * @param properties InterfaceProfile情報を受け取るホルダオブジェクト
+ */
+ /**
+ * {@.ja InterfaceProfile情報を公開する}
+ * {@.en Publish InterfaceProfile information}
+ *
+ * <p>
+ * {@.ja InterfaceProfile情報を公開する。
+ * 引数で指定するプロパティ情報内の NameValue オブジェクトの
+ * dataport.interface_type 値を調べ、当該ポートに設定されている
+ * インターフェースタイプと一致する場合のみ情報を取得する。}
+ * {@.en Publish interfaceProfile information.
+ * Check the dataport.interface_type value of the NameValue object
+ * specified by an argument in property information and get information
+ * only when the interface type of the specified port is matched.}
+ *
+ * @param properties
+ * {@.ja InterfaceProfile情報を受け取るホルダオブジェクト}
+ * {@.en Holder object to get InterfaceProfile information}
+ *
+ */
+ public void publishInterfaceProfile(NVListHolder properties) {
+
+ NVUtil.appendStringValue(properties, "dataport.interface_type",
+ this.m_interfaceType);
+ NVUtil.append(properties, this.m_properties);
+ }
+
+ /**
+ * {@.ja Interface情報を公開する}
+ * {@.en Publish interface information}
+ * <p>
+ * {@.ja Interface情報を公開する。引数で指定するプロパティ情報内の
+ * NameValue オブジェクトのdataport.interface_type 値を調べ、当該ポー
+ * トに設定されていなければNameValue に情報を追加する。すでに同一イ
+ * ンターフェースが登録済みの場合は何も行わない。}
+ * {@.en Publish interface information. Check the
+ * dataport.interface_type value of the NameValue object specified
+ * by an argument in the property information, and add the
+ * information to the NameValue if this port is not specified.
+ * This does not do anything if the same interface is already
+ * subscribed.}
+ *
+ * @param properties
+ * {@.ja properties Interface情報を受け取るホルダオブジェクト}
+ * {@.en Holder object to receive interface information}
+ * @return
+ * {@.ja true: 正常終了}
+ * {@.en true: normal return}
+ */
+ public boolean publishInterface(NVListHolder properties) {
+
+ rtcout.println(Logbuf.TRACE, "publishInterface()");
+ rtcout.println(Logbuf.DEBUG, NVUtil.toString(properties));
+
+
+ if (! NVUtil.isStringValue(properties,
+ "dataport.interface_type",
+ this.m_interfaceType)) {
+ return false;
+ }
+
+ NVUtil.append(properties, this.m_properties);
+ return true;
+
+ }
+
+ /**
+ * {@.ja リスナを設定する。}
+ * {@.en Set the listener.}
+ *
+ * <p>
+ * {@.ja InPort はデータ送信処理における各種イベントに対して特定のリスナ
+ * オブジェクトをコールするコールバック機構を提供する。詳細は
+ * ConnectorListener.h の ConnectorDataListener, ConnectorListener
+ * 等を参照のこと。InPortDirectProvider では、以下のコールバック
+ * が提供される。}
+ * {@.en InPort provides callback functionality that calls specific
+ * listener objects according to the events in the data publishing
+ * process. For details, see documentation of
+ * ConnectorDataListener class and ConnectorListener class in
+ * ConnectorListener.h. In this InPortDirectProvider provides
+ * the following callbacks.}
+ * <ul>
+ * <li>- ON_BUFFER_WRITE
+ * <li>- ON_BUFFER_FULL
+ * <li>- ON_BUFFER_WRITE_TIMEOUT
+ * <li>- ON_BUFFER_OVERWRITE
+ * <li>- ON_RECEIVED
+ * <li>- ON_RECEIVER_FULL
+ * <li>- ON_RECEIVER_FULL
+ * <li>- ON_RECEIVER_TIMEOUT
+ * <li>- ON_RECEIVER_ERROR </li></ul>
+ *
+ *
+ * @param info
+ * {@.ja 接続情報}
+ * {@.en Connector information}
+ * @param listeners
+ * {@.ja リスナオブジェクト}
+ * {@.en Listener objects}
+ */
+ public void setListener(ConnectorBase.ConnectorInfo info,
+ ConnectorListeners listeners) {
+ m_profile = info;
+ m_listeners = listeners;
+ }
+ /**
+ * {@.ja Connectorを設定する。}
+ * {@.en set Connector}
+ * <p>
+ * {@.ja InPort は接続確立時に InPortConnector オブジェクトを生成し、生
+ * 成したオブジェクトのポインタと共にこの関数を呼び出す。所有権は
+ * InPort が保持するので InPortProvider は InPortConnector を削
+ * 除してはいけない。}
+ * {@.en InPort creates InPortConnector object when it establishes
+ * connection between InPort and InPort, and it calls this
+ * function with a pointer to the connector object. Since the
+ * InPort has the ownership of this connector, InPortProvider
+ * should not delete it.}
+ *
+ * @param connector
+ * {@.ja InPortConnector}
+ * {@.en InPortConnector}
+ */
+ public void setConnector(InPortConnector connector) {
+ m_connector = connector;
+ }
+
+ /**
+ * {@.ja インタフェースプロフィールのデータタイプを設定する。}
+ * {@.en Sets DataType of the interface profile}
+ *
+ * @param dataType
+ * {@.ja データタイプ}
+ * {@.en dataType}
+ */
+/*
+ protected void setDataType(final String dataType) {
+ this.m_dataType = dataType;
+ }
+*/
+ /**
+ * {@.ja インタフェースプロフィールのインタフェースタイプを設定する。}
+ * {@.en Sets interface Type of the interface profile}
+ *
+ * @param interfaceType
+ * {@.ja インタフェースタイプ}
+ * {@.en Intereface Type}
+ */
+ protected void setInterfaceType(final String interfaceType) {
+ rtcout.println(Logbuf.TRACE, "setInterfaceType("+interfaceType+")");
+ this.m_interfaceType = interfaceType;
+ }
+
+ /**
+ * {@.ja インタフェースプロフィールのデータフロータイプを設定する。}
+ * {@.en Sets data flow type of the interface profile}
+ *
+ * @param dataflowType
+ * {@.ja データフロータイプ}
+ * {@.en Data flow type}
+ */
+/*
+ protected void setDataFlowType(final String dataflowType) {
+ rtcout.println(Logbuf.TRACE, "setDataFlowType("+dataflowType+")");
+ this.m_dataflowType = dataflowType;
+ }
+*/
+ /**
+ * {@.ja インタフェースプロフィールのサブスクリプションタイプを設定する。}
+ * {@.en Sets subscription type of the interface profile}
+ *
+ * @param subscriptionType
+ * {@.ja サブスクリプションタイプ}
+ * {@.en Subscription type}
+ */
+/*
+ protected void setSubscriptionType(final String subscriptionType) {
+ rtcout.println(Logbuf.TRACE,
+ "setSubscriptionType("+subscriptionType+")");
+ this.m_subscriptionType = subscriptionType;
+ }
+*/
+
+ /**
+ * <p> Connector data listener functions </p>
+ */
+ /**
+ * {@.ja ON_BUFFER_WRITE のリスナへ通知する。}
+ * {@.en Notify an ON_BUFFER_WRITE event to listeners}
+ * @param data
+ * {@.ja OutputStream}
+ * {@.en OutputStream}
+ */
+ private void onBufferWrite(final OutputStream data) {
+ m_listeners.connectorData_[ConnectorDataListenerType.ON_BUFFER_WRITE].notify(m_profile, data);
+ }
+
+ /**
+ * {@.ja ON_BUFFER_FULL のリスナへ通知する。}
+ * {@.en Notify an ON_BUFFER_FULL event to listeners}
+ * @param data
+ * {@.ja OutputStream}
+ * {@.en OutputStream}
+ */
+ private void onBufferFull(final OutputStream data) {
+ m_listeners.connectorData_[ConnectorDataListenerType.ON_BUFFER_FULL].notify(m_profile, data);
+ }
+
+ /**
+ * {@.ja ON_BUFFER_WRITE_TIMEOUT のリスナへ通知する。}
+ * {@.en Notify an ON_BUFFER_WRITE_TIMEOUT event to listeners}
+ * @param data
+ * {@.ja OutputStream}
+ * {@.en OutputStream}
+ */
+ private void onBufferWriteTimeout(final OutputStream data) {
+ m_listeners.connectorData_[ConnectorDataListenerType.ON_BUFFER_WRITE_TIMEOUT].notify(m_profile, data);
+ }
+
+ /**
+ * {@.ja ON_BUFFER_WRITE_OVERWRITE のリスナへ通知する。}
+ * {@.en Notify an ON_BUFFER_WRITE_OVERWRITE event to listeners}
+ * @param data
+ * {@.ja OutputStream}
+ * {@.en OutputStream}
+ */
+ private void onBufferWriteOverwrite(final OutputStream data) {
+ m_listeners.connectorData_[ConnectorDataListenerType.ON_BUFFER_OVERWRITE].notify(m_profile, data);
+ }
+
+// private void onBufferRead(final OutputStream data) {
+// m_listeners.connectorData_[ConnectorDataListenerType.ON_BUFFER_READ].notify(m_profile, data);
+// }
+
+// private void onSend(final OutputStream data) {
+// m_listeners.connectorData_[ConnectorDataListenerType.ON_SEND].notify(m_profile, data);
+// }
+
+ /**
+ * {@.ja ON_RECEIVED のリスナへ通知する。}
+ * {@.en Notify an ON_RECEIVED event to listeners}
+ * @param data
+ * {@.ja OutputStream}
+ * {@.en OutputStream}
+ */
+ private void onReceived(final OutputStream data) {
+ m_listeners.connectorData_[ConnectorDataListenerType.ON_RECEIVED].notify(m_profile, data);
+ }
+
+ /**
+ * {@.ja ON_RECEIVER_FULL のリスナへ通知する。}
+ * {@.en Notify an ON_RECEIVER_FULL event to listeners}
+ * @param data
+ * {@.ja OutputStream}
+ * {@.en OutputStream}
+ */
+ private void onReceiverFull(final OutputStream data) {
+ m_listeners.connectorData_[ConnectorDataListenerType.ON_RECEIVER_FULL].notify(m_profile, data);
+ }
+
+ /**
+ * {@.ja ON_RECEIVER_TIMEOUT のリスナへ通知する。}
+ * {@.en Notify an ON_RECEIVER_TIMEOUT event to listeners}
+ * @param data
+ * {@.ja OutputStream}
+ * {@.en OutputStream}
+ */
+ private void onReceiverTimeout(final OutputStream data) {
+ m_listeners.connectorData_[ConnectorDataListenerType.ON_RECEIVER_TIMEOUT].notify(m_profile, data);
+ }
+
+ /**
+ * {@.ja ON_RECEIVER_ERRORのリスナへ通知する。}
+ * {@.en Notify an ON_RECEIVER_ERROR event to listeners}
+ * @param data
+ * {@.ja OutputStream}
+ * {@.en OutputStream}
+ */
+ private void onReceiverError(final OutputStream data) {
+ m_listeners.connectorData_[ConnectorDataListenerType.ON_RECEIVER_ERROR].notify(m_profile, data);
+ }
+
+ /**
+ * <p> Connector listener functions </p>
+ */
+// private void onBufferEmpty() {
+// m_listeners.connector_[ConnectorDataListenerType.ON_BUFFER_EMPTY].notify(m_profile);
+// }
+
+// privaet void onBufferReadTimeout(){
+// m_listeners.connector_[ConnectorDataListenerType.ON_BUFFER_READ_TIMEOUT].notify(m_profile);
+// }
+
+// privaet void onSenderEmpty() {
+// m_listeners.connector_[ConnectorDataListenerType.ON_SENDER_EMPTY].notify(m_profile);
+// }
+
+// privaet void onSenderTimeout() {
+// m_listeners.connector_[ConnectorDataListenerType.ON_SENDER_TIMEOUT].notify(m_profile);
+// }
+
+// private void onSenderError(){
+// m_listeners.connector_[ConnectorDataListenerType.ON_SENDER_ERROR].notify(m_profile);
+// }
+
+
+
+ /**
+ * <p>インタフェース情報を保持するオブジェクトです。</p>
+ */
+ protected NVListHolder m_properties = NVListHolderFactory.create();
+
+ private String m_dataType = new String();
+ private String m_interfaceType = new String();
+ private String m_dataflowType = new String();
+ private String m_subscriptionType = new String();
+
+ private BufferBase<OutputStream> m_buffer;
+ private OpenRTM.InPortCdr m_objref;
+
+// private ORB m_orb;
+ private InPortConnector m_connector;
+ private ConnectorListeners m_listeners;
+ private ConnectorBase.ConnectorInfo m_profile;
+}
More information about the openrtm-commit
mailing list