From fba6e2eaf729d15fbfb61743ea989f9dfcd37395 Mon Sep 17 00:00:00 2001 From: Marc Majoral Date: Fri, 17 Dec 2021 11:45:02 +0100 Subject: [PATCH 01/50] set the tolerance of the doppler error to Acquisition.doppler_step in the acquisition performance test --- .../acquisition/acq_performance_test.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc index ef7fb777c..75807b28a 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc @@ -991,7 +991,7 @@ TEST_F(AcquisitionPerformanceTest, ROC) for (int i = 0; i < num_clean_executions - 1; i++) { - if (abs(clean_delay_estimation_error(i)) < 0.5 and abs(clean_doppler_estimation_error(i)) < static_cast(config->property("Acquisition.doppler_step", 1)) / 2.0) + if (abs(clean_delay_estimation_error(i)) < 0.5 and abs(clean_doppler_estimation_error(i)) < static_cast(config->property("Acquisition.doppler_step", 1))) { correctly_detected = correctly_detected + 1.0; } From 36754cc63ff370e41a93cbcaaeeedea73a1d7e50 Mon Sep 17 00:00:00 2001 From: Marc Majoral Date: Fri, 17 Dec 2021 15:40:46 +0100 Subject: [PATCH 02/50] fixed the calculation of the number of measurements of the acquisition performance test --- .../acquisition/acq_performance_test.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc index 75807b28a..fc2c9e2fc 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc @@ -282,7 +282,8 @@ protected: num_thresholds = pfa_vector.size(); - int aux2 = ((generated_signal_duration_s * 900 - (FLAGS_acq_test_coherent_time_ms * FLAGS_acq_test_max_dwells)) / (FLAGS_acq_test_coherent_time_ms * FLAGS_acq_test_max_dwells)); + // the gnss simulator does not dump the trk observables for the last 100 ms of generated signal + int aux2 = floor((generated_signal_duration_s * ms_per_s - 100) / (FLAGS_acq_test_coherent_time_ms * FLAGS_acq_test_max_dwells) - 1); if ((FLAGS_acq_test_num_meas > 0) and (FLAGS_acq_test_num_meas < aux2)) { num_of_measurements = static_cast(FLAGS_acq_test_num_meas); @@ -369,6 +370,8 @@ protected: std::string signal_id; private: + static const uint32_t ms_per_s = 1000; + std::string generator_binary; std::string p1; std::string p2; From 1877d7d4e5ffc9f8b8e58ff32e2854d73f26d2ae Mon Sep 17 00:00:00 2001 From: Marc Majoral <=> Date: Tue, 21 Dec 2021 12:39:41 +0100 Subject: [PATCH 03/50] take into account bit_transition_flag for the calculation of the number of measurements --- .../acquisition/acq_performance_test.cc | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc index fc2c9e2fc..e3bd0268f 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc @@ -283,7 +283,15 @@ protected: num_thresholds = pfa_vector.size(); // the gnss simulator does not dump the trk observables for the last 100 ms of generated signal - int aux2 = floor((generated_signal_duration_s * ms_per_s - 100) / (FLAGS_acq_test_coherent_time_ms * FLAGS_acq_test_max_dwells) - 1); + int aux2; + if (FLAGS_acq_test_bit_transition_flag) + { + aux2 = floor((generated_signal_duration_s * ms_per_s - 100) / (FLAGS_acq_test_coherent_time_ms * 2.0) - 1); + } + else + { + aux2 = floor((generated_signal_duration_s * ms_per_s - 100) / (FLAGS_acq_test_coherent_time_ms * FLAGS_acq_test_max_dwells) - 1); + } if ((FLAGS_acq_test_num_meas > 0) and (FLAGS_acq_test_num_meas < aux2)) { num_of_measurements = static_cast(FLAGS_acq_test_num_meas); From bfe6b1a2a89a172274e19e391a6a87f6eda05ee2 Mon Sep 17 00:00:00 2001 From: Marc Majoral <=> Date: Tue, 21 Dec 2021 18:03:02 +0100 Subject: [PATCH 04/50] Do not take into account max_dwells when bit_transition_flag is true --- .../acquisition/gnuradio_blocks/pcps_acquisition.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc index 254cd27ce..53dba2af7 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc @@ -852,7 +852,7 @@ void pcps_acquisition::acquisition_core(uint64_t samp_count) } d_worker_active = false; - if ((d_num_noncoherent_integrations_counter == d_acq_parameters.max_dwells) or (d_positive_acq == 1)) + if ((d_num_noncoherent_integrations_counter == d_acq_parameters.max_dwells) or (d_positive_acq == 1) or (d_acq_parameters.bit_transition_flag)) { // Record results to file if required if (d_dump and d_channel == d_dump_channel) @@ -888,7 +888,7 @@ void pcps_acquisition::calculate_threshold() const int num_bins = effective_fft_size * num_doppler_bins; - d_threshold = static_cast(2.0 * boost::math::gamma_p_inv(2.0 * d_acq_parameters.max_dwells, std::pow(1.0 - pfa, 1.0 / static_cast(num_bins)))); + d_threshold = static_cast(2.0 * boost::math::gamma_p_inv(2.0 * (d_acq_parameters.bit_transition_flag ? 1 : d_acq_parameters.max_dwells), std::pow(1.0 - pfa, 1.0 / static_cast(num_bins)))); } From 26964a365af440213194f1c3bfba1ae5bff201e8 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Tue, 28 Dec 2021 13:59:57 +0100 Subject: [PATCH 05/50] Fix program termination when usign extended intergration times Reorder private data members, initialize them in constructor list --- docs/CHANGELOG.md | 14 +- .../adapters/file_source_base.cc | 154 ++++++++++++------ .../signal_source/adapters/file_source_base.h | 31 ++-- 3 files changed, 130 insertions(+), 69 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 1a3b673d8..54e188f73 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -98,12 +98,14 @@ All notable changes to GNSS-SDR will be documented in this file. - Added a new output parameter `Flag_PLL_180_deg_phase_locked` in the monitor output that indicates if the PLL got locked at 180 degrees, so the symbol sign is reversed. -- Fix bug in the satellite selection algorithm for configurations with a large - number of channels. The maximum number of channels per signal is now limited - to the number of available satellites per system minus one. The number of - channels performing concurrent acquisition, `Channels.in_acquisition`, cannot - be larger than the total number of channels. The program will stop if those - requirements are not met in the configuration file. +- Fixed a bug in the satellite selection algorithm for configurations with a + large number of channels. The maximum number of channels per signal is now + limited to the number of available satellites per system minus one. The number + of channels performing concurrent acquisition, `Channels.in_acquisition`, + cannot be larger than the total number of channels. The program will stop if + those requirements are not met in the configuration file. +- Fixed program termination when using `File_Signal_Source` and extended + integration times. See the definitions of concepts and metrics at https://gnss-sdr.org/design-forces/ diff --git a/src/algorithms/signal_source/adapters/file_source_base.cc b/src/algorithms/signal_source/adapters/file_source_base.cc index f499318b1..55da2791c 100644 --- a/src/algorithms/signal_source/adapters/file_source_base.cc +++ b/src/algorithms/signal_source/adapters/file_source_base.cc @@ -15,15 +15,25 @@ */ #include "file_source_base.h" +#include "Beidou_B1I.h" +#include "Beidou_B3I.h" +#include "GPS_L1_CA.h" +#include "GPS_L2C.h" +#include "GPS_L5.h" +#include "Galileo_E1.h" +#include "Galileo_E5a.h" +#include "Galileo_E5b.h" +#include "Galileo_E6.h" #include "configuration_interface.h" #include "gnss_sdr_filesystem.h" #include "gnss_sdr_flags.h" #include "gnss_sdr_string_literals.h" #include "gnss_sdr_valve.h" #include -#include // ceil, floor -#include -#include // move +#include // for std::max +#include // for ceil, floor +#include // for std::cout, std:cerr +#include // for std::move using namespace std::string_literals; @@ -31,31 +41,58 @@ using namespace std::string_literals; FileSourceBase::FileSourceBase(ConfigurationInterface const* configuration, std::string const& role, std::string impl, Concurrent_Queue* queue, std::string default_item_type) - : SignalSourceBase(configuration, role, std::move(impl)), filename_(configuration->property(role + ".filename"s, "../data/example_capture.dat"s)), - - file_source_(), // NOLINT - - item_type_(configuration->property(role + ".item_type"s, default_item_type)), // NOLINT - item_size_(0), - is_complex_(false), - - // apparently, MacOS (LLVM) finds 0UL ambiguous with bool, int64_t, uint64_t, int32_t, int16_t, uint16_t,... float, double - header_size_(configuration->property(role + ".header_size"s, uint64_t(0))), - seconds_to_skip_(configuration->property(role + ".seconds_to_skip"s, 0.0)), - repeat_(configuration->property(role + ".repeat"s, false)), - - samples_(configuration->property(role + ".samples"s, uint64_t(0))), - sampling_frequency_(configuration->property(role + ".sampling_frequency"s, int64_t(0))), - valve_(), // NOLINT + : SignalSourceBase(configuration, role, std::move(impl)), queue_(queue), - - enable_throttle_control_(configuration->property(role + ".enable_throttle_control"s, false)), - throttle_(), // NOLINT - - dump_(configuration->property(role + ".dump"s, false)), - dump_filename_(configuration->property(role + ".dump_filename"s, "../data/my_capture.dat"s)), - sink_() // NOLINT + role_(role), + filename_(configuration->property(role_ + ".filename"s, "../data/example_capture.dat"s)), + dump_filename_(configuration->property(role_ + ".dump_filename"s, "../data/my_capture.dat"s)), + item_type_(configuration->property(role_ + ".item_type"s, std::move(default_item_type))), + item_size_(0), + header_size_(configuration->property(role_ + ".header_size"s, uint64_t(0))), + samples_(configuration->property(role_ + ".samples"s, uint64_t(0))), + sampling_frequency_(configuration->property(role_ + ".sampling_frequency"s, int64_t(0))), + minimum_tail_s_(0.1), + seconds_to_skip_(configuration->property(role_ + ".seconds_to_skip"s, 0.0)), + is_complex_(false), + repeat_(configuration->property(role_ + ".repeat"s, false)), + enable_throttle_control_(configuration->property(role_ + ".enable_throttle_control"s, false)), + dump_(configuration->property(role_ + ".dump"s, false)) { + minimum_tail_s_ = std::max(configuration->property("Acquisition_1C.coherent_integration_time_ms", 0.0) * 0.001 * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Acquisition_2S.coherent_integration_time_ms", 0.0) * 0.001 * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Acquisition_L5.coherent_integration_time_ms", 0.0) * 0.001 * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Acquisition_1B.coherent_integration_time_ms", 0.0) * 0.001 * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Acquisition_5X.coherent_integration_time_ms", 0.0) * 0.001 * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Acquisition_7X.coherent_integration_time_ms", 0.0) * 0.001 * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Acquisition_E6.coherent_integration_time_ms", 0.0) * 0.001 * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Acquisition_B1.coherent_integration_time_ms", 0.0) * 0.001 * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Acquisition_B3.coherent_integration_time_ms", 0.0) * 0.001 * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Acquisition_1G.coherent_integration_time_ms", 0.0) * 0.001 * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Acquisition_2G.coherent_integration_time_ms", 0.0) * 0.001 * 2.0, minimum_tail_s_); + + minimum_tail_s_ = std::max(configuration->property("Tracking_1C.extend_correlation_symbols", 0.0) * GPS_L1_CA_CODE_PERIOD_S * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Tracking_2S.extend_correlation_symbols", 0.0) * GPS_L2_M_PERIOD_S * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Tracking_L5.extend_correlation_symbols", 0.0) * GPS_L5I_PERIOD_S * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Tracking_1B.extend_correlation_symbols", 0.0) * GALILEO_E1_CODE_PERIOD_S * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Tracking_5X.extend_correlation_symbols", 0.0) * GALILEO_E5A_CODE_PERIOD_S * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Tracking_7X.extend_correlation_symbols", 0.0) * GALILEO_E5B_CODE_PERIOD_S * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Tracking_E6.extend_correlation_symbols", 0.0) * GALILEO_E6_CODE_PERIOD_S * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Tracking_B1.extend_correlation_symbols", 0.0) * BEIDOU_B1I_CODE_PERIOD_S * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Tracking_B3.extend_correlation_symbols", 0.0) * BEIDOU_B3I_CODE_PERIOD_S * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Tracking_1G.extend_correlation_ms", 0.0) * 0.001 * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Tracking_2G.extend_correlation_ms", 0.0) * 0.001 * 2.0, minimum_tail_s_); + + if (repeat()) + { + minimum_tail_s_ = 0.0; + if (seconds_to_skip_ != 0.0) + { + seconds_to_skip_ = 0.0; + std::cout << "Warning: since " << role_ << ".repeat is set to true, " + << role_ << ".seconds_to_skip parameter will be ignored.\n"; + } + } + // override value with commandline flag, if present if (FLAGS_signal_source != "-") { @@ -67,9 +104,9 @@ FileSourceBase::FileSourceBase(ConfigurationInterface const* configuration, std: } if (sampling_frequency_ == 0) { - std::cerr << "Warning: parameter " << role << ".sampling_frequency is not set, this could lead to wrong results.\n" - << " Please set the " << role << ".sampling_frequency parameter in your configuration file.\n" - << " If not set, " << role << ".sampling_frequency=" << configuration->property("GNSS-SDR.internal_fs_sps"s, int64_t(0)) + std::cerr << "Warning: parameter " << role_ << ".sampling_frequency is not set, this could lead to wrong results.\n" + << " Please set the " << role_ << ".sampling_frequency parameter in your configuration file.\n" + << " If not set, " << role_ << ".sampling_frequency=" << configuration->property("GNSS-SDR.internal_fs_sps"s, int64_t(0)) << " will be assumed.\n"; sampling_frequency_ = configuration->property("GNSS-SDR.internal_fs_sps"s, int64_t(0)); } @@ -348,39 +385,62 @@ size_t FileSourceBase::computeSamplesInFile() const { auto n_samples = static_cast(samples()); + // this could throw, but the existence of the file has been proven before we get here. + const auto size = fs::file_size(filename()); + + const auto to_skip = samplesToSkip(); + + /*! + * BUG workaround: The GNU Radio 3.7 file source does not stop the receiver after reaching the End of File. + * A possible solution is to compute the file length in samples using file size, excluding at least + * the last 2 milliseconds, and enable always the valve block + */ + const auto tail = static_cast(std::ceil(minimum_tail_s_ * sampling_frequency())); + + if (tail > size) + { + std::cout << "Warning: file " << filename() << " has " << size << " samples (it is too short).\n"; + return 1; + } + if (to_skip + tail > size) + { + std::cout << "Warning: " << role_ << ".seconds_to_skip is larger than file duration.\n"; + return 1; + } + // if configured with 0 samples (read the whole file), figure out how many samples are in the file, and go from there if (n_samples == 0) { - // this could throw, but the existence of the file has been proven before we get here. - auto size = fs::file_size(filename()); - // if there is some kind of compression/encoding, figure out the uncompressed number of samples n_samples = std::floor(packetsPerSample() * size / item_size()); - auto to_skip = samplesToSkip(); - - /*! - * BUG workaround: The GNU Radio file source does not stop the receiver after reaching the End of File. - * A possible solution is to compute the file length in samples using file size, excluding at least - * the last 2 milliseconds, and enable always the valve block - */ - auto tail = static_cast(std::ceil(0.002 * sampling_frequency())); - DLOG(INFO) << "Total samples in the file= " << n_samples; std::cout << "Processing file " << filename() << ", which contains " << n_samples << " samples (" << size << " bytes)\n"; if (n_samples > (to_skip + tail)) { - // process all the samples available in the file excluding up to the last 2 ms + // process all the samples available in the file excluding the hearder and the tail n_samples -= to_skip + tail; } else { - // this will terminate the program - LOG(FATAL) << "Skipping " << to_skip << " samples from the front and truncating 2ms (" << tail << " samples)\n" - << "is greater than the number of samples in the file (" << n_samples << ")"; + std::cout << "Warning: Skipping " << to_skip << " samples from the front and truncating " << tail << " samples\n" + << "is greater than the number of samples in the file (" << size << ")\n"; + return 1; } } + else + { + if (n_samples > size - to_skip - tail) + { + std::cout << "Warning: file " << filename() << " has " << size - to_skip + << " samples, but " << role_ << ".samples has been set to " << n_samples << ".\n" + << " Setting " << role_ << ".samples to " << size - to_skip - tail + << " (" << to_skip << " samples skipped at header and " << tail << " samples skipped at the tail).\n"; + n_samples = size - to_skip - tail; + } + std::cout << "Processing " << n_samples << " samples from file " << filename() << '\n'; + } return n_samples; } @@ -421,7 +481,7 @@ gr::blocks::file_source::sptr FileSourceBase::create_file_source() if (samples_to_skip > 0) { LOG(INFO) << "Skipping " << samples_to_skip << " samples of the input file"; - if (not file_source_->seek(samples_to_skip, SEEK_SET)) + if (!file_source_->seek(samples_to_skip, SEEK_SET)) { LOG(ERROR) << "Error skipping bytes!"; } @@ -435,7 +495,7 @@ gr::blocks::file_source::sptr FileSourceBase::create_file_source() << "[" << filename() << "]\n" << "\n" << "Please modify your configuration file\n" - << "and point SignalSource.filename to a valid raw data file. Then:\n" + << "and point " << role_ << ".filename to a valid raw data file. Then:\n" << "$ gnss-sdr --config_file=/path/to/my_GNSS_SDR_configuration.conf\n" << "Examples of configuration files available at:\n" << GNSSSDR_INSTALL_DIR "/share/gnss-sdr/conf/\n" diff --git a/src/algorithms/signal_source/adapters/file_source_base.h b/src/algorithms/signal_source/adapters/file_source_base.h index d6bbf83b8..5933d3520 100644 --- a/src/algorithms/signal_source/adapters/file_source_base.h +++ b/src/algorithms/signal_source/adapters/file_source_base.h @@ -152,16 +152,9 @@ protected: virtual void post_disconnect_hook(gr::top_block_sptr top_block); private: - std::string filename_; gr::blocks::file_source::sptr file_source_; - - std::string item_type_; - size_t item_size_; - bool is_complex_; // a misnomer; if I/Q are interleaved as integer values - - size_t header_size_; // length (in samples) of the header (if any) - double seconds_to_skip_; - bool repeat_; + gr::blocks::throttle::sptr throttle_; + gr::blocks::file_sink::sptr sink_; // The valve allows only the configured number of samples through, then it closes. @@ -169,17 +162,23 @@ private: // class has two choices: construct the valve in the ctor, or hold onto the pointer, possibly // beyond its lifetime. Fortunately, the queue is only used to create the valve, so the // likelihood of holding a stale pointer is mitigated - uint64_t samples_; - int64_t sampling_frequency_; // why is this signed gnss_shared_ptr valve_; Concurrent_Queue* queue_; - bool enable_throttle_control_; - gr::blocks::throttle::sptr throttle_; - - bool dump_; + std::string role_; + std::string filename_; std::string dump_filename_; - gr::blocks::file_sink::sptr sink_; + std::string item_type_; + size_t item_size_; + size_t header_size_; // length (in samples) of the header (if any) + uint64_t samples_; + int64_t sampling_frequency_; // why is this signed + double minimum_tail_s_; + double seconds_to_skip_; + bool is_complex_; // a misnomer; if I/Q are interleaved as integer values + bool repeat_; + bool enable_throttle_control_; + bool dump_; }; /** \} */ From 05a7d2413ddbdcfb6d6d655cd9eac9993c3021ae Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Tue, 28 Dec 2021 19:14:18 +0100 Subject: [PATCH 06/50] Prefer initialization to assignment in constructors in some signal sources --- .../adapters/ad9361_fpga_signal_source.cc | 144 +++++++----------- .../adapters/ad9361_fpga_signal_source.h | 46 +++--- .../adapters/fmcomms2_signal_source.cc | 86 +++++------ .../adapters/fmcomms2_signal_source.h | 10 +- .../adapters/limesdr_signal_source.cc | 44 +++--- .../adapters/limesdr_signal_source.h | 5 +- .../adapters/osmosdr_signal_source.cc | 37 ++--- .../adapters/plutosdr_signal_source.cc | 49 +++--- .../adapters/plutosdr_signal_source.h | 1 + 9 files changed, 191 insertions(+), 231 deletions(-) diff --git a/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.cc b/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.cc index 029f82e5c..c78e6da94 100644 --- a/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.cc +++ b/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.cc @@ -1,8 +1,11 @@ /*! * \file ad9361_fpga_signal_source.cc - * \brief signal source for Analog Devices front-end AD9361 connected directly to FPGA accelerators. - * This source implements only the AD9361 control. It is NOT compatible with conventional SDR acquisition and tracking blocks. - * Please use the fmcomms2 source if conventional SDR acquisition and tracking is selected in the configuration file. + * \brief signal source for Analog Devices front-end AD9361 connected directly + * to FPGA accelerators. + * This source implements only the AD9361 control. It is NOT compatible with + * conventional SDR acquisition and tracking blocks. + * Please use the fmcomms2 source if conventional SDR acquisition and tracking + * is selected in the configuration file. * \authors
    *
  • Javier Arribas, jarribas(at)cttc.es *
  • Marc Majoral, mmajoral(at)cttc.es @@ -30,19 +33,16 @@ #include "uio_fpga.h" #include #include -#include // for max -#include // for std::this_thread -#include // for abs -#include // for exceptions +#include // for std::max +#include // for std::chrono +#include // for std::floor +#include // for std::exception #include // for open, O_WRONLY #include // for std::ifstream #include // for std::setprecision -#include // for cout -#include // for string manipulation -#include // for std::chrono +#include // for std::cout #include // for write -#include -#include +#include // fr std::vector using namespace std::string_literals; @@ -50,32 +50,53 @@ using namespace std::string_literals; Ad9361FpgaSignalSource::Ad9361FpgaSignalSource(const ConfigurationInterface *configuration, const std::string &role, unsigned int in_stream, unsigned int out_stream, Concurrent_Queue *queue __attribute__((unused))) - : SignalSourceBase(configuration, role, "Ad9361_Fpga_Signal_Source"s), in_stream_(in_stream), out_stream_(out_stream), queue_(queue) + : SignalSourceBase(configuration, role, "Ad9361_Fpga_Signal_Source"s), + queue_(queue), + gain_mode_rx1_(configuration->property(role + ".gain_mode_rx1", default_gain_mode)), + gain_mode_rx2_(configuration->property(role + ".gain_mode_rx2", default_gain_mode)), + rf_port_select_(configuration->property(role + ".rf_port_select", default_rf_port_select)), + filter_filename_(configuration->property(role + ".filter_filename", filter_file_)), + rf_gain_rx1_(configuration->property(role + ".gain_rx1", default_manual_gain_rx1)), + rf_gain_rx2_(configuration->property(role + ".gain_rx1", default_manual_gain_rx2)), + freq_(configuration->property(role + ".freq", static_cast(GPS_L1_FREQ_HZ))), + sample_rate_(configuration->property(role + ".sampling_frequency", default_bandwidth)), + bandwidth_(configuration->property(role + ".bandwidth", default_bandwidth)), + samples_to_skip_(0), + samples_(configuration->property(role + ".samples", static_cast(0))), + Fpass_(configuration->property(role + ".Fpass", static_cast(0.0))), + Fstop_(configuration->property(role + ".Fstop", static_cast(0.0))), + num_freq_bands_(2), + dma_buff_offset_pos_(0), + scale_dds_dbfs_(configuration->property(role + ".scale_dds_dbfs", -3.0)), + phase_dds_deg_(configuration->property(role + ".phase_dds_deg", 0.0)), + tx_attenuation_db_(configuration->property(role + ".tx_attenuation_db", default_tx_attenuation_db)), + freq_dds_tx_hz_(configuration->property(role + ".freq_dds_tx_hz", uint64_t(10000))), + freq_rf_tx_hz_(configuration->property(role + ".freq_rf_tx_hz", static_cast(GPS_L1_FREQ_HZ - GPS_L5_FREQ_HZ - freq_dds_tx_hz_))), + tx_bandwidth_(configuration->property(role + ".tx_bandwidth", static_cast(500000))), + item_size_(sizeof(int8_t)), + in_stream_(in_stream), + out_stream_(out_stream), + switch_position_(configuration->property(role + ".switch_position", 0)), + enable_dds_lo_(configuration->property(role + ".enable_dds_lo", false)), + filter_auto_(configuration->property(role + ".filter_auto", false)), + quadrature_(configuration->property(role + ".quadrature", true)), + rf_dc_(configuration->property(role + ".rf_dc", true)), + bb_dc_(configuration->property(role + ".bb_dc", true)), + rx1_enable_(configuration->property(role + ".rx1_enable", true)), + rx2_enable_(configuration->property(role + ".rx2_enable", true)), + enable_DMA_(false), + enable_dynamic_bit_selection_(configuration->property(role + ".enable_dynamic_bit_selection", true)), + enable_ovf_check_buffer_monitor_active_(false), + dump_(configuration->property(role + ".dump", false)), + rf_shutdown_(configuration->property(role + ".rf_shutdown", FLAGS_rf_shutdown)), + repeat_(configuration->property(role + ".repeat", false)) { - // initialize the variables that are used in real-time mode + const int l1_band = configuration->property("Channels_1C.count", 0) + + configuration->property("Channels_1B.count", 0); + + const double seconds_to_skip = configuration->property(role + ".seconds_to_skip", 0.0); + const size_t header_size = configuration->property(role + ".header_size", 0); - const std::string default_gain_mode("slow_attack"); - const double default_tx_attenuation_db = -10.0; - const double default_manual_gain_rx1 = 64.0; - const double default_manual_gain_rx2 = 64.0; - const uint64_t default_bandwidth = 12500000; - const std::string default_rf_port_select("A_BALANCED"); - freq_ = configuration->property(role + ".freq", static_cast(GPS_L1_FREQ_HZ)); - sample_rate_ = configuration->property(role + ".sampling_frequency", static_cast(12500000)); - bandwidth_ = configuration->property(role + ".bandwidth", default_bandwidth); - quadrature_ = configuration->property(role + ".quadrature", true); - rf_dc_ = configuration->property(role + ".rf_dc", true); - bb_dc_ = configuration->property(role + ".bb_dc", true); - rx1_enable_ = configuration->property(role + ".rx1_enable", true); - rx2_enable_ = configuration->property(role + ".rx2_enable", true); - gain_mode_rx1_ = configuration->property(role + ".gain_mode_rx1", default_gain_mode); - gain_mode_rx2_ = configuration->property(role + ".gain_mode_rx2", default_gain_mode); - rf_gain_rx1_ = configuration->property(role + ".gain_rx1", default_manual_gain_rx1); - rf_gain_rx2_ = configuration->property(role + ".gain_rx2", default_manual_gain_rx2); - rf_port_select_ = configuration->property(role + ".rf_port_select", default_rf_port_select); - filter_file_ = configuration->property(role + ".filter_file", std::string("")); - filter_filename_ = configuration->property(role + ".filter_filename", filter_file_); - filter_auto_ = configuration->property(role + ".filter_auto", false); if (filter_auto_) { filter_source_ = configuration->property(role + ".filter_source", std::string("Auto")); @@ -84,29 +105,6 @@ Ad9361FpgaSignalSource::Ad9361FpgaSignalSource(const ConfigurationInterface *con { filter_source_ = configuration->property(role + ".filter_source", std::string("Off")); } - Fpass_ = configuration->property(role + ".Fpass", static_cast(0.0)); - Fstop_ = configuration->property(role + ".Fstop", static_cast(0.0)); - enable_dds_lo_ = configuration->property(role + ".enable_dds_lo", false); - freq_dds_tx_hz_ = configuration->property(role + ".freq_dds_tx_hz", static_cast(10000)); - freq_rf_tx_hz_ = configuration->property(role + ".freq_rf_tx_hz", static_cast(GPS_L1_FREQ_HZ - GPS_L5_FREQ_HZ - freq_dds_tx_hz_)); - scale_dds_dbfs_ = configuration->property(role + ".scale_dds_dbfs", -3.0); - tx_attenuation_db_ = configuration->property(role + ".tx_attenuation_db", default_tx_attenuation_db); - tx_bandwidth_ = configuration->property(role + ".tx_bandwidth", static_cast(500000)); - phase_dds_deg_ = configuration->property(role + ".phase_dds_deg", 0.0); - - rf_shutdown_ = configuration->property(role + ".rf_shutdown", FLAGS_rf_shutdown); - - // initialize the variables that are used in post-processing mode - - enable_DMA_ = false; - - const int l1_band = configuration->property("Channels_1C.count", 0) + - configuration->property("Channels_1B.count", 0); - - const double default_seconds_to_skip = 0.0; - - const std::string empty_string; - filename0 = configuration->property(role + ".filename", empty_string); // override value with commandline flag, if present if (FLAGS_signal_source != "-") @@ -118,16 +116,6 @@ Ad9361FpgaSignalSource::Ad9361FpgaSignalSource(const ConfigurationInterface *con filename0 = FLAGS_s; } - if (filename0.empty()) - { - filename0 = configuration->property(role + ".filename0", empty_string); - filename1 = configuration->property(role + ".filename1", empty_string); - } - - // by default the DMA transfers samples corresponding to two frequency bands to the FPGA - num_freq_bands_ = 2; - dma_buff_offset_pos_ = 0; - // if only one input file is specified in the configuration file then: // if there is at least one channel assigned to frequency band 1 then the DMA transfers the samples to the L1 frequency band channels // otherwise the DMA transfers the samples to the L2/L5 frequency band channels @@ -145,15 +133,6 @@ Ad9361FpgaSignalSource::Ad9361FpgaSignalSource(const ConfigurationInterface *con dma_buff_offset_pos_ = 2; } - samples_ = configuration->property(role + ".samples", static_cast(0)); - - const double seconds_to_skip = configuration->property(role + ".seconds_to_skip", default_seconds_to_skip); - const size_t header_size = configuration->property(role + ".header_size", 0); - std::string item_type = "ibyte"; // for now only the ibyte format is supported - item_size_ = sizeof(int8_t); - repeat_ = configuration->property(role + ".repeat", false); - - samples_to_skip_ = 0; if (seconds_to_skip > 0) { samples_to_skip_ = static_cast(seconds_to_skip * sample_rate_) * 2; @@ -163,10 +142,7 @@ Ad9361FpgaSignalSource::Ad9361FpgaSignalSource(const ConfigurationInterface *con samples_to_skip_ += header_size; } - // check the switch status (determines real-time mode or post-processing mode) - std::string device_io_name; // Switch UIO device file - // find the uio device file corresponding to the switch. if (find_uio_dev_file_name(device_io_name, switch_device_name, 0) < 0) { @@ -175,7 +151,6 @@ Ad9361FpgaSignalSource::Ad9361FpgaSignalSource(const ConfigurationInterface *con return; } - switch_position_ = configuration->property(role + ".switch_position", 0); if (switch_position_ != 0 && switch_position_ != 2) { std::cout << "SignalSource.switch_position configuration parameter must be either 0: read from file(s) via DMA, or 2: read from AD9361\n"; @@ -272,7 +247,7 @@ Ad9361FpgaSignalSource::Ad9361FpgaSignalSource(const ConfigurationInterface *con } DLOG(INFO) << "Samples " << samples_; DLOG(INFO) << "Sampling frequency " << sample_rate_; - DLOG(INFO) << "Item type " << item_type; + DLOG(INFO) << "Item type " << std::string("ibyte"); DLOG(INFO) << "Item size " << item_size_; DLOG(INFO) << "Repeat " << repeat_; } @@ -429,7 +404,6 @@ Ad9361FpgaSignalSource::Ad9361FpgaSignalSource(const ConfigurationInterface *con std::string device_io_name_buffer_monitor; - dump_ = configuration->property(role + ".dump", false); std::string dump_filename = configuration->property(role + ".dump_filename", default_dump_filename); // find the uio device file corresponding to the buffer monitor @@ -445,7 +419,6 @@ Ad9361FpgaSignalSource::Ad9361FpgaSignalSource(const ConfigurationInterface *con } // dynamic bits selection - enable_dynamic_bit_selection_ = configuration->property(role + ".enable_dynamic_bit_selection", true); if (enable_dynamic_bit_selection_) { std::string device_io_name_dyn_bit_sel_0; @@ -616,7 +589,6 @@ void Ad9361FpgaSignalSource::run_DMA_process(const std::string &filename0, const } } - // rx signal vectors std::vector input_samples(sample_block_size * 2); // complex samples std::vector input_samples_dma(sample_block_size * 4); // complex samples, two frequency bands diff --git a/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.h b/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.h index e352c4d3b..9aa53ef31 100644 --- a/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.h +++ b/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.h @@ -1,8 +1,11 @@ /*! * \file ad9361_fpga_signal_source.h - * \brief signal source for Analog Devices front-end AD9361 connected directly to FPGA accelerators. - * This source implements only the AD9361 control. It is NOT compatible with conventional SDR acquisition and tracking blocks. - * Please use the fmcomms2 source if conventional SDR acquisition and tracking is selected in the configuration file. + * \brief signal source for Analog Devices front-end AD9361 connected directly + * to FPGA accelerators. + * This source implements only the AD9361 control. It is NOT compatible with + * conventional SDR acquisition and tracking blocks. + * Please use the fmcomms2 source if conventional SDR acquisition and tracking + * is selected in the configuration file. * * ----------------------------------------------------------------------------- * @@ -62,10 +65,17 @@ public: gr::basic_block_sptr get_right_block() override; private: - const std::string switch_device_name = "AXIS_Switch_v1_0_0"; // Switch UIO device name - const std::string dyn_bit_sel_device_name = "dynamic_bits_selector"; // Switch dhnamic bit selector device name - const std::string buffer_monitor_device_name = "buffer_monitor"; // buffer monitor device name + const std::string switch_device_name = std::string("AXIS_Switch_v1_0_0"); // Switch UIO device name + const std::string dyn_bit_sel_device_name = std::string("dynamic_bits_selector"); // Switch dhnamic bit selector device name + const std::string buffer_monitor_device_name = std::string("buffer_monitor"); // buffer monitor device name const std::string default_dump_filename = std::string("FPGA_buffer_monitor_dump.dat"); + const std::string default_rf_port_select = std::string("A_BALANCED"); + const std::string default_gain_mode = std::string("slow_attack"); + const double default_tx_attenuation_db = -10.0; + const double default_manual_gain_rx1 = 64.0; + const double default_manual_gain_rx2 = 64.0; + const uint64_t default_bandwidth = 12500000; + // perform dynamic bit selection every 500 ms by default const uint32_t Gain_control_period_ms = 500; // check buffer overflow and perform buffer monitoring every 1s by default @@ -95,6 +105,12 @@ private: std::shared_ptr dynamic_bit_selection_fpga; std::shared_ptr buffer_monitor_fpga; + std::mutex dma_mutex; + std::mutex dynamic_bit_selection_mutex; + std::mutex buffer_monitor_mutex; + + Concurrent_Queue *queue_; + // Front-end settings std::string gain_mode_rx1_; std::string gain_mode_rx2_; @@ -105,24 +121,24 @@ private: std::string filename0; std::string filename1; - std::mutex dma_mutex; - std::mutex dynamic_bit_selection_mutex; - std::mutex buffer_monitor_mutex; - double rf_gain_rx1_; double rf_gain_rx2_; uint64_t freq_; // frequency of local oscillator uint64_t sample_rate_; uint64_t bandwidth_; + uint64_t samples_to_skip_; + int64_t samples_; float Fpass_; float Fstop_; + uint32_t num_freq_bands_; + uint32_t dma_buff_offset_pos_; // DDS configuration for LO generation for external mixer double scale_dds_dbfs_; double phase_dds_deg_; double tx_attenuation_db_; - uint64_t freq_rf_tx_hz_; uint64_t freq_dds_tx_hz_; + uint64_t freq_rf_tx_hz_; uint64_t tx_bandwidth_; size_t item_size_; uint32_t in_stream_; @@ -141,15 +157,7 @@ private: bool enable_ovf_check_buffer_monitor_active_; bool dump_; bool rf_shutdown_; - - // post-processing mode - int64_t samples_; - uint64_t samples_to_skip_; bool repeat_; - uint32_t num_freq_bands_; - uint32_t dma_buff_offset_pos_; - - Concurrent_Queue *queue_; }; diff --git a/src/algorithms/signal_source/adapters/fmcomms2_signal_source.cc b/src/algorithms/signal_source/adapters/fmcomms2_signal_source.cc index 5b97b0bb9..c68ce03aa 100644 --- a/src/algorithms/signal_source/adapters/fmcomms2_signal_source.cc +++ b/src/algorithms/signal_source/adapters/fmcomms2_signal_source.cc @@ -28,7 +28,6 @@ #include // for max #include #include -#include #include using namespace std::string_literals; @@ -36,30 +35,44 @@ using namespace std::string_literals; Fmcomms2SignalSource::Fmcomms2SignalSource(const ConfigurationInterface *configuration, const std::string &role, unsigned int in_stream, unsigned int out_stream, Concurrent_Queue *queue) - : SignalSourceBase(configuration, role, "Fmcomms2_Signal_Source"s), in_stream_(in_stream), out_stream_(out_stream) + : SignalSourceBase(configuration, role, "Fmcomms2_Signal_Source"s), + item_type_(configuration->property(role + ".item_type", std::string("gr_complex"))), + dump_filename_(configuration->property(role + ".dump_filename", std::string("./data/signal_source.dat"))), + uri_(configuration->property(role + ".device_address", std::string("192.168.2.1"))), + gain_mode_rx1_(configuration->property(role + ".gain_mode_rx1", default_gain_mode)), + gain_mode_rx2_(configuration->property(role + ".gain_mode_rx2", default_gain_mode)), + rf_port_select_(configuration->property(role + ".rf_port_select", std::string("A_BALANCED"))), + filter_file_(configuration->property(role + ".filter_file", std::string(""))), + filter_filename_(configuration->property(role + ".filter_filename", filter_file_)), + samples_(configuration->property(role + ".samples", static_cast(0))), + item_size_(sizeof(gr_complex)), + rf_gain_rx1_(configuration->property(role + ".gain_rx1", 64.0)), + rf_gain_rx2_(configuration->property(role + ".gain_rx2", 64.0)), + freq_(configuration->property(role + ".freq", static_cast(GPS_L1_FREQ_HZ))), + sample_rate_(configuration->property(role + ".sampling_frequency", static_cast(2600000))), + bandwidth_(configuration->property(role + ".bandwidth", static_cast(2000000))), + buffer_size_(configuration->property(role + ".buffer_size", 0xA0000)), + Fpass_(configuration->property(role + ".Fpass", 0.0)), + Fstop_(configuration->property(role + ".Fstop", 0.0)), + in_stream_(in_stream), + out_stream_(out_stream), + RF_channels_(configuration->property(role + ".RF_channels", 1)), + scale_dds_dbfs_(configuration->property(role + ".scale_dds_dbfs", 0.0)), + phase_dds_deg_(configuration->property(role + ".phase_dds_deg", 0.0)), + tx_attenuation_db_(configuration->property(role + ".tx_attenuation_db", default_tx_attenuation_db)), + freq_dds_tx_hz_(configuration->property(role + ".freq_dds_tx_hz", static_cast(10000))), + freq_rf_tx_hz_(configuration->property(role + ".freq_rf_tx_hz", static_cast(GPS_L1_FREQ_HZ - GPS_L2_FREQ_HZ - freq_dds_tx_hz_))), + tx_bandwidth_(configuration->property(role + ".tx_bandwidth", static_cast(500000))), + enable_dds_lo_(configuration->property(role + ".enable_dds_lo", false)), + rx1_en_(configuration->property(role + ".rx1_enable", true)), + rx2_en_(configuration->property(role + ".rx2_enable", false)), + quadrature_(configuration->property(role + ".quadrature", true)), + rf_dc_(configuration->property(role + ".rf_dc", true)), + bb_dc_(configuration->property(role + ".bb_dc", true)), + filter_auto_(configuration->property(role + ".filter_auto", false)), + rf_shutdown_(configuration->property(role + ".rf_shutdown", FLAGS_rf_shutdown)), + dump_(configuration->property(role + ".dump", false)) { - const std::string default_item_type("gr_complex"); - const std::string default_dump_file("./data/signal_source.dat"); - const std::string default_gain_mode("slow_attack"); - const double default_tx_attenuation_db = -10.0; - uri_ = configuration->property(role + ".device_address", std::string("192.168.2.1")); - freq_ = configuration->property(role + ".freq", static_cast(GPS_L1_FREQ_HZ)); - sample_rate_ = configuration->property(role + ".sampling_frequency", static_cast(2600000)); - bandwidth_ = configuration->property(role + ".bandwidth", static_cast(2000000)); - rx1_en_ = configuration->property(role + ".rx1_enable", true); - rx2_en_ = configuration->property(role + ".rx2_enable", false); - buffer_size_ = configuration->property(role + ".buffer_size", 0xA0000); - quadrature_ = configuration->property(role + ".quadrature", true); - rf_dc_ = configuration->property(role + ".rf_dc", true); - bb_dc_ = configuration->property(role + ".bb_dc", true); - RF_channels_ = configuration->property(role + ".RF_channels", 1); - gain_mode_rx1_ = configuration->property(role + ".gain_mode_rx1", default_gain_mode); - gain_mode_rx2_ = configuration->property(role + ".gain_mode_rx2", default_gain_mode); - rf_gain_rx1_ = configuration->property(role + ".gain_rx1", 64.0); - rf_gain_rx2_ = configuration->property(role + ".gain_rx2", 64.0); - rf_port_select_ = configuration->property(role + ".rf_port_select", std::string("A_BALANCED")); - filter_file_ = configuration->property(role + ".filter_file", std::string("")); - filter_auto_ = configuration->property(role + ".filter_auto", false); if (filter_auto_) { filter_source_ = configuration->property(role + ".filter_source", std::string("Auto")); @@ -68,27 +81,6 @@ Fmcomms2SignalSource::Fmcomms2SignalSource(const ConfigurationInterface *configu { filter_source_ = configuration->property(role + ".filter_source", std::string("Off")); } - filter_filename_ = configuration->property(role + ".filter_filename", filter_file_); - Fpass_ = configuration->property(role + ".Fpass", 0.0); - Fstop_ = configuration->property(role + ".Fstop", 0.0); - - item_type_ = configuration->property(role + ".item_type", default_item_type); - samples_ = configuration->property(role + ".samples", static_cast(0)); - dump_ = configuration->property(role + ".dump", false); - dump_filename_ = configuration->property(role + ".dump_filename", default_dump_file); - - // AD9361 Local Oscillator generation for dual band operation - enable_dds_lo_ = configuration->property(role + ".enable_dds_lo", false); - freq_dds_tx_hz_ = configuration->property(role + ".freq_dds_tx_hz", static_cast(10000)); - freq_rf_tx_hz_ = configuration->property(role + ".freq_rf_tx_hz", static_cast(GPS_L1_FREQ_HZ - GPS_L2_FREQ_HZ - freq_dds_tx_hz_)); - scale_dds_dbfs_ = configuration->property(role + ".scale_dds_dbfs", 0.0); - phase_dds_deg_ = configuration->property(role + ".phase_dds_deg", 0.0); - tx_attenuation_db_ = configuration->property(role + ".tx_attenuation_db", default_tx_attenuation_db); - tx_bandwidth_ = configuration->property(role + ".tx_bandwidth", static_cast(500000)); - - rf_shutdown_ = configuration->property(role + ".rf_shutdown", FLAGS_rf_shutdown); - - item_size_ = sizeof(gr_complex); // some basic checks if ((rf_port_select_ != "A_BALANCED") && (rf_port_select_ != "B_BALANCED") && (rf_port_select_ != "A_N") && (rf_port_select_ != "B_N") && (rf_port_select_ != "B_P") && (rf_port_select_ != "C_N") && (rf_port_select_ != "C_P") && (rf_port_select_ != "TX_MONITOR1") && (rf_port_select_ != "TX_MONITOR2") && (rf_port_select_ != "TX_MONITOR1_2")) @@ -181,6 +173,10 @@ Fmcomms2SignalSource::Fmcomms2SignalSource(const ConfigurationInterface *configu { LOG(FATAL) << "Configuration error: both rx1 and rx2 are enabled but RF_channels=1 !"; } + else if (!rx1_en_ && !rx2_en_) + { + LOG(FATAL) << "Configuration error: both rx1 and rx2 are disabled."; + } else { #if GNURADIO_API_IIO diff --git a/src/algorithms/signal_source/adapters/fmcomms2_signal_source.h b/src/algorithms/signal_source/adapters/fmcomms2_signal_source.h index 5bdd6993d..4bfc78cda 100644 --- a/src/algorithms/signal_source/adapters/fmcomms2_signal_source.h +++ b/src/algorithms/signal_source/adapters/fmcomms2_signal_source.h @@ -61,6 +61,9 @@ public: gr::basic_block_sptr get_right_block() override; private: + const std::string default_gain_mode = std::string("slow_attack"); + const double default_tx_attenuation_db = -10.0; + #if GNURADIO_API_IIO #if GR_IIO_TEMPLATIZED_API gr::iio::fmcomms2_source::sptr fmcomms2_source_f32c_; @@ -88,9 +91,6 @@ private: int64_t samples_; size_t item_size_; - unsigned int in_stream_; - unsigned int out_stream_; - double rf_gain_rx1_; double rf_gain_rx2_; uint64_t freq_; // frequency of local oscilator @@ -99,14 +99,16 @@ private: uint64_t buffer_size_; // reception buffer float Fpass_; float Fstop_; + unsigned int in_stream_; + unsigned int out_stream_; int RF_channels_; // DDS configuration for LO generation for external mixer double scale_dds_dbfs_; double phase_dds_deg_; double tx_attenuation_db_; - uint64_t freq_rf_tx_hz_; uint64_t freq_dds_tx_hz_; + uint64_t freq_rf_tx_hz_; uint64_t tx_bandwidth_; bool enable_dds_lo_; diff --git a/src/algorithms/signal_source/adapters/limesdr_signal_source.cc b/src/algorithms/signal_source/adapters/limesdr_signal_source.cc index 1912f4dbb..28b57716d 100644 --- a/src/algorithms/signal_source/adapters/limesdr_signal_source.cc +++ b/src/algorithms/signal_source/adapters/limesdr_signal_source.cc @@ -16,12 +16,12 @@ #include "limesdr_signal_source.h" #include "configuration_interface.h" +#include "gnss_frequencies.h" #include "gnss_sdr_string_literals.h" #include "gnss_sdr_valve.h" #include #include #include -#include using namespace std::string_literals; @@ -31,33 +31,25 @@ LimesdrSignalSource::LimesdrSignalSource(const ConfigurationInterface* configura unsigned int out_stream, Concurrent_Queue* queue) : SignalSourceBase(configuration, role, "Limesdr_Signal_Source"s), + item_type_(configuration->property(role + ".item_type", std::string("gr_complex"))), + dump_filename_(configuration->property(role + ".dump_filename", std::string("./data/signal_source.dat"))), + limesdr_serial_(configuration->property(role + ".limesdr_serial", std::string())), + limesdr_file_(configuration->property(role + ".limesdr_file", std::string())), + sample_rate_(configuration->property(role + ".sampling_frequency", 2.0e6)), + freq_(configuration->property(role + ".freq", FREQ1)), + gain_(configuration->property(role + ".gain", 40.0)), + analog_bw_hz_(configuration->property(role + ".analog_bw", sample_rate_ / 2.0)), // LPF analog filters in I,Q branches + digital_bw_hz_(configuration->property(role + ".digital_bw", 0.0)), // disable by default + ext_clock_MHz_(configuration->property(role + ".ext_clock_MHz", 0.0)), // external clock: 0.0 MHz will enable the internal clock + samples_(configuration->property(role + ".samples", int64_t(0))), in_stream_(in_stream), - out_stream_(out_stream) + out_stream_(out_stream), + limechannel_mode_(configuration->property(role + ".limechannel_mode", 0)), + antenna_(configuration->property(role + ".antenna", 255)), + channel_(configuration->property(role + ".channel", 0)), + PPS_mode_(configuration->property(role + ".PPS_mode", false)), + dump_(configuration->property(role + ".dump", false)) { - // DUMP PARAMETERS - const std::string empty; - const std::string default_dump_file("./data/signal_source.dat"); - const std::string default_item_type("gr_complex"); - samples_ = configuration->property(role + ".samples", static_cast(0)); - dump_ = configuration->property(role + ".dump", false); - dump_filename_ = configuration->property(role + ".dump_filename", default_dump_file); - - // Driver parameters - channel_ = configuration->property(role + ".channel", 0); - freq_ = configuration->property(role + ".freq", 1575420000); - gain_ = configuration->property(role + ".gain", 40.0); - sample_rate_ = configuration->property(role + ".sampling_frequency", 2.0e6); - // todo: check if bw is within limits - analog_bw_hz_ = configuration->property(role + ".analog_bw", sample_rate_ / 2); // LPF analog filters in I,Q branches - digital_bw_hz_ = configuration->property(role + ".digital_bw", 0); // disable by default - item_type_ = configuration->property(role + ".item_type", default_item_type); - limesdr_serial_ = configuration->property(role + ".limesdr_serial", std::string()); - limesdr_file_ = configuration->property(role + ".limesdr_file", std::string()); - antenna_ = configuration->property(role + ".antenna", 255); - - PPS_mode_ = configuration->property(role + ".PPS_mode", false); - ext_clock_MHz_ = configuration->property(role + ".ext_clock_MHz", 0.0); // external clock: 0.0 MHz will enable the internal clock - limechannel_mode_ = configuration->property(role + ".limechannel_mode", 0); if ((limechannel_mode_ < 0) || (limechannel_mode_ > 2)) { std::cerr << "ERROR: source_impl::source_impl(): ChannelMode must be A(0), B(1) or (A+B) MIMO(2)\n"; diff --git a/src/algorithms/signal_source/adapters/limesdr_signal_source.h b/src/algorithms/signal_source/adapters/limesdr_signal_source.h index 6f87fa55b..cf059111d 100644 --- a/src/algorithms/signal_source/adapters/limesdr_signal_source.h +++ b/src/algorithms/signal_source/adapters/limesdr_signal_source.h @@ -63,13 +63,10 @@ private: gnss_shared_ptr valve_; gr::blocks::file_sink::sptr file_sink_; - std::string role_; std::string item_type_; std::string dump_filename_; std::string limesdr_serial_; std::string limesdr_file_; - int antenna_; - int channel_; // Front-end settings double sample_rate_; @@ -85,6 +82,8 @@ private: unsigned int out_stream_; int limechannel_mode_; + int antenna_; + int channel_; bool PPS_mode_; bool dump_; diff --git a/src/algorithms/signal_source/adapters/osmosdr_signal_source.cc b/src/algorithms/signal_source/adapters/osmosdr_signal_source.cc index 8db9bc0ee..bacc63f88 100644 --- a/src/algorithms/signal_source/adapters/osmosdr_signal_source.cc +++ b/src/algorithms/signal_source/adapters/osmosdr_signal_source.cc @@ -23,7 +23,6 @@ #include #include #include -#include using namespace std::string_literals; @@ -32,28 +31,22 @@ using namespace std::string_literals; OsmosdrSignalSource::OsmosdrSignalSource(const ConfigurationInterface* configuration, const std::string& role, unsigned int in_stream, unsigned int out_stream, Concurrent_Queue* queue) - : SignalSourceBase(configuration, role, "Osmosdr_Signal_Source"s), in_stream_(in_stream), out_stream_(out_stream) + : SignalSourceBase(configuration, role, "Osmosdr_Signal_Source"s), + item_type_(configuration->property(role + ".item_type", std::string("gr_complex"))), + dump_filename_(configuration->property(role + ".dump_filename", std::string("./data/signal_source.dat"))), + osmosdr_args_(configuration->property(role + ".osmosdr_args", std::string())), + antenna_(configuration->property(role + ".antenna", std::string())), + sample_rate_(configuration->property(role + ".sampling_frequency", 2.0e6)), + freq_(configuration->property(role + ".freq", GPS_L1_FREQ_HZ)), + gain_(configuration->property(role + ".gain", 40.0)), + if_gain_(configuration->property(role + ".if_gain", 40.0)), + rf_gain_(configuration->property(role + ".rf_gain", 40.0)), + samples_(configuration->property(role + ".samples", static_cast(0))), + in_stream_(in_stream), + out_stream_(out_stream), + AGC_enabled_(configuration->property(role + ".AGC_enabled", true)), + dump_(configuration->property(role + ".dump", false)) { - // DUMP PARAMETERS - const std::string empty; - const std::string default_dump_file("./data/signal_source.dat"); - const std::string default_item_type("gr_complex"); - samples_ = configuration->property(role + ".samples", static_cast(0)); - dump_ = configuration->property(role + ".dump", false); - dump_filename_ = configuration->property(role + ".dump_filename", - default_dump_file); - - // OSMOSDR Driver parameters - AGC_enabled_ = configuration->property(role + ".AGC_enabled", true); - freq_ = configuration->property(role + ".freq", GPS_L1_FREQ_HZ); - gain_ = configuration->property(role + ".gain", 40.0); - rf_gain_ = configuration->property(role + ".rf_gain", 40.0); - if_gain_ = configuration->property(role + ".if_gain", 40.0); - sample_rate_ = configuration->property(role + ".sampling_frequency", 2.0e6); - item_type_ = configuration->property(role + ".item_type", default_item_type); - osmosdr_args_ = configuration->property(role + ".osmosdr_args", std::string()); - antenna_ = configuration->property(role + ".antenna", empty); - if (item_type_ == "short") { item_size_ = sizeof(int16_t); diff --git a/src/algorithms/signal_source/adapters/plutosdr_signal_source.cc b/src/algorithms/signal_source/adapters/plutosdr_signal_source.cc index 0343f8154..fd69989f7 100644 --- a/src/algorithms/signal_source/adapters/plutosdr_signal_source.cc +++ b/src/algorithms/signal_source/adapters/plutosdr_signal_source.cc @@ -22,7 +22,6 @@ #include "gnss_sdr_valve.h" #include #include -#include using namespace std::string_literals; @@ -31,23 +30,30 @@ using namespace std::string_literals; PlutosdrSignalSource::PlutosdrSignalSource(const ConfigurationInterface* configuration, const std::string& role, unsigned int in_stream, unsigned int out_stream, Concurrent_Queue* queue) - : SignalSourceBase(configuration, role, "Plutosdr_Signal_Source"s), in_stream_(in_stream), out_stream_(out_stream) + : SignalSourceBase(configuration, role, "Plutosdr_Signal_Source"s), + dump_filename_(configuration->property(role + ".dump_filename", std::string("./data/signal_source.dat"))), + uri_(configuration->property(role + ".device_address", std::string("192.168.2.1"))), + gain_mode_(configuration->property(role + ".gain_mode", default_gain_mode)), + filter_file_(configuration->property(role + ".filter_file", std::string(""))), + filter_filename_(configuration->property(role + ".filter_filename", filter_file_)), + item_type_(configuration->property(role + ".item_type", std::string("gr_complex"))), + rf_gain_(configuration->property(role + ".gain", 50.0)), + samples_(configuration->property(role + ".samples", static_cast(0))), + freq_(configuration->property(role + ".freq", static_cast(GPS_L1_FREQ_HZ))), + sample_rate_(configuration->property(role + ".sampling_frequency", static_cast(3000000))), + bandwidth_(configuration->property(role + ".bandwidth", static_cast(2000000))), + buffer_size_(configuration->property(role + ".buffer_size", 0xA0000)), + item_size_(sizeof(gr_complex)), + Fpass_(configuration->property(role + ".Fpass", 0.0)), + Fstop_(configuration->property(role + ".Fstop", 0.0)), + in_stream_(in_stream), + out_stream_(out_stream), + quadrature_(configuration->property(role + ".quadrature", true)), + rf_dc_(configuration->property(role + ".rf_dc", true)), + bb_dc_(configuration->property(role + ".bb_dc", true)), + filter_auto_(configuration->property(role + ".filter_auto", false)), + dump_(configuration->property(role + ".dump", false)) { - const std::string default_item_type("gr_complex"); - const std::string default_dump_file("./data/signal_source.dat"); - const std::string default_gain_mode("slow_attack"); - uri_ = configuration->property(role + ".device_address", std::string("192.168.2.1")); - freq_ = configuration->property(role + ".freq", static_cast(GPS_L1_FREQ_HZ)); - sample_rate_ = configuration->property(role + ".sampling_frequency", static_cast(3000000)); - bandwidth_ = configuration->property(role + ".bandwidth", static_cast(2000000)); - buffer_size_ = configuration->property(role + ".buffer_size", 0xA0000); - quadrature_ = configuration->property(role + ".quadrature", true); - rf_dc_ = configuration->property(role + ".rf_dc", true); - bb_dc_ = configuration->property(role + ".bb_dc", true); - gain_mode_ = configuration->property(role + ".gain_mode", default_gain_mode); - rf_gain_ = configuration->property(role + ".gain", 50.0); - filter_file_ = configuration->property(role + ".filter_file", std::string("")); - filter_auto_ = configuration->property(role + ".filter_auto", false); if (filter_auto_) { filter_source_ = configuration->property(role + ".filter_source", std::string("Auto")); @@ -56,13 +62,6 @@ PlutosdrSignalSource::PlutosdrSignalSource(const ConfigurationInterface* configu { filter_source_ = configuration->property(role + ".filter_source", std::string("Off")); } - filter_filename_ = configuration->property(role + ".filter_filename", filter_file_); - Fpass_ = configuration->property(role + ".Fpass", 0.0); - Fstop_ = configuration->property(role + ".Fstop", 0.0); - item_type_ = configuration->property(role + ".item_type", default_item_type); - samples_ = configuration->property(role + ".samples", static_cast(0)); - dump_ = configuration->property(role + ".dump", false); - dump_filename_ = configuration->property(role + ".dump_filename", default_dump_file); if (item_type_ != "gr_complex") { @@ -117,8 +116,6 @@ PlutosdrSignalSource::PlutosdrSignalSource(const ConfigurationInterface* configu LOG(WARNING) << "Invalid configuration value for bandwidth parameter. Set to bandwidth=2000000"; } - item_size_ = sizeof(gr_complex); - std::cout << "device address: " << uri_ << '\n'; std::cout << "frequency : " << freq_ << " Hz\n"; std::cout << "sample rate: " << sample_rate_ << " Sps\n"; diff --git a/src/algorithms/signal_source/adapters/plutosdr_signal_source.h b/src/algorithms/signal_source/adapters/plutosdr_signal_source.h index c9d85a1d0..96e6702ae 100644 --- a/src/algorithms/signal_source/adapters/plutosdr_signal_source.h +++ b/src/algorithms/signal_source/adapters/plutosdr_signal_source.h @@ -66,6 +66,7 @@ public: gr::basic_block_sptr get_right_block() override; private: + const std::string default_gain_mode = std::string("slow_attack"); #if GR_IIO_TEMPLATIZED_API gr::iio::fmcomms2_source::sptr plutosdr_source_; #else From f2f02e5ba67c660cc5e2e3223f8e071d9456eb01 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Tue, 28 Dec 2021 19:15:43 +0100 Subject: [PATCH 07/50] Fix counting of valid acquisitions --- .../acquisition/acq_performance_test.cc | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc index e3bd0268f..327ffade0 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc @@ -266,7 +266,7 @@ protected: pfa_vector.push_back(FLAGS_acq_test_pfa_init * std::pow(10, aux)); aux = aux + 1.0; } - pfa_vector.push_back(1.0); + pfa_vector.push_back(0.999); } else { @@ -292,7 +292,7 @@ protected: { aux2 = floor((generated_signal_duration_s * ms_per_s - 100) / (FLAGS_acq_test_coherent_time_ms * FLAGS_acq_test_max_dwells) - 1); } - if ((FLAGS_acq_test_num_meas > 0) and (FLAGS_acq_test_num_meas < aux2)) + if ((FLAGS_acq_test_num_meas > 0) && (FLAGS_acq_test_num_meas < aux2)) { num_of_measurements = static_cast(FLAGS_acq_test_num_meas); } @@ -947,7 +947,7 @@ TEST_F(AcquisitionPerformanceTest, ROC) // Cut measurements without reference for (int i = 0; i < num_executions; i++) { - if (!std::isnan(doppler_estimation_error(i)) and !std::isnan(delay_estimation_error(i))) + if (!std::isnan(doppler_estimation_error(i)) && !std::isnan(delay_estimation_error(i))) { num_clean_executions++; } @@ -957,7 +957,7 @@ TEST_F(AcquisitionPerformanceTest, ROC) num_clean_executions = 0; for (int i = 0; i < num_executions; i++) { - if (!std::isnan(doppler_estimation_error(i)) and !std::isnan(delay_estimation_error(i))) + if (!std::isnan(doppler_estimation_error(i)) && !std::isnan(delay_estimation_error(i))) { clean_doppler_estimation_error(num_clean_executions) = doppler_estimation_error(i); clean_delay_estimation_error(num_clean_executions) = delay_estimation_error(i); @@ -999,10 +999,9 @@ TEST_F(AcquisitionPerformanceTest, ROC) { arma::vec correct_acq = arma::zeros(num_executions, 1); double correctly_detected = 0.0; - for (int i = 0; i < num_clean_executions - 1; i++) - + for (int i = 0; i < num_clean_executions; i++) { - if (abs(clean_delay_estimation_error(i)) < 0.5 and abs(clean_doppler_estimation_error(i)) < static_cast(config->property("Acquisition.doppler_step", 1))) + if (abs(clean_delay_estimation_error(i)) < 0.5 && abs(clean_doppler_estimation_error(i)) < static_cast(config->property("Acquisition.doppler_step", 1))) { correctly_detected = correctly_detected + 1.0; } @@ -1038,7 +1037,7 @@ TEST_F(AcquisitionPerformanceTest, ROC) float sum_pd = static_cast(std::accumulate(meas_Pd_.begin(), meas_Pd_.end(), 0.0)); float sum_pd_correct = static_cast(std::accumulate(meas_Pd_correct_.begin(), meas_Pd_correct_.end(), 0.0)); float sum_pfa = static_cast(std::accumulate(meas_Pfa_.begin(), meas_Pfa_.end(), 0.0)); - if (!meas_Pd_.empty() and !meas_Pfa_.empty()) + if (!meas_Pd_.empty() && !meas_Pfa_.empty()) { Pd[cn0_index][pfa_iter] = sum_pd / static_cast(meas_Pd_.size()); Pfa[cn0_index][pfa_iter] = sum_pfa / static_cast(meas_Pfa_.size()); From bd8f1a21b7e9b6c2bbcea564ea2b3a6208f73ca2 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Mon, 3 Jan 2022 10:57:03 +0100 Subject: [PATCH 08/50] Raise CMake policy_max to 3.22 --- CMakeLists.txt | 2 +- .../libs/volk_gnsssdr_module/volk_gnsssdr/CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1dd1b53eb..a3d10b352 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,7 +11,7 @@ if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR}) message(FATAL_ERROR "Prevented in-tree build, it is bad practice.\nTry 'cd build && cmake ..' instead.") endif() -cmake_minimum_required(VERSION 2.8.12...3.21) +cmake_minimum_required(VERSION 2.8.12...3.22) project(gnss-sdr CXX C) list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/Modules) diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/CMakeLists.txt b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/CMakeLists.txt index 66b4ac603..80e8d283f 100644 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/CMakeLists.txt +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/CMakeLists.txt @@ -8,7 +8,7 @@ ######################################################################## # Project setup ######################################################################## -cmake_minimum_required(VERSION 2.8.12...3.21) +cmake_minimum_required(VERSION 2.8.12...3.22) if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Release") endif() From f38ea7b9f1a02a9bb5b3372d22faa41125f4afc6 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Mon, 3 Jan 2022 11:00:21 +0100 Subject: [PATCH 09/50] Exclude cpu_featires docs from volk_gnsssdr docs Fix README rendering in html --- .../libs/volk_gnsssdr_module/volk_gnsssdr/Doxyfile.in | 2 +- src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/README.md | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/Doxyfile.in b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/Doxyfile.in index af4ea9424..2bb89d65b 100644 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/Doxyfile.in +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/Doxyfile.in @@ -836,7 +836,7 @@ RECURSIVE = YES # Note that relative paths are relative to the directory from which doxygen is # run. -EXCLUDE = @PROJECT_BINARY_DIR@ +EXCLUDE = @PROJECT_BINARY_DIR@ @PROJECT_SOURCE_DIR@/cpu_features # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/README.md b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/README.md index bddf74727..9534f8feb 100644 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/README.md +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/README.md @@ -46,8 +46,7 @@ kernel is actually doing. This figure shows the role of some VOLK_GNSSSDR kernels in the context of a GNSS baseband processor: -![Example of VOLK_GNSSSDR -usage.](./docs/images/VOLK_GNSSSDR_Usage_Example.png) +![Example of VOLK_GNSSSDR usage.](./docs/images/VOLK_GNSSSDR_Usage_Example.png) ## How to build VOLK_GNSSSDR From 480bcb995ccafba59d169262187f067490761e27 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Tue, 4 Jan 2022 11:33:06 +0100 Subject: [PATCH 10/50] Update Armadillo version to 10.8.0 --- CMakeLists.txt | 2 +- README.md | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a3d10b352..e7751cddd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -326,7 +326,7 @@ set(GNSSSDR_PROTOBUF_MIN_VERSION "3.0.0") ################################################################################ set(GNSSSDR_GFLAGS_LOCAL_VERSION "2.2.2") set(GNSSSDR_GLOG_LOCAL_VERSION "0.5.0") -set(GNSSSDR_ARMADILLO_LOCAL_VERSION "10.7.x") +set(GNSSSDR_ARMADILLO_LOCAL_VERSION "10.8.x") if((CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0) OR (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0)) set(GNSSSDR_GTEST_LOCAL_VERSION "1.10.x") diff --git a/README.md b/README.md index 9b4d0f6a8..71a567387 100644 --- a/README.md +++ b/README.md @@ -355,9 +355,9 @@ $ sudo apt-get install libblas-dev liblapack-dev # For Debian/Ubuntu/Linux $ sudo yum install lapack-devel blas-devel # For Fedora/CentOS/RHEL $ sudo zypper install lapack-devel blas-devel # For OpenSUSE $ sudo pacman -S blas lapack # For Arch Linux -$ wget http://sourceforge.net/projects/arma/files/armadillo-10.6.1.tar.xz -$ tar xvfz armadillo-10.6.1.tar.xz -$ cd armadillo-10.6.1 +$ wget http://sourceforge.net/projects/arma/files/armadillo-10.8.0.tar.xz +$ tar xvfz armadillo-10.8.0.tar.xz +$ cd armadillo-10.8.0 $ cmake . $ make $ sudo make install From f0ba209d88a2419f9871b268b44211322681daa3 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Tue, 4 Jan 2022 11:59:52 +0100 Subject: [PATCH 11/50] Use https instead of http for getting Armadillo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 71a567387..0a5f6852d 100644 --- a/README.md +++ b/README.md @@ -355,7 +355,7 @@ $ sudo apt-get install libblas-dev liblapack-dev # For Debian/Ubuntu/Linux $ sudo yum install lapack-devel blas-devel # For Fedora/CentOS/RHEL $ sudo zypper install lapack-devel blas-devel # For OpenSUSE $ sudo pacman -S blas lapack # For Arch Linux -$ wget http://sourceforge.net/projects/arma/files/armadillo-10.8.0.tar.xz +$ wget https://sourceforge.net/projects/arma/files/armadillo-10.8.0.tar.xz $ tar xvfz armadillo-10.8.0.tar.xz $ cd armadillo-10.8.0 $ cmake . From ec435ab119ed123aaef2be0ce3f36a42ee74d677 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Tue, 4 Jan 2022 12:57:01 +0100 Subject: [PATCH 12/50] Fix building if Gflags was found but Glog was not --- CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e7751cddd..a84215723 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1354,7 +1354,10 @@ endif() ################################################################################ set(LOCAL_GFLAGS FALSE) if(NOT ENABLE_OWN_GLOG) - find_package(GFLAGS) + find_package(GLOG) + if(GLOG_FOUND) + find_package(GFLAGS) + endif() endif() set_package_properties(GFLAGS PROPERTIES PURPOSE "Used for commandline flags management." @@ -1495,9 +1498,6 @@ endif() ################################################################################ # glog - https://github.com/google/glog ################################################################################ -if(NOT ENABLE_OWN_GLOG AND NOT ${LOCAL_GFLAGS}) - find_package(GLOG) -endif() set_package_properties(GLOG PROPERTIES PURPOSE "Used for runtime internal logging." TYPE REQUIRED From 802b6891bf949e2504c74a81190b845f76b29c89 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Tue, 4 Jan 2022 16:21:59 +0100 Subject: [PATCH 13/50] Update Doxyfile to v1.9.3 --- docs/doxygen/Doxyfile.in | 387 +++++--- .../volk_gnsssdr/Doxyfile.in | 881 ++++++++++++------ 2 files changed, 821 insertions(+), 447 deletions(-) diff --git a/docs/doxygen/Doxyfile.in b/docs/doxygen/Doxyfile.in index 785785287..852844860 100644 --- a/docs/doxygen/Doxyfile.in +++ b/docs/doxygen/Doxyfile.in @@ -1,9 +1,5 @@ -# Doxyfile 1.8.20 +# Doxyfile 1.9.3 -# -# SPDX-FileCopyrightText: 2011-2020 Carles Fernandez-Prades -# SPDX-License-Identifier: GPL-3.0-or-later -# # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # @@ -36,7 +32,7 @@ DOXYFILE_ENCODING = UTF-8 # title of most generated pages and in a few other places. # The default value is: My Project. -PROJECT_NAME = "GNSS-SDR" +PROJECT_NAME = GNSS-SDR # The PROJECT_NUMBER tag can be used to enter a project or revision number. This # could be handy for archiving the generated documentation or if some version @@ -97,14 +93,6 @@ ALLOW_UNICODE_NAMES = YES OUTPUT_LANGUAGE = English -# The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all generated output in the proper direction. -# Possible values are: None, LTR, RTL and Context. -# The default value is: None. - -OUTPUT_TEXT_DIRECTION = None - # If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member # descriptions after the members that are listed in the file and class # documentation (similar to Javadoc). Set to NO to disable this. @@ -252,16 +240,16 @@ TAB_SIZE = 8 # the documentation. An alias has the form: # name=value # For example adding -# "sideeffect=@par Side Effects:\n" +# "sideeffect=@par Side Effects:^^" # will allow you to put the command \sideeffect (or @sideeffect) in the # documentation, which will result in a user-defined paragraph with heading -# "Side Effects:". You can put \n's in the value part of an alias to insert -# newlines (in the resulting output). You can put ^^ in the value part of an -# alias to insert a newline as if a physical newline was in the original file. -# When you need a literal { or } or , in the value part of an alias you have to -# escape them by means of a backslash (\), this can lead to conflicts with the -# commands \{ and \} for these it is advised to use the version @{ and @} or use -# a double escape (\\{ and \\}) +# "Side Effects:". Note that you cannot put \n's in the value part of an alias +# to insert newlines (in the resulting output). You can put ^^ in the value part +# of an alias to insert a newline as if a physical newline was in the original +# file. When you need a literal { or } or , in the value part of an alias you +# have to escape them by means of a backslash (\), this can lead to conflicts +# with the commands \{ and \} for these it is advised to use the version @{ and +# @} or use a double escape (\\{ and \\}) ALIASES = @@ -306,8 +294,8 @@ OPTIMIZE_OUTPUT_SLICE = NO # extension. Doxygen has a built-in mapping, but you can override or extend it # using this tag. The format is ext=language, where ext is a file extension, and # language is one of the parsers supported by doxygen: IDL, Java, JavaScript, -# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, VHDL, -# Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: +# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice, +# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: # FortranFree, unknown formatted Fortran: Fortran. In the later case the parser # tries to guess whether the code is fixed or free formatted code, this is the # default for Fortran type files). For instance to make doxygen treat .inc files @@ -317,7 +305,10 @@ OPTIMIZE_OUTPUT_SLICE = NO # Note: For files without extension you can use no_extension as a placeholder. # # Note that for custom extensions you also need to set FILE_PATTERNS otherwise -# the files are not read by doxygen. +# the files are not read by doxygen. When specifying no_extension you should add +# * to the FILE_PATTERNS. +# +# Note see also the list of default file extension mappings. EXTENSION_MAPPING = @@ -457,7 +448,7 @@ LOOKUP_CACHE_SIZE = 0 # than 0 to get more control over the balance between CPU load and processing # speed. At this moment only the input processing can be done using multiple # threads. Since this is still an experimental feature the default is set to 1, -# which efficively disables parallel processing. Please report any issues you +# which effectively disables parallel processing. Please report any issues you # encounter. Generating dot graphs in parallel is controlled by the # DOT_NUM_THREADS setting. # Minimum value: 0, maximum value: 32, default value: 1. @@ -527,6 +518,13 @@ EXTRACT_LOCAL_METHODS = NO EXTRACT_ANON_NSPACES = NO +# If this flag is set to YES, the name of an unnamed parameter in a declaration +# will be determined by the corresponding definition. By default unnamed +# parameters remain unnamed in the output. +# The default value is: YES. + +RESOLVE_UNNAMED_PARAMS = YES + # If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all # undocumented members inside documented classes or files. If set to NO these # members will be included in the various overviews, but no documentation @@ -564,11 +562,18 @@ HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO -# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file -# names in lower-case letters. If set to YES, upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# (including Cygwin) and Mac users are advised to set this option to NO. +# With the correct setting of option CASE_SENSE_NAMES doxygen will better be +# able to match the capabilities of the underlying filesystem. In case the +# filesystem is case sensitive (i.e. it supports files in the same directory +# whose names only differ in casing), the option must be set to YES to properly +# deal with such files in case they appear in the input. For filesystems that +# are not case sensitive the option should be be set to NO to properly deal with +# output files written for symbols that only differ in casing, such as for two +# classes, one named CLASS and the other named Class, and to also support +# references to files without having to specify the exact matching casing. On +# Windows (including Cygwin) and MacOS, users should typically set this option +# to NO, whereas on Linux or other Unix flavors it should typically be set to +# YES. # The default value is: system dependent. CASE_SENSE_NAMES = YES @@ -587,6 +592,12 @@ HIDE_SCOPE_NAMES = NO HIDE_COMPOUND_REFERENCE= NO +# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class +# will show which file needs to be included to use the class. +# The default value is: YES. + +SHOW_HEADERFILE = YES + # If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of # the files that are included by a file in the documentation of that file. # The default value is: YES. @@ -744,7 +755,8 @@ FILE_VERSION_FILTER = # output files in an output format independent way. To create the layout file # that represents doxygen's defaults, run doxygen with the -l option. You can # optionally specify a file name after the option, if omitted DoxygenLayout.xml -# will be used as the name of the layout file. +# will be used as the name of the layout file. See also section "Changing the +# layout of pages" for information. # # Note that if you run doxygen from a directory containing a file called # DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE @@ -790,24 +802,35 @@ WARNINGS = YES WARN_IF_UNDOCUMENTED = YES # If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some parameters -# in a documented function, or documenting parameters that don't exist or using -# markup commands wrongly. +# potential errors in the documentation, such as documenting some parameters in +# a documented function twice, or documenting parameters that don't exist or +# using markup commands wrongly. # The default value is: YES. WARN_IF_DOC_ERROR = YES +# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete +# function parameter documentation. If set to NO, doxygen will accept that some +# parameters have no documentation without warning. +# The default value is: YES. + +WARN_IF_INCOMPLETE_DOC = YES + # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that # are documented, but have no documentation for their parameters or return -# value. If set to NO, doxygen will only warn about wrong or incomplete -# parameter documentation, but not about the absence of documentation. If -# EXTRACT_ALL is set to YES then this flag will automatically be disabled. +# value. If set to NO, doxygen will only warn about wrong parameter +# documentation, but not about the absence of documentation. If EXTRACT_ALL is +# set to YES then this flag will automatically be disabled. See also +# WARN_IF_INCOMPLETE_DOC # The default value is: NO. WARN_NO_PARAMDOC = NO # If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when -# a warning is encountered. +# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS +# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but +# at the end of the doxygen process doxygen will return with a non-zero status. +# Possible values are: NO, YES and FAIL_ON_WARNINGS. # The default value is: NO. WARN_AS_ERROR = NO @@ -824,7 +847,10 @@ WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning and error # messages should be written. If left blank the output is written to standard -# error (stderr). +# error (stderr). In case the file specified cannot be opened for writing the +# warning and error messages are written to standard error. When as file - is +# specified the warning and error messages are written to standard output +# (stdout). WARN_LOGFILE = @@ -844,8 +870,8 @@ INPUT = @top_srcdir@/src \ # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses # libiconv (or the iconv built into libc) for the transcoding. See the libiconv -# documentation (see: https://www.gnu.org/software/libiconv/) for the list of -# possible encodings. +# documentation (see: +# https://www.gnu.org/software/libiconv/) for the list of possible encodings. # The default value is: UTF-8. INPUT_ENCODING = UTF-8 @@ -858,12 +884,14 @@ INPUT_ENCODING = UTF-8 # need to set EXTENSION_MAPPING for the extension otherwise the files are not # read by doxygen. # +# Note the list of default checked file patterns might differ from the list of +# default file extension mappings. +# # If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, # *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, -# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, -# *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment), -# *.doc (to be provided as doxygen C comment), *.txt (to be provided as doxygen -# C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, +# *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, +# *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C +# comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, # *.vhdl, *.ucf, *.qsf and *.ice. FILE_PATTERNS = *.h \ @@ -909,7 +937,7 @@ EXCLUDE_PATTERNS = # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test +# ANamespace::AClass, ANamespace::*Test # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories use the pattern */test/* @@ -1095,13 +1123,6 @@ VERBATIM_HEADERS = YES ALPHABETICAL_INDEX = YES -# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in -# which the alphabetical index list will be split. -# Minimum value: 1, maximum value: 20, default value: 5. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -COLS_IN_ALPHA_INDEX = 5 - # In case all classes in a project start with a common prefix, all classes will # be put under the same header in the alphabetical index. The IGNORE_PREFIX tag # can be used to specify a prefix (or a list of prefixes) that should be ignored @@ -1201,7 +1222,7 @@ HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the style sheet and background images according to -# this color. Hue is specified as an angle on a colorwheel, see +# this color. Hue is specified as an angle on a color-wheel, see # https://en.wikipedia.org/wiki/Hue for more information. For instance the value # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 # purple, and 360 is red again. @@ -1211,7 +1232,7 @@ HTML_EXTRA_FILES = HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors -# in the HTML output. For a value of 0 the output will use grayscales only. A +# in the HTML output. For a value of 0 the output will use gray-scales only. A # value of 255 will produce the most vivid colors. # Minimum value: 0, maximum value: 255, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. @@ -1272,10 +1293,11 @@ HTML_INDEX_NUM_ENTRIES = 100 # If the GENERATE_DOCSET tag is set to YES, additional index files will be # generated that can be used as input for Apple's Xcode 3 integrated development -# environment (see: https://developer.apple.com/xcode/), introduced with OSX -# 10.5 (Leopard). To create a documentation set, doxygen will generate a -# Makefile in the HTML output directory. Running make will produce the docset in -# that directory and running make install will install the docset in +# environment (see: +# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To +# create a documentation set, doxygen will generate a Makefile in the HTML +# output directory. Running make will produce the docset in that directory and +# running make install will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at # startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy # genXcode/_index.html for more information. @@ -1292,6 +1314,13 @@ GENERATE_DOCSET = NO DOCSET_FEEDNAME = "Doxygen generated docs" +# This tag determines the URL of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDURL = + # This tag specifies a string that should uniquely identify the documentation # set bundle. This should be a reverse domain-name style string, e.g. # com.mycompany.MyDocSet. Doxygen will append .docset to the name. @@ -1317,8 +1346,12 @@ DOCSET_PUBLISHER_NAME = CTTC # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three # additional HTML index files: index.hhp, index.hhc, and index.hhk. The # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop -# (see: https://www.microsoft.com/en-us/download/details.aspx?id=21138) on -# Windows. +# on Windows. In the beginning of 2021 Microsoft took the original page, with +# a.o. the download links, offline the HTML help workshop was already many years +# in maintenance mode). You can download the HTML help workshop from the web +# archives at Installation executable (see: +# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo +# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe). # # The HTML Help Workshop contains a compiler that can convert all HTML output # generated by doxygen into a single compiled HTML file (.chm). Compiled HTML @@ -1393,7 +1426,8 @@ QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help # Project output. For more information please see Qt Help Project / Namespace -# (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). +# (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1401,8 +1435,8 @@ QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt # Help Project output. For more information please see Qt Help Project / Virtual -# Folders (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual- -# folders). +# Folders (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders). # The default value is: doc. # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1410,16 +1444,16 @@ QHP_VIRTUAL_FOLDER = doc # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom # filter to add. For more information please see Qt Help Project / Custom -# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- -# filters). +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_NAME = # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see Qt Help Project / Custom -# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- -# filters). +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_ATTRS = @@ -1431,9 +1465,9 @@ QHP_CUST_FILTER_ATTRS = QHP_SECT_FILTER_ATTRS = -# The QHG_LOCATION tag can be used to specify the location of Qt's -# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the -# generated .qhp file. +# The QHG_LOCATION tag can be used to specify the location (absolute path +# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to +# run qhelpgenerator on the generated .qhp file. # This tag requires that the tag GENERATE_QHP is set to YES. QHG_LOCATION = @@ -1476,16 +1510,28 @@ DISABLE_INDEX = NO # to work a browser that supports JavaScript, DHTML, CSS and frames is required # (i.e. any modern browser). Windows users are probably better off using the # HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can -# further fine-tune the look of the index. As an example, the default style -# sheet generated by doxygen has an example that shows how to put an image at -# the root of the tree instead of the PROJECT_NAME. Since the tree basically has -# the same information as the tab index, you could consider setting -# DISABLE_INDEX to YES when enabling this option. +# further fine tune the look of the index (see "Fine-tuning the output"). As an +# example, the default style sheet generated by doxygen has an example that +# shows how to put an image at the root of the tree instead of the PROJECT_NAME. +# Since the tree basically has the same information as the tab index, you could +# consider setting DISABLE_INDEX to YES when enabling this option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_TREEVIEW = NO +# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the +# FULL_SIDEBAR option determines if the side bar is limited to only the treeview +# area (value NO) or if it should extend to the full height of the window (value +# YES). Setting this to YES gives a layout similar to +# https://docs.readthedocs.io with more room for contents, but less room for the +# project logo, title, and description. If either GENERATE_TREEVIEW or +# DISABLE_INDEX is set to NO, this option has no effect. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FULL_SIDEBAR = NO + # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that # doxygen will group on one line in the generated HTML documentation. # @@ -1510,6 +1556,13 @@ TREEVIEW_WIDTH = 250 EXT_LINKS_IN_WINDOW = NO +# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email +# addresses. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +OBFUSCATE_EMAILS = YES + # If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg # tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see # https://inkscape.org) to generate formulas as SVG images instead of PNGs for @@ -1558,11 +1611,29 @@ FORMULA_MACROFILE = USE_MATHJAX = @GNSSSDR_USE_MATHJAX@ +# With MATHJAX_VERSION it is possible to specify the MathJax version to be used. +# Note that the different versions of MathJax have different requirements with +# regards to the different settings, so it is possible that also other MathJax +# settings have to be changed when switching between the different MathJax +# versions. +# Possible values are: MathJax_2 and MathJax_3. +# The default value is: MathJax_2. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_VERSION = MathJax_2 + # When MathJax is enabled you can set the default output format to be used for -# the MathJax output. See the MathJax site (see: -# http://docs.mathjax.org/en/latest/output.html) for more details. +# the MathJax output. For more details about the output format see MathJax +# version 2 (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3 +# (see: +# http://docs.mathjax.org/en/latest/web/components/output.html). # Possible values are: HTML-CSS (which is slower, but has the best -# compatibility), NativeMML (i.e. MathML) and SVG. +# compatibility. This is the name for Mathjax version 2, for MathJax version 3 +# this will be translated into chtml), NativeMML (i.e. MathML. Only supported +# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This +# is the name for Mathjax version 3, for MathJax version 2 this will be +# translated into HTML-CSS) and SVG. # The default value is: HTML-CSS. # This tag requires that the tag USE_MATHJAX is set to YES. @@ -1575,15 +1646,21 @@ MATHJAX_FORMAT = SVG # MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax # Content Delivery Network so you can quickly see the result without installing # MathJax. However, it is strongly recommended to install a local copy of -# MathJax from https://www.mathjax.org before deployment. -# The default value is: https://cdn.jsdelivr.net/npm/mathjax@2. +# MathJax from https://www.mathjax.org before deployment. The default value is: +# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2 +# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3 # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_RELPATH = @MATHJAX2_PATH@ # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # extension names that should be enabled during MathJax rendering. For example +# for MathJax version 2 (see +# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions): # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# For example for MathJax version 3 (see +# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html): +# MATHJAX_EXTENSIONS = ams # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_EXTENSIONS = TeX/AMSmath \ @@ -1591,7 +1668,8 @@ MATHJAX_EXTENSIONS = TeX/AMSmath \ # The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces # of code that will be used on startup of the MathJax code. See the MathJax site -# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an # example see the documentation. # This tag requires that the tag USE_MATHJAX is set to YES. @@ -1638,7 +1716,8 @@ SERVER_BASED_SEARCH = NO # # Doxygen ships with an example indexer (doxyindexer) and search engine # (doxysearch.cgi) which are based on the open source search engine library -# Xapian (see: https://xapian.org/). +# Xapian (see: +# https://xapian.org/). # # See the section "External Indexing and Searching" for details. # The default value is: NO. @@ -1651,8 +1730,9 @@ EXTERNAL_SEARCH = NO # # Doxygen ships with an example indexer (doxyindexer) and search engine # (doxysearch.cgi) which are based on the open source search engine library -# Xapian (see: https://xapian.org/). See the section "External Indexing and -# Searching" for details. +# Xapian (see: +# https://xapian.org/). See the section "External Indexing and Searching" for +# details. # This tag requires that the tag SEARCHENGINE is set to YES. SEARCHENGINE_URL = @@ -1763,29 +1843,31 @@ EXTRA_PACKAGES = amsmath \ amssymb \ amsfonts -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the -# generated LaTeX document. The header should contain everything until the first -# chapter. If it is left blank doxygen will generate a standard header. See -# section "Doxygen usage" for information on how to let doxygen write the -# default header to a separate file. +# The LATEX_HEADER tag can be used to specify a user-defined LaTeX header for +# the generated LaTeX document. The header should contain everything until the +# first chapter. If it is left blank doxygen will generate a standard header. It +# is highly recommended to start with a default header using +# doxygen -w latex new_header.tex new_footer.tex new_stylesheet.sty +# and then modify the file new_header.tex. See also section "Doxygen usage" for +# information on how to generate the default header that doxygen normally uses. # -# Note: Only use a user-defined header if you know what you are doing! The -# following commands have a special meaning inside the header: $title, -# $datetime, $date, $doxygenversion, $projectname, $projectnumber, -# $projectbrief, $projectlogo. Doxygen will replace $title with the empty -# string, for the replacement values of the other commands the user is referred -# to HTML_HEADER. +# Note: Only use a user-defined header if you know what you are doing! +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. The following +# commands have a special meaning inside the header (and footer): For a +# description of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_HEADER = -# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the -# generated LaTeX document. The footer should contain everything after the last -# chapter. If it is left blank doxygen will generate a standard footer. See +# The LATEX_FOOTER tag can be used to specify a user-defined LaTeX footer for +# the generated LaTeX document. The footer should contain everything after the +# last chapter. If it is left blank doxygen will generate a standard footer. See # LATEX_HEADER for more information on how to generate a default footer and what -# special commands can be used inside the footer. -# -# Note: Only use a user-defined footer if you know what you are doing! +# special commands can be used inside the footer. See also section "Doxygen +# usage" for information on how to generate the default footer that doxygen +# normally uses. Note: Only use a user-defined footer if you know what you are +# doing! # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_FOOTER = @@ -1830,8 +1912,7 @@ USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode # command to the generated LaTeX files. This will instruct LaTeX to keep running -# if errors occur, instead of asking the user for help. This option is also used -# when generating formulas in HTML. +# if errors occur, instead of asking the user for help. # The default value is: NO. # This tag requires that the tag GENERATE_LATEX is set to YES. @@ -1844,16 +1925,6 @@ LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO -# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source -# code with syntax highlighting in the LaTeX output. -# -# Note that which sources are shown also depends on other settings such as -# SOURCE_BROWSER. -# The default value is: NO. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_SOURCE_CODE = NO - # The LATEX_BIB_STYLE tag can be used to specify the style to use for the # bibliography, e.g. plainnat, or ieeetr. See # https://en.wikipedia.org/wiki/BibTeX and \cite for more info. @@ -1934,16 +2005,6 @@ RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = -# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code -# with syntax highlighting in the RTF output. -# -# Note that which sources are shown also depends on other settings such as -# SOURCE_BROWSER. -# The default value is: NO. -# This tag requires that the tag GENERATE_RTF is set to YES. - -RTF_SOURCE_CODE = NO - #--------------------------------------------------------------------------- # Configuration options related to the man page output #--------------------------------------------------------------------------- @@ -2040,15 +2101,6 @@ GENERATE_DOCBOOK = NO DOCBOOK_OUTPUT = docbook -# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the -# program listings (including syntax highlighting and cross-referencing -# information) to the DOCBOOK output. Note that enabling this will significantly -# increase the size of the DOCBOOK output. -# The default value is: NO. -# This tag requires that the tag GENERATE_DOCBOOK is set to YES. - -DOCBOOK_PROGRAMLISTING = NO - #--------------------------------------------------------------------------- # Configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- @@ -2227,15 +2279,6 @@ EXTERNAL_PAGES = YES # Configuration options related to the dot tool #--------------------------------------------------------------------------- -# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram -# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to -# NO turns the diagrams off. Note that this option also works with HAVE_DOT -# disabled, but it is recommended to install and use dot, since it yields more -# powerful graphs. -# The default value is: YES. - -CLASS_DIAGRAMS = YES - # You can include diagrams made with dia in doxygen documentation. Doxygen will # then run dia to produce the diagram and insert it in the documentation. The # DIA_PATH tag allows you to specify the directory where the dia binary resides. @@ -2292,11 +2335,14 @@ DOT_FONTSIZE = 10 DOT_FONTPATH = -# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for -# each documented class showing the direct and indirect inheritance relations. -# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO. +# If the CLASS_GRAPH tag is set to YES (or GRAPH) then doxygen will generate a +# graph for each documented class showing the direct and indirect inheritance +# relations. In case HAVE_DOT is set as well dot will be used to draw the graph, +# otherwise the built-in generator will be used. If the CLASS_GRAPH tag is set +# to TEXT the direct and indirect inheritance relations will be shown as texts / +# links. +# Possible values are: NO, YES, TEXT and GRAPH. # The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. CLASS_GRAPH = YES @@ -2333,10 +2379,32 @@ UML_LOOK = YES # but if the number exceeds 15, the total amount of fields shown is limited to # 10. # Minimum value: 0, maximum value: 100, default value: 10. -# This tag requires that the tag HAVE_DOT is set to YES. +# This tag requires that the tag UML_LOOK is set to YES. UML_LIMIT_NUM_FIELDS = 10 +# If the DOT_UML_DETAILS tag is set to NO, doxygen will show attributes and +# methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS +# tag is set to YES, doxygen will add type and arguments for attributes and +# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, doxygen +# will not generate fields with class member information in the UML graphs. The +# class diagrams will look similar to the default class diagrams but using UML +# notation for the relationships. +# Possible values are: NO, YES and NONE. +# The default value is: NO. +# This tag requires that the tag UML_LOOK is set to YES. + +DOT_UML_DETAILS = NO + +# The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters +# to display on a single line. If the actual line length exceeds this threshold +# significantly it will wrapped across multiple lines. Some heuristics are apply +# to avoid ugly line breaks. +# Minimum value: 0, maximum value: 1000, default value: 17. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_WRAP_THRESHOLD = 17 + # If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and # collaboration graphs will show the relations between templates and their # instances. @@ -2403,6 +2471,13 @@ GRAPHICAL_HIERARCHY = YES DIRECTORY_GRAPH = YES +# The DIR_GRAPH_MAX_DEPTH tag can be used to limit the maximum number of levels +# of child directories generated in directory dependency graphs by dot. +# Minimum value: 1, maximum value: 25, default value: 1. +# This tag requires that the tag DIRECTORY_GRAPH is set to YES. + +DIR_GRAPH_MAX_DEPTH = 1 + # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. For an explanation of the image formats see the section # output formats in the documentation of the dot tool (Graphviz (see: @@ -2456,10 +2531,10 @@ MSCFILE_DIRS = DIAFILE_DIRS = # When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the -# path where java can find the plantuml.jar file. If left blank, it is assumed -# PlantUML is not used or called during a preprocessing step. Doxygen will -# generate a warning when it encounters a \startuml command in this case and -# will not generate output for the diagram. +# path where java can find the plantuml.jar file or to the filename of jar file +# to be used. If left blank, it is assumed PlantUML is not used or called during +# a preprocessing step. Doxygen will generate a warning when it encounters a +# \startuml command in this case and will not generate output for the diagram. PLANTUML_JAR_PATH = @@ -2521,14 +2596,18 @@ DOT_MULTI_TARGETS = YES # If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page # explaining the meaning of the various boxes and arrows in the dot generated # graphs. +# Note: This tag requires that UML_LOOK isn't set, i.e. the doxygen internal +# graphical representation for inheritance and collaboration diagrams is used. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. GENERATE_LEGEND = YES -# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot +# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate # files that are used to generate the various graphs. +# +# Note: This setting is not only used for dot files but also for msc temporary +# files. # The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. DOT_CLEANUP = YES diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/Doxyfile.in b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/Doxyfile.in index 2bb89d65b..a63402977 100644 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/Doxyfile.in +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/Doxyfile.in @@ -1,11 +1,7 @@ -# Doxyfile 1.8.6 +# Doxyfile 1.9.3 -# -# SPDX-FileCopyrightText: 2011-2020 Carles Fernandez-Prades -# SPDX-License-Identifier: GPL-3.0-or-later -# # This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.nl) for a project. +# doxygen (www.doxygen.org) for a project. # # All text after a double hash (##) is considered a comment and is placed in # front of the TAG it is preceding. @@ -21,11 +17,11 @@ # Project related configuration options #--------------------------------------------------------------------------- -# This tag specifies the encoding used for all characters in the config file -# that follow. The default is UTF-8 which is also the encoding used for all text -# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv -# built into libc) for the transcoding. See https://www.gnu.org/software/libiconv -# for the list of possible encodings. +# This tag specifies the encoding used for all characters in the configuration +# file that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# https://www.gnu.org/software/libiconv/ for the list of possible encodings. # The default value is: UTF-8. DOXYFILE_ENCODING = UTF-8 @@ -50,10 +46,10 @@ PROJECT_NUMBER = @VERSION@ PROJECT_BRIEF = "Architecture-tuned implementations of math kernels" -# With the PROJECT_LOGO tag one can specify an logo or icon that is included in -# the documentation. The maximum height of the logo should not exceed 55 pixels -# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo -# to the output directory. +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. PROJECT_LOGO = @@ -62,12 +58,9 @@ PROJECT_LOGO = # entered, it will be relative to the location where doxygen was started. If # left blank the current directory will be used. -# TODO: configure this to be a special docs directory. nw tried, but running -# make doc won' create the directory, but with doxygen it will. why? - OUTPUT_DIRECTORY = -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub- +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- # directories (in 2 levels) under the output directory of each output format and # will distribute the generated files over these directories. Enabling this # option can be useful when feeding doxygen a huge amount of source files, where @@ -77,6 +70,14 @@ OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. @@ -92,14 +93,14 @@ CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English -# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member # descriptions after the members that are listed in the file and class # documentation (similar to Javadoc). Set to NO to disable this. # The default value is: YES. BRIEF_MEMBER_DESC = YES -# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief # description of a member or function before the detailed description # # Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the @@ -144,7 +145,7 @@ ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO -# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path # before files name in the file list and in the header files. If set to NO the # shortest path that makes the file name unique will be used # The default value is: YES. @@ -188,6 +189,16 @@ SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO +# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line +# such as +# /*************** +# as being the beginning of a Javadoc-style comment "banner". If set to NO, the +# Javadoc-style will behave just like regular comments and it will not be +# interpreted by doxygen. +# The default value is: NO. + +JAVADOC_BANNER = NO + # If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first # line (until the first dot) of a Qt-style comment as the brief description. If # set to NO, the Qt-style will behave just like regular Qt-style comments (thus @@ -208,15 +219,23 @@ QT_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO +# By default Python docstrings are displayed as preformatted text and doxygen's +# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the +# doxygen's special commands can be used and the contents of the docstring +# documentation blocks is shown as doxygen documentation. +# The default value is: YES. + +PYTHON_DOCSTRING = YES + # If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the # documentation from any documented member that it re-implements. # The default value is: YES. INHERIT_DOCS = YES -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a -# new page for each member. If set to NO, the documentation of a member will be -# part of the file/class/namespace that contains it. +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. # The default value is: NO. SEPARATE_MEMBER_PAGES = NO @@ -231,20 +250,19 @@ TAB_SIZE = 4 # the documentation. An alias has the form: # name=value # For example adding -# "sideeffect=@par Side Effects:\n" +# "sideeffect=@par Side Effects:^^" # will allow you to put the command \sideeffect (or @sideeffect) in the # documentation, which will result in a user-defined paragraph with heading -# "Side Effects:". You can put \n's in the value part of an alias to insert -# newlines. +# "Side Effects:". Note that you cannot put \n's in the value part of an alias +# to insert newlines (in the resulting output). You can put ^^ in the value part +# of an alias to insert a newline as if a physical newline was in the original +# file. When you need a literal { or } or , in the value part of an alias you +# have to escape them by means of a backslash (\), this can lead to conflicts +# with the commands \{ and \} for these it is advised to use the version @{ and +# @} or use a double escape (\\{ and \\}) ALIASES = -# This tag can be used to specify a number of word-keyword mappings (TCL only). -# A mapping has the form "name=value". For example adding "class=itcl::class" -# will allow you to use the command class in the itcl::class meaning. - -TCL_SUBST = - # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. For # instance, some of the names that are used will be different. The list of all @@ -273,19 +291,34 @@ OPTIMIZE_FOR_FORTRAN = NO OPTIMIZE_OUTPUT_VHDL = NO +# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice +# sources only. Doxygen will then generate output that is more tailored for that +# language. For instance, namespaces will be presented as modules, types will be +# separated into more groups, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_SLICE = NO + # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given # extension. Doxygen has a built-in mapping, but you can override or extend it # using this tag. The format is ext=language, where ext is a file extension, and -# language is one of the parsers supported by doxygen: IDL, Java, Javascript, -# C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL. For instance to make -# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C -# (default is Fortran), use: inc=Fortran f=C. +# language is one of the parsers supported by doxygen: IDL, Java, JavaScript, +# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice, +# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: +# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser +# tries to guess whether the code is fixed or free formatted code, this is the +# default for Fortran type files). For instance to make doxygen treat .inc files +# as Fortran files (default is PHP), and .f files as C (default is Fortran), +# use: inc=Fortran f=C. # -# Note For files without extension you can use no_extension as a placeholder. +# Note: For files without extension you can use no_extension as a placeholder. # # Note that for custom extensions you also need to set FILE_PATTERNS otherwise -# the files are not read by doxygen. +# the files are not read by doxygen. When specifying no_extension you should add +# * to the FILE_PATTERNS. +# +# Note see also the list of default file extension mappings. EXTENSION_MAPPING = @@ -299,10 +332,19 @@ EXTENSION_MAPPING = MARKDOWN_SUPPORT = YES +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# to that level are automatically included in the table of contents, even if +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 5. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 5 + # When enabled doxygen tries to link words that correspond to documented # classes, or namespaces to their corresponding documentation. Such a link can -# be prevented in individual cases by by putting a % sign in front of the word -# or globally by setting AUTOLINK_SUPPORT to NO. +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. # The default value is: YES. AUTOLINK_SUPPORT = YES @@ -324,7 +366,7 @@ BUILTIN_STL_SUPPORT = NO CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip (see: -# https://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen +# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen # will parse them like normal C++ but will assume all classes use public instead # of private inheritance when no explicit protection keyword is present. # The default value is: NO. @@ -342,13 +384,20 @@ SIP_SUPPORT = NO IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first +# tag is set to YES then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. # The default value is: NO. DISTRIBUTE_GROUP_DOC = NO +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + # Set the SUBGROUPING tag to YES to allow class member groups of the same type # (for instance a group of public functions) to be put as a subgroup of that # type (e.g. under the Public Functions section). Set it to NO to prevent @@ -403,11 +452,24 @@ TYPEDEF_HIDES_STRUCT = NO LOOKUP_CACHE_SIZE = 0 +# The NUM_PROC_THREADS specifies the number threads doxygen is allowed to use +# during processing. When set to 0 doxygen will based this on the number of +# cores available in the system. You can set it explicitly to a value larger +# than 0 to get more control over the balance between CPU load and processing +# speed. At this moment only the input processing can be done using multiple +# threads. Since this is still an experimental feature the default is set to 1, +# which effectively disables parallel processing. Please report any issues you +# encounter. Generating dot graphs in parallel is controlled by the +# DOT_NUM_THREADS setting. +# Minimum value: 0, maximum value: 32, default value: 1. + +NUM_PROC_THREADS = 1 + #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in # documentation are documented, even if no documentation was available. Private # class members and static file members will be hidden unless the # EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. @@ -417,35 +479,41 @@ LOOKUP_CACHE_SIZE = 0 EXTRACT_ALL = YES -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will # be included in the documentation. # The default value is: NO. EXTRACT_PRIVATE = NO -# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal +# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual +# methods of a class will be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIV_VIRTUAL = NO + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal # scope will be included in the documentation. # The default value is: NO. EXTRACT_PACKAGE = NO -# If the EXTRACT_STATIC tag is set to YES all static members of a file will be +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be # included in the documentation. # The default value is: NO. EXTRACT_STATIC = YES -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined -# locally in source files will be included in the documentation. If set to NO +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, # only classes defined in header files are included. Does not have any effect # for Java sources. # The default value is: YES. EXTRACT_LOCAL_CLASSES = YES -# This flag is only useful for Objective-C code. When set to YES local methods, +# This flag is only useful for Objective-C code. If set to YES, local methods, # which are defined in the implementation section but not in the interface are -# included in the documentation. If set to NO only methods in the interface are +# included in the documentation. If set to NO, only methods in the interface are # included. # The default value is: NO. @@ -460,6 +528,13 @@ EXTRACT_LOCAL_METHODS = NO EXTRACT_ANON_NSPACES = NO +# If this flag is set to YES, the name of an unnamed parameter in a declaration +# will be determined by the corresponding definition. By default unnamed +# parameters remain unnamed in the output. +# The default value is: YES. + +RESOLVE_UNNAMED_PARAMS = YES + # If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all # undocumented members inside documented classes or files. If set to NO these # members will be included in the various overviews, but no documentation @@ -470,21 +545,21 @@ HIDE_UNDOC_MEMBERS = YES # If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. If set -# to NO these classes will be included in the various overviews. This option has -# no effect if EXTRACT_ALL is enabled. +# to NO, these classes will be included in the various overviews. This option +# has no effect if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_CLASSES = YES # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend -# (class|struct|union) declarations. If set to NO these declarations will be -# included in the documentation. +# declarations. If set to NO, these declarations will be included in the +# documentation. # The default value is: NO. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any -# documentation blocks found inside the body of a function. If set to NO these +# documentation blocks found inside the body of a function. If set to NO, these # blocks will be appended to the function's detailed documentation block. # The default value is: NO. @@ -497,22 +572,42 @@ HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO -# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file -# names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. +# With the correct setting of option CASE_SENSE_NAMES doxygen will better be +# able to match the capabilities of the underlying filesystem. In case the +# filesystem is case sensitive (i.e. it supports files in the same directory +# whose names only differ in casing), the option must be set to YES to properly +# deal with such files in case they appear in the input. For filesystems that +# are not case sensitive the option should be be set to NO to properly deal with +# output files written for symbols that only differ in casing, such as for two +# classes, one named CLASS and the other named Class, and to also support +# references to files without having to specify the exact matching casing. On +# Windows (including Cygwin) and MacOS, users should typically set this option +# to NO, whereas on Linux or other Unix flavors it should typically be set to +# YES. # The default value is: system dependent. CASE_SENSE_NAMES = NO # If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with -# their full class and namespace scopes in the documentation. If set to YES the +# their full class and namespace scopes in the documentation. If set to YES, the # scope will be hidden. # The default value is: NO. HIDE_SCOPE_NAMES = NO +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class +# will show which file needs to be included to use the class. +# The default value is: YES. + +SHOW_HEADERFILE = YES + # If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of # the files that are included by a file in the documentation of that file. # The default value is: YES. @@ -540,14 +635,14 @@ INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the # (detailed) documentation of file and class members alphabetically by member -# name. If set to NO the members will appear in declaration order. +# name. If set to NO, the members will appear in declaration order. # The default value is: YES. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief # descriptions of file, namespace and class members alphabetically by member -# name. If set to NO the members will appear in declaration order. Note that +# name. If set to NO, the members will appear in declaration order. Note that # this will also influence the order of the classes in the class list. # The default value is: NO. @@ -592,27 +687,25 @@ SORT_BY_SCOPE_NAME = NO STRICT_PROTO_MATCHING = NO -# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the -# todo list. This list is created by putting \todo commands in the -# documentation. +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. # The default value is: YES. GENERATE_TODOLIST = YES -# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the -# test list. This list is created by putting \test commands in the -# documentation. +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. # The default value is: YES. GENERATE_TESTLIST = YES -# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug # list. This list is created by putting \bug commands in the documentation. # The default value is: YES. GENERATE_BUGLIST = YES -# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO) +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) # the deprecated list. This list is created by putting \deprecated commands in # the documentation. # The default value is: YES. @@ -637,8 +730,8 @@ ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated at -# the bottom of the documentation of classes and structs. If set to YES the list -# will mention the files that were used to generate the documentation. +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. # The default value is: YES. SHOW_USED_FILES = YES @@ -672,7 +765,8 @@ FILE_VERSION_FILTER = # output files in an output format independent way. To create the layout file # that represents doxygen's defaults, run doxygen with the -l option. You can # optionally specify a file name after the option, if omitted DoxygenLayout.xml -# will be used as the name of the layout file. +# will be used as the name of the layout file. See also section "Changing the +# layout of pages" for information. # # Note that if you run doxygen from a directory containing a file called # DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE @@ -686,8 +780,7 @@ LAYOUT_FILE = @PROJECT_SOURCE_DIR@/DoxygenLayout.xml # to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. # For LaTeX the style of the bibliography can be controlled using # LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the -# search path. Do not use file names with spaces, bibtex cannot handle them. See -# also \cite for info how to create references. +# search path. See also \cite for info how to create references. CITE_BIB_FILES = @@ -703,7 +796,7 @@ CITE_BIB_FILES = QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are -# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES # this implies that the warnings are on. # # Tip: Turn warnings on while writing the documentation. @@ -711,7 +804,7 @@ QUIET = NO WARNINGS = YES -# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate # warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag # will automatically be disabled. # The default value is: YES. @@ -719,21 +812,39 @@ WARNINGS = YES WARN_IF_UNDOCUMENTED = YES # If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some parameters -# in a documented function, or documenting parameters that don't exist or using -# markup commands wrongly. +# potential errors in the documentation, such as documenting some parameters in +# a documented function twice, or documenting parameters that don't exist or +# using markup commands wrongly. # The default value is: YES. WARN_IF_DOC_ERROR = YES +# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete +# function parameter documentation. If set to NO, doxygen will accept that some +# parameters have no documentation without warning. +# The default value is: YES. + +WARN_IF_INCOMPLETE_DOC = YES + # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that # are documented, but have no documentation for their parameters or return -# value. If set to NO doxygen will only warn about wrong or incomplete parameter -# documentation, but not about the absence of documentation. +# value. If set to NO, doxygen will only warn about wrong parameter +# documentation, but not about the absence of documentation. If EXTRACT_ALL is +# set to YES then this flag will automatically be disabled. See also +# WARN_IF_INCOMPLETE_DOC # The default value is: NO. WARN_NO_PARAMDOC = NO +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS +# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but +# at the end of the doxygen process doxygen will return with a non-zero status. +# Possible values are: NO, YES and FAIL_ON_WARNINGS. +# The default value is: NO. + +WARN_AS_ERROR = NO + # The WARN_FORMAT tag determines the format of the warning messages that doxygen # can produce. The string should contain the $file, $line, and $text tags, which # will be replaced by the file and line number from which the warning originated @@ -746,7 +857,10 @@ WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning and error # messages should be written. If left blank the output is written to standard -# error (stderr). +# error (stderr). In case the file specified cannot be opened for writing the +# warning and error messages are written to standard error. When as file - is +# specified the warning and error messages are written to standard output +# (stdout). WARN_LOGFILE = @@ -757,7 +871,7 @@ WARN_LOGFILE = # The INPUT tag is used to specify the files and/or directories that contain # documented source files. You may enter file names like myfile.cpp or # directories like /usr/src/myproject. Separate the files or directories with -# spaces. +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. INPUT = @PROJECT_SOURCE_DIR@ @@ -765,20 +879,29 @@ INPUT = @PROJECT_SOURCE_DIR@ # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses # libiconv (or the iconv built into libc) for the transcoding. See the libiconv -# documentation (see: https://www.gnu.org/software/libiconv) for the list of -# possible encodings. +# documentation (see: +# https://www.gnu.org/software/libiconv/) for the list of possible encodings. # The default value is: UTF-8. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and -# *.h) to filter out the source-files in the directories. If left blank the -# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii, -# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, -# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, -# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, -# *.qsf, *.as and *.js. +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# Note the list of default checked file patterns might differ from the list of +# default file extension mappings. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, +# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, +# *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, +# *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C +# comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, +# *.vhdl, *.ucf, *.qsf and *.ice. FILE_PATTERNS = *.c \ *.cc \ @@ -836,7 +959,8 @@ RECURSIVE = YES # Note that relative paths are relative to the directory from which doxygen is # run. -EXCLUDE = @PROJECT_BINARY_DIR@ @PROJECT_SOURCE_DIR@/cpu_features +EXCLUDE = @PROJECT_BINARY_DIR@ \ + @PROJECT_SOURCE_DIR@/cpu_features # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded @@ -858,7 +982,7 @@ EXCLUDE_PATTERNS = # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test +# ANamespace::AClass, ANamespace::*Test # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories use the pattern */test/* @@ -905,6 +1029,10 @@ IMAGE_PATH = @PROJECT_SOURCE_DIR@/docs/images # Note that the filter must not add or remove lines; it is applied before the # code is scanned, but not when the output code is generated. If lines are added # or removed, the anchors will not be placed correctly. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. INPUT_FILTER = @@ -914,11 +1042,15 @@ INPUT_FILTER = # (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how # filters are used. If the FILTER_PATTERNS tag is empty or if none of the # patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER ) will also be used to filter the input files that are used for +# INPUT_FILTER) will also be used to filter the input files that are used for # producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). # The default value is: NO. @@ -966,7 +1098,7 @@ INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES then for each documented -# function all documented functions referencing it will be listed. +# entity all documented functions referencing it will be listed. # The default value is: NO. REFERENCED_BY_RELATION = NO @@ -978,7 +1110,7 @@ REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set -# to YES, then the hyperlinks from functions in REFERENCES_RELATION and +# to YES then the hyperlinks from functions in REFERENCES_RELATION and # REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will # link to the documentation. # The default value is: YES. @@ -1003,7 +1135,7 @@ SOURCE_TOOLTIPS = YES # # To use it do the following: # - Install the latest version of global -# - Enable SOURCE_BROWSER and USE_HTAGS in the config file +# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file # - Make sure the INPUT points to the root of the source tree # - Run doxygen as normal # @@ -1036,13 +1168,6 @@ VERBATIM_HEADERS = YES ALPHABETICAL_INDEX = YES -# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in -# which the alphabetical index list will be split. -# Minimum value: 1, maximum value: 20, default value: 5. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -COLS_IN_ALPHA_INDEX = 5 - # In case all classes in a project start with a common prefix, all classes will # be put under the same header in the alphabetical index. The IGNORE_PREFIX tag # can be used to specify a prefix (or a list of prefixes) that should be ignored @@ -1055,7 +1180,7 @@ IGNORE_PREFIX = # Configuration options related to the HTML output #--------------------------------------------------------------------------- -# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output # The default value is: YES. GENERATE_HTML = YES @@ -1117,13 +1242,15 @@ HTML_FOOTER = HTML_STYLESHEET = -# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional user- -# defined cascading style sheet that is included after the standard style sheets +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets # created by doxygen. Using this option one can overrule certain style aspects. # This is preferred over using HTML_STYLESHEET since it does not replace the # standard style sheet and is therefore more robust against future updates. -# Doxygen will copy the style sheet file to the output directory. For an example -# see the documentation. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). For an example see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_STYLESHEET = @@ -1139,8 +1266,8 @@ HTML_EXTRA_STYLESHEET = HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen -# will adjust the colors in the stylesheet and background images according to -# this color. Hue is specified as an angle on a colorwheel, see +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a color-wheel, see # https://en.wikipedia.org/wiki/Hue for more information. For instance the value # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 # purple, and 360 is red again. @@ -1150,7 +1277,7 @@ HTML_EXTRA_FILES = HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors -# in the HTML output. For a value of 0 the output will use grayscales only. A +# in the HTML output. For a value of 0 the output will use gray-scales only. A # value of 255 will produce the most vivid colors. # Minimum value: 0, maximum value: 255, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. @@ -1170,12 +1297,24 @@ HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting this -# to NO can help when comparing the output of multiple runs. -# The default value is: YES. +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_TIMESTAMP = NO +# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML +# documentation will contain a main index with vertical navigation menus that +# are dynamically created via JavaScript. If disabled, the navigation index will +# consists of multiple levels of tabs that are statically embedded in every HTML +# page. Disable this option to support browsers that do not have JavaScript, +# like the Qt help browser. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_MENUS = YES + # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. @@ -1199,12 +1338,14 @@ HTML_INDEX_NUM_ENTRIES = 100 # If the GENERATE_DOCSET tag is set to YES, additional index files will be # generated that can be used as input for Apple's Xcode 3 integrated development -# environment (see: https://developer.apple.com/xcode/), introduced with -# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a -# Makefile in the HTML output directory. Running make will produce the docset in -# that directory and running make install will install the docset in +# environment (see: +# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To +# create a documentation set, doxygen will generate a Makefile in the HTML +# output directory. Running make will produce the docset in that directory and +# running make install will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at -# startup. +# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy +# genXcode/_index.html for more information. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. @@ -1218,6 +1359,13 @@ GENERATE_DOCSET = NO DOCSET_FEEDNAME = "Doxygen generated docs" +# This tag determines the URL of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDURL = + # This tag specifies a string that should uniquely identify the documentation # set bundle. This should be a reverse domain-name style string, e.g. # com.mycompany.MyDocSet. Doxygen will append .docset to the name. @@ -1243,8 +1391,12 @@ DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three # additional HTML index files: index.hhp, index.hhc, and index.hhk. The # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop -# (see: https://www.microsoft.com/en-us/download/details.aspx?id=21138) on -# Windows. +# on Windows. In the beginning of 2021 Microsoft took the original page, with +# a.o. the download links, offline the HTML help workshop was already many years +# in maintenance mode). You can download the HTML help workshop from the web +# archives at Installation executable (see: +# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo +# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe). # # The HTML Help Workshop contains a compiler that can convert all HTML output # generated by doxygen into a single compiled HTML file (.chm). Compiled HTML @@ -1266,28 +1418,29 @@ GENERATE_HTMLHELP = NO CHM_FILE = # The HHC_LOCATION tag can be used to specify the location (absolute path -# including file name) of the HTML help compiler ( hhc.exe). If non-empty +# including file name) of the HTML help compiler (hhc.exe). If non-empty, # doxygen will try to run the HTML help compiler on the generated index.hhp. # The file has to be specified with full path. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. HHC_LOCATION = -# The GENERATE_CHI flag controls if a separate .chi index file is generated ( -# YES) or that it should be included in the master .chm file ( NO). +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the main .chm file (NO). # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. GENERATE_CHI = NO -# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc) +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) # and project file content. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_INDEX_ENCODING = -# The BINARY_TOC flag controls whether a binary table of contents is generated ( -# YES) or a normal table of contents ( NO) in the .chm file. +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. @@ -1318,7 +1471,8 @@ QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help # Project output. For more information please see Qt Help Project / Namespace -# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). +# (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1326,8 +1480,8 @@ QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt # Help Project output. For more information please see Qt Help Project / Virtual -# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- -# folders). +# Folders (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders). # The default value is: doc. # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1335,30 +1489,30 @@ QHP_VIRTUAL_FOLDER = doc # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom # filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- -# filters). +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_NAME = # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- -# filters). +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's filter section matches. Qt Help Project / Filter Attributes (see: -# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_SECT_FILTER_ATTRS = -# The QHG_LOCATION tag can be used to specify the location of Qt's -# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the -# generated .qhp file. +# The QHG_LOCATION tag can be used to specify the location (absolute path +# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to +# run qhelpgenerator on the generated .qhp file. # This tag requires that the tag GENERATE_QHP is set to YES. QHG_LOCATION = @@ -1400,17 +1554,29 @@ DISABLE_INDEX = YES # index structure (just like the one that is generated for HTML Help). For this # to work a browser that supports JavaScript, DHTML, CSS and frames is required # (i.e. any modern browser). Windows users are probably better off using the -# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can -# further fine-tune the look of the index. As an example, the default style -# sheet generated by doxygen has an example that shows how to put an image at -# the root of the tree instead of the PROJECT_NAME. Since the tree basically has -# the same information as the tab index, you could consider setting -# DISABLE_INDEX to YES when enabling this option. +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine tune the look of the index (see "Fine-tuning the output"). As an +# example, the default style sheet generated by doxygen has an example that +# shows how to put an image at the root of the tree instead of the PROJECT_NAME. +# Since the tree basically has the same information as the tab index, you could +# consider setting DISABLE_INDEX to YES when enabling this option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_TREEVIEW = YES +# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the +# FULL_SIDEBAR option determines if the side bar is limited to only the treeview +# area (value NO) or if it should extend to the full height of the window (value +# YES). Setting this to YES gives a layout similar to +# https://docs.readthedocs.io with more room for contents, but less room for the +# project logo, title, and description. If either GENERATE_TREEVIEW or +# DISABLE_INDEX is set to NO, this option has no effect. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FULL_SIDEBAR = NO + # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that # doxygen will group on one line in the generated HTML documentation. # @@ -1428,13 +1594,31 @@ ENUM_VALUES_PER_LINE = 4 TREEVIEW_WIDTH = 250 -# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to # external symbols imported via tag files in a separate window. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. EXT_LINKS_IN_WINDOW = NO +# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email +# addresses. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +OBFUSCATE_EMAILS = YES + +# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg +# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see +# https://inkscape.org) to generate formulas as SVG images instead of PNGs for +# the HTML output. These images will generally look nicer at scaled resolutions. +# Possible values are: png (the default) and svg (looks nicer but requires the +# pdf2svg or inkscape tool). +# The default value is: png. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FORMULA_FORMAT = png + # Use this tag to change the font size of LaTeX formulas included as images in # the HTML documentation. When you change the font size after a successful # doxygen run you need to manually remove any form_*.png images from the HTML @@ -1444,7 +1628,7 @@ EXT_LINKS_IN_WINDOW = NO FORMULA_FONTSIZE = 10 -# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# Use the FORMULA_TRANSPARENT tag to determine whether or not the images # generated for formulas are transparent PNGs. Transparent PNGs are not # supported properly for IE 6.0, but are supported on all modern browsers. # @@ -1455,9 +1639,15 @@ FORMULA_FONTSIZE = 10 FORMULA_TRANSPARENT = YES +# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands +# to create new LaTeX commands to be used in formulas as building blocks. See +# the section "Including formulas" for details. + +FORMULA_MACROFILE = + # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see -# https://www.mathjax.org) which uses client side Javascript for the rendering -# instead of using prerendered bitmaps. Use this if you do not have LaTeX +# https://www.mathjax.org) which uses client side JavaScript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX # installed or if you want to formulas look prettier in the HTML output. When # enabled you may also need to install MathJax separately and configure the path # to it using the MATHJAX_RELPATH option. @@ -1466,11 +1656,29 @@ FORMULA_TRANSPARENT = YES USE_MATHJAX = NO +# With MATHJAX_VERSION it is possible to specify the MathJax version to be used. +# Note that the different versions of MathJax have different requirements with +# regards to the different settings, so it is possible that also other MathJax +# settings have to be changed when switching between the different MathJax +# versions. +# Possible values are: MathJax_2 and MathJax_3. +# The default value is: MathJax_2. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_VERSION = MathJax_2 + # When MathJax is enabled you can set the default output format to be used for -# the MathJax output. See the MathJax site (see: -# https://docs.mathjax.org/en/latest/output.html) for more details. +# the MathJax output. For more details about the output format see MathJax +# version 2 (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3 +# (see: +# http://docs.mathjax.org/en/latest/web/components/output.html). # Possible values are: HTML-CSS (which is slower, but has the best -# compatibility), NativeMML (i.e. MathML) and SVG. +# compatibility. This is the name for Mathjax version 2, for MathJax version 3 +# this will be translated into chtml), NativeMML (i.e. MathML. Only supported +# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This +# is the name for Mathjax version 3, for MathJax version 2 this will be +# translated into HTML-CSS) and SVG. # The default value is: HTML-CSS. # This tag requires that the tag USE_MATHJAX is set to YES. @@ -1483,22 +1691,29 @@ MATHJAX_FORMAT = HTML-CSS # MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax # Content Delivery Network so you can quickly see the result without installing # MathJax. However, it is strongly recommended to install a local copy of -# MathJax from https://www.mathjax.org before deployment. -# The default value is: https://cdnjs.com/libraries/mathjax/. +# MathJax from https://www.mathjax.org before deployment. The default value is: +# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2 +# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3 # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_RELPATH = https://cdnjs.com/libraries/mathjax/ # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # extension names that should be enabled during MathJax rendering. For example +# for MathJax version 2 (see +# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions): # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# For example for MathJax version 3 (see +# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html): +# MATHJAX_EXTENSIONS = ams # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_EXTENSIONS = # The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces # of code that will be used on startup of the MathJax code. See the MathJax site -# (see: https://docs.mathjax.org/en/latest/output.html) for more details. For an +# (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an # example see the documentation. # This tag requires that the tag USE_MATHJAX is set to YES. @@ -1526,12 +1741,12 @@ MATHJAX_CODEFILE = SEARCHENGINE = YES # When the SERVER_BASED_SEARCH tag is enabled the search engine will be -# implemented using a web server instead of a web client using Javascript. There -# are two flavours of web server based searching depending on the -# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for -# searching and an index file used by the script. When EXTERNAL_SEARCH is -# enabled the indexing and searching needs to be provided by external tools. See -# the section "External Indexing and Searching" for details. +# implemented using a web server instead of a web client using JavaScript. There +# are two flavors of web server based searching depending on the EXTERNAL_SEARCH +# setting. When disabled, doxygen will generate a PHP script for searching and +# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing +# and searching needs to be provided by external tools. See the section +# "External Indexing and Searching" for details. # The default value is: NO. # This tag requires that the tag SEARCHENGINE is set to YES. @@ -1543,9 +1758,10 @@ SERVER_BASED_SEARCH = NO # external search engine pointed to by the SEARCHENGINE_URL option to obtain the # search results. # -# Doxygen ships with an example indexer ( doxyindexer) and search engine +# Doxygen ships with an example indexer (doxyindexer) and search engine # (doxysearch.cgi) which are based on the open source search engine library -# Xapian (see: https://xapian.org/). +# Xapian (see: +# https://xapian.org/). # # See the section "External Indexing and Searching" for details. # The default value is: NO. @@ -1556,10 +1772,11 @@ EXTERNAL_SEARCH = NO # The SEARCHENGINE_URL should point to a search engine hosted by a web server # which will return the search results when EXTERNAL_SEARCH is enabled. # -# Doxygen ships with an example indexer ( doxyindexer) and search engine +# Doxygen ships with an example indexer (doxyindexer) and search engine # (doxysearch.cgi) which are based on the open source search engine library -# Xapian (see: https://xapian.org/). See the section "External Indexing and -# Searching" for details. +# Xapian (see: +# https://xapian.org/). See the section "External Indexing and Searching" for +# details. # This tag requires that the tag SEARCHENGINE is set to YES. SEARCHENGINE_URL = @@ -1594,7 +1811,7 @@ EXTRA_SEARCH_MAPPINGS = # Configuration options related to the LaTeX output #--------------------------------------------------------------------------- -# If the GENERATE_LATEX tag is set to YES doxygen will generate LaTeX output. +# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output. # The default value is: YES. GENERATE_LATEX = NO @@ -1610,22 +1827,36 @@ LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. # -# Note that when enabling USE_PDFLATEX this option is only used for generating -# bitmaps for formulas in the HTML output, but not in the Makefile that is -# written to the output directory. -# The default file is: latex. +# Note that when not enabling USE_PDFLATEX the default is latex when enabling +# USE_PDFLATEX the default is pdflatex and when in the later case latex is +# chosen this is overwritten by pdflatex. For specific output languages the +# default can have been set differently, this depends on the implementation of +# the output language. # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate # index for LaTeX. +# Note: This tag is used in the Makefile / make.bat. +# See also: LATEX_MAKEINDEX_CMD for the part in the generated output file +# (.tex). # The default file is: makeindex. # This tag requires that the tag GENERATE_LATEX is set to YES. MAKEINDEX_CMD_NAME = makeindex -# If the COMPACT_LATEX tag is set to YES doxygen generates more compact LaTeX +# The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to +# generate index for LaTeX. In case there is no backslash (\) as first character +# it will be automatically added in the LaTeX code. +# Note: This tag is used in the generated output file (.tex). +# See also: MAKEINDEX_CMD_NAME for the part in the Makefile / make.bat. +# The default value is: makeindex. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_MAKEINDEX_CMD = makeindex + +# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX # documents. This may be useful for small projects and may help to save some # trees in general. # The default value is: NO. @@ -1643,39 +1874,57 @@ COMPACT_LATEX = NO PAPER_TYPE = a4 # The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names -# that should be included in the LaTeX output. To get the times font for -# instance you can specify -# EXTRA_PACKAGES=times +# that should be included in the LaTeX output. The package can be specified just +# by its name or with the correct syntax as to be used with the LaTeX +# \usepackage command. To get the times font for instance you can specify : +# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times} +# To use the option intlimits with the amsmath package you can specify: +# EXTRA_PACKAGES=[intlimits]{amsmath} # If left blank no extra packages will be included. # This tag requires that the tag GENERATE_LATEX is set to YES. EXTRA_PACKAGES = -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the -# generated LaTeX document. The header should contain everything until the first -# chapter. If it is left blank doxygen will generate a standard header. See -# section "Doxygen usage" for information on how to let doxygen write the -# default header to a separate file. +# The LATEX_HEADER tag can be used to specify a user-defined LaTeX header for +# the generated LaTeX document. The header should contain everything until the +# first chapter. If it is left blank doxygen will generate a standard header. It +# is highly recommended to start with a default header using +# doxygen -w latex new_header.tex new_footer.tex new_stylesheet.sty +# and then modify the file new_header.tex. See also section "Doxygen usage" for +# information on how to generate the default header that doxygen normally uses. # -# Note: Only use a user-defined header if you know what you are doing! The -# following commands have a special meaning inside the header: $title, -# $datetime, $date, $doxygenversion, $projectname, $projectnumber. Doxygen will -# replace them by respectively the title of the page, the current date and time, -# only the current date, the version number of doxygen, the project name (see -# PROJECT_NAME), or the project number (see PROJECT_NUMBER). +# Note: Only use a user-defined header if you know what you are doing! +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. The following +# commands have a special meaning inside the header (and footer): For a +# description of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_HEADER = -# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the -# generated LaTeX document. The footer should contain everything after the last -# chapter. If it is left blank doxygen will generate a standard footer. -# -# Note: Only use a user-defined footer if you know what you are doing! +# The LATEX_FOOTER tag can be used to specify a user-defined LaTeX footer for +# the generated LaTeX document. The footer should contain everything after the +# last chapter. If it is left blank doxygen will generate a standard footer. See +# LATEX_HEADER for more information on how to generate a default footer and what +# special commands can be used inside the footer. See also section "Doxygen +# usage" for information on how to generate the default footer that doxygen +# normally uses. Note: Only use a user-defined footer if you know what you are +# doing! # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_FOOTER = +# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# LaTeX style sheets that are included after the standard style sheets created +# by doxygen. Using this option one can overrule certain style aspects. Doxygen +# will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_EXTRA_STYLESHEET = + # The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the LATEX_OUTPUT output # directory. Note that the files will be copied as-is; there are no commands or @@ -1693,9 +1942,11 @@ LATEX_EXTRA_FILES = PDF_HYPERLINKS = YES -# If the LATEX_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate -# the PDF file directly from the LaTeX files. Set this option to YES to get a -# higher quality PDF documentation. +# If the USE_PDFLATEX tag is set to YES, doxygen will use the engine as +# specified with LATEX_CMD_NAME to generate the PDF file directly from the LaTeX +# files. Set this option to YES, to get a higher quality PDF documentation. +# +# See also section LATEX_CMD_NAME for selecting the engine. # The default value is: YES. # This tag requires that the tag GENERATE_LATEX is set to YES. @@ -1703,8 +1954,7 @@ USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode # command to the generated LaTeX files. This will instruct LaTeX to keep running -# if errors occur, instead of asking the user for help. This option is also used -# when generating formulas in HTML. +# if errors occur, instead of asking the user for help. # The default value is: NO. # This tag requires that the tag GENERATE_LATEX is set to YES. @@ -1717,16 +1967,6 @@ LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO -# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source -# code with syntax highlighting in the LaTeX output. -# -# Note that which sources are shown also depends on other settings such as -# SOURCE_BROWSER. -# The default value is: NO. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_SOURCE_CODE = NO - # The LATEX_BIB_STYLE tag can be used to specify the style to use for the # bibliography, e.g. plainnat, or ieeetr. See # https://en.wikipedia.org/wiki/BibTeX and \cite for more info. @@ -1735,11 +1975,27 @@ LATEX_SOURCE_CODE = NO LATEX_BIB_STYLE = plain +# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated +# page will contain the date and time when the page was generated. Setting this +# to NO can help when comparing the output of multiple runs. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_TIMESTAMP = NO + +# The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute) +# path from which the emoji images will be read. If a relative path is entered, +# it will be relative to the LATEX_OUTPUT directory. If left blank the +# LATEX_OUTPUT directory will be used. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_EMOJI_DIRECTORY = + #--------------------------------------------------------------------------- # Configuration options related to the RTF output #--------------------------------------------------------------------------- -# If the GENERATE_RTF tag is set to YES doxygen will generate RTF output. The +# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The # RTF output is optimized for Word 97 and may not look too pretty with other RTF # readers/editors. # The default value is: NO. @@ -1754,7 +2010,7 @@ GENERATE_RTF = NO RTF_OUTPUT = rtf -# If the COMPACT_RTF tag is set to YES doxygen generates more compact RTF +# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF # documents. This may be useful for small projects and may help to save some # trees in general. # The default value is: NO. @@ -1774,9 +2030,9 @@ COMPACT_RTF = NO RTF_HYPERLINKS = NO -# Load stylesheet definitions from file. Syntax is similar to doxygen's config -# file, i.e. a series of assignments. You only have to provide replacements, -# missing definitions are set to their default value. +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# configuration file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. # # See also section "Doxygen usage" for information on how to generate the # default style sheet that doxygen normally uses. @@ -1785,8 +2041,8 @@ RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an RTF document. Syntax is -# similar to doxygen's config file. A template extensions file can be generated -# using doxygen -e rtf extensionFile. +# similar to doxygen's configuration file. A template extensions file can be +# generated using doxygen -e rtf extensionFile. # This tag requires that the tag GENERATE_RTF is set to YES. RTF_EXTENSIONS_FILE = @@ -1795,7 +2051,7 @@ RTF_EXTENSIONS_FILE = # Configuration options related to the man page output #--------------------------------------------------------------------------- -# If the GENERATE_MAN tag is set to YES doxygen will generate man pages for +# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for # classes and files. # The default value is: NO. @@ -1819,6 +2075,13 @@ MAN_OUTPUT = man MAN_EXTENSION = .3 +# The MAN_SUBDIR tag determines the name of the directory created within +# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by +# MAN_EXTENSION with the initial . removed. +# This tag requires that the tag GENERATE_MAN is set to YES. + +MAN_SUBDIR = + # If the MAN_LINKS tag is set to YES and doxygen generates man output, then it # will generate one additional man file for each entity documented in the real # man page(s). These additional files only source the real man page, but without @@ -1832,7 +2095,7 @@ MAN_LINKS = NO # Configuration options related to the XML output #--------------------------------------------------------------------------- -# If the GENERATE_XML tag is set to YES doxygen will generate an XML file that +# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that # captures the structure of the code including all documentation. # The default value is: NO. @@ -1846,19 +2109,7 @@ GENERATE_XML = NO XML_OUTPUT = xml -# The XML_SCHEMA tag can be used to specify a XML schema, which can be used by a -# validating XML parser to check the syntax of the XML files. -# This tag requires that the tag GENERATE_XML is set to YES. - -XML_SCHEMA = - -# The XML_DTD tag can be used to specify a XML DTD, which can be used by a -# validating XML parser to check the syntax of the XML files. -# This tag requires that the tag GENERATE_XML is set to YES. - -XML_DTD = - -# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program +# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program # listings (including syntax highlighting and cross-referencing information) to # the XML output. Note that enabling this will significantly increase the size # of the XML output. @@ -1867,11 +2118,18 @@ XML_DTD = XML_PROGRAMLISTING = YES +# If the XML_NS_MEMB_FILE_SCOPE tag is set to YES, doxygen will include +# namespace members in file scope as well, matching the HTML output. +# The default value is: NO. +# This tag requires that the tag GENERATE_XML is set to YES. + +XML_NS_MEMB_FILE_SCOPE = NO + #--------------------------------------------------------------------------- # Configuration options related to the DOCBOOK output #--------------------------------------------------------------------------- -# If the GENERATE_DOCBOOK tag is set to YES doxygen will generate Docbook files +# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files # that can be used to generate PDF. # The default value is: NO. @@ -1889,10 +2147,10 @@ DOCBOOK_OUTPUT = docbook # Configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- -# If the GENERATE_AUTOGEN_DEF tag is set to YES doxygen will generate an AutoGen -# Definitions (see http://autogen.sf.net) file that captures the structure of -# the code including all documentation. Note that this feature is still -# experimental and incomplete at the moment. +# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an +# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures +# the structure of the code including all documentation. Note that this feature +# is still experimental and incomplete at the moment. # The default value is: NO. GENERATE_AUTOGEN_DEF = NO @@ -1901,7 +2159,7 @@ GENERATE_AUTOGEN_DEF = NO # Configuration options related to the Perl module output #--------------------------------------------------------------------------- -# If the GENERATE_PERLMOD tag is set to YES doxygen will generate a Perl module +# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module # file that captures the structure of the code including all documentation. # # Note that this feature is still experimental and incomplete at the moment. @@ -1909,7 +2167,7 @@ GENERATE_AUTOGEN_DEF = NO GENERATE_PERLMOD = NO -# If the PERLMOD_LATEX tag is set to YES doxygen will generate the necessary +# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary # Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI # output from the Perl module output. # The default value is: NO. @@ -1917,9 +2175,9 @@ GENERATE_PERLMOD = NO PERLMOD_LATEX = NO -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be nicely +# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely # formatted so it can be parsed by a human reader. This is useful if you want to -# understand what is going on. On the other hand, if this tag is set to NO the +# understand what is going on. On the other hand, if this tag is set to NO, the # size of the Perl module output will be much smaller and Perl will parse it # just the same. # The default value is: YES. @@ -1939,14 +2197,14 @@ PERLMOD_MAKEVAR_PREFIX = # Configuration options related to the preprocessor #--------------------------------------------------------------------------- -# If the ENABLE_PREPROCESSING tag is set to YES doxygen will evaluate all +# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all # C-preprocessor directives found in the sources and include files. # The default value is: YES. ENABLE_PREPROCESSING = YES -# If the MACRO_EXPANSION tag is set to YES doxygen will expand all macro names -# in the source code. If set to NO only conditional compilation will be +# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names +# in the source code. If set to NO, only conditional compilation will be # performed. Macro expansion can be done in a controlled way by setting # EXPAND_ONLY_PREDEF to YES. # The default value is: NO. @@ -1962,7 +2220,7 @@ MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO -# If the SEARCH_INCLUDES tag is set to YES the includes files in the +# If the SEARCH_INCLUDES tag is set to YES, the include files in the # INCLUDE_PATH will be searched if a #include is found. # The default value is: YES. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. @@ -2011,9 +2269,9 @@ PREDEFINED = LV_HAVE_GENERIC \ EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will -# remove all references to function-like macros that are alone on a line, have an -# all uppercase name, and do not end with a semicolon. Such function macros are -# typically used for boiler-plate code, and will confuse the parser if not +# remove all references to function-like macros that are alone on a line, have +# an all uppercase name, and do not end with a semicolon. Such function macros +# are typically used for boiler-plate code, and will confuse the parser if not # removed. # The default value is: YES. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. @@ -2033,7 +2291,7 @@ SKIP_FUNCTION_MACROS = YES # where loc1 and loc2 can be relative or absolute paths or URLs. See the # section "Linking to external documentation" for more information about the use # of tag files. -# Note: Each tag file must have an unique name (where the name does NOT include +# Note: Each tag file must have a unique name (where the name does NOT include # the path). If a tag file is not located in the directory in which doxygen is # run, you must also specify the path to the tagfile here. @@ -2045,54 +2303,31 @@ TAGFILES = GENERATE_TAGFILE = -# If the ALLEXTERNALS tag is set to YES all external class will be listed in the -# class index. If set to NO only the inherited external classes will be listed. +# If the ALLEXTERNALS tag is set to YES, all external class will be listed in +# the class index. If set to NO, only the inherited external classes will be +# listed. # The default value is: NO. ALLEXTERNALS = NO -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed in -# the modules index. If set to NO, only the current project's groups will be +# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will be # listed. # The default value is: YES. EXTERNAL_GROUPS = YES -# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed in +# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in # the related pages index. If set to NO, only the current project's pages will # be listed. # The default value is: YES. EXTERNAL_PAGES = YES -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of 'which perl'). -# The default file (with absolute path) is: /usr/bin/perl. - -PERL_PATH = /usr/bin/perl - #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- -# If the CLASS_DIAGRAMS tag is set to YES doxygen will generate a class diagram -# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to -# NO turns the diagrams off. Note that this option also works with HAVE_DOT -# disabled, but it is recommended to install and use dot, since it yields more -# powerful graphs. -# The default value is: YES. - -CLASS_DIAGRAMS = NO - -# You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see: -# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the -# documentation. The MSCGEN_PATH tag allows you to specify the directory where -# the mscgen tool resides. If left empty the tool is assumed to be found in the -# default search path. - -MSCGEN_PATH = - # You can include diagrams made with dia in doxygen documentation. Doxygen will # then run dia to produce the diagram and insert it in the documentation. The # DIA_PATH tag allows you to specify the directory where the dia binary resides. @@ -2100,7 +2335,7 @@ MSCGEN_PATH = DIA_PATH = -# If set to YES, the inheritance and collaboration graphs will hide inheritance +# If set to YES the inheritance and collaboration graphs will hide inheritance # and usage relations if the target is undocumented or is not a class. # The default value is: YES. @@ -2125,7 +2360,7 @@ HAVE_DOT = NO DOT_NUM_THREADS = 0 -# When you want a differently looking font n the dot files that doxygen +# When you want a differently looking font in the dot files that doxygen # generates you can specify the font name using DOT_FONTNAME. You need to make # sure dot is able to find the font, which can be done by putting it in a # standard location or by setting the DOTFONTPATH environment variable or by @@ -2149,13 +2384,16 @@ DOT_FONTSIZE = 10 DOT_FONTPATH = -# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for -# each documented class showing the direct and indirect inheritance relations. -# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO. +# If the CLASS_GRAPH tag is set to YES (or GRAPH) then doxygen will generate a +# graph for each documented class showing the direct and indirect inheritance +# relations. In case HAVE_DOT is set as well dot will be used to draw the graph, +# otherwise the built-in generator will be used. If the CLASS_GRAPH tag is set +# to TEXT the direct and indirect inheritance relations will be shown as texts / +# links. +# Possible values are: NO, YES, TEXT and GRAPH. # The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. -CLASS_GRAPH = YES +CLASS_GRAPH = TEXT # If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a # graph for each documented class showing the direct and indirect implementation @@ -2173,7 +2411,7 @@ COLLABORATION_GRAPH = YES GROUP_GRAPHS = YES -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. # The default value is: NO. @@ -2190,10 +2428,32 @@ UML_LOOK = NO # but if the number exceeds 15, the total amount of fields shown is limited to # 10. # Minimum value: 0, maximum value: 100, default value: 10. -# This tag requires that the tag HAVE_DOT is set to YES. +# This tag requires that the tag UML_LOOK is set to YES. UML_LIMIT_NUM_FIELDS = 10 +# If the DOT_UML_DETAILS tag is set to NO, doxygen will show attributes and +# methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS +# tag is set to YES, doxygen will add type and arguments for attributes and +# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, doxygen +# will not generate fields with class member information in the UML graphs. The +# class diagrams will look similar to the default class diagrams but using UML +# notation for the relationships. +# Possible values are: NO, YES and NONE. +# The default value is: NO. +# This tag requires that the tag UML_LOOK is set to YES. + +DOT_UML_DETAILS = NO + +# The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters +# to display on a single line. If the actual line length exceeds this threshold +# significantly it will wrapped across multiple lines. Some heuristics are apply +# to avoid ugly line breaks. +# Minimum value: 0, maximum value: 1000, default value: 17. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_WRAP_THRESHOLD = 17 + # If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and # collaboration graphs will show the relations between templates and their # instances. @@ -2225,7 +2485,8 @@ INCLUDED_BY_GRAPH = YES # # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected -# functions only using the \callgraph command. +# functions only using the \callgraph command. Disabling a call graph can be +# accomplished by means of the command \hidecallgraph. # The default value is: NO. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2236,7 +2497,8 @@ CALL_GRAPH = NO # # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable caller graphs for selected -# functions only using the \callergraph command. +# functions only using the \callergraph command. Disabling a caller graph can be +# accomplished by means of the command \hidecallergraph. # The default value is: NO. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2258,12 +2520,23 @@ GRAPHICAL_HIERARCHY = YES DIRECTORY_GRAPH = YES +# The DIR_GRAPH_MAX_DEPTH tag can be used to limit the maximum number of levels +# of child directories generated in directory dependency graphs by dot. +# Minimum value: 1, maximum value: 25, default value: 1. +# This tag requires that the tag DIRECTORY_GRAPH is set to YES. + +DIR_GRAPH_MAX_DEPTH = 1 + # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. +# generated by dot. For an explanation of the image formats see the section +# output formats in the documentation of the dot tool (Graphviz (see: +# http://www.graphviz.org/)). # Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order # to make the SVG files visible in IE 9+ (other browsers do not have this # requirement). -# Possible values are: png, jpg, gif and svg. +# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo, +# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and +# png:gdiplus:gdiplus. # The default value is: png. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2306,6 +2579,24 @@ MSCFILE_DIRS = DIAFILE_DIRS = +# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the +# path where java can find the plantuml.jar file or to the filename of jar file +# to be used. If left blank, it is assumed PlantUML is not used or called during +# a preprocessing step. Doxygen will generate a warning when it encounters a +# \startuml command in this case and will not generate output for the diagram. + +PLANTUML_JAR_PATH = + +# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a +# configuration file for plantuml. + +PLANTUML_CFG_FILE = + +# When using plantuml, the specified paths are searched for files specified by +# the !include statement in a plantuml block. + +PLANTUML_INCLUDE_PATH = + # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes # that will be shown in the graph. If the number of nodes in a graph becomes # larger than this value, doxygen will truncate the graph, which is visualized @@ -2342,7 +2633,7 @@ MAX_DOT_GRAPH_DEPTH = 0 DOT_TRANSPARENT = NO -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) support # this, this feature is disabled by default. @@ -2354,14 +2645,18 @@ DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page # explaining the meaning of the various boxes and arrows in the dot generated # graphs. +# Note: This tag requires that UML_LOOK isn't set, i.e. the doxygen internal +# graphical representation for inheritance and collaboration diagrams is used. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. GENERATE_LEGEND = YES -# If the DOT_CLEANUP tag is set to YES doxygen will remove the intermediate dot +# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate # files that are used to generate the various graphs. +# +# Note: This setting is not only used for dot files but also for msc temporary +# files. # The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. DOT_CLEANUP = YES From 49d71ca8e41aa673e890146995aa7e6897959cb7 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Tue, 4 Jan 2022 18:05:00 +0100 Subject: [PATCH 14/50] CI: Fix REUSE-compliance job --- docs/doxygen/Doxyfile.in | 4 ++++ .../libs/volk_gnsssdr_module/volk_gnsssdr/Doxyfile.in | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/docs/doxygen/Doxyfile.in b/docs/doxygen/Doxyfile.in index 852844860..3ec3ef60d 100644 --- a/docs/doxygen/Doxyfile.in +++ b/docs/doxygen/Doxyfile.in @@ -1,5 +1,9 @@ # Doxyfile 1.9.3 +# +# SPDX-FileCopyrightText: 2011-2021 Carles Fernandez-Prades +# SPDX-License-Identifier: GPL-3.0-or-later +# # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/Doxyfile.in b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/Doxyfile.in index a63402977..24696f8d0 100644 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/Doxyfile.in +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/Doxyfile.in @@ -1,5 +1,9 @@ # Doxyfile 1.9.3 +# +# SPDX-FileCopyrightText: 2011-2021 Carles Fernandez-Prades +# SPDX-License-Identifier: GPL-3.0-or-later +# # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # From 2f763385ca7e2b8a53e6e0ecc87e3a38f3685167 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Mon, 17 Jan 2022 09:50:51 +0100 Subject: [PATCH 15/50] Update google/benchmark to v1.6.1 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a84215723..5aec88b89 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -338,7 +338,7 @@ set(GNSSSDR_GPSTK_LOCAL_VERSION "8.0.0") set(GNSSSDR_MATIO_LOCAL_VERSION "1.5.21") set(GNSSSDR_PUGIXML_LOCAL_VERSION "1.11.4") set(GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION "3.19.0") -set(GNSSSDR_BENCHMARK_LOCAL_VERSION "1.6.0") +set(GNSSSDR_BENCHMARK_LOCAL_VERSION "1.6.1") set(GNSSSDR_MATHJAX_EXTERNAL_VERSION "2.7.7") if(CMAKE_VERSION VERSION_LESS "3.3") From e2551648b9d8b0a454cbb51f757721b9ee48ee0c Mon Sep 17 00:00:00 2001 From: Stefan van der Linden Date: Thu, 3 Feb 2022 17:03:50 +0100 Subject: [PATCH 16/50] Added FIFO ibyte support and code cleanups Additional intermediate buffering improves performance --- .../gnuradio_blocks/fifo_reader.cc | 101 +++++++++++++++--- .../gnuradio_blocks/fifo_reader.h | 43 ++------ 2 files changed, 98 insertions(+), 46 deletions(-) diff --git a/src/algorithms/signal_source/gnuradio_blocks/fifo_reader.cc b/src/algorithms/signal_source/gnuradio_blocks/fifo_reader.cc index 4eb7d53cf..60bd54858 100644 --- a/src/algorithms/signal_source/gnuradio_blocks/fifo_reader.cc +++ b/src/algorithms/signal_source/gnuradio_blocks/fifo_reader.cc @@ -17,6 +17,9 @@ #include "fifo_reader.h" #include +#include + +const int FIFO_SIZE = 1472000; // Value taken from gr_complex_ip_packet_source, is it optimal? // initial construction; pass to private constructor FifoReader::sptr FifoReader::make(const std::string &file_name, const std::string &sample_type) @@ -30,7 +33,10 @@ FifoReader::FifoReader(const std::string &file_name, const std::string &sample_t gr::io_signature::make(0, 0, 0), // no input gr::io_signature::make(1, 1, sizeof(gr_complex))), // <+MIN_OUT+>, <+MAX_OUT+>, sizeof(<+OTYPE+>) file_name_(file_name), - sample_type_(sample_type) + sample_type_(sample_type), + fifo_buffer_(new char[FIFO_SIZE]), + buffer_idx_(0), + buffer_size_(0) { DLOG(INFO) << "Starting FifoReader"; } @@ -61,12 +67,14 @@ int FifoReader::work(int noutput_items, size_t items_retrieved = 0; if (sample_type_ == "ishort") { - // ishort == int16_t items_retrieved = read_interleaved(noutput_items, output_items); } + else if (sample_type_ == "ibyte") // Does this also work with cbyte? + { + items_retrieved = read_interleaved(noutput_items, output_items); + } else if (sample_type_ == "gr_complex") { - LOG(WARNING) << sample_type_ << " is not yet tested. Please consider removing this warning if tested successfully"; items_retrieved = read_gr_complex(noutput_items, output_items); } else @@ -80,31 +88,92 @@ int FifoReader::work(int noutput_items, return this->WORK_CALLED_PRODUCE; } -// read gr_complex items from fifo -// this fct has duplicate code with the templated read_interleaved fct in header -size_t FifoReader::read_gr_complex(int noutput_items, gr_vector_void_star &output_items) + +template +size_t FifoReader::read_interleaved(int noutput_items, gr_vector_void_star &output_items) { + boost::mutex::scoped_lock lock(d_mutex); // hold mutex for duration of this function size_t items_retrieved = 0; - for (int n = 0; n < noutput_items; n++) + int n; + Type real; + Type imag; + + if (buffer_idx_ >= buffer_size_) { - gr_complex sample; - fifo_.read(reinterpret_cast(&sample), sizeof(sample)); + fifo_.read(fifo_buffer_, FIFO_SIZE); + buffer_idx_ = 0; if (fifo_.good()) { - static_cast(output_items.at(0))[n] = sample; - items_retrieved++; + buffer_size_ = FIFO_SIZE; } else if (fifo_.eof()) { + // Although we got an EOF, ensure we don't lose the other samples + buffer_size_ = fifo_.gcount(); fifo_.clear(); - break; } else { fifo_error_output(); - break; + return 0; } } + + for (n = 0; n < noutput_items && buffer_idx_ < buffer_size_; n++) + { + memcpy(&real, &fifo_buffer_[buffer_idx_], sizeof(real)); + memcpy(&imag, &fifo_buffer_[buffer_idx_ + sizeof(imag)], sizeof(imag)); + static_cast(output_items.at(0))[n] = gr_complex(real, imag); + + buffer_idx_ += 2 * sizeof(Type); + } + + items_retrieved = n; + + return items_retrieved; +} + + +// read gr_complex items from fifo +// this fct has duplicate code with the templated read_interleaved fct above +size_t FifoReader::read_gr_complex(int noutput_items, gr_vector_void_star &output_items) +{ + boost::mutex::scoped_lock lock(d_mutex); // hold mutex for duration of this function + size_t items_retrieved = 0; + int n; + gr_complex sample; + + if (buffer_idx_ >= buffer_size_) + { + fifo_.read(fifo_buffer_, FIFO_SIZE); + buffer_idx_ = 0; + if (fifo_.good()) + { + buffer_size_ = FIFO_SIZE; + } + else if (fifo_.eof()) + { + // Although we got an EOF, ensure we don't lose the other samples + buffer_size_ = fifo_.gcount(); + fifo_.clear(); + } + else + { + fifo_error_output(); + return 0; + } + } + + for (n = 0; n < noutput_items && buffer_idx_ < buffer_size_; n++) + { + memcpy(&sample, &fifo_buffer_[buffer_idx_], sizeof(gr_complex)); + static_cast(output_items.at(0))[n] = sample; + + buffer_idx_ += sizeof(gr_complex); + } + + items_retrieved = n; + return items_retrieved; } @@ -112,3 +181,9 @@ void FifoReader::fifo_error_output() const { LOG(ERROR) << "unhandled FIFO event"; } + + +FifoReader::~FifoReader() +{ + delete[] fifo_buffer_; +} diff --git a/src/algorithms/signal_source/gnuradio_blocks/fifo_reader.h b/src/algorithms/signal_source/gnuradio_blocks/fifo_reader.h index 9e289ebf5..c90a80448 100644 --- a/src/algorithms/signal_source/gnuradio_blocks/fifo_reader.h +++ b/src/algorithms/signal_source/gnuradio_blocks/fifo_reader.h @@ -19,6 +19,7 @@ #define GNSS_SDR_FIFO_READER_H_ #include "gnss_block_interface.h" +#include #include #include // std::ifstream #include @@ -34,8 +35,6 @@ public: using sptr = gnss_shared_ptr; static sptr make(const std::string &file_name, const std::string &sample_type); - ~FifoReader() = default; - //! initialize istream resource for FIFO bool start(); @@ -50,41 +49,16 @@ private: //! (gr handles this with public and private header pair) FifoReader(const std::string &file_name, const std::string &sample_type); + //! \brief Destructor + //! private destructor + ~FifoReader(); + size_t read_gr_complex(int noutput_items, gr_vector_void_star &output_items); + //! function to read data out of FIFO which is stored as interleaved I/Q stream. //! template argument determines sample_type template - size_t read_interleaved(int noutput_items, gr_vector_void_star &output_items) - { - size_t items_retrieved = 0; - for (int n = 0; n < noutput_items; n++) - { - // TODO: try if performance increases if we copy larger chunks to vector. - // how to read from stream: https://en.cppreference.com/w/cpp/io/basic_ifstream - std::array buffer; // gr_complex is 32bit = 4*char - fifo_.read(reinterpret_cast(&buffer[0]), buffer.size()); - if (fifo_.good()) - { - Type real; - Type imag; - memcpy(&real, &buffer[0], sizeof(real)); - memcpy(&imag, &buffer[2], sizeof(imag)); - static_cast(output_items.at(0))[n] = gr_complex(real, imag); - items_retrieved++; - } - else if (fifo_.eof()) - { - fifo_.clear(); - break; - } - else - { - fifo_error_output(); - break; - } - } - return items_retrieved; - } + size_t read_interleaved(int noutput_items, gr_vector_void_star &output_items); //! this function moves logging output from this header into the source file //! thereby eliminating the need to include glog/logging.h in this header @@ -93,6 +67,9 @@ private: const std::string file_name_; const std::string sample_type_; std::ifstream fifo_; + char *fifo_buffer_; + int buffer_idx_, buffer_size_; + boost::mutex d_mutex; }; /** \} */ From c468b64ac0e65416de793eebd2dae4fa49308817 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sat, 5 Feb 2022 15:03:25 +0100 Subject: [PATCH 17/50] Fix E5b processing. E5a and E5b have data in the Inphase component --- .../galileo_telemetry_decoder_gs.cc | 26 ++----------------- .../gnuradio_blocks/dll_pll_veml_tracking.cc | 4 +-- .../dll_pll_veml_tracking_fpga.cc | 3 +-- 3 files changed, 5 insertions(+), 28 deletions(-) diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_telemetry_decoder_gs.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_telemetry_decoder_gs.cc index 75e20684e..d06fefae6 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_telemetry_decoder_gs.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_telemetry_decoder_gs.cc @@ -662,30 +662,8 @@ int galileo_telemetry_decoder_gs::general_work(int noutput_items __attribute__(( d_band = current_symbol.Signal[0]; // add new symbol to the symbol queue - switch (d_frame_type) - { - case 1: // INAV - { - d_symbol_history.push_back(current_symbol.Prompt_I); - break; - } - case 2: // FNAV - { - d_symbol_history.push_back(current_symbol.Prompt_Q); - break; - } - case 3: // CNAV - { - d_symbol_history.push_back(current_symbol.Prompt_I); - break; - } - default: - { - LOG(WARNING) << "Frame type " << d_frame_type << " is not defined"; - d_symbol_history.push_back(current_symbol.Prompt_I); - break; - } - } + d_symbol_history.push_back(current_symbol.Prompt_I); + d_sample_counter++; // count for the processed symbols // Time Tags from signal source (optional feature) diff --git a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.cc b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.cc index c1b6a69d5..81f56c3fc 100644 --- a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.cc +++ b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.cc @@ -305,6 +305,7 @@ dll_pll_veml_tracking::dll_pll_veml_tracking(const Dll_Pll_Conf &conf_) // remove data secondary code d_data_secondary_code_length = static_cast(GALILEO_E5A_I_SECONDARY_CODE_LENGTH); d_data_secondary_code_string = GALILEO_E5A_I_SECONDARY_CODE; + d_interchange_iq = true; } else { @@ -312,7 +313,6 @@ dll_pll_veml_tracking::dll_pll_veml_tracking(const Dll_Pll_Conf &conf_) d_secondary_code_length = static_cast(GALILEO_E5A_I_SECONDARY_CODE_LENGTH); d_secondary_code_string = GALILEO_E5A_I_SECONDARY_CODE; d_signal_pretty_name = d_signal_pretty_name + "I"; - d_interchange_iq = true; } } else if (d_signal_type == "7X") @@ -336,6 +336,7 @@ dll_pll_veml_tracking::dll_pll_veml_tracking(const Dll_Pll_Conf &conf_) // remove data secondary code d_data_secondary_code_length = static_cast(GALILEO_E5B_I_SECONDARY_CODE_LENGTH); d_data_secondary_code_string = GALILEO_E5B_I_SECONDARY_CODE; + d_interchange_iq = true; } else { @@ -343,7 +344,6 @@ dll_pll_veml_tracking::dll_pll_veml_tracking(const Dll_Pll_Conf &conf_) d_secondary_code_length = static_cast(GALILEO_E5B_I_SECONDARY_CODE_LENGTH); d_secondary_code_string = GALILEO_E5B_I_SECONDARY_CODE; d_signal_pretty_name = d_signal_pretty_name + "I"; - d_interchange_iq = true; } } else if (d_signal_type == "E6") diff --git a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking_fpga.cc b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking_fpga.cc index 63f409c23..5dfe72fe4 100644 --- a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking_fpga.cc +++ b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking_fpga.cc @@ -303,7 +303,7 @@ dll_pll_veml_tracking_fpga::dll_pll_veml_tracking_fpga(const Dll_Pll_Conf_Fpga & // remove data secondary code d_data_secondary_code_length = static_cast(GALILEO_E5A_I_SECONDARY_CODE_LENGTH); d_data_secondary_code_string = GALILEO_E5A_I_SECONDARY_CODE; - + d_interchange_iq = true; // the pilot secondary code depends on PRN and it is initialized later } else @@ -312,7 +312,6 @@ dll_pll_veml_tracking_fpga::dll_pll_veml_tracking_fpga(const Dll_Pll_Conf_Fpga & d_secondary_code_length = static_cast(GALILEO_E5A_I_SECONDARY_CODE_LENGTH); d_secondary_code_string = GALILEO_E5A_I_SECONDARY_CODE; d_signal_pretty_name = d_signal_pretty_name + "I"; - d_interchange_iq = true; } } else From 67062c22a59ea068ad48b3f4eed658b673154499 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sun, 6 Feb 2022 09:43:19 +0100 Subject: [PATCH 18/50] Replace log4cpp-devel by spdlog-devel and fmt-devel dependencies in Tumbleweed --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0a5f6852d..e0ece4a58 100644 --- a/README.md +++ b/README.md @@ -257,7 +257,7 @@ If you are using openSUSE Tumbleweed: zypper install cmake git gcc-c++ boost-devel libboost_atomic-devel \ libboost_system-devel libboost_filesystem-devel libboost_date_time-devel \ libboost_thread-devel libboost_chrono-devel libboost_serialization-devel \ - log4cpp-devel gtest gnuradio-devel pugixml-devel libpcap-devel \ + spdlog-devel fmt-devel gtest gnuradio-devel pugixml-devel libpcap-devel \ armadillo-devel libtool automake hdf5-devel libopenssl-devel \ python3-Mako protobuf-devel ``` From 78d35d6f1137947685a644bc9b140bcace2dbd69 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sun, 6 Feb 2022 10:57:35 +0100 Subject: [PATCH 19/50] Add CITATION.cff file and CI job for format checking --- .github/workflows/citation.yml | 40 ++++ .github/workflows/main.yml | 8 +- CITATION.cff | 325 +++++++++++++++++++++++++++++++++ 3 files changed, 372 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/citation.yml create mode 100644 CITATION.cff diff --git a/.github/workflows/citation.yml b/.github/workflows/citation.yml new file mode 100644 index 000000000..dbec9dd9d --- /dev/null +++ b/.github/workflows/citation.yml @@ -0,0 +1,40 @@ +# SPDX-License-Identifier: GPL-3.0-or-later +# SPDX-FileCopyrightText: 2022 Carles Fernandez-Prades +on: + push: + paths: + - CITATION.cff + workflow_dispatch: + pull_request: + paths: + - CITATION.cff + workflow_dispatch: + +name: CITATION.cff +jobs: + Validate-CITATION-cff: + runs-on: ubuntu-latest + name: Validate CITATION.cff + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + RSPM: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest" + + steps: + - name: Checkout + uses: actions/checkout@v2 + + # This is needed for workflows running on + # ubuntu-20.04 or later + - name: Install V8 + if: runner.os == 'Linux' + run: | + sudo apt-get install -y libv8-dev + - name: Validate CITATION.cff + uses: dieghernan/cff-validator@main + + # Upload artifact + - uses: actions/upload-artifact@v2 + if: failure() + with: + name: citation-cff-errors + path: citation_cff_errors.md diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 8731d9a39..87771b0c9 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -2,7 +2,13 @@ # SPDX-FileCopyrightText: 2020 Carles Fernandez-Prades name: Simple CI -on: [push, pull_request] +on: + pull_request: + paths-ignore: + - '**/CITATION.cff' + push: + paths-ignore: + - '**/CITATION.cff' jobs: build-ubuntu: diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 000000000..ec17ba99f --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,325 @@ +# SPDX-License-Identifier: GPL-3.0-or-later +# SPDX-FileCopyrightText: 2022 C. Fernandez-Prades carles.fernandez(at)cttc.es +--- +abstract: "An open-source Global Navigation Satellite Systems software-defined receiver." +authors: + - affiliation: "Centre Tecnològic de Telecomunicacions de Catalunya (CTTC)" + alias: carlesfernandez + email: carles.fernandez@cttc.es + family-names: "Fernández-Prades" + given-names: Carles + orcid: "https://orcid.org/0000-0002-9201-7007" + - affiliation: "Centre Tecnològic de Telecomunicacions de Catalunya (CTTC)" + alias: Arribas + email: javier.arribas@cttc.es + family-names: Arribas + given-names: Javier + orcid: "https://orcid.org/0000-0001-6346-3406" + - affiliation: "Centre Tecnològic de Telecomunicacions de Catalunya (CTTC)" + alias: mmajoral + email: marc.majoral@cttc.es + family-names: Majoral + given-names: Marc + orcid: "https://orcid.org/0000-0001-6161-6747" + - alias: Gastd + email: gabriel.araujo.5000@gmail.com + family-names: Araujo + given-names: Gabriel + - email: anthony.arnold@uqconnect.edu.au + family-names: Arnold + given-names: Anthony + - email: carlos.avilesr@googlemail.com + family-names: Avilés + given-names: Carlos + - alias: marabra + email: mara.branzanti@gmail.com + family-names: Branzanti + given-names: Mara + - alias: acebrianjuan + email: acebrianjuan@gmail.com + family-names: "Cebrián-Juan" + given-names: Álvaro + - email: a.cecilia.luque@gmail.com + family-names: "Cecilia-Luque" + given-names: Andrés + - alias: luis-esteve + email: luis@epsilon-formacion.com + family-names: Esteve + given-names: Luis + - email: fabra@ice.csic.es + family-names: Fabra + given-names: Fran + - email: daniel.co@bluewin.ch + family-names: Fehr + given-names: Daniel + - alias: piyush0411 + email: piyush04111999@gmail.com + family-names: Gupta + given-names: Piyush + - alias: glamountain + email: gerald@gece.neu.edu + family-names: LaMountain + given-names: Gerald + - alias: lenhart + email: malte.lenhart@mailbox.org + family-names: Lenhart + given-names: Malte + - alias: jwmelto + email: jim.melton@sncorp.com + family-names: Melton + given-names: Jim + - alias: dmiralles2009 + email: dmiralles2009@gmail.com + family-names: Miralles + given-names: Damian + orcid: "https://orcid.org/0000-0001-5820-9569" + - email: marc.molina.pena@gmail.com + family-names: Molina + given-names: Marc + - email: rodrigo.munoz@proteinlab.cl + family-names: Muñoz + given-names: Rodrigo + - alias: odrisci + email: cillian.odriscoll@gmail.com + family-names: "O'Driscoll" + given-names: Cillian + - affiliation: "Centre Tecnològic de Telecomunicacions de Catalunya (CTTC)" + email: david.pubill@cttc.cat + family-names: Pubill + given-names: David + - alias: antonioramosdet + family-names: Ramos + given-names: Antonio + - alias: jschindehette + email: jschindehette@geontech.com + family-names: Schindehette + given-names: Josh + - email: tonetto.dev@gmail.com + family-names: Tonetto + given-names: Leonardo +cff-version: "1.2.0" +date-released: "2021-08-23" +identifiers: + - description: "The concept DOI of the work. This is a DOI always pointing to the latest stable release." + type: doi + value: 10.5281/zenodo.591700 +keywords: + - "Global Navigation Satellite System" + - GNSS + - "software radio" + - SDR + - GPS + - Galileo + - C++ +license: GPL-3.0-or-later +message: "If you use this software, please cite it using the metadata from this file." +references: + - authors: + - family-names: "Fernández-Prades" + given-names: Carles + - family-names: "Vilà-Valls" + given-names: Jordi + - family-names: Arribas + given-names: Javier + - family-names: Ramos + given-names: Antonio + doi: 10.1109/ACCESS.2018.2822835 + issue: 1 + journal: "IEEE Access" + pages: 13 + start: 20451 + end: 20463 + scope: "Discussion on reproducibility in GNSS signal processing." + title: "Continuous Reproducibility in GNSS Signal Processing." + type: article + volume: 6 + year: 2018 + - authors: + - family-names: "Fernández-Prades" + given-names: Carles + - family-names: "Lo Presti" + given-names: Letizia + - family-names: Falleti + given-names: Emanuela + doi: 10.1109/JPROC.2011.2158032 + issue: 11 + journal: "Proceedigs of the IEEE" + month: 11 + pages: 23 + start: 1882 + end: 1904 + scope: "General overview on GNSS receiver technology." + title: "Satellite Radiolocalization From GPS to GNSS and Beyond: Novel Technologies and Applications for Civil Mass Market." + type: article + volume: 99 + year: 2011 + - authors: + - family-names: "Fernández-Prades" + given-names: Carles + - family-names: Arribas + given-names: Javier + - family-names: Majoral + given-names: Marc + - family-names: Ramos + given-names: Antonio + - family-names: "Vilà-Valls" + given-names: Jordi + - family-names: Giordano + given-names: Pietro + conference: + name: "Proc. 9th ESA Workshop on Satellite Navigation Technologies and European Workshop on GNSS Signals and Signal Processing (NAVITEC)" + doi: 10.1109/NAVITEC.2018.8642697 + location: + name: "ESA/ESTEC, Noordwijk, Netherlands." + month: 12 + pages: 9 + scope: "Space applications of the software-defined GNSS embeded receiver." + title: "A Software-Defined Spaceborne GNSS Receiver." + type: conference-paper + year: 2018 + - authors: + - family-names: "Fernández-Prades" + given-names: Carles + - family-names: Pomar + given-names: Christian + - family-names: Arribas + given-names: Javier + - family-names: Fàbrega + given-names: "Josep Maria" + - family-names: "Vilà-Valls" + given-names: Jordi + - family-names: "Svaluto Moreolo" + given-names: Michela + - family-names: Casellas + given-names: Ramon + - family-names: Martínez + given-names: Ricardo + - family-names: Navarro + given-names: Mònica + - family-names: Vílchez + given-names: "Francisco Javier" + - family-names: Muñoz + given-names: Raul + - family-names: Vilalta + given-names: Ricard + - family-names: Nadal + given-names: Laia + - family-names: Mayoral + given-names: Arturo + conference: + name: "Proc. 30th Int. Tech. Meeting Sat. Div. Inst. Navig." + doi: 10.33012/2017.15234 + location: + name: "Portland, OR." + month: 9 + scope: "Introduction of the virtualized GNSS receiver." + pages: 20 + start: 3796 + end: 3815 + title: "A Cloud Optical Access Network for Virtualized GNSS Receivers" + type: conference-paper + year: 2017 + - authors: + - family-names: "Fernández-Prades" + given-names: Carles + - family-names: Arribas + given-names: Javier + - family-names: Closas + given-names: Pau + conference: + name: "Proc. 8th ESA Workshop on Satellite Navigation Technologies and European Workshop on GNSS Signals and Signal Processing (NAVITEC)" + doi: 10.1109/NAVITEC.2016.7931740 + location: + name: "ESA/ESTEC, Noordwijk, Netherlands." + month: 12 + pages: 9 + scope: "Discussion on testing methodologies for software-defined GNSS receivers." + title: "Assessment of Software-Defined GNSS Receivers" + type: conference-paper + year: 2016 + - authors: + - family-names: "Fernández-Prades" + given-names: Carles + - family-names: Arribas + given-names: Javier + - family-names: Closas + given-names: Pau + conference: + name: "Proc. 29th Int. Tech. Meeting Sat. Div. Inst. Navig." + doi: 10.33012/2016.14576 + location: + name: "Portland, OR." + month: 9 + pages: 18 + start: 44 + end: 61 + scope: "Analysis of software strategies for accelerating signal processing." + title: "Accelerating GNSS Software Receivers" + type: conference-paper + year: 2016 + - authors: + - family-names: "Fernández-Prades" + given-names: Carles + - family-names: Arribas + given-names: Javier + - family-names: Closas + given-names: Pau + - family-names: Avilés + given-names: Carlos + - family-names: Esteve + given-names: Luis + conference: + name: "Proc. 24th Int. Tech. Meeting Sat. Div. Inst. Navig." + location: + name: "Portland, OR." + month: 9 + pages: 15 + start: 780 + end: 794 + scope: "General description of the software architecture." + title: "GNSS-SDR: An Open Source Tool For Researchers and Developers" + type: conference-paper + year: 2011 + - authors: + - family-names: "Fernández-Prades" + given-names: Carles + - family-names: Avilés + given-names: Carlos + - family-names: Esteve + given-names: Luis + - family-names: Arribas + given-names: Javier + - family-names: Closas + given-names: Pau + conference: + name: "Proc. 5th ESA Workshop on Satellite Navigation Technologies and European Workshop on GNSS Signals and Signal Processing (NAVITEC)." + doi: 10.1109/NAVITEC.2010.5707981 + location: + name: "ESA/ESTEC, Noordwijk, Netherlands." + month: 12 + pages: 8 + scope: "Seminal work on GNSS-SDR and its software design patterns." + title: "Design patterns for GNSS software receivers" + type: conference-paper + year: 2010 + - authors: + - name: "The GNU Radio Project team" + doi: 10.5281/zenodo.2704343 + repository-code: "https://github.com/gnuradio/gnuradio" + scope: "Software dependency: the SDR framework." + title: "GNU Radio: The Free & Open Software Radio Ecosystem" + type: software + url: "https://www.gnuradio.org" + - authors: + - name: "The VOLK Project team" + doi: 10.5281/zenodo.3360942 + repository-code: "https://github.com/gnuradio/volk" + scope: "Software dependency: the portable SIMD library." + title: "VOLK: The Vector-Optimized Library of Kernels" + type: software + url: "https://www.libvolk.org" +repository-code: "https://github.com/gnss-sdr/gnss-sdr" +title: GNSS-SDR +type: software +url: "https://gnss-sdr.org" +version: "0.0.15" From 82169db1f2f2d5941578169bb4b46c7ba93b1edd Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sun, 6 Feb 2022 11:16:19 +0100 Subject: [PATCH 20/50] Add Rocky Linux in README.md file --- README.md | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e0ece4a58..841700f5d 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,7 @@ information about this open-source, software-defined GNSS receiver. - [CentOS](#centos) - [Fedora](#fedora) - [OpenSUSE](#opensuse) + - [Rocky Linux](#rocky-linux) 1. [Alternative 2: Install dependencies using PyBOMBS](#alternative-2-install-dependencies-using-pybombs) - [Manual installation of other required dependencies](#manual-installation-of-other-required-dependencies) - [Armadillo](#install-armadillo-a-c-linear-algebra-library) @@ -244,7 +245,7 @@ Optionally, you can add `uhd-devel` starting from Fedora 32. If you are using openSUSE Leap: ``` -zypper install cmake git gcc-c++ boost-devel libboost_atomic-devel \ +$ zypper install cmake git gcc-c++ boost-devel libboost_atomic-devel \ libboost_system-devel libboost_filesystem-devel libboost_chrono-devel \ libboost_thread-devel libboost_serialization-devel log4cpp-devel \ gnuradio-devel pugixml-devel libpcap-devel armadillo-devel libtool \ @@ -254,7 +255,7 @@ zypper install cmake git gcc-c++ boost-devel libboost_atomic-devel \ If you are using openSUSE Tumbleweed: ``` -zypper install cmake git gcc-c++ boost-devel libboost_atomic-devel \ +$ zypper install cmake git gcc-c++ boost-devel libboost_atomic-devel \ libboost_system-devel libboost_filesystem-devel libboost_date_time-devel \ libboost_thread-devel libboost_chrono-devel libboost_serialization-devel \ spdlog-devel fmt-devel gtest gnuradio-devel pugixml-devel libpcap-devel \ @@ -265,6 +266,24 @@ zypper install cmake git gcc-c++ boost-devel libboost_atomic-devel \ Once you have installed these packages, you can jump directly to [download the source code and build GNSS-SDR](#download-and-build-linux). +#### Rocky Linux + +If you are using Rocky Linux: + +``` +$ dnf install -y 'dnf-command(config-manager)' +$ dnf config-manager --set-enabled powertools +$ yum install -y epel-release +$ yum install -y make gcc gcc-c++ kernel-devel cmake git boost-devel \ + boost-date-time boost-system boost-thread boost-chrono boost-serialization \ + log4cpp-devel gmp-devel uhd-devel gnuradio-devel pugixml-devel matio-devel \ + protobuf-devel glog-devel libpcap-devel blas-devel lapack-devel \ + armadillo-devel openssl-devel python3-mako libarchive +``` + +Once you have installed these packages, you can jump directly to +[download the source code and build GNSS-SDR](#download-and-build-linux). + ### Alternative 2: Install dependencies using PyBOMBS This option is adequate if you are interested in development, in working with From 378c72c81c762b3560af7e0975b083748e27dcc2 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sun, 6 Feb 2022 11:45:29 +0100 Subject: [PATCH 21/50] Update Contributor Covenant to version 2.1 --- CODE_OF_CONDUCT.md | 28 +++++++++++----------------- README.md | 2 +- docs/CHANGELOG.md | 7 ++++--- 3 files changed, 16 insertions(+), 21 deletions(-) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index f141ea6e2..fde3ab556 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -16,8 +16,8 @@ We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, -nationality, personal appearance, race, religion, or sexual identity and -orientation. +nationality, personal appearance, race, caste, color, religion, or sexual +identity and orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. @@ -64,13 +64,7 @@ This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed -representative at an online or offline event. This Code of Conduct applies both -within project spaces and in public spaces when an individual is representing -the project or its community. Examples of representing a project or community -include using an official project e-mail address, posting via an official social -media account, or acting as an appointed representative at an online or offline -event. Representation of a project may be further defined and clarified by -project maintainers. +representative at an online or offline event. ## Enforcement @@ -131,18 +125,18 @@ community. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], -version 2.0, available at -[https://www.contributor-covenant.org/version/2/0/code_of_conduct.html][version]. +version 2.1, available at +[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. -Community Impact Guidelines were inspired by [Mozilla's code of conduct -enforcement ladder][diversity]. +Community Impact Guidelines were inspired by +[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. For answers to common questions about this code of conduct, see the FAQ at -[https://www.contributor-covenant.org/faq][faq]. Translations are available at +[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at [https://www.contributor-covenant.org/translations][translations]. [homepage]: https://www.contributor-covenant.org -[diversity]: https://github.com/mozilla/diversity -[version]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html -[faq]: https://www.contributor-covenant.org/faq/ +[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html +[Mozilla CoC]: https://github.com/mozilla/diversity +[FAQ]: https://www.contributor-covenant.org/faq [translations]: https://www.contributor-covenant.org/translations diff --git a/README.md b/README.md index 841700f5d..1e80fcf0a 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ SPDX-FileCopyrightText: 2011-2021 Carles Fernandez-Prades Date: Sun, 6 Feb 2022 11:59:18 +0100 Subject: [PATCH 22/50] CI: fix prettier-markdown job --- CODE_OF_CONDUCT.md | 10 +++++----- docs/CHANGELOG.md | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index fde3ab556..0e7424f06 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -128,15 +128,15 @@ This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.1, available at [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. -Community Impact Guidelines were inspired by -[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder][mozilla coc]. For answers to common questions about this code of conduct, see the FAQ at -[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at +[https://www.contributor-covenant.org/faq][faq]. Translations are available at [https://www.contributor-covenant.org/translations][translations]. [homepage]: https://www.contributor-covenant.org [v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html -[Mozilla CoC]: https://github.com/mozilla/diversity -[FAQ]: https://www.contributor-covenant.org/faq +[mozilla coc]: https://github.com/mozilla/diversity +[faq]: https://www.contributor-covenant.org/faq [translations]: https://www.contributor-covenant.org/translations diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 94c82906b..da2140d93 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -57,8 +57,8 @@ All notable changes to GNSS-SDR will be documented in this file. - Fixed building against the new API in the gr-iio component present in GNU Radio v3.10.X.Y. -- Fixed building against GNU Radio v3.10.X.Y, which does not support the - C++20 standard. +- Fixed building against GNU Radio v3.10.X.Y, which does not support the C++20 + standard. - Fixed building against GNU Radio v3.10.X.Y, which replaced [log4cpp](http://log4cpp.sourceforge.net/) by [spdlog](https://github.com/gabime/spdlog) and From 53ef7a8ee91bd1d238bf735e8d6f04a96c43295b Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sun, 6 Feb 2022 12:04:26 +0100 Subject: [PATCH 23/50] Update local version of Protocol Buffers to 3.19.4 --- CMakeLists.txt | 2 +- README.md | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5aec88b89..19504f9a1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -337,7 +337,7 @@ set(GNSSSDR_GNSS_SIM_LOCAL_VERSION "master") set(GNSSSDR_GPSTK_LOCAL_VERSION "8.0.0") set(GNSSSDR_MATIO_LOCAL_VERSION "1.5.21") set(GNSSSDR_PUGIXML_LOCAL_VERSION "1.11.4") -set(GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION "3.19.0") +set(GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION "3.19.4") set(GNSSSDR_BENCHMARK_LOCAL_VERSION "1.6.1") set(GNSSSDR_MATHJAX_EXTERNAL_VERSION "2.7.7") diff --git a/README.md b/README.md index 1e80fcf0a..fa65e6356 100644 --- a/README.md +++ b/README.md @@ -489,9 +489,9 @@ $ sudo apt-get install autoconf automake libtool curl make g++ unzip and then: ``` -$ wget https://github.com/protocolbuffers/protobuf/releases/download/v3.18.0/protobuf-cpp-3.18.0.tar.gz -$ tar xvfz protobuf-cpp-3.18.0.tar.gz -$ cd protobuf-3.18.0 +$ wget https://github.com/protocolbuffers/protobuf/releases/download/v3.19.4/protobuf-cpp-3.19.4.tar.gz +$ tar xvfz protobuf-cpp-3.19.4.tar.gz +$ cd protobuf-3.19.4 $ ./autogen.sh $ ./configure $ make From 0e529cacc620d04cbdec3cac5b0a482a418ae66a Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sun, 6 Feb 2022 12:52:14 +0100 Subject: [PATCH 24/50] Add spdlog-devel and fmt-devel to Fedora requirements --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index fa65e6356..fec5aca90 100644 --- a/README.md +++ b/README.md @@ -240,6 +240,9 @@ $ sudo yum install make automake gcc gcc-c++ kernel-devel cmake git boost-devel In Fedora 33 and above, you will need to add `gmp-devel` to the package list. Optionally, you can add `uhd-devel` starting from Fedora 32. +In Fedora 36 and above, packages `spdlog-devel` and `fmt-devel` are also +required. + #### openSUSE If you are using openSUSE Leap: From 77c682e8b312c645d77e60289b0d67b33e67c633 Mon Sep 17 00:00:00 2001 From: Stefan van der Linden Date: Tue, 8 Feb 2022 12:51:51 +0100 Subject: [PATCH 25/50] Removed unnecessary buffer --- .../gnuradio_blocks/fifo_reader.cc | 92 +++---------------- .../gnuradio_blocks/fifo_reader.h | 42 +++++++-- 2 files changed, 45 insertions(+), 89 deletions(-) diff --git a/src/algorithms/signal_source/gnuradio_blocks/fifo_reader.cc b/src/algorithms/signal_source/gnuradio_blocks/fifo_reader.cc index 60bd54858..f12ed68b5 100644 --- a/src/algorithms/signal_source/gnuradio_blocks/fifo_reader.cc +++ b/src/algorithms/signal_source/gnuradio_blocks/fifo_reader.cc @@ -19,8 +19,6 @@ #include #include -const int FIFO_SIZE = 1472000; // Value taken from gr_complex_ip_packet_source, is it optimal? - // initial construction; pass to private constructor FifoReader::sptr FifoReader::make(const std::string &file_name, const std::string &sample_type) { @@ -33,10 +31,7 @@ FifoReader::FifoReader(const std::string &file_name, const std::string &sample_t gr::io_signature::make(0, 0, 0), // no input gr::io_signature::make(1, 1, sizeof(gr_complex))), // <+MIN_OUT+>, <+MAX_OUT+>, sizeof(<+OTYPE+>) file_name_(file_name), - sample_type_(sample_type), - fifo_buffer_(new char[FIFO_SIZE]), - buffer_idx_(0), - buffer_size_(0) + sample_type_(sample_type) { DLOG(INFO) << "Starting FifoReader"; } @@ -67,14 +62,17 @@ int FifoReader::work(int noutput_items, size_t items_retrieved = 0; if (sample_type_ == "ishort") { + // ishort == int16_t items_retrieved = read_interleaved(noutput_items, output_items); } else if (sample_type_ == "ibyte") // Does this also work with cbyte? { + // ibyte == int8_t items_retrieved = read_interleaved(noutput_items, output_items); } else if (sample_type_ == "gr_complex") { + // gr_complex == complex items_retrieved = read_gr_complex(noutput_items, output_items); } else @@ -89,91 +87,31 @@ int FifoReader::work(int noutput_items, } -template -size_t FifoReader::read_interleaved(int noutput_items, gr_vector_void_star &output_items) -{ - boost::mutex::scoped_lock lock(d_mutex); // hold mutex for duration of this function - size_t items_retrieved = 0; - int n; - Type real; - Type imag; - - if (buffer_idx_ >= buffer_size_) - { - fifo_.read(fifo_buffer_, FIFO_SIZE); - buffer_idx_ = 0; - if (fifo_.good()) - { - buffer_size_ = FIFO_SIZE; - } - else if (fifo_.eof()) - { - // Although we got an EOF, ensure we don't lose the other samples - buffer_size_ = fifo_.gcount(); - fifo_.clear(); - } - else - { - fifo_error_output(); - return 0; - } - } - - for (n = 0; n < noutput_items && buffer_idx_ < buffer_size_; n++) - { - memcpy(&real, &fifo_buffer_[buffer_idx_], sizeof(real)); - memcpy(&imag, &fifo_buffer_[buffer_idx_ + sizeof(imag)], sizeof(imag)); - static_cast(output_items.at(0))[n] = gr_complex(real, imag); - - buffer_idx_ += 2 * sizeof(Type); - } - - items_retrieved = n; - - return items_retrieved; -} - - // read gr_complex items from fifo -// this fct has duplicate code with the templated read_interleaved fct above +// this fct has duplicate code with the templated read_interleaved fct in header size_t FifoReader::read_gr_complex(int noutput_items, gr_vector_void_star &output_items) { - boost::mutex::scoped_lock lock(d_mutex); // hold mutex for duration of this function size_t items_retrieved = 0; - int n; - gr_complex sample; - - if (buffer_idx_ >= buffer_size_) + for (int n = 0; n < noutput_items; n++) { - fifo_.read(fifo_buffer_, FIFO_SIZE); - buffer_idx_ = 0; + gr_complex sample; + fifo_.read(reinterpret_cast(&sample), sizeof(sample)); if (fifo_.good()) { - buffer_size_ = FIFO_SIZE; + static_cast(output_items.at(0))[n] = sample; + items_retrieved++; } else if (fifo_.eof()) { - // Although we got an EOF, ensure we don't lose the other samples - buffer_size_ = fifo_.gcount(); fifo_.clear(); + break; } else { fifo_error_output(); - return 0; + break; } } - - for (n = 0; n < noutput_items && buffer_idx_ < buffer_size_; n++) - { - memcpy(&sample, &fifo_buffer_[buffer_idx_], sizeof(gr_complex)); - static_cast(output_items.at(0))[n] = sample; - - buffer_idx_ += sizeof(gr_complex); - } - - items_retrieved = n; - return items_retrieved; } @@ -181,9 +119,3 @@ void FifoReader::fifo_error_output() const { LOG(ERROR) << "unhandled FIFO event"; } - - -FifoReader::~FifoReader() -{ - delete[] fifo_buffer_; -} diff --git a/src/algorithms/signal_source/gnuradio_blocks/fifo_reader.h b/src/algorithms/signal_source/gnuradio_blocks/fifo_reader.h index c90a80448..276970191 100644 --- a/src/algorithms/signal_source/gnuradio_blocks/fifo_reader.h +++ b/src/algorithms/signal_source/gnuradio_blocks/fifo_reader.h @@ -19,7 +19,6 @@ #define GNSS_SDR_FIFO_READER_H_ #include "gnss_block_interface.h" -#include #include #include // std::ifstream #include @@ -35,6 +34,8 @@ public: using sptr = gnss_shared_ptr; static sptr make(const std::string &file_name, const std::string &sample_type); + ~FifoReader() = default; + //! initialize istream resource for FIFO bool start(); @@ -49,16 +50,42 @@ private: //! (gr handles this with public and private header pair) FifoReader(const std::string &file_name, const std::string &sample_type); - //! \brief Destructor - //! private destructor - ~FifoReader(); - size_t read_gr_complex(int noutput_items, gr_vector_void_star &output_items); //! function to read data out of FIFO which is stored as interleaved I/Q stream. //! template argument determines sample_type + // Note: template definition necessary in header file + // See also: https://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file template - size_t read_interleaved(int noutput_items, gr_vector_void_star &output_items); + size_t read_interleaved(int noutput_items, gr_vector_void_star &output_items) + { + size_t items_retrieved = 0; + for (int n = 0; n < noutput_items; n++) + { + // TODO: try if performance increases if we copy larger chunks to vector. + // how to read from stream: https://en.cppreference.com/w/cpp/io/basic_ifstream + std::array buffer; + fifo_.read(reinterpret_cast(buffer.data()), buffer.size()); + if (fifo_.good()) + { + auto real = reinterpret_cast(&buffer[0]); + auto imag = reinterpret_cast(&buffer[sizeof(Type)]); + static_cast(output_items[0])[n] = gr_complex(*real, *imag); + items_retrieved++; + } + else if (fifo_.eof()) + { + fifo_.clear(); + break; + } + else + { + fifo_error_output(); + break; + } + } + return items_retrieved; + } //! this function moves logging output from this header into the source file //! thereby eliminating the need to include glog/logging.h in this header @@ -67,9 +94,6 @@ private: const std::string file_name_; const std::string sample_type_; std::ifstream fifo_; - char *fifo_buffer_; - int buffer_idx_, buffer_size_; - boost::mutex d_mutex; }; /** \} */ From 20218290f7c9d626c4408ebbf6071e2096897db0 Mon Sep 17 00:00:00 2001 From: Stefan van der Linden Date: Tue, 8 Feb 2022 16:26:37 +0100 Subject: [PATCH 26/50] Removed unused include --- src/algorithms/signal_source/gnuradio_blocks/fifo_reader.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/src/algorithms/signal_source/gnuradio_blocks/fifo_reader.cc b/src/algorithms/signal_source/gnuradio_blocks/fifo_reader.cc index f12ed68b5..583fe6810 100644 --- a/src/algorithms/signal_source/gnuradio_blocks/fifo_reader.cc +++ b/src/algorithms/signal_source/gnuradio_blocks/fifo_reader.cc @@ -17,7 +17,6 @@ #include "fifo_reader.h" #include -#include // initial construction; pass to private constructor FifoReader::sptr FifoReader::make(const std::string &file_name, const std::string &sample_type) From 4d9a1f55439d64a9db359982679f182912711520 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Wed, 9 Feb 2022 08:54:46 +0100 Subject: [PATCH 27/50] Update local version of Pugixml to 1.12 --- CMakeLists.txt | 2 +- README.md | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 19504f9a1..9a0560556 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -336,7 +336,7 @@ endif() set(GNSSSDR_GNSS_SIM_LOCAL_VERSION "master") set(GNSSSDR_GPSTK_LOCAL_VERSION "8.0.0") set(GNSSSDR_MATIO_LOCAL_VERSION "1.5.21") -set(GNSSSDR_PUGIXML_LOCAL_VERSION "1.11.4") +set(GNSSSDR_PUGIXML_LOCAL_VERSION "1.12") set(GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION "3.19.4") set(GNSSSDR_BENCHMARK_LOCAL_VERSION "1.6.1") set(GNSSSDR_MATHJAX_EXTERNAL_VERSION "2.7.7") diff --git a/README.md b/README.md index fec5aca90..b804dc215 100644 --- a/README.md +++ b/README.md @@ -505,9 +505,9 @@ $ sudo ldconfig #### Install [Pugixml](https://pugixml.org/ "Pugixml's Homepage"), a light-weight C++ XML processing library: ``` -$ wget https://github.com/zeux/pugixml/releases/download/v1.11.4/pugixml-1.11.4.tar.gz -$ tar xvfz pugixml-1.11.4.tar.gz -$ cd pugixml-1.11.4 +$ wget https://github.com/zeux/pugixml/releases/download/v1.12/pugixml-1.12.tar.gz +$ tar xvfz pugixml-1.12.tar.gz +$ cd pugixml-1.12 $ mkdir build && cd build $ cmake .. $ make From 847e13e483d1df795ef3f96d43f50bd31d92c679 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Wed, 9 Feb 2022 15:13:48 +0100 Subject: [PATCH 28/50] Set default CMAKE_BUILD_TYPE to Release before project() --- CMakeLists.txt | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9a0560556..9a648dbb4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ # GNSS-SDR is a Global Navigation Satellite System software-defined receiver. # This file is part of GNSS-SDR. # -# SPDX-FileCopyrightText: 2010-2021 C. Fernandez-Prades cfernandez(at)cttc.es +# SPDX-FileCopyrightText: 2010-2022 C. Fernandez-Prades cfernandez(at)cttc.es # SPDX-License-Identifier: BSD-3-Clause ################################################################################ @@ -11,6 +11,11 @@ if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR}) message(FATAL_ERROR "Prevented in-tree build, it is bad practice.\nTry 'cd build && cmake ..' instead.") endif() +# Select the release build type by default to get optimization flags. +# This has to come before project() which otherwise initializes it. +# Build type can still be overridden by setting -DCMAKE_BUILD_TYPE= +set(CMAKE_BUILD_TYPE "Release" CACHE STRING "") + cmake_minimum_required(VERSION 2.8.12...3.22) project(gnss-sdr CXX C) list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/Modules) @@ -219,19 +224,9 @@ include(GnsssdrBuildTypes) # - O2WithASM: -O2 -g -save-temps # - O3WithASM: -O3 -g -save-temps # - ASAN: -Wall -Wextra -g -O2 -fsanitize=address -fno-omit-frame-pointer -if(NOT CMAKE_BUILD_TYPE) - if(ENABLE_GPERFTOOLS OR ENABLE_GPROF) - set(CMAKE_BUILD_TYPE "RelWithDebInfo") - message(STATUS "Build type not specified: defaulting to RelWithDebInfo.") - else() - set(CMAKE_BUILD_TYPE "Release") - message(STATUS "Build type not specified: defaulting to Release.") - endif() -else() - message(STATUS "Build type set to ${CMAKE_BUILD_TYPE}.") -endif() gnsssdr_check_build_type(${CMAKE_BUILD_TYPE}) -set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "") +message(STATUS "Build type set to ${CMAKE_BUILD_TYPE}.") + if(NOT (${CMAKE_BUILD_TYPE} STREQUAL "Release")) set(ENABLE_STRIP OFF) endif() From 0539fc36ed6e764a41e2bfd65e4713ea516d18ae Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Wed, 9 Feb 2022 20:58:53 +0100 Subject: [PATCH 29/50] Add Stefan to list of authors Update changelog --- AUTHORS | 1 + CITATION.cff | 4 ++++ docs/CHANGELOG.md | 15 +++++++++------ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/AUTHORS b/AUTHORS index 4d7536e6c..3c484720c 100644 --- a/AUTHORS +++ b/AUTHORS @@ -60,6 +60,7 @@ Marc Molina marc.molina.pena@gmail.com Contributor Marc Sales marcsales92@gmail.com Contributor Piyush Gupta piyush04111999@gmail.com Contributor Rodrigo Muñoz rodrigo.munoz@proteinlab.cl Contributor +Stefan van der Linden spvdlinden@gmail.com Contributor Carlos Paniego carpanie@hotmail.com Artwork # SPDX-License-Identifier: GPL-3.0-or-later diff --git a/CITATION.cff b/CITATION.cff index ec17ba99f..95d746ff3 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -97,6 +97,10 @@ authors: - email: tonetto.dev@gmail.com family-names: Tonetto given-names: Leonardo + - alias: stefanlinden + email: spvdlinden@gmail.com + family-name: "van der Linden" + given-names: Stefan cff-version: "1.2.0" date-released: "2021-08-23" identifiers: diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index da2140d93..2a25cd444 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -4,7 +4,7 @@ SPDX-License-Identifier: GPL-3.0-or-later ) [comment]: # ( -SPDX-FileCopyrightText: 2011-2021 Carles Fernandez-Prades +SPDX-FileCopyrightText: 2011-2022 Carles Fernandez-Prades ) @@ -40,14 +40,14 @@ All notable changes to GNSS-SDR will be documented in this file. memory management and source code readability. - Prefer initialization to assignment in constructors. This improves the readability of the code, could potentially increase performance, and allows - for easier detection of unused data members (see - https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md/#Rc-initialize). + for easier detection of unused data members (see the + [CppCoreGuidelines](https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md/#Rc-initialize)). Added the `cppcoreguidelines-prefer-member-initializer` clang-tidy check to enforce this policy. - Non-functional change: Fixed formatting defects detected by clang-format 13.0. - Non-functional change: Simplified flow graph disconnection. -- Updated GSL implementation to v0.40.0. See - https://github.com/gsl-lite/gsl-lite/releases/tag/v0.40.0 +- Updated GSL implementation to v0.40.0. See the + [gsl-lite release](https://github.com/gsl-lite/gsl-lite/releases/tag/v0.40.0). - CI - `cpplint` job on GitHub: Added the `build/include_what_you_use` filter for early detection of missing includes. - CI - `clang-tidy` job on GitHub: More robust detection of LLVM paths installed @@ -60,7 +60,7 @@ All notable changes to GNSS-SDR will be documented in this file. - Fixed building against GNU Radio v3.10.X.Y, which does not support the C++20 standard. - Fixed building against GNU Radio v3.10.X.Y, which replaced - [log4cpp](http://log4cpp.sourceforge.net/) by + [log4cpp](http://log4cpp.sourceforge.net/) by the [spdlog](https://github.com/gabime/spdlog) and [fmt](https://github.com/fmtlib/fmt) libraries. - Updated `cpu_features` library for improved processor detection. @@ -106,6 +106,9 @@ All notable changes to GNSS-SDR will be documented in this file. those requirements are not met in the configuration file. - Fixed program termination when using `File_Signal_Source` and extended integration times. +- The `Fifo_Signal_Source` Signal Source implementation learned to handle the + `ibyte` type. +- Added a `CITATION.cff` file. - Updated version of the Contributor Covenant to version 2.1. See the definitions of concepts and metrics at From 7a0259fb1d9fb3300668881177165691bd4cf16c Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Wed, 9 Feb 2022 21:15:19 +0100 Subject: [PATCH 30/50] Fix CITATION.cff file --- CITATION.cff | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CITATION.cff b/CITATION.cff index 95d746ff3..11eddf59f 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -99,7 +99,7 @@ authors: given-names: Leonardo - alias: stefanlinden email: spvdlinden@gmail.com - family-name: "van der Linden" + family-names: "van der Linden" given-names: Stefan cff-version: "1.2.0" date-released: "2021-08-23" From c5daae08f1b793ea4cc5363427af65ec98ad872c Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Thu, 10 Feb 2022 13:37:52 +0100 Subject: [PATCH 31/50] Add atan2 benchmark --- src/tests/benchmarks/CMakeLists.txt | 1 + src/tests/benchmarks/benchmark_atan2.cc | 57 +++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 src/tests/benchmarks/benchmark_atan2.cc diff --git a/src/tests/benchmarks/CMakeLists.txt b/src/tests/benchmarks/CMakeLists.txt index c5fddced7..680a616f5 100644 --- a/src/tests/benchmarks/CMakeLists.txt +++ b/src/tests/benchmarks/CMakeLists.txt @@ -102,6 +102,7 @@ add_benchmark(benchmark_copy) add_benchmark(benchmark_preamble core_system_parameters) add_benchmark(benchmark_detector core_system_parameters) add_benchmark(benchmark_reed_solomon core_system_parameters) +add_benchmark(benchmark_atan2 Gnuradio::runtime) if(has_std_plus_void) target_compile_definitions(benchmark_detector PRIVATE -DCOMPILER_HAS_STD_PLUS_VOID=1) diff --git a/src/tests/benchmarks/benchmark_atan2.cc b/src/tests/benchmarks/benchmark_atan2.cc new file mode 100644 index 000000000..543813785 --- /dev/null +++ b/src/tests/benchmarks/benchmark_atan2.cc @@ -0,0 +1,57 @@ +/*! + * \file benchmark_atan2.cc + * \brief Benchmark for atan2 implementations + * \author Carles Fernandez-Prades, 2022. cfernandez(at)cttc.es + * + * + * ----------------------------------------------------------------------------- + * + * GNSS-SDR is a Global Navigation Satellite System software-defined receiver. + * This file is part of GNSS-SDR. + * + * Copyright (C) 2022 (see AUTHORS file for a list of contributors) + * SPDX-License-Identifier: GPL-3.0-or-later + * + * ----------------------------------------------------------------------------- + */ + +#include +#include +#include +#include + +void bm_atan2(benchmark::State& state) +{ + std::random_device rd; + std::default_random_engine e2(rd()); + std::uniform_real_distribution<> dist(-1.0, 1.0); + + float a = dist(e2); + float b = dist(e2); + float c; + while (state.KeepRunning()) + { + c = std::atan2(a, b); + } +} + + +void bm_fast_atan2(benchmark::State& state) +{ + std::random_device rd; + std::default_random_engine e2(rd()); + std::uniform_real_distribution<> dist(-1.0, 1.0); + + float a = dist(e2); + float b = dist(e2); + float c; + while (state.KeepRunning()) + { + c = gr::fast_atan2f(a, b); + } +} + +BENCHMARK(bm_atan2); +BENCHMARK(bm_fast_atan2); + +BENCHMARK_MAIN(); From df1820e98e02fe9ddb35fe07e9e64eda3efb9f13 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Thu, 10 Feb 2022 15:15:35 +0100 Subject: [PATCH 32/50] Get PVT fixes from a standalone Galileo E5b receiver --- README.md | 6 ++++-- docs/CHANGELOG.md | 2 ++ src/algorithms/PVT/libs/rtklib_solver.cc | 17 +++++++++++++++-- .../libs/rtklib/rtklib_conversions.cc | 4 ++++ 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index b804dc215..13904c1d8 100644 --- a/README.md +++ b/README.md @@ -36,8 +36,9 @@ In the L2 band: In the L5 band: -- 🛰 GPS L5 (centered at 1176.45 MHz) :white_check_mark: -- 🛰 Galileo E5a (centered at 1176.45 MHz) :white_check_mark: +- 🛰 Galileo E5b (centered at 1207.140 MHz) :white_check_mark: +- 🛰 Galileo E5a (centered at 1176.450 MHz) :white_check_mark: +- 🛰 GPS L5 (centered at 1176.450 MHz) :white_check_mark: GNSS-SDR provides interfaces for a wide range of radio frequency front-ends and raw sample file formats, generates processing outputs in standard formats, @@ -1662,6 +1663,7 @@ identifiers: | Glonass L2 C/A | 2G | | GPS L5 | L5 | | Galileo E5a | 5X | +| Galileo E5b | 7X | Example: Eight GPS L1 C/A channels. diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 2a25cd444..f284f6248 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -16,6 +16,8 @@ All notable changes to GNSS-SDR will be documented in this file. ### Improvements in Availability: +- Added the Galileo E5b receiving chain. The software is now able to compute PVT + solutions as a standalone Galileo E5b receiver. - Improved Time-To-First-Fix when using GPS L1 C/A signals, fixing a bug that was making the receiver to drop the satellite if the PLL got locked at 180 degrees, and making some optimizations on bit transition detection. diff --git a/src/algorithms/PVT/libs/rtklib_solver.cc b/src/algorithms/PVT/libs/rtklib_solver.cc index e239c2686..bfa3bd52b 100644 --- a/src/algorithms/PVT/libs/rtklib_solver.cc +++ b/src/algorithms/PVT/libs/rtklib_solver.cc @@ -406,6 +406,7 @@ bool Rtklib_Solver::get_PVT(const std::map &gnss_observables_ bool gps_dual_band = false; bool band1 = false; bool band2 = false; + bool gal_e5_is_e5b = false; for (gnss_observables_iter = gnss_observables_map.cbegin(); gnss_observables_iter != gnss_observables_map.cend(); ++gnss_observables_iter) @@ -468,7 +469,7 @@ bool Rtklib_Solver::get_PVT(const std::map &gnss_observables_ } // Galileo E5 - if (sig_ == "5X") + if ((sig_ == "5X") || (sig_ == "7X")) { // 1 Gal - find the ephemeris for the current GALILEO SV observation. The SV PRN ID is the map key galileo_ephemeris_iter = galileo_ephemeris_map.find(gnss_observables_iter->second.PRN); @@ -508,6 +509,10 @@ bool Rtklib_Solver::get_PVT(const std::map &gnss_observables_ { DLOG(INFO) << "No ephemeris data for SV " << gnss_observables_iter->second.PRN; } + if (sig_ == "7X") + { + gal_e5_is_e5b = true; + } } break; } @@ -874,7 +879,15 @@ bool Rtklib_Solver::get_PVT(const std::map &gnss_observables_ { for (int j = 0; j < NFREQ; j++) { - nav_data.lam[i][j] = satwavelen(i + 1, j, &nav_data); + if (j == 2 && gal_e5_is_e5b) + { + // frq = 4 corresponds to E5B in that function + nav_data.lam[i][j] = satwavelen(i + 1, 4, &nav_data); + } + else + { + nav_data.lam[i][j] = satwavelen(i + 1, j, &nav_data); + } } } diff --git a/src/algorithms/libs/rtklib/rtklib_conversions.cc b/src/algorithms/libs/rtklib/rtklib_conversions.cc index e7a088941..45eacabcb 100644 --- a/src/algorithms/libs/rtklib/rtklib_conversions.cc +++ b/src/algorithms/libs/rtklib/rtklib_conversions.cc @@ -71,6 +71,10 @@ obsd_t insert_obs_to_rtklib(obsd_t& rtklib_obs, const Gnss_Synchro& gnss_synchro break; case 'E': rtklib_obs.sat = gnss_synchro.PRN + NSATGPS + NSATGLO; + if (sig_ == "7X") + { + rtklib_obs.code[band] = static_cast(CODE_L7X); + } break; case 'R': rtklib_obs.sat = gnss_synchro.PRN + NSATGPS; From 322deecee8190e1e55d79daa16b7cd6c4f20d99a Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Thu, 10 Feb 2022 15:29:51 +0100 Subject: [PATCH 33/50] Replace std::atan2 by gr::fast_atan2f in the phase discriminator --- src/algorithms/tracking/libs/CMakeLists.txt | 3 ++- src/algorithms/tracking/libs/tracking_discriminators.cc | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/algorithms/tracking/libs/CMakeLists.txt b/src/algorithms/tracking/libs/CMakeLists.txt index 24e6e73ca..65dda2ca4 100644 --- a/src/algorithms/tracking/libs/CMakeLists.txt +++ b/src/algorithms/tracking/libs/CMakeLists.txt @@ -78,7 +78,7 @@ else() add_library(tracking_libs ${TRACKING_LIB_SOURCES} ${TRACKING_LIB_HEADERS}) endif() -target_link_libraries(tracking_libs + target_link_libraries(tracking_libs PUBLIC Armadillo::armadillo Boost::headers @@ -89,6 +89,7 @@ target_link_libraries(tracking_libs PRIVATE gnss_sdr_flags Glog::glog + Gnuradio::runtime ) if(ENABLE_CUDA) diff --git a/src/algorithms/tracking/libs/tracking_discriminators.cc b/src/algorithms/tracking/libs/tracking_discriminators.cc index 39917c3a0..cc9a38c98 100644 --- a/src/algorithms/tracking/libs/tracking_discriminators.cc +++ b/src/algorithms/tracking/libs/tracking_discriminators.cc @@ -20,6 +20,7 @@ #include "tracking_discriminators.h" #include "MATH_CONSTANTS.h" +#include // All the outputs are in RADIANS @@ -53,7 +54,7 @@ double fll_four_quadrant_atan(gr_complex prompt_s1, gr_complex prompt_s2, double { const float dot = prompt_s1.real() * prompt_s2.real() + prompt_s1.imag() * prompt_s2.imag(); const float cross = prompt_s1.real() * prompt_s2.imag() - prompt_s2.real() * prompt_s1.imag(); - return std::atan2(cross, dot) / (t2 - t1); + return static_cast(gr::fast_atan2f(cross, dot) / (t2 - t1)); } @@ -84,7 +85,7 @@ double fll_diff_atan(gr_complex prompt_s1, gr_complex prompt_s2, double t1, doub */ double pll_four_quadrant_atan(gr_complex prompt_s1) { - return static_cast(std::atan2(prompt_s1.imag(), prompt_s1.real())); + return static_cast(gr::fast_atan2f(prompt_s1.imag(), prompt_s1.real())); } From c7de901d45c18240197fd85776987453aae9f96d Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Thu, 10 Feb 2022 19:44:29 +0100 Subject: [PATCH 34/50] Give more descriptive names to atan2 benchmark. Avoid unused-but-set-variable warning --- src/tests/benchmarks/benchmark_atan2.cc | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/tests/benchmarks/benchmark_atan2.cc b/src/tests/benchmarks/benchmark_atan2.cc index 543813785..0d64f0070 100644 --- a/src/tests/benchmarks/benchmark_atan2.cc +++ b/src/tests/benchmarks/benchmark_atan2.cc @@ -20,7 +20,7 @@ #include #include -void bm_atan2(benchmark::State& state) +void bm_std_atan2(benchmark::State& state) { std::random_device rd; std::default_random_engine e2(rd()); @@ -33,10 +33,14 @@ void bm_atan2(benchmark::State& state) { c = std::atan2(a, b); } + if (c > 1.0) + { + // Avoid unused-but-set-variable warning + } } -void bm_fast_atan2(benchmark::State& state) +void bm_gr_fast_atan2f(benchmark::State& state) { std::random_device rd; std::default_random_engine e2(rd()); @@ -49,9 +53,13 @@ void bm_fast_atan2(benchmark::State& state) { c = gr::fast_atan2f(a, b); } + if (c > 1.0) + { + // Avoid unused-but-set-variable warning + } } -BENCHMARK(bm_atan2); -BENCHMARK(bm_fast_atan2); +BENCHMARK(bm_std_atan2); +BENCHMARK(bm_gr_fast_atan2f); BENCHMARK_MAIN(); From 4effe76fa901acf170c74d3c92aa97a558f9330f Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Fri, 11 Feb 2022 13:34:12 +0100 Subject: [PATCH 35/50] Update LimeSDR configuration example --- conf/gnss-sdr_GPS_L1_LimeSDR.conf | 42 ++++++++++++++----------------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/conf/gnss-sdr_GPS_L1_LimeSDR.conf b/conf/gnss-sdr_GPS_L1_LimeSDR.conf index 98df86cf8..1abf31fab 100644 --- a/conf/gnss-sdr_GPS_L1_LimeSDR.conf +++ b/conf/gnss-sdr_GPS_L1_LimeSDR.conf @@ -6,9 +6,6 @@ [GNSS-SDR] ;######### GLOBAL OPTIONS ################## -;internal_fs_sps: Internal signal sampling frequency after the signal conditioning stage [samples per second]. -;FOR USE GNSS-SDR WITH RTLSDR DONGLES USER MUST SET THE CALIBRATED SAMPLE RATE HERE -; i.e. using front-end-cal as reported here:http://www.cttc.es/publication/turning-a-television-into-a-gnss-receiver/ GNSS-SDR.internal_fs_sps=5000000 GNSS-SDR.use_acquisition_resampler=true @@ -17,19 +14,17 @@ SignalSource.implementation=Limesdr_Signal_Source SignalSource.item_type=gr_complex SignalSource.sampling_frequency=5000000 SignalSource.freq=1575420000 -SignalSource.gain=50; //0-73 dB//no agc in LimeSDR -;SignalSource.analog_bw //if not set, defaults to sample_rate/2 -;SignalSource.digital_bw // if not set, defaults to 0 (disabled filter) -SignalSource.limesdr_serial // if not set, its automatic -SignalSource.antenna=2 // None(0), LNAH(1), LNAL(2), LNAW(3), AUTO(255) -SignalSource.ext_clock_MHz_=0 //0 -> internal clock -SignalSource.PPS_mode=false; //requires special gr-limesdr -SignalSource.limechannel_mode = 0; //ChannelMode must be A(0), B(1) or (A+B) MIMO(2)" +SignalSource.gain=50 ; 0-73 dB no AGC in LimeSDR +; SignalSource.analog_bw ; if not set, defaults to sample_rate/2 +; SignalSource.digital_bw ; if not set, defaults to 0 (disabled filter) +; SignalSource.limesdr_serial ; if not set, its automatic +SignalSource.antenna=2 ; None(0), LNAH(1), LNAL(2), LNAW(3), AUTO(255) +SignalSource.ext_clock_MHz=0 ; 0 -> internal clock +SignalSource.limechannel_mode=0 ; A(0), B(1) or (A+B) MIMO(2)" SignalSource.samples=0 SignalSource.repeat=false SignalSource.dump=false -SignalSource.dump_filename=../data/signal_source.dat -SignalSource.enable_throttle_control=false +SignalSource.dump_filename=./captured_signal.dat SignalConditioner.implementation=Signal_Conditioner DataTypeAdapter.implementation=Pass_Through @@ -37,6 +32,7 @@ InputFilter.implementation=Pulse_Blanking_Filter ; <- Required in some locations InputFilter.pfa=0.001 InputFilter.segments_est=2500 Resampler.implementation=Pass_Through + ;######### CHANNELS GLOBAL CONFIG ############ Channels_1C.count=7 Channels_1B.count=0 @@ -44,22 +40,20 @@ Channels.in_acquisition=1 Channel.signal=1C -;######### ACQUISITION GLOBAL CONFIG ############ +;######### GPS L1 ACQUISITION CONFIG ############ Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition Acquisition_1C.item_type=gr_complex Acquisition_1C.coherent_integration_time_ms=1 -Acquisition_1C.use_CFAR_algorithm=false; -Acquisition_1C.threshold=2.4 +Acquisition_1C.pfa=0.01 Acquisition_1C.doppler_max=6000 Acquisition_1C.doppler_step=250 Acquisition_1C.dump=false Acquisition_1C.dump_filename=./acq_dump.dat -;######### GALILEO ACQUISITION CONFIG ############ +;######### GALILEO E1 ACQUISITION CONFIG ############ Acquisition_1B.implementation=Galileo_E1_PCPS_Ambiguous_Acquisition Acquisition_1B.item_type=gr_complex -Acquisition_1B.threshold=2.5 -Acquisition_1B.use_CFAR_algorithm=false +Acquisition_1C.pfa=0.01 Acquisition_1B.blocking=false Acquisition_1B.doppler_max=6000 Acquisition_1B.doppler_step=125 @@ -67,7 +61,7 @@ Acquisition_1B.dump=false Acquisition_1B.dump_filename=./acq_dump.dat -;######### TRACKING GLOBAL CONFIG ############ +;######### GPS L1 TRACKING CONFIG ############ Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_Tracking Tracking_1C.item_type=gr_complex Tracking_1C.dump=false @@ -81,7 +75,7 @@ Tracking_1C.order=3; Tracking_1C.early_late_space_chips=0.5; Tracking_1C.early_late_space_narrow_chips=0.5 -;######### TRACKING GALILEO CONFIG ############ +;######### GALILEO E1 TRACKING CONFIG ############ Tracking_1B.implementation=Galileo_E1_DLL_PLL_VEML_Tracking Tracking_1B.item_type=gr_complex Tracking_1B.pll_bw_hz=15.0; @@ -93,20 +87,22 @@ Tracking_1B.dll_bw_narrow_hz=0.5 Tracking_1B.extend_correlation_symbols=1 Tracking_1B.track_pilot=true Tracking_1B.enable_fll_pull_in=true; -;Tracking_1B.pull_in_time_s=60 +; Tracking_1B.pull_in_time_s=60 Tracking_1B.enable_fll_steady_state=false Tracking_1B.fll_bw_hz=10 Tracking_1B.dump=false Tracking_1B.dump_filename=tracking_ch_ -;######### TELEMETRY DECODER GPS CONFIG ############ +;######### TELEMETRY DECODER GPS L1 CONFIG ############ TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder TelemetryDecoder_1C.dump=false +;######### TELEMETRY DECODER Galileo E1 CONFIG ############ TelemetryDecoder_1B.implementation=Galileo_E1B_Telemetry_Decoder TelemetryDecoder_1B.dump=false + ;######### OBSERVABLES CONFIG ############ Observables.implementation=Hybrid_Observables Observables.dump=false From c54c4a5221736017380b68a4aa8a43557e855904 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sat, 12 Feb 2022 11:09:21 +0100 Subject: [PATCH 36/50] Fix some typos --- conf/gnss-sdr_GPS_L1_LimeSDR.conf | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/conf/gnss-sdr_GPS_L1_LimeSDR.conf b/conf/gnss-sdr_GPS_L1_LimeSDR.conf index 1abf31fab..c2a6b5019 100644 --- a/conf/gnss-sdr_GPS_L1_LimeSDR.conf +++ b/conf/gnss-sdr_GPS_L1_LimeSDR.conf @@ -20,7 +20,7 @@ SignalSource.gain=50 ; 0-73 dB no AGC in LimeSDR ; SignalSource.limesdr_serial ; if not set, its automatic SignalSource.antenna=2 ; None(0), LNAH(1), LNAL(2), LNAW(3), AUTO(255) SignalSource.ext_clock_MHz=0 ; 0 -> internal clock -SignalSource.limechannel_mode=0 ; A(0), B(1) or (A+B) MIMO(2)" +SignalSource.limechannel_mode=0 ; A(0), B(1) or (A+B) MIMO(2) SignalSource.samples=0 SignalSource.repeat=false SignalSource.dump=false @@ -45,7 +45,7 @@ Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition Acquisition_1C.item_type=gr_complex Acquisition_1C.coherent_integration_time_ms=1 Acquisition_1C.pfa=0.01 -Acquisition_1C.doppler_max=6000 +Acquisition_1C.doppler_max=5000 Acquisition_1C.doppler_step=250 Acquisition_1C.dump=false Acquisition_1C.dump_filename=./acq_dump.dat @@ -53,9 +53,10 @@ Acquisition_1C.dump_filename=./acq_dump.dat ;######### GALILEO E1 ACQUISITION CONFIG ############ Acquisition_1B.implementation=Galileo_E1_PCPS_Ambiguous_Acquisition Acquisition_1B.item_type=gr_complex -Acquisition_1C.pfa=0.01 +Acquisition_1B.coherent_integration_time_ms=4 +Acquisition_1B.pfa=0.01 Acquisition_1B.blocking=false -Acquisition_1B.doppler_max=6000 +Acquisition_1B.doppler_max=5000 Acquisition_1B.doppler_step=125 Acquisition_1B.dump=false Acquisition_1B.dump_filename=./acq_dump.dat From aa5f9697b7c0a71c0180c3c00511d7526269545f Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sun, 13 Feb 2022 20:13:20 +0100 Subject: [PATCH 37/50] Bump version number to 0.0.16 --- CITATION.cff | 4 ++-- CMakeLists.txt | 6 +++--- docs/CHANGELOG.md | 2 +- docs/manpage/gnss-sdr-manpage | 2 +- .../libs/volk_gnsssdr_module/volk_gnsssdr/CMakeLists.txt | 2 +- .../cmake/Packaging/volk_gnsssdr-config-info-manpage | 2 +- .../cmake/Packaging/volk_gnsssdr_profile-manpage | 2 +- src/main/main.cc | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/CITATION.cff b/CITATION.cff index 11eddf59f..35e0246e6 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -102,7 +102,7 @@ authors: family-names: "van der Linden" given-names: Stefan cff-version: "1.2.0" -date-released: "2021-08-23" +date-released: "2022-02-14" identifiers: - description: "The concept DOI of the work. This is a DOI always pointing to the latest stable release." type: doi @@ -326,4 +326,4 @@ repository-code: "https://github.com/gnss-sdr/gnss-sdr" title: GNSS-SDR type: software url: "https://gnss-sdr.org" -version: "0.0.15" +version: "0.0.16" diff --git a/CMakeLists.txt b/CMakeLists.txt index 9a648dbb4..ceebcde7f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -130,7 +130,7 @@ option(ENABLE_ORC "Use (if available) the Optimized Inner Loop Runtime Compiler ################################################################################ # GNSS-SDR version information ################################################################################ -set(THIS_IS_A_RELEASE OFF) # only related to version name, no further implications. +set(THIS_IS_A_RELEASE ON) # only related to version name, no further implications. if(NOT ${THIS_IS_A_RELEASE}) find_package(Git) set_package_properties(Git PROPERTIES @@ -166,9 +166,9 @@ endif() set(VERSION_INFO_MAJOR_VERSION 0) set(VERSION_INFO_API_COMPAT 0) if(${THIS_IS_A_RELEASE}) - set(VERSION_INFO_MINOR_VERSION 15) + set(VERSION_INFO_MINOR_VERSION 16) else() - set(VERSION_INFO_MINOR_VERSION 15.git-${GIT_BRANCH}-${GIT_COMMIT_HASH}) + set(VERSION_INFO_MINOR_VERSION 16.git-${GIT_BRANCH}-${GIT_COMMIT_HASH}) endif() set(VERSION ${VERSION_INFO_MAJOR_VERSION}.${VERSION_INFO_API_COMPAT}.${VERSION_INFO_MINOR_VERSION}) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index f284f6248..f8f883c3d 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -12,7 +12,7 @@ SPDX-FileCopyrightText: 2011-2022 Carles Fernandez-Prades .\" Contact carles.fernandez@cttc.es to correct errors or typos. -.TH gnss\-sdr 1 "23 Aug 2021" "0.0.15" "gnss\-sdr man page" +.TH gnss\-sdr 1 "14 Feb 2022" "0.0.16" "gnss\-sdr man page" .SH NAME \fBgnss\-sdr\fR \- GNSS Software Defined Receiver. .SH SYNOPSIS diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/CMakeLists.txt b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/CMakeLists.txt index 80e8d283f..bc0774e34 100644 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/CMakeLists.txt +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/CMakeLists.txt @@ -209,7 +209,7 @@ message(STATUS "Build type set to ${CMAKE_BUILD_TYPE}.") set(VERSION_INFO_MAJOR_VERSION 0) set(VERSION_INFO_MINOR_VERSION 0) -set(VERSION_INFO_MAINT_VERSION 15) +set(VERSION_INFO_MAINT_VERSION 16) include(VolkGnsssdrVersion) # setup version info diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cmake/Packaging/volk_gnsssdr-config-info-manpage b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cmake/Packaging/volk_gnsssdr-config-info-manpage index 94d3ca45e..b5d10e547 100644 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cmake/Packaging/volk_gnsssdr-config-info-manpage +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cmake/Packaging/volk_gnsssdr-config-info-manpage @@ -2,7 +2,7 @@ .\" SPDX-License-Identifier: GPL-3.0-or-later .\" SPDX-FileCopyrightText: Carles Fernandez-Prades .\" Contact carles.fernandez@cttc.es to correct errors or typos. -.TH volk_gnsssdr\-config\-info 1 "23 Aug 2021" "0.0.15" "volk_gnsssdr\-config\-info man page" +.TH volk_gnsssdr\-config\-info 1 "14 Feb 2022" "0.0.16" "volk_gnsssdr\-config\-info man page" .SH NAME \fBvolk_gnsssdr\-config\-info\fR \- Prints configuration information of libvolk_gnsssdr functions. .SH SYNOPSIS diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cmake/Packaging/volk_gnsssdr_profile-manpage b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cmake/Packaging/volk_gnsssdr_profile-manpage index 440fb492a..7915f790b 100644 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cmake/Packaging/volk_gnsssdr_profile-manpage +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cmake/Packaging/volk_gnsssdr_profile-manpage @@ -2,7 +2,7 @@ .\" SPDX-License-Identifier: GPL-3.0-or-later .\" SPDX-FileCopyrightText: Carles Fernandez-Prades .\" Contact carles.fernandez@cttc.es to correct errors or typos. -.TH volk_gnsssdr_profile 1 "23 Aug 2021" "0.0.15" "volk_gnsssdr_profile man page" +.TH volk_gnsssdr_profile 1 "14 Feb 2022" "0.0.16" "volk_gnsssdr_profile man page" .SH NAME \fBvolk_gnsssdr_profile\fR \- Profiler application for libvolk_gnsssdr functions. .SH SYNOPSIS diff --git a/src/main/main.cc b/src/main/main.cc index 544b7b444..05b84eed1 100644 --- a/src/main/main.cc +++ b/src/main/main.cc @@ -18,7 +18,7 @@ */ #ifndef GNSS_SDR_VERSION -#define GNSS_SDR_VERSION "0.0.15" +#define GNSS_SDR_VERSION "0.0.16" #endif #ifndef GOOGLE_STRIP_LOG From ad9add84269a478e0d783a3b771eb28300b9d0cb Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sun, 13 Feb 2022 21:18:31 +0100 Subject: [PATCH 38/50] Fix indentation --- src/algorithms/tracking/libs/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/algorithms/tracking/libs/CMakeLists.txt b/src/algorithms/tracking/libs/CMakeLists.txt index 65dda2ca4..b8e80cd37 100644 --- a/src/algorithms/tracking/libs/CMakeLists.txt +++ b/src/algorithms/tracking/libs/CMakeLists.txt @@ -78,7 +78,7 @@ else() add_library(tracking_libs ${TRACKING_LIB_SOURCES} ${TRACKING_LIB_HEADERS}) endif() - target_link_libraries(tracking_libs +target_link_libraries(tracking_libs PUBLIC Armadillo::armadillo Boost::headers From cf91334d664e1236f441fca3377b289b47bf94ad Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Tue, 15 Feb 2022 11:31:35 +0100 Subject: [PATCH 39/50] Fix navdata_monitor extraction of FNAV message data --- .../galileo_telemetry_decoder_gs.cc | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_telemetry_decoder_gs.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_telemetry_decoder_gs.cc index d06fefae6..8c259691f 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_telemetry_decoder_gs.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_telemetry_decoder_gs.cc @@ -1003,18 +1003,18 @@ int galileo_telemetry_decoder_gs::general_work(int noutput_items __attribute__(( { d_TOW_at_current_symbol_ms += static_cast(GALILEO_FNAV_CODES_PER_SYMBOL * GALILEO_E5A_CODE_PERIOD_MS); } - if (d_enable_navdata_monitor && !d_nav_msg_packet.nav_message.empty()) - { - d_nav_msg_packet.system = std::string(1, current_symbol.System); - d_nav_msg_packet.signal = std::string(current_symbol.Signal); - d_nav_msg_packet.prn = static_cast(current_symbol.PRN); - d_nav_msg_packet.tow_at_current_symbol_ms = static_cast(d_TOW_at_current_symbol_ms); - const std::shared_ptr tmp_obj = std::make_shared(d_nav_msg_packet); - this->message_port_pub(pmt::mp("Nav_msg_from_TLM"), pmt::make_any(tmp_obj)); - d_nav_msg_packet.nav_message = ""; - } - break; } + if (d_enable_navdata_monitor && !d_nav_msg_packet.nav_message.empty()) + { + d_nav_msg_packet.system = std::string(1, current_symbol.System); + d_nav_msg_packet.signal = std::string(current_symbol.Signal); + d_nav_msg_packet.prn = static_cast(current_symbol.PRN); + d_nav_msg_packet.tow_at_current_symbol_ms = static_cast(d_TOW_at_current_symbol_ms); + const std::shared_ptr tmp_obj = std::make_shared(d_nav_msg_packet); + this->message_port_pub(pmt::mp("Nav_msg_from_TLM"), pmt::make_any(tmp_obj)); + d_nav_msg_packet.nav_message = ""; + } + break; } case 3: // CNAV { From 70a4eda4d41da8ef60b4b9c0386259a5fe2573d2 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Tue, 15 Feb 2022 12:07:35 +0100 Subject: [PATCH 40/50] Bump release date --- docs/CHANGELOG.md | 2 +- docs/manpage/gnss-sdr-manpage | 2 +- .../cmake/Packaging/volk_gnsssdr-config-info-manpage | 2 +- .../volk_gnsssdr/cmake/Packaging/volk_gnsssdr_profile-manpage | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index f8f883c3d..77cc00563 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -12,7 +12,7 @@ SPDX-FileCopyrightText: 2011-2022 Carles Fernandez-Prades .\" Contact carles.fernandez@cttc.es to correct errors or typos. -.TH gnss\-sdr 1 "14 Feb 2022" "0.0.16" "gnss\-sdr man page" +.TH gnss\-sdr 1 "15 Feb 2022" "0.0.16" "gnss\-sdr man page" .SH NAME \fBgnss\-sdr\fR \- GNSS Software Defined Receiver. .SH SYNOPSIS diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cmake/Packaging/volk_gnsssdr-config-info-manpage b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cmake/Packaging/volk_gnsssdr-config-info-manpage index b5d10e547..97b1f6096 100644 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cmake/Packaging/volk_gnsssdr-config-info-manpage +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cmake/Packaging/volk_gnsssdr-config-info-manpage @@ -2,7 +2,7 @@ .\" SPDX-License-Identifier: GPL-3.0-or-later .\" SPDX-FileCopyrightText: Carles Fernandez-Prades .\" Contact carles.fernandez@cttc.es to correct errors or typos. -.TH volk_gnsssdr\-config\-info 1 "14 Feb 2022" "0.0.16" "volk_gnsssdr\-config\-info man page" +.TH volk_gnsssdr\-config\-info 1 "15 Feb 2022" "0.0.16" "volk_gnsssdr\-config\-info man page" .SH NAME \fBvolk_gnsssdr\-config\-info\fR \- Prints configuration information of libvolk_gnsssdr functions. .SH SYNOPSIS diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cmake/Packaging/volk_gnsssdr_profile-manpage b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cmake/Packaging/volk_gnsssdr_profile-manpage index 7915f790b..3303347a1 100644 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cmake/Packaging/volk_gnsssdr_profile-manpage +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cmake/Packaging/volk_gnsssdr_profile-manpage @@ -2,7 +2,7 @@ .\" SPDX-License-Identifier: GPL-3.0-or-later .\" SPDX-FileCopyrightText: Carles Fernandez-Prades .\" Contact carles.fernandez@cttc.es to correct errors or typos. -.TH volk_gnsssdr_profile 1 "14 Feb 2022" "0.0.16" "volk_gnsssdr_profile man page" +.TH volk_gnsssdr_profile 1 "15 Feb 2022" "0.0.16" "volk_gnsssdr_profile man page" .SH NAME \fBvolk_gnsssdr_profile\fR \- Profiler application for libvolk_gnsssdr functions. .SH SYNOPSIS From 7df5c3118ca10222d7e3705f47b2ec850efd5319 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Tue, 15 Feb 2022 13:28:29 +0100 Subject: [PATCH 41/50] Fix incorrect spelling --- src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc | 2 +- src/algorithms/PVT/libs/rinex_printer.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc index f0c039506..b9dfff0ab 100644 --- a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc +++ b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc @@ -1698,7 +1698,7 @@ void rtklib_pvt_gs::log_source_timetag_info(double RX_time_ns, double TAG_time_n } catch (const std::exception& e) { - std::cerr << "Problem writting at the log PVT timetag metadata file: " << e.what() << '\n'; + std::cerr << "Problem writing at the log PVT timetag metadata file: " << e.what() << '\n'; } } } diff --git a/src/algorithms/PVT/libs/rinex_printer.h b/src/algorithms/PVT/libs/rinex_printer.h index 6ffeca87f..e0e68a780 100644 --- a/src/algorithms/PVT/libs/rinex_printer.h +++ b/src/algorithms/PVT/libs/rinex_printer.h @@ -98,7 +98,7 @@ public: * \brief Print RINEX annotation. If it is the first annotation, it also * prints the RINEX headers for navigation and observation files. If it is * not the first annotation, it only annotates the observation, and updates - * the navigation header if UTC data was not available when writting it for + * the navigation header if UTC data was not available when writing it for * the first time. The meaning of type_of_rx is as follows: * * type_of_rx | Signals From d58720ea5808ae653d3fd8b9dbcfe88554ede89a Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Tue, 15 Feb 2022 14:21:55 +0100 Subject: [PATCH 42/50] The action continues at the next branch --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ceebcde7f..ad52e1a26 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -130,7 +130,7 @@ option(ENABLE_ORC "Use (if available) the Optimized Inner Loop Runtime Compiler ################################################################################ # GNSS-SDR version information ################################################################################ -set(THIS_IS_A_RELEASE ON) # only related to version name, no further implications. +set(THIS_IS_A_RELEASE OFF) # only related to version name, no further implications. if(NOT ${THIS_IS_A_RELEASE}) find_package(Git) set_package_properties(Git PROPERTIES From 48b55382692b0d52dcb5d3f0c0bec6adcf06058e Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Wed, 16 Feb 2022 11:34:12 +0100 Subject: [PATCH 43/50] Fix defects detected by Coverity Scan 2021.12.1: Unintentional integer overflow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit overflow_before_widen: Potentially overflowing expression this->d_fft_size * ninput_items[0UL] with type unsigned int (32 bits, unsigned) is evaluated using 32-bit arithmetic, and then used in a context that expects an expression of type uint64_t (64 bits, unsigned) --- .../gnuradio_blocks/galileo_pcps_8ms_acquisition_cc.cc | 6 +++--- .../gnuradio_blocks/pcps_cccwsr_acquisition_cc.cc | 6 +++--- .../gnuradio_blocks/pcps_opencl_acquisition_cc.cc | 8 ++++---- .../gnuradio_blocks/pcps_quicksync_acquisition_cc.cc | 2 +- .../gnuradio_blocks/pcps_tong_acquisition_cc.cc | 6 +++--- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/algorithms/acquisition/gnuradio_blocks/galileo_pcps_8ms_acquisition_cc.cc b/src/algorithms/acquisition/gnuradio_blocks/galileo_pcps_8ms_acquisition_cc.cc index 85ad12ff1..b534f30f9 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/galileo_pcps_8ms_acquisition_cc.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/galileo_pcps_8ms_acquisition_cc.cc @@ -216,7 +216,7 @@ int galileo_pcps_8ms_acquisition_cc::general_work(int noutput_items, d_state = 1; } - d_sample_counter += static_cast(d_fft_size * ninput_items[0]); // sample counter + d_sample_counter += static_cast(d_fft_size) * ninput_items[0]; // sample counter consume_each(ninput_items[0]); break; @@ -368,7 +368,7 @@ int galileo_pcps_8ms_acquisition_cc::general_work(int noutput_items, d_active = false; d_state = 0; - d_sample_counter += d_fft_size * ninput_items[0]; // sample counter + d_sample_counter += static_cast(d_fft_size) * ninput_items[0]; // sample counter consume_each(ninput_items[0]); acquisition_message = 1; @@ -403,7 +403,7 @@ int galileo_pcps_8ms_acquisition_cc::general_work(int noutput_items, d_active = false; d_state = 0; - d_sample_counter += static_cast(d_fft_size * ninput_items[0]); // sample counter + d_sample_counter += static_cast(d_fft_size) * ninput_items[0]; // sample counter consume_each(ninput_items[0]); acquisition_message = 2; diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_cccwsr_acquisition_cc.cc b/src/algorithms/acquisition/gnuradio_blocks/pcps_cccwsr_acquisition_cc.cc index 47db3495a..47905fab9 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_cccwsr_acquisition_cc.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_cccwsr_acquisition_cc.cc @@ -226,7 +226,7 @@ int pcps_cccwsr_acquisition_cc::general_work(int noutput_items, d_state = 1; } - d_sample_counter += static_cast(d_fft_size * ninput_items[0]); // sample counter + d_sample_counter += static_cast(d_fft_size) * ninput_items[0]; // sample counter consume_each(ninput_items[0]); break; @@ -389,7 +389,7 @@ int pcps_cccwsr_acquisition_cc::general_work(int noutput_items, d_active = false; d_state = 0; - d_sample_counter += static_cast(d_fft_size * ninput_items[0]); // sample counter + d_sample_counter += static_cast(d_fft_size) * ninput_items[0]; // sample counter consume_each(ninput_items[0]); acquisition_message = 1; @@ -424,7 +424,7 @@ int pcps_cccwsr_acquisition_cc::general_work(int noutput_items, d_active = false; d_state = 0; - d_sample_counter += static_cast(d_fft_size * ninput_items[0]); // sample counter + d_sample_counter += static_cast(d_fft_size) * ninput_items[0]; // sample counter consume_each(ninput_items[0]); acquisition_message = 2; diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_opencl_acquisition_cc.cc b/src/algorithms/acquisition/gnuradio_blocks/pcps_opencl_acquisition_cc.cc index 8aacb315f..b55015d6a 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_opencl_acquisition_cc.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_opencl_acquisition_cc.cc @@ -680,7 +680,7 @@ int pcps_opencl_acquisition_cc::general_work(int noutput_items, d_state = 1; } - d_sample_counter += static_cast(d_fft_size * ninput_items[0]); // sample counter + d_sample_counter += static_cast(d_fft_size) * ninput_items[0]; // sample counter break; } @@ -710,7 +710,7 @@ int pcps_opencl_acquisition_cc::general_work(int noutput_items, { // We already have d_max_dwells consecutive blocks in the internal buffer, // just skip input blocks. - d_sample_counter += static_cast(d_fft_size * ninput_items[0]); + d_sample_counter += static_cast(d_fft_size) * ninput_items[0]; } // We create a new thread to process next block if the following @@ -754,7 +754,7 @@ int pcps_opencl_acquisition_cc::general_work(int noutput_items, d_active = false; d_state = 0; - d_sample_counter += static_cast(d_fft_size * ninput_items[0]); // sample counter + d_sample_counter += static_cast(d_fft_size) * ninput_items[0]; // sample counter acquisition_message = 1; this->message_port_pub(pmt::mp("events"), pmt::from_long(acquisition_message)); @@ -788,7 +788,7 @@ int pcps_opencl_acquisition_cc::general_work(int noutput_items, d_active = false; d_state = 0; - d_sample_counter += static_cast(d_fft_size * ninput_items[0]); // sample counter + d_sample_counter += static_cast(d_fft_size) * ninput_items[0]; // sample counter acquisition_message = 2; this->message_port_pub(pmt::mp("events"), pmt::from_long(acquisition_message)); diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_quicksync_acquisition_cc.cc b/src/algorithms/acquisition/gnuradio_blocks/pcps_quicksync_acquisition_cc.cc index 0463ef99f..3cf56f87a 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_quicksync_acquisition_cc.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_quicksync_acquisition_cc.cc @@ -290,7 +290,7 @@ int pcps_quicksync_acquisition_cc::general_work(int noutput_items, d_test_statistics = 0.0; d_noise_floor_power = 0.0; - d_sample_counter += static_cast(d_sampled_ms * d_samples_per_ms); // sample counter + d_sample_counter += static_cast(d_sampled_ms) * d_samples_per_ms; // sample counter d_well_count++; diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_tong_acquisition_cc.cc b/src/algorithms/acquisition/gnuradio_blocks/pcps_tong_acquisition_cc.cc index b3c5c61a9..720bdf917 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_tong_acquisition_cc.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_tong_acquisition_cc.cc @@ -251,7 +251,7 @@ int pcps_tong_acquisition_cc::general_work(int noutput_items, d_state = 1; } - d_sample_counter += static_cast(d_fft_size * ninput_items[0]); // sample counter + d_sample_counter += static_cast(d_fft_size) * ninput_items[0]; // sample counter consume_each(ninput_items[0]); break; @@ -390,7 +390,7 @@ int pcps_tong_acquisition_cc::general_work(int noutput_items, d_active = false; d_state = 0; - d_sample_counter += static_cast(d_fft_size * ninput_items[0]); // sample counter + d_sample_counter += static_cast(d_fft_size) * ninput_items[0]; // sample counter consume_each(ninput_items[0]); acquisition_message = 1; @@ -425,7 +425,7 @@ int pcps_tong_acquisition_cc::general_work(int noutput_items, d_active = false; d_state = 0; - d_sample_counter += static_cast(d_fft_size * ninput_items[0]); // sample counter + d_sample_counter += static_cast(d_fft_size) * ninput_items[0]; // sample counter consume_each(ninput_items[0]); acquisition_message = 2; From c151b03b774956fe7e93f301f85d4a2363eac7a1 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Wed, 16 Feb 2022 12:22:11 +0100 Subject: [PATCH 44/50] Fix defects detected by Coverity Scan 2021.12.1: Out-of-bounds access (ARRAY_VS_SINGLETON) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit callee_ptr_arith: Passing &this->d_acquisition_gnss_synchro->System to function basic_string which uses it as an array. This might corrupt or misinterpret adjacent memory locations --- .../gnuradio_blocks/galileo_e1_tcp_connector_tracking_cc.cc | 3 +-- .../gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_cc.cc | 3 +-- .../gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_sc.cc | 3 +-- .../gnuradio_blocks/glonass_l1_ca_dll_pll_tracking_cc.cc | 3 +-- .../gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_cc.cc | 3 +-- .../gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_sc.cc | 3 +-- .../gnuradio_blocks/glonass_l2_ca_dll_pll_tracking_cc.cc | 3 +-- .../gnuradio_blocks/gps_l1_ca_dll_pll_tracking_gpu_cc.cc | 3 +-- .../tracking/gnuradio_blocks/gps_l1_ca_kf_tracking_cc.cc | 3 +-- .../gnuradio_blocks/gps_l1_ca_tcp_connector_tracking_cc.cc | 3 +-- 10 files changed, 10 insertions(+), 20 deletions(-) diff --git a/src/algorithms/tracking/gnuradio_blocks/galileo_e1_tcp_connector_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/galileo_e1_tcp_connector_tracking_cc.cc index 03ee2f82c..f9c7297d7 100644 --- a/src/algorithms/tracking/gnuradio_blocks/galileo_e1_tcp_connector_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/galileo_e1_tcp_connector_tracking_cc.cc @@ -178,8 +178,7 @@ void Galileo_E1_Tcp_Connector_Tracking_cc::start_tracking() d_carrier_doppler_hz = d_acq_carrier_doppler_hz; d_current_prn_length_samples = d_vector_length; - std::string sys_ = &d_acquisition_gnss_synchro->System; - sys = sys_.substr(0, 1); + sys = std::string(&d_acquisition_gnss_synchro->System, 0, 1); // DEBUG OUTPUT std::cout << "Tracking of Galileo E1 signal started on channel " << d_channel << " for satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << '\n'; diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_cc.cc index 04f88b999..80eeeadd6 100644 --- a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_cc.cc @@ -263,8 +263,7 @@ void glonass_l1_ca_dll_pll_c_aid_tracking_cc::start_tracking() d_pll_to_dll_assist_secs_Ti = 0.0; d_code_phase_samples = d_acq_code_phase_samples; - const std::string sys_ = &d_acquisition_gnss_synchro->System; - sys = sys_.substr(0, 1); + sys = std::string(&d_acquisition_gnss_synchro->System, 0, 1); d_acc_carrier_phase_initialized = false; // DEBUG OUTPUT diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_sc.cc b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_sc.cc index 9162f7bcc..21257d198 100644 --- a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_sc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_sc.cc @@ -263,8 +263,7 @@ void glonass_l1_ca_dll_pll_c_aid_tracking_sc::start_tracking() d_pll_to_dll_assist_secs_Ti = 0.0; d_code_phase_samples = d_acq_code_phase_samples; - const std::string sys_ = &d_acquisition_gnss_synchro->System; - sys = sys_.substr(0, 1); + sys = std::string(&d_acquisition_gnss_synchro->System, 0, 1); d_acc_carrier_phase_initialized = false; // DEBUG OUTPUT diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_tracking_cc.cc index 242469b0a..b3ee29623 100644 --- a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_tracking_cc.cc @@ -205,8 +205,7 @@ void Glonass_L1_Ca_Dll_Pll_Tracking_cc::start_tracking() d_code_phase_samples = d_acq_code_phase_samples; - const std::string sys_ = &d_acquisition_gnss_synchro->System; - sys = sys_.substr(0, 1); + sys = std::string(&d_acquisition_gnss_synchro->System, 0, 1); d_acc_carrier_phase_initialized = false; // DEBUG OUTPUT diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_cc.cc index 485b0d93f..48a1cc540 100644 --- a/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_cc.cc @@ -259,8 +259,7 @@ void glonass_l2_ca_dll_pll_c_aid_tracking_cc::start_tracking() d_pll_to_dll_assist_secs_Ti = 0.0; d_code_phase_samples = d_acq_code_phase_samples; - const std::string sys_ = &d_acquisition_gnss_synchro->System; - sys = sys_.substr(0, 1); + sys = std::string(&d_acquisition_gnss_synchro->System, 0, 1); // DEBUG OUTPUT std::cout << "Tracking of GLONASS L2 C/A signal started on channel " << d_channel << " for satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << '\n'; diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_sc.cc b/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_sc.cc index 5dfcb2d53..dc687a67f 100644 --- a/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_sc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_sc.cc @@ -260,8 +260,7 @@ void glonass_l2_ca_dll_pll_c_aid_tracking_sc::start_tracking() d_pll_to_dll_assist_secs_Ti = 0.0; d_code_phase_samples = d_acq_code_phase_samples; - const std::string sys_ = &d_acquisition_gnss_synchro->System; - sys = sys_.substr(0, 1); + sys = std::string(&d_acquisition_gnss_synchro->System, 0, 1); // DEBUG OUTPUT std::cout << "Tracking of GLONASS L2 C/A signal started on channel " << d_channel << " for satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << '\n'; diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_tracking_cc.cc index 0f3ae0abb..18e9608fb 100644 --- a/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_tracking_cc.cc @@ -206,8 +206,7 @@ void Glonass_L2_Ca_Dll_Pll_Tracking_cc::start_tracking() d_code_phase_samples = d_acq_code_phase_samples; - const std::string sys_ = &d_acquisition_gnss_synchro->System; - sys = sys_.substr(0, 1); + sys = std::string(&d_acquisition_gnss_synchro->System, 0, 1); // DEBUG OUTPUT std::cout << "Tracking of GLONASS L2 C/A signal started on channel " << d_channel << " for satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << '\n'; diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_gpu_cc.cc b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_gpu_cc.cc index 858244669..f1f35497e 100644 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_gpu_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_gpu_cc.cc @@ -218,8 +218,7 @@ void Gps_L1_Ca_Dll_Pll_Tracking_GPU_cc::start_tracking() d_pll_to_dll_assist_secs_Ti = 0.0; d_code_phase_samples = d_acq_code_phase_samples; - const std::string sys_ = &d_acquisition_gnss_synchro->System; - sys = sys_.substr(0, 1); + sys = std::string(&d_acquisition_gnss_synchro->System, 0, 1); // DEBUG OUTPUT std::cout << "Tracking of GPS L1 C/A signal started on channel " << d_channel << " for satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << '\n'; diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_kf_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_kf_tracking_cc.cc index f1fb20c82..3e38d625b 100644 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_kf_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_kf_tracking_cc.cc @@ -302,8 +302,7 @@ void Gps_L1_Ca_Kf_Tracking_cc::start_tracking() d_code_phase_samples = d_acq_code_phase_samples; - std::string sys_ = &d_acquisition_gnss_synchro->System; - sys = sys_.substr(0, 1); + sys = std::string(&d_acquisition_gnss_synchro->System, 0, 1); // DEBUG OUTPUT std::cout << "Tracking of GPS L1 C/A signal started on channel " << d_channel << " for satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << '\n'; diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_tcp_connector_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_tcp_connector_tracking_cc.cc index 7d964cdfe..148010ed1 100644 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_tcp_connector_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_tcp_connector_tracking_cc.cc @@ -203,8 +203,7 @@ void Gps_L1_Ca_Tcp_Connector_Tracking_cc::start_tracking() d_code_phase_samples = d_acq_code_phase_samples; - std::string sys_ = &d_acquisition_gnss_synchro->System; - sys = sys_.substr(0, 1); + sys = std::string(&d_acquisition_gnss_synchro->System, 0, 1); // DEBUG OUTPUT std::cout << "Tracking of GPS L1 C/A signal started on channel " << d_channel << " for satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << '\n'; From 3755d78aee0b800ab6a6e9bd7990fb7757ccd2a6 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Wed, 16 Feb 2022 13:56:25 +0100 Subject: [PATCH 45/50] Fix defects detected by Coverity Scan 2021.12.1: Out-of-bounds access (ARRAY_VS_SINGLETON) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit callee_ptr_arith: Passing &this->d_acquisition_gnss_synchro->System to function basic_string which uses it as an array. This might corrupt or misinterpret adjacent memory locations --- .../gnuradio_blocks/galileo_e1_tcp_connector_tracking_cc.cc | 2 +- .../glonass_l1_ca_dll_pll_c_aid_tracking_cc.cc | 2 +- .../glonass_l1_ca_dll_pll_c_aid_tracking_sc.cc | 2 +- .../gnuradio_blocks/glonass_l1_ca_dll_pll_tracking_cc.cc | 2 +- .../glonass_l2_ca_dll_pll_c_aid_tracking_cc.cc | 2 +- .../glonass_l2_ca_dll_pll_c_aid_tracking_sc.cc | 2 +- .../gnuradio_blocks/glonass_l2_ca_dll_pll_tracking_cc.cc | 2 +- .../gnuradio_blocks/gps_l1_ca_dll_pll_tracking_gpu_cc.cc | 2 +- .../tracking/gnuradio_blocks/gps_l1_ca_kf_tracking_cc.cc | 4 ++-- .../gnuradio_blocks/gps_l1_ca_tcp_connector_tracking_cc.cc | 2 +- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/algorithms/tracking/gnuradio_blocks/galileo_e1_tcp_connector_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/galileo_e1_tcp_connector_tracking_cc.cc index f9c7297d7..7f6262d58 100644 --- a/src/algorithms/tracking/gnuradio_blocks/galileo_e1_tcp_connector_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/galileo_e1_tcp_connector_tracking_cc.cc @@ -178,7 +178,7 @@ void Galileo_E1_Tcp_Connector_Tracking_cc::start_tracking() d_carrier_doppler_hz = d_acq_carrier_doppler_hz; d_current_prn_length_samples = d_vector_length; - sys = std::string(&d_acquisition_gnss_synchro->System, 0, 1); + sys = std::string(1, d_acquisition_gnss_synchro->System); // DEBUG OUTPUT std::cout << "Tracking of Galileo E1 signal started on channel " << d_channel << " for satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << '\n'; diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_cc.cc index 80eeeadd6..e1fb1f44b 100644 --- a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_cc.cc @@ -263,7 +263,7 @@ void glonass_l1_ca_dll_pll_c_aid_tracking_cc::start_tracking() d_pll_to_dll_assist_secs_Ti = 0.0; d_code_phase_samples = d_acq_code_phase_samples; - sys = std::string(&d_acquisition_gnss_synchro->System, 0, 1); + sys = std::string(1, d_acquisition_gnss_synchro->System); d_acc_carrier_phase_initialized = false; // DEBUG OUTPUT diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_sc.cc b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_sc.cc index 21257d198..f8fbe3b56 100644 --- a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_sc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_c_aid_tracking_sc.cc @@ -263,7 +263,7 @@ void glonass_l1_ca_dll_pll_c_aid_tracking_sc::start_tracking() d_pll_to_dll_assist_secs_Ti = 0.0; d_code_phase_samples = d_acq_code_phase_samples; - sys = std::string(&d_acquisition_gnss_synchro->System, 0, 1); + sys = std::string(1, d_acquisition_gnss_synchro->System); d_acc_carrier_phase_initialized = false; // DEBUG OUTPUT diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_tracking_cc.cc index b3ee29623..06f5914cd 100644 --- a/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l1_ca_dll_pll_tracking_cc.cc @@ -205,7 +205,7 @@ void Glonass_L1_Ca_Dll_Pll_Tracking_cc::start_tracking() d_code_phase_samples = d_acq_code_phase_samples; - sys = std::string(&d_acquisition_gnss_synchro->System, 0, 1); + sys = std::string(1, d_acquisition_gnss_synchro->System); d_acc_carrier_phase_initialized = false; // DEBUG OUTPUT diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_cc.cc index 48a1cc540..16f1dbc58 100644 --- a/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_cc.cc @@ -259,7 +259,7 @@ void glonass_l2_ca_dll_pll_c_aid_tracking_cc::start_tracking() d_pll_to_dll_assist_secs_Ti = 0.0; d_code_phase_samples = d_acq_code_phase_samples; - sys = std::string(&d_acquisition_gnss_synchro->System, 0, 1); + sys = std::string(1, d_acquisition_gnss_synchro->System); // DEBUG OUTPUT std::cout << "Tracking of GLONASS L2 C/A signal started on channel " << d_channel << " for satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << '\n'; diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_sc.cc b/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_sc.cc index dc687a67f..2f3e66890 100644 --- a/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_sc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_c_aid_tracking_sc.cc @@ -260,7 +260,7 @@ void glonass_l2_ca_dll_pll_c_aid_tracking_sc::start_tracking() d_pll_to_dll_assist_secs_Ti = 0.0; d_code_phase_samples = d_acq_code_phase_samples; - sys = std::string(&d_acquisition_gnss_synchro->System, 0, 1); + sys = std::string(1, d_acquisition_gnss_synchro->System); // DEBUG OUTPUT std::cout << "Tracking of GLONASS L2 C/A signal started on channel " << d_channel << " for satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << '\n'; diff --git a/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_tracking_cc.cc index 18e9608fb..42041eec1 100644 --- a/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/glonass_l2_ca_dll_pll_tracking_cc.cc @@ -206,7 +206,7 @@ void Glonass_L2_Ca_Dll_Pll_Tracking_cc::start_tracking() d_code_phase_samples = d_acq_code_phase_samples; - sys = std::string(&d_acquisition_gnss_synchro->System, 0, 1); + sys = std::string(1, d_acquisition_gnss_synchro->System); // DEBUG OUTPUT std::cout << "Tracking of GLONASS L2 C/A signal started on channel " << d_channel << " for satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << '\n'; diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_gpu_cc.cc b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_gpu_cc.cc index f1f35497e..45d274b9f 100644 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_gpu_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_gpu_cc.cc @@ -218,7 +218,7 @@ void Gps_L1_Ca_Dll_Pll_Tracking_GPU_cc::start_tracking() d_pll_to_dll_assist_secs_Ti = 0.0; d_code_phase_samples = d_acq_code_phase_samples; - sys = std::string(&d_acquisition_gnss_synchro->System, 0, 1); + sys = std::string(1, d_acquisition_gnss_synchro->System); // DEBUG OUTPUT std::cout << "Tracking of GPS L1 C/A signal started on channel " << d_channel << " for satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << '\n'; diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_kf_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_kf_tracking_cc.cc index 3e38d625b..da03112e7 100644 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_kf_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_kf_tracking_cc.cc @@ -302,8 +302,8 @@ void Gps_L1_Ca_Kf_Tracking_cc::start_tracking() d_code_phase_samples = d_acq_code_phase_samples; - sys = std::string(&d_acquisition_gnss_synchro->System, 0, 1); - + sys = std::string(1, d_acquisition_gnss_synchro->System); + std::cout << "++++++++++++++ " << sys << "++++++++++++\n"; // DEBUG OUTPUT std::cout << "Tracking of GPS L1 C/A signal started on channel " << d_channel << " for satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << '\n'; LOG(INFO) << "Starting tracking of satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << " on channel " << d_channel; diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_tcp_connector_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_tcp_connector_tracking_cc.cc index 148010ed1..06b2c262e 100644 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_tcp_connector_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_tcp_connector_tracking_cc.cc @@ -203,7 +203,7 @@ void Gps_L1_Ca_Tcp_Connector_Tracking_cc::start_tracking() d_code_phase_samples = d_acq_code_phase_samples; - sys = std::string(&d_acquisition_gnss_synchro->System, 0, 1); + sys = std::string(1, d_acquisition_gnss_synchro->System); // DEBUG OUTPUT std::cout << "Tracking of GPS L1 C/A signal started on channel " << d_channel << " for satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << '\n'; From dae76fa70e5c423756417d06d47ceb09a29aaca4 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Wed, 16 Feb 2022 15:02:27 +0100 Subject: [PATCH 46/50] Fix defects detected by Coverity Scan 2021.12.1: Unintentional integer overflow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit overflow_before_widen: Potentially overflowing expression this->d_fft_size * ninput_items[0UL] with type unsigned int (32 bits, unsigned) is evaluated using 32-bit arithmetic, and then used in a context that expects an expression of type uint64_t (64 bits, unsigned) --- .../gnuradio_blocks/pcps_quicksync_acquisition_cc.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_quicksync_acquisition_cc.cc b/src/algorithms/acquisition/gnuradio_blocks/pcps_quicksync_acquisition_cc.cc index 3cf56f87a..5576a3f63 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_quicksync_acquisition_cc.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_quicksync_acquisition_cc.cc @@ -256,7 +256,7 @@ int pcps_quicksync_acquisition_cc::general_work(int noutput_items, d_state = 1; } - d_sample_counter += static_cast(d_sampled_ms * d_samples_per_ms * ninput_items[0]); // sample counter + d_sample_counter += static_cast(d_sampled_ms) * d_samples_per_ms * ninput_items[0]; // sample counter consume_each(ninput_items[0]); // DLOG(INFO) << "END CASE 0"; break; @@ -495,7 +495,7 @@ int pcps_quicksync_acquisition_cc::general_work(int noutput_items, d_active = false; d_state = 0; - d_sample_counter += static_cast(d_sampled_ms * d_samples_per_ms * ninput_items[0]); // sample counter + d_sample_counter += static_cast(d_sampled_ms) * d_samples_per_ms * ninput_items[0]; // sample counter consume_each(ninput_items[0]); acquisition_message = 1; @@ -538,7 +538,7 @@ int pcps_quicksync_acquisition_cc::general_work(int noutput_items, d_active = false; d_state = 0; - d_sample_counter += static_cast(d_sampled_ms * d_samples_per_ms * ninput_items[0]); // sample counter + d_sample_counter += static_cast(d_sampled_ms) * d_samples_per_ms * ninput_items[0]; // sample counter consume_each(ninput_items[0]); acquisition_message = 2; From 24a9781017473f337f08fa544aadd1c793e06b92 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Wed, 16 Feb 2022 15:34:03 +0100 Subject: [PATCH 47/50] Update changelog. Add DOI for former versions --- docs/CHANGELOG.md | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 77cc00563..c1c58e872 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -12,8 +12,21 @@ SPDX-FileCopyrightText: 2011-2022 Carles Fernandez-Prades Date: Thu, 17 Feb 2022 17:28:34 +0100 Subject: [PATCH 48/50] Fix defects detected by Coverity Scan 2021.12.1: Declaring variable data without initializer --- src/algorithms/signal_source/libs/rtl_tcp_dongle_info.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/algorithms/signal_source/libs/rtl_tcp_dongle_info.cc b/src/algorithms/signal_source/libs/rtl_tcp_dongle_info.cc index 0dfcadb2a..a89963f95 100644 --- a/src/algorithms/signal_source/libs/rtl_tcp_dongle_info.cc +++ b/src/algorithms/signal_source/libs/rtl_tcp_dongle_info.cc @@ -33,11 +33,11 @@ boost::system::error_code Rtl_Tcp_Dongle_Info::read(boost::asio::ip::tcp::socket { boost::system::error_code ec; - unsigned char data[sizeof(char) * 4 + sizeof(uint32_t) * 2]; + std::vector data(sizeof(char) * 4 + sizeof(uint32_t) * 2); size_t received_bits = socket.receive(boost::asio::buffer(data), 0, ec); if (!ec && (received_bits > 0)) { - std::memcpy(magic_, data, 4); + std::memcpy(magic_, data.data(), 4); uint32_t type; std::memcpy(&type, &data[4], 4); From 530f894968d57c06c1e19e986cc268c2c5b68f87 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sun, 20 Feb 2022 03:16:37 +0100 Subject: [PATCH 49/50] Remove abstract key from CITATION.cff file so it does not smash release text in Zenodo page --- CITATION.cff | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CITATION.cff b/CITATION.cff index 35e0246e6..f09da0438 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -1,7 +1,6 @@ # SPDX-License-Identifier: GPL-3.0-or-later # SPDX-FileCopyrightText: 2022 C. Fernandez-Prades carles.fernandez(at)cttc.es --- -abstract: "An open-source Global Navigation Satellite Systems software-defined receiver." authors: - affiliation: "Centre Tecnològic de Telecomunicacions de Catalunya (CTTC)" alias: carlesfernandez @@ -102,7 +101,7 @@ authors: family-names: "van der Linden" given-names: Stefan cff-version: "1.2.0" -date-released: "2022-02-14" +date-released: "2022-02-15" identifiers: - description: "The concept DOI of the work. This is a DOI always pointing to the latest stable release." type: doi From f5b3e44b5f10abe8f4e29b36f03340ebc7e65310 Mon Sep 17 00:00:00 2001 From: JM Friedt Date: Tue, 22 Feb 2022 12:32:15 +0100 Subject: [PATCH 50/50] correct name of SSE3 in Linux kernel for volk_profile SIMD detection --- .../volk_gnsssdr/cpu_features/src/cpuinfo_x86.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/src/cpuinfo_x86.c b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/src/cpuinfo_x86.c index f7b79f54c..43270fac8 100644 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/src/cpuinfo_x86.c +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/src/cpuinfo_x86.c @@ -1439,7 +1439,7 @@ static void ParseCpuId(const uint32_t max_cpuid_leaf, X86Info* info, if (!CpuFeatures_StringView_IsEquals(key, str("flags"))) continue; features->sse = CpuFeatures_StringView_HasWord(value, "sse", ' '); features->sse2 = CpuFeatures_StringView_HasWord(value, "sse2", ' '); - features->sse3 = CpuFeatures_StringView_HasWord(value, "sse3", ' '); + features->sse3 = CpuFeatures_StringView_HasWord(value, "pni", ' '); features->ssse3 = CpuFeatures_StringView_HasWord(value, "ssse3", ' '); features->sse4_1 = CpuFeatures_StringView_HasWord(value, "sse4_1", ' '); features->sse4_2 = CpuFeatures_StringView_HasWord(value, "sse4_2", ' ');