mirror of
				https://github.com/gnss-sdr/gnss-sdr
				synced 2025-10-31 07:13:03 +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:
		| @@ -36,14 +36,16 @@ | ||||
| #include <iostream> | ||||
| #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, 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")); | ||||
|     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; | ||||
|     current_T_rx_ms = 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_; | ||||
| } | ||||
|  | ||||
| @@ -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_word = false; | ||||
|     out[0].Channel_ID = -1; | ||||
|     out[0].fs = fs; | ||||
|     if ((current_T_rx_ms % report_interval_ms) == 0) | ||||
|         { | ||||
|             current_s++; | ||||
| @@ -134,6 +137,6 @@ int gnss_sdr_sample_counter::work(int noutput_items __attribute__((unused)), | ||||
|         } | ||||
|     sample_counter += samples_per_output; | ||||
|     out[0].Tracking_sample_counter = sample_counter; | ||||
|     current_T_rx_ms++; | ||||
|     current_T_rx_ms += interval_ms; | ||||
|     return 1; | ||||
| } | ||||
|   | ||||
| @@ -39,14 +39,16 @@ class gnss_sdr_sample_counter; | ||||
|  | ||||
| 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 | ||||
| { | ||||
| 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 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 | ||||
|     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 | ||||
| @@ -59,7 +61,7 @@ private: | ||||
|     bool flag_enable_send_msg; | ||||
|  | ||||
| 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, | ||||
|         gr_vector_const_void_star &input_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; | ||||
|                             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(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_ = gr::blocks::null_source::make(sizeof(Gnss_Synchro)); | ||||
|                     //throttle 1kHz | ||||
|                     throttle_ = gr::blocks::throttle::make(sizeof(Gnss_Synchro), 1000);  // 1000 samples per second (1kHz) | ||||
|                     //throttle to observable interval | ||||
|                     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(); | ||||
|                     top_block_->connect(null_source_, 0, throttle_, 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; | ||||
|                     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(ch_out_sample_counter, 0, observables_->get_left_block(), channels_count_);  //extra port for the sample counter pulse | ||||
|         } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Javier Arribas
					Javier Arribas