OpenRTM-aist  1.2.1
OutPort.h
[詳解]
1 // -*- C++ -*-
20 #ifndef RTC_OUTPORT_H
21 #define RTC_OUTPORT_H
22 
23 #include <functional>
24 #include <string>
25 
26 #include <coil/TimeValue.h>
27 #include <coil/Time.h>
28 #include <coil/TimeMeasure.h>
29 #include <coil/OS.h>
30 
31 #include <rtm/RTC.h>
32 #include <rtm/Typename.h>
33 #include <rtm/OutPortBase.h>
34 #include <rtm/CdrBufferBase.h>
35 #include <rtm/PortCallback.h>
36 #include <rtm/OutPortConnector.h>
37 #include <rtm/Timestamp.h>
38 #include <rtm/DirectOutPortBase.h>
39 
61 template <class DataType>
62 void setTimestamp(DataType& data)
63 {
64  // set timestamp
66  data.tm.sec = tm.sec();
67  data.tm.nsec = tm.usec() * 1000;
68 }
69 
70 namespace RTC
71 {
107  template <class DataType>
108  class OutPort
109  : public OutPortBase, DirectOutPortBase<DataType>
110  {
112  public:
136  OutPort(const char* name, DataType& value)
137 #if defined(__GNUC__) && (__GNUC__ <= 3 && __GNUC_MINOR__ <= 3)
138  : OutPortBase(name, ::CORBA_Util::toRepositoryIdOfStruct<DataType>()),
139 #else
140  : OutPortBase(name, ::CORBA_Util::toRepositoryId<DataType>()),
141 #endif
143  m_value(value), m_onWrite(0), m_onWriteConvert(0),
144  m_directNewData(false), m_directValue(value)
145  {
146 
148  new Timestamp<DataType>("on_write"));
150  new Timestamp<DataType>("on_send"));
151  m_directport = this;
152 
153  }
154 
170  virtual ~OutPort(void)
171  {
172  }
173 
215  virtual bool write(DataType& value)
216  {
217  RTC_TRACE(("DataType write()"));
218 
219  if (m_onWrite != NULL)
220  {
221  (*m_onWrite)(value);
222  RTC_TRACE(("OnWrite called"));
223  }
224 
225 
226  bool result(true);
227  std::vector<const char *> disconnect_ids;
228  {
229  Guard guard(m_connectorsMutex);
230  // check number of connectors
231  size_t conn_size(m_connectors.size());
232  if (!(conn_size > 0)) { return false; }
233 
234  m_status.resize(conn_size);
235 
236  for (size_t i(0), len(conn_size); i < len; ++i)
237  {
238 
239  ReturnCode ret;
240  if (!m_connectors[i]->pullDirectMode())
241  {
242  if (m_onWriteConvert != NULL)
243  {
244  RTC_DEBUG(("m_connectors.OnWriteConvert called"));
245  ret = m_connectors[i]->write(((*m_onWriteConvert)(value)));
246  }
247  else
248  {
249  RTC_DEBUG(("m_connectors.write called"));
250  ret = m_connectors[i]->write(value);
251  }
252  }
253  else
254  {
255  Guard guard(m_valueMutex);
256  if (m_onWriteConvert != NULL)
257  {
258  RTC_DEBUG(("m_connectors.OnWriteConvert called"));
259  m_directValue = ((*m_onWriteConvert)(value));
260  }
261  else
262  {
263  m_directValue = value;
264  }
265  m_directNewData = true;
266  ret = PORT_OK;
267  }
268  m_status[i] = ret;
269 
270  if (ret == PORT_OK) { continue; }
271 
272  result = false;
273  const char* id(m_connectors[i]->profile().id.c_str());
274 
275  if (ret == CONNECTION_LOST)
276  {
277  RTC_WARN(("connection_lost id: %s", id));
278  if (m_onConnectionLost != 0)
279  {
280  RTC::ConnectorProfile prof(findConnProfile(id));
281  (*m_onConnectionLost)(prof);
282  }
283  disconnect_ids.push_back(id);
284  }
285  }
286  }
287  std::for_each(disconnect_ids.begin(),disconnect_ids.end(),
288  std::bind1st(std::mem_fun(&PortBase::disconnect),this));
289  return result;
290  }
291 
313  bool write()
314  {
315  return write(m_value);
316  }
317 
343  bool operator<<(DataType& value)
344  {
345  return write(value);
346  }
347 
381  {
382  return m_status[index];
383  }
415  {
416  return m_status;
417  }
418 
448  inline void setOnWrite(OnWrite<DataType>* on_write)
449  {
450  m_onWrite = on_write;
451  }
452 
489  inline void setOnWriteConvert(OnWriteConvert<DataType>* on_wconvert)
490  {
491  m_onWriteConvert = on_wconvert;
492  }
493 
494 
510  virtual void read(DataType& data)
511  {
512  Guard guard(m_valueMutex);
513  m_directNewData = false;
514  data = m_directValue;
515  }
516  virtual bool isEmpty()
517  {
518  return !m_directNewData;
519  }
520  virtual bool isNew()
521  {
522  return m_directNewData;
523  }
524 
525  private:
526  std::string m_typename;
534  DataType& m_value;
535 
543  OnWrite<DataType>* m_onWrite;
544 
552  OnWriteConvert<DataType>* m_onWriteConvert;
553 
554  coil::TimeMeasure m_cdrtime;
555 
556  DataPortStatusList m_status;
557 
558  CORBA::Long m_propValueIndex;
559 
560  coil::Mutex m_valueMutex;
561  bool m_directNewData;
562  DataType m_directValue;
563 
564 
565  };
566 }; // namespace RTC
567 
568 #endif // RTC_OUTPORT_H
void addConnectorDataListener(ConnectorDataListenerType listener_type, ConnectorDataListener *listener, bool autoclean=true)
ConnectorDataListener リスナを追加する
RTコンポーネント
DirectOutPortBase class.
std::vector< OutPortConnector * > m_connectors
接続リスト
Definition: OutPortBase.h:1064
#define RTC_TRACE(fmt)
トレースログ出力マクロ。
Definition: SystemLogger.h:588
long int sec() const
秒単位の値を取得する
Definition: TimeValue.h:110
void setOnWriteConvert(OnWriteConvert< DataType > *on_wconvert)
OnWriteConvert コールバックの設定
Definition: OutPort.h:489
write() 時のデータ変換コールバック抽象クラス
Definition: PortCallback.h:258
Mutex クラス
Definition: Mutex.h:40
coil::Mutex m_connectorsMutex
Definition: PortBase.h:2110
virtual void read(DataType &data)
データをダイレクトに読み込む
Definition: OutPort.h:510
virtual ~OutPort(void)
デストラクタ
Definition: OutPort.h:170
OutPortConnector class.
Definition: Timestamp.h:26
virtual bool isNew()
新規データの存在確認
Definition: OutPort.h:520
Periodic time measurement class.
bool write()
データ書き込み
Definition: OutPort.h:313
DataPortStatusList getStatusList()
特定のコネクタへの書き込みステータスリストを得る
Definition: OutPort.h:414
PortCallback class.
Typename function.
Definition: ConnectorListener.h:140
Definition: DataPortStatus.h:157
virtual bool isEmpty()
新規データが無いことを確認
Definition: OutPort.h:516
TimeValue クラス
Definition: TimeValue.h:40
#define RTC_WARN(fmt)
ワーニングログ出力マクロ。
Definition: SystemLogger.h:522
std::vector< DataPortStatus::Enum > DataPortStatusList
Definition: DataPortStatus.h:206
int gettimeofday(struct timeval *tv, struct timezone *tz)
時刻とタイムゾーンを取得する
Definition: Time.h:137
Definition: ConnectorListener.h:145
#define RTC_DEBUG(fmt)
デバッグログ出力マクロ。
Definition: SystemLogger.h:566
bool operator<<(DataType &value)
データ書き込み
Definition: OutPort.h:343
direct接続用OutPort基底クラス
Definition: DirectOutPortBase.h:48
write() 時のコールバック抽象クラス
Definition: PortCallback.h:192
OutPortBase(const char *name, const char *data_type)
コンストラクタ
OutPort 基底クラス
Definition: OutPortBase.h:235
DirectPortBase * m_directport
Definition: PortBase.h:2235
Definition: DataPortStatus.h:145
virtual ReturnCode_t disconnect(const char *connector_id)
[CORBA interface] Port の接続を解除する
void setTimestamp(DataType &data)
データにタイムスタンプをセットする
Definition: OutPort.h:62
InPortBase base class.
DataPortStatus::Enum getStatus(int index)
特定のコネクタへの書き込みステータスを得る
Definition: OutPort.h:380
OutPort テンプレートクラス
Definition: OutPort.h:108
OutPort(const char *name, DataType &value)
コンストラクタ
Definition: OutPort.h:136
virtual bool write(DataType &value)
データ書き込み
Definition: OutPort.h:215
void setOnWrite(OnWrite< DataType > *on_write)
OnWrite コールバックの設定
Definition: OutPort.h:448
TimeMeasure クラス
Definition: TimeMeasure.h:49
RTComponent header.
ConnectionCallback * m_onConnectionLost
Callback functor オブジェクト
Definition: PortBase.h:2218
Timestamp listener class.
long int usec() const
マイクロ秒単位の値を取得する
Definition: TimeValue.h:131
Enum
Definition: DataPortStatus.h:143
ConnectorProfile findConnProfile(const char *id)
id を持つ ConnectorProfile を探す
Functor for_each(CorbaSequence &seq, Functor f)
CORBA sequence に対して functor を適用する
Definition: CORBA_SeqUtil.h:98