28 #ifndef GOBY_ACOMMS_MODEMDRIVER_UDP_DRIVER_H
29 #define GOBY_ACOMMS_MODEMDRIVER_UDP_DRIVER_H
38 #include <boost/asio/ip/udp.hpp>
40 #include "goby/acomms/modemdriver/driver_base.h"
41 #include "goby/acomms/protobuf/driver_base.pb.h"
42 #include "goby/util/asio_compat.h"
65 class ModemTransmission;
75 class UDPDriver :
public goby::acomms::ModemDriverBase
81 void startup(
const goby::acomms::protobuf::DriverConfig& cfg)
override;
86 void report(goby::acomms::protobuf::ModemReport*
report)
override;
90 bool clear_existing =
false);
92 void start_send(
const goby::acomms::protobuf::ModemTransmission&
msg);
93 void send_complete(
const boost::system::error_code& error, std::size_t bytes_transferred);
95 void receive_complete(
const boost::system::error_code& error, std::size_t bytes_transferred);
96 void receive_message(
const goby::acomms::protobuf::ModemTransmission& m);
104 void update_active_hub(
int hub_id, goby::acomms::protobuf::ModemTransmission*
msg);
105 void set_active_hub_peer(
int hub_id);
108 goby::acomms::protobuf::DriverConfig driver_cfg_;
109 boost::asio::io_context io_context_;
110 std::unique_ptr<boost::asio::ip::udp::socket> socket_;
112 std::multimap<int, boost::asio::ip::udp::endpoint> receivers_;
113 boost::asio::ip::udp::endpoint sender_;
116 static constexpr
size_t UDP_MAX_PACKET_SIZE = 65507;
118 std::array<char, UDP_MAX_PACKET_SIZE> receive_buffer_;
121 std::set<unsigned> application_ack_ids_;
123 std::uint32_t next_frame_{0};
125 bool have_active_hub_{
false};
126 int active_hub_id_{-1};
127 int hub_wifi_base_modem_id_{-1};
128 int hub_wifi_modem_id_{-1};
130 std::map<int, jaiabot::udp::protobuf::Config::EndPoint> hub_endpoints_;