OutPortCorbaCdrProvider.py
Go to the documentation of this file.
00001 #!/usr/bin/env python
00002 # -*- coding: euc-jp -*-
00003 
00004 ##
00005 # @file  OutPortCorbaProvider.py
00006 # @brief OutPortCorbaProvider class
00007 # @date  $Date: 2008-01-14 07:52:40 $
00008 # @author Noriaki Ando <n-ando@aist.go.jp> and Shinji Kurihara
00009 #
00010 # Copyright (C) 2006-2009
00011 #     Noriaki Ando
00012 #     Task-intelligence Research Group,
00013 #     Intelligent Systems Research Institute,
00014 #     National Institute of
00015 #         Advanced Industrial Science and Technology (AIST), Japan
00016 #     All rights reserved.
00017 #
00018 
00019 import sys
00020 from omniORB import *
00021 from omniORB import any
00022 
00023 import OpenRTM_aist
00024 import OpenRTM__POA,OpenRTM
00025 
00026 ##
00027 # @if jp
00028 # @class OutPortCorbaCdrProvider
00029 # @brief OutPortCorbaCdrProvider クラス
00030 #
00031 # OutPortProvider 
00032 #
00033 # データ転送に CORBA の OpenRTM::OutPortCdr インターフェースを利用し
00034 # た、pull 型データフロー型を実現する OutPort プロバイダクラス。
00035 #
00036 # @since 0.4.0
00037 #
00038 # @else
00039 # @class OutPortCorbaCdrProvider
00040 # @brief OutPortCorbaCdrProvider class
00041 #
00042 # The OutPort provider class which uses the OpenRTM::OutPortCdr
00043 # interface in CORBA for data transfer and realizes a pull-type
00044 # dataflow.
00045 #
00046 # @since 0.4.0
00047 #
00048 # @endif
00049 #
00050 class OutPortCorbaCdrProvider(OpenRTM_aist.OutPortProvider,
00051                               OpenRTM__POA.OutPortCdr):
00052   ##
00053   # @if jp
00054   # @brief コンストラクタ
00055   #
00056   # コンストラクタ
00057   #
00058   # @param buffer 当該プロバイダに割り当てるバッファオブジェクト
00059   #
00060   # @else
00061   # @brief Constructor
00062   #
00063   # Constructor
00064   #
00065   # @param buffer Buffer object that is assigned to this provider
00066   #
00067   # @endif
00068   #
00069   def __init__(self):
00070     OpenRTM_aist.OutPortProvider.__init__(self)
00071     self.setInterfaceType("corba_cdr")
00072 
00073     # ConnectorProfile setting
00074     self._objref = self._this()
00075     
00076     self._buffer = None
00077 
00078     # set outPort's reference
00079     orb = OpenRTM_aist.Manager.instance().getORB()
00080 
00081     self._properties.append(OpenRTM_aist.NVUtil.newNV("dataport.corba_cdr.outport_ior",
00082                                                       orb.object_to_string(self._objref)))
00083     self._properties.append(OpenRTM_aist.NVUtil.newNV("dataport.corba_cdr.outport_ref",
00084                                                       self._objref))
00085 
00086     self._listeners = None
00087     self._connector = None
00088     self._profile   = None
00089     return
00090 
00091 
00092   ##
00093   # @if jp
00094   # @brief デストラクタ
00095   #
00096   # デストラクタ
00097   #
00098   # @else
00099   # @brief Destructor
00100   #
00101   # Destructor
00102   #
00103   # @endif
00104   #
00105   def __del__(self):
00106     oid = self._default_POA().servant_to_id(self)
00107     self._default_POA().deactivate_object(oid)
00108     return
00109 
00110 
00111   ##
00112   # @if jp
00113   # @brief 設定初期化
00114   #
00115   # InPortConsumerの各種設定を行う。実装クラスでは、与えられた
00116   # Propertiesから必要な情報を取得して各種設定を行う。この init() 関
00117   # 数は、OutPortProvider生成直後および、接続時にそれぞれ呼ばれる可
00118   # 能性がある。したがって、この関数は複数回呼ばれることを想定して記
00119   # 述されるべきである。
00120   # 
00121   # @param prop 設定情報
00122   #
00123   # @else
00124   #
00125   # @brief Initializing configuration
00126   #
00127   # This operation would be called to configure in initialization.
00128   # In the concrete class, configuration should be performed
00129   # getting appropriate information from the given Properties data.
00130   # This function might be called right after instantiation and
00131   # connection sequence respectivly.  Therefore, this function
00132   # should be implemented assuming multiple call.
00133   #
00134   # @param prop Configuration information
00135   #
00136   # @endif
00137   #
00138   # virtual void init(coil::Properties& prop);
00139   def init(self, prop):
00140     pass
00141 
00142 
00143   ##
00144   # @if jp
00145   # @brief バッファをセットする
00146   #
00147   # OutPortProviderがデータを取り出すバッファをセットする。
00148   # すでにセットされたバッファがある場合、以前のバッファへの
00149   # ポインタに対して上書きされる。
00150   # OutPortProviderはバッファの所有権を仮定していないので、
00151   # バッファの削除はユーザの責任で行わなければならない。
00152   #
00153   # @param buffer OutPortProviderがデータを取り出すバッファへのポインタ
00154   #
00155   # @else
00156   # @brief Setting outside buffer's pointer
00157   #
00158   # A pointer to a buffer from which OutPortProvider retrieve data.
00159   # If already buffer is set, previous buffer's pointer will be
00160   # overwritten by the given pointer to a buffer.  Since
00161   # OutPortProvider does not assume ownership of the buffer
00162   # pointer, destructor of the buffer should be done by user.
00163   # 
00164   # @param buffer A pointer to a data buffer to be used by OutPortProvider
00165   #
00166   # @endif
00167   #
00168   # virtual void setBuffer(BufferBase<cdrMemoryStream>* buffer);
00169   def setBuffer(self, buffer):
00170     self._buffer = buffer
00171     return
00172 
00173 
00174   ##
00175   # @if jp
00176   # @brief リスナを設定する。
00177   #
00178   # OutPort はデータ送信処理における各種イベントに対して特定のリスナ
00179   # オブジェクトをコールするコールバック機構を提供する。詳細は
00180   # ConnectorListener.h の ConnectorDataListener, ConnectorListener
00181   # 等を参照のこと。OutPortCorbaCdrProvider では、以下のコールバック
00182   # が提供される。
00183   # 
00184   # - ON_BUFFER_READ
00185   # - ON_SEND
00186   # - ON_BUFFER_EMPTY
00187   # - ON_BUFFER_READ_TIMEOUT
00188   # - ON_SENDER_EMPTY
00189   # - ON_SENDER_TIMEOUT
00190   # - ON_SENDER_ERROR
00191   #
00192   # @param info 接続情報
00193   # @param listeners リスナオブジェクト
00194   #
00195   # @else
00196   # @brief Set the listener. 
00197   #
00198   # OutPort provides callback functionality that calls specific
00199   # listener objects according to the events in the data publishing
00200   # process. For details, see documentation of
00201   # ConnectorDataListener class and ConnectorListener class in
00202   # ConnectorListener.h. In this OutPortCorbaCdrProvider provides
00203   # the following callbacks.
00204   # 
00205   # - ON_BUFFER_READ
00206   # - ON_SEND
00207   # - ON_BUFFER_EMPTY
00208   # - ON_BUFFER_READ_TIMEOUT
00209   # - ON_SENDER_EMPTY
00210   # - ON_SENDER_TIMEOUT
00211   # - ON_SENDER_ERROR
00212   #
00213   # @param info Connector information
00214   # @param listeners Listener objects
00215   #
00216   # @endif
00217   #
00218   # virtual void setListener(ConnectorInfo& info,
00219   #                          ConnectorListeners* listeners);
00220   def setListener(self, info, listeners):
00221     self._profile = info
00222     self._listeners = listeners
00223     return
00224 
00225 
00226   ##
00227   # @if jp
00228   # @brief Connectorを設定する。
00229   #
00230   # OutPort は接続確立時に OutPortConnector オブジェクトを生成し、生
00231   # 成したオブジェクトのポインタと共にこの関数を呼び出す。所有権は
00232   # OutPort が保持するので OutPortProvider は OutPortConnector を削
00233   # 除してはいけない。
00234   #
00235   # @param connector OutPortConnector
00236   #
00237   # @else
00238   # @brief set Connector
00239   #
00240   # OutPort creates OutPortConnector object when it establishes
00241   # connection between OutPort and InPort, and it calls this
00242   # function with a pointer to the connector object. Since the
00243   # OutPort has the ownership of this connector, OutPortProvider
00244   # should not delete it.
00245   #
00246   # @param connector OutPortConnector
00247   #
00248   # @endif
00249   #
00250   # virtual void setConnector(OutPortConnector* connector);
00251   def setConnector(self, connector):
00252     self._connector = connector
00253     return
00254 
00255 
00256   ##
00257   # @if jp
00258   # @brief [CORBA interface] バッファからデータを取得する
00259   #
00260   # 設定された内部バッファからデータを取得する。
00261   #
00262   # @return 取得データ
00263   #
00264   # @else
00265   # @brief [CORBA interface] Get data from the buffer
00266   #
00267   # Get data from the internal buffer.
00268   #
00269   # @return Data got from the buffer.
00270   #
00271   # @endif
00272   #
00273   # virtual ::OpenRTM::PortStatus get(::OpenRTM::CdrData_out data);
00274   def get(self):
00275     self._rtcout.RTC_PARANOID("OutPortCorbaCdrProvider.get()")
00276     if not self._buffer:
00277       self.onSenderError()
00278       return (OpenRTM.UNKNOWN_ERROR, None)
00279 
00280     try:
00281       if self._buffer.empty():
00282         self._rtcout.RTC_ERROR("buffer is empty.")
00283         return (OpenRTM.BUFFER_EMPTY, None)
00284 
00285       cdr = [None]
00286       ret = self._buffer.read(cdr)
00287 
00288       if ret == OpenRTM_aist.BufferStatus.BUFFER_OK:
00289         if not cdr:
00290           self._rtcout.RTC_ERROR("buffer is empty.")
00291           return (OpenRTM.BUFFER_EMPTY, None)
00292       
00293     except:
00294       self._rtcout.RTC_TRACE(OpenRTM_aist.Logger.print_exception())
00295       return (OpenRTM.UNKNOWN_ERROR, None)
00296 
00297     return self.convertReturn(ret, cdr[0])
00298     
00299   ##
00300   # @if jp
00301   # @brief ON_BUFFER_READ のリスナへ通知する。 
00302   # @param data cdrMemoryStream
00303   # @else
00304   # @brief Notify an ON_BUFFER_READ event to listeners
00305   # @param data cdrMemoryStream
00306   # @endif
00307   #
00308   # inline void onBufferRead(const cdrMemoryStream& data)
00309   def onBufferRead(self, data):
00310     if self._listeners and self._profile:
00311       self._listeners.connectorData_[OpenRTM_aist.ConnectorDataListenerType.ON_BUFFER_READ].notify(self._profile, data)
00312     return
00313 
00314   ##
00315   # @if jp
00316   # @brief ON_SEND のリスナへ通知する。 
00317   # @param data cdrMemoryStream
00318   # @else
00319   # @brief Notify an ON_SEND event to listeners
00320   # @param data cdrMemoryStream
00321   # @endif
00322   #
00323   # inline void onSend(const cdrMemoryStream& data)
00324   def onSend(self, data):
00325     if self._listeners and self._profile:
00326       self._listeners.connectorData_[OpenRTM_aist.ConnectorDataListenerType.ON_SEND].notify(self._profile, data)
00327     return
00328 
00329   ##
00330   # @if jp
00331   # @brief ON_BUFFER_EMPTYのリスナへ通知する。 
00332   # @else
00333   # @brief Notify an ON_BUFFER_EMPTY event to listeners
00334   # @endif
00335   #
00336   # inline void onBufferEmpty()
00337   def onBufferEmpty(self):
00338     if self._listeners and self._profile:
00339       self._listeners.connector_[OpenRTM_aist.ConnectorListenerType.ON_BUFFER_EMPTY].notify(self._profile)
00340     return
00341 
00342   ##
00343   # @if jp
00344   # @brief ON_BUFFER_READ_TIMEOUT のリスナへ通知する。 
00345   # @else
00346   # @brief Notify an ON_BUFFER_READ_TIMEOUT event to listeners
00347   # @endif
00348   #
00349   # inline void onBufferReadTimeout()
00350   def onBufferReadTimeout(self):
00351     if self._listeners and self._profile:
00352       self._listeners.connector_[OpenRTM_aist.ConnectorListenerType.ON_BUFFER_READ_TIMEOUT].notify(self._profile)
00353     return
00354 
00355   ##
00356   # @if jp
00357   # @brief ON_SENDER_EMPTYのリスナへ通知する。 
00358   # @else
00359   # @brief Notify an ON_SENDER_EMPTY event to listeners
00360   # @endif
00361   #
00362   # inline void onSenderEmpty()
00363   def onSenderEmpty(self):
00364     if self._listeners and self._profile:
00365       self._listeners.connector_[OpenRTM_aist.ConnectorListenerType.ON_SENDER_EMPTY].notify(self._profile)
00366     return
00367 
00368   ##
00369   # @if jp
00370   # @brief ON_SENDER_TIMEOUT のリスナへ通知する。 
00371   # @else
00372   # @brief Notify an ON_SENDER_TIMEOUT event to listeners
00373   # @endif
00374   #
00375   # inline void onSenderTimeout()
00376   def onSenderTimeout(self):
00377     if self._listeners and self._profile:
00378       self._listeners.connector_[OpenRTM_aist.ConnectorListenerType.ON_SENDER_TIMEOUT].notify(self._profile)
00379     return
00380 
00381   ##
00382   # @if jp
00383   # @brief ON_SENDER_ERRORのリスナへ通知する。 
00384   # @else
00385   # @brief Notify an ON_SENDER_ERROR event to listeners
00386   # @endif
00387   #
00388   # inline void onSenderError()
00389   def onSenderError(self):
00390     if self._listeners and self._profile:
00391       self._listeners.connector_[OpenRTM_aist.ConnectorListenerType.ON_SENDER_ERROR].notify(self._profile)
00392     return
00393 
00394 
00395   ##
00396   # @if jp
00397   # @brief リターンコード変換
00398   # @else
00399   # @brief Return codes conversion
00400   # @endif
00401   #
00402   # ::OpenRTM::PortStatus convertReturn(BufferStatus::Enum status,
00403   #                                     const cdrMemoryStream& data);
00404   def convertReturn(self, status, data):
00405     if status == OpenRTM_aist.BufferStatus.BUFFER_OK:
00406       self.onBufferRead(data)
00407       self.onSend(data)
00408       return (OpenRTM.PORT_OK, data)
00409     
00410     elif status == OpenRTM_aist.BufferStatus.BUFFER_ERROR:
00411       self.onSenderError()
00412       return (OpenRTM.PORT_ERROR, data)
00413     
00414     elif status == OpenRTM_aist.BufferStatus.BUFFER_FULL:
00415       # never come here
00416       return (OpenRTM.BUFFER_FULL, data)
00417 
00418     elif status == OpenRTM_aist.BufferStatus.BUFFER_EMPTY:
00419       self.onBufferEmpty()
00420       self.onSenderEmpty()
00421       return (OpenRTM.BUFFER_EMPTY, data)
00422 
00423     elif status == OpenRTM_aist.BufferStatus.PRECONDITION_NOT_MET:
00424       self.onSenderError()
00425       return (OpenRTM.PORT_ERROR, data)
00426     
00427     elif status == OpenRTM_aist.BufferStatus.TIMEOUT:
00428       self.onBufferReadTimeout()
00429       self.onSenderTimeout()
00430       return (OpenRTM.BUFFER_TIMEOUT, data)
00431     
00432     else:
00433       return (OpenRTM.UNKNOWN_ERROR, data)
00434     
00435     self.onSenderError()
00436     return (OpenRTM.UNKNOWN_ERROR, data)
00437 
00438 
00439 def OutPortCorbaCdrProviderInit():
00440   factory = OpenRTM_aist.OutPortProviderFactory.instance()
00441   factory.addFactory("corba_cdr",
00442                      OpenRTM_aist.OutPortCorbaCdrProvider,
00443                      OpenRTM_aist.Delete)


openrtm_aist_python
Author(s): Shinji Kurihara
autogenerated on Thu Aug 27 2015 14:17:28