listeners.hh
Go to the documentation of this file.
1 
38 #ifndef LibMultiSense_impl_listeners
39 #define LibMultiSense_impl_listeners
40 
41 #include "MultiSense/MultiSenseTypes.hh"
42 
44 #include "utility/BufferStream.hh"
45 
46 namespace crl {
47 namespace multisense {
48 namespace details {
49 
50 //
51 // For access to a buffer back-end in a dispatch thread
52 
53 extern CRL_THREAD_LOCAL utility::BufferStream *dispatchBufferReferenceTP;
54 
55 //
56 // The dispatch mechanism. Each instance represents a bound
57 // listener to a datum stream.
58 
59 template<class THeader, class TCallback>
60 class Listener {
61 public:
62 
63  Listener(TCallback c,
64  DataSource s,
65  void *d,
66  uint32_t m=0)
67  : m_callback(c),
68  m_sourceMask(s),
69  m_userDataP(d),
70  m_running(false),
71  m_queue(m),
72  m_dispatchThreadP(NULL) {
73 
74  m_running = true;
76  };
77 
79  m_callback(NULL),
80  m_sourceMask(0),
81  m_userDataP(NULL),
82  m_running(false),
83  m_queue(),
84  m_dispatchThreadP(NULL) {};
85 
87  if (m_running) {
88  m_running = false;
89  m_queue.kick();
90  delete m_dispatchThreadP;
91  }
92  };
93 
94  #if __cplusplus > 199711L
95  Listener(Listener const&) = default;
96  Listener(Listener &&) = default;
97  Listener& operator=(Listener const&) = default;
98  Listener& operator=(Listener &&) = default;
99  #endif
100 
101  void dispatch(THeader& header) {
102 
103  if (header.inMask(m_sourceMask))
105  header,
106  m_userDataP));
107  };
108 
110  THeader& header) {
111 
112  if (header.inMask(m_sourceMask))
114  buffer,
115  header,
116  m_userDataP));
117  };
118 
119  TCallback callback() { return m_callback; };
120 
121 private:
122 
123  //
124  // For thread-safe dispatching
125 
126  class Dispatch {
127  public:
128 
129  Dispatch(TCallback c,
130  THeader& h,
131  void *d) :
132  m_callback(c),
133  m_exposeBuffer(false),
134  m_header(h),
135  m_userDataP(d) {};
136 
137  Dispatch(TCallback c,
139  THeader& h,
140  void *d) :
141  m_callback(c),
142  m_buffer(b),
143  m_exposeBuffer(true),
144  m_header(h),
145  m_userDataP(d) {};
146 
148  m_callback(NULL),
149  m_buffer(),
150  m_exposeBuffer(false),
151  m_header(),
152  m_userDataP(NULL) {};
153 
154 
155  #if __cplusplus > 199711L
156  Dispatch(Dispatch const&) = default;
157  Dispatch(Dispatch &&) = default;
158  Dispatch& operator=(Dispatch const&) = default;
159  Dispatch& operator=(Dispatch &&) = default;
160  #endif
161 
162  void operator() (void) {
163 
164  if (m_callback) {
165  if (m_exposeBuffer)
168  }
169  };
170 
171  private:
172 
173  TCallback m_callback;
176  THeader m_header;
177  void *m_userDataP;
178  };
179 
180  //
181  // The dispatch thread
182  //
183  // We are penalized with two memory copies of
184  // HEADER by std::deque, but the image/lidar data
185  // is zero-copy (reference-counted by BufferStream)
186 
187 #if WIN32
188  static DWORD WINAPI dispatchThread(void *argumentP) {
189 #else
190  static void *dispatchThread(void *argumentP) {
191 #endif
192 
193  Listener<THeader,TCallback> *selfP = reinterpret_cast< Listener<THeader,TCallback> * >(argumentP);
194 
195  while(selfP->m_running) {
196  try {
197  Dispatch d;
198  if (false == selfP->m_queue.wait(d))
199  break;
200  d();
201  } catch (const std::exception& e) {
202  CRL_DEBUG("exception invoking image callback: %s\n",
203  e.what());
204  } catch ( ... ) {
205  CRL_DEBUG_RAW("unknown exception invoking image callback\n");
206  }
207  };
208 
209 #if defined(__MINGW64__)
210  return 0;
211 #else
212  return NULL;
213 #endif
214  }
215 
216  //
217  // Set by user
218 
219  TCallback m_callback;
221  void *m_userDataP;
222 
223  //
224  // Dispatch mechanism
225 
226  volatile bool m_running;
229 };
230 
239 
240 } // namespace details
241 } // namespace multisense
242 } // namespace crl
243 
244 
245 #endif // LibMultiSense_impl_listeners
crl::multisense::details::Listener::Dispatch::Dispatch
Dispatch()
Definition: listeners.hh:147
CRL_DEBUG
#define CRL_DEBUG(fmt,...)
Definition: Exception.hh:71
crl::multisense::details::Listener::m_callback
TCallback m_callback
Definition: listeners.hh:219
crl::multisense::details::Listener::Dispatch::Dispatch
Dispatch(TCallback c, THeader &h, void *d)
Definition: listeners.hh:129
crl::multisense::details::Listener::Dispatch::m_buffer
utility::BufferStream m_buffer
Definition: listeners.hh:174
crl::multisense::details::AprilTagDetectionListener
Listener< apriltag::Header, apriltag::Callback > AprilTagDetectionListener
Definition: listeners.hh:237
BufferStream.hh
crl::multisense::details::Listener::Dispatch::operator()
void operator()(void)
Definition: listeners.hh:162
crl::multisense::details::PpsListener
Listener< pps::Header, pps::Callback > PpsListener
Definition: listeners.hh:233
CRL_DEBUG_RAW
#define CRL_DEBUG_RAW(fmt)
Definition: Exception.hh:78
crl::multisense::details::utility::WaitQueue
Definition: linux/Thread.hh:373
crl::multisense::details::dispatchBufferReferenceTP
CRL_THREAD_LOCAL utility::BufferStream * dispatchBufferReferenceTP
Definition: public.cc:130
crl::multisense::details::GroundSurfaceSplineListener
Listener< ground_surface::Header, ground_surface::Callback > GroundSurfaceSplineListener
Definition: listeners.hh:236
crl::multisense::details::ImageListener
Listener< image::Header, image::Callback > ImageListener
Definition: listeners.hh:231
crl::multisense::details::Listener::m_dispatchThreadP
utility::Thread * m_dispatchThreadP
Definition: listeners.hh:228
crl::multisense::details::Listener::Dispatch
Definition: listeners.hh:126
crl::multisense::details::SecondaryAppListener
Listener< secondary_app::Header, secondary_app::Callback > SecondaryAppListener
Definition: listeners.hh:238
crl
Definition: Legacy/details/channel.cc:61
crl::multisense::details::ImuListener
Listener< imu::Header, imu::Callback > ImuListener
Definition: listeners.hh:234
crl::multisense::details::Listener::~Listener
~Listener()
Definition: listeners.hh:86
crl::multisense::details::Listener::Listener
Listener(TCallback c, DataSource s, void *d, uint32_t m=0)
Definition: listeners.hh:63
crl::multisense::DataSource
uint64_t DataSource
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:115
crl::multisense::details::Listener::m_queue
utility::WaitQueue< Dispatch > m_queue
Definition: listeners.hh:227
crl::multisense::details::Listener::Dispatch::m_header
THeader m_header
Definition: listeners.hh:176
d
d
crl::multisense::details::Listener::Listener
Listener()
Definition: listeners.hh:78
crl::multisense::details::Listener::Dispatch::Dispatch
Dispatch(TCallback c, utility::BufferStream &b, THeader &h, void *d)
Definition: listeners.hh:137
crl::multisense::details::Listener::callback
TCallback callback()
Definition: listeners.hh:119
header
std_msgs::Header const * header(const M &m)
crl::multisense::details::Listener::Dispatch::m_exposeBuffer
bool m_exposeBuffer
Definition: listeners.hh:175
multisense
Definition: factory.cc:39
crl::multisense::details::Listener::dispatchThread
static void * dispatchThread(void *argumentP)
Definition: listeners.hh:190
crl::multisense::details::Listener::m_sourceMask
DataSource m_sourceMask
Definition: listeners.hh:220
crl::multisense::details::CompressedImageListener
Listener< compressed_image::Header, compressed_image::Callback > CompressedImageListener
Definition: listeners.hh:235
crl::multisense::details::Listener::Dispatch::m_callback
TCallback m_callback
Definition: listeners.hh:169
Thread.hh
crl::multisense::details::utility::Thread
Definition: linux/Thread.hh:73
crl::multisense::details::Listener::m_userDataP
void * m_userDataP
Definition: listeners.hh:221
crl::multisense::details::Listener
Definition: listeners.hh:60
crl::multisense::details::Listener::m_running
volatile bool m_running
Definition: listeners.hh:226
crl::multisense::details::utility::BufferStream
Definition: BufferStream.hh:66
crl::multisense::details::LidarListener
Listener< lidar::Header, lidar::Callback > LidarListener
Definition: listeners.hh:232
crl::multisense::details::Listener::Dispatch::m_userDataP
void * m_userDataP
Definition: listeners.hh:177
crl::multisense::details::Listener::dispatch
void dispatch(THeader &header)
Definition: listeners.hh:101
crl::multisense::details::Listener::dispatch
void dispatch(utility::BufferStream &buffer, THeader &header)
Definition: listeners.hh:109


multisense_lib
Author(s):
autogenerated on Thu Apr 17 2025 02:49:09