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

#include "vita49_serializer.h"

Static Public Member Functions

static std::vector< std::uint8_t > serializeSignalData (const SignalDataPacket &packet)
 
static SignalDataSerializationResult serializeSignalDataFixedFullscale (const FixedFullscaleSignalDataPacket &packet)
 
static std::vector< std::uint8_t > serializeContext (const ContextPacket &packet)
 

Detailed Description

Definition at line 53 of file vita49_serializer.h.

Member Function Documentation

◆ serializeContext()

std::vector< std::uint8_t > serial::vita49::Vita49Serializer::serializeContext ( const ContextPacket packet)
static

Definition at line 347 of file vita49_serializer.cpp.

348 {
349 if (packet.cif0 != kFersContextCif0)
350 {
351 throw std::invalid_argument(
352 "Unsupported VITA 49.2 context CIF0: FERS serializer only supports kFersContextCif0");
353 }
354
355 ByteWriter payload;
356 payload.writeU32(packet.cif0);
357 payload.writeU32(packet.state_indicators);
358 payload.writeU64(packet.payload_format);
359 payload.writeF64(packet.sample_rate);
360 payload.writeF64(packet.reference_frequency);
361 payload.writeF64(packet.if_offset);
362 payload.writeF64(packet.bandwidth);
363 payload.writeF64(packet.adc_fullscale);
364 payload.writeU64(packet.receiver_id);
365 const auto metadata = makeContextMetadataJson(packet).dump(-1, ' ', true);
366 payload.writeAsciiMetadata(metadata);
367
368 const std::size_t byte_count = 4u + 4u + 8u + 4u + 8u + payload.bytes().size();
369 const auto packet_size_words = checkedWordCount(byte_count);
370
371 ByteWriter writer(byte_count);
375 writer.writeU32(packet.stream_id);
376 writer.writeU64(packet.class_id);
377 writer.writeU32(packet.timestamp.integer_seconds);
378 writer.writeU64(packet.timestamp.fractional_picoseconds);
379 writer.writeBytes(payload.bytes());
380 return writer.takeBytes();
381 }
constexpr std::uint32_t kFersContextCif0
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
math::Vec3 max

References serial::vita49::Context, serial::vita49::kFersContextCif0, serial::vita49::makeHeader(), max, serial::vita49::RealTimePicoseconds, and serial::vita49::Utc.

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

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

◆ serializeSignalData()

std::vector< std::uint8_t > serial::vita49::Vita49Serializer::serializeSignalData ( const SignalDataPacket packet)
static

Definition at line 275 of file vita49_serializer.cpp.

276 {
277 if (packet.iq_interleaved.size() % 2u != 0u)
278 {
279 throw std::invalid_argument("VITA signal IQ payload must contain I/Q pairs");
280 }
281
282 const std::size_t byte_count = kSignalDataFixedBytes + packet.iq_interleaved.size() * sizeof(std::int16_t);
283 const auto packet_size_words = checkedWordCount(byte_count);
284
285 ByteWriter writer(byte_count);
289 writer.writeU32(packet.stream_id);
290 writer.writeU64(packet.class_id);
291 writer.writeU32(packet.timestamp.integer_seconds);
292 writer.writeU64(packet.timestamp.fractional_picoseconds);
293 for (const auto item : packet.iq_interleaved)
294 {
295 writer.writeI16(item);
296 }
297 writer.writeU32(packet.trailer);
298
299 if (writer.bytes().size() != byte_count)
300 {
301 throw std::logic_error("VITA signal packet byte count mismatch");
302 }
303 return writer.takeBytes();
304 }
constexpr std::uint32_t kSignalDataFixedBytes

References serial::vita49::kSignalDataFixedBytes, serial::vita49::makeHeader(), max, serial::vita49::RealTimePicoseconds, serial::vita49::SignalDataWithStreamId, and serial::vita49::Utc.

+ Here is the call graph for this function:

◆ serializeSignalDataFixedFullscale()

SignalDataSerializationResult serial::vita49::Vita49Serializer::serializeSignalDataFixedFullscale ( const FixedFullscaleSignalDataPacket packet)
static

Definition at line 307 of file vita49_serializer.cpp.

308 {
309 if (!std::isfinite(packet.fullscale) || packet.fullscale <= 0.0)
310 {
311 throw std::invalid_argument("VITA signal full-scale must be positive and finite");
312 }
313
314 const std::size_t byte_count = kSignalDataFixedBytes + packet.samples.size() * sizeof(std::int16_t) * 2u;
315 const auto packet_size_words = checkedWordCount(byte_count);
316
317 ByteWriter writer(byte_count);
321 writer.writeU32(packet.stream_id);
322 writer.writeU64(packet.class_id);
323 writer.writeU32(packet.timestamp.integer_seconds);
324 writer.writeU64(packet.timestamp.fractional_picoseconds);
325
326 std::uint64_t clipped_sample_count = 0;
327 for (const auto& sample : packet.samples)
328 {
329 bool clipped = false;
330 writer.writeI16(scaleComponentToInt16(sample.real(), packet.fullscale, clipped));
331 writer.writeI16(scaleComponentToInt16(sample.imag(), packet.fullscale, clipped));
332 if (clipped)
333 {
334 ++clipped_sample_count;
335 }
336 }
337 writer.writeU32(makeTrailer(packet.valid_data, packet.calibrated_time, packet.reference_lock,
338 clipped_sample_count > 0, packet.sample_loss));
339
340 if (writer.bytes().size() != byte_count)
341 {
342 throw std::logic_error("VITA direct signal packet byte count mismatch");
343 }
344 return SignalDataSerializationResult{.bytes = writer.takeBytes(), .clipped_sample_count = clipped_sample_count};
345 }
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 serial::vita49::SignalDataSerializationResult::bytes, serial::vita49::kSignalDataFixedBytes, serial::vita49::makeHeader(), serial::vita49::makeTrailer(), max, serial::vita49::RealTimePicoseconds, serial::vita49::SignalDataWithStreamId, and serial::vita49::Utc.

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

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

The documentation for this class was generated from the following files: