YARP
Yet Another Robot Platform
RGBDSensorClient_StreamingMsgParser.cpp
Go to the documentation of this file.
1 /*
2  * SPDX-FileCopyrightText: 2006-2021 Istituto Italiano di Tecnologia (IIT)
3  * SPDX-FileCopyrightText: 2006-2010 RobotCub Consortium
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
8 
9 #include <yarp/os/Time.h>
10 
11 using namespace yarp::dev;
12 
13 // Callback reader for rgb
15 {
16  std::lock_guard<std::mutex> lock(mutex);
17  local_arrival_time = yarp::os::Time::now();
18  std::swap(datum, last_rgb);
19  getEnvelope(stamp);
20 }
21 
22 std::tuple<bool, yarp::sig::FlexImage, yarp::os::Stamp> RgbImageBufferedPort::getImage() const
23 {
24  std::lock_guard<std::mutex> lock(mutex);
25  if (local_arrival_time <= 0.0) {
26  // No image received yet
27  // FIXME C++17:
28  // return {false, yarp::sig::FlexImage(), yarp::os::Stamp()};
29  // or perhaps just return {false, {}, {}}; ?
30  return std::make_tuple(false, yarp::sig::FlexImage(), yarp::os::Stamp());
31  }
32  // FIXME C++17:
33  // return {true, last_rgb, stamp};
34  return std::make_tuple(true, last_rgb, stamp);
35 }
36 
37 
38 // callback reader for depthImage
40 {
41  std::lock_guard<std::mutex> lock(mutex);
42  local_arrival_time = yarp::os::Time::now();
43  std::swap(datum, last_depth);
44  getEnvelope(stamp);
45 }
46 
47 std::tuple<bool, yarp::sig::ImageOf<yarp::sig::PixelFloat>, yarp::os::Stamp> FloatImageBufferedPort::getImage() const
48 {
49  std::lock_guard<std::mutex> lock(mutex);
50  if (local_arrival_time <= 0.0) {
51  // No image received yet
52  // FIXME C++17:
53  // return {false, yarp::sig::ImageOf<yarp::sig::PixelFloat>(), yarp::os::Stamp()};
54  // or perhaps just return {false, {}, {}}; ?
55  return std::make_tuple(false, yarp::sig::ImageOf<yarp::sig::PixelFloat>(), yarp::os::Stamp());
56 
57  }
58  // FIXME C++17:
59  // return {true, last_depth, stamp};
60  return std::make_tuple(true, last_depth, stamp);
61 }
62 
63 
64 // Streaming handler
66 {
67  auto result = port_rgb->getImage();
68 
69  if (!std::get<0>(result)) {
70  return false;
71  }
72 
73  data = std::get<1>(result);
74  if (timeStamp) {
75  *timeStamp = std::get<2>(result);
76  }
77 
78  return true;
79 }
80 
82 {
83  auto result = port_depth->getImage();
84 
85  if (!std::get<0>(result)) {
86  return false;
87  }
88 
89  data = std::get<1>(result);
90  if(timeStamp) {
91  *timeStamp = std::get<2>(result);
92  }
93 
94  return true;
95 }
96 
98 {
99  auto resultRgb = port_rgb->getImage();
100  auto resultDepth = port_depth->getImage();
101 
102  bool retRgb = std::get<0>(resultRgb);
103  bool retDepth = std::get<0>(resultDepth);
104 
105  if (!retRgb || !retDepth) {
106  return false;
107  }
108 
109  rgbImage = std::get<1>(resultRgb);
110  depthImage = std::get<1>(resultDepth);
111  if(rgbStamp) {
112  port_rgb->getEnvelope(*rgbStamp);
113  }
114 
115  if(depthStamp) {
116  port_depth->getEnvelope(*depthStamp);
117  }
118  return true;
119 }
120 
122  FloatImageBufferedPort* _port_depth)
123 {
124  port_rgb = _port_rgb;
125  port_depth = _port_depth;
126  port_rgb->useCallback();
127  port_depth->useCallback();
128 }
void onRead(yarp::sig::ImageOf< yarp::sig::PixelFloat > &datum) override
std::tuple< bool, yarp::sig::ImageOf< yarp::sig::PixelFloat >, yarp::os::Stamp > getImage() const
bool read(yarp::sig::FlexImage &rgbImage, yarp::sig::ImageOf< yarp::sig::PixelFloat > &depthImage, yarp::os::Stamp *rgbStamp=nullptr, yarp::os::Stamp *depthStamp=nullptr)
void attach(RgbImageBufferedPort *_port_rgb, FloatImageBufferedPort *_port_depth)
bool readDepth(yarp::sig::ImageOf< yarp::sig::PixelFloat > &data, yarp::os::Stamp *timeStamp=nullptr)
bool readRgb(yarp::sig::FlexImage &data, yarp::os::Stamp *timeStamp=nullptr)
void onRead(yarp::sig::FlexImage &datum) override
std::tuple< bool, yarp::sig::FlexImage, yarp::os::Stamp > getImage() const
void useCallback(TypedReaderCallback< T > &callback) override
Set an object whose onRead method will be called when data is available.
An abstraction for a time stamp and/or sequence number.
Definition: Stamp.h:22
Image class with user control of representation details.
Definition: Image.h:414
An interface for the device drivers.
double now()
Return the current time in seconds, relative to an arbitrary starting point.
Definition: Time.cpp:121