Goby3  3.1.5a
2024.05.23
udp_multicast_driver.h
Go to the documentation of this file.
1 // Copyright 2011-2023:
2 // GobySoft, LLC (2013-)
3 // Massachusetts Institute of Technology (2007-2014)
4 // Community contributors (see AUTHORS file)
5 // File authors:
6 // Toby Schneider <toby@gobysoft.org>
7 //
8 //
9 // This file is part of the Goby Underwater Autonomy Project Libraries
10 // ("The Goby Libraries").
11 //
12 // The Goby Libraries are free software: you can redistribute them and/or modify
13 // them under the terms of the GNU Lesser General Public License as published by
14 // the Free Software Foundation, either version 2.1 of the License, or
15 // (at your option) any later version.
16 //
17 // The Goby Libraries are distributed in the hope that they will be useful,
18 // but WITHOUT ANY WARRANTY; without even the implied warranty of
19 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 // GNU Lesser General Public License for more details.
21 //
22 // You should have received a copy of the GNU Lesser General Public License
23 // along with Goby. If not, see <http://www.gnu.org/licenses/>.
24 
25 #ifndef GOBY_ACOMMS_MODEMDRIVER_UDP_MULTICAST_DRIVER_H
26 #define GOBY_ACOMMS_MODEMDRIVER_UDP_MULTICAST_DRIVER_H
27 
28 #include <array> // for array
29 #include <boost/asio/ip/udp.hpp> // for udp, udp::...
30 #include <cstddef> // for size_t
31 #include <cstdint> // for uint32_t
32 #include <map> // for map
33 
34 #include "goby/acomms/modemdriver/driver_base.h" // for ModemDrive...
35 #include "goby/acomms/protobuf/driver_base.pb.h" // for DriverConfig
37 #include "goby/util/asio_compat.h"
38 
39 namespace boost
40 {
41 namespace system
42 {
43 class error_code;
44 } // namespace system
45 } // namespace boost
46 
47 namespace goby
48 {
49 namespace acomms
50 {
51 namespace protobuf
52 {
53 class ModemTransmission;
54 } // namespace protobuf
55 
57 {
58  public:
60  ~UDPMulticastDriver() override;
61 
62  void startup(const protobuf::DriverConfig& cfg) override;
63  void shutdown() override;
64  void do_work() override;
66 
67  void report(protobuf::ModemReport* report) override;
68 
69  private:
70  void start_send(const protobuf::ModemTransmission& m);
71  void send_complete(const boost::system::error_code& error, std::size_t bytes_transferred);
72  void start_receive();
73  void receive_complete(const boost::system::error_code& error, std::size_t bytes_transferred);
74  void receive_message(const protobuf::ModemTransmission& m);
75 
76  const udp_multicast::protobuf::Config& multicast_driver_cfg() const
77  {
78  return driver_cfg_.GetExtension(udp_multicast::protobuf::config);
79  }
80 
81  private:
82  protobuf::DriverConfig driver_cfg_;
83  boost::asio::io_context io_context_;
84  boost::asio::ip::udp::socket socket_{io_context_};
85  boost::asio::ip::udp::endpoint receiver_;
86  boost::asio::ip::udp::endpoint sender_;
87 
88  // (16 bit length = 65535 - 8 byte UDP header - 20 byte IP
89  static constexpr size_t UDP_MAX_PACKET_SIZE = 65507;
90 
91  std::array<char, UDP_MAX_PACKET_SIZE> receive_buffer_;
92  std::uint32_t next_frame_{0};
93 
94  std::map<int, int> rate_to_bytes_;
95 };
96 } // namespace acomms
97 } // namespace goby
98 #endif
goby::acomms::protobuf::DriverConfig
Definition: driver_base.pb.h:123
goby::acomms::protobuf::ModemTransmission
Definition: modem_message.pb.h:166
goby::acomms::UDPMulticastDriver::UDPMulticastDriver
UDPMulticastDriver()
goby::util::units::rpm::system
boost::units::make_system< boost::units::angle::revolution_base_unit, boost::units::metric::minute_base_unit >::type system
Definition: system.hpp:45
goby
The global namespace for the Goby project.
Definition: acomms_constants.h:33
goby::acomms::UDPMulticastDriver::handle_initiate_transmission
void handle_initiate_transmission(const protobuf::ModemTransmission &m) override
Virtual initiate_transmission method. Typically connected to MACManager::signal_initiate_transmission...
goby::acomms::UDPMulticastDriver::~UDPMulticastDriver
~UDPMulticastDriver() override
goby::acomms::udp_multicast::protobuf::config
extern ::google::protobuf::internal::ExtensionIdentifier< ::goby::acomms::protobuf::DriverConfig, ::google::protobuf::internal::MessageTypeTraits< ::goby::acomms::udp_multicast::protobuf::Config >, 11, false > config
Definition: udp_multicast_driver.pb.h:392
goby::acomms::protobuf::ModemReport
Definition: modem_message.pb.h:673
goby::acomms::UDPMulticastDriver::report
void report(protobuf::ModemReport *report) override
Returns report including modem availability and signal quality (if known)
boost
Definition: udp_driver.h:41
goby::acomms::UDPMulticastDriver::shutdown
void shutdown() override
Shuts down the modem driver.
goby::acomms::UDPMulticastDriver::do_work
void do_work() override
Allows the modem driver to do its work.
driver_base.h
udp_multicast_driver.pb.h
io_service
driver_base.pb.h
goby::acomms::UDPMulticastDriver
Definition: udp_multicast_driver.h:56
goby::acomms::udp_multicast::protobuf::Config
Definition: udp_multicast_driver.pb.h:208
goby::acomms::UDPMulticastDriver::startup
void startup(const protobuf::DriverConfig &cfg) override
Starts the modem driver. Must be called before poll().
asio_compat.h
goby::acomms::ModemDriverBase
provides an abstract base class for acoustic modem drivers. This is subclassed by the various drivers...
Definition: driver_base.h:58