FERS 0.1.0
The Flexible Extensible Radar Simulator
Loading...
Searching...
No Matches
vita49_output_sink.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 <memory>
11#include <mutex>
12#include <optional>
13#include <unordered_map>
14#include <unordered_set>
15#include <vector>
16
22
23namespace serial::vita49
24{
26 {
27 public:
28 explicit Vita49OutputSink(std::unique_ptr<DatagramSender> sender = nullptr,
30 ~Vita49OutputSink() override;
35
36 void initializeRun(const core::OutputConfig& config, std::string simulation_name) override;
37 std::uint32_t registerStream(const core::ReceiverStreamDescriptor& stream) override;
38 void openStream(std::uint32_t stream_id, RealType first_sample_time) override;
39 void submitBlock(const core::ReceiverSampleBlock& block) override;
41 void closeStream(std::uint32_t stream_id) override;
42 core::OutputStats finalize() override;
43 [[nodiscard]] core::OutputStats snapshotStats() const override;
44
45 private:
46 struct StreamState
47 {
50 PacketCountSequencer packet_counts;
51 bool opened = false;
52 bool closed = false;
53 bool sample_loss_pending = false;
54 bool over_range_pending = false;
55 RealType last_context_time = -1.0e300;
56 };
57
58 [[nodiscard]] StreamState& stateFor(std::uint32_t stream_id);
59 [[nodiscard]] const StreamState& stateFor(std::uint32_t stream_id) const;
60 [[nodiscard]] core::OutputStats snapshotStatsLocked() const;
61 [[nodiscard]] bool enqueuePacket(SerializedPacket&& packet);
62 void emitTelemetry(std::vector<core::ReceiverOutputPacketTrace> packets = {}, bool force_stats = false);
63 [[nodiscard]] std::vector<core::ReceiverOutputPacketTrace> consumeSenderDropsLocked();
64 [[nodiscard]] core::ReceiverOutputPacketTrace makeTrace(const SerializedPacket& packet,
65 std::string event) const;
66 [[nodiscard]] core::ReceiverOutputPacketTrace makeDropTrace(const DroppedDatagram& dropped) const;
67 void emitContext(std::uint32_t stream_id, RealType simulation_time, bool stream_open, bool stream_close);
68 void applyDropped(const DroppedDatagram& dropped);
69
70 core::OutputConfig _config;
71 std::string _simulation_name;
72 core::ReceiverOutputTelemetryCallback _telemetry_callback;
73 std::unique_ptr<DatagramSender> _provided_sender;
74 StreamRegistry _registry;
75 std::unique_ptr<Vita49Packetizer> _packetizer;
76 std::unique_ptr<PacedSender> _sender;
77 std::unordered_map<std::uint32_t, StreamState> _streams;
78 mutable std::recursive_mutex _mutex;
79 std::chrono::steady_clock::time_point _last_stats_emit = std::chrono::steady_clock::time_point::min();
80 std::chrono::steady_clock::time_point _last_packet_trace_emit = std::chrono::steady_clock::time_point::min();
81 std::vector<core::ReceiverOutputPacketTrace> _pending_packet_traces;
82 std::uint64_t _trace_sequence = 0;
83 bool _initialized = false;
84 bool _finalized = false;
85 };
86
87 [[nodiscard]] std::unique_ptr<core::ReceiverOutputSink>
89}
Vita49OutputSink & operator=(Vita49OutputSink &&)=delete
void closeStream(std::uint32_t stream_id) override
core::OutputStats snapshotStats() const override
Vita49OutputSink & operator=(const Vita49OutputSink &)=delete
void emitContextHeartbeat(RealType simulation_time) override
Vita49OutputSink(Vita49OutputSink &&)=delete
core::OutputStats finalize() override
void openStream(std::uint32_t stream_id, RealType first_sample_time) override
std::uint32_t registerStream(const core::ReceiverStreamDescriptor &stream) override
void submitBlock(const core::ReceiverSampleBlock &block) override
void initializeRun(const core::OutputConfig &config, std::string simulation_name) override
Vita49OutputSink(const Vita49OutputSink &)=delete
double RealType
Type for real numbers.
Definition config.h:27
std::function< void(const std::optional< OutputStats > &, std::span< const ReceiverOutputPacketTrace >)> ReceiverOutputTelemetryCallback
std::unique_ptr< core::ReceiverOutputSink > makeVita49OutputSink(core::ReceiverOutputTelemetryCallback telemetry_callback)
math::Vec3 max