OpenRTM-aist  1.1.2
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 
59 template <class DataType>
60 void setTimestamp(DataType& data)
61 {
62  // set timestamp
64  data.tm.sec = tm.sec();
65  data.tm.nsec = tm.usec() * 1000;
66 }
67 
68 namespace RTC
69 {
105  template <class DataType>
106  class OutPort
107  : public OutPortBase
108  {
109  public:
133  OutPort(const char* name, DataType& value)
134 #if defined(__GNUC__) && (__GNUC__ <= 3 && __GNUC_MINOR__ <= 3)
135  : OutPortBase(name, ::CORBA_Util::toRepositoryIdOfStruct<DataType>()),
136 #else
137  : OutPortBase(name, ::CORBA_Util::toRepositoryId<DataType>()),
138 #endif
139  m_value(value), m_onWrite(0), m_onWriteConvert(0)
140  {
141  addProperty("dataport.data_value", m_value);
142  m_propValueIndex = NVUtil::find_index(m_profile.properties, "dataport.data_value");
143  }
144 
160  virtual ~OutPort(void)
161  {
162  }
163 
205  virtual bool write(DataType& value)
206  {
207  RTC_TRACE(("DataType write()"));
208 
209  if (m_onWrite != NULL)
210  {
211  (*m_onWrite)(value);
212  RTC_TRACE(("OnWrite called"));
213  }
214  m_profile.properties[m_propValueIndex].value <<= value;
215 
216  bool result(true);
217  std::vector<const char *> disconnect_ids;
218  {
219  Guard guard(m_connectorsMutex);
220  // check number of connectors
221  size_t conn_size(m_connectors.size());
222  if (!(conn_size > 0)) { return false; }
223 
224  m_status.resize(conn_size);
225 
226  for (size_t i(0), len(conn_size); i < len; ++i)
227  {
228  ReturnCode ret;
229  if (m_onWriteConvert != NULL)
230  {
231  RTC_DEBUG(("m_connectors.OnWriteConvert called"));
232  ret = m_connectors[i]->write(((*m_onWriteConvert)(value)));
233  }
234  else
235  {
236  RTC_DEBUG(("m_connectors.write called"));
237  ret = m_connectors[i]->write(value);
238  }
239  m_status[i] = ret;
240  if (ret == PORT_OK) { continue; }
241 
242  result = false;
243  const char* id(m_connectors[i]->profile().id.c_str());
244 
245  if (ret == CONNECTION_LOST)
246  {
247  RTC_WARN(("connection_lost id: %s", id));
248  if (m_onConnectionLost != 0)
249  {
250  RTC::ConnectorProfile prof(findConnProfile(id));
251  (*m_onConnectionLost)(prof);
252  }
253  disconnect_ids.push_back(id);
254  }
255  }
256  }
257  std::for_each(disconnect_ids.begin(),disconnect_ids.end(),
258  std::bind1st(std::mem_fun(&PortBase::disconnect),this));
259  return result;
260  }
261 
283  bool write()
284  {
285  return write(m_value);
286  }
287 
313  bool operator<<(DataType& value)
314  {
315  return write(value);
316  }
317 
351  {
352  return m_status[index];
353  }
385  {
386  return m_status;
387  }
388 
418  inline void setOnWrite(OnWrite<DataType>* on_write)
419  {
420  m_onWrite = on_write;
421  }
422 
459  inline void setOnWriteConvert(OnWriteConvert<DataType>* on_wconvert)
460  {
461  m_onWriteConvert = on_wconvert;
462  }
463 
464  private:
465  std::string m_typename;
473  DataType& m_value;
474 
482  OnWrite<DataType>* m_onWrite;
483 
491  OnWriteConvert<DataType>* m_onWriteConvert;
492 
493  coil::TimeMeasure m_cdrtime;
494 
495  DataPortStatusList m_status;
496 
497  CORBA::Long m_propValueIndex;
498  };
499 }; // namespace RTC
500 
501 #endif // RTC_OUTPORT_H
RTコンポーネント
std::vector< OutPortConnector * > m_connectors
接続リスト
Definition: OutPortBase.h:1032
#define RTC_TRACE(fmt)
トレースログ出力マクロ。
Definition: SystemLogger.h:510
long int sec() const
秒単位の値を取得する
Definition: TimeValue.h:110
void setOnWriteConvert(OnWriteConvert< DataType > *on_wconvert)
OnWriteConvert コールバックの設定
Definition: OutPort.h:459
write() 時のデータ変換コールバック抽象クラス
Definition: PortCallback.h:258
coil::Mutex m_connectorsMutex
Definition: PortBase.h:2088
virtual ~OutPort(void)
デストラクタ
Definition: OutPort.h:160
OutPortConnector class.
Periodic time measurement class.
bool write()
データ書き込み
Definition: OutPort.h:283
DataPortStatusList getStatusList()
特定のコネクタへの書き込みステータスリストを得る
Definition: OutPort.h:384
PortCallback class.
Typename function.
Definition: DataPortStatus.h:157
TimeValue クラス
Definition: TimeValue.h:40
#define RTC_WARN(fmt)
ワーニングログ出力マクロ。
Definition: SystemLogger.h:444
const CORBA::Long find_index(const SDOPackage::NVList &nv, const char *name)
name で指定された要素のインデックスを返す
std::vector< DataPortStatus::Enum > DataPortStatusList
Definition: DataPortStatus.h:206
int gettimeofday(struct timeval *tv, struct timezone *tz)
時刻とタイムゾーンを取得する
Definition: Time.h:137
#define RTC_DEBUG(fmt)
デバッグログ出力マクロ。
Definition: SystemLogger.h:488
bool operator<<(DataType &value)
データ書き込み
Definition: OutPort.h:313
write() 時のコールバック抽象クラス
Definition: PortCallback.h:192
OutPortBase(const char *name, const char *data_type)
コンストラクタ
OutPort 基底クラス
Definition: OutPortBase.h:230
Definition: DataPortStatus.h:145
virtual ReturnCode_t disconnect(const char *connector_id)
[CORBA interface] Port の接続を解除する
void setTimestamp(DataType &data)
データにタイムスタンプをセットする
Definition: OutPort.h:60
InPortBase base class.
PortProfile m_profile
Port の PortProfile.
Definition: PortBase.h:2070
DataPortStatus::Enum getStatus(int index)
特定のコネクタへの書き込みステータスを得る
Definition: OutPort.h:350
OutPort テンプレートクラス
Definition: OutPort.h:106
OutPort(const char *name, DataType &value)
コンストラクタ
Definition: OutPort.h:133
virtual bool write(DataType &value)
データ書き込み
Definition: OutPort.h:205
void setOnWrite(OnWrite< DataType > *on_write)
OnWrite コールバックの設定
Definition: OutPort.h:418
TimeMeasure クラス
Definition: TimeMeasure.h:49
RTComponent header.
ConnectionCallback * m_onConnectionLost
Callback functor オブジェクト
Definition: PortBase.h:2196
long int usec() const
マイクロ秒単位の値を取得する
Definition: TimeValue.h:131
void addProperty(const char *key, ValueType value)
PortProfile の properties に NameValue 値を追加する
Definition: PortBase.h:1876
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