FERS 0.1.0
The Flexible Extensible Radar Simulator
Loading...
Searching...
No Matches
serial::vita49 Namespace Reference

Classes

class  ByteWriter
 
struct  ContextBuildRequest
 
struct  ContextPacket
 
class  DatagramSender
 
struct  DroppedDatagram
 
struct  EnqueueResult
 
struct  FixedFullscaleSignalDataPacket
 
class  PacedSender
 
class  PacketCountSequencer
 
struct  PacketizerResult
 
struct  SerializedPacket
 
struct  SignalDataPacket
 
struct  SignalDataSerializationResult
 
class  StreamRegistry
 
struct  Timestamp
 
class  UdpSender
 
class  Vita49ContextBuilder
 
class  Vita49OutputSink
 
class  Vita49Packetizer
 
class  Vita49Serializer
 

Enumerations

enum class  PacketType : std::uint8_t { SignalDataWithStreamId = 0x1 , Context = 0x4 }
 
enum class  IntegerTimestampMode : std::uint8_t { None = 0 , Utc = 1 , Gps = 2 , Other = 3 }
 
enum class  FractionalTimestampMode : std::uint8_t { None = 0 , SampleCount = 1 , RealTimePicoseconds = 2 , FreeRunning = 3 }
 
enum  TrailerIndicator : std::uint32_t {
  TrailerEnableCalibratedTime = 1u << 31u , TrailerEnableValidData = 1u << 30u , TrailerEnableReferenceLock = 1u << 29u , TrailerEnableOverRange = 1u << 28u ,
  TrailerEnableSampleLoss = 1u << 27u , TrailerCalibratedTime = 1u << 15u , TrailerValidData = 1u << 14u , TrailerReferenceLock = 1u << 13u ,
  TrailerOverRange = 1u << 12u , TrailerSampleLoss = 1u << 11u
}
 
enum  ContextIndicator0 : std::uint32_t {
  Cif0StateIndicators = 1u << 31u , Cif0PayloadFormat = 1u << 30u , Cif0SampleRate = 1u << 29u , Cif0ReferenceFrequency = 1u << 28u ,
  Cif0IfOffset = 1u << 27u , Cif0Bandwidth = 1u << 26u , Cif0ReferenceLevel = 1u << 25u , Cif0DeviceIdentifier = 1u << 24u ,
  Cif0AsciiMetadata = 1u << 23u
}
 
enum  ContextFlags : std::uint32_t {
  ContextFlagDechirped = 1u << 0u , ContextFlagIfResampled = 1u << 1u , ContextFlagSampleLoss = 1u << 2u , ContextFlagStreamOpen = 1u << 3u ,
  ContextFlagStreamClose = 1u << 4u , ContextFlagFmcwMetadataPresent = 1u << 5u , ContextFlagCwMetadataPresent = 1u << 6u , ContextFlagPulsedMetadataPresent = 1u << 7u
}
 

Functions

std::unique_ptr< core::ReceiverOutputSinkmakeVita49OutputSink (core::ReceiverOutputTelemetryCallback telemetry_callback)
 
std::uint32_t makeHeader (const PacketType type, const bool class_id_present, const bool trailer_present, const IntegerTimestampMode tsi, const FractionalTimestampMode tsf, const std::uint8_t packet_count, const std::uint16_t packet_size_words) noexcept
 
Timestamp timestampFromEpoch (const std::uint64_t epoch_unix_nanoseconds, const RealType sample_time_seconds)
 
std::uint32_t makeTrailer (const bool valid_data, const bool calibrated_time, const bool reference_lock, const bool over_range, const bool sample_loss) noexcept
 
std::uint32_t makeContextStateIndicators (const bool valid_data, const bool calibrated_time, const bool reference_lock, const bool over_range, const bool sample_loss) noexcept
 
std::uint64_t makeComplexInt16PayloadFormat () noexcept
 
std::size_t maxComplexSamplesPerSignalPacket (const std::uint16_t max_udp_payload_bytes)
 

Variables

constexpr std::uint16_t kDefaultMaxUdpPayloadBytes = 1400
 
constexpr std::uint32_t kSignalDataFixedBytes = 32
 
constexpr std::uint32_t kFersInternalOui = 0xFA5253u
 
constexpr std::uint16_t kFersInformationClassIqStream = 0x0001u
 
constexpr std::uint16_t kFersPacketClassV1 = 0x0001u
 
constexpr std::uint64_t kFersVrtIqClassId
 
constexpr std::uint32_t kFersContextCif0
 

Enumeration Type Documentation

◆ ContextFlags

Enumerator
ContextFlagDechirped 
ContextFlagIfResampled 
ContextFlagSampleLoss 
ContextFlagStreamOpen 
ContextFlagStreamClose 
ContextFlagFmcwMetadataPresent 
ContextFlagCwMetadataPresent 
ContextFlagPulsedMetadataPresent 

Definition at line 86 of file vita49_types.h.

87 {
88 ContextFlagDechirped = 1u << 0u,
89 ContextFlagIfResampled = 1u << 1u,
90 ContextFlagSampleLoss = 1u << 2u,
91 ContextFlagStreamOpen = 1u << 3u,
92 ContextFlagStreamClose = 1u << 4u,
96 };
@ ContextFlagFmcwMetadataPresent
@ ContextFlagCwMetadataPresent
@ ContextFlagPulsedMetadataPresent
math::Vec3 max

◆ ContextIndicator0

Enumerator
Cif0StateIndicators 
Cif0PayloadFormat 
Cif0SampleRate 
Cif0ReferenceFrequency 
Cif0IfOffset 
Cif0Bandwidth 
Cif0ReferenceLevel 
Cif0DeviceIdentifier 
Cif0AsciiMetadata 

Definition at line 69 of file vita49_types.h.

70 {
71 Cif0StateIndicators = 1u << 31u,
72 Cif0PayloadFormat = 1u << 30u,
73 Cif0SampleRate = 1u << 29u,
74 Cif0ReferenceFrequency = 1u << 28u,
75 Cif0IfOffset = 1u << 27u,
76 Cif0Bandwidth = 1u << 26u,
77 Cif0ReferenceLevel = 1u << 25u,
78 Cif0DeviceIdentifier = 1u << 24u,
79 Cif0AsciiMetadata = 1u << 23u,
80 };

◆ FractionalTimestampMode

Enumerator
None 
SampleCount 
RealTimePicoseconds 
FreeRunning 

Definition at line 47 of file vita49_types.h.

◆ IntegerTimestampMode

Enumerator
None 
Utc 
Gps 
Other 

Definition at line 39 of file vita49_types.h.

◆ PacketType

enum class serial::vita49::PacketType : std::uint8_t
strong
Enumerator
SignalDataWithStreamId 
Context 

Definition at line 33 of file vita49_types.h.

◆ TrailerIndicator

Enumerator
TrailerEnableCalibratedTime 
TrailerEnableValidData 
TrailerEnableReferenceLock 
TrailerEnableOverRange 
TrailerEnableSampleLoss 
TrailerCalibratedTime 
TrailerValidData 
TrailerReferenceLock 
TrailerOverRange 
TrailerSampleLoss 

Definition at line 55 of file vita49_types.h.

56 {
58 TrailerEnableValidData = 1u << 30u,
60 TrailerEnableOverRange = 1u << 28u,
61 TrailerEnableSampleLoss = 1u << 27u,
62 TrailerCalibratedTime = 1u << 15u,
63 TrailerValidData = 1u << 14u,
64 TrailerReferenceLock = 1u << 13u,
65 TrailerOverRange = 1u << 12u,
66 TrailerSampleLoss = 1u << 11u,
67 };
@ TrailerEnableCalibratedTime

Function Documentation

◆ makeComplexInt16PayloadFormat()

std::uint64_t serial::vita49::makeComplexInt16PayloadFormat ( )
noexcept

Definition at line 136 of file vita49_types.cpp.

137 {
138 // Internal FERS profile payload-format word:
139 // [63:60] complex Cartesian, [59:56] two's-complement integer,
140 // [55:48] item bits, [47:40] packing bits, [39:32] vector size,
141 // [31:16] repeat count, [15:0] reserved/version.
142 constexpr std::uint64_t complex_cartesian = 0x2ull;
143 constexpr std::uint64_t twos_complement = 0x1ull;
144 constexpr std::uint64_t item_bits = 16ull;
145 constexpr std::uint64_t packing_bits = 16ull;
146 constexpr std::uint64_t vector_size = 2ull;
147 constexpr std::uint64_t repeat_count = 1ull;
148 constexpr std::uint64_t version = 1ull;
149 return (complex_cartesian << 60u) | (twos_complement << 56u) | (item_bits << 48u) | (packing_bits << 40u) |
150 (vector_size << 32u) | (repeat_count << 16u) | version;
151 }

References max.

Referenced by serial::vita49::Vita49ContextBuilder::build().

+ Here is the caller graph for this function:

◆ makeContextStateIndicators()

std::uint32_t serial::vita49::makeContextStateIndicators ( const bool  valid_data,
const bool  calibrated_time,
const bool  reference_lock,
const bool  over_range,
const bool  sample_loss 
)
noexcept

Definition at line 129 of file vita49_types.cpp.

132 {
133 return makeTrailer(valid_data, calibrated_time, reference_lock, over_range, sample_loss);
134 }
std::uint32_t makeTrailer(const bool valid_data, const bool calibrated_time, const bool reference_lock, const bool over_range, const bool sample_loss) noexcept

References makeTrailer().

Referenced by serial::vita49::Vita49ContextBuilder::build().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ makeHeader()

std::uint32_t serial::vita49::makeHeader ( const PacketType  type,
const bool  class_id_present,
const bool  trailer_present,
const IntegerTimestampMode  tsi,
const FractionalTimestampMode  tsf,
const std::uint8_t  packet_count,
const std::uint16_t  packet_size_words 
)
noexcept

Definition at line 29 of file vita49_types.cpp.

32 {
33 std::uint32_t header = static_cast<std::uint32_t>(type) << 28u;
35 {
36 header |= 1u << 27u;
37 }
39 {
40 header |= 1u << 26u;
41 }
42
43 header |= 1u << 25u; // VITA 49.2 format bit.
44 header |= static_cast<std::uint32_t>(tsi) << 22u;
45 header |= static_cast<std::uint32_t>(tsf) << 20u;
46 header |= static_cast<std::uint32_t>(packet_count & 0x0Fu) << 16u;
48 return header;
49 }

References max.

Referenced by serial::vita49::Vita49Serializer::serializeContext(), serial::vita49::Vita49Serializer::serializeSignalData(), and serial::vita49::Vita49Serializer::serializeSignalDataFixedFullscale().

+ Here is the caller graph for this function:

◆ makeTrailer()

std::uint32_t serial::vita49::makeTrailer ( const bool  valid_data,
const bool  calibrated_time,
const bool  reference_lock,
const bool  over_range,
const bool  sample_loss 
)
noexcept

Definition at line 101 of file vita49_types.cpp.

103 {
106 if (valid_data)
107 {
108 trailer |= TrailerValidData;
109 }
110 if (calibrated_time)
111 {
112 trailer |= TrailerCalibratedTime;
113 }
114 if (reference_lock)
115 {
116 trailer |= TrailerReferenceLock;
117 }
118 if (over_range)
119 {
120 trailer |= TrailerOverRange;
121 }
122 if (sample_loss)
123 {
124 trailer |= TrailerSampleLoss;
125 }
126 return trailer;
127 }

References TrailerCalibratedTime, TrailerEnableCalibratedTime, TrailerEnableOverRange, TrailerEnableReferenceLock, TrailerEnableSampleLoss, TrailerEnableValidData, TrailerOverRange, TrailerReferenceLock, TrailerSampleLoss, and TrailerValidData.

Referenced by makeContextStateIndicators(), and serial::vita49::Vita49Serializer::serializeSignalDataFixedFullscale().

+ Here is the caller graph for this function:

◆ makeVita49OutputSink()

std::unique_ptr< core::ReceiverOutputSink > serial::vita49::makeVita49OutputSink ( core::ReceiverOutputTelemetryCallback  telemetry_callback)

Definition at line 482 of file vita49_output_sink.cpp.

483 {
484 return std::make_unique<Vita49OutputSink>(nullptr, std::move(telemetry_callback));
485 }

References makeVita49OutputSink(), and max.

Referenced by makeVita49OutputSink(), and core::runEventDrivenSim().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ maxComplexSamplesPerSignalPacket()

std::size_t serial::vita49::maxComplexSamplesPerSignalPacket ( const std::uint16_t  max_udp_payload_bytes)

Definition at line 153 of file vita49_types.cpp.

154 {
155 if (max_udp_payload_bytes < kSignalDataFixedBytes + sizeof(std::int16_t) * 2u)
156 {
157 throw std::invalid_argument("VITA max UDP payload cannot fit one complex int16 sample");
158 }
159 return (max_udp_payload_bytes - kSignalDataFixedBytes) / (sizeof(std::int16_t) * 2u);
160 }

References kSignalDataFixedBytes, and max.

◆ timestampFromEpoch()

Timestamp serial::vita49::timestampFromEpoch ( const std::uint64_t  epoch_unix_nanoseconds,
const RealType  sample_time_seconds 
)

Definition at line 51 of file vita49_types.cpp.

52 {
53 if (!std::isfinite(sample_time_seconds))
54 {
55 throw std::invalid_argument("VITA timestamp sample time must be finite");
56 }
57
58 const auto epoch_seconds = static_cast<std::uint64_t>(epoch_unix_nanoseconds / 1'000'000'000ull);
59 const auto epoch_nanoseconds = static_cast<std::uint64_t>(epoch_unix_nanoseconds % 1'000'000'000ull);
60
61 const auto offset_seconds = static_cast<long double>(sample_time_seconds);
62 const long double offset_floor = std::floor(offset_seconds);
63 const auto whole_offset_seconds = static_cast<std::int64_t>(offset_floor);
64 long double fractional_seconds =
65 (static_cast<long double>(epoch_nanoseconds) / 1.0e9L) + (offset_seconds - offset_floor);
66
67 std::int64_t carry_seconds = 0;
68 while (fractional_seconds >= 1.0L)
69 {
70 fractional_seconds -= 1.0L;
72 }
73 while (fractional_seconds < 0.0L)
74 {
75 fractional_seconds += 1.0L;
77 }
78
79 const auto signed_seconds = static_cast<std::int64_t>(epoch_seconds) + whole_offset_seconds + carry_seconds;
80 if (signed_seconds < 0 || signed_seconds > static_cast<std::int64_t>(std::numeric_limits<std::uint32_t>::max()))
81 {
82 throw std::out_of_range("VITA UTC integer timestamp is outside 32-bit range");
83 }
84
85 auto fractional_picoseconds =
86 static_cast<std::uint64_t>(std::llround(fractional_seconds * 1'000'000'000'000.0L));
87 auto integer_seconds = static_cast<std::uint32_t>(signed_seconds);
88 if (fractional_picoseconds >= 1'000'000'000'000ull)
89 {
90 fractional_picoseconds -= 1'000'000'000'000ull;
91 if (integer_seconds == std::numeric_limits<std::uint32_t>::max())
92 {
93 throw std::out_of_range("VITA UTC integer timestamp overflow");
94 }
95 ++integer_seconds;
96 }
97
98 return Timestamp{.integer_seconds = integer_seconds, .fractional_picoseconds = fractional_picoseconds};
99 }

References serial::vita49::Timestamp::integer_seconds, and max.

Referenced by serial::vita49::Vita49Packetizer::packetize().

+ Here is the caller graph for this function:

Variable Documentation

◆ kDefaultMaxUdpPayloadBytes

constexpr std::uint16_t serial::vita49::kDefaultMaxUdpPayloadBytes = 1400
constexpr

Definition at line 21 of file vita49_types.h.

◆ kFersContextCif0

◆ kFersInformationClassIqStream

constexpr std::uint16_t serial::vita49::kFersInformationClassIqStream = 0x0001u
constexpr

Definition at line 27 of file vita49_types.h.

◆ kFersInternalOui

constexpr std::uint32_t serial::vita49::kFersInternalOui = 0xFA5253u
constexpr

Definition at line 26 of file vita49_types.h.

◆ kFersPacketClassV1

constexpr std::uint16_t serial::vita49::kFersPacketClassV1 = 0x0001u
constexpr

Definition at line 28 of file vita49_types.h.

◆ kFersVrtIqClassId

constexpr std::uint64_t serial::vita49::kFersVrtIqClassId
constexpr
Initial value:
= (static_cast<std::uint64_t>(kFersInternalOui) << 40u) |
(static_cast<std::uint64_t>(kFersInformationClassIqStream) << 24u) |
(static_cast<std::uint64_t>(kFersPacketClassV1) << 8u) | 0x01u
constexpr std::uint32_t kFersInternalOui
constexpr std::uint16_t kFersPacketClassV1
constexpr std::uint16_t kFersInformationClassIqStream

Definition at line 29 of file vita49_types.h.

Referenced by serial::vita49::Vita49ContextBuilder::build(), and serial::vita49::Vita49Packetizer::packetize().

◆ kSignalDataFixedBytes

constexpr std::uint32_t serial::vita49::kSignalDataFixedBytes = 32
constexpr