mirror of
https://github.com/gnss-sdr/gnss-sdr
synced 2024-12-15 04:30:33 +00:00
Adding an option to SDR sample counter to modulate the observable generation rate. It defaults to 20 ms interval (50 Hz)
This commit is contained in:
parent
00f03a679a
commit
b47d7826eb
@ -36,14 +36,16 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
gnss_sdr_sample_counter::gnss_sdr_sample_counter(double _fs, size_t _size) : gr::sync_decimator("sample_counter",
|
gnss_sdr_sample_counter::gnss_sdr_sample_counter(double _fs, int _interval_ms, size_t _size) : gr::sync_decimator("sample_counter",
|
||||||
gr::io_signature::make(1, 1, _size),
|
gr::io_signature::make(1, 1, _size),
|
||||||
gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)),
|
gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)),
|
||||||
static_cast<unsigned int>(std::round(_fs * 0.001)))
|
static_cast<unsigned int>(std::round(_fs * static_cast<double>(_interval_ms) / 1e3)))
|
||||||
{
|
{
|
||||||
message_port_register_out(pmt::mp("sample_counter"));
|
message_port_register_out(pmt::mp("sample_counter"));
|
||||||
set_max_noutput_items(1);
|
set_max_noutput_items(1);
|
||||||
samples_per_output = std::round(_fs * 0.001);
|
interval_ms = _interval_ms;
|
||||||
|
fs = _fs;
|
||||||
|
samples_per_output = std::round(fs * static_cast<double>(interval_ms) / 1e3);
|
||||||
sample_counter = 0;
|
sample_counter = 0;
|
||||||
current_T_rx_ms = 0;
|
current_T_rx_ms = 0;
|
||||||
current_s = 0;
|
current_s = 0;
|
||||||
@ -58,9 +60,9 @@ gnss_sdr_sample_counter::gnss_sdr_sample_counter(double _fs, size_t _size) : gr:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
gnss_sdr_sample_counter_sptr gnss_sdr_make_sample_counter(double _fs, size_t _size)
|
gnss_sdr_sample_counter_sptr gnss_sdr_make_sample_counter(double _fs, int _interval_ms, size_t _size)
|
||||||
{
|
{
|
||||||
gnss_sdr_sample_counter_sptr sample_counter_(new gnss_sdr_sample_counter(_fs, _size));
|
gnss_sdr_sample_counter_sptr sample_counter_(new gnss_sdr_sample_counter(_fs, _interval_ms, _size));
|
||||||
return sample_counter_;
|
return sample_counter_;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -74,6 +76,7 @@ int gnss_sdr_sample_counter::work(int noutput_items __attribute__((unused)),
|
|||||||
out[0].Flag_valid_symbol_output = false;
|
out[0].Flag_valid_symbol_output = false;
|
||||||
out[0].Flag_valid_word = false;
|
out[0].Flag_valid_word = false;
|
||||||
out[0].Channel_ID = -1;
|
out[0].Channel_ID = -1;
|
||||||
|
out[0].fs = fs;
|
||||||
if ((current_T_rx_ms % report_interval_ms) == 0)
|
if ((current_T_rx_ms % report_interval_ms) == 0)
|
||||||
{
|
{
|
||||||
current_s++;
|
current_s++;
|
||||||
@ -134,6 +137,6 @@ int gnss_sdr_sample_counter::work(int noutput_items __attribute__((unused)),
|
|||||||
}
|
}
|
||||||
sample_counter += samples_per_output;
|
sample_counter += samples_per_output;
|
||||||
out[0].Tracking_sample_counter = sample_counter;
|
out[0].Tracking_sample_counter = sample_counter;
|
||||||
current_T_rx_ms++;
|
current_T_rx_ms += interval_ms;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -39,14 +39,16 @@ class gnss_sdr_sample_counter;
|
|||||||
|
|
||||||
typedef boost::shared_ptr<gnss_sdr_sample_counter> gnss_sdr_sample_counter_sptr;
|
typedef boost::shared_ptr<gnss_sdr_sample_counter> gnss_sdr_sample_counter_sptr;
|
||||||
|
|
||||||
gnss_sdr_sample_counter_sptr gnss_sdr_make_sample_counter(double _fs, size_t _size);
|
gnss_sdr_sample_counter_sptr gnss_sdr_make_sample_counter(double _fs, int _interval_ms, size_t _size);
|
||||||
|
|
||||||
class gnss_sdr_sample_counter : public gr::sync_decimator
|
class gnss_sdr_sample_counter : public gr::sync_decimator
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
gnss_sdr_sample_counter(double _fs, size_t _size);
|
gnss_sdr_sample_counter(double _fs, int _interval_ms, size_t _size);
|
||||||
unsigned int samples_per_output;
|
unsigned int samples_per_output;
|
||||||
unsigned long int sample_counter;
|
double fs;
|
||||||
|
unsigned long long int sample_counter;
|
||||||
|
int interval_ms;
|
||||||
long long int current_T_rx_ms; // Receiver time in ms since the beginning of the run
|
long long int current_T_rx_ms; // Receiver time in ms since the beginning of the run
|
||||||
unsigned int current_s; // Receiver time in seconds, modulo 60
|
unsigned int current_s; // Receiver time in seconds, modulo 60
|
||||||
bool flag_m; // True if the receiver has been running for at least 1 minute
|
bool flag_m; // True if the receiver has been running for at least 1 minute
|
||||||
@ -59,7 +61,7 @@ private:
|
|||||||
bool flag_enable_send_msg;
|
bool flag_enable_send_msg;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
friend gnss_sdr_sample_counter_sptr gnss_sdr_make_sample_counter(double _fs, size_t _size);
|
friend gnss_sdr_sample_counter_sptr gnss_sdr_make_sample_counter(double _fs, int _interval_ms, size_t _size);
|
||||||
int work(int noutput_items,
|
int work(int noutput_items,
|
||||||
gr_vector_const_void_star &input_items,
|
gr_vector_const_void_star &input_items,
|
||||||
gr_vector_void_star &output_items);
|
gr_vector_void_star &output_items);
|
||||||
|
@ -277,7 +277,8 @@ void GNSSFlowgraph::connect()
|
|||||||
std::cout << "Set GNSS-SDR.internal_fs_sps in configuration file" << std::endl;
|
std::cout << "Set GNSS-SDR.internal_fs_sps in configuration file" << std::endl;
|
||||||
throw(std::invalid_argument("Set GNSS-SDR.internal_fs_sps in configuration"));
|
throw(std::invalid_argument("Set GNSS-SDR.internal_fs_sps in configuration"));
|
||||||
}
|
}
|
||||||
ch_out_sample_counter = gnss_sdr_make_sample_counter(fs, sig_conditioner_.at(0)->get_right_block()->output_signature()->sizeof_stream_item(0));
|
int observable_interval_ms = static_cast<double>(configuration_->property("GNSS-SDR.observable_interval_ms", 20));
|
||||||
|
ch_out_sample_counter = gnss_sdr_make_sample_counter(fs, observable_interval_ms, sig_conditioner_.at(0)->get_right_block()->output_signature()->sizeof_stream_item(0));
|
||||||
top_block_->connect(sig_conditioner_.at(0)->get_right_block(), 0, ch_out_sample_counter, 0);
|
top_block_->connect(sig_conditioner_.at(0)->get_right_block(), 0, ch_out_sample_counter, 0);
|
||||||
top_block_->connect(ch_out_sample_counter, 0, observables_->get_left_block(), channels_count_); //extra port for the sample counter pulse
|
top_block_->connect(ch_out_sample_counter, 0, observables_->get_left_block(), channels_count_); //extra port for the sample counter pulse
|
||||||
}
|
}
|
||||||
@ -296,8 +297,9 @@ void GNSSFlowgraph::connect()
|
|||||||
{
|
{
|
||||||
//null source
|
//null source
|
||||||
null_source_ = gr::blocks::null_source::make(sizeof(Gnss_Synchro));
|
null_source_ = gr::blocks::null_source::make(sizeof(Gnss_Synchro));
|
||||||
//throttle 1kHz
|
//throttle to observable interval
|
||||||
throttle_ = gr::blocks::throttle::make(sizeof(Gnss_Synchro), 1000); // 1000 samples per second (1kHz)
|
int observable_interval_ms = static_cast<double>(configuration_->property("GNSS-SDR.observable_interval_ms", 20));
|
||||||
|
throttle_ = gr::blocks::throttle::make(sizeof(Gnss_Synchro), std::round(1.0 / static_cast<double>(observable_interval_ms))); // 1000 samples per second (1kHz)
|
||||||
time_counter_ = gnss_sdr_make_time_counter();
|
time_counter_ = gnss_sdr_make_time_counter();
|
||||||
top_block_->connect(null_source_, 0, throttle_, 0);
|
top_block_->connect(null_source_, 0, throttle_, 0);
|
||||||
top_block_->connect(throttle_, 0, time_counter_, 0);
|
top_block_->connect(throttle_, 0, time_counter_, 0);
|
||||||
@ -323,7 +325,9 @@ void GNSSFlowgraph::connect()
|
|||||||
std::cout << "Set GNSS-SDR.internal_fs_sps in configuration file" << std::endl;
|
std::cout << "Set GNSS-SDR.internal_fs_sps in configuration file" << std::endl;
|
||||||
throw(std::invalid_argument("Set GNSS-SDR.internal_fs_sps in configuration"));
|
throw(std::invalid_argument("Set GNSS-SDR.internal_fs_sps in configuration"));
|
||||||
}
|
}
|
||||||
ch_out_sample_counter = gnss_sdr_make_sample_counter(fs, sig_conditioner_.at(0)->get_right_block()->output_signature()->sizeof_stream_item(0));
|
|
||||||
|
int observable_interval_ms = static_cast<double>(configuration_->property("GNSS-SDR.observable_interval_ms", 20));
|
||||||
|
ch_out_sample_counter = gnss_sdr_make_sample_counter(fs, observable_interval_ms, sig_conditioner_.at(0)->get_right_block()->output_signature()->sizeof_stream_item(0));
|
||||||
top_block_->connect(sig_conditioner_.at(0)->get_right_block(), 0, ch_out_sample_counter, 0);
|
top_block_->connect(sig_conditioner_.at(0)->get_right_block(), 0, ch_out_sample_counter, 0);
|
||||||
top_block_->connect(ch_out_sample_counter, 0, observables_->get_left_block(), channels_count_); //extra port for the sample counter pulse
|
top_block_->connect(ch_out_sample_counter, 0, observables_->get_left_block(), channels_count_); //extra port for the sample counter pulse
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user