source: pacpussensors/trunk/Vislab/lib3dv/detail/device_impl.h@ 136

Last change on this file since 136 was 136, checked in by ldecherf, 7 years ago

Doc

File size: 12.0 KB
Line 
1#ifndef LIB3DV_DETAIL_DEVICE_IMPL_H
2#define LIB3DV_DETAIL_DEVICE_IMPL_H
3
4/* lib3dv/detail/device_impl.h
5 *
6 * Copyright (C) 2013 VisLab
7 *
8 * This file is part of lib3dv; you can redistribute it and/or modify
9 * it under the terms of the GNU Lesser General Public License as published by
10 * the Free Software Foundation; either version 3 of the License, or (at
11 * your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public License
19 * along with this program; if not, see <http://www.gnu.org/licenses/>.
20 */
21
22#include <lib3dv/device.h>
23#include <lib3dv/image.h>
24#include <lib3dv/terrain.h>
25#include <lib3dv/motion.h>
26#include <lib3dv/candidate.h>
27#include <lib3dv/obstacle.h>
28#include <lib3dv/detail/command.h>
29#include <lib3dv/detail/raw_data.h>
30#include <lib3dv/version.h>
31
32#include <boost/array.hpp>
33#include <boost/asio.hpp>
34#include <boost/date_time/time_duration.hpp>
35#include <boost/shared_ptr.hpp>
36#include <boost/signals2.hpp>
37#include <boost/thread/thread.hpp>
38#include <boost/uuid/uuid.hpp>
39
40#include <map>
41#include <stdint.h>
42#include <vector>
43#include <utility>
44
45namespace lib3dv
46{
47 namespace detail
48 {
49 class device_impl
50 {
51 public:
52
53 static const unsigned int MAX_UDP_PAYLOAD_SIZE = 65507; ///< max admissible UDP payload size [bytes].
54
55 static std::vector<device> enumerate(const boost::asio::ip::address_v4& local_address, unsigned short remote_commands_port, uint8_t log_level, error& error, const boost::posix_time::time_duration& timeout);
56
57 device_impl(const boost::asio::ip::address_v4& local_address,
58 const boost::asio::ip::address_v4& remote_address, unsigned short remote_commands_port, unsigned short remote_data_port,
59 const boost::uuids::uuid& guid,
60 const std::bitset<device::capability::NUM>& capabilities,
61 const device::version_info& version,
62 uint8_t log_level, error& device_error);
63
64 ~device_impl();
65
66 inline bool valid() const { return (m_status == device::status::ONLINE) || (m_status == device::status::TRANSMITTING); }
67
68 const boost::uuids::uuid& guid() const { return m_guid; }
69
70 const std::bitset<device::capability::NUM>& capabilities() const { return m_capabilities; }
71
72 const device::version_info& version() const { return m_version; }
73
74 void start_transmission(error& error);
75
76 void stop_transmission(error& error);
77
78 device::status::types status() const { return m_status; }
79
80 std::vector<device::property> enumerate_properties(error& error);
81
82 void save_properties(error& error);
83
84 void reset_properties(error& error);
85
86 void poweroff(error& error);
87
88 void reboot(error& error);
89
90 boost::any get_property_value(uint16_t address, error& error);
91
92 void set_property_value(uint16_t address, const boost::any& value, error& error);
93
94 uint64_t connect_image_callback(const boost::function<void (boost::shared_ptr<const lib3dv::image>, uint32_t)>& function);
95
96 uint64_t connect_terrain_callback(const boost::function<void (boost::shared_ptr<const lib3dv::terrain>, uint32_t)>& function);
97
98 uint64_t connect_obstacles_callback(const boost::function<void (boost::shared_ptr<const std::vector<lib3dv::obstacle> >, uint32_t)>& function);
99
100 uint64_t connect_motion_callback(const boost::function<void (boost::shared_ptr<const lib3dv::motion>, uint32_t)>& function);
101
102 uint64_t connect_classification_callback(const boost::function<void (boost::shared_ptr<const lib3dv::classification>, uint32_t)>& function);
103
104 LIB3DV_DEPRECATED uint64_t connect_image_callback(const boost::function<void (boost::shared_ptr<lib3dv::image>, uint32_t)>& function);
105
106 LIB3DV_DEPRECATED uint64_t connect_terrain_callback(const boost::function<void (boost::shared_ptr<lib3dv::terrain>, uint32_t)>& function);
107
108 LIB3DV_DEPRECATED uint64_t connect_obstacles_callback(const boost::function<void (boost::shared_ptr<std::vector<lib3dv::obstacle> >, uint32_t)>& function);
109
110 LIB3DV_DEPRECATED uint64_t connect_motion_callback(const boost::function<void (boost::shared_ptr<lib3dv::motion>, uint32_t)>& function);
111
112 LIB3DV_DEPRECATED uint64_t connect_classification_callback(const boost::function<void (boost::shared_ptr<lib3dv::classification>, uint32_t)>& function);
113
114 uint64_t connect_timeout_callback(const boost::function<void (void)>& function);
115
116
117 void disconnect_callback(uint64_t id);
118
119 uint8_t m_log_level;
120
121 boost::posix_time::time_duration m_timeout;
122
123 friend std::ostream& operator<< (std::ostream& output, const device_impl& device);
124
125 private:
126
127 typedef raw_data<protocol::image_info_header> raw_image_type;
128 typedef raw_data<protocol::terrain_info_header> raw_terrain_type;
129 typedef raw_data<protocol::obstacles_map_info_header> raw_obstacles_type;
130 typedef raw_data<protocol::motion_info_header> raw_motion_type;
131 typedef raw_data<protocol::classifier_info_header> raw_candidate_type;
132
133 static const size_t DEFAULT_MAX_REASSEMBLY_CONTAINER_SIZE = 100;
134
135 void on_command_received(const boost::system::error_code& error, size_t bytes_received, boost::any& result, lib3dv::error& device_error);
136
137 void on_command_sent(const boost::system::error_code& error, size_t bytes_received, boost::any& result, lib3dv::error& device_error);
138
139 void on_timeout(lib3dv::error& device_error);
140
141 /**
142 * @brief Asynchronous UDP data handler.
143 *
144 * @param [in] error Possible error condition.
145 * @param [in] bytes_received The amount of data received during the last read [bytes]
146 * @return void
147 **/
148 void on_data_received(const boost::system::error_code& error, size_t bytes_received);
149
150 template<typename C, typename F, typename H>
151 typename C::mapped_type init_reassembly_container(C& container, F& fragments_container, const H& data_info_header, uint32_t key);
152
153 template<typename C, typename F>
154 typename C::mapped_type fill_reassembly_container(C& container, F& fragments_container, size_t bytes_received, uint32_t key, uint32_t fragment, uint32_t total_fragments);
155
156 template<typename C, typename F>
157 void cleanup_reassembly_container(C& container, F& fragments_container, size_t max_size = DEFAULT_MAX_REASSEMBLY_CONTAINER_SIZE);
158
159 void decode_terrain(boost::shared_ptr<raw_terrain_type> terrain, uint32_t guid);
160
161 void decode_obstacles(boost::shared_ptr<raw_obstacles_type> obstacles, uint32_t guid);
162
163 void decode_motion(boost::shared_ptr<raw_motion_type> pose, uint32_t guid);
164
165 void decode_classification(boost::shared_ptr<raw_candidate_type> pose, uint32_t guid);
166
167 const uint8_t* decode_property(device::property& property, const uint8_t* data);
168
169 void send_command(boost::shared_ptr<lib3dv::detail::command> command, error& error);
170
171 std::map<uint32_t, boost::shared_ptr<raw_image_type> > m_images;
172 std::map<uint32_t, std::vector<boost::shared_ptr<raw_data_fragment> > > m_image_fragments;
173
174 std::map<uint32_t, boost::shared_ptr<raw_terrain_type> > m_terrains;
175 std::map<uint32_t, std::vector<boost::shared_ptr<raw_data_fragment> > > m_terrain_fragments;
176
177 std::map<uint32_t, boost::shared_ptr<raw_obstacles_type> > m_obstacles;
178 std::map<uint32_t, std::vector<boost::shared_ptr<raw_data_fragment> > > m_obstacle_fragments;
179
180 std::map<uint32_t, boost::shared_ptr<raw_motion_type> > m_poses;
181 std::map<uint32_t, std::vector<boost::shared_ptr<raw_data_fragment> > > m_pose_fragments;
182
183 std::map<uint32_t, boost::shared_ptr<raw_candidate_type> > m_candidates;
184 std::map<uint32_t, std::vector<boost::shared_ptr<raw_data_fragment> > > m_candidates_fragments;
185
186
187 boost::asio::io_service m_data_socket_io_service;
188 boost::thread m_data_socket_io_service_thread;
189
190 boost::asio::io_service m_commands_socket_io_service;
191
192 boost::asio::ip::address_v4 m_local_address;
193 boost::asio::ip::address_v4 m_remote_address;
194 unsigned short m_remote_commands_port;
195 unsigned short m_remote_data_port;
196
197 boost::asio::ip::udp::socket m_data_socket;
198 boost::asio::ip::udp::socket m_commands_socket;
199
200 boost::asio::ip::udp::endpoint m_data_sender_endpoint;
201 boost::asio::ip::udp::endpoint m_commands_sender_endpoint;
202
203 boost::array<uint8_t, MAX_UDP_PAYLOAD_SIZE> m_data_payload;
204 boost::array<uint8_t, MAX_UDP_PAYLOAD_SIZE> m_commands_payload;
205
206 boost::asio::deadline_timer m_commands_deadline;
207 boost::asio::deadline_timer m_data_deadline;
208
209
210 boost::signals2::signal<void (const command&)> m_command_signal;
211
212 boost::signals2::signal<void (boost::shared_ptr<const lib3dv::image>, uint32_t)> m_image_signal;
213 boost::signals2::signal<void (boost::shared_ptr<const lib3dv::terrain>, uint32_t)> m_terrain_signal;
214 boost::signals2::signal<void (boost::shared_ptr<const std::vector<lib3dv::obstacle> >, uint32_t)> m_obstacles_signal;
215 boost::signals2::signal<void (boost::shared_ptr<const lib3dv::motion>, uint32_t)> m_motion_signal;
216 boost::signals2::signal<void (boost::shared_ptr<const lib3dv::classification>, uint32_t)> m_classification_signal;
217
218 LIB3DV_DEPRECATED boost::signals2::signal<void (boost::shared_ptr<lib3dv::image>, uint32_t)> m_deprecated_image_signal;
219 LIB3DV_DEPRECATED boost::signals2::signal<void (boost::shared_ptr<lib3dv::terrain>, uint32_t)> m_deprecated_terrain_signal;
220 LIB3DV_DEPRECATED boost::signals2::signal<void (boost::shared_ptr<std::vector<lib3dv::obstacle> >, uint32_t)> m_deprecated_obstacles_signal;
221 LIB3DV_DEPRECATED boost::signals2::signal<void (boost::shared_ptr<lib3dv::motion>, uint32_t)> m_deprecated_motion_signal;
222 LIB3DV_DEPRECATED boost::signals2::signal<void (boost::shared_ptr<lib3dv::classification>, uint32_t)> m_deprecated_classification_signal;
223
224 boost::signals2::signal<void (void)> m_timeout_signal;
225
226 boost::uuids::uuid m_guid;
227 std::bitset<device::capability::NUM> m_capabilities;
228 device::version_info m_version;
229
230 uint64_t m_max_connection_id;
231 std::map<uint64_t, boost::signals2::connection> m_connections;
232
233 device::status::types m_status;
234 };
235 }
236}
237
238#include <lib3dv/detail/device_impl.hpp>
239
240#endif
Note: See TracBrowser for help on using the repository browser.