Goby3  3.1.4
2024.02.22
serial.h
Go to the documentation of this file.
1 // Copyright 2019-2021:
2 // GobySoft, LLC (2013-)
3 // Community contributors (see AUTHORS file)
4 // File authors:
5 // Toby Schneider <toby@gobysoft.org>
6 //
7 //
8 // This file is part of the Goby Underwater Autonomy Project Libraries
9 // ("The Goby Libraries").
10 //
11 // The Goby Libraries are free software: you can redistribute them and/or modify
12 // them under the terms of the GNU Lesser General Public License as published by
13 // the Free Software Foundation, either version 2.1 of the License, or
14 // (at your option) any later version.
15 //
16 // The Goby Libraries are distributed in the hope that they will be useful,
17 // but WITHOUT ANY WARRANTY; without even the implied warranty of
18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 // GNU Lesser General Public License for more details.
20 //
21 // You should have received a copy of the GNU Lesser General Public License
22 // along with Goby. If not, see <http://www.gnu.org/licenses/>.
23 
24 #ifndef GOBY_MIDDLEWARE_IO_MAVLINK_SERIAL_H
25 #define GOBY_MIDDLEWARE_IO_MAVLINK_SERIAL_H
26 
27 #include <iosfwd> // for size_t
28 
29 #include <boost/asio/buffer.hpp> // for buffer
30 #include <boost/asio/completion_condition.hpp> // for transfer_at_...
31 #include <boost/asio/read.hpp> // for async_read
32 #include <boost/system/error_code.hpp> // for error_code
33 
34 #include "goby/middleware/io/detail/io_interface.h" // for PubSubLayer
35 #include "goby/middleware/io/detail/serial_interface.h" // for SerialThread
36 #include "goby/middleware/io/mavlink/common.h" // for IOThreadMAVLink
37 
38 namespace goby
39 {
40 namespace middleware
41 {
42 class Group;
43 }
44 } // namespace goby
45 namespace goby
46 {
47 namespace middleware
48 {
49 namespace protobuf
50 {
51 class SerialConfig;
52 }
53 } // namespace middleware
54 } // namespace goby
55 
56 namespace goby
57 {
58 namespace middleware
59 {
60 namespace io
61 {
62 template <const goby::middleware::Group& line_in_group,
63  const goby::middleware::Group& line_out_group, PubSubLayer publish_layer,
64  PubSubLayer subscribe_layer, template <class> class ThreadType>
65 using SerialThreadMAVLinkBase = IOThreadMAVLink<
66  line_in_group, line_out_group, publish_layer, subscribe_layer,
67  detail::SerialThread<line_in_group, line_out_group, publish_layer, subscribe_layer, ThreadType>,
69 
73 template <const goby::middleware::Group& line_in_group,
74  const goby::middleware::Group& line_out_group,
75  PubSubLayer publish_layer = PubSubLayer::INTERPROCESS,
76  PubSubLayer subscribe_layer = PubSubLayer::INTERTHREAD,
77  template <class> class ThreadType = goby::middleware::SimpleThread>
79  : public SerialThreadMAVLinkBase<line_in_group, line_out_group, publish_layer, subscribe_layer,
80  ThreadType>
81 {
82  public:
84  : SerialThreadMAVLinkBase<line_in_group, line_out_group, publish_layer, subscribe_layer,
85  ThreadType>(config)
86  {
87  }
88 
90 
91  private:
92  void async_read() override;
93 };
94 } // namespace io
95 } // namespace middleware
96 } // namespace goby
97 
98 template <const goby::middleware::Group& line_in_group,
99  const goby::middleware::Group& line_out_group,
100  goby::middleware::io::PubSubLayer publish_layer,
101  goby::middleware::io::PubSubLayer subscribe_layer, template <class> class ThreadType>
102 void goby::middleware::io::SerialThreadMAVLink<line_in_group, line_out_group, publish_layer,
103  subscribe_layer, ThreadType>::async_read()
104 {
105  boost::asio::async_read(
106  this->mutable_serial_port(), boost::asio::buffer(this->buffer()),
107  boost::asio::transfer_at_least(1),
108  [this](const boost::system::error_code& ec, std::size_t bytes_transferred) {
109  if (!ec && bytes_transferred > 0)
110  {
111  this->try_parse(bytes_transferred);
112  this->async_read();
113  }
114  else
115  {
116  this->handle_read_error(ec);
117  }
118  });
119 }
120 
121 #endif
serial_interface.h
goby
The global namespace for the Goby project.
Definition: acomms_constants.h:33
goby::acomms::abc::protobuf::config
extern ::google::protobuf::internal::ExtensionIdentifier< ::goby::acomms::protobuf::DriverConfig, ::google::protobuf::internal::MessageTypeTraits< ::goby::acomms::abc::protobuf::Config >, 11, false > config
Definition: abc_driver.pb.h:203
goby::middleware::SimpleThread
Implements Thread for a three layer middleware setup ([ intervehicle [ interprocess [ interthread ] ]...
Definition: simple_thread.h:43
goby::middleware::io::PubSubLayer
PubSubLayer
Definition: io_transporters.h:38
goby::middleware::io::SerialThreadMAVLinkBase
IOThreadMAVLink< line_in_group, line_out_group, publish_layer, subscribe_layer, detail::SerialThread< line_in_group, line_out_group, publish_layer, subscribe_layer, ThreadType >, goby::middleware::protobuf::SerialConfig > SerialThreadMAVLinkBase
Definition: serial.h:68
goby::middleware::Group
Class for grouping publications in the Goby middleware. Analogous to "topics" in ROS,...
Definition: group.h:58
io_interface.h
goby::middleware::io::PubSubLayer::INTERPROCESS
@ INTERPROCESS
goby::middleware::protobuf::SerialConfig
Definition: serial_config.pb.h:97
goby::middleware::io::PubSubLayer::INTERTHREAD
@ INTERTHREAD