24 #include "cheetah/rcpt_low/PacketGenerator.h" 25 #include "panda/Log.h" 33 template<
typename DataGenerator>
34 PacketGenerator<DataGenerator>::PacketGenerator(DataGenerator& model
35 ,PacketGeneratorConfig
const& config
38 , _data(config.number_of_spectra(), config.number_of_channels())
39 , _data_iterator(_data.cend())
41 , _interval(config.interval())
44 , _number_of_samples_per_packet(config.number_of_spectra())
45 , _number_of_channels_per_packet(config.number_of_channels_per_packet())
46 , _bandwidth(config.bandwidth())
47 , _fch1(config.fch1())
49 _buffers.reserve(_max_buffers);
50 for(
unsigned i=0; i < _max_buffers; ++i) {
53 _timestamp = ska::cheetah::utils::ModifiedJulianClock::now();
54 _tsamp = ((double)config.number_of_channels()/
static_cast<PacketGenerator<DataGenerator>::FrequencyType
>(config.bandwidth()).value())*1e-6*data::seconds;
57 template<
typename DataGenerator>
58 PacketGenerator<DataGenerator>::~PacketGenerator()
62 template<
typename DataGenerator>
63 ska::panda::Buffer<char> PacketGenerator<DataGenerator>::next()
65 typedef Packet::PacketType PacketType;
66 ska::panda::Buffer<char>& buffer = _buffers[++_buffer_index%_max_buffers];
68 char* ptr = buffer.data();
69 auto packet =
new(ptr) Packet;
72 packet->packet_count(_counter/(number_of_channels_low/_number_of_channels_per_packet));
73 packet->first_channel_number((_counter%(number_of_channels_low/_number_of_channels_per_packet))*_number_of_channels_per_packet);
74 packet->packet_type(PacketType::PssLow);
75 packet->magic_word(25146554);
76 if(packet->first_channel_number()==0)
77 _timestamp = _timestamp + (_number_of_samples_per_packet * _tsamp);
78 static const std::chrono::time_point<std::chrono::system_clock> system_epoch;
79 static const auto epoch_secs = std::chrono::time_point_cast<std::chrono::seconds>(ska::cheetah::utils::ModifiedJulianClock::time_point(system_epoch));
80 auto secs = std::chrono::time_point_cast<std::chrono::seconds>(_timestamp);
81 auto ns = std::chrono::time_point_cast<std::chrono::nanoseconds>(_timestamp) - std::chrono::time_point_cast<std::chrono::nanoseconds>(secs);
82 struct timespec ts{secs.time_since_epoch().count()-epoch_secs.time_since_epoch().count(), ns.count()};
83 unsigned seconds = (unsigned)(ts.tv_sec);
84 uint64_t attoseconds = (uint64_t)(ts.tv_nsec*1e9);
86 packet->timestamp_seconds(seconds);
87 packet->timestamp_attoseconds(attoseconds);
88 packet->set_unit_weights();
89 packet->channel_separation((uint32_t)((
static_cast<PacketGenerator<DataGenerator>::FrequencyType
>(_bandwidth).value()/(
double)number_of_channels_low)*1e9));
90 packet->first_channel_frequency(_fch1);
92 if(_data_iterator == _data.cend())
96 _data_iterator = _data.cbegin();
100 packet->insert(i, Sample( *_data_iterator, *_data_iterator));
108 template<
typename DataGenerator>
114 template<
typename DataGenerator>
Packs data into a UDP stream Packet Header format of the BeamFormer.
Some limits and constants for FLDO.