From 55b1f316edefd6a958f5f81521afdb3c68f123f8 Mon Sep 17 00:00:00 2001 From: Javier Arribas Date: Wed, 20 Mar 2019 16:57:50 +0100 Subject: [PATCH] Removing gnuradio block inheritance in FPGA acquisition --- ...ileo_e1_pcps_ambiguous_acquisition_fpga.cc | 6 ++-- .../galileo_e5a_pcps_acquisition_fpga.cc | 7 ++-- .../gps_l1_ca_pcps_acquisition_fpga.cc | 6 ++-- .../gps_l2_m_pcps_acquisition_fpga.cc | 7 ++-- .../adapters/gps_l5i_pcps_acquisition_fpga.cc | 6 ++-- .../gnuradio_blocks/pcps_acquisition_fpga.cc | 36 ++++++------------- .../gnuradio_blocks/pcps_acquisition_fpga.h | 10 ++---- src/algorithms/channel/adapters/channel.cc | 28 +++++++++++---- 8 files changed, 56 insertions(+), 50 deletions(-) diff --git a/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition_fpga.cc b/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition_fpga.cc index 191279974..898ba8d62 100644 --- a/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition_fpga.cc +++ b/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition_fpga.cc @@ -64,6 +64,9 @@ GalileoE1PcpsAmbiguousAcquisitionFpga::GalileoE1PcpsAmbiguousAcquisitionFpga( int64_t fs_in_deprecated = configuration_->property("GNSS-SDR.internal_fs_hz", 4000000); int64_t fs_in = configuration_->property("GNSS-SDR.internal_fs_sps", fs_in_deprecated); + acq_parameters.repeat_satellite = configuration_->property(role + ".repeat_satellite", false); + DLOG(INFO) << role << " satellite repeat = " << acq_parameters.repeat_satellite; + float downsampling_factor = configuration_->property(role + ".downsampling_factor", 4.0); acq_parameters.downsampling_factor = downsampling_factor; @@ -163,7 +166,6 @@ GalileoE1PcpsAmbiguousAcquisitionFpga::GalileoE1PcpsAmbiguousAcquisitionFpga( acq_parameters.total_block_exp = configuration_->property(role + ".total_block_exp", 14); acquisition_fpga_ = pcps_make_acquisition_fpga(acq_parameters); - DLOG(INFO) << "acquisition(" << acquisition_fpga_->unique_id() << ")"; channel_ = 0; doppler_step_ = 0; @@ -274,5 +276,5 @@ gr::basic_block_sptr GalileoE1PcpsAmbiguousAcquisitionFpga::get_left_block() gr::basic_block_sptr GalileoE1PcpsAmbiguousAcquisitionFpga::get_right_block() { - return acquisition_fpga_; + return nullptr; } diff --git a/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition_fpga.cc b/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition_fpga.cc index 5c79068ed..3da2486c2 100644 --- a/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition_fpga.cc +++ b/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition_fpga.cc @@ -61,6 +61,10 @@ GalileoE5aPcpsAcquisitionFpga::GalileoE5aPcpsAcquisitionFpga(ConfigurationInterf int64_t fs_in_deprecated = configuration_->property("GNSS-SDR.internal_fs_hz", 32000000); int64_t fs_in = configuration_->property("GNSS-SDR.internal_fs_sps", fs_in_deprecated); + + acq_parameters.repeat_satellite = configuration_->property(role + ".repeat_satellite", false); + DLOG(INFO) << role << " satellite repeat = " << acq_parameters.repeat_satellite; + float downsampling_factor = configuration_->property(role + ".downsampling_factor", 1.0); acq_parameters.downsampling_factor = downsampling_factor; fs_in = fs_in / downsampling_factor; @@ -164,7 +168,6 @@ GalileoE5aPcpsAcquisitionFpga::GalileoE5aPcpsAcquisitionFpga(ConfigurationInterf acq_parameters.total_block_exp = configuration_->property(role + ".total_block_exp", 14); acquisition_fpga_ = pcps_make_acquisition_fpga(acq_parameters); - DLOG(INFO) << "acquisition(" << acquisition_fpga_->unique_id() << ")"; channel_ = 0; doppler_step_ = 0; @@ -274,5 +277,5 @@ gr::basic_block_sptr GalileoE5aPcpsAcquisitionFpga::get_left_block() gr::basic_block_sptr GalileoE5aPcpsAcquisitionFpga::get_right_block() { - return acquisition_fpga_; + return nullptr; } diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition_fpga.cc b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition_fpga.cc index 2505180f0..ff300ea57 100644 --- a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition_fpga.cc +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition_fpga.cc @@ -68,6 +68,9 @@ GpsL1CaPcpsAcquisitionFpga::GpsL1CaPcpsAcquisitionFpga( int64_t fs_in_deprecated = configuration_->property("GNSS-SDR.internal_fs_hz", 2048000); int64_t fs_in = configuration_->property("GNSS-SDR.internal_fs_sps", fs_in_deprecated); + acq_parameters.repeat_satellite = configuration_->property(role + ".repeat_satellite", false); + DLOG(INFO) << role << " satellite repeat = " << acq_parameters.repeat_satellite; + float downsampling_factor = configuration_->property(role + ".downsampling_factor", 4.0); acq_parameters.downsampling_factor = downsampling_factor; @@ -146,7 +149,6 @@ GpsL1CaPcpsAcquisitionFpga::GpsL1CaPcpsAcquisitionFpga( acq_parameters.total_block_exp = configuration_->property(role + ".total_block_exp", 14); acquisition_fpga_ = pcps_make_acquisition_fpga(acq_parameters); - DLOG(INFO) << "acquisition(" << acquisition_fpga_->unique_id() << ")"; channel_ = 0; doppler_step_ = 0; @@ -257,5 +259,5 @@ gr::basic_block_sptr GpsL1CaPcpsAcquisitionFpga::get_left_block() gr::basic_block_sptr GpsL1CaPcpsAcquisitionFpga::get_right_block() { - return acquisition_fpga_; + return nullptr; } 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 cc08b8bb2..6dcb7e224 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 @@ -70,6 +70,9 @@ GpsL2MPcpsAcquisitionFpga::GpsL2MPcpsAcquisitionFpga( fs_in_ = configuration_->property("GNSS-SDR.internal_fs_sps", fs_in_deprecated); acq_parameters.fs_in = fs_in_; + acq_parameters.repeat_satellite = configuration_->property(role + ".repeat_satellite", false); + DLOG(INFO) << role << " satellite repeat = " << acq_parameters.repeat_satellite; + doppler_max_ = configuration->property(role + ".doppler_max", 5000); if (FLAGS_doppler_max != 0) doppler_max_ = FLAGS_doppler_max; acq_parameters.doppler_max = doppler_max_; @@ -139,13 +142,11 @@ GpsL2MPcpsAcquisitionFpga::GpsL2MPcpsAcquisitionFpga( delete[] fft_codes_padded; acquisition_fpga_ = pcps_make_acquisition_fpga(acq_parameters); - DLOG(INFO) << "acquisition(" << acquisition_fpga_->unique_id() << ")"; channel_ = 0; doppler_step_ = 0; gnss_synchro_ = nullptr; channel_fsm_ = nullptr; - DLOG(INFO) << "acquisition(" << acquisition_fpga_->unique_id() << ")"; threshold_ = 0.0; } @@ -253,5 +254,5 @@ gr::basic_block_sptr GpsL2MPcpsAcquisitionFpga::get_left_block() gr::basic_block_sptr GpsL2MPcpsAcquisitionFpga::get_right_block() { - return acquisition_fpga_; + return nullptr; } diff --git a/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition_fpga.cc b/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition_fpga.cc index 92b43c988..413f68783 100644 --- a/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition_fpga.cc +++ b/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition_fpga.cc @@ -67,6 +67,9 @@ GpsL5iPcpsAcquisitionFpga::GpsL5iPcpsAcquisitionFpga( int64_t fs_in_deprecated = configuration_->property("GNSS-SDR.internal_fs_hz", 2048000); int64_t fs_in = configuration_->property("GNSS-SDR.internal_fs_sps", fs_in_deprecated); + acq_parameters.repeat_satellite = configuration_->property(role + ".repeat_satellite", false); + DLOG(INFO) << role << " satellite repeat = " << acq_parameters.repeat_satellite; + float downsampling_factor = configuration_->property(role + ".downsampling_factor", 1.0); acq_parameters.downsampling_factor = downsampling_factor; @@ -146,7 +149,6 @@ GpsL5iPcpsAcquisitionFpga::GpsL5iPcpsAcquisitionFpga( acq_parameters.total_block_exp = configuration_->property(role + ".total_block_exp", 14); acquisition_fpga_ = pcps_make_acquisition_fpga(acq_parameters); - DLOG(INFO) << "acquisition(" << acquisition_fpga_->unique_id() << ")"; channel_ = 0; doppler_step_ = 0; @@ -258,5 +260,5 @@ gr::basic_block_sptr GpsL5iPcpsAcquisitionFpga::get_left_block() gr::basic_block_sptr GpsL5iPcpsAcquisitionFpga::get_right_block() { - return acquisition_fpga_; + return nullptr; } diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fpga.cc b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fpga.cc index f89d0fc16..9ffbcaabd 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fpga.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fpga.cc @@ -52,12 +52,8 @@ pcps_acquisition_fpga_sptr pcps_make_acquisition_fpga(pcpsconf_fpga_t conf_) } -pcps_acquisition_fpga::pcps_acquisition_fpga(pcpsconf_fpga_t conf_) : gr::block("pcps_acquisition_fpga", - gr::io_signature::make(0, 0, 0), - gr::io_signature::make(0, 0, 0)) +pcps_acquisition_fpga::pcps_acquisition_fpga(pcpsconf_fpga_t conf_) { - this->message_port_register_out(pmt::mp("events")); - acq_parameters = std::move(conf_); d_sample_counter = 0ULL; // SAMPLE COUNTER d_active = false; @@ -150,15 +146,8 @@ void pcps_acquisition_fpga::send_positive_acquisition() << ", magnitude " << d_mag << ", input signal power " << d_input_power; - if (d_channel_fsm) - { - //the channel FSM is set, so, notify it directly the positive acquisition to minimize delays - d_channel_fsm->Event_valid_acquisition(); - } - else - { - this->message_port_pub(pmt::mp("events"), pmt::from_long(1)); - } + //the channel FSM is set, so, notify it directly the positive acquisition to minimize delays + d_channel_fsm->Event_valid_acquisition(); } @@ -175,7 +164,14 @@ void pcps_acquisition_fpga::send_negative_acquisition() << ", magnitude " << d_mag << ", input signal power " << d_input_power; - this->message_port_pub(pmt::mp("events"), pmt::from_long(2)); + if (acq_parameters.repeat_satellite == true) + { + d_channel_fsm->Event_failed_acquisition_repeat(); + } + else + { + d_channel_fsm->Event_failed_acquisition_no_repeat(); + } } @@ -266,16 +262,6 @@ void pcps_acquisition_fpga::set_active(bool active) } -int pcps_acquisition_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 __attribute__((unused))) -{ - // the general work is not used with the acquisition that uses the FPGA - return noutput_items; -} - - void pcps_acquisition_fpga::reset_acquisition(void) { // this function triggers a HW reset of the FPGA PL. diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fpga.h b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fpga.h index 4ee9acb81..f7d13b50f 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fpga.h +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fpga.h @@ -68,6 +68,7 @@ typedef struct float downsampling_factor; uint32_t total_block_exp; uint32_t excludelimit; + bool repeat_satellite; } pcpsconf_fpga_t; class pcps_acquisition_fpga; @@ -83,7 +84,7 @@ pcps_make_acquisition_fpga(pcpsconf_fpga_t conf_); * Check \ref Navitec2012 "An Open Source Galileo E1 Software Receiver", * Algorithm 1, for a pseudocode description of this implementation. */ -class pcps_acquisition_fpga : public gr::block +class pcps_acquisition_fpga { private: friend pcps_acquisition_fpga_sptr pcps_make_acquisition_fpga(pcpsconf_fpga_t conf_); @@ -221,13 +222,6 @@ public: * \brief This funciton is only used for the unit tests */ void read_fpga_total_scale_factor(uint32_t* total_scale_factor, uint32_t* fw_scale_factor); - - /*! - * \brief Parallel Code Phase Search Acquisition signal processing. - */ - int general_work(int noutput_items, gr_vector_int& ninput_items, - gr_vector_const_void_star& input_items, - gr_vector_void_star& output_items); }; #endif /* GNSS_SDR_PCPS_ACQUISITION_FPGA_H_*/ diff --git a/src/algorithms/channel/adapters/channel.cc b/src/algorithms/channel/adapters/channel.cc index c68c35628..9620e5d67 100644 --- a/src/algorithms/channel/adapters/channel.cc +++ b/src/algorithms/channel/adapters/channel.cc @@ -55,7 +55,7 @@ Channel::Channel(ConfigurationInterface* configuration, uint32_t channel, std::s queue_ = std::move(queue); channel_fsm_ = std::make_shared(); - flag_enable_fpga = configuration->property("Channel.enable_FPGA", false); + flag_enable_fpga = configuration->property("GNSS-SDR.enable_FPGA", false); acq_->set_channel(channel_); acq_->set_channel_fsm(channel_fsm_); trk_->set_channel(channel_); @@ -125,7 +125,10 @@ Channel::~Channel() = default; void Channel::connect(gr::top_block_sptr top_block) { - acq_->connect(top_block); + if (!flag_enable_fpga) + { + acq_->connect(top_block); + } trk_->connect(top_block); nav_->connect(top_block); @@ -136,7 +139,10 @@ void Channel::connect(gr::top_block_sptr top_block) DLOG(INFO) << "tracking -> telemetry_decoder"; // Message ports - top_block->msg_connect(acq_->get_right_block(), pmt::mp("events"), channel_msg_rx, pmt::mp("events")); + if (!flag_enable_fpga) + { + top_block->msg_connect(acq_->get_right_block(), pmt::mp("events"), channel_msg_rx, pmt::mp("events")); + } top_block->msg_connect(trk_->get_right_block(), pmt::mp("events"), channel_msg_rx, pmt::mp("events")); connected_ = true; @@ -152,12 +158,18 @@ void Channel::disconnect(gr::top_block_sptr top_block) } top_block->disconnect(trk_->get_right_block(), 0, nav_->get_left_block(), 0); - - acq_->disconnect(top_block); + if (!flag_enable_fpga) + { + acq_->disconnect(top_block); + } trk_->disconnect(top_block); nav_->disconnect(top_block); + top_block->msg_disconnect(nav_->get_left_block(), pmt::mp("telemetry_to_trk"), trk_->get_right_block(), pmt::mp("telemetry_to_trk")); - top_block->msg_disconnect(acq_->get_right_block(), pmt::mp("events"), channel_msg_rx, pmt::mp("events")); + if (!flag_enable_fpga) + { + top_block->msg_disconnect(acq_->get_right_block(), pmt::mp("events"), channel_msg_rx, pmt::mp("events")); + } top_block->msg_disconnect(trk_->get_right_block(), pmt::mp("events"), channel_msg_rx, pmt::mp("events")); connected_ = false; } @@ -178,6 +190,10 @@ gr::basic_block_sptr Channel::get_left_block_trk() gr::basic_block_sptr Channel::get_left_block_acq() { + if (flag_enable_fpga) + { + LOG(ERROR) << "Enabled FPGA and called get_left_block() in channel interface"; + } return acq_->get_left_block(); }