src
xdacallback.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
#include "
xdacallback.h
"
34
35
#include <
xscontroller/xsdevice_def.h
>
36
#include <
xstypes/xsdatapacket.h
>
37
38
XdaCallback::XdaCallback
(
size_t
maxBufferSize)
39
: m_maxBufferSize(maxBufferSize)
40
{
41
}
42
43
XdaCallback::~XdaCallback
() throw()
44
{
45
}
46
47
// Returns empty packet on timeout
48
RosXsDataPacket
XdaCallback::next
(
const
std::chrono::milliseconds &timeout)
49
{
50
RosXsDataPacket
packet;
51
52
std::unique_lock<std::mutex> lock(
m_mutex
);
53
54
if
(
m_condition
.wait_for(lock, timeout, [&] { return !m_buffer.empty(); }))
55
{
56
assert(!
m_buffer
.empty());
57
58
packet =
m_buffer
.front();
59
m_buffer
.pop_front();
60
}
61
62
return
packet;
63
}
64
65
void
XdaCallback::onLiveDataAvailable
(
XsDevice
*,
const
XsDataPacket
*packet)
66
{
67
std::unique_lock<std::mutex> lock(
m_mutex
);
68
ros::Time
now =
ros::Time::now
();
69
70
assert(packet != 0);
71
72
// Discard oldest packet if buffer full
73
if
(
m_buffer
.size() ==
m_maxBufferSize
)
74
{
75
m_buffer
.pop_front();
76
}
77
78
// Push new packet
79
m_buffer
.push_back(
RosXsDataPacket
(now, *packet));
80
81
// Manual unlocking is done before notifying, to avoid waking up
82
// the waiting thread only to block again
83
lock.unlock();
84
m_condition
.notify_one();
85
}
XdaCallback::m_buffer
std::list< RosXsDataPacket > m_buffer
Definition:
xdacallback.h:61
XdaCallback::m_mutex
std::mutex m_mutex
Definition:
xdacallback.h:59
XsDataPacket
Contains an interpreted data message. The class provides easy access to the contained data through it...
Definition:
xsdatapacket.h:301
XdaCallback::~XdaCallback
virtual ~XdaCallback()
Definition:
xdacallback.cpp:43
RosXsDataPacket
std::pair< ros::Time, XsDataPacket > RosXsDataPacket
Definition:
xdacallback.h:43
XdaCallback::next
RosXsDataPacket next(const std::chrono::milliseconds &timeout)
Definition:
xdacallback.cpp:48
xdacallback.h
XdaCallback::m_condition
std::condition_variable m_condition
Definition:
xdacallback.h:60
xsdevice_def.h
xsdatapacket.h
XdaCallback::m_maxBufferSize
size_t m_maxBufferSize
Definition:
xdacallback.h:62
ros::Time
XdaCallback::onLiveDataAvailable
void onLiveDataAvailable(XsDevice *, const XsDataPacket *packet) override
Definition:
xdacallback.cpp:65
XdaCallback::XdaCallback
XdaCallback(size_t maxBufferSize=5)
Definition:
xdacallback.cpp:38
XsDevice
Definition:
xsdevice_def.h:164
ros::Time::now
static Time now()
xsens_mti_driver
Author(s):
autogenerated on Sun Sep 3 2023 02:43:20