replymonitor.cpp
Go to the documentation of this file.
1 
2 // Copyright (c) 2003-2021 Xsens Technologies B.V. or subsidiaries worldwide.
3 // All rights reserved.
4 //
5 // Redistribution and use in source and binary forms, with or without modification,
6 // are permitted provided that the following conditions are met:
7 //
8 // 1. Redistributions of source code must retain the above copyright notice,
9 // this list of conditions, and the following disclaimer.
10 //
11 // 2. Redistributions in binary form must reproduce the above copyright notice,
12 // this list of conditions, and the following disclaimer in the documentation
13 // and/or other materials provided with the distribution.
14 //
15 // 3. Neither the names of the copyright holders nor the names of their contributors
16 // may be used to endorse or promote products derived from this software without
17 // specific prior written permission.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
20 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
22 // THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 // SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
24 // OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR
26 // TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.THE LAWS OF THE NETHERLANDS
28 // SHALL BE EXCLUSIVELY APPLICABLE AND ANY DISPUTES SHALL BE FINALLY SETTLED UNDER THE RULES
29 // OF ARBITRATION OF THE INTERNATIONAL CHAMBER OF COMMERCE IN THE HAGUE BY ONE OR MORE
30 // ARBITRATORS APPOINTED IN ACCORDANCE WITH SAID RULES.
31 //
32 
33 
34 // Copyright (c) 2003-2021 Xsens Technologies B.V. or subsidiaries worldwide.
35 // All rights reserved.
36 //
37 // Redistribution and use in source and binary forms, with or without modification,
38 // are permitted provided that the following conditions are met:
39 //
40 // 1. Redistributions of source code must retain the above copyright notice,
41 // this list of conditions, and the following disclaimer.
42 //
43 // 2. Redistributions in binary form must reproduce the above copyright notice,
44 // this list of conditions, and the following disclaimer in the documentation
45 // and/or other materials provided with the distribution.
46 //
47 // 3. Neither the names of the copyright holders nor the names of their contributors
48 // may be used to endorse or promote products derived from this software without
49 // specific prior written permission.
50 //
51 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
52 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
53 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
54 // THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
55 // SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
56 // OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
57 // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR
58 // TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
59 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.THE LAWS OF THE NETHERLANDS
60 // SHALL BE EXCLUSIVELY APPLICABLE AND ANY DISPUTES SHALL BE FINALLY SETTLED UNDER THE RULES
61 // OF ARBITRATION OF THE INTERNATIONAL CHAMBER OF COMMERCE IN THE HAGUE BY ONE OR MORE
62 // ARBITRATORS APPOINTED IN ACCORDANCE WITH SAID RULES.
63 //
64 
65 #include "replymonitor.h"
66 #include "replyobject.h"
67 #include <algorithm>
68 
69 namespace xsens
70 {
71 
76 {
77 public:
78  // create a reply object deleter
80  m_monitor(monitor)
81  {
82  }
83 
84  // delete the ReplyObject and remove it from m_monitor
85  // not necessarily in that order
86  void operator()(ReplyObject* p) const
87  {
88  if (m_monitor)
90  delete p;
91  }
92 private:
94 };
95 
96 
104 {
105 }
106 
108 {
109 }
110 
115 std::shared_ptr<ReplyObject> ReplyMonitor::addReplyObject(ReplyObject* replyObject)
116 {
117  xsens::Lock locky(&m_mutex);
118  m_objectList.push_back(replyObject);
119  return std::shared_ptr<ReplyObject>(replyObject, ReplyObjectDeleter(this));
120 }
121 
126 void ReplyMonitor::removeObject(std::shared_ptr<ReplyObject> const& obj)
127 {
128  removeObject(obj.get());
129 }
130 
136 {
137  xsens::Lock locky(&m_mutex);
138  if (m_objectList.empty())
139  return;
140 
141  std::vector<ReplyObject*>::iterator it = std::find(m_objectList.begin(), m_objectList.end(), obj);
142  if (it == m_objectList.end())
143  return;
144 
145  m_objectList.erase(it);
146 }
147 
152 bool ReplyMonitor::addReply(const XsMessage& message)
153 {
154  xsens::Lock locky(&m_mutex);
155  size_t numElements = m_objectList.size();
156  for (size_t i = 0; i < numElements; i++)
157  {
158  if (m_objectList[i]->isReplyFor(message))
159  {
160  ReplyObject* tmp = m_objectList[i];
161  m_objectList.erase(m_objectList.begin() + (ptrdiff_t) i);
162  tmp->setMessage(message);
163  return true;
164  }
165  }
166  return false;
167 }
168 
172 {
173  xsens::Lock locky(&m_mutex);
174  size_t numElements = m_objectList.size();
175  JLGENERIC(journal, level, "Waiting for " << numElements << " objects");
176  for (size_t i = 0; i < numElements; i++)
177  JLGENERIC(journal, level, i << ": msg ID = " << JLHEXLOG((int) m_objectList[i]->msgId()));
178 }
179 
180 } // namespace xsens
ReplyObject
Abstract reply object. Blocks on a semaphore when requesting the message until the message has been s...
Definition: replyobject.h:81
xsens::ReplyMonitor::addReplyObject
std::shared_ptr< ReplyObject > addReplyObject(ReplyObject *replyObject)
Add a reply object to the reply monitor.
Definition: replymonitor.cpp:115
replymonitor.h
JournalLogLevel
JournalLogLevel
Definition: journalloglevel.h:88
xsens::ReplyMonitor::ReplyMonitor
ReplyMonitor()
Default constructor.
Definition: replymonitor.cpp:103
xsens::ReplyMonitor::~ReplyMonitor
virtual ~ReplyMonitor()
Definition: replymonitor.cpp:107
xsens::ReplyObjectDeleter::m_monitor
ReplyObjectRemover * m_monitor
Definition: replymonitor.cpp:93
xsens::ReplyMonitor::addReply
bool addReply(const XsMessage &message)
Put a reply in the monitor.
Definition: replymonitor.cpp:152
xsens::ReplyMonitor::m_objectList
std::vector< ReplyObject * > m_objectList
Definition: replymonitor.h:105
Journaller
A journalling class for debugging applications.
Definition: journaller.h:79
xsens::ReplyObjectDeleter::ReplyObjectDeleter
ReplyObjectDeleter(ReplyObjectRemover *monitor=NULL)
Definition: replymonitor.cpp:79
xsens::ReplyObjectDeleter
A class that deletes a reply object and removes it from the given monitor.
Definition: replymonitor.cpp:75
JLGENERIC
#define JLGENERIC(journal, level, msg)
Definition: journaller.h:196
replyobject.h
XsMessage
Structure for storing a single message.
Definition: xsmessage.h:202
JLHEXLOG
#define JLHEXLOG(d)
Definition: journaller.h:335
xsens::ReplyObjectRemover
A class that removes a reply object from the given monitor.
Definition: replymonitor.h:83
xsens::ReplyMonitor::dumpObjectList
void dumpObjectList(Journaller *journal, JournalLogLevel level) const
Dumps the current list of objects to wait for to the supplied journaller.
Definition: replymonitor.cpp:171
xsens::Lock
A base class for a Lock.
Definition: xsens_mutex.h:947
ReplyObject::setMessage
void setMessage(const XsMessage &msg)
Sets a message as reply message and trigger the semaphore which will unblock any waiting message() ca...
Definition: replyobject.cpp:94
xsens::ReplyObjectDeleter::operator()
void operator()(ReplyObject *p) const
Definition: replymonitor.cpp:86
xsens::ReplyObjectRemover::removeObject
virtual void removeObject(ReplyObject *obj)=0
Remove an object from the list.
xsens::ReplyMonitor::removeObject
void removeObject(std::shared_ptr< ReplyObject > const &obj)
Remove an object from the list.
Definition: replymonitor.cpp:126
xsens
Definition: threading.cpp:78
xsens::ReplyMonitor::m_mutex
Mutex m_mutex
Definition: replymonitor.h:106


xsens_mti_driver
Author(s):
autogenerated on Sun Sep 3 2023 02:43:20