OpenRTM-aist  2.1.0
PublisherPeriodic.h
[詳解]
1 // -*- C++ -*-
20 #ifndef RTC_PUBLISHERPERIODIC_H
21 #define RTC_PUBLISHERPERIODIC_H
22 
23 #include <coil/Task.h>
24 #include <condition_variable>
25 #include <coil/PeriodicTask.h>
26 
27 #include <rtm/RTC.h>
28 #include <rtm/PublisherBase.h>
29 #include <rtm/CdrBufferBase.h>
30 #include <rtm/SystemLogger.h>
31 #include <rtm/ConnectorBase.h>
32 #include <rtm/ConnectorListener.h>
33 
34 namespace coil
35 {
36  class Properties;
37 } // namespace coil
38 
39 namespace RTC
40 {
41  class InPortConsumer;
64  : public PublisherBase
65  {
66  public:
67 
78 
92  ~PublisherPeriodic() override;
93 
156 
183 
210 
245  ConnectorListenersBase* listeners) override;
320  std::chrono::nanoseconds timeout) override;
348  bool isActive() override;
349 
376 
403 
417  virtual int svc();
418 
419  protected:
420  enum Policy
421  {
426  };
427 
435  void setPushPolicy(const coil::Properties& prop);
436 
444  bool createTask(const coil::Properties& prop);
445 
450 
455 
460 
465 
522  ByteData& data);
523 
524 
543  ByteData& data);
544 
554  inline void onBufferWrite(ByteData& data)
555  {
557  m_profile, data);
558  }
559 
569  inline void onBufferFull(ByteData& data)
570  {
571  m_listeners->notifyOut(
573  }
574 
584  inline void onBufferWriteTimeout(ByteData& data)
585  {
586  m_listeners->notifyOut(
588  }
589 
599  inline void onBufferRead(ByteData& data)
600  {
601  m_listeners->notifyOut(ConnectorDataListenerType::ON_BUFFER_READ, m_profile, data);
602  }
603 
613  inline void onSend(ByteData& data)
614  {
615  m_listeners->notifyOut(ConnectorDataListenerType::ON_SEND, m_profile, data);
616  }
617 
627  inline void onReceived(ByteData& data)
628  {
629  m_listeners->notifyOut(ConnectorDataListenerType::ON_RECEIVED, m_profile, data);
630  }
631 
641  inline void onReceiverFull(ByteData& data)
642  {
643  m_listeners->notifyOut(ConnectorDataListenerType::ON_RECEIVER_FULL, m_profile, data);
644  }
645 
655  inline void onReceiverTimeout(ByteData& data)
656  {
657  m_listeners->notifyOut(ConnectorDataListenerType::ON_RECEIVER_TIMEOUT, m_profile, data);
658  }
659 
669  inline void onReceiverError(ByteData& data)
670  {
671  m_listeners->notifyOut(ConnectorDataListenerType::ON_RECEIVER_ERROR, m_profile, data);
672  }
673 
681  inline void onBufferEmpty()
682  {
683  m_listeners->notify(ConnectorListenerType::ON_BUFFER_EMPTY, m_profile);
684  }
685 
693  inline void onSenderEmpty()
694  {
695  m_listeners->notify(ConnectorListenerType::ON_SENDER_EMPTY, m_profile);
696  }
697 
705  inline void onSenderError()
706  {
707  m_listeners->notify(ConnectorListenerType::ON_SENDER_ERROR, m_profile);
708  }
709 
710 
711  private:
712  bool bufferIsEmpty()
713  {
714  if (m_buffer->empty() && !m_readback)
715  {
716  RTC_DEBUG(("buffer empty"));
717  onBufferEmpty();
718  onSenderEmpty();
719  return true;
720  }
721  return false;
722  }
723 
724  Logger rtclog{"PublisherPeriodic"};
725  InPortConsumer* m_consumer{nullptr};
726  CdrBufferBase* m_buffer{nullptr};
727  ConnectorInfo m_profile;
728  coil::PeriodicTaskBase* m_task{nullptr};
729  ConnectorListenersBase* m_listeners{nullptr};
731  std::mutex m_retmutex;
732  Policy m_pushPolicy{PUBLISHER_POLICY_NEW};
733  int m_skipn{0};
734  bool m_active{false};
735  bool m_readback{false};
736  int m_leftskip{0};
737  ByteData m_data;
738  };
739 } // namespace RTC
740 
741 extern "C"
742 {
744 }
745 
746 #endif // RTC_PUBLISHERPERIODIC_H
Connector base class
connector listener class
Publisher base class
void PublisherPeriodicInit()
RTComponent header
RT component logger class
#define RTC_DEBUG(fmt)
デバッグログ出力マクロ。
Definition: SystemLogger.h:665
BufferBase 抽象クラス
Definition: BufferBase.h:106
virtual bool empty() const =0
バッファemptyチェック
シリアライザの基底クラス
Definition: ByteDataStreamBase.h:63
シリアライズ後のバイト列を操作するクラス
Definition: ByteData.h:30
ConnectorInfo クラス
Definition: ConnectorBase.h:50
Definition: ConnectorListener.h:1354
virtual ::RTC::ConnectorListenerStatus::Enum notify(ConnectorListenerType type, ConnectorInfo &info)=0
リスナーへ通知する
virtual ::RTC::ConnectorListenerStatus::Enum notifyOut(ConnectorDataListenerType type, ConnectorInfo &info, ByteData &data)=0
リスナーへ通知する(OutPort側) 指定の種類のリスナのコールバックメソッドを呼び出す。 InPortとOutPortでシリアライザの種類が違う場合があるため、 OutPort側ではnotifyOu...
InPortConsumer 抽象クラス
Definition: InPortConsumer.h:78
Publisher 基底クラス
Definition: PublisherBase.h:66
PublisherPeriodic クラス
Definition: PublisherPeriodic.h:65
DataPortStatus pushAll()
push "all" policy
DataPortStatus write(ByteDataStreamBase *data, std::chrono::nanoseconds timeout) override
データを書き込む
void onBufferWrite(ByteData &data)
ON_BUFFER_WRITEのリスナへ通知する。
Definition: PublisherPeriodic.h:554
PublisherPeriodic()
コンストラクタ
void onReceived(ByteData &data)
ON_RECEIVEDのリスナへ通知する。
Definition: PublisherPeriodic.h:627
bool createTask(const coil::Properties &prop)
Task の設定
void onSend(ByteData &data)
ON_SENDのリスナへ通知する。
Definition: PublisherPeriodic.h:613
void onReceiverFull(ByteData &data)
ON_RECEIVER_FULLのリスナへ通知する。
Definition: PublisherPeriodic.h:641
DataPortStatus invokeListener(DataPortStatus status, ByteData &data)
DataPortStatusに従ってリスナへ通知する関数を呼び出す。
void onBufferWriteTimeout(ByteData &data)
ON_BUFFER_WRITE_TIMEOUTのリスナへ通知する。
Definition: PublisherPeriodic.h:584
DataPortStatus pushFifo()
push "fifo" policy
DataPortStatus pushNew()
push "new" policy
void onBufferEmpty()
ON_BUFFER_EMPTYのリスナへ通知する。
Definition: PublisherPeriodic.h:681
void onReceiverError(ByteData &data)
ON_RECEIVER_ERRORのリスナへ通知する。
Definition: PublisherPeriodic.h:669
DataPortStatus init(coil::Properties &prop) override
初期化
DataPortStatus convertReturn(BufferStatus status, ByteData &data)
BufferStatus から DataPortStatus への変換
void onBufferFull(ByteData &data)
ON_BUFFER_FULLリスナへイベントを通知する。
Definition: PublisherPeriodic.h:569
~PublisherPeriodic() override
デストラクタ
DataPortStatus activate() override
アクティブ化する
DataPortStatus setBuffer(CdrBufferBase *buffer) override
バッファのセット
void setPushPolicy(const coil::Properties &prop)
PushPolicy の設定
void onReceiverTimeout(ByteData &data)
ON_RECEIVER_TIMEOUTのリスナへ通知する。
Definition: PublisherPeriodic.h:655
DataPortStatus setConsumer(InPortConsumer *consumer) override
InPortコンシューマのセット
void onSenderError()
ON_SENDER_ERRORのリスナへ通知する。
Definition: PublisherPeriodic.h:705
DataPortStatus pushSkip()
push "skip" policy
Policy
Definition: PublisherPeriodic.h:421
@ PUBLISHER_POLICY_ALL
Definition: PublisherPeriodic.h:422
@ PUBLISHER_POLICY_NEW
Definition: PublisherPeriodic.h:425
@ PUBLISHER_POLICY_SKIP
Definition: PublisherPeriodic.h:424
@ PUBLISHER_POLICY_FIFO
Definition: PublisherPeriodic.h:423
void onSenderEmpty()
ON_SENDER_EMPTYのリスナへ通知する。
Definition: PublisherPeriodic.h:693
bool isActive() override
アクティブ化確認
DataPortStatus setListener(ConnectorInfo &info, ConnectorListenersBase *listeners) override
リスナを設定する。
DataPortStatus deactivate() override
非アクティブ化する
void onBufferRead(ByteData &data)
ON_BUFFER_READのリスナへ通知する。
Definition: PublisherPeriodic.h:599
virtual int svc()
スレッド実行関数
RTコンポーネント
BufferBase< ByteData > CdrBufferBase
Definition: CdrBufferBase.h:31
DataPortStatus
Definition: DataPortStatus.h:114
coil::Properties Properties
Definition: RTC.h:72
BufferStatus
BufferStatus リターンコード
Definition: BufferStatus.h:57
Definition: DefaultPeriodicTask.h:24