From e43b8f5284c134bffc4813fd26f0c831e05ce162 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Fri, 1 Mar 2019 15:29:43 +0100 Subject: [PATCH] Fix defects detected by Coverity Scan --- ...lileo_e1_pcps_ambiguous_acquisition_fpga.h | 5 - .../galileo_e5a_pcps_acquisition_fpga.h | 18 +- .../gps_l2_m_pcps_acquisition_fpga.cc | 4 - .../adapters/gps_l2_m_pcps_acquisition_fpga.h | 12 +- .../adapters/gps_l5i_pcps_acquisition_fpga.h | 13 +- .../acquisition/libs/fpga_acquisition.cc | 12 + .../libs/gnss_sdr_fpga_sample_counter.cc | 210 ++++++++++-------- .../libs/gnss_sdr_fpga_sample_counter.h | 2 + .../galileo_e1_dll_pll_veml_tracking_fpga.cc | 11 +- .../galileo_e1_dll_pll_veml_tracking_fpga.h | 3 +- .../galileo_e5a_dll_pll_tracking_fpga.cc | 2 +- .../gps_l1_ca_dll_pll_tracking_fpga.h | 3 +- .../adapters/gps_l5_dll_pll_tracking_fpga.h | 3 +- .../tracking/libs/fpga_multicorrelator.cc | 24 +- .../tracking/libs/fpga_multicorrelator.h | 3 +- 15 files changed, 168 insertions(+), 157 deletions(-) diff --git a/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition_fpga.h b/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition_fpga.h index 2baf58e45..7f71790ac 100644 --- a/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition_fpga.h +++ b/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition_fpga.h @@ -147,15 +147,10 @@ private: gr::blocks::stream_to_vector::sptr stream_to_vector_; gr::blocks::float_to_complex::sptr float_to_complex_; complex_byte_to_float_x2_sptr cbyte_to_float_x2_; - bool bit_transition_flag_; - bool use_CFAR_algorithm_flag_; bool acquire_pilot_; uint32_t channel_; uint32_t doppler_max_; uint32_t doppler_step_; - uint32_t max_dwells_; - bool dump_; - bool blocking_; std::string dump_filename_; Gnss_Synchro* gnss_synchro_; std::string role_; diff --git a/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition_fpga.h b/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition_fpga.h index e2871e06f..462235a43 100644 --- a/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition_fpga.h +++ b/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition_fpga.h @@ -67,7 +67,7 @@ public: inline size_t item_size() override { - return item_size_; + return sizeof(int); } void connect(gr::top_block_sptr top_block) override; @@ -150,35 +150,19 @@ private: pcps_acquisition_fpga_sptr acquisition_fpga_; gr::blocks::stream_to_vector::sptr stream_to_vector_; - size_t item_size_; - std::string item_type_; std::string dump_filename_; std::string role_; - bool bit_transition_flag_; - bool dump_; bool acq_pilot_; - bool use_CFAR_; - bool blocking_; bool acq_iq_; - uint32_t vector_length_; - uint32_t code_length_; uint32_t channel_; uint32_t doppler_max_; uint32_t doppler_step_; - uint32_t sampled_ms_; - uint32_t max_dwells_; unsigned int in_streams_; unsigned int out_streams_; - int64_t fs_in_; - - float threshold_; - - gr_complex* code_; - Gnss_Synchro* gnss_synchro_; lv_16sc_t* d_all_fft_codes_; // memory that contains all the code ffts diff --git a/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition_fpga.cc b/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition_fpga.cc index 49a5cd0e3..8595b24ec 100644 --- a/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition_fpga.cc +++ b/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition_fpga.cc @@ -146,7 +146,6 @@ GpsL2MPcpsAcquisitionFpga::GpsL2MPcpsAcquisitionFpga( GpsL2MPcpsAcquisitionFpga::~GpsL2MPcpsAcquisitionFpga() { - //delete[] code_; delete[] d_all_fft_codes_; } @@ -212,9 +211,6 @@ void GpsL2MPcpsAcquisitionFpga::init() void GpsL2MPcpsAcquisitionFpga::set_local_code() { - //gps_l2c_m_code_gen_complex_sampled(code_, gnss_synchro_->PRN, fs_in_); - - //acquisition_fpga_->set_local_code(code_); acquisition_fpga_->set_local_code(); } diff --git a/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition_fpga.h b/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition_fpga.h index 102911d3d..743fb6062 100644 --- a/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition_fpga.h +++ b/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition_fpga.h @@ -75,7 +75,7 @@ public: inline size_t item_size() override { - return item_size_; + return sizeof(int); } void connect(gr::top_block_sptr top_block) override; @@ -149,23 +149,13 @@ private: gr::blocks::stream_to_vector::sptr stream_to_vector_; gr::blocks::float_to_complex::sptr float_to_complex_; complex_byte_to_float_x2_sptr cbyte_to_float_x2_; - size_t item_size_; std::string item_type_; - unsigned int vector_length_; - unsigned int code_length_; - bool bit_transition_flag_; - bool use_CFAR_algorithm_flag_; unsigned int channel_; float threshold_; unsigned int doppler_max_; unsigned int doppler_step_; - unsigned int max_dwells_; int64_t fs_in_; - //long if_; - bool dump_; - bool blocking_; std::string dump_filename_; - std::complex* code_; Gnss_Synchro* gnss_synchro_; std::string role_; unsigned int in_streams_; diff --git a/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition_fpga.h b/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition_fpga.h index 8063edd62..8a9a9e748 100644 --- a/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition_fpga.h +++ b/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition_fpga.h @@ -76,7 +76,7 @@ public: inline size_t item_size() override { - return item_size_; + return sizeof(int); } void connect(gr::top_block_sptr top_block) override; @@ -149,22 +149,11 @@ private: gr::blocks::stream_to_vector::sptr stream_to_vector_; gr::blocks::float_to_complex::sptr float_to_complex_; complex_byte_to_float_x2_sptr cbyte_to_float_x2_; - size_t item_size_; std::string item_type_; - uint32_t vector_length_; - uint32_t code_length_; - bool bit_transition_flag_; - bool use_CFAR_algorithm_flag_; uint32_t channel_; - float threshold_; uint32_t doppler_max_; uint32_t doppler_step_; - uint32_t max_dwells_; - int64_t fs_in_; - bool dump_; - bool blocking_; std::string dump_filename_; - std::complex* code_; Gnss_Synchro* gnss_synchro_; std::string role_; unsigned int in_streams_; diff --git a/src/algorithms/acquisition/libs/fpga_acquisition.cc b/src/algorithms/acquisition/libs/fpga_acquisition.cc index 6125ee313..e429e8c8e 100644 --- a/src/algorithms/acquisition/libs/fpga_acquisition.cc +++ b/src/algorithms/acquisition/libs/fpga_acquisition.cc @@ -62,6 +62,18 @@ #define SELECT_ALL_CODE_BITS 0x000FFFFF // Select a 20 bit word #define SHL_CODE_BITS 1024 // shift left by 10 bits +#ifndef TEMP_FAILURE_RETRY +#define TEMP_FAILURE_RETRY(exp) \ + ({ \ + decltype(exp) _rc; \ + do \ + { \ + _rc = (exp); \ + } \ + while (_rc == -1 && errno == EINTR); \ + _rc; \ + }) +#endif bool Fpga_Acquisition::init() { diff --git a/src/algorithms/libs/gnss_sdr_fpga_sample_counter.cc b/src/algorithms/libs/gnss_sdr_fpga_sample_counter.cc index a9feedaed..e8e147e6a 100644 --- a/src/algorithms/libs/gnss_sdr_fpga_sample_counter.cc +++ b/src/algorithms/libs/gnss_sdr_fpga_sample_counter.cc @@ -40,8 +40,23 @@ #include #include // libraries used by the GIPO +using google::LogMessage; + #define PAGE_SIZE 0x10000 // default page size for the multicorrelator memory map #define TEST_REG_SANITY_CHECK 0x55AA // value to check the presence of the test register (to detect the hw) +#ifndef TEMP_FAILURE_RETRY +#define TEMP_FAILURE_RETRY(exp) \ + ({ \ + decltype(exp) _rc; \ + do \ + { \ + _rc = (exp); \ + } \ + while (_rc == -1 && errno == EINTR); \ + _rc; \ + }) +#endif + gnss_sdr_fpga_sample_counter::gnss_sdr_fpga_sample_counter( double _fs, @@ -59,7 +74,7 @@ gnss_sdr_fpga_sample_counter::gnss_sdr_fpga_sample_counter( //The hardware timer must keep always interrupting the PS. It must not wait for the interrupt to //be served. open_device(); - + is_open = true; sample_counter = 0ULL; current_T_rx_ms = 0; current_s = 0; @@ -81,6 +96,15 @@ gnss_sdr_fpga_sample_counter_sptr gnss_sdr_make_fpga_sample_counter(double _fs, } +gnss_sdr_fpga_sample_counter::~gnss_sdr_fpga_sample_counter() +{ + if (is_open) + { + close_device(); + } +} + + // Called by gnuradio to enable drivers, etc for i/o devices. bool gnss_sdr_fpga_sample_counter::start() { @@ -100,102 +124,11 @@ bool gnss_sdr_fpga_sample_counter::stop() //todo: place here the routines to stop the associated hardware (if needed).This function will be called by GNURadio at every stop of the flowgraph. // return true if everything is ok. close_device(); - + is_open = false; return true; } -int gnss_sdr_fpga_sample_counter::general_work(int noutput_items __attribute__((unused)), - __attribute__((unused)) gr_vector_int &ninput_items, - __attribute__((unused)) gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items) -{ - //todo: Call here a function that waits for an interrupt. Do not open a thread, - //it must be a simple call to a BLOCKING function. - // The function will return the actual absolute sample count of the internal counter of the timmer. - // store the sample count in class member sample_counter - // Possible problem: what happen if the PS is overloaded and gnuradio does not call this function - // with the sufficient rate to catch all the interrupts in the counter. To be evaluated later. - - uint32_t counter = wait_for_interrupt_and_read_counter(); - uint64_t samples_passed = 2 * static_cast(samples_per_output) - static_cast(counter); // ellapsed samples - // Note: at this moment the sample counter is implemented as a sample counter that decreases to zero and then it is automatically - // reloaded again and keeps counter. It is done in this way to minimize the logic in the FPGA and maximize the FPGA clock performance - // (it takes less resources and latency in the FPGA to compare a number against a fixed value like zero than to compare it to a programmable - // variable number). - - sample_counter = sample_counter + samples_passed; //samples_per_output; - auto *out = reinterpret_cast(output_items[0]); - out[0] = Gnss_Synchro(); - out[0].Flag_valid_symbol_output = false; - out[0].Flag_valid_word = false; - out[0].Channel_ID = -1; - out[0].fs = fs; - if ((current_T_rx_ms % report_interval_ms) == 0) - { - current_s++; - if ((current_s % 60) == 0) - { - current_s = 0; - current_m++; - flag_m = true; - if ((current_m % 60) == 0) - { - current_m = 0; - current_h++; - flag_h = true; - if ((current_h % 24) == 0) - { - current_h = 0; - current_days++; - flag_days = true; - } - } - } - - if (flag_days) - { - std::string day; - if (current_days == 1) - { - day = " day "; - } - else - { - day = " days "; - } - std::cout << "Current receiver time: " << current_days << day << current_h << " h " << current_m << " min " << current_s << " s" << std::endl; - } - else - { - if (flag_h) - { - std::cout << "Current receiver time: " << current_h << " h " << current_m << " min " << current_s << " s" << std::endl; - } - else - { - if (flag_m) - { - std::cout << "Current receiver time: " << current_m << " min " << current_s << " s" << std::endl; - } - else - { - std::cout << "Current receiver time: " << current_s << " s" << std::endl; - } - } - } - if (flag_enable_send_msg) - { - message_port_pub(pmt::mp("receiver_time"), pmt::from_double(static_cast(current_T_rx_ms) / 1000.0)); - } - } - out[0].Tracking_sample_counter = sample_counter; - //current_T_rx_ms = (sample_counter * 1000) / samples_per_output; - current_T_rx_ms = interval_ms * (sample_counter) / samples_per_output; - return 1; -} - - uint32_t gnss_sdr_fpga_sample_counter::test_register(uint32_t writeval) { uint32_t readval; @@ -290,3 +223,94 @@ uint32_t gnss_sdr_fpga_sample_counter::wait_for_interrupt_and_read_counter() counter = samples_per_output; //map_base[0]; return counter; } + + +int gnss_sdr_fpga_sample_counter::general_work(int noutput_items __attribute__((unused)), + __attribute__((unused)) gr_vector_int &ninput_items, + __attribute__((unused)) gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) +{ + //todo: Call here a function that waits for an interrupt. Do not open a thread, + //it must be a simple call to a BLOCKING function. + // The function will return the actual absolute sample count of the internal counter of the timmer. + // store the sample count in class member sample_counter + // Possible problem: what happen if the PS is overloaded and gnuradio does not call this function + // with the sufficient rate to catch all the interrupts in the counter. To be evaluated later. + + uint32_t counter = wait_for_interrupt_and_read_counter(); + uint64_t samples_passed = 2 * static_cast(samples_per_output) - static_cast(counter); // ellapsed samples + // Note: at this moment the sample counter is implemented as a sample counter that decreases to zero and then it is automatically + // reloaded again and keeps counter. It is done in this way to minimize the logic in the FPGA and maximize the FPGA clock performance + // (it takes less resources and latency in the FPGA to compare a number against a fixed value like zero than to compare it to a programmable + // variable number). + + sample_counter = sample_counter + samples_passed; //samples_per_output; + auto *out = reinterpret_cast(output_items[0]); + out[0] = Gnss_Synchro(); + out[0].Flag_valid_symbol_output = false; + out[0].Flag_valid_word = false; + out[0].Channel_ID = -1; + out[0].fs = fs; + if ((current_T_rx_ms % report_interval_ms) == 0) + { + current_s++; + if ((current_s % 60) == 0) + { + current_s = 0; + current_m++; + flag_m = true; + if ((current_m % 60) == 0) + { + current_m = 0; + current_h++; + flag_h = true; + if ((current_h % 24) == 0) + { + current_h = 0; + current_days++; + flag_days = true; + } + } + } + + if (flag_days) + { + std::string day; + if (current_days == 1) + { + day = " day "; + } + else + { + day = " days "; + } + std::cout << "Current receiver time: " << current_days << day << current_h << " h " << current_m << " min " << current_s << " s" << std::endl; + } + else + { + if (flag_h) + { + std::cout << "Current receiver time: " << current_h << " h " << current_m << " min " << current_s << " s" << std::endl; + } + else + { + if (flag_m) + { + std::cout << "Current receiver time: " << current_m << " min " << current_s << " s" << std::endl; + } + else + { + std::cout << "Current receiver time: " << current_s << " s" << std::endl; + } + } + } + if (flag_enable_send_msg) + { + message_port_pub(pmt::mp("receiver_time"), pmt::from_double(static_cast(current_T_rx_ms) / 1000.0)); + } + } + out[0].Tracking_sample_counter = sample_counter; + //current_T_rx_ms = (sample_counter * 1000) / samples_per_output; + current_T_rx_ms = interval_ms * (sample_counter) / samples_per_output; + return 1; +} diff --git a/src/algorithms/libs/gnss_sdr_fpga_sample_counter.h b/src/algorithms/libs/gnss_sdr_fpga_sample_counter.h index d19fc6dba..dd508c33d 100644 --- a/src/algorithms/libs/gnss_sdr_fpga_sample_counter.h +++ b/src/algorithms/libs/gnss_sdr_fpga_sample_counter.h @@ -72,9 +72,11 @@ private: int32_t fd; // driver descriptor volatile uint32_t *map_base; // driver memory map std::string device_name = "/dev/uio2"; // HW device name + bool is_open; public: friend gnss_sdr_fpga_sample_counter_sptr gnss_sdr_make_fpga_sample_counter(double _fs, int32_t _interval_ms); + ~gnss_sdr_fpga_sample_counter(); int general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, diff --git a/src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking_fpga.cc b/src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking_fpga.cc index bf2ecffbe..3d692c5db 100644 --- a/src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking_fpga.cc +++ b/src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking_fpga.cc @@ -3,7 +3,6 @@ * \brief Adapts a DLL+PLL VEML (Very Early Minus Late) tracking loop block * to a TrackingInterface for Galileo E1 signals for the FPGA * \author Marc Majoral, 2019. mmajoral(at)cttc.cat - * \author Luis Esteve, 2012. luis(at)epsilon-formacion.com * * Code DLL + carrier PLL according to the algorithms described in: * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, @@ -45,10 +44,6 @@ using google::LogMessage; -void GalileoE1DllPllVemlTrackingFpga::stop_tracking() -{ -} - GalileoE1DllPllVemlTrackingFpga::GalileoE1DllPllVemlTrackingFpga( ConfigurationInterface* configuration, const std::string& role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) @@ -136,6 +131,7 @@ GalileoE1DllPllVemlTrackingFpga::GalileoE1DllPllVemlTrackingFpga( d_ca_codes = static_cast(volk_gnsssdr_malloc(static_cast(GALILEO_E1_B_CODE_LENGTH_CHIPS) * code_samples_per_chip * GALILEO_E1_NUMBER_OF_CODES * sizeof(int32_t), volk_gnsssdr_get_alignment())); float* ca_codes_f; float* data_codes_f = nullptr; + d_data_codes = nullptr; if (d_track_pilot) { @@ -200,6 +196,11 @@ GalileoE1DllPllVemlTrackingFpga::~GalileoE1DllPllVemlTrackingFpga() } +void GalileoE1DllPllVemlTrackingFpga::stop_tracking() +{ +} + + void GalileoE1DllPllVemlTrackingFpga::start_tracking() { tracking_fpga_sc->start_tracking(); diff --git a/src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking_fpga.h b/src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking_fpga.h index 729bbe5b4..79cf7b6a4 100644 --- a/src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking_fpga.h +++ b/src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking_fpga.h @@ -71,7 +71,7 @@ public: inline size_t item_size() override { - return item_size_; + return sizeof(int); } void connect(gr::top_block_sptr top_block) override; @@ -101,7 +101,6 @@ public: private: dll_pll_veml_tracking_fpga_sptr tracking_fpga_sc; - size_t item_size_; uint32_t channel_; std::string role_; uint32_t in_streams_; diff --git a/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking_fpga.cc b/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking_fpga.cc index ba621e619..e158d493f 100644 --- a/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking_fpga.cc +++ b/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking_fpga.cc @@ -114,6 +114,7 @@ GalileoE5aDllPllTrackingFpga::GalileoE5aDllPllTrackingFpga( double carrier_lock_th = configuration->property(role + ".carrier_lock_th", 0.85); if (FLAGS_carrier_lock_th != 0.85) carrier_lock_th = FLAGS_carrier_lock_th; trk_param_fpga.carrier_lock_th = carrier_lock_th; + d_data_codes = nullptr; // FPGA configuration parameters std::string default_device_name = "/dev/uio"; @@ -136,7 +137,6 @@ GalileoE5aDllPllTrackingFpga::GalileoE5aDllPllTrackingFpga( d_data_codes = static_cast(volk_gnsssdr_malloc((static_cast(code_length_chips)) * code_samples_per_chip * GALILEO_E5A_NUMBER_OF_CODES * sizeof(int32_t), volk_gnsssdr_get_alignment())); } - for (uint32_t PRN = 1; PRN <= GALILEO_E5A_NUMBER_OF_CODES; PRN++) { galileo_e5_a_code_gen_complex_primary(aux_code, PRN, const_cast(sig_)); diff --git a/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking_fpga.h b/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking_fpga.h index f0117fdaa..5be1e7104 100644 --- a/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking_fpga.h +++ b/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking_fpga.h @@ -70,7 +70,7 @@ public: inline size_t item_size() override { - return item_size_; + return sizeof(int) } void connect(gr::top_block_sptr top_block) override; @@ -98,7 +98,6 @@ public: private: dll_pll_veml_tracking_fpga_sptr tracking_fpga_sc; - size_t item_size_; uint32_t channel_; std::string role_; uint32_t in_streams_; diff --git a/src/algorithms/tracking/adapters/gps_l5_dll_pll_tracking_fpga.h b/src/algorithms/tracking/adapters/gps_l5_dll_pll_tracking_fpga.h index c61e1e81a..1d6060f2f 100644 --- a/src/algorithms/tracking/adapters/gps_l5_dll_pll_tracking_fpga.h +++ b/src/algorithms/tracking/adapters/gps_l5_dll_pll_tracking_fpga.h @@ -70,7 +70,7 @@ public: inline size_t item_size() override { - return item_size_; + return sizeof(int); } void connect(gr::top_block_sptr top_block) override; @@ -97,7 +97,6 @@ public: private: dll_pll_veml_tracking_fpga_sptr tracking_fpga_sc; - size_t item_size_; uint32_t channel_; std::string role_; uint32_t in_streams_; diff --git a/src/algorithms/tracking/libs/fpga_multicorrelator.cc b/src/algorithms/tracking/libs/fpga_multicorrelator.cc index adcfac599..741705303 100644 --- a/src/algorithms/tracking/libs/fpga_multicorrelator.cc +++ b/src/algorithms/tracking/libs/fpga_multicorrelator.cc @@ -66,6 +66,18 @@ #define LOCAL_CODE_FPGA_ENABLE_WRITE_MEMORY 0x0C000000 #define TEST_REGISTER_TRACK_WRITEVAL 0x55AA +#ifndef TEMP_FAILURE_RETRY +#define TEMP_FAILURE_RETRY(exp) \ + ({ \ + decltype(exp) _rc; \ + do \ + { \ + _rc = (exp); \ + } \ + while (_rc == -1 && errno == EINTR); \ + _rc; \ + }) +#endif Fpga_Multicorrelator_8sc::Fpga_Multicorrelator_8sc(int32_t n_correlators, std::string device_name, uint32_t device_base, int32_t *ca_codes, int32_t *data_codes, uint32_t code_length_chips, bool track_pilot, @@ -95,6 +107,7 @@ Fpga_Multicorrelator_8sc::Fpga_Multicorrelator_8sc(int32_t n_correlators, } d_shifts_chips = nullptr; d_prompt_data_shift = nullptr; + d_Prompt_Data = nullptr; d_corr_out = nullptr; d_code_length_chips = 0; d_rem_code_phase_chips = 0; @@ -105,7 +118,8 @@ Fpga_Multicorrelator_8sc::Fpga_Multicorrelator_8sc(int32_t n_correlators, d_phase_step_rad_int = 0; d_initial_sample_counter = 0; d_channel = 0; - d_correlator_length_samples = 0, + d_correlator_length_samples = 0; + d_code_phase_step_chips_num = 0; d_code_length_chips = code_length_chips; d_ca_codes = ca_codes; d_data_codes = data_codes; @@ -119,6 +133,14 @@ Fpga_Multicorrelator_8sc::Fpga_Multicorrelator_8sc(int32_t n_correlators, Fpga_Multicorrelator_8sc::~Fpga_Multicorrelator_8sc() { close_device(); + if (d_initial_index != nullptr) + { + volk_gnsssdr_free(d_initial_index); + } + if (d_initial_interp_counter != nullptr) + { + volk_gnsssdr_free(d_initial_interp_counter); + } } diff --git a/src/algorithms/tracking/libs/fpga_multicorrelator.h b/src/algorithms/tracking/libs/fpga_multicorrelator.h index 155503002..1a44de781 100644 --- a/src/algorithms/tracking/libs/fpga_multicorrelator.h +++ b/src/algorithms/tracking/libs/fpga_multicorrelator.h @@ -98,7 +98,7 @@ private: float *d_shifts_chips; float *d_prompt_data_shift; int32_t d_code_length_chips; - int32_t d_n_correlators; + int32_t d_n_correlators; // number of correlators // data related to the hardware module and the driver int32_t d_device_descriptor; // driver descriptor @@ -106,7 +106,6 @@ private: // configuration data received from the interface uint32_t d_channel; // channel number - uint32_t d_ncorrelators; // number of correlators uint32_t d_correlator_length_samples; float d_rem_code_phase_chips; float d_code_phase_step_chips;