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
371
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
456 inline lcm_t *getUnderlyingLCM();
457
458 private:
459 lcm_t *lcm;
460 bool owns_lcm;
461
462 std::vector<Subscription *> subscriptions;
463 };
464
470 struct ReceiveBuffer {
474 void *data;
478 uint32_t data_size;
483 int64_t recv_utime;
484 };
485
499 class Subscription {
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(){};
532 lcm_subscription_t *c_subs;
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
lcm::LCM::good
bool good() const
Checks if initialization succeeded during object construction.
lcm::Subscription::setQueueCapacity
int setQueueCapacity(int num_messages)
Adjusts the maximum number of received messages that can be queued up for this subscription.
lcm::LogFile::getFilePtr
FILE * getFilePtr()
retrives the underlying FILE* wrapped by this class.
lcm::LCM::subscribeFunction
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::LCM::publish
int publish(const std::string &channel, const void *data, unsigned int datalen)
Publishes a raw data message.
lcm::LogFile::readNextEvent
const LogEvent * readNextEvent()
lcm::LCM::getFileno
int getFileno()
Returns a file descriptor or socket that can be used with select(), poll(), or other event loops for ...
lcm::LogFile
Read and write LCM log files.
Definition: lcm-cpp.hpp:580
lcm::LCM::getUnderlyingLCM
lcm_t * getUnderlyingLCM()
retrives the lcm_t C data structure wrapped by this class.
lcm::LCM::handleTimeout
int handleTimeout(int timeout_millis)
Waits for and dispatches messages, with a timeout.
lcm::Subscription
Represents a channel subscription, and can be used to unsubscribe and set options.
Definition: lcm-cpp.hpp:499
lcm::LCM::~LCM
~LCM()
Destructor.
lcm::LCM::subscribe
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_subscription_t
struct _lcm_subscription_t lcm_subscription_t
Definition: lcm.h:55
lcm::ReceiveBuffer
Stores the raw bytes and timestamp of a received message.
Definition: lcm-cpp.hpp:470
lcm::LogEvent::data
void * data
Definition: lcm-cpp.hpp:568
lcm::ReceiveBuffer::data_size
uint32_t data_size
Definition: lcm-cpp.hpp:478
lcm::ReceiveBuffer::recv_utime
int64_t recv_utime
Definition: lcm-cpp.hpp:483
lcm::Subscription::getQueueSize
int getQueueSize() const
Query the current number of unhandled messages queued up for this subscription.
lcm::LogFile::good
bool good() const
lcm::LogFile::LogFile
LogFile(const std::string &path, const std::string &mode)
lcm::LCM::LCM
LCM(std::string lcm_url="")
Constructor.
lcm::LogFile::~LogFile
~LogFile()
lcm::LogEvent::channel
std::string channel
Definition: lcm-cpp.hpp:560
lcm::LogFile::seekToTimestamp
int seekToTimestamp(int64_t timestamp)
lcm::LCM::unsubscribe
int unsubscribe(Subscription *subscription)
Unsubscribes a message handler.
lcm::LCM
Core communications class for the C++ API.
Definition: lcm-cpp.hpp:43
lcm::LCM::handle
int handle()
Waits for and dispatches messages.
lcm::ReceiveBuffer::data
void * data
Definition: lcm-cpp.hpp:474
lcm::LogEvent::timestamp
int64_t timestamp
Definition: lcm-cpp.hpp:556
lcm::Subscription::c_subs
lcm_subscription_t * c_subs
Definition: lcm-cpp.hpp:527
lcm::LogFile::writeEvent
int writeEvent(LogEvent *event)
lcm::LogEvent::eventnum
int64_t eventnum
Definition: lcm-cpp.hpp:551
lcm_t
struct _lcm_t lcm_t
Definition: lcm.h:50
lcm::LogEvent::datalen
int32_t datalen
Definition: lcm-cpp.hpp:564
lcm::LogEvent
Represents a single event (message) in a log file.
Definition: lcm-cpp.hpp:546