MIRA
Channel.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2012 by
3  * MetraLabs GmbH (MLAB), GERMANY
4  * and
5  * Neuroinformatics and Cognitive Robotics Labs (NICR) at TU Ilmenau, GERMANY
6  * All rights reserved.
7  *
8  * Contact: info@mira-project.org
9  *
10  * Commercial Usage:
11  * Licensees holding valid commercial licenses may use this file in
12  * accordance with the commercial license agreement provided with the
13  * software or, alternatively, in accordance with the terms contained in
14  * a written agreement between you and MLAB or NICR.
15  *
16  * GNU General Public License Usage:
17  * Alternatively, this file may be used under the terms of the GNU
18  * General Public License version 3.0 as published by the Free Software
19  * Foundation and appearing in the file LICENSE.GPL3 included in the
20  * packaging of this file. Please review the following information to
21  * ensure the GNU General Public License version 3.0 requirements will be
22  * met: http://www.gnu.org/copyleft/gpl.html.
23  * Alternatively you may (at your option) use any later version of the GNU
24  * General Public License if such license has been publicly approved by
25  * MLAB and NICR (or its successors, if any).
26  *
27  * IN NO EVENT SHALL "MLAB" OR "NICR" BE LIABLE TO ANY PARTY FOR DIRECT,
28  * INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF
29  * THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF "MLAB" OR
30  * "NICR" HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  *
32  * "MLAB" AND "NICR" SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING,
33  * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
34  * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
35  * ON AN "AS IS" BASIS, AND "MLAB" AND "NICR" HAVE NO OBLIGATION TO
36  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR MODIFICATIONS.
37  */
38 
48 #ifndef _MIRA_CHANNEL_H_
49 #define _MIRA_CHANNEL_H_
50 
51 #ifndef _MIRA_FRAMEWORK_H_
52 # error "Channel.h must be included via the Framework.h. You must not include it directly. Use #include <fw/Framework.h> instead"
53 #endif
54 
55 #ifndef Q_MOC_RUN
56 #include <boost/shared_ptr.hpp>
57 #include <boost/type_traits/is_polymorphic.hpp>
58 #endif
59 
60 #include <error/Exceptions.h>
61 
62 #include <factory/TypeId.h>
63 
64 #include <utils/EnumToFlags.h>
66 
67 #include <fw/Framework.h>
68 
69 #include <fw/AbstractChannel.h>
70 #include <fw/ChannelSubscriber.h>
71 #include <fw/ChannelReadWrite.h>
72 #include <fw/ChannelReadInterval.h>
74 
75 namespace mira {
76 
78 
82 MIRA_DEFINE_SERIALIZABLE_EXCEPTION(XInvalidRead, XRuntime)
83 
84 
87 template <typename T>
88 class Channel;
89 
91 
93 
98 template<typename T>
99 class ConcreteChannel : public AbstractChannel
100 {
101 public:
102 
103  typedef ChannelBuffer<T> Buffer;
104  typedef typename Buffer::ValueType ValueType;
105  typedef typename Buffer::Slot Slot;
106 
107  typedef ChannelSubscriber<T, ChannelRead<T> > Subscriber;
108  typedef boost::shared_ptr<Subscriber> SubscriberPtr;
109 
110 public:
111 
112  ConcreteChannel(const std::string& id) :
113  AbstractChannel(id, new ChannelBuffer<T>)
114  {
115  // make sure, that our ConcreteChannel class has the same size
116  // as AbstractChannel and that we are not polymorphic. Both is
117  // important for our channel_cast to work as expected.
118  static_assert(sizeof(ConcreteChannel)==sizeof(AbstractChannel),
119  "ConcreteChannel must have the same size as AbstractChannel");
120 
121  static_assert(boost::is_polymorphic<ConcreteChannel>::value==false,
122  "ConcreateChannel and AbstractChannel must not be polymorphic");
123  }
124 
125 public:
126 
131  void addSubscriber()
132  {
133  boost::mutex::scoped_lock lock(mSubscribersMutex);
134  mNrOfSubscribersWithoutChannelSubscriber++;
135  }
136 
141  void addSubscriber(SubscriberPtr subscriber)
142  {
143  boost::mutex::scoped_lock lock(mSubscribersMutex);
144  mSubscribers.push_back(subscriber);
145  subscriber->attachChannel(this);
146  }
147 
148 public:
149 
157  ChannelRead<T> read();
158 
169  ChannelRead<T> read(const Time& timestamp, SlotQueryMode mode = NEAREST_SLOT,
170  const Duration& tolerance = Duration::infinity());
171 
195  ChannelReadInterval<T> readInterval(const Time& timestamp, std::size_t nrSlots,
196  std::size_t olderSlots, std::size_t newerSlots,
197  IntervalFillMode fillMode = PREFER_NEWER);
198 
217  ChannelReadInterval<T> readInterval(const Time& from,
218  const Time& to = Time::eternity());
219 
232  ChannelWrite<T> write();
233 
234 public:
235  friend class Channel<T>;
236 };
237 
239 
240 
247 template<typename T>
248 struct ChannelCaster {
249  static ConcreteChannel<T>* cast(AbstractChannel* p)
250  {
251  // promote the channel if necessary (this will throw an exception, if
252  // the channel cannot be promoted to the desired type)
253  promote_channel<T>(p);
254 
255  assert(p->isTyped()); // at the point p will always be typed
256 
257  // check the type of our buffer's slot manually
258  if(typeId<T>()!=p->getTypeId())
259  MIRA_THROW(XBadCast, "Cannot cast channel '" << p->getID()
260  << "' (type '" << p->getTypename() << "') "
261  << " to typed channel of type '" << typeName<T>() << "'");
262 
263  // cast us "hard" using a static_cast.
264  // This is safe, since we have checked the types above
265  return static_cast<ConcreteChannel<T>*>(p);
266  }
267 };
268 
270 
271 // specialization to cast to untyped ConcreteChannel (void)
272 template<>
273 struct ChannelCaster<void> {
274  static ConcreteChannel<void>* cast(AbstractChannel* p)
275  {
276  // cast us "hard" using a static_cast.
277  // This is safe, since all channels can be casted to untyped channel
278  return static_cast<ConcreteChannel<void>* >(p);
279  }
280 };
281 
283 
284 // specialization to cast polymorphic channels
285 template<typename T>
286 struct ChannelCaster<T*> {
287  static ConcreteChannel<T*>* cast(AbstractChannel* p)
288  {
289  static_assert(std::is_base_of<mira::Object,T>::value,
290  "Pointers that are used in channels must be derived from "
291  "mira::Object. Pointers to other classes cannot be used.");
292 
293  // promote the channel if necessary (this will throw an exception, if the
294  // the channel cannot be promoted to the desired type)
295  promote_channel<T*>(p);
296 
297  // channel must be typed after promotion
298  assert(p->getBuffer()->isPolymorphic());
299 
300  // cast us "hard" using a static_cast.
301  // This is safe, since we have checked the types above
302  return static_cast<ConcreteChannel<T*>* >(p);
303  }
304 };
305 
307 
308 template<typename T>
309 inline ConcreteChannel<T>* channel_cast(AbstractChannel* p)
310 {
311  return ChannelCaster<T>::cast(p);
312 }
313 
315 
317 
319 template <typename T>
320 class Channel;
321 
323 template<typename T>
324 inline Channel<T> channel_cast(Channel<void> channel);
326 
327 
336 };
338 
339 
340 namespace {
341 
342 template <typename T>
343 struct ParamHelper {
344  typedef T type;
345 };
346 
347 template<>
348 struct ParamHelper<void> {
349  typedef int type; // arbitrary, it will not be used for T=void actually,
350  // but needs to name a valid argument type
351 };
352 
353 }
354 
356 
402 template <typename T>
403 class Channel
404 {
405 public:
406 
410  Channel() : mChannel(), mAccessFlags(CHANNEL_ACCESS_NONE) {}
411 
416  mChannel(channel), mAccessFlags(accessFlags) {
417  assert(mChannel!=NULL);
418  }
419 
423  void reset() {
424  mChannel=NULL;
425  mAccessFlags = CHANNEL_ACCESS_NONE;
426  }
427 
432  bool isValid() const {
433  return mChannel!=NULL;
434  }
435 
441  void validate() const {
442  if(mChannel==NULL)
443  MIRA_THROW(XAccessViolation,
444  "No channel assigned to the channel proxy (of type " <<
445  typeName<T>() << "). "
446  "You can obtain a channel using Authority::getChannel()!");
447  }
448 
454 
458  const std::string& getID() const {
459  validate();
460  return mChannel->getID();
461  }
462 
468  int getTypeId() const {
469  validate();
470  return mChannel->getTypeId();
471  }
472 
476  bool isTyped() const { return getTypeId()>=0; }
477 
483  validate();
484  return mChannel->getTypename();
485  }
486 
491  void setTypename(const Typename& type) {
492  validate();
493  mChannel->setTypename(type);
494  }
495 
500  validate();
501  return mChannel->getTypeMeta();
502  }
503 
508  validate();
509  mChannel->setTypeMeta(meta);
510  }
511 
513 
514 public:
515 
521 
525  bool isEmpty() const {
526  validate();
527  return mChannel->getNrOfSlots() == 0;
528  }
529 
533  bool hasSubscriber() const {
534  validate();
535  return mChannel->hasSubscriber();
536  }
537 
541  bool hasPublisher() const {
542  validate();
543  return mChannel->hasPublisher();
544  }
545 
549  bool hasSoloSlot() const {
550  validate();
551  return mChannel->getBuffer()->getMaxSlots() == 1;
552  }
553 
557  std::size_t getMaxSlots() const {
558  validate();
559  return mChannel->getBuffer()->getMaxSlots();
560  }
561 
565  std::size_t getMinSlots() const {
566  validate();
567  return mChannel->getBuffer()->getMinSlots();
568  }
569 
575  validate();
576  return mChannel->getBuffer()->getStorageDuration();
577  }
578 
583  validate();
584  return mChannel->getBuffer()->isAutoIncreasingStorageDuration();
585  }
586 
590  std::size_t getNrOfSlots() const {
591  validate();
592  return mChannel->getBuffer()->getSize();
593  }
594 
596 
597 public:
598 
605 
617  {
618  validateReadAccess();
619 
620  Time end;
621  if(!timeout.isValid() || timeout.isInfinity())
622  end = Time::eternity();
623  else
624  end = Time::now() + timeout;
625 
626  while(!boost::this_thread::interruption_requested())
627  {
628  try {
629  return mChannel->read();
630  } catch(XInvalidRead& ex) {}
631  if(Time::now()>end) // handle timeout
632  break;
633  MIRA_SLEEP(50)
634  }
635  return ChannelRead<T>();
636  }
637 
638 
648  bool waitForPublisher(const Duration& timeout = Duration::infinity()) const
649  {
650  validateReadAccess();
651 
652  Time end;
653  if(!timeout.isValid() || timeout.isInfinity())
654  end = Time::eternity();
655  else
656  end = Time::now() + timeout;
657 
658  while(!boost::this_thread::interruption_requested())
659  {
660  if(hasPublisher())
661  return true;
662  if(Time::now()>end) // handle timeout
663  break;
664  MIRA_SLEEP(50)
665  }
666  return false; // timeout
667  }
668 
669 
679  validateReadAccess();
680  return mChannel->read();
681  }
682 
704  const Duration& tolerance = Duration::infinity()) {
705  validateReadAccess();
706  return mChannel->read(timestamp, mode, tolerance);
707  }
708 
727  const Duration& searchInterval = Duration::seconds(1)) {
728  validateReadAccess();
729  Time newestSlotTime = mChannel->read()->timestamp;
730  ChannelReadInterval<T> interval = readInterval(newestSlotTime - searchInterval, newestSlotTime);
731  typename ChannelReadInterval<T>::const_iterator iter = interval.begin();
732  for(; iter != interval.end(); ++iter){
733  if(iter->sequenceID == sequenceID)
734  return (ChannelRead<T>)iter;
735  }
736  MIRA_THROW(XInvalidRead, "No slot with sequenceID "<<sequenceID<<
737  " found within searchInterval of channel");
738  }
739 
745  ChannelRead<T> read(const Time& timestamp, const Duration& tolerance) {
746  validateReadAccess();
747  return mChannel->read(timestamp, NEAREST_SLOT, tolerance);
748  }
749 
779  std::size_t nrSlots,
780  std::size_t olderSlots,
781  std::size_t newerSlots,
782  IntervalFillMode fillMode = PREFER_NEWER) {
783  validateReadAccess();
784  return mChannel->readInterval(timestamp, nrSlots, olderSlots,
785  newerSlots, fillMode);
786  }
787 
804  const Time& to=Time::eternity()) {
805  validateReadAccess();
806  return mChannel->readInterval(from, to);
807  }
808 
826  validateWriteAccess();
827  return mChannel->write();
828  }
829 
861  ChannelWrite<T> write(bool copyLatestData) {
862  validateWriteAccess();
863 
864  // check if we should and need to copy data into the write slot
865  if(copyLatestData
866  && (mChannel->getBuffer()->getMaxSlots()>1) // only necessary if we may have more than one slot
867  && (mChannel->getBuffer()->getSize()>0)) // and only if we have at least one slot yet
868  {
869  ChannelRead<T> latest = mChannel->read();
870  Stamped<T> tmp(*latest);
871  latest.finish();
872  ChannelWrite<T> writeSlot = mChannel->write();
873  *writeSlot = tmp;
874  return writeSlot;
875 
876  } else
877  return mChannel->write();
878  }
879 
893  Stamped<T> get() {
894  validateReadAccess();
895  ChannelRead<T> value = mChannel->read();
896  return *value;
897  }
898 
912  Stamped<T> get(const Time& timestamp, SlotQueryMode mode=NEAREST_SLOT,
913  const Duration& tolerance = Duration::infinity()) {
914  validateReadAccess();
915  ChannelRead<T> value = mChannel->read(timestamp, mode, tolerance);
916  return *value;
917  }
918 
924  Stamped<T> get(const Time& timestamp, Duration tolerance) {
925  validateReadAccess();
926  ChannelRead<T> value = mChannel->read(timestamp, NEAREST_SLOT, tolerance);
927  return *value;
928  }
929 
930 private:
931 
933 
935  struct GetTime
936  {
937  GetTime(const Time& iT0) : t0(iT0) {}
938 
939  //typedef const Time& result_type;
940  typedef float result_type;
941  result_type operator()(const Stamped<T>& p) const {
942  //return p.timestamp;
943  return (p.timestamp-t0).totalMilliseconds();
944  }
945 
946  Time t0;
947  };
948 
950  struct GetValue
951  {
952  typedef const T& result_type;
953  result_type operator()(const Stamped<T>& p) const {
954  return p;
955  }
956  };
957 
959 
960 public:
961 
980  template <typename Filter>
981  Stamped<T> get(const Time& timestamp, Filter&& filter) {
982  validateReadAccess();
983 
985  try
986  {
987  data = readInterval(timestamp, filter.samples(),
988  filter.samplesBefore(),
989  filter.samplesAfter());
990  // check filter requirements
991  if (!filter.canExtrapolate())
992  {
993  int samplesBefore = filter.samplesBefore();
994  int samplesAfter = filter.samplesAfter();
995  // a rbegin in ChannelReadInterval could speed this up
996  for (auto it = data.begin(); it != data.end(); ++it)
997  {
998  if (it->timestamp <= timestamp)
999  --samplesBefore;
1000  else if (it->timestamp >= timestamp)
1001  --samplesAfter;
1002  }
1003 
1004  if (samplesBefore > 0)
1005  MIRA_THROW(XRuntime, "Filter::samplesBefore: Requirements not met. Missing " << samplesBefore << " items.");
1006  if (samplesAfter > 0)
1007  MIRA_THROW(XRuntime, "Filter::samplesAfter: Requirements not met. Missing " << samplesAfter << " items.");
1008  }
1009  }
1010  catch(Exception&)
1011  {
1012  // read interval failed so test if the channel only contains a single data element
1013  // if so return it as a special case for interpolation of channels that will only
1014  // receive a single update during their lifetime
1015  if (mChannel->getNrOfSlots() == 1)
1016  return get();
1017  // more than one data element in the channel but still not sufficient for interpolation
1018  // rethrow is our only option
1019  throw;
1020  }
1021 
1022  const Time t0 = data.begin()->timestamp;
1023 
1024  typedef typename ChannelReadInterval<T>::const_iterator const_iterator;
1025  typedef boost::transform_iterator<GetTime, const_iterator> GetTimeIterator;
1026  GetTimeIterator begin1 = GetTimeIterator(data.begin(), GetTime(t0));
1027  GetTimeIterator end1 = GetTimeIterator(data.end() , GetTime(t0));
1028 
1029  typedef boost::transform_iterator<GetValue, const_iterator> GetValueIterator;
1030 
1031  GetValueIterator begin2=GetValueIterator(data.begin(), GetValue());
1032  GetValueIterator end2 =GetValueIterator(data.end() , GetValue());
1033 
1034  typedef mira::IteratorRangeContainer<GetTimeIterator> TimeContainer;
1035  typedef mira::IteratorRangeContainer<GetValueIterator> ValueContainer;
1036  TimeContainer timeContainer(begin1, end1);
1037  ValueContainer valueContainer(begin2, end2);
1038 
1039  return makeStamped(filter.template apply<float, T>(timeContainer,
1040  valueContainer,
1041  (timestamp-t0).totalMilliseconds()),
1042  timestamp);
1043  }
1044 
1054  template <typename U = void>
1055  void post(const Stamped<T>& value) {
1056  validateWriteAccess();
1057  ChannelWrite<T> writeSlot = mChannel->write();
1058  *writeSlot = value;
1059  writeSlot.finish(); // explicit finish to avoid throwing in destructor
1060  }
1061 
1063  template <typename U = void>
1064  void post(Stamped<T>&& value) {
1065  validateWriteAccess();
1066  ChannelWrite<T> writeSlot = mChannel->write();
1067  *writeSlot = std::move(value);
1068  writeSlot.finish(); // explicit finish to avoid throwing in destructor
1069  }
1070 
1080  template <typename U>
1081  typename std::enable_if<!std::is_base_of_v<StampedHeader, std::decay_t<U>>>::type
1082  post(U&& value, const Time& timestamp = Time::now()) {
1083  validateWriteAccess();
1084  ChannelWrite<T> writeSlot = mChannel->write();
1085  *writeSlot = makeStamped(std::forward<U>(value), timestamp);
1086  writeSlot.finish(); // explicit finish to avoid throwing in destructor
1087  }
1088 
1098  template <typename U = T>
1099  typename std::enable_if<!std::is_void<U>::value>::type
1100  post(const typename ParamHelper<T>::type& value, const Time& timestamp = Time::now()) {
1101  validateWriteAccess();
1102  ChannelWrite<T> writeSlot = mChannel->write();
1103  *writeSlot = makeStamped(value, timestamp);
1104  writeSlot.finish(); // explicit finish to avoid throwing in destructor
1105  }
1106 
1108  template <typename U = T>
1109  typename std::enable_if<!std::is_void<U>::value>::type
1110  post(typename ParamHelper<T>::type&& value, const Time& timestamp = Time::now()) {
1111  validateWriteAccess();
1112  ChannelWrite<T> writeSlot = mChannel->write();
1113  *writeSlot = makeStamped(std::move(value), timestamp);
1114  writeSlot.finish(); // explicit finish to avoid throwing in destructor
1115  }
1116 
1118 
1119 public:
1120 
1122  template<typename U>
1123  friend Channel<U> channel_cast(Channel<void> channel);
1125 
1126 public:
1127 
1129  void dbgDump(bool brief=true) { mChannel->dbgDump(brief); }
1131 
1132 private:
1133 
1134  void validateReadAccess() const
1135  {
1136  validate();
1137  if((mAccessFlags & CHANNEL_ACCESS_READ)==0)
1138  MIRA_THROW(XAccessViolation, "You are not allowed to read from channel '"
1139  << mChannel->getID() << "'. Forgot to subscribe?");
1140  }
1141 
1142  void validateWriteAccess() const
1143  {
1144  validate();
1145  if((mAccessFlags & CHANNEL_ACCESS_WRITE)==0)
1146  MIRA_THROW(XAccessViolation, "You are not allowed to write to channel '"
1147  << mChannel->getID() << "'. Forgot to publish?");
1148  }
1149 
1150 private:
1151 
1152  ConcreteChannel<T>* mChannel;
1153  ChannelAccessFlags mAccessFlags;
1154 };
1155 
1157 
1159 template<typename U>
1160 inline Channel<U> channel_cast(Channel<void> channel)
1161 {
1162  channel.validate();
1163  return Channel<U>(channel_cast<U>(channel.mChannel), channel.mAccessFlags);
1164 }
1166 
1168 
1169 } // namespace
1170 
1171 #include "impl/ChannelReadWrite.hpp"
1172 #include "impl/ChannelReadInterval.hpp"
1173 
1174 #endif
TypeMetaPtr getTypeMeta() const
Return the type meta information for this channel.
Definition: Channel.h:499
void write(const Value &value, std::ostream &ioStream, bool formatted=false, int precision=-1)
Writes a json::Value into a given stream using the JSON format.
std::enable_if<!std::is_base_of_v< StampedHeader, std::decay_t< U > > >::type post(U &&value, const Time &timestamp=Time::now())
Writes the specified data with the specified time stamp into the channel.
Definition: Channel.h:1082
An object that allows read access to a whole interval of channel data.
Definition: ChannelReadInterval.h:72
const std::string & getID() const
Return the channel ID, its name.
Definition: Channel.h:458
Read access (Authority is a subscriber)
Definition: Channel.h:334
bool hasPublisher() const
Returns true, if this channel has at least one publisher.
Definition: Channel.h:541
void finish()
Releases the lock explicitly.
Definition: ChannelReadWrite.h:601
std::size_t getMaxSlots() const
Returns the upper limit of slots that are allowed for this channel.
Definition: Channel.h:557
void post(const Stamped< T > &value)
Writes the specified data into the channel.
Definition: Channel.h:1055
An exception that occurs whenever a channel has no data.
Definition: Channel.h:88
void post(Stamped< T > &&value)
Same as above, for rvalue reference (move semantics)
Definition: Channel.h:1064
Write access (Authority is a publisher)
Definition: Channel.h:335
Macros for generating logical operators for using enum values as flags.
ChannelRead< T > read(uint32 sequenceID, const Duration &searchInterval=Duration::seconds(1))
Obtains read access to the element with the specified sequenceID within the given search interval If ...
Definition: Channel.h:726
void validate() const
Checks if the channel is valid otherwise throws an exception.
Definition: Channel.h:441
#define MIRA_ENUM_TO_FLAGS(EnumType)
Macro that can be used with enums that contain flags.
Definition: EnumToFlags.h:80
specialize cv::DataType for our ImgPixel and inherit from cv::DataType<Vec>
Definition: IOService.h:67
Subscriber classes used to subscribe on channels for automatic notification.
Channel(ConcreteChannel< T > *channel, ChannelAccessFlags accessFlags)
Is used by Framework to create a channel proxy object.
Definition: Channel.h:415
std::string Typename
Definition: Typename.h:60
void setTypeMeta(TypeMetaPtr meta)
Set the type meta information for this channel.
Definition: Channel.h:507
bool isTyped() const
Returns true, if the channel is typed and false, if it is untyped.
Definition: Channel.h:476
An object that allows exclusive write access to data of a channel.
Definition: ChannelReadWrite.h:652
void read(const std::string &s, Value &oValue)
Read a json::Value from a string that contains JSON format.
uint32_t uint32
Definition: Types.h:64
#define MIRA_DEFINE_SERIALIZABLE_EXCEPTION(Ex, Base)
Macro for easily defining a new serializable exception class.
Definition: Exceptions.h:66
Definition: ChannelReadWrite.h:67
An object that allows read access to data of a channel.
Definition: ChannelReadWrite.h:494
ChannelReadInterval< T > readInterval(const Time &timestamp, std::size_t nrSlots, std::size_t olderSlots, std::size_t newerSlots, IntervalFillMode fillMode=PREFER_NEWER)
Obtains read access to an interval of elements before and after the requested timestamp.
Definition: Channel.h:778
#define MIRA_THROW(ex, msg)
Macro for throwing an exception.
Definition: Exception.h:78
Typename getTypename() const
Return the typename of the channel.
Definition: Channel.h:482
void finish()
Releases the lock explicitly and informs the Channel to signal all Subscribers that new data is avail...
Definition: ChannelReadWrite.h:767
Wrapper class for boost::posix_time::ptime for adding more functionality to it.
Definition: Time.h:418
ChannelRead< T > read(const Time &timestamp, SlotQueryMode mode=NEAREST_SLOT, const Duration &tolerance=Duration::infinity())
Obtains read access to the element at the specified timestamp.
Definition: Channel.h:703
const_iterator end() const
Definition: ChannelReadInterval.h:164
const_iterator begin() const
Definition: ChannelReadInterval.h:163
Classes for automatic locking/unlocking when reading and writing to channels.
Commonly used exception classes.
std::size_t getNrOfSlots() const
Returns how many slots (i.e.
Definition: Channel.h:590
PropertyHint type(const std::string &t)
Sets the attribute "type" to the specified value.
Definition: PropertyHint.h:295
Definition: AbstractChannel.h:70
bool hasSoloSlot() const
Returns true, if this channel has one solo slot only.
Definition: Channel.h:549
sec_type seconds() const
Returns normalized number of seconds (0..59)
Definition: Time.h:280
Use this class to represent time durations.
Definition: Time.h:106
ChannelRead< T > read(const Time &timestamp, const Duration &tolerance)
Same as above, but always takes the nearest slot.
Definition: Channel.h:745
ChannelRead< T > read()
Obtains read access to the latest data element of this channel.
Definition: Channel.h:678
void reset()
Reset the proxy object so that it becomes invalid.
Definition: Channel.h:423
Typed ChannelBuffer.
Definition: ChannelBuffer.h:890
The slot with smallest time difference to the requested will be chosen.
Definition: ChannelBuffer.h:102
Const iterator for iterating over the interval.
Definition: ChannelReadInterval.h:85
void setTypename(const Typename &type)
Set the typename of this channel.
Definition: Channel.h:491
static Time now()
Returns the current utc based time.
Definition: Time.h:481
Mix in for adding a time stamp, an optional frame id and an optional sequence id to data types like P...
Definition: Stamped.h:149
boost::shared_ptr< TypeMeta > TypeMetaPtr
Definition: MetaSerializer.h:309
std::enable_if<!std::is_void< U >::value >::type post(typename ParamHelper< T >::type &&value, const Time &timestamp=Time::now())
Same as above, for rvalue reference (move semantics)
Definition: Channel.h:1110
bool isAutoIncreasingStorageDuration() const
Returns whether the channel buffer is automatically increasing the storage duration.
Definition: Channel.h:582
std::enable_if<!std::is_void< U >::value >::type post(const typename ParamHelper< T >::type &value, const Time &timestamp=Time::now())
This allows post({}, Time()); to deduce we want to post an object of the channel&#39;s type...
Definition: Channel.h:1100
Duration getStorageDuration() const
Returns the timeframe that specifies how long a slot is guaranteed to be kept in the channel buffer...
Definition: Channel.h:574
Stamped< typename std::decay< T >::type > makeStamped(T &&value, const Time &timestamp=Time::now(), const std::string &frameID=std::string(), uint32 sequenceID=0)
Declare stamped classes for all standard data types including std::string.
Definition: Stamped.h:471
static Time eternity()
Returns 9999/12/31 23:59:59.999999.
Definition: Time.h:489
Base class for exceptions.
Definition: Exception.h:195
Generic buffer class that can be used as a replacement for std::vector whenever copying and reallocat...
Definition: Buffer.h:84
bool hasSubscriber() const
Returns true, if this channel has at least one subscriber.
Definition: Channel.h:533
static Duration infinity()
Returns a special duration time representing positive infinity.
Definition: Time.h:242
An iterator range class.
ChannelRead< T > waitForData(const Duration &timeout=Duration::infinity()) const
Waits until data in this channel becomes available.
Definition: Channel.h:616
Channel()
Create channel proxy that is not assigned to a channel.
Definition: Channel.h:410
ChannelWrite< T > write()
Obtains exclusive write access to the next free data slot of this channel.
Definition: Channel.h:825
No access at all (Authority is not a publisher nor a subscriber)
Definition: Channel.h:333
ChannelWrite< T > write(bool copyLatestData)
Same as write above with an additional parameter copyLatestData that allows you to specify whether th...
Definition: Channel.h:861
std::size_t getMinSlots() const
Returns the number slots that are guaranteed to be kept in the channel buffer.
Definition: Channel.h:565
int getTypeId() const
Returns the type id of the channel.
Definition: Channel.h:468
Prefer filling the interval with slots with timestamp > requested.
Definition: ChannelBuffer.h:114
bool isValid() const
Returns true if the proxy object is valid.
Definition: Channel.h:432
IntervalFillMode
Mode that is used to determine what slots should be added to the interval when not enough slots are a...
Definition: ChannelBuffer.h:109
SlotQueryMode
Mode that is used to determine the slot obtained from a channel when no slot exists at the exact time...
Definition: ChannelBuffer.h:93
Base class for all framework channels.
Infrastructure for promotion of channels from void to typed based on runtime knowledge of the typenam...
#define MIRA_SLEEP(ms)
Sleeps for ms milliseconds This is a thread interruption point - if interruption of the current threa...
Definition: Thread.h:97
Implements AbstractChannelSubscriber for a concrete data type.
Definition: ChannelSubscriber.h:82
The framework that holds all manager classes and provides startup and shutdown of all framework relat...
Provides method for generating a unique id for any type.
bool isEmpty() const
Returns if the channel is empty (no data has been published)
Definition: Channel.h:525
bool waitForPublisher(const Duration &timeout=Duration::infinity()) const
Waits until this channel has at least one publisher.
Definition: Channel.h:648
Wraps an STL conform container around a range of values within another container. ...
Definition: IteratorRangeContainer.h:64
Classes for reading whole intervals of data from channels.
ChannelReadInterval< T > readInterval(const Time &from, const Time &to=Time::eternity())
Obtains read access to an interval of elements in a given time span.
Definition: Channel.h:803
ChannelAccessFlags
Flags specifying the access rights of an authority to a channel Can be combined.
Definition: Channel.h:332