LCM
lcm-cpp.hpp
1 #ifndef __lcm_cpp_hpp__
2 #define __lcm_cpp_hpp__
3 
4 #ifndef LCM_CXX_11_ENABLED
5 #if __cplusplus >= 201103L
6 #define LCM_CXX_11_ENABLED 1
7 #else
8 #define LCM_CXX_11_ENABLED 0
9 #endif
10 #endif
11 
12 #include <cstdio> /* needed for FILE* */
13 #include <string>
14 #include <vector>
15 #include "lcm.h"
16 
17 #if LCM_CXX_11_ENABLED
18 #include <functional>
19 #endif
20 
21 namespace lcm {
22 
34 class Subscription;
35 
36 struct ReceiveBuffer;
37 
43 class LCM {
44  public:
54  inline LCM(std::string lcm_url = "");
55 
63  inline LCM(lcm_t *lcm_in);
64 
71  inline ~LCM();
72 
80  inline bool good() const;
81 
91  inline int publish(const std::string &channel, const void *data, unsigned int datalen);
92 
104  template <class MessageType>
105  inline int publish(const std::string &channel, const MessageType *msg);
106 
123  inline int getFileno();
124 
131  inline int handle();
132 
142  inline int handleTimeout(int timeout_millis);
143 
198  template <class MessageType, class MessageHandlerClass>
199  Subscription *subscribe(const std::string &channel,
200  void (MessageHandlerClass::*handlerMethod)(const ReceiveBuffer *rbuf,
201  const std::string &channel,
202  const MessageType *msg),
203  MessageHandlerClass *handler);
204 
252  template <class MessageHandlerClass>
253  Subscription *subscribe(const std::string &channel,
254  void (MessageHandlerClass::*handlerMethod)(const ReceiveBuffer *rbuf,
255  const std::string &channel),
256  MessageHandlerClass *handler);
257 
316  template <class MessageType, class ContextClass>
317  Subscription *subscribeFunction(const std::string &channel,
318  void (*handler)(const ReceiveBuffer *rbuf,
319  const std::string &channel,
320  const MessageType *msg, ContextClass context),
321  ContextClass context);
322 
363  template <class ContextClass>
364  Subscription *subscribeFunction(const std::string &channel,
365  void (*handler)(const ReceiveBuffer *rbuf,
366  const std::string &channel,
367  ContextClass context),
368  ContextClass context);
369 
370 #if LCM_CXX_11_ENABLED
374  template <class MessageType>
375  using HandlerFunction = std::function<void(const ReceiveBuffer *rbuf,
376  const std::string &channel, const MessageType *msg)>;
425  template <class MessageType>
426  Subscription *subscribe(const std::string &channel, HandlerFunction<MessageType> handler);
427 #endif
428 
443  inline int unsubscribe(Subscription *subscription);
444 
457 
458  private:
459  lcm_t *lcm;
460  bool owns_lcm;
461 
462  std::vector<Subscription *> subscriptions;
463 };
464 
474  void *data;
478  uint32_t data_size;
483  int64_t recv_utime;
484 };
485 
500  public:
501  virtual ~Subscription() {}
516  inline int setQueueCapacity(int num_messages);
517 
522  inline int getQueueSize() const;
523 
524  friend class LCM;
525 
526  protected:
527  Subscription(){};
533 };
534 
546 struct LogEvent {
551  int64_t eventnum;
556  int64_t timestamp;
560  std::string channel;
564  int32_t datalen;
568  void *data;
569 };
570 
580 class LogFile {
581  public:
589  inline LogFile(const std::string &path, const std::string &mode);
590 
594  inline ~LogFile();
595 
599  inline bool good() const;
600 
610  inline const LogEvent *readNextEvent();
611 
621  inline int seekToTimestamp(int64_t timestamp);
622 
633  inline int writeEvent(LogEvent *event);
634 
645  inline FILE *getFilePtr();
646 
647  private:
648  LogEvent curEvent;
649  lcm_eventlog_t *eventlog;
650  lcm_eventlog_event_t *last_event;
651 };
652 
657 #define __lcm_cpp_impl_ok__
658 #include "lcm-cpp-impl.hpp"
659 #undef __lcm_cpp_impl_ok__
660 }
661 
662 #endif
Core communications class for the C++ API.
Definition: lcm-cpp.hpp:43
int publish(const std::string &channel, const MessageType *msg)
Publishes a message with automatic message encoding.
Subscription * subscribe(const std::string &channel, void(MessageHandlerClass::*handlerMethod)(const ReceiveBuffer *rbuf, const std::string &channel), MessageHandlerClass *handler)
Subscribe a callback method of an object to a channel, without automatic message decoding.
LCM(std::string lcm_url="")
Constructor.
Subscription * subscribeFunction(const std::string &channel, void(*handler)(const ReceiveBuffer *rbuf, const std::string &channel, const MessageType *msg, ContextClass context), ContextClass context)
Subscribe a function callback to a channel, with automatic message decoding.
~LCM()
Destructor.
bool good() const
Checks if initialization succeeded during object construction.
Subscription * subscribe(const std::string &channel, void(MessageHandlerClass::*handlerMethod)(const ReceiveBuffer *rbuf, const std::string &channel, const MessageType *msg), MessageHandlerClass *handler)
Subscribes a callback method of an object to a channel, with automatic message decoding.
LCM(lcm_t *lcm_in)
Constructor.
int publish(const std::string &channel, const void *data, unsigned int datalen)
Publishes a raw data message.
int handleTimeout(int timeout_millis)
Waits for and dispatches messages, with a timeout.
lcm_t * getUnderlyingLCM()
retrives the lcm_t C data structure wrapped by this class.
int handle()
Waits for and dispatches messages.
int getFileno()
Returns a file descriptor or socket that can be used with select(), poll(), or other event loops for ...
Subscription * subscribeFunction(const std::string &channel, void(*handler)(const ReceiveBuffer *rbuf, const std::string &channel, ContextClass context), ContextClass context)
Subscribe a function callback to a channel, without automatic message decoding.
int unsubscribe(Subscription *subscription)
Unsubscribes a message handler.
Read and write LCM log files.
Definition: lcm-cpp.hpp:580
FILE * getFilePtr()
retrives the underlying FILE* wrapped by this class.
bool good() const
const LogEvent * readNextEvent()
int writeEvent(LogEvent *event)
int seekToTimestamp(int64_t timestamp)
LogFile(const std::string &path, const std::string &mode)
Represents a channel subscription, and can be used to unsubscribe and set options.
Definition: lcm-cpp.hpp:499
int getQueueSize() const
Query the current number of unhandled messages queued up for this subscription.
lcm_subscription_t * c_subs
Definition: lcm-cpp.hpp:527
int setQueueCapacity(int num_messages)
Adjusts the maximum number of received messages that can be queued up for this subscription.
struct _lcm_subscription_t lcm_subscription_t
Definition: lcm.h:55
struct _lcm_t lcm_t
Definition: lcm.h:50
Represents a single event (message) in a log file.
Definition: lcm-cpp.hpp:546
void * data
Definition: lcm-cpp.hpp:568
int64_t eventnum
Definition: lcm-cpp.hpp:551
std::string channel
Definition: lcm-cpp.hpp:560
int64_t timestamp
Definition: lcm-cpp.hpp:556
int32_t datalen
Definition: lcm-cpp.hpp:564
Stores the raw bytes and timestamp of a received message.
Definition: lcm-cpp.hpp:470
void * data
Definition: lcm-cpp.hpp:474
uint32_t data_size
Definition: lcm-cpp.hpp:478
int64_t recv_utime
Definition: lcm-cpp.hpp:483