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 c3cd96275..49a5cd0e3 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 @@ -52,7 +52,6 @@ GpsL2MPcpsAcquisitionFpga::GpsL2MPcpsAcquisitionFpga( in_streams_(in_streams), out_streams_(out_streams) { - //pcpsconf_t acq_parameters; pcpsconf_fpga_t acq_parameters; configuration_ = configuration; std::string default_item_type = "gr_complex"; @@ -61,33 +60,17 @@ GpsL2MPcpsAcquisitionFpga::GpsL2MPcpsAcquisitionFpga( LOG(INFO) << "role " << role; item_type_ = configuration_->property(role + ".item_type", default_item_type); - //float pfa = configuration_->property(role + ".pfa", 0.0); int64_t fs_in_deprecated = configuration_->property("GNSS-SDR.internal_fs_hz", 2048000); fs_in_ = configuration_->property("GNSS-SDR.internal_fs_sps", fs_in_deprecated); acq_parameters.fs_in = fs_in_; - //if_ = configuration_->property(role + ".if", 0); - //acq_parameters.freq = if_; - //dump_ = configuration_->property(role + ".dump", false); - //acq_parameters.dump = dump_; - //blocking_ = configuration_->property(role + ".blocking", true); - //acq_parameters.blocking = blocking_; + doppler_max_ = configuration->property(role + ".doppler_max", 5000); if (FLAGS_doppler_max != 0) doppler_max_ = FLAGS_doppler_max; acq_parameters.doppler_max = doppler_max_; - //bit_transition_flag_ = configuration_->property(role + ".bit_transition_flag", false); - //acq_parameters.bit_transition_flag = bit_transition_flag_; - //use_CFAR_algorithm_flag_ = configuration_->property(role + ".use_CFAR_algorithm", true); //will be false in future versions - //acq_parameters.use_CFAR_algorithm_flag = use_CFAR_algorithm_flag_; - //max_dwells_ = configuration_->property(role + ".max_dwells", 1); - //acq_parameters.max_dwells = max_dwells_; - //dump_filename_ = configuration_->property(role + ".dump_filename", default_dump_filename); - //acq_parameters.dump_filename = dump_filename_; - //--- Find number of samples per spreading code ------------------------- - //code_length_ = std::round(static_cast(fs_in_) / (GPS_L2_M_CODE_RATE_HZ / static_cast(GPS_L2_M_CODE_LENGTH_CHIPS))); acq_parameters.sampled_ms = 20; - unsigned code_length = std::round(static_cast(fs_in_) / (GPS_L2_M_CODE_RATE_HZ / static_cast(GPS_L2_M_CODE_LENGTH_CHIPS))); + unsigned int code_length = std::round(static_cast(fs_in_) / (GPS_L2_M_CODE_RATE_HZ / static_cast(GPS_L2_M_CODE_LENGTH_CHIPS))); acq_parameters.code_length = code_length; // The FPGA can only use FFT lengths that are a power of two. float nbits = ceilf(log2f((float)code_length)); @@ -114,10 +97,9 @@ GpsL2MPcpsAcquisitionFpga::GpsL2MPcpsAcquisitionFpga( { gps_l2c_m_code_gen_complex_sampled(code, PRN, fs_in_); // fill in zero padding - for (int s = code_length; s < nsamples_total; s++) + for (unsigned int s = code_length; s < nsamples_total; s++) { code[s] = std::complex(0.0, 0.0); - //code[s] = 0; } memcpy(fft_if->get_inbuf(), code, sizeof(gr_complex) * nsamples_total); // copy to FFT buffer fft_if->execute(); // Run the FFT of local code @@ -156,47 +138,9 @@ GpsL2MPcpsAcquisitionFpga::GpsL2MPcpsAcquisitionFpga( doppler_step_ = 0; gnss_synchro_ = nullptr; - - // vector_length_ = code_length_; - // - // if (bit_transition_flag_) - // { - // vector_length_ *= 2; - // } - - // code_ = new gr_complex[vector_length_]; - // - // if (item_type_.compare("cshort") == 0) - // { - // item_size_ = sizeof(lv_16sc_t); - // } - // else - // { - // item_size_ = sizeof(gr_complex); - // } - //acq_parameters.samples_per_ms = static_cast(std::round(static_cast(fs_in_) * 0.001)); - //acq_parameters.samples_per_code = code_length_; - //acq_parameters.it_size = item_size_; - //acq_parameters.sampled_ms = 20; - //acq_parameters.num_doppler_bins_step2 = configuration_->property(role + ".second_nbins", 4); - //acq_parameters.doppler_step2 = configuration_->property(role + ".second_doppler_step", 125.0); - //acq_parameters.make_2_steps = configuration_->property(role + ".make_two_steps", true); - //acquisition_ = pcps_make_acquisition(acq_parameters); DLOG(INFO) << "acquisition(" << acquisition_fpga_->unique_id() << ")"; - // stream_to_vector_ = gr::blocks::stream_to_vector::make(item_size_, vector_length_); - // DLOG(INFO) << "stream_to_vector(" << stream_to_vector_->unique_id() << ")"; - // - // if (item_type_.compare("cbyte") == 0) - // { - // cbyte_to_float_x2_ = make_complex_byte_to_float_x2(); - // float_to_complex_ = gr::blocks::float_to_complex::make(); - // } - - // channel_ = 0; threshold_ = 0.0; - // doppler_step_ = 0; - // gnss_synchro_ = 0; } @@ -221,23 +165,8 @@ void GpsL2MPcpsAcquisitionFpga::set_channel(unsigned int channel) void GpsL2MPcpsAcquisitionFpga::set_threshold(float threshold) { - // float pfa = configuration_->property(role_ + std::to_string(channel_) + ".pfa", 0.0); - // - // if (pfa == 0.0) - // { - // pfa = configuration_->property(role_ + ".pfa", 0.0); - // } - // if (pfa == 0.0) - // { - // threshold_ = threshold; - // } - // else - // { - // threshold_ = calculate_threshold(pfa); - // } - + threshold_ = threshold; DLOG(INFO) << "Channel " << channel_ << " Threshold = " << threshold_; - acquisition_fpga_->set_threshold(threshold_); } @@ -301,99 +230,26 @@ void GpsL2MPcpsAcquisitionFpga::set_state(int state) } -//float GpsL2MPcpsAcquisitionFpga::calculate_threshold(float pfa) -//{ -// //Calculate the threshold -// unsigned int frequency_bins = 0; -// for (int doppler = static_cast(-doppler_max_); doppler <= static_cast(doppler_max_); doppler += doppler_step_) -// { -// frequency_bins++; -// } -// DLOG(INFO) << "Channel " << channel_ << " Pfa = " << pfa; -// unsigned int ncells = vector_length_ * frequency_bins; -// double exponent = 1.0 / static_cast(ncells); -// double val = pow(1.0 - pfa, exponent); -// double lambda = double(vector_length_); -// boost::math::exponential_distribution mydist(lambda); -// float threshold = static_cast(quantile(mydist, val)); -// -// return threshold; -//} - - void GpsL2MPcpsAcquisitionFpga::connect(gr::top_block_sptr top_block) { - // if (item_type_.compare("gr_complex") == 0) - // { - // top_block->connect(stream_to_vector_, 0, acquisition_, 0); - // } - // else if (item_type_.compare("cshort") == 0) - // { - // top_block->connect(stream_to_vector_, 0, acquisition_, 0); - // } - // else if (item_type_.compare("cbyte") == 0) - // { - // top_block->connect(cbyte_to_float_x2_, 0, float_to_complex_, 0); - // top_block->connect(cbyte_to_float_x2_, 1, float_to_complex_, 1); - // top_block->connect(float_to_complex_, 0, stream_to_vector_, 0); - // top_block->connect(stream_to_vector_, 0, acquisition_, 0); - // } - // else - // { - // LOG(WARNING) << item_type_ << " unknown acquisition item type"; - // } - - // nothing to connect + if (top_block) + { /* top_block is not null */ + }; + // Nothing to connect } void GpsL2MPcpsAcquisitionFpga::disconnect(gr::top_block_sptr top_block) { - // if (item_type_.compare("gr_complex") == 0) - // { - // top_block->disconnect(stream_to_vector_, 0, acquisition_, 0); - // } - // else if (item_type_.compare("cshort") == 0) - // { - // top_block->disconnect(stream_to_vector_, 0, acquisition_, 0); - // } - // else if (item_type_.compare("cbyte") == 0) - // { - // // Since a byte-based acq implementation is not available, - // // we just convert cshorts to gr_complex - // top_block->disconnect(cbyte_to_float_x2_, 0, float_to_complex_, 0); - // top_block->disconnect(cbyte_to_float_x2_, 1, float_to_complex_, 1); - // top_block->disconnect(float_to_complex_, 0, stream_to_vector_, 0); - // top_block->disconnect(stream_to_vector_, 0, acquisition_, 0); - // } - // else - // { - // LOG(WARNING) << item_type_ << " unknown acquisition item type"; - // } - - // nothing to disconnect + if (top_block) + { /* top_block is not null */ + }; + // Nothing to diconnect } gr::basic_block_sptr GpsL2MPcpsAcquisitionFpga::get_left_block() { - // if (item_type_.compare("gr_complex") == 0) - // { - // return stream_to_vector_; - // } - // else if (item_type_.compare("cshort") == 0) - // { - // return stream_to_vector_; - // } - // else if (item_type_.compare("cbyte") == 0) - // { - // return cbyte_to_float_x2_; - // } - // else - // { - // LOG(WARNING) << item_type_ << " unknown acquisition item type"; - // return nullptr; - // } return nullptr; } diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc index 8a806c80f..c43e9d453 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc @@ -187,6 +187,7 @@ pcps_acquisition::pcps_acquisition(const Acq_Conf& conf_) : gr::block("pcps_acqu } } + pcps_acquisition::~pcps_acquisition() { if (d_num_doppler_bins > 0) @@ -227,6 +228,7 @@ void pcps_acquisition::set_resampler_latency(uint32_t latency_samples) acq_parameters.resampler_latency_samples = latency_samples; } + void pcps_acquisition::set_local_code(std::complex* code) { // reset the intermediate frequency @@ -912,6 +914,7 @@ void pcps_acquisition::acquisition_core(uint64_t samp_count) } } + // Called by gnuradio to enable drivers, etc for i/o devices. bool pcps_acquisition::start() { @@ -919,8 +922,10 @@ bool pcps_acquisition::start() return true; } + int pcps_acquisition::general_work(int noutput_items __attribute__((unused)), - gr_vector_int& ninput_items, gr_vector_const_void_star& input_items, + gr_vector_int& ninput_items, + gr_vector_const_void_star& input_items, gr_vector_void_star& output_items __attribute__((unused))) { /* diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fpga.cc b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fpga.cc index 4c870542d..83b5362c9 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fpga.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fpga.cc @@ -253,7 +253,8 @@ void pcps_acquisition_fpga::set_active(bool active) int pcps_acquisition_fpga::general_work(int noutput_items __attribute__((unused)), - gr_vector_int& ninput_items, gr_vector_const_void_star& input_items, + gr_vector_int& ninput_items __attribute__((unused)), + gr_vector_const_void_star& input_items __attribute__((unused)), gr_vector_void_star& output_items __attribute__((unused))) { // the general work is not used with the acquisition that uses the FPGA diff --git a/src/algorithms/acquisition/libs/fpga_acquisition.cc b/src/algorithms/acquisition/libs/fpga_acquisition.cc index 3b5419771..6125ee313 100644 --- a/src/algorithms/acquisition/libs/fpga_acquisition.cc +++ b/src/algorithms/acquisition/libs/fpga_acquisition.cc @@ -87,8 +87,10 @@ void Fpga_Acquisition::write_local_code() Fpga_Acquisition::Fpga_Acquisition(std::string device_name, uint32_t nsamples, uint32_t doppler_max, - uint32_t nsamples_total, int64_t fs_in, - uint32_t sampled_ms, uint32_t select_queue, + uint32_t nsamples_total, + int64_t fs_in, + uint32_t sampled_ms __attribute__((unused)), + uint32_t select_queue, lv_16sc_t *all_fft_codes, uint32_t excludelimit) { @@ -193,7 +195,11 @@ void Fpga_Acquisition::run_acquisition(void) // enable interrupts int32_t reenable = 1; int32_t disable_int = 0; - write(d_fd, reinterpret_cast(&reenable), sizeof(int32_t)); + ssize_t nbytes = TEMP_FAILURE_RETRY(write(d_fd, reinterpret_cast(&reenable), sizeof(int32_t))); + if (nbytes != sizeof(int32_t)) + { + std::cerr << "Error enabling run in the FPGA." << std::endl; + } // launch the acquisition process d_map_base[8] = LAUNCH_ACQUISITION; // writing a 1 to reg 8 launches the acquisition process @@ -208,7 +214,11 @@ void Fpga_Acquisition::run_acquisition(void) std::cout << "acquisition module Interrupt number " << irq_count << std::endl; } - write(d_fd, reinterpret_cast(&disable_int), sizeof(int32_t)); + nbytes = TEMP_FAILURE_RETRY(write(d_fd, reinterpret_cast(&disable_int), sizeof(int32_t))); + if (nbytes != sizeof(int32_t)) + { + std::cerr << "Error disabling interruptions in the FPGA." << std::endl; + } } diff --git a/src/algorithms/libs/gnss_sdr_fpga_sample_counter.cc b/src/algorithms/libs/gnss_sdr_fpga_sample_counter.cc index dfe5d3e21..a9feedaed 100644 --- a/src/algorithms/libs/gnss_sdr_fpga_sample_counter.cc +++ b/src/algorithms/libs/gnss_sdr_fpga_sample_counter.cc @@ -269,7 +269,11 @@ uint32_t gnss_sdr_fpga_sample_counter::wait_for_interrupt_and_read_counter() // enable interrupts int32_t reenable = 1; - write(fd, reinterpret_cast(&reenable), sizeof(int32_t)); + ssize_t nbytes = TEMP_FAILURE_RETRY(write(fd, reinterpret_cast(&reenable), sizeof(int32_t))); + if (nbytes != sizeof(int32_t)) + { + std::cerr << "Error enabling interruptions in the FPGA." << std::endl; + } // wait for interrupt nb = read(fd, &irq_count, sizeof(irq_count)); diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/glonass_l1_ca_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/glonass_l1_ca_telemetry_decoder_cc.cc index cf9a92f06..4a7b04cd2 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/glonass_l1_ca_telemetry_decoder_cc.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/glonass_l1_ca_telemetry_decoder_cc.cc @@ -279,7 +279,7 @@ int glonass_l1_ca_telemetry_decoder_cc::general_work(int noutput_items __attribu d_flag_preamble = false; - if (d_symbol_history.size() == d_symbols_per_preamble) + if (static_cast(d_symbol_history.size()) == d_symbols_per_preamble) { // ******* preamble correlation ******** int i = 0; 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 1175d35d5..bf2ecffbe 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 @@ -135,16 +135,15 @@ GalileoE1DllPllVemlTrackingFpga::GalileoE1DllPllVemlTrackingFpga( uint32_t code_samples_per_chip = 2; 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; + float* data_codes_f = nullptr; - - if (trk_param_fpga.track_pilot) + if (d_track_pilot) { d_data_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())); } ca_codes_f = static_cast(volk_gnsssdr_malloc(static_cast(GALILEO_E1_B_CODE_LENGTH_CHIPS) * code_samples_per_chip * sizeof(float), volk_gnsssdr_get_alignment())); - if (trk_param_fpga.track_pilot) + if (d_track_pilot) { data_codes_f = static_cast(volk_gnsssdr_malloc((static_cast(GALILEO_E1_B_CODE_LENGTH_CHIPS)) * code_samples_per_chip * sizeof(float), volk_gnsssdr_get_alignment())); } @@ -152,7 +151,7 @@ GalileoE1DllPllVemlTrackingFpga::GalileoE1DllPllVemlTrackingFpga( for (uint32_t PRN = 1; PRN <= GALILEO_E1_NUMBER_OF_CODES; PRN++) { char data_signal[3] = "1B"; - if (trk_param_fpga.track_pilot) + if (d_track_pilot) { char pilot_signal[3] = "1C"; galileo_e1_code_gen_sinboc11_float(ca_codes_f, pilot_signal, PRN); @@ -176,9 +175,9 @@ GalileoE1DllPllVemlTrackingFpga::GalileoE1DllPllVemlTrackingFpga( } delete[] ca_codes_f; - if (trk_param_fpga.track_pilot) + if (d_track_pilot) { - delete[] data_codes_f; + volk_gnsssdr_free(data_codes_f); } trk_param_fpga.ca_codes = d_ca_codes; trk_param_fpga.data_codes = d_data_codes; @@ -200,6 +199,7 @@ GalileoE1DllPllVemlTrackingFpga::~GalileoE1DllPllVemlTrackingFpga() } } + void GalileoE1DllPllVemlTrackingFpga::start_tracking() { tracking_fpga_sc->start_tracking(); @@ -227,7 +227,7 @@ void GalileoE1DllPllVemlTrackingFpga::connect(gr::top_block_sptr top_block) if (top_block) { /* top_block is not null */ }; - //nothing to connect, now the tracking uses gr_sync_decimator + // nothing to connect, now the tracking uses gr_sync_decimator } @@ -236,7 +236,7 @@ void GalileoE1DllPllVemlTrackingFpga::disconnect(gr::top_block_sptr top_block) if (top_block) { /* top_block is not null */ }; - //nothing to disconnect, now the tracking uses gr_sync_decimator + // nothing to disconnect, now the tracking uses gr_sync_decimator } 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 003aec195..729bbe5b4 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 @@ -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, 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 f66c967bd..ba621e619 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 @@ -2,15 +2,7 @@ * \file galileo_e5a_dll_pll_tracking_fpga.cc * \brief Adapts a code DLL + carrier PLL * tracking block to a TrackingInterface for Galileo E5a signals for the FPGA - * \brief Adapts a PCPS acquisition block to an AcquisitionInterface for - * Galileo E5a data and pilot Signals for the FPGA - * \author Marc Sales, 2014. marcsales92(at)gmail.com - * \based on work from: - *
    - *
  • Marc Majoral, 2019. mmajoral(at)cttc.cat - *
  • Javier Arribas, 2011. jarribas(at)cttc.es - *
  • Luis Esteve, 2012. luis(at)epsilon-formacion.com - *
+ * \author Marc Majoral, 2019. mmajoral(at)cttc.cat * * ------------------------------------------------------------------------- * diff --git a/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking_fpga.h b/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking_fpga.h index 026069a51..b50f67207 100644 --- a/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking_fpga.h +++ b/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking_fpga.h @@ -2,15 +2,7 @@ * \file galileo_e5a_dll_pll_tracking_fpga.h * \brief Adapts a code DLL + carrier PLL * tracking block to a TrackingInterface for Galileo E5a signals for the FPGA - * \brief Adapts a PCPS acquisition block to an AcquisitionInterface for - * Galileo E5a data and pilot Signals for the FPGA - * \author Marc Sales, 2014. marcsales92(at)gmail.com - * \based on work from: - *
    - *
  • Marc Majoral, 2019. mmajoral(at)cttc.cat - *
  • Javier Arribas, 2011. jarribas(at)cttc.es - *
  • Luis Esteve, 2012. luis(at)epsilon-formacion.com - *
+ * \author Marc Majoral, 2019. mmajoral(at)cttc.cat * * ------------------------------------------------------------------------- * diff --git a/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking_fpga.cc b/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking_fpga.cc index 10939dbe8..57427275a 100644 --- a/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking_fpga.cc +++ b/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking_fpga.cc @@ -3,8 +3,6 @@ * \brief Implementation of an adapter of a DLL+PLL tracking loop block * for GPS L1 C/A to a TrackingInterface for the FPGA * \author Marc Majoral, 2019, mmajoral(at)cttc.es - * Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com - * Javier Arribas, 2011. jarribas(at)cttc.es * * Code DLL + carrier PLL according to the algorithms described in: * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, 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 cd1b8415f..f0117fdaa 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 @@ -3,8 +3,6 @@ * \brief Interface of an adapter of a DLL+PLL tracking loop block * for GPS L1 C/A to a TrackingInterface for the FPGA * \author Marc Majoral, 2019, mmajoral(at)cttc.es - * Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com - * Javier Arribas, 2011. jarribas(at)cttc.es * * Code DLL + carrier PLL according to the algorithms described in: * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, diff --git a/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking_fpga.cc b/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking_fpga.cc index c133b1ea1..6db3a0cd6 100644 --- a/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking_fpga.cc +++ b/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking_fpga.cc @@ -1,8 +1,8 @@ /*! - * \file gps_l2_m_dll_pll_tracking.cc + * \file gps_l2_m_dll_pll_tracking_fpga.cc * \brief Implementation of an adapter of a DLL+PLL tracking loop block - * for GPS L1 C/A to a TrackingInterface - * \author Javier Arribas, 2015. jarribas(at)cttc.es + * for GPS L2C to a TrackingInterface + * \author Javier Arribas, 2019. jarribas(at)cttc.es * * Code DLL + carrier PLL according to the algorithms described in: * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, diff --git a/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking_fpga.h b/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking_fpga.h index e1a606f1f..e734dea58 100644 --- a/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking_fpga.h +++ b/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking_fpga.h @@ -1,9 +1,8 @@ /*! - * \file gps_l2_m_dll_pll_tracking.h + * \file gps_l2_m_dll_pll_tracking_fpga.h * \brief Interface of an adapter of a DLL+PLL tracking loop block - * for GPS L1 C/A to a TrackingInterface - * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com - * Javier Arribas, 2011. jarribas(at)cttc.es + * for GPS L2C to a TrackingInterface + * \author Marc Majoral, 2019, mmajoral(at)cttc.es * * Code DLL + carrier PLL according to the algorithms described in: * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, diff --git a/src/algorithms/tracking/adapters/gps_l5_dll_pll_tracking_fpga.cc b/src/algorithms/tracking/adapters/gps_l5_dll_pll_tracking_fpga.cc index 764a69a97..19099270a 100644 --- a/src/algorithms/tracking/adapters/gps_l5_dll_pll_tracking_fpga.cc +++ b/src/algorithms/tracking/adapters/gps_l5_dll_pll_tracking_fpga.cc @@ -1,9 +1,9 @@ /*! - * \file gps_l5_dll_pll_tracking.cc + * \file gps_l5_dll_pll_tracking_fpga.cc * \brief Interface of an adapter of a DLL+PLL tracking loop block * for GPS L5 to a TrackingInterface * \author Marc Majoral, 2019. mmajoral(at)cttc.cat - * \author Javier Arribas, 2017. jarribas(at)cttc.es + * Javier Arribas, 2019. jarribas(at)cttc.es * * Code DLL + carrier PLL according to the algorithms described in: * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, @@ -135,37 +135,39 @@ GpsL5DllPllTrackingFpga::GpsL5DllPllTrackingFpga( auto code_length_chips = static_cast(GPS_L5I_CODE_LENGTH_CHIPS); float *tracking_code; - float *data_code; + float *data_code = nullptr; tracking_code = static_cast(volk_gnsssdr_malloc(code_length_chips * sizeof(float), volk_gnsssdr_get_alignment())); - if (trk_param_fpga.track_pilot) + if (track_pilot) { data_code = static_cast(volk_gnsssdr_malloc(code_length_chips * sizeof(float), volk_gnsssdr_get_alignment())); + for (uint32_t i = 0; i < code_length_chips; i++) + { + data_code[i] = 0.0; + } } d_ca_codes = static_cast(volk_gnsssdr_malloc(static_cast(code_length_chips * NUM_PRNs) * sizeof(int32_t), volk_gnsssdr_get_alignment())); - if (trk_param_fpga.track_pilot) + if (track_pilot) { d_data_codes = static_cast(volk_gnsssdr_malloc((static_cast(code_length_chips)) * NUM_PRNs * sizeof(int32_t), volk_gnsssdr_get_alignment())); } for (uint32_t PRN = 1; PRN <= NUM_PRNs; PRN++) { - if (trk_param_fpga.track_pilot) + if (track_pilot) { gps_l5q_code_gen_float(tracking_code, PRN); gps_l5i_code_gen_float(data_code, PRN); - for (uint32_t s = 0; s < code_length_chips; s++) { d_ca_codes[static_cast(code_length_chips) * (PRN - 1) + s] = static_cast(tracking_code[s]); d_data_codes[static_cast(code_length_chips) * (PRN - 1) + s] = static_cast(data_code[s]); } } - else { gps_l5i_code_gen_float(tracking_code, PRN); @@ -176,10 +178,10 @@ GpsL5DllPllTrackingFpga::GpsL5DllPllTrackingFpga( } } - delete[] tracking_code; - if (trk_param_fpga.track_pilot) + volk_gnsssdr_free(tracking_code); + if (track_pilot) { - delete[] data_code; + volk_gnsssdr_free(data_code); } trk_param_fpga.ca_codes = d_ca_codes; trk_param_fpga.data_codes = d_data_codes; 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 08c085d73..c61e1e81a 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 @@ -1,9 +1,9 @@ /*! - * \file gps_l5_dll_pll_tracking.h + * \file gps_l5_dll_pll_tracking_fpga.h * \brief Interface of an adapter of a DLL+PLL tracking loop block * for GPS L5 to a TrackingInterface * \author Marc Majoral, 2019. mmajoral(at)cttc.cat - * \author Javier Arribas, 2017. jarribas(at)cttc.es + * Javier Arribas, 2019. jarribas(at)cttc.es * * Code DLL + carrier PLL according to the algorithms described in: * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, 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 f470913e7..4c7f05109 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 @@ -2,8 +2,7 @@ * \file dll_pll_veml_tracking_fpga.cc * \brief Implementation of a code DLL + carrier PLL tracking block using an FPGA * \author Marc Majoral, 2019. marc.majoral(at)cttc.es - * \author Antonio Ramos, 2018 antonio.ramosdet(at)gmail.com - * \author Javier Arribas, 2018. jarribas(at)cttc.es + * \author Javier Arribas, 2019. jarribas(at)cttc.es * * Code DLL + carrier PLL according to the algorithms described in: * [1] K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, @@ -315,7 +314,6 @@ dll_pll_veml_tracking_fpga::dll_pll_veml_tracking_fpga(const Dll_Pll_Conf_Fpga & d_prompt_data_shift = &d_local_code_shift_chips[1]; } - if (trk_parameters.extend_correlation_symbols > 1) { d_enable_extended_integration = true; @@ -498,7 +496,6 @@ void dll_pll_veml_tracking_fpga::start_tracking() std::cout << "Tracking of " << systemName << " " << signal_pretty_name << " signal started on channel " << d_channel << " for satellite " << Gnss_Satellite(systemName, d_acquisition_gnss_synchro->PRN) << std::endl; DLOG(INFO) << "Starting tracking of satellite " << Gnss_Satellite(systemName, d_acquisition_gnss_synchro->PRN) << " on channel " << d_channel; - multicorrelator_fpga->set_local_code_and_taps(d_local_code_shift_chips, d_prompt_data_shift, d_acquisition_gnss_synchro->PRN); // enable tracking pull-in d_state = 1; @@ -677,7 +674,6 @@ void dll_pll_veml_tracking_fpga::run_dll_pll() // New carrier Doppler frequency estimation d_carrier_doppler_hz = d_acq_carrier_doppler_hz + d_carr_error_filt_hz; - // ################## DLL ########################################################## // DLL discriminator if (d_veml) @@ -753,7 +749,6 @@ void dll_pll_veml_tracking_fpga::update_tracking_vars() d_rem_carr_phase_rad += static_cast(d_carrier_phase_step_rad * static_cast(d_current_prn_length_samples) + 0.5 * d_carrier_phase_rate_step_rad * static_cast(d_current_prn_length_samples) * static_cast(d_current_prn_length_samples)); d_rem_carr_phase_rad = fmod(d_rem_carr_phase_rad, PI_2); - // carrier phase accumulator d_acc_carrier_phase_rad -= (d_carrier_phase_step_rad * static_cast(d_current_prn_length_samples) + 0.5 * d_carrier_phase_rate_step_rad * static_cast(d_current_prn_length_samples) * static_cast(d_current_prn_length_samples)); @@ -1021,7 +1016,6 @@ int32_t dll_pll_veml_tracking_fpga::save_matfile() auto *aux2 = new double[num_epoch]; auto *PRN = new uint32_t[num_epoch]; - try { if (dump_file.is_open()) @@ -1249,15 +1243,23 @@ void dll_pll_veml_tracking_fpga::stop_tracking() d_state = 0; } -int dll_pll_veml_tracking_fpga::general_work(int noutput_items __attribute__((unused)), gr_vector_int &ninput_items, - gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) + +void dll_pll_veml_tracking_fpga::reset(void) +{ + multicorrelator_fpga->unlock_channel(); +} + + +int dll_pll_veml_tracking_fpga::general_work(int noutput_items __attribute__((unused)), + gr_vector_int &ninput_items __attribute__((unused)), + gr_vector_const_void_star &input_items __attribute__((unused)), + gr_vector_void_star &output_items) { auto **out = reinterpret_cast(&output_items[0]); Gnss_Synchro current_synchro_data = Gnss_Synchro(); d_current_prn_length_samples = d_next_prn_length_samples; - switch (d_state) { case 0: // Standby - Consume samples at full throttle, do nothing @@ -1300,7 +1302,6 @@ int dll_pll_veml_tracking_fpga::general_work(int noutput_items __attribute__((un current_synchro_data.Tracking_sample_counter = absolute_samples_offset; d_sample_counter_next = d_sample_counter; - // Signal alignment (skip samples until the incoming signal is aligned with local replica) // Doppler effect Fd = (C / (C + Vr)) * F @@ -1477,6 +1478,7 @@ int dll_pll_veml_tracking_fpga::general_work(int noutput_items __attribute__((un return 0; } + void dll_pll_veml_tracking_fpga::run_state_2(Gnss_Synchro ¤t_synchro_data) { d_sample_counter = d_sample_counter_next; @@ -1649,9 +1651,3 @@ void dll_pll_veml_tracking_fpga::run_state_2(Gnss_Synchro ¤t_synchro_data) } } } - - -void dll_pll_veml_tracking_fpga::reset(void) -{ - multicorrelator_fpga->unlock_channel(); -} diff --git a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking_fpga.h b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking_fpga.h index 64e705aad..9fe6cbbbc 100644 --- a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking_fpga.h +++ b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking_fpga.h @@ -2,8 +2,7 @@ * \file dll_pll_veml_tracking_fpga.h * \brief Implementation of a code DLL + carrier PLL tracking block using an FPGA. * \author Marc Majoral, 2019. marc.majoral(at)cttc.es - * \author Javier Arribas, 2018. jarribas(at)cttc.es - * \author Antonio Ramos, 2018 antonio.ramosdet(at)gmail.com + * \author Javier Arribas, 2019. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * diff --git a/src/algorithms/tracking/libs/fpga_multicorrelator.cc b/src/algorithms/tracking/libs/fpga_multicorrelator.cc index c574bab69..adcfac599 100644 --- a/src/algorithms/tracking/libs/fpga_multicorrelator.cc +++ b/src/algorithms/tracking/libs/fpga_multicorrelator.cc @@ -1,12 +1,12 @@ /*! - * \file fpga_multicorrelator_8sc.cc - * \brief High optimized FPGA vector correlator class + * \file fpga_multicorrelator.cc + * \brief FPGA vector correlator class * \authors
    *
  • Marc Majoral, 2019. mmajoral(at)cttc.cat - *
  • Javier Arribas, 2015. jarribas(at)cttc.es + *
  • Javier Arribas, 2019. jarribas(at)cttc.es *
* - * Class that controls and executes a high optimized vector correlator + * Class that controls and executes a highly optimized vector correlator * class in the FPGA * * ------------------------------------------------------------------------- @@ -67,70 +67,6 @@ #define TEST_REGISTER_TRACK_WRITEVAL 0x55AA -uint64_t Fpga_Multicorrelator_8sc::read_sample_counter() -{ - uint64_t sample_counter_tmp, sample_counter_msw_tmp; - sample_counter_tmp = d_map_base[SAMPLE_COUNTER_REG_ADDR_LSW]; - sample_counter_msw_tmp = d_map_base[SAMPLE_COUNTER_REG_ADDR_MSW]; - sample_counter_msw_tmp = sample_counter_msw_tmp << 32; - sample_counter_tmp = sample_counter_tmp + sample_counter_msw_tmp; // 2^32 - return sample_counter_tmp; -} - -void Fpga_Multicorrelator_8sc::set_initial_sample(uint64_t samples_offset) -{ - d_initial_sample_counter = samples_offset; - d_map_base[INITIAL_COUNTER_VALUE_REG_ADDR_LSW] = (d_initial_sample_counter & 0xFFFFFFFF); - d_map_base[INITIAL_COUNTER_VALUE_REG_ADDR_MSW] = (d_initial_sample_counter >> 32) & 0xFFFFFFFF; -} - -void Fpga_Multicorrelator_8sc::set_local_code_and_taps(float *shifts_chips, float *prompt_data_shift, int32_t PRN) -{ - d_shifts_chips = shifts_chips; - d_prompt_data_shift = prompt_data_shift; - Fpga_Multicorrelator_8sc::fpga_configure_tracking_gps_local_code(PRN); -} - -void Fpga_Multicorrelator_8sc::set_output_vectors(gr_complex *corr_out, gr_complex *Prompt_Data) -{ - d_corr_out = corr_out; - d_Prompt_Data = Prompt_Data; -} - -void Fpga_Multicorrelator_8sc::update_local_code(float rem_code_phase_chips) -{ - d_rem_code_phase_chips = rem_code_phase_chips; - Fpga_Multicorrelator_8sc::fpga_compute_code_shift_parameters(); - Fpga_Multicorrelator_8sc::fpga_configure_code_parameters_in_fpga(); -} - - -void Fpga_Multicorrelator_8sc::Carrier_wipeoff_multicorrelator_resampler( - float rem_carrier_phase_in_rad, float phase_step_rad, - float carrier_phase_rate_step_rad, - float rem_code_phase_chips, float code_phase_step_chips, - float code_phase_rate_step_chips, - int32_t signal_length_samples) -{ - update_local_code(rem_code_phase_chips); - d_rem_carrier_phase_in_rad = rem_carrier_phase_in_rad; - d_code_phase_step_chips = code_phase_step_chips; - d_phase_step_rad = phase_step_rad; - d_correlator_length_samples = signal_length_samples; - Fpga_Multicorrelator_8sc::fpga_compute_signal_parameters_in_fpga(); - Fpga_Multicorrelator_8sc::fpga_configure_signal_parameters_in_fpga(); - Fpga_Multicorrelator_8sc::fpga_launch_multicorrelator_fpga(); - int32_t irq_count; - ssize_t nb; - nb = read(d_device_descriptor, &irq_count, sizeof(irq_count)); - if (nb != sizeof(irq_count)) - { - std::cout << "Tracking_module Read failed to retrieve 4 bytes!" << std::endl; - std::cout << "Tracking_module Interrupt number " << irq_count << std::endl; - } - Fpga_Multicorrelator_8sc::read_tracking_gps_results(); -} - 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, uint32_t multicorr_type, uint32_t code_samples_per_chip) @@ -186,6 +122,77 @@ Fpga_Multicorrelator_8sc::~Fpga_Multicorrelator_8sc() } +uint64_t Fpga_Multicorrelator_8sc::read_sample_counter() +{ + uint64_t sample_counter_tmp, sample_counter_msw_tmp; + sample_counter_tmp = d_map_base[SAMPLE_COUNTER_REG_ADDR_LSW]; + sample_counter_msw_tmp = d_map_base[SAMPLE_COUNTER_REG_ADDR_MSW]; + sample_counter_msw_tmp = sample_counter_msw_tmp << 32; + sample_counter_tmp = sample_counter_tmp + sample_counter_msw_tmp; // 2^32 + return sample_counter_tmp; +} + + +void Fpga_Multicorrelator_8sc::set_initial_sample(uint64_t samples_offset) +{ + d_initial_sample_counter = samples_offset; + d_map_base[INITIAL_COUNTER_VALUE_REG_ADDR_LSW] = (d_initial_sample_counter & 0xFFFFFFFF); + d_map_base[INITIAL_COUNTER_VALUE_REG_ADDR_MSW] = (d_initial_sample_counter >> 32) & 0xFFFFFFFF; +} + + +void Fpga_Multicorrelator_8sc::set_local_code_and_taps(float *shifts_chips, float *prompt_data_shift, int32_t PRN) +{ + d_shifts_chips = shifts_chips; + d_prompt_data_shift = prompt_data_shift; + Fpga_Multicorrelator_8sc::fpga_configure_tracking_gps_local_code(PRN); +} + + +void Fpga_Multicorrelator_8sc::set_output_vectors(gr_complex *corr_out, gr_complex *Prompt_Data) +{ + d_corr_out = corr_out; + d_Prompt_Data = Prompt_Data; +} + + +void Fpga_Multicorrelator_8sc::update_local_code(float rem_code_phase_chips) +{ + d_rem_code_phase_chips = rem_code_phase_chips; + Fpga_Multicorrelator_8sc::fpga_compute_code_shift_parameters(); + Fpga_Multicorrelator_8sc::fpga_configure_code_parameters_in_fpga(); +} + + +void Fpga_Multicorrelator_8sc::Carrier_wipeoff_multicorrelator_resampler( + float rem_carrier_phase_in_rad, + float phase_step_rad, + float carrier_phase_rate_step_rad __attribute__((unused)), + float rem_code_phase_chips, + float code_phase_step_chips __attribute__((unused)), + float code_phase_rate_step_chips __attribute__((unused)), + int32_t signal_length_samples) +{ + update_local_code(rem_code_phase_chips); + d_rem_carrier_phase_in_rad = rem_carrier_phase_in_rad; + d_code_phase_step_chips = code_phase_step_chips; + d_phase_step_rad = phase_step_rad; + d_correlator_length_samples = signal_length_samples; + Fpga_Multicorrelator_8sc::fpga_compute_signal_parameters_in_fpga(); + Fpga_Multicorrelator_8sc::fpga_configure_signal_parameters_in_fpga(); + Fpga_Multicorrelator_8sc::fpga_launch_multicorrelator_fpga(); + int32_t irq_count; + ssize_t nb; + nb = read(d_device_descriptor, &irq_count, sizeof(irq_count)); + if (nb != sizeof(irq_count)) + { + std::cout << "Tracking_module Read failed to retrieve 4 bytes!" << std::endl; + std::cout << "Tracking_module Interrupt number " << irq_count << std::endl; + } + Fpga_Multicorrelator_8sc::read_tracking_gps_results(); +} + + bool Fpga_Multicorrelator_8sc::free() { // unlock the channel @@ -424,8 +431,11 @@ void Fpga_Multicorrelator_8sc::fpga_launch_multicorrelator_fpga(void) { // enable interrupts int32_t reenable = 1; - write(d_device_descriptor, reinterpret_cast(&reenable), sizeof(int32_t)); - + ssize_t nbytes = TEMP_FAILURE_RETRY(write(d_device_descriptor, reinterpret_cast(&reenable), sizeof(int32_t))); + if (nbytes != sizeof(int32_t)) + { + std::cerr << "Error launching the FPGA multicorrelator" << std::endl; + } // writing 1 to reg 14 launches the tracking d_map_base[START_FLAG_ADDR] = 1; } @@ -459,6 +469,7 @@ void Fpga_Multicorrelator_8sc::unlock_channel(void) d_map_base[STOP_TRACKING_REG_ADDR] = 1; // set the tracking module back to idle } + void Fpga_Multicorrelator_8sc::close_device() { auto *aux = const_cast(d_map_base); diff --git a/src/algorithms/tracking/libs/fpga_multicorrelator.h b/src/algorithms/tracking/libs/fpga_multicorrelator.h index ddf1930c1..155503002 100644 --- a/src/algorithms/tracking/libs/fpga_multicorrelator.h +++ b/src/algorithms/tracking/libs/fpga_multicorrelator.h @@ -1,12 +1,12 @@ /*! - * \file fpga_multicorrelator_8sc.h - * \brief High optimized FPGA vector correlator class + * \file fpga_multicorrelator.h + * \brief FPGA vector correlator class * \authors
    *
  • Marc Majoral, 2019. mmajoral(at)cttc.cat - *
  • Javier Arribas, 2016. jarribas(at)cttc.es + *
  • Javier Arribas, 2019. jarribas(at)cttc.es *
* - * Class that controls and executes a high optimized vector correlator + * Class that controls and executes a highly optimized vector correlator * class in the FPGA * * ------------------------------------------------------------------------- diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_test_fpga.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_test_fpga.cc index 458f53f3f..d43aef640 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_test_fpga.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_test_fpga.cc @@ -102,7 +102,11 @@ void thread_acquisition_send_rx_samples(gr::top_block_sptr top_block, pointer_float = (float *)&buffer_float[0]; for (int k = 0; k < file_length; k = k + FLOAT_SIZE) { - fread(buffer_float, FLOAT_SIZE, 1, rx_signal_file); + size_t result = fread(buffer_float, FLOAT_SIZE, 1, rx_signal_file); + if (result != FLOAT_SIZE) + { + std::cerr << "Error reading buffer" << std::endl; + } if (fabs(pointer_float[0]) > max) { @@ -152,7 +156,11 @@ void thread_acquisition_send_rx_samples(gr::top_block_sptr top_block, for (int t = 0; t < transfer_size; t++) { - fread(buffer_float, FLOAT_SIZE, 1, rx_signal_file); + size_t result = fread(buffer_float, FLOAT_SIZE, 1, rx_signal_file); + if (result != FLOAT_SIZE) + { + std::cerr << "Error reading buffer" << std::endl; + } // specify (float) (int) for a quantization maximizing the dynamic range buffer_DMA[t] = static_cast((pointer_float[0] * (RX_SIGNAL_MAX_VALUE - 1) / max)); diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l1_ca_dll_pll_tracking_test_fpga.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l1_ca_dll_pll_tracking_test_fpga.cc index 78303a1cf..b492e7d21 100644 --- a/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l1_ca_dll_pll_tracking_test_fpga.cc +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l1_ca_dll_pll_tracking_test_fpga.cc @@ -102,7 +102,11 @@ void send_tracking_gps_input_samples(FILE *rx_signal_file, } if (num_remaining_samples > DMA_TRACK_TRANSFER_SIZE) { - fread(buffer_DMA, DMA_TRACK_TRANSFER_SIZE, 1, rx_signal_file); + size_t result = fread(buffer_DMA, DMA_TRACK_TRANSFER_SIZE, 1, rx_signal_file); + if (result != DMA_TRACK_TRANSFER_SIZE) + { + std::cerr << "Error reading from DMA" << std::endl; + } assert(DMA_TRACK_TRANSFER_SIZE == write(dma_descr, &buffer_DMA[0], DMA_TRACK_TRANSFER_SIZE)); num_remaining_samples = num_remaining_samples - DMA_TRACK_TRANSFER_SIZE; @@ -110,8 +114,11 @@ void send_tracking_gps_input_samples(FILE *rx_signal_file, } else { - fread(buffer_DMA, num_remaining_samples, 1, rx_signal_file); - + size_t result = fread(buffer_DMA, num_remaining_samples, 1, rx_signal_file); + if (static_cast(result) != num_remaining_samples) + { + std::cerr << "Error reading from DMA" << std::endl; + } assert(num_remaining_samples == write(dma_descr, &buffer_DMA[0], num_remaining_samples)); num_samples_transferred = num_samples_transferred + num_remaining_samples; num_remaining_samples = 0;