signal.hh
Go to the documentation of this file.
1 
37 #ifndef LibMultiSense_details_signal_hh
38 #define LibMultiSense_details_signal_hh
39 
41 #include "wire/Protocol.hh"
42 #include "wire/AckMessage.hh"
43 
44 #include <map>
45 
46 namespace crl {
47 namespace multisense {
48 namespace details {
49 
50 //
51 // Here we provide a thread-safe, blocking, signaling
52 // interface for sensor message RX.
53 
54 class MessageWatch {
55 public:
56 
58  Status status=Status_Ok) {
60 
61  Map::iterator it = m_map.find(id);
62 
63  if (m_map.end() != it)
64  it->second->post(status);
65  };
66 
67  void signal(const wire::Ack& ack) {
68  signal(ack.command, ack.status);
69  };
70 
71 private:
72 
73  friend class ScopedWatch;
74 
76  typedef std::map<wire::IdType, Signal*> Map;
77 
79  Signal *signalP) {
81 
82  Map::const_iterator it = m_map.find(type);
83 
84  //
85  // Hmm.. this will prohibit multiple threads
86  // simultaneously commanding the sensor with this
87  // message ID.
88 
89  if (m_map.end() != it)
90  CRL_EXCEPTION("ack signal already set for id=%d", type);
91 
92  m_map[type] = signalP;
93  };
94 
97 
98  Map::iterator it = m_map.find(type);
99 
100  if (m_map.end() == it)
101  CRL_EXCEPTION("ack signal not found for id=%d\n", type);
102 
103  m_map.erase(it);
104  };
105 
108 };
109 
110  //
111  // Exception-safe [de]registration of signal handlers
112 
113 class ScopedWatch {
114 public:
115 
117  MessageWatch& m) : m_id(t), m_map(m) {
119  };
120 
122  m_map.remove(m_id);
123  };
124 
125  bool wait(Status& status,
126  const double& timeout) {
127  return m_signal.timedWait(status, timeout);
128  };
129 
130 private:
131 
135 };
136 
137 } // namespace details
138 } // namespace multisense
139 } // namespace crl
140 
141 
142 #endif // LibMultiSense_details_signal_hh
crl::multisense::Status_Ok
static CRL_CONSTEXPR Status Status_Ok
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:99
crl::multisense::details::utility::Mutex
Definition: linux/Thread.hh:144
crl::multisense::details::ScopedWatch::m_id
wire::IdType m_id
Definition: signal.hh:128
crl::multisense::details::ScopedWatch::ScopedWatch
ScopedWatch(wire::IdType t, MessageWatch &m)
Definition: signal.hh:116
crl::multisense::details::utility::WaitVar< Status >
crl::multisense::details::MessageWatch::m_lock
utility::Mutex m_lock
Definition: signal.hh:104
device_info_utility.type
type
Definition: device_info_utility.py:61
crl::multisense::details::MessageWatch::insert
void insert(wire::IdType type, Signal *signalP)
Definition: signal.hh:78
crl::multisense::details::ScopedWatch::~ScopedWatch
~ScopedWatch()
Definition: signal.hh:121
AckMessage.hh
crl::multisense::details::wire::Ack::command
IdType command
Definition: AckMessage.hh:65
crl::multisense::details::MessageWatch::signal
void signal(wire::IdType id, Status status=Status_Ok)
Definition: signal.hh:57
crl::multisense::details::MessageWatch::remove
void remove(wire::IdType type)
Definition: signal.hh:95
CRL_EXCEPTION
#define CRL_EXCEPTION(fmt,...)
Definition: Exception.hh:85
crl::multisense::details::ScopedWatch::m_signal
MessageWatch::Signal m_signal
Definition: signal.hh:134
crl
Definition: Legacy/details/channel.cc:61
crl::multisense::details::MessageWatch::Signal
utility::WaitVar< Status > Signal
Definition: signal.hh:75
crl::multisense::details::wire::Ack
Definition: AckMessage.hh:47
crl::multisense::details::ScopedWatch::m_map
MessageWatch & m_map
Definition: signal.hh:133
crl::multisense::details::MessageWatch::Map
std::map< wire::IdType, Signal * > Map
Definition: signal.hh:76
Protocol.hh
crl::multisense::details::MessageWatch::m_map
Map m_map
Definition: signal.hh:107
crl::multisense::details::MessageWatch
Definition: signal.hh:54
crl::multisense::Status
int32_t Status
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:94
multisense
Definition: factory.cc:39
crl::multisense::details::ScopedWatch::wait
bool wait(Status &status, const double &timeout)
Definition: signal.hh:125
crl::multisense::details::wire::Ack::status
AckStatus status
Definition: AckMessage.hh:66
crl::multisense::details::utility::ScopedLock
Definition: linux/Thread.hh:165
Thread.hh
crl::multisense::details::ScopedWatch
Definition: signal.hh:113
crl::multisense::details::wire::IdType
uint16_t IdType
Definition: Protocol.hh:136
crl::multisense::details::MessageWatch::signal
void signal(const wire::Ack &ack)
Definition: signal.hh:67
crl::multisense::details::utility::WaitVar::timedWait
bool timedWait(T &data, const double &timeout)
Definition: linux/Thread.hh:343


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