24#ifndef GOBY_MIDDLEWARE_TRANSPORT_INTERVEHICLE_DRIVER_THREAD_H
25#define GOBY_MIDDLEWARE_TRANSPORT_INTERVEHICLE_DRIVER_THREAD_H
35#include <boost/units/quantity.hpp>
63class ModemTransmission;
69template <
typename Data>
class Publisher;
105 return a.SerializeAsString() == b.SerializeAsString();
110template <
typename Data>
111std::shared_ptr<goby::middleware::protobuf::SerializerTransporterMessage>
115 auto* sbytes =
new std::string(bytes.begin(), bytes.end());
116 auto msg = std::make_shared<goby::middleware::protobuf::SerializerTransporterMessage>();
118 auto* key =
msg->mutable_key();
121 key->set_group(std::string(
group));
122 key->set_group_numeric(
group.numeric());
123 auto now = goby::time::SystemClock::now<goby::time::MicroTime>();
124 key->set_serialize_time_with_units(now);
125 *key->mutable_cfg() = publisher.
cfg();
126 msg->set_allocated_data(sbytes);
133template <
typename ImplementationTag>
135 intervehicle::protobuf::PortalConfig::LinkConfig,
136 InterProcessForwarder<InterThreadTransporter, ImplementationTag>>
149 void finalize()
override;
151 void _buffer_message(
152 const std::shared_ptr<const goby::middleware::protobuf::SerializerTransporterMessage>&
msg);
162 void _erase_pending_ack(
164 void _discard_superseded(
174 key.group_numeric());
179 return _create_buffer_id(subscription.
dccl_id(), subscription.
group());
199 <<
" is not in subnet (our id: " << this->
cfg().
modem_id()
202 return dest_in_subnet;
205 void _publish_subscription_report(
const intervehicle::protobuf::Subscription& changed);
206 void _create_driver();
207 bool _try_driver_startup();
210 void _publish_modem_report();
213 std::unique_ptr<InterThreadTransporter> interthread_;
214 std::unique_ptr<InterProcessForwarder<InterThreadTransporter, ImplementationTag>> interprocess_;
216 std::multimap<subbuffer_id_type, goby::middleware::protobuf::SerializerTransporterKey>
217 publisher_buffer_cfg_;
219 std::map<modem_id_type, std::multimap<subbuffer_id_type, intervehicle::protobuf::Subscription>>
220 subscriber_buffer_cfg_;
222 std::map<subbuffer_id_type, std::set<modem_id_type>> subbuffers_created_;
225 std::set<modem_id_type> subscription_subbuffers_;
226 struct QueuedSubscription
228 intervehicle::protobuf::Subscription subscription;
232 std::vector<buffer_value_type> superseded;
235 std::map<modem_id_type, std::vector<QueuedSubscription>> queued_subscriptions_;
239 using frame_type = int;
240 std::map<frame_type, std::vector<goby::acomms::DynamicBuffer<buffer_data_type>::Value>>
243 std::unique_ptr<goby::acomms::ModemDriverBase> driver_;
246 std::string glog_group_;
251 bool driver_started_{
false};
Represents a time-dependent priority queue for several groups of messages (multiple DynamicSubBuffers...
std::string subbuffer_id_type
provides an API to the goby-acomms MAC library. MACManager is essentially a std::list<protobuf::Modem...
static constexpr Status NOMINAL
Class for grouping publications in the Goby middleware. Analogous to "topics" in ROS,...
Class that holds additional metadata and callback functions related to a publication (and is optional...
const goby::middleware::protobuf::TransporterConfig & cfg() const
Returns the metadata configuration.
Represents a thread of execution within the Goby middleware, interleaving periodic events (loop()) wi...
const intervehicle::protobuf::PortalConfig::LinkConfig & cfg() const
Provides the modem driver thread used by InterVehiclePortal, templated on ImplementationTag so it use...
goby::acomms::DynamicBuffer< buffer_data_type >::Value buffer_value_type
ModemDriverThread(const intervehicle::protobuf::PortalConfig::LinkConfig &cfg)
goby::acomms::DynamicBuffer< buffer_data_type >::modem_id_type modem_id_type
goby::acomms::DynamicBuffer< buffer_data_type >::subbuffer_id_type subbuffer_id_type
goby::middleware::protobuf::SerializerTransporterMessage buffer_data_type
uint32_t modem_id() const
uint32_t subnet_mask() const
uint64_t serialize_time() const
const std::string & type() const
int32_t marshalling_scheme() const
const std::string & group() const
const ::goby::middleware::protobuf::SerializerTransporterKey & key() const
const std::string & data() const
goby::util::logger::GroupSetter group(std::string n)
bool operator==(const TransporterConfig &a, const TransporterConfig &b)
std::shared_ptr< goby::middleware::protobuf::SerializerTransporterMessage > serialize_publication(const Data &d, const Group &group, const Publisher< Data > &publisher)
bool operator<(const TCPEndPoint &ep_a, const TCPEndPoint &ep_b)
size_t data_size(const SerializerTransporterMessage &msg)
bool operator==(const TCPEndPoint &ep_a, const TCPEndPoint &ep_b)
The global namespace for the Goby project.
extern ::PROTOBUF_NAMESPACE_ID::internal::ExtensionIdentifier< ::PROTOBUF_NAMESPACE_ID::MessageOptions, ::PROTOBUF_NAMESPACE_ID::internal::MessageTypeTraits< ::goby::GobyMessageOptions >, 11, false > msg
util::FlexOstream glog
Access the Goby logger through this object.
Class for parsing and serializing a given marshalling scheme. Must be specialized for a particular sc...
static unsigned id(CharIterator begin, CharIterator end)
std::chrono::time_point< SteadyClock > time_point
std::chrono::microseconds duration
Duration type.