19 _epoch_unix_nanoseconds(epoch_unix_nanoseconds), _adc_fullscale(adc_fullscale),
23 if (!std::isfinite(adc_fullscale) || adc_fullscale <= 0.0)
25 throw std::invalid_argument(
"VITA ADC full-scale must be positive");
37 return _max_complex_samples_per_packet;
42 const bool sample_loss_pending)
const
45 if (
block.samples.empty())
51 if (!std::isfinite(sample_rate) || sample_rate <= 0.0)
53 throw std::invalid_argument(
"VITA sample block must have positive sample rate");
58 result.packets.reserve((
block.samples.size() + _max_complex_samples_per_packet - 1u) /
59 _max_complex_samples_per_packet);
62 const auto count = std::min(_max_complex_samples_per_packet,
block.samples.size() -
offset);
70 .timestamp = timestamp,
71 .packet_count = packet_counts.
next(),
72 .valid_data =
block.valid_data,
73 .calibrated_time =
block.calibrated_time,
74 .reference_lock =
block.reference_lock,
77 .fullscale = _adc_fullscale});
82 if (bytes.size() > _max_udp_payload_bytes)
84 throw std::logic_error(
"VITA signal packet exceeded max UDP payload");
88 .stream_id = stream_id,
89 .sample_count = count,
92 .context_packet =
false,
95 .timestamp = timestamp});
96 result.samples_emitted += count;
107 if (bytes.size() > _max_udp_payload_bytes)
109 throw std::logic_error(
"VITA context packet exceeded max UDP payload");
114 .first_sample_time = 0.0,
115 .data_packet =
false,
116 .context_packet =
true,
std::uint8_t next() noexcept
PacketizerResult packetize(const core::ReceiverSampleBlock &block, std::uint32_t stream_id, PacketCountSequencer &packet_counts, bool sample_loss_pending) const
Vita49Packetizer(std::uint64_t epoch_unix_nanoseconds, RealType adc_fullscale, std::uint16_t max_udp_payload_bytes=kDefaultMaxUdpPayloadBytes)
SerializedPacket makeContextPacket(const ContextPacket &context) const
RealType adcFullscale() const noexcept
std::uint16_t maxUdpPayloadBytes() const noexcept
std::size_t maxComplexSamplesPerPacket() const noexcept
std::uint64_t epochUnixNanoseconds() const noexcept
static std::vector< std::uint8_t > serializeContext(const ContextPacket &packet)
static SignalDataSerializationResult serializeSignalDataFixedFullscale(const FixedFullscaleSignalDataPacket &packet)
double RealType
Type for real numbers.
std::size_t maxComplexSamplesPerSignalPacket(const std::uint16_t max_udp_payload_bytes)
Timestamp timestampFromEpoch(const std::uint64_t epoch_unix_nanoseconds, const RealType sample_time_seconds)
constexpr std::uint64_t kFersVrtIqClassId
std::uint32_t context_flags
std::vector< std::uint8_t > bytes