FERS 0.1.0
The Flexible Extensible Radar Simulator
Loading...
Searching...
No Matches
paced_sender.h
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-2.0-only
2//
3// Copyright (c) 2026-present FERS Contributors (see AUTHORS.md).
4//
5// See the GNU GPLv2 LICENSE file in the FERS project root for more information.
6
7#pragma once
8
9#include <chrono>
10#include <condition_variable>
11#include <list>
12#include <memory>
13#include <mutex>
14#include <optional>
15#include <thread>
16#include <unordered_map>
17#include <vector>
18
21
22namespace serial::vita49
23{
25 {
26 std::uint32_t stream_id = 0;
27 std::uint64_t sample_count = 0;
28 bool data_packet = false;
29 bool context_packet = false;
30 };
31
33 {
34 bool enqueued = false;
35 std::optional<DroppedDatagram> dropped;
36 };
37
39 {
40 public:
41 PacedSender(std::unique_ptr<DatagramSender> sender, std::size_t queue_depth);
43
44 PacedSender(const PacedSender&) = delete;
46
47 void open(const std::string& host, std::uint16_t port);
50 void flush();
51 void stop();
52
53 [[nodiscard]] std::uint64_t latePacketCount(std::uint32_t stream_id) const;
54 [[nodiscard]] std::uint64_t sentPacketCount(std::uint32_t stream_id) const;
55 [[nodiscard]] std::uint64_t sendFailureCount(std::uint32_t stream_id) const;
56 [[nodiscard]] std::uint64_t droppedDataPacketCount(std::uint32_t stream_id) const;
57 [[nodiscard]] std::uint64_t droppedContextPacketCount(std::uint32_t stream_id) const;
58 [[nodiscard]] std::uint64_t droppedSampleCount(std::uint32_t stream_id) const;
59 [[nodiscard]] std::vector<DroppedDatagram> consumeDroppedDatagrams();
60
61 private:
62 void run();
63 void waitUntilDue(std::unique_lock<std::mutex>& lock, std::chrono::steady_clock::time_point due);
64 void sendOneUnlocked(SerializedPacket packet, std::chrono::steady_clock::time_point now);
65 void recordDroppedUnlocked(const SerializedPacket& packet);
66 [[nodiscard]] DroppedDatagram makeDroppedDatagram(const SerializedPacket& packet) const noexcept;
67 [[nodiscard]] std::chrono::steady_clock::time_point dueTime(const SerializedPacket& packet) const;
68 [[nodiscard]] std::size_t queuedOrSendingCount() const noexcept;
69
70 std::unique_ptr<DatagramSender> _sender;
71 std::size_t _queue_depth = 0;
72 mutable std::mutex _mutex;
73 std::condition_variable _cv;
74 std::list<SerializedPacket> _queue;
75 std::unordered_map<std::uint32_t, std::uint64_t> _late_packets;
76 std::unordered_map<std::uint32_t, std::uint64_t> _sent_packets;
77 std::unordered_map<std::uint32_t, std::uint64_t> _send_failures;
78 std::unordered_map<std::uint32_t, std::uint64_t> _dropped_data_packets;
79 std::unordered_map<std::uint32_t, std::uint64_t> _dropped_context_packets;
80 std::unordered_map<std::uint32_t, std::uint64_t> _dropped_samples;
81 std::vector<DroppedDatagram> _pending_dropped_datagrams;
82 std::chrono::steady_clock::time_point _steady_epoch = std::chrono::steady_clock::now();
83 RealType _simulation_epoch_time = 0.0;
84 bool _started = false;
85 bool _stopping = false;
86 bool _send_in_progress = false;
87 std::thread _thread;
88 };
89}
PacedSender(const PacedSender &)=delete
std::vector< DroppedDatagram > consumeDroppedDatagrams()
std::uint64_t droppedContextPacketCount(std::uint32_t stream_id) const
std::uint64_t droppedSampleCount(std::uint32_t stream_id) const
std::uint64_t sentPacketCount(std::uint32_t stream_id) const
std::uint64_t droppedDataPacketCount(std::uint32_t stream_id) const
PacedSender & operator=(const PacedSender &)=delete
void start(RealType simulation_epoch_time=0.0)
void open(const std::string &host, std::uint16_t port)
EnqueueResult enqueue(SerializedPacket packet)
std::uint64_t latePacketCount(std::uint32_t stream_id) const
std::uint64_t sendFailureCount(std::uint32_t stream_id) const
double RealType
Type for real numbers.
Definition config.h:27
math::Vec3 max
std::optional< DroppedDatagram > dropped