20 #ifndef RTC_RINGBUFFER_H 21 #define RTC_RINGBUFFER_H 36 #define RINGBUFFER_DEFAULT_LENGTH 8 88 template <
class DataType>
119 : m_overwrite(true), m_readback(true),
120 m_timedwrite(false), m_timedread(false),
121 m_wtimeout(1, 0), m_rtimeout(1, 0),
123 m_wpos(0), m_rpos(0), m_fillcount(0), m_wcount(0),
190 initWritePolicy(prop);
191 initReadPolicy(prop);
216 Guard guard(m_posmutex);
247 return ::RTC::BufferStatus::BUFFER_OK;
274 Guard guard(m_posmutex);
279 return ::RTC::BufferStatus::BUFFER_OK;
305 virtual DataType*
wptr(
long int n = 0)
307 Guard guard(m_posmutex);
308 return &m_buffer[(m_wpos + n + m_length) % m_length];
343 Guard guard(m_posmutex);
344 if ((n > 0 && n > static_cast<long int>(m_length - m_fillcount)) ||
345 (n < 0 && n < static_cast<long int>(-m_fillcount)))
347 return ::RTC::BufferStatus::PRECONDITION_NOT_MET;
350 m_wpos = (m_wpos + n + m_length) % m_length;
353 return ::RTC::BufferStatus::BUFFER_OK;
382 virtual ReturnCode
put(
const DataType& value)
384 Guard guard(m_posmutex);
385 m_buffer[m_wpos] = value;
386 return ::RTC::BufferStatus::BUFFER_OK;
430 virtual ReturnCode
write(
const DataType& value,
431 long int sec = -1,
long int nsec = 0)
434 Guard guard(m_full.mutex);
439 bool timedwrite(m_timedwrite);
440 bool overwrite(m_overwrite);
448 if (overwrite && !timedwrite)
452 else if (!overwrite && !timedwrite)
454 return ::RTC::BufferStatus::BUFFER_FULL;
456 else if (!overwrite && timedwrite)
460 sec = m_wtimeout.
sec();
461 nsec = m_wtimeout.
usec() * 1000;
464 if (!m_full.cond.wait(sec, nsec))
466 return ::RTC::BufferStatus::TIMEOUT;
471 return ::RTC::BufferStatus::PRECONDITION_NOT_MET;
479 Guard eguard(m_empty.mutex);
484 m_empty.cond.signal();
491 return ::RTC::BufferStatus::BUFFER_OK;
517 Guard guard(m_posmutex);
518 return m_length - m_fillcount;
542 Guard guard(m_posmutex);
543 return m_length == m_fillcount;
567 virtual DataType*
rptr(
long int n = 0)
569 Guard guard(m_posmutex);
570 return &(m_buffer[(m_rpos + n + m_length) % m_length]);
602 Guard guard(m_posmutex);
603 if ((n > 0 && n > static_cast<long int>(m_fillcount)) ||
604 (n < 0 && n < static_cast<long int>(m_fillcount - m_length)))
606 return ::RTC::BufferStatus::PRECONDITION_NOT_MET;
609 m_rpos = (m_rpos + n + m_length) % m_length;
611 return ::RTC::BufferStatus::BUFFER_OK;
638 virtual ReturnCode
get(DataType& value)
640 Guard gaurd(m_posmutex);
641 value = m_buffer[m_rpos];
642 return ::RTC::BufferStatus::BUFFER_OK;
663 virtual DataType&
get()
665 Guard gaurd(m_posmutex);
666 return m_buffer[m_rpos];
711 virtual ReturnCode
read(DataType& value,
712 long int sec = -1,
long int nsec = 0)
715 Guard gaurd(m_empty.mutex);
719 bool timedread(m_timedread);
720 bool readback(m_readback);
726 sec = m_rtimeout.
sec();
727 nsec = m_rtimeout.
usec() * 1000;
730 if (readback && !timedread)
734 return ::RTC::BufferStatus::BUFFER_EMPTY;
738 else if (!readback && !timedread)
740 return ::RTC::BufferStatus::BUFFER_EMPTY;
742 else if (!readback && timedread)
746 sec = m_rtimeout.
sec();
747 nsec = m_rtimeout.
usec() * 1000;
750 if (!m_empty.cond.wait(sec, nsec))
752 return ::RTC::BufferStatus::TIMEOUT;
757 return ::RTC::BufferStatus::PRECONDITION_NOT_MET;
765 Guard fguard(m_full.mutex);
770 m_full.cond.signal();
777 return ::RTC::BufferStatus::BUFFER_OK;
806 Guard guard(m_posmutex);
831 Guard guard(m_posmutex);
832 return m_fillcount == 0;
838 if (!prop[
"length"].
empty())
853 std::string policy(prop[
"write.full_policy"]);
855 if (policy ==
"overwrite")
858 m_timedwrite =
false;
860 else if (policy ==
"do_nothing")
863 m_timedwrite =
false;
865 else if (policy ==
"block")
883 std::string policy(prop[
"read.empty_policy"]);
884 if (policy ==
"readback")
889 else if (policy ==
"do_nothing")
894 else if (policy ==
"block")
1012 std::vector<DataType> m_buffer;
1023 condition() : cond(mutex) {}
1057 #endif // RTC_RINGBUFFER_H std::string normalize(std::string &str)
文字列を正規化する
virtual DataType * rptr(long int n=0)
バッファの現在の読み出し要素のポインタ
Definition: RingBuffer.h:567
virtual ~RingBuffer(void)
仮想デストラクタ
Definition: RingBuffer.h:144
virtual ReturnCode read(DataType &value, long int sec=-1, long int nsec=0)
バッファから読み出す
Definition: RingBuffer.h:711
bool stringTo(To &val, const char *str)
与えられたstd::stringをオブジェクトに変換
Definition: stringutil.h:597
virtual ReturnCode length(size_t n)
バッファの長さをセットする
Definition: RingBuffer.h:242
Mutex クラス
Definition: Mutex.h:40
virtual bool full(void) const
バッファfullチェック
Definition: RingBuffer.h:540
#define RINGBUFFER_DEFAULT_LENGTH
Definition: RingBuffer.h:36
virtual void init(const coil::Properties &prop)
バッファの設定
Definition: RingBuffer.h:187
virtual DataType * wptr(long int n=0)
バッファの現在の書込み要素のポインタ
Definition: RingBuffer.h:305
TimeValue クラス
Definition: TimeValue.h:40
virtual ReturnCode reset()
バッファの状態をリセットする
Definition: RingBuffer.h:272
RingBuffer(long int length=RINGBUFFER_DEFAULT_LENGTH)
コンストラクタ
Definition: RingBuffer.h:118
#define BUFFERSTATUS_ENUM
RTC::BufferStatus 導入
Definition: BufferStatus.h:157
BUFFERSTATUS_ENUM typedef coil::Guard< coil::Mutex > Guard
Definition: RingBuffer.h:94
Buffer status enum definition
virtual ReturnCode advanceWptr(long int n=1)
書込みポインタを進める
Definition: RingBuffer.h:334
virtual bool empty(void) const
バッファemptyチェック
Definition: RingBuffer.h:829
virtual size_t writable() const
バッファに書込み可能な要素数
Definition: RingBuffer.h:515
virtual size_t readable() const
バッファから読み出し可能な要素数
Definition: RingBuffer.h:804
リングバッファ実装クラス
Definition: RingBuffer.h:89
virtual ReturnCode write(const DataType &value, long int sec=-1, long int nsec=0)
バッファに書き込む
Definition: RingBuffer.h:430
virtual ReturnCode advanceRptr(long int n=1)
読み出しポインタを進める
Definition: RingBuffer.h:594
プロパティセットを表現するクラス
Definition: Properties.h:101
long int sec() const
秒単位の値を取得する
Definition: TimeValue.h:110
long int usec() const
マイクロ秒単位の値を取得する
Definition: TimeValue.h:131
virtual ReturnCode put(const DataType &value)
バッファにデータを書き込む
Definition: RingBuffer.h:382
BufferBase 抽象クラス
Definition: BufferBase.h:104
virtual size_t length(void) const
バッファ長を取得する
Definition: RingBuffer.h:214