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 381 of file vita49_serializer.cpp.

382 {
383 if (packet.cif0 != kFersContextCif0)
384 {
385 throw std::invalid_argument(
386 "Unsupported VITA 49.2 context CIF0: FERS serializer only supports kFersContextCif0");
387 }
388
389 ByteWriter payload;
390 payload.writeU32(packet.cif0);
391 payload.writeU32(packet.state_indicators);
392 payload.writeU64(packet.payload_format);
393 payload.writeF64(packet.sample_rate);
394 payload.writeF64(packet.reference_frequency);
395 payload.writeF64(packet.if_offset);
396 payload.writeF64(packet.bandwidth);
397 payload.writeF64(packet.adc_fullscale);
398 payload.writeU64(packet.receiver_id);
399 const auto metadata = makeContextMetadataJson(packet).dump(-1, ' ', true);
400 payload.writeAsciiMetadata(metadata);
401
402 const std::size_t byte_count = 4u + 4u + 8u + 4u + 8u + payload.bytes().size();
403 const auto packet_size_words = checkedWordCount(byte_count);
404
405 ByteWriter writer(byte_count);
409 writer.writeU32(packet.stream_id);
410 writer.writeU64(packet.class_id);
411 writer.writeU32(packet.timestamp.integer_seconds);
412 writer.writeU64(packet.timestamp.fractional_picoseconds);
413 writer.writeBytes(payload.bytes());
414 return writer.takeBytes();
415 }
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 309 of file vita49_serializer.cpp.

310 {
311 if (packet.iq_interleaved.size() % 2u != 0u)
312 {
313 throw std::invalid_argument("VITA signal IQ payload must contain I/Q pairs");
314 }
315
316 const std::size_t byte_count = kSignalDataFixedBytes + packet.iq_interleaved.size() * sizeof(std::int16_t);
317 const auto packet_size_words = checkedWordCount(byte_count);
318
319 ByteWriter writer(byte_count);
323 writer.writeU32(packet.stream_id);
324 writer.writeU64(packet.class_id);
325 writer.writeU32(packet.timestamp.integer_seconds);
326 writer.writeU64(packet.timestamp.fractional_picoseconds);
327 for (const auto item : packet.iq_interleaved)
328 {
329 writer.writeI16(item);
330 }
331 writer.writeU32(packet.trailer);
332
333 if (writer.bytes().size() != byte_count)
334 {
335 throw std::logic_error("VITA signal packet byte count mismatch");
336 }
337 return writer.takeBytes();
338 }
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 341 of file vita49_serializer.cpp.

342 {
343 if (!std::isfinite(packet.fullscale) || packet.fullscale <= 0.0)
344 {
345 throw std::invalid_argument("VITA signal full-scale must be positive and finite");
346 }
347
348 const std::size_t byte_count = kSignalDataFixedBytes + packet.samples.size() * sizeof(std::int16_t) * 2u;
349 const auto packet_size_words = checkedWordCount(byte_count);
350
351 ByteWriter writer(byte_count);
355 writer.writeU32(packet.stream_id);
356 writer.writeU64(packet.class_id);
357 writer.writeU32(packet.timestamp.integer_seconds);
358 writer.writeU64(packet.timestamp.fractional_picoseconds);
359
360 std::uint64_t clipped_sample_count = 0;
361 for (const auto& sample : packet.samples)
362 {
363 bool clipped = false;
364 writer.writeI16(scaleComponentToInt16(sample.real(), packet.fullscale, clipped));
365 writer.writeI16(scaleComponentToInt16(sample.imag(), packet.fullscale, clipped));
366 if (clipped)
367 {
368 ++clipped_sample_count;
369 }
370 }
371 writer.writeU32(makeTrailer(packet.valid_data, packet.calibrated_time, packet.reference_lock,
372 clipped_sample_count > 0, packet.sample_loss));
373
374 if (writer.bytes().size() != byte_count)
375 {
376 throw std::logic_error("VITA direct signal packet byte count mismatch");
377 }
378 return SignalDataSerializationResult{.bytes = writer.takeBytes(), .clipped_sample_count = clipped_sample_count};
379 }
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: