From 71d93dc4b968526fe0e2449f6cfbcdb73a71324e Mon Sep 17 00:00:00 2001 From: Javier Arribas Date: Thu, 11 Jul 2019 18:39:28 +0200 Subject: [PATCH 01/36] New asynchronous channel and PVT status reporting from observables and PVT to flowgraph. Partial implementation of assistance from L1 to L2 and L5 --- .../PVT/gnuradio_blocks/rtklib_pvt_gs.cc | 18 +- .../PVT/gnuradio_blocks/rtklib_pvt_gs.h | 1 + .../PVT/libs/monitor_pvt_udp_sink.cc | 4 +- .../PVT/libs/monitor_pvt_udp_sink.h | 4 +- src/algorithms/PVT/libs/serdes_monitor_pvt.h | 60 +- .../gnuradio_blocks/hybrid_observables_gs.cc | 19 +- .../gnuradio_blocks/hybrid_observables_gs.h | 1 + src/core/libs/CMakeLists.txt | 3 + src/core/libs/channel_status_msg_receiver.cc | 116 ++++ src/core/libs/channel_status_msg_receiver.h | 71 ++ src/core/receiver/gnss_flowgraph.cc | 649 ++++++++++++------ src/core/receiver/gnss_flowgraph.h | 9 +- .../pvt/serdes_monitor_pvt_test.cc | 5 +- 13 files changed, 711 insertions(+), 249 deletions(-) create mode 100644 src/core/libs/channel_status_msg_receiver.cc create mode 100644 src/core/libs/channel_status_msg_receiver.h diff --git a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc index 9ba86b425..5049154a4 100644 --- a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc +++ b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc @@ -126,9 +126,12 @@ rtklib_pvt_gs::rtklib_pvt_gs(uint32_t nchannels, { // Send feedback message to observables block with the receiver clock offset this->message_port_register_out(pmt::mp("pvt_to_observables")); + // Send PVT status to gnss_flowgraph + this->message_port_register_out(pmt::mp("status")); d_output_rate_ms = conf_.output_rate_ms; d_display_rate_ms = conf_.display_rate_ms; + d_report_rate_ms = 1000; //report every second PVT to gnss_synchro d_dump = conf_.dump; d_dump_mat = conf_.dump_mat and d_dump; d_dump_filename = conf_.dump_filename; @@ -3729,10 +3732,19 @@ int rtklib_pvt_gs::work(int noutput_items, gr_vector_const_void_star& input_item } // PVT MONITOR - if (d_pvt_solver->is_valid_position() and flag_monitor_pvt_enabled) + if (d_pvt_solver->is_valid_position()) { - Monitor_Pvt monitor_pvt = d_pvt_solver->get_monitor_pvt(); - udp_sink_ptr->write_monitor_pvt(monitor_pvt); + std::shared_ptr monitor_pvt = std::make_shared(d_pvt_solver->get_monitor_pvt()); + + //publish new position to the gnss_flowgraph channel status monitor + if (current_RX_time_ms % d_report_rate_ms == 0) + { + this->message_port_pub(pmt::mp("status"), pmt::make_any(monitor_pvt)); + } + if (flag_monitor_pvt_enabled) + { + udp_sink_ptr->write_monitor_pvt(monitor_pvt); + } } } } diff --git a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.h b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.h index 595cd2624..b046735d8 100644 --- a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.h +++ b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.h @@ -169,6 +169,7 @@ private: int32_t d_output_rate_ms; int32_t d_display_rate_ms; + int32_t d_report_rate_ms; std::shared_ptr rp; std::shared_ptr d_kml_dump; diff --git a/src/algorithms/PVT/libs/monitor_pvt_udp_sink.cc b/src/algorithms/PVT/libs/monitor_pvt_udp_sink.cc index 2796f13da..ed23fbb5d 100644 --- a/src/algorithms/PVT/libs/monitor_pvt_udp_sink.cc +++ b/src/algorithms/PVT/libs/monitor_pvt_udp_sink.cc @@ -51,14 +51,14 @@ Monitor_Pvt_Udp_Sink::Monitor_Pvt_Udp_Sink(const std::vector& addre } -bool Monitor_Pvt_Udp_Sink::write_monitor_pvt(const Monitor_Pvt& monitor_pvt) +bool Monitor_Pvt_Udp_Sink::write_monitor_pvt(std::shared_ptr monitor_pvt) { std::string outbound_data; if (use_protobuf == false) { std::ostringstream archive_stream; boost::archive::binary_oarchive oa{archive_stream}; - oa << monitor_pvt; + oa << *monitor_pvt.get(); outbound_data = archive_stream.str(); } else diff --git a/src/algorithms/PVT/libs/monitor_pvt_udp_sink.h b/src/algorithms/PVT/libs/monitor_pvt_udp_sink.h index f1f9146f4..588e70257 100644 --- a/src/algorithms/PVT/libs/monitor_pvt_udp_sink.h +++ b/src/algorithms/PVT/libs/monitor_pvt_udp_sink.h @@ -45,8 +45,8 @@ using b_io_context = boost::asio::io_service; class Monitor_Pvt_Udp_Sink { public: - Monitor_Pvt_Udp_Sink(const std::vector& addresses, const uint16_t &port, bool protobuf_enabled); - bool write_monitor_pvt(const Monitor_Pvt &monitor_pvt); + Monitor_Pvt_Udp_Sink(const std::vector& addresses, const uint16_t& port, bool protobuf_enabled); + bool write_monitor_pvt(std::shared_ptr monitor_pvt); private: b_io_context io_context; diff --git a/src/algorithms/PVT/libs/serdes_monitor_pvt.h b/src/algorithms/PVT/libs/serdes_monitor_pvt.h index 1b5ca11ca..1477442df 100644 --- a/src/algorithms/PVT/libs/serdes_monitor_pvt.h +++ b/src/algorithms/PVT/libs/serdes_monitor_pvt.h @@ -34,7 +34,7 @@ #include "monitor_pvt.h" #include "monitor_pvt.pb.h" // file created by Protocol Buffers at compile time - +#include /*! * \brief This class implements serialization and deserialization of @@ -80,40 +80,40 @@ public: return *this; } - inline std::string createProtobuffer(const Monitor_Pvt& monitor) //!< Serialization into a string + inline std::string createProtobuffer(std::shared_ptr monitor) //!< Serialization into a string { monitor_.Clear(); std::string data; - monitor_.set_tow_at_current_symbol_ms(monitor.TOW_at_current_symbol_ms); - monitor_.set_week(monitor.week); - monitor_.set_rx_time(monitor.RX_time); - monitor_.set_user_clk_offset(monitor.user_clk_offset); - monitor_.set_pos_x(monitor.pos_x); - monitor_.set_pos_y(monitor.pos_y); - monitor_.set_pos_z(monitor.pos_z); - monitor_.set_vel_x(monitor.vel_x); - monitor_.set_vel_y(monitor.vel_y); - monitor_.set_vel_z(monitor.vel_z); - monitor_.set_cov_xx(monitor.cov_xx); - monitor_.set_cov_yy(monitor.cov_yy); - monitor_.set_cov_zz(monitor.cov_zz); - monitor_.set_cov_xy(monitor.cov_xy); - monitor_.set_cov_yz(monitor.cov_yz); - monitor_.set_cov_zx(monitor.cov_zx); - monitor_.set_latitude(monitor.latitude); - monitor_.set_longitude(monitor.longitude); - monitor_.set_height(monitor.height); - monitor_.set_valid_sats(monitor.valid_sats); - monitor_.set_solution_status(monitor.solution_status); - monitor_.set_solution_type(monitor.solution_type); - monitor_.set_ar_ratio_factor(monitor.AR_ratio_factor); - monitor_.set_ar_ratio_threshold(monitor.AR_ratio_threshold); - monitor_.set_gdop(monitor.gdop); - monitor_.set_pdop(monitor.pdop); - monitor_.set_hdop(monitor.hdop); - monitor_.set_vdop(monitor.vdop); + monitor_.set_tow_at_current_symbol_ms(monitor->TOW_at_current_symbol_ms); + monitor_.set_week(monitor->week); + monitor_.set_rx_time(monitor->RX_time); + monitor_.set_user_clk_offset(monitor->user_clk_offset); + monitor_.set_pos_x(monitor->pos_x); + monitor_.set_pos_y(monitor->pos_y); + monitor_.set_pos_z(monitor->pos_z); + monitor_.set_vel_x(monitor->vel_x); + monitor_.set_vel_y(monitor->vel_y); + monitor_.set_vel_z(monitor->vel_z); + monitor_.set_cov_xx(monitor->cov_xx); + monitor_.set_cov_yy(monitor->cov_yy); + monitor_.set_cov_zz(monitor->cov_zz); + monitor_.set_cov_xy(monitor->cov_xy); + monitor_.set_cov_yz(monitor->cov_yz); + monitor_.set_cov_zx(monitor->cov_zx); + monitor_.set_latitude(monitor->latitude); + monitor_.set_longitude(monitor->longitude); + monitor_.set_height(monitor->height); + monitor_.set_valid_sats(monitor->valid_sats); + monitor_.set_solution_status(monitor->solution_status); + monitor_.set_solution_type(monitor->solution_type); + monitor_.set_ar_ratio_factor(monitor->AR_ratio_factor); + monitor_.set_ar_ratio_threshold(monitor->AR_ratio_threshold); + monitor_.set_gdop(monitor->gdop); + monitor_.set_pdop(monitor->pdop); + monitor_.set_hdop(monitor->hdop); + monitor_.set_vdop(monitor->vdop); monitor_.SerializeToString(&data); return data; diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_gs.cc b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_gs.cc index 91e4760f8..5ce1cc9dc 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_gs.cc +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_gs.cc @@ -104,6 +104,9 @@ hybrid_observables_gs::hybrid_observables_gs(uint32_t nchannels_in, this->message_port_register_in(pmt::mp("pvt_to_observables")); this->set_msg_handler(pmt::mp("pvt_to_observables"), boost::bind(&hybrid_observables_gs::msg_handler_pvt_to_observables, this, _1)); + // Send Channel status to gnss_flowgraph + this->message_port_register_out(pmt::mp("status")); + d_dump = dump; d_dump_mat = dump_mat and d_dump; d_dump_filename = std::move(dump_filename); @@ -160,7 +163,7 @@ hybrid_observables_gs::hybrid_observables_gs(uint32_t nchannels_in, T_rx_remnant_to_20ms = 0; T_rx_step_ms = 20; //read from config at the adapter GNSS-SDR.observable_interval_ms!! T_rx_TOW_set = false; - + T_status_report_timer_ms = 0; // rework d_Rx_clock_buffer.set_capacity(10); // 10*20 ms = 200 ms of data in buffer d_Rx_clock_buffer.clear(); // Clear all the elements in the buffer @@ -601,6 +604,20 @@ int hybrid_observables_gs::general_work(int noutput_items __attribute__((unused) { out[n][0] = epoch_data.at(n); } + + //report channel status every second + T_status_report_timer_ms += T_rx_step_ms; + if (T_status_report_timer_ms >= 1000) + { + for (uint32_t n = 0; n < d_nchannels_out; n++) + { + std::shared_ptr gnss_synchro_sptr = std::make_shared(epoch_data.at(n)); + //publish valid gnss_synchro to the gnss_flowgraph channel status monitor + this->message_port_pub(pmt::mp("status"), pmt::make_any(gnss_synchro_sptr)); + } + T_status_report_timer_ms = 0; + } + if (d_dump) { // MULTIPLEXED FILE RECORDING - Record results to file diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_gs.h b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_gs.h index f21510254..0c6150b54 100644 --- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_gs.h +++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_gs.h @@ -89,6 +89,7 @@ private: uint32_t T_rx_TOW_ms; uint32_t T_rx_remnant_to_20ms; uint32_t T_rx_step_ms; + uint32_t T_status_report_timer_ms; uint32_t d_nchannels_in; uint32_t d_nchannels_out; double T_rx_offset_ms; diff --git a/src/core/libs/CMakeLists.txt b/src/core/libs/CMakeLists.txt index a61dd6e2b..12485d937 100644 --- a/src/core/libs/CMakeLists.txt +++ b/src/core/libs/CMakeLists.txt @@ -24,6 +24,7 @@ set(CORE_LIBS_SOURCES string_converter.cc gnss_sdr_supl_client.cc gnss_sdr_sample_counter.cc + channel_status_msg_receiver.cc ) set(CORE_LIBS_HEADERS @@ -32,6 +33,7 @@ set(CORE_LIBS_HEADERS string_converter.h gnss_sdr_supl_client.h gnss_sdr_sample_counter.h + channel_status_msg_receiver.h ) if(ENABLE_FPGA) @@ -60,6 +62,7 @@ target_link_libraries(core_libs Gnuradio::runtime core_libs_supl core_system_parameters + pvt_libs PRIVATE Boost::serialization Gflags::gflags diff --git a/src/core/libs/channel_status_msg_receiver.cc b/src/core/libs/channel_status_msg_receiver.cc new file mode 100644 index 000000000..965a99a46 --- /dev/null +++ b/src/core/libs/channel_status_msg_receiver.cc @@ -0,0 +1,116 @@ +/*! + * \file channel_status_msg_receiver.cc + * \brief GNU Radio block that receives asynchronous channel messages from acquisition and tracking blocks + * \author Javier Arribas, 2016. jarribas(at)cttc.es + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + + +#include "channel_status_msg_receiver.h" +#include +#include +#include +#include +#include +#include +#include + + +channel_status_msg_receiver_sptr channel_status_msg_receiver_make() +{ + return channel_status_msg_receiver_sptr(new channel_status_msg_receiver()); +} + + +channel_status_msg_receiver::channel_status_msg_receiver() : gr::block("channel_status_msg_receiver", gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0)) +{ + this->message_port_register_in(pmt::mp("status")); + this->set_msg_handler(pmt::mp("status"), boost::bind(&channel_status_msg_receiver::msg_handler_events, this, _1)); + d_pvt_status.RX_time = -1; // to indicate that the PVT is not available +} + + +channel_status_msg_receiver::~channel_status_msg_receiver() = default; + + +void channel_status_msg_receiver::msg_handler_events(pmt::pmt_t msg) +{ + gr::thread::scoped_lock lock(d_setlock); // require mutex with msg_handler_events function called by the scheduler + try + { + // ************* Gnss_Synchro received ***************** + if (pmt::any_ref(msg).type() == typeid(std::shared_ptr)) + { + std::shared_ptr gnss_synchro_obj; + gnss_synchro_obj = boost::any_cast>(pmt::any_ref(msg)); + if (gnss_synchro_obj->Flag_valid_pseudorange == true) + { + d_channel_status_map[gnss_synchro_obj->Channel_ID] = gnss_synchro_obj; + } + else + { + d_channel_status_map.erase(gnss_synchro_obj->Channel_ID); + } + + // std::cout << "-------- \n\n"; + // for (std::map>::iterator it = d_channel_status_map.begin(); it != d_channel_status_map.end(); ++it) + // { + // std::cout << " Channel: " << it->first << " => Doppler: " << it->second->Carrier_Doppler_hz << "[Hz] \n"; + // } + // std::cout << "-------- \n\n"; + } + else if (pmt::any_ref(msg).type() == typeid(std::shared_ptr)) + { + // ************* Monitor_Pvt received ***************** + std::shared_ptr monitor_pvt_obj; + monitor_pvt_obj = boost::any_cast>(pmt::any_ref(msg)); + d_pvt_status = *monitor_pvt_obj.get(); + // + // std::cout << "-------- \n\n"; + // std::cout << "PVT TOW: " << d_pvt_status->TOW_at_current_symbol_ms << std::endl; + // std::cout << "-------- \n\n"; + } + else + { + LOG(WARNING) << "channel_status_msg_receiver unknown object type!"; + } + } + catch (boost::bad_any_cast& e) + { + LOG(WARNING) << "channel_status_msg_receiver Bad any cast!"; + } +} + +std::map> channel_status_msg_receiver::get_current_status_map() +{ + gr::thread::scoped_lock lock(d_setlock); // require mutex with msg_handler_events function called by the scheduler + return d_channel_status_map; +} +Monitor_Pvt channel_status_msg_receiver::get_current_status_pvt() +{ + gr::thread::scoped_lock lock(d_setlock); // require mutex with msg_handler_events function called by the scheduler + return d_pvt_status; +} diff --git a/src/core/libs/channel_status_msg_receiver.h b/src/core/libs/channel_status_msg_receiver.h new file mode 100644 index 000000000..283fc6f0e --- /dev/null +++ b/src/core/libs/channel_status_msg_receiver.h @@ -0,0 +1,71 @@ +/*! + * \file channel_msg_receiver_cc.h + * \brief GNU Radio block that receives asynchronous channel messages from acquisition and tracking blocks + * \author Javier Arribas, 2016. jarribas(at)cttc.es + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#ifndef GNSS_SDR_CHANNEL_STATUS_MSG_RECEIVER_CC_H +#define GNSS_SDR_CHANNEL_STATUS_MSG_RECEIVER_CC_H + +#include "gnss_synchro.h" +#include "monitor_pvt.h" +#include +#include +#include + +class channel_status_msg_receiver; + +using channel_status_msg_receiver_sptr = boost::shared_ptr; + +channel_status_msg_receiver_sptr channel_status_msg_receiver_make(); + +/*! + * \brief GNU Radio block that receives asynchronous channel messages from tlm blocks + */ +class channel_status_msg_receiver : public gr::block +{ +public: + ~channel_status_msg_receiver(); //!< Default destructor + /*! + * \brief return the current status map of all channels with valid telemetry + */ + std::map> get_current_status_map(); + /*! + * \brief return the current receiver PVT + */ + Monitor_Pvt get_current_status_pvt(); + +private: + friend channel_status_msg_receiver_sptr channel_status_msg_receiver_make(); + channel_status_msg_receiver(); + std::map> d_channel_status_map; + + Monitor_Pvt d_pvt_status; + void msg_handler_events(pmt::pmt_t msg); +}; + +#endif diff --git a/src/core/receiver/gnss_flowgraph.cc b/src/core/receiver/gnss_flowgraph.cc index 4d11c4193..5efa45f2b 100644 --- a/src/core/receiver/gnss_flowgraph.cc +++ b/src/core/receiver/gnss_flowgraph.cc @@ -598,7 +598,11 @@ void GNSSFlowgraph::connect() } if (sat == 0) { - channels_.at(i)->set_signal(search_next_signal(gnss_signal, false)); + bool assistance_available; + float estimated_doppler; + double RX_time; + bool is_primary_freq; + channels_.at(i)->set_signal(search_next_signal(gnss_signal, false, is_primary_freq, assistance_available, estimated_doppler, RX_time)); } else { @@ -680,7 +684,11 @@ void GNSSFlowgraph::connect() top_block_->connect(observables_->get_right_block(), i, pvt_->get_left_block(), i); top_block_->msg_connect(channels_.at(i)->get_right_block(), pmt::mp("telemetry"), pvt_->get_left_block(), pmt::mp("telemetry")); } + + top_block_->msg_connect(observables_->get_right_block(), pmt::mp("status"), channels_status_, pmt::mp("status")); + top_block_->msg_connect(pvt_->get_left_block(), pmt::mp("pvt_to_observables"), observables_->get_right_block(), pmt::mp("pvt_to_observables")); + top_block_->msg_connect(pvt_->get_left_block(), pmt::mp("status"), channels_status_, pmt::mp("status")); } catch (const std::exception& e) { @@ -1065,7 +1073,7 @@ bool GNSSFlowgraph::send_telemetry_msg(const pmt::pmt_t& msg) * \param[in] what What is the action: * --- actions from channels --- * -> 0 acquisition failed - * -> 1 acquisition successful + * -> 1 acquisition succesfull * -> 2 tracking lost * --- actions from TC receiver control --- * -> 10 TC request standby mode @@ -1078,6 +1086,8 @@ bool GNSSFlowgraph::send_telemetry_msg(const pmt::pmt_t& msg) */ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) { + //todo: the acquisition events are initiated from the acquisition success or failure queued msg. If the acquisition is disabled for non-assisted secondary freq channels, the engine stops.. + std::lock_guard lock(signal_list_mutex); DLOG(INFO) << "Received " << what << " from " << who << ". Number of applied actions = " << applied_actions_; unsigned int sat = 0; @@ -1167,20 +1177,34 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) } if ((acq_channels_count_ < max_acq_channels_) && (channels_state_[ch_index] == 0)) { - channels_state_[ch_index] = 1; + bool is_primary_freq = true; + bool assistance_available = false; if (sat_ == 0) { - channels_[ch_index]->set_signal(search_next_signal(channels_[ch_index]->get_signal().get_signal_str(), true)); + float estimated_doppler; + double RX_time; + Gnss_Signal gnss_signal; + gnss_signal = search_next_signal(channels_[ch_index]->get_signal().get_signal_str(), false, is_primary_freq, assistance_available, estimated_doppler, RX_time); + channels_[ch_index]->set_signal(gnss_signal); } - acq_channels_count_++; - DLOG(INFO) << "Channel " << ch_index << " Starting acquisition " << channels_[ch_index]->get_signal().get_satellite() << ", Signal " << channels_[ch_index]->get_signal().get_signal_str(); + //todo: add configuration parameter to enable the mandatory acquisition assistance in secondary freq + if (is_primary_freq == true or assistance_available == true) + { + channels_state_[ch_index] = 1; + acq_channels_count_++; + DLOG(INFO) << "Channel " << ch_index << " Starting acquisition " << channels_[ch_index]->get_signal().get_satellite() << ", Signal " << channels_[ch_index]->get_signal().get_signal_str(); #ifndef ENABLE_FPGA - channels_[ch_index]->start_acquisition(); + channels_[ch_index]->start_acquisition(); #else - // create a task for the FPGA such that it doesn't stop the flow - std::thread tmp_thread(&ChannelInterface::start_acquisition, channels_[ch_index]); - tmp_thread.detach(); + // create a task for the FPGA such that it doesn't stop the flow + std::thread tmp_thread(&ChannelInterface::start_acquisition, channels_[ch_index]); + tmp_thread.detach(); #endif + } + else + { + DLOG(INFO) << "Channel " << ch_index << " secondary frequency acquisition assistance not available in " << channels_[ch_index]->get_signal().get_satellite() << ", Signal " << channels_[ch_index]->get_signal().get_signal_str(); + } } DLOG(INFO) << "Channel " << ch_index << " in state " << channels_state_[ch_index]; } @@ -1248,20 +1272,34 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) } if ((acq_channels_count_ < max_acq_channels_) && (channels_state_[i] == 0)) { - channels_state_[i] = 1; + bool is_primary_freq = true; + bool assistance_available = false; if (sat_ == 0) { - channels_[i]->set_signal(search_next_signal(channels_[i]->get_signal().get_signal_str(), true, true)); + float estimated_doppler; + double RX_time; + Gnss_Signal gnss_signal; + gnss_signal = search_next_signal(channels_[i]->get_signal().get_signal_str(), true, is_primary_freq, assistance_available, estimated_doppler, RX_time); } - acq_channels_count_++; - DLOG(INFO) << "Channel " << i << " Starting acquisition " << channels_[i]->get_signal().get_satellite() << ", Signal " << channels_[i]->get_signal().get_signal_str(); + + //todo: add configuration parameter to enable the mandatory acquisition assistance in secondary freq + if (is_primary_freq == true or assistance_available == true) + { + channels_state_[i] = 1; + acq_channels_count_++; + DLOG(INFO) << "Channel " << i << " Starting acquisition " << channels_[i]->get_signal().get_satellite() << ", Signal " << channels_[i]->get_signal().get_signal_str(); #ifndef ENABLE_FPGA - channels_[i]->start_acquisition(); + channels_[i]->start_acquisition(); #else - // create a task for the FPGA such that it doesn't stop the flow - std::thread tmp_thread(&ChannelInterface::start_acquisition, channels_[i]); - tmp_thread.detach(); + // create a task for the FPGA such that it doesn't stop the flow + std::thread tmp_thread(&ChannelInterface::start_acquisition, channels_[i]); + tmp_thread.detach(); #endif + } + else + { + DLOG(INFO) << "Channel " << i << " secondary frequency acquisition assistance not available in " << channels_[i]->get_signal().get_satellite() << ", Signal " << channels_[i]->get_signal().get_signal_str(); + } } DLOG(INFO) << "Channel " << i << " in state " << channels_state_[i]; } @@ -1420,7 +1458,11 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) channels_state_[ch_index] = 1; if (sat_ == 0) { - channels_[ch_index]->set_signal(search_next_signal(channels_[ch_index]->get_signal().get_signal_str(), true)); + bool is_primary_freq; + bool assistance_available; + float estimated_doppler; + double RX_time; + channels_[ch_index]->set_signal(search_next_signal(channels_[ch_index]->get_signal().get_signal_str(), true, is_primary_freq, assistance_available, estimated_doppler, RX_time)); } acq_channels_count_++; DLOG(INFO) << "Channel " << ch_index << " Starting acquisition " << channels_[ch_index]->get_signal().get_satellite() << ", Signal " << channels_[ch_index]->get_signal().get_signal_str(); @@ -1454,7 +1496,11 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) channels_state_[ch_index] = 1; if (sat_ == 0) { - channels_[ch_index]->set_signal(search_next_signal(channels_[ch_index]->get_signal().get_signal_str(), true)); + bool is_primary_freq; + bool assistance_available; + float estimated_doppler; + double RX_time; + channels_[ch_index]->set_signal(search_next_signal(channels_[ch_index]->get_signal().get_signal_str(), true, is_primary_freq, assistance_available, estimated_doppler, RX_time)); } acq_channels_count_++; DLOG(INFO) << "Channel " << ch_index << " Starting acquisition " << channels_[ch_index]->get_signal().get_satellite() << ", Signal " << channels_[ch_index]->get_signal().get_signal_str(); @@ -1489,7 +1535,11 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) channels_state_[ch_index] = 1; if (sat_ == 0) { - channels_[ch_index]->set_signal(search_next_signal(channels_[ch_index]->get_signal().get_signal_str(), true)); + bool is_primary_freq; + bool assistance_available; + float estimated_doppler; + double RX_time; + channels_[ch_index]->set_signal(search_next_signal(channels_[ch_index]->get_signal().get_signal_str(), true, is_primary_freq, assistance_available, estimated_doppler, RX_time)); } acq_channels_count_++; DLOG(INFO) << "Channel " << ch_index << " Starting acquisition " << channels_[ch_index]->get_signal().get_satellite() << ", Signal " << channels_[ch_index]->get_signal().get_signal_str(); @@ -1610,6 +1660,8 @@ void GNSSFlowgraph::init() */ std::unique_ptr block_factory_(new GNSSBlockFactory()); + channels_status_ = channel_status_msg_receiver_make(); + // 1. read the number of RF front-ends available (one file_source per RF front-end) sources_count_ = configuration_->property("Receiver.sources_count", 1); @@ -2010,110 +2062,116 @@ void GNSSFlowgraph::set_channels_state() } -Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal, bool pop, bool tracked) +Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal, + const bool pop, + bool& is_primary_frequency, + bool& assistance_available, + float& estimated_doppler, + double& RX_time) { + is_primary_frequency = false; Gnss_Signal result; - bool untracked_satellite = true; switch (mapStringValues_[searched_signal]) { case evGPS_1C: + //todo: assist the satellite selection with almanac and current PVT here (rehuse priorize_satellite function used in control_thread) result = available_GPS_1C_signals_.front(); available_GPS_1C_signals_.pop_front(); if (!pop) { available_GPS_1C_signals_.push_back(result); } - if (tracked) - { - if ((configuration_->property("Channels_2S.count", 0) > 0) or (configuration_->property("Channels_L5.count", 0) > 0)) - { - for (unsigned int ch = 0; ch < channels_count_; ch++) - { - if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "1C")) - { - untracked_satellite = false; - } - } - if (untracked_satellite and configuration_->property("Channels_2S.count", 0) > 0) - { - Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "2S"); - available_GPS_2S_signals_.remove(gs); - available_GPS_2S_signals_.push_front(gs); - } - if (untracked_satellite and configuration_->property("Channels_L5.count", 0) > 0) - { - Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "L5"); - available_GPS_L5_signals_.remove(gs); - available_GPS_L5_signals_.push_front(gs); - } - } - } + is_primary_frequency = true; //indicate that the searched satellite signal belongs to "primary" link (L1, E1, B1, etc..) break; case evGPS_2S: - result = available_GPS_2S_signals_.front(); - available_GPS_2S_signals_.pop_front(); - if (!pop) + if (configuration_->property("Channels_1C.count", 0) > 0) { - available_GPS_2S_signals_.push_back(result); - } - if (tracked) - { - if ((configuration_->property("Channels_1C.count", 0) > 0) or (configuration_->property("Channels_L5.count", 0) > 0)) + //1. Get the current channel status map + std::map> current_channels_status = channels_status_->get_current_status_map(); + //2. search the currently tracked GPS L1 satellites and assist the GPS L2 acquisition if the satellite is not tracked on L2 + for (std::map>::iterator it = current_channels_status.begin(); it != current_channels_status.end(); ++it) { - for (unsigned int ch = 0; ch < channels_count_; ch++) + if (std::string(it->second->Signal) == "1C") { - if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "2S")) + std::list::iterator it2; + it2 = std::find_if(std::begin(available_GPS_2S_signals_), std::end(available_GPS_2S_signals_), + [&](Gnss_Signal const& sig) { return sig.get_satellite().get_PRN() == it->second->PRN; }); + + if (it2 != available_GPS_2S_signals_.end()) { - untracked_satellite = false; + std::cout << " Channel: " << it->first << " => Doppler: " << it->second->Carrier_Doppler_hz << "[Hz] \n"; + //3. return the GPS L2 satellite and remove it from list + result = *it2; + if (pop) + { + available_GPS_2S_signals_.erase(it2); + } + break; } } - if (untracked_satellite and configuration_->property("Channels_1C.count", 0) > 0) - { - Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "1C"); - available_GPS_1C_signals_.remove(gs); - available_GPS_1C_signals_.push_front(gs); - } - if (untracked_satellite and configuration_->property("Channels_L5.count", 0) > 0) - { - Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "L5"); - available_GPS_L5_signals_.remove(gs); - available_GPS_L5_signals_.push_front(gs); - } + } + //fallback: pick the front satellite because there is no tracked satellites in L1 to assist L2 + result = available_GPS_2S_signals_.front(); + available_GPS_2S_signals_.pop_front(); + if (!pop) + { + available_GPS_2S_signals_.push_back(result); + } + } + else + { + result = available_GPS_2S_signals_.front(); + available_GPS_2S_signals_.pop_front(); + if (!pop) + { + available_GPS_2S_signals_.push_back(result); } } break; case evGPS_L5: - result = available_GPS_L5_signals_.front(); - available_GPS_L5_signals_.pop_front(); - if (!pop) + if (configuration_->property("Channels_1C.count", 0) > 0) { - available_GPS_L5_signals_.push_back(result); - } - if (tracked) - { - if ((configuration_->property("Channels_1C.count", 0) > 0) or (configuration_->property("Channels_2S.count", 0) > 0)) + //1. Get the current channel status map + std::map> current_channels_status = channels_status_->get_current_status_map(); + //2. search the currently tracked GPS L1 satellites and assist the GPS L5 acquisition if the satellite is not tracked on L5 + for (std::map>::iterator it = current_channels_status.begin(); it != current_channels_status.end(); ++it) { - for (unsigned int ch = 0; ch < channels_count_; ch++) + if (std::string(it->second->Signal) == "1C") { - if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "L5")) + std::list::iterator it2; + it2 = std::find_if(std::begin(available_GPS_L5_signals_), std::end(available_GPS_L5_signals_), + [&](Gnss_Signal const& sig) { return sig.get_satellite().get_PRN() == it->second->PRN; }); + + if (it2 != available_GPS_L5_signals_.end()) { - untracked_satellite = false; + std::cout << " Channel: " << it->first << " => Doppler: " << it->second->Carrier_Doppler_hz << "[Hz] \n"; + //3. return the GPS L5 satellite and remove it from list + result = *it2; + if (pop) + { + available_GPS_L5_signals_.erase(it2); + } + break; } } - if (untracked_satellite and configuration_->property("Channels_1C.count", 0) > 0) - { - Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "1C"); - available_GPS_1C_signals_.remove(gs); - available_GPS_1C_signals_.push_front(gs); - } - if (untracked_satellite and configuration_->property("Channels_2S.count", 0) > 0) - { - Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "2S"); - available_GPS_2S_signals_.remove(gs); - available_GPS_2S_signals_.push_front(gs); - } + } + //fallback: pick the front satellite because there is no tracked satellites in L1 to assist L5 + result = available_GPS_L5_signals_.front(); + available_GPS_L5_signals_.pop_front(); + if (!pop) + { + available_GPS_L5_signals_.push_back(result); + } + } + else + { + result = available_GPS_L5_signals_.front(); + available_GPS_L5_signals_.pop_front(); + if (!pop) + { + available_GPS_L5_signals_.push_back(result); } } break; @@ -2125,25 +2183,7 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal { available_GAL_1B_signals_.push_back(result); } - if (tracked) - { - if (configuration_->property("Channels_5X.count", 0) > 0) - { - for (unsigned int ch = 0; ch < channels_count_; ch++) - { - if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "1B")) - { - untracked_satellite = false; - } - } - if (untracked_satellite) - { - Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "5X"); - available_GAL_5X_signals_.remove(gs); - available_GAL_5X_signals_.push_front(gs); - } - } - } + is_primary_frequency = true; //indicate that the searched satellite signal belongs to "primary" link (L1, E1, B1, etc..) break; case evGAL_5X: @@ -2153,25 +2193,6 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal { available_GAL_5X_signals_.push_back(result); } - if (tracked) - { - if (configuration_->property("Channels_1B.count", 0) > 0) - { - for (unsigned int ch = 0; ch < channels_count_; ch++) - { - if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "5X")) - { - untracked_satellite = false; - } - } - if (untracked_satellite) - { - Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "1B"); - available_GAL_1B_signals_.remove(gs); - available_GAL_1B_signals_.push_front(gs); - } - } - } break; case evGLO_1G: @@ -2181,25 +2202,7 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal { available_GLO_1G_signals_.push_back(result); } - if (tracked) - { - if (configuration_->property("Channels_2G.count", 0) > 0) - { - for (unsigned int ch = 0; ch < channels_count_; ch++) - { - if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "1G")) - { - untracked_satellite = false; - } - } - if (untracked_satellite) - { - Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "2G"); - available_GLO_2G_signals_.remove(gs); - available_GLO_2G_signals_.push_front(gs); - } - } - } + is_primary_frequency = true; //indicate that the searched satellite signal belongs to "primary" link (L1, E1, B1, etc..) break; case evGLO_2G: @@ -2209,25 +2212,6 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal { available_GLO_2G_signals_.push_back(result); } - if (tracked) - { - if (configuration_->property("Channels_1G.count", 0) > 0) - { - for (unsigned int ch = 0; ch < channels_count_; ch++) - { - if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "2G")) - { - untracked_satellite = false; - } - } - if (untracked_satellite) - { - Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "1G"); - available_GLO_1G_signals_.remove(gs); - available_GLO_1G_signals_.push_front(gs); - } - } - } break; case evBDS_B1: @@ -2237,25 +2221,7 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal { available_BDS_B1_signals_.push_back(result); } - if (tracked) - { - if (configuration_->property("Channels_B3.count", 0) > 0) - { - for (unsigned int ch = 0; ch < channels_count_; ch++) - { - if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "2G")) - { - untracked_satellite = false; - } - } - if (untracked_satellite) - { - Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "B3"); - available_BDS_B3_signals_.remove(gs); - available_BDS_B3_signals_.push_front(gs); - } - } - } + is_primary_frequency = true; //indicate that the searched satellite signal belongs to "primary" link (L1, E1, B1, etc..) break; case evBDS_B3: @@ -2265,25 +2231,6 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal { available_BDS_B3_signals_.push_back(result); } - if (tracked) - { - if (configuration_->property("Channels_B1.count", 0) > 0) - { - for (unsigned int ch = 0; ch < channels_count_; ch++) - { - if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "2G")) - { - untracked_satellite = false; - } - } - if (untracked_satellite) - { - Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "B1"); - available_BDS_B1_signals_.remove(gs); - available_BDS_B1_signals_.push_front(gs); - } - } - } break; default: @@ -2296,4 +2243,290 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal break; } return result; + + + //old + // bool untracked_satellite = true; + // switch (mapStringValues_[searched_signal]) + // { + // case evGPS_1C: + // result = available_GPS_1C_signals_.front(); + // available_GPS_1C_signals_.pop_front(); + // if (!pop) + // { + // available_GPS_1C_signals_.push_back(result); + // } + // if (tracked) + // { + // if ((configuration_->property("Channels_2S.count", 0) > 0) or (configuration_->property("Channels_L5.count", 0) > 0)) + // { + // for (unsigned int ch = 0; ch < channels_count_; ch++) + // { + // if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "1C")) + // { + // untracked_satellite = false; + // } + // } + // if (untracked_satellite and configuration_->property("Channels_2S.count", 0) > 0) + // { + // Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "2S"); + // available_GPS_2S_signals_.remove(gs); + // available_GPS_2S_signals_.push_front(gs); + // } + // if (untracked_satellite and configuration_->property("Channels_L5.count", 0) > 0) + // { + // Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "L5"); + // available_GPS_L5_signals_.remove(gs); + // available_GPS_L5_signals_.push_front(gs); + // } + // } + // } + // break; + // + // case evGPS_2S: + // result = available_GPS_2S_signals_.front(); + // available_GPS_2S_signals_.pop_front(); + // if (!pop) + // { + // available_GPS_2S_signals_.push_back(result); + // } + // if (tracked) + // { + // if ((configuration_->property("Channels_1C.count", 0) > 0) or (configuration_->property("Channels_L5.count", 0) > 0)) + // { + // for (unsigned int ch = 0; ch < channels_count_; ch++) + // { + // if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "2S")) + // { + // untracked_satellite = false; + // } + // } + // if (untracked_satellite and configuration_->property("Channels_1C.count", 0) > 0) + // { + // Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "1C"); + // available_GPS_1C_signals_.remove(gs); + // available_GPS_1C_signals_.push_front(gs); + // } + // if (untracked_satellite and configuration_->property("Channels_L5.count", 0) > 0) + // { + // Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "L5"); + // available_GPS_L5_signals_.remove(gs); + // available_GPS_L5_signals_.push_front(gs); + // } + // } + // } + // break; + // + // case evGPS_L5: + // result = available_GPS_L5_signals_.front(); + // available_GPS_L5_signals_.pop_front(); + // if (!pop) + // { + // available_GPS_L5_signals_.push_back(result); + // } + // if (tracked) + // { + // if ((configuration_->property("Channels_1C.count", 0) > 0) or (configuration_->property("Channels_2S.count", 0) > 0)) + // { + // for (unsigned int ch = 0; ch < channels_count_; ch++) + // { + // if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "L5")) + // { + // untracked_satellite = false; + // } + // } + // if (untracked_satellite and configuration_->property("Channels_1C.count", 0) > 0) + // { + // Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "1C"); + // available_GPS_1C_signals_.remove(gs); + // available_GPS_1C_signals_.push_front(gs); + // } + // if (untracked_satellite and configuration_->property("Channels_2S.count", 0) > 0) + // { + // Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "2S"); + // available_GPS_2S_signals_.remove(gs); + // available_GPS_2S_signals_.push_front(gs); + // } + // } + // } + // break; + // + // case evGAL_1B: + // result = available_GAL_1B_signals_.front(); + // available_GAL_1B_signals_.pop_front(); + // if (!pop) + // { + // available_GAL_1B_signals_.push_back(result); + // } + // if (tracked) + // { + // if (configuration_->property("Channels_5X.count", 0) > 0) + // { + // for (unsigned int ch = 0; ch < channels_count_; ch++) + // { + // if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "1B")) + // { + // untracked_satellite = false; + // } + // } + // if (untracked_satellite) + // { + // Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "5X"); + // available_GAL_5X_signals_.remove(gs); + // available_GAL_5X_signals_.push_front(gs); + // } + // } + // } + // break; + // + // case evGAL_5X: + // result = available_GAL_5X_signals_.front(); + // available_GAL_5X_signals_.pop_front(); + // if (!pop) + // { + // available_GAL_5X_signals_.push_back(result); + // } + // if (tracked) + // { + // if (configuration_->property("Channels_1B.count", 0) > 0) + // { + // for (unsigned int ch = 0; ch < channels_count_; ch++) + // { + // if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "5X")) + // { + // untracked_satellite = false; + // } + // } + // if (untracked_satellite) + // { + // Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "1B"); + // available_GAL_1B_signals_.remove(gs); + // available_GAL_1B_signals_.push_front(gs); + // } + // } + // } + // break; + // + // case evGLO_1G: + // result = available_GLO_1G_signals_.front(); + // available_GLO_1G_signals_.pop_front(); + // if (!pop) + // { + // available_GLO_1G_signals_.push_back(result); + // } + // if (tracked) + // { + // if (configuration_->property("Channels_2G.count", 0) > 0) + // { + // for (unsigned int ch = 0; ch < channels_count_; ch++) + // { + // if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "1G")) + // { + // untracked_satellite = false; + // } + // } + // if (untracked_satellite) + // { + // Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "2G"); + // available_GLO_2G_signals_.remove(gs); + // available_GLO_2G_signals_.push_front(gs); + // } + // } + // } + // break; + // + // case evGLO_2G: + // result = available_GLO_2G_signals_.front(); + // available_GLO_2G_signals_.pop_front(); + // if (!pop) + // { + // available_GLO_2G_signals_.push_back(result); + // } + // if (tracked) + // { + // if (configuration_->property("Channels_1G.count", 0) > 0) + // { + // for (unsigned int ch = 0; ch < channels_count_; ch++) + // { + // if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "2G")) + // { + // untracked_satellite = false; + // } + // } + // if (untracked_satellite) + // { + // Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "1G"); + // available_GLO_1G_signals_.remove(gs); + // available_GLO_1G_signals_.push_front(gs); + // } + // } + // } + // break; + // + // case evBDS_B1: + // result = available_BDS_B1_signals_.front(); + // available_BDS_B1_signals_.pop_front(); + // if (!pop) + // { + // available_BDS_B1_signals_.push_back(result); + // } + // if (tracked) + // { + // if (configuration_->property("Channels_B3.count", 0) > 0) + // { + // for (unsigned int ch = 0; ch < channels_count_; ch++) + // { + // if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "2G")) + // { + // untracked_satellite = false; + // } + // } + // if (untracked_satellite) + // { + // Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "B3"); + // available_BDS_B3_signals_.remove(gs); + // available_BDS_B3_signals_.push_front(gs); + // } + // } + // } + // break; + // + // case evBDS_B3: + // result = available_BDS_B3_signals_.front(); + // available_BDS_B3_signals_.pop_front(); + // if (!pop) + // { + // available_BDS_B3_signals_.push_back(result); + // } + // if (tracked) + // { + // if (configuration_->property("Channels_B1.count", 0) > 0) + // { + // for (unsigned int ch = 0; ch < channels_count_; ch++) + // { + // if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "2G")) + // { + // untracked_satellite = false; + // } + // } + // if (untracked_satellite) + // { + // Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "B1"); + // available_BDS_B1_signals_.remove(gs); + // available_BDS_B1_signals_.push_front(gs); + // } + // } + // } + // break; + // + // default: + // LOG(ERROR) << "This should not happen :-("; + // result = available_GPS_1C_signals_.front(); + // if (pop) + // { + // available_GPS_1C_signals_.pop_front(); + // } + // break; + // } + // return result; } diff --git a/src/core/receiver/gnss_flowgraph.h b/src/core/receiver/gnss_flowgraph.h index 7552c46a7..ea2ecc2ad 100644 --- a/src/core/receiver/gnss_flowgraph.h +++ b/src/core/receiver/gnss_flowgraph.h @@ -37,6 +37,7 @@ #ifndef GNSS_SDR_GNSS_FLOWGRAPH_H_ #define GNSS_SDR_GNSS_FLOWGRAPH_H_ +#include "channel_status_msg_receiver.h" #include "gnss_sdr_sample_counter.h" #include "gnss_signal.h" #include "pvt_interface.h" @@ -149,7 +150,12 @@ private: void set_signals_list(); void set_channels_state(); // Initializes the channels state (start acquisition or keep standby) // using the configuration parameters (number of channels and max channels in acquisition) - Gnss_Signal search_next_signal(const std::string& searched_signal, bool pop, bool tracked = false); + Gnss_Signal search_next_signal(const std::string& searched_signal, + const bool pop, + bool& is_primary_frequency, + bool& assistance_available, + float& estimated_doppler, + double& RX_time); bool connected_; bool running_; int sources_count_; @@ -203,6 +209,7 @@ private: std::map mapStringValues_; std::vector channels_state_; + channel_status_msg_receiver_sptr channels_status_; //class that receives and stores the current status of the receiver channels std::mutex signal_list_mutex; bool enable_monitor_; diff --git a/src/tests/unit-tests/signal-processing-blocks/pvt/serdes_monitor_pvt_test.cc b/src/tests/unit-tests/signal-processing-blocks/pvt/serdes_monitor_pvt_test.cc index eb586f147..647e7f245 100644 --- a/src/tests/unit-tests/signal-processing-blocks/pvt/serdes_monitor_pvt_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/pvt/serdes_monitor_pvt_test.cc @@ -29,12 +29,13 @@ */ #include "serdes_monitor_pvt.h" +#include TEST(Serdes_Monitor_Pvt_Test, Simpletest) { - Monitor_Pvt monitor = Monitor_Pvt(); + std::shared_ptr monitor = std::make_shared(Monitor_Pvt()); double true_latitude = 23.4; - monitor.latitude = true_latitude; + monitor->latitude = true_latitude; Serdes_Monitor_Pvt serdes = Serdes_Monitor_Pvt(); std::string serialized_data = serdes.createProtobuffer(monitor); From 1313edd7162ad465554d9018d2f3962698887ccc Mon Sep 17 00:00:00 2001 From: Javier Arribas Date: Tue, 16 Jul 2019 17:41:12 +0200 Subject: [PATCH 02/36] Partial implementation of the new event queue and its dependencies. Still NOT usable --- src/algorithms/PVT/libs/rtcm.h | 1 + .../channel/adapters/CMakeLists.txt | 1 + src/algorithms/channel/adapters/channel.cc | 2 +- src/algorithms/channel/adapters/channel.h | 7 +- src/algorithms/channel/libs/CMakeLists.txt | 1 + src/algorithms/channel/libs/channel_fsm.cc | 22 +- src/algorithms/channel/libs/channel_fsm.h | 7 +- src/algorithms/libs/pass_through.cc | 6 + .../signal_generator/adapters/CMakeLists.txt | 1 + .../adapters/signal_generator.cc | 2 +- .../adapters/signal_generator.h | 7 +- .../adapters/ad9361_fpga_signal_source.cc | 2 +- .../adapters/ad9361_fpga_signal_source.h | 7 +- .../adapters/custom_udp_signal_source.cc | 2 +- .../adapters/custom_udp_signal_source.h | 7 +- .../adapters/file_signal_source.cc | 2 +- .../adapters/file_signal_source.h | 8 +- .../adapters/flexiband_signal_source.cc | 9 +- .../adapters/flexiband_signal_source.h | 7 +- .../adapters/fmcomms2_signal_source.cc | 2 +- .../adapters/fmcomms2_signal_source.h | 7 +- .../adapters/gen_signal_source.cc | 2 +- .../adapters/gen_signal_source.h | 10 +- .../adapters/gn3s_signal_source.cc | 3 +- .../adapters/gn3s_signal_source.h | 7 +- .../adapters/labsat_signal_source.cc | 2 +- .../adapters/labsat_signal_source.h | 7 +- .../multichannel_file_signal_source.cc | 2 +- .../multichannel_file_signal_source.h | 7 +- .../adapters/nsr_file_signal_source.cc | 2 +- .../adapters/nsr_file_signal_source.h | 7 +- .../adapters/osmosdr_signal_source.cc | 2 +- .../adapters/osmosdr_signal_source.h | 7 +- .../adapters/plutosdr_signal_source.cc | 2 +- .../adapters/plutosdr_signal_source.h | 7 +- .../adapters/raw_array_signal_source.cc | 5 +- .../adapters/raw_array_signal_source.h | 7 +- .../adapters/rtl_tcp_signal_source.cc | 2 +- .../adapters/rtl_tcp_signal_source.h | 7 +- .../adapters/spir_file_signal_source.cc | 2 +- .../adapters/spir_file_signal_source.h | 7 +- .../spir_gss6450_file_signal_source.cc | 2 +- .../spir_gss6450_file_signal_source.h | 7 +- .../two_bit_cpx_file_signal_source.cc | 2 +- .../adapters/two_bit_cpx_file_signal_source.h | 7 +- .../two_bit_packed_file_signal_source.cc | 2 +- .../two_bit_packed_file_signal_source.h | 7 +- .../adapters/uhd_signal_source.cc | 2 +- .../adapters/uhd_signal_source.h | 7 +- .../gnuradio_blocks/labsat23_source.cc | 22 +- .../gnuradio_blocks/labsat23_source.h | 11 +- .../signal_source/libs/CMakeLists.txt | 2 +- .../signal_source/libs/gnss_sdr_valve.cc | 22 +- .../signal_source/libs/gnss_sdr_valve.h | 17 +- src/core/receiver/CMakeLists.txt | 6 +- src/core/receiver/channel_event.cc | 42 + src/core/receiver/channel_event.h | 53 + src/core/receiver/command_event.cc | 42 + src/core/receiver/command_event.h | 53 + src/core/receiver/control_message_factory.cc | 72 -- src/core/receiver/control_message_factory.h | 64 -- src/core/receiver/control_thread.cc | 102 +- src/core/receiver/control_thread.h | 34 +- src/core/receiver/gnss_block_factory.cc | 24 +- src/core/receiver/gnss_block_factory.h | 33 +- src/core/receiver/gnss_flowgraph.cc | 353 +++---- src/core/receiver/gnss_flowgraph.h | 10 +- src/core/receiver/tcp_cmd_interface.cc | 26 +- src/core/receiver/tcp_cmd_interface.h | 7 +- src/tests/data/high_dynamics_signal.bin | Bin 0 -> 168784 bytes src/tests/data/high_dynamics_signal.mat | Bin 0 -> 79823 bytes .../control_message_factory_test.cc | 1 - .../control-plane/control_thread_test.cc | 9 +- .../control-plane/gnss_block_factory_test.cc | 18 +- .../control-plane/gnss_flowgraph_test.cc | 2 +- .../acquisition/acq_performance_test.cc | 2 +- .../beidou_b1i_pcps_acquisition_test.cc | 4 +- .../beidou_b3i_pcps_acquisition_test.cc | 4 +- ...8ms_ambiguous_acquisition_gsoc2013_test.cc | 4 +- ...cps_ambiguous_acquisition_gsoc2013_test.cc | 4 +- ...e1_pcps_ambiguous_acquisition_gsoc_test.cc | 4 +- ...ileo_e1_pcps_ambiguous_acquisition_test.cc | 4 +- ...wsr_ambiguous_acquisition_gsoc2013_test.cc | 4 +- ...ync_ambiguous_acquisition_gsoc2014_test.cc | 2 +- ...ong_ambiguous_acquisition_gsoc2013_test.cc | 4 +- ...cps_acquisition_gsoc2014_gensource_test.cc | 4 +- ...ss_l1_ca_pcps_acquisition_gsoc2017_test.cc | 4 +- .../glonass_l1_ca_pcps_acquisition_test.cc | 4 +- .../glonass_l2_ca_pcps_acquisition_test.cc | 4 +- ...ps_l1_ca_pcps_acquisition_gsoc2013_test.cc | 4 +- .../gps_l1_ca_pcps_acquisition_test.cc | 4 +- .../gps_l1_ca_pcps_acquisition_test_fpga.cc | 2 +- ...a_pcps_opencl_acquisition_gsoc2013_test.cc | 4 +- ...cps_quicksync_acquisition_gsoc2014_test.cc | 4 +- ..._ca_pcps_tong_acquisition_gsoc2013_test.cc | 4 +- .../gps_l2_m_pcps_acquisition_test.cc | 4 +- .../filter/fir_filter_test.cc | 2 +- .../filter/notch_filter_lite_test.cc | 2 +- .../filter/notch_filter_test.cc | 2 +- .../filter/pulse_blanking_filter_test.cc | 2 +- .../observables/hybrid_observables_test.cc | 993 +++++++++--------- .../direct_resampler_conditioner_cc_test.cc | 4 +- .../resampler/mmse_resampler_test.cc | 6 +- .../sources/file_signal_source_test.cc | 2 +- .../sources/gnss_sdr_valve_test.cc | 4 +- .../galileo_e1_dll_pll_veml_tracking_test.cc | 4 +- .../tracking/galileo_e5a_tracking_test.cc | 4 +- ...onass_l1_ca_dll_pll_c_aid_tracking_test.cc | 4 +- .../glonass_l1_ca_dll_pll_tracking_test.cc | 4 +- .../gps_l2_m_dll_pll_tracking_test.cc | 4 +- .../tracking/tracking_pull-in_test.cc | 5 +- src/utils/front-end-cal/main.cc | 2 +- 112 files changed, 1219 insertions(+), 1171 deletions(-) create mode 100644 src/core/receiver/channel_event.cc create mode 100644 src/core/receiver/channel_event.h create mode 100644 src/core/receiver/command_event.cc create mode 100644 src/core/receiver/command_event.h delete mode 100644 src/core/receiver/control_message_factory.cc delete mode 100644 src/core/receiver/control_message_factory.h create mode 100644 src/tests/data/high_dynamics_signal.bin create mode 100644 src/tests/data/high_dynamics_signal.mat diff --git a/src/algorithms/PVT/libs/rtcm.h b/src/algorithms/PVT/libs/rtcm.h index 792eafb9a..75dcd4c50 100644 --- a/src/algorithms/PVT/libs/rtcm.h +++ b/src/algorithms/PVT/libs/rtcm.h @@ -43,6 +43,7 @@ #include #include #include +#include #include #include // for size_t #include diff --git a/src/algorithms/channel/adapters/CMakeLists.txt b/src/algorithms/channel/adapters/CMakeLists.txt index 7f439ce56..48f293df5 100644 --- a/src/algorithms/channel/adapters/CMakeLists.txt +++ b/src/algorithms/channel/adapters/CMakeLists.txt @@ -31,6 +31,7 @@ target_link_libraries(channel_adapters Gnuradio::runtime channel_libs core_system_parameters + core_receiver PRIVATE Gflags::gflags Glog::glog diff --git a/src/algorithms/channel/adapters/channel.cc b/src/algorithms/channel/adapters/channel.cc index 98574b3eb..2cea8e915 100644 --- a/src/algorithms/channel/adapters/channel.cc +++ b/src/algorithms/channel/adapters/channel.cc @@ -42,7 +42,7 @@ Channel::Channel(ConfigurationInterface* configuration, uint32_t channel, std::shared_ptr acq, std::shared_ptr trk, std::shared_ptr nav, - std::string role, std::string implementation, gr::msg_queue::sptr queue) + std::string role, std::string implementation, std::shared_ptr > queue) { acq_ = std::move(acq); trk_ = std::move(trk); diff --git a/src/algorithms/channel/adapters/channel.h b/src/algorithms/channel/adapters/channel.h index a238f490c..083608331 100644 --- a/src/algorithms/channel/adapters/channel.h +++ b/src/algorithms/channel/adapters/channel.h @@ -38,10 +38,11 @@ #include "channel_fsm.h" #include "channel_interface.h" #include "channel_msg_receiver_cc.h" +#include "concurrent_queue.h" #include "gnss_signal.h" #include "gnss_synchro.h" #include -#include +#include #include #include #include @@ -66,7 +67,7 @@ public: //! Constructor Channel(ConfigurationInterface* configuration, uint32_t channel, std::shared_ptr acq, std::shared_ptr trk, std::shared_ptr nav, - std::string role, std::string implementation, gr::msg_queue::sptr queue); + std::string role, std::string implementation, std::shared_ptr> queue); virtual ~Channel(); //!< Virtual destructor @@ -105,7 +106,7 @@ private: bool connected_; bool repeat_; std::shared_ptr channel_fsm_; - gr::msg_queue::sptr queue_; + std::shared_ptr> queue_; std::mutex mx; }; diff --git a/src/algorithms/channel/libs/CMakeLists.txt b/src/algorithms/channel/libs/CMakeLists.txt index ba6e2a274..2a5773dfc 100644 --- a/src/algorithms/channel/libs/CMakeLists.txt +++ b/src/algorithms/channel/libs/CMakeLists.txt @@ -38,6 +38,7 @@ target_link_libraries(channel_libs Gnuradio::runtime Gnuradio::pmt core_system_parameters + core_receiver PRIVATE Boost::boost Gflags::gflags diff --git a/src/algorithms/channel/libs/channel_fsm.cc b/src/algorithms/channel/libs/channel_fsm.cc index ac533d310..ffc491634 100644 --- a/src/algorithms/channel/libs/channel_fsm.cc +++ b/src/algorithms/channel/libs/channel_fsm.cc @@ -31,7 +31,7 @@ */ #include "channel_fsm.h" -#include "control_message_factory.h" +#include "channel_event.h" #include #include @@ -179,7 +179,7 @@ void ChannelFsm::set_telemetry(std::shared_ptr teleme } -void ChannelFsm::set_queue(gr::msg_queue::sptr queue) +void ChannelFsm::set_queue(std::shared_ptr> queue) { std::lock_guard lk(mx); queue_ = std::move(queue); @@ -215,29 +215,17 @@ void ChannelFsm::start_acquisition() void ChannelFsm::start_tracking() { trk_->start_tracking(); - std::unique_ptr cmf(new ControlMessageFactory()); - if (queue_ != gr::msg_queue::make()) - { - queue_->handle(cmf->GetQueueMessage(channel_, 1)); - } + queue_->push(pmt::make_any(channel_event_make(channel_, 1))); } void ChannelFsm::request_satellite() { - std::unique_ptr cmf(new ControlMessageFactory()); - if (queue_ != gr::msg_queue::make()) - { - queue_->handle(cmf->GetQueueMessage(channel_, 0)); - } + queue_->push(pmt::make_any(channel_event_make(channel_, 0))); } void ChannelFsm::notify_stop_tracking() { - std::unique_ptr cmf(new ControlMessageFactory()); - if (queue_ != gr::msg_queue::make()) - { - queue_->handle(cmf->GetQueueMessage(channel_, 2)); - } + queue_->push(pmt::make_any(channel_event_make(channel_, 2))); } diff --git a/src/algorithms/channel/libs/channel_fsm.h b/src/algorithms/channel/libs/channel_fsm.h index 8a3342511..a083a1507 100644 --- a/src/algorithms/channel/libs/channel_fsm.h +++ b/src/algorithms/channel/libs/channel_fsm.h @@ -34,9 +34,10 @@ #define GNSS_SDR_CHANNEL_FSM_H #include "acquisition_interface.h" +#include "concurrent_queue.h" #include "telemetry_decoder_interface.h" #include "tracking_interface.h" -#include +#include #include #include #include @@ -54,7 +55,7 @@ public: void set_acquisition(std::shared_ptr acquisition); void set_tracking(std::shared_ptr tracking); void set_telemetry(std::shared_ptr telemetry); - void set_queue(gr::msg_queue::sptr queue); + void set_queue(std::shared_ptr> queue); void set_channel(uint32_t channel); void start_acquisition(); // FSM EVENTS @@ -76,7 +77,7 @@ private: std::shared_ptr acq_; std::shared_ptr trk_; std::shared_ptr nav_; - gr::msg_queue::sptr queue_; + std::shared_ptr> queue_; uint32_t channel_; uint32_t d_state; std::mutex mx; diff --git a/src/algorithms/libs/pass_through.cc b/src/algorithms/libs/pass_through.cc index 1a517a96b..7b4144dd1 100644 --- a/src/algorithms/libs/pass_through.cc +++ b/src/algorithms/libs/pass_through.cc @@ -109,6 +109,12 @@ Pass_Through::Pass_Through(ConfigurationInterface* configuration, const std::str } kludge_copy_ = gr::blocks::copy::make(item_size_); + unsigned long int max_source_buffer_samples = configuration->property("GNSS-SDR.max_source_buffer_samples", 0); + if (max_source_buffer_samples > 0) + { + kludge_copy_->set_max_output_buffer(max_source_buffer_samples); + LOG(INFO) << "Set signal conditioner max output buffer to " << max_source_buffer_samples; + } DLOG(INFO) << "kludge_copy(" << kludge_copy_->unique_id() << ")"; if (in_streams_ > 1) { diff --git a/src/algorithms/signal_generator/adapters/CMakeLists.txt b/src/algorithms/signal_generator/adapters/CMakeLists.txt index fb651871e..a519eaa3f 100644 --- a/src/algorithms/signal_generator/adapters/CMakeLists.txt +++ b/src/algorithms/signal_generator/adapters/CMakeLists.txt @@ -34,6 +34,7 @@ target_link_libraries(signal_generator_adapters Gflags::gflags Glog::glog algorithms_libs + core_receiver ) target_include_directories(signal_generator_adapters diff --git a/src/algorithms/signal_generator/adapters/signal_generator.cc b/src/algorithms/signal_generator/adapters/signal_generator.cc index c4dc9dc3d..31636f246 100644 --- a/src/algorithms/signal_generator/adapters/signal_generator.cc +++ b/src/algorithms/signal_generator/adapters/signal_generator.cc @@ -44,7 +44,7 @@ SignalGenerator::SignalGenerator(ConfigurationInterface* configuration, const std::string& role, unsigned int in_stream, - unsigned int out_stream, boost::shared_ptr queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(std::move(queue)) + unsigned int out_stream, std::shared_ptr > queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(std::move(queue)) { std::string default_item_type = "gr_complex"; std::string default_dump_file = "./data/gen_source.dat"; diff --git a/src/algorithms/signal_generator/adapters/signal_generator.h b/src/algorithms/signal_generator/adapters/signal_generator.h index e32c431b8..d2adfc27e 100644 --- a/src/algorithms/signal_generator/adapters/signal_generator.h +++ b/src/algorithms/signal_generator/adapters/signal_generator.h @@ -33,12 +33,13 @@ #ifndef GNSS_SDR_SIGNAL_GENERATOR_H_ #define GNSS_SDR_SIGNAL_GENERATOR_H_ +#include "concurrent_queue.h" #include "gnss_block_interface.h" #include "signal_generator_c.h" #include #include #include -#include +#include #include #include @@ -53,7 +54,7 @@ class SignalGenerator : public GNSSBlockInterface public: SignalGenerator(ConfigurationInterface* configuration, const std::string& role, unsigned int in_stream, - unsigned int out_stream, boost::shared_ptr queue); + unsigned int out_stream, std::shared_ptr > queue); virtual ~SignalGenerator(); @@ -91,6 +92,6 @@ private: boost::shared_ptr gen_source_; gr::blocks::vector_to_stream::sptr vector_to_stream_; gr::blocks::file_sink::sptr file_sink_; - boost::shared_ptr queue_; + std::shared_ptr > queue_; }; #endif /*GNSS_SDR_SIGNAL_GENERATOR_H_*/ 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 f83c64f25..dac665cc4 100644 --- a/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.cc +++ b/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.cc @@ -48,7 +48,7 @@ Ad9361FpgaSignalSource::Ad9361FpgaSignalSource(ConfigurationInterface* configuration, const std::string& role, unsigned int in_stream, unsigned int out_stream, - boost::shared_ptr queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(std::move(queue)) + std::shared_ptr> queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(std::move(queue)) { std::string default_item_type = "gr_complex"; std::string default_dump_file = "./data/signal_source.dat"; 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 9277c4c2b..e5a917199 100644 --- a/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.h +++ b/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.h @@ -32,10 +32,11 @@ #ifndef GNSS_SDR_AD9361_FPGA_SIGNAL_SOURCE_H_ #define GNSS_SDR_AD9361_FPGA_SIGNAL_SOURCE_H_ +#include "concurrent_queue.h" #include "fpga_switch.h" #include "gnss_block_interface.h" #include -#include +#include #include #include @@ -46,7 +47,7 @@ class Ad9361FpgaSignalSource : public GNSSBlockInterface public: Ad9361FpgaSignalSource(ConfigurationInterface* configuration, const std::string& role, unsigned int in_stream, - unsigned int out_stream, boost::shared_ptr queue); + unsigned int out_stream, std::shared_ptr> queue); ~Ad9361FpgaSignalSource(); @@ -112,7 +113,7 @@ private: bool dump_; std::string dump_filename_; - boost::shared_ptr queue_; + std::shared_ptr> queue_; std::shared_ptr switch_fpga; }; diff --git a/src/algorithms/signal_source/adapters/custom_udp_signal_source.cc b/src/algorithms/signal_source/adapters/custom_udp_signal_source.cc index 024966d0e..a130b32f8 100644 --- a/src/algorithms/signal_source/adapters/custom_udp_signal_source.cc +++ b/src/algorithms/signal_source/adapters/custom_udp_signal_source.cc @@ -40,7 +40,7 @@ CustomUDPSignalSource::CustomUDPSignalSource(ConfigurationInterface* configuration, const std::string& role, unsigned int in_stream, unsigned int out_stream, - boost::shared_ptr queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(std::move(queue)) + std::shared_ptr> queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(std::move(queue)) { // DUMP PARAMETERS std::string empty = ""; diff --git a/src/algorithms/signal_source/adapters/custom_udp_signal_source.h b/src/algorithms/signal_source/adapters/custom_udp_signal_source.h index 37e80caf7..3d8d400de 100644 --- a/src/algorithms/signal_source/adapters/custom_udp_signal_source.h +++ b/src/algorithms/signal_source/adapters/custom_udp_signal_source.h @@ -32,12 +32,13 @@ #ifndef GNSS_SDR_CUSTOM_UDP_SIGNAL_SOURCE_H #define GNSS_SDR_CUSTOM_UDP_SIGNAL_SOURCE_H +#include "concurrent_queue.h" #include "gnss_block_interface.h" #include "gr_complex_ip_packet_source.h" #include #include #include -#include +#include #include #include #include @@ -54,7 +55,7 @@ class CustomUDPSignalSource : public GNSSBlockInterface public: CustomUDPSignalSource(ConfigurationInterface* configuration, const std::string& role, unsigned int in_stream, - unsigned int out_stream, boost::shared_ptr queue); + unsigned int out_stream, std::shared_ptr> queue); virtual ~CustomUDPSignalSource(); @@ -98,7 +99,7 @@ private: std::vector> null_sinks_; Gr_Complex_Ip_Packet_Source::sptr udp_gnss_rx_source_; std::vector> file_sink_; - boost::shared_ptr queue_; + std::shared_ptr> queue_; }; #endif /*GNSS_SDR_CUSTOM_UDP_SIGNAL_SOURCE_H */ diff --git a/src/algorithms/signal_source/adapters/file_signal_source.cc b/src/algorithms/signal_source/adapters/file_signal_source.cc index 59ad90f50..b478b6363 100644 --- a/src/algorithms/signal_source/adapters/file_signal_source.cc +++ b/src/algorithms/signal_source/adapters/file_signal_source.cc @@ -44,7 +44,7 @@ FileSignalSource::FileSignalSource(ConfigurationInterface* configuration, const std::string& role, unsigned int in_streams, unsigned int out_streams, - boost::shared_ptr queue) : role_(role), in_streams_(in_streams), out_streams_(out_streams), queue_(std::move(queue)) + std::shared_ptr> queue) : role_(role), in_streams_(in_streams), out_streams_(out_streams), queue_(std::move(queue)) { std::string default_filename = "./example_capture.dat"; std::string default_item_type = "short"; diff --git a/src/algorithms/signal_source/adapters/file_signal_source.h b/src/algorithms/signal_source/adapters/file_signal_source.h index bfded2ce8..86d87798a 100644 --- a/src/algorithms/signal_source/adapters/file_signal_source.h +++ b/src/algorithms/signal_source/adapters/file_signal_source.h @@ -35,13 +35,15 @@ #ifndef GNSS_SDR_FILE_SIGNAL_SOURCE_H_ #define GNSS_SDR_FILE_SIGNAL_SOURCE_H_ +#include "concurrent_queue.h" #include "gnss_block_interface.h" #include #include #include #include -#include +#include #include +#include #include class ConfigurationInterface; @@ -55,7 +57,7 @@ class FileSignalSource : public GNSSBlockInterface public: FileSignalSource(ConfigurationInterface* configuration, const std::string& role, unsigned int in_streams, unsigned int out_streams, - boost::shared_ptr queue); + std::shared_ptr> queue); virtual ~FileSignalSource(); @@ -122,7 +124,7 @@ private: boost::shared_ptr valve_; gr::blocks::file_sink::sptr sink_; gr::blocks::throttle::sptr throttle_; - boost::shared_ptr queue_; + std::shared_ptr> queue_; size_t item_size_; // Throttle control bool enable_throttle_control_; diff --git a/src/algorithms/signal_source/adapters/flexiband_signal_source.cc b/src/algorithms/signal_source/adapters/flexiband_signal_source.cc index ff3f3f9a0..478a6973d 100644 --- a/src/algorithms/signal_source/adapters/flexiband_signal_source.cc +++ b/src/algorithms/signal_source/adapters/flexiband_signal_source.cc @@ -34,7 +34,6 @@ #include "configuration_interface.h" #include #include -#include #include #include @@ -43,10 +42,10 @@ FlexibandSignalSource::FlexibandSignalSource(ConfigurationInterface* configurati const std::string& role, unsigned int in_stream, unsigned int out_stream, - gr::msg_queue::sptr queue) : role_(role), - in_stream_(in_stream), - out_stream_(out_stream), - queue_(std::move(queue)) + std::shared_ptr> queue) : role_(role), + in_stream_(in_stream), + out_stream_(out_stream), + queue_(std::move(queue)) { std::string default_item_type = "byte"; item_type_ = configuration->property(role + ".item_type", default_item_type); diff --git a/src/algorithms/signal_source/adapters/flexiband_signal_source.h b/src/algorithms/signal_source/adapters/flexiband_signal_source.h index 7da5839a8..56c2aff09 100644 --- a/src/algorithms/signal_source/adapters/flexiband_signal_source.h +++ b/src/algorithms/signal_source/adapters/flexiband_signal_source.h @@ -34,13 +34,14 @@ #ifndef GNSS_SDR_FLEXIBAND_SIGNAL_SOURCE_H_ #define GNSS_SDR_FLEXIBAND_SIGNAL_SOURCE_H_ +#include "concurrent_queue.h" #include "gnss_block_interface.h" #include #include #include #include #include -#include +#include #include #include @@ -56,7 +57,7 @@ class FlexibandSignalSource : public GNSSBlockInterface public: FlexibandSignalSource(ConfigurationInterface* configuration, const std::string& role, unsigned int in_stream, - unsigned int out_stream, gr::msg_queue::sptr queue); + unsigned int out_stream, std::shared_ptr> queue); virtual ~FlexibandSignalSource(); @@ -109,7 +110,7 @@ private: std::vector> float_to_complex_; std::vector null_sinks_; - boost::shared_ptr queue_; + std::shared_ptr> queue_; }; #endif // GNSS_SDR_FLEXIBAND_SIGNAL_SOURCE_H_ diff --git a/src/algorithms/signal_source/adapters/fmcomms2_signal_source.cc b/src/algorithms/signal_source/adapters/fmcomms2_signal_source.cc index 704c5b01e..bfc470dbc 100644 --- a/src/algorithms/signal_source/adapters/fmcomms2_signal_source.cc +++ b/src/algorithms/signal_source/adapters/fmcomms2_signal_source.cc @@ -43,7 +43,7 @@ Fmcomms2SignalSource::Fmcomms2SignalSource(ConfigurationInterface* configuration, const std::string& role, unsigned int in_stream, unsigned int out_stream, - boost::shared_ptr queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(std::move(queue)) + std::shared_ptr> queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(std::move(queue)) { std::string default_item_type = "gr_complex"; std::string default_dump_file = "./data/signal_source.dat"; diff --git a/src/algorithms/signal_source/adapters/fmcomms2_signal_source.h b/src/algorithms/signal_source/adapters/fmcomms2_signal_source.h index 1388a514d..44870c182 100644 --- a/src/algorithms/signal_source/adapters/fmcomms2_signal_source.h +++ b/src/algorithms/signal_source/adapters/fmcomms2_signal_source.h @@ -41,7 +41,8 @@ #else #include #endif -#include +#include "concurrent_queue.h" +#include #include class ConfigurationInterface; @@ -51,7 +52,7 @@ class Fmcomms2SignalSource : public GNSSBlockInterface public: Fmcomms2SignalSource(ConfigurationInterface* configuration, const std::string& role, unsigned int in_stream, - unsigned int out_stream, boost::shared_ptr queue); + unsigned int out_stream, std::shared_ptr> queue); virtual ~Fmcomms2SignalSource(); @@ -122,7 +123,7 @@ private: boost::shared_ptr valve_; gr::blocks::file_sink::sptr file_sink_; - boost::shared_ptr queue_; + std::shared_ptr> queue_; }; #endif /*GNSS_SDR_FMCOMMS2_SIGNAL_SOURCE_H_*/ diff --git a/src/algorithms/signal_source/adapters/gen_signal_source.cc b/src/algorithms/signal_source/adapters/gen_signal_source.cc index ef8441853..057650ac0 100644 --- a/src/algorithms/signal_source/adapters/gen_signal_source.cc +++ b/src/algorithms/signal_source/adapters/gen_signal_source.cc @@ -42,7 +42,7 @@ // Constructor GenSignalSource::GenSignalSource(GNSSBlockInterface *signal_generator, GNSSBlockInterface *filter, - std::string role, boost::shared_ptr queue) : signal_generator_(signal_generator), + std::string role, std::shared_ptr> queue) : signal_generator_(signal_generator), filter_(filter), role_(std::move(role)), queue_(std::move(queue)) diff --git a/src/algorithms/signal_source/adapters/gen_signal_source.h b/src/algorithms/signal_source/adapters/gen_signal_source.h index 49fb25293..d30f8935b 100644 --- a/src/algorithms/signal_source/adapters/gen_signal_source.h +++ b/src/algorithms/signal_source/adapters/gen_signal_source.h @@ -34,8 +34,9 @@ #define GNSS_SDR_GEN_SIGNAL_SOURCE_H_ +#include "concurrent_queue.h" #include "gnss_block_interface.h" -#include +#include #include /*! @@ -47,7 +48,7 @@ class GenSignalSource : public GNSSBlockInterface public: //! Constructor GenSignalSource(GNSSBlockInterface *signal_generator, GNSSBlockInterface *filter, - std::string role, boost::shared_ptr queue); + std::string role, std::shared_ptr> queue); //! Virtual destructor virtual ~GenSignalSource(); @@ -58,20 +59,17 @@ public: gr::basic_block_sptr get_right_block() override; inline std::string role() override { return role_; } - //! Returns "Signal Source" inline std::string implementation() override { return "Signal Source"; } inline size_t item_size() override { return 0; } - inline GNSSBlockInterface *signal_generator() const { return signal_generator_; } - private: GNSSBlockInterface *signal_generator_; GNSSBlockInterface *filter_; std::string role_; std::string implementation_; bool connected_; - boost::shared_ptr queue_; + std::shared_ptr> queue_; }; #endif /*GNSS_SDR_GEN_SIGNAL_SOURCE_H*/ diff --git a/src/algorithms/signal_source/adapters/gn3s_signal_source.cc b/src/algorithms/signal_source/adapters/gn3s_signal_source.cc index 3f66591e9..4a699d09d 100644 --- a/src/algorithms/signal_source/adapters/gn3s_signal_source.cc +++ b/src/algorithms/signal_source/adapters/gn3s_signal_source.cc @@ -32,12 +32,11 @@ #include "configuration_interface.h" #include #include -#include #include Gn3sSignalSource::Gn3sSignalSource(ConfigurationInterface* configuration, - std::string role, unsigned int in_stream, unsigned int out_stream, gr::msg_queue::sptr queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(queue) + std::string role, unsigned int in_stream, unsigned int out_stream, std::shared_ptr> queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(queue) { std::string default_item_type = "short"; std::string default_dump_file = "./data/gn3s_source.dat"; diff --git a/src/algorithms/signal_source/adapters/gn3s_signal_source.h b/src/algorithms/signal_source/adapters/gn3s_signal_source.h index df799f019..e34b91afe 100644 --- a/src/algorithms/signal_source/adapters/gn3s_signal_source.h +++ b/src/algorithms/signal_source/adapters/gn3s_signal_source.h @@ -32,10 +32,11 @@ #ifndef GNSS_SDR_GN3S_SIGNAL_SOURCE_H_ #define GNSS_SDR_GN3S_SIGNAL_SOURCE_H_ +#include "concurrent_queue.h" #include "gnss_block_interface.h" #include #include -#include +#include #include @@ -49,7 +50,7 @@ class Gn3sSignalSource : public GNSSBlockInterface public: Gn3sSignalSource(ConfigurationInterface* configuration, std::string role, unsigned int in_stream, - unsigned int out_stream, gr::msg_queue::sptr queue); + unsigned int out_stream, std::shared_ptr> queue); virtual ~Gn3sSignalSource(); @@ -87,7 +88,7 @@ private: std::string dump_filename_; gr::block_sptr gn3s_source_; gr::blocks::file_sink::sptr file_sink_; - boost::shared_ptr queue_; + std::shared_ptr> queue_; }; #endif /*GNSS_SDR_GN3S_SIGNAL_SOURCE_H_*/ diff --git a/src/algorithms/signal_source/adapters/labsat_signal_source.cc b/src/algorithms/signal_source/adapters/labsat_signal_source.cc index 2fb8ba3b7..e6366261a 100644 --- a/src/algorithms/signal_source/adapters/labsat_signal_source.cc +++ b/src/algorithms/signal_source/adapters/labsat_signal_source.cc @@ -37,7 +37,7 @@ LabsatSignalSource::LabsatSignalSource(ConfigurationInterface* configuration, - const std::string& role, unsigned int in_stream, unsigned int out_stream, gr::msg_queue::sptr queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(std::move(queue)) + const std::string& role, unsigned int in_stream, unsigned int out_stream, std::shared_ptr> queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(std::move(queue)) { std::string default_item_type = "gr_complex"; std::string default_dump_file = "./labsat_output.dat"; diff --git a/src/algorithms/signal_source/adapters/labsat_signal_source.h b/src/algorithms/signal_source/adapters/labsat_signal_source.h index 1d9e333bf..9bf5d2057 100644 --- a/src/algorithms/signal_source/adapters/labsat_signal_source.h +++ b/src/algorithms/signal_source/adapters/labsat_signal_source.h @@ -32,10 +32,11 @@ #ifndef GNSS_SDR_LABSAT_SIGNAL_SOURCE_H_ #define GNSS_SDR_LABSAT_SIGNAL_SOURCE_H_ +#include "concurrent_queue.h" #include "gnss_block_interface.h" #include #include -#include +#include #include class ConfigurationInterface; @@ -48,7 +49,7 @@ class LabsatSignalSource : public GNSSBlockInterface public: LabsatSignalSource(ConfigurationInterface* configuration, const std::string& role, unsigned int in_stream, - unsigned int out_stream, gr::msg_queue::sptr queue); + unsigned int out_stream, std::shared_ptr> queue); virtual ~LabsatSignalSource(); @@ -86,7 +87,7 @@ private: std::string dump_filename_; gr::block_sptr labsat23_source_; gr::blocks::file_sink::sptr file_sink_; - boost::shared_ptr queue_; + std::shared_ptr> queue_; }; #endif /*GNSS_SDR_LABSAT_SIGNAL_SOURCE_H_*/ diff --git a/src/algorithms/signal_source/adapters/multichannel_file_signal_source.cc b/src/algorithms/signal_source/adapters/multichannel_file_signal_source.cc index 11efe4fd9..330b3e43c 100644 --- a/src/algorithms/signal_source/adapters/multichannel_file_signal_source.cc +++ b/src/algorithms/signal_source/adapters/multichannel_file_signal_source.cc @@ -43,7 +43,7 @@ MultichannelFileSignalSource::MultichannelFileSignalSource(ConfigurationInterface* configuration, const std::string& role, unsigned int in_streams, unsigned int out_streams, - boost::shared_ptr queue) : role_(role), in_streams_(in_streams), out_streams_(out_streams), queue_(std::move(queue)) + std::shared_ptr> queue) : role_(role), in_streams_(in_streams), out_streams_(out_streams), queue_(std::move(queue)) { std::string default_filename = "./example_capture.dat"; std::string default_item_type = "short"; diff --git a/src/algorithms/signal_source/adapters/multichannel_file_signal_source.h b/src/algorithms/signal_source/adapters/multichannel_file_signal_source.h index b248073dd..db3a9c57c 100644 --- a/src/algorithms/signal_source/adapters/multichannel_file_signal_source.h +++ b/src/algorithms/signal_source/adapters/multichannel_file_signal_source.h @@ -35,12 +35,13 @@ #ifndef GNSS_SDR_MULTICHANNEL_FILE_SIGNAL_SOURCE_H_ #define GNSS_SDR_MULTICHANNEL_FILE_SIGNAL_SOURCE_H_ +#include "concurrent_queue.h" #include "gnss_block_interface.h" #include #include #include #include -#include +#include #include #include #include @@ -56,7 +57,7 @@ class MultichannelFileSignalSource : public GNSSBlockInterface public: MultichannelFileSignalSource(ConfigurationInterface* configuration, const std::string& role, unsigned int in_streams, unsigned int out_streams, - boost::shared_ptr queue); + std::shared_ptr> queue); virtual ~MultichannelFileSignalSource(); @@ -122,7 +123,7 @@ private: boost::shared_ptr valve_; gr::blocks::file_sink::sptr sink_; std::vector throttle_vec_; - boost::shared_ptr queue_; + std::shared_ptr> queue_; size_t item_size_; // Throttle control bool enable_throttle_control_; diff --git a/src/algorithms/signal_source/adapters/nsr_file_signal_source.cc b/src/algorithms/signal_source/adapters/nsr_file_signal_source.cc index aa31e75a6..dc00bcecb 100644 --- a/src/algorithms/signal_source/adapters/nsr_file_signal_source.cc +++ b/src/algorithms/signal_source/adapters/nsr_file_signal_source.cc @@ -44,7 +44,7 @@ NsrFileSignalSource::NsrFileSignalSource(ConfigurationInterface* configuration, const std::string& role, unsigned int in_streams, unsigned int out_streams, - boost::shared_ptr queue) : role_(role), in_streams_(in_streams), out_streams_(out_streams), queue_(std::move(queue)) + std::shared_ptr> queue) : role_(role), in_streams_(in_streams), out_streams_(out_streams), queue_(std::move(queue)) { std::string default_filename = "../data/my_capture.dat"; std::string default_item_type = "byte"; diff --git a/src/algorithms/signal_source/adapters/nsr_file_signal_source.h b/src/algorithms/signal_source/adapters/nsr_file_signal_source.h index a2b3ee547..2efaa09b3 100644 --- a/src/algorithms/signal_source/adapters/nsr_file_signal_source.h +++ b/src/algorithms/signal_source/adapters/nsr_file_signal_source.h @@ -35,13 +35,14 @@ #ifndef GNSS_SDR_NSR_FILE_SIGNAL_SOURCE_H_ #define GNSS_SDR_NSR_FILE_SIGNAL_SOURCE_H_ +#include "concurrent_queue.h" #include "gnss_block_interface.h" #include "unpack_byte_2bit_samples.h" #include #include #include #include -#include +#include #include class ConfigurationInterface; @@ -55,7 +56,7 @@ class NsrFileSignalSource : public GNSSBlockInterface public: NsrFileSignalSource(ConfigurationInterface* configuration, const std::string& role, unsigned int in_streams, unsigned int out_streams, - boost::shared_ptr queue); + std::shared_ptr> queue); virtual ~NsrFileSignalSource(); inline std::string role() override @@ -122,7 +123,7 @@ private: boost::shared_ptr valve_; gr::blocks::file_sink::sptr sink_; gr::blocks::throttle::sptr throttle_; - boost::shared_ptr queue_; + std::shared_ptr> queue_; size_t item_size_; // Throttle control bool enable_throttle_control_; diff --git a/src/algorithms/signal_source/adapters/osmosdr_signal_source.cc b/src/algorithms/signal_source/adapters/osmosdr_signal_source.cc index 32ea28cf0..38f823248 100644 --- a/src/algorithms/signal_source/adapters/osmosdr_signal_source.cc +++ b/src/algorithms/signal_source/adapters/osmosdr_signal_source.cc @@ -42,7 +42,7 @@ OsmosdrSignalSource::OsmosdrSignalSource(ConfigurationInterface* configuration, const std::string& role, unsigned int in_stream, unsigned int out_stream, - boost::shared_ptr queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(std::move(queue)) + std::shared_ptr> queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(std::move(queue)) { // DUMP PARAMETERS std::string empty = ""; diff --git a/src/algorithms/signal_source/adapters/osmosdr_signal_source.h b/src/algorithms/signal_source/adapters/osmosdr_signal_source.h index 15f38b2a3..8a96f32d6 100644 --- a/src/algorithms/signal_source/adapters/osmosdr_signal_source.h +++ b/src/algorithms/signal_source/adapters/osmosdr_signal_source.h @@ -33,10 +33,11 @@ #ifndef GNSS_SDR_OSMOSDR_SIGNAL_SOURCE_H_ #define GNSS_SDR_OSMOSDR_SIGNAL_SOURCE_H_ +#include "concurrent_queue.h" #include "gnss_block_interface.h" #include #include -#include +#include #include #include #include @@ -54,7 +55,7 @@ class OsmosdrSignalSource : public GNSSBlockInterface public: OsmosdrSignalSource(ConfigurationInterface* configuration, const std::string& role, unsigned int in_stream, - unsigned int out_stream, boost::shared_ptr queue); + unsigned int out_stream, std::shared_ptr> queue); virtual ~OsmosdrSignalSource(); @@ -110,7 +111,7 @@ private: boost::shared_ptr valve_; gr::blocks::file_sink::sptr file_sink_; - boost::shared_ptr queue_; + std::shared_ptr> queue_; }; #endif /*GNSS_SDR_OSMOSDR_SIGNAL_SOURCE_H_*/ diff --git a/src/algorithms/signal_source/adapters/plutosdr_signal_source.cc b/src/algorithms/signal_source/adapters/plutosdr_signal_source.cc index fc41bd3a9..ba6af1fd6 100644 --- a/src/algorithms/signal_source/adapters/plutosdr_signal_source.cc +++ b/src/algorithms/signal_source/adapters/plutosdr_signal_source.cc @@ -39,7 +39,7 @@ PlutosdrSignalSource::PlutosdrSignalSource(ConfigurationInterface* configuration, const std::string& role, unsigned int in_stream, unsigned int out_stream, - boost::shared_ptr queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(std::move(queue)) + std::shared_ptr> queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(std::move(queue)) { std::string default_item_type = "gr_complex"; std::string default_dump_file = "./data/signal_source.dat"; diff --git a/src/algorithms/signal_source/adapters/plutosdr_signal_source.h b/src/algorithms/signal_source/adapters/plutosdr_signal_source.h index e765ff7c4..bc105d171 100644 --- a/src/algorithms/signal_source/adapters/plutosdr_signal_source.h +++ b/src/algorithms/signal_source/adapters/plutosdr_signal_source.h @@ -40,7 +40,8 @@ #else #include #endif -#include +#include "concurrent_queue.h" +#include #include @@ -53,7 +54,7 @@ class PlutosdrSignalSource : public GNSSBlockInterface public: PlutosdrSignalSource(ConfigurationInterface* configuration, const std::string& role, unsigned int in_stream, - unsigned int out_stream, boost::shared_ptr queue); + unsigned int out_stream, std::shared_ptr> queue); virtual ~PlutosdrSignalSource(); @@ -109,7 +110,7 @@ private: boost::shared_ptr valve_; gr::blocks::file_sink::sptr file_sink_; - boost::shared_ptr queue_; + std::shared_ptr> queue_; }; #endif /*GNSS_SDR_PLUTOSDR_SIGNAL_SOURCE_H_*/ diff --git a/src/algorithms/signal_source/adapters/raw_array_signal_source.cc b/src/algorithms/signal_source/adapters/raw_array_signal_source.cc index f9aab0987..d54a7cb19 100644 --- a/src/algorithms/signal_source/adapters/raw_array_signal_source.cc +++ b/src/algorithms/signal_source/adapters/raw_array_signal_source.cc @@ -29,15 +29,16 @@ */ #include "raw_array_signal_source.h" +#include "concurrent_queue.h" #include "configuration_interface.h" #include #include -#include +#include #include RawArraySignalSource::RawArraySignalSource(ConfigurationInterface* configuration, - std::string role, unsigned int in_stream, unsigned int out_stream, gr::msg_queue::sptr queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(queue) + std::string role, unsigned int in_stream, unsigned int out_stream, std::shared_ptr> queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(queue) { std::string default_item_type = "gr_complex"; std::string default_dump_file = "./data/raw_array_source.dat"; diff --git a/src/algorithms/signal_source/adapters/raw_array_signal_source.h b/src/algorithms/signal_source/adapters/raw_array_signal_source.h index 321895cef..750efb3fe 100644 --- a/src/algorithms/signal_source/adapters/raw_array_signal_source.h +++ b/src/algorithms/signal_source/adapters/raw_array_signal_source.h @@ -32,10 +32,11 @@ #ifndef GNSS_SDR_RAW_ARRAY_SIGNAL_SOURCE_H_ #define GNSS_SDR_RAW_ARRAY_SIGNAL_SOURCE_H_ +#include "concurrent_queue.h" #include "gnss_block_interface.h" #include #include -#include +#include #include class ConfigurationInterface; @@ -48,7 +49,7 @@ class RawArraySignalSource : public GNSSBlockInterface public: RawArraySignalSource(ConfigurationInterface* configuration, std::string role, unsigned int in_stream, - unsigned int out_stream, gr::msg_queue::sptr queue); + unsigned int out_stream, std::shared_ptr> queue); virtual ~RawArraySignalSource(); @@ -87,7 +88,7 @@ private: std::string eth_device_; gr::block_sptr raw_array_source_; gr::blocks::file_sink::sptr file_sink_; - boost::shared_ptr queue_; + std::shared_ptr> queue_; }; #endif /*GNSS_SDR_RAW_ARRAY_SIGNAL_SOURCE_H_*/ diff --git a/src/algorithms/signal_source/adapters/rtl_tcp_signal_source.cc b/src/algorithms/signal_source/adapters/rtl_tcp_signal_source.cc index 2b9574708..478e6b1c7 100644 --- a/src/algorithms/signal_source/adapters/rtl_tcp_signal_source.cc +++ b/src/algorithms/signal_source/adapters/rtl_tcp_signal_source.cc @@ -45,7 +45,7 @@ RtlTcpSignalSource::RtlTcpSignalSource(ConfigurationInterface* configuration, const std::string& role, unsigned int in_stream, unsigned int out_stream, - boost::shared_ptr queue) : role_(role), + std::shared_ptr> queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(std::move(queue)) diff --git a/src/algorithms/signal_source/adapters/rtl_tcp_signal_source.h b/src/algorithms/signal_source/adapters/rtl_tcp_signal_source.h index 74f2b02d5..2fcb9d871 100644 --- a/src/algorithms/signal_source/adapters/rtl_tcp_signal_source.h +++ b/src/algorithms/signal_source/adapters/rtl_tcp_signal_source.h @@ -32,13 +32,14 @@ #ifndef GNSS_SDR_RTL_TCP_SIGNAL_SOURCE_H #define GNSS_SDR_RTL_TCP_SIGNAL_SOURCE_H +#include "concurrent_queue.h" #include "gnss_block_interface.h" #include "rtl_tcp_signal_source_c.h" #include #include #include #include -#include +#include #include #include @@ -57,7 +58,7 @@ public: const std::string& role, unsigned int in_stream, unsigned int out_stream, - boost::shared_ptr queue); + std::shared_ptr> queue); virtual ~RtlTcpSignalSource(); @@ -113,7 +114,7 @@ private: boost::shared_ptr valve_; gr::blocks::file_sink::sptr file_sink_; - boost::shared_ptr queue_; + std::shared_ptr> queue_; }; #endif /*GNSS_SDR_RTL_TCP_SIGNAL_SOURCE_H */ diff --git a/src/algorithms/signal_source/adapters/spir_file_signal_source.cc b/src/algorithms/signal_source/adapters/spir_file_signal_source.cc index 52964abba..91287020c 100644 --- a/src/algorithms/signal_source/adapters/spir_file_signal_source.cc +++ b/src/algorithms/signal_source/adapters/spir_file_signal_source.cc @@ -43,7 +43,7 @@ SpirFileSignalSource::SpirFileSignalSource(ConfigurationInterface* configuration, const std::string& role, unsigned int in_streams, unsigned int out_streams, - boost::shared_ptr queue) : role_(role), in_streams_(in_streams), out_streams_(out_streams), queue_(std::move(queue)) + std::shared_ptr> queue) : role_(role), in_streams_(in_streams), out_streams_(out_streams), queue_(std::move(queue)) { std::string default_filename = "../data/my_capture.dat"; std::string default_item_type = "int"; diff --git a/src/algorithms/signal_source/adapters/spir_file_signal_source.h b/src/algorithms/signal_source/adapters/spir_file_signal_source.h index ad76ce23b..09aff8c09 100644 --- a/src/algorithms/signal_source/adapters/spir_file_signal_source.h +++ b/src/algorithms/signal_source/adapters/spir_file_signal_source.h @@ -32,13 +32,14 @@ #ifndef GNSS_SDR_SPIR_FILE_SIGNAL_SOURCE_H_ #define GNSS_SDR_SPIR_FILE_SIGNAL_SOURCE_H_ +#include "concurrent_queue.h" #include "gnss_block_interface.h" #include "unpack_intspir_1bit_samples.h" #include #include #include #include -#include +#include #include #include @@ -53,7 +54,7 @@ class SpirFileSignalSource : public GNSSBlockInterface public: SpirFileSignalSource(ConfigurationInterface* configuration, const std::string& role, unsigned int in_streams, unsigned int out_streams, - boost::shared_ptr queue); + std::shared_ptr> queue); virtual ~SpirFileSignalSource(); inline std::string role() override @@ -120,7 +121,7 @@ private: boost::shared_ptr valve_; gr::blocks::file_sink::sptr sink_; gr::blocks::throttle::sptr throttle_; - boost::shared_ptr queue_; + std::shared_ptr> queue_; size_t item_size_; // Throttle control bool enable_throttle_control_; diff --git a/src/algorithms/signal_source/adapters/spir_gss6450_file_signal_source.cc b/src/algorithms/signal_source/adapters/spir_gss6450_file_signal_source.cc index 7e1c3f1ce..1ba2d5bf0 100644 --- a/src/algorithms/signal_source/adapters/spir_gss6450_file_signal_source.cc +++ b/src/algorithms/signal_source/adapters/spir_gss6450_file_signal_source.cc @@ -40,7 +40,7 @@ SpirGSS6450FileSignalSource::SpirGSS6450FileSignalSource(ConfigurationInterface* configuration, - const std::string& role, uint32_t in_streams, uint32_t out_streams, gr::msg_queue::sptr queue) : role_(role), in_streams_(in_streams), out_streams_(out_streams), queue_(std::move(queue)) + const std::string& role, uint32_t in_streams, uint32_t out_streams, std::shared_ptr> queue) : role_(role), in_streams_(in_streams), out_streams_(out_streams), queue_(std::move(queue)) { std::string default_filename = "../data/my_capture.dat"; std::string default_dump_filename = "../data/my_capture_dump.dat"; diff --git a/src/algorithms/signal_source/adapters/spir_gss6450_file_signal_source.h b/src/algorithms/signal_source/adapters/spir_gss6450_file_signal_source.h index 0757c24af..61edd479c 100644 --- a/src/algorithms/signal_source/adapters/spir_gss6450_file_signal_source.h +++ b/src/algorithms/signal_source/adapters/spir_gss6450_file_signal_source.h @@ -32,6 +32,7 @@ #ifndef GNSS_SDR_SPIR_GSS6450_FILE_SIGNAL_SOURCE_H_ #define GNSS_SDR_SPIR_GSS6450_FILE_SIGNAL_SOURCE_H_ +#include "concurrent_queue.h" #include "gnss_block_interface.h" #include "gnss_sdr_valve.h" #include "unpack_spir_gss6450_samples.h" @@ -42,7 +43,7 @@ #include #include #include -#include +#include #include #include #include @@ -58,7 +59,7 @@ class SpirGSS6450FileSignalSource : public GNSSBlockInterface { public: SpirGSS6450FileSignalSource(ConfigurationInterface* configuration, const std::string& role, - uint32_t in_streams, uint32_t out_streams, gr::msg_queue::sptr queue); + uint32_t in_streams, uint32_t out_streams, std::shared_ptr> queue); virtual ~SpirGSS6450FileSignalSource(); inline std::string role() override @@ -131,7 +132,7 @@ private: std::vector> valve_vec_; std::vector sink_vec_; std::vector throttle_vec_; - gr::msg_queue::sptr queue_; + std::shared_ptr> queue_; size_t item_size_; }; diff --git a/src/algorithms/signal_source/adapters/two_bit_cpx_file_signal_source.cc b/src/algorithms/signal_source/adapters/two_bit_cpx_file_signal_source.cc index 604f9c536..9e0b802d4 100644 --- a/src/algorithms/signal_source/adapters/two_bit_cpx_file_signal_source.cc +++ b/src/algorithms/signal_source/adapters/two_bit_cpx_file_signal_source.cc @@ -45,7 +45,7 @@ TwoBitCpxFileSignalSource::TwoBitCpxFileSignalSource(ConfigurationInterface* con const std::string& role, unsigned int in_streams, unsigned int out_streams, - boost::shared_ptr queue) : role_(role), + std::shared_ptr> queue) : role_(role), in_streams_(in_streams), out_streams_(out_streams), queue_(std::move(queue)) diff --git a/src/algorithms/signal_source/adapters/two_bit_cpx_file_signal_source.h b/src/algorithms/signal_source/adapters/two_bit_cpx_file_signal_source.h index a66a87965..dea315cec 100644 --- a/src/algorithms/signal_source/adapters/two_bit_cpx_file_signal_source.h +++ b/src/algorithms/signal_source/adapters/two_bit_cpx_file_signal_source.h @@ -34,6 +34,7 @@ #ifndef GNSS_SDR_TWO_BIT_CPX_FILE_SIGNAL_SOURCE_H_ #define GNSS_SDR_TWO_BIT_CPX_FILE_SIGNAL_SOURCE_H_ +#include "concurrent_queue.h" #include "gnss_block_interface.h" #include "unpack_byte_2bit_cpx_samples.h" #include @@ -41,7 +42,7 @@ #include #include #include -#include +#include #include #include @@ -59,7 +60,7 @@ public: const std::string& role, unsigned int in_streams, unsigned int out_streams, - boost::shared_ptr queue); + std::shared_ptr> queue); virtual ~TwoBitCpxFileSignalSource(); inline std::string role() override @@ -127,7 +128,7 @@ private: boost::shared_ptr valve_; gr::blocks::file_sink::sptr sink_; gr::blocks::throttle::sptr throttle_; - boost::shared_ptr queue_; + std::shared_ptr> queue_; size_t item_size_; // Throttle control bool enable_throttle_control_; diff --git a/src/algorithms/signal_source/adapters/two_bit_packed_file_signal_source.cc b/src/algorithms/signal_source/adapters/two_bit_packed_file_signal_source.cc index 684cb5b86..4b0c00345 100644 --- a/src/algorithms/signal_source/adapters/two_bit_packed_file_signal_source.cc +++ b/src/algorithms/signal_source/adapters/two_bit_packed_file_signal_source.cc @@ -47,7 +47,7 @@ TwoBitPackedFileSignalSource::TwoBitPackedFileSignalSource(ConfigurationInterfac const std::string& role, unsigned int in_streams, unsigned int out_streams, - boost::shared_ptr queue) : role_(role), + std::shared_ptr> queue) : role_(role), in_streams_(in_streams), out_streams_(out_streams), queue_(std::move(queue)) diff --git a/src/algorithms/signal_source/adapters/two_bit_packed_file_signal_source.h b/src/algorithms/signal_source/adapters/two_bit_packed_file_signal_source.h index 1e98d737b..ea2bb2d5a 100644 --- a/src/algorithms/signal_source/adapters/two_bit_packed_file_signal_source.h +++ b/src/algorithms/signal_source/adapters/two_bit_packed_file_signal_source.h @@ -35,6 +35,7 @@ #ifndef GNSS_SDR_TWO_BIT_PACKED_FILE_SIGNAL_SOURCE_H_ #define GNSS_SDR_TWO_BIT_PACKED_FILE_SIGNAL_SOURCE_H_ +#include "concurrent_queue.h" #include "gnss_block_interface.h" #include "unpack_2bit_samples.h" #include @@ -42,7 +43,7 @@ #include #include #include -#include +#include #include #include @@ -58,7 +59,7 @@ class TwoBitPackedFileSignalSource : public GNSSBlockInterface public: TwoBitPackedFileSignalSource(ConfigurationInterface* configuration, const std::string& role, unsigned int in_streams, unsigned int out_streams, - boost::shared_ptr queue); + std::shared_ptr> queue); virtual ~TwoBitPackedFileSignalSource(); inline std::string role() override @@ -146,7 +147,7 @@ private: boost::shared_ptr valve_; gr::blocks::file_sink::sptr sink_; gr::blocks::throttle::sptr throttle_; - boost::shared_ptr queue_; + std::shared_ptr> queue_; size_t item_size_; bool big_endian_items_; bool big_endian_bytes_; diff --git a/src/algorithms/signal_source/adapters/uhd_signal_source.cc b/src/algorithms/signal_source/adapters/uhd_signal_source.cc index ee58eb551..646d2ad00 100644 --- a/src/algorithms/signal_source/adapters/uhd_signal_source.cc +++ b/src/algorithms/signal_source/adapters/uhd_signal_source.cc @@ -42,7 +42,7 @@ UhdSignalSource::UhdSignalSource(ConfigurationInterface* configuration, const std::string& role, unsigned int in_stream, unsigned int out_stream, - boost::shared_ptr queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(std::move(queue)) + std::shared_ptr> queue) : role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(std::move(queue)) { // DUMP PARAMETERS std::string empty = ""; diff --git a/src/algorithms/signal_source/adapters/uhd_signal_source.h b/src/algorithms/signal_source/adapters/uhd_signal_source.h index 50d233c2e..232f6934f 100644 --- a/src/algorithms/signal_source/adapters/uhd_signal_source.h +++ b/src/algorithms/signal_source/adapters/uhd_signal_source.h @@ -31,12 +31,13 @@ #ifndef GNSS_SDR_UHD_SIGNAL_SOURCE_H_ #define GNSS_SDR_UHD_SIGNAL_SOURCE_H_ +#include "concurrent_queue.h" #include "gnss_block_interface.h" #include #include #include -#include #include +#include #include #include #include @@ -52,7 +53,7 @@ class UhdSignalSource : public GNSSBlockInterface public: UhdSignalSource(ConfigurationInterface* configuration, const std::string& role, unsigned int in_stream, - unsigned int out_stream, boost::shared_ptr queue); + unsigned int out_stream, std::shared_ptr> queue); virtual ~UhdSignalSource(); @@ -107,7 +108,7 @@ private: std::vector> valve_; std::vector file_sink_; - boost::shared_ptr queue_; + std::shared_ptr> queue_; }; #endif /*GNSS_SDR_UHD_SIGNAL_SOURCE_H_*/ diff --git a/src/algorithms/signal_source/gnuradio_blocks/labsat23_source.cc b/src/algorithms/signal_source/gnuradio_blocks/labsat23_source.cc index 06972a25a..366eb558f 100644 --- a/src/algorithms/signal_source/gnuradio_blocks/labsat23_source.cc +++ b/src/algorithms/signal_source/gnuradio_blocks/labsat23_source.cc @@ -30,7 +30,8 @@ #include "labsat23_source.h" -#include "control_message_factory.h" +#include "command_event.h" +#include #include #include #include @@ -39,7 +40,7 @@ #include -labsat23_source_sptr labsat23_make_source_sptr(const char *signal_file_basename, int channel_selector, gr::msg_queue::sptr queue) +labsat23_source_sptr labsat23_make_source_sptr(const char *signal_file_basename, int channel_selector, std::shared_ptr> queue) { return labsat23_source_sptr(new labsat23_source(signal_file_basename, channel_selector, std::move(queue))); } @@ -47,10 +48,10 @@ labsat23_source_sptr labsat23_make_source_sptr(const char *signal_file_basename, labsat23_source::labsat23_source(const char *signal_file_basename, int channel_selector, - gr::msg_queue::sptr queue) : gr::block("labsat23_source", - gr::io_signature::make(0, 0, 0), - gr::io_signature::make(1, 1, sizeof(gr_complex))), - d_queue(std::move(queue)) + std::shared_ptr> queue) : gr::block("labsat23_source", + gr::io_signature::make(0, 0, 0), + gr::io_signature::make(1, 1, sizeof(gr_complex))), + d_queue(std::move(queue)) { if (channel_selector < 1 or channel_selector > 2) { @@ -467,9 +468,8 @@ int labsat23_source::general_work(int noutput_items, { std::cout << "End of file reached, LabSat source stop" << std::endl; } - auto *cmf = new ControlMessageFactory(); - d_queue->handle(cmf->GetQueueMessage(200, 0)); - delete cmf; + + d_queue->push(pmt::make_any(command_event_make(200, 0))); return -1; } } @@ -528,9 +528,7 @@ int labsat23_source::general_work(int noutput_items, { std::cout << "End of file reached, LabSat source stop" << std::endl; } - auto *cmf = new ControlMessageFactory(); - d_queue->handle(cmf->GetQueueMessage(200, 0)); - delete cmf; + d_queue->push(pmt::make_any(command_event_make(200, 0))); return -1; } } diff --git a/src/algorithms/signal_source/gnuradio_blocks/labsat23_source.h b/src/algorithms/signal_source/gnuradio_blocks/labsat23_source.h index a09c0f3a8..49c74bc61 100644 --- a/src/algorithms/signal_source/gnuradio_blocks/labsat23_source.h +++ b/src/algorithms/signal_source/gnuradio_blocks/labsat23_source.h @@ -31,8 +31,9 @@ #ifndef GNSS_SDR_LABSAT23_SOURCE_H #define GNSS_SDR_LABSAT23_SOURCE_H +#include "concurrent_queue.h" #include -#include // for msg_queue, msg_queue::sptr +#include #include #include #include @@ -45,7 +46,7 @@ using labsat23_source_sptr = boost::shared_ptr; labsat23_source_sptr labsat23_make_source_sptr( const char *signal_file_basename, int channel_selector, - gr::msg_queue::sptr queue); + std::shared_ptr> queue); /*! * \brief This class implements conversion between Labsat2 and 3 format byte packet samples to gr_complex @@ -64,11 +65,11 @@ private: friend labsat23_source_sptr labsat23_make_source_sptr( const char *signal_file_basename, int channel_selector, - gr::msg_queue::sptr queue); + std::shared_ptr> queue); labsat23_source(const char *signal_file_basename, int channel_selector, - gr::msg_queue::sptr queue); + std::shared_ptr> queue); std::string generate_filename(); void decode_samples_one_channel(int16_t input_short, gr_complex *out, int type); @@ -82,7 +83,7 @@ private: std::ifstream *binary_input_file; uint8_t d_ref_clock; uint8_t d_bits_per_sample; - gr::msg_queue::sptr d_queue; + std::shared_ptr> d_queue; }; #endif diff --git a/src/algorithms/signal_source/libs/CMakeLists.txt b/src/algorithms/signal_source/libs/CMakeLists.txt index f6015ec59..1045967b4 100644 --- a/src/algorithms/signal_source/libs/CMakeLists.txt +++ b/src/algorithms/signal_source/libs/CMakeLists.txt @@ -71,10 +71,10 @@ target_link_libraries(signal_source_libs PUBLIC Boost::boost Gnuradio::runtime + core_receiver PRIVATE Gflags::gflags Glog::glog - core_receiver ) if(ENABLE_PLUTOSDR OR ENABLE_FMCOMMS2) diff --git a/src/algorithms/signal_source/libs/gnss_sdr_valve.cc b/src/algorithms/signal_source/libs/gnss_sdr_valve.cc index 615cb65b7..7a5fc18a9 100644 --- a/src/algorithms/signal_source/libs/gnss_sdr_valve.cc +++ b/src/algorithms/signal_source/libs/gnss_sdr_valve.cc @@ -32,17 +32,17 @@ */ #include "gnss_sdr_valve.h" -#include "control_message_factory.h" // for ControlMessageFactory -#include // for LOG -#include // for io_signature -#include // for min -#include // for memcpy -#include // for usleep +#include "command_event.h" +#include // for LOG +#include // for io_signature +#include // for min +#include // for memcpy +#include // for usleep #include Gnss_Sdr_Valve::Gnss_Sdr_Valve(size_t sizeof_stream_item, uint64_t nitems, - gr::msg_queue::sptr queue, + std::shared_ptr> queue, bool stop_flowgraph) : gr::sync_block("valve", gr::io_signature::make(1, 20, sizeof_stream_item), gr::io_signature::make(1, 20, sizeof_stream_item)), @@ -55,14 +55,14 @@ Gnss_Sdr_Valve::Gnss_Sdr_Valve(size_t sizeof_stream_item, } -boost::shared_ptr gnss_sdr_make_valve(size_t sizeof_stream_item, uint64_t nitems, gr::msg_queue::sptr queue, bool stop_flowgraph) +boost::shared_ptr gnss_sdr_make_valve(size_t sizeof_stream_item, uint64_t nitems, std::shared_ptr> queue, bool stop_flowgraph) { boost::shared_ptr valve_(new Gnss_Sdr_Valve(sizeof_stream_item, nitems, std::move(queue), stop_flowgraph)); return valve_; } -boost::shared_ptr gnss_sdr_make_valve(size_t sizeof_stream_item, uint64_t nitems, gr::msg_queue::sptr queue) +boost::shared_ptr gnss_sdr_make_valve(size_t sizeof_stream_item, uint64_t nitems, std::shared_ptr> queue) { boost::shared_ptr valve_(new Gnss_Sdr_Valve(sizeof_stream_item, nitems, std::move(queue), true)); return valve_; @@ -83,10 +83,8 @@ int Gnss_Sdr_Valve::work(int noutput_items, { if (d_ncopied_items >= d_nitems) { - auto *cmf = new ControlMessageFactory(); - d_queue->handle(cmf->GetQueueMessage(200, 0)); LOG(INFO) << "Stopping receiver, " << d_ncopied_items << " samples processed"; - delete cmf; + d_queue->push(pmt::make_any(command_event_make(200, 0))); if (d_stop_flowgraph) { return -1; // Done! diff --git a/src/algorithms/signal_source/libs/gnss_sdr_valve.h b/src/algorithms/signal_source/libs/gnss_sdr_valve.h index b56807c2b..6c28f28f5 100644 --- a/src/algorithms/signal_source/libs/gnss_sdr_valve.h +++ b/src/algorithms/signal_source/libs/gnss_sdr_valve.h @@ -34,11 +34,12 @@ #ifndef GNSS_SDR_GNSS_SDR_VALVE_H_ #define GNSS_SDR_GNSS_SDR_VALVE_H_ +#include "concurrent_queue.h" #include -#include // for msg_queue, msg_queue::sptr #include // for sync_block #include // for gr_vector_const_void_star -#include // for size_t +#include +#include // for size_t #include class Gnss_Sdr_Valve; @@ -46,12 +47,12 @@ class Gnss_Sdr_Valve; boost::shared_ptr gnss_sdr_make_valve( size_t sizeof_stream_item, uint64_t nitems, - gr::msg_queue::sptr queue); + std::shared_ptr> queue); boost::shared_ptr gnss_sdr_make_valve( size_t sizeof_stream_item, uint64_t nitems, - gr::msg_queue::sptr queue, + std::shared_ptr> queue, bool stop_flowgraph); /*! @@ -71,21 +72,21 @@ private: friend boost::shared_ptr gnss_sdr_make_valve( size_t sizeof_stream_item, uint64_t nitems, - gr::msg_queue::sptr queue); + std::shared_ptr> queue); friend boost::shared_ptr gnss_sdr_make_valve( size_t sizeof_stream_item, uint64_t nitems, - gr::msg_queue::sptr queue, + std::shared_ptr> queue, bool stop_flowgraph); Gnss_Sdr_Valve(size_t sizeof_stream_item, uint64_t nitems, - gr::msg_queue::sptr queue, bool stop_flowgraph); + std::shared_ptr> queue, bool stop_flowgraph); uint64_t d_nitems; uint64_t d_ncopied_items; - gr::msg_queue::sptr d_queue; + std::shared_ptr> d_queue; bool d_stop_flowgraph; bool d_open_valve; }; diff --git a/src/core/receiver/CMakeLists.txt b/src/core/receiver/CMakeLists.txt index 83d684906..7f80fddbd 100644 --- a/src/core/receiver/CMakeLists.txt +++ b/src/core/receiver/CMakeLists.txt @@ -19,17 +19,17 @@ set(GNSS_RECEIVER_SOURCES control_thread.cc - control_message_factory.cc file_configuration.cc gnss_block_factory.cc gnss_flowgraph.cc in_memory_configuration.cc tcp_cmd_interface.cc + channel_event.cc + command_event.cc ) set(GNSS_RECEIVER_HEADERS control_thread.h - control_message_factory.h file_configuration.h gnss_block_factory.h gnss_flowgraph.h @@ -38,6 +38,8 @@ set(GNSS_RECEIVER_HEADERS concurrent_map.h concurrent_queue.h control_message.h + channel_event.h + command_event.h ) list(SORT GNSS_RECEIVER_HEADERS) diff --git a/src/core/receiver/channel_event.cc b/src/core/receiver/channel_event.cc new file mode 100644 index 000000000..7c6862d76 --- /dev/null +++ b/src/core/receiver/channel_event.cc @@ -0,0 +1,42 @@ +/*! + * \file channel_event.cc + * \brief Class that defines a channel event + * \author Javier Arribas, 2019. jarribas(at)cttc.es + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2019 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#include "channel_event.h" + +channel_event_sptr channel_event_make(int channel_id, int event_type) +{ + return channel_event_sptr(new channel_event(channel_id, event_type)); +} + +channel_event::channel_event(int channel_id_, int event_type_) +{ + channel_id = channel_id_; + event_type = event_type_; +} diff --git a/src/core/receiver/channel_event.h b/src/core/receiver/channel_event.h new file mode 100644 index 000000000..51c1a3a8f --- /dev/null +++ b/src/core/receiver/channel_event.h @@ -0,0 +1,53 @@ +/*! + * \file channel_event.h + * \brief Class that defines a channel event + * \author Javier Arribas, 2019. jarribas(at)cttc.es + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2019 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#ifndef GNSS_SDR_CHANNEL_EVENT_H +#define GNSS_SDR_CHANNEL_EVENT_H + +#include + +class channel_event; + +using channel_event_sptr = std::shared_ptr; + +channel_event_sptr channel_event_make(int channel_id, int event_type); + +class channel_event +{ +public: + int channel_id; + int event_type; +private: + friend channel_event_sptr channel_event_make(int channel_id, int event_type); + channel_event(int channel_id_, int event_type_); + +}; + +#endif diff --git a/src/core/receiver/command_event.cc b/src/core/receiver/command_event.cc new file mode 100644 index 000000000..771061255 --- /dev/null +++ b/src/core/receiver/command_event.cc @@ -0,0 +1,42 @@ +/*! + * \file command_event.cc + * \brief Class that defines a receiver command event + * \author Javier Arribas, 2019. jarribas(at)cttc.es + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2019 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#include "command_event.h" + +command_event_sptr command_event_make(int command_id, int event_type) +{ + return command_event_sptr(new command_event(command_id, event_type)); +} + +command_event::command_event(int command_id_, int event_type_) +{ + command_id = command_id_; + event_type = event_type_; +} diff --git a/src/core/receiver/command_event.h b/src/core/receiver/command_event.h new file mode 100644 index 000000000..094281578 --- /dev/null +++ b/src/core/receiver/command_event.h @@ -0,0 +1,53 @@ +/*! + * \file command_event.h + * \brief Class that defines a receiver command event + * \author Javier Arribas, 2019. jarribas(at)cttc.es + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2019 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#ifndef GNSS_SDR_command_EVENT_H +#define GNSS_SDR_command_EVENT_H + +#include + +class command_event; + +using command_event_sptr = std::shared_ptr; + +command_event_sptr command_event_make(int command_id, int event_type); + +class command_event +{ +public: + int command_id; + int event_type; + +private: + friend command_event_sptr command_event_make(int command_id, int event_type); + command_event(int command_id_, int event_type_); +}; + +#endif diff --git a/src/core/receiver/control_message_factory.cc b/src/core/receiver/control_message_factory.cc deleted file mode 100644 index 566f884a4..000000000 --- a/src/core/receiver/control_message_factory.cc +++ /dev/null @@ -1,72 +0,0 @@ -/*! - * \file control_message_factory.cc - * \brief Implementation of a Control Message Factory - * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com - * - * ------------------------------------------------------------------------- - * - * Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) - * - * GNSS-SDR is a software defined Global Navigation - * Satellite Systems receiver - * - * This file is part of GNSS-SDR. - * - * GNSS-SDR is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * GNSS-SDR is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNSS-SDR. If not, see . - * - * ------------------------------------------------------------------------- - */ - -#include "control_message_factory.h" -#include -#include // for memcpy -#include // for operator<<, basic_ostream - -// Constructor -ControlMessageFactory::ControlMessageFactory() = default; - - -// Destructor -ControlMessageFactory::~ControlMessageFactory() = default; - - -gr::message::sptr ControlMessageFactory::GetQueueMessage(unsigned int who, unsigned int what) -{ - std::shared_ptr control_message = std::make_shared(); - control_message->who = who; - control_message->what = what; - gr::message::sptr queue_message = gr::message::make(0, 0, 0, sizeof(ControlMessage)); - memcpy(queue_message->msg(), control_message.get(), sizeof(ControlMessage)); - return queue_message; -} - - -std::shared_ptr>> ControlMessageFactory::GetControlMessages(const gr::message::sptr queue_message) // NOLINT(performance-unnecessary-value-param) -{ - std::shared_ptr>> control_messages = std::make_shared>>(); - unsigned int control_messages_count = queue_message->length() / sizeof(ControlMessage); - if (queue_message->length() % sizeof(ControlMessage) != 0) - { - LOG(WARNING) << "Queue message has size " << queue_message->length() << ", which is not" - << " multiple of control message size " << sizeof(ControlMessage); - LOG(WARNING) << "Ignoring this queue message to prevent unexpected results."; - return control_messages; - } - for (unsigned int i = 0; i < control_messages_count; i++) - { - control_messages->push_back(std::make_shared()); - memcpy(control_messages->at(i).get(), queue_message->msg() + (i * sizeof(ControlMessage)), sizeof(ControlMessage)); - } - return control_messages; -} diff --git a/src/core/receiver/control_message_factory.h b/src/core/receiver/control_message_factory.h deleted file mode 100644 index f8a4666f6..000000000 --- a/src/core/receiver/control_message_factory.h +++ /dev/null @@ -1,64 +0,0 @@ -/*! - * \file control_message_factory.h - * \brief Interface of a factory for control messages. - * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com - * - * ------------------------------------------------------------------------- - * - * Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) - * - * GNSS-SDR is a software defined Global Navigation - * Satellite Systems receiver - * - * This file is part of GNSS-SDR. - * - * GNSS-SDR is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * GNSS-SDR is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNSS-SDR. If not, see . - * - * ------------------------------------------------------------------------- - */ - -#ifndef GNSS_SDR_CONTROL_MESSAGE_FACTORY_H_ -#define GNSS_SDR_CONTROL_MESSAGE_FACTORY_H_ - -#include -#include -#include - -//! Message described by who sent it and what it says -typedef struct control_message -{ - unsigned int who; - unsigned int what; -} ControlMessage; - - -/*! - * \brief This class implements a factory for Control Messages. - * - * It encapsulates the complexity behind getting Queue Messages and associated Control Messages - */ -class ControlMessageFactory -{ -public: - //! Constructor - ControlMessageFactory(); - - //! Virtual destructor - virtual ~ControlMessageFactory(); - - gr::message::sptr GetQueueMessage(unsigned int who, unsigned int what); - std::shared_ptr>> GetControlMessages(const gr::message::sptr queue_message); // NOLINT(performance-unnecessary-value-param) -}; - -#endif /*GNSS_SDR_CONTROL_MESSAGE_FACTORY_H_*/ diff --git a/src/core/receiver/control_thread.cc b/src/core/receiver/control_thread.cc index 384d6f041..154f9ec7b 100644 --- a/src/core/receiver/control_thread.cc +++ b/src/core/receiver/control_thread.cc @@ -34,9 +34,7 @@ #include "control_thread.h" #include "concurrent_map.h" -#include "concurrent_queue.h" #include "configuration_interface.h" -#include "control_message_factory.h" #include "file_configuration.h" #include "galileo_almanac.h" #include "galileo_ephemeris.h" @@ -110,7 +108,7 @@ ControlThread::ControlThread(std::shared_ptr configurati void ControlThread::init() { // Instantiates a control queue, a GNSS flowgraph, and a control message factory - control_queue_ = gr::msg_queue::make(0); + control_queue_ = std::make_shared>(); cmd_interface_.set_msg_queue(control_queue_); //set also the queue pointer for the telecommand thread try { @@ -120,7 +118,6 @@ void ControlThread::init() { std::cout << "Caught bad lexical cast with error " << e.what() << std::endl; } - control_message_factory_ = std::make_shared(); stop_ = false; processed_control_messages_ = 0; applied_actions_ = 0; @@ -287,12 +284,13 @@ int ControlThread::run() // Main loop to read and process the control messages while (flowgraph_->running() && !stop_) { - //TODO re-enable the blocking read messages functions and fork the process - read_control_messages(); - if (control_messages_ != nullptr) - { - process_control_messages(); - } + //TODO call here the new sat dispatcher and receiver controller + // read_control_messages(); + // if (control_messages_ != nullptr) + // { + // process_control_messages(); + // } + std::cout << "tick\n"; } std::cout << "Stopping GNSS-SDR, please wait!" << std::endl; flowgraph_->stop(); @@ -325,7 +323,7 @@ int ControlThread::run() } -void ControlThread::set_control_queue(const gr::msg_queue::sptr control_queue) // NOLINT(performance-unnecessary-value-param) +void ControlThread::set_control_queue(const std::shared_ptr> control_queue) // NOLINT(performance-unnecessary-value-param) { if (flowgraph_->running()) { @@ -794,42 +792,42 @@ void ControlThread::assist_GNSS() void ControlThread::read_control_messages() { DLOG(INFO) << "Reading control messages from queue"; - gr::message::sptr queue_message = control_queue_->delete_head(); - if (queue_message != nullptr) - { - control_messages_ = control_message_factory_->GetControlMessages(queue_message); - } - else - { - control_messages_->clear(); - } + // gr::message::sptr queue_message = control_queue_->delete_head(); + // if (queue_message != nullptr) + // { + // control_messages_ = control_message_factory_->GetControlMessages(queue_message); + // } + // else + // { + // control_messages_->clear(); + // } } // Apply the corresponding control actions void ControlThread::process_control_messages() { - for (auto &i : *control_messages_) - { - if (stop_) - { - break; - } - if (i->who == 200) - { - apply_action(i->what); - } - else - { - if (i->who == 300) // some TC commands require also actions from control_thread - { - apply_action(i->what); - } - flowgraph_->apply_action(i->who, i->what); - } - processed_control_messages_++; - } - control_messages_->clear(); + // for (auto &i : *control_messages_) + // { + // if (stop_) + // { + // break; + // } + // if (i->who == 200) + // { + // apply_action(i->what); + // } + // else + // { + // if (i->who == 300) // some TC commands require also actions from control_thread + // { + // apply_action(i->what); + // } + // flowgraph_->apply_action(i->who, i->what); + // } + // processed_control_messages_++; + // } + // control_messages_->clear(); DLOG(INFO) << "Processed all control messages"; } @@ -1092,11 +1090,12 @@ void ControlThread::sysv_queue_listener() if ((std::abs(received_message - (-200.0)) < 10 * std::numeric_limits::epsilon())) { std::cout << "Quit order received, stopping GNSS-SDR !!" << std::endl; - std::unique_ptr cmf(new ControlMessageFactory()); - if (control_queue_ != gr::msg_queue::sptr()) - { - control_queue_->handle(cmf->GetQueueMessage(200, 0)); - } + //todo: remplace old shutdown mechanism + // std::unique_ptr cmf(new ControlMessageFactory()); + // if (control_queue_ != std::shared_ptr>()) + // { + // control_queue_->handle(cmf->GetQueueMessage(200, 0)); + // } read_queue = false; } } @@ -1114,11 +1113,12 @@ void ControlThread::keyboard_listener() if (c == 'q') { std::cout << "Quit keystroke order received, stopping GNSS-SDR !!" << std::endl; - std::unique_ptr cmf(new ControlMessageFactory()); - if (control_queue_ != gr::msg_queue::sptr()) - { - control_queue_->handle(cmf->GetQueueMessage(200, 0)); - } + //todo: remplace old shutdown mechanism + // std::unique_ptr cmf(new ControlMessageFactory()); + // if (control_queue_ != std::shared_ptr>()) + // { + // control_queue_->handle(cmf->GetQueueMessage(200, 0)); + // } read_keys = false; } std::this_thread::sleep_for(std::chrono::milliseconds(100)); diff --git a/src/core/receiver/control_thread.h b/src/core/receiver/control_thread.h index 7d58226e9..a35283ac1 100644 --- a/src/core/receiver/control_thread.h +++ b/src/core/receiver/control_thread.h @@ -35,20 +35,20 @@ #ifndef GNSS_SDR_CONTROL_THREAD_H_ #define GNSS_SDR_CONTROL_THREAD_H_ -#include "agnss_ref_location.h" // for Agnss_Ref_Location -#include "agnss_ref_time.h" // for Agnss_Ref_Time -#include "control_message_factory.h" // for ControlMessage -#include "gnss_sdr_supl_client.h" // for Gnss_Sdr_Supl_Client -#include "tcp_cmd_interface.h" // for TcpCmdInterface -#include // for arma::vec -#include // for boost::thread -#include // for msg_queue, msg_queue::sptr -#include // for time_t -#include // for shared_ptr -#include // for string -#include // for std::thread -#include // for pair -#include // for vector +#include "agnss_ref_location.h" // for Agnss_Ref_Location +#include "agnss_ref_time.h" // for Agnss_Ref_Time +#include "concurrent_queue.h" +#include "gnss_sdr_supl_client.h" // for Gnss_Sdr_Supl_Client +#include "tcp_cmd_interface.h" // for TcpCmdInterface +#include // for arma::vec +#include // for boost::thread +#include +#include // for time_t +#include // for shared_ptr +#include // for string +#include // for std::thread +#include // for pair +#include // for vector class ConfigurationInterface; class GNSSFlowgraph; @@ -97,7 +97,7 @@ public: * * \param[in] boost::shared_ptr control_queue */ - void set_control_queue(const gr::msg_queue::sptr control_queue); // NOLINT(performance-unnecessary-value-param) + void set_control_queue(const std::shared_ptr> control_queue); // NOLINT(performance-unnecessary-value-param) unsigned int processed_control_messages() { @@ -163,9 +163,7 @@ private: void apply_action(unsigned int what); std::shared_ptr flowgraph_; std::shared_ptr configuration_; - gr::msg_queue::sptr control_queue_; - std::shared_ptr control_message_factory_; - std::shared_ptr>> control_messages_; + std::shared_ptr> control_queue_; bool stop_; bool restart_; bool delete_configuration_; diff --git a/src/core/receiver/gnss_block_factory.cc b/src/core/receiver/gnss_block_factory.cc index 7976d99da..f7574a986 100644 --- a/src/core/receiver/gnss_block_factory.cc +++ b/src/core/receiver/gnss_block_factory.cc @@ -182,7 +182,7 @@ GNSSBlockFactory::~GNSSBlockFactory() = default; std::unique_ptr GNSSBlockFactory::GetSignalSource( - const std::shared_ptr& configuration, const gr::msg_queue::sptr queue, int ID) // NOLINT(performance-unnecessary-value-param) + const std::shared_ptr& configuration, const std::shared_ptr> queue, int ID) // NOLINT(performance-unnecessary-value-param) { std::string default_implementation = "File_Signal_Source"; std::string role = "SignalSource"; //backwards compatibility for old conf files @@ -321,7 +321,7 @@ std::unique_ptr GNSSBlockFactory::GetPVT(const std::shared_p std::unique_ptr GNSSBlockFactory::GetChannel_1C( const std::shared_ptr& configuration, const std::string& acq, const std::string& trk, const std::string& tlm, int channel, - gr::msg_queue::sptr queue) + std::shared_ptr> queue) { //"appendix" is added to the "role" with the aim of Acquisition, Tracking and Telemetry Decoder adapters //can find their specific configurations when they read the config @@ -389,7 +389,7 @@ std::unique_ptr GNSSBlockFactory::GetChannel_1C( std::unique_ptr GNSSBlockFactory::GetChannel_2S( const std::shared_ptr& configuration, const std::string& acq, const std::string& trk, const std::string& tlm, int channel, - gr::msg_queue::sptr queue) + std::shared_ptr> queue) { LOG(INFO) << "Instantiating Channel " << channel << " with Acquisition Implementation: " << acq << ", Tracking Implementation: " << trk << ", Telemetry Decoder implementation: " << tlm; @@ -453,7 +453,7 @@ std::unique_ptr GNSSBlockFactory::GetChannel_2S( std::unique_ptr GNSSBlockFactory::GetChannel_1B( const std::shared_ptr& configuration, const std::string& acq, const std::string& trk, const std::string& tlm, int channel, - gr::msg_queue::sptr queue) + std::shared_ptr> queue) { std::stringstream stream; stream << channel; @@ -520,7 +520,7 @@ std::unique_ptr GNSSBlockFactory::GetChannel_1B( std::unique_ptr GNSSBlockFactory::GetChannel_5X( const std::shared_ptr& configuration, const std::string& acq, const std::string& trk, const std::string& tlm, int channel, - gr::msg_queue::sptr queue) + std::shared_ptr> queue) { std::stringstream stream; stream << channel; @@ -587,7 +587,7 @@ std::unique_ptr GNSSBlockFactory::GetChannel_5X( std::unique_ptr GNSSBlockFactory::GetChannel_1G( const std::shared_ptr& configuration, const std::string& acq, const std::string& trk, const std::string& tlm, int channel, - gr::msg_queue::sptr queue) + std::shared_ptr> queue) { std::stringstream stream; stream << channel; @@ -655,7 +655,7 @@ std::unique_ptr GNSSBlockFactory::GetChannel_1G( std::unique_ptr GNSSBlockFactory::GetChannel_2G( const std::shared_ptr& configuration, const std::string& acq, const std::string& trk, const std::string& tlm, int channel, - gr::msg_queue::sptr queue) + std::shared_ptr> queue) { std::stringstream stream; stream << channel; @@ -723,7 +723,7 @@ std::unique_ptr GNSSBlockFactory::GetChannel_2G( std::unique_ptr GNSSBlockFactory::GetChannel_L5( const std::shared_ptr& configuration, const std::string& acq, const std::string& trk, const std::string& tlm, int channel, - gr::msg_queue::sptr queue) + std::shared_ptr> queue) { std::stringstream stream; stream << channel; @@ -790,7 +790,7 @@ std::unique_ptr GNSSBlockFactory::GetChannel_L5( std::unique_ptr GNSSBlockFactory::GetChannel_B1( const std::shared_ptr& configuration, const std::string& acq, const std::string& trk, const std::string& tlm, int channel, - gr::msg_queue::sptr queue) + std::shared_ptr> queue) { std::stringstream stream; stream << channel; @@ -857,7 +857,7 @@ std::unique_ptr GNSSBlockFactory::GetChannel_B1( std::unique_ptr GNSSBlockFactory::GetChannel_B3( const std::shared_ptr& configuration, const std::string& acq, const std::string& trk, const std::string& tlm, int channel, - gr::msg_queue::sptr queue) + std::shared_ptr> queue) { std::stringstream stream; stream << channel; @@ -921,7 +921,7 @@ std::unique_ptr GNSSBlockFactory::GetChannel_B3( std::unique_ptr>> GNSSBlockFactory::GetChannels( - const std::shared_ptr& configuration, const gr::msg_queue::sptr queue) // NOLINT(performance-unnecessary-value-param) + const std::shared_ptr& configuration, const std::shared_ptr> queue) // NOLINT(performance-unnecessary-value-param) { std::string default_implementation = "Pass_Through"; std::string tracking_implementation; @@ -1241,7 +1241,7 @@ std::unique_ptr GNSSBlockFactory::GetBlock( const std::shared_ptr& configuration, const std::string& role, const std::string& implementation, unsigned int in_streams, - unsigned int out_streams, const gr::msg_queue::sptr queue) // NOLINT(performance-unnecessary-value-param) + unsigned int out_streams, const std::shared_ptr> queue) // NOLINT(performance-unnecessary-value-param) { std::unique_ptr block; diff --git a/src/core/receiver/gnss_block_factory.h b/src/core/receiver/gnss_block_factory.h index 3076c879d..af9889c89 100644 --- a/src/core/receiver/gnss_block_factory.h +++ b/src/core/receiver/gnss_block_factory.h @@ -37,10 +37,11 @@ #ifndef GNSS_SDR_BLOCK_FACTORY_H_ #define GNSS_SDR_BLOCK_FACTORY_H_ -#include // for msg_queue::sptr -#include // for unique_ptr, shared_ptr -#include // for string -#include // for vector +#include "concurrent_queue.h" +#include +#include // for unique_ptr, shared_ptr +#include // for string +#include // for vector class ConfigurationInterface; @@ -59,12 +60,12 @@ public: virtual ~GNSSBlockFactory(); std::unique_ptr GetSignalSource(const std::shared_ptr& configuration, - const gr::msg_queue::sptr queue, int ID = -1); // NOLINT(performance-unnecessary-value-param) + const std::shared_ptr> queue, int ID = -1); // NOLINT(performance-unnecessary-value-param) std::unique_ptr GetSignalConditioner(const std::shared_ptr& configuration, int ID = -1); std::unique_ptr>> GetChannels(const std::shared_ptr& configuration, - const gr::msg_queue::sptr queue); // NOLINT(performance-unnecessary-value-param) + const std::shared_ptr> queue); // NOLINT(performance-unnecessary-value-param) std::unique_ptr GetObservables(const std::shared_ptr& configuration); @@ -76,44 +77,44 @@ public: std::unique_ptr GetBlock(const std::shared_ptr& configuration, const std::string& role, const std::string& implementation, unsigned int in_streams, unsigned int out_streams, - const gr::msg_queue::sptr queue = nullptr); // NOLINT(performance-unnecessary-value-param) + const std::shared_ptr> queue = nullptr); // NOLINT(performance-unnecessary-value-param) private: std::unique_ptr GetChannel_1C(const std::shared_ptr& configuration, const std::string& acq, const std::string& trk, const std::string& tlm, int channel, - gr::msg_queue::sptr queue); + std::shared_ptr> queue); std::unique_ptr GetChannel_2S(const std::shared_ptr& configuration, const std::string& acq, const std::string& trk, const std::string& tlm, int channel, - gr::msg_queue::sptr queue); + std::shared_ptr> queue); std::unique_ptr GetChannel_1B(const std::shared_ptr& configuration, const std::string& acq, const std::string& trk, const std::string& tlm, int channel, - gr::msg_queue::sptr queue); + std::shared_ptr> queue); std::unique_ptr GetChannel_5X(const std::shared_ptr& configuration, const std::string& acq, const std::string& trk, const std::string& tlm, int channel, - gr::msg_queue::sptr queue); + std::shared_ptr> queue); std::unique_ptr GetChannel_L5(const std::shared_ptr& configuration, const std::string& acq, const std::string& trk, const std::string& tlm, int channel, - gr::msg_queue::sptr queue); + std::shared_ptr> queue); std::unique_ptr GetChannel_1G(const std::shared_ptr& configuration, const std::string& acq, const std::string& trk, const std::string& tlm, int channel, - gr::msg_queue::sptr queue); + std::shared_ptr> queue); std::unique_ptr GetChannel_2G(const std::shared_ptr& configuration, const std::string& acq, const std::string& trk, const std::string& tlm, int channel, - gr::msg_queue::sptr queue); + std::shared_ptr> queue); std::unique_ptr GetChannel_B1(const std::shared_ptr& configuration, const std::string& acq, const std::string& trk, const std::string& tlm, int channel, - gr::msg_queue::sptr queue); + std::shared_ptr> queue); std::unique_ptr GetChannel_B3(const std::shared_ptr& configuration, const std::string& acq, const std::string& trk, const std::string& tlm, int channel, - boost::shared_ptr queue); + std::shared_ptr> queue); std::unique_ptr GetAcqBlock( const std::shared_ptr& configuration, diff --git a/src/core/receiver/gnss_flowgraph.cc b/src/core/receiver/gnss_flowgraph.cc index 5efa45f2b..4488971b7 100644 --- a/src/core/receiver/gnss_flowgraph.cc +++ b/src/core/receiver/gnss_flowgraph.cc @@ -75,7 +75,7 @@ #define GNSS_SDR_ARRAY_SIGNAL_CONDITIONER_CHANNELS 8 -GNSSFlowgraph::GNSSFlowgraph(std::shared_ptr configuration, const gr::msg_queue::sptr queue) // NOLINT(performance-unnecessary-value-param) +GNSSFlowgraph::GNSSFlowgraph(std::shared_ptr configuration, const std::shared_ptr> queue) // NOLINT(performance-unnecessary-value-param) { connected_ = false; running_ = false; @@ -1061,7 +1061,106 @@ bool GNSSFlowgraph::send_telemetry_msg(const pmt::pmt_t& msg) return true; } +void GNSSFlowgraph::push_back_signal(Gnss_Signal gs) +{ + switch (mapStringValues_[gs.get_signal_str()]) + { + case evGPS_1C: + available_GPS_1C_signals_.remove(gs); + available_GPS_1C_signals_.push_back(gs); + break; + case evGPS_2S: + available_GPS_2S_signals_.remove(gs); + available_GPS_2S_signals_.push_back(gs); + break; + + case evGPS_L5: + available_GPS_L5_signals_.remove(gs); + available_GPS_L5_signals_.push_back(gs); + break; + + case evGAL_1B: + available_GAL_1B_signals_.remove(gs); + available_GAL_1B_signals_.push_back(gs); + break; + + case evGAL_5X: + available_GAL_5X_signals_.remove(gs); + available_GAL_5X_signals_.push_back(gs); + break; + + case evGLO_1G: + available_GLO_1G_signals_.remove(gs); + available_GLO_1G_signals_.push_back(gs); + break; + + case evGLO_2G: + available_GLO_2G_signals_.remove(gs); + available_GLO_2G_signals_.push_back(gs); + break; + + case evBDS_B1: + available_BDS_B1_signals_.remove(gs); + available_BDS_B1_signals_.push_back(gs); + break; + + case evBDS_B3: + available_BDS_B3_signals_.remove(gs); + available_BDS_B3_signals_.push_back(gs); + break; + + default: + LOG(ERROR) << "This should not happen :-("; + break; + } +} + +void GNSSFlowgraph::remove_signal(Gnss_Signal gs) +{ + switch (mapStringValues_[gs.get_signal_str()]) + { + case evGPS_1C: + available_GPS_1C_signals_.remove(gs); + break; + + case evGPS_2S: + available_GPS_2S_signals_.remove(gs); + break; + + case evGPS_L5: + available_GPS_L5_signals_.remove(gs); + break; + + case evGAL_1B: + available_GAL_1B_signals_.remove(gs); + break; + + case evGAL_5X: + available_GAL_5X_signals_.remove(gs); + break; + + case evGLO_1G: + available_GLO_1G_signals_.remove(gs); + break; + + case evGLO_2G: + available_GLO_2G_signals_.remove(gs); + break; + + case evBDS_B1: + available_BDS_B1_signals_.remove(gs); + break; + + case evBDS_B3: + available_BDS_B3_signals_.remove(gs); + break; + + default: + LOG(ERROR) << "This should not happen :-("; + break; + } +} /* * Applies an action to the flow graph * @@ -1089,6 +1188,7 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) //todo: the acquisition events are initiated from the acquisition success or failure queued msg. If the acquisition is disabled for non-assisted secondary freq channels, the engine stops.. std::lock_guard lock(signal_list_mutex); + std::cout << "Received " << what << " from " << who << ". acq_channels_count_ = " << acq_channels_count_ << "\n"; DLOG(INFO) << "Received " << what << " from " << who << ". Number of applied actions = " << applied_actions_; unsigned int sat = 0; if (who < 200) @@ -1109,60 +1209,10 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) if (sat == 0) { Gnss_Signal gs = channels_[who]->get_signal(); - switch (mapStringValues_[gs.get_signal_str()]) - { - case evGPS_1C: - available_GPS_1C_signals_.remove(gs); - available_GPS_1C_signals_.push_back(gs); - break; - - case evGPS_2S: - available_GPS_2S_signals_.remove(gs); - available_GPS_2S_signals_.push_back(gs); - break; - - case evGPS_L5: - available_GPS_L5_signals_.remove(gs); - available_GPS_L5_signals_.push_back(gs); - break; - - case evGAL_1B: - available_GAL_1B_signals_.remove(gs); - available_GAL_1B_signals_.push_back(gs); - break; - - case evGAL_5X: - available_GAL_5X_signals_.remove(gs); - available_GAL_5X_signals_.push_back(gs); - break; - - case evGLO_1G: - available_GLO_1G_signals_.remove(gs); - available_GLO_1G_signals_.push_back(gs); - break; - - case evGLO_2G: - available_GLO_2G_signals_.remove(gs); - available_GLO_2G_signals_.push_back(gs); - break; - - case evBDS_B1: - available_BDS_B1_signals_.remove(gs); - available_BDS_B1_signals_.push_back(gs); - break; - - case evBDS_B3: - available_BDS_B3_signals_.remove(gs); - available_BDS_B3_signals_.push_back(gs); - break; - - default: - LOG(ERROR) << "This should not happen :-("; - break; - } + push_back_signal(gs); } channels_state_[who] = 0; - acq_channels_count_--; + if (acq_channels_count_ > 0) acq_channels_count_--; for (unsigned int i = 0; i < channels_count_; i++) { unsigned int ch_index = (who + i + 1) % channels_count_; @@ -1179,19 +1229,27 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) { bool is_primary_freq = true; bool assistance_available = false; + bool start_acquisition = false; + Gnss_Signal gnss_signal; if (sat_ == 0) { float estimated_doppler; double RX_time; - Gnss_Signal gnss_signal; + gnss_signal = search_next_signal(channels_[ch_index]->get_signal().get_signal_str(), false, is_primary_freq, assistance_available, estimated_doppler, RX_time); channels_[ch_index]->set_signal(gnss_signal); + start_acquisition = is_primary_freq or assistance_available; + } + else + { + start_acquisition = true; } //todo: add configuration parameter to enable the mandatory acquisition assistance in secondary freq - if (is_primary_freq == true or assistance_available == true) + if (start_acquisition == true) { channels_state_[ch_index] = 1; acq_channels_count_++; + std::cout << "Channel " << ch_index << " Starting acquisition " << channels_[ch_index]->get_signal().get_satellite() << ", Signal " << channels_[ch_index]->get_signal().get_signal_str(); DLOG(INFO) << "Channel " << ch_index << " Starting acquisition " << channels_[ch_index]->get_signal().get_satellite() << ", Signal " << channels_[ch_index]->get_signal().get_signal_str(); #ifndef ENABLE_FPGA channels_[ch_index]->start_acquisition(); @@ -1203,6 +1261,10 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) } else { + push_back_signal(gnss_signal); + //todo: rewrite all + // std::unique_ptr cmf(new ControlMessageFactory()); + // queue_->handle(cmf->GetQueueMessage(i, 0)); DLOG(INFO) << "Channel " << ch_index << " secondary frequency acquisition assistance not available in " << channels_[ch_index]->get_signal().get_satellite() << ", Signal " << channels_[ch_index]->get_signal().get_signal_str(); } } @@ -1214,51 +1276,10 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) LOG(INFO) << "Channel " << who << " ACQ SUCCESS satellite " << channels_[who]->get_signal().get_satellite(); // If the satellite is in the list of available ones, remove it. - switch (mapStringValues_[channels_[who]->get_signal().get_signal_str()]) - { - case evGPS_1C: - available_GPS_1C_signals_.remove(channels_[who]->get_signal()); - break; - - case evGPS_2S: - available_GPS_2S_signals_.remove(channels_[who]->get_signal()); - break; - - case evGPS_L5: - available_GPS_L5_signals_.remove(channels_[who]->get_signal()); - break; - - case evGAL_1B: - available_GAL_1B_signals_.remove(channels_[who]->get_signal()); - break; - - case evGAL_5X: - available_GAL_5X_signals_.remove(channels_[who]->get_signal()); - break; - - case evGLO_1G: - available_GLO_1G_signals_.remove(channels_[who]->get_signal()); - break; - - case evGLO_2G: - available_GLO_2G_signals_.remove(channels_[who]->get_signal()); - break; - - case evBDS_B1: - available_BDS_B1_signals_.remove(channels_[who]->get_signal()); - break; - - case evBDS_B3: - available_BDS_B3_signals_.remove(channels_[who]->get_signal()); - break; - - default: - LOG(ERROR) << "This should not happen :-("; - break; - } + remove_signal(channels_[who]->get_signal()); channels_state_[who] = 2; - acq_channels_count_--; + if (acq_channels_count_ > 0) acq_channels_count_--; for (unsigned int i = 0; i < channels_count_; i++) { unsigned int sat_ = 0; @@ -1274,16 +1295,22 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) { bool is_primary_freq = true; bool assistance_available = false; + bool start_acquisition = false; + Gnss_Signal gnss_signal; if (sat_ == 0) { float estimated_doppler; double RX_time; - Gnss_Signal gnss_signal; gnss_signal = search_next_signal(channels_[i]->get_signal().get_signal_str(), true, is_primary_freq, assistance_available, estimated_doppler, RX_time); + channels_[i]->set_signal(gnss_signal); + } + else + { + start_acquisition = true; } //todo: add configuration parameter to enable the mandatory acquisition assistance in secondary freq - if (is_primary_freq == true or assistance_available == true) + if (start_acquisition == true) { channels_state_[i] = 1; acq_channels_count_++; @@ -1294,11 +1321,17 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) // create a task for the FPGA such that it doesn't stop the flow std::thread tmp_thread(&ChannelInterface::start_acquisition, channels_[i]); tmp_thread.detach(); + start_acquisition = is_primary_freq or assistance_available; #endif } else { + push_back_signal(gnss_signal); + //todo: rewrite all + // std::unique_ptr cmf(new ControlMessageFactory()); + // queue_->handle(cmf->GetQueueMessage(i, 0)); DLOG(INFO) << "Channel " << i << " secondary frequency acquisition assistance not available in " << channels_[i]->get_signal().get_satellite() << ", Signal " << channels_[i]->get_signal().get_signal_str(); + std::cout << "Channel " << i << " secondary frequency acquisition assistance not available in " << channels_[i]->get_signal().get_satellite() << ", Signal " << channels_[i]->get_signal().get_signal_str(); } } DLOG(INFO) << "Channel " << i << " in state " << channels_state_[i]; @@ -1328,48 +1361,7 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) LOG(INFO) << "Channel " << who << " Idle state"; if (sat == 0) { - switch (mapStringValues_[channels_[who]->get_signal().get_signal_str()]) - { - case evGPS_1C: - available_GPS_1C_signals_.push_back(channels_[who]->get_signal()); - break; - - case evGPS_2S: - available_GPS_2S_signals_.push_back(channels_[who]->get_signal()); - break; - - case evGPS_L5: - available_GPS_L5_signals_.push_back(channels_[who]->get_signal()); - break; - - case evGAL_1B: - available_GAL_1B_signals_.push_back(channels_[who]->get_signal()); - break; - - case evGAL_5X: - available_GAL_5X_signals_.push_back(channels_[who]->get_signal()); - break; - - case evGLO_1G: - available_GLO_1G_signals_.push_back(channels_[who]->get_signal()); - break; - - case evGLO_2G: - available_GLO_2G_signals_.push_back(channels_[who]->get_signal()); - break; - - case evBDS_B1: - available_BDS_B1_signals_.push_back(channels_[who]->get_signal()); - break; - - case evBDS_B3: - available_BDS_B3_signals_.push_back(channels_[who]->get_signal()); - break; - - default: - LOG(ERROR) << "This should not happen :-("; - break; - } + push_back_signal(channels_[who]->get_signal()); } } break; @@ -1381,57 +1373,8 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) { //recover the satellite assigned Gnss_Signal gs = channels_[n]->get_signal(); - switch (mapStringValues_[gs.get_signal_str()]) - { - case evGPS_1C: - available_GPS_1C_signals_.remove(gs); - available_GPS_1C_signals_.push_back(gs); - break; + push_back_signal(gs); - case evGPS_2S: - available_GPS_2S_signals_.remove(gs); - available_GPS_2S_signals_.push_back(gs); - break; - - case evGPS_L5: - available_GPS_L5_signals_.remove(gs); - available_GPS_L5_signals_.push_back(gs); - break; - - case evGAL_1B: - available_GAL_1B_signals_.remove(gs); - available_GAL_1B_signals_.push_back(gs); - break; - - case evGAL_5X: - available_GAL_5X_signals_.remove(gs); - available_GAL_5X_signals_.push_back(gs); - break; - - case evGLO_1G: - available_GLO_1G_signals_.remove(gs); - available_GLO_1G_signals_.push_back(gs); - break; - - case evGLO_2G: - available_GLO_2G_signals_.remove(gs); - available_GLO_2G_signals_.push_back(gs); - break; - - case evBDS_B1: - available_BDS_B1_signals_.remove(gs); - available_BDS_B1_signals_.push_back(gs); - break; - - case evBDS_B3: - available_BDS_B3_signals_.remove(gs); - available_BDS_B3_signals_.push_back(gs); - break; - - default: - LOG(ERROR) << "This should not happen :-("; - break; - } channels_[n]->stop_channel(); // stop the acquisition or tracking operation channels_state_[n] = 0; } @@ -2071,6 +2014,7 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal { is_primary_frequency = false; Gnss_Signal result; + bool found_signal = false; switch (mapStringValues_[searched_signal]) { case evGPS_1C: @@ -2090,6 +2034,7 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal //1. Get the current channel status map std::map> current_channels_status = channels_status_->get_current_status_map(); //2. search the currently tracked GPS L1 satellites and assist the GPS L2 acquisition if the satellite is not tracked on L2 + bool found_signal = false; for (std::map>::iterator it = current_channels_status.begin(); it != current_channels_status.end(); ++it) { if (std::string(it->second->Signal) == "1C") @@ -2107,16 +2052,21 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal { available_GPS_2S_signals_.erase(it2); } + found_signal = true; + break; } } } //fallback: pick the front satellite because there is no tracked satellites in L1 to assist L2 - result = available_GPS_2S_signals_.front(); - available_GPS_2S_signals_.pop_front(); - if (!pop) + if (found_signal == false) { - available_GPS_2S_signals_.push_back(result); + result = available_GPS_2S_signals_.front(); + available_GPS_2S_signals_.pop_front(); + if (!pop) + { + available_GPS_2S_signals_.push_back(result); + } } } else @@ -2153,19 +2103,14 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal { available_GPS_L5_signals_.erase(it2); } + found_signal = true; break; } } } - //fallback: pick the front satellite because there is no tracked satellites in L1 to assist L5 - result = available_GPS_L5_signals_.front(); - available_GPS_L5_signals_.pop_front(); - if (!pop) - { - available_GPS_L5_signals_.push_back(result); - } } - else + //fallback: pick the front satellite because there is no tracked satellites in L1 to assist L5 + if (found_signal == false) { result = available_GPS_L5_signals_.front(); available_GPS_L5_signals_.pop_front(); diff --git a/src/core/receiver/gnss_flowgraph.h b/src/core/receiver/gnss_flowgraph.h index ea2ecc2ad..cfba9914f 100644 --- a/src/core/receiver/gnss_flowgraph.h +++ b/src/core/receiver/gnss_flowgraph.h @@ -38,11 +38,11 @@ #define GNSS_SDR_GNSS_FLOWGRAPH_H_ #include "channel_status_msg_receiver.h" +#include "concurrent_queue.h" #include "gnss_sdr_sample_counter.h" #include "gnss_signal.h" #include "pvt_interface.h" #include //for null_sink -#include // for msg_queue, msg_queue::sptr #include // for basic_block_sptr, top_block_sptr #include // for pmt_t #include // for list @@ -72,7 +72,7 @@ public: /*! * \brief Constructor that initializes the receiver flow graph */ - GNSSFlowgraph(std::shared_ptr configuration, const gr::msg_queue::sptr queue); // NOLINT(performance-unnecessary-value-param) + GNSSFlowgraph(std::shared_ptr configuration, const std::shared_ptr> queue); // NOLINT(performance-unnecessary-value-param) /*! * \brief Destructor @@ -108,6 +108,10 @@ public: */ void apply_action(unsigned int who, unsigned int what); + + void push_back_signal(Gnss_Signal gs); + void remove_signal(Gnss_Signal gs); + void set_configuration(std::shared_ptr configuration); unsigned int applied_actions() const @@ -181,7 +185,7 @@ private: gnss_sdr_fpga_sample_counter_sptr ch_out_fpga_sample_counter; #endif gr::top_block_sptr top_block_; - gr::msg_queue::sptr queue_; + std::shared_ptr> queue_; std::list available_GPS_1C_signals_; std::list available_GPS_2S_signals_; diff --git a/src/core/receiver/tcp_cmd_interface.cc b/src/core/receiver/tcp_cmd_interface.cc index 5cac461ad..f274c82dc 100644 --- a/src/core/receiver/tcp_cmd_interface.cc +++ b/src/core/receiver/tcp_cmd_interface.cc @@ -30,7 +30,7 @@ */ #include "tcp_cmd_interface.h" -#include "control_message_factory.h" +#include "command_event.h" #include "pvt_interface.h" #include #include @@ -94,17 +94,16 @@ arma::vec TcpCmdInterface::get_LLH() std::string TcpCmdInterface::reset(const std::vector &commandLine __attribute__((unused))) { std::string response; - std::unique_ptr cmf(new ControlMessageFactory()); if (control_queue_ != nullptr) { - control_queue_->handle(cmf->GetQueueMessage(200, 1)); //send the restart message (who=200,what=1) + command_event_sptr new_evnt = command_event_make(200, 1); //send the restart message (who=200,what=1) + control_queue_->push(pmt::make_any(new_evnt)); response = "OK\n"; } else { response = "ERROR\n"; } - return response; } @@ -112,10 +111,10 @@ std::string TcpCmdInterface::reset(const std::vector &commandLine _ std::string TcpCmdInterface::standby(const std::vector &commandLine __attribute__((unused))) { std::string response; - std::unique_ptr cmf(new ControlMessageFactory()); if (control_queue_ != nullptr) { - control_queue_->handle(cmf->GetQueueMessage(300, 10)); //send the standby message (who=300,what=10) + command_event_sptr new_evnt = command_event_make(300, 10); //send the standby message (who=300,what=10) + control_queue_->push(pmt::make_any(new_evnt)); response = "OK\n"; } else @@ -203,10 +202,10 @@ std::string TcpCmdInterface::hotstart(const std::vector &commandLin } else { - std::unique_ptr cmf(new ControlMessageFactory()); if (control_queue_ != nullptr) { - control_queue_->handle(cmf->GetQueueMessage(300, 12)); //send the standby message (who=300,what=12) + command_event_sptr new_evnt = command_event_make(300, 12); //send the standby message (who=300,what=12) + control_queue_->push(pmt::make_any(new_evnt)); response = "OK\n"; } else @@ -250,10 +249,10 @@ std::string TcpCmdInterface::warmstart(const std::vector &commandLi } else { - std::unique_ptr cmf(new ControlMessageFactory()); if (control_queue_ != nullptr) { - control_queue_->handle(cmf->GetQueueMessage(300, 13)); // send the warmstart message (who=300,what=13) + command_event_sptr new_evnt = command_event_make(300, 13); // send the warmstart message (who=300,what=13) + control_queue_->push(pmt::make_any(new_evnt)); response = "OK\n"; } else @@ -273,16 +272,17 @@ std::string TcpCmdInterface::warmstart(const std::vector &commandLi std::string TcpCmdInterface::coldstart(const std::vector &commandLine __attribute__((unused))) { std::string response; - std::unique_ptr cmf(new ControlMessageFactory()); if (control_queue_ != nullptr) { - control_queue_->handle(cmf->GetQueueMessage(300, 11)); // send the coldstart message (who=300,what=11) + command_event_sptr new_evnt = command_event_make(300, 11); // send the coldstart message (who=300,what=11) + control_queue_->push(pmt::make_any(new_evnt)); response = "OK\n"; } else { response = "ERROR\n"; } + return response; } @@ -296,7 +296,7 @@ std::string TcpCmdInterface::set_ch_satellite(const std::vector &co } -void TcpCmdInterface::set_msg_queue(gr::msg_queue::sptr control_queue) +void TcpCmdInterface::set_msg_queue(std::shared_ptr> control_queue) { control_queue_ = std::move(control_queue); } diff --git a/src/core/receiver/tcp_cmd_interface.h b/src/core/receiver/tcp_cmd_interface.h index e5658a6d9..0b6276e92 100644 --- a/src/core/receiver/tcp_cmd_interface.h +++ b/src/core/receiver/tcp_cmd_interface.h @@ -32,8 +32,9 @@ #define GNSS_SDR_TCP_CMD_INTERFACE_H_ +#include "concurrent_queue.h" #include -#include +#include #include #include #include @@ -50,7 +51,7 @@ public: TcpCmdInterface(); virtual ~TcpCmdInterface(); void run_cmd_server(int tcp_port); - void set_msg_queue(gr::msg_queue::sptr control_queue); + void set_msg_queue(std::shared_ptr> control_queue); /*! * \brief gets the UTC time parsed from the last TC command issued @@ -77,7 +78,7 @@ private: void register_functions(); - gr::msg_queue::sptr control_queue_; + std::shared_ptr> control_queue_; bool keep_running_; time_t receiver_utc_time_; diff --git a/src/tests/data/high_dynamics_signal.bin b/src/tests/data/high_dynamics_signal.bin new file mode 100644 index 0000000000000000000000000000000000000000..ba463e31ca5cdd3c7e18347198476be170129ff2 GIT binary patch literal 168784 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ƲD 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

O#kZ0Wn)(ap$Q(78_l8CJ2H=z#964pX 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 UeW0S~nf2yLxf(ap=*N%$0$=OJ8~^|S literal 0 HcmV?d00001 diff --git a/src/tests/data/high_dynamics_signal.mat b/src/tests/data/high_dynamics_signal.mat new file mode 100644 index 0000000000000000000000000000000000000000..39c1312d595e292abe3f8ed5810e5a785fbcada9 GIT binary patch literal 79823 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 literal 0 HcmV?d00001 diff --git a/src/tests/unit-tests/control-plane/control_message_factory_test.cc b/src/tests/unit-tests/control-plane/control_message_factory_test.cc index 7440d37f4..a2b4448b8 100644 --- a/src/tests/unit-tests/control-plane/control_message_factory_test.cc +++ b/src/tests/unit-tests/control-plane/control_message_factory_test.cc @@ -31,7 +31,6 @@ */ -#include "control_message_factory.h" #include #include diff --git a/src/tests/unit-tests/control-plane/control_thread_test.cc b/src/tests/unit-tests/control-plane/control_thread_test.cc index 781a5af76..2f13cfaa2 100644 --- a/src/tests/unit-tests/control-plane/control_thread_test.cc +++ b/src/tests/unit-tests/control-plane/control_thread_test.cc @@ -32,7 +32,7 @@ #include "control_thread.h" -#include "control_message_factory.h" +#include "concurrent_queue.h" #include "in_memory_configuration.h" #include #include @@ -40,7 +40,6 @@ #include #include #include -#include #include #include #include @@ -121,7 +120,7 @@ TEST_F(ControlThreadTest /*unused*/, InstantiateRunControlMessages /*unused*/) std::shared_ptr control_thread = std::make_shared(config); - gr::msg_queue::sptr control_queue = gr::msg_queue::make(0); + std::shared_ptr> control_queue = gr::msg_queue::make(0); std::unique_ptr control_msg_factory(new ControlMessageFactory()); @@ -182,7 +181,7 @@ TEST_F(ControlThreadTest /*unused*/, InstantiateRunControlMessages2 /*unused*/) std::unique_ptr control_thread2(new ControlThread(config)); - gr::msg_queue::sptr control_queue2 = gr::msg_queue::make(0); + std::shared_ptr> control_queue2 = gr::msg_queue::make(0); std::unique_ptr control_msg_factory2(new ControlMessageFactory()); @@ -245,7 +244,7 @@ TEST_F(ControlThreadTest /*unused*/, StopReceiverProgrammatically /*unused*/) config->set_property("GNSS-SDR.internal_fs_sps", "4000000"); std::shared_ptr control_thread = std::make_shared(config); - gr::msg_queue::sptr control_queue = gr::msg_queue::make(0); + std::shared_ptr> control_queue = gr::msg_queue::make(0); control_thread->set_control_queue(control_queue); std::thread stop_receiver_thread(stop_receiver); diff --git a/src/tests/unit-tests/control-plane/gnss_block_factory_test.cc b/src/tests/unit-tests/control-plane/gnss_block_factory_test.cc index 0af18c4e1..c8a427ee6 100644 --- a/src/tests/unit-tests/control-plane/gnss_block_factory_test.cc +++ b/src/tests/unit-tests/control-plane/gnss_block_factory_test.cc @@ -42,7 +42,7 @@ #include "pvt_interface.h" #include "telemetry_decoder_interface.h" #include "tracking_interface.h" -#include +#include "concurrent_queue.h" #include #include @@ -53,7 +53,7 @@ TEST(GNSSBlockFactoryTest, InstantiateFileSignalSource) std::string path = std::string(TEST_PATH); std::string filename = path + "signal_samples/GPS_L1_CA_ID_1_Fs_4Msps_2ms.dat"; configuration->set_property("SignalSource.filename", filename); - gr::msg_queue::sptr queue = gr::msg_queue::make(0); + std::shared_ptr> queue = gr::msg_queue::make(0); // Example of a factory as a shared_ptr std::shared_ptr factory = std::make_shared(); // Example of a block as a shared_ptr @@ -67,7 +67,7 @@ TEST(GNSSBlockFactoryTest, InstantiateWrongSignalSource) { std::shared_ptr configuration = std::make_shared(); configuration->set_property("SignalSource.implementation", "Pepito"); - gr::msg_queue::sptr queue = gr::msg_queue::make(0); + std::shared_ptr> queue = gr::msg_queue::make(0); // Example of a factory as a unique_ptr std::unique_ptr factory; // Example of a block as a unique_ptr @@ -90,7 +90,7 @@ TEST(GNSSBlockFactoryTest, InstantiateSignalConditioner) TEST(GNSSBlockFactoryTest, InstantiateFIRFilter) { std::shared_ptr configuration = std::make_shared(); - gr::msg_queue::sptr queue = gr::msg_queue::make(0); + std::shared_ptr> queue = gr::msg_queue::make(0); configuration->set_property("InputFilter.implementation", "Fir_Filter"); @@ -123,7 +123,7 @@ TEST(GNSSBlockFactoryTest, InstantiateFIRFilter) TEST(GNSSBlockFactoryTest, InstantiateFreqXlatingFIRFilter) { std::shared_ptr configuration = std::make_shared(); - gr::msg_queue::sptr queue = gr::msg_queue::make(0); + std::shared_ptr> queue = gr::msg_queue::make(0); configuration->set_property("InputFilter.implementation", "Freq_Xlating_Fir_Filter"); @@ -158,7 +158,7 @@ TEST(GNSSBlockFactoryTest, InstantiateFreqXlatingFIRFilter) TEST(GNSSBlockFactoryTest, InstantiatePulseBlankingFilter) { std::shared_ptr configuration = std::make_shared(); - gr::msg_queue::sptr queue = gr::msg_queue::make(0); + std::shared_ptr> queue = gr::msg_queue::make(0); configuration->set_property("InputFilter.implementation", "Pulse_Blanking_Filter"); std::unique_ptr factory; @@ -171,7 +171,7 @@ TEST(GNSSBlockFactoryTest, InstantiatePulseBlankingFilter) TEST(GNSSBlockFactoryTest, InstantiateNotchFilter) { std::shared_ptr configuration = std::make_shared(); - gr::msg_queue::sptr queue = gr::msg_queue::make(0); + std::shared_ptr> queue = gr::msg_queue::make(0); configuration->set_property("InputFilter.implementation", "Notch_Filter"); std::unique_ptr factory; @@ -184,7 +184,7 @@ TEST(GNSSBlockFactoryTest, InstantiateNotchFilter) TEST(GNSSBlockFactoryTest, InstantiateNotchFilterLite) { std::shared_ptr configuration = std::make_shared(); - gr::msg_queue::sptr queue = gr::msg_queue::make(0); + std::shared_ptr> queue = gr::msg_queue::make(0); configuration->set_property("InputFilter.implementation", "Notch_Filter_Lite"); std::unique_ptr factory; @@ -309,7 +309,7 @@ TEST(GNSSBlockFactoryTest, InstantiateChannels) configuration->set_property("Channel0.item_type", "gr_complex"); configuration->set_property("Acquisition_1C.implementation", "GPS_L1_CA_PCPS_Acquisition"); configuration->set_property("Channel1.item_type", "gr_complex"); - gr::msg_queue::sptr queue = gr::msg_queue::make(0); + std::shared_ptr> queue = gr::msg_queue::make(0); std::unique_ptr factory; std::unique_ptr>> channels = factory->GetChannels(configuration, queue); EXPECT_EQ(static_cast(2), channels->size()); diff --git a/src/tests/unit-tests/control-plane/gnss_flowgraph_test.cc b/src/tests/unit-tests/control-plane/gnss_flowgraph_test.cc index 711b49d5f..9d26e4477 100644 --- a/src/tests/unit-tests/control-plane/gnss_flowgraph_test.cc +++ b/src/tests/unit-tests/control-plane/gnss_flowgraph_test.cc @@ -40,7 +40,7 @@ #include "in_memory_configuration.h" #include "pass_through.h" #include "tracking_interface.h" -#include +#include "concurrent_queue.h" #include 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 73e09e9ec..be5a5016a 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 @@ -342,7 +342,7 @@ protected: Concurrent_Queue channel_internal_queue; - gr::msg_queue::sptr queue; + std::shared_ptr> queue; gr::top_block_sptr top_block; std::shared_ptr acquisition; std::shared_ptr config; diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b1i_pcps_acquisition_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b1i_pcps_acquisition_test.cc index c2658889a..e220e5792 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b1i_pcps_acquisition_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b1i_pcps_acquisition_test.cc @@ -46,7 +46,7 @@ #include #include #include -#include +#include "concurrent_queue.h" #include #include #include @@ -261,7 +261,7 @@ TEST_F(BeidouB1iPcpsAcquisitionTest, ConnectAndRun) int nsamples = 25000; std::chrono::time_point start, end; std::chrono::duration elapsed_seconds(0); - gr::msg_queue::sptr queue = gr::msg_queue::make(0); + std::shared_ptr> queue = gr::msg_queue::make(0); top_block = gr::make_top_block("Acquisition test"); init(); diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b3i_pcps_acquisition_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b3i_pcps_acquisition_test.cc index 725135d5b..d01343db0 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b3i_pcps_acquisition_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b3i_pcps_acquisition_test.cc @@ -46,7 +46,7 @@ #include #include #include -#include +#include "concurrent_queue.h" #include #include #include @@ -260,7 +260,7 @@ TEST_F(BeidouB3iPcpsAcquisitionTest, ConnectAndRun) int nsamples = 50000; std::chrono::time_point start, end; std::chrono::duration elapsed_seconds(0); - gr::msg_queue::sptr queue = gr::msg_queue::make(0); + std::shared_ptr> queue = gr::msg_queue::make(0); top_block = gr::make_top_block("Acquisition test"); init(); diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_8ms_ambiguous_acquisition_gsoc2013_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_8ms_ambiguous_acquisition_gsoc2013_test.cc index a1517dd8f..b63216526 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_8ms_ambiguous_acquisition_gsoc2013_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_8ms_ambiguous_acquisition_gsoc2013_test.cc @@ -43,7 +43,7 @@ #include #include #include -#include +#include "concurrent_queue.h" #include #include #include @@ -134,7 +134,7 @@ protected: void stop_queue(); Concurrent_Queue channel_internal_queue; - gr::msg_queue::sptr queue; + std::shared_ptr> queue; gr::top_block_sptr top_block; std::shared_ptr acquisition; std::shared_ptr factory; diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_gsoc2013_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_gsoc2013_test.cc index b9c692c4b..ac9244bc2 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_gsoc2013_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_gsoc2013_test.cc @@ -43,7 +43,7 @@ #include #include #include -#include +#include "concurrent_queue.h" #include #include #include @@ -134,7 +134,7 @@ protected: void stop_queue(); Concurrent_Queue channel_internal_queue; - gr::msg_queue::sptr queue; + std::shared_ptr> queue; gr::top_block_sptr top_block; std::shared_ptr acquisition; std::shared_ptr factory; diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_gsoc_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_gsoc_test.cc index 591f7bf25..8c0ad9381 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_gsoc_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_gsoc_test.cc @@ -52,7 +52,7 @@ #include #include #include -#include +#include "concurrent_queue.h" #include #include #include @@ -140,7 +140,7 @@ protected: void stop_queue(); Concurrent_Queue channel_internal_queue; - gr::msg_queue::sptr queue; + std::shared_ptr> queue; gr::top_block_sptr top_block; std::shared_ptr factory; std::shared_ptr config; diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_test.cc index 58fa9b8e6..f105841f4 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_test.cc @@ -47,7 +47,7 @@ #include #include #include -#include +#include "concurrent_queue.h" #include #include #include @@ -265,7 +265,7 @@ TEST_F(GalileoE1PcpsAmbiguousAcquisitionTest, ConnectAndRun) std::chrono::time_point start, end; std::chrono::duration elapsed_seconds(0); top_block = gr::make_top_block("Acquisition test"); - gr::msg_queue::sptr queue = gr::msg_queue::make(0); + std::shared_ptr> queue = gr::msg_queue::make(0); init(); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition_1B", "Galileo_E1_PCPS_Ambiguous_Acquisition", 1, 0); std::shared_ptr acquisition = std::dynamic_pointer_cast(acq_); diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_cccwsr_ambiguous_acquisition_gsoc2013_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_cccwsr_ambiguous_acquisition_gsoc2013_test.cc index 60d23b6ba..f757b3edd 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_cccwsr_ambiguous_acquisition_gsoc2013_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_cccwsr_ambiguous_acquisition_gsoc2013_test.cc @@ -44,7 +44,7 @@ #include #include #include -#include +#include "concurrent_queue.h" #include #include #include @@ -135,7 +135,7 @@ protected: void stop_queue(); Concurrent_Queue channel_internal_queue; - gr::msg_queue::sptr queue; + std::shared_ptr> queue; gr::top_block_sptr top_block; std::shared_ptr acquisition; std::shared_ptr factory; diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_quicksync_ambiguous_acquisition_gsoc2014_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_quicksync_ambiguous_acquisition_gsoc2014_test.cc index 8c06a3419..dc4058ea8 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_quicksync_ambiguous_acquisition_gsoc2014_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_quicksync_ambiguous_acquisition_gsoc2014_test.cc @@ -142,7 +142,7 @@ protected: void stop_queue(); Concurrent_Queue channel_internal_queue; - gr::msg_queue::sptr queue; + std::shared_ptr> queue; gr::top_block_sptr top_block; std::shared_ptr acquisition; std::shared_ptr factory; diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_tong_ambiguous_acquisition_gsoc2013_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_tong_ambiguous_acquisition_gsoc2013_test.cc index a021e5196..a9af18c8b 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_tong_ambiguous_acquisition_gsoc2013_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_tong_ambiguous_acquisition_gsoc2013_test.cc @@ -44,7 +44,7 @@ #include #include #include -#include +#include "concurrent_queue.h" #include #include #include @@ -135,7 +135,7 @@ protected: void stop_queue(); Concurrent_Queue channel_internal_queue; - gr::msg_queue::sptr queue; + std::shared_ptr> queue; gr::top_block_sptr top_block; std::shared_ptr acquisition; std::shared_ptr factory; diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e5a_pcps_acquisition_gsoc2014_gensource_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e5a_pcps_acquisition_gsoc2014_gensource_test.cc index 652384472..671350e1b 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e5a_pcps_acquisition_gsoc2014_gensource_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e5a_pcps_acquisition_gsoc2014_gensource_test.cc @@ -42,7 +42,7 @@ #include #include #include -#include +#include "concurrent_queue.h" #include #include #include @@ -131,7 +131,7 @@ protected: void stop_queue(); Concurrent_Queue channel_internal_queue; - gr::msg_queue::sptr queue; + std::shared_ptr> queue; gr::top_block_sptr top_block; std::shared_ptr acquisition; diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l1_ca_pcps_acquisition_gsoc2017_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l1_ca_pcps_acquisition_gsoc2017_test.cc index dbee4f413..8192a3408 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l1_ca_pcps_acquisition_gsoc2017_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l1_ca_pcps_acquisition_gsoc2017_test.cc @@ -46,7 +46,7 @@ #include #include #include -#include +#include "concurrent_queue.h" #include #include #include @@ -140,7 +140,7 @@ protected: Concurrent_Queue channel_internal_queue; - gr::msg_queue::sptr queue; + std::shared_ptr> queue; gr::top_block_sptr top_block; GlonassL1CaPcpsAcquisition* acquisition; std::shared_ptr config; diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l1_ca_pcps_acquisition_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l1_ca_pcps_acquisition_test.cc index 86602ec9c..cdaa14cde 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l1_ca_pcps_acquisition_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l1_ca_pcps_acquisition_test.cc @@ -41,7 +41,7 @@ #include #include #include -#include +#include "concurrent_queue.h" #include #include #include @@ -184,7 +184,7 @@ TEST_F(GlonassL1CaPcpsAcquisitionTest, ConnectAndRun) int nsamples = 62314; std::chrono::time_point begin, end; std::chrono::duration elapsed_seconds(0); - gr::msg_queue::sptr queue = gr::msg_queue::make(0); + std::shared_ptr> queue = gr::msg_queue::make(0); top_block = gr::make_top_block("Acquisition test"); init(); diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l2_ca_pcps_acquisition_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l2_ca_pcps_acquisition_test.cc index ba0611f90..3cb98fe03 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l2_ca_pcps_acquisition_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l2_ca_pcps_acquisition_test.cc @@ -45,7 +45,7 @@ #include #include #include -#include +#include "concurrent_queue.h" #include #include #include @@ -142,7 +142,7 @@ protected: concurrent_queue channel_internal_queue; - gr::msg_queue::sptr queue; + std::shared_ptr> queue; gr::top_block_sptr top_block; GlonassL2CaPcpsAcquisition* acquisition; std::shared_ptr config; diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_gsoc2013_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_gsoc2013_test.cc index e4ef9974b..ecb757d87 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_gsoc2013_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_gsoc2013_test.cc @@ -46,7 +46,7 @@ #include #include #include -#include +#include "concurrent_queue.h" #include #include #include @@ -140,7 +140,7 @@ protected: Concurrent_Queue channel_internal_queue; - gr::msg_queue::sptr queue; + std::shared_ptr> queue; gr::top_block_sptr top_block; GpsL1CaPcpsAcquisition* acquisition; std::shared_ptr config; diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_test.cc index 0ec417ee0..3134eb558 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_test.cc @@ -46,7 +46,7 @@ #include #include #include -#include +#include "concurrent_queue.h" #include #include #include @@ -262,7 +262,7 @@ TEST_F(GpsL1CaPcpsAcquisitionTest, ConnectAndRun) int nsamples = 4000; std::chrono::time_point start, end; std::chrono::duration elapsed_seconds(0); - gr::msg_queue::sptr queue = gr::msg_queue::make(0); + std::shared_ptr> queue = gr::msg_queue::make(0); top_block = gr::make_top_block("Acquisition test"); init(); 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 58dd36719..dcc07a9e5 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 @@ -41,7 +41,7 @@ #include #include #include -#include +#include "concurrent_queue.h" #include #include #include diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_opencl_acquisition_gsoc2013_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_opencl_acquisition_gsoc2013_test.cc index 702b89f31..f20f491d9 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_opencl_acquisition_gsoc2013_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_opencl_acquisition_gsoc2013_test.cc @@ -45,7 +45,7 @@ #include #include #include -#include +#include "concurrent_queue.h" #include #include #include @@ -140,7 +140,7 @@ protected: void stop_queue(); Concurrent_Queue channel_internal_queue; - gr::msg_queue::sptr queue; + std::shared_ptr> queue; gr::top_block_sptr top_block; std::shared_ptr acquisition; std::shared_ptr config; diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_quicksync_acquisition_gsoc2014_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_quicksync_acquisition_gsoc2014_test.cc index 7dfcc5ea1..c8c1847d3 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_quicksync_acquisition_gsoc2014_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_quicksync_acquisition_gsoc2014_test.cc @@ -43,7 +43,7 @@ #include #include #include -#include +#include "concurrent_queue.h" #include #include #include @@ -141,7 +141,7 @@ protected: void stop_queue(); Concurrent_Queue channel_internal_queue; - gr::msg_queue::sptr queue; + std::shared_ptr> queue; gr::top_block_sptr top_block; std::shared_ptr factory; std::shared_ptr acquisition; diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_tong_acquisition_gsoc2013_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_tong_acquisition_gsoc2013_test.cc index b5977ff39..b65748a81 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_tong_acquisition_gsoc2013_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_tong_acquisition_gsoc2013_test.cc @@ -45,7 +45,7 @@ #include #include #include -#include +#include "concurrent_queue.h" #include #include #include @@ -135,7 +135,7 @@ protected: void stop_queue(); Concurrent_Queue channel_internal_queue; - gr::msg_queue::sptr queue; + std::shared_ptr> queue; gr::top_block_sptr top_block; std::shared_ptr acquisition; std::shared_ptr config; diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l2_m_pcps_acquisition_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l2_m_pcps_acquisition_test.cc index de7bc4e27..2541d7f75 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l2_m_pcps_acquisition_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l2_m_pcps_acquisition_test.cc @@ -47,7 +47,7 @@ #include #include #include -#include +#include "concurrent_queue.h" #include #include #include @@ -143,7 +143,7 @@ protected: void init(); void plot_grid(); - gr::msg_queue::sptr queue; + std::shared_ptr> queue; gr::top_block_sptr top_block; std::shared_ptr factory; std::shared_ptr config; diff --git a/src/tests/unit-tests/signal-processing-blocks/filter/fir_filter_test.cc b/src/tests/unit-tests/signal-processing-blocks/filter/fir_filter_test.cc index 03d055fac..a662020d5 100644 --- a/src/tests/unit-tests/signal-processing-blocks/filter/fir_filter_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/filter/fir_filter_test.cc @@ -48,7 +48,7 @@ #include "interleaved_byte_to_complex_byte.h" #include "interleaved_short_to_complex_short.h" #include -#include +#include "concurrent_queue.h" #include diff --git a/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_lite_test.cc b/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_lite_test.cc index 69c1dddf9..8743a11be 100644 --- a/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_lite_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_lite_test.cc @@ -46,7 +46,7 @@ #include "in_memory_configuration.h" #include "notch_filter_lite.h" #include -#include +#include "concurrent_queue.h" #include diff --git a/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_test.cc b/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_test.cc index 8fb783b5f..4b44af6d6 100644 --- a/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_test.cc @@ -46,7 +46,7 @@ #include "in_memory_configuration.h" #include "notch_filter.h" #include -#include +#include "concurrent_queue.h" #include diff --git a/src/tests/unit-tests/signal-processing-blocks/filter/pulse_blanking_filter_test.cc b/src/tests/unit-tests/signal-processing-blocks/filter/pulse_blanking_filter_test.cc index d31b971fb..56aa82fd5 100644 --- a/src/tests/unit-tests/signal-processing-blocks/filter/pulse_blanking_filter_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/filter/pulse_blanking_filter_test.cc @@ -46,7 +46,7 @@ #include "in_memory_configuration.h" #include "pulse_blanking_filter.h" #include -#include +#include "concurrent_queue.h" #include diff --git a/src/tests/unit-tests/signal-processing-blocks/observables/hybrid_observables_test.cc b/src/tests/unit-tests/signal-processing-blocks/observables/hybrid_observables_test.cc index 497805de7..0e7774842 100644 --- a/src/tests/unit-tests/signal-processing-blocks/observables/hybrid_observables_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/observables/hybrid_observables_test.cc @@ -30,6 +30,7 @@ * ------------------------------------------------------------------------- */ +#include "hybrid_observables.h" #include "GPS_L1_CA.h" #include "GPS_L2C.h" #include "GPS_L5.h" @@ -51,7 +52,6 @@ #include "gps_l1_ca_pcps_acquisition.h" #include "gps_l2_m_pcps_acquisition.h" #include "gps_l5i_pcps_acquisition.h" -#include "hybrid_observables.h" #include "in_memory_configuration.h" #include "observable_tests_flags.h" #include "observables_dump_reader.h" @@ -707,9 +707,9 @@ void HybridObservablesTest::configure_receiver( std::memcpy(static_cast(gnss_synchro_master.Signal), str, 3); // copy string into synchro char array: 2 char + null config->set_property("Tracking.early_late_space_chips", "0.15"); - config->set_property("Tracking.very_early_late_space_chips", "0.6"); + config->set_property("Tracking.very_early_late_space_chips", "0.5"); config->set_property("Tracking.early_late_space_narrow_chips", "0.15"); - config->set_property("Tracking.very_early_late_space_narrow_chips", "0.6"); + config->set_property("Tracking.very_early_late_space_narrow_chips", "0.5"); config->set_property("Tracking.track_pilot", "true"); config->set_property("TelemetryDecoder.implementation", "Galileo_E1B_Telemetry_Decoder"); @@ -741,7 +741,8 @@ void HybridObservablesTest::configure_receiver( } config->set_property("Tracking.early_late_space_chips", "0.5"); config->set_property("Tracking.track_pilot", "true"); - config->set_property("Tracking.order", "2"); + config->set_property("Tracking.pll_filter_order", "2"); + config->set_property("Tracking.dll_filter_order", "2"); config->set_property("TelemetryDecoder.implementation", "Galileo_E5a_Telemetry_Decoder"); } @@ -755,7 +756,8 @@ void HybridObservablesTest::configure_receiver( config->set_property("Tracking.early_late_space_chips", "0.5"); config->set_property("Tracking.track_pilot", "true"); - config->set_property("Tracking.order", "2"); + config->set_property("Tracking.pll_filter_order", "2"); + config->set_property("Tracking.dll_filter_order", "2"); config->set_property("TelemetryDecoder.implementation", "GPS_L5_Telemetry_Decoder"); } @@ -875,78 +877,81 @@ void HybridObservablesTest::check_results_carrier_phase_double_diff( int size2 = measured_ch1.col(0).n_rows; double t1 = std::min(measured_ch0(size1 - 1, 0), measured_ch1(size2 - 1, 0)); - arma::vec t = arma::linspace(t0, t1, floor((t1 - t0) * 1e3)); - //conversion between arma::vec and std:vector - arma::vec t_from_start = arma::linspace(0, t1 - t0, floor((t1 - t0) * 1e3)); - std::vector time_vector(t_from_start.colptr(0), t_from_start.colptr(0) + t_from_start.n_rows); - - - arma::vec true_ch0_carrier_phase_interp; - arma::vec true_ch1_carrier_phase_interp; - arma::interp1(true_tow_ch0_s, true_ch0.col(3), t, true_ch0_carrier_phase_interp); - arma::interp1(true_tow_ch1_s, true_ch1.col(3), t, true_ch1_carrier_phase_interp); - - arma::vec meas_ch0_carrier_phase_interp; - arma::vec meas_ch1_carrier_phase_interp; - arma::interp1(measured_ch0.col(0), measured_ch0.col(3), t, meas_ch0_carrier_phase_interp); - arma::interp1(measured_ch1.col(0), measured_ch1.col(3), t, meas_ch1_carrier_phase_interp); - - // generate double difference accumulated carrier phases - //compute error without the accumulated carrier phase offsets (which depends on the receiver starting time) - arma::vec delta_true_carrier_phase_cycles = (true_ch0_carrier_phase_interp - true_ch0_carrier_phase_interp(0)) - (true_ch1_carrier_phase_interp - true_ch1_carrier_phase_interp(0)); - arma::vec delta_measured_carrier_phase_cycles = (meas_ch0_carrier_phase_interp - meas_ch0_carrier_phase_interp(0)) - (meas_ch1_carrier_phase_interp - meas_ch1_carrier_phase_interp(0)); - - //2. RMSE - arma::vec err; - - err = delta_measured_carrier_phase_cycles - delta_true_carrier_phase_cycles; - arma::vec err2 = arma::square(err); - double rmse = sqrt(arma::mean(err2)); - - //3. Mean err and variance - double error_mean = arma::mean(err); - double error_var = arma::var(err); - - // 4. Peaks - double max_error = arma::max(err); - double min_error = arma::min(err); - - //5. report - std::streamsize ss = std::cout.precision(); - std::cout << std::setprecision(10) << data_title << "Double diff Carrier Phase RMSE = " - << rmse << ", mean = " << error_mean - << ", stdev = " << sqrt(error_var) - << " (max,min) = " << max_error - << "," << min_error - << " [Cycles]" << std::endl; - std::cout.precision(ss); - - //plots - if (FLAGS_show_plots) + if ((t1 - t0) > 0) { - Gnuplot g3("linespoints"); - g3.set_title(data_title + "Double diff Carrier Phase error [Cycles]"); - g3.set_grid(); - g3.set_xlabel("Time [s]"); - g3.set_ylabel("Double diff Carrier Phase error [Cycles]"); + arma::vec t = arma::linspace(t0, t1, floor((t1 - t0) * 1e3)); //conversion between arma::vec and std:vector - std::vector range_error_m(err.colptr(0), err.colptr(0) + err.n_rows); - g3.cmd("set key box opaque"); - g3.plot_xy(time_vector, range_error_m, - "Double diff Carrier Phase error"); - g3.set_legend(); - g3.savetops(data_title + "double_diff_carrier_phase_error"); + arma::vec t_from_start = arma::linspace(0, t1 - t0, floor((t1 - t0) * 1e3)); + std::vector time_vector(t_from_start.colptr(0), t_from_start.colptr(0) + t_from_start.n_rows); - g3.showonscreen(); // window output + + arma::vec true_ch0_carrier_phase_interp; + arma::vec true_ch1_carrier_phase_interp; + arma::interp1(true_tow_ch0_s, true_ch0.col(3), t, true_ch0_carrier_phase_interp); + arma::interp1(true_tow_ch1_s, true_ch1.col(3), t, true_ch1_carrier_phase_interp); + + arma::vec meas_ch0_carrier_phase_interp; + arma::vec meas_ch1_carrier_phase_interp; + arma::interp1(measured_ch0.col(0), measured_ch0.col(3), t, meas_ch0_carrier_phase_interp); + arma::interp1(measured_ch1.col(0), measured_ch1.col(3), t, meas_ch1_carrier_phase_interp); + + // generate double difference accumulated carrier phases + //compute error without the accumulated carrier phase offsets (which depends on the receiver starting time) + arma::vec delta_true_carrier_phase_cycles = (true_ch0_carrier_phase_interp - true_ch0_carrier_phase_interp(0)) - (true_ch1_carrier_phase_interp - true_ch1_carrier_phase_interp(0)); + arma::vec delta_measured_carrier_phase_cycles = (meas_ch0_carrier_phase_interp - meas_ch0_carrier_phase_interp(0)) - (meas_ch1_carrier_phase_interp - meas_ch1_carrier_phase_interp(0)); + + //2. RMSE + arma::vec err; + + err = delta_measured_carrier_phase_cycles - delta_true_carrier_phase_cycles; + arma::vec err2 = arma::square(err); + double rmse = sqrt(arma::mean(err2)); + + //3. Mean err and variance + double error_mean = arma::mean(err); + double error_var = arma::var(err); + + // 4. Peaks + double max_error = arma::max(err); + double min_error = arma::min(err); + + //5. report + std::streamsize ss = std::cout.precision(); + std::cout << std::setprecision(10) << data_title << "Double diff Carrier Phase RMSE = " + << rmse << ", mean = " << error_mean + << ", stdev = " << sqrt(error_var) + << " (max,min) = " << max_error + << "," << min_error + << " [Cycles]" << std::endl; + std::cout.precision(ss); + + //plots + if (FLAGS_show_plots) + { + Gnuplot g3("linespoints"); + g3.set_title(data_title + "Double diff Carrier Phase error [Cycles]"); + g3.set_grid(); + g3.set_xlabel("Time [s]"); + g3.set_ylabel("Double diff Carrier Phase error [Cycles]"); + //conversion between arma::vec and std:vector + std::vector range_error_m(err.colptr(0), err.colptr(0) + err.n_rows); + g3.cmd("set key box opaque"); + g3.plot_xy(time_vector, range_error_m, + "Double diff Carrier Phase error"); + g3.set_legend(); + g3.savetops(data_title + "double_diff_carrier_phase_error"); + + g3.showonscreen(); // window output + } + + //check results against the test tolerance + ASSERT_LT(rmse, 0.25); + ASSERT_LT(error_mean, 0.2); + ASSERT_GT(error_mean, -0.2); + ASSERT_LT(error_var, 0.5); + ASSERT_LT(max_error, 0.5); + ASSERT_GT(min_error, -0.5); } - - //check results against the test tolerance - ASSERT_LT(rmse, 0.25); - ASSERT_LT(error_mean, 0.2); - ASSERT_GT(error_mean, -0.2); - ASSERT_LT(error_var, 0.5); - ASSERT_LT(max_error, 0.5); - ASSERT_GT(min_error, -0.5); } @@ -966,78 +971,81 @@ void HybridObservablesTest::check_results_carrier_doppler_double_diff( int size2 = measured_ch1.col(0).n_rows; double t1 = std::min(measured_ch0(size1 - 1, 0), measured_ch1(size2 - 1, 0)); - arma::vec t = arma::linspace(t0, t1, floor((t1 - t0) * 1e3)); - //conversion between arma::vec and std:vector - arma::vec t_from_start = arma::linspace(0, t1 - t0, floor((t1 - t0) * 1e3)); - std::vector time_vector(t_from_start.colptr(0), t_from_start.colptr(0) + t_from_start.n_rows); - - - arma::vec true_ch0_carrier_doppler_interp; - arma::vec true_ch1_carrier_doppler_interp; - arma::interp1(true_tow_ch0_s, true_ch0.col(2), t, true_ch0_carrier_doppler_interp); - arma::interp1(true_tow_ch1_s, true_ch1.col(2), t, true_ch1_carrier_doppler_interp); - - arma::vec meas_ch0_carrier_doppler_interp; - arma::vec meas_ch1_carrier_doppler_interp; - arma::interp1(measured_ch0.col(0), measured_ch0.col(2), t, meas_ch0_carrier_doppler_interp); - arma::interp1(measured_ch1.col(0), measured_ch1.col(2), t, meas_ch1_carrier_doppler_interp); - - // generate double difference carrier Doppler - arma::vec delta_true_carrier_doppler_cycles = true_ch0_carrier_doppler_interp - true_ch1_carrier_doppler_interp; - arma::vec delta_measured_carrier_doppler_cycles = meas_ch0_carrier_doppler_interp - meas_ch1_carrier_doppler_interp; - - //2. RMSE - arma::vec err; - - err = delta_measured_carrier_doppler_cycles - delta_true_carrier_doppler_cycles; - arma::vec err2 = arma::square(err); - double rmse = sqrt(arma::mean(err2)); - - //3. Mean err and variance - double error_mean = arma::mean(err); - double error_var = arma::var(err); - - // 4. Peaks - double max_error = arma::max(err); - double min_error = arma::min(err); - - //5. report - std::streamsize ss = std::cout.precision(); - std::cout << std::setprecision(10) << data_title << "Double diff Carrier Doppler RMSE = " - << rmse << ", mean = " << error_mean - << ", stdev = " << sqrt(error_var) - << " (max,min) = " << max_error - << "," << min_error - << " [Hz]" << std::endl; - std::cout.precision(ss); - - //plots - if (FLAGS_show_plots) + if ((t1 - t0) > 0) { - Gnuplot g3("linespoints"); - g3.set_title(data_title + "Double diff Carrier Doppler error [Hz]"); - g3.set_grid(); - g3.set_xlabel("Time [s]"); - g3.set_ylabel("Double diff Carrier Doppler error [Hz]"); + arma::vec t = arma::linspace(t0, t1, floor((t1 - t0) * 1e3)); //conversion between arma::vec and std:vector - std::vector range_error_m(err.colptr(0), err.colptr(0) + err.n_rows); - g3.cmd("set key box opaque"); - g3.plot_xy(time_vector, range_error_m, - "Double diff Carrier Doppler error"); - g3.set_legend(); - g3.savetops(data_title + "double_diff_carrier_doppler_error"); + arma::vec t_from_start = arma::linspace(0, t1 - t0, floor((t1 - t0) * 1e3)); + std::vector time_vector(t_from_start.colptr(0), t_from_start.colptr(0) + t_from_start.n_rows); - g3.showonscreen(); // window output + + arma::vec true_ch0_carrier_doppler_interp; + arma::vec true_ch1_carrier_doppler_interp; + arma::interp1(true_tow_ch0_s, true_ch0.col(2), t, true_ch0_carrier_doppler_interp); + arma::interp1(true_tow_ch1_s, true_ch1.col(2), t, true_ch1_carrier_doppler_interp); + + arma::vec meas_ch0_carrier_doppler_interp; + arma::vec meas_ch1_carrier_doppler_interp; + arma::interp1(measured_ch0.col(0), measured_ch0.col(2), t, meas_ch0_carrier_doppler_interp); + arma::interp1(measured_ch1.col(0), measured_ch1.col(2), t, meas_ch1_carrier_doppler_interp); + + // generate double difference carrier Doppler + arma::vec delta_true_carrier_doppler_cycles = true_ch0_carrier_doppler_interp - true_ch1_carrier_doppler_interp; + arma::vec delta_measured_carrier_doppler_cycles = meas_ch0_carrier_doppler_interp - meas_ch1_carrier_doppler_interp; + + //2. RMSE + arma::vec err; + + err = delta_measured_carrier_doppler_cycles - delta_true_carrier_doppler_cycles; + arma::vec err2 = arma::square(err); + double rmse = sqrt(arma::mean(err2)); + + //3. Mean err and variance + double error_mean = arma::mean(err); + double error_var = arma::var(err); + + // 4. Peaks + double max_error = arma::max(err); + double min_error = arma::min(err); + + //5. report + std::streamsize ss = std::cout.precision(); + std::cout << std::setprecision(10) << data_title << "Double diff Carrier Doppler RMSE = " + << rmse << ", mean = " << error_mean + << ", stdev = " << sqrt(error_var) + << " (max,min) = " << max_error + << "," << min_error + << " [Hz]" << std::endl; + std::cout.precision(ss); + + //plots + if (FLAGS_show_plots) + { + Gnuplot g3("linespoints"); + g3.set_title(data_title + "Double diff Carrier Doppler error [Hz]"); + g3.set_grid(); + g3.set_xlabel("Time [s]"); + g3.set_ylabel("Double diff Carrier Doppler error [Hz]"); + //conversion between arma::vec and std:vector + std::vector range_error_m(err.colptr(0), err.colptr(0) + err.n_rows); + g3.cmd("set key box opaque"); + g3.plot_xy(time_vector, range_error_m, + "Double diff Carrier Doppler error"); + g3.set_legend(); + g3.savetops(data_title + "double_diff_carrier_doppler_error"); + + g3.showonscreen(); // window output + } + + //check results against the test tolerance + ASSERT_LT(error_mean, 5); + ASSERT_GT(error_mean, -5); + //assuming PLL BW=35 + ASSERT_LT(error_var, 250); + ASSERT_LT(max_error, 100); + ASSERT_GT(min_error, -100); + ASSERT_LT(rmse, 30); } - - //check results against the test tolerance - ASSERT_LT(error_mean, 5); - ASSERT_GT(error_mean, -5); - //assuming PLL BW=35 - ASSERT_LT(error_var, 250); - ASSERT_LT(max_error, 100); - ASSERT_GT(min_error, -100); - ASSERT_LT(rmse, 30); } @@ -1052,71 +1060,75 @@ void HybridObservablesTest::check_results_carrier_doppler( double t0 = measured_ch0(0, 0); int size1 = measured_ch0.col(0).n_rows; double t1 = measured_ch0(size1 - 1, 0); - arma::vec t = arma::linspace(t0, t1, floor((t1 - t0) * 1e3)); - //conversion between arma::vec and std:vector - arma::vec t_from_start = arma::linspace(0, t1 - t0, floor((t1 - t0) * 1e3)); - std::vector time_vector(t_from_start.colptr(0), t_from_start.colptr(0) + t_from_start.n_rows); - arma::vec true_ch0_doppler_interp; - arma::interp1(true_tow_s, true_ch0.col(2), t, true_ch0_doppler_interp); - - arma::vec meas_ch0_doppler_interp; - arma::interp1(measured_ch0.col(0), measured_ch0.col(2), t, meas_ch0_doppler_interp); - - //2. RMSE - arma::vec err_ch0_hz; - - //compute error - err_ch0_hz = meas_ch0_doppler_interp - true_ch0_doppler_interp; - - arma::vec err2_ch0 = arma::square(err_ch0_hz); - double rmse_ch0 = sqrt(arma::mean(err2_ch0)); - - //3. Mean err and variance - double error_mean_ch0 = arma::mean(err_ch0_hz); - double error_var_ch0 = arma::var(err_ch0_hz); - - // 4. Peaks - double max_error_ch0 = arma::max(err_ch0_hz); - double min_error_ch0 = arma::min(err_ch0_hz); - - //5. report - std::streamsize ss = std::cout.precision(); - std::cout << std::setprecision(10) << data_title << "Carrier Doppler RMSE = " - << rmse_ch0 << ", mean = " << error_mean_ch0 - << ", stdev = " << sqrt(error_var_ch0) - << " (max,min) = " << max_error_ch0 - << "," << min_error_ch0 - << " [Hz]" << std::endl; - std::cout.precision(ss); - - //plots - if (FLAGS_show_plots) + if ((t1 - t0) > 0) { - Gnuplot g3("linespoints"); - g3.set_title(data_title + "Carrier Doppler error [Hz]"); - g3.set_grid(); - g3.set_xlabel("Time [s]"); - g3.set_ylabel("Carrier Doppler error [Hz]"); + arma::vec t = arma::linspace(t0, t1, floor((t1 - t0) * 1e3)); //conversion between arma::vec and std:vector - std::vector error_vec(err_ch0_hz.colptr(0), err_ch0_hz.colptr(0) + err_ch0_hz.n_rows); - g3.cmd("set key box opaque"); - g3.plot_xy(time_vector, error_vec, - "Carrier Doppler error"); - g3.set_legend(); - g3.savetops(data_title + "Carrier_doppler_error"); + arma::vec t_from_start = arma::linspace(0, t1 - t0, floor((t1 - t0) * 1e3)); + std::vector time_vector(t_from_start.colptr(0), t_from_start.colptr(0) + t_from_start.n_rows); - g3.showonscreen(); // window output + arma::vec true_ch0_doppler_interp; + arma::interp1(true_tow_s, true_ch0.col(2), t, true_ch0_doppler_interp); + + arma::vec meas_ch0_doppler_interp; + arma::interp1(measured_ch0.col(0), measured_ch0.col(2), t, meas_ch0_doppler_interp); + + //2. RMSE + arma::vec err_ch0_hz; + + //compute error + err_ch0_hz = meas_ch0_doppler_interp - true_ch0_doppler_interp; + + arma::vec err2_ch0 = arma::square(err_ch0_hz); + double rmse_ch0 = sqrt(arma::mean(err2_ch0)); + + //3. Mean err and variance + double error_mean_ch0 = arma::mean(err_ch0_hz); + double error_var_ch0 = arma::var(err_ch0_hz); + + // 4. Peaks + double max_error_ch0 = arma::max(err_ch0_hz); + double min_error_ch0 = arma::min(err_ch0_hz); + + //5. report + std::streamsize ss = std::cout.precision(); + std::cout << std::setprecision(10) << data_title << "Carrier Doppler RMSE = " + << rmse_ch0 << ", mean = " << error_mean_ch0 + << ", stdev = " << sqrt(error_var_ch0) + << " (max,min) = " << max_error_ch0 + << "," << min_error_ch0 + << " [Hz]" << std::endl; + std::cout.precision(ss); + + //plots + if (FLAGS_show_plots) + { + Gnuplot g3("linespoints"); + g3.set_title(data_title + "Carrier Doppler error [Hz]"); + g3.set_grid(); + g3.set_xlabel("Time [s]"); + g3.set_ylabel("Carrier Doppler error [Hz]"); + //conversion between arma::vec and std:vector + std::vector error_vec(err_ch0_hz.colptr(0), err_ch0_hz.colptr(0) + err_ch0_hz.n_rows); + g3.cmd("set key box opaque"); + g3.plot_xy(time_vector, error_vec, + "Carrier Doppler error"); + g3.set_legend(); + g3.savetops(data_title + "Carrier_doppler_error"); + + g3.showonscreen(); // window output + } + + //check results against the test tolerance + ASSERT_LT(error_mean_ch0, 5); + ASSERT_GT(error_mean_ch0, -5); + //assuming PLL BW=35 + ASSERT_LT(error_var_ch0, 250); + ASSERT_LT(max_error_ch0, 100); + ASSERT_GT(min_error_ch0, -100); + ASSERT_LT(rmse_ch0, 30); } - - //check results against the test tolerance - ASSERT_LT(error_mean_ch0, 5); - ASSERT_GT(error_mean_ch0, -5); - //assuming PLL BW=35 - ASSERT_LT(error_var_ch0, 250); - ASSERT_LT(max_error_ch0, 100); - ASSERT_GT(min_error_ch0, -100); - ASSERT_LT(rmse_ch0, 30); } void HybridObservablesTest::check_results_duplicated_satellite( @@ -1156,217 +1168,220 @@ void HybridObservablesTest::check_results_duplicated_satellite( t1 = t1_sat1; } - arma::vec t = arma::linspace(t0, t1, floor((t1 - t0) * 1e3)); - //conversion between arma::vec and std:vector - arma::vec t_from_start = arma::linspace(0, t1 - t0, floor((t1 - t0) * 1e3)); - std::vector time_vector(t_from_start.colptr(0), t_from_start.colptr(0) + t_from_start.n_rows); - //Doppler - arma::vec meas_sat1_doppler_interp; - arma::interp1(measured_sat1.col(0), measured_sat1.col(2), t, meas_sat1_doppler_interp); - arma::vec meas_sat2_doppler_interp; - arma::interp1(measured_sat2.col(0), measured_sat2.col(2), t, meas_sat2_doppler_interp); - - //Carrier Phase - arma::vec meas_sat1_carrier_phase_interp; - arma::vec meas_sat2_carrier_phase_interp; - arma::interp1(measured_sat1.col(0), measured_sat1.col(3), t, meas_sat1_carrier_phase_interp); - arma::interp1(measured_sat2.col(0), measured_sat2.col(3), t, meas_sat2_carrier_phase_interp); - - // generate double difference accumulated carrier phases - //compute error without the accumulated carrier phase offsets (which depends on the receiver starting time) - arma::vec delta_measured_carrier_phase_cycles = (meas_sat1_carrier_phase_interp - meas_sat1_carrier_phase_interp(0)) - (meas_sat2_carrier_phase_interp - meas_sat2_carrier_phase_interp(0)); - - //Pseudoranges - arma::vec meas_sat1_dist_interp; - arma::vec meas_sat2_dist_interp; - arma::interp1(measured_sat1.col(0), measured_sat1.col(4), t, meas_sat1_dist_interp); - arma::interp1(measured_sat2.col(0), measured_sat2.col(4), t, meas_sat2_dist_interp); - // generate delta pseudoranges - arma::vec delta_measured_dist_m = meas_sat1_dist_interp - meas_sat2_dist_interp; - - //Carrier Doppler error - //2. RMSE - arma::vec err_ch0_hz; - - //compute error - err_ch0_hz = meas_sat1_doppler_interp - meas_sat2_doppler_interp; - - //save matlab file for further analysis - std::vector tmp_vector_common_time_s(t.colptr(0), - t.colptr(0) + t.n_rows); - - std::vector tmp_vector_err_ch0_hz(err_ch0_hz.colptr(0), - err_ch0_hz.colptr(0) + err_ch0_hz.n_rows); - save_mat_xy(tmp_vector_common_time_s, tmp_vector_err_ch0_hz, std::string("measured_doppler_error_ch_" + std::to_string(ch_id))); - - //compute statistics - arma::vec err2_ch0 = arma::square(err_ch0_hz); - double rmse_ch0 = sqrt(arma::mean(err2_ch0)); - - //3. Mean err and variance - double error_mean_ch0 = arma::mean(err_ch0_hz); - double error_var_ch0 = arma::var(err_ch0_hz); - - // 4. Peaks - double max_error_ch0 = arma::max(err_ch0_hz); - double min_error_ch0 = arma::min(err_ch0_hz); - - //5. report - std::streamsize ss = std::cout.precision(); - std::cout << std::setprecision(10) << data_title << "Carrier Doppler RMSE = " - << rmse_ch0 << ", mean = " << error_mean_ch0 - << ", stdev = " << sqrt(error_var_ch0) - << " (max,min) = " << max_error_ch0 - << "," << min_error_ch0 - << " [Hz]" << std::endl; - std::cout.precision(ss); - - //plots - if (FLAGS_show_plots) + if ((t1 - t0) > 0) { - Gnuplot g3("linespoints"); - g3.set_title(data_title + "Carrier Doppler error [Hz]"); - g3.set_grid(); - g3.set_xlabel("Time [s]"); - g3.set_ylabel("Carrier Doppler error [Hz]"); + arma::vec t = arma::linspace(t0, t1, floor((t1 - t0) * 1e3)); //conversion between arma::vec and std:vector - std::vector error_vec(err_ch0_hz.colptr(0), err_ch0_hz.colptr(0) + err_ch0_hz.n_rows); - g3.cmd("set key box opaque"); - g3.plot_xy(time_vector, error_vec, - "Carrier Doppler error"); - g3.set_legend(); - g3.savetops(data_title + "Carrier_doppler_error"); + arma::vec t_from_start = arma::linspace(0, t1 - t0, floor((t1 - t0) * 1e3)); + std::vector time_vector(t_from_start.colptr(0), t_from_start.colptr(0) + t_from_start.n_rows); + //Doppler + arma::vec meas_sat1_doppler_interp; + arma::interp1(measured_sat1.col(0), measured_sat1.col(2), t, meas_sat1_doppler_interp); + arma::vec meas_sat2_doppler_interp; + arma::interp1(measured_sat2.col(0), measured_sat2.col(2), t, meas_sat2_doppler_interp); - g3.showonscreen(); // window output + //Carrier Phase + arma::vec meas_sat1_carrier_phase_interp; + arma::vec meas_sat2_carrier_phase_interp; + arma::interp1(measured_sat1.col(0), measured_sat1.col(3), t, meas_sat1_carrier_phase_interp); + arma::interp1(measured_sat2.col(0), measured_sat2.col(3), t, meas_sat2_carrier_phase_interp); + + // generate double difference accumulated carrier phases + //compute error without the accumulated carrier phase offsets (which depends on the receiver starting time) + arma::vec delta_measured_carrier_phase_cycles = (meas_sat1_carrier_phase_interp - meas_sat1_carrier_phase_interp(0)) - (meas_sat2_carrier_phase_interp - meas_sat2_carrier_phase_interp(0)); + + //Pseudoranges + arma::vec meas_sat1_dist_interp; + arma::vec meas_sat2_dist_interp; + arma::interp1(measured_sat1.col(0), measured_sat1.col(4), t, meas_sat1_dist_interp); + arma::interp1(measured_sat2.col(0), measured_sat2.col(4), t, meas_sat2_dist_interp); + // generate delta pseudoranges + arma::vec delta_measured_dist_m = meas_sat1_dist_interp - meas_sat2_dist_interp; + + //Carrier Doppler error + //2. RMSE + arma::vec err_ch0_hz; + + //compute error + err_ch0_hz = meas_sat1_doppler_interp - meas_sat2_doppler_interp; + + //save matlab file for further analysis + std::vector tmp_vector_common_time_s(t.colptr(0), + t.colptr(0) + t.n_rows); + + std::vector tmp_vector_err_ch0_hz(err_ch0_hz.colptr(0), + err_ch0_hz.colptr(0) + err_ch0_hz.n_rows); + save_mat_xy(tmp_vector_common_time_s, tmp_vector_err_ch0_hz, std::string("measured_doppler_error_ch_" + std::to_string(ch_id))); + + //compute statistics + arma::vec err2_ch0 = arma::square(err_ch0_hz); + double rmse_ch0 = sqrt(arma::mean(err2_ch0)); + + //3. Mean err and variance + double error_mean_ch0 = arma::mean(err_ch0_hz); + double error_var_ch0 = arma::var(err_ch0_hz); + + // 4. Peaks + double max_error_ch0 = arma::max(err_ch0_hz); + double min_error_ch0 = arma::min(err_ch0_hz); + + //5. report + std::streamsize ss = std::cout.precision(); + std::cout << std::setprecision(10) << data_title << "Carrier Doppler RMSE = " + << rmse_ch0 << ", mean = " << error_mean_ch0 + << ", stdev = " << sqrt(error_var_ch0) + << " (max,min) = " << max_error_ch0 + << "," << min_error_ch0 + << " [Hz]" << std::endl; + std::cout.precision(ss); + + //plots + if (FLAGS_show_plots) + { + Gnuplot g3("linespoints"); + g3.set_title(data_title + "Carrier Doppler error [Hz]"); + g3.set_grid(); + g3.set_xlabel("Time [s]"); + g3.set_ylabel("Carrier Doppler error [Hz]"); + //conversion between arma::vec and std:vector + std::vector error_vec(err_ch0_hz.colptr(0), err_ch0_hz.colptr(0) + err_ch0_hz.n_rows); + g3.cmd("set key box opaque"); + g3.plot_xy(time_vector, error_vec, + "Carrier Doppler error"); + g3.set_legend(); + g3.savetops(data_title + "Carrier_doppler_error"); + + g3.showonscreen(); // window output + } + + //check results against the test tolerance + EXPECT_LT(error_mean_ch0, 5); + EXPECT_GT(error_mean_ch0, -5); + //assuming PLL BW=35 + EXPECT_LT(error_var_ch0, 250); + EXPECT_LT(max_error_ch0, 100); + EXPECT_GT(min_error_ch0, -100); + EXPECT_LT(rmse_ch0, 30); + + //Carrier Phase error + //2. RMSE + arma::vec err_carrier_phase; + + err_carrier_phase = delta_measured_carrier_phase_cycles; + + //save matlab file for further analysis + std::vector tmp_vector_err_carrier_phase(err_carrier_phase.colptr(0), + err_carrier_phase.colptr(0) + err_carrier_phase.n_rows); + save_mat_xy(tmp_vector_common_time_s, tmp_vector_err_carrier_phase, std::string("measured_carrier_phase_error_ch_" + std::to_string(ch_id))); + + + arma::vec err2_carrier_phase = arma::square(err_carrier_phase); + double rmse_carrier_phase = sqrt(arma::mean(err2_carrier_phase)); + + //3. Mean err and variance + double error_mean_carrier_phase = arma::mean(err_carrier_phase); + double error_var_carrier_phase = arma::var(err_carrier_phase); + + // 4. Peaks + double max_error_carrier_phase = arma::max(err_carrier_phase); + double min_error_carrier_phase = arma::min(err_carrier_phase); + + //5. report + ss = std::cout.precision(); + std::cout << std::setprecision(10) << data_title << "Carrier Phase RMSE = " + << rmse_carrier_phase << ", mean = " << error_mean_carrier_phase + << ", stdev = " << sqrt(error_var_carrier_phase) + << " (max,min) = " << max_error_carrier_phase + << "," << min_error_carrier_phase + << " [Cycles]" << std::endl; + std::cout.precision(ss); + + //plots + if (FLAGS_show_plots) + { + Gnuplot g3("linespoints"); + g3.set_title(data_title + "Carrier Phase error [Cycles]"); + g3.set_grid(); + g3.set_xlabel("Time [s]"); + g3.set_ylabel("Carrier Phase error [Cycles]"); + //conversion between arma::vec and std:vector + std::vector range_error_m(err_carrier_phase.colptr(0), err_carrier_phase.colptr(0) + err_carrier_phase.n_rows); + g3.cmd("set key box opaque"); + g3.plot_xy(time_vector, range_error_m, + "Carrier Phase error"); + g3.set_legend(); + g3.savetops(data_title + "duplicated_satellite_carrier_phase_error"); + + g3.showonscreen(); // window output + } + + //check results against the test tolerance + EXPECT_LT(rmse_carrier_phase, 0.25); + EXPECT_LT(error_mean_carrier_phase, 0.2); + EXPECT_GT(error_mean_carrier_phase, -0.2); + EXPECT_LT(error_var_carrier_phase, 0.5); + EXPECT_LT(max_error_carrier_phase, 0.5); + EXPECT_GT(min_error_carrier_phase, -0.5); + + //Pseudorange error + //2. RMSE + arma::vec err_pseudorange; + + err_pseudorange = delta_measured_dist_m; + + //save matlab file for further analysis + std::vector tmp_vector_err_pseudorange(err_pseudorange.colptr(0), + err_pseudorange.colptr(0) + err_pseudorange.n_rows); + save_mat_xy(tmp_vector_common_time_s, tmp_vector_err_pseudorange, std::string("measured_pr_error_ch_" + std::to_string(ch_id))); + + arma::vec err2_pseudorange = arma::square(err_pseudorange); + double rmse_pseudorange = sqrt(arma::mean(err2_pseudorange)); + + //3. Mean err and variance + double error_mean_pseudorange = arma::mean(err_pseudorange); + double error_var_pseudorange = arma::var(err_pseudorange); + + // 4. Peaks + double max_error_pseudorange = arma::max(err_pseudorange); + double min_error_pseudorange = arma::min(err_pseudorange); + + //5. report + ss = std::cout.precision(); + std::cout << std::setprecision(10) << data_title << "Pseudorange RMSE = " + << rmse_pseudorange << ", mean = " << error_mean_pseudorange + << ", stdev = " << sqrt(error_var_pseudorange) + << " (max,min) = " << max_error_pseudorange + << "," << min_error_pseudorange + << " [meters]" << std::endl; + std::cout.precision(ss); + + //plots + if (FLAGS_show_plots) + { + Gnuplot g3("linespoints"); + g3.set_title(data_title + "Pseudorange error [m]"); + g3.set_grid(); + g3.set_xlabel("Time [s]"); + g3.set_ylabel("Pseudorange error [m]"); + //conversion between arma::vec and std:vector + std::vector range_error_m(err_pseudorange.colptr(0), err_pseudorange.colptr(0) + err_pseudorange.n_rows); + g3.cmd("set key box opaque"); + g3.plot_xy(time_vector, range_error_m, + "Pseudorrange error"); + g3.set_legend(); + g3.savetops(data_title + "duplicated_satellite_pseudorrange_error"); + + g3.showonscreen(); // window output + } + + //check results against the test tolerance + EXPECT_LT(rmse_pseudorange, 3.0); + EXPECT_LT(error_mean_pseudorange, 1.0); + EXPECT_GT(error_mean_pseudorange, -1.0); + EXPECT_LT(error_var_pseudorange, 10.0); + EXPECT_LT(max_error_pseudorange, 10.0); + EXPECT_GT(min_error_pseudorange, -10.0); } - - //check results against the test tolerance - EXPECT_LT(error_mean_ch0, 5); - EXPECT_GT(error_mean_ch0, -5); - //assuming PLL BW=35 - EXPECT_LT(error_var_ch0, 250); - EXPECT_LT(max_error_ch0, 100); - EXPECT_GT(min_error_ch0, -100); - EXPECT_LT(rmse_ch0, 30); - - //Carrier Phase error - //2. RMSE - arma::vec err_carrier_phase; - - err_carrier_phase = delta_measured_carrier_phase_cycles; - - //save matlab file for further analysis - std::vector tmp_vector_err_carrier_phase(err_carrier_phase.colptr(0), - err_carrier_phase.colptr(0) + err_carrier_phase.n_rows); - save_mat_xy(tmp_vector_common_time_s, tmp_vector_err_carrier_phase, std::string("measured_carrier_phase_error_ch_" + std::to_string(ch_id))); - - - arma::vec err2_carrier_phase = arma::square(err_carrier_phase); - double rmse_carrier_phase = sqrt(arma::mean(err2_carrier_phase)); - - //3. Mean err and variance - double error_mean_carrier_phase = arma::mean(err_carrier_phase); - double error_var_carrier_phase = arma::var(err_carrier_phase); - - // 4. Peaks - double max_error_carrier_phase = arma::max(err_carrier_phase); - double min_error_carrier_phase = arma::min(err_carrier_phase); - - //5. report - ss = std::cout.precision(); - std::cout << std::setprecision(10) << data_title << "Carrier Phase RMSE = " - << rmse_carrier_phase << ", mean = " << error_mean_carrier_phase - << ", stdev = " << sqrt(error_var_carrier_phase) - << " (max,min) = " << max_error_carrier_phase - << "," << min_error_carrier_phase - << " [Cycles]" << std::endl; - std::cout.precision(ss); - - //plots - if (FLAGS_show_plots) - { - Gnuplot g3("linespoints"); - g3.set_title(data_title + "Carrier Phase error [Cycles]"); - g3.set_grid(); - g3.set_xlabel("Time [s]"); - g3.set_ylabel("Carrier Phase error [Cycles]"); - //conversion between arma::vec and std:vector - std::vector range_error_m(err_carrier_phase.colptr(0), err_carrier_phase.colptr(0) + err_carrier_phase.n_rows); - g3.cmd("set key box opaque"); - g3.plot_xy(time_vector, range_error_m, - "Carrier Phase error"); - g3.set_legend(); - g3.savetops(data_title + "duplicated_satellite_carrier_phase_error"); - - g3.showonscreen(); // window output - } - - //check results against the test tolerance - EXPECT_LT(rmse_carrier_phase, 0.25); - EXPECT_LT(error_mean_carrier_phase, 0.2); - EXPECT_GT(error_mean_carrier_phase, -0.2); - EXPECT_LT(error_var_carrier_phase, 0.5); - EXPECT_LT(max_error_carrier_phase, 0.5); - EXPECT_GT(min_error_carrier_phase, -0.5); - - //Pseudorange error - //2. RMSE - arma::vec err_pseudorange; - - err_pseudorange = delta_measured_dist_m; - - //save matlab file for further analysis - std::vector tmp_vector_err_pseudorange(err_pseudorange.colptr(0), - err_pseudorange.colptr(0) + err_pseudorange.n_rows); - save_mat_xy(tmp_vector_common_time_s, tmp_vector_err_pseudorange, std::string("measured_pr_error_ch_" + std::to_string(ch_id))); - - arma::vec err2_pseudorange = arma::square(err_pseudorange); - double rmse_pseudorange = sqrt(arma::mean(err2_pseudorange)); - - //3. Mean err and variance - double error_mean_pseudorange = arma::mean(err_pseudorange); - double error_var_pseudorange = arma::var(err_pseudorange); - - // 4. Peaks - double max_error_pseudorange = arma::max(err_pseudorange); - double min_error_pseudorange = arma::min(err_pseudorange); - - //5. report - ss = std::cout.precision(); - std::cout << std::setprecision(10) << data_title << "Pseudorange RMSE = " - << rmse_pseudorange << ", mean = " << error_mean_pseudorange - << ", stdev = " << sqrt(error_var_pseudorange) - << " (max,min) = " << max_error_pseudorange - << "," << min_error_pseudorange - << " [meters]" << std::endl; - std::cout.precision(ss); - - //plots - if (FLAGS_show_plots) - { - Gnuplot g3("linespoints"); - g3.set_title(data_title + "Pseudorange error [m]"); - g3.set_grid(); - g3.set_xlabel("Time [s]"); - g3.set_ylabel("Pseudorange error [m]"); - //conversion between arma::vec and std:vector - std::vector range_error_m(err_pseudorange.colptr(0), err_pseudorange.colptr(0) + err_pseudorange.n_rows); - g3.cmd("set key box opaque"); - g3.plot_xy(time_vector, range_error_m, - "Pseudorrange error"); - g3.set_legend(); - g3.savetops(data_title + "duplicated_satellite_pseudorrange_error"); - - g3.showonscreen(); // window output - } - - //check results against the test tolerance - EXPECT_LT(rmse_pseudorange, 3.0); - EXPECT_LT(error_mean_pseudorange, 1.0); - EXPECT_GT(error_mean_pseudorange, -1.0); - EXPECT_LT(error_var_pseudorange, 10.0); - EXPECT_LT(max_error_pseudorange, 10.0); - EXPECT_GT(min_error_pseudorange, -10.0); } bool HybridObservablesTest::save_mat_xy(std::vector& x, std::vector& y, std::string filename) @@ -1420,77 +1435,82 @@ void HybridObservablesTest::check_results_code_pseudorange( int size2 = measured_ch1.col(0).n_rows; double t1 = std::min(measured_ch0(size1 - 1, 0), measured_ch1(size2 - 1, 0)); - arma::vec t = arma::linspace(t0, t1, floor((t1 - t0) * 1e3)); - //conversion between arma::vec and std:vector - arma::vec t_from_start = arma::linspace(0, t1 - t0, floor((t1 - t0) * 1e3)); - std::vector time_vector(t_from_start.colptr(0), t_from_start.colptr(0) + t_from_start.n_rows); - - - arma::vec true_ch0_dist_interp; - arma::vec true_ch1_dist_interp; - arma::interp1(true_tow_ch0_s, true_ch0.col(1), t, true_ch0_dist_interp); - arma::interp1(true_tow_ch1_s, true_ch1.col(1), t, true_ch1_dist_interp); - - arma::vec meas_ch0_dist_interp; - arma::vec meas_ch1_dist_interp; - arma::interp1(measured_ch0.col(0), measured_ch0.col(4), t, meas_ch0_dist_interp); - arma::interp1(measured_ch1.col(0), measured_ch1.col(4), t, meas_ch1_dist_interp); - - // generate delta pseudoranges - arma::vec delta_true_dist_m = true_ch0_dist_interp - true_ch1_dist_interp; - arma::vec delta_measured_dist_m = meas_ch0_dist_interp - meas_ch1_dist_interp; - - //2. RMSE - arma::vec err; - - err = delta_measured_dist_m - delta_true_dist_m; - arma::vec err2 = arma::square(err); - double rmse = sqrt(arma::mean(err2)); - - //3. Mean err and variance - double error_mean = arma::mean(err); - double error_var = arma::var(err); - - // 4. Peaks - double max_error = arma::max(err); - double min_error = arma::min(err); - - //5. report - std::streamsize ss = std::cout.precision(); - std::cout << std::setprecision(10) << data_title << "Double diff Pseudorange RMSE = " - << rmse << ", mean = " << error_mean - << ", stdev = " << sqrt(error_var) - << " (max,min) = " << max_error - << "," << min_error - << " [meters]" << std::endl; - std::cout.precision(ss); - - //plots - if (FLAGS_show_plots) + if ((t1 - t0) > 0) { - Gnuplot g3("linespoints"); - g3.set_title(data_title + "Double diff Pseudorange error [m]"); - g3.set_grid(); - g3.set_xlabel("Time [s]"); - g3.set_ylabel("Double diff Pseudorange error [m]"); + arma::vec t = arma::linspace(t0, t1, floor((t1 - t0) * 1e3)); //conversion between arma::vec and std:vector - std::vector range_error_m(err.colptr(0), err.colptr(0) + err.n_rows); - g3.cmd("set key box opaque"); - g3.plot_xy(time_vector, range_error_m, - "Double diff Pseudorrange error"); - g3.set_legend(); - g3.savetops(data_title + "double_diff_pseudorrange_error"); + arma::vec t_from_start = arma::linspace(0, t1 - t0, floor((t1 - t0) * 1e3)); + std::vector time_vector(t_from_start.colptr(0), t_from_start.colptr(0) + t_from_start.n_rows); + arma::vec true_ch0_dist_interp; + arma::vec true_ch1_dist_interp; + arma::interp1(true_tow_ch0_s, true_ch0.col(1), t, true_ch0_dist_interp); + arma::interp1(true_tow_ch1_s, true_ch1.col(1), t, true_ch1_dist_interp); - g3.showonscreen(); // window output + arma::vec meas_ch0_dist_interp; + arma::vec meas_ch1_dist_interp; + arma::interp1(measured_ch0.col(0), measured_ch0.col(4), t, meas_ch0_dist_interp); + arma::interp1(measured_ch1.col(0), measured_ch1.col(4), t, meas_ch1_dist_interp); + + // generate delta pseudoranges + arma::vec delta_true_dist_m = true_ch0_dist_interp - true_ch1_dist_interp; + arma::vec delta_measured_dist_m = meas_ch0_dist_interp - meas_ch1_dist_interp; + + //2. RMSE + arma::vec err; + + err = delta_measured_dist_m - delta_true_dist_m; + arma::vec err2 = arma::square(err); + double rmse = sqrt(arma::mean(err2)); + + //3. Mean err and variance + double error_mean = arma::mean(err); + double error_var = arma::var(err); + + // 4. Peaks + double max_error = arma::max(err); + double min_error = arma::min(err); + + //5. report + std::streamsize ss = std::cout.precision(); + std::cout << std::setprecision(10) << data_title << "Double diff Pseudorange RMSE = " + << rmse << ", mean = " << error_mean + << ", stdev = " << sqrt(error_var) + << " (max,min) = " << max_error + << "," << min_error + << " [meters]" << std::endl; + std::cout.precision(ss); + + //plots + if (FLAGS_show_plots) + { + Gnuplot g3("linespoints"); + g3.set_title(data_title + "Double diff Pseudorange error [m]"); + g3.set_grid(); + g3.set_xlabel("Time [s]"); + g3.set_ylabel("Double diff Pseudorange error [m]"); + //conversion between arma::vec and std:vector + std::vector range_error_m(err.colptr(0), err.colptr(0) + err.n_rows); + g3.cmd("set key box opaque"); + g3.plot_xy(time_vector, range_error_m, + "Double diff Pseudorrange error"); + g3.set_legend(); + g3.savetops(data_title + "double_diff_pseudorrange_error"); + + g3.showonscreen(); // window output + } + + //check results against the test tolerance + ASSERT_LT(rmse, 3.0); + ASSERT_LT(error_mean, 1.0); + ASSERT_GT(error_mean, -1.0); + ASSERT_LT(error_var, 10.0); + ASSERT_LT(max_error, 10.0); + ASSERT_GT(min_error, -10.0); + } + else + { + std::cout << "Problem with observables in " << data_title << std::endl; } - - //check results against the test tolerance - ASSERT_LT(rmse, 3.0); - ASSERT_LT(error_mean, 1.0); - ASSERT_GT(error_mean, -1.0); - ASSERT_LT(error_var, 10.0); - ASSERT_LT(max_error, 10.0); - ASSERT_GT(min_error, -10.0); } bool HybridObservablesTest::ReadRinexObs(std::vector* obs_vec, Gnss_Synchro gnss) @@ -1981,7 +2001,7 @@ TEST_F(HybridObservablesTest, ValidationOfResults) int sat2_ch_id = -1; for (unsigned int ch = 0; ch < measured_obs_vec.size(); ch++) { - if (epoch_counters_vec.at(ch) > 10) //discard non-valid channels + if (epoch_counters_vec.at(ch) > 100) //discard non-valid channels { if (gnss_synchro_vec.at(ch).PRN == prn_pairs.at(n)) { @@ -2023,7 +2043,7 @@ TEST_F(HybridObservablesTest, ValidationOfResults) unsigned int min_pr_ch_id = 0; for (unsigned int n = 0; n < measured_obs_vec.size(); n++) { - if (epoch_counters_vec.at(n) > 10) //discard non-valid channels + if (epoch_counters_vec.at(n) > 100) //discard non-valid channels { { if (measured_obs_vec.at(n)(0, 4) < min_pr) @@ -2040,8 +2060,20 @@ TEST_F(HybridObservablesTest, ValidationOfResults) } arma::vec receiver_time_offset_ref_channel_s; - receiver_time_offset_ref_channel_s = (true_obs_vec.at(min_pr_ch_id).col(1)(0) - measured_obs_vec.at(min_pr_ch_id).col(4)(0)) / GPS_C_M_S; - std::cout << "Ref. channel initial Receiver time offset " << receiver_time_offset_ref_channel_s(0) * 1e3 << " [ms]" << std::endl; + arma::uvec index2; + index2 = arma::find(true_obs_vec.at(min_pr_ch_id).col(0) >= measured_obs_vec.at(min_pr_ch_id).col(0)(0), 1, "first"); + if ((!index2.empty()) and (index2(0) > 0)) + { + receiver_time_offset_ref_channel_s = (true_obs_vec.at(min_pr_ch_id).col(1)(index2(0)) - measured_obs_vec.at(min_pr_ch_id).col(4)(0)) / GPS_C_M_S; + std::cout << "Ref. channel initial Receiver time offset " << receiver_time_offset_ref_channel_s(0) * 1e3 << " [ms]" << std::endl; + } + else + { + ASSERT_NO_THROW( + throw std::exception();) + << "Error finding observation time epoch in the reference data"; + } + for (unsigned int n = 0; n < measured_obs_vec.size(); n++) { @@ -2083,7 +2115,7 @@ TEST_F(HybridObservablesTest, ValidationOfResults) save_mat_xy(tmp_vector_x6, tmp_vector_y6, std::string("measured_cp_ch_" + std::to_string(n))); - if (epoch_counters_vec.at(n) > 10) //discard non-valid channels + if (epoch_counters_vec.at(n) > 100) //discard non-valid channels { arma::vec true_TOW_ref_ch_s = true_obs_vec.at(min_pr_ch_id).col(0) - receiver_time_offset_ref_channel_s(0); arma::vec true_TOW_ch_s = true_obs_vec.at(n).col(0) - receiver_time_offset_ref_channel_s(0); @@ -2097,7 +2129,6 @@ TEST_F(HybridObservablesTest, ValidationOfResults) measured_obs_vec.at(n), measured_obs_vec.at(min_pr_ch_id), "[CH " + std::to_string(n) + "] PRN " + std::to_string(gnss_synchro_vec.at(n).PRN) + " "); - //Do not compare E5a with E5 RINEX due to the Doppler frequency discrepancy caused by the different center frequencies //E5a_fc=1176.45e6, E5b_fc=1207.14e6, E5_fc=1191.795e6; if (strcmp("5X\0", gnss_synchro_vec.at(n).Signal) != 0 or FLAGS_compare_with_5X) diff --git a/src/tests/unit-tests/signal-processing-blocks/resampler/direct_resampler_conditioner_cc_test.cc b/src/tests/unit-tests/signal-processing-blocks/resampler/direct_resampler_conditioner_cc_test.cc index d8ce67450..553637df8 100644 --- a/src/tests/unit-tests/signal-processing-blocks/resampler/direct_resampler_conditioner_cc_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/resampler/direct_resampler_conditioner_cc_test.cc @@ -42,7 +42,7 @@ #include "direct_resampler_conditioner_cc.h" #include "gnss_sdr_valve.h" #include -#include +#include "concurrent_queue.h" TEST(DirectResamplerConditionerCcTest, InstantiationAndRunTest) @@ -52,7 +52,7 @@ TEST(DirectResamplerConditionerCcTest, InstantiationAndRunTest) std::chrono::time_point start, end; std::chrono::duration elapsed_seconds(0); int nsamples = 1000000; //Number of samples to be computed - gr::msg_queue::sptr queue = gr::msg_queue::make(0); + std::shared_ptr> queue = gr::msg_queue::make(0); gr::top_block_sptr top_block = gr::make_top_block("direct_resampler_conditioner_cc_test"); boost::shared_ptr source = gr::analog::sig_source_c::make(fs_in, gr::analog::GR_SIN_WAVE, 1000.0, 1.0, gr_complex(0.0)); boost::shared_ptr valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue); diff --git a/src/tests/unit-tests/signal-processing-blocks/resampler/mmse_resampler_test.cc b/src/tests/unit-tests/signal-processing-blocks/resampler/mmse_resampler_test.cc index 2bc26b8b4..571230f03 100644 --- a/src/tests/unit-tests/signal-processing-blocks/resampler/mmse_resampler_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/resampler/mmse_resampler_test.cc @@ -40,7 +40,7 @@ #include "gnss_sdr_valve.h" #include "mmse_resampler_conditioner.h" #include -#include +#include "concurrent_queue.h" TEST(MmseResamplerTest, InstantiationAndRunTestWarning) { @@ -49,7 +49,7 @@ TEST(MmseResamplerTest, InstantiationAndRunTestWarning) std::chrono::time_point start, end; std::chrono::duration elapsed_seconds(0); int nsamples = 1000000; //Number of samples to be computed - gr::msg_queue::sptr queue = gr::msg_queue::make(0); + std::shared_ptr> queue = gr::msg_queue::make(0); gr::top_block_sptr top_block = gr::make_top_block("mmse_resampler_conditioner_cc_test"); boost::shared_ptr source = gr::analog::sig_source_c::make(fs_in, gr::analog::GR_SIN_WAVE, 1000.0, 1.0, gr_complex(0.0)); boost::shared_ptr valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue); @@ -90,7 +90,7 @@ TEST(MmseResamplerTest, InstantiationAndRunTest2) std::chrono::time_point start, end; std::chrono::duration elapsed_seconds(0); int nsamples = 1000000; //Number of samples to be computed - gr::msg_queue::sptr queue = gr::msg_queue::make(0); + std::shared_ptr> queue = gr::msg_queue::make(0); gr::top_block_sptr top_block = gr::make_top_block("mmse_resampler_conditioner_cc_test"); boost::shared_ptr source = gr::analog::sig_source_c::make(fs_in, gr::analog::GR_SIN_WAVE, 1000.0, 1.0, gr_complex(0.0)); boost::shared_ptr valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue); diff --git a/src/tests/unit-tests/signal-processing-blocks/sources/file_signal_source_test.cc b/src/tests/unit-tests/signal-processing-blocks/sources/file_signal_source_test.cc index dd1020249..bc7eb5acb 100644 --- a/src/tests/unit-tests/signal-processing-blocks/sources/file_signal_source_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/sources/file_signal_source_test.cc @@ -31,7 +31,7 @@ #include "file_signal_source.h" #include "in_memory_configuration.h" -#include +#include "concurrent_queue.h" #include #include #include diff --git a/src/tests/unit-tests/signal-processing-blocks/sources/gnss_sdr_valve_test.cc b/src/tests/unit-tests/signal-processing-blocks/sources/gnss_sdr_valve_test.cc index 02e1b09df..4c460b63f 100644 --- a/src/tests/unit-tests/signal-processing-blocks/sources/gnss_sdr_valve_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/sources/gnss_sdr_valve_test.cc @@ -40,11 +40,11 @@ #endif #include "gnss_sdr_valve.h" #include -#include +#include "concurrent_queue.h" TEST(ValveTest, CheckEventSentAfter100Samples) { - gr::msg_queue::sptr queue = gr::msg_queue::make(0); + std::shared_ptr> queue = gr::msg_queue::make(0); gr::top_block_sptr top_block = gr::make_top_block("gnss_sdr_valve_test"); diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e1_dll_pll_veml_tracking_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e1_dll_pll_veml_tracking_test.cc index 469ec2c27..bf78395bf 100644 --- a/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e1_dll_pll_veml_tracking_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e1_dll_pll_veml_tracking_test.cc @@ -41,7 +41,7 @@ #include #include #include -#include +#include "concurrent_queue.h" #include #include #include @@ -68,7 +68,7 @@ protected: void init(); - gr::msg_queue::sptr queue; + std::shared_ptr> queue; gr::top_block_sptr top_block; std::shared_ptr factory; std::shared_ptr config; diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e5a_tracking_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e5a_tracking_test.cc index 122184eb7..6c4b8e0ef 100644 --- a/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e5a_tracking_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e5a_tracking_test.cc @@ -41,7 +41,7 @@ #include #include #include -#include +#include "concurrent_queue.h" #include #include #include @@ -69,7 +69,7 @@ protected: void init(); - gr::msg_queue::sptr queue; + std::shared_ptr> queue; gr::top_block_sptr top_block; std::shared_ptr factory; std::shared_ptr config; diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_c_aid_tracking_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_c_aid_tracking_test.cc index 003c63a9d..1fa07acc4 100644 --- a/src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_c_aid_tracking_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_c_aid_tracking_test.cc @@ -42,7 +42,7 @@ #include #include #include -#include +#include "concurrent_queue.h" #include #include #include @@ -119,7 +119,7 @@ protected: void init(); - gr::msg_queue::sptr queue; + std::shared_ptr> queue; gr::top_block_sptr top_block; std::shared_ptr factory; std::shared_ptr config; diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_tracking_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_tracking_test.cc index 20a910ce4..207217937 100644 --- a/src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_tracking_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_tracking_test.cc @@ -42,7 +42,7 @@ #include #include #include -#include +#include "concurrent_queue.h" #include #include #include @@ -120,7 +120,7 @@ protected: void init(); - gr::msg_queue::sptr queue; + std::shared_ptr> queue; gr::top_block_sptr top_block; std::shared_ptr factory; std::shared_ptr config; diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l2_m_dll_pll_tracking_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l2_m_dll_pll_tracking_test.cc index a640db425..59a63480e 100644 --- a/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l2_m_dll_pll_tracking_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l2_m_dll_pll_tracking_test.cc @@ -42,7 +42,7 @@ #include #include #include -#include +#include "concurrent_queue.h" #include #include #include @@ -123,7 +123,7 @@ protected: void init(); - gr::msg_queue::sptr queue; + std::shared_ptr> queue; gr::top_block_sptr top_block; std::shared_ptr factory; std::shared_ptr config; diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test.cc index fb38b8efa..9b9e04baf 100644 --- a/src/tests/unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test.cc @@ -36,7 +36,7 @@ #include "Galileo_E1.h" #include "Galileo_E5a.h" #include "acquisition_msg_rx.h" -#include "control_message_factory.h" +#include "concurrent_queue.h" #include "galileo_e1_pcps_ambiguous_acquisition.h" #include "galileo_e5a_noncoherent_iq_acquisition_caf.h" #include "galileo_e5a_pcps_acquisition.h" @@ -61,7 +61,6 @@ #include #include #include -#include #include #include #include @@ -229,7 +228,7 @@ public: Gnss_Synchro gnss_synchro; size_t item_size; - gr::msg_queue::sptr queue; + std::shared_ptr> queue; }; diff --git a/src/utils/front-end-cal/main.cc b/src/utils/front-end-cal/main.cc index 54723dfc5..e5f8e8520 100644 --- a/src/utils/front-end-cal/main.cc +++ b/src/utils/front-end-cal/main.cc @@ -62,7 +62,7 @@ #include #include // for gr_complex #include // for io_signature -#include +#include "concurrent_queue.h" #include // for block_sptr #include #include // for pmt_t, to_long From 50cfb6cdf53f84c1ad8be0f74405be8609cbe488 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Tue, 16 Jul 2019 19:20:37 +0200 Subject: [PATCH 03/36] Fix building until gnss-sdr --- src/algorithms/channel/libs/CMakeLists.txt | 7 +++---- src/core/libs/CMakeLists.txt | 2 ++ src/core/{receiver => libs}/channel_event.cc | 0 src/core/{receiver => libs}/channel_event.h | 0 src/core/receiver/CMakeLists.txt | 2 -- 5 files changed, 5 insertions(+), 6 deletions(-) rename src/core/{receiver => libs}/channel_event.cc (100%) rename src/core/{receiver => libs}/channel_event.h (100%) diff --git a/src/algorithms/channel/libs/CMakeLists.txt b/src/algorithms/channel/libs/CMakeLists.txt index 2a5773dfc..1ab513f43 100644 --- a/src/algorithms/channel/libs/CMakeLists.txt +++ b/src/algorithms/channel/libs/CMakeLists.txt @@ -24,7 +24,7 @@ set(CHANNEL_FSM_SOURCES set(CHANNEL_FSM_HEADERS channel_fsm.h channel_msg_receiver_cc.h -) +) list(SORT CHANNEL_FSM_HEADERS) list(SORT CHANNEL_FSM_SOURCES) @@ -35,15 +35,14 @@ add_library(channel_libs ${CHANNEL_FSM_SOURCES} ${CHANNEL_FSM_HEADERS}) target_link_libraries(channel_libs PUBLIC + core_libs + core_system_parameters Gnuradio::runtime Gnuradio::pmt - core_system_parameters - core_receiver PRIVATE Boost::boost Gflags::gflags Glog::glog - core_receiver ) if(ENABLE_CLANG_TIDY) diff --git a/src/core/libs/CMakeLists.txt b/src/core/libs/CMakeLists.txt index 12485d937..6a074d5a7 100644 --- a/src/core/libs/CMakeLists.txt +++ b/src/core/libs/CMakeLists.txt @@ -25,6 +25,7 @@ set(CORE_LIBS_SOURCES gnss_sdr_supl_client.cc gnss_sdr_sample_counter.cc channel_status_msg_receiver.cc + channel_event.cc ) set(CORE_LIBS_HEADERS @@ -34,6 +35,7 @@ set(CORE_LIBS_HEADERS gnss_sdr_supl_client.h gnss_sdr_sample_counter.h channel_status_msg_receiver.h + channel_event.h ) if(ENABLE_FPGA) diff --git a/src/core/receiver/channel_event.cc b/src/core/libs/channel_event.cc similarity index 100% rename from src/core/receiver/channel_event.cc rename to src/core/libs/channel_event.cc diff --git a/src/core/receiver/channel_event.h b/src/core/libs/channel_event.h similarity index 100% rename from src/core/receiver/channel_event.h rename to src/core/libs/channel_event.h diff --git a/src/core/receiver/CMakeLists.txt b/src/core/receiver/CMakeLists.txt index 7f80fddbd..20c8b7ea0 100644 --- a/src/core/receiver/CMakeLists.txt +++ b/src/core/receiver/CMakeLists.txt @@ -24,7 +24,6 @@ set(GNSS_RECEIVER_SOURCES gnss_flowgraph.cc in_memory_configuration.cc tcp_cmd_interface.cc - channel_event.cc command_event.cc ) @@ -38,7 +37,6 @@ set(GNSS_RECEIVER_HEADERS concurrent_map.h concurrent_queue.h control_message.h - channel_event.h command_event.h ) From aeabfb7c3cc9b1c874022b8f5f5c4ab79433498b Mon Sep 17 00:00:00 2001 From: Javier Arribas Date: Wed, 17 Jul 2019 15:56:30 +0200 Subject: [PATCH 04/36] Replacing the old gnuradio message queue with the new ConcurrentQueue --- src/core/receiver/control_thread.cc | 107 +++++++----------- src/core/receiver/control_thread.h | 6 +- src/core/receiver/gnss_flowgraph.cc | 6 - src/tests/CMakeLists.txt | 1 - src/tests/test_main.cc | 1 - .../control_message_factory_test.cc | 89 --------------- .../control-plane/control_thread_test.cc | 31 +++-- .../control-plane/gnss_block_factory_test.cc | 19 ++-- .../control-plane/gnss_flowgraph_test.cc | 12 +- .../acquisition/acq_performance_test.cc | 3 +- .../beidou_b1i_pcps_acquisition_test.cc | 9 +- .../beidou_b3i_pcps_acquisition_test.cc | 9 +- ...8ms_ambiguous_acquisition_gsoc2013_test.cc | 11 +- ...cps_ambiguous_acquisition_gsoc2013_test.cc | 10 +- ...e1_pcps_ambiguous_acquisition_gsoc_test.cc | 7 +- ...ileo_e1_pcps_ambiguous_acquisition_test.cc | 9 +- ...wsr_ambiguous_acquisition_gsoc2013_test.cc | 11 +- ...ync_ambiguous_acquisition_gsoc2014_test.cc | 11 +- ...ong_ambiguous_acquisition_gsoc2013_test.cc | 11 +- ...cps_acquisition_gsoc2014_gensource_test.cc | 7 +- ...ss_l1_ca_pcps_acquisition_gsoc2017_test.cc | 11 +- .../glonass_l1_ca_pcps_acquisition_test.cc | 7 +- .../glonass_l2_ca_pcps_acquisition_test.cc | 11 +- ...ps_l1_ca_pcps_acquisition_gsoc2013_test.cc | 11 +- .../gps_l1_ca_pcps_acquisition_test.cc | 2 +- ...a_pcps_opencl_acquisition_gsoc2013_test.cc | 2 +- ...cps_quicksync_acquisition_gsoc2014_test.cc | 8 +- ..._ca_pcps_tong_acquisition_gsoc2013_test.cc | 6 +- .../gps_l2_m_pcps_acquisition_test.cc | 6 +- .../filter/fir_filter_test.cc | 6 +- .../filter/notch_filter_lite_test.cc | 6 +- .../filter/notch_filter_test.cc | 6 +- .../filter/pulse_blanking_filter_test.cc | 6 +- .../direct_resampler_conditioner_cc_test.cc | 2 +- .../resampler/mmse_resampler_test.cc | 4 +- .../sources/file_signal_source_test.cc | 6 +- .../sources/gnss_sdr_valve_test.cc | 14 ++- .../galileo_e1_dll_pll_veml_tracking_test.cc | 4 +- .../tracking/galileo_e5a_tracking_test.cc | 2 +- ...onass_l1_ca_dll_pll_c_aid_tracking_test.cc | 2 +- .../glonass_l1_ca_dll_pll_tracking_test.cc | 2 +- .../gps_l2_m_dll_pll_tracking_test.cc | 2 +- .../tracking/tracking_pull-in_test.cc | 18 +-- src/utils/front-end-cal/main.cc | 9 +- 44 files changed, 203 insertions(+), 320 deletions(-) delete mode 100644 src/tests/unit-tests/control-plane/control_message_factory_test.cc diff --git a/src/core/receiver/control_thread.cc b/src/core/receiver/control_thread.cc index 154f9ec7b..f77d0b29c 100644 --- a/src/core/receiver/control_thread.cc +++ b/src/core/receiver/control_thread.cc @@ -33,6 +33,8 @@ */ #include "control_thread.h" +#include "channel_event.h" +#include "command_event.h" #include "concurrent_map.h" #include "configuration_interface.h" #include "file_configuration.h" @@ -60,7 +62,6 @@ #include "rtklib_rtkcmn.h" // for utc2gpst #include // for bad_lexical_cast #include // for LOG -#include // for message::sptr #include // for make_any #include // for find, min #include // for milliseconds @@ -282,15 +283,49 @@ int ControlThread::run() flowgraph_); #endif // Main loop to read and process the control messages + pmt::pmt_t msg; while (flowgraph_->running() && !stop_) { //TODO call here the new sat dispatcher and receiver controller - // read_control_messages(); - // if (control_messages_ != nullptr) - // { - // process_control_messages(); - // } - std::cout << "tick\n"; + bool valid_event = control_queue_->timed_wait_and_pop(msg, 100); + if (valid_event) + { + if (pmt::any_ref(msg).type() == typeid(channel_event_sptr)) + { + channel_event_sptr new_event; + new_event = boost::any_cast(pmt::any_ref(msg)); + DLOG(INFO) << "New channel event rx from ch id: " << new_event->channel_id + << " what: " << new_event->event_type; + flowgraph_->apply_action(new_event->channel_id, new_event->event_type); + } + else if (pmt::any_ref(msg).type() == typeid(command_event_sptr)) + { + command_event_sptr new_event; + new_event = boost::any_cast(pmt::any_ref(msg)); + DLOG(INFO) << "New command event rx from ch id: " << new_event->command_id + << " what: " << new_event->event_type; + + if (new_event->command_id == 200) + { + apply_action(new_event->event_type); + } + else + { + if (new_event->command_id == 300) // some TC commands require also actions from control_thread + { + apply_action(new_event->event_type); + } + flowgraph_->apply_action(new_event->command_id, new_event->event_type); + } + } + else + { + DLOG(INFO) << "Control Queue: unknown object type!\n"; + } + } + else + { + } } std::cout << "Stopping GNSS-SDR, please wait!" << std::endl; flowgraph_->stop(); @@ -788,50 +823,6 @@ void ControlThread::assist_GNSS() } } - -void ControlThread::read_control_messages() -{ - DLOG(INFO) << "Reading control messages from queue"; - // gr::message::sptr queue_message = control_queue_->delete_head(); - // if (queue_message != nullptr) - // { - // control_messages_ = control_message_factory_->GetControlMessages(queue_message); - // } - // else - // { - // control_messages_->clear(); - // } -} - - -// Apply the corresponding control actions -void ControlThread::process_control_messages() -{ - // for (auto &i : *control_messages_) - // { - // if (stop_) - // { - // break; - // } - // if (i->who == 200) - // { - // apply_action(i->what); - // } - // else - // { - // if (i->who == 300) // some TC commands require also actions from control_thread - // { - // apply_action(i->what); - // } - // flowgraph_->apply_action(i->who, i->what); - // } - // processed_control_messages_++; - // } - // control_messages_->clear(); - DLOG(INFO) << "Processed all control messages"; -} - - void ControlThread::apply_action(unsigned int what) { std::shared_ptr pvt_ptr; @@ -1090,12 +1081,7 @@ void ControlThread::sysv_queue_listener() if ((std::abs(received_message - (-200.0)) < 10 * std::numeric_limits::epsilon())) { std::cout << "Quit order received, stopping GNSS-SDR !!" << std::endl; - //todo: remplace old shutdown mechanism - // std::unique_ptr cmf(new ControlMessageFactory()); - // if (control_queue_ != std::shared_ptr>()) - // { - // control_queue_->handle(cmf->GetQueueMessage(200, 0)); - // } + control_queue_->push(pmt::make_any(command_event_make(200, 0))); read_queue = false; } } @@ -1113,12 +1099,7 @@ void ControlThread::keyboard_listener() if (c == 'q') { std::cout << "Quit keystroke order received, stopping GNSS-SDR !!" << std::endl; - //todo: remplace old shutdown mechanism - // std::unique_ptr cmf(new ControlMessageFactory()); - // if (control_queue_ != std::shared_ptr>()) - // { - // control_queue_->handle(cmf->GetQueueMessage(200, 0)); - // } + control_queue_->push(pmt::make_any(command_event_make(200, 0))); read_keys = false; } std::this_thread::sleep_for(std::chrono::milliseconds(100)); diff --git a/src/core/receiver/control_thread.h b/src/core/receiver/control_thread.h index a35283ac1..1066895fa 100644 --- a/src/core/receiver/control_thread.h +++ b/src/core/receiver/control_thread.h @@ -95,7 +95,7 @@ public: /*! * \brief Sets the control_queue * - * \param[in] boost::shared_ptr control_queue + * \param[in] std::shared_ptr> control_queue */ void set_control_queue(const std::shared_ptr> control_queue); // NOLINT(performance-unnecessary-value-param) @@ -140,10 +140,6 @@ private: // Save {ephemeris, iono, utc, ref loc, ref time} assistance to a local XML file //bool save_assistance_to_XML(); - void read_control_messages(); - - void process_control_messages(); - /* * Blocking function that reads the GPS assistance queue */ diff --git a/src/core/receiver/gnss_flowgraph.cc b/src/core/receiver/gnss_flowgraph.cc index 4488971b7..df54e3362 100644 --- a/src/core/receiver/gnss_flowgraph.cc +++ b/src/core/receiver/gnss_flowgraph.cc @@ -1262,9 +1262,6 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) else { push_back_signal(gnss_signal); - //todo: rewrite all - // std::unique_ptr cmf(new ControlMessageFactory()); - // queue_->handle(cmf->GetQueueMessage(i, 0)); DLOG(INFO) << "Channel " << ch_index << " secondary frequency acquisition assistance not available in " << channels_[ch_index]->get_signal().get_satellite() << ", Signal " << channels_[ch_index]->get_signal().get_signal_str(); } } @@ -1327,9 +1324,6 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) else { push_back_signal(gnss_signal); - //todo: rewrite all - // std::unique_ptr cmf(new ControlMessageFactory()); - // queue_->handle(cmf->GetQueueMessage(i, 0)); DLOG(INFO) << "Channel " << i << " secondary frequency acquisition assistance not available in " << channels_[i]->get_signal().get_satellite() << ", Signal " << channels_[i]->get_signal().get_signal_str(); std::cout << "Channel " << i << " secondary frequency acquisition assistance not available in " << channels_[i]->get_signal().get_satellite() << ", Signal " << channels_[i]->get_signal().get_signal_str(); } diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt index 8a4fb8943..021966a1a 100644 --- a/src/tests/CMakeLists.txt +++ b/src/tests/CMakeLists.txt @@ -869,7 +869,6 @@ endif() if(NOT ENABLE_PACKAGING AND NOT ENABLE_FPGA) add_executable(control_thread_test ${CMAKE_CURRENT_SOURCE_DIR}/single_test_main.cc - ${CMAKE_CURRENT_SOURCE_DIR}/unit-tests/control-plane/control_message_factory_test.cc ${CMAKE_CURRENT_SOURCE_DIR}/unit-tests/control-plane/control_thread_test.cc ) if(${FILESYSTEM_FOUND}) diff --git a/src/tests/test_main.cc b/src/tests/test_main.cc index e20338cfa..748df14a1 100644 --- a/src/tests/test_main.cc +++ b/src/tests/test_main.cc @@ -60,7 +60,6 @@ DECLARE_string(log_dir); #include "unit-tests/arithmetic/fft_speed_test.cc" #include "unit-tests/arithmetic/magnitude_squared_test.cc" #include "unit-tests/arithmetic/multiply_test.cc" -#include "unit-tests/control-plane/control_message_factory_test.cc" #include "unit-tests/control-plane/control_thread_test.cc" #include "unit-tests/control-plane/file_configuration_test.cc" #include "unit-tests/control-plane/gnss_block_factory_test.cc" diff --git a/src/tests/unit-tests/control-plane/control_message_factory_test.cc b/src/tests/unit-tests/control-plane/control_message_factory_test.cc deleted file mode 100644 index a2b4448b8..000000000 --- a/src/tests/unit-tests/control-plane/control_message_factory_test.cc +++ /dev/null @@ -1,89 +0,0 @@ -/*! - * \file control message_factory_test.cc - * \brief This file implements tests for the ControlMessageFactory. - * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com - * Carles Fernandez-Prades, 2012. cfernandez(at)cttc.es - * - * - * ------------------------------------------------------------------------- - * - * Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) - * - * GNSS-SDR is a software defined Global Navigation - * Satellite Systems receiver - * - * This file is part of GNSS-SDR. - * - * GNSS-SDR is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * GNSS-SDR is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNSS-SDR. If not, see . - * - * ------------------------------------------------------------------------- - */ - - -#include -#include - - -TEST(ControlMessageFactoryTest, GetQueueMessage) -{ - std::shared_ptr factory = std::make_shared(); - gr::message::sptr queue_message = factory->GetQueueMessage(0, 2); - auto control_messages = factory->GetControlMessages(queue_message); - unsigned int expected0 = 0; - unsigned int expected2 = 2; - EXPECT_EQ(expected0, control_messages->at(0)->who); - EXPECT_EQ(expected2, control_messages->at(0)->what); - EXPECT_EQ(sizeof(ControlMessage), queue_message->length()); -} - - -TEST(ControlMessageFactoryTest, GetControlMessages) -{ - std::shared_ptr factory = std::make_shared(); - gr::message::sptr queue_message = gr::message::make(0, 0, 0, sizeof(ControlMessage)); - std::shared_ptr control_message = std::make_shared(); - - control_message->who = 1; - control_message->what = 4; - - memcpy(queue_message->msg(), control_message.get(), sizeof(ControlMessage)); - std::shared_ptr>> control_messages = factory->GetControlMessages(queue_message); - - unsigned int expected1 = 1; - unsigned int expected4 = 4; - EXPECT_EQ(expected1, control_messages->size()); - EXPECT_EQ(expected1, control_messages->at(0)->who); - EXPECT_EQ(expected4, control_messages->at(0)->what); -} - -/* - -TEST(ControlMessageFactoryTest, GetControlMessagesWrongSize) -{ - - std::shared_ptr factory = std::make_shared(); - std::shared_ptr control_message = std::make_shared(); - - control_message->who = 1; - control_message->what = 4; - int another_int = 10; - - gr::message::sptr queue_message = gr::message::make(0, 0, 0, sizeof(ControlMessage) + sizeof(int)); - memcpy(queue_message->msg(), control_message.get(), sizeof(ControlMessage)); - memcpy(queue_message->msg() + sizeof(ControlMessage), &another_int, sizeof(int)); - std::shared_ptr>> control_messages = factory->GetControlMessages(queue_message); - - unsigned int expected0 = 0; - EXPECT_EQ(expected0, control_messages->size()); -} */ diff --git a/src/tests/unit-tests/control-plane/control_thread_test.cc b/src/tests/unit-tests/control-plane/control_thread_test.cc index 2f13cfaa2..4a0ffa18e 100644 --- a/src/tests/unit-tests/control-plane/control_thread_test.cc +++ b/src/tests/unit-tests/control-plane/control_thread_test.cc @@ -32,6 +32,8 @@ #include "control_thread.h" +#include "channel_event.h" +#include "command_event.h" #include "concurrent_queue.h" #include "in_memory_configuration.h" #include @@ -39,8 +41,8 @@ #include #include #include -#include #include +#include #include #include #include @@ -120,13 +122,10 @@ TEST_F(ControlThreadTest /*unused*/, InstantiateRunControlMessages /*unused*/) std::shared_ptr control_thread = std::make_shared(config); - std::shared_ptr> control_queue = gr::msg_queue::make(0); - - std::unique_ptr control_msg_factory(new ControlMessageFactory()); - - control_queue->handle(control_msg_factory->GetQueueMessage(0, 0)); - control_queue->handle(control_msg_factory->GetQueueMessage(1, 0)); - control_queue->handle(control_msg_factory->GetQueueMessage(200, 0)); + std::shared_ptr> control_queue = std::make_shared>(); + control_queue->push(pmt::make_any(channel_event_make(0, 0))); + control_queue->push(pmt::make_any(channel_event_make(1, 0))); + control_queue->push(pmt::make_any(command_event_make(200, 0))); control_thread->set_control_queue(control_queue); try @@ -180,16 +179,14 @@ TEST_F(ControlThreadTest /*unused*/, InstantiateRunControlMessages2 /*unused*/) config->set_property("GNSS-SDR.internal_fs_sps", "4000000"); std::unique_ptr control_thread2(new ControlThread(config)); + std::shared_ptr> control_queue2 = std::make_shared>(); - std::shared_ptr> control_queue2 = gr::msg_queue::make(0); + control_queue2->push(pmt::make_any(channel_event_make(0, 0))); + control_queue2->push(pmt::make_any(channel_event_make(2, 0))); + control_queue2->push(pmt::make_any(channel_event_make(1, 0))); + control_queue2->push(pmt::make_any(channel_event_make(3, 0))); + control_queue2->push(pmt::make_any(command_event_make(200, 0))); - std::unique_ptr control_msg_factory2(new ControlMessageFactory()); - - control_queue2->handle(control_msg_factory2->GetQueueMessage(0, 0)); - control_queue2->handle(control_msg_factory2->GetQueueMessage(2, 0)); - control_queue2->handle(control_msg_factory2->GetQueueMessage(1, 0)); - control_queue2->handle(control_msg_factory2->GetQueueMessage(3, 0)); - control_queue2->handle(control_msg_factory2->GetQueueMessage(200, 0)); control_thread2->set_control_queue(control_queue2); @@ -244,7 +241,7 @@ TEST_F(ControlThreadTest /*unused*/, StopReceiverProgrammatically /*unused*/) config->set_property("GNSS-SDR.internal_fs_sps", "4000000"); std::shared_ptr control_thread = std::make_shared(config); - std::shared_ptr> control_queue = gr::msg_queue::make(0); + std::shared_ptr> control_queue = std::make_shared>(); control_thread->set_control_queue(control_queue); std::thread stop_receiver_thread(stop_receiver); diff --git a/src/tests/unit-tests/control-plane/gnss_block_factory_test.cc b/src/tests/unit-tests/control-plane/gnss_block_factory_test.cc index c8a427ee6..7fd850f73 100644 --- a/src/tests/unit-tests/control-plane/gnss_block_factory_test.cc +++ b/src/tests/unit-tests/control-plane/gnss_block_factory_test.cc @@ -36,14 +36,15 @@ #include "gnss_block_factory.h" #include "acquisition_interface.h" #include "channel.h" +#include "concurrent_queue.h" #include "gnss_block_interface.h" #include "in_memory_configuration.h" #include "observables_interface.h" #include "pvt_interface.h" #include "telemetry_decoder_interface.h" #include "tracking_interface.h" -#include "concurrent_queue.h" #include +#include #include TEST(GNSSBlockFactoryTest, InstantiateFileSignalSource) @@ -53,7 +54,7 @@ TEST(GNSSBlockFactoryTest, InstantiateFileSignalSource) std::string path = std::string(TEST_PATH); std::string filename = path + "signal_samples/GPS_L1_CA_ID_1_Fs_4Msps_2ms.dat"; configuration->set_property("SignalSource.filename", filename); - std::shared_ptr> queue = gr::msg_queue::make(0); + std::shared_ptr> queue = std::make_shared>(); // Example of a factory as a shared_ptr std::shared_ptr factory = std::make_shared(); // Example of a block as a shared_ptr @@ -67,7 +68,7 @@ TEST(GNSSBlockFactoryTest, InstantiateWrongSignalSource) { std::shared_ptr configuration = std::make_shared(); configuration->set_property("SignalSource.implementation", "Pepito"); - std::shared_ptr> queue = gr::msg_queue::make(0); + std::shared_ptr> queue = std::make_shared>(); // Example of a factory as a unique_ptr std::unique_ptr factory; // Example of a block as a unique_ptr @@ -90,7 +91,7 @@ TEST(GNSSBlockFactoryTest, InstantiateSignalConditioner) TEST(GNSSBlockFactoryTest, InstantiateFIRFilter) { std::shared_ptr configuration = std::make_shared(); - std::shared_ptr> queue = gr::msg_queue::make(0); + std::shared_ptr> queue = std::make_shared>(); configuration->set_property("InputFilter.implementation", "Fir_Filter"); @@ -123,7 +124,7 @@ TEST(GNSSBlockFactoryTest, InstantiateFIRFilter) TEST(GNSSBlockFactoryTest, InstantiateFreqXlatingFIRFilter) { std::shared_ptr configuration = std::make_shared(); - std::shared_ptr> queue = gr::msg_queue::make(0); + std::shared_ptr> queue = std::make_shared>(); configuration->set_property("InputFilter.implementation", "Freq_Xlating_Fir_Filter"); @@ -158,7 +159,7 @@ TEST(GNSSBlockFactoryTest, InstantiateFreqXlatingFIRFilter) TEST(GNSSBlockFactoryTest, InstantiatePulseBlankingFilter) { std::shared_ptr configuration = std::make_shared(); - std::shared_ptr> queue = gr::msg_queue::make(0); + std::shared_ptr> queue = std::make_shared>(); configuration->set_property("InputFilter.implementation", "Pulse_Blanking_Filter"); std::unique_ptr factory; @@ -171,7 +172,7 @@ TEST(GNSSBlockFactoryTest, InstantiatePulseBlankingFilter) TEST(GNSSBlockFactoryTest, InstantiateNotchFilter) { std::shared_ptr configuration = std::make_shared(); - std::shared_ptr> queue = gr::msg_queue::make(0); + std::shared_ptr> queue = std::make_shared>(); configuration->set_property("InputFilter.implementation", "Notch_Filter"); std::unique_ptr factory; @@ -184,7 +185,7 @@ TEST(GNSSBlockFactoryTest, InstantiateNotchFilter) TEST(GNSSBlockFactoryTest, InstantiateNotchFilterLite) { std::shared_ptr configuration = std::make_shared(); - std::shared_ptr> queue = gr::msg_queue::make(0); + std::shared_ptr> queue = std::make_shared>(); configuration->set_property("InputFilter.implementation", "Notch_Filter_Lite"); std::unique_ptr factory; @@ -309,7 +310,7 @@ TEST(GNSSBlockFactoryTest, InstantiateChannels) configuration->set_property("Channel0.item_type", "gr_complex"); configuration->set_property("Acquisition_1C.implementation", "GPS_L1_CA_PCPS_Acquisition"); configuration->set_property("Channel1.item_type", "gr_complex"); - std::shared_ptr> queue = gr::msg_queue::make(0); + std::shared_ptr> queue = std::make_shared>(); std::unique_ptr factory; std::unique_ptr>> channels = factory->GetChannels(configuration, queue); EXPECT_EQ(static_cast(2), channels->size()); diff --git a/src/tests/unit-tests/control-plane/gnss_flowgraph_test.cc b/src/tests/unit-tests/control-plane/gnss_flowgraph_test.cc index 9d26e4477..56a7671d1 100644 --- a/src/tests/unit-tests/control-plane/gnss_flowgraph_test.cc +++ b/src/tests/unit-tests/control-plane/gnss_flowgraph_test.cc @@ -30,17 +30,17 @@ * ------------------------------------------------------------------------- */ +#include "gnss_flowgraph.h" #include "acquisition_interface.h" #include "channel.h" #include "channel_interface.h" +#include "concurrent_queue.h" #include "file_configuration.h" #include "file_signal_source.h" #include "gnss_block_interface.h" -#include "gnss_flowgraph.h" #include "in_memory_configuration.h" #include "pass_through.h" #include "tracking_interface.h" -#include "concurrent_queue.h" #include @@ -68,7 +68,7 @@ TEST(GNSSFlowgraph /*unused*/, InstantiateConnectStartStopOldNotation /*unused*/ config->set_property("Observables.implementation", "Hybrid_Observables"); config->set_property("PVT.implementation", "RTKLIB_PVT"); - std::shared_ptr flowgraph = std::make_shared(config, gr::msg_queue::make(0)); + std::shared_ptr flowgraph = std::make_shared(config, std::make_shared>()); EXPECT_NO_THROW(flowgraph->connect()); EXPECT_TRUE(flowgraph->connected()); @@ -103,7 +103,7 @@ TEST(GNSSFlowgraph /*unused*/, InstantiateConnectStartStop /*unused*/) config->set_property("Observables.implementation", "Hybrid_Observables"); config->set_property("PVT.implementation", "RTKLIB_PVT"); - std::shared_ptr flowgraph = std::make_shared(config, gr::msg_queue::make(0)); + std::shared_ptr flowgraph = std::make_shared(config, std::make_shared>()); EXPECT_NO_THROW(flowgraph->connect()); EXPECT_TRUE(flowgraph->connected()); @@ -137,7 +137,7 @@ TEST(GNSSFlowgraph /*unused*/, InstantiateConnectStartStopGalileoE1B /*unused*/) config->set_property("Observables.implementation", "Hybrid_Observables"); config->set_property("PVT.implementation", "RTKLIB_PVT"); - std::shared_ptr flowgraph = std::make_shared(config, gr::msg_queue::make(0)); + std::shared_ptr flowgraph = std::make_shared(config, std::make_shared>()); EXPECT_NO_THROW(flowgraph->connect()); EXPECT_TRUE(flowgraph->connected()); @@ -253,7 +253,7 @@ TEST(GNSSFlowgraph /*unused*/, InstantiateConnectStartStopHybrid /*unused*/) config->set_property("Observables.implementation", "Hybrid_Observables"); config->set_property("PVT.implementation", "RTKLIB_PVT"); - std::shared_ptr flowgraph = std::make_shared(config, gr::msg_queue::make(0)); + std::shared_ptr flowgraph = std::make_shared(config, std::make_shared>()); EXPECT_NO_THROW(flowgraph->connect()); EXPECT_TRUE(flowgraph->connected()); 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 be5a5016a..100d92897 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 @@ -51,6 +51,7 @@ #include #include #include +#include #include #include @@ -598,7 +599,7 @@ int AcquisitionPerformanceTest::run_receiver() boost::shared_ptr msg_rx = AcqPerfTest_msg_rx_make(channel_internal_queue); gr::blocks::skiphead::sptr skiphead = gr::blocks::skiphead::make(sizeof(gr_complex), FLAGS_acq_test_skiphead); - queue = gr::msg_queue::make(0); + queue = std::make_shared>(); gnss_synchro = Gnss_Synchro(); init(); diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b1i_pcps_acquisition_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b1i_pcps_acquisition_test.cc index e220e5792..6810bdcbf 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b1i_pcps_acquisition_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b1i_pcps_acquisition_test.cc @@ -31,9 +31,10 @@ */ +#include "beidou_b1i_pcps_acquisition.h" #include "Beidou_B1I.h" #include "acquisition_dump_reader.h" -#include "beidou_b1i_pcps_acquisition.h" +#include "concurrent_queue.h" #include "gnss_block_factory.h" #include "gnss_block_interface.h" #include "gnss_sdr_valve.h" @@ -46,9 +47,9 @@ #include #include #include -#include "concurrent_queue.h" #include #include +#include #include #include @@ -198,7 +199,7 @@ void BeidouB1iPcpsAcquisitionTest::plot_grid() std::vector *doppler = &acq_dump.doppler; std::vector *samples = &acq_dump.samples; - std::vector > *mag = &acq_dump.mag; + std::vector> *mag = &acq_dump.mag; const std::string gnuplot_executable(FLAGS_gnuplot_executable); if (gnuplot_executable.empty()) @@ -261,7 +262,7 @@ TEST_F(BeidouB1iPcpsAcquisitionTest, ConnectAndRun) int nsamples = 25000; std::chrono::time_point start, end; std::chrono::duration elapsed_seconds(0); - std::shared_ptr> queue = gr::msg_queue::make(0); + std::shared_ptr> queue = std::make_shared>();std::shared_ptr> top_block = gr::make_top_block("Acquisition test"); init(); diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b3i_pcps_acquisition_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b3i_pcps_acquisition_test.cc index d01343db0..6415b44cc 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b3i_pcps_acquisition_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b3i_pcps_acquisition_test.cc @@ -31,9 +31,10 @@ */ +#include "beidou_b3i_pcps_acquisition.h" #include "Beidou_B3I.h" #include "acquisition_dump_reader.h" -#include "beidou_b3i_pcps_acquisition.h" +#include "concurrent_queue.h" #include "gnss_block_factory.h" #include "gnss_block_interface.h" #include "gnss_sdr_valve.h" @@ -46,9 +47,9 @@ #include #include #include -#include "concurrent_queue.h" #include #include +#include #include #include @@ -197,7 +198,7 @@ void BeidouB3iPcpsAcquisitionTest::plot_grid() std::vector *doppler = &acq_dump.doppler; std::vector *samples = &acq_dump.samples; - std::vector > *mag = &acq_dump.mag; + std::vector> *mag = &acq_dump.mag; const std::string gnuplot_executable(FLAGS_gnuplot_executable); if (gnuplot_executable.empty()) @@ -260,7 +261,7 @@ TEST_F(BeidouB3iPcpsAcquisitionTest, ConnectAndRun) int nsamples = 50000; std::chrono::time_point start, end; std::chrono::duration elapsed_seconds(0); - std::shared_ptr> queue = gr::msg_queue::make(0); + std::shared_ptr> queue = std::make_shared>(); top_block = gr::make_top_block("Acquisition test"); init(); diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_8ms_ambiguous_acquisition_gsoc2013_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_8ms_ambiguous_acquisition_gsoc2013_test.cc index b63216526..37c8396e0 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_8ms_ambiguous_acquisition_gsoc2013_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_8ms_ambiguous_acquisition_gsoc2013_test.cc @@ -30,8 +30,9 @@ */ -#include "fir_filter.h" #include "galileo_e1_pcps_8ms_ambiguous_acquisition.h" +#include "concurrent_queue.h" +#include "fir_filter.h" #include "gen_signal_source.h" #include "gnss_block_interface.h" #include "gnss_sdr_valve.h" @@ -43,8 +44,8 @@ #include #include #include -#include "concurrent_queue.h" #include +#include #include #include #include @@ -433,7 +434,7 @@ TEST_F(GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test, ConnectAndRun) std::chrono::duration elapsed_seconds(0.0); config_1(); - queue = gr::msg_queue::make(0); + queue = std::make_shared>(); top_block = gr::make_top_block("Acquisition test"); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition_1B", "Galileo_E1_PCPS_8ms_Ambiguous_Acquisition", 1, 0); @@ -483,7 +484,7 @@ TEST_F(GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test, ConnectAndRun) TEST_F(GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test, ValidationOfResults) { config_1(); - queue = gr::msg_queue::make(0); + queue = std::make_shared>(); top_block = gr::make_top_block("Acquisition test"); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition_1B", "Galileo_E1_PCPS_8ms_Ambiguous_Acquisition", 1, 0, queue); @@ -572,7 +573,7 @@ TEST_F(GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test, ValidationOfResults) TEST_F(GalileoE1Pcps8msAmbiguousAcquisitionGSoC2013Test, ValidationOfResultsProbabilities) { config_2(); - queue = gr::msg_queue::make(0); + queue = std::make_shared>(); top_block = gr::make_top_block("Acquisition test"); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition_1B", "Galileo_E1_PCPS_8ms_Ambiguous_Acquisition", 1, 0); acquisition = std::dynamic_pointer_cast(acq_); diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_gsoc2013_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_gsoc2013_test.cc index ac9244bc2..fc90be2ed 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_gsoc2013_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_gsoc2013_test.cc @@ -31,8 +31,9 @@ */ -#include "fir_filter.h" #include "galileo_e1_pcps_ambiguous_acquisition.h" +#include "concurrent_queue.h" +#include "fir_filter.h" #include "gen_signal_source.h" #include "gnss_block_interface.h" #include "gnss_sdr_valve.h" @@ -43,7 +44,6 @@ #include #include #include -#include "concurrent_queue.h" #include #include #include @@ -435,7 +435,7 @@ TEST_F(GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test, ConnectAndRun) std::chrono::time_point start, end; std::chrono::duration elapsed_seconds(0); top_block = gr::make_top_block("Acquisition test"); - queue = gr::msg_queue::make(0); + queue = std::make_shared>(); config_1(); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition_1B", "Galileo_E1_PCPS_Ambiguous_Acquisition", 1, 0); @@ -466,7 +466,7 @@ TEST_F(GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test, ValidationOfResults) { config_1(); top_block = gr::make_top_block("Acquisition test"); - queue = gr::msg_queue::make(0); + queue = std::make_shared>(); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition_1B", "Galileo_E1_PCPS_Ambiguous_Acquisition", 1, 0); acquisition = std::dynamic_pointer_cast(acq_); boost::shared_ptr msg_rx = GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); @@ -551,7 +551,7 @@ TEST_F(GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test, ValidationOfResultsProbabi { config_2(); top_block = gr::make_top_block("Acquisition test"); - queue = gr::msg_queue::make(0); + queue = std::make_shared>(); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition_1B", "Galileo_E1_PCPS_Ambiguous_Acquisition", 1, 0); acquisition = std::dynamic_pointer_cast(acq_); boost::shared_ptr msg_rx = GalileoE1PcpsAmbiguousAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_gsoc_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_gsoc_test.cc index 8c0ad9381..850367401 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_gsoc_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_gsoc_test.cc @@ -42,6 +42,7 @@ #include "galileo_e1_pcps_ambiguous_acquisition.h" +#include "concurrent_queue.h" #include "gnss_block_factory.h" #include "gnss_block_interface.h" #include "gnss_sdr_valve.h" @@ -52,8 +53,8 @@ #include #include #include -#include "concurrent_queue.h" #include +#include #include #include #ifdef GR_GREATER_38 @@ -217,7 +218,7 @@ TEST_F(GalileoE1PcpsAmbiguousAcquisitionGSoCTest, ConnectAndRun) int nsamples = 4 * fs_in; std::chrono::time_point start, end; std::chrono::duration elapsed_seconds(0); - queue = gr::msg_queue::make(0); + queue = std::make_shared>(); top_block = gr::make_top_block("Acquisition test"); init(); @@ -248,7 +249,7 @@ TEST_F(GalileoE1PcpsAmbiguousAcquisitionGSoCTest, ValidationOfResults) { std::chrono::time_point start, end; std::chrono::duration elapsed_seconds(0); - queue = gr::msg_queue::make(0); + queue = std::make_shared>(); top_block = gr::make_top_block("Acquisition test"); init(); diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_test.cc index f105841f4..7b4815f34 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_ambiguous_acquisition_test.cc @@ -31,9 +31,10 @@ */ +#include "galileo_e1_pcps_ambiguous_acquisition.h" #include "Galileo_E1.h" #include "acquisition_dump_reader.h" -#include "galileo_e1_pcps_ambiguous_acquisition.h" +#include "concurrent_queue.h" #include "gnss_block_factory.h" #include "gnss_block_interface.h" #include "gnss_sdr_valve.h" @@ -47,9 +48,9 @@ #include #include #include -#include "concurrent_queue.h" #include #include +#include #include #include @@ -200,7 +201,7 @@ void GalileoE1PcpsAmbiguousAcquisitionTest::plot_grid() std::vector* doppler = &acq_dump.doppler; std::vector* samples = &acq_dump.samples; - std::vector >* mag = &acq_dump.mag; + std::vector>* mag = &acq_dump.mag; const std::string gnuplot_executable(FLAGS_gnuplot_executable); if (gnuplot_executable.empty()) @@ -265,7 +266,7 @@ TEST_F(GalileoE1PcpsAmbiguousAcquisitionTest, ConnectAndRun) std::chrono::time_point start, end; std::chrono::duration elapsed_seconds(0); top_block = gr::make_top_block("Acquisition test"); - std::shared_ptr> queue = gr::msg_queue::make(0); + std::shared_ptr> queue = std::make_shared>(); init(); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition_1B", "Galileo_E1_PCPS_Ambiguous_Acquisition", 1, 0); std::shared_ptr acquisition = std::dynamic_pointer_cast(acq_); diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_cccwsr_ambiguous_acquisition_gsoc2013_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_cccwsr_ambiguous_acquisition_gsoc2013_test.cc index f757b3edd..d69972648 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_cccwsr_ambiguous_acquisition_gsoc2013_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_cccwsr_ambiguous_acquisition_gsoc2013_test.cc @@ -31,8 +31,9 @@ */ -#include "fir_filter.h" #include "galileo_e1_pcps_cccwsr_ambiguous_acquisition.h" +#include "concurrent_queue.h" +#include "fir_filter.h" #include "gen_signal_source.h" #include "gnss_block_interface.h" #include "gnss_sdr_valve.h" @@ -44,8 +45,8 @@ #include #include #include -#include "concurrent_queue.h" #include +#include #include #include #include @@ -438,7 +439,7 @@ TEST_F(GalileoE1PcpsCccwsrAmbiguousAcquisitionTest, ConnectAndRun) config_1(); top_block = gr::make_top_block("Acquisition test"); - queue = gr::msg_queue::make(0); + queue = std::make_shared>(); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition_1B", "Galileo_E1_PCPS_CCCWSR_Ambiguous_Acquisition", 1, 0); acquisition = std::dynamic_pointer_cast(acq_); @@ -468,7 +469,7 @@ TEST_F(GalileoE1PcpsCccwsrAmbiguousAcquisitionTest, ValidationOfResults) { config_1(); top_block = gr::make_top_block("Acquisition test"); - queue = gr::msg_queue::make(0); + queue = std::make_shared>(); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition_1B", "Galileo_E1_PCPS_CCCWSR_Ambiguous_Acquisition", 1, 0); acquisition = std::dynamic_pointer_cast(acq_); boost::shared_ptr msg_rx = GalileoE1PcpsCccwsrAmbiguousAcquisitionTest_msg_rx_make(channel_internal_queue); @@ -561,7 +562,7 @@ TEST_F(GalileoE1PcpsCccwsrAmbiguousAcquisitionTest, ValidationOfResultsProbabili { config_2(); top_block = gr::make_top_block("Acquisition test"); - queue = gr::msg_queue::make(0); + queue = std::make_shared>(); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition_1B", "Galileo_E1_PCPS_CCCWSR_Ambiguous_Acquisition", 1, 0); acquisition = std::dynamic_pointer_cast(acq_); boost::shared_ptr msg_rx = GalileoE1PcpsCccwsrAmbiguousAcquisitionTest_msg_rx_make(channel_internal_queue); diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_quicksync_ambiguous_acquisition_gsoc2014_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_quicksync_ambiguous_acquisition_gsoc2014_test.cc index dc4058ea8..45287515c 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_quicksync_ambiguous_acquisition_gsoc2014_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_quicksync_ambiguous_acquisition_gsoc2014_test.cc @@ -31,8 +31,8 @@ */ -#include "fir_filter.h" #include "galileo_e1_pcps_quicksync_ambiguous_acquisition.h" +#include "fir_filter.h" #include "gen_signal_source.h" #include "gnss_block_interface.h" #include "gnss_sdr_valve.h" @@ -46,6 +46,7 @@ #include #include #include +#include #include #include #include @@ -560,7 +561,7 @@ TEST_F(GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test, ConnectAndRun) std::chrono::time_point begin, end; std::chrono::duration elapsed_seconds(0); top_block = gr::make_top_block("Acquisition test"); - queue = gr::msg_queue::make(0); + queue = std::make_shared>(); config_1(); @@ -597,7 +598,7 @@ TEST_F(GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test, ValidationOfResul LOG(INFO) << "Start validation of results test"; config_1(); top_block = gr::make_top_block("Acquisition test"); - queue = gr::msg_queue::make(0); + queue = std::make_shared>(); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition_1B", "Galileo_E1_PCPS_QuickSync_Ambiguous_Acquisition", 1, 0); acquisition = std::dynamic_pointer_cast(acq_); @@ -688,7 +689,7 @@ TEST_F(GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test, ValidationOfResul LOG(INFO) << "Start validation of results with noise+interference test"; config_3(); top_block = gr::make_top_block("Acquisition test"); - queue = gr::msg_queue::make(0); + queue = std::make_shared>(); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition_1B", "Galileo_E1_PCPS_QuickSync_Ambiguous_Acquisition", 1, 0); acquisition = std::dynamic_pointer_cast(acq_); @@ -776,7 +777,7 @@ TEST_F(GalileoE1PcpsQuickSyncAmbiguousAcquisitionGSoC2014Test, ValidationOfResul { config_2(); top_block = gr::make_top_block("Acquisition test"); - queue = gr::msg_queue::make(0); + queue = std::make_shared>(); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition_1B", "Galileo_E1_PCPS_QuickSync_Ambiguous_Acquisition", 1, 0); acquisition = std::dynamic_pointer_cast(acq_); diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_tong_ambiguous_acquisition_gsoc2013_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_tong_ambiguous_acquisition_gsoc2013_test.cc index a9af18c8b..d7c414fcf 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_tong_ambiguous_acquisition_gsoc2013_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e1_pcps_tong_ambiguous_acquisition_gsoc2013_test.cc @@ -30,9 +30,10 @@ * ------------------------------------------------------------------------- */ +#include "galileo_e1_pcps_tong_ambiguous_acquisition.h" +#include "concurrent_queue.h" #include "configuration_interface.h" #include "fir_filter.h" -#include "galileo_e1_pcps_tong_ambiguous_acquisition.h" #include "gen_signal_source.h" #include "gnss_block_interface.h" #include "gnss_sdr_valve.h" @@ -44,9 +45,9 @@ #include #include #include -#include "concurrent_queue.h" #include #include +#include #include #include #include @@ -438,7 +439,7 @@ TEST_F(GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test, ConnectAndRun) std::chrono::time_point start, end; std::chrono::duration elapsed_seconds(0.0); top_block = gr::make_top_block("Acquisition test"); - queue = gr::msg_queue::make(0); + queue = std::make_shared>(); config_1(); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition_1B", "Galileo_E1_PCPS_Tong_Ambiguous_Acquisition", 1, 0); acquisition = std::dynamic_pointer_cast(acq_); @@ -466,7 +467,7 @@ TEST_F(GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test, ValidationOfResults) { config_1(); top_block = gr::make_top_block("Acquisition test"); - queue = gr::msg_queue::make(0); + queue = std::make_shared>(); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition_1B", "Galileo_E1_PCPS_Tong_Ambiguous_Acquisition", 1, 0); acquisition = std::dynamic_pointer_cast(acq_); boost::shared_ptr msg_rx = GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); @@ -555,7 +556,7 @@ TEST_F(GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test, ValidationOfResultsPro { config_2(); top_block = gr::make_top_block("Acquisition test"); - queue = gr::msg_queue::make(0); + queue = std::make_shared>(); std::shared_ptr acq_ = factory->GetBlock(config, "Acquisition_1B", "Galileo_E1_PCPS_Tong_Ambiguous_Acquisition", 1, 0); acquisition = std::dynamic_pointer_cast(acq_); boost::shared_ptr msg_rx = GalileoE1PcpsTongAmbiguousAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e5a_pcps_acquisition_gsoc2014_gensource_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e5a_pcps_acquisition_gsoc2014_gensource_test.cc index 671350e1b..cdf5ca0c0 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e5a_pcps_acquisition_gsoc2014_gensource_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/galileo_e5a_pcps_acquisition_gsoc2014_gensource_test.cc @@ -29,6 +29,7 @@ * ------------------------------------------------------------------------- */ +#include "concurrent_queue.h" #include "fir_filter.h" #include "galileo_e5a_noncoherent_iq_acquisition_caf.h" #include "gen_signal_source.h" @@ -42,8 +43,8 @@ #include #include #include -#include "concurrent_queue.h" #include +#include #include #include #ifdef GR_GREATER_38 @@ -540,7 +541,7 @@ TEST_F(GalileoE5aPcpsAcquisitionGSoC2014GensourceTest, ConnectAndRun) std::chrono::duration elapsed_seconds(0); acquisition = std::make_shared(config.get(), "Acquisition_5X", 1, 0); boost::shared_ptr msg_rx = GalileoE5aPcpsAcquisitionGSoC2014GensourceTest_msg_rx_make(channel_internal_queue); - queue = gr::msg_queue::make(0); + queue = std::make_shared>(); top_block = gr::make_top_block("Acquisition test"); ASSERT_NO_THROW({ @@ -566,7 +567,7 @@ TEST_F(GalileoE5aPcpsAcquisitionGSoC2014GensourceTest, ConnectAndRun) TEST_F(GalileoE5aPcpsAcquisitionGSoC2014GensourceTest, ValidationOfSIM) { config_1(); - queue = gr::msg_queue::make(0); + queue = std::make_shared>(); top_block = gr::make_top_block("Acquisition test"); acquisition = std::make_shared(config.get(), "Acquisition_5X", 1, 0); boost::shared_ptr msg_rx = GalileoE5aPcpsAcquisitionGSoC2014GensourceTest_msg_rx_make(channel_internal_queue); diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l1_ca_pcps_acquisition_gsoc2017_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l1_ca_pcps_acquisition_gsoc2017_test.cc index 8192a3408..6972e356b 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l1_ca_pcps_acquisition_gsoc2017_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l1_ca_pcps_acquisition_gsoc2017_test.cc @@ -31,10 +31,11 @@ */ +#include "glonass_l1_ca_pcps_acquisition.h" +#include "concurrent_queue.h" #include "configuration_interface.h" #include "freq_xlating_fir_filter.h" #include "gen_signal_source.h" -#include "glonass_l1_ca_pcps_acquisition.h" #include "gnss_block_interface.h" #include "gnss_sdr_valve.h" #include "gnss_synchro.h" @@ -46,9 +47,9 @@ #include #include #include -#include "concurrent_queue.h" #include #include +#include #include #include #include @@ -442,7 +443,7 @@ TEST_F(GlonassL1CaPcpsAcquisitionGSoC2017Test, ConnectAndRun) int nsamples = floor(fs_in * integration_time_ms * 1e-3); std::chrono::time_point begin, end; std::chrono::duration elapsed_seconds(0); - queue = gr::msg_queue::make(0); + queue = std::make_shared>(); top_block = gr::make_top_block("Acquisition test"); config_1(); @@ -474,7 +475,7 @@ TEST_F(GlonassL1CaPcpsAcquisitionGSoC2017Test, ConnectAndRun) TEST_F(GlonassL1CaPcpsAcquisitionGSoC2017Test, ValidationOfResults) { config_1(); - queue = gr::msg_queue::make(0); + queue = std::make_shared>(); top_block = gr::make_top_block("Acquisition test"); acquisition = new GlonassL1CaPcpsAcquisition(config.get(), "Acquisition", 1, 0); @@ -563,7 +564,7 @@ TEST_F(GlonassL1CaPcpsAcquisitionGSoC2017Test, ValidationOfResults) TEST_F(GlonassL1CaPcpsAcquisitionGSoC2017Test, ValidationOfResultsProbabilities) { config_2(); - queue = gr::msg_queue::make(0); + queue = std::make_shared>(); top_block = gr::make_top_block("Acquisition test"); acquisition = new GlonassL1CaPcpsAcquisition(config.get(), "Acquisition", 1, 0); boost::shared_ptr msg_rx = GlonassL1CaPcpsAcquisitionGSoC2017Test_msg_rx_make(channel_internal_queue); diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l1_ca_pcps_acquisition_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l1_ca_pcps_acquisition_test.cc index cdaa14cde..e339018a4 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l1_ca_pcps_acquisition_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l1_ca_pcps_acquisition_test.cc @@ -30,8 +30,9 @@ * ------------------------------------------------------------------------- */ -#include "freq_xlating_fir_filter.h" #include "glonass_l1_ca_pcps_acquisition.h" +#include "concurrent_queue.h" +#include "freq_xlating_fir_filter.h" #include "gnss_block_factory.h" #include "gnss_block_interface.h" #include "gnss_sdr_valve.h" @@ -41,9 +42,9 @@ #include #include #include -#include "concurrent_queue.h" #include #include +#include #include #include #include @@ -184,7 +185,7 @@ TEST_F(GlonassL1CaPcpsAcquisitionTest, ConnectAndRun) int nsamples = 62314; std::chrono::time_point begin, end; std::chrono::duration elapsed_seconds(0); - std::shared_ptr> queue = gr::msg_queue::make(0); + std::shared_ptr> queue = std::make_shared>(); top_block = gr::make_top_block("Acquisition test"); init(); diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l2_ca_pcps_acquisition_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l2_ca_pcps_acquisition_test.cc index 3cb98fe03..492e4196a 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l2_ca_pcps_acquisition_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l2_ca_pcps_acquisition_test.cc @@ -30,10 +30,11 @@ */ +#include "glonass_l2_ca_pcps_acquisition.h" +#include "concurrent_queue.h" #include "configuration_interface.h" #include "fir_filter.h" #include "gen_signal_source.h" -#include "glonass_l2_ca_pcps_acquisition.h" #include "gnss_block_interface.h" #include "gnss_sdr_valve.h" #include "gnss_synchro.h" @@ -45,9 +46,9 @@ #include #include #include -#include "concurrent_queue.h" #include #include +#include #include #include #ifdef GR_GREATER_38 @@ -440,7 +441,7 @@ TEST_F(GlonassL2CaPcpsAcquisitionTest, ConnectAndRun) int nsamples = floor(fs_in * integration_time_ms * 1e-3); std::chrono::time_point begin, end; std::chrono::duration elapsed_seconds(0); - queue = gr::msg_queue::make(0); + queue = std::make_shared>(); top_block = gr::make_top_block("Acquisition test"); config_1(); @@ -472,7 +473,7 @@ TEST_F(GlonassL2CaPcpsAcquisitionTest, ConnectAndRun) TEST_F(GlonassL2CaPcpsAcquisitionTest, ValidationOfResults) { config_1(); - queue = gr::msg_queue::make(0); + queue = std::make_shared>(); top_block = gr::make_top_block("Acquisition test"); acquisition = new GlonassL2CaPcpsAcquisition(config.get(), "Acquisition_2G", 1, 0); @@ -562,7 +563,7 @@ TEST_F(GlonassL2CaPcpsAcquisitionTest, ValidationOfResults) TEST_F(GlonassL2CaPcpsAcquisitionTest, ValidationOfResultsProbabilities) { config_2(); - queue = gr::msg_queue::make(0); + queue = std::make_shared>(); top_block = gr::make_top_block("Acquisition test"); acquisition = new GlonassL2CaPcpsAcquisition(config.get(), "Acquisition_2G", 1, 0); boost::shared_ptr msg_rx = GlonassL2CaPcpsAcquisitionTest_msg_rx_make(channel_internal_queue); diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_gsoc2013_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_gsoc2013_test.cc index ecb757d87..b6223065b 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_gsoc2013_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_gsoc2013_test.cc @@ -31,13 +31,14 @@ */ +#include "gps_l1_ca_pcps_acquisition.h" +#include "concurrent_queue.h" #include "configuration_interface.h" #include "fir_filter.h" #include "gen_signal_source.h" #include "gnss_block_interface.h" #include "gnss_sdr_valve.h" #include "gnss_synchro.h" -#include "gps_l1_ca_pcps_acquisition.h" #include "in_memory_configuration.h" #include "pass_through.h" #include "signal_generator.h" @@ -46,9 +47,9 @@ #include #include #include -#include "concurrent_queue.h" #include #include +#include #include #include #include @@ -435,7 +436,7 @@ TEST_F(GpsL1CaPcpsAcquisitionGSoC2013Test, ConnectAndRun) int nsamples = floor(fs_in * integration_time_ms * 1e-3); std::chrono::time_point start, end; std::chrono::duration elapsed_seconds(0); - queue = gr::msg_queue::make(0); + queue = std::make_shared>(); top_block = gr::make_top_block("Acquisition test"); config_1(); @@ -467,7 +468,7 @@ TEST_F(GpsL1CaPcpsAcquisitionGSoC2013Test, ConnectAndRun) TEST_F(GpsL1CaPcpsAcquisitionGSoC2013Test, ValidationOfResults) { config_1(); - queue = gr::msg_queue::make(0); + queue = std::make_shared>(); top_block = gr::make_top_block("Acquisition test"); acquisition = new GpsL1CaPcpsAcquisition(config.get(), "Acquisition_1C", 1, 0); @@ -557,7 +558,7 @@ TEST_F(GpsL1CaPcpsAcquisitionGSoC2013Test, ValidationOfResults) TEST_F(GpsL1CaPcpsAcquisitionGSoC2013Test, ValidationOfResultsProbabilities) { config_2(); - queue = gr::msg_queue::make(0); + queue = std::make_shared>(); top_block = gr::make_top_block("Acquisition test"); acquisition = new GpsL1CaPcpsAcquisition(config.get(), "Acquisition_1C", 1, 0); boost::shared_ptr msg_rx = GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_test.cc index 3134eb558..2066297ad 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_test.cc @@ -262,7 +262,7 @@ TEST_F(GpsL1CaPcpsAcquisitionTest, ConnectAndRun) int nsamples = 4000; std::chrono::time_point start, end; std::chrono::duration elapsed_seconds(0); - std::shared_ptr> queue = gr::msg_queue::make(0); + std::shared_ptr> queue = std::shared_ptr>(); top_block = gr::make_top_block("Acquisition test"); init(); diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_opencl_acquisition_gsoc2013_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_opencl_acquisition_gsoc2013_test.cc index f20f491d9..b6903cbec 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_opencl_acquisition_gsoc2013_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_opencl_acquisition_gsoc2013_test.cc @@ -118,7 +118,7 @@ class GpsL1CaPcpsOpenClAcquisitionGSoC2013Test : public ::testing::Test protected: GpsL1CaPcpsOpenClAcquisitionGSoC2013Test() { - queue = gr::msg_queue::make(0); + queue = std::shared_ptr>(); top_block = gr::make_top_block("Acquisition test"); item_size = sizeof(gr_complex); stop = false; diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_quicksync_acquisition_gsoc2014_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_quicksync_acquisition_gsoc2014_test.cc index c8c1847d3..5f3e547ea 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_quicksync_acquisition_gsoc2014_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_quicksync_acquisition_gsoc2014_test.cc @@ -545,7 +545,7 @@ TEST_F(GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test, ConnectAndRun) std::chrono::time_point start, end; std::chrono::duration elapsed_seconds(0.0); top_block = gr::make_top_block("Acquisition test"); - queue = gr::msg_queue::make(0); + queue = std::shared_ptr>(); boost::shared_ptr msg_rx = GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); config_1(); @@ -575,7 +575,7 @@ TEST_F(GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test, ValidationOfResults) { config_1(); top_block = gr::make_top_block("Acquisition test"); - queue = gr::msg_queue::make(0); + queue = std::shared_ptr>(); acquisition = std::make_shared(config.get(), "Acquisition_1C", 1, 0); boost::shared_ptr msg_rx = GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); @@ -669,7 +669,7 @@ TEST_F(GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test, ValidationOfResultsWithNoise //config_3(); config_1(); top_block = gr::make_top_block("Acquisition test"); - queue = gr::msg_queue::make(0); + queue = std::shared_ptr>(); acquisition = std::make_shared(config.get(), "Acquisition_1C", 1, 0); boost::shared_ptr msg_rx = GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); @@ -760,7 +760,7 @@ TEST_F(GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test, ValidationOfResultsProbabili { config_2(); top_block = gr::make_top_block("Acquisition test"); - queue = gr::msg_queue::make(0); + queue = std::shared_ptr>(); acquisition = std::make_shared(config.get(), "Acquisition_1C", 1, 0); boost::shared_ptr msg_rx = GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_tong_acquisition_gsoc2013_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_tong_acquisition_gsoc2013_test.cc index b65748a81..8b7714dab 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_tong_acquisition_gsoc2013_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_tong_acquisition_gsoc2013_test.cc @@ -431,7 +431,7 @@ TEST_F(GpsL1CaPcpsTongAcquisitionGSoC2013Test, ConnectAndRun) std::chrono::time_point start, end; std::chrono::duration elapsed_seconds(0); top_block = gr::make_top_block("Acquisition test"); - queue = gr::msg_queue::make(0); + queue = std::shared_ptr>(); config_1(); acquisition = std::make_shared(config.get(), "Acquisition_1C", 1, 0); @@ -461,7 +461,7 @@ TEST_F(GpsL1CaPcpsTongAcquisitionGSoC2013Test, ValidationOfResults) { config_1(); top_block = gr::make_top_block("Acquisition test"); - queue = gr::msg_queue::make(0); + queue = std::shared_ptr>(); acquisition = std::make_shared(config.get(), "Acquisition_1C", 1, 0); boost::shared_ptr msg_rx = GpsL1CaPcpsTongAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); @@ -550,7 +550,7 @@ TEST_F(GpsL1CaPcpsTongAcquisitionGSoC2013Test, ValidationOfResultsProbabilities) { config_2(); top_block = gr::make_top_block("Acquisition test"); - queue = gr::msg_queue::make(0); + queue = std::shared_ptr>(); acquisition = std::make_shared(config.get(), "Acquisition_1C", 1, 0); boost::shared_ptr msg_rx = GpsL1CaPcpsTongAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l2_m_pcps_acquisition_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l2_m_pcps_acquisition_test.cc index 2541d7f75..97525ceac 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l2_m_pcps_acquisition_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l2_m_pcps_acquisition_test.cc @@ -255,7 +255,7 @@ void GpsL2MPcpsAcquisitionTest::plot_grid() TEST_F(GpsL2MPcpsAcquisitionTest, Instantiate) { init(); - queue = gr::msg_queue::make(0); + queue = std::shared_ptr>(); std::shared_ptr acquisition = std::make_shared(config.get(), "Acquisition_2S", 1, 0); } @@ -265,7 +265,7 @@ TEST_F(GpsL2MPcpsAcquisitionTest, ConnectAndRun) std::chrono::time_point start, end; std::chrono::duration elapsed_seconds(0); top_block = gr::make_top_block("Acquisition test"); - queue = gr::msg_queue::make(0); + queue = std::shared_ptr>(); init(); std::shared_ptr acquisition = std::make_shared(config.get(), "Acquisition_2S", 1, 0); @@ -295,7 +295,7 @@ TEST_F(GpsL2MPcpsAcquisitionTest, ValidationOfResults) std::chrono::time_point start, end; std::chrono::duration elapsed_seconds(0); top_block = gr::make_top_block("Acquisition test"); - queue = gr::msg_queue::make(0); + queue = std::shared_ptr>(); double expected_delay_samples = 1; //2004; double expected_doppler_hz = 1200; //3000; diff --git a/src/tests/unit-tests/signal-processing-blocks/filter/fir_filter_test.cc b/src/tests/unit-tests/signal-processing-blocks/filter/fir_filter_test.cc index a662020d5..714961259 100644 --- a/src/tests/unit-tests/signal-processing-blocks/filter/fir_filter_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/filter/fir_filter_test.cc @@ -39,6 +39,7 @@ #else #include #endif +#include "concurrent_queue.h" #include "file_signal_source.h" #include "fir_filter.h" #include "gnss_block_factory.h" @@ -48,7 +49,6 @@ #include "interleaved_byte_to_complex_byte.h" #include "interleaved_short_to_complex_short.h" #include -#include "concurrent_queue.h" #include @@ -59,7 +59,7 @@ class FirFilterTest : public ::testing::Test protected: FirFilterTest() { - queue = gr::msg_queue::make(0); + queue = std::shared_ptr>(); item_size = sizeof(gr_complex); config = std::make_shared(); } @@ -70,7 +70,7 @@ protected: void configure_cbyte_gr_complex(); void configure_gr_complex_gr_complex(); void configure_cshort_cshort(); - boost::shared_ptr queue; + std::shared_ptr> queue; gr::top_block_sptr top_block; std::shared_ptr config; size_t item_size; diff --git a/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_lite_test.cc b/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_lite_test.cc index 8743a11be..2189efde2 100644 --- a/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_lite_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_lite_test.cc @@ -39,6 +39,7 @@ #else #include #endif +#include "concurrent_queue.h" #include "file_signal_source.h" #include "gnss_block_factory.h" #include "gnss_block_interface.h" @@ -46,7 +47,6 @@ #include "in_memory_configuration.h" #include "notch_filter_lite.h" #include -#include "concurrent_queue.h" #include @@ -57,7 +57,7 @@ class NotchFilterLiteTest : public ::testing::Test protected: NotchFilterLiteTest() { - queue = gr::msg_queue::make(0); + queue = std::shared_ptr>(); item_size = sizeof(gr_complex); config = std::make_shared(); nsamples = FLAGS_notch_filter_lite_test_nsamples; @@ -66,7 +66,7 @@ protected: void init(); void configure_gr_complex_gr_complex(); - boost::shared_ptr queue; + std::shared_ptr> queue; gr::top_block_sptr top_block; std::shared_ptr config; size_t item_size; diff --git a/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_test.cc b/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_test.cc index 4b44af6d6..639ad27a7 100644 --- a/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_test.cc @@ -39,6 +39,7 @@ #else #include #endif +#include "concurrent_queue.h" #include "file_signal_source.h" #include "gnss_block_factory.h" #include "gnss_block_interface.h" @@ -46,7 +47,6 @@ #include "in_memory_configuration.h" #include "notch_filter.h" #include -#include "concurrent_queue.h" #include @@ -57,7 +57,7 @@ class NotchFilterTest : public ::testing::Test protected: NotchFilterTest() { - queue = gr::msg_queue::make(0); + queue = std::shared_ptr>(); item_size = sizeof(gr_complex); config = std::make_shared(); nsamples = FLAGS_notch_filter_test_nsamples; @@ -66,7 +66,7 @@ protected: void init(); void configure_gr_complex_gr_complex(); - boost::shared_ptr queue; + std::shared_ptr> queue; gr::top_block_sptr top_block; std::shared_ptr config; size_t item_size; diff --git a/src/tests/unit-tests/signal-processing-blocks/filter/pulse_blanking_filter_test.cc b/src/tests/unit-tests/signal-processing-blocks/filter/pulse_blanking_filter_test.cc index 56aa82fd5..551d7a1cc 100644 --- a/src/tests/unit-tests/signal-processing-blocks/filter/pulse_blanking_filter_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/filter/pulse_blanking_filter_test.cc @@ -39,6 +39,7 @@ #else #include #endif +#include "concurrent_queue.h" #include "file_signal_source.h" #include "gnss_block_factory.h" #include "gnss_block_interface.h" @@ -46,7 +47,6 @@ #include "in_memory_configuration.h" #include "pulse_blanking_filter.h" #include -#include "concurrent_queue.h" #include @@ -57,7 +57,7 @@ class PulseBlankingFilterTest : public ::testing::Test protected: PulseBlankingFilterTest() { - queue = gr::msg_queue::make(0); + queue = std::shared_ptr>(); item_size = sizeof(gr_complex); config = std::make_shared(); nsamples = FLAGS_pb_filter_test_nsamples; @@ -66,7 +66,7 @@ protected: void init(); void configure_gr_complex_gr_complex(); - boost::shared_ptr queue; + std::shared_ptr> queue; gr::top_block_sptr top_block; std::shared_ptr config; size_t item_size; diff --git a/src/tests/unit-tests/signal-processing-blocks/resampler/direct_resampler_conditioner_cc_test.cc b/src/tests/unit-tests/signal-processing-blocks/resampler/direct_resampler_conditioner_cc_test.cc index 553637df8..983bbf4eb 100644 --- a/src/tests/unit-tests/signal-processing-blocks/resampler/direct_resampler_conditioner_cc_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/resampler/direct_resampler_conditioner_cc_test.cc @@ -52,7 +52,7 @@ TEST(DirectResamplerConditionerCcTest, InstantiationAndRunTest) std::chrono::time_point start, end; std::chrono::duration elapsed_seconds(0); int nsamples = 1000000; //Number of samples to be computed - std::shared_ptr> queue = gr::msg_queue::make(0); + std::shared_ptr> queue = std::shared_ptr>(); gr::top_block_sptr top_block = gr::make_top_block("direct_resampler_conditioner_cc_test"); boost::shared_ptr source = gr::analog::sig_source_c::make(fs_in, gr::analog::GR_SIN_WAVE, 1000.0, 1.0, gr_complex(0.0)); boost::shared_ptr valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue); diff --git a/src/tests/unit-tests/signal-processing-blocks/resampler/mmse_resampler_test.cc b/src/tests/unit-tests/signal-processing-blocks/resampler/mmse_resampler_test.cc index 571230f03..df3e12a10 100644 --- a/src/tests/unit-tests/signal-processing-blocks/resampler/mmse_resampler_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/resampler/mmse_resampler_test.cc @@ -49,7 +49,7 @@ TEST(MmseResamplerTest, InstantiationAndRunTestWarning) std::chrono::time_point start, end; std::chrono::duration elapsed_seconds(0); int nsamples = 1000000; //Number of samples to be computed - std::shared_ptr> queue = gr::msg_queue::make(0); + std::shared_ptr> queue = std::shared_ptr>(); gr::top_block_sptr top_block = gr::make_top_block("mmse_resampler_conditioner_cc_test"); boost::shared_ptr source = gr::analog::sig_source_c::make(fs_in, gr::analog::GR_SIN_WAVE, 1000.0, 1.0, gr_complex(0.0)); boost::shared_ptr valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue); @@ -90,7 +90,7 @@ TEST(MmseResamplerTest, InstantiationAndRunTest2) std::chrono::time_point start, end; std::chrono::duration elapsed_seconds(0); int nsamples = 1000000; //Number of samples to be computed - std::shared_ptr> queue = gr::msg_queue::make(0); + std::shared_ptr> queue = std::shared_ptr>(); gr::top_block_sptr top_block = gr::make_top_block("mmse_resampler_conditioner_cc_test"); boost::shared_ptr source = gr::analog::sig_source_c::make(fs_in, gr::analog::GR_SIN_WAVE, 1000.0, 1.0, gr_complex(0.0)); boost::shared_ptr valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue); diff --git a/src/tests/unit-tests/signal-processing-blocks/sources/file_signal_source_test.cc b/src/tests/unit-tests/signal-processing-blocks/sources/file_signal_source_test.cc index bc7eb5acb..5a6e75bef 100644 --- a/src/tests/unit-tests/signal-processing-blocks/sources/file_signal_source_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/sources/file_signal_source_test.cc @@ -30,15 +30,15 @@ */ #include "file_signal_source.h" -#include "in_memory_configuration.h" #include "concurrent_queue.h" +#include "in_memory_configuration.h" #include #include #include TEST(FileSignalSource, Instantiate) { - boost::shared_ptr queue = gr::msg_queue::make(0); + std::shared_ptr> queue = std::shared_ptr>(); std::shared_ptr config = std::make_shared(); config->set_property("Test.samples", "0"); @@ -57,7 +57,7 @@ TEST(FileSignalSource, Instantiate) TEST(FileSignalSource, InstantiateFileNotExists) { - boost::shared_ptr queue = gr::msg_queue::make(0); + std::shared_ptr> queue = std::shared_ptr>(); std::shared_ptr config = std::make_shared(); config->set_property("Test.samples", "0"); diff --git a/src/tests/unit-tests/signal-processing-blocks/sources/gnss_sdr_valve_test.cc b/src/tests/unit-tests/signal-processing-blocks/sources/gnss_sdr_valve_test.cc index 4c460b63f..80f573eb1 100644 --- a/src/tests/unit-tests/signal-processing-blocks/sources/gnss_sdr_valve_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/sources/gnss_sdr_valve_test.cc @@ -38,13 +38,14 @@ #else #include #endif +#include "concurrent_queue.h" #include "gnss_sdr_valve.h" #include -#include "concurrent_queue.h" +#include TEST(ValveTest, CheckEventSentAfter100Samples) { - std::shared_ptr> queue = gr::msg_queue::make(0); + std::shared_ptr> queue = std::shared_ptr>(); gr::top_block_sptr top_block = gr::make_top_block("gnss_sdr_valve_test"); @@ -52,8 +53,9 @@ TEST(ValveTest, CheckEventSentAfter100Samples) boost::shared_ptr valve = gnss_sdr_make_valve(sizeof(float), 100, queue); gr::blocks::null_sink::sptr sink = gr::blocks::null_sink::make(sizeof(float)); - unsigned int expected0 = 0; - EXPECT_EQ(expected0, queue->count()); + bool expected0 = false; + pmt::pmt_t msg; + EXPECT_EQ(expected0, queue->timed_wait_and_pop(msg, 100)); top_block->connect(source, 0, valve, 0); top_block->connect(valve, 0, sink, 0); @@ -61,6 +63,6 @@ TEST(ValveTest, CheckEventSentAfter100Samples) top_block->run(); top_block->stop(); - unsigned int expected1 = 1; - EXPECT_EQ(expected1, queue->count()); + bool expected1 = true; + EXPECT_EQ(expected1, queue->timed_wait_and_pop(msg, 100)); } diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e1_dll_pll_veml_tracking_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e1_dll_pll_veml_tracking_test.cc index bf78395bf..3bb3dc999 100644 --- a/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e1_dll_pll_veml_tracking_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e1_dll_pll_veml_tracking_test.cc @@ -114,7 +114,7 @@ TEST_F(GalileoE1DllPllVemlTrackingInternalTest, ConnectAndRun) std::chrono::time_point start, end; std::chrono::duration elapsed_seconds(0); init(); - queue = gr::msg_queue::make(0); + queue = std::shared_ptr>(); top_block = gr::make_top_block("Tracking test"); // Example using smart pointers and the block factory @@ -161,7 +161,7 @@ TEST_F(GalileoE1DllPllVemlTrackingInternalTest, ValidationOfResults) int num_samples = 80000000; // 8 Msps unsigned int skiphead_sps = 8000000; // 8 Msps init(); - queue = gr::msg_queue::make(0); + queue = std::shared_ptr>(); top_block = gr::make_top_block("Tracking test"); // Example using smart pointers and the block factory diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e5a_tracking_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e5a_tracking_test.cc index 6c4b8e0ef..c94ce3557 100644 --- a/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e5a_tracking_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e5a_tracking_test.cc @@ -110,7 +110,7 @@ TEST_F(GalileoE5aTrackingTest, ValidationOfResults) int fs_in = 32000000; int nsamples = 32000000 * 5; init(); - queue = gr::msg_queue::make(0); + queue = std::shared_ptr>(); top_block = gr::make_top_block("Tracking test"); // Example using smart pointers and the block factory diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_c_aid_tracking_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_c_aid_tracking_test.cc index 1fa07acc4..9e7f7383a 100644 --- a/src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_c_aid_tracking_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_c_aid_tracking_test.cc @@ -156,7 +156,7 @@ TEST_F(GlonassL1CaDllPllCAidTrackingTest, ValidationOfResults) int nsamples = fs_in * 4e-3 * 2; init(); - queue = gr::msg_queue::make(0); + queue = std::shared_ptr>(); top_block = gr::make_top_block("Tracking test"); std::shared_ptr tracking = std::make_shared(config.get(), "Tracking_1G", 1, 1); boost::shared_ptr msg_rx = GlonassL1CaDllPllCAidTrackingTest_msg_rx_make(); diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_tracking_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_tracking_test.cc index 207217937..e203b6508 100644 --- a/src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_tracking_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_tracking_test.cc @@ -156,7 +156,7 @@ TEST_F(GlonassL1CaDllPllTrackingTest, ValidationOfResults) int nsamples = fs_in * 4e-3 * 2; init(); - queue = gr::msg_queue::make(0); + queue = std::shared_ptr>(); top_block = gr::make_top_block("Tracking test"); std::shared_ptr tracking = std::make_shared(config.get(), "Tracking_1G", 1, 1); boost::shared_ptr msg_rx = GlonassL1CaDllPllTrackingTest_msg_rx_make(); diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l2_m_dll_pll_tracking_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l2_m_dll_pll_tracking_test.cc index 59a63480e..4fa36d120 100644 --- a/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l2_m_dll_pll_tracking_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l2_m_dll_pll_tracking_test.cc @@ -160,7 +160,7 @@ TEST_F(GpsL2MDllPllTrackingTest, ValidationOfResults) int nsamples = fs_in * 9; init(); - queue = gr::msg_queue::make(0); + queue = std::shared_ptr>(); top_block = gr::make_top_block("Tracking test"); std::shared_ptr tracking = std::make_shared(config.get(), "Tracking_2S", 1, 1); boost::shared_ptr msg_rx = GpsL2MDllPllTrackingTest_msg_rx_make(); diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test.cc index 9b9e04baf..c22032391 100644 --- a/src/tests/unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test.cc @@ -63,6 +63,7 @@ #include #include #include +#include #include #include #include @@ -794,14 +795,10 @@ TEST_F(TrackingPullInTest, ValidationOfResults) // create the msg queue for valve - queue = gr::msg_queue::make(0); + queue = std::shared_ptr>(); long long int acq_to_trk_delay_samples = ceil(static_cast(FLAGS_fs_gen_sps) * FLAGS_acq_to_trk_delay_s); auto resetable_valve_ = gnss_sdr_make_valve(sizeof(gr_complex), acq_to_trk_delay_samples, queue, false); - std::shared_ptr control_message_factory_; - std::shared_ptr>> control_messages_; - - //CN0 LOOP std::vector> pull_in_results_v_v; @@ -882,15 +879,8 @@ TEST_F(TrackingPullInTest, ValidationOfResults) top_block->start(); std::cout << " Waiting for valve...\n"; //wait the valve message indicating the circulation of the amount of samples of the delay - gr::message::sptr queue_message = queue->delete_head(); - if (queue_message != nullptr) - { - control_messages_ = control_message_factory_->GetControlMessages(queue_message); - } - else - { - control_messages_->clear(); - } + pmt::pmt_t msg; + queue->wait_and_pop(msg); std::cout << " Starting tracking...\n"; tracking->start_tracking(); resetable_valve_->open_valve(); diff --git a/src/utils/front-end-cal/main.cc b/src/utils/front-end-cal/main.cc index e5f8e8520..696abfa6c 100644 --- a/src/utils/front-end-cal/main.cc +++ b/src/utils/front-end-cal/main.cc @@ -60,9 +60,8 @@ #include #include #include -#include // for gr_complex -#include // for io_signature -#include "concurrent_queue.h" +#include // for gr_complex +#include // for io_signature #include // for block_sptr #include #include // for pmt_t, to_long @@ -189,9 +188,9 @@ bool front_end_capture(const std::shared_ptr& configurat { gr::top_block_sptr top_block; GNSSBlockFactory block_factory; - boost::shared_ptr queue; + std::shared_ptr> queue; - queue = gr::msg_queue::make(0); + queue = std::make_shared>(); top_block = gr::make_top_block("Acquisition test"); std::shared_ptr source; From b43c055ba446a39ce361a0e8ad41258793edfebb Mon Sep 17 00:00:00 2001 From: Javier Arribas Date: Thu, 18 Jul 2019 18:59:16 +0200 Subject: [PATCH 05/36] Deadlock fix in 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 73e09e9ec..8c9c87779 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 @@ -293,7 +293,7 @@ protected: num_thresholds = pfa_vector.size(); - int aux2 = ((generated_signal_duration_s * 1000 - (FLAGS_acq_test_coherent_time_ms * FLAGS_acq_test_max_dwells)) / (FLAGS_acq_test_coherent_time_ms * FLAGS_acq_test_max_dwells)); + 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)); 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 601230ce37c06144340aa986fa84236710c7e525 Mon Sep 17 00:00:00 2001 From: Javier Arribas Date: Thu, 18 Jul 2019 19:29:14 +0200 Subject: [PATCH 06/36] Completing the migration to the new receiver channels and commands events queue. Fix unit test execution --- src/core/receiver/gnss_flowgraph.cc | 66 +++++++++---------- .../beidou_b1i_pcps_acquisition_test.cc | 2 +- .../glonass_l2_ca_pcps_acquisition_test.cc | 2 +- .../gps_l1_ca_pcps_acquisition_test.cc | 8 +-- ...a_pcps_opencl_acquisition_gsoc2013_test.cc | 6 +- ...cps_quicksync_acquisition_gsoc2014_test.cc | 12 ++-- ..._ca_pcps_tong_acquisition_gsoc2013_test.cc | 10 +-- .../gps_l2_m_pcps_acquisition_test.cc | 12 ++-- .../filter/fir_filter_test.cc | 2 +- .../filter/notch_filter_lite_test.cc | 2 +- .../filter/notch_filter_test.cc | 2 +- .../filter/pulse_blanking_filter_test.cc | 2 +- .../direct_resampler_conditioner_cc_test.cc | 4 +- .../resampler/mmse_resampler_test.cc | 6 +- .../sources/file_signal_source_test.cc | 4 +- .../sources/gnss_sdr_valve_test.cc | 2 +- .../galileo_e1_dll_pll_veml_tracking_test.cc | 6 +- .../tracking/galileo_e5a_tracking_test.cc | 4 +- ...onass_l1_ca_dll_pll_c_aid_tracking_test.cc | 4 +- .../glonass_l1_ca_dll_pll_tracking_test.cc | 4 +- .../gps_l2_m_dll_pll_tracking_test.cc | 6 +- .../tracking/tracking_pull-in_test.cc | 2 +- 22 files changed, 84 insertions(+), 84 deletions(-) diff --git a/src/core/receiver/gnss_flowgraph.cc b/src/core/receiver/gnss_flowgraph.cc index df54e3362..f13b6b26f 100644 --- a/src/core/receiver/gnss_flowgraph.cc +++ b/src/core/receiver/gnss_flowgraph.cc @@ -1245,25 +1245,25 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) start_acquisition = true; } //todo: add configuration parameter to enable the mandatory acquisition assistance in secondary freq - if (start_acquisition == true) - { - channels_state_[ch_index] = 1; - acq_channels_count_++; - std::cout << "Channel " << ch_index << " Starting acquisition " << channels_[ch_index]->get_signal().get_satellite() << ", Signal " << channels_[ch_index]->get_signal().get_signal_str(); - DLOG(INFO) << "Channel " << ch_index << " Starting acquisition " << channels_[ch_index]->get_signal().get_satellite() << ", Signal " << channels_[ch_index]->get_signal().get_signal_str(); + // if (start_acquisition == true) + // { + channels_state_[ch_index] = 1; + acq_channels_count_++; + std::cout << "Channel " << ch_index << " Starting acquisition " << channels_[ch_index]->get_signal().get_satellite() << ", Signal " << channels_[ch_index]->get_signal().get_signal_str(); + DLOG(INFO) << "Channel " << ch_index << " Starting acquisition " << channels_[ch_index]->get_signal().get_satellite() << ", Signal " << channels_[ch_index]->get_signal().get_signal_str(); #ifndef ENABLE_FPGA - channels_[ch_index]->start_acquisition(); + channels_[ch_index]->start_acquisition(); #else - // create a task for the FPGA such that it doesn't stop the flow - std::thread tmp_thread(&ChannelInterface::start_acquisition, channels_[ch_index]); - tmp_thread.detach(); + // create a task for the FPGA such that it doesn't stop the flow + std::thread tmp_thread(&ChannelInterface::start_acquisition, channels_[ch_index]); + tmp_thread.detach(); #endif - } - else - { - push_back_signal(gnss_signal); - DLOG(INFO) << "Channel " << ch_index << " secondary frequency acquisition assistance not available in " << channels_[ch_index]->get_signal().get_satellite() << ", Signal " << channels_[ch_index]->get_signal().get_signal_str(); - } + // } + // else + // { + // push_back_signal(gnss_signal); + // DLOG(INFO) << "Channel " << ch_index << " secondary frequency acquisition assistance not available in " << channels_[ch_index]->get_signal().get_satellite() << ", Signal " << channels_[ch_index]->get_signal().get_signal_str(); + // } } DLOG(INFO) << "Channel " << ch_index << " in state " << channels_state_[ch_index]; } @@ -1307,26 +1307,26 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) } //todo: add configuration parameter to enable the mandatory acquisition assistance in secondary freq - if (start_acquisition == true) - { - channels_state_[i] = 1; - acq_channels_count_++; - DLOG(INFO) << "Channel " << i << " Starting acquisition " << channels_[i]->get_signal().get_satellite() << ", Signal " << channels_[i]->get_signal().get_signal_str(); + // if (start_acquisition == true) + // { + channels_state_[i] = 1; + acq_channels_count_++; + DLOG(INFO) << "Channel " << i << " Starting acquisition " << channels_[i]->get_signal().get_satellite() << ", Signal " << channels_[i]->get_signal().get_signal_str(); #ifndef ENABLE_FPGA - channels_[i]->start_acquisition(); + channels_[i]->start_acquisition(); #else - // create a task for the FPGA such that it doesn't stop the flow - std::thread tmp_thread(&ChannelInterface::start_acquisition, channels_[i]); - tmp_thread.detach(); - start_acquisition = is_primary_freq or assistance_available; + // create a task for the FPGA such that it doesn't stop the flow + std::thread tmp_thread(&ChannelInterface::start_acquisition, channels_[i]); + tmp_thread.detach(); + start_acquisition = is_primary_freq or assistance_available; #endif - } - else - { - push_back_signal(gnss_signal); - DLOG(INFO) << "Channel " << i << " secondary frequency acquisition assistance not available in " << channels_[i]->get_signal().get_satellite() << ", Signal " << channels_[i]->get_signal().get_signal_str(); - std::cout << "Channel " << i << " secondary frequency acquisition assistance not available in " << channels_[i]->get_signal().get_satellite() << ", Signal " << channels_[i]->get_signal().get_signal_str(); - } + // } + // else + // { + // push_back_signal(gnss_signal); + // DLOG(INFO) << "Channel " << i << " secondary frequency acquisition assistance not available in " << channels_[i]->get_signal().get_satellite() << ", Signal " << channels_[i]->get_signal().get_signal_str(); + // std::cout << "Channel " << i << " secondary frequency acquisition assistance not available in " << channels_[i]->get_signal().get_satellite() << ", Signal " << channels_[i]->get_signal().get_signal_str()<<"\n"; + // } } DLOG(INFO) << "Channel " << i << " in state " << channels_state_[i]; } diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b1i_pcps_acquisition_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b1i_pcps_acquisition_test.cc index 6810bdcbf..8278d3e42 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b1i_pcps_acquisition_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b1i_pcps_acquisition_test.cc @@ -262,7 +262,7 @@ TEST_F(BeidouB1iPcpsAcquisitionTest, ConnectAndRun) int nsamples = 25000; std::chrono::time_point start, end; std::chrono::duration elapsed_seconds(0); - std::shared_ptr> queue = std::make_shared>();std::shared_ptr> + std::shared_ptr> queue = std::make_shared>(); top_block = gr::make_top_block("Acquisition test"); init(); diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l2_ca_pcps_acquisition_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l2_ca_pcps_acquisition_test.cc index 492e4196a..1086d3119 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l2_ca_pcps_acquisition_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/glonass_l2_ca_pcps_acquisition_test.cc @@ -141,7 +141,7 @@ protected: void process_message(); void stop_queue(); - concurrent_queue channel_internal_queue; + Concurrent_Queue channel_internal_queue; std::shared_ptr> queue; gr::top_block_sptr top_block; diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_test.cc index 2066297ad..541a2a3b8 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_acquisition_test.cc @@ -31,14 +31,15 @@ */ +#include "gps_l1_ca_pcps_acquisition.h" #include "GPS_L1_CA.h" #include "acquisition_dump_reader.h" +#include "concurrent_queue.h" #include "gnss_block_factory.h" #include "gnss_block_interface.h" #include "gnss_sdr_valve.h" #include "gnss_synchro.h" #include "gnuplot_i.h" -#include "gps_l1_ca_pcps_acquisition.h" #include "in_memory_configuration.h" #include "test_flags.h" #include @@ -46,7 +47,6 @@ #include #include #include -#include "concurrent_queue.h" #include #include #include @@ -199,7 +199,7 @@ void GpsL1CaPcpsAcquisitionTest::plot_grid() std::vector *doppler = &acq_dump.doppler; std::vector *samples = &acq_dump.samples; - std::vector > *mag = &acq_dump.mag; + std::vector> *mag = &acq_dump.mag; const std::string gnuplot_executable(FLAGS_gnuplot_executable); if (gnuplot_executable.empty()) @@ -262,7 +262,7 @@ TEST_F(GpsL1CaPcpsAcquisitionTest, ConnectAndRun) int nsamples = 4000; std::chrono::time_point start, end; std::chrono::duration elapsed_seconds(0); - std::shared_ptr> queue = std::shared_ptr>(); + std::shared_ptr> queue = std::make_shared>(); top_block = gr::make_top_block("Acquisition test"); init(); diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_opencl_acquisition_gsoc2013_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_opencl_acquisition_gsoc2013_test.cc index b6903cbec..5a6bb87aa 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_opencl_acquisition_gsoc2013_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_opencl_acquisition_gsoc2013_test.cc @@ -31,13 +31,14 @@ */ +#include "gps_l1_ca_pcps_opencl_acquisition.h" +#include "concurrent_queue.h" #include "configuration_interface.h" #include "fir_filter.h" #include "gen_signal_source.h" #include "gnss_block_interface.h" #include "gnss_sdr_valve.h" #include "gnss_synchro.h" -#include "gps_l1_ca_pcps_opencl_acquisition.h" #include "in_memory_configuration.h" #include "signal_generator.h" #include "signal_generator_c.h" @@ -45,7 +46,6 @@ #include #include #include -#include "concurrent_queue.h" #include #include #include @@ -118,7 +118,7 @@ class GpsL1CaPcpsOpenClAcquisitionGSoC2013Test : public ::testing::Test protected: GpsL1CaPcpsOpenClAcquisitionGSoC2013Test() { - queue = std::shared_ptr>(); + queue = std::make_shared>(); top_block = gr::make_top_block("Acquisition test"); item_size = sizeof(gr_complex); stop = false; diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_quicksync_acquisition_gsoc2014_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_quicksync_acquisition_gsoc2014_test.cc index 5f3e547ea..3f471fa44 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_quicksync_acquisition_gsoc2014_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_quicksync_acquisition_gsoc2014_test.cc @@ -31,11 +31,12 @@ */ +#include "gps_l1_ca_pcps_quicksync_acquisition.h" +#include "concurrent_queue.h" #include "gnss_block_factory.h" #include "gnss_block_interface.h" #include "gnss_sdr_valve.h" #include "gnss_synchro.h" -#include "gps_l1_ca_pcps_quicksync_acquisition.h" #include "in_memory_configuration.h" #include "signal_generator.h" #include "signal_generator_c.h" @@ -43,7 +44,6 @@ #include #include #include -#include "concurrent_queue.h" #include #include #include @@ -545,7 +545,7 @@ TEST_F(GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test, ConnectAndRun) std::chrono::time_point start, end; std::chrono::duration elapsed_seconds(0.0); top_block = gr::make_top_block("Acquisition test"); - queue = std::shared_ptr>(); + queue = std::make_shared>(); boost::shared_ptr msg_rx = GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); config_1(); @@ -575,7 +575,7 @@ TEST_F(GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test, ValidationOfResults) { config_1(); top_block = gr::make_top_block("Acquisition test"); - queue = std::shared_ptr>(); + queue = std::make_shared>(); acquisition = std::make_shared(config.get(), "Acquisition_1C", 1, 0); boost::shared_ptr msg_rx = GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); @@ -669,7 +669,7 @@ TEST_F(GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test, ValidationOfResultsWithNoise //config_3(); config_1(); top_block = gr::make_top_block("Acquisition test"); - queue = std::shared_ptr>(); + queue = std::make_shared>(); acquisition = std::make_shared(config.get(), "Acquisition_1C", 1, 0); boost::shared_ptr msg_rx = GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); @@ -760,7 +760,7 @@ TEST_F(GpsL1CaPcpsQuickSyncAcquisitionGSoC2014Test, ValidationOfResultsProbabili { config_2(); top_block = gr::make_top_block("Acquisition test"); - queue = std::shared_ptr>(); + queue = std::make_shared>(); acquisition = std::make_shared(config.get(), "Acquisition_1C", 1, 0); boost::shared_ptr msg_rx = GpsL1CaPcpsAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_tong_acquisition_gsoc2013_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_tong_acquisition_gsoc2013_test.cc index 8b7714dab..fd1a57464 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_tong_acquisition_gsoc2013_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_tong_acquisition_gsoc2013_test.cc @@ -31,13 +31,14 @@ */ +#include "gps_l1_ca_pcps_tong_acquisition.h" +#include "concurrent_queue.h" #include "configuration_interface.h" #include "fir_filter.h" #include "gen_signal_source.h" #include "gnss_block_interface.h" #include "gnss_sdr_valve.h" #include "gnss_synchro.h" -#include "gps_l1_ca_pcps_tong_acquisition.h" #include "in_memory_configuration.h" #include "signal_generator.h" #include "signal_generator_c.h" @@ -45,7 +46,6 @@ #include #include #include -#include "concurrent_queue.h" #include #include #include @@ -431,7 +431,7 @@ TEST_F(GpsL1CaPcpsTongAcquisitionGSoC2013Test, ConnectAndRun) std::chrono::time_point start, end; std::chrono::duration elapsed_seconds(0); top_block = gr::make_top_block("Acquisition test"); - queue = std::shared_ptr>(); + queue = std::make_shared>(); config_1(); acquisition = std::make_shared(config.get(), "Acquisition_1C", 1, 0); @@ -461,7 +461,7 @@ TEST_F(GpsL1CaPcpsTongAcquisitionGSoC2013Test, ValidationOfResults) { config_1(); top_block = gr::make_top_block("Acquisition test"); - queue = std::shared_ptr>(); + queue = std::make_shared>(); acquisition = std::make_shared(config.get(), "Acquisition_1C", 1, 0); boost::shared_ptr msg_rx = GpsL1CaPcpsTongAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); @@ -550,7 +550,7 @@ TEST_F(GpsL1CaPcpsTongAcquisitionGSoC2013Test, ValidationOfResultsProbabilities) { config_2(); top_block = gr::make_top_block("Acquisition test"); - queue = std::shared_ptr>(); + queue = std::make_shared>(); acquisition = std::make_shared(config.get(), "Acquisition_1C", 1, 0); boost::shared_ptr msg_rx = GpsL1CaPcpsTongAcquisitionGSoC2013Test_msg_rx_make(channel_internal_queue); diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l2_m_pcps_acquisition_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l2_m_pcps_acquisition_test.cc index 97525ceac..d810a3a12 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l2_m_pcps_acquisition_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/gps_l2_m_pcps_acquisition_test.cc @@ -31,14 +31,15 @@ */ +#include "gps_l2_m_pcps_acquisition.h" #include "GPS_L2C.h" #include "acquisition_dump_reader.h" +#include "concurrent_queue.h" #include "gnss_block_factory.h" #include "gnss_block_interface.h" #include "gnss_sdr_valve.h" #include "gnss_synchro.h" #include "gnuplot_i.h" -#include "gps_l2_m_pcps_acquisition.h" #include "in_memory_configuration.h" #include "test_flags.h" #include @@ -47,7 +48,6 @@ #include #include #include -#include "concurrent_queue.h" #include #include #include @@ -202,7 +202,7 @@ void GpsL2MPcpsAcquisitionTest::plot_grid() std::vector *doppler = &acq_dump.doppler; std::vector *samples = &acq_dump.samples; - std::vector > *mag = &acq_dump.mag; + std::vector> *mag = &acq_dump.mag; const std::string gnuplot_executable(FLAGS_gnuplot_executable); if (gnuplot_executable.empty()) @@ -255,7 +255,7 @@ void GpsL2MPcpsAcquisitionTest::plot_grid() TEST_F(GpsL2MPcpsAcquisitionTest, Instantiate) { init(); - queue = std::shared_ptr>(); + queue = std::make_shared>(); std::shared_ptr acquisition = std::make_shared(config.get(), "Acquisition_2S", 1, 0); } @@ -265,7 +265,7 @@ TEST_F(GpsL2MPcpsAcquisitionTest, ConnectAndRun) std::chrono::time_point start, end; std::chrono::duration elapsed_seconds(0); top_block = gr::make_top_block("Acquisition test"); - queue = std::shared_ptr>(); + queue = std::make_shared>(); init(); std::shared_ptr acquisition = std::make_shared(config.get(), "Acquisition_2S", 1, 0); @@ -295,7 +295,7 @@ TEST_F(GpsL2MPcpsAcquisitionTest, ValidationOfResults) std::chrono::time_point start, end; std::chrono::duration elapsed_seconds(0); top_block = gr::make_top_block("Acquisition test"); - queue = std::shared_ptr>(); + queue = std::make_shared>(); double expected_delay_samples = 1; //2004; double expected_doppler_hz = 1200; //3000; diff --git a/src/tests/unit-tests/signal-processing-blocks/filter/fir_filter_test.cc b/src/tests/unit-tests/signal-processing-blocks/filter/fir_filter_test.cc index 714961259..32173ef44 100644 --- a/src/tests/unit-tests/signal-processing-blocks/filter/fir_filter_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/filter/fir_filter_test.cc @@ -59,7 +59,7 @@ class FirFilterTest : public ::testing::Test protected: FirFilterTest() { - queue = std::shared_ptr>(); + queue = std::make_shared>(); item_size = sizeof(gr_complex); config = std::make_shared(); } diff --git a/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_lite_test.cc b/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_lite_test.cc index 2189efde2..6aa42dafd 100644 --- a/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_lite_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_lite_test.cc @@ -57,7 +57,7 @@ class NotchFilterLiteTest : public ::testing::Test protected: NotchFilterLiteTest() { - queue = std::shared_ptr>(); + queue = std::make_shared>(); item_size = sizeof(gr_complex); config = std::make_shared(); nsamples = FLAGS_notch_filter_lite_test_nsamples; diff --git a/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_test.cc b/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_test.cc index 639ad27a7..c20c894c6 100644 --- a/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/filter/notch_filter_test.cc @@ -57,7 +57,7 @@ class NotchFilterTest : public ::testing::Test protected: NotchFilterTest() { - queue = std::shared_ptr>(); + queue = std::make_shared>(); item_size = sizeof(gr_complex); config = std::make_shared(); nsamples = FLAGS_notch_filter_test_nsamples; diff --git a/src/tests/unit-tests/signal-processing-blocks/filter/pulse_blanking_filter_test.cc b/src/tests/unit-tests/signal-processing-blocks/filter/pulse_blanking_filter_test.cc index 551d7a1cc..dab090737 100644 --- a/src/tests/unit-tests/signal-processing-blocks/filter/pulse_blanking_filter_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/filter/pulse_blanking_filter_test.cc @@ -57,7 +57,7 @@ class PulseBlankingFilterTest : public ::testing::Test protected: PulseBlankingFilterTest() { - queue = std::shared_ptr>(); + queue = std::make_shared>(); item_size = sizeof(gr_complex); config = std::make_shared(); nsamples = FLAGS_pb_filter_test_nsamples; diff --git a/src/tests/unit-tests/signal-processing-blocks/resampler/direct_resampler_conditioner_cc_test.cc b/src/tests/unit-tests/signal-processing-blocks/resampler/direct_resampler_conditioner_cc_test.cc index 983bbf4eb..0f4c3ad47 100644 --- a/src/tests/unit-tests/signal-processing-blocks/resampler/direct_resampler_conditioner_cc_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/resampler/direct_resampler_conditioner_cc_test.cc @@ -39,10 +39,10 @@ #else #include #endif +#include "concurrent_queue.h" #include "direct_resampler_conditioner_cc.h" #include "gnss_sdr_valve.h" #include -#include "concurrent_queue.h" TEST(DirectResamplerConditionerCcTest, InstantiationAndRunTest) @@ -52,7 +52,7 @@ TEST(DirectResamplerConditionerCcTest, InstantiationAndRunTest) std::chrono::time_point start, end; std::chrono::duration elapsed_seconds(0); int nsamples = 1000000; //Number of samples to be computed - std::shared_ptr> queue = std::shared_ptr>(); + std::shared_ptr> queue = std::make_shared>(); gr::top_block_sptr top_block = gr::make_top_block("direct_resampler_conditioner_cc_test"); boost::shared_ptr source = gr::analog::sig_source_c::make(fs_in, gr::analog::GR_SIN_WAVE, 1000.0, 1.0, gr_complex(0.0)); boost::shared_ptr valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue); diff --git a/src/tests/unit-tests/signal-processing-blocks/resampler/mmse_resampler_test.cc b/src/tests/unit-tests/signal-processing-blocks/resampler/mmse_resampler_test.cc index df3e12a10..acf888a0b 100644 --- a/src/tests/unit-tests/signal-processing-blocks/resampler/mmse_resampler_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/resampler/mmse_resampler_test.cc @@ -37,10 +37,10 @@ #else #include #endif +#include "concurrent_queue.h" #include "gnss_sdr_valve.h" #include "mmse_resampler_conditioner.h" #include -#include "concurrent_queue.h" TEST(MmseResamplerTest, InstantiationAndRunTestWarning) { @@ -49,7 +49,7 @@ TEST(MmseResamplerTest, InstantiationAndRunTestWarning) std::chrono::time_point start, end; std::chrono::duration elapsed_seconds(0); int nsamples = 1000000; //Number of samples to be computed - std::shared_ptr> queue = std::shared_ptr>(); + std::shared_ptr> queue = std::make_shared>(); gr::top_block_sptr top_block = gr::make_top_block("mmse_resampler_conditioner_cc_test"); boost::shared_ptr source = gr::analog::sig_source_c::make(fs_in, gr::analog::GR_SIN_WAVE, 1000.0, 1.0, gr_complex(0.0)); boost::shared_ptr valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue); @@ -90,7 +90,7 @@ TEST(MmseResamplerTest, InstantiationAndRunTest2) std::chrono::time_point start, end; std::chrono::duration elapsed_seconds(0); int nsamples = 1000000; //Number of samples to be computed - std::shared_ptr> queue = std::shared_ptr>(); + std::shared_ptr> queue = std::make_shared>(); gr::top_block_sptr top_block = gr::make_top_block("mmse_resampler_conditioner_cc_test"); boost::shared_ptr source = gr::analog::sig_source_c::make(fs_in, gr::analog::GR_SIN_WAVE, 1000.0, 1.0, gr_complex(0.0)); boost::shared_ptr valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue); diff --git a/src/tests/unit-tests/signal-processing-blocks/sources/file_signal_source_test.cc b/src/tests/unit-tests/signal-processing-blocks/sources/file_signal_source_test.cc index 5a6e75bef..49ea2c244 100644 --- a/src/tests/unit-tests/signal-processing-blocks/sources/file_signal_source_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/sources/file_signal_source_test.cc @@ -38,7 +38,7 @@ TEST(FileSignalSource, Instantiate) { - std::shared_ptr> queue = std::shared_ptr>(); + std::shared_ptr> queue = std::make_shared>(); std::shared_ptr config = std::make_shared(); config->set_property("Test.samples", "0"); @@ -57,7 +57,7 @@ TEST(FileSignalSource, Instantiate) TEST(FileSignalSource, InstantiateFileNotExists) { - std::shared_ptr> queue = std::shared_ptr>(); + std::shared_ptr> queue = std::make_shared>(); std::shared_ptr config = std::make_shared(); config->set_property("Test.samples", "0"); diff --git a/src/tests/unit-tests/signal-processing-blocks/sources/gnss_sdr_valve_test.cc b/src/tests/unit-tests/signal-processing-blocks/sources/gnss_sdr_valve_test.cc index 80f573eb1..52e987bf3 100644 --- a/src/tests/unit-tests/signal-processing-blocks/sources/gnss_sdr_valve_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/sources/gnss_sdr_valve_test.cc @@ -45,7 +45,7 @@ TEST(ValveTest, CheckEventSentAfter100Samples) { - std::shared_ptr> queue = std::shared_ptr>(); + std::shared_ptr> queue = std::make_shared>(); gr::top_block_sptr top_block = gr::make_top_block("gnss_sdr_valve_test"); diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e1_dll_pll_veml_tracking_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e1_dll_pll_veml_tracking_test.cc index 3bb3dc999..0b2bdd9aa 100644 --- a/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e1_dll_pll_veml_tracking_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e1_dll_pll_veml_tracking_test.cc @@ -32,6 +32,7 @@ #include "galileo_e1_dll_pll_veml_tracking.h" +#include "concurrent_queue.h" #include "gnss_block_factory.h" #include "gnss_block_interface.h" #include "gnss_sdr_valve.h" @@ -41,7 +42,6 @@ #include #include #include -#include "concurrent_queue.h" #include #include #include @@ -114,7 +114,7 @@ TEST_F(GalileoE1DllPllVemlTrackingInternalTest, ConnectAndRun) std::chrono::time_point start, end; std::chrono::duration elapsed_seconds(0); init(); - queue = std::shared_ptr>(); + queue = std::make_shared>(); top_block = gr::make_top_block("Tracking test"); // Example using smart pointers and the block factory @@ -161,7 +161,7 @@ TEST_F(GalileoE1DllPllVemlTrackingInternalTest, ValidationOfResults) int num_samples = 80000000; // 8 Msps unsigned int skiphead_sps = 8000000; // 8 Msps init(); - queue = std::shared_ptr>(); + queue = std::make_shared>(); top_block = gr::make_top_block("Tracking test"); // Example using smart pointers and the block factory diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e5a_tracking_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e5a_tracking_test.cc index c94ce3557..92dae1d47 100644 --- a/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e5a_tracking_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/galileo_e5a_tracking_test.cc @@ -31,6 +31,7 @@ */ +#include "concurrent_queue.h" #include "galileo_e5a_dll_pll_tracking.h" #include "gnss_block_factory.h" #include "gnss_block_interface.h" @@ -41,7 +42,6 @@ #include #include #include -#include "concurrent_queue.h" #include #include #include @@ -110,7 +110,7 @@ TEST_F(GalileoE5aTrackingTest, ValidationOfResults) int fs_in = 32000000; int nsamples = 32000000 * 5; init(); - queue = std::shared_ptr>(); + queue = std::make_shared>(); top_block = gr::make_top_block("Tracking test"); // Example using smart pointers and the block factory diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_c_aid_tracking_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_c_aid_tracking_test.cc index 9e7f7383a..2a2e8d860 100644 --- a/src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_c_aid_tracking_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_c_aid_tracking_test.cc @@ -32,6 +32,7 @@ #include "glonass_l1_ca_dll_pll_c_aid_tracking.h" +#include "concurrent_queue.h" #include "gnss_block_factory.h" #include "gnss_block_interface.h" #include "gnss_sdr_valve.h" @@ -42,7 +43,6 @@ #include #include #include -#include "concurrent_queue.h" #include #include #include @@ -156,7 +156,7 @@ TEST_F(GlonassL1CaDllPllCAidTrackingTest, ValidationOfResults) int nsamples = fs_in * 4e-3 * 2; init(); - queue = std::shared_ptr>(); + queue = std::make_shared>(); top_block = gr::make_top_block("Tracking test"); std::shared_ptr tracking = std::make_shared(config.get(), "Tracking_1G", 1, 1); boost::shared_ptr msg_rx = GlonassL1CaDllPllCAidTrackingTest_msg_rx_make(); diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_tracking_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_tracking_test.cc index e203b6508..be9128699 100644 --- a/src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_tracking_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_tracking_test.cc @@ -32,6 +32,7 @@ #include "glonass_l1_ca_dll_pll_tracking.h" +#include "concurrent_queue.h" #include "gnss_block_factory.h" #include "gnss_block_interface.h" #include "gnss_sdr_valve.h" @@ -42,7 +43,6 @@ #include #include #include -#include "concurrent_queue.h" #include #include #include @@ -156,7 +156,7 @@ TEST_F(GlonassL1CaDllPllTrackingTest, ValidationOfResults) int nsamples = fs_in * 4e-3 * 2; init(); - queue = std::shared_ptr>(); + queue = std::make_shared>(); top_block = gr::make_top_block("Tracking test"); std::shared_ptr tracking = std::make_shared(config.get(), "Tracking_1G", 1, 1); boost::shared_ptr msg_rx = GlonassL1CaDllPllTrackingTest_msg_rx_make(); diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l2_m_dll_pll_tracking_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l2_m_dll_pll_tracking_test.cc index 4fa36d120..2ace452e5 100644 --- a/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l2_m_dll_pll_tracking_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l2_m_dll_pll_tracking_test.cc @@ -31,18 +31,18 @@ */ +#include "gps_l2_m_dll_pll_tracking.h" +#include "concurrent_queue.h" #include "gnss_block_factory.h" #include "gnss_block_interface.h" #include "gnss_sdr_valve.h" #include "gnss_synchro.h" -#include "gps_l2_m_dll_pll_tracking.h" #include "in_memory_configuration.h" #include "tracking_interface.h" #include #include #include #include -#include "concurrent_queue.h" #include #include #include @@ -160,7 +160,7 @@ TEST_F(GpsL2MDllPllTrackingTest, ValidationOfResults) int nsamples = fs_in * 9; init(); - queue = std::shared_ptr>(); + queue = std::make_shared>(); top_block = gr::make_top_block("Tracking test"); std::shared_ptr tracking = std::make_shared(config.get(), "Tracking_2S", 1, 1); boost::shared_ptr msg_rx = GpsL2MDllPllTrackingTest_msg_rx_make(); diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test.cc index c22032391..169513401 100644 --- a/src/tests/unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test.cc @@ -795,7 +795,7 @@ TEST_F(TrackingPullInTest, ValidationOfResults) // create the msg queue for valve - queue = std::shared_ptr>(); + queue = std::make_shared>(); long long int acq_to_trk_delay_samples = ceil(static_cast(FLAGS_fs_gen_sps) * FLAGS_acq_to_trk_delay_s); auto resetable_valve_ = gnss_sdr_make_valve(sizeof(gr_complex), acq_to_trk_delay_samples, queue, false); From e83f9ad551c6e8b95aae35e55e31f5d14cea5a81 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Thu, 18 Jul 2019 19:36:08 +0200 Subject: [PATCH 07/36] Update Armadillo version --- CMakeLists.txt | 2 +- README.md | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d3c95eea4..1872be76f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -397,7 +397,7 @@ set(GNSSSDR_PROTOBUF_MIN_VERSION "3.0.0") ################################################################################ set(GNSSSDR_GFLAGS_LOCAL_VERSION "2.2.2") set(GNSSSDR_GLOG_LOCAL_VERSION "0.4.0") -set(GNSSSDR_ARMADILLO_LOCAL_VERSION "9.500.x") +set(GNSSSDR_ARMADILLO_LOCAL_VERSION "9.600.x") set(GNSSSDR_GTEST_LOCAL_VERSION "1.8.1") set(GNSSSDR_GNSS_SIM_LOCAL_VERSION "master") set(GNSSSDR_GPSTK_LOCAL_VERSION "2.10.6") diff --git a/README.md b/README.md index 7240ccbca..fcbcd7223 100644 --- a/README.md +++ b/README.md @@ -220,9 +220,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-9.400.4.tar.xz -$ tar xvfz armadillo-9.400.4.tar.xz -$ cd armadillo-9.400.4 +$ wget http://sourceforge.net/projects/arma/files/armadillo-9.600.4.tar.xz +$ tar xvfz armadillo-9.600.4.tar.xz +$ cd armadillo-9.600.4 $ cmake . $ make $ sudo make install From b8fb52fe3c623c97b473032aa2117894a06694a9 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Thu, 18 Jul 2019 19:43:08 +0200 Subject: [PATCH 08/36] Remove not needed moves --- src/algorithms/libs/beidou_b3i_signal_processing.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/algorithms/libs/beidou_b3i_signal_processing.cc b/src/algorithms/libs/beidou_b3i_signal_processing.cc index e47771d6f..a08cdd7b4 100644 --- a/src/algorithms/libs/beidou_b3i_signal_processing.cc +++ b/src/algorithms/libs/beidou_b3i_signal_processing.cc @@ -42,9 +42,9 @@ void beidou_b3i_code_gen_int(gsl::span _dest, signed int _prn, unsigned int const unsigned int _code_length = 10230; std::bitset<_code_length> G1{}; std::bitset<_code_length> G2{}; - auto G1_register = std::move(std::bitset<13>{}.set()); // All true - auto G2_register = std::move(std::bitset<13>{}.set()); // All true - auto G1_register_reset = std::move(std::bitset<13>{}.set()); + auto G1_register = std::bitset<13>{}.set(); // All true + auto G2_register = std::bitset<13>{}.set(); // All true + auto G1_register_reset = std::bitset<13>{}.set(); G1_register_reset.reset(0); G1_register_reset.reset(1); // {false, false, true, true, true, true, true, true, true, true, true, true, true}; @@ -148,7 +148,7 @@ void beidou_b3i_code_gen_int(gsl::span _dest, signed int _prn, unsigned int // Reset G1 register if sequence found if (G1_register == G1_register_reset) { - G1_register = std::move(std::bitset<13>{}.set()); // All true + G1_register = std::bitset<13>{}.set(); // All true } } From 4628011e9e781b233fe2e8537515b050ea84c13f Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Thu, 18 Jul 2019 19:47:27 +0200 Subject: [PATCH 09/36] Unify operator name for exclusive or --- src/algorithms/libs/beidou_b1i_signal_processing.cc | 4 ++-- src/algorithms/libs/gps_l2c_signal.cc | 2 +- src/algorithms/libs/gps_sdr_signal_processing.cc | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/algorithms/libs/beidou_b1i_signal_processing.cc b/src/algorithms/libs/beidou_b1i_signal_processing.cc index 504d7ee0d..3a4d310bf 100644 --- a/src/algorithms/libs/beidou_b1i_signal_processing.cc +++ b/src/algorithms/libs/beidou_b1i_signal_processing.cc @@ -71,7 +71,7 @@ void beidou_b1i_code_gen_int(gsl::span _dest, int32_t _prn, uint32_t _c for (lcv = 0; lcv < _code_length; lcv++) { G1[lcv] = G1_register[0]; - G2[lcv] = G2_register[-(phase1[prn_idx] - 11)] ^ G2_register[-(phase2[prn_idx] - 11)]; + G2[lcv] = G2_register[-(phase1[prn_idx] - 11)] xor G2_register[-(phase2[prn_idx] - 11)]; feedback1 = G1_register[0] xor G1_register[1] xor G1_register[2] xor G1_register[3] xor G1_register[4] xor G1_register[10]; feedback2 = G2_register[0] xor G2_register[2] xor G2_register[3] xor G2_register[6] xor G2_register[7] xor G2_register[8] xor G2_register[9] xor G2_register[10]; @@ -94,7 +94,7 @@ void beidou_b1i_code_gen_int(gsl::span _dest, int32_t _prn, uint32_t _c // Generate PRN from G1 and G2 Registers for (lcv = 0; lcv < _code_length; lcv++) { - aux = G1[(lcv + _chip_shift) % _code_length] ^ G2[delay]; + aux = G1[(lcv + _chip_shift) % _code_length] xor G2[delay]; if (aux == true) { _dest[lcv] = 1; diff --git a/src/algorithms/libs/gps_l2c_signal.cc b/src/algorithms/libs/gps_l2c_signal.cc index 364c5ee66..f6acccf8b 100644 --- a/src/algorithms/libs/gps_l2c_signal.cc +++ b/src/algorithms/libs/gps_l2c_signal.cc @@ -38,7 +38,7 @@ uint32_t gps_l2c_m_shift(uint32_t x) { - return static_cast((x >> 1U) ^ ((x & 1U) * 0445112474U)); + return static_cast((x >> 1U) xor ((x & 1U) * 0445112474U)); } diff --git a/src/algorithms/libs/gps_sdr_signal_processing.cc b/src/algorithms/libs/gps_sdr_signal_processing.cc index 1a4483200..c7e79b0a9 100644 --- a/src/algorithms/libs/gps_sdr_signal_processing.cc +++ b/src/algorithms/libs/gps_sdr_signal_processing.cc @@ -83,7 +83,7 @@ void gps_l1_ca_code_gen_int(gsl::span _dest, int32_t _prn, uint32_t _ch G1[lcv] = G1_register[0]; G2[lcv] = G2_register[0]; - feedback1 = G1_register[7] ^ G1_register[0]; + feedback1 = G1_register[7] xor G1_register[0]; feedback2 = G2_register[8] xor G2_register[7] xor G2_register[4] xor G2_register[2] xor G2_register[1] xor G2_register[0]; for (lcv2 = 0; lcv2 < 9; lcv2++) @@ -104,7 +104,7 @@ void gps_l1_ca_code_gen_int(gsl::span _dest, int32_t _prn, uint32_t _ch // Generate PRN from G1 and G2 Registers for (lcv = 0; lcv < _code_length; lcv++) { - aux = G1[(lcv + _chip_shift) % _code_length] ^ G2[delay]; + aux = G1[(lcv + _chip_shift) % _code_length] xor G2[delay]; if (aux == true) { _dest[lcv] = 1; From 9f90384375716e4acf9709b57ef3c00024e47d6a Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Thu, 18 Jul 2019 20:01:54 +0200 Subject: [PATCH 10/36] Unify operator name for exclusive or, use bitset instead of array for bools --- src/algorithms/libs/glonass_l1_signal_processing.cc | 12 ++++-------- src/algorithms/libs/glonass_l2_signal_processing.cc | 12 ++++-------- 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/src/algorithms/libs/glonass_l1_signal_processing.cc b/src/algorithms/libs/glonass_l1_signal_processing.cc index da1cc34ce..aebc868af 100644 --- a/src/algorithms/libs/glonass_l1_signal_processing.cc +++ b/src/algorithms/libs/glonass_l1_signal_processing.cc @@ -32,30 +32,26 @@ #include "glonass_l1_signal_processing.h" #include +#include auto auxCeil = [](float x) { return static_cast(static_cast((x) + 1)); }; void glonass_l1_ca_code_gen_complex(gsl::span> _dest, /* int32_t _prn,*/ uint32_t _chip_shift) { const uint32_t _code_length = 511; - std::array G1{}; - std::array G1_register{}; + std::bitset<_code_length> G1{}; + auto G1_register = std::bitset<9>{}.set(); // All true bool feedback1; bool aux; uint32_t delay; uint32_t lcv, lcv2; - for (lcv = 0; lcv < 9; lcv++) - { - G1_register[lcv] = true; - } - /* Generate G1 Register */ for (lcv = 0; lcv < _code_length; lcv++) { G1[lcv] = G1_register[2]; - feedback1 = G1_register[4] ^ G1_register[0]; + feedback1 = G1_register[4] xor G1_register[0]; for (lcv2 = 0; lcv2 < 8; lcv2++) { diff --git a/src/algorithms/libs/glonass_l2_signal_processing.cc b/src/algorithms/libs/glonass_l2_signal_processing.cc index d92b785c9..a95e742a4 100644 --- a/src/algorithms/libs/glonass_l2_signal_processing.cc +++ b/src/algorithms/libs/glonass_l2_signal_processing.cc @@ -32,30 +32,26 @@ #include "glonass_l2_signal_processing.h" #include +#include auto auxCeil = [](float x) { return static_cast(static_cast((x) + 1)); }; void glonass_l2_ca_code_gen_complex(gsl::span> _dest, /* int32_t _prn,*/ uint32_t _chip_shift) { const uint32_t _code_length = 511; - std::array G1{}; - std::array G1_register{}; + std::bitset<_code_length> G1{}; + auto G1_register = std::bitset<9>{}.set(); // All true bool feedback1; bool aux; uint32_t delay; uint32_t lcv, lcv2; - for (lcv = 0; lcv < 9; lcv++) - { - G1_register[lcv] = true; - } - /* Generate G1 Register */ for (lcv = 0; lcv < _code_length; lcv++) { G1[lcv] = G1_register[2]; - feedback1 = G1_register[4] ^ G1_register[0]; + feedback1 = G1_register[4] xor G1_register[0]; for (lcv2 = 0; lcv2 < 8; lcv2++) { From 6a15b84687caa53d3c0fcab0048c76a6a5ce6053 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Thu, 18 Jul 2019 22:03:56 +0200 Subject: [PATCH 11/36] Simplify code --- .../libs/galileo_e1_signal_processing.cc | 38 ++++++--------- .../libs/glonass_l1_signal_processing.cc | 5 +- .../libs/glonass_l2_signal_processing.cc | 5 +- src/algorithms/libs/gnss_signal_processing.cc | 14 +++--- src/algorithms/libs/gps_l2c_signal.cc | 24 +++++----- src/algorithms/libs/gps_l5_signal.cc | 48 ++++++++----------- .../libs/gps_sdr_signal_processing.cc | 11 ++--- 7 files changed, 62 insertions(+), 83 deletions(-) diff --git a/src/algorithms/libs/galileo_e1_signal_processing.cc b/src/algorithms/libs/galileo_e1_signal_processing.cc index 63c2ca743..59f0cfb1c 100644 --- a/src/algorithms/libs/galileo_e1_signal_processing.cc +++ b/src/algorithms/libs/galileo_e1_signal_processing.cc @@ -33,10 +33,10 @@ #include "galileo_e1_signal_processing.h" #include "Galileo_E1.h" #include "gnss_signal_processing.h" -#include #include #include #include +#include void galileo_e1_code_gen_int(gsl::span _dest, const std::array& _Signal, int32_t _prn) @@ -111,8 +111,8 @@ void galileo_e1_code_gen_sinboc11_float(gsl::span _dest, const std::array { std::string _galileo_signal = _Signal.data(); const auto _codeLength = static_cast(GALILEO_E1_B_CODE_LENGTH_CHIPS); - std::array primary_code_E1_chips{}; // _codeLength not accepted by Clang - galileo_e1_code_gen_int(gsl::span(primary_code_E1_chips.data(), 4092), _Signal, _prn); //generate Galileo E1 code, 1 sample per chip + std::array primary_code_E1_chips{}; + galileo_e1_code_gen_int(primary_code_E1_chips, _Signal, _prn); // generate Galileo E1 code, 1 sample per chip for (uint32_t i = 0; i < _codeLength; i++) { _dest[2 * i] = static_cast(primary_code_E1_chips[i]); @@ -163,35 +163,31 @@ void galileo_e1_code_gen_float_sampled(gsl::span _dest, const std::array< std::string _galileo_signal = _Signal.data(); uint32_t _samplesPerCode; const int32_t _codeFreqBasis = GALILEO_E1_CODE_CHIP_RATE_HZ; // Hz - auto _codeLength = static_cast(GALILEO_E1_B_CODE_LENGTH_CHIPS); - auto* primary_code_E1_chips = static_cast(volk_gnsssdr_malloc(static_cast(GALILEO_E1_B_CODE_LENGTH_CHIPS) * sizeof(int32_t), volk_gnsssdr_get_alignment())); - - _samplesPerCode = static_cast(static_cast(_fs) / (static_cast(_codeFreqBasis) / static_cast(_codeLength))); + std::vector primary_code_E1_chips(static_cast(GALILEO_E1_B_CODE_LENGTH_CHIPS)); + _samplesPerCode = static_cast(static_cast(_fs) / (static_cast(_codeFreqBasis) / GALILEO_E1_B_CODE_LENGTH_CHIPS)); const int32_t _samplesPerChip = (_cboc == true) ? 12 : 2; const uint32_t delay = ((static_cast(GALILEO_E1_B_CODE_LENGTH_CHIPS) - _chip_shift) % static_cast(GALILEO_E1_B_CODE_LENGTH_CHIPS)) * _samplesPerCode / GALILEO_E1_B_CODE_LENGTH_CHIPS; - galileo_e1_code_gen_int(gsl::span(primary_code_E1_chips, static_cast(GALILEO_E1_B_CODE_LENGTH_CHIPS)), _Signal, _prn); // generate Galileo E1 code, 1 sample per chip + galileo_e1_code_gen_int(primary_code_E1_chips, _Signal, _prn); // generate Galileo E1 code, 1 sample per chip - _codeLength = _samplesPerChip * GALILEO_E1_B_CODE_LENGTH_CHIPS; + const uint32_t _codeLength = _samplesPerChip * GALILEO_E1_B_CODE_LENGTH_CHIPS; std::unique_ptr _signal_E1{new float[_codeLength]}; gsl::span _signal_E1_span(_signal_E1, _codeLength); if (_cboc == true) { - galileo_e1_gen_float(_signal_E1_span, gsl::span(primary_code_E1_chips, static_cast(GALILEO_E1_B_CODE_LENGTH_CHIPS)), _Signal); // generate cboc 12 samples per chip + galileo_e1_gen_float(_signal_E1_span, primary_code_E1_chips, _Signal); // generate cboc 12 samples per chip } else { - auto* _signal_E1_int = static_cast(volk_gnsssdr_malloc(_codeLength * sizeof(int32_t), volk_gnsssdr_get_alignment())); - gsl::span _signal_E1_int_span(_signal_E1_int, _codeLength); - galileo_e1_sinboc_11_gen_int(_signal_E1_int_span, gsl::span(primary_code_E1_chips, static_cast(GALILEO_E1_B_CODE_LENGTH_CHIPS))); // generate sinboc(1,1) 2 samples per chip + std::vector _signal_E1_int(static_cast(_codeLength)); + galileo_e1_sinboc_11_gen_int(_signal_E1_int, primary_code_E1_chips); // generate sinboc(1,1) 2 samples per chip for (uint32_t ii = 0; ii < _codeLength; ++ii) { - _signal_E1_span[ii] = static_cast(_signal_E1_int_span[ii]); + _signal_E1_span[ii] = static_cast(_signal_E1_int[ii]); } - volk_gnsssdr_free(_signal_E1_int); } if (_fs != _samplesPerChip * _codeFreqBasis) @@ -233,8 +229,6 @@ void galileo_e1_code_gen_float_sampled(gsl::span _dest, const std::array< { _dest[(i + delay) % _samplesPerCode] = _signal_E1_span_aux2[i]; } - - volk_gnsssdr_free(primary_code_E1_chips); } @@ -245,22 +239,20 @@ void galileo_e1_code_gen_complex_sampled(gsl::span> _dest, c std::string _galileo_signal = _Signal.data(); const int32_t _codeFreqBasis = GALILEO_E1_CODE_CHIP_RATE_HZ; // Hz auto _samplesPerCode = static_cast(static_cast(_fs) / - (static_cast(_codeFreqBasis) / static_cast(GALILEO_E1_B_CODE_LENGTH_CHIPS))); + (static_cast(_codeFreqBasis) / GALILEO_E1_B_CODE_LENGTH_CHIPS)); if (_galileo_signal.rfind("1C") != std::string::npos && _galileo_signal.length() >= 2 && _secondary_flag) { _samplesPerCode *= static_cast(GALILEO_E1_C_SECONDARY_CODE_LENGTH); } - auto* real_code = static_cast(volk_gnsssdr_malloc(_samplesPerCode * sizeof(float), volk_gnsssdr_get_alignment())); - gsl::span real_code_span(real_code, _samplesPerCode); - galileo_e1_code_gen_float_sampled(real_code_span, _Signal, _cboc, _prn, _fs, _chip_shift, _secondary_flag); + std::vector real_code(_samplesPerCode); + galileo_e1_code_gen_float_sampled(real_code, _Signal, _cboc, _prn, _fs, _chip_shift, _secondary_flag); for (uint32_t ii = 0; ii < _samplesPerCode; ++ii) { - _dest[ii] = std::complex(real_code_span[ii], 0.0F); + _dest[ii] = std::complex(real_code[ii], 0.0F); } - volk_gnsssdr_free(real_code); } diff --git a/src/algorithms/libs/glonass_l1_signal_processing.cc b/src/algorithms/libs/glonass_l1_signal_processing.cc index aebc868af..ee07164bf 100644 --- a/src/algorithms/libs/glonass_l1_signal_processing.cc +++ b/src/algorithms/libs/glonass_l1_signal_processing.cc @@ -119,7 +119,7 @@ void glonass_l1_ca_code_gen_complex_sampled(gsl::span> _dest _ts = 1.0 / static_cast(_fs); // Sampling period in sec _tc = 1.0 / static_cast(_codeFreqBasis); // C/A chip period in sec - glonass_l1_ca_code_gen_complex(gsl::span>(_code.data(), 511), _chip_shift); // generate C/A code 1 sample per chip + glonass_l1_ca_code_gen_complex(_code, _chip_shift); // generate C/A code 1 sample per chip for (int32_t i = 0; i < _samplesPerCode; i++) { @@ -130,7 +130,6 @@ void glonass_l1_ca_code_gen_complex_sampled(gsl::span> _dest // number of samples per millisecond (because one C/A code period is one // millisecond). - // _codeValueIndex = ceil((_ts * ((float)i + 1)) / _tc) - 1; aux = (_ts * (i + 1)) / _tc; _codeValueIndex = auxCeil(aux) - 1; @@ -144,7 +143,7 @@ void glonass_l1_ca_code_gen_complex_sampled(gsl::span> _dest } else { - _dest[i] = _code[_codeValueIndex]; //repeat the chip -> upsample + _dest[i] = _code[_codeValueIndex]; // repeat the chip -> upsample } } } diff --git a/src/algorithms/libs/glonass_l2_signal_processing.cc b/src/algorithms/libs/glonass_l2_signal_processing.cc index a95e742a4..f2223fa94 100644 --- a/src/algorithms/libs/glonass_l2_signal_processing.cc +++ b/src/algorithms/libs/glonass_l2_signal_processing.cc @@ -119,7 +119,7 @@ void glonass_l2_ca_code_gen_complex_sampled(gsl::span> _dest _ts = 1.0 / static_cast(_fs); // Sampling period in sec _tc = 1.0 / static_cast(_codeFreqBasis); // C/A chip period in sec - glonass_l2_ca_code_gen_complex(gsl::span>(_code.data(), 511), _chip_shift); // generate C/A code 1 sample per chip + glonass_l2_ca_code_gen_complex(_code, _chip_shift); // generate C/A code 1 sample per chip for (int32_t i = 0; i < _samplesPerCode; i++) { @@ -130,7 +130,6 @@ void glonass_l2_ca_code_gen_complex_sampled(gsl::span> _dest // number of samples per millisecond (because one C/A code period is one // millisecond). - // _codeValueIndex = ceil((_ts * ((float)i + 1)) / _tc) - 1; aux = (_ts * (i + 1)) / _tc; _codeValueIndex = auxCeil(aux) - 1; @@ -144,7 +143,7 @@ void glonass_l2_ca_code_gen_complex_sampled(gsl::span> _dest } else { - _dest[i] = _code[_codeValueIndex]; //repeat the chip -> upsample + _dest[i] = _code[_codeValueIndex]; // repeat the chip -> upsample } } } diff --git a/src/algorithms/libs/gnss_signal_processing.cc b/src/algorithms/libs/gnss_signal_processing.cc index 71e61e159..63a244d8b 100644 --- a/src/algorithms/libs/gnss_signal_processing.cc +++ b/src/algorithms/libs/gnss_signal_processing.cc @@ -168,13 +168,12 @@ void resampler(const gsl::span _from, gsl::span _dest, float _fs_i const float _t_out = 1 / _fs_out; // Out sampling period in sec for (uint32_t i = 0; i < _dest.size() - 1; i++) { - //=== Digitizing ======================================================= - //--- compute index array to read sampled values ------------------------- - //_codeValueIndex = ceil((_t_out * ((float)i + 1)) / _t_in) - 1; + //=== Digitizing =================================================== + //--- compute index array to read sampled values ------------------- aux = (_t_out * (i + 1)) / _t_in; _codeValueIndex = auxCeil2(aux) - 1; - //if repeat the chip -> upsample by nearest neighborhood interpolation + // if repeat the chip -> upsample by nearest neighborhood interpolation _dest[i] = _from[_codeValueIndex]; } //--- Correct the last index (due to number rounding issues) ----------- @@ -192,13 +191,12 @@ void resampler(gsl::span> _from, gsl::span upsample by nearest neighborhood interpolation + // if repeat the chip -> upsample by nearest neighborhood interpolation _dest[i] = _from[_codeValueIndex]; } //--- Correct the last index (due to number rounding issues) ----------- diff --git a/src/algorithms/libs/gps_l2c_signal.cc b/src/algorithms/libs/gps_l2c_signal.cc index f6acccf8b..73d9e5b7a 100644 --- a/src/algorithms/libs/gps_l2c_signal.cc +++ b/src/algorithms/libs/gps_l2c_signal.cc @@ -32,6 +32,7 @@ #include "gps_l2c_signal.h" #include "GPS_L2C.h" +#include #include #include @@ -56,32 +57,30 @@ void gps_l2c_m_code(gsl::span _dest, uint32_t _prn) void gps_l2c_m_code_gen_complex(gsl::span> _dest, uint32_t _prn) { - std::unique_ptr _code{new int32_t[GPS_L2_M_CODE_LENGTH_CHIPS]}; - gsl::span _code_span(_code, GPS_L2_M_CODE_LENGTH_CHIPS); + std::array _code{}; if (_prn > 0 and _prn < 51) { - gps_l2c_m_code(_code_span, _prn); + gps_l2c_m_code(_code, _prn); } for (int32_t i = 0; i < GPS_L2_M_CODE_LENGTH_CHIPS; i++) { - _dest[i] = std::complex(1.0 - 2.0 * _code_span[i], 0.0); + _dest[i] = std::complex(1.0 - 2.0 * _code[i], 0.0); } } void gps_l2c_m_code_gen_float(gsl::span _dest, uint32_t _prn) { - std::unique_ptr _code{new int32_t[GPS_L2_M_CODE_LENGTH_CHIPS]}; - gsl::span _code_span(_code, GPS_L2_M_CODE_LENGTH_CHIPS); + std::array _code{}; if (_prn > 0 and _prn < 51) { - gps_l2c_m_code(_code_span, _prn); + gps_l2c_m_code(_code, _prn); } for (int32_t i = 0; i < GPS_L2_M_CODE_LENGTH_CHIPS; i++) { - _dest[i] = 1.0 - 2.0 * static_cast(_code_span[i]); + _dest[i] = 1.0 - 2.0 * static_cast(_code[i]); } } @@ -91,11 +90,10 @@ void gps_l2c_m_code_gen_float(gsl::span _dest, uint32_t _prn) */ void gps_l2c_m_code_gen_complex_sampled(gsl::span> _dest, uint32_t _prn, int32_t _fs) { - std::unique_ptr _code{new int32_t[GPS_L2_M_CODE_LENGTH_CHIPS]}; - gsl::span _code_span(_code, GPS_L2_M_CODE_LENGTH_CHIPS); + std::array _code{}; if (_prn > 0 and _prn < 51) { - gps_l2c_m_code(_code_span, _prn); + gps_l2c_m_code(_code, _prn); } int32_t _samplesPerCode, _codeValueIndex; @@ -121,11 +119,11 @@ void gps_l2c_m_code_gen_complex_sampled(gsl::span> _dest, ui if (i == _samplesPerCode - 1) { //--- Correct the last index (due to number rounding issues) ----------- - _dest[i] = std::complex(1.0 - 2.0 * _code_span[_codeLength - 1], 0); + _dest[i] = std::complex(1.0 - 2.0 * _code[_codeLength - 1], 0); } else { - _dest[i] = std::complex(1.0 - 2.0 * _code_span[_codeValueIndex], 0); //repeat the chip -> upsample + _dest[i] = std::complex(1.0 - 2.0 * _code[_codeValueIndex], 0); //repeat the chip -> upsample } } } diff --git a/src/algorithms/libs/gps_l5_signal.cc b/src/algorithms/libs/gps_l5_signal.cc index 8fa132b63..8c301ee6e 100644 --- a/src/algorithms/libs/gps_l5_signal.cc +++ b/src/algorithms/libs/gps_l5_signal.cc @@ -32,9 +32,9 @@ #include "gps_l5_signal.h" #include "GPS_L5.h" +#include #include - std::deque l5i_xa_shift(std::deque xa) // GPS-IS-705E Figure 3-4 pp. 15 { if (xa == std::deque{true, true, true, true, true, true, true, true, true, true, true, false, true}) @@ -173,32 +173,30 @@ void make_l5q(gsl::span _dest, int32_t prn) void gps_l5i_code_gen_complex(gsl::span> _dest, uint32_t _prn) { - std::unique_ptr _code{new int32_t[GPS_L5I_CODE_LENGTH_CHIPS]}; - gsl::span _code_span(_code, GPS_L5I_CODE_LENGTH_CHIPS); + std::array _code{}; if (_prn > 0 and _prn < 51) { - make_l5i(_code_span, _prn - 1); + make_l5i(_code, _prn - 1); } for (int32_t i = 0; i < GPS_L5I_CODE_LENGTH_CHIPS; i++) { - _dest[i] = std::complex(1.0 - 2.0 * _code_span[i], 0.0); + _dest[i] = std::complex(1.0 - 2.0 * static_cast(_code[i]), 0.0); } } void gps_l5i_code_gen_float(gsl::span _dest, uint32_t _prn) { - std::unique_ptr _code{new int32_t[GPS_L5I_CODE_LENGTH_CHIPS]}; - gsl::span _code_span(_code, GPS_L5I_CODE_LENGTH_CHIPS); + std::array _code{}; if (_prn > 0 and _prn < 51) { - make_l5i(_code_span, _prn - 1); + make_l5i(_code, _prn - 1); } for (int32_t i = 0; i < GPS_L5I_CODE_LENGTH_CHIPS; i++) { - _dest[i] = 1.0 - 2.0 * static_cast(_code_span[i]); + _dest[i] = 1.0 - 2.0 * static_cast(_code[i]); } } @@ -208,11 +206,10 @@ void gps_l5i_code_gen_float(gsl::span _dest, uint32_t _prn) */ void gps_l5i_code_gen_complex_sampled(gsl::span> _dest, uint32_t _prn, int32_t _fs) { - std::unique_ptr _code{new int32_t[GPS_L5I_CODE_LENGTH_CHIPS]}; - gsl::span _code_span(_code, GPS_L5I_CODE_LENGTH_CHIPS); + std::array _code{}; if (_prn > 0 and _prn < 51) { - make_l5i(_code_span, _prn - 1); + make_l5i(_code, _prn - 1); } int32_t _samplesPerCode, _codeValueIndex; @@ -238,11 +235,11 @@ void gps_l5i_code_gen_complex_sampled(gsl::span> _dest, uint if (i == _samplesPerCode - 1) { //--- Correct the last index (due to number rounding issues) ----------- - _dest[i] = std::complex(1.0 - 2.0 * _code_span[_codeLength - 1], 0.0); + _dest[i] = std::complex(1.0 - 2.0 * _code[_codeLength - 1], 0.0); } else { - _dest[i] = std::complex(1.0 - 2.0 * _code_span[_codeValueIndex], 0.0); // repeat the chip -> upsample + _dest[i] = std::complex(1.0 - 2.0 * _code[_codeValueIndex], 0.0); // repeat the chip -> upsample } } } @@ -250,32 +247,30 @@ void gps_l5i_code_gen_complex_sampled(gsl::span> _dest, uint void gps_l5q_code_gen_complex(gsl::span> _dest, uint32_t _prn) { - std::unique_ptr _code{new int32_t[GPS_L5Q_CODE_LENGTH_CHIPS]}; - gsl::span _code_span(_code, GPS_L5Q_CODE_LENGTH_CHIPS); + std::array _code{}; if (_prn > 0 and _prn < 51) { - make_l5q(_code_span, _prn - 1); + make_l5q(_code, _prn - 1); } for (int32_t i = 0; i < GPS_L5Q_CODE_LENGTH_CHIPS; i++) { - _dest[i] = std::complex(1.0 - 2.0 * _code_span[i], 0.0); + _dest[i] = std::complex(1.0 - 2.0 * static_cast(_code[i]), 0.0); } } void gps_l5q_code_gen_float(gsl::span _dest, uint32_t _prn) { - std::unique_ptr _code{new int32_t[GPS_L5Q_CODE_LENGTH_CHIPS]}; - gsl::span _code_span(_code, GPS_L5Q_CODE_LENGTH_CHIPS); + std::array _code{}; if (_prn > 0 and _prn < 51) { - make_l5q(_code_span, _prn - 1); + make_l5q(_code, _prn - 1); } for (int32_t i = 0; i < GPS_L5Q_CODE_LENGTH_CHIPS; i++) { - _dest[i] = 1.0 - 2.0 * static_cast(_code_span[i]); + _dest[i] = 1.0 - 2.0 * static_cast(_code[i]); } } @@ -285,11 +280,10 @@ void gps_l5q_code_gen_float(gsl::span _dest, uint32_t _prn) */ void gps_l5q_code_gen_complex_sampled(gsl::span> _dest, uint32_t _prn, int32_t _fs) { - std::unique_ptr _code{new int32_t[GPS_L5Q_CODE_LENGTH_CHIPS]}; - gsl::span _code_span(_code, GPS_L5Q_CODE_LENGTH_CHIPS); + std::array _code{}; if (_prn > 0 and _prn < 51) { - make_l5q(_code_span, _prn - 1); + make_l5q(_code, _prn - 1); } int32_t _samplesPerCode, _codeValueIndex; @@ -316,11 +310,11 @@ void gps_l5q_code_gen_complex_sampled(gsl::span> _dest, uint if (i == _samplesPerCode - 1) { //--- Correct the last index (due to number rounding issues) ----------- - _dest[i] = std::complex(1.0 - 2.0 * _code_span[_codeLength - 1], 0); + _dest[i] = std::complex(1.0 - 2.0 * _code[_codeLength - 1], 0); } else { - _dest[i] = std::complex(1.0 - 2.0 * _code_span[_codeValueIndex], 0); // repeat the chip -> upsample + _dest[i] = std::complex(1.0 - 2.0 * _code[_codeValueIndex], 0); // repeat the chip -> upsample } } } diff --git a/src/algorithms/libs/gps_sdr_signal_processing.cc b/src/algorithms/libs/gps_sdr_signal_processing.cc index c7e79b0a9..66ebf8036 100644 --- a/src/algorithms/libs/gps_sdr_signal_processing.cc +++ b/src/algorithms/libs/gps_sdr_signal_processing.cc @@ -172,28 +172,27 @@ void gps_l1_ca_code_gen_complex_sampled(gsl::span> _dest, ui for (int32_t i = 0; i < _samplesPerCode; i++) { - //=== Digitizing ======================================================= + //=== Digitizing =================================================== - //--- Make index array to read C/A code values ------------------------- + //--- Make index array to read C/A code values --------------------- // The length of the index array depends on the sampling frequency - // number of samples per millisecond (because one C/A code period is one // millisecond). - // _codeValueIndex = ceil((_ts * ((float)i + 1)) / _tc) - 1; aux = (_ts * (i + 1)) / _tc; _codeValueIndex = auxCeil(aux) - 1; - //--- Make the digitized version of the C/A code ----------------------- + //--- Make the digitized version of the C/A code ------------------- // The "upsampled" code is made by selecting values form the CA code // chip array (caCode) for the time instances of each sample. if (i == _samplesPerCode - 1) { - //--- Correct the last index (due to number rounding issues) ----------- + //--- Correct the last index (due to number rounding issues) _dest[i] = _code[_codeLength - 1]; } else { - _dest[i] = _code[_codeValueIndex]; //repeat the chip -> upsample + _dest[i] = _code[_codeValueIndex]; // repeat the chip -> upsample } } } From 35852c7efbb437427c14d1de5704e842efe78f78 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Thu, 18 Jul 2019 22:57:45 +0200 Subject: [PATCH 12/36] clang-tidy fixes Reduce number of hicpp-signed-bitwise warnings See https://rules.sonarsource.com/c/RSPEC-854 --- src/algorithms/libs/gnss_signal_processing.cc | 2 ++ .../libs/libswiftcnav/bits.c | 30 +++++++++---------- .../libs/libswiftcnav/cnav_msg.c | 2 +- .../telemetry_decoder/libs/libswiftcnav/edc.c | 10 +++---- 4 files changed, 23 insertions(+), 21 deletions(-) diff --git a/src/algorithms/libs/gnss_signal_processing.cc b/src/algorithms/libs/gnss_signal_processing.cc index 63a244d8b..38f606d93 100644 --- a/src/algorithms/libs/gnss_signal_processing.cc +++ b/src/algorithms/libs/gnss_signal_processing.cc @@ -154,6 +154,8 @@ void hex_to_binary_converter(gsl::span _dest, char _from) _dest[2] = -1; _dest[3] = -1; break; + default: + break; } } diff --git a/src/algorithms/telemetry_decoder/libs/libswiftcnav/bits.c b/src/algorithms/telemetry_decoder/libs/libswiftcnav/bits.c index 3544aad03..df25601c5 100644 --- a/src/algorithms/telemetry_decoder/libs/libswiftcnav/bits.c +++ b/src/algorithms/telemetry_decoder/libs/libswiftcnav/bits.c @@ -51,11 +51,11 @@ static const uint8_t BITN[16] = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4} */ uint8_t parity(uint32_t x) { - x ^= x >> 16; - x ^= x >> 8; - x ^= x >> 4; - x &= 0xF; - return (0x6996 >> x) & 1; + x ^= x >> 16U; + x ^= x >> 8U; + x ^= x >> 4U; + x &= 0xFU; + return (0x6996U >> x) & 1U; } @@ -74,7 +74,7 @@ uint32_t getbitu(const uint8_t *buff, uint32_t pos, uint8_t len) uint32_t i = 0; for (i = pos; i < pos + len; i++) { - bits = (bits << 1) + + bits = (bits << 1U) + ((buff[i / 8] >> (7 - i % 8)) & 1U); } @@ -121,7 +121,7 @@ void setbitu(uint8_t *buff, uint32_t pos, uint32_t len, uint32_t data) return; } uint32_t i = 0; - for (i = pos; i < pos + len; i++, mask >>= 1) + for (i = pos; i < pos + len; i++, mask >>= 1U) { if (data & mask) { @@ -246,10 +246,10 @@ void bitcopy(void *dst, uint32_t dst_index, const void *src, uint32_t src_index, uint8_t count_bits_u64(uint64_t v, uint8_t bv) { uint8_t r = 0; - int i = 0; + uint32_t i = 0; for (i = 0; i < 16; i++) { - r += BITN[(v >> (i * 4)) & 0xf]; + r += BITN[(v >> (i * 4U)) & 0xFU]; } return bv == 1 ? r : 64 - r; } @@ -265,10 +265,10 @@ uint8_t count_bits_u64(uint64_t v, uint8_t bv) uint8_t count_bits_u32(uint32_t v, uint8_t bv) { uint8_t r = 0; - int i = 0; + uint32_t i = 0; for (i = 0; i < 8; i++) { - r += BITN[(v >> (i * 4)) & 0xf]; + r += BITN[(v >> (i * 4U)) & 0xFU]; } return bv == 1 ? r : 32 - r; } @@ -284,10 +284,10 @@ uint8_t count_bits_u32(uint32_t v, uint8_t bv) uint8_t count_bits_u16(uint16_t v, uint8_t bv) { uint8_t r = 0; - int i = 0; + uint32_t i = 0; for (i = 0; i < 4; i++) { - r += BITN[(v >> (i * 4)) & 0xf]; + r += BITN[(v >> (i * 4U)) & 0xFU]; } return bv == 1 ? r : 16 - r; } @@ -303,10 +303,10 @@ uint8_t count_bits_u16(uint16_t v, uint8_t bv) uint8_t count_bits_u8(uint8_t v, uint8_t bv) { uint8_t r = 0; - int i = 0; + uint32_t i = 0; for (i = 0; i < 2; i++) { - r += BITN[(v >> (i * 4)) & 0xf]; + r += BITN[(v >> (i * 4U)) & 0xFU]; } return bv == 1 ? r : 8 - r; } diff --git a/src/algorithms/telemetry_decoder/libs/libswiftcnav/cnav_msg.c b/src/algorithms/telemetry_decoder/libs/libswiftcnav/cnav_msg.c index 260237d40..271fc6504 100644 --- a/src/algorithms/telemetry_decoder/libs/libswiftcnav/cnav_msg.c +++ b/src/algorithms/telemetry_decoder/libs/libswiftcnav/cnav_msg.c @@ -106,7 +106,7 @@ static uint32_t _cnav_extract_crc(const cnav_v27_part_t *part) GPS_CNAV_MSG_CRC_LENGTH); if (part->invert) { - crc ^= 0xFFFFFF; + crc ^= 0xFFFFFFU; } return crc; } diff --git a/src/algorithms/telemetry_decoder/libs/libswiftcnav/edc.c b/src/algorithms/telemetry_decoder/libs/libswiftcnav/edc.c index 7bb1e644b..06aa471f4 100644 --- a/src/algorithms/telemetry_decoder/libs/libswiftcnav/edc.c +++ b/src/algorithms/telemetry_decoder/libs/libswiftcnav/edc.c @@ -93,7 +93,7 @@ uint32_t crc24q(const uint8_t *buf, uint32_t len, uint32_t crc) uint32_t i = 0; for (i = 0; i < len; i++) { - crc = ((crc << 8) & 0xFFFFFF) ^ CRC24QTAB[((crc >> 16) ^ buf[i]) & 0xff]; + crc = ((crc << 8U) & 0xFFFFFFU) ^ CRC24QTAB[((crc >> 16U) ^ buf[i]) & 0xFFU]; } return crc; } @@ -122,21 +122,21 @@ uint32_t crc24q_bits(uint32_t crc, const uint8_t *buf, uint32_t n_bits, bool inv uint32_t i = 0; for (i = 0; i < n_bits / 8; ++i) { - acc = (acc << 8) | *buf++; + acc = (acc << 8U) | *buf++; if (invert) { acc ^= 0xFFU; } b = (acc >> shift) & 0xFFU; - crc = ((crc << 8) & 0xFFFFFFU) ^ CRC24QTAB[((crc >> 16) ^ b) & 0xFFU]; + crc = ((crc << 8U) & 0xFFFFFFU) ^ CRC24QTAB[((crc >> 16U) ^ b) & 0xFFU]; } - acc = (acc << 8) | *buf; + acc = (acc << 8U) | *buf; if (invert) { acc ^= 0xFFU; } b = (acc >> shift) & 0xFFU; - crc = ((crc << 8) & 0xFFFFFFU) ^ CRC24QTAB[((crc >> 16) ^ b) & 0xFFU]; + crc = ((crc << 8U) & 0xFFFFFFU) ^ CRC24QTAB[((crc >> 16U) ^ b) & 0xFFU]; return crc; } From 7fa7f5f6dcdeedbd1abc793574b7b432b5072b3f Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Thu, 18 Jul 2019 23:57:12 +0200 Subject: [PATCH 13/36] Update Matio local version --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1872be76f..9e4865db9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -401,7 +401,7 @@ set(GNSSSDR_ARMADILLO_LOCAL_VERSION "9.600.x") set(GNSSSDR_GTEST_LOCAL_VERSION "1.8.1") set(GNSSSDR_GNSS_SIM_LOCAL_VERSION "master") set(GNSSSDR_GPSTK_LOCAL_VERSION "2.10.6") -set(GNSSSDR_MATIO_LOCAL_VERSION "1.5.16") +set(GNSSSDR_MATIO_LOCAL_VERSION "1.5.17") set(GNSSSDR_PUGIXML_LOCAL_VERSION "1.9") set(GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION "3.9.0") From 0ddb063784bd508785b06953644b263bc44e1e4b Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Fri, 19 Jul 2019 18:23:36 +0200 Subject: [PATCH 14/36] Modernize code Automatize memory management De-clutter clan-tidy warnings by fixing obvious issues --- ...o_e5a_noncoherent_iq_acquisition_caf_cc.cc | 7 +- .../galileo_pcps_8ms_acquisition_cc.cc | 9 +- .../gnuradio_blocks/pcps_acquisition.cc | 5 +- .../pcps_acquisition_fine_doppler_cc.cc | 10 +- .../pcps_assisted_acquisition_cc.cc | 6 +- .../pcps_cccwsr_acquisition_cc.cc | 5 +- .../pcps_opencl_acquisition_cc.cc | 7 +- .../pcps_quicksync_acquisition_cc.cc | 6 +- .../pcps_tong_acquisition_cc.cc | 7 +- .../gnuradio_blocks/CMakeLists.txt | 1 - .../gnuradio_blocks/signal_generator_c.cc | 35 ++----- .../gnuradio_blocks/signal_generator_c.h | 9 +- .../gnuradio_blocks/CMakeLists.txt | 1 - .../beidou_b1i_telemetry_decoder_gs.cc | 32 ++----- .../beidou_b1i_telemetry_decoder_gs.h | 10 +- .../beidou_b3i_telemetry_decoder_gs.cc | 38 ++------ .../beidou_b3i_telemetry_decoder_gs.h | 9 +- .../galileo_telemetry_decoder_gs.cc | 71 ++++++-------- .../galileo_telemetry_decoder_gs.h | 15 ++- .../glonass_l1_ca_telemetry_decoder_gs.cc | 26 ++---- .../glonass_l1_ca_telemetry_decoder_gs.h | 51 +++++----- .../glonass_l2_ca_telemetry_decoder_gs.cc | 28 ++---- .../glonass_l2_ca_telemetry_decoder_gs.h | 41 +++++---- .../gps_l1_ca_telemetry_decoder_gs.cc | 17 ++-- .../gps_l1_ca_telemetry_decoder_gs.h | 3 +- .../libs/libswiftcnav/viterbi27.c | 92 +++++++++---------- .../telemetry_decoder/libs/viterbi_decoder.cc | 62 +++++-------- .../telemetry_decoder/libs/viterbi_decoder.h | 17 ++-- .../gnuradio_blocks/dll_pll_veml_tracking.cc | 16 +--- .../dll_pll_veml_tracking_fpga.cc | 18 ++-- src/core/system_parameters/Beidou_DNAV.h | 10 +- .../beidou_dnav_navigation_message.cc | 22 ++--- .../system_parameters/galileo_fnav_message.cc | 2 +- .../galileo_navigation_message.cc | 7 +- .../glonass_gnav_navigation_message.cc | 10 +- .../gps_cnav_navigation_message.cc | 2 +- 36 files changed, 288 insertions(+), 419 deletions(-) diff --git a/src/algorithms/acquisition/gnuradio_blocks/galileo_e5a_noncoherent_iq_acquisition_caf_cc.cc b/src/algorithms/acquisition/gnuradio_blocks/galileo_e5a_noncoherent_iq_acquisition_caf_cc.cc index 41a5ab093..e94642af5 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/galileo_e5a_noncoherent_iq_acquisition_caf_cc.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/galileo_e5a_noncoherent_iq_acquisition_caf_cc.cc @@ -40,9 +40,9 @@ #include #include #include +#include #include #include -#include galileo_e5a_noncoherentIQ_acquisition_caf_cc_sptr galileo_e5a_noncoherentIQ_make_acquisition_caf_cc( @@ -310,9 +310,8 @@ void galileo_e5a_noncoherentIQ_acquisition_caf_cc::init() d_grid_doppler_wipeoffs[doppler_index] = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); int doppler = -static_cast(d_doppler_max) + d_doppler_step * doppler_index; float phase_step_rad = GALILEO_TWO_PI * doppler / static_cast(d_fs_in); - float _phase[1]; - _phase[0] = 0; - volk_gnsssdr_s32f_sincos_32fc(d_grid_doppler_wipeoffs[doppler_index], -phase_step_rad, _phase, d_fft_size); + std::array _phase{}; + volk_gnsssdr_s32f_sincos_32fc(d_grid_doppler_wipeoffs[doppler_index], -phase_step_rad, _phase.data(), d_fft_size); } /* CAF Filtering to resolve doppler ambiguity. Phase and quadrature must be processed 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 2fcdc7afe..bc77ac955 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 @@ -34,9 +34,9 @@ #include #include #include +#include #include #include -#include galileo_pcps_8ms_acquisition_cc_sptr galileo_pcps_8ms_make_acquisition_cc( @@ -192,9 +192,8 @@ void galileo_pcps_8ms_acquisition_cc::init() d_grid_doppler_wipeoffs[doppler_index] = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); int32_t doppler = -static_cast(d_doppler_max) + d_doppler_step * doppler_index; float phase_step_rad = static_cast(GALILEO_TWO_PI) * doppler / static_cast(d_fs_in); - float _phase[1]; - _phase[0] = 0; - volk_gnsssdr_s32f_sincos_32fc(d_grid_doppler_wipeoffs[doppler_index], -phase_step_rad, _phase, d_fft_size); + std::array _phase{}; + volk_gnsssdr_s32f_sincos_32fc(d_grid_doppler_wipeoffs[doppler_index], -phase_step_rad, _phase.data(), d_fft_size); } } @@ -358,7 +357,7 @@ int galileo_pcps_8ms_acquisition_cc::general_work(int noutput_items, std::streamsize n = 2 * sizeof(float) * (d_fft_size); // complex file write filename.str(""); filename << "../data/test_statistics_" << d_gnss_synchro->System - << "_" << d_gnss_synchro->Signal << "_sat_" + << "_" << d_gnss_synchro->Signal[0] << d_gnss_synchro->Signal[1] << "_sat_" << d_gnss_synchro->PRN << "_doppler_" << doppler << ".dat"; d_dump_file.open(filename.str().c_str(), std::ios::out | std::ios::binary); d_dump_file.write(reinterpret_cast(d_ifft->get_outbuf()), n); //write directly |abs(x)|^2 in this Doppler bin? diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc index 6b5939989..c4b42360f 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc @@ -284,9 +284,8 @@ void pcps_acquisition::update_local_carrier(gsl::span carrier_vector { phase_step_rad = GPS_TWO_PI * freq / static_cast(acq_parameters.fs_in); } - float _phase[1]; - _phase[0] = 0.0; - volk_gnsssdr_s32f_sincos_32fc(carrier_vector.data(), -phase_step_rad, _phase, carrier_vector.length()); + std::array _phase{}; + volk_gnsssdr_s32f_sincos_32fc(carrier_vector.data(), -phase_step_rad, _phase.data(), carrier_vector.length()); } diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fine_doppler_cc.cc b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fine_doppler_cc.cc index 736b1f41b..8040fb39e 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fine_doppler_cc.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fine_doppler_cc.cc @@ -158,11 +158,11 @@ pcps_acquisition_fine_doppler_cc::pcps_acquisition_fine_doppler_cc(const Acq_Con unsigned int pcps_acquisition_fine_doppler_cc::nextPowerOf2(unsigned int n) { n--; - n |= n >> 1; - n |= n >> 2; - n |= n >> 4; - n |= n >> 8; - n |= n >> 16; + n |= n >> 1U; + n |= n >> 2U; + n |= n >> 4U; + n |= n >> 8U; + n |= n >> 16U; n++; return n; } diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_assisted_acquisition_cc.cc b/src/algorithms/acquisition/gnuradio_blocks/pcps_assisted_acquisition_cc.cc index 25997df63..2577fea7f 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_assisted_acquisition_cc.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_assisted_acquisition_cc.cc @@ -38,6 +38,7 @@ #include #include #include +#include #include #include #include @@ -233,9 +234,8 @@ void pcps_assisted_acquisition_cc::redefine_grid() // doppler search steps // compute the carrier doppler wipe-off signal and store it phase_step_rad = static_cast(GPS_TWO_PI) * doppler_hz / static_cast(d_fs_in); - float _phase[1]; - _phase[0] = 0; - volk_gnsssdr_s32f_sincos_32fc(d_grid_doppler_wipeoffs[doppler_index].data(), -phase_step_rad, _phase, d_fft_size); + std::array _phase{}; + volk_gnsssdr_s32f_sincos_32fc(d_grid_doppler_wipeoffs[doppler_index].data(), -phase_step_rad, _phase.data(), d_fft_size); } } 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 646885ee7..40ae575aa 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_cccwsr_acquisition_cc.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_cccwsr_acquisition_cc.cc @@ -206,9 +206,8 @@ void pcps_cccwsr_acquisition_cc::init() int32_t doppler = -static_cast(d_doppler_max) + d_doppler_step * doppler_index; float phase_step_rad = GPS_TWO_PI * doppler / static_cast(d_fs_in); - float _phase[1]; - _phase[0] = 0; - volk_gnsssdr_s32f_sincos_32fc(d_grid_doppler_wipeoffs[doppler_index], -phase_step_rad, _phase, d_fft_size); + std::array _phase{}; + volk_gnsssdr_s32f_sincos_32fc(d_grid_doppler_wipeoffs[doppler_index], -phase_step_rad, _phase.data(), d_fft_size); } } 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 1516791c4..d17e323f6 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_opencl_acquisition_cc.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_opencl_acquisition_cc.cc @@ -57,11 +57,11 @@ #include #include #include +#include #include #include #include #include -#include pcps_opencl_acquisition_cc_sptr pcps_make_opencl_acquisition_cc( @@ -324,9 +324,8 @@ void pcps_opencl_acquisition_cc::init() int doppler = -static_cast(d_doppler_max) + d_doppler_step * doppler_index; float phase_step_rad = static_cast(GPS_TWO_PI) * doppler / static_cast(d_fs_in); - float _phase[1]; - _phase[0] = 0; - volk_gnsssdr_s32f_sincos_32fc(d_grid_doppler_wipeoffs[doppler_index], -phase_step_rad, _phase, d_fft_size); + std::array _phase{}; + volk_gnsssdr_s32f_sincos_32fc(d_grid_doppler_wipeoffs[doppler_index], -phase_step_rad, _phase.data(), d_fft_size); if (d_opencl == 0) { 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 2d08083da..8d0c7e97f 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_quicksync_acquisition_cc.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_quicksync_acquisition_cc.cc @@ -38,7 +38,6 @@ #include #include #include -#include pcps_quicksync_acquisition_cc_sptr pcps_quicksync_make_acquisition_cc( @@ -235,9 +234,8 @@ void pcps_quicksync_acquisition_cc::init() d_grid_doppler_wipeoffs[doppler_index] = static_cast(volk_gnsssdr_malloc(d_samples_per_code * d_folding_factor * sizeof(gr_complex), volk_gnsssdr_get_alignment())); int32_t doppler = -static_cast(d_doppler_max) + d_doppler_step * doppler_index; float phase_step_rad = GPS_TWO_PI * doppler / static_cast(d_fs_in); - float _phase[1]; - _phase[0] = 0; - volk_gnsssdr_s32f_sincos_32fc(d_grid_doppler_wipeoffs[doppler_index], -phase_step_rad, _phase, d_samples_per_code * d_folding_factor); + std::array _phase{}; + volk_gnsssdr_s32f_sincos_32fc(d_grid_doppler_wipeoffs[doppler_index], -phase_step_rad, _phase.data(), d_samples_per_code * d_folding_factor); } // DLOG(INFO) << "end init"; } 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 3238161bd..ca592a8e2 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_tong_acquisition_cc.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_tong_acquisition_cc.cc @@ -54,9 +54,9 @@ #include #include #include +#include #include #include -#include pcps_tong_acquisition_cc_sptr pcps_tong_make_acquisition_cc( @@ -211,9 +211,8 @@ void pcps_tong_acquisition_cc::init() int32_t doppler = -static_cast(d_doppler_max) + d_doppler_step * doppler_index; float phase_step_rad = GPS_TWO_PI * doppler / static_cast(d_fs_in); - float _phase[1]; - _phase[0] = 0; - volk_gnsssdr_s32f_sincos_32fc(d_grid_doppler_wipeoffs[doppler_index], -phase_step_rad, _phase, d_fft_size); + std::array _phase{}; + volk_gnsssdr_s32f_sincos_32fc(d_grid_doppler_wipeoffs[doppler_index], -phase_step_rad, _phase.data(), d_fft_size); d_grid_data[doppler_index] = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(float), volk_gnsssdr_get_alignment())); diff --git a/src/algorithms/signal_generator/gnuradio_blocks/CMakeLists.txt b/src/algorithms/signal_generator/gnuradio_blocks/CMakeLists.txt index 99e7debab..8e18bd790 100644 --- a/src/algorithms/signal_generator/gnuradio_blocks/CMakeLists.txt +++ b/src/algorithms/signal_generator/gnuradio_blocks/CMakeLists.txt @@ -28,7 +28,6 @@ add_library(signal_generator_gr_blocks target_link_libraries(signal_generator_gr_blocks PUBLIC - Boost::boost Gnuradio::runtime core_system_parameters PRIVATE diff --git a/src/algorithms/signal_generator/gnuradio_blocks/signal_generator_c.cc b/src/algorithms/signal_generator/gnuradio_blocks/signal_generator_c.cc index 6c8d9d580..118c00e57 100644 --- a/src/algorithms/signal_generator/gnuradio_blocks/signal_generator_c.cc +++ b/src/algorithms/signal_generator/gnuradio_blocks/signal_generator_c.cc @@ -97,7 +97,7 @@ void signal_generator_c::init() { work_counter_ = 0; - complex_phase_ = static_cast(volk_gnsssdr_malloc(vector_length_ * sizeof(gr_complex), volk_gnsssdr_get_alignment())); + complex_phase_.reserve(vector_length_); // True if Galileo satellites are present bool galileo_signal = std::find(system_.begin(), system_.end(), "E") != system_.end(); @@ -152,13 +152,13 @@ void signal_generator_c::init() void signal_generator_c::generate_codes() { - sampled_code_data_.reset(new gr_complex *[num_sats_]); - sampled_code_pilot_.reset(new gr_complex *[num_sats_]); + //sampled_code_data_.reset(new gr_complex *[num_sats_]); + //sampled_code_pilot_.reset(new gr_complex *[num_sats_]); + sampled_code_data_ = std::vector>(num_sats_, std::vector(vector_length_)); + sampled_code_pilot_ = std::vector>(num_sats_, std::vector(vector_length_)); for (unsigned int sat = 0; sat < num_sats_; sat++) { - sampled_code_data_[sat] = static_cast(std::malloc(vector_length_ * sizeof(gr_complex))); - std::array code{}; //[samples_per_code_[sat]]; if (system_[sat] == "G") @@ -211,7 +211,7 @@ void signal_generator_c::generate_codes() { std::array signal = {{'5', 'X', '\0'}}; - galileo_e5_a_code_gen_complex_sampled(gsl::span(sampled_code_data_[sat], vector_length_), signal, PRN_[sat], fs_in_, + galileo_e5_a_code_gen_complex_sampled(sampled_code_data_[sat], signal, PRN_[sat], fs_in_, static_cast(GALILEO_E5A_CODE_LENGTH_CHIPS) - delay_chips_[sat]); //noise if (noise_flag_) @@ -248,11 +248,10 @@ void signal_generator_c::generate_codes() } // Generate E1C signal (25 code-periods, with secondary code) - sampled_code_pilot_[sat] = static_cast(std::malloc(vector_length_ * sizeof(gr_complex))); std::array signal_1C = {{'1', 'C', '\0'}}; - galileo_e1_code_gen_complex_sampled(gsl::span(sampled_code_pilot_[sat], vector_length_), signal_1C, cboc, PRN_[sat], fs_in_, + galileo_e1_code_gen_complex_sampled(gsl::span(sampled_code_pilot_[sat].data(), vector_length_), signal_1C, cboc, PRN_[sat], fs_in_, static_cast(GALILEO_E1_B_CODE_LENGTH_CHIPS) - delay_chips_[sat], true); // Obtain the desired CN0 assuming that Pn = 1. @@ -269,20 +268,6 @@ void signal_generator_c::generate_codes() } -signal_generator_c::~signal_generator_c() -{ - /* for (unsigned int sat = 0; sat < num_sats_; sat++) - { - std::free(sampled_code_data_[sat]); - if (system_[sat] == "E" && signal_[sat].at(0) != '5') - { - std::free(sampled_code_pilot_[sat]); - } - } */ - volk_gnsssdr_free(complex_phase_); -} - - int signal_generator_c::general_work(int noutput_items __attribute__((unused)), gr_vector_int &ninput_items __attribute__((unused)), gr_vector_const_void_star &input_items __attribute__((unused)), @@ -306,9 +291,9 @@ int signal_generator_c::general_work(int noutput_items __attribute__((unused)), for (unsigned int sat = 0; sat < num_sats_; sat++) { float phase_step_rad = -static_cast(GPS_TWO_PI) * doppler_Hz_[sat] / static_cast(fs_in_); - float _phase[1]; + std::array _phase{}; _phase[0] = -start_phase_rad_[sat]; - volk_gnsssdr_s32f_sincos_32fc(complex_phase_, -phase_step_rad, _phase, vector_length_); + volk_gnsssdr_s32f_sincos_32fc(complex_phase_.data(), -phase_step_rad, _phase.data(), vector_length_); start_phase_rad_[sat] += vector_length_ * phase_step_rad; out_idx = 0; @@ -346,7 +331,7 @@ int signal_generator_c::general_work(int noutput_items __attribute__((unused)), phase_step_rad = -static_cast(GPS_TWO_PI) * (freq + (DFRQ1_GLO * GLONASS_PRN.at(PRN_[sat])) + doppler_Hz_[sat]) / static_cast(fs_in_); // std::cout << "sat " << PRN_[sat] << " SG - Freq = " << (freq + (DFRQ1_GLO * GLONASS_PRN.at(PRN_[sat]))) << " Doppler = " << doppler_Hz_[sat] << std::endl; _phase[0] = -start_phase_rad_[sat]; - volk_gnsssdr_s32f_sincos_32fc(complex_phase_, -phase_step_rad, _phase, vector_length_); + volk_gnsssdr_s32f_sincos_32fc(complex_phase_.data(), -phase_step_rad, _phase.data(), vector_length_); unsigned int delay_samples = (delay_chips_[sat] % static_cast(GLONASS_L1_CA_CODE_LENGTH_CHIPS)) * samples_per_code_[sat] / GLONASS_L1_CA_CODE_LENGTH_CHIPS; diff --git a/src/algorithms/signal_generator/gnuradio_blocks/signal_generator_c.h b/src/algorithms/signal_generator/gnuradio_blocks/signal_generator_c.h index a6fb316bf..b0a8fb574 100644 --- a/src/algorithms/signal_generator/gnuradio_blocks/signal_generator_c.h +++ b/src/algorithms/signal_generator/gnuradio_blocks/signal_generator_c.h @@ -32,7 +32,6 @@ #define GNSS_SDR_SIGNAL_GENERATOR_C_H #include "gnss_signal.h" -#include #include #include #include @@ -83,7 +82,7 @@ signal_generator_c_sptr signal_make_generator_c( class signal_generator_c : public gr::block { public: - ~signal_generator_c(); // public destructor + ~signal_generator_c() = default; // public destructor // Where all the action really happens int general_work(int noutput_items, @@ -146,9 +145,9 @@ private: std::vector current_data_bit_int_; std::vector data_modulation_; std::vector pilot_modulation_; - boost::scoped_array sampled_code_data_; - boost::scoped_array sampled_code_pilot_; - gr_complex *complex_phase_; + std::vector> sampled_code_data_; + std::vector> sampled_code_pilot_; + std::vector complex_phase_; unsigned int work_counter_; std::random_device r; std::default_random_engine e1; diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/CMakeLists.txt b/src/algorithms/telemetry_decoder/gnuradio_blocks/CMakeLists.txt index 9a356c790..1ad718a41 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/CMakeLists.txt +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/CMakeLists.txt @@ -56,7 +56,6 @@ target_link_libraries(telemetry_decoder_gr_blocks telemetry_decoder_libs core_system_parameters Gnuradio::runtime - Volkgnsssdr::volkgnsssdr Boost::boost PRIVATE Gflags::gflags diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b1i_telemetry_decoder_gs.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b1i_telemetry_decoder_gs.cc index c6f1eff5f..fe2eed98a 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b1i_telemetry_decoder_gs.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b1i_telemetry_decoder_gs.cc @@ -42,12 +42,10 @@ #include #include // for make_any #include // for mp -#include -#include -#include // for abs -#include // for exception -#include // for cout -#include // for shared_ptr, make_shared +#include // for abs +#include // for exception +#include // for cout +#include // for shared_ptr, make_shared #define CRC_ERROR_LIMIT 8 @@ -64,7 +62,7 @@ beidou_b1i_telemetry_decoder_gs::beidou_b1i_telemetry_decoder_gs( gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { - //prevent telemetry symbols accumulation in output buffers + // prevent telemetry symbols accumulation in output buffers this->set_max_noutput_items(1); // Ephemeris data port out this->message_port_register_out(pmt::mp("telemetry")); @@ -78,7 +76,6 @@ beidou_b1i_telemetry_decoder_gs::beidou_b1i_telemetry_decoder_gs( d_symbol_duration_ms = BEIDOU_B1I_TELEMETRY_SYMBOLS_PER_BIT * BEIDOU_B1I_CODE_PERIOD_MS; d_symbols_per_preamble = BEIDOU_DNAV_PREAMBLE_LENGTH_SYMBOLS; d_samples_per_preamble = BEIDOU_DNAV_PREAMBLE_LENGTH_SYMBOLS; - d_preamble_samples = static_cast(volk_gnsssdr_malloc(d_samples_per_preamble * sizeof(int32_t), volk_gnsssdr_get_alignment())); d_preamble_period_samples = BEIDOU_DNAV_PREAMBLE_PERIOD_SYMBOLS; // Setting samples of preamble code @@ -94,7 +91,6 @@ beidou_b1i_telemetry_decoder_gs::beidou_b1i_telemetry_decoder_gs( } } - d_subframe_symbols = static_cast(volk_gnsssdr_malloc(BEIDOU_DNAV_PREAMBLE_PERIOD_SYMBOLS * sizeof(float), volk_gnsssdr_get_alignment())); d_required_symbols = BEIDOU_DNAV_SUBFRAME_SYMBOLS + d_samples_per_preamble; d_symbol_history.set_capacity(d_required_symbols); @@ -118,9 +114,6 @@ beidou_b1i_telemetry_decoder_gs::beidou_b1i_telemetry_decoder_gs( beidou_b1i_telemetry_decoder_gs::~beidou_b1i_telemetry_decoder_gs() { - volk_gnsssdr_free(d_preamble_samples); - volk_gnsssdr_free(d_subframe_symbols); - if (d_dump_file.is_open() == true) { try @@ -299,13 +292,8 @@ void beidou_b1i_telemetry_decoder_gs::set_satellite(const Gnss_Satellite &satell // Update tel dec parameters for D2 NAV Messages if (sat_prn > 0 and sat_prn < 6) { - // Clear values from previous declaration - volk_gnsssdr_free(d_preamble_samples); - volk_gnsssdr_free(d_subframe_symbols); - d_symbols_per_preamble = BEIDOU_DNAV_PREAMBLE_LENGTH_SYMBOLS; d_samples_per_preamble = BEIDOU_DNAV_PREAMBLE_LENGTH_SYMBOLS; - d_preamble_samples = static_cast(volk_gnsssdr_malloc(d_samples_per_preamble * sizeof(int32_t), volk_gnsssdr_get_alignment())); d_preamble_period_samples = BEIDOU_DNAV_PREAMBLE_PERIOD_SYMBOLS; // Setting samples of preamble code @@ -322,20 +310,15 @@ void beidou_b1i_telemetry_decoder_gs::set_satellite(const Gnss_Satellite &satell } d_symbol_duration_ms = BEIDOU_B1I_GEO_TELEMETRY_SYMBOLS_PER_BIT * BEIDOU_B1I_CODE_PERIOD_MS; - d_subframe_symbols = static_cast(volk_gnsssdr_malloc(BEIDOU_DNAV_PREAMBLE_PERIOD_SYMBOLS * sizeof(float), volk_gnsssdr_get_alignment())); d_required_symbols = BEIDOU_DNAV_SUBFRAME_SYMBOLS + d_samples_per_preamble; d_symbol_history.set_capacity(d_required_symbols); } else { - // Clear values from previous declaration - volk_gnsssdr_free(d_preamble_samples); - volk_gnsssdr_free(d_subframe_symbols); //back to normal satellites d_symbol_duration_ms = BEIDOU_B1I_TELEMETRY_SYMBOLS_PER_BIT * BEIDOU_B1I_CODE_PERIOD_MS; d_symbols_per_preamble = BEIDOU_DNAV_PREAMBLE_LENGTH_SYMBOLS; d_samples_per_preamble = BEIDOU_DNAV_PREAMBLE_LENGTH_SYMBOLS; - d_preamble_samples = static_cast(volk_gnsssdr_malloc(d_samples_per_preamble * sizeof(int32_t), volk_gnsssdr_get_alignment())); d_preamble_period_samples = BEIDOU_DNAV_PREAMBLE_PERIOD_SYMBOLS; // Setting samples of preamble code @@ -351,7 +334,6 @@ void beidou_b1i_telemetry_decoder_gs::set_satellite(const Gnss_Satellite &satell } } - d_subframe_symbols = static_cast(volk_gnsssdr_malloc(BEIDOU_DNAV_PREAMBLE_PERIOD_SYMBOLS * sizeof(float), volk_gnsssdr_get_alignment())); d_required_symbols = BEIDOU_DNAV_SUBFRAME_SYMBOLS + d_samples_per_preamble; d_symbol_history.set_capacity(d_required_symbols); } @@ -470,7 +452,7 @@ int beidou_b1i_telemetry_decoder_gs::general_work(int noutput_items __attribute_ } // call the decoder - decode_subframe(d_subframe_symbols); + decode_subframe(d_subframe_symbols.data()); if (d_nav.flag_crc_test == true) { @@ -527,7 +509,7 @@ int beidou_b1i_telemetry_decoder_gs::general_work(int noutput_items __attribute_ } // call the decoder - decode_subframe(d_subframe_symbols); + decode_subframe(d_subframe_symbols.data()); if (d_nav.flag_crc_test == true) { diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b1i_telemetry_decoder_gs.h b/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b1i_telemetry_decoder_gs.h index 9485008fd..448079d8b 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b1i_telemetry_decoder_gs.h +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b1i_telemetry_decoder_gs.h @@ -43,6 +43,7 @@ #include #include #include +#include class beidou_b1i_telemetry_decoder_gs; @@ -63,7 +64,7 @@ public: void set_satellite(const Gnss_Satellite &satellite); //!< Set satellite PRN void set_channel(int channel); //!< Set receiver's channel void reset(); - + /*! * \brief This is where all signal processing takes place */ @@ -79,13 +80,12 @@ private: void decode_word(int32_t word_counter, const float *enc_word_symbols, int32_t *dec_word_symbols); void decode_bch15_11_01(const int32_t *bits, int32_t *decbits); - // Preamble decoding - int32_t *d_preamble_samples; + std::array d_preamble_samples{}; int32_t d_symbols_per_preamble; int32_t d_samples_per_preamble; int32_t d_preamble_period_samples; - float *d_subframe_symbols; + std::array d_subframe_symbols{}; uint32_t d_required_symbols; // Storage for incoming data @@ -100,7 +100,7 @@ private: int32_t d_CRC_error_counter; // Number of failed CRC operations bool flag_SOW_set; // Indicates when time of week is set - //!< Navigation Message variable + // Navigation Message variable Beidou_Dnav_Navigation_Message d_nav; // Values to populate gnss synchronization structure diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b3i_telemetry_decoder_gs.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b3i_telemetry_decoder_gs.cc index bae4a4a0f..10c019cf7 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b3i_telemetry_decoder_gs.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b3i_telemetry_decoder_gs.cc @@ -41,12 +41,10 @@ #include #include // for make_any #include // for mp -#include -#include -#include // for abs -#include // for exception -#include // for cout -#include // for shared_ptr, make_shared +#include // for abs +#include // for exception +#include // for cout +#include // for shared_ptr, make_shared #define CRC_ERROR_LIMIT 8 @@ -64,7 +62,7 @@ beidou_b3i_telemetry_decoder_gs::beidou_b3i_telemetry_decoder_gs( gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { - //prevent telemetry symbols accumulation in output buffers + // prevent telemetry symbols accumulation in output buffers this->set_max_noutput_items(1); // Ephemeris data port out this->message_port_register_out(pmt::mp("telemetry")); @@ -78,7 +76,6 @@ beidou_b3i_telemetry_decoder_gs::beidou_b3i_telemetry_decoder_gs( d_symbol_duration_ms = BEIDOU_B3I_TELEMETRY_SYMBOLS_PER_BIT * BEIDOU_B3I_CODE_PERIOD_MS; d_symbols_per_preamble = BEIDOU_DNAV_PREAMBLE_LENGTH_SYMBOLS; d_samples_per_preamble = BEIDOU_DNAV_PREAMBLE_LENGTH_SYMBOLS; - d_preamble_samples = static_cast(volk_gnsssdr_malloc(d_samples_per_preamble * sizeof(int32_t), volk_gnsssdr_get_alignment())); d_preamble_period_samples = BEIDOU_DNAV_PREAMBLE_PERIOD_SYMBOLS; // Setting samples of preamble code @@ -94,7 +91,6 @@ beidou_b3i_telemetry_decoder_gs::beidou_b3i_telemetry_decoder_gs( } } - d_subframe_symbols = static_cast(volk_gnsssdr_malloc(BEIDOU_DNAV_PREAMBLE_PERIOD_SYMBOLS * sizeof(float), volk_gnsssdr_get_alignment())); d_required_symbols = BEIDOU_DNAV_SUBFRAME_SYMBOLS + d_samples_per_preamble; d_symbol_history.set_capacity(d_required_symbols); @@ -118,9 +114,6 @@ beidou_b3i_telemetry_decoder_gs::beidou_b3i_telemetry_decoder_gs( beidou_b3i_telemetry_decoder_gs::~beidou_b3i_telemetry_decoder_gs() { - volk_gnsssdr_free(d_preamble_samples); - volk_gnsssdr_free(d_subframe_symbols); - if (d_dump_file.is_open() == true) { try @@ -317,15 +310,8 @@ void beidou_b3i_telemetry_decoder_gs::set_satellite( // Update tel dec parameters for D2 NAV Messages if (sat_prn > 0 and sat_prn < 6) { - // Clear values from previous declaration - volk_gnsssdr_free(d_preamble_samples); - volk_gnsssdr_free(d_subframe_symbols); - - d_symbols_per_preamble = BEIDOU_DNAV_PREAMBLE_LENGTH_SYMBOLS; d_samples_per_preamble = BEIDOU_DNAV_PREAMBLE_LENGTH_SYMBOLS; - d_preamble_samples = static_cast(volk_gnsssdr_malloc(d_samples_per_preamble * sizeof(int32_t), - volk_gnsssdr_get_alignment())); d_preamble_period_samples = BEIDOU_DNAV_PREAMBLE_PERIOD_SYMBOLS; // Setting samples of preamble code @@ -341,22 +327,15 @@ void beidou_b3i_telemetry_decoder_gs::set_satellite( } } d_symbol_duration_ms = BEIDOU_B3I_GEO_TELEMETRY_SYMBOLS_PER_BIT * BEIDOU_B3I_CODE_PERIOD_MS; - d_subframe_symbols = static_cast(volk_gnsssdr_malloc( - BEIDOU_DNAV_PREAMBLE_PERIOD_SYMBOLS * sizeof(float), - volk_gnsssdr_get_alignment())); d_required_symbols = BEIDOU_DNAV_SUBFRAME_SYMBOLS + d_samples_per_preamble; d_symbol_history.set_capacity(d_required_symbols); } else { - // Clear values from previous declaration - volk_gnsssdr_free(d_preamble_samples); - volk_gnsssdr_free(d_subframe_symbols); - //back to normal satellites + // back to normal satellites d_symbol_duration_ms = BEIDOU_B3I_TELEMETRY_SYMBOLS_PER_BIT * BEIDOU_B3I_CODE_PERIOD_MS; d_symbols_per_preamble = BEIDOU_DNAV_PREAMBLE_LENGTH_SYMBOLS; d_samples_per_preamble = BEIDOU_DNAV_PREAMBLE_LENGTH_SYMBOLS; - d_preamble_samples = static_cast(volk_gnsssdr_malloc(d_samples_per_preamble * sizeof(int32_t), volk_gnsssdr_get_alignment())); d_preamble_period_samples = BEIDOU_DNAV_PREAMBLE_PERIOD_SYMBOLS; // Setting samples of preamble code @@ -372,7 +351,6 @@ void beidou_b3i_telemetry_decoder_gs::set_satellite( } } - d_subframe_symbols = static_cast(volk_gnsssdr_malloc(BEIDOU_DNAV_PREAMBLE_PERIOD_SYMBOLS * sizeof(float), volk_gnsssdr_get_alignment())); d_required_symbols = BEIDOU_DNAV_SUBFRAME_SYMBOLS + d_samples_per_preamble; d_symbol_history.set_capacity(d_required_symbols); } @@ -498,7 +476,7 @@ int beidou_b3i_telemetry_decoder_gs::general_work( } // call the decoder - decode_subframe(d_subframe_symbols); + decode_subframe(d_subframe_symbols.data()); if (d_nav.flag_crc_test == true) { @@ -558,7 +536,7 @@ int beidou_b3i_telemetry_decoder_gs::general_work( } // call the decoder - decode_subframe(d_subframe_symbols); + decode_subframe(d_subframe_symbols.data()); if (d_nav.flag_crc_test == true) { diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b3i_telemetry_decoder_gs.h b/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b3i_telemetry_decoder_gs.h index d08f8388e..e6c2afc44 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b3i_telemetry_decoder_gs.h +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b3i_telemetry_decoder_gs.h @@ -40,14 +40,15 @@ #include #include #include +#include class beidou_b3i_telemetry_decoder_gs; using beidou_b3i_telemetry_decoder_gs_sptr = boost::shared_ptr; -beidou_b3i_telemetry_decoder_gs_sptr -beidou_b3i_make_telemetry_decoder_gs(const Gnss_Satellite &satellite, +beidou_b3i_telemetry_decoder_gs_sptr beidou_b3i_make_telemetry_decoder_gs( + const Gnss_Satellite &satellite, bool dump); /*! @@ -81,11 +82,11 @@ private: void decode_bch15_11_01(const int32_t *bits, int32_t *decbits); // Preamble decoding - int32_t *d_preamble_samples; + std::array d_preamble_samples{}; int32_t d_symbols_per_preamble; int32_t d_samples_per_preamble; int32_t d_preamble_period_samples; - float *d_subframe_symbols; + std::array d_subframe_symbols{}; uint32_t d_required_symbols; // Storage for incoming data 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 bd029d005..8565a1172 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 @@ -43,12 +43,11 @@ #include #include // for make_any #include // for mp -#include -#include // for fmod -#include // for abs -#include // for exception -#include // for cout -#include // for shared_ptr, make_shared +#include // for fmod +#include // for abs +#include // for exception +#include // for cout +#include // for shared_ptr, make_shared #define CRC_ERROR_LIMIT 6 @@ -66,7 +65,7 @@ galileo_telemetry_decoder_gs::galileo_telemetry_decoder_gs( bool dump) : gr::block("galileo_telemetry_decoder_gs", gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { - //prevent telemetry symbols accumulation in output buffers + // prevent telemetry symbols accumulation in output buffers this->set_max_noutput_items(1); // Ephemeris data port out this->message_port_register_out(pmt::mp("telemetry")); @@ -75,7 +74,6 @@ galileo_telemetry_decoder_gs::galileo_telemetry_decoder_gs( d_last_valid_preamble = 0; d_sent_tlm_failed_msg = false; - // initialize internal vars d_dump = dump; d_satellite = Gnss_Satellite(satellite.get_system(), satellite.get_PRN()); @@ -93,7 +91,7 @@ galileo_telemetry_decoder_gs::galileo_telemetry_decoder_gs( d_preamble_period_symbols = GALILEO_INAV_PREAMBLE_PERIOD_SYMBOLS; d_required_symbols = static_cast(GALILEO_INAV_PAGE_SYMBOLS) + d_samples_per_preamble; // preamble bits to sampled symbols - d_preamble_samples = static_cast(volk_gnsssdr_malloc(d_samples_per_preamble * sizeof(int32_t), volk_gnsssdr_get_alignment())); + d_preamble_samples.reserve(d_samples_per_preamble); d_frame_length_symbols = GALILEO_INAV_PAGE_PART_SYMBOLS - GALILEO_INAV_PREAMBLE_LENGTH_BITS; CodeLength = GALILEO_INAV_PAGE_PART_SYMBOLS - GALILEO_INAV_PREAMBLE_LENGTH_BITS; DataLength = (CodeLength / nn) - mm; @@ -110,7 +108,7 @@ galileo_telemetry_decoder_gs::galileo_telemetry_decoder_gs( d_preamble_period_symbols = GALILEO_FNAV_SYMBOLS_PER_PAGE; d_required_symbols = static_cast(GALILEO_FNAV_SYMBOLS_PER_PAGE) + d_samples_per_preamble; // preamble bits to sampled symbols - d_preamble_samples = static_cast(volk_gnsssdr_malloc(d_samples_per_preamble * sizeof(int32_t), volk_gnsssdr_get_alignment())); + d_preamble_samples.reserve(d_samples_per_preamble); d_frame_length_symbols = GALILEO_FNAV_SYMBOLS_PER_PAGE - GALILEO_FNAV_PREAMBLE_LENGTH_BITS; CodeLength = GALILEO_FNAV_SYMBOLS_PER_PAGE - GALILEO_FNAV_PREAMBLE_LENGTH_BITS; DataLength = (CodeLength / nn) - mm; @@ -121,7 +119,6 @@ galileo_telemetry_decoder_gs::galileo_telemetry_decoder_gs( d_bits_per_preamble = 0; d_samples_per_preamble = 0; d_preamble_period_symbols = 0; - d_preamble_samples = nullptr; d_PRN_code_period_ms = 0U; d_required_symbols = 0U; d_frame_length_symbols = 0U; @@ -131,7 +128,7 @@ galileo_telemetry_decoder_gs::galileo_telemetry_decoder_gs( std::cout << "Galileo unified telemetry decoder error: Unknown frame type " << std::endl; } - d_page_part_symbols = static_cast(volk_gnsssdr_malloc(d_frame_length_symbols * sizeof(double), volk_gnsssdr_get_alignment())); + d_page_part_symbols.reserve(d_frame_length_symbols); for (int32_t i = 0; i < d_bits_per_preamble; i++) { switch (d_frame_type) @@ -184,24 +181,18 @@ galileo_telemetry_decoder_gs::galileo_telemetry_decoder_gs( int32_t max_states = 1U << static_cast(mm); // 2^mm g_encoder[0] = 121; // Polynomial G1 g_encoder[1] = 91; // Polynomial G2 - out0 = static_cast(volk_gnsssdr_malloc(max_states * sizeof(int32_t), volk_gnsssdr_get_alignment())); - out1 = static_cast(volk_gnsssdr_malloc(max_states * sizeof(int32_t), volk_gnsssdr_get_alignment())); - state0 = static_cast(volk_gnsssdr_malloc(max_states * sizeof(int32_t), volk_gnsssdr_get_alignment())); - state1 = static_cast(volk_gnsssdr_malloc(max_states * sizeof(int32_t), volk_gnsssdr_get_alignment())); + out0.reserve(max_states); + out1.reserve(max_states); + state0.reserve(max_states); + state1.reserve(max_states); // create appropriate transition matrices - nsc_transit(out0, state0, 0, g_encoder, KK, nn); - nsc_transit(out1, state1, 1, g_encoder, KK, nn); + nsc_transit(out0.data(), state0.data(), 0, g_encoder.data(), KK, nn); + nsc_transit(out1.data(), state1.data(), 1, g_encoder.data(), KK, nn); } galileo_telemetry_decoder_gs::~galileo_telemetry_decoder_gs() { - volk_gnsssdr_free(d_preamble_samples); - volk_gnsssdr_free(d_page_part_symbols); - volk_gnsssdr_free(out0); - volk_gnsssdr_free(out1); - volk_gnsssdr_free(state0); - volk_gnsssdr_free(state1); if (d_dump_file.is_open() == true) { try @@ -218,7 +209,7 @@ galileo_telemetry_decoder_gs::~galileo_telemetry_decoder_gs() void galileo_telemetry_decoder_gs::viterbi_decoder(double *page_part_symbols, int32_t *page_part_bits) { - Viterbi(page_part_bits, out0, state0, out1, state1, + Viterbi(page_part_bits, out0.data(), state0.data(), out1.data(), state1.data(), page_part_symbols, KK, nn, DataLength); } @@ -238,8 +229,8 @@ void galileo_telemetry_decoder_gs::deinterleaver(int32_t rows, int32_t cols, con void galileo_telemetry_decoder_gs::decode_INAV_word(double *page_part_symbols, int32_t frame_length) { // 1. De-interleave - auto *page_part_symbols_deint = static_cast(volk_gnsssdr_malloc(frame_length * sizeof(double), volk_gnsssdr_get_alignment())); - deinterleaver(GALILEO_INAV_INTERLEAVER_ROWS, GALILEO_INAV_INTERLEAVER_COLS, page_part_symbols, page_part_symbols_deint); + std::vector page_part_symbols_deint(frame_length); + deinterleaver(GALILEO_INAV_INTERLEAVER_ROWS, GALILEO_INAV_INTERLEAVER_COLS, page_part_symbols, page_part_symbols_deint.data()); // 2. Viterbi decoder // 2.1 Take into account the NOT gate in G2 polynomial (Galileo ICD Figure 13, FEC encoder) @@ -252,9 +243,8 @@ void galileo_telemetry_decoder_gs::decode_INAV_word(double *page_part_symbols, i } } - auto *page_part_bits = static_cast(volk_gnsssdr_malloc((frame_length / 2) * sizeof(int32_t), volk_gnsssdr_get_alignment())); - viterbi_decoder(page_part_symbols_deint, page_part_bits); - volk_gnsssdr_free(page_part_symbols_deint); + std::vector page_part_bits(frame_length / 2); + viterbi_decoder(page_part_symbols_deint.data(), page_part_bits.data()); // 3. Call the Galileo page decoder std::string page_String; @@ -290,7 +280,6 @@ void galileo_telemetry_decoder_gs::decode_INAV_word(double *page_part_symbols, i d_inav_nav.split_page(page_String, flag_even_word_arrived); flag_even_word_arrived = 1; } - volk_gnsssdr_free(page_part_bits); // 4. Push the new navigation data to the queues if (d_inav_nav.have_new_ephemeris() == true) @@ -332,8 +321,8 @@ void galileo_telemetry_decoder_gs::decode_INAV_word(double *page_part_symbols, i void galileo_telemetry_decoder_gs::decode_FNAV_word(double *page_symbols, int32_t frame_length) { // 1. De-interleave - auto *page_symbols_deint = static_cast(volk_gnsssdr_malloc(frame_length * sizeof(double), volk_gnsssdr_get_alignment())); - deinterleaver(GALILEO_FNAV_INTERLEAVER_ROWS, GALILEO_FNAV_INTERLEAVER_COLS, page_symbols, page_symbols_deint); + std::vector page_symbols_deint(frame_length); + deinterleaver(GALILEO_FNAV_INTERLEAVER_ROWS, GALILEO_FNAV_INTERLEAVER_COLS, page_symbols, page_symbols_deint.data()); // 2. Viterbi decoder // 2.1 Take into account the NOT gate in G2 polynomial (Galileo ICD Figure 13, FEC encoder) @@ -345,9 +334,8 @@ void galileo_telemetry_decoder_gs::decode_FNAV_word(double *page_symbols, int32_ page_symbols_deint[i] = -page_symbols_deint[i]; } } - auto *page_bits = static_cast(volk_gnsssdr_malloc((frame_length / 2) * sizeof(int32_t), volk_gnsssdr_get_alignment())); - viterbi_decoder(page_symbols_deint, page_bits); - volk_gnsssdr_free(page_symbols_deint); + std::vector page_bits(frame_length / 2); + viterbi_decoder(page_symbols_deint.data(), page_bits.data()); // 3. Call the Galileo page decoder std::string page_String; @@ -362,7 +350,6 @@ void galileo_telemetry_decoder_gs::decode_FNAV_word(double *page_symbols, int32_ page_String.push_back('0'); } } - volk_gnsssdr_free(page_bits); // DECODE COMPLETE WORD (even + odd) and TEST CRC d_fnav_nav.split_page(page_String); @@ -462,7 +449,7 @@ int galileo_telemetry_decoder_gs::general_work(int noutput_items __attribute__(( d_symbol_history.push_back(current_symbol.Prompt_I); break; } - case 2: //FNAV + case 2: // FNAV { d_symbol_history.push_back(current_symbol.Prompt_Q); break; @@ -494,7 +481,7 @@ int galileo_telemetry_decoder_gs::general_work(int noutput_items __attribute__(( { case 0: // no preamble information { - //correlate with preamble + // correlate with preamble int32_t corr_value = 0; if (d_symbol_history.size() > d_required_symbols) { @@ -522,7 +509,7 @@ int galileo_telemetry_decoder_gs::general_work(int noutput_items __attribute__(( } case 1: // possible preamble lock { - //correlate with preamble + // correlate with preamble int32_t corr_value = 0; int32_t preamble_diff = 0; if (d_symbol_history.size() > d_required_symbols) @@ -594,7 +581,7 @@ int galileo_telemetry_decoder_gs::general_work(int noutput_items __attribute__(( d_page_part_symbols[i] = -d_symbol_history.at(i + d_samples_per_preamble); // because last symbol of the preamble is just received now! } } - decode_INAV_word(d_page_part_symbols, d_frame_length_symbols); + decode_INAV_word(d_page_part_symbols.data(), d_frame_length_symbols); break; case 2: // FNAV // NEW Galileo page part is received @@ -619,7 +606,7 @@ int galileo_telemetry_decoder_gs::general_work(int noutput_items __attribute__(( } } } - decode_FNAV_word(d_page_part_symbols, d_frame_length_symbols); + decode_FNAV_word(d_page_part_symbols.data(), d_frame_length_symbols); break; default: return -1; diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_telemetry_decoder_gs.h b/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_telemetry_decoder_gs.h index 9d3ed657d..d61efc47e 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_telemetry_decoder_gs.h +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_telemetry_decoder_gs.h @@ -43,6 +43,8 @@ #include #include #include +#include +#include class galileo_telemetry_decoder_gs; @@ -84,11 +86,11 @@ private: int32_t d_bits_per_preamble; int32_t d_samples_per_preamble; int32_t d_preamble_period_symbols; - int32_t *d_preamble_samples; + std::vector d_preamble_samples; uint32_t d_PRN_code_period_ms; uint32_t d_required_symbols; uint32_t d_frame_length_symbols; - double *d_page_part_symbols; + std::vector d_page_part_symbols; boost::circular_buffer d_symbol_history; @@ -118,14 +120,17 @@ private: uint32_t d_TOW_at_current_symbol_ms; bool flag_TOW_set; - double delta_t; //GPS-GALILEO time offset + double delta_t; // GPS-GALILEO time offset std::string d_dump_filename; std::ofstream d_dump_file; // vars for Viterbi decoder - int32_t *out0, *out1, *state0, *state1; - int32_t g_encoder[2]{}; + std::vector out0; + std::vector out1; + std::vector state0; + std::vector state1; + std::array g_encoder{}; const int32_t nn = 2; // Coding rate 1/n const int32_t KK = 7; // Constraint Length int32_t mm = KK - 1; diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/glonass_l1_ca_telemetry_decoder_gs.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/glonass_l1_ca_telemetry_decoder_gs.cc index 393e91433..874f8e808 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/glonass_l1_ca_telemetry_decoder_gs.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/glonass_l1_ca_telemetry_decoder_gs.cc @@ -38,13 +38,11 @@ #include #include // for make_any #include // for mp -#include -#include // for floor, round -#include // for abs, malloc -#include // for memcpy -#include // for exception -#include // for cout -#include // for shared_ptr, make_shared +#include // for floor, round +#include // for abs +#include // for exception +#include // for cout +#include // for shared_ptr, make_shared #define CRC_ERROR_LIMIT 6 @@ -61,7 +59,7 @@ glonass_l1_ca_telemetry_decoder_gs::glonass_l1_ca_telemetry_decoder_gs( bool dump) : gr::block("glonass_l1_ca_telemetry_decoder_gs", gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { - //prevent telemetry symbols accumulation in output buffers + // prevent telemetry symbols accumulation in output buffers this->set_max_noutput_items(1); // Ephemeris data port out this->message_port_register_out(pmt::mp("telemetry")); @@ -71,19 +69,8 @@ glonass_l1_ca_telemetry_decoder_gs::glonass_l1_ca_telemetry_decoder_gs( d_dump = dump; d_satellite = Gnss_Satellite(satellite.get_system(), satellite.get_PRN()); LOG(INFO) << "Initializing GLONASS L1 CA TELEMETRY DECODING"; - // Define the number of sampes per symbol. Notice that GLONASS has 2 rates, - // one for the navigation data and the other for the preamble information - d_samples_per_symbol = (GLONASS_L1_CA_CODE_RATE_HZ / GLONASS_L1_CA_CODE_LENGTH_CHIPS) / GLONASS_L1_CA_SYMBOL_RATE_BPS; - - // Set the preamble information - std::array preambles_bits{GLONASS_GNAV_PREAMBLE}; - // Since preamble rate is different than navigation data rate we use a constant - d_symbols_per_preamble = GLONASS_GNAV_PREAMBLE_LENGTH_SYMBOLS; - - memcpy(static_cast(this->d_preambles_bits), preambles_bits.data(), GLONASS_GNAV_PREAMBLE_LENGTH_BITS * sizeof(uint16_t)); // preamble bits to sampled symbols - d_preambles_symbols = static_cast(malloc(sizeof(int32_t) * d_symbols_per_preamble)); int32_t n = 0; for (uint16_t d_preambles_bit : d_preambles_bits) { @@ -120,7 +107,6 @@ glonass_l1_ca_telemetry_decoder_gs::glonass_l1_ca_telemetry_decoder_gs( glonass_l1_ca_telemetry_decoder_gs::~glonass_l1_ca_telemetry_decoder_gs() { - delete d_preambles_symbols; if (d_dump_file.is_open() == true) { try diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/glonass_l1_ca_telemetry_decoder_gs.h b/src/algorithms/telemetry_decoder/gnuradio_blocks/glonass_l1_ca_telemetry_decoder_gs.h index bd37b4905..5035c6217 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/glonass_l1_ca_telemetry_decoder_gs.h +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/glonass_l1_ca_telemetry_decoder_gs.h @@ -41,6 +41,7 @@ #include // for boost::shared_ptr #include // for block #include // for gr_vector_const_void_star +#include #include #include // for ofstream #include @@ -50,7 +51,9 @@ class glonass_l1_ca_telemetry_decoder_gs; using glonass_l1_ca_telemetry_decoder_gs_sptr = boost::shared_ptr; -glonass_l1_ca_telemetry_decoder_gs_sptr glonass_l1_ca_make_telemetry_decoder_gs(const Gnss_Satellite &satellite, bool dump); +glonass_l1_ca_telemetry_decoder_gs_sptr glonass_l1_ca_make_telemetry_decoder_gs( + const Gnss_Satellite &satellite, + bool dump); /*! * \brief This class implements a block that decodes the GNAV data defined in GLONASS ICD v5.1 @@ -75,43 +78,45 @@ public: gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); private: - friend glonass_l1_ca_telemetry_decoder_gs_sptr - glonass_l1_ca_make_telemetry_decoder_gs(const Gnss_Satellite &satellite, bool dump); + friend glonass_l1_ca_telemetry_decoder_gs_sptr glonass_l1_ca_make_telemetry_decoder_gs( + const Gnss_Satellite &satellite, + bool dump); + glonass_l1_ca_telemetry_decoder_gs(const Gnss_Satellite &satellite, bool dump); void decode_string(const double *symbols, int32_t frame_length); - //!< Help with coherent tracking + // Help with coherent tracking double d_preamble_time_samples; - //!< Preamble decoding - uint16_t d_preambles_bits[GLONASS_GNAV_PREAMBLE_LENGTH_BITS]{}; - int32_t *d_preambles_symbols; - uint32_t d_samples_per_symbol; - int32_t d_symbols_per_preamble; + // Preamble decoding + const std::array d_preambles_bits{GLONASS_GNAV_PREAMBLE}; + std::array d_preambles_symbols{}; + uint32_t d_samples_per_symbol = (GLONASS_L1_CA_CODE_RATE_HZ / GLONASS_L1_CA_CODE_LENGTH_CHIPS) / GLONASS_L1_CA_SYMBOL_RATE_BPS; + const int32_t d_symbols_per_preamble = GLONASS_GNAV_PREAMBLE_LENGTH_SYMBOLS; - //!< Storage for incoming data + // Storage for incoming data boost::circular_buffer d_symbol_history; - //!< Variables for internal functionality - uint64_t d_sample_counter; //!< Sample counter as an index (1,2,3,..etc) indicating number of samples processed - uint64_t d_preamble_index; //!< Index of sample number where preamble was found - uint32_t d_stat; //!< Status of decoder - bool d_flag_frame_sync; //!< Indicate when a frame sync is achieved - bool d_flag_parity; //!< Flag indicating when parity check was achieved (crc check) - bool d_flag_preamble; //!< Flag indicating when preamble was found - int32_t d_CRC_error_counter; //!< Number of failed CRC operations - bool flag_TOW_set; //!< Indicates when time of week is set - double delta_t; //!< GPS-GLONASS time offset + // Variables for internal functionality + uint64_t d_sample_counter; // Sample counter as an index (1,2,3,..etc) indicating number of samples processed + uint64_t d_preamble_index; // Index of sample number where preamble was found + uint32_t d_stat; // Status of decoder + bool d_flag_frame_sync; // Indicate when a frame sync is achieved + bool d_flag_parity; // Flag indicating when parity check was achieved (crc check) + bool d_flag_preamble; // Flag indicating when preamble was found + int32_t d_CRC_error_counter; // Number of failed CRC operations + bool flag_TOW_set; // Indicates when time of week is set + double delta_t; // GPS-GLONASS time offset - //!< Navigation Message variable + // Navigation Message variable Glonass_Gnav_Navigation_Message d_nav; - //!< Values to populate gnss synchronization structure + // Values to populate gnss synchronization structure double d_TOW_at_current_symbol; bool Flag_valid_word; - //!< Satellite Information and logging capacity + // Satellite Information and logging capacity Gnss_Satellite d_satellite; int32_t d_channel; bool d_dump; diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/glonass_l2_ca_telemetry_decoder_gs.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/glonass_l2_ca_telemetry_decoder_gs.cc index 8caa6b928..005934cb9 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/glonass_l2_ca_telemetry_decoder_gs.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/glonass_l2_ca_telemetry_decoder_gs.cc @@ -38,13 +38,11 @@ #include #include // for make_any #include // for mp -#include -#include // for floor, round -#include // for abs, malloc -#include // for memcpy -#include // for exception -#include // for cout -#include // for shared_ptr, make_shared +#include // for floor, round +#include // for abs +#include // for exception +#include // for cout +#include // for shared_ptr, make_shared #define CRC_ERROR_LIMIT 6 @@ -61,7 +59,7 @@ glonass_l2_ca_telemetry_decoder_gs::glonass_l2_ca_telemetry_decoder_gs( bool dump) : gr::block("glonass_l2_ca_telemetry_decoder_gs", gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { - //prevent telemetry symbols accumulation in output buffers + // prevent telemetry symbols accumulation in output buffers this->set_max_noutput_items(1); // Ephemeris data port out this->message_port_register_out(pmt::mp("telemetry")); @@ -71,19 +69,8 @@ glonass_l2_ca_telemetry_decoder_gs::glonass_l2_ca_telemetry_decoder_gs( d_dump = dump; d_satellite = Gnss_Satellite(satellite.get_system(), satellite.get_PRN()); LOG(INFO) << "Initializing GLONASS L2 CA TELEMETRY DECODING"; - // Define the number of sampes per symbol. Notice that GLONASS has 2 rates, - // one for the navigation data and the other for the preamble information - d_samples_per_symbol = (GLONASS_L2_CA_CODE_RATE_HZ / GLONASS_L2_CA_CODE_LENGTH_CHIPS) / GLONASS_L2_CA_SYMBOL_RATE_BPS; - - // Set the preamble information - std::array preambles_bits{GLONASS_GNAV_PREAMBLE}; - // Since preamble rate is different than navigation data rate we use a constant - d_symbols_per_preamble = GLONASS_GNAV_PREAMBLE_LENGTH_SYMBOLS; - - memcpy(static_cast(this->d_preambles_bits), preambles_bits.data(), GLONASS_GNAV_PREAMBLE_LENGTH_BITS * sizeof(uint16_t)); // preamble bits to sampled symbols - d_preambles_symbols = static_cast(malloc(sizeof(int32_t) * d_symbols_per_preamble)); int32_t n = 0; for (uint16_t d_preambles_bit : d_preambles_bits) { @@ -105,9 +92,7 @@ glonass_l2_ca_telemetry_decoder_gs::glonass_l2_ca_telemetry_decoder_gs( d_sample_counter = 0ULL; d_stat = 0; d_preamble_index = 0ULL; - d_flag_frame_sync = false; - d_flag_parity = false; d_TOW_at_current_symbol = 0; Flag_valid_word = false; @@ -122,7 +107,6 @@ glonass_l2_ca_telemetry_decoder_gs::glonass_l2_ca_telemetry_decoder_gs( glonass_l2_ca_telemetry_decoder_gs::~glonass_l2_ca_telemetry_decoder_gs() { - delete d_preambles_symbols; if (d_dump_file.is_open() == true) { try diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/glonass_l2_ca_telemetry_decoder_gs.h b/src/algorithms/telemetry_decoder/gnuradio_blocks/glonass_l2_ca_telemetry_decoder_gs.h index ffe3f1ca4..cf7f00be7 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/glonass_l2_ca_telemetry_decoder_gs.h +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/glonass_l2_ca_telemetry_decoder_gs.h @@ -40,6 +40,7 @@ #include // for boost::shared_ptr #include #include // for gr_vector_const_void_star +#include #include #include #include @@ -79,37 +80,37 @@ private: void decode_string(const double *symbols, int32_t frame_length); - //!< Help with coherent tracking + // Help with coherent tracking double d_preamble_time_samples; - //!< Preamble decoding - uint16_t d_preambles_bits[GLONASS_GNAV_PREAMBLE_LENGTH_BITS]{}; - int32_t *d_preambles_symbols; - uint32_t d_samples_per_symbol; - int32_t d_symbols_per_preamble; + // Preamble decoding + const std::array d_preambles_bits{GLONASS_GNAV_PREAMBLE}; + std::array d_preambles_symbols{}; + uint32_t d_samples_per_symbol = (GLONASS_L2_CA_CODE_RATE_HZ / GLONASS_L2_CA_CODE_LENGTH_CHIPS) / GLONASS_L2_CA_SYMBOL_RATE_BPS; + const int32_t d_symbols_per_preamble = GLONASS_GNAV_PREAMBLE_LENGTH_SYMBOLS; - //!< Storage for incoming data + // Storage for incoming data boost::circular_buffer d_symbol_history; - //!< Variables for internal functionality - uint64_t d_sample_counter; //!< Sample counter as an index (1,2,3,..etc) indicating number of samples processed - uint64_t d_preamble_index; //!< Index of sample number where preamble was found - uint32_t d_stat; //!< Status of decoder - bool d_flag_frame_sync; //!< Indicate when a frame sync is achieved - bool d_flag_parity; //!< Flag indicating when parity check was achieved (crc check) - bool d_flag_preamble; //!< Flag indicating when preamble was found - int32_t d_CRC_error_counter; //!< Number of failed CRC operations - bool flag_TOW_set; //!< Indicates when time of week is set - double delta_t; //!< GPS-GLONASS time offset + // Variables for internal functionality + uint64_t d_sample_counter; // Sample counter as an index (1,2,3,..etc) indicating number of samples processed + uint64_t d_preamble_index; // Index of sample number where preamble was found + uint32_t d_stat; // Status of decoder + bool d_flag_frame_sync; // Indicate when a frame sync is achieved + bool d_flag_parity; // Flag indicating when parity check was achieved (crc check) + bool d_flag_preamble; // Flag indicating when preamble was found + int32_t d_CRC_error_counter; // Number of failed CRC operations + bool flag_TOW_set; // Indicates when time of week is set + double delta_t; // GPS-GLONASS time offset - //!< Navigation Message variable + // Navigation Message variable Glonass_Gnav_Navigation_Message d_nav; - //!< Values to populate gnss synchronization structure + // Values to populate gnss synchronization structure double d_TOW_at_current_symbol; bool Flag_valid_word; - //!< Satellite Information and logging capacity + // Satellite Information and logging capacity Gnss_Satellite d_satellite; int32_t d_channel; bool d_dump; diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_gs.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_gs.cc index 3b1542225..f8afde34e 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_gs.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_gs.cc @@ -37,13 +37,11 @@ #include #include // for make_any #include // for mp -#include -#include -#include // for round -#include // for memcpy -#include // for exception -#include // for cout -#include // for shared_ptr +#include // for round +#include // for memcpy +#include // for exception +#include // for cout +#include // for shared_ptr #ifndef _rotl @@ -63,7 +61,7 @@ gps_l1_ca_telemetry_decoder_gs::gps_l1_ca_telemetry_decoder_gs( bool dump) : gr::block("gps_navigation_gs", gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { - //prevent telemetry symbols accumulation in output buffers + // prevent telemetry symbols accumulation in output buffers this->set_max_noutput_items(1); // Ephemeris data port out @@ -73,7 +71,6 @@ gps_l1_ca_telemetry_decoder_gs::gps_l1_ca_telemetry_decoder_gs( d_last_valid_preamble = 0; d_sent_tlm_failed_msg = false; - // initialize internal vars d_dump = dump; d_satellite = Gnss_Satellite(satellite.get_system(), satellite.get_PRN()); @@ -85,7 +82,6 @@ gps_l1_ca_telemetry_decoder_gs::gps_l1_ca_telemetry_decoder_gs( // set the preamble d_required_symbols = GPS_SUBFRAME_BITS; // preamble bits to sampled symbols - d_preamble_samples = static_cast(volk_gnsssdr_malloc(d_samples_per_preamble * sizeof(int32_t), volk_gnsssdr_get_alignment())); d_frame_length_symbols = GPS_SUBFRAME_BITS * GPS_CA_TELEMETRY_SYMBOLS_PER_BIT; d_max_symbols_without_valid_frame = d_required_symbols * 20; // rise alarm 120 segs without valid tlm int32_t n = 0; @@ -123,7 +119,6 @@ gps_l1_ca_telemetry_decoder_gs::gps_l1_ca_telemetry_decoder_gs( gps_l1_ca_telemetry_decoder_gs::~gps_l1_ca_telemetry_decoder_gs() { - volk_gnsssdr_free(d_preamble_samples); if (d_dump_file.is_open() == true) { try diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_gs.h b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_gs.h index cc01fb6b6..5fa12bd45 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_gs.h +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_gs.h @@ -39,6 +39,7 @@ #include // for boost::shared_ptr #include // for block #include // for gr_vector_const_void_star +#include // for array #include // for int32_t #include // for ofstream #include // for string @@ -80,7 +81,7 @@ private: int32_t d_bits_per_preamble; int32_t d_samples_per_preamble; int32_t d_preamble_period_symbols; - int32_t *d_preamble_samples; + std::array d_preamble_samples; uint32_t d_required_symbols; uint32_t d_frame_length_symbols; bool flag_PLL_180_deg_phase_locked; diff --git a/src/algorithms/telemetry_decoder/libs/libswiftcnav/viterbi27.c b/src/algorithms/telemetry_decoder/libs/libswiftcnav/viterbi27.c index c6486412a..a8c2d1173 100644 --- a/src/algorithms/telemetry_decoder/libs/libswiftcnav/viterbi27.c +++ b/src/algorithms/telemetry_decoder/libs/libswiftcnav/viterbi27.c @@ -33,13 +33,13 @@ #include "fec.h" #include -static inline int parity(int x) +static inline unsigned int parity(unsigned int x) { - x ^= x >> 16; - x ^= x >> 8; - x ^= x >> 4; - x &= 0xf; - return (0x6996 >> x) & 1; + x ^= x >> 16U; + x ^= x >> 8U; + x ^= x >> 4U; + x &= 0xFU; + return (0x6996U >> x) & 1U; } @@ -101,12 +101,12 @@ void v27_init(v27_t *v, v27_decision_t *decisions, unsigned int decisions_count, m1 = v->old_metrics[(i) + 32] + (510 - metric); \ decision = (signed int)(m0 - m1) > 0; \ v->new_metrics[2 * (i)] = decision ? m1 : m0; \ - d->w[(i) / 16] |= decision << ((2 * (i)) & 31); \ + d->w[(i) / 16] |= decision << ((2U * (i)) & 31U); \ m0 -= (metric + metric - 510); \ m1 += (metric + metric - 510); \ decision = (signed int)(m0 - m1) > 0; \ v->new_metrics[2 * (i) + 1] = decision ? m1 : m0; \ - d->w[(i) / 16] |= decision << ((2 * (i) + 1) & 31); \ + d->w[(i) / 16] |= decision << ((2U * (i) + 1U) & 31U); \ } /** Update a v27_t decoder with a block of symbols. @@ -130,44 +130,44 @@ void v27_update(v27_t *v, const unsigned char *syms, int nbits) sym0 = *syms++; sym1 = *syms++; - BFLY(0); - BFLY(1); - BFLY(2); - BFLY(3); - BFLY(4); - BFLY(5); - BFLY(6); - BFLY(7); - BFLY(8); - BFLY(9); - BFLY(10); - BFLY(11); - BFLY(12); - BFLY(13); - BFLY(14); - BFLY(15); - BFLY(16); - BFLY(17); - BFLY(18); - BFLY(19); - BFLY(20); - BFLY(21); - BFLY(22); - BFLY(23); - BFLY(24); - BFLY(25); - BFLY(26); - BFLY(27); - BFLY(28); - BFLY(29); - BFLY(30); - BFLY(31); + BFLY(0U); + BFLY(1U); + BFLY(2U); + BFLY(3U); + BFLY(4U); + BFLY(5U); + BFLY(6U); + BFLY(7U); + BFLY(8U); + BFLY(9U); + BFLY(10U); + BFLY(11U); + BFLY(12U); + BFLY(13U); + BFLY(14U); + BFLY(15U); + BFLY(16U); + BFLY(17U); + BFLY(18U); + BFLY(19U); + BFLY(20U); + BFLY(21U); + BFLY(22U); + BFLY(23U); + BFLY(24U); + BFLY(25U); + BFLY(26U); + BFLY(27U); + BFLY(28U); + BFLY(29U); + BFLY(30U); + BFLY(31U); /* Normalize metrics if they are nearing overflow */ - if (v->new_metrics[0] > (1 << 30)) + if (v->new_metrics[0] > (1U << 30U)) { int i; - unsigned int minmetric = 1 << 31; + unsigned int minmetric = 1U << 31U; for (i = 0; i < 64; i++) { @@ -210,11 +210,11 @@ void v27_update(v27_t *v, const unsigned char *syms, int nbits) void v27_chainback_fixed(v27_t *v, unsigned char *data, unsigned int nbits, unsigned char final_state) { - int k; + unsigned int k; unsigned int decisions_index = v->decisions_index; final_state %= 64; - final_state <<= 2; + final_state <<= 2U; while (nbits-- != 0) { @@ -222,12 +222,12 @@ void v27_chainback_fixed(v27_t *v, unsigned char *data, unsigned int nbits, decisions_index = (decisions_index == 0) ? v->decisions_count - 1 : decisions_index - 1; v27_decision_t *d = &v->decisions[decisions_index]; - k = (d->w[(final_state >> 2) / 32] >> ((final_state >> 2) % 32)) & 1; + k = (d->w[(final_state >> 2U) / 32] >> ((final_state >> 2U) % 32)) & 1U; /* The store into data[] only needs to be done every 8 bits. * But this avoids a conditional branch, and the writes will * combine in the cache anyway */ - data[nbits >> 3] = final_state = (final_state >> 1) | (k << 7); + data[nbits >> 3U] = final_state = (final_state >> 1U) | (k << 7U); } } diff --git a/src/algorithms/telemetry_decoder/libs/viterbi_decoder.cc b/src/algorithms/telemetry_decoder/libs/viterbi_decoder.cc index 9c1fe1c53..ddba31afb 100644 --- a/src/algorithms/telemetry_decoder/libs/viterbi_decoder.cc +++ b/src/algorithms/telemetry_decoder/libs/viterbi_decoder.cc @@ -51,17 +51,17 @@ Viterbi_Decoder::Viterbi_Decoder(const int g_encoder[], const int KK, const int // derived code properties d_mm = d_KK - 1; - d_states = 1 << d_mm; /* 2^mm */ - d_number_symbols = 1 << d_nn; /* 2^nn */ + d_states = 1U << d_mm; /* 2^mm */ + d_number_symbols = 1U << d_nn; /* 2^nn */ /* create appropriate transition matrices (trellis) */ - d_out0 = new int[d_states]; - d_out1 = new int[d_states]; - d_state0 = new int[d_states]; - d_state1 = new int[d_states]; + d_out0.reserve(d_states); + d_out1.reserve(d_states); + d_state0.reserve(d_states); + d_state1.reserve(d_states); - nsc_transit(d_out0, d_state0, 0, g_encoder, d_KK, d_nn); - nsc_transit(d_out1, d_state1, 1, g_encoder, d_KK, d_nn); + nsc_transit(d_out0.data(), d_state0.data(), 0, g_encoder, d_KK, d_nn); + nsc_transit(d_out1.data(), d_state1.data(), 1, g_encoder, d_KK, d_nn); // initialise trellis state d_trellis_state_is_initialised = false; @@ -69,21 +69,6 @@ Viterbi_Decoder::Viterbi_Decoder(const int g_encoder[], const int KK, const int } -Viterbi_Decoder::~Viterbi_Decoder() -{ - // trellis definition - delete[] d_out0; - delete[] d_out1; - delete[] d_state0; - delete[] d_state1; - - // init trellis state - delete[] d_pm_t; - delete[] d_rec_array; - delete[] d_metric_c; -} - - void Viterbi_Decoder::reset() { init_trellis_state(); @@ -153,16 +138,16 @@ void Viterbi_Decoder::init_trellis_state() if (d_trellis_state_is_initialised) { // init trellis state - delete[] d_pm_t; - delete[] d_rec_array; - delete[] d_metric_c; + d_pm_t.clear(); + d_rec_array.clear(); + d_metric_c.clear(); } // reserve new trellis state memory - d_pm_t = new float[d_states]; + d_pm_t.reserve(d_states); d_trellis_paths = std::deque(); - d_rec_array = new float[d_nn]; - d_metric_c = new float[d_number_symbols]; + d_rec_array.reserve(d_nn); + d_metric_c.reserve(d_number_symbols); d_trellis_state_is_initialised = true; /* initialize trellis */ @@ -182,7 +167,7 @@ int Viterbi_Decoder::do_acs(const double sym[], int nbits) int t, i, state_at_t; float metric; float max_val; - auto* pm_t_next = new float[d_states]; + std::vector pm_t_next(d_states); /* t: * - state: state at t @@ -208,7 +193,7 @@ int Viterbi_Decoder::do_acs(const double sym[], int nbits) /* precompute all possible branch metrics */ for (i = 0; i < d_number_symbols; i++) { - d_metric_c[i] = gamma(d_rec_array, i, d_nn); + d_metric_c[i] = gamma(d_rec_array.data(), i, d_nn); VLOG(LMORE) << "metric for (tx_sym=" << i << "|ry_sym=(" << d_rec_array[0] << ", " << d_rec_array[1] << ") = " << d_metric_c[i]; } @@ -267,8 +252,6 @@ int Viterbi_Decoder::do_acs(const double sym[], int nbits) } } - delete[] pm_t_next; - return t; } @@ -362,16 +345,15 @@ float Viterbi_Decoder::gamma(const float rec_array[], int symbol, int nn) { float rm = 0; int i; - int mask; + unsigned int mask = 1U; float txsym; - mask = 1; for (i = 0; i < nn; i++) { //if (symbol & mask) rm += rec_array[nn - i - 1]; txsym = symbol & mask ? 1 : -1; rm += txsym * rec_array[nn - i - 1]; - mask = mask << 1; + mask = mask << 1U; } //rm = rm > 50 ? rm : -1000; @@ -384,7 +366,7 @@ void Viterbi_Decoder::nsc_transit(int output_p[], int trans_p[], int input, cons { int nextstate[1]; int state, states; - states = (1 << (KK - 1)); /* The number of states: 2^mm */ + states = (1U << (KK - 1)); /* The number of states: 2^mm */ /* Determine the output and next state for each possible starting state */ for (state = 0; state < states; state++) @@ -452,11 +434,11 @@ int Viterbi_Decoder::nsc_enc_bit(int state_out_p[], int input, int state_in, int Viterbi_Decoder::parity_counter(int symbol, int length) { int counter; - int temp_parity = 0; + unsigned int temp_parity = 0; for (counter = 0; counter < length; counter++) { - temp_parity = temp_parity ^ (symbol & 1); - symbol = symbol >> 1; + temp_parity = temp_parity ^ (symbol & 1U); + symbol = symbol >> 1U; } return (temp_parity); } diff --git a/src/algorithms/telemetry_decoder/libs/viterbi_decoder.h b/src/algorithms/telemetry_decoder/libs/viterbi_decoder.h index 510673200..4fb242617 100644 --- a/src/algorithms/telemetry_decoder/libs/viterbi_decoder.h +++ b/src/algorithms/telemetry_decoder/libs/viterbi_decoder.h @@ -34,6 +34,7 @@ #include // for size_t #include +#include /*! * \brief Class that implements a Viterbi decoder @@ -42,7 +43,7 @@ class Viterbi_Decoder { public: Viterbi_Decoder(const int g_encoder[], const int KK, const int nn); - ~Viterbi_Decoder(); + ~Viterbi_Decoder() = default; void reset(); /*! @@ -94,16 +95,16 @@ private: int d_number_symbols; // trellis definition - int* d_out0; - int* d_state0; - int* d_out1; - int* d_state1; + std::vector d_out0; + std::vector d_state0; + std::vector d_out1; + std::vector d_state1; // trellis state - float* d_pm_t; + std::vector d_pm_t; std::deque d_trellis_paths; - float* d_metric_c; /* Set of all possible branch metrics */ - float* d_rec_array; /* Received values for one trellis section */ + std::vector d_metric_c; /* Set of all possible branch metrics */ + std::vector d_rec_array; /* Received values for one trellis section */ bool d_trellis_state_is_initialised; // measures 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 2077d6abc..7841c9a46 100644 --- a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.cc +++ b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.cc @@ -542,19 +542,11 @@ void dll_pll_veml_tracking::msg_handler_telemetry_to_trk(const pmt::pmt_t &msg) int tlm_event; tlm_event = boost::any_cast(pmt::any_ref(msg)); - switch (tlm_event) + if (tlm_event == 1) { - case 1: // tlm fault in current channel - { - DLOG(INFO) << "Telemetry fault received in ch " << this->d_channel; - gr::thread::scoped_lock lock(d_setlock); - d_carrier_lock_fail_counter = 200000; //force loss-of-lock condition - break; - } - default: - { - break; - } + DLOG(INFO) << "Telemetry fault received in ch " << this->d_channel; + gr::thread::scoped_lock lock(d_setlock); + d_carrier_lock_fail_counter = 200000; //force loss-of-lock condition } } } 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 14e7fe4cf..c7e24469f 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 @@ -446,6 +446,7 @@ dll_pll_veml_tracking_fpga::dll_pll_veml_tracking_fpga(const Dll_Pll_Conf_Fpga & d_sample_counter_next = 0ULL; } + void dll_pll_veml_tracking_fpga::msg_handler_telemetry_to_trk(const pmt::pmt_t &msg) { try @@ -455,19 +456,12 @@ void dll_pll_veml_tracking_fpga::msg_handler_telemetry_to_trk(const pmt::pmt_t & int tlm_event; tlm_event = boost::any_cast(pmt::any_ref(msg)); - switch (tlm_event) + if (tlm_event == 1) { - case 1: //tlm fault in current channel - { - DLOG(INFO) << "Telemetry fault received in ch " << this->d_channel; - gr::thread::scoped_lock lock(d_setlock); - d_carrier_lock_fail_counter = 10000; //force loss-of-lock condition - break; - } - default: - { - break; - } + DLOG(INFO) << "Telemetry fault received in ch " << this->d_channel; + gr::thread::scoped_lock lock(d_setlock); + d_carrier_lock_fail_counter = 10000; //force loss-of-lock condition + break; } } } diff --git a/src/core/system_parameters/Beidou_DNAV.h b/src/core/system_parameters/Beidou_DNAV.h index fdbdf7dfd..8cd45077c 100644 --- a/src/core/system_parameters/Beidou_DNAV.h +++ b/src/core/system_parameters/Beidou_DNAV.h @@ -46,13 +46,11 @@ const double BEIDOU_DNAV_F = -4.442807309e-10; //!< Constant, [s/(m)^ const int32_t BEIDOU_DNAV_PREAMBLE_LENGTH_BITS = 11; const int32_t BEIDOU_DNAV_PREAMBLE_LENGTH_SYMBOLS = 11; // ************** -const double BEIDOU_DNAV_PREAMBLE_PERIOD_SYMBOLS = 300; -const double BEIDOU_DNAV_SUBFRAME_SYMBOLS = 300; +const int32_t BEIDOU_DNAV_PREAMBLE_PERIOD_SYMBOLS = 300; +const uint32_t BEIDOU_DNAV_SUBFRAME_SYMBOLS = 300; const int32_t BEIDOU_DNAV_SUBFRAME_DATA_BITS = 300; //!< Number of bits per subframe in the NAV message [bits] -const double BEIDOU_DNAV_WORDS_SUBFRAME = 10; -const double BEIDOU_DNAV_WORD_LENGTH_BITS = 30; -const double BEIDOU_D1NAV_SYMBOL_RATE_SPS = 50; -const double BEIDOU_D2NAV_SYMBOL_RATE_SPS = 500; +const uint32_t BEIDOU_DNAV_WORDS_SUBFRAME = 10; +const uint32_t BEIDOU_DNAV_WORD_LENGTH_BITS = 30; const std::string BEIDOU_DNAV_PREAMBLE = "11100010010"; // Number of leap seconds passed from the start of the GPS epoch up to the start of BeiDou epoch diff --git a/src/core/system_parameters/beidou_dnav_navigation_message.cc b/src/core/system_parameters/beidou_dnav_navigation_message.cc index c93e07c4e..4cb83cd1c 100644 --- a/src/core/system_parameters/beidou_dnav_navigation_message.cc +++ b/src/core/system_parameters/beidou_dnav_navigation_message.cc @@ -256,10 +256,10 @@ uint64_t Beidou_Dnav_Navigation_Message::read_navigation_unsigned( { for (int32_t j = 0; j < parameter[i].second; j++) { - value <<= 1; //shift left + value <<= 1U; // shift left if (bits[BEIDOU_DNAV_SUBFRAME_DATA_BITS - parameter[i].first - j] == 1) { - value += 1; // insert the bit + value += 1U; // insert the bit } } } @@ -544,7 +544,7 @@ int32_t Beidou_Dnav_Navigation_Message::d1_subframe_decoder(std::string const& s d_sqrt_A = d_sqrt_A * D1_SQRT_A_LSB; d_Toe_sf2 = static_cast(read_navigation_unsigned(subframe_bits, D1_TOE_SF2)); - d_Toe_sf2 = static_cast((static_cast(d_Toe_sf2) << 15)); + d_Toe_sf2 = static_cast((static_cast(d_Toe_sf2) << 15U)); // Set system flags for message reception flag_d1_sf2 = true; @@ -800,7 +800,7 @@ int32_t Beidou_Dnav_Navigation_Message::d2_subframe_decoder(std::string const& s d_A_f0 = static_cast(read_navigation_signed(subframe_bits, D2_A0)) * D1_A0_LSB; d_A_f1_msb_bits = (read_navigation_unsigned(subframe_bits, D2_A1_MSB)); // Adjust for lsb in next page - d_A_f1_msb_bits = d_A_f1_msb_bits << 18; + d_A_f1_msb_bits = d_A_f1_msb_bits << 18ULL; // Set system flags for message reception flag_sf1_p3 = true; @@ -815,7 +815,7 @@ int32_t Beidou_Dnav_Navigation_Message::d2_subframe_decoder(std::string const& s d_Delta_n = static_cast(read_navigation_signed(subframe_bits, D2_DELTA_N)) * D1_DELTA_N_LSB; d_Cuc_msb_bits = (read_navigation_unsigned(subframe_bits, D2_CUC_MSB)); // Adjust for lsb in next page - d_Cuc_msb_bits = d_Cuc_msb_bits << 4; + d_Cuc_msb_bits = d_Cuc_msb_bits << 4U; // Set system flags for message reception flag_sf1_p4 = true; @@ -830,8 +830,8 @@ int32_t Beidou_Dnav_Navigation_Message::d2_subframe_decoder(std::string const& s d_eccentricity_msb = static_cast(read_navigation_unsigned(subframe_bits, D2_E_MSB)); d_eccentricity_msb_bits = (read_navigation_unsigned(subframe_bits, D2_E_MSB)); // Adjust for lsb in next page (shift number of lsb to the left) - d_eccentricity_msb = static_cast((static_cast(d_eccentricity_msb) << 22)); - d_eccentricity_msb_bits = d_eccentricity_msb_bits << 22; + d_eccentricity_msb = static_cast((static_cast(d_eccentricity_msb) << 22U)); + d_eccentricity_msb_bits = d_eccentricity_msb_bits << 22U; // Set system flags for message reception flag_sf1_p5 = true; @@ -845,7 +845,7 @@ int32_t Beidou_Dnav_Navigation_Message::d2_subframe_decoder(std::string const& s d_sqrt_A = static_cast(read_navigation_unsigned(subframe_bits, D2_SQRT_A)) * D1_SQRT_A_LSB; d_Cic_msb_bits = (read_navigation_unsigned(subframe_bits, D2_CIC_MSB)); // Adjust for lsb in next page (shift number of lsb to the left) - d_Cic_msb_bits = d_Cic_msb_bits << 8; + d_Cic_msb_bits = d_Cic_msb_bits << 8U; // Set system flags for message reception flag_sf1_p6 = true; @@ -859,7 +859,7 @@ int32_t Beidou_Dnav_Navigation_Message::d2_subframe_decoder(std::string const& s d_Toe = static_cast(read_navigation_unsigned(subframe_bits, D2_TOE)) * D1_TOE_LSB; d_i_0_msb_bits = (read_navigation_unsigned(subframe_bits, D2_I0_MSB)); // Adjust for lsb in next page (shift number of lsb to the left) - d_i_0_msb_bits = d_i_0_msb_bits << 11; + d_i_0_msb_bits = d_i_0_msb_bits << 11U; // Set system flags for message reception flag_sf1_p7 = true; @@ -873,7 +873,7 @@ int32_t Beidou_Dnav_Navigation_Message::d2_subframe_decoder(std::string const& s d_Crs = static_cast(read_navigation_signed(subframe_bits, D2_CRS)) * D1_CRS_LSB; d_OMEGA_DOT_msb_bits = (read_navigation_unsigned(subframe_bits, D2_OMEGA_DOT_MSB)); // Adjust for lsb in next page (shift number of lsb to the left) - d_OMEGA_DOT_msb_bits = d_OMEGA_DOT_msb_bits << 5; + d_OMEGA_DOT_msb_bits = d_OMEGA_DOT_msb_bits << 5ULL; // Set system flags for message reception flag_sf1_p8 = true; @@ -886,7 +886,7 @@ int32_t Beidou_Dnav_Navigation_Message::d2_subframe_decoder(std::string const& s d_OMEGA0 = static_cast(read_navigation_signed(subframe_bits, D2_OMEGA0)) * D1_OMEGA0_LSB; d_OMEGA_msb_bits = (read_navigation_unsigned(subframe_bits, D2_OMEGA_MSB)); // Adjust for lsb in next page (shift number of lsb to the left) - d_OMEGA_msb_bits = d_OMEGA_msb_bits << 5; + d_OMEGA_msb_bits = d_OMEGA_msb_bits << 5U; // Set system flags for message reception flag_sf1_p9 = true; diff --git a/src/core/system_parameters/galileo_fnav_message.cc b/src/core/system_parameters/galileo_fnav_message.cc index 3807fc143..499a2bd77 100644 --- a/src/core/system_parameters/galileo_fnav_message.cc +++ b/src/core/system_parameters/galileo_fnav_message.cc @@ -439,7 +439,7 @@ uint64_t Galileo_Fnav_Message::read_navigation_unsigned(std::bitset(bits[GALILEO_FNAV_DATA_FRAME_BITS - parameter[i].first - j]) == 1) { value += 1; // insert the bit diff --git a/src/core/system_parameters/galileo_navigation_message.cc b/src/core/system_parameters/galileo_navigation_message.cc index cb5f55b02..a1c21ca0a 100644 --- a/src/core/system_parameters/galileo_navigation_message.cc +++ b/src/core/system_parameters/galileo_navigation_message.cc @@ -266,7 +266,7 @@ uint64_t Galileo_Navigation_Message::read_navigation_unsigned(std::bitset(bits[GALILEO_DATA_JK_BITS - parameter[i].first - j]) == 1) { value += 1; // insert the bit @@ -285,7 +285,7 @@ uint64_t Galileo_Navigation_Message::read_page_type_unsigned(std::bitset(bits[GALILEO_PAGE_TYPE_BITS - parameter[i].first - j]) == 1) { value += 1ULL; // insert the bit @@ -965,6 +965,9 @@ int32_t Galileo_Navigation_Message::page_jk_decoder(const char* data_jk) DLOG(INFO) << "TOW_0= " << TOW_0; DLOG(INFO) << "flag_tow_set" << flag_TOW_set; break; + + default: + break; } return page_number; } diff --git a/src/core/system_parameters/glonass_gnav_navigation_message.cc b/src/core/system_parameters/glonass_gnav_navigation_message.cc index c3d4176cd..68779e814 100644 --- a/src/core/system_parameters/glonass_gnav_navigation_message.cc +++ b/src/core/system_parameters/glonass_gnav_navigation_message.cc @@ -111,7 +111,7 @@ Glonass_Gnav_Navigation_Message::Glonass_Gnav_Navigation_Message() bool Glonass_Gnav_Navigation_Message::CRC_test(std::bitset bits) { - int32_t sum_bits = 0; + uint32_t sum_bits = 0; int32_t sum_hamming = 0; int32_t C1 = 0; int32_t C2 = 0; @@ -121,12 +121,12 @@ bool Glonass_Gnav_Navigation_Message::CRC_test(std::bitset string_bits(GLONASS_GNAV_STRING_BITS); + std::vector string_bits(GLONASS_GNAV_STRING_BITS); // Populate data and hamming code vectors - for (int32_t i = 0; i < static_cast(GLONASS_GNAV_STRING_BITS); i++) + for (int32_t i = 0; i < string_bits.size(); i++) { - string_bits[i] = static_cast(bits[i]); + string_bits[i] = static_cast(bits[i]); } // Compute C1 term @@ -239,7 +239,7 @@ uint64_t Glonass_Gnav_Navigation_Message::read_navigation_unsigned(std::bitset(bits[GPS_CNAV_DATA_PAGE_BITS - parameter[i].first - j]) == 1) { value += 1ULL; // insert the bit From 504a22d6bb8999e06d9de82b09f76a97f12991ce Mon Sep 17 00:00:00 2001 From: Javier Arribas Date: Fri, 19 Jul 2019 18:49:42 +0200 Subject: [PATCH 15/36] Introducing the new satellite dispatcher with optional assistance from primary frequencies to secondary frequencies --- src/core/receiver/control_thread.cc | 85 ++-- src/core/receiver/control_thread.h | 6 +- src/core/receiver/gnss_flowgraph.cc | 660 ++++++---------------------- src/core/receiver/gnss_flowgraph.h | 8 +- 4 files changed, 195 insertions(+), 564 deletions(-) diff --git a/src/core/receiver/control_thread.cc b/src/core/receiver/control_thread.cc index f77d0b29c..8b4a7ffc9 100644 --- a/src/core/receiver/control_thread.cc +++ b/src/core/receiver/control_thread.cc @@ -224,6 +224,49 @@ void ControlThread::telecommand_listener() } } +void ControlThread::event_dispatcher(bool &valid_event, pmt::pmt_t &msg) +{ + if (valid_event) + { + if (pmt::any_ref(msg).type() == typeid(channel_event_sptr)) + { + channel_event_sptr new_event; + new_event = boost::any_cast(pmt::any_ref(msg)); + DLOG(INFO) << "New channel event rx from ch id: " << new_event->channel_id + << " what: " << new_event->event_type; + flowgraph_->apply_action(new_event->channel_id, new_event->event_type); + } + else if (pmt::any_ref(msg).type() == typeid(command_event_sptr)) + { + command_event_sptr new_event; + new_event = boost::any_cast(pmt::any_ref(msg)); + DLOG(INFO) << "New command event rx from ch id: " << new_event->command_id + << " what: " << new_event->event_type; + + if (new_event->command_id == 200) + { + apply_action(new_event->event_type); + } + else + { + if (new_event->command_id == 300) // some TC commands require also actions from control_thread + { + apply_action(new_event->event_type); + } + flowgraph_->apply_action(new_event->command_id, new_event->event_type); + } + } + else + { + DLOG(INFO) << "Control Queue: unknown object type!\n"; + } + } + else + { + //perform non-priority tasks + flowgraph_->acquisition_manager(0); //start acquisition of untracked satellites + } +} /* * Runs the control thread that manages the receiver control plane @@ -286,46 +329,10 @@ int ControlThread::run() pmt::pmt_t msg; while (flowgraph_->running() && !stop_) { - //TODO call here the new sat dispatcher and receiver controller + //read event messages, triggered by event signaling with a 100 ms timeout to perform low priority receiver management tasks bool valid_event = control_queue_->timed_wait_and_pop(msg, 100); - if (valid_event) - { - if (pmt::any_ref(msg).type() == typeid(channel_event_sptr)) - { - channel_event_sptr new_event; - new_event = boost::any_cast(pmt::any_ref(msg)); - DLOG(INFO) << "New channel event rx from ch id: " << new_event->channel_id - << " what: " << new_event->event_type; - flowgraph_->apply_action(new_event->channel_id, new_event->event_type); - } - else if (pmt::any_ref(msg).type() == typeid(command_event_sptr)) - { - command_event_sptr new_event; - new_event = boost::any_cast(pmt::any_ref(msg)); - DLOG(INFO) << "New command event rx from ch id: " << new_event->command_id - << " what: " << new_event->event_type; - - if (new_event->command_id == 200) - { - apply_action(new_event->event_type); - } - else - { - if (new_event->command_id == 300) // some TC commands require also actions from control_thread - { - apply_action(new_event->event_type); - } - flowgraph_->apply_action(new_event->command_id, new_event->event_type); - } - } - else - { - DLOG(INFO) << "Control Queue: unknown object type!\n"; - } - } - else - { - } + //call the new sat dispatcher and receiver controller + event_dispatcher(valid_event, msg); } std::cout << "Stopping GNSS-SDR, please wait!" << std::endl; flowgraph_->stop(); diff --git a/src/core/receiver/control_thread.h b/src/core/receiver/control_thread.h index 1066895fa..5fa84f791 100644 --- a/src/core/receiver/control_thread.h +++ b/src/core/receiver/control_thread.h @@ -123,6 +123,10 @@ private: //Telecommand TCP interface TcpCmdInterface cmd_interface_; void telecommand_listener(); + /* + * New receiver event dispatcher + */ + void event_dispatcher(bool &valid_event, pmt::pmt_t &msg); std::thread cmd_interface_thread_; //SUPL assistance classes Gnss_Sdr_Supl_Client supl_client_acquisition_; @@ -149,7 +153,7 @@ private: * Compute elevations for the specified time and position for all the available satellites in ephemeris and almanac queues * returns a vector filled with the available satellites ordered from high elevation to low elevation angle. */ - std::vector> get_visible_sats(time_t rx_utc_time, const arma::vec& LLH); + std::vector> get_visible_sats(time_t rx_utc_time, const arma::vec &LLH); /* * Read initial GNSS assistance from SUPL server or local XML files diff --git a/src/core/receiver/gnss_flowgraph.cc b/src/core/receiver/gnss_flowgraph.cc index f13b6b26f..fd142761a 100644 --- a/src/core/receiver/gnss_flowgraph.cc +++ b/src/core/receiver/gnss_flowgraph.cc @@ -1161,6 +1161,84 @@ void GNSSFlowgraph::remove_signal(Gnss_Signal gs) break; } } + +void GNSSFlowgraph::acquisition_manager(unsigned int who) +{ + unsigned int current_channel; + for (unsigned int i = 0; i < channels_count_; i++) + { + current_channel = (i + who + 1) % channels_count_; + unsigned int sat_ = 0; + try + { + sat_ = configuration_->property("Channel" + std::to_string(current_channel) + ".satellite", 0); + } + catch (const std::exception& e) + { + LOG(WARNING) << e.what(); + } + if ((acq_channels_count_ < max_acq_channels_) && (channels_state_[current_channel] == 0)) + { + bool is_primary_freq = true; + bool assistance_available = false; + bool start_acquisition = false; + Gnss_Signal gnss_signal; + if (sat_ == 0) + { + float estimated_doppler; + double RX_time; + gnss_signal = search_next_signal(channels_[current_channel]->get_signal().get_signal_str(), + true, + is_primary_freq, + assistance_available, + estimated_doppler, + RX_time); + channels_[current_channel]->set_signal(gnss_signal); + start_acquisition = is_primary_freq or assistance_available or !configuration_->property("GNSS-SDR.assist_dual_frequency_acq", false); + // if (assistance_available) + // { + // std::cout << "Channel " << current_channel + // << " assistance available for " << channels_[current_channel]->get_signal().get_satellite() + // << ", Signal " << channels_[current_channel]->get_signal().get_signal_str() << "\n"; + // } + } + else + { + start_acquisition = true; + } + + if (start_acquisition == true) + { + channels_state_[current_channel] = 1; + acq_channels_count_++; + DLOG(INFO) << "Channel " << current_channel + << " Starting acquisition " << channels_[current_channel]->get_signal().get_satellite() + << ", Signal " << channels_[current_channel]->get_signal().get_signal_str(); +#ifndef ENABLE_FPGA + channels_[current_channel]->start_acquisition(); +#else + // create a task for the FPGA such that it doesn't stop the flow + std::thread tmp_thread(&ChannelInterface::start_acquisition, channels_[current_channel]); + tmp_thread.detach(); +#endif + } + else + { + push_back_signal(gnss_signal); + DLOG(INFO) << "Channel " << current_channel + << " secondary frequency acquisition assistance not available in " + << channels_[current_channel]->get_signal().get_satellite() + << ", Signal " << channels_[current_channel]->get_signal().get_signal_str(); + + // std::cout << "Channel " << current_channel + // << " secondary frequency acquisition assistance not available in " + // << channels_[current_channel]->get_signal().get_satellite() + // << ", Signal " << channels_[current_channel]->get_signal().get_signal_str() << "\n"; + } + } + DLOG(INFO) << "Channel " << current_channel << " in state " << channels_state_[current_channel]; + } +} /* * Applies an action to the flow graph * @@ -1188,8 +1266,7 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) //todo: the acquisition events are initiated from the acquisition success or failure queued msg. If the acquisition is disabled for non-assisted secondary freq channels, the engine stops.. std::lock_guard lock(signal_list_mutex); - std::cout << "Received " << what << " from " << who << ". acq_channels_count_ = " << acq_channels_count_ << "\n"; - DLOG(INFO) << "Received " << what << " from " << who << ". Number of applied actions = " << applied_actions_; + DLOG(INFO) << "Received " << what << " from " << who; unsigned int sat = 0; if (who < 200) { @@ -1213,134 +1290,28 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) } channels_state_[who] = 0; if (acq_channels_count_ > 0) acq_channels_count_--; - for (unsigned int i = 0; i < channels_count_; i++) - { - unsigned int ch_index = (who + i + 1) % channels_count_; - unsigned int sat_ = 0; - try - { - sat_ = configuration_->property("Channel" + std::to_string(ch_index) + ".satellite", 0); - } - catch (const std::exception& e) - { - LOG(WARNING) << e.what(); - } - if ((acq_channels_count_ < max_acq_channels_) && (channels_state_[ch_index] == 0)) - { - bool is_primary_freq = true; - bool assistance_available = false; - bool start_acquisition = false; - Gnss_Signal gnss_signal; - if (sat_ == 0) - { - float estimated_doppler; - double RX_time; - - gnss_signal = search_next_signal(channels_[ch_index]->get_signal().get_signal_str(), false, is_primary_freq, assistance_available, estimated_doppler, RX_time); - channels_[ch_index]->set_signal(gnss_signal); - start_acquisition = is_primary_freq or assistance_available; - } - else - { - start_acquisition = true; - } - //todo: add configuration parameter to enable the mandatory acquisition assistance in secondary freq - // if (start_acquisition == true) - // { - channels_state_[ch_index] = 1; - acq_channels_count_++; - std::cout << "Channel " << ch_index << " Starting acquisition " << channels_[ch_index]->get_signal().get_satellite() << ", Signal " << channels_[ch_index]->get_signal().get_signal_str(); - DLOG(INFO) << "Channel " << ch_index << " Starting acquisition " << channels_[ch_index]->get_signal().get_satellite() << ", Signal " << channels_[ch_index]->get_signal().get_signal_str(); -#ifndef ENABLE_FPGA - channels_[ch_index]->start_acquisition(); -#else - // create a task for the FPGA such that it doesn't stop the flow - std::thread tmp_thread(&ChannelInterface::start_acquisition, channels_[ch_index]); - tmp_thread.detach(); -#endif - // } - // else - // { - // push_back_signal(gnss_signal); - // DLOG(INFO) << "Channel " << ch_index << " secondary frequency acquisition assistance not available in " << channels_[ch_index]->get_signal().get_satellite() << ", Signal " << channels_[ch_index]->get_signal().get_signal_str(); - // } - } - DLOG(INFO) << "Channel " << ch_index << " in state " << channels_state_[ch_index]; - } + //call the acquisition manager to assign new satellite and start next acquisition (if required) + acquisition_manager(who); break; - case 1: - LOG(INFO) << "Channel " << who << " ACQ SUCCESS satellite " << channels_[who]->get_signal().get_satellite(); - + DLOG(INFO) << "Channel " << who << " ACQ SUCCESS satellite " << channels_[who]->get_signal().get_satellite(); // If the satellite is in the list of available ones, remove it. remove_signal(channels_[who]->get_signal()); channels_state_[who] = 2; if (acq_channels_count_ > 0) acq_channels_count_--; - for (unsigned int i = 0; i < channels_count_; i++) - { - unsigned int sat_ = 0; - try - { - sat_ = configuration_->property("Channel" + std::to_string(i) + ".satellite", 0); - } - catch (const std::exception& e) - { - LOG(WARNING) << e.what(); - } - if ((acq_channels_count_ < max_acq_channels_) && (channels_state_[i] == 0)) - { - bool is_primary_freq = true; - bool assistance_available = false; - bool start_acquisition = false; - Gnss_Signal gnss_signal; - if (sat_ == 0) - { - float estimated_doppler; - double RX_time; - gnss_signal = search_next_signal(channels_[i]->get_signal().get_signal_str(), true, is_primary_freq, assistance_available, estimated_doppler, RX_time); - channels_[i]->set_signal(gnss_signal); - } - else - { - start_acquisition = true; - } - - //todo: add configuration parameter to enable the mandatory acquisition assistance in secondary freq - // if (start_acquisition == true) - // { - channels_state_[i] = 1; - acq_channels_count_++; - DLOG(INFO) << "Channel " << i << " Starting acquisition " << channels_[i]->get_signal().get_satellite() << ", Signal " << channels_[i]->get_signal().get_signal_str(); -#ifndef ENABLE_FPGA - channels_[i]->start_acquisition(); -#else - // create a task for the FPGA such that it doesn't stop the flow - std::thread tmp_thread(&ChannelInterface::start_acquisition, channels_[i]); - tmp_thread.detach(); - start_acquisition = is_primary_freq or assistance_available; -#endif - // } - // else - // { - // push_back_signal(gnss_signal); - // DLOG(INFO) << "Channel " << i << " secondary frequency acquisition assistance not available in " << channels_[i]->get_signal().get_satellite() << ", Signal " << channels_[i]->get_signal().get_signal_str(); - // std::cout << "Channel " << i << " secondary frequency acquisition assistance not available in " << channels_[i]->get_signal().get_satellite() << ", Signal " << channels_[i]->get_signal().get_signal_str()<<"\n"; - // } - } - DLOG(INFO) << "Channel " << i << " in state " << channels_state_[i]; - } + //call the acquisition manager to assign new satellite and start next acquisition (if required) + acquisition_manager(who); break; case 2: - LOG(INFO) << "Channel " << who << " TRK FAILED satellite " << channels_[who]->get_signal().get_satellite(); - DLOG(INFO) << "Number of channels in acquisition = " << acq_channels_count_; - + DLOG(INFO) << "Channel " << who << " TRK FAILED satellite " << channels_[who]->get_signal().get_satellite(); if (acq_channels_count_ < max_acq_channels_) { + //try to acquire the same satellite channels_state_[who] = 1; acq_channels_count_++; - LOG(INFO) << "Channel " << who << " Starting acquisition " << channels_[who]->get_signal().get_satellite() << ", Signal " << channels_[who]->get_signal().get_signal_str(); + DLOG(INFO) << "Channel " << who << " Starting acquisition " << channels_[who]->get_signal().get_satellite() << ", Signal " << channels_[who]->get_signal().get_signal_str(); #ifndef ENABLE_FPGA channels_[who]->start_acquisition(); #else @@ -1377,124 +1348,22 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) break; case 11: // request coldstart mode LOG(INFO) << "TC request flowgraph coldstart"; - // start again the satellite acquisitions - for (unsigned int i = 0; i < channels_count_; i++) - { - unsigned int ch_index = (who + i + 1) % channels_count_; - unsigned int sat_ = 0; - try - { - sat_ = configuration_->property("Channel" + std::to_string(ch_index) + ".satellite", 0); - } - catch (const std::exception& e) - { - LOG(WARNING) << e.what(); - } - if ((acq_channels_count_ < max_acq_channels_) && (channels_state_[ch_index] == 0)) - { - channels_state_[ch_index] = 1; - if (sat_ == 0) - { - bool is_primary_freq; - bool assistance_available; - float estimated_doppler; - double RX_time; - channels_[ch_index]->set_signal(search_next_signal(channels_[ch_index]->get_signal().get_signal_str(), true, is_primary_freq, assistance_available, estimated_doppler, RX_time)); - } - acq_channels_count_++; - DLOG(INFO) << "Channel " << ch_index << " Starting acquisition " << channels_[ch_index]->get_signal().get_satellite() << ", Signal " << channels_[ch_index]->get_signal().get_signal_str(); -#ifndef ENABLE_FPGA - channels_[ch_index]->start_acquisition(); -#else - // create a task for the FPGA such that it doesn't stop the flow - std::thread tmp_thread(&ChannelInterface::start_acquisition, channels_[ch_index]); - tmp_thread.detach(); -#endif - } - DLOG(INFO) << "Channel " << ch_index << " in state " << channels_state_[ch_index]; - } + //call the acquisition manager to assign new satellite and start next acquisition (if required) + acquisition_manager(who); break; case 12: // request hotstart mode LOG(INFO) << "TC request flowgraph hotstart"; - for (unsigned int i = 0; i < channels_count_; i++) - { - unsigned int ch_index = (who + i + 1) % channels_count_; - unsigned int sat_ = 0; - try - { - sat_ = configuration_->property("Channel" + std::to_string(ch_index) + ".satellite", 0); - } - catch (const std::exception& e) - { - LOG(WARNING) << e.what(); - } - if ((acq_channels_count_ < max_acq_channels_) && (channels_state_[ch_index] == 0)) - { - channels_state_[ch_index] = 1; - if (sat_ == 0) - { - bool is_primary_freq; - bool assistance_available; - float estimated_doppler; - double RX_time; - channels_[ch_index]->set_signal(search_next_signal(channels_[ch_index]->get_signal().get_signal_str(), true, is_primary_freq, assistance_available, estimated_doppler, RX_time)); - } - acq_channels_count_++; - DLOG(INFO) << "Channel " << ch_index << " Starting acquisition " << channels_[ch_index]->get_signal().get_satellite() << ", Signal " << channels_[ch_index]->get_signal().get_signal_str(); -#ifndef ENABLE_FPGA - channels_[ch_index]->start_acquisition(); -#else - // create a task for the FPGA such that it doesn't stop the flow - std::thread tmp_thread(&ChannelInterface::start_acquisition, channels_[ch_index]); - tmp_thread.detach(); -#endif - } - DLOG(INFO) << "Channel " << ch_index << " in state " << channels_state_[ch_index]; - } + //call the acquisition manager to assign new satellite and start next acquisition (if required) + acquisition_manager(who); break; case 13: // request warmstart mode LOG(INFO) << "TC request flowgraph warmstart"; - // start again the satellite acquisitions - for (unsigned int i = 0; i < channels_count_; i++) - { - unsigned int ch_index = (who + i + 1) % channels_count_; - unsigned int sat_ = 0; - try - { - sat_ = configuration_->property("Channel" + std::to_string(ch_index) + ".satellite", 0); - } - catch (const std::exception& e) - { - LOG(WARNING) << e.what(); - } - if ((acq_channels_count_ < max_acq_channels_) && (channels_state_[ch_index] == 0)) - { - channels_state_[ch_index] = 1; - if (sat_ == 0) - { - bool is_primary_freq; - bool assistance_available; - float estimated_doppler; - double RX_time; - channels_[ch_index]->set_signal(search_next_signal(channels_[ch_index]->get_signal().get_signal_str(), true, is_primary_freq, assistance_available, estimated_doppler, RX_time)); - } - acq_channels_count_++; - DLOG(INFO) << "Channel " << ch_index << " Starting acquisition " << channels_[ch_index]->get_signal().get_satellite() << ", Signal " << channels_[ch_index]->get_signal().get_signal_str(); -#ifndef ENABLE_FPGA - channels_[ch_index]->start_acquisition(); -#else - // create a task for the FPGA such that it doesn't stop the flow - std::thread tmp_thread(&ChannelInterface::start_acquisition, channels_[ch_index]); - tmp_thread.detach(); -#endif - } - DLOG(INFO) << "Channel " << ch_index << " in state " << channels_state_[ch_index]; - } + //call the acquisition manager to assign new satellite and start next acquisition (if required) + acquisition_manager(who); break; default: break; } - applied_actions_++; } @@ -1690,7 +1559,6 @@ void GNSSFlowgraph::init() // fill the signals queue with the satellites ID's to be searched by the acquisition set_signals_list(); set_channels_state(); - applied_actions_ = 0; DLOG(INFO) << "Blocks instantiated. " << channels_count_ << " channels."; /* @@ -2007,6 +1875,7 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal double& RX_time) { is_primary_frequency = false; + assistance_available = false; Gnss_Signal result; bool found_signal = false; switch (mapStringValues_[searched_signal]) @@ -2039,7 +1908,9 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal if (it2 != available_GPS_2S_signals_.end()) { - std::cout << " Channel: " << it->first << " => Doppler: " << it->second->Carrier_Doppler_hz << "[Hz] \n"; + estimated_doppler = it->second->Carrier_Doppler_hz; + RX_time = it->second->RX_time; + //std::cout << " Channel: " << it->first << " => Doppler: " << estimated_doppler << "[Hz] \n"; //3. return the GPS L2 satellite and remove it from list result = *it2; if (pop) @@ -2047,7 +1918,7 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal available_GPS_2S_signals_.erase(it2); } found_signal = true; - + assistance_available = true; break; } } @@ -2090,7 +1961,9 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal if (it2 != available_GPS_L5_signals_.end()) { - std::cout << " Channel: " << it->first << " => Doppler: " << it->second->Carrier_Doppler_hz << "[Hz] \n"; + estimated_doppler = it->second->Carrier_Doppler_hz; + RX_time = it->second->RX_time; + //std::cout << " Channel: " << it->first << " => Doppler: " << estimated_doppler << "[Hz] \n"; //3. return the GPS L5 satellite and remove it from list result = *it2; if (pop) @@ -2098,6 +1971,7 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal available_GPS_L5_signals_.erase(it2); } found_signal = true; + assistance_available = true; break; } } @@ -2126,11 +2000,47 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal break; case evGAL_5X: - result = available_GAL_5X_signals_.front(); - available_GAL_5X_signals_.pop_front(); - if (!pop) + + if (configuration_->property("Channels_1B.count", 0) > 0) { - available_GAL_5X_signals_.push_back(result); + //1. Get the current channel status map + std::map> current_channels_status = channels_status_->get_current_status_map(); + //2. search the currently tracked Galileo E1 satellites and assist the Galileo E5 acquisition if the satellite is not tracked on E5 + for (std::map>::iterator it = current_channels_status.begin(); it != current_channels_status.end(); ++it) + { + if (std::string(it->second->Signal) == "1B") + { + std::list::iterator it2; + it2 = std::find_if(std::begin(available_GAL_5X_signals_), std::end(available_GAL_5X_signals_), + [&](Gnss_Signal const& sig) { return sig.get_satellite().get_PRN() == it->second->PRN; }); + + if (it2 != available_GAL_5X_signals_.end()) + { + estimated_doppler = it->second->Carrier_Doppler_hz; + RX_time = it->second->RX_time; + //std::cout << " Channel: " << it->first << " => Doppler: " << estimated_doppler << "[Hz] \n"; + //3. return the Gal 5X satellite and remove it from list + result = *it2; + if (pop) + { + available_GAL_5X_signals_.erase(it2); + } + found_signal = true; + assistance_available = true; + break; + } + } + } + } + //fallback: pick the front satellite because there is no tracked satellites in E1 to assist E5 + if (found_signal == false) + { + result = available_GAL_5X_signals_.front(); + available_GAL_5X_signals_.pop_front(); + if (!pop) + { + available_GAL_5X_signals_.push_back(result); + } } break; @@ -2182,290 +2092,4 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal break; } return result; - - - //old - // bool untracked_satellite = true; - // switch (mapStringValues_[searched_signal]) - // { - // case evGPS_1C: - // result = available_GPS_1C_signals_.front(); - // available_GPS_1C_signals_.pop_front(); - // if (!pop) - // { - // available_GPS_1C_signals_.push_back(result); - // } - // if (tracked) - // { - // if ((configuration_->property("Channels_2S.count", 0) > 0) or (configuration_->property("Channels_L5.count", 0) > 0)) - // { - // for (unsigned int ch = 0; ch < channels_count_; ch++) - // { - // if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "1C")) - // { - // untracked_satellite = false; - // } - // } - // if (untracked_satellite and configuration_->property("Channels_2S.count", 0) > 0) - // { - // Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "2S"); - // available_GPS_2S_signals_.remove(gs); - // available_GPS_2S_signals_.push_front(gs); - // } - // if (untracked_satellite and configuration_->property("Channels_L5.count", 0) > 0) - // { - // Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "L5"); - // available_GPS_L5_signals_.remove(gs); - // available_GPS_L5_signals_.push_front(gs); - // } - // } - // } - // break; - // - // case evGPS_2S: - // result = available_GPS_2S_signals_.front(); - // available_GPS_2S_signals_.pop_front(); - // if (!pop) - // { - // available_GPS_2S_signals_.push_back(result); - // } - // if (tracked) - // { - // if ((configuration_->property("Channels_1C.count", 0) > 0) or (configuration_->property("Channels_L5.count", 0) > 0)) - // { - // for (unsigned int ch = 0; ch < channels_count_; ch++) - // { - // if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "2S")) - // { - // untracked_satellite = false; - // } - // } - // if (untracked_satellite and configuration_->property("Channels_1C.count", 0) > 0) - // { - // Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "1C"); - // available_GPS_1C_signals_.remove(gs); - // available_GPS_1C_signals_.push_front(gs); - // } - // if (untracked_satellite and configuration_->property("Channels_L5.count", 0) > 0) - // { - // Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "L5"); - // available_GPS_L5_signals_.remove(gs); - // available_GPS_L5_signals_.push_front(gs); - // } - // } - // } - // break; - // - // case evGPS_L5: - // result = available_GPS_L5_signals_.front(); - // available_GPS_L5_signals_.pop_front(); - // if (!pop) - // { - // available_GPS_L5_signals_.push_back(result); - // } - // if (tracked) - // { - // if ((configuration_->property("Channels_1C.count", 0) > 0) or (configuration_->property("Channels_2S.count", 0) > 0)) - // { - // for (unsigned int ch = 0; ch < channels_count_; ch++) - // { - // if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "L5")) - // { - // untracked_satellite = false; - // } - // } - // if (untracked_satellite and configuration_->property("Channels_1C.count", 0) > 0) - // { - // Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "1C"); - // available_GPS_1C_signals_.remove(gs); - // available_GPS_1C_signals_.push_front(gs); - // } - // if (untracked_satellite and configuration_->property("Channels_2S.count", 0) > 0) - // { - // Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "2S"); - // available_GPS_2S_signals_.remove(gs); - // available_GPS_2S_signals_.push_front(gs); - // } - // } - // } - // break; - // - // case evGAL_1B: - // result = available_GAL_1B_signals_.front(); - // available_GAL_1B_signals_.pop_front(); - // if (!pop) - // { - // available_GAL_1B_signals_.push_back(result); - // } - // if (tracked) - // { - // if (configuration_->property("Channels_5X.count", 0) > 0) - // { - // for (unsigned int ch = 0; ch < channels_count_; ch++) - // { - // if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "1B")) - // { - // untracked_satellite = false; - // } - // } - // if (untracked_satellite) - // { - // Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "5X"); - // available_GAL_5X_signals_.remove(gs); - // available_GAL_5X_signals_.push_front(gs); - // } - // } - // } - // break; - // - // case evGAL_5X: - // result = available_GAL_5X_signals_.front(); - // available_GAL_5X_signals_.pop_front(); - // if (!pop) - // { - // available_GAL_5X_signals_.push_back(result); - // } - // if (tracked) - // { - // if (configuration_->property("Channels_1B.count", 0) > 0) - // { - // for (unsigned int ch = 0; ch < channels_count_; ch++) - // { - // if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "5X")) - // { - // untracked_satellite = false; - // } - // } - // if (untracked_satellite) - // { - // Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "1B"); - // available_GAL_1B_signals_.remove(gs); - // available_GAL_1B_signals_.push_front(gs); - // } - // } - // } - // break; - // - // case evGLO_1G: - // result = available_GLO_1G_signals_.front(); - // available_GLO_1G_signals_.pop_front(); - // if (!pop) - // { - // available_GLO_1G_signals_.push_back(result); - // } - // if (tracked) - // { - // if (configuration_->property("Channels_2G.count", 0) > 0) - // { - // for (unsigned int ch = 0; ch < channels_count_; ch++) - // { - // if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "1G")) - // { - // untracked_satellite = false; - // } - // } - // if (untracked_satellite) - // { - // Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "2G"); - // available_GLO_2G_signals_.remove(gs); - // available_GLO_2G_signals_.push_front(gs); - // } - // } - // } - // break; - // - // case evGLO_2G: - // result = available_GLO_2G_signals_.front(); - // available_GLO_2G_signals_.pop_front(); - // if (!pop) - // { - // available_GLO_2G_signals_.push_back(result); - // } - // if (tracked) - // { - // if (configuration_->property("Channels_1G.count", 0) > 0) - // { - // for (unsigned int ch = 0; ch < channels_count_; ch++) - // { - // if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "2G")) - // { - // untracked_satellite = false; - // } - // } - // if (untracked_satellite) - // { - // Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "1G"); - // available_GLO_1G_signals_.remove(gs); - // available_GLO_1G_signals_.push_front(gs); - // } - // } - // } - // break; - // - // case evBDS_B1: - // result = available_BDS_B1_signals_.front(); - // available_BDS_B1_signals_.pop_front(); - // if (!pop) - // { - // available_BDS_B1_signals_.push_back(result); - // } - // if (tracked) - // { - // if (configuration_->property("Channels_B3.count", 0) > 0) - // { - // for (unsigned int ch = 0; ch < channels_count_; ch++) - // { - // if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "2G")) - // { - // untracked_satellite = false; - // } - // } - // if (untracked_satellite) - // { - // Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "B3"); - // available_BDS_B3_signals_.remove(gs); - // available_BDS_B3_signals_.push_front(gs); - // } - // } - // } - // break; - // - // case evBDS_B3: - // result = available_BDS_B3_signals_.front(); - // available_BDS_B3_signals_.pop_front(); - // if (!pop) - // { - // available_BDS_B3_signals_.push_back(result); - // } - // if (tracked) - // { - // if (configuration_->property("Channels_B1.count", 0) > 0) - // { - // for (unsigned int ch = 0; ch < channels_count_; ch++) - // { - // if ((channels_[ch]->get_signal().get_satellite() == result.get_satellite()) and (channels_[ch]->get_signal().get_signal_str() != "2G")) - // { - // untracked_satellite = false; - // } - // } - // if (untracked_satellite) - // { - // Gnss_Signal gs = Gnss_Signal(result.get_satellite(), "B1"); - // available_BDS_B1_signals_.remove(gs); - // available_BDS_B1_signals_.push_front(gs); - // } - // } - // } - // break; - // - // default: - // LOG(ERROR) << "This should not happen :-("; - // result = available_GPS_1C_signals_.front(); - // if (pop) - // { - // available_GPS_1C_signals_.pop_front(); - // } - // break; - // } - // return result; } diff --git a/src/core/receiver/gnss_flowgraph.h b/src/core/receiver/gnss_flowgraph.h index cfba9914f..8d3c3fa58 100644 --- a/src/core/receiver/gnss_flowgraph.h +++ b/src/core/receiver/gnss_flowgraph.h @@ -100,6 +100,8 @@ public: void perform_hw_reset(); #endif + + void acquisition_manager(unsigned int who); /*! * \brief Applies an action to the flow graph * @@ -114,11 +116,6 @@ public: void set_configuration(std::shared_ptr configuration); - unsigned int applied_actions() const - { - return applied_actions_; - } - bool connected() const { return connected_; @@ -167,7 +164,6 @@ private: unsigned int channels_count_; unsigned int acq_channels_count_; unsigned int max_acq_channels_; - unsigned int applied_actions_; std::string config_file_; std::shared_ptr configuration_; From 0e583f5c39a0720a547b6e6a2f17638b6b80797c Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Fri, 19 Jul 2019 23:26:26 +0200 Subject: [PATCH 16/36] Fix test --- src/core/receiver/control_thread.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/receiver/control_thread.cc b/src/core/receiver/control_thread.cc index 8b4a7ffc9..dfbe4792b 100644 --- a/src/core/receiver/control_thread.cc +++ b/src/core/receiver/control_thread.cc @@ -228,6 +228,7 @@ void ControlThread::event_dispatcher(bool &valid_event, pmt::pmt_t &msg) { if (valid_event) { + processed_control_messages_++; if (pmt::any_ref(msg).type() == typeid(channel_event_sptr)) { channel_event_sptr new_event; @@ -834,18 +835,17 @@ void ControlThread::apply_action(unsigned int what) { std::shared_ptr pvt_ptr; std::vector> visible_satellites; + applied_actions_++; switch (what) { case 0: LOG(INFO) << "Received action STOP"; stop_ = true; - applied_actions_++; break; case 1: LOG(INFO) << "Received action RESTART"; stop_ = true; restart_ = true; - applied_actions_++; break; case 11: LOG(INFO) << "Receiver action COLDSTART"; From ef9c02bac2c412bc06d2006b6a1366124c3259d4 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sat, 20 Jul 2019 02:53:31 +0200 Subject: [PATCH 17/36] Miscellaneous changes: fix typos, warnings --- .../spir_gss6450_file_signal_source.cc | 2 +- .../adapters/uhd_signal_source.cc | 2 +- src/core/receiver/control_thread.cc | 18 ++-- src/core/receiver/gnss_flowgraph.cc | 95 +++++++++--------- .../glonass_gnav_navigation_message.cc | 2 +- src/tests/data/high_dynamics_signal.bin | Bin 168784 -> 0 bytes src/tests/data/high_dynamics_signal.mat | Bin 79823 -> 0 bytes 7 files changed, 61 insertions(+), 58 deletions(-) delete mode 100644 src/tests/data/high_dynamics_signal.bin delete mode 100644 src/tests/data/high_dynamics_signal.mat diff --git a/src/algorithms/signal_source/adapters/spir_gss6450_file_signal_source.cc b/src/algorithms/signal_source/adapters/spir_gss6450_file_signal_source.cc index 1ba2d5bf0..4b6239ba5 100644 --- a/src/algorithms/signal_source/adapters/spir_gss6450_file_signal_source.cc +++ b/src/algorithms/signal_source/adapters/spir_gss6450_file_signal_source.cc @@ -148,7 +148,7 @@ SpirGSS6450FileSignalSource::SpirGSS6450FileSignalSource(ConfigurationInterface* for (uint32_t i = 0; i < (n_channels_); i++) { - valve_vec_.push_back(gnss_sdr_make_valve(sizeof(gr_complex), samples_, queue_)); + valve_vec_.emplace_back(gnss_sdr_make_valve(sizeof(gr_complex), samples_, queue_)); if (dump_) { std::string tmp_str = dump_filename_ + "_ch" + std::to_string(i); diff --git a/src/algorithms/signal_source/adapters/uhd_signal_source.cc b/src/algorithms/signal_source/adapters/uhd_signal_source.cc index 646d2ad00..16ab70b8e 100644 --- a/src/algorithms/signal_source/adapters/uhd_signal_source.cc +++ b/src/algorithms/signal_source/adapters/uhd_signal_source.cc @@ -216,7 +216,7 @@ UhdSignalSource::UhdSignalSource(ConfigurationInterface* configuration, if (samples_.at(i) != 0ULL) { LOG(INFO) << "RF_channel " << i << " Send STOP signal after " << samples_.at(i) << " samples"; - valve_.push_back(gnss_sdr_make_valve(item_size_, samples_.at(i), queue_)); + valve_.emplace_back(gnss_sdr_make_valve(item_size_, samples_.at(i), queue_)); DLOG(INFO) << "valve(" << valve_.at(i)->unique_id() << ")"; } diff --git a/src/core/receiver/control_thread.cc b/src/core/receiver/control_thread.cc index dfbe4792b..919a658a7 100644 --- a/src/core/receiver/control_thread.cc +++ b/src/core/receiver/control_thread.cc @@ -64,6 +64,7 @@ #include // for LOG #include // for make_any #include // for find, min +#include // for array #include // for milliseconds #include // for floor, fmod, log #include // for gmtime, strftime @@ -831,6 +832,7 @@ void ControlThread::assist_GNSS() } } + void ControlThread::apply_action(unsigned int what) { std::shared_ptr pvt_ptr; @@ -916,10 +918,10 @@ std::vector> ControlThread::get_visible_sats(time for (auto &it : gps_eph_map) { eph_t rtklib_eph = eph_to_rtklib(it.second); - double r_sat[3]; + std::array r_sat{}; double clock_bias_s; double sat_pos_variance_m2; - eph2pos(gps_gtime, &rtklib_eph, &r_sat[0], &clock_bias_s, + eph2pos(gps_gtime, &rtklib_eph, r_sat.data(), &clock_bias_s, &sat_pos_variance_m2); double Az, El, dist_m; arma::vec r_sat_eb_e = arma::vec{r_sat[0], r_sat[1], r_sat[2]}; @@ -939,10 +941,10 @@ std::vector> ControlThread::get_visible_sats(time for (auto &it : gal_eph_map) { eph_t rtklib_eph = eph_to_rtklib(it.second); - double r_sat[3]; + std::array r_sat{}; double clock_bias_s; double sat_pos_variance_m2; - eph2pos(gps_gtime, &rtklib_eph, &r_sat[0], &clock_bias_s, + eph2pos(gps_gtime, &rtklib_eph, r_sat.data(), &clock_bias_s, &sat_pos_variance_m2); double Az, El, dist_m; arma::vec r_sat_eb_e = arma::vec{r_sat[0], r_sat[1], r_sat[2]}; @@ -962,12 +964,12 @@ std::vector> ControlThread::get_visible_sats(time for (auto &it : gps_alm_map) { alm_t rtklib_alm = alm_to_rtklib(it.second); - double r_sat[3]; + std::array r_sat{}; double clock_bias_s; gtime_t aux_gtime; aux_gtime.time = fmod(utc2gpst(gps_gtime).time + 345600, 604800); aux_gtime.sec = 0.0; - alm2pos(aux_gtime, &rtklib_alm, &r_sat[0], &clock_bias_s); + alm2pos(aux_gtime, &rtklib_alm, r_sat.data(), &clock_bias_s); double Az, El, dist_m; arma::vec r_sat_eb_e = arma::vec{r_sat[0], r_sat[1], r_sat[2]}; arma::vec dx = r_sat_eb_e - r_eb_e; @@ -990,12 +992,12 @@ std::vector> ControlThread::get_visible_sats(time for (auto &it : gal_alm_map) { alm_t rtklib_alm = alm_to_rtklib(it.second); - double r_sat[3]; + std::array r_sat{}; double clock_bias_s; gtime_t gal_gtime; gal_gtime.time = fmod(utc2gpst(gps_gtime).time + 345600, 604800); gal_gtime.sec = 0.0; - alm2pos(gal_gtime, &rtklib_alm, &r_sat[0], &clock_bias_s); + alm2pos(gal_gtime, &rtklib_alm, r_sat.data(), &clock_bias_s); double Az, El, dist_m; arma::vec r_sat_eb_e = arma::vec{r_sat[0], r_sat[1], r_sat[2]}; arma::vec dx = r_sat_eb_e - r_eb_e; diff --git a/src/core/receiver/gnss_flowgraph.cc b/src/core/receiver/gnss_flowgraph.cc index fd142761a..5710b375e 100644 --- a/src/core/receiver/gnss_flowgraph.cc +++ b/src/core/receiver/gnss_flowgraph.cc @@ -428,6 +428,8 @@ void GNSSFlowgraph::connect() case evBDS_B3: acq_fs = fs; break; + default: + break; } if (acq_fs < fs) @@ -528,7 +530,6 @@ void GNSSFlowgraph::connect() DLOG(INFO) << "signal conditioner " << selected_signal_conditioner_ID << " connected to channel " << i; } #endif - // Signal Source > Signal conditioner >> Channels >> Observables try { @@ -544,7 +545,7 @@ void GNSSFlowgraph::connect() } } - //check for unconnected signal conditioners and connect null_sinks in order to provide configuration flexibility to multiband files or signal sources + // check for unconnected signal conditioners and connect null_sinks in order to provide configuration flexibility to multiband files or signal sources if (configuration_->property(sig_source_.at(0)->role() + ".enable_FPGA", false) == false) { for (size_t n = 0; n < sig_conditioner_.size(); n++) @@ -1061,6 +1062,7 @@ bool GNSSFlowgraph::send_telemetry_msg(const pmt::pmt_t& msg) return true; } + void GNSSFlowgraph::push_back_signal(Gnss_Signal gs) { switch (mapStringValues_[gs.get_signal_str()]) @@ -1116,6 +1118,7 @@ void GNSSFlowgraph::push_back_signal(Gnss_Signal gs) } } + void GNSSFlowgraph::remove_signal(Gnss_Signal gs) { switch (mapStringValues_[gs.get_signal_str()]) @@ -1162,6 +1165,7 @@ void GNSSFlowgraph::remove_signal(Gnss_Signal gs) } } + void GNSSFlowgraph::acquisition_manager(unsigned int who) { unsigned int current_channel; @@ -1195,12 +1199,12 @@ void GNSSFlowgraph::acquisition_manager(unsigned int who) RX_time); channels_[current_channel]->set_signal(gnss_signal); start_acquisition = is_primary_freq or assistance_available or !configuration_->property("GNSS-SDR.assist_dual_frequency_acq", false); - // if (assistance_available) - // { - // std::cout << "Channel " << current_channel - // << " assistance available for " << channels_[current_channel]->get_signal().get_satellite() - // << ", Signal " << channels_[current_channel]->get_signal().get_signal_str() << "\n"; - // } + // if (assistance_available) + // { + // std::cout << "Channel " << current_channel + // << " assistance available for " << channels_[current_channel]->get_signal().get_satellite() + // << ", Signal " << channels_[current_channel]->get_signal().get_signal_str() << std::endl; + // } } else { @@ -1230,15 +1234,17 @@ void GNSSFlowgraph::acquisition_manager(unsigned int who) << channels_[current_channel]->get_signal().get_satellite() << ", Signal " << channels_[current_channel]->get_signal().get_signal_str(); - // std::cout << "Channel " << current_channel - // << " secondary frequency acquisition assistance not available in " - // << channels_[current_channel]->get_signal().get_satellite() - // << ", Signal " << channels_[current_channel]->get_signal().get_signal_str() << "\n"; + // std::cout << "Channel " << current_channel + // << " secondary frequency acquisition assistance not available in " + // << channels_[current_channel]->get_signal().get_satellite() + // << ", Signal " << channels_[current_channel]->get_signal().get_signal_str() << std::endl; } } DLOG(INFO) << "Channel " << current_channel << " in state " << channels_state_[current_channel]; } } + + /* * Applies an action to the flow graph * @@ -1250,7 +1256,7 @@ void GNSSFlowgraph::acquisition_manager(unsigned int who) * \param[in] what What is the action: * --- actions from channels --- * -> 0 acquisition failed - * -> 1 acquisition succesfull + * -> 1 acquisition successful * -> 2 tracking lost * --- actions from TC receiver control --- * -> 10 TC request standby mode @@ -1290,7 +1296,7 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) } channels_state_[who] = 0; if (acq_channels_count_ > 0) acq_channels_count_--; - //call the acquisition manager to assign new satellite and start next acquisition (if required) + // call the acquisition manager to assign new satellite and start next acquisition (if required) acquisition_manager(who); break; case 1: @@ -1300,7 +1306,7 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) channels_state_[who] = 2; if (acq_channels_count_ > 0) acq_channels_count_--; - //call the acquisition manager to assign new satellite and start next acquisition (if required) + // call the acquisition manager to assign new satellite and start next acquisition (if required) acquisition_manager(who); break; @@ -1308,7 +1314,7 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) DLOG(INFO) << "Channel " << who << " TRK FAILED satellite " << channels_[who]->get_signal().get_satellite(); if (acq_channels_count_ < max_acq_channels_) { - //try to acquire the same satellite + // try to acquire the same satellite channels_state_[who] = 1; acq_channels_count_++; DLOG(INFO) << "Channel " << who << " Starting acquisition " << channels_[who]->get_signal().get_satellite() << ", Signal " << channels_[who]->get_signal().get_signal_str(); @@ -1334,9 +1340,9 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) LOG(INFO) << "TC request standby mode"; for (size_t n = 0; n < channels_.size(); n++) { - if (channels_state_[n] == 1 or channels_state_[n] == 2) //channel in acquisition or in tracking + if (channels_state_[n] == 1 or channels_state_[n] == 2) // channel in acquisition or in tracking { - //recover the satellite assigned + // recover the satellite assigned Gnss_Signal gs = channels_[n]->get_signal(); push_back_signal(gs); @@ -1348,17 +1354,17 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) break; case 11: // request coldstart mode LOG(INFO) << "TC request flowgraph coldstart"; - //call the acquisition manager to assign new satellite and start next acquisition (if required) + // call the acquisition manager to assign new satellite and start next acquisition (if required) acquisition_manager(who); break; case 12: // request hotstart mode LOG(INFO) << "TC request flowgraph hotstart"; - //call the acquisition manager to assign new satellite and start next acquisition (if required) + // call the acquisition manager to assign new satellite and start next acquisition (if required) acquisition_manager(who); break; case 13: // request warmstart mode LOG(INFO) << "TC request flowgraph warmstart"; - //call the acquisition manager to assign new satellite and start next acquisition (if required) + // call the acquisition manager to assign new satellite and start next acquisition (if required) acquisition_manager(who); break; default: @@ -1810,9 +1816,7 @@ void GNSSFlowgraph::set_signals_list() if (configuration_->property("Channels_B1.count", 0) > 0) { - /* - * Loop to create the list of BeiDou B1C signals - */ + // Loop to create the list of BeiDou B1C signals for (available_gnss_prn_iter = available_beidou_prn.cbegin(); available_gnss_prn_iter != available_beidou_prn.cend(); available_gnss_prn_iter++) @@ -1825,9 +1829,7 @@ void GNSSFlowgraph::set_signals_list() if (configuration_->property("Channels_B3.count", 0) > 0) { - /* - * Loop to create the list of BeiDou B1C signals - */ + // Loop to create the list of BeiDou B1C signals for (available_gnss_prn_iter = available_beidou_prn.cbegin(); available_gnss_prn_iter != available_beidou_prn.cend(); available_gnss_prn_iter++) @@ -1888,15 +1890,15 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal { available_GPS_1C_signals_.push_back(result); } - is_primary_frequency = true; //indicate that the searched satellite signal belongs to "primary" link (L1, E1, B1, etc..) + is_primary_frequency = true; // indicate that the searched satellite signal belongs to "primary" link (L1, E1, B1, etc..) break; case evGPS_2S: if (configuration_->property("Channels_1C.count", 0) > 0) { - //1. Get the current channel status map + // 1. Get the current channel status map std::map> current_channels_status = channels_status_->get_current_status_map(); - //2. search the currently tracked GPS L1 satellites and assist the GPS L2 acquisition if the satellite is not tracked on L2 + // 2. search the currently tracked GPS L1 satellites and assist the GPS L2 acquisition if the satellite is not tracked on L2 bool found_signal = false; for (std::map>::iterator it = current_channels_status.begin(); it != current_channels_status.end(); ++it) { @@ -1910,8 +1912,8 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal { estimated_doppler = it->second->Carrier_Doppler_hz; RX_time = it->second->RX_time; - //std::cout << " Channel: " << it->first << " => Doppler: " << estimated_doppler << "[Hz] \n"; - //3. return the GPS L2 satellite and remove it from list + // std::cout << " Channel: " << it->first << " => Doppler: " << estimated_doppler << "[Hz] \n"; + // 3. return the GPS L2 satellite and remove it from list result = *it2; if (pop) { @@ -1923,7 +1925,7 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal } } } - //fallback: pick the front satellite because there is no tracked satellites in L1 to assist L2 + // fallback: pick the front satellite because there is no tracked satellites in L1 to assist L2 if (found_signal == false) { result = available_GPS_2S_signals_.front(); @@ -1948,9 +1950,9 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal case evGPS_L5: if (configuration_->property("Channels_1C.count", 0) > 0) { - //1. Get the current channel status map + // 1. Get the current channel status map std::map> current_channels_status = channels_status_->get_current_status_map(); - //2. search the currently tracked GPS L1 satellites and assist the GPS L5 acquisition if the satellite is not tracked on L5 + // 2. search the currently tracked GPS L1 satellites and assist the GPS L5 acquisition if the satellite is not tracked on L5 for (std::map>::iterator it = current_channels_status.begin(); it != current_channels_status.end(); ++it) { if (std::string(it->second->Signal) == "1C") @@ -1963,8 +1965,8 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal { estimated_doppler = it->second->Carrier_Doppler_hz; RX_time = it->second->RX_time; - //std::cout << " Channel: " << it->first << " => Doppler: " << estimated_doppler << "[Hz] \n"; - //3. return the GPS L5 satellite and remove it from list + // std::cout << " Channel: " << it->first << " => Doppler: " << estimated_doppler << "[Hz] \n"; + // 3. return the GPS L5 satellite and remove it from list result = *it2; if (pop) { @@ -1977,7 +1979,7 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal } } } - //fallback: pick the front satellite because there is no tracked satellites in L1 to assist L5 + // fallback: pick the front satellite because there is no tracked satellites in L1 to assist L5 if (found_signal == false) { result = available_GPS_L5_signals_.front(); @@ -1996,16 +1998,15 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal { available_GAL_1B_signals_.push_back(result); } - is_primary_frequency = true; //indicate that the searched satellite signal belongs to "primary" link (L1, E1, B1, etc..) + is_primary_frequency = true; // indicate that the searched satellite signal belongs to "primary" link (L1, E1, B1, etc..) break; case evGAL_5X: - if (configuration_->property("Channels_1B.count", 0) > 0) { - //1. Get the current channel status map + // 1. Get the current channel status map std::map> current_channels_status = channels_status_->get_current_status_map(); - //2. search the currently tracked Galileo E1 satellites and assist the Galileo E5 acquisition if the satellite is not tracked on E5 + // 2. search the currently tracked Galileo E1 satellites and assist the Galileo E5 acquisition if the satellite is not tracked on E5 for (std::map>::iterator it = current_channels_status.begin(); it != current_channels_status.end(); ++it) { if (std::string(it->second->Signal) == "1B") @@ -2018,8 +2019,8 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal { estimated_doppler = it->second->Carrier_Doppler_hz; RX_time = it->second->RX_time; - //std::cout << " Channel: " << it->first << " => Doppler: " << estimated_doppler << "[Hz] \n"; - //3. return the Gal 5X satellite and remove it from list + // std::cout << " Channel: " << it->first << " => Doppler: " << estimated_doppler << "[Hz] \n"; + // 3. return the Gal 5X satellite and remove it from list result = *it2; if (pop) { @@ -2032,7 +2033,7 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal } } } - //fallback: pick the front satellite because there is no tracked satellites in E1 to assist E5 + // fallback: pick the front satellite because there is no tracked satellites in E1 to assist E5 if (found_signal == false) { result = available_GAL_5X_signals_.front(); @@ -2051,7 +2052,7 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal { available_GLO_1G_signals_.push_back(result); } - is_primary_frequency = true; //indicate that the searched satellite signal belongs to "primary" link (L1, E1, B1, etc..) + is_primary_frequency = true; // indicate that the searched satellite signal belongs to "primary" link (L1, E1, B1, etc..) break; case evGLO_2G: @@ -2070,7 +2071,7 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal { available_BDS_B1_signals_.push_back(result); } - is_primary_frequency = true; //indicate that the searched satellite signal belongs to "primary" link (L1, E1, B1, etc..) + is_primary_frequency = true; // indicate that the searched satellite signal belongs to "primary" link (L1, E1, B1, etc..) break; case evBDS_B3: diff --git a/src/core/system_parameters/glonass_gnav_navigation_message.cc b/src/core/system_parameters/glonass_gnav_navigation_message.cc index 68779e814..b9f06aa43 100644 --- a/src/core/system_parameters/glonass_gnav_navigation_message.cc +++ b/src/core/system_parameters/glonass_gnav_navigation_message.cc @@ -124,7 +124,7 @@ bool Glonass_Gnav_Navigation_Message::CRC_test(std::bitset string_bits(GLONASS_GNAV_STRING_BITS); // Populate data and hamming code vectors - for (int32_t i = 0; i < string_bits.size(); i++) + for (uint32_t i = 0; i < string_bits.size(); i++) { string_bits[i] = static_cast(bits[i]); } diff --git a/src/tests/data/high_dynamics_signal.bin b/src/tests/data/high_dynamics_signal.bin deleted file mode 100644 index ba463e31ca5cdd3c7e18347198476be170129ff2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168784 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ƲD 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

O#kZ0Wn)(ap$Q(78_l8CJ2H=z#964pX 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 UeW0S~nf2yLxf(ap=*N%$0$=OJ8~^|S diff --git a/src/tests/data/high_dynamics_signal.mat b/src/tests/data/high_dynamics_signal.mat deleted file mode 100644 index 39c1312d595e292abe3f8ed5810e5a785fbcada9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79823 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 From 03a77b06eadb771ed40f164d090806bbbb9abca8 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sat, 20 Jul 2019 03:02:43 +0200 Subject: [PATCH 18/36] Format file --- .../galileo_telemetry_decoder_gs.h | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_telemetry_decoder_gs.h b/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_telemetry_decoder_gs.h index d61efc47e..87202bfda 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_telemetry_decoder_gs.h +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_telemetry_decoder_gs.h @@ -40,17 +40,20 @@ #include // for boost::shared_ptr #include // for block #include // for gr_vector_const_void_star +#include #include #include #include #include -#include class galileo_telemetry_decoder_gs; using galileo_telemetry_decoder_gs_sptr = boost::shared_ptr; -galileo_telemetry_decoder_gs_sptr galileo_make_telemetry_decoder_gs(const Gnss_Satellite &satellite, int frame_type, bool dump); +galileo_telemetry_decoder_gs_sptr galileo_make_telemetry_decoder_gs( + const Gnss_Satellite &satellite, + int frame_type, + bool dump); /*! * \brief This class implements a block that decodes the INAV and FNAV data defined in Galileo ICD @@ -71,8 +74,11 @@ public: gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); private: - friend galileo_telemetry_decoder_gs_sptr - galileo_make_telemetry_decoder_gs(const Gnss_Satellite &satellite, int frame_type, bool dump); + friend galileo_telemetry_decoder_gs_sptr galileo_make_telemetry_decoder_gs( + const Gnss_Satellite &satellite, + int frame_type, + bool dump); + galileo_telemetry_decoder_gs(const Gnss_Satellite &satellite, int frame_type, bool dump); void viterbi_decoder(double *page_part_symbols, int32_t *page_part_bits); @@ -130,7 +136,7 @@ private: std::vector out1; std::vector state0; std::vector state1; - std::array g_encoder{}; + std::array g_encoder{}; const int32_t nn = 2; // Coding rate 1/n const int32_t KK = 7; // Constraint Length int32_t mm = KK - 1; From 49e64f94f6f0286ac1d9780bc12aceb681230ec3 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sat, 20 Jul 2019 11:13:28 +0200 Subject: [PATCH 19/36] Code cleaning, initializations --- src/algorithms/PVT/libs/rtcm_printer.cc | 2 +- src/algorithms/channel/adapters/channel.h | 2 +- .../gr_complex_ip_packet_source.h | 2 +- .../gnuradio_blocks/rtl_tcp_signal_source_c.h | 2 +- .../beidou_b1i_telemetry_decoder_gs.cc | 2 +- .../beidou_b1i_telemetry_decoder_gs.h | 12 +++++++---- .../beidou_b3i_telemetry_decoder_gs.cc | 2 +- .../beidou_b3i_telemetry_decoder_gs.h | 6 +++--- .../glonass_l2_ca_telemetry_decoder_gs.h | 10 ++++++--- .../gps_l1_ca_telemetry_decoder_gs.h | 13 ++++++------ .../gps_l2c_telemetry_decoder_gs.cc | 8 +++---- .../gps_l2c_telemetry_decoder_gs.h | 21 +++++++++++-------- .../gps_l5_telemetry_decoder_gs.cc | 6 +++--- .../gps_l5_telemetry_decoder_gs.h | 14 ++++++++----- .../sbas_l1_telemetry_decoder_gs.h | 8 +++---- .../gnuradio_blocks/dll_pll_veml_tracking.h | 2 +- .../dll_pll_veml_tracking_fpga.cc | 3 +-- .../galileo_e1_tcp_connector_tracking_cc.cc | 2 +- .../gps_l1_ca_kf_tracking_cc.h | 4 ++-- .../tracking/libs/tcp_communication.cc | 4 ++-- src/core/libs/channel_status_msg_receiver.h | 2 +- 21 files changed, 70 insertions(+), 57 deletions(-) diff --git a/src/algorithms/PVT/libs/rtcm_printer.cc b/src/algorithms/PVT/libs/rtcm_printer.cc index 9c94a78d4..4ce99e0ac 100644 --- a/src/algorithms/PVT/libs/rtcm_printer.cc +++ b/src/algorithms/PVT/libs/rtcm_printer.cc @@ -384,7 +384,7 @@ int Rtcm_Printer::init_serial(const std::string& serial_device) * Opens the serial device and sets the default baud rate for a RTCM transmission (9600,8,N,1) */ int32_t fd = 0; - struct termios options; + struct termios options{}; int64_t BAUD; int64_t DATABITS; int64_t STOPBITS; diff --git a/src/algorithms/channel/adapters/channel.h b/src/algorithms/channel/adapters/channel.h index 083608331..9e4048a2d 100644 --- a/src/algorithms/channel/adapters/channel.h +++ b/src/algorithms/channel/adapters/channel.h @@ -101,7 +101,7 @@ private: std::string implementation_; bool flag_enable_fpga; uint32_t channel_; - Gnss_Synchro gnss_synchro_; + Gnss_Synchro gnss_synchro_{}; Gnss_Signal gnss_signal_; bool connected_; bool repeat_; diff --git a/src/algorithms/signal_source/gnuradio_blocks/gr_complex_ip_packet_source.h b/src/algorithms/signal_source/gnuradio_blocks/gr_complex_ip_packet_source.h index 2200050b3..be93ab2c3 100644 --- a/src/algorithms/signal_source/gnuradio_blocks/gr_complex_ip_packet_source.h +++ b/src/algorithms/signal_source/gnuradio_blocks/gr_complex_ip_packet_source.h @@ -85,7 +85,7 @@ private: int fifo_items; int d_sock_raw; int d_udp_port; - struct sockaddr_in si_me; + struct sockaddr_in si_me{}; std::string d_src_device; std::string d_origin_address; int d_udp_payload_size; diff --git a/src/algorithms/signal_source/gnuradio_blocks/rtl_tcp_signal_source_c.h b/src/algorithms/signal_source/gnuradio_blocks/rtl_tcp_signal_source_c.h index 045573ce7..8c4cd1886 100644 --- a/src/algorithms/signal_source/gnuradio_blocks/rtl_tcp_signal_source_c.h +++ b/src/algorithms/signal_source/gnuradio_blocks/rtl_tcp_signal_source_c.h @@ -110,7 +110,7 @@ private: size_t unread_; // lookup for scaling data - boost::array lookup_; + boost::array lookup_{}; // async read callback void handle_read(const boost::system::error_code &ec, diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b1i_telemetry_decoder_gs.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b1i_telemetry_decoder_gs.cc index fe2eed98a..fa2fc8646 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b1i_telemetry_decoder_gs.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b1i_telemetry_decoder_gs.cc @@ -385,7 +385,7 @@ int beidou_b1i_telemetry_decoder_gs::general_work(int noutput_items __attribute_ auto **out = reinterpret_cast(&output_items[0]); // Get the output buffer pointer const auto **in = reinterpret_cast(&input_items[0]); // Get the input buffer pointer - Gnss_Synchro current_symbol; // structure to save the synchronization information and send the output object to the next block + Gnss_Synchro current_symbol{}; // structure to save the synchronization information and send the output object to the next block // 1. Copy the current tracking output current_symbol = in[0][0]; d_symbol_history.push_back(current_symbol.Prompt_I); // add new symbol to the symbol queue diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b1i_telemetry_decoder_gs.h b/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b1i_telemetry_decoder_gs.h index 448079d8b..feab58693 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b1i_telemetry_decoder_gs.h +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b1i_telemetry_decoder_gs.h @@ -40,17 +40,19 @@ #include // for boost::shared_ptr #include // for block #include // for gr_vector_const_void_star +#include #include #include #include -#include class beidou_b1i_telemetry_decoder_gs; using beidou_b1i_telemetry_decoder_gs_sptr = boost::shared_ptr; -beidou_b1i_telemetry_decoder_gs_sptr beidou_b1i_make_telemetry_decoder_gs(const Gnss_Satellite &satellite, bool dump); +beidou_b1i_telemetry_decoder_gs_sptr beidou_b1i_make_telemetry_decoder_gs( + const Gnss_Satellite &satellite, + bool dump); /*! @@ -72,8 +74,10 @@ public: gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); private: - friend beidou_b1i_telemetry_decoder_gs_sptr - beidou_b1i_make_telemetry_decoder_gs(const Gnss_Satellite &satellite, bool dump); + friend beidou_b1i_telemetry_decoder_gs_sptr beidou_b1i_make_telemetry_decoder_gs( + const Gnss_Satellite &satellite, + bool dump); + beidou_b1i_telemetry_decoder_gs(const Gnss_Satellite &satellite, bool dump); void decode_subframe(float *symbols); diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b3i_telemetry_decoder_gs.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b3i_telemetry_decoder_gs.cc index 10c019cf7..53f0087cf 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b3i_telemetry_decoder_gs.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b3i_telemetry_decoder_gs.cc @@ -408,7 +408,7 @@ int beidou_b3i_telemetry_decoder_gs::general_work( auto **out = reinterpret_cast(&output_items[0]); // Get the output buffer pointer const auto **in = reinterpret_cast(&input_items[0]); // Get the input buffer pointer - Gnss_Synchro current_symbol; // structure to save the synchronization + Gnss_Synchro current_symbol{}; // structure to save the synchronization // information and send the output object to the // next block // 1. Copy the current tracking output diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b3i_telemetry_decoder_gs.h b/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b3i_telemetry_decoder_gs.h index e6c2afc44..dda4e483d 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b3i_telemetry_decoder_gs.h +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b3i_telemetry_decoder_gs.h @@ -53,7 +53,6 @@ beidou_b3i_telemetry_decoder_gs_sptr beidou_b3i_make_telemetry_decoder_gs( /*! * \brief This class implements a block that decodes the BeiDou DNAV data. - * */ class beidou_b3i_telemetry_decoder_gs : public gr::block { @@ -71,9 +70,10 @@ public: gr_vector_void_star &output_items); private: - friend beidou_b3i_telemetry_decoder_gs_sptr - beidou_b3i_make_telemetry_decoder_gs(const Gnss_Satellite &satellite, + friend beidou_b3i_telemetry_decoder_gs_sptr beidou_b3i_make_telemetry_decoder_gs( + const Gnss_Satellite &satellite, bool dump); + beidou_b3i_telemetry_decoder_gs(const Gnss_Satellite &satellite, bool dump); void decode_subframe(float *symbols); diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/glonass_l2_ca_telemetry_decoder_gs.h b/src/algorithms/telemetry_decoder/gnuradio_blocks/glonass_l2_ca_telemetry_decoder_gs.h index cf7f00be7..04c24d0be 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/glonass_l2_ca_telemetry_decoder_gs.h +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/glonass_l2_ca_telemetry_decoder_gs.h @@ -50,7 +50,9 @@ class glonass_l2_ca_telemetry_decoder_gs; using glonass_l2_ca_telemetry_decoder_gs_sptr = boost::shared_ptr; -glonass_l2_ca_telemetry_decoder_gs_sptr glonass_l2_ca_make_telemetry_decoder_gs(const Gnss_Satellite &satellite, bool dump); +glonass_l2_ca_telemetry_decoder_gs_sptr glonass_l2_ca_make_telemetry_decoder_gs( + const Gnss_Satellite &satellite, + bool dump); /*! * \brief This class implements a block that decodes the GNAV data defined in GLONASS ICD v5.1 @@ -74,8 +76,10 @@ public: gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); private: - friend glonass_l2_ca_telemetry_decoder_gs_sptr - glonass_l2_ca_make_telemetry_decoder_gs(const Gnss_Satellite &satellite, bool dump); + friend glonass_l2_ca_telemetry_decoder_gs_sptr glonass_l2_ca_make_telemetry_decoder_gs( + const Gnss_Satellite &satellite, + bool dump); + glonass_l2_ca_telemetry_decoder_gs(const Gnss_Satellite &satellite, bool dump); void decode_string(const double *symbols, int32_t frame_length); diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_gs.h b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_gs.h index 5fa12bd45..998480576 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_gs.h +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_gs.h @@ -49,12 +49,12 @@ class gps_l1_ca_telemetry_decoder_gs; using gps_l1_ca_telemetry_decoder_gs_sptr = boost::shared_ptr; -gps_l1_ca_telemetry_decoder_gs_sptr -gps_l1_ca_make_telemetry_decoder_gs(const Gnss_Satellite &satellite, bool dump); +gps_l1_ca_telemetry_decoder_gs_sptr gps_l1_ca_make_telemetry_decoder_gs( + const Gnss_Satellite &satellite, + bool dump); /*! * \brief This class implements a block that decodes the NAV data defined in IS-GPS-200E - * */ class gps_l1_ca_telemetry_decoder_gs : public gr::block { @@ -71,8 +71,9 @@ public: gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); private: - friend gps_l1_ca_telemetry_decoder_gs_sptr - gps_l1_ca_make_telemetry_decoder_gs(const Gnss_Satellite &satellite, bool dump); + friend gps_l1_ca_telemetry_decoder_gs_sptr gps_l1_ca_make_telemetry_decoder_gs( + const Gnss_Satellite &satellite, + bool dump); gps_l1_ca_telemetry_decoder_gs(const Gnss_Satellite &satellite, bool dump); bool gps_word_parityCheck(uint32_t gpsword); @@ -81,7 +82,7 @@ private: int32_t d_bits_per_preamble; int32_t d_samples_per_preamble; int32_t d_preamble_period_symbols; - std::array d_preamble_samples; + std::array d_preamble_samples{}; uint32_t d_required_symbols; uint32_t d_frame_length_symbols; bool flag_PLL_180_deg_phase_locked; diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_gs.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_gs.cc index e2702b374..4d6235ac8 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_gs.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_gs.cc @@ -1,7 +1,6 @@ /*! * \file gps_l2c_telemetry_decoder_gs.cc - * \brief Implementation of a NAV message demodulator block based on - * Kay Borre book MATLAB-based GPS receiver + * \brief Implementation of a NAV message demodulator block * \author Javier Arribas, 2015. jarribas(at)cttc.es * * ------------------------------------------------------------------------- @@ -60,7 +59,7 @@ gps_l2c_telemetry_decoder_gs::gps_l2c_telemetry_decoder_gs( gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { - //prevent telemetry symbols accumulation in output buffers + // prevent telemetry symbols accumulation in output buffers this->set_max_noutput_items(1); // Ephemeris data port out this->message_port_register_out(pmt::mp("telemetry")); @@ -68,8 +67,7 @@ gps_l2c_telemetry_decoder_gs::gps_l2c_telemetry_decoder_gs( this->message_port_register_out(pmt::mp("telemetry_to_trk")); d_last_valid_preamble = 0; d_sent_tlm_failed_msg = false; - d_max_symbols_without_valid_frame = GPS_L2_CNAV_DATA_PAGE_BITS * GPS_L2_SYMBOLS_PER_BIT * 5; //rise alarm if 5 consecutive subframes have no valid CRC - + d_max_symbols_without_valid_frame = GPS_L2_CNAV_DATA_PAGE_BITS * GPS_L2_SYMBOLS_PER_BIT * 5; // rise alarm if 5 consecutive subframes have no valid CRC // initialize internal vars d_dump = dump; diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_gs.h b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_gs.h index 7f7737429..4380fcbda 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_gs.h +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_gs.h @@ -1,7 +1,6 @@ /*! * \file gps_l2c_telemetry_decoder_gs.h - * \brief Interface of a CNAV message demodulator block based on - * Kay Borre book MATLAB-based GPS receiver + * \brief Interface of a CNAV message demodulator block * \author Javier Arribas, 2015. jarribas(at)cttc.es * ------------------------------------------------------------------------- * @@ -41,7 +40,8 @@ #include #include -extern "C" { +extern "C" +{ #include "cnav_msg.h" } @@ -50,12 +50,12 @@ class gps_l2c_telemetry_decoder_gs; using gps_l2c_telemetry_decoder_gs_sptr = boost::shared_ptr; -gps_l2c_telemetry_decoder_gs_sptr -gps_l2c_make_telemetry_decoder_gs(const Gnss_Satellite &satellite, bool dump); +gps_l2c_telemetry_decoder_gs_sptr gps_l2c_make_telemetry_decoder_gs( + const Gnss_Satellite &satellite, + bool dump); /*! - * \brief This class implements a block that decodes the SBAS integrity and corrections data defined in RTCA MOPS DO-229 - * + * \brief This class implements a block that decodes CNAV data defined in IS-GPS-200K */ class gps_l2c_telemetry_decoder_gs : public gr::block { @@ -64,6 +64,7 @@ public: void set_satellite(const Gnss_Satellite &satellite); //!< Set satellite PRN void set_channel(int32_t channel); //!< Set receiver's channel void reset(); + /*! * \brief This is where all signal processing takes place */ @@ -71,8 +72,10 @@ public: gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); private: - friend gps_l2c_telemetry_decoder_gs_sptr - gps_l2c_make_telemetry_decoder_gs(const Gnss_Satellite &satellite, bool dump); + friend gps_l2c_telemetry_decoder_gs_sptr gps_l2c_make_telemetry_decoder_gs( + const Gnss_Satellite &satellite, + bool dump); + gps_l2c_telemetry_decoder_gs(const Gnss_Satellite &satellite, bool dump); bool d_dump; diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l5_telemetry_decoder_gs.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l5_telemetry_decoder_gs.cc index 26a52f3e3..81aeb61c8 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l5_telemetry_decoder_gs.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l5_telemetry_decoder_gs.cc @@ -58,7 +58,7 @@ gps_l5_telemetry_decoder_gs::gps_l5_telemetry_decoder_gs( gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { - //prevent telemetry symbols accumulation in output buffers + // prevent telemetry symbols accumulation in output buffers this->set_max_noutput_items(1); // Ephemeris data port out this->message_port_register_out(pmt::mp("telemetry")); @@ -66,7 +66,7 @@ gps_l5_telemetry_decoder_gs::gps_l5_telemetry_decoder_gs( this->message_port_register_out(pmt::mp("telemetry_to_trk")); d_last_valid_preamble = 0; d_sent_tlm_failed_msg = false; - d_max_symbols_without_valid_frame = GPS_L5_CNAV_DATA_PAGE_BITS * GPS_L5_SYMBOLS_PER_BIT * 10; //rise alarm if 20 consecutive subframes have no valid CRC + d_max_symbols_without_valid_frame = GPS_L5_CNAV_DATA_PAGE_BITS * GPS_L5_SYMBOLS_PER_BIT * 10; // rise alarm if 20 consecutive subframes have no valid CRC // initialize internal vars d_dump = dump; @@ -217,7 +217,7 @@ int gps_l5_telemetry_decoder_gs::general_work(int noutput_items __attribute__((u // \code // symbolTime_ms = msg->tow * 6000 + *pdelay * 10 + (12 * 10); 12 symbols of the encoder's transitory - //check TOW update consistency + // check TOW update consistency uint32_t last_d_TOW_at_current_symbol_ms = d_TOW_at_current_symbol_ms; d_TOW_at_current_symbol_ms = msg.tow * 6000 + (delay + 12) * GPS_L5I_SYMBOL_PERIOD_MS; if (last_d_TOW_at_current_symbol_ms != 0 and abs(static_cast(d_TOW_at_current_symbol_ms) - int64_t(last_d_TOW_at_current_symbol_ms)) > GPS_L5I_SYMBOL_PERIOD_MS) diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l5_telemetry_decoder_gs.h b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l5_telemetry_decoder_gs.h index 9c49694d3..d7ef16e87 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l5_telemetry_decoder_gs.h +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l5_telemetry_decoder_gs.h @@ -42,7 +42,8 @@ #include #include -extern "C" { +extern "C" +{ #include "cnav_msg.h" } @@ -51,8 +52,9 @@ class gps_l5_telemetry_decoder_gs; using gps_l5_telemetry_decoder_gs_sptr = boost::shared_ptr; -gps_l5_telemetry_decoder_gs_sptr -gps_l5_make_telemetry_decoder_gs(const Gnss_Satellite &satellite, bool dump); +gps_l5_telemetry_decoder_gs_sptr gps_l5_make_telemetry_decoder_gs( + const Gnss_Satellite &satellite, + bool dump); /*! * \brief This class implements a GPS L5 Telemetry decoder @@ -69,8 +71,10 @@ public: gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); private: - friend gps_l5_telemetry_decoder_gs_sptr - gps_l5_make_telemetry_decoder_gs(const Gnss_Satellite &satellite, bool dump); + friend gps_l5_telemetry_decoder_gs_sptr gps_l5_make_telemetry_decoder_gs( + const Gnss_Satellite &satellite, + bool dump); + gps_l5_telemetry_decoder_gs(const Gnss_Satellite &satellite, bool dump); bool d_dump; diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/sbas_l1_telemetry_decoder_gs.h b/src/algorithms/telemetry_decoder/gnuradio_blocks/sbas_l1_telemetry_decoder_gs.h index ae27ec8c7..ffaecd266 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/sbas_l1_telemetry_decoder_gs.h +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/sbas_l1_telemetry_decoder_gs.h @@ -114,10 +114,10 @@ private: private: int32_t d_n_smpls_in_history; double d_iir_par; - double d_corr_paired; - double d_corr_shifted; - bool d_aligned; - double d_past_sample; + double d_corr_paired{}; + double d_corr_shifted{}; + bool d_aligned{}; + double d_past_sample{}; } d_sample_aligner; // helper class for symbol alignment and Viterbi decoding diff --git a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.h b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.h index d565e8fa1..cfb8ff79b 100644 --- a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.h +++ b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.h @@ -163,7 +163,7 @@ private: double d_carrier_phase_step_rad; double d_carrier_phase_rate_step_rad; boost::circular_buffer> d_carr_ph_history; - + // remaining code phase and carrier phase between tracking loops double d_rem_code_phase_samples; float d_rem_carr_phase_rad; 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 c7e24469f..cad74581f 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 @@ -460,8 +460,7 @@ void dll_pll_veml_tracking_fpga::msg_handler_telemetry_to_trk(const pmt::pmt_t & { DLOG(INFO) << "Telemetry fault received in ch " << this->d_channel; gr::thread::scoped_lock lock(d_setlock); - d_carrier_lock_fail_counter = 10000; //force loss-of-lock condition - break; + d_carrier_lock_fail_counter = 10000; // force loss-of-lock condition } } } 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 32225d25f..5615a0fe9 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 @@ -188,7 +188,7 @@ void Galileo_E1_Tcp_Connector_Tracking_cc::start_tracking() d_acq_code_phase_samples = d_acquisition_gnss_synchro->Acq_delay_samples; d_acq_carrier_doppler_hz = d_acquisition_gnss_synchro->Acq_doppler_hz; d_acq_sample_stamp = d_acquisition_gnss_synchro->Acq_samplestamp_samples; - std::array Signal_; + std::array Signal_{}; std::memcpy(Signal_.data(), d_acquisition_gnss_synchro->Signal, 3); // generate local reference ALWAYS starting at chip 1 (2 samples per chip) diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_kf_tracking_cc.h b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_kf_tracking_cc.h index 565d862a5..8c3f15c58 100644 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_kf_tracking_cc.h +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_kf_tracking_cc.h @@ -166,7 +166,7 @@ private: // Tracking_2nd_PLL_filter d_carrier_loop_filter; // acquisition - double d_acq_carrier_doppler_step_hz; + double d_acq_carrier_doppler_step_hz{}; double d_acq_code_phase_samples; double d_acq_carrier_doppler_hz; // correlator @@ -184,7 +184,7 @@ private: double d_carrier_dopplerrate_hz2; double d_carrier_phase_step_rad; double d_acc_carrier_phase_rad; - double d_carr_phase_error_rad; + double d_carr_phase_error_rad{}; double d_carr_phase_sigma2; double d_code_phase_samples; double code_error_chips; diff --git a/src/algorithms/tracking/libs/tcp_communication.cc b/src/algorithms/tracking/libs/tcp_communication.cc index d7012f95d..d68c80733 100644 --- a/src/algorithms/tracking/libs/tcp_communication.cc +++ b/src/algorithms/tracking/libs/tcp_communication.cc @@ -76,7 +76,7 @@ int Tcp_Communication::listen_tcp_connection(size_t d_port_, size_t d_port_ch0_) void Tcp_Communication::send_receive_tcp_packet_galileo_e1(boost::array buf, Tcp_Packet_Data* tcp_data_) { int controlc = 0; - boost::array readbuf; + boost::array readbuf{}; float d_control_id_ = buf.data()[0]; try @@ -111,7 +111,7 @@ void Tcp_Communication::send_receive_tcp_packet_galileo_e1(boost::array buf, Tcp_Packet_Data* tcp_data_) { int controlc = 0; - boost::array readbuf; + boost::array readbuf{}; float d_control_id_ = buf.data()[0]; try diff --git a/src/core/libs/channel_status_msg_receiver.h b/src/core/libs/channel_status_msg_receiver.h index 283fc6f0e..ac155cdaf 100644 --- a/src/core/libs/channel_status_msg_receiver.h +++ b/src/core/libs/channel_status_msg_receiver.h @@ -64,7 +64,7 @@ private: channel_status_msg_receiver(); std::map> d_channel_status_map; - Monitor_Pvt d_pvt_status; + Monitor_Pvt d_pvt_status{}; void msg_handler_events(pmt::pmt_t msg); }; From f440a0e9f122883a59549fad454928dd1273f77f Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sat, 20 Jul 2019 11:39:08 +0200 Subject: [PATCH 20/36] Avoid passing big parameters by value clang-tidy check: performance-unnecessary-value-param See https://clang.llvm.org/extra/clang-tidy/checks/performance-unnecessary-value-param.html --- src/algorithms/PVT/libs/monitor_pvt_udp_sink.cc | 2 +- src/algorithms/PVT/libs/monitor_pvt_udp_sink.h | 2 +- src/core/libs/channel_status_msg_receiver.cc | 2 +- src/core/libs/channel_status_msg_receiver.h | 2 +- src/core/receiver/gnss_flowgraph.cc | 4 ++-- src/core/receiver/gnss_flowgraph.h | 4 ++-- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/algorithms/PVT/libs/monitor_pvt_udp_sink.cc b/src/algorithms/PVT/libs/monitor_pvt_udp_sink.cc index ed23fbb5d..2824dbb7d 100644 --- a/src/algorithms/PVT/libs/monitor_pvt_udp_sink.cc +++ b/src/algorithms/PVT/libs/monitor_pvt_udp_sink.cc @@ -51,7 +51,7 @@ Monitor_Pvt_Udp_Sink::Monitor_Pvt_Udp_Sink(const std::vector& addre } -bool Monitor_Pvt_Udp_Sink::write_monitor_pvt(std::shared_ptr monitor_pvt) +bool Monitor_Pvt_Udp_Sink::write_monitor_pvt(const std::shared_ptr& monitor_pvt) { std::string outbound_data; if (use_protobuf == false) diff --git a/src/algorithms/PVT/libs/monitor_pvt_udp_sink.h b/src/algorithms/PVT/libs/monitor_pvt_udp_sink.h index 588e70257..dc55528cc 100644 --- a/src/algorithms/PVT/libs/monitor_pvt_udp_sink.h +++ b/src/algorithms/PVT/libs/monitor_pvt_udp_sink.h @@ -46,7 +46,7 @@ class Monitor_Pvt_Udp_Sink { public: Monitor_Pvt_Udp_Sink(const std::vector& addresses, const uint16_t& port, bool protobuf_enabled); - bool write_monitor_pvt(std::shared_ptr monitor_pvt); + bool write_monitor_pvt(const std::shared_ptr& monitor_pvt); private: b_io_context io_context; diff --git a/src/core/libs/channel_status_msg_receiver.cc b/src/core/libs/channel_status_msg_receiver.cc index 965a99a46..2dd58bc4f 100644 --- a/src/core/libs/channel_status_msg_receiver.cc +++ b/src/core/libs/channel_status_msg_receiver.cc @@ -56,7 +56,7 @@ channel_status_msg_receiver::channel_status_msg_receiver() : gr::block("channel_ channel_status_msg_receiver::~channel_status_msg_receiver() = default; -void channel_status_msg_receiver::msg_handler_events(pmt::pmt_t msg) +void channel_status_msg_receiver::msg_handler_events(const pmt::pmt_t& msg) { gr::thread::scoped_lock lock(d_setlock); // require mutex with msg_handler_events function called by the scheduler try diff --git a/src/core/libs/channel_status_msg_receiver.h b/src/core/libs/channel_status_msg_receiver.h index ac155cdaf..a4259834e 100644 --- a/src/core/libs/channel_status_msg_receiver.h +++ b/src/core/libs/channel_status_msg_receiver.h @@ -65,7 +65,7 @@ private: std::map> d_channel_status_map; Monitor_Pvt d_pvt_status{}; - void msg_handler_events(pmt::pmt_t msg); + void msg_handler_events(const pmt::pmt_t& msg); }; #endif diff --git a/src/core/receiver/gnss_flowgraph.cc b/src/core/receiver/gnss_flowgraph.cc index 5710b375e..7f7558599 100644 --- a/src/core/receiver/gnss_flowgraph.cc +++ b/src/core/receiver/gnss_flowgraph.cc @@ -1063,7 +1063,7 @@ bool GNSSFlowgraph::send_telemetry_msg(const pmt::pmt_t& msg) } -void GNSSFlowgraph::push_back_signal(Gnss_Signal gs) +void GNSSFlowgraph::push_back_signal(const Gnss_Signal& gs) { switch (mapStringValues_[gs.get_signal_str()]) { @@ -1119,7 +1119,7 @@ void GNSSFlowgraph::push_back_signal(Gnss_Signal gs) } -void GNSSFlowgraph::remove_signal(Gnss_Signal gs) +void GNSSFlowgraph::remove_signal(const Gnss_Signal& gs) { switch (mapStringValues_[gs.get_signal_str()]) { diff --git a/src/core/receiver/gnss_flowgraph.h b/src/core/receiver/gnss_flowgraph.h index 8d3c3fa58..d60995b36 100644 --- a/src/core/receiver/gnss_flowgraph.h +++ b/src/core/receiver/gnss_flowgraph.h @@ -111,8 +111,8 @@ public: void apply_action(unsigned int who, unsigned int what); - void push_back_signal(Gnss_Signal gs); - void remove_signal(Gnss_Signal gs); + void push_back_signal(const Gnss_Signal& gs); + void remove_signal(const Gnss_Signal& gs); void set_configuration(std::shared_ptr configuration); From 471428f867a39436d10b0ff0b3f5743c4bfd685c Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sat, 20 Jul 2019 12:55:46 +0200 Subject: [PATCH 21/36] Fix typos detected by codespell --- README.md | 2 +- cmake/Modules/GnsssdrBuildTypes.cmake | 2 +- src/algorithms/PVT/libs/rinex_printer.cc | 2 +- src/algorithms/libs/rtklib/rtklib.h | 4 +- .../libs/rtklib/rtklib_ephemeris.cc | 8 +- src/algorithms/libs/rtklib/rtklib_ionex.cc | 2 +- src/algorithms/libs/rtklib/rtklib_ionex.h | 2 +- src/algorithms/libs/rtklib/rtklib_lambda.cc | 2 +- src/algorithms/libs/rtklib/rtklib_ppp.cc | 2 +- src/algorithms/libs/rtklib/rtklib_preceph.cc | 2 +- src/algorithms/libs/rtklib/rtklib_rtkcmn.cc | 13 +- src/algorithms/libs/rtklib/rtklib_sbas.cc | 4 +- src/algorithms/libs/rtklib/rtklib_solution.cc | 4 +- src/algorithms/libs/rtklib/rtklib_tides.cc | 2 +- src/core/libs/supl/asn-rrlp/NativeInteger.c | 7 +- src/core/libs/supl/asn-rrlp/OCTET_STRING.c | 9 +- src/core/libs/supl/asn-rrlp/ber_tlv_tag.c | 3 +- src/core/libs/supl/asn-rrlp/constr_CHOICE.c | 12 +- src/core/libs/supl/asn-rrlp/constr_SEQUENCE.c | 13 +- src/core/libs/supl/asn-rrlp/constr_SET_OF.c | 15 +- src/core/libs/supl/asn-rrlp/constr_TYPE.h | 4 +- .../libs/supl/asn-rrlp/converter-sample.c | 17 +-- src/core/libs/supl/asn-rrlp/per_support.h | 2 +- src/core/libs/supl/asn-rrlp/xer_support.h | 12 +- src/core/libs/supl/asn-supl/NativeInteger.c | 7 +- src/core/libs/supl/asn-supl/OCTET_STRING.c | 9 +- src/core/libs/supl/asn-supl/ber_tlv_tag.c | 3 +- src/core/libs/supl/asn-supl/constr_CHOICE.c | 12 +- src/core/libs/supl/asn-supl/constr_SEQUENCE.c | 13 +- src/core/libs/supl/asn-supl/constr_SET_OF.c | 15 +- src/core/libs/supl/asn-supl/constr_TYPE.h | 4 +- src/core/libs/supl/asn-supl/per_support.h | 2 +- src/core/libs/supl/asn-supl/xer_support.h | 12 +- src/core/libs/supl/asn/rrlp-components.asn | 140 +++++++++--------- src/core/libs/supl/supl.c | 2 +- .../observables/hybrid_observables_test.cc | 6 +- .../hybrid_observables_test_fpga.cc | 2 +- .../tracking/bayesian_estimation_test.cc | 2 +- .../gps_l1_ca_dll_pll_tracking_test.cc | 2 +- .../tracking/tracking_pull-in_test.cc | 2 +- src/utils/front-end-cal/front_end_cal.cc | 1 - src/utils/rinex2assist/README.md | 2 +- 42 files changed, 185 insertions(+), 196 deletions(-) diff --git a/README.md b/README.md index fcbcd7223..a112bd09a 100644 --- a/README.md +++ b/README.md @@ -341,7 +341,7 @@ Cloning the GNSS-SDR repository as in the line above will create a folder named |-----utils <- some utilities (e.g. Matlab scripts). ~~~~~~ -By default, you will be in the 'master' branch of the Git repository, which corresponds to the lastest stable release. If you want to try the latest developments, you can use the 'next' branch by going to the newly created gnss-sdr folder doing: +By default, you will be in the 'master' branch of the Git repository, which corresponds to the latest stable release. If you want to try the latest developments, you can use the 'next' branch by going to the newly created gnss-sdr folder doing: ~~~~~~ $ git checkout next diff --git a/cmake/Modules/GnsssdrBuildTypes.cmake b/cmake/Modules/GnsssdrBuildTypes.cmake index a80cd0c6b..94f5332a9 100644 --- a/cmake/Modules/GnsssdrBuildTypes.cmake +++ b/cmake/Modules/GnsssdrBuildTypes.cmake @@ -48,7 +48,7 @@ list(APPEND AVAIL_BUILDTYPES # known build types in AVAIL_BUILDTYPES. If the build type is found, # the function exits immediately. If nothing is found by the end of # checking all available build types, we exit with an error and list -# the avialable build types. +# the available build types. ######################################################################## function(GNSSSDR_CHECK_BUILD_TYPE settype) string(TOUPPER ${settype} _settype) diff --git a/src/algorithms/PVT/libs/rinex_printer.cc b/src/algorithms/PVT/libs/rinex_printer.cc index 1e15631ed..4f86d620a 100644 --- a/src/algorithms/PVT/libs/rinex_printer.cc +++ b/src/algorithms/PVT/libs/rinex_printer.cc @@ -6217,7 +6217,7 @@ void Rinex_Printer::rinex_obs_header(std::fstream& out, const Gps_Ephemeris& eph if (version == 2) { - // --------- WAVELENGHT FACTOR + // --------- WAVELENGTH FACTOR // put here real data! line.clear(); line += Rinex_Printer::rightJustify("1", 6); diff --git a/src/algorithms/libs/rtklib/rtklib.h b/src/algorithms/libs/rtklib/rtklib.h index 0f8cf61b7..bfb3853d3 100644 --- a/src/algorithms/libs/rtklib/rtklib.h +++ b/src/algorithms/libs/rtklib/rtklib.h @@ -577,7 +577,7 @@ typedef struct typedef struct { /* SBAS message type */ - int week, tow; /* receiption time */ + int week, tow; /* reception time */ int prn; /* SBAS satellite PRN number */ unsigned char msg[29]; /* SBAS message (226bit) padded by 0 */ } sbsmsg_t; @@ -912,7 +912,7 @@ typedef struct unsigned char buff[1200]; /* message buffer */ unsigned int word; /* word buffer for rtcm 2 */ unsigned int nmsg2[100]; /* message count of RTCM 2 (1-99:1-99,0:other) */ - unsigned int nmsg3[400]; /* message count of RTCM 3 (1-299:1001-1299,300-399:2000-2099,0:ohter) */ + unsigned int nmsg3[400]; /* message count of RTCM 3 (1-299:1001-1299,300-399:2000-2099,0:other) */ char opt[256]; /* RTCM dependent options */ } rtcm_t; diff --git a/src/algorithms/libs/rtklib/rtklib_ephemeris.cc b/src/algorithms/libs/rtklib/rtklib_ephemeris.cc index 5c7383a5b..433bc8421 100644 --- a/src/algorithms/libs/rtklib/rtklib_ephemeris.cc +++ b/src/algorithms/libs/rtklib/rtklib_ephemeris.cc @@ -75,7 +75,7 @@ const double ERREPH_GLO = 5.0; /* error of glonass ephemeris (m) */ const double TSTEP = 60.0; /* integration step glonass ephemeris (s) */ const double RTOL_KEPLER = 1e-13; /* relative tolerance for Kepler equation */ -const double DEFURASSR = 0.15; /* default accurary of ssr corr (m) */ +const double DEFURASSR = 0.15; /* default accuracy of ssr corr (m) */ const double MAXECORSSR = 10.0; /* max orbit correction of ssr (m) */ const double MAXCCORSSR = 1e-6 * SPEED_OF_LIGHT; /* max clock correction of ssr (m) */ const double MAXAGESSR = 90.0; /* max age of ssr orbit and clock (s) */ @@ -473,7 +473,7 @@ void seph2pos(gtime_t time, const seph_t *seph, double *rs, double *dts, } -/* select ephememeris --------------------------------------------------------*/ +/* select ephemeris --------------------------------------------------------*/ eph_t *seleph(gtime_t time, int sat, int iode, const nav_t *nav) { double t, tmax, tmin; @@ -532,7 +532,7 @@ eph_t *seleph(gtime_t time, int sat, int iode, const nav_t *nav) } -/* select glonass ephememeris ------------------------------------------------*/ +/* select glonass ephemeris ------------------------------------------------*/ geph_t *selgeph(gtime_t time, int sat, int iode, const nav_t *nav) { double t, tmax = MAXDTOE_GLO, tmin = tmax + 1.0; @@ -574,7 +574,7 @@ geph_t *selgeph(gtime_t time, int sat, int iode, const nav_t *nav) } -/* select sbas ephememeris ---------------------------------------------------*/ +/* select sbas ephemeris ---------------------------------------------------*/ seph_t *selseph(gtime_t time, int sat, const nav_t *nav) { double t, tmax = MAXDTOE_SBS, tmin = tmax + 1.0; diff --git a/src/algorithms/libs/rtklib/rtklib_ionex.cc b/src/algorithms/libs/rtklib/rtklib_ionex.cc index d07740dc7..e8ddd028b 100644 --- a/src/algorithms/libs/rtklib/rtklib_ionex.cc +++ b/src/algorithms/libs/rtklib/rtklib_ionex.cc @@ -52,7 +52,7 @@ * [1] S.Schear, W.Gurtner and J.Feltens, IONEX: The IONosphere Map EXchange * Format Version 1, February 25, 1998 * [2] S.Schaer, R.Markus, B.Gerhard and A.S.Timon, Daily Global Ionosphere - * Maps based on GPS Carrier Phase Data Routinely producted by CODE + * Maps based on GPS Carrier Phase Data Routinely produced by CODE * Analysis Center, Proceeding of the IGS Analysis Center Workshop, 1996 * *----------------------------------------------------------------------------*/ diff --git a/src/algorithms/libs/rtklib/rtklib_ionex.h b/src/algorithms/libs/rtklib/rtklib_ionex.h index 6ffeb2c7a..9c5774fcb 100644 --- a/src/algorithms/libs/rtklib/rtklib_ionex.h +++ b/src/algorithms/libs/rtklib/rtklib_ionex.h @@ -52,7 +52,7 @@ * [1] S.Schear, W.Gurtner and J.Feltens, IONEX: The IONosphere Map EXchange * Format Version 1, February 25, 1998 * [2] S.Schaer, R.Markus, B.Gerhard and A.S.Timon, Daily Global Ionosphere - * Maps based on GPS Carrier Phase Data Routinely producted by CODE + * Maps based on GPS Carrier Phase Data Routinely produced by CODE * Analysis Center, Proceeding of the IGS Analysis Center Workshop, 1996 * *----------------------------------------------------------------------------*/ diff --git a/src/algorithms/libs/rtklib/rtklib_lambda.cc b/src/algorithms/libs/rtklib/rtklib_lambda.cc index 8aaba735f..cc795abd8 100644 --- a/src/algorithms/libs/rtklib/rtklib_lambda.cc +++ b/src/algorithms/libs/rtklib/rtklib_lambda.cc @@ -296,7 +296,7 @@ int search(int n, int m, const double *L, const double *D, * double *F O fixed solutions (n x m) * double *s O sum of squared residulas of fixed solutions (1 x m) * return : status (0:ok,other:error) - * notes : matrix stored by column-major order (fortran convension) + * notes : matrix stored by column-major order (fortran convention) *-----------------------------------------------------------------------------*/ int lambda(int n, int m, const double *a, const double *Q, double *F, double *s) diff --git a/src/algorithms/libs/rtklib/rtklib_ppp.cc b/src/algorithms/libs/rtklib/rtklib_ppp.cc index 83329ca48..657bfecda 100644 --- a/src/algorithms/libs/rtklib/rtklib_ppp.cc +++ b/src/algorithms/libs/rtklib/rtklib_ppp.cc @@ -331,7 +331,7 @@ int is_depend(int sat1, int sat2, int *flgs, int *max_flg) } else { - return 0; /* linear depenent */ + return 0; /* linear dependent */ } return 1; } diff --git a/src/algorithms/libs/rtklib/rtklib_preceph.cc b/src/algorithms/libs/rtklib/rtklib_preceph.cc index c1b5c23e6..34d16f541 100644 --- a/src/algorithms/libs/rtklib/rtklib_preceph.cc +++ b/src/algorithms/libs/rtklib/rtklib_preceph.cc @@ -546,7 +546,7 @@ int readdcbf(const char *file, nav_t *nav, const sta_t *sta) * read differential code bias (dcb) parameters * args : char *file I dcb parameters file (wild-card * expanded) * nav_t *nav IO navigation data - * sta_t *sta I station info data to inport receiver dcb + * sta_t *sta I station info data to import receiver dcb * (NULL: no use) * return : status (1:ok,0:error) * notes : currently only p1-c1 bias of code *.dcb file diff --git a/src/algorithms/libs/rtklib/rtklib_rtkcmn.cc b/src/algorithms/libs/rtklib/rtklib_rtkcmn.cc index fc60a4221..46e78c509 100644 --- a/src/algorithms/libs/rtklib/rtklib_rtkcmn.cc +++ b/src/algorithms/libs/rtklib/rtklib_rtkcmn.cc @@ -223,11 +223,12 @@ const unsigned int TBL_CR_C24_Q[] = { 0x42FA2F, 0xC4B6D4, 0xC82F22, 0x4E63D9, 0xD11CCE, 0x575035, 0x5BC9C3, 0xDD8538}; -extern "C" { -void dgemm_(char *, char *, int *, int *, int *, double *, double *, int *, double *, int *, double *, double *, int *); -extern void dgetrf_(int *, int *, double *, int *, int *, int *); -extern void dgetri_(int *, double *, int *, int *, double *, int *, int *); -extern void dgetrs_(char *, int *, int *, double *, int *, int *, double *, int *, int *); +extern "C" +{ + void dgemm_(char *, char *, int *, int *, int *, double *, double *, int *, double *, int *, double *, double *, int *); + extern void dgetrf_(int *, int *, double *, int *, int *, int *); + extern void dgetri_(int *, double *, int *, int *, double *, int *, int *); + extern void dgetrs_(char *, int *, int *, double *, int *, int *, double *, int *, int *); } @@ -3619,7 +3620,7 @@ void freeobs(obs_t *obs) /* free navigation data --------------------------------------------------------- * free memory for navigation data * args : nav_t *nav IO navigation data - * int opt I option (or of followings) + * int opt I option (one of the following) * (0x01: gps/qzs ephmeris, 0x02: glonass ephemeris, * 0x04: sbas ephemeris, 0x08: precise ephemeris, * 0x10: precise clock 0x20: almanac, diff --git a/src/algorithms/libs/rtklib/rtklib_sbas.cc b/src/algorithms/libs/rtklib/rtklib_sbas.cc index b115e9821..8ecba3dbb 100644 --- a/src/algorithms/libs/rtklib/rtklib_sbas.cc +++ b/src/algorithms/libs/rtklib/rtklib_sbas.cc @@ -922,7 +922,7 @@ void searchigp(gtime_t time __attribute__((unused)), const double *pos, const sb * double *var O variance of ionospheric delay (m^2) * return : status (1:ok, 0:no correction) * notes : before calling the function, sbas ionosphere correction parameters - * in navigation data (nav->sbsion) must be set by callig + * in navigation data (nav->sbsion) must be set by calling * sbsupdatecorr() *-----------------------------------------------------------------------------*/ int sbsioncorr(gtime_t time, const nav_t *nav, const double *pos, @@ -1206,7 +1206,7 @@ int sbsfastcorr(gtime_t time, int sat, const sbssat_t *sbssat, * double *var O sat position and clock variance (m^2) * return : status (1:ok,0:no correction) * notes : before calling the function, sbas satellite correction parameters - * in navigation data (nav->sbssat) must be set by callig + * in navigation data (nav->sbssat) must be set by calling * sbsupdatecorr(). * satellite clock correction include long-term correction and fast * correction. diff --git a/src/algorithms/libs/rtklib/rtklib_solution.cc b/src/algorithms/libs/rtklib/rtklib_solution.cc index ab7c6a72e..e046a005c 100644 --- a/src/algorithms/libs/rtklib/rtklib_solution.cc +++ b/src/algorithms/libs/rtklib/rtklib_solution.cc @@ -2132,7 +2132,7 @@ int outsols(unsigned char *buff, const sol_t *sol, const double *rb, /* output solution extended ---------------------------------------------------- - * output solution exteneded information + * output solution extended information * args : unsigned char *buff IO output buffer * sol_t *sol I solution * ssat_t *ssat I satellite status @@ -2232,7 +2232,7 @@ void outsol(FILE *fp, const sol_t *sol, const double *rb, /* output solution extended ---------------------------------------------------- - * output solution exteneded information to file + * output solution extended information to file * args : FILE *fp I output file pointer * sol_t *sol I solution * ssat_t *ssat I satellite status diff --git a/src/algorithms/libs/rtklib/rtklib_tides.cc b/src/algorithms/libs/rtklib/rtklib_tides.cc index eb5355a61..d2fb29542 100644 --- a/src/algorithms/libs/rtklib/rtklib_tides.cc +++ b/src/algorithms/libs/rtklib/rtklib_tides.cc @@ -257,7 +257,7 @@ void tide_pole(gtime_t tut, const double *pos, const double *erpv, * displacements by earth tides * args : gtime_t tutc I time in utc * double *rr I site position (ecef) (m) - * int opt I options (or of the followings) + * int opt I options (one of the following) * 1: solid earth tide * 2: ocean tide loading * 4: pole tide diff --git a/src/core/libs/supl/asn-rrlp/NativeInteger.c b/src/core/libs/supl/asn-rrlp/NativeInteger.c index bf3939e88..0a10c5d88 100644 --- a/src/core/libs/supl/asn-rrlp/NativeInteger.c +++ b/src/core/libs/supl/asn-rrlp/NativeInteger.c @@ -92,7 +92,7 @@ NativeInteger_decode_ber(asn_codec_ctx_t *opt_codec_ctx, /* * ASN.1 encoded INTEGER: buf_ptr, length * Fill the native, at the same time checking for overflow. - * If overflow occured, return with RC_FAIL. + * If overflow occurred, return with RC_FAIL. */ { INTEGER_t tmp; @@ -153,7 +153,7 @@ NativeInteger_encode_der(asn_TYPE_descriptor_t *sd, void *ptr, tmp.buf = buf; tmp.size = sizeof(buf); #endif /* WORDS_BIGENDIAN */ - + /* Encode fake INTEGER */ erval = INTEGER_encode_der(sd, &tmp, tag_mode, tag, cb, app_key); if(erval.encoded == -1) { @@ -182,7 +182,7 @@ NativeInteger_decode_xer(asn_codec_ctx_t *opt_codec_ctx, } memset(&st, 0, sizeof(st)); - rval = INTEGER_decode_xer(opt_codec_ctx, td, &st_ptr, + rval = INTEGER_decode_xer(opt_codec_ctx, td, &st_ptr, opt_mname, buf_ptr, size); if(rval.code == RC_OK) { long l; @@ -329,4 +329,3 @@ NativeInteger_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) { FREEMEM(ptr); } } - diff --git a/src/core/libs/supl/asn-rrlp/OCTET_STRING.c b/src/core/libs/supl/asn-rrlp/OCTET_STRING.c index 98aebb3bf..ef080b27b 100644 --- a/src/core/libs/supl/asn-rrlp/OCTET_STRING.c +++ b/src/core/libs/supl/asn-rrlp/OCTET_STRING.c @@ -107,7 +107,7 @@ asn_TYPE_descriptor_t asn_DEF_OCTET_STRING = { /* * The main reason why ASN.1 is still alive is that too much time and effort * is necessary for learning it more or less adequately, thus creating a gut - * necessity to demonstrate that aquired skill everywhere afterwards. + * necessity to demonstrate that acquired skill everywhere afterwards. * No, I am not going to explain what the following stuff is. */ struct _stack_el { @@ -141,7 +141,7 @@ OS__add_stack_el(struct _stack *st) { nel = (struct _stack_el *)CALLOC(1, sizeof(struct _stack_el)); if(nel == NULL) return NULL; - + if(st->tail) { /* Increase a subcontainment depth */ nel->cont_level = st->tail->cont_level + 1; @@ -728,7 +728,7 @@ OCTET_STRING__handle_control_chars(void *struct_ptr, const void *chunk_buf, size return 0; } } - + return -1; /* No, it's not */ } @@ -1571,7 +1571,7 @@ OCTET_STRING_encode_uper(asn_TYPE_descriptor_t *td, csiz->lower_bound, csiz->upper_bound, csiz->effective_bits, ct_extensible ? " EXT" : ""); - /* Figure out wheter size lies within PER visible constraint */ + /* Figure out whether size lies within PER visible constraint */ if(csiz->effective_bits >= 0) { if((int)sizeinunits < csiz->lower_bound @@ -1802,4 +1802,3 @@ OCTET_STRING_new_fromBuf(asn_TYPE_descriptor_t *td, const char *str, int len) { return st; } - diff --git a/src/core/libs/supl/asn-rrlp/ber_tlv_tag.c b/src/core/libs/supl/asn-rrlp/ber_tlv_tag.c index 42708760e..fde2549cc 100644 --- a/src/core/libs/supl/asn-rrlp/ber_tlv_tag.c +++ b/src/core/libs/supl/asn-rrlp/ber_tlv_tag.c @@ -42,7 +42,7 @@ ber_fetch_tag(const void *ptr, size_t size, ber_tlv_tag_t *tag_r) { */ if(val >> ((8 * sizeof(val)) - 9)) { /* - * We would not be able to accomodate + * We would not be able to accommodate * any more tag bits. */ return -1; @@ -141,4 +141,3 @@ ber_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufp, size_t size) { return required_size + 1; } - diff --git a/src/core/libs/supl/asn-rrlp/constr_CHOICE.c b/src/core/libs/supl/asn-rrlp/constr_CHOICE.c index 1bf467254..456dd64c6 100644 --- a/src/core/libs/supl/asn-rrlp/constr_CHOICE.c +++ b/src/core/libs/supl/asn-rrlp/constr_CHOICE.c @@ -134,7 +134,7 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, * Restore parsing context. */ ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); - + /* * Start to parse where left previously */ @@ -156,7 +156,7 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, } if(ctx->left >= 0) { - /* ?Substracted below! */ + /* ?Subtracted below! */ ctx->left += rval.consumed; } ADVANCE(rval.consumed); @@ -273,7 +273,7 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, case RC_FAIL: /* Fatal error */ RETURN(rval.code); } /* switch(rval) */ - + ADVANCE(rval.consumed); } while(0); @@ -349,7 +349,7 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, /* No meaningful work here */ break; } - + RETURN(RC_OK); } @@ -904,7 +904,7 @@ CHOICE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, elm->name, td->name, rv.code); return rv; } - + asn_enc_rval_t CHOICE_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { @@ -984,7 +984,7 @@ CHOICE_encode_uper(asn_TYPE_descriptor_t *td, _ASN_ENCODED_OK(rval); } } - + int CHOICE_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, diff --git a/src/core/libs/supl/asn-rrlp/constr_SEQUENCE.c b/src/core/libs/supl/asn-rrlp/constr_SEQUENCE.c index aba19bd26..72ef20c79 100644 --- a/src/core/libs/supl/asn-rrlp/constr_SEQUENCE.c +++ b/src/core/libs/supl/asn-rrlp/constr_SEQUENCE.c @@ -130,7 +130,7 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, int edx; /* SEQUENCE element's index */ ASN_DEBUG("Decoding %s as SEQUENCE", td->name); - + /* * Create the target structure if it is not present already. */ @@ -145,7 +145,7 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, * Restore parsing context. */ ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); - + /* * Start to parse where left previously */ @@ -166,7 +166,7 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, } if(ctx->left >= 0) - ctx->left += rval.consumed; /* ?Substracted below! */ + ctx->left += rval.consumed; /* ?Subtracted below! */ ADVANCE(rval.consumed); NEXT_PHASE(ctx); @@ -389,7 +389,7 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, ctx->step |= 1; /* Confirm entering next microphase */ microphase2: ASN_DEBUG("Inside SEQUENCE %s MF2", td->name); - + /* * Compute the position of the member inside a structure, * and also a type of containment (it may be contained @@ -431,7 +431,7 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, case RC_FAIL: /* Fatal error */ RETURN(RC_FAIL); } /* switch(rval) */ - + ADVANCE(rval.consumed); } /* for(all structure members) */ @@ -501,7 +501,7 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, PHASE_OUT(ctx); } - + RETURN(RC_OK); } @@ -1420,4 +1420,3 @@ SEQUENCE_encode_uper(asn_TYPE_descriptor_t *td, _ASN_ENCODED_OK(er); } - diff --git a/src/core/libs/supl/asn-rrlp/constr_SET_OF.c b/src/core/libs/supl/asn-rrlp/constr_SET_OF.c index 8b9c0669a..d6a2a90ea 100644 --- a/src/core/libs/supl/asn-rrlp/constr_SET_OF.c +++ b/src/core/libs/supl/asn-rrlp/constr_SET_OF.c @@ -86,7 +86,7 @@ SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ ASN_DEBUG("Decoding %s as SET OF", td->name); - + /* * Create the target structure if it is not present already. */ @@ -101,7 +101,7 @@ SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, * Restore parsing context. */ ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); - + /* * Start to parse where left previously */ @@ -122,7 +122,7 @@ SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, } if(ctx->left >= 0) - ctx->left += rval.consumed; /* ?Substracted below! */ + ctx->left += rval.consumed; /* ?Subtracted below! */ ADVANCE(rval.consumed); ASN_DEBUG("Structure consumes %ld bytes, " @@ -201,7 +201,7 @@ SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, */ ctx->step |= 1; /* Confirm entering next microphase */ microphase2: - + /* * Invoke the member fetch routine according to member's type */ @@ -231,7 +231,7 @@ SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, ctx->ptr = 0; RETURN(RC_FAIL); } /* switch(rval) */ - + ADVANCE(rval.consumed); } /* for(all list members) */ @@ -260,7 +260,7 @@ SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, PHASE_OUT(ctx); } - + RETURN(RC_OK); } @@ -884,7 +884,7 @@ SET_OF_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, if(!st) { st = *sptr = CALLOC(1, specs->struct_size); if(!st) _ASN_DECODE_FAILED; - } + } list = _A_SET_FROM_VOID(st); /* Figure out which constraints to use */ @@ -950,4 +950,3 @@ SET_OF_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, rv.consumed = 0; return rv; } - diff --git a/src/core/libs/supl/asn-rrlp/constr_TYPE.h b/src/core/libs/supl/asn-rrlp/constr_TYPE.h index 0641f003c..d2716b2a0 100644 --- a/src/core/libs/supl/asn-rrlp/constr_TYPE.h +++ b/src/core/libs/supl/asn-rrlp/constr_TYPE.h @@ -162,8 +162,8 @@ extern "C" { ber_tlv_tag_t el_tag; /* Outmost tag of the member */ int el_no; /* Index of the associated member, base 0 */ - int toff_first; /* First occurence of the el_tag, relative */ - int toff_last; /* Last occurence of the el_tag, relatvie */ + int toff_first; /* First occurrence of the el_tag, relative */ + int toff_last; /* Last occurrence of the el_tag, relatvie */ } asn_TYPE_tag2member_t; /* diff --git a/src/core/libs/supl/asn-rrlp/converter-sample.c b/src/core/libs/supl/asn-rrlp/converter-sample.c index af980a1d6..1213a1299 100644 --- a/src/core/libs/supl/asn-rrlp/converter-sample.c +++ b/src/core/libs/supl/asn-rrlp/converter-sample.c @@ -2,9 +2,9 @@ * Generic converter template for a selected ASN.1 type. * Copyright (c) 2005, 2006, 2007 Lev Walkin . * All rights reserved. - * + * * To compile with your own ASN.1 type, please redefine the PDU as shown: - * + * * cc -DPDU=MyCustomType -o myDecoder.o -c converter-sample.c */ #ifdef HAVE_CONFIG_H @@ -32,7 +32,7 @@ extern asn_TYPE_descriptor_t *asn_pdu_collection[]; #endif /* - * Open file and parse its contens. + * Open file and parse its contents. */ static void *data_decode_from_file(asn_TYPE_descriptor_t *pduType, FILE *file, const char *name, ssize_t suggested_bufsize, int first_pdu); @@ -96,7 +96,7 @@ main(int ac, char *av[]) { iform = INP_PER; /* - * Pocess the command-line argments. + * Process the command-line arguments. */ while((ch = getopt(ac, av, "i:o:1b:cdn:p:hs:" JUNKOPT)) != -1) switch(ch) { @@ -390,14 +390,14 @@ buffer_dump() { /* * Move the buffer content left N bits, possibly joining it with - * preceeding content. + * preceding content. */ static void buffer_shift_left(size_t offset, int bits) { uint8_t *ptr = DynamicBuffer.data + DynamicBuffer.offset + offset; uint8_t *end = DynamicBuffer.data + DynamicBuffer.offset + DynamicBuffer.length - 1; - + if(!bits) return; DEBUG("Shifting left %d bits off %ld (o=%ld, u=%ld, l=%ld)", @@ -480,7 +480,7 @@ buffer_shift_left(size_t offset, int bits) { (long)DynamicBuffer.offset, (long)DynamicBuffer.unbits, (long)DynamicBuffer.length); - + } @@ -555,7 +555,7 @@ data_decode_from_file(asn_TYPE_descriptor_t *pduType, FILE *file, const char *na asn_codec_ctx_t *opt_codec_ctx = 0; void *structure = 0; asn_dec_rval_t rval; - size_t old_offset; + size_t old_offset; size_t new_offset; int tolerate_eof; size_t rd; @@ -831,4 +831,3 @@ junk_bytes_with_probability(uint8_t *buf, size_t size, double prob) { } } #endif /* JUNKTEST */ - diff --git a/src/core/libs/supl/asn-rrlp/per_support.h b/src/core/libs/supl/asn-rrlp/per_support.h index c99f12291..321122b68 100644 --- a/src/core/libs/supl/asn-rrlp/per_support.h +++ b/src/core/libs/supl/asn-rrlp/per_support.h @@ -58,7 +58,7 @@ extern "C" */ int32_t per_get_few_bits(asn_per_data_t *per_data, int get_nbits); - /* Undo the immediately preceeding "get_few_bits" operation */ + /* Undo the immediately preceding "get_few_bits" operation */ void per_get_undo(asn_per_data_t *per_data, int get_nbits); /* diff --git a/src/core/libs/supl/asn-rrlp/xer_support.h b/src/core/libs/supl/asn-rrlp/xer_support.h index 13d8bbd06..5cc56c5f6 100644 --- a/src/core/libs/supl/asn-rrlp/xer_support.h +++ b/src/core/libs/supl/asn-rrlp/xer_support.h @@ -21,7 +21,7 @@ extern "C" PXML_TEXT, /* Plain text between XML tags. */ PXML_TAG, /* A tag, starting with '<'. */ PXML_COMMENT, /* An XML comment, including "". */ - /* + /* * The following chunk types are reported if the chunk * terminates the specified XML element. */ @@ -31,10 +31,10 @@ extern "C" /* * Callback function that is called by the parser when parsed data is - * available. The _opaque is the pointer to a field containing opaque user - * data specified in pxml_create() call. The chunk type is _type and the text + * available. The _opaque is the pointer to a field containing opaque user + * data specified in pxml_create() call. The chunk type is _type and the text * data is the piece of buffer identified by _bufid (as supplied to - * pxml_feed() call) starting at offset _offset and of _size bytes size. + * pxml_feed() call) starting at offset _offset and of _size bytes size. * The chunk is NOT '\0'-terminated. */ typedef int(pxml_callback_f)(pxml_chunk_type_e _type, @@ -42,8 +42,8 @@ extern "C" /* * Parse the given buffer as it were a chunk of XML data. - * Invoke the specified callback each time the meaninful data is found. - * This function returns number of bytes consumed from the bufer. + * Invoke the specified callback each time the meaningful data is found. + * This function returns number of bytes consumed from the buffer. * It will always be lesser than or equal to the specified _size. * The next invocation of this function must account the difference. */ diff --git a/src/core/libs/supl/asn-supl/NativeInteger.c b/src/core/libs/supl/asn-supl/NativeInteger.c index 76140a22e..88b9a712c 100644 --- a/src/core/libs/supl/asn-supl/NativeInteger.c +++ b/src/core/libs/supl/asn-supl/NativeInteger.c @@ -92,7 +92,7 @@ NativeInteger_decode_ber(asn_codec_ctx_t *opt_codec_ctx, /* * ASN.1 encoded INTEGER: buf_ptr, length * Fill the native, at the same time checking for overflow. - * If overflow occured, return with RC_FAIL. + * If overflow occurred, return with RC_FAIL. */ { INTEGER_t tmp; @@ -153,7 +153,7 @@ NativeInteger_encode_der(asn_TYPE_descriptor_t *sd, void *ptr, tmp.buf = buf; tmp.size = sizeof(buf); #endif /* WORDS_BIGENDIAN */ - + /* Encode fake INTEGER */ erval = INTEGER_encode_der(sd, &tmp, tag_mode, tag, cb, app_key); if(erval.encoded == -1) { @@ -182,7 +182,7 @@ NativeInteger_decode_xer(asn_codec_ctx_t *opt_codec_ctx, } memset(&st, 0, sizeof(st)); - rval = INTEGER_decode_xer(opt_codec_ctx, td, &st_ptr, + rval = INTEGER_decode_xer(opt_codec_ctx, td, &st_ptr, opt_mname, buf_ptr, size); if(rval.code == RC_OK) { long l; @@ -329,4 +329,3 @@ NativeInteger_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) { FREEMEM(ptr); } } - diff --git a/src/core/libs/supl/asn-supl/OCTET_STRING.c b/src/core/libs/supl/asn-supl/OCTET_STRING.c index 98aebb3bf..ef080b27b 100644 --- a/src/core/libs/supl/asn-supl/OCTET_STRING.c +++ b/src/core/libs/supl/asn-supl/OCTET_STRING.c @@ -107,7 +107,7 @@ asn_TYPE_descriptor_t asn_DEF_OCTET_STRING = { /* * The main reason why ASN.1 is still alive is that too much time and effort * is necessary for learning it more or less adequately, thus creating a gut - * necessity to demonstrate that aquired skill everywhere afterwards. + * necessity to demonstrate that acquired skill everywhere afterwards. * No, I am not going to explain what the following stuff is. */ struct _stack_el { @@ -141,7 +141,7 @@ OS__add_stack_el(struct _stack *st) { nel = (struct _stack_el *)CALLOC(1, sizeof(struct _stack_el)); if(nel == NULL) return NULL; - + if(st->tail) { /* Increase a subcontainment depth */ nel->cont_level = st->tail->cont_level + 1; @@ -728,7 +728,7 @@ OCTET_STRING__handle_control_chars(void *struct_ptr, const void *chunk_buf, size return 0; } } - + return -1; /* No, it's not */ } @@ -1571,7 +1571,7 @@ OCTET_STRING_encode_uper(asn_TYPE_descriptor_t *td, csiz->lower_bound, csiz->upper_bound, csiz->effective_bits, ct_extensible ? " EXT" : ""); - /* Figure out wheter size lies within PER visible constraint */ + /* Figure out whether size lies within PER visible constraint */ if(csiz->effective_bits >= 0) { if((int)sizeinunits < csiz->lower_bound @@ -1802,4 +1802,3 @@ OCTET_STRING_new_fromBuf(asn_TYPE_descriptor_t *td, const char *str, int len) { return st; } - diff --git a/src/core/libs/supl/asn-supl/ber_tlv_tag.c b/src/core/libs/supl/asn-supl/ber_tlv_tag.c index 42708760e..fde2549cc 100644 --- a/src/core/libs/supl/asn-supl/ber_tlv_tag.c +++ b/src/core/libs/supl/asn-supl/ber_tlv_tag.c @@ -42,7 +42,7 @@ ber_fetch_tag(const void *ptr, size_t size, ber_tlv_tag_t *tag_r) { */ if(val >> ((8 * sizeof(val)) - 9)) { /* - * We would not be able to accomodate + * We would not be able to accommodate * any more tag bits. */ return -1; @@ -141,4 +141,3 @@ ber_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufp, size_t size) { return required_size + 1; } - diff --git a/src/core/libs/supl/asn-supl/constr_CHOICE.c b/src/core/libs/supl/asn-supl/constr_CHOICE.c index 1bf467254..456dd64c6 100644 --- a/src/core/libs/supl/asn-supl/constr_CHOICE.c +++ b/src/core/libs/supl/asn-supl/constr_CHOICE.c @@ -134,7 +134,7 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, * Restore parsing context. */ ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); - + /* * Start to parse where left previously */ @@ -156,7 +156,7 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, } if(ctx->left >= 0) { - /* ?Substracted below! */ + /* ?Subtracted below! */ ctx->left += rval.consumed; } ADVANCE(rval.consumed); @@ -273,7 +273,7 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, case RC_FAIL: /* Fatal error */ RETURN(rval.code); } /* switch(rval) */ - + ADVANCE(rval.consumed); } while(0); @@ -349,7 +349,7 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, /* No meaningful work here */ break; } - + RETURN(RC_OK); } @@ -904,7 +904,7 @@ CHOICE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, elm->name, td->name, rv.code); return rv; } - + asn_enc_rval_t CHOICE_encode_uper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { @@ -984,7 +984,7 @@ CHOICE_encode_uper(asn_TYPE_descriptor_t *td, _ASN_ENCODED_OK(rval); } } - + int CHOICE_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, diff --git a/src/core/libs/supl/asn-supl/constr_SEQUENCE.c b/src/core/libs/supl/asn-supl/constr_SEQUENCE.c index aba19bd26..72ef20c79 100644 --- a/src/core/libs/supl/asn-supl/constr_SEQUENCE.c +++ b/src/core/libs/supl/asn-supl/constr_SEQUENCE.c @@ -130,7 +130,7 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, int edx; /* SEQUENCE element's index */ ASN_DEBUG("Decoding %s as SEQUENCE", td->name); - + /* * Create the target structure if it is not present already. */ @@ -145,7 +145,7 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, * Restore parsing context. */ ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); - + /* * Start to parse where left previously */ @@ -166,7 +166,7 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, } if(ctx->left >= 0) - ctx->left += rval.consumed; /* ?Substracted below! */ + ctx->left += rval.consumed; /* ?Subtracted below! */ ADVANCE(rval.consumed); NEXT_PHASE(ctx); @@ -389,7 +389,7 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, ctx->step |= 1; /* Confirm entering next microphase */ microphase2: ASN_DEBUG("Inside SEQUENCE %s MF2", td->name); - + /* * Compute the position of the member inside a structure, * and also a type of containment (it may be contained @@ -431,7 +431,7 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, case RC_FAIL: /* Fatal error */ RETURN(RC_FAIL); } /* switch(rval) */ - + ADVANCE(rval.consumed); } /* for(all structure members) */ @@ -501,7 +501,7 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, PHASE_OUT(ctx); } - + RETURN(RC_OK); } @@ -1420,4 +1420,3 @@ SEQUENCE_encode_uper(asn_TYPE_descriptor_t *td, _ASN_ENCODED_OK(er); } - diff --git a/src/core/libs/supl/asn-supl/constr_SET_OF.c b/src/core/libs/supl/asn-supl/constr_SET_OF.c index 8b9c0669a..d6a2a90ea 100644 --- a/src/core/libs/supl/asn-supl/constr_SET_OF.c +++ b/src/core/libs/supl/asn-supl/constr_SET_OF.c @@ -86,7 +86,7 @@ SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ ASN_DEBUG("Decoding %s as SET OF", td->name); - + /* * Create the target structure if it is not present already. */ @@ -101,7 +101,7 @@ SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, * Restore parsing context. */ ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); - + /* * Start to parse where left previously */ @@ -122,7 +122,7 @@ SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, } if(ctx->left >= 0) - ctx->left += rval.consumed; /* ?Substracted below! */ + ctx->left += rval.consumed; /* ?Subtracted below! */ ADVANCE(rval.consumed); ASN_DEBUG("Structure consumes %ld bytes, " @@ -201,7 +201,7 @@ SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, */ ctx->step |= 1; /* Confirm entering next microphase */ microphase2: - + /* * Invoke the member fetch routine according to member's type */ @@ -231,7 +231,7 @@ SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, ctx->ptr = 0; RETURN(RC_FAIL); } /* switch(rval) */ - + ADVANCE(rval.consumed); } /* for(all list members) */ @@ -260,7 +260,7 @@ SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, PHASE_OUT(ctx); } - + RETURN(RC_OK); } @@ -884,7 +884,7 @@ SET_OF_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, if(!st) { st = *sptr = CALLOC(1, specs->struct_size); if(!st) _ASN_DECODE_FAILED; - } + } list = _A_SET_FROM_VOID(st); /* Figure out which constraints to use */ @@ -950,4 +950,3 @@ SET_OF_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, rv.consumed = 0; return rv; } - diff --git a/src/core/libs/supl/asn-supl/constr_TYPE.h b/src/core/libs/supl/asn-supl/constr_TYPE.h index 0641f003c..d2716b2a0 100644 --- a/src/core/libs/supl/asn-supl/constr_TYPE.h +++ b/src/core/libs/supl/asn-supl/constr_TYPE.h @@ -162,8 +162,8 @@ extern "C" { ber_tlv_tag_t el_tag; /* Outmost tag of the member */ int el_no; /* Index of the associated member, base 0 */ - int toff_first; /* First occurence of the el_tag, relative */ - int toff_last; /* Last occurence of the el_tag, relatvie */ + int toff_first; /* First occurrence of the el_tag, relative */ + int toff_last; /* Last occurrence of the el_tag, relatvie */ } asn_TYPE_tag2member_t; /* diff --git a/src/core/libs/supl/asn-supl/per_support.h b/src/core/libs/supl/asn-supl/per_support.h index 7ea76d331..77ffe1335 100644 --- a/src/core/libs/supl/asn-supl/per_support.h +++ b/src/core/libs/supl/asn-supl/per_support.h @@ -58,7 +58,7 @@ extern "C" */ int32_t per_get_few_bits(asn_per_data_t *pd, int get_nbits); - /* Undo the immediately preceeding "get_few_bits" operation */ + /* Undo the immediately preceding "get_few_bits" operation */ void per_get_undo(asn_per_data_t *pd, int get_nbits); /* diff --git a/src/core/libs/supl/asn-supl/xer_support.h b/src/core/libs/supl/asn-supl/xer_support.h index e28316d59..12ee67e4d 100644 --- a/src/core/libs/supl/asn-supl/xer_support.h +++ b/src/core/libs/supl/asn-supl/xer_support.h @@ -21,7 +21,7 @@ extern "C" PXML_TEXT, /* Plain text between XML tags. */ PXML_TAG, /* A tag, starting with '<'. */ PXML_COMMENT, /* An XML comment, including "". */ - /* + /* * The following chunk types are reported if the chunk * terminates the specified XML element. */ @@ -31,10 +31,10 @@ extern "C" /* * Callback function that is called by the parser when parsed data is - * available. The _opaque is the pointer to a field containing opaque user - * data specified in pxml_create() call. The chunk type is _type and the text + * available. The _opaque is the pointer to a field containing opaque user + * data specified in pxml_create() call. The chunk type is _type and the text * data is the piece of buffer identified by _bufid (as supplied to - * pxml_feed() call) starting at offset _offset and of _size bytes size. + * pxml_feed() call) starting at offset _offset and of _size bytes size. * The chunk is NOT '\0'-terminated. */ typedef int(pxml_callback_f)(pxml_chunk_type_e _type, @@ -42,8 +42,8 @@ extern "C" /* * Parse the given buffer as it were a chunk of XML data. - * Invoke the specified callback each time the meaninful data is found. - * This function returns number of bytes consumed from the bufer. + * Invoke the specified callback each time the meaningful data is found. + * This function returns number of bytes consumed from the buffer. * It will always be lesser than or equal to the specified _size. * The next invocation of this function must account the difference. */ diff --git a/src/core/libs/supl/asn/rrlp-components.asn b/src/core/libs/supl/asn/rrlp-components.asn index 14ed9392a..0c1faff8b 100644 --- a/src/core/libs/supl/asn/rrlp-components.asn +++ b/src/core/libs/supl/asn/rrlp-components.asn @@ -36,7 +36,7 @@ MsrPosition-Req ::= SEQUENCE { extensionContainer ExtensionContainer OPTIONAL, ..., -- Release 98 extension element -rel98-MsrPosition-Req-extension Rel98-MsrPosition-Req-Extension OPTIONAL, +rel98-MsrPosition-Req-extension Rel98-MsrPosition-Req-Extension OPTIONAL, -- Release 5 extension element rel5-MsrPosition-Req-extension Rel5-MsrPosition-Req-Extension OPTIONAL -- Release 7 extension element @@ -44,7 +44,7 @@ rel5-MsrPosition-Req-extension Rel5-MsrPosition-Req-Extension OPTIONAL } --- add this defintion to RRLP-Components module +-- add this definition to RRLP-Components module -- Measurement Position response component MsrPosition-Rsp ::= SEQUENCE { @@ -55,9 +55,9 @@ MsrPosition-Rsp ::= SEQUENCE { gps-MeasureInfo GPS-MeasureInfo OPTIONAL, locationError LocationError OPTIONAL, extensionContainer ExtensionContainer OPTIONAL, - ..., + ..., -- Release extension here - rel-98-MsrPosition-Rsp-Extension + rel-98-MsrPosition-Rsp-Extension Rel-98-MsrPosition-Rsp-Extension OPTIONAL, rel-5-MsrPosition-Rsp-Extension Rel-5-MsrPosition-Rsp-Extension OPTIONAL @@ -68,14 +68,14 @@ MsrPosition-Rsp ::= SEQUENCE { } --- add this defintion to RRLP-Components module +-- add this definition to RRLP-Components module -- Assistance Data component AssistanceData ::= SEQUENCE { referenceAssistData ReferenceAssistData OPTIONAL, msrAssistData MsrAssistData OPTIONAL, systemInfoAssistData SystemInfoAssistData OPTIONAL, - gps-AssistData GPS-AssistData OPTIONAL, + gps-AssistData GPS-AssistData OPTIONAL, moreAssDataToBeSent MoreAssDataToBeSent OPTIONAL, -- If not present, interpret as only -- Assistance Data component used to -- deliver entire set of assistance @@ -85,15 +85,15 @@ AssistanceData ::= SEQUENCE { -- Release extension here rel98-AssistanceData-Extension Rel98-AssistanceData-Extension OPTIONAL, rel5-AssistanceData-Extension Rel5-AssistanceData-Extension OPTIONAL --- rel7-AssistanceData-Extension Rel7-AssistanceData-Extension OPTIONAL +-- rel7-AssistanceData-Extension Rel7-AssistanceData-Extension OPTIONAL } --- add this defintion to RRLP-Components module +-- add this definition to RRLP-Components module -- Protocol Error component ProtocolError ::= SEQUENCE { - errorCause ErrorCodes, + errorCause ErrorCodes, extensionContainer ExtensionContainer OPTIONAL, ..., -- Release extensions here @@ -101,15 +101,15 @@ ProtocolError ::= SEQUENCE { } --- add these defintions to RRLP-Components module +-- add these definitions to RRLP-Components module -- Position instructions PositionInstruct ::= SEQUENCE { -- Method type - methodType MethodType, + methodType MethodType, positionMethod PositionMethod, - measureResponseTime MeasureResponseTime, - useMultipleSets UseMultipleSets, - environmentCharacter EnvironmentCharacter OPTIONAL + measureResponseTime MeasureResponseTime, + useMultipleSets UseMultipleSets, + environmentCharacter EnvironmentCharacter OPTIONAL } -- @@ -250,7 +250,7 @@ ReferenceWGS84 ::= SEQUENCE { relativeAlt RelativeAlt OPTIONAL -- relative altitude } --- Fine RTD value between this BTS and the reference BTS +-- Fine RTD value between this BTS and the reference BTS FineRTD ::= INTEGER (0..255) -- Relative north/east distance @@ -264,7 +264,7 @@ RelativeAlt ::= INTEGER (-4000..4000) -- Multiple sets MultipleSets ::= SEQUENCE { -- number of reference sets - nbrOfSets INTEGER (2..3), + nbrOfSets INTEGER (2..3), -- This field actually tells the number of reference BTSs nbrOfReferenceBTSs INTEGER (1..3), @@ -274,7 +274,7 @@ MultipleSets ::= SEQUENCE { referenceRelation ReferenceRelation OPTIONAL } --- Relation between refence BTSs and sets +-- Relation between reference BTSs and sets ReferenceRelation ::= ENUMERATED { secondBTSThirdSet (0), -- 1st BTS related to 1st and 2nd sets secondBTSSecondSet (1), -- 1st BTS related to 1st and 3rd sets @@ -369,7 +369,7 @@ OTD-FirstSetMsrs ::= OTD-MeasurementWithID -- Neighbour info in OTD measurements 0-10 times in TD measurement info OTD-MsrsOfOtherSets ::= CHOICE { - identityNotPresent OTD-Measurement, + identityNotPresent OTD-Measurement, identityPresent OTD-MeasurementWithID } @@ -441,7 +441,7 @@ GPS-MeasureInfo ::= SEQUENCE { -- Measurement info elements -- user has to make sure that in this element is number of elements -- defined in reference BTS identity - gpsMsrSetList SeqOfGPS-MsrSetElement + gpsMsrSetList SeqOfGPS-MsrSetElement } SeqOfGPS-MsrSetElement ::= SEQUENCE (SIZE(1..3)) OF GPS-MsrSetElement @@ -472,7 +472,7 @@ GPS-MsrElement ::= SEQUENCE { -- the receiver shall consider a value of 1024 to be -- invalid data mpathIndic MpathIndic, -- multipath indicator - pseuRangeRMSErr INTEGER (0..63) -- index + pseuRangeRMSErr INTEGER (0..63) -- index } -- Multipath indicator @@ -491,7 +491,7 @@ LocationError ::= SEQUENCE { } LocErrorReason ::= ENUMERATED { - unDefined (0), + unDefined (0), notEnoughBTSs (1), notEnoughSats (2), eotdLocCalAssDataMissing (3), @@ -503,7 +503,7 @@ LocErrorReason ::= ENUMERATED { refBTSForGPSNotServingBTS (9), refBTSForEOTDNotServingBTS (10), ..., - notEnoughGANSSSats (11), + notEnoughGANSSSats (11), ganssAssDataMissing (12), refBTSForGANSSNotServingBTS (13) } @@ -539,11 +539,11 @@ maxGANSSAssistanceData INTEGER ::= 40 -- Protocol Error Causes ErrorCodes ::= ENUMERATED { unDefined (0), -missingComponet (1), -incorrectData (2), -missingIEorComponentElement (3), -messageTooShort (4), -unknowReferenceNumber (5), +missingComponet (1), +incorrectData (2), +missingIEorComponentElement (3), +messageTooShort (4), +unknowReferenceNumber (5), ... } @@ -655,7 +655,7 @@ DGPSCorrections ::= SEQUENCE { gpsTOW INTEGER (0..604799), -- DGPS reference time status INTEGER (0..7), -- N_SAT can be read from number of elements of satList - satList SeqOfSatElement + satList SeqOfSatElement } SeqOfSatElement ::= SEQUENCE (SIZE (1..16)) OF SatElement @@ -666,20 +666,20 @@ SatElement ::= SEQUENCE { --- Sequence number for ephemeris iode INTEGER (0..239), -- User Differential Range Error - udre INTEGER (0..3), + udre INTEGER (0..3), -- Pseudo Range Correction, range is -- -655.04 - +655.04, - pseudoRangeCor INTEGER (-2047..2047), + pseudoRangeCor INTEGER (-2047..2047), -- Pseudo Range Rate Correction, range is -- -4.064 - +4.064, rangeRateCor INTEGER (-127..127), --- Delta Pseudo Range Correction 2 +-- Delta Pseudo Range Correction 2 deltaPseudoRangeCor2 INTEGER (-127..127), -- This IE shall be ignored by the receiver and -- set to zero by the sender - -- Delta Pseudo Range Correction 2 + -- Delta Pseudo Range Correction 2 deltaRangeRateCor2 INTEGER (-7..7), -- This IE shall be ignored by the receiver and -- set to zero by the sender -- Delta Pseudo Range Correction 3 @@ -693,14 +693,14 @@ SatElement ::= SEQUENCE { SatelliteID ::= INTEGER (0..63) -- identifies satellite -- Navigation Model IE NavigationModel ::= SEQUENCE { - navModelList SeqOfNavModelElement + navModelList SeqOfNavModelElement } -- navigation model satellite list SeqOfNavModelElement ::= SEQUENCE (SIZE(1..16)) OF NavModelElement NavModelElement ::= SEQUENCE { - satelliteID SatelliteID, + satelliteID SatelliteID, satStatus SatStatus -- satellite status } @@ -790,7 +790,7 @@ Almanac ::= SEQUENCE { -- navigation model satellite list. -- The size of almanacList is actually Nums_Sats_Total field - almanacList SeqOfAlmanacElement + almanacList SeqOfAlmanacElement } SeqOfAlmanacElement ::= SEQUENCE (SIZE(1..64)) OF AlmanacElement @@ -818,7 +818,7 @@ AcquisAssist ::= SEQUENCE { -- Acquisition assistance list -- The size of Number of Satellites is actually Number of Satellites field - acquisList SeqOfAcquisElement + acquisList SeqOfAcquisElement } SeqOfAcquisElement ::= SEQUENCE (SIZE(1..16)) OF AcquisElement @@ -829,13 +829,13 @@ TimeRelation ::= SEQUENCE { gsmTime GSMTime OPTIONAL } --- data occuring per number of satellites +-- data occurring per number of satellites AcquisElement ::= SEQUENCE { svid SatelliteID, -- Doppler 0th order term, -- -5120.0 - 5117.5 Hz (= -2048 - 2047 with 2.5 Hz resolution) - doppler0 INTEGER (-2048..2047), + doppler0 INTEGER (-2048..2047), addionalDoppler AddionalDopplerFields OPTIONAL, codePhase INTEGER (0..1022), -- Code Phase intCodePhase INTEGER (0..19), -- Integer Code Phase @@ -869,15 +869,15 @@ SeqOf-BadSatelliteSet ::= SEQUENCE (SIZE(1..16)) OF SatelliteID -- Release 98 Extensions here Rel98-MsrPosition-Req-Extension ::= SEQUENCE { rel98-Ext-ExpOTD Rel98-Ext-ExpOTD OPTIONAL, -- ExpectedOTD extension - ..., - gpsTimeAssistanceMeasurementRequest NULL OPTIONAL, + ..., + gpsTimeAssistanceMeasurementRequest NULL OPTIONAL, gpsReferenceTimeUncertainty GPSReferenceTimeUncertainty OPTIONAL -- Further R98 extensions here } Rel98-AssistanceData-Extension ::= SEQUENCE { rel98-Ext-ExpOTD Rel98-Ext-ExpOTD OPTIONAL, -- ExpectedOTD extension - ..., + ..., gpsTimeAssistanceMeasurementRequest NULL OPTIONAL, gpsReferenceTimeUncertainty GPSReferenceTimeUncertainty OPTIONAL @@ -939,7 +939,7 @@ AssistBTSData-R98-ExpOTD ::= SEQUENCE { ExpectedOTD ::= INTEGER (0..1250) -- The ExpectedOTD value 1250 shall not be encoded by the transmitting entity and -- shall be treated by the receiving entity as 0. --- Uncertainty of Exptected OTD in bits +-- Uncertainty of Expected OTD in bits ExpOTDUncertainty ::= INTEGER(0..7) -- Release 98 extensions @@ -959,8 +959,8 @@ Rel-98-MsrPosition-Rsp-Extension ::= SEQUENCE { rel-98-Ext-MeasureInfo SEQUENCE { otd-MeasureInfo-R98-Ext OTD-MeasureInfo-R98-Ext OPTIONAL }, - ..., - timeAssistanceMeasurements GPSTimeAssistanceMeasurements OPTIONAL + ..., + timeAssistanceMeasurements GPSTimeAssistanceMeasurements OPTIONAL -- Further R98 extensions here } @@ -1049,7 +1049,7 @@ velocityRequested NULL OPTIONAL, ganssTODGSMTimeAssociationMeasurementRequest NULL OPTIONAL, requiredResponseTime RequiredResponseTime OPTIONAL, ... - -- Further Release 7 extentions here + -- Further Release 7 extensions here } -- additional satellite systems may be added in future versions of the protocol @@ -1113,7 +1113,7 @@ GANSSTOD ::= INTEGER (0 .. 86399) -- GANSS TOD uncertainty GANSSTODUncertainty ::= INTEGER (0 .. 127) -- Coding according to Annex --- GANSS TOD-GSM Time association +-- GANSS TOD-GSM Time association GANSSTOD-GSMTimeAssociation ::= SEQUENCE { bcchCarrier BCCHCarrier, -- BCCH carrier bsic BSIC, -- BSIC @@ -1140,7 +1140,7 @@ GANSSIonosphericModel ::= SEQUENCE { ... } --- GANSS ionosphere model. Coding according to Annex +-- GANSS ionosphere model. Coding according to Annex GANSSIonosphereModel ::= SEQUENCE { ai0 INTEGER (0 .. 4095), ai1 INTEGER (0 .. 4095), @@ -1169,7 +1169,7 @@ GANSSTimeModelElement ::= SEQUENCE { tA1 TA1 OPTIONAL, tA2 TA2 OPTIONAL, gnssTOID INTEGER (0 .. 7), - weekNumber INTEGER (0 .. 8191) OPTIONAL + weekNumber INTEGER (0 .. 8191) OPTIONAL } -- GANSS time model parameter A0 @@ -1210,11 +1210,11 @@ DGANSSSgnElement ::= SEQUENCE { iod INTEGER (0 .. 1023), -- User Differential Range Error - udre INTEGER (0..3), + udre INTEGER (0..3), -- Pseudo Range Correction, range is -- -655.04 - +655.04, - pseudoRangeCor INTEGER (-2047..2047), + pseudoRangeCor INTEGER (-2047..2047), -- Pseudo Range Rate Correction, range is -- -4.064 - +4.064, @@ -1226,7 +1226,7 @@ SVID ::= INTEGER (0 .. 63) -- Coding according to Annex -- GANSS Navigation Model IE GANSSNavModel ::= SEQUENCE { nonBroadcastIndFlag INTEGER (0 .. 1), - toeMSB INTEGER (0 .. 31) OPTIONAL, -- 5 MSB of toe and toc + toeMSB INTEGER (0 .. 31) OPTIONAL, -- 5 MSB of toe and toc eMSB INTEGER (0 .. 127) OPTIONAL, sqrtAMBS INTEGER (0 .. 63) OPTIONAL, ganssSatelliteList SeqOfGANSSSatelliteElement @@ -1238,14 +1238,14 @@ GANSSSatelliteElement ::= SEQUENCE { svID SVID, svHealth INTEGER (-7 .. 13), -- Coding according to Annex iod INTEGER (0 .. 1023), -- Coding according to Annex - ganssClockModel GANSSClockModel, - ganssOrbitModel GANSSOrbitModel, + ganssClockModel GANSSClockModel, + ganssOrbitModel GANSSOrbitModel, ... } -- GANSS orbit model for the GNSS satellite according to the choice GANSSOrbitModel ::= CHOICE { - keplerianSet NavModel-KeplerianSet, + keplerianSet NavModel-KeplerianSet, ... } @@ -1271,7 +1271,7 @@ NavModel-KeplerianSet ::= SEQUENCE { -- GANSS clock model for the GNSS satellite according to the choice GANSSClockModel ::= CHOICE { - standardClockModelList SeqOfStandardClockModelElement, + standardClockModelList SeqOfStandardClockModelElement, ... } @@ -1279,13 +1279,13 @@ SeqOfStandardClockModelElement ::= SEQUENCE (SIZE(1..2)) OF StandardClockModelEl StandardClockModelElement ::= SEQUENCE { stanClockTocLSB INTEGER (0 .. 511), -- 9LSB of time of clock - stanClockAF2 INTEGER (-2048 .. 2047), - stanClockAF1 INTEGER (-131072 .. 131071), + stanClockAF2 INTEGER (-2048 .. 2047), + stanClockAF1 INTEGER (-131072 .. 131071), stanClockAF0 INTEGER (-134217728 .. 134217727), stanClockTgd INTEGER (-512 .. 511) OPTIONAL, stanModelID INTEGER (0 .. 1) OPTIONAL, ... -} +} -- GANSS Real-Time Integrity IE GANSSRealTimeIntegrity ::= SEQUENCE { @@ -1316,7 +1316,7 @@ SeqOf-GANSSDataBits ::= SEQUENCE (SIZE(1 .. 1024)) OF GANSSDataBit GANSSDataBit ::= INTEGER(0 .. 1) -- GANSS Reference Measurement Assistance IE --- Code and Doppler assistance from the network. +-- Code and Doppler assistance from the network. GANSSRefMeasurementAssist ::= SEQUENCE { ganssSignalID INTEGER (0 .. 3) OPTIONAL, -- Coding according to Annex ganssRefMeasAssitList SeqOfGANSSRefMeasurementElement @@ -1357,9 +1357,9 @@ SVIDMASK ::= BIT STRING (SIZE (1..36)) SeqOfGANSSAlmanacElement ::= SEQUENCE (SIZE(1 .. 36)) OF GANSSAlmanacElement --- GANSS Almanac Model +-- GANSS Almanac Model GANSSAlmanacElement ::= CHOICE { - keplerianAlmanacSet Almanac-KeplerianSet, + keplerianAlmanacSet Almanac-KeplerianSet, ... } @@ -1389,7 +1389,7 @@ GANSSUTCModel ::= SEQUENCE { ganssUtcDeltaTlsf INTEGER (-128..127) } ---Required Measurement Request Response Time, range is 1 to 128 seconds. +--Required Measurement Request Response Time, range is 1 to 128 seconds. RequiredResponseTime ::= INTEGER (1..128) Rel-7-MsrPosition-Rsp-Extension ::= SEQUENCE { @@ -1405,7 +1405,7 @@ Rel-7-MsrPosition-Rsp-Extension ::= SEQUENCE { -- Further Release 7 extensions here } --- GANSS Location Information contains location estimate, time stamp with uncertainty +-- GANSS Location Information contains location estimate, time stamp with uncertainty -- and optionally Reference Frame field GANSSLocationInfo ::= SEQUENCE { referenceFrame ReferenceFrame OPTIONAL, -- Reference Frame Number @@ -1415,7 +1415,7 @@ GANSSLocationInfo ::= SEQUENCE { ganssTimeID INTEGER (0 .. 3) OPTIONAL, -- Coding according to Annex fixType FixType, posData PositionData, - stationaryIndication INTEGER(0 .. 1) OPTIONAL, -- ‘0’ if moving or motion not known + stationaryIndication INTEGER(0 .. 1) OPTIONAL, -- ‘0’ if moving or motion not known -- Possible shapes carried in posEstimate are -- ellipsoid point, -- ellipsoid point with uncertainty circle @@ -1442,7 +1442,7 @@ ReferenceFrame ::= SEQUENCE { --- GANSS Measurement Information +-- GANSS Measurement Information GANSSMeasureInfo ::= SEQUENCE { -- Measurement info elements -- user has to make sure that in this element is number of elements @@ -1456,22 +1456,22 @@ GANSS-MsrSetElement ::= SEQUENCE { referenceFrame ReferenceFrame OPTIONAL, -- Reference Frame Number ganssTODm GANSSTODm OPTIONAL, -- GANSS TOD modulo deltaGNASSTOD INTEGER (0 .. 127) OPTIONAL, - ganssTODUncertainty GANSSTODUncertainty OPTIONAL, -- Coding accoring to Annex + ganssTODUncertainty GANSSTODUncertainty OPTIONAL, -- Coding according to Annex --N_SGN_TYPE can be read from number of elements of SeqOfGANSS-SgnTypeElement ganss-SgnTypeList SeqOfGANSS-SgnTypeElement } --- Measurements can be returned up to 6 different signal types +-- Measurements can be returned up to 6 different signal types SeqOfGANSS-SgnTypeElement ::= SEQUENCE (SIZE(1..6)) OF GANSS-SgnTypeElement GANSS-SgnTypeElement ::= SEQUENCE { - ganssSignalID INTEGER (0 .. 15), -- Coding accroding to Annex + ganssSignalID INTEGER (0 .. 15), -- Coding according to Annex --N_SGN can be read from number of elements of SeqOfGANSS-SgnElement ganss-SgnList SeqOfGANSS-SgnElement } --- Measurements can be returned up to 16 per signal types +-- Measurements can be returned up to 16 per signal types SeqOfGANSS-SgnElement ::= SEQUENCE (SIZE(1..16)) OF GANSS-SgnElement @@ -1482,7 +1482,7 @@ GANSS-SgnElement ::= SEQUENCE { carrierQualityInd INTEGER (0 .. 3) OPTIONAL, -- Coding according to Annex codePhase INTEGER (0 .. 2097151), integerCodePhase INTEGER (0 .. 63) OPTIONAL, - codePhaseRMSError INTEGER (0..63), -- Coding accoring to Annex + codePhaseRMSError INTEGER (0..63), -- Coding according to Annex doppler INTEGER (-32768 .. 32767) OPTIONAL, adr INTEGER (0 .. 33554431) OPTIONAL } diff --git a/src/core/libs/supl/supl.c b/src/core/libs/supl/supl.c index 035496591..8cacb8019 100644 --- a/src/core/libs/supl/supl.c +++ b/src/core/libs/supl/supl.c @@ -469,7 +469,7 @@ static int pdu_make_ulp_pos_init(supl_ctx_t *ctx, supl_ulp_t *pdu) ulp->message.choice.msSUPLPOSINIT.sETCapabilities.posProtocol.rrlp = 1; //GNSS-SDR mod - // Use ctx->p.request to swith between a pre-defined set of assistence data request + // Use ctx->p.request to switch between a pre-defined set of assistance data request // reason: Some SUPL servers do not respond to Acquisition assistance depending on the status of other assistance flags switch (ctx->p.request) diff --git a/src/tests/unit-tests/signal-processing-blocks/observables/hybrid_observables_test.cc b/src/tests/unit-tests/signal-processing-blocks/observables/hybrid_observables_test.cc index 0e7774842..a15b0ec02 100644 --- a/src/tests/unit-tests/signal-processing-blocks/observables/hybrid_observables_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/observables/hybrid_observables_test.cc @@ -30,7 +30,6 @@ * ------------------------------------------------------------------------- */ -#include "hybrid_observables.h" #include "GPS_L1_CA.h" #include "GPS_L2C.h" #include "GPS_L5.h" @@ -52,6 +51,7 @@ #include "gps_l1_ca_pcps_acquisition.h" #include "gps_l2_m_pcps_acquisition.h" #include "gps_l5i_pcps_acquisition.h" +#include "hybrid_observables.h" #include "in_memory_configuration.h" #include "observable_tests_flags.h" #include "observables_dump_reader.h" @@ -415,7 +415,7 @@ bool HybridObservablesTest::acquire_signal() System_and_Signal = "Galileo E5a"; config->set_property("Acquisition_5X.coherent_integration_time_ms", "1"); config->set_property("Acquisition.max_dwells", std::to_string(FLAGS_external_signal_acquisition_dwells)); - config->set_property("Acquisition.CAF_window_hz", "0"); // **Only for E5a** Resolves doppler ambiguity averaging the specified BW in the winner code delay. If set to 0 CAF filter is desactivated. Recommended value 3000 Hz + config->set_property("Acquisition.CAF_window_hz", "0"); // **Only for E5a** Resolves doppler ambiguity averaging the specified BW in the winner code delay. If set to 0 CAF filter is deactivated. Recommended value 3000 Hz config->set_property("Acquisition.Zero_padding", "0"); //**Only for E5a** Avoids power loss and doppler ambiguity in bit transitions by correlating one code with twice the input data length, ensuring that at least one full code is present without transitions. If set to 1 it is ON, if set to 0 it is OFF. config->set_property("Acquisition.bit_transition_flag", "false"); acquisition = std::make_shared(config.get(), "Acquisition", 1, 0); @@ -1649,7 +1649,7 @@ bool HybridObservablesTest::ReadRinexObs(std::vector* obs_vec, Gnss_S std::cout << "ReadRinexObs info:" << std::endl; for (unsigned int n = 0; n < gnss_synchro_vec.size(); n++) { - std::cout << "SAT PRN " << gnss_synchro_vec.at(n).PRN << " RINEX epoch readed: " << obs_vec->at(n).n_rows << std::endl; + std::cout << "SAT PRN " << gnss_synchro_vec.at(n).PRN << " RINEX epoch read: " << obs_vec->at(n).n_rows << std::endl; } return true; } diff --git a/src/tests/unit-tests/signal-processing-blocks/observables/hybrid_observables_test_fpga.cc b/src/tests/unit-tests/signal-processing-blocks/observables/hybrid_observables_test_fpga.cc index 96c0374a6..be6583874 100644 --- a/src/tests/unit-tests/signal-processing-blocks/observables/hybrid_observables_test_fpga.cc +++ b/src/tests/unit-tests/signal-processing-blocks/observables/hybrid_observables_test_fpga.cc @@ -1455,7 +1455,7 @@ bool HybridObservablesTestFpga::ReadRinexObs(std::vector* obs_vec, Gn std::cout << "ReadRinexObs info:" << std::endl; for (unsigned int n = 0; n < gnss_synchro_vec.size(); n++) { - std::cout << "SAT PRN " << gnss_synchro_vec.at(n).PRN << " RINEX epoch readed: " << obs_vec->at(n).n_rows << std::endl; + std::cout << "SAT PRN " << gnss_synchro_vec.at(n).PRN << " RINEX epoch read: " << obs_vec->at(n).n_rows << std::endl; } return true; } diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/bayesian_estimation_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/bayesian_estimation_test.cc index 6fa5f1da0..17b359077 100644 --- a/src/tests/unit-tests/signal-processing-blocks/tracking/bayesian_estimation_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/bayesian_estimation_test.cc @@ -1,6 +1,6 @@ /*! * \file bayesian_estimation_test.cc - * \brief This file implements feasability test for the BCE library. + * \brief This file implements feasibility test for the BCE library. * \author Gerald LaMountain, 2018. gerald(at)ece.neu.edu * * diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l1_ca_dll_pll_tracking_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l1_ca_dll_pll_tracking_test.cc index 411221e1e..cc9d9b12f 100644 --- a/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l1_ca_dll_pll_tracking_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/gps_l1_ca_dll_pll_tracking_test.cc @@ -1056,7 +1056,7 @@ TEST_F(GpsL1CADllPllTrackingTest, ValidationOfResults) if (FLAGS_plot_gps_l1_tracking_test == true) { - std::cout << "Ploting performance metrics..." << std::endl; + std::cout << "Plotting performance metrics..." << std::endl; try { if (generator_CN0_values.size() > 1) diff --git a/src/tests/unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test.cc b/src/tests/unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test.cc index 169513401..164a2825a 100644 --- a/src/tests/unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/tracking_pull-in_test.cc @@ -450,7 +450,7 @@ bool TrackingPullInTest::acquire_signal(int SV_ID) System_and_Signal = "Galileo E5a"; config->set_property("Acquisition_5X.coherent_integration_time_ms", "1"); config->set_property("Acquisition.max_dwells", std::to_string(FLAGS_external_signal_acquisition_dwells)); - config->set_property("Acquisition.CAF_window_hz", "0"); // **Only for E5a** Resolves doppler ambiguity averaging the specified BW in the winner code delay. If set to 0 CAF filter is desactivated. Recommended value 3000 Hz + config->set_property("Acquisition.CAF_window_hz", "0"); // **Only for E5a** Resolves doppler ambiguity averaging the specified BW in the winner code delay. If set to 0 CAF filter is deactivated. Recommended value 3000 Hz config->set_property("Acquisition.Zero_padding", "0"); //**Only for E5a** Avoids power loss and doppler ambiguity in bit transitions by correlating one code with twice the input data length, ensuring that at least one full code is present without transitions. If set to 1 it is ON, if set to 0 it is OFF. config->set_property("Acquisition.bit_transition_flag", "false"); acquisition = std::make_shared(config.get(), "Acquisition", 1, 0); diff --git a/src/utils/front-end-cal/front_end_cal.cc b/src/utils/front-end-cal/front_end_cal.cc index 4940f6082..7dbd89e91 100644 --- a/src/utils/front-end-cal/front_end_cal.cc +++ b/src/utils/front-end-cal/front_end_cal.cc @@ -385,7 +385,6 @@ void FrontEndCal::GPS_L1_front_end_model_E4000(double f_bb_true_Hz, double f_bb_ double f_rf_err = (f_bb_meas_Hz - f_bb_true_Hz) - f_bb_err_pll; double f_osc_err_hz = (f_rf_err * R) / (N + X / Y); - // OJO,segun los datos gnss, la IF positiva hace disminuir la fs!! f_osc_err_hz = -f_osc_err_hz; *f_osc_err_ppm = f_osc_err_hz / (f_osc_n / 1e6); diff --git a/src/utils/rinex2assist/README.md b/src/utils/rinex2assist/README.md index 9d378d797..4708a3f87 100644 --- a/src/utils/rinex2assist/README.md +++ b/src/utils/rinex2assist/README.md @@ -10,7 +10,7 @@ This program is built along with GNSS-SDR if the options `ENABLE_UNIT_TESTING_EX ``` $ cmake -DENABLE_SYSTEM_TESTING_EXTRA=ON .. $ make -$ sudo make intall +$ sudo make install ``` The last step is optional. Without it, you will get the executable at `../install/rinex2assist`. From 71d8be3192134d633763c56c92df9a7f5f084343 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sat, 20 Jul 2019 13:14:20 +0200 Subject: [PATCH 22/36] Update changelog --- docs/changelog | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/changelog b/docs/changelog index 97af773b1..a1f6ba4e0 100644 --- a/docs/changelog +++ b/docs/changelog @@ -21,6 +21,7 @@ ### Improvements in Flexibility: +- Rewritten Control Thread and GNSS Flowgraph for increased control of channels' status and smarter assignation of satellites in multi-band configurations. - New Tracking parameters allow the configuration of PLL and DLL filters order. - Added parameter to enable FLL during pull-in time. - Configurable pull-in time in the Tracking loops. @@ -28,7 +29,7 @@ ### Improvements in Interoperability: -- Added the BeiDou B1I receiver chain. +- Added the BeiDou B1I and B3I receiver chains. - Fix bug in GLONASS dual frequency receiver. - Added a custom UDP/IP output for PVT data streaming. - Improved Monitor block with UDP/IP output for internal receiver's data streaming. @@ -43,6 +44,7 @@ - Applied clang-tidy checks and fixes related to readability: readability-container-size-empty, readability-identifier-naming, readability-inconsistent-declaration-parameter-name, readability-named-parameter, readability-non-const-parameter, readability-string-compare. - Improved includes selection following suggestions by include-what-you-use (see https://include-what-you-use.org/), allowing faster compiles, fewer recompiles and making refactoring easier. - Deprecated boost::asio::io_service replaced by boost::asio::io_context if Boost > 1.65 +- The internal communication mechanism based on gr::msg_queue has been replaced by asynchronous message passing. ### Improvements in Portability: From 82c4643ffb7e8676cd936eca9fa082b08e6fddfc Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sat, 20 Jul 2019 13:37:09 +0200 Subject: [PATCH 23/36] Remove unused file --- src/core/receiver/CMakeLists.txt | 1 - src/core/receiver/control_message.h | 47 ----------------------------- 2 files changed, 48 deletions(-) delete mode 100644 src/core/receiver/control_message.h diff --git a/src/core/receiver/CMakeLists.txt b/src/core/receiver/CMakeLists.txt index 20c8b7ea0..cb709a7e4 100644 --- a/src/core/receiver/CMakeLists.txt +++ b/src/core/receiver/CMakeLists.txt @@ -36,7 +36,6 @@ set(GNSS_RECEIVER_HEADERS tcp_cmd_interface.h concurrent_map.h concurrent_queue.h - control_message.h command_event.h ) diff --git a/src/core/receiver/control_message.h b/src/core/receiver/control_message.h deleted file mode 100644 index ff166e40f..000000000 --- a/src/core/receiver/control_message.h +++ /dev/null @@ -1,47 +0,0 @@ -/*! - * \file control_message.h - * \brief Interface for the different control messages. - * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com - * - * ------------------------------------------------------------------------- - * - * Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) - * - * GNSS-SDR is a software defined Global Navigation - * Satellite Systems receiver - * - * This file is part of GNSS-SDR. - * - * GNSS-SDR is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * GNSS-SDR is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNSS-SDR. If not, see . - * - * ------------------------------------------------------------------------- - */ - - -#ifndef GNSS_SDR_CONTROL_MESSAGE_H_ -#define GNSS_SDR_CONTROL_MESSAGE_H_ - -/*! - * \brief This class defines the different Control Messages - */ -class ControlMessage -{ -public: - static unsigned int const ack_success = 0; - static unsigned int const ack_failed = 1; - static unsigned int const trk_failed = 2; - static unsigned int const channel_init = 3; -}; - -#endif /*GNSS_SDR_CONTROL_MESSAGE_H_*/ From 37fdfca5ec0bbbd3cd6901600d4ccc666e2d417c Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sun, 21 Jul 2019 12:55:59 +0200 Subject: [PATCH 24/36] Miscellaneous improvements Improve modularity of CMake design Improve building speed in multicore processors Files command_event.* moved to core/libs Remove Armadillo from public core_receiver interface Uniformize name format for classes Apply some fixes by clang-tidy Improve documentation --- src/algorithms/PVT/libs/rinex_printer.h | 2 +- .../channel/adapters/CMakeLists.txt | 2 +- src/algorithms/channel/libs/CMakeLists.txt | 7 ++- src/algorithms/libs/pass_through.cc | 2 +- .../signal_generator/adapters/CMakeLists.txt | 2 +- .../gnuradio_blocks/signal_generator_c.h | 2 +- .../gnuradio_blocks/CMakeLists.txt | 9 ++- .../signal_source/libs/CMakeLists.txt | 7 ++- src/core/libs/CMakeLists.txt | 2 + src/core/libs/channel_event.cc | 4 +- src/core/libs/channel_event.h | 10 ++-- src/core/libs/channel_status_msg_receiver.cc | 27 +++++---- src/core/libs/channel_status_msg_receiver.h | 7 ++- src/core/{receiver => libs}/command_event.cc | 4 +- src/core/{receiver => libs}/command_event.h | 12 ++-- src/core/receiver/CMakeLists.txt | 17 +++--- src/core/receiver/concurrent_map.h | 12 ++-- src/core/receiver/control_thread.cc | 17 +++--- src/core/receiver/control_thread.h | 32 ++++++----- src/core/receiver/gnss_flowgraph.cc | 41 ++++++++------ src/core/receiver/gnss_flowgraph.h | 56 +++++++++++++------ src/core/receiver/tcp_cmd_interface.cc | 17 +++--- src/core/receiver/tcp_cmd_interface.h | 10 ++-- 23 files changed, 176 insertions(+), 125 deletions(-) rename src/core/{receiver => libs}/command_event.cc (91%) rename src/core/{receiver => libs}/command_event.h (86%) diff --git a/src/algorithms/PVT/libs/rinex_printer.h b/src/algorithms/PVT/libs/rinex_printer.h index 90724d0d9..98c11e4fc 100644 --- a/src/algorithms/PVT/libs/rinex_printer.h +++ b/src/algorithms/PVT/libs/rinex_printer.h @@ -157,7 +157,7 @@ public: /*! * \brief Generates the Mixed GPS L1,L5 + BDS B1I, B3I Navigation Data header */ - void rinex_nav_header(std::fstream& out, const Gps_Iono& gps_lnav_iono, const Gps_Utc_Model& gps_lnav_utc_model, const Gps_Ephemeris& eph, const Beidou_Dnav_Iono& bds_dnav_iono, const Beidou_Dnav_Utc_Model& bds_dnav_utc_model); + void rinex_nav_header(std::fstream& out, const Gps_Iono& gps_iono, const Gps_Utc_Model& gps_utc_model, const Gps_Ephemeris& eph, const Beidou_Dnav_Iono& bds_dnav_iono, const Beidou_Dnav_Utc_Model& bds_dnav_utc_model); /*! * \brief Generates the Mixed GPS L2C + BDS B1I, B3I Navigation Data header diff --git a/src/algorithms/channel/adapters/CMakeLists.txt b/src/algorithms/channel/adapters/CMakeLists.txt index 48f293df5..1019e526a 100644 --- a/src/algorithms/channel/adapters/CMakeLists.txt +++ b/src/algorithms/channel/adapters/CMakeLists.txt @@ -31,7 +31,6 @@ target_link_libraries(channel_adapters Gnuradio::runtime channel_libs core_system_parameters - core_receiver PRIVATE Gflags::gflags Glog::glog @@ -41,6 +40,7 @@ target_link_libraries(channel_adapters target_include_directories(channel_adapters PUBLIC ${CMAKE_SOURCE_DIR}/src/core/interfaces + ${CMAKE_SOURCE_DIR}/src/core/receiver ) if(ENABLE_CLANG_TIDY) diff --git a/src/algorithms/channel/libs/CMakeLists.txt b/src/algorithms/channel/libs/CMakeLists.txt index 1ab513f43..1411013a9 100644 --- a/src/algorithms/channel/libs/CMakeLists.txt +++ b/src/algorithms/channel/libs/CMakeLists.txt @@ -35,16 +35,21 @@ add_library(channel_libs ${CHANNEL_FSM_SOURCES} ${CHANNEL_FSM_HEADERS}) target_link_libraries(channel_libs PUBLIC - core_libs core_system_parameters Gnuradio::runtime Gnuradio::pmt PRIVATE + core_libs Boost::boost Gflags::gflags Glog::glog ) +target_include_directories(channel_libs + PUBLIC + ${CMAKE_SOURCE_DIR}/src/core/receiver +) + if(ENABLE_CLANG_TIDY) if(CLANG_TIDY_EXE) set_target_properties(channel_libs diff --git a/src/algorithms/libs/pass_through.cc b/src/algorithms/libs/pass_through.cc index 7b4144dd1..4ecf9edb4 100644 --- a/src/algorithms/libs/pass_through.cc +++ b/src/algorithms/libs/pass_through.cc @@ -109,7 +109,7 @@ Pass_Through::Pass_Through(ConfigurationInterface* configuration, const std::str } kludge_copy_ = gr::blocks::copy::make(item_size_); - unsigned long int max_source_buffer_samples = configuration->property("GNSS-SDR.max_source_buffer_samples", 0); + uint64_t max_source_buffer_samples = configuration->property("GNSS-SDR.max_source_buffer_samples", 0ULL); if (max_source_buffer_samples > 0) { kludge_copy_->set_max_output_buffer(max_source_buffer_samples); diff --git a/src/algorithms/signal_generator/adapters/CMakeLists.txt b/src/algorithms/signal_generator/adapters/CMakeLists.txt index a519eaa3f..ed67e8674 100644 --- a/src/algorithms/signal_generator/adapters/CMakeLists.txt +++ b/src/algorithms/signal_generator/adapters/CMakeLists.txt @@ -34,12 +34,12 @@ target_link_libraries(signal_generator_adapters Gflags::gflags Glog::glog algorithms_libs - core_receiver ) target_include_directories(signal_generator_adapters PUBLIC ${CMAKE_SOURCE_DIR}/src/core/interfaces + ${CMAKE_SOURCE_DIR}/src/core/receiver ) if(ENABLE_CLANG_TIDY) diff --git a/src/algorithms/signal_generator/gnuradio_blocks/signal_generator_c.h b/src/algorithms/signal_generator/gnuradio_blocks/signal_generator_c.h index b0a8fb574..4a5af2e3a 100644 --- a/src/algorithms/signal_generator/gnuradio_blocks/signal_generator_c.h +++ b/src/algorithms/signal_generator/gnuradio_blocks/signal_generator_c.h @@ -148,7 +148,7 @@ private: std::vector> sampled_code_data_; std::vector> sampled_code_pilot_; std::vector complex_phase_; - unsigned int work_counter_; + unsigned int work_counter_{}; std::random_device r; std::default_random_engine e1; std::default_random_engine e2; diff --git a/src/algorithms/signal_source/gnuradio_blocks/CMakeLists.txt b/src/algorithms/signal_source/gnuradio_blocks/CMakeLists.txt index 4f05f3169..6a1ff6e62 100644 --- a/src/algorithms/signal_source/gnuradio_blocks/CMakeLists.txt +++ b/src/algorithms/signal_source/gnuradio_blocks/CMakeLists.txt @@ -60,15 +60,20 @@ add_library(signal_source_gr_blocks target_link_libraries(signal_source_gr_blocks PUBLIC + signal_source_libs Boost::thread Gnuradio::runtime - signal_source_libs PRIVATE - core_receiver + core_libs Gflags::gflags Glog::glog ) +target_include_directories(signal_source_gr_blocks + PUBLIC + ${CMAKE_SOURCE_DIR}/src/core/receiver +) + if(ENABLE_RAW_UDP AND PCAP_FOUND) target_link_libraries(signal_source_gr_blocks PUBLIC diff --git a/src/algorithms/signal_source/libs/CMakeLists.txt b/src/algorithms/signal_source/libs/CMakeLists.txt index 1045967b4..7e2f4f2f6 100644 --- a/src/algorithms/signal_source/libs/CMakeLists.txt +++ b/src/algorithms/signal_source/libs/CMakeLists.txt @@ -71,10 +71,15 @@ target_link_libraries(signal_source_libs PUBLIC Boost::boost Gnuradio::runtime - core_receiver PRIVATE Gflags::gflags Glog::glog + core_libs +) + +target_include_directories(signal_source_libs + PUBLIC + ${CMAKE_SOURCE_DIR}/src/core/receiver ) if(ENABLE_PLUTOSDR OR ENABLE_FMCOMMS2) diff --git a/src/core/libs/CMakeLists.txt b/src/core/libs/CMakeLists.txt index 6a074d5a7..a108368ae 100644 --- a/src/core/libs/CMakeLists.txt +++ b/src/core/libs/CMakeLists.txt @@ -26,6 +26,7 @@ set(CORE_LIBS_SOURCES gnss_sdr_sample_counter.cc channel_status_msg_receiver.cc channel_event.cc + command_event.cc ) set(CORE_LIBS_HEADERS @@ -36,6 +37,7 @@ set(CORE_LIBS_HEADERS gnss_sdr_sample_counter.h channel_status_msg_receiver.h channel_event.h + command_event.h ) if(ENABLE_FPGA) diff --git a/src/core/libs/channel_event.cc b/src/core/libs/channel_event.cc index 7c6862d76..c324d2fd5 100644 --- a/src/core/libs/channel_event.cc +++ b/src/core/libs/channel_event.cc @@ -32,10 +32,10 @@ channel_event_sptr channel_event_make(int channel_id, int event_type) { - return channel_event_sptr(new channel_event(channel_id, event_type)); + return channel_event_sptr(new Channel_Event(channel_id, event_type)); } -channel_event::channel_event(int channel_id_, int event_type_) +Channel_Event::Channel_Event(int channel_id_, int event_type_) { channel_id = channel_id_; event_type = event_type_; diff --git a/src/core/libs/channel_event.h b/src/core/libs/channel_event.h index 51c1a3a8f..1382c5b40 100644 --- a/src/core/libs/channel_event.h +++ b/src/core/libs/channel_event.h @@ -33,21 +33,21 @@ #include -class channel_event; +class Channel_Event; -using channel_event_sptr = std::shared_ptr; +using channel_event_sptr = std::shared_ptr; channel_event_sptr channel_event_make(int channel_id, int event_type); -class channel_event +class Channel_Event { public: int channel_id; int event_type; + private: friend channel_event_sptr channel_event_make(int channel_id, int event_type); - channel_event(int channel_id_, int event_type_); - + Channel_Event(int channel_id_, int event_type_); }; #endif diff --git a/src/core/libs/channel_status_msg_receiver.cc b/src/core/libs/channel_status_msg_receiver.cc index 2dd58bc4f..bed7f1ff2 100644 --- a/src/core/libs/channel_status_msg_receiver.cc +++ b/src/core/libs/channel_status_msg_receiver.cc @@ -1,11 +1,11 @@ /*! * \file channel_status_msg_receiver.cc * \brief GNU Radio block that receives asynchronous channel messages from acquisition and tracking blocks - * \author Javier Arribas, 2016. jarribas(at)cttc.es + * \author Javier Arribas, 2019. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * - * Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) + * Copyright (C) 2010-2019 (see AUTHORS file for a list of contributors) * * GNSS-SDR is a software defined Global Navigation * Satellite Systems receiver @@ -75,12 +75,12 @@ void channel_status_msg_receiver::msg_handler_events(const pmt::pmt_t& msg) d_channel_status_map.erase(gnss_synchro_obj->Channel_ID); } - // std::cout << "-------- \n\n"; - // for (std::map>::iterator it = d_channel_status_map.begin(); it != d_channel_status_map.end(); ++it) - // { - // std::cout << " Channel: " << it->first << " => Doppler: " << it->second->Carrier_Doppler_hz << "[Hz] \n"; - // } - // std::cout << "-------- \n\n"; + // std::cout << "-------- " << std::endl << std::endl; + // for (std::map>::iterator it = d_channel_status_map.begin(); it != d_channel_status_map.end(); ++it) + // { + // std::cout << " Channel: " << it->first << " => Doppler: " << it->second->Carrier_Doppler_hz << "[Hz] " << std::endl; + // } + // std::cout << "-------- " << std::endl << std::endl; } else if (pmt::any_ref(msg).type() == typeid(std::shared_ptr)) { @@ -88,10 +88,10 @@ void channel_status_msg_receiver::msg_handler_events(const pmt::pmt_t& msg) std::shared_ptr monitor_pvt_obj; monitor_pvt_obj = boost::any_cast>(pmt::any_ref(msg)); d_pvt_status = *monitor_pvt_obj.get(); - // - // std::cout << "-------- \n\n"; - // std::cout << "PVT TOW: " << d_pvt_status->TOW_at_current_symbol_ms << std::endl; - // std::cout << "-------- \n\n"; + + // std::cout << "-------- " << std::endl << std::endl; + // std::cout << "PVT TOW: " << d_pvt_status->TOW_at_current_symbol_ms << std::endl; + // std::cout << "-------- " << std::endl << std::endl; } else { @@ -104,11 +104,14 @@ void channel_status_msg_receiver::msg_handler_events(const pmt::pmt_t& msg) } } + std::map> channel_status_msg_receiver::get_current_status_map() { gr::thread::scoped_lock lock(d_setlock); // require mutex with msg_handler_events function called by the scheduler return d_channel_status_map; } + + Monitor_Pvt channel_status_msg_receiver::get_current_status_pvt() { gr::thread::scoped_lock lock(d_setlock); // require mutex with msg_handler_events function called by the scheduler diff --git a/src/core/libs/channel_status_msg_receiver.h b/src/core/libs/channel_status_msg_receiver.h index a4259834e..196484ed4 100644 --- a/src/core/libs/channel_status_msg_receiver.h +++ b/src/core/libs/channel_status_msg_receiver.h @@ -1,11 +1,11 @@ /*! * \file channel_msg_receiver_cc.h * \brief GNU Radio block that receives asynchronous channel messages from acquisition and tracking blocks - * \author Javier Arribas, 2016. jarribas(at)cttc.es + * \author Javier Arribas, 2019. jarribas(at)cttc.es * * ------------------------------------------------------------------------- * - * Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) + * Copyright (C) 2010-2019 (see AUTHORS file for a list of contributors) * * GNSS-SDR is a software defined Global Navigation * Satellite Systems receiver @@ -50,10 +50,12 @@ class channel_status_msg_receiver : public gr::block { public: ~channel_status_msg_receiver(); //!< Default destructor + /*! * \brief return the current status map of all channels with valid telemetry */ std::map> get_current_status_map(); + /*! * \brief return the current receiver PVT */ @@ -63,7 +65,6 @@ private: friend channel_status_msg_receiver_sptr channel_status_msg_receiver_make(); channel_status_msg_receiver(); std::map> d_channel_status_map; - Monitor_Pvt d_pvt_status{}; void msg_handler_events(const pmt::pmt_t& msg); }; diff --git a/src/core/receiver/command_event.cc b/src/core/libs/command_event.cc similarity index 91% rename from src/core/receiver/command_event.cc rename to src/core/libs/command_event.cc index 771061255..c3e8e8180 100644 --- a/src/core/receiver/command_event.cc +++ b/src/core/libs/command_event.cc @@ -32,10 +32,10 @@ command_event_sptr command_event_make(int command_id, int event_type) { - return command_event_sptr(new command_event(command_id, event_type)); + return command_event_sptr(new Command_Event(command_id, event_type)); } -command_event::command_event(int command_id_, int event_type_) +Command_Event::Command_Event(int command_id_, int event_type_) { command_id = command_id_; event_type = event_type_; diff --git a/src/core/receiver/command_event.h b/src/core/libs/command_event.h similarity index 86% rename from src/core/receiver/command_event.h rename to src/core/libs/command_event.h index 094281578..674e0ad57 100644 --- a/src/core/receiver/command_event.h +++ b/src/core/libs/command_event.h @@ -28,18 +28,18 @@ * ------------------------------------------------------------------------- */ -#ifndef GNSS_SDR_command_EVENT_H -#define GNSS_SDR_command_EVENT_H +#ifndef GNSS_SDR_COMMAND_EVENT_H +#define GNSS_SDR_COMMAND_EVENT_H #include -class command_event; +class Command_Event; -using command_event_sptr = std::shared_ptr; +using command_event_sptr = std::shared_ptr; command_event_sptr command_event_make(int command_id, int event_type); -class command_event +class Command_Event { public: int command_id; @@ -47,7 +47,7 @@ public: private: friend command_event_sptr command_event_make(int command_id, int event_type); - command_event(int command_id_, int event_type_); + Command_Event(int command_id_, int event_type_); }; #endif diff --git a/src/core/receiver/CMakeLists.txt b/src/core/receiver/CMakeLists.txt index cb709a7e4..08e8bec98 100644 --- a/src/core/receiver/CMakeLists.txt +++ b/src/core/receiver/CMakeLists.txt @@ -24,7 +24,6 @@ set(GNSS_RECEIVER_SOURCES gnss_flowgraph.cc in_memory_configuration.cc tcp_cmd_interface.cc - command_event.cc ) set(GNSS_RECEIVER_HEADERS @@ -36,7 +35,6 @@ set(GNSS_RECEIVER_HEADERS tcp_cmd_interface.h concurrent_map.h concurrent_queue.h - command_event.h ) list(SORT GNSS_RECEIVER_HEADERS) @@ -135,17 +133,11 @@ endif() target_link_libraries(core_receiver PUBLIC - Armadillo::armadillo - Boost::boost - Boost::thread - Gnuradio::runtime - channel_libs core_libs core_monitor + Boost::thread + Gnuradio::runtime PRIVATE - Boost::chrono - Gflags::gflags - Glog::glog signal_source_adapters data_type_adapters input_filter_adapters @@ -157,6 +149,11 @@ target_link_libraries(core_receiver telemetry_decoder_adapters obs_adapters pvt_adapters + Boost::boost + Boost::chrono + Gflags::gflags + Glog::glog + Armadillo::armadillo ) # Fix for Boost Asio < 1.70 diff --git a/src/core/receiver/concurrent_map.h b/src/core/receiver/concurrent_map.h index f3d20f181..08b059c98 100644 --- a/src/core/receiver/concurrent_map.h +++ b/src/core/receiver/concurrent_map.h @@ -31,8 +31,8 @@ #ifndef GNSS_SDR_CONCURRENT_MAP_H #define GNSS_SDR_CONCURRENT_MAP_H -#include #include +#include #include @@ -49,7 +49,7 @@ class Concurrent_Map public: void write(int key, Data const& data) { - boost::mutex::scoped_lock lock(the_mutex); + std::unique_lock lock(the_mutex); Data_iterator data_iter; data_iter = the_map.find(key); if (data_iter != the_map.end()) @@ -65,7 +65,7 @@ public: std::map get_map_copy() { - boost::mutex::scoped_lock lock(the_mutex); + std::unique_lock lock(the_mutex); std::map map_aux = the_map; lock.unlock(); return map_aux; @@ -73,7 +73,7 @@ public: size_t size() { - boost::mutex::scoped_lock lock(the_mutex); + std::unique_lock lock(the_mutex); size_t size_ = the_map.size(); lock.unlock(); return size_; @@ -81,7 +81,7 @@ public: bool read(int key, Data& p_data) { - boost::mutex::scoped_lock lock(the_mutex); + std::unique_lock lock(the_mutex); Data_iterator data_iter; data_iter = the_map.find(key); if (data_iter != the_map.end()) @@ -96,7 +96,7 @@ public: private: std::map the_map; - boost::mutex the_mutex; + mutable std::mutex the_mutex; }; #endif diff --git a/src/core/receiver/control_thread.cc b/src/core/receiver/control_thread.cc index 919a658a7..629957959 100644 --- a/src/core/receiver/control_thread.cc +++ b/src/core/receiver/control_thread.cc @@ -60,6 +60,8 @@ #include "rtklib_conversions.h" // for alm_to_rtklib #include "rtklib_ephemeris.h" // for alm2pos, eph2pos #include "rtklib_rtkcmn.h" // for utc2gpst +#include // for interaction with geofunctions +#include // for steady_clock #include // for bad_lexical_cast #include // for LOG #include // for make_any @@ -67,7 +69,6 @@ #include // for array #include // for milliseconds #include // for floor, fmod, log -#include // for gmtime, strftime #include // for exception #include // for operator<<, endl #include // for numeric_limits @@ -225,6 +226,7 @@ void ControlThread::telecommand_listener() } } + void ControlThread::event_dispatcher(bool &valid_event, pmt::pmt_t &msg) { if (valid_event) @@ -270,6 +272,7 @@ void ControlThread::event_dispatcher(bool &valid_event, pmt::pmt_t &msg) } } + /* * Runs the control thread that manages the receiver control plane * @@ -813,9 +816,9 @@ void ControlThread::assist_GNSS() if ((agnss_ref_location_.valid == true) and ((enable_gps_supl_assistance == true) or (enable_agnss_xml == true))) { // Get the list of visible satellites - arma::vec ref_LLH = arma::zeros(3, 1); - ref_LLH(0) = agnss_ref_location_.lat; - ref_LLH(1) = agnss_ref_location_.lon; + std::array ref_LLH{}; + ref_LLH[0] = agnss_ref_location_.lat; + ref_LLH[1] = agnss_ref_location_.lon; time_t ref_rx_utc_time = 0; if (agnss_ref_time_.valid == true) { @@ -885,10 +888,10 @@ void ControlThread::apply_action(unsigned int what) } -std::vector> ControlThread::get_visible_sats(time_t rx_utc_time, const arma::vec &LLH) +std::vector> ControlThread::get_visible_sats(time_t rx_utc_time, const std::array &LLH) { // 1. Compute rx ECEF position from LLH WGS84 - arma::vec LLH_rad = arma::vec{degtorad(LLH(0)), degtorad(LLH(1)), LLH(2)}; + arma::vec LLH_rad = arma::vec{degtorad(LLH[0]), degtorad(LLH[1]), LLH[2]}; arma::mat C_tmp = arma::zeros(3, 3); arma::vec r_eb_e = arma::zeros(3, 1); arma::vec v_eb_e = arma::zeros(3, 1); @@ -912,7 +915,7 @@ std::vector> ControlThread::get_visible_sats(time strftime(buf, sizeof(buf), "%d/%m/%Y %H:%M:%S ", &tstruct); std::string str_time = std::string(buf); std::cout << "Get visible satellites at " << str_time - << "UTC, assuming RX position " << LLH(0) << " [deg], " << LLH(1) << " [deg], " << LLH(2) << " [m]" << std::endl; + << "UTC, assuming RX position " << LLH[0] << " [deg], " << LLH[1] << " [deg], " << LLH[2] << " [m]" << std::endl; std::map gps_eph_map = pvt_ptr->get_gps_ephemeris(); for (auto &it : gps_eph_map) diff --git a/src/core/receiver/control_thread.h b/src/core/receiver/control_thread.h index 5fa84f791..0459acd50 100644 --- a/src/core/receiver/control_thread.h +++ b/src/core/receiver/control_thread.h @@ -9,7 +9,7 @@ * * ------------------------------------------------------------------------- * - * Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) + * Copyright (C) 2010-2019 (see AUTHORS file for a list of contributors) * * GNSS-SDR is a software defined Global Navigation * Satellite Systems receiver @@ -35,15 +35,15 @@ #ifndef GNSS_SDR_CONTROL_THREAD_H_ #define GNSS_SDR_CONTROL_THREAD_H_ -#include "agnss_ref_location.h" // for Agnss_Ref_Location -#include "agnss_ref_time.h" // for Agnss_Ref_Time -#include "concurrent_queue.h" +#include "agnss_ref_location.h" // for Agnss_Ref_Location +#include "agnss_ref_time.h" // for Agnss_Ref_Time +#include "concurrent_queue.h" // for Concurrent_Queue #include "gnss_sdr_supl_client.h" // for Gnss_Sdr_Supl_Client #include "tcp_cmd_interface.h" // for TcpCmdInterface -#include // for arma::vec #include // for boost::thread #include -#include // for time_t +#include // for array +#include // for time_t (gmtime, strftime in implementation) #include // for shared_ptr #include // for string #include // for std::thread @@ -75,7 +75,9 @@ public: */ ControlThread(std::shared_ptr configuration); - //! \brief Destructor + /*! + * \brief Destructor + */ ~ControlThread(); /*! \brief Runs the control thread @@ -99,12 +101,12 @@ public: */ void set_control_queue(const std::shared_ptr> control_queue); // NOLINT(performance-unnecessary-value-param) - unsigned int processed_control_messages() + unsigned int processed_control_messages() const { return processed_control_messages_; } - unsigned int applied_actions() + unsigned int applied_actions() const { return applied_actions_; } @@ -120,15 +122,18 @@ public: } private: - //Telecommand TCP interface + // Telecommand TCP interface TcpCmdInterface cmd_interface_; void telecommand_listener(); + /* * New receiver event dispatcher */ void event_dispatcher(bool &valid_event, pmt::pmt_t &msg); + std::thread cmd_interface_thread_; - //SUPL assistance classes + + // SUPL assistance classes Gnss_Sdr_Supl_Client supl_client_acquisition_; Gnss_Sdr_Supl_Client supl_client_ephemeris_; int supl_mcc; // Current network MCC (Mobile country code), 3 digits. @@ -141,9 +146,6 @@ private: // Read {ephemeris, iono, utc, ref loc, ref time} assistance from a local XML file previously recorded bool read_assistance_from_XML(); - // Save {ephemeris, iono, utc, ref loc, ref time} assistance to a local XML file - //bool save_assistance_to_XML(); - /* * Blocking function that reads the GPS assistance queue */ @@ -153,7 +155,7 @@ private: * Compute elevations for the specified time and position for all the available satellites in ephemeris and almanac queues * returns a vector filled with the available satellites ordered from high elevation to low elevation angle. */ - std::vector> get_visible_sats(time_t rx_utc_time, const arma::vec &LLH); + std::vector> get_visible_sats(time_t rx_utc_time, const std::array &LLH); /* * Read initial GNSS assistance from SUPL server or local XML files diff --git a/src/core/receiver/gnss_flowgraph.cc b/src/core/receiver/gnss_flowgraph.cc index 7f7558599..36ec45e61 100644 --- a/src/core/receiver/gnss_flowgraph.cc +++ b/src/core/receiver/gnss_flowgraph.cc @@ -64,7 +64,6 @@ #include // for set #include // for invalid_argument #include // for thread -#include // for move #ifdef GR_GREATER_38 #include #else @@ -1295,7 +1294,10 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) push_back_signal(gs); } channels_state_[who] = 0; - if (acq_channels_count_ > 0) acq_channels_count_--; + if (acq_channels_count_ > 0) + { + acq_channels_count_--; + } // call the acquisition manager to assign new satellite and start next acquisition (if required) acquisition_manager(who); break; @@ -1305,7 +1307,10 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) remove_signal(channels_[who]->get_signal()); channels_state_[who] = 2; - if (acq_channels_count_ > 0) acq_channels_count_--; + if (acq_channels_count_ > 0) + { + acq_channels_count_--; + } // call the acquisition manager to assign new satellite and start next acquisition (if required) acquisition_manager(who); break; @@ -1900,18 +1905,18 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal std::map> current_channels_status = channels_status_->get_current_status_map(); // 2. search the currently tracked GPS L1 satellites and assist the GPS L2 acquisition if the satellite is not tracked on L2 bool found_signal = false; - for (std::map>::iterator it = current_channels_status.begin(); it != current_channels_status.end(); ++it) + for (auto& current_status : current_channels_status) { - if (std::string(it->second->Signal) == "1C") + if (std::string(current_status.second->Signal) == "1C") { std::list::iterator it2; it2 = std::find_if(std::begin(available_GPS_2S_signals_), std::end(available_GPS_2S_signals_), - [&](Gnss_Signal const& sig) { return sig.get_satellite().get_PRN() == it->second->PRN; }); + [&](Gnss_Signal const& sig) { return sig.get_satellite().get_PRN() == current_status.second->PRN; }); if (it2 != available_GPS_2S_signals_.end()) { - estimated_doppler = it->second->Carrier_Doppler_hz; - RX_time = it->second->RX_time; + estimated_doppler = current_status.second->Carrier_Doppler_hz; + RX_time = current_status.second->RX_time; // std::cout << " Channel: " << it->first << " => Doppler: " << estimated_doppler << "[Hz] \n"; // 3. return the GPS L2 satellite and remove it from list result = *it2; @@ -1953,18 +1958,18 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal // 1. Get the current channel status map std::map> current_channels_status = channels_status_->get_current_status_map(); // 2. search the currently tracked GPS L1 satellites and assist the GPS L5 acquisition if the satellite is not tracked on L5 - for (std::map>::iterator it = current_channels_status.begin(); it != current_channels_status.end(); ++it) + for (auto& current_status : current_channels_status) { - if (std::string(it->second->Signal) == "1C") + if (std::string(current_status.second->Signal) == "1C") { std::list::iterator it2; it2 = std::find_if(std::begin(available_GPS_L5_signals_), std::end(available_GPS_L5_signals_), - [&](Gnss_Signal const& sig) { return sig.get_satellite().get_PRN() == it->second->PRN; }); + [&](Gnss_Signal const& sig) { return sig.get_satellite().get_PRN() == current_status.second->PRN; }); if (it2 != available_GPS_L5_signals_.end()) { - estimated_doppler = it->second->Carrier_Doppler_hz; - RX_time = it->second->RX_time; + estimated_doppler = current_status.second->Carrier_Doppler_hz; + RX_time = current_status.second->RX_time; // std::cout << " Channel: " << it->first << " => Doppler: " << estimated_doppler << "[Hz] \n"; // 3. return the GPS L5 satellite and remove it from list result = *it2; @@ -2007,18 +2012,18 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal // 1. Get the current channel status map std::map> current_channels_status = channels_status_->get_current_status_map(); // 2. search the currently tracked Galileo E1 satellites and assist the Galileo E5 acquisition if the satellite is not tracked on E5 - for (std::map>::iterator it = current_channels_status.begin(); it != current_channels_status.end(); ++it) + for (auto& current_status : current_channels_status) { - if (std::string(it->second->Signal) == "1B") + if (std::string(current_status.second->Signal) == "1B") { std::list::iterator it2; it2 = std::find_if(std::begin(available_GAL_5X_signals_), std::end(available_GAL_5X_signals_), - [&](Gnss_Signal const& sig) { return sig.get_satellite().get_PRN() == it->second->PRN; }); + [&](Gnss_Signal const& sig) { return sig.get_satellite().get_PRN() == current_status.second->PRN; }); if (it2 != available_GAL_5X_signals_.end()) { - estimated_doppler = it->second->Carrier_Doppler_hz; - RX_time = it->second->RX_time; + estimated_doppler = current_status.second->Carrier_Doppler_hz; + RX_time = current_status.second->RX_time; // std::cout << " Channel: " << it->first << " => Doppler: " << estimated_doppler << "[Hz] \n"; // 3. return the Gal 5X satellite and remove it from list result = *it2; diff --git a/src/core/receiver/gnss_flowgraph.h b/src/core/receiver/gnss_flowgraph.h index d60995b36..6e52cff1f 100644 --- a/src/core/receiver/gnss_flowgraph.h +++ b/src/core/receiver/gnss_flowgraph.h @@ -11,7 +11,7 @@ * * ------------------------------------------------------------------------- * - * Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) + * Copyright (C) 2010-2019 (see AUTHORS file for a list of contributors) * * GNSS-SDR is a software defined Global Navigation * Satellite Systems receiver @@ -42,7 +42,7 @@ #include "gnss_sdr_sample_counter.h" #include "gnss_signal.h" #include "pvt_interface.h" -#include //for null_sink +#include // for null_sink #include // for basic_block_sptr, top_block_sptr #include // for pmt_t #include // for list @@ -79,10 +79,14 @@ public: */ ~GNSSFlowgraph(); - //! \brief Start the flow graph + /*! + * \brief Start the flow graph + */ void start(); - //! \brief Stop the flow graph + /*! + * \brief Stop the flow graph + */ void stop(); /*! @@ -92,16 +96,27 @@ public: */ void connect(); + /*! + * \brief Disconnect the blocks in the flow graph + */ void disconnect(); + /*! + * \brief Wait for a flowgraph to complete. + * + * Flowgraphs complete when either + * (1) all blocks indicate that they are done, or + * (2) after stop() has been called to request shutdown. + */ void wait(); -#ifdef ENABLE_FPGA - void start_acquisition_helper(); - - void perform_hw_reset(); -#endif + /*! + * \brief Manage satellite acquisition + * + * \param[in] who Channel ID + */ void acquisition_manager(unsigned int who); + /*! * \brief Applies an action to the flow graph * @@ -110,10 +125,9 @@ public: */ void apply_action(unsigned int who, unsigned int what); - - void push_back_signal(const Gnss_Signal& gs); - void remove_signal(const Gnss_Signal& gs); - + /*! + * \brief Set flow graph configuratiob + */ void set_configuration(std::shared_ptr configuration); bool connected() const @@ -127,7 +141,7 @@ public: } /*! - * \brief Sends a GNURadio asynchronous message from telemetry to PVT + * \brief Sends a GNU Radio asynchronous message from telemetry to PVT * * It is used to assist the receiver with external ephemeris data */ @@ -146,6 +160,12 @@ public: */ void priorize_satellites(const std::vector>& visible_satellites); +#ifdef ENABLE_FPGA + void start_acquisition_helper(); + + void perform_hw_reset(); +#endif + private: void init(); // Populates the SV PRN list available for acquisition and tracking void set_signals_list(); @@ -157,6 +177,10 @@ private: bool& assistance_available, float& estimated_doppler, double& RX_time); + + void push_back_signal(const Gnss_Signal& gs); + void remove_signal(const Gnss_Signal& gs); + bool connected_; bool running_; int sources_count_; @@ -209,7 +233,7 @@ private: std::map mapStringValues_; std::vector channels_state_; - channel_status_msg_receiver_sptr channels_status_; //class that receives and stores the current status of the receiver channels + channel_status_msg_receiver_sptr channels_status_; // class that receives and stores the current status of the receiver channels std::mutex signal_list_mutex; bool enable_monitor_; @@ -217,4 +241,4 @@ private: std::vector split_string(const std::string& s, char delim); }; -#endif /*GNSS_SDR_GNSS_FLOWGRAPH_H_*/ +#endif /* GNSS_SDR_GNSS_FLOWGRAPH_H_ */ diff --git a/src/core/receiver/tcp_cmd_interface.cc b/src/core/receiver/tcp_cmd_interface.cc index f274c82dc..20d3618a6 100644 --- a/src/core/receiver/tcp_cmd_interface.cc +++ b/src/core/receiver/tcp_cmd_interface.cc @@ -33,7 +33,6 @@ #include "command_event.h" #include "pvt_interface.h" #include -#include #include // for isnan #include // for exception #include // for setprecision @@ -51,9 +50,9 @@ TcpCmdInterface::TcpCmdInterface() register_functions(); keep_running_ = true; control_queue_ = nullptr; - rx_latitude_ = 0; - rx_longitude_ = 0; - rx_altitude_ = 0; + rx_latitude_ = 0.0; + rx_longitude_ = 0.0; + rx_altitude_ = 0.0; receiver_utc_time_ = 0; } @@ -85,9 +84,9 @@ time_t TcpCmdInterface::get_utc_time() } -arma::vec TcpCmdInterface::get_LLH() +std::array TcpCmdInterface::get_LLH() const { - return arma::vec{rx_latitude_, rx_longitude_, rx_altitude_}; + return std::array{rx_latitude_, rx_longitude_, rx_altitude_}; } @@ -192,9 +191,9 @@ std::string TcpCmdInterface::hotstart(const std::vector &commandLin receiver_utc_time_ = timegm(&tm); // Read latitude, longitude, and height - rx_latitude_ = std::stod(commandLine.at(3).c_str()); - rx_longitude_ = std::stod(commandLine.at(4).c_str()); - rx_altitude_ = std::stod(commandLine.at(5).c_str()); + rx_latitude_ = std::stof(commandLine.at(3).c_str()); + rx_longitude_ = std::stof(commandLine.at(4).c_str()); + rx_altitude_ = std::stof(commandLine.at(5).c_str()); if (std::isnan(rx_latitude_) || std::isnan(rx_longitude_) || std::isnan(rx_altitude_)) { diff --git a/src/core/receiver/tcp_cmd_interface.h b/src/core/receiver/tcp_cmd_interface.h index 0b6276e92..993a68312 100644 --- a/src/core/receiver/tcp_cmd_interface.h +++ b/src/core/receiver/tcp_cmd_interface.h @@ -33,8 +33,8 @@ #include "concurrent_queue.h" -#include #include +#include #include #include #include @@ -61,7 +61,7 @@ public: /*! * \brief gets the Latitude, Longitude and Altitude vector from the last TC command issued */ - arma::vec get_LLH(); + std::array get_LLH() const; void set_pvt(std::shared_ptr PVT_sptr); @@ -83,9 +83,9 @@ private: time_t receiver_utc_time_; - double rx_latitude_; - double rx_longitude_; - double rx_altitude_; + float rx_latitude_; + float rx_longitude_; + float rx_altitude_; std::shared_ptr PVT_sptr_; }; From 6e5c79d14439701f2275c240852071f0cf39ad44 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sun, 21 Jul 2019 13:12:46 +0200 Subject: [PATCH 25/36] Fix compiler ambiguity --- src/algorithms/libs/pass_through.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/algorithms/libs/pass_through.cc b/src/algorithms/libs/pass_through.cc index 4ecf9edb4..549740b84 100644 --- a/src/algorithms/libs/pass_through.cc +++ b/src/algorithms/libs/pass_through.cc @@ -109,7 +109,7 @@ Pass_Through::Pass_Through(ConfigurationInterface* configuration, const std::str } kludge_copy_ = gr::blocks::copy::make(item_size_); - uint64_t max_source_buffer_samples = configuration->property("GNSS-SDR.max_source_buffer_samples", 0ULL); + uint64_t max_source_buffer_samples = configuration->property("GNSS-SDR.max_source_buffer_samples", 0); if (max_source_buffer_samples > 0) { kludge_copy_->set_max_output_buffer(max_source_buffer_samples); From be86771edeaf9643f5abfcf7fa831a6235fb76a2 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sun, 21 Jul 2019 19:32:52 +0200 Subject: [PATCH 26/36] Move default destructor to header file, so compiler can make a better job --- .../adapters/beidou_b1i_pcps_acquisition.cc | 5 +- .../adapters/beidou_b1i_pcps_acquisition.h | 2 +- .../adapters/beidou_b3i_pcps_acquisition.cc | 3 - .../adapters/beidou_b3i_pcps_acquisition.h | 2 +- ...lileo_e1_pcps_8ms_ambiguous_acquisition.cc | 3 - ...alileo_e1_pcps_8ms_ambiguous_acquisition.h | 2 +- .../galileo_e1_pcps_ambiguous_acquisition.cc | 3 - .../galileo_e1_pcps_ambiguous_acquisition.h | 2 +- ...ileo_e1_pcps_ambiguous_acquisition_fpga.cc | 3 - ...lileo_e1_pcps_ambiguous_acquisition_fpga.h | 2 +- ...eo_e1_pcps_cccwsr_ambiguous_acquisition.cc | 3 - ...leo_e1_pcps_cccwsr_ambiguous_acquisition.h | 2 +- ...e1_pcps_quicksync_ambiguous_acquisition.cc | 3 - ..._e1_pcps_quicksync_ambiguous_acquisition.h | 2 +- ...ileo_e1_pcps_tong_ambiguous_acquisition.cc | 3 - ...lileo_e1_pcps_tong_ambiguous_acquisition.h | 2 +- ...ileo_e5a_noncoherent_iq_acquisition_caf.cc | 3 - ...lileo_e5a_noncoherent_iq_acquisition_caf.h | 2 +- .../adapters/galileo_e5a_pcps_acquisition.cc | 3 - .../adapters/galileo_e5a_pcps_acquisition.h | 2 +- .../galileo_e5a_pcps_acquisition_fpga.cc | 3 - .../galileo_e5a_pcps_acquisition_fpga.h | 2 +- .../glonass_l1_ca_pcps_acquisition.cc | 3 - .../adapters/glonass_l1_ca_pcps_acquisition.h | 2 +- .../glonass_l2_ca_pcps_acquisition.cc | 3 - .../adapters/glonass_l2_ca_pcps_acquisition.h | 2 +- .../adapters/gps_l1_ca_pcps_acquisition.cc | 3 - .../adapters/gps_l1_ca_pcps_acquisition.h | 2 +- ...gps_l1_ca_pcps_acquisition_fine_doppler.cc | 3 - .../gps_l1_ca_pcps_acquisition_fine_doppler.h | 2 +- .../gps_l1_ca_pcps_acquisition_fpga.cc | 3 - .../gps_l1_ca_pcps_acquisition_fpga.h | 2 +- .../gps_l1_ca_pcps_assisted_acquisition.cc | 3 - .../gps_l1_ca_pcps_assisted_acquisition.h | 2 +- .../gps_l1_ca_pcps_opencl_acquisition.cc | 3 - .../gps_l1_ca_pcps_opencl_acquisition.h | 2 +- .../gps_l1_ca_pcps_quicksync_acquisition.cc | 3 - .../gps_l1_ca_pcps_quicksync_acquisition.h | 2 +- .../gps_l1_ca_pcps_tong_acquisition.cc | 3 - .../gps_l1_ca_pcps_tong_acquisition.h | 2 +- .../adapters/gps_l2_m_pcps_acquisition.cc | 3 - .../adapters/gps_l2_m_pcps_acquisition.h | 2 +- .../gps_l2_m_pcps_acquisition_fpga.cc | 3 - .../adapters/gps_l2_m_pcps_acquisition_fpga.h | 2 +- .../adapters/gps_l5i_pcps_acquisition.cc | 3 - .../adapters/gps_l5i_pcps_acquisition.h | 2 +- .../adapters/gps_l5i_pcps_acquisition_fpga.cc | 3 - .../adapters/gps_l5i_pcps_acquisition_fpga.h | 2 +- .../gnuradio_blocks/pcps_acquisition.cc | 3 - .../gnuradio_blocks/pcps_acquisition.h | 2 +- .../gnuradio_blocks/pcps_acquisition_fpga.cc | 3 - .../gnuradio_blocks/pcps_acquisition_fpga.h | 2 +- .../acquisition/libs/fpga_acquisition.cc | 3 - .../acquisition/libs/fpga_acquisition.h | 2 +- src/algorithms/channel/adapters/channel.cc | 3 - src/algorithms/channel/adapters/channel.h | 2 +- .../channel/libs/channel_msg_receiver_cc.cc | 3 - .../channel/libs/channel_msg_receiver_cc.h | 2 +- .../adapters/array_signal_conditioner.cc | 4 - .../adapters/array_signal_conditioner.h | 4 +- .../adapters/signal_conditioner.cc | 4 - .../conditioner/adapters/signal_conditioner.h | 4 +- .../adapters/byte_to_short.cc | 3 - .../adapters/byte_to_short.h | 2 +- .../adapters/ibyte_to_cbyte.cc | 3 - .../adapters/ibyte_to_cbyte.h | 2 +- .../adapters/ibyte_to_complex.cc | 3 - .../adapters/ibyte_to_complex.h | 2 +- .../adapters/ibyte_to_cshort.cc | 3 - .../adapters/ibyte_to_cshort.h | 2 +- .../adapters/ishort_to_complex.cc | 3 - .../adapters/ishort_to_complex.h | 2 +- .../adapters/ishort_to_cshort.cc | 3 - .../adapters/ishort_to_cshort.h | 2 +- .../adapters/beamformer_filter.cc | 3 - .../input_filter/adapters/beamformer_filter.h | 4 +- .../input_filter/adapters/fir_filter.cc | 3 - .../input_filter/adapters/fir_filter.h | 2 +- .../adapters/freq_xlating_fir_filter.cc | 5 +- .../adapters/freq_xlating_fir_filter.h | 2 +- .../input_filter/adapters/notch_filter.cc | 3 - .../input_filter/adapters/notch_filter.h | 4 +- .../adapters/notch_filter_lite.cc | 3 - .../input_filter/adapters/notch_filter_lite.h | 4 +- .../adapters/pulse_blanking_filter.cc | 3 - .../adapters/pulse_blanking_filter.h | 2 +- src/algorithms/libs/pass_through.cc | 3 - src/algorithms/libs/pass_through.h | 2 +- .../adapters/hybrid_observables.cc | 3 - .../observables/adapters/hybrid_observables.h | 2 +- .../adapters/direct_resampler_conditioner.cc | 3 - .../adapters/direct_resampler_conditioner.h | 2 +- .../adapters/mmse_resampler_conditioner.cc | 3 - .../adapters/mmse_resampler_conditioner.h | 2 +- .../direct_resampler_conditioner_cb.cc | 3 - .../direct_resampler_conditioner_cb.h | 2 +- .../direct_resampler_conditioner_cc.cc | 3 - .../direct_resampler_conditioner_cc.h | 2 +- .../direct_resampler_conditioner_cs.cc | 3 - .../direct_resampler_conditioner_cs.h | 2 +- .../adapters/signal_generator.cc | 3 - .../adapters/signal_generator.h | 2 +- .../adapters/custom_udp_signal_source.cc | 3 - .../adapters/custom_udp_signal_source.h | 2 +- .../adapters/file_signal_source.cc | 3 - .../adapters/file_signal_source.h | 2 +- .../adapters/flexiband_signal_source.cc | 3 - .../adapters/flexiband_signal_source.h | 2 +- .../adapters/gn3s_signal_source.cc | 5 - .../adapters/gn3s_signal_source.h | 2 +- .../adapters/labsat_signal_source.cc | 3 - .../adapters/labsat_signal_source.h | 2 +- .../multichannel_file_signal_source.cc | 3 - .../multichannel_file_signal_source.h | 2 +- .../adapters/nsr_file_signal_source.cc | 3 - .../adapters/nsr_file_signal_source.h | 2 +- .../adapters/osmosdr_signal_source.cc | 3 - .../adapters/osmosdr_signal_source.h | 2 +- .../adapters/plutosdr_signal_source.cc | 3 - .../adapters/plutosdr_signal_source.h | 2 +- .../adapters/raw_array_signal_source.cc | 3 - .../adapters/raw_array_signal_source.h | 2 +- .../adapters/rtl_tcp_signal_source.cc | 9 +- .../adapters/rtl_tcp_signal_source.h | 2 +- .../adapters/spir_file_signal_source.cc | 3 - .../adapters/spir_file_signal_source.h | 2 +- .../spir_gss6450_file_signal_source.cc | 3 - .../spir_gss6450_file_signal_source.h | 2 +- .../two_bit_cpx_file_signal_source.cc | 9 +- .../adapters/two_bit_cpx_file_signal_source.h | 2 +- .../two_bit_packed_file_signal_source.cc | 9 +- .../two_bit_packed_file_signal_source.h | 2 +- .../adapters/uhd_signal_source.cc | 3 - .../adapters/uhd_signal_source.h | 2 +- .../gnuradio_blocks/unpack_2bit_samples.cc | 3 - .../gnuradio_blocks/unpack_2bit_samples.h | 2 +- .../unpack_byte_2bit_cpx_samples.cc | 3 - .../unpack_byte_2bit_cpx_samples.h | 2 +- .../unpack_byte_2bit_samples.cc | 3 - .../unpack_byte_2bit_samples.h | 2 +- .../unpack_byte_4bit_samples.cc | 3 - .../unpack_byte_4bit_samples.h | 2 +- .../unpack_intspir_1bit_samples.cc | 3 - .../unpack_intspir_1bit_samples.h | 2 +- .../unpack_spir_gss6450_samples.cc | 3 - .../unpack_spir_gss6450_samples.h | 2 +- .../adapters/beidou_b1i_telemetry_decoder.cc | 3 - .../adapters/beidou_b1i_telemetry_decoder.h | 2 +- .../adapters/beidou_b3i_telemetry_decoder.cc | 5 +- .../adapters/beidou_b3i_telemetry_decoder.h | 2 +- .../adapters/galileo_e1b_telemetry_decoder.cc | 3 - .../adapters/galileo_e1b_telemetry_decoder.h | 2 +- .../adapters/galileo_e5a_telemetry_decoder.cc | 3 - .../adapters/galileo_e5a_telemetry_decoder.h | 2 +- .../glonass_l1_ca_telemetry_decoder.cc | 3 - .../glonass_l1_ca_telemetry_decoder.h | 2 +- .../glonass_l2_ca_telemetry_decoder.cc | 3 - .../glonass_l2_ca_telemetry_decoder.h | 2 +- .../adapters/gps_l1_ca_telemetry_decoder.cc | 3 - .../adapters/gps_l1_ca_telemetry_decoder.h | 2 +- .../adapters/gps_l2c_telemetry_decoder.cc | 3 - .../adapters/gps_l2c_telemetry_decoder.h | 2 +- .../adapters/gps_l5_telemetry_decoder.cc | 3 - .../adapters/gps_l5_telemetry_decoder.h | 2 +- .../adapters/sbas_l1_telemetry_decoder.cc | 3 - .../adapters/sbas_l1_telemetry_decoder.h | 2 +- .../adapters/beidou_b1i_dll_pll_tracking.cc | 4 +- .../adapters/beidou_b1i_dll_pll_tracking.h | 2 +- .../adapters/beidou_b3i_dll_pll_tracking.cc | 3 - .../adapters/beidou_b3i_dll_pll_tracking.h | 2 +- .../galileo_e1_dll_pll_veml_tracking.cc | 3 - .../galileo_e1_dll_pll_veml_tracking.h | 2 +- .../galileo_e1_tcp_connector_tracking.cc | 7 +- .../galileo_e1_tcp_connector_tracking.h | 2 +- .../adapters/galileo_e5a_dll_pll_tracking.cc | 3 - .../adapters/galileo_e5a_dll_pll_tracking.h | 2 +- .../glonass_l1_ca_dll_pll_c_aid_tracking.cc | 3 - .../glonass_l1_ca_dll_pll_c_aid_tracking.h | 2 +- .../glonass_l1_ca_dll_pll_tracking.cc | 3 - .../adapters/glonass_l1_ca_dll_pll_tracking.h | 2 +- .../glonass_l2_ca_dll_pll_c_aid_tracking.cc | 3 - .../glonass_l2_ca_dll_pll_c_aid_tracking.h | 2 +- .../glonass_l2_ca_dll_pll_tracking.cc | 3 - .../adapters/glonass_l2_ca_dll_pll_tracking.h | 2 +- .../adapters/gps_l1_ca_dll_pll_tracking.cc | 3 - .../adapters/gps_l1_ca_dll_pll_tracking.h | 2 +- .../adapters/gps_l1_ca_kf_tracking.cc | 3 - .../tracking/adapters/gps_l1_ca_kf_tracking.h | 2 +- .../gps_l1_ca_tcp_connector_tracking.cc | 7 +- .../gps_l1_ca_tcp_connector_tracking.h | 5 +- .../adapters/gps_l2_m_dll_pll_tracking.cc | 4 +- .../adapters/gps_l2_m_dll_pll_tracking.h | 3 +- .../adapters/gps_l5_dll_pll_tracking.cc | 3 - .../adapters/gps_l5_dll_pll_tracking.h | 2 +- .../tracking/libs/bayesian_estimation.cc | 12 +- .../tracking/libs/bayesian_estimation.h | 8 +- .../tracking/libs/nonlinear_tracking.cc | 7 -- .../tracking/libs/nonlinear_tracking.h | 4 +- .../tracking/libs/tcp_communication.cc | 3 - .../tracking/libs/tcp_communication.h | 2 +- .../tracking/libs/tcp_packet_data.cc | 2 - .../tracking/libs/tcp_packet_data.h | 2 +- .../tracking/libs/tracking_2nd_DLL_filter.cc | 5 +- .../tracking/libs/tracking_2nd_DLL_filter.h | 2 +- .../tracking/libs/tracking_2nd_PLL_filter.cc | 3 - .../tracking/libs/tracking_2nd_PLL_filter.h | 2 +- .../tracking/libs/tracking_FLL_PLL_filter.cc | 3 - .../tracking/libs/tracking_FLL_PLL_filter.h | 2 +- src/core/libs/channel_status_msg_receiver.cc | 3 - src/core/libs/channel_status_msg_receiver.h | 2 +- src/core/libs/gnss_sdr_sample_counter.cc | 3 - src/core/libs/gnss_sdr_sample_counter.h | 2 +- src/core/libs/gnss_sdr_supl_client.cc | 3 - src/core/libs/gnss_sdr_supl_client.h | 2 +- src/core/libs/gnss_sdr_time_counter.cc | 3 - src/core/libs/gnss_sdr_time_counter.h | 2 +- src/core/libs/string_converter.cc | 6 - src/core/libs/string_converter.h | 4 +- src/core/monitor/gnss_synchro_monitor.cc | 3 - src/core/monitor/gnss_synchro_monitor.h | 2 +- src/core/receiver/gnss_block_factory.cc | 94 +++++++------- src/core/receiver/gnss_block_factory.h | 4 +- src/core/receiver/tcp_cmd_interface.cc | 3 - src/core/receiver/tcp_cmd_interface.h | 2 +- src/utils/front-end-cal/front_end_cal.cc | 3 - src/utils/front-end-cal/front_end_cal.h | 117 +++++++++--------- 226 files changed, 259 insertions(+), 593 deletions(-) diff --git a/src/algorithms/acquisition/adapters/beidou_b1i_pcps_acquisition.cc b/src/algorithms/acquisition/adapters/beidou_b1i_pcps_acquisition.cc index 27dad02cd..d3d73b2ca 100644 --- a/src/algorithms/acquisition/adapters/beidou_b1i_pcps_acquisition.cc +++ b/src/algorithms/acquisition/adapters/beidou_b1i_pcps_acquisition.cc @@ -133,10 +133,7 @@ BeidouB1iPcpsAcquisition::BeidouB1iPcpsAcquisition( { LOG(ERROR) << "This implementation does not provide an output stream"; } -} - - -BeidouB1iPcpsAcquisition::~BeidouB1iPcpsAcquisition() = default; +}; void BeidouB1iPcpsAcquisition::stop_acquisition() diff --git a/src/algorithms/acquisition/adapters/beidou_b1i_pcps_acquisition.h b/src/algorithms/acquisition/adapters/beidou_b1i_pcps_acquisition.h index 0c2e611e2..5136a9d50 100644 --- a/src/algorithms/acquisition/adapters/beidou_b1i_pcps_acquisition.h +++ b/src/algorithms/acquisition/adapters/beidou_b1i_pcps_acquisition.h @@ -60,7 +60,7 @@ public: const std::string& role, unsigned int in_streams, unsigned int out_streams); - virtual ~BeidouB1iPcpsAcquisition(); + ~BeidouB1iPcpsAcquisition() = default; inline std::string role() override { diff --git a/src/algorithms/acquisition/adapters/beidou_b3i_pcps_acquisition.cc b/src/algorithms/acquisition/adapters/beidou_b3i_pcps_acquisition.cc index bdeede24e..2fbf4a5a7 100644 --- a/src/algorithms/acquisition/adapters/beidou_b3i_pcps_acquisition.cc +++ b/src/algorithms/acquisition/adapters/beidou_b3i_pcps_acquisition.cc @@ -134,9 +134,6 @@ BeidouB3iPcpsAcquisition::BeidouB3iPcpsAcquisition( } -BeidouB3iPcpsAcquisition::~BeidouB3iPcpsAcquisition() = default; - - void BeidouB3iPcpsAcquisition::stop_acquisition() { } diff --git a/src/algorithms/acquisition/adapters/beidou_b3i_pcps_acquisition.h b/src/algorithms/acquisition/adapters/beidou_b3i_pcps_acquisition.h index c57f28127..2ea6b3284 100644 --- a/src/algorithms/acquisition/adapters/beidou_b3i_pcps_acquisition.h +++ b/src/algorithms/acquisition/adapters/beidou_b3i_pcps_acquisition.h @@ -59,7 +59,7 @@ public: const std::string& role, unsigned int in_streams, unsigned int out_streams); - virtual ~BeidouB3iPcpsAcquisition(); + ~BeidouB3iPcpsAcquisition() = default; inline std::string role() override { diff --git a/src/algorithms/acquisition/adapters/galileo_e1_pcps_8ms_ambiguous_acquisition.cc b/src/algorithms/acquisition/adapters/galileo_e1_pcps_8ms_ambiguous_acquisition.cc index 2e3042277..992da896a 100644 --- a/src/algorithms/acquisition/adapters/galileo_e1_pcps_8ms_ambiguous_acquisition.cc +++ b/src/algorithms/acquisition/adapters/galileo_e1_pcps_8ms_ambiguous_acquisition.cc @@ -123,9 +123,6 @@ GalileoE1Pcps8msAmbiguousAcquisition::GalileoE1Pcps8msAmbiguousAcquisition( } -GalileoE1Pcps8msAmbiguousAcquisition::~GalileoE1Pcps8msAmbiguousAcquisition() = default; - - void GalileoE1Pcps8msAmbiguousAcquisition::stop_acquisition() { } diff --git a/src/algorithms/acquisition/adapters/galileo_e1_pcps_8ms_ambiguous_acquisition.h b/src/algorithms/acquisition/adapters/galileo_e1_pcps_8ms_ambiguous_acquisition.h index a3be14fce..2371c0793 100644 --- a/src/algorithms/acquisition/adapters/galileo_e1_pcps_8ms_ambiguous_acquisition.h +++ b/src/algorithms/acquisition/adapters/galileo_e1_pcps_8ms_ambiguous_acquisition.h @@ -54,7 +54,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GalileoE1Pcps8msAmbiguousAcquisition(); + ~GalileoE1Pcps8msAmbiguousAcquisition() = default; inline std::string role() override { diff --git a/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition.cc b/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition.cc index 2d31a2c84..bf97d2df3 100644 --- a/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition.cc +++ b/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition.cc @@ -167,9 +167,6 @@ GalileoE1PcpsAmbiguousAcquisition::GalileoE1PcpsAmbiguousAcquisition( } -GalileoE1PcpsAmbiguousAcquisition::~GalileoE1PcpsAmbiguousAcquisition() = default; - - void GalileoE1PcpsAmbiguousAcquisition::stop_acquisition() { } diff --git a/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition.h b/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition.h index 92c25724b..79b2a1f41 100644 --- a/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition.h +++ b/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition.h @@ -58,7 +58,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GalileoE1PcpsAmbiguousAcquisition(); + ~GalileoE1PcpsAmbiguousAcquisition() = default; inline std::string role() override { 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 e1021b6b7..d434178ab 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 @@ -194,9 +194,6 @@ GalileoE1PcpsAmbiguousAcquisitionFpga::GalileoE1PcpsAmbiguousAcquisitionFpga( } -GalileoE1PcpsAmbiguousAcquisitionFpga::~GalileoE1PcpsAmbiguousAcquisitionFpga() = default; - - void GalileoE1PcpsAmbiguousAcquisitionFpga::stop_acquisition() { // this command causes the SW to reset the HW. 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 a92b65e31..07478f380 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 @@ -56,7 +56,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GalileoE1PcpsAmbiguousAcquisitionFpga(); + ~GalileoE1PcpsAmbiguousAcquisitionFpga() = default; inline std::string role() override { diff --git a/src/algorithms/acquisition/adapters/galileo_e1_pcps_cccwsr_ambiguous_acquisition.cc b/src/algorithms/acquisition/adapters/galileo_e1_pcps_cccwsr_ambiguous_acquisition.cc index f16c6e5da..f10fda049 100644 --- a/src/algorithms/acquisition/adapters/galileo_e1_pcps_cccwsr_ambiguous_acquisition.cc +++ b/src/algorithms/acquisition/adapters/galileo_e1_pcps_cccwsr_ambiguous_acquisition.cc @@ -123,9 +123,6 @@ GalileoE1PcpsCccwsrAmbiguousAcquisition::GalileoE1PcpsCccwsrAmbiguousAcquisition } -GalileoE1PcpsCccwsrAmbiguousAcquisition::~GalileoE1PcpsCccwsrAmbiguousAcquisition() = default; - - void GalileoE1PcpsCccwsrAmbiguousAcquisition::stop_acquisition() { } diff --git a/src/algorithms/acquisition/adapters/galileo_e1_pcps_cccwsr_ambiguous_acquisition.h b/src/algorithms/acquisition/adapters/galileo_e1_pcps_cccwsr_ambiguous_acquisition.h index eac80983c..005424a75 100644 --- a/src/algorithms/acquisition/adapters/galileo_e1_pcps_cccwsr_ambiguous_acquisition.h +++ b/src/algorithms/acquisition/adapters/galileo_e1_pcps_cccwsr_ambiguous_acquisition.h @@ -54,7 +54,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GalileoE1PcpsCccwsrAmbiguousAcquisition(); + ~GalileoE1PcpsCccwsrAmbiguousAcquisition() = default; inline std::string role() override { diff --git a/src/algorithms/acquisition/adapters/galileo_e1_pcps_quicksync_ambiguous_acquisition.cc b/src/algorithms/acquisition/adapters/galileo_e1_pcps_quicksync_ambiguous_acquisition.cc index c7c86857b..8070ec7ef 100644 --- a/src/algorithms/acquisition/adapters/galileo_e1_pcps_quicksync_ambiguous_acquisition.cc +++ b/src/algorithms/acquisition/adapters/galileo_e1_pcps_quicksync_ambiguous_acquisition.cc @@ -157,9 +157,6 @@ GalileoE1PcpsQuickSyncAmbiguousAcquisition::GalileoE1PcpsQuickSyncAmbiguousAcqui } -GalileoE1PcpsQuickSyncAmbiguousAcquisition::~GalileoE1PcpsQuickSyncAmbiguousAcquisition() = default; - - void GalileoE1PcpsQuickSyncAmbiguousAcquisition::stop_acquisition() { } diff --git a/src/algorithms/acquisition/adapters/galileo_e1_pcps_quicksync_ambiguous_acquisition.h b/src/algorithms/acquisition/adapters/galileo_e1_pcps_quicksync_ambiguous_acquisition.h index ecbac95b6..c6ad70ede 100644 --- a/src/algorithms/acquisition/adapters/galileo_e1_pcps_quicksync_ambiguous_acquisition.h +++ b/src/algorithms/acquisition/adapters/galileo_e1_pcps_quicksync_ambiguous_acquisition.h @@ -55,7 +55,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GalileoE1PcpsQuickSyncAmbiguousAcquisition(); + ~GalileoE1PcpsQuickSyncAmbiguousAcquisition() = default; inline std::string role() override { diff --git a/src/algorithms/acquisition/adapters/galileo_e1_pcps_tong_ambiguous_acquisition.cc b/src/algorithms/acquisition/adapters/galileo_e1_pcps_tong_ambiguous_acquisition.cc index d81aa4bbd..906750662 100644 --- a/src/algorithms/acquisition/adapters/galileo_e1_pcps_tong_ambiguous_acquisition.cc +++ b/src/algorithms/acquisition/adapters/galileo_e1_pcps_tong_ambiguous_acquisition.cc @@ -127,9 +127,6 @@ GalileoE1PcpsTongAmbiguousAcquisition::GalileoE1PcpsTongAmbiguousAcquisition( } -GalileoE1PcpsTongAmbiguousAcquisition::~GalileoE1PcpsTongAmbiguousAcquisition() = default; - - void GalileoE1PcpsTongAmbiguousAcquisition::stop_acquisition() { } diff --git a/src/algorithms/acquisition/adapters/galileo_e1_pcps_tong_ambiguous_acquisition.h b/src/algorithms/acquisition/adapters/galileo_e1_pcps_tong_ambiguous_acquisition.h index 402383fcb..33ad8fc22 100644 --- a/src/algorithms/acquisition/adapters/galileo_e1_pcps_tong_ambiguous_acquisition.h +++ b/src/algorithms/acquisition/adapters/galileo_e1_pcps_tong_ambiguous_acquisition.h @@ -54,7 +54,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GalileoE1PcpsTongAmbiguousAcquisition(); + ~GalileoE1PcpsTongAmbiguousAcquisition() = default; inline std::string role() override { diff --git a/src/algorithms/acquisition/adapters/galileo_e5a_noncoherent_iq_acquisition_caf.cc b/src/algorithms/acquisition/adapters/galileo_e5a_noncoherent_iq_acquisition_caf.cc index e02e6b97f..49f87268b 100644 --- a/src/algorithms/acquisition/adapters/galileo_e5a_noncoherent_iq_acquisition_caf.cc +++ b/src/algorithms/acquisition/adapters/galileo_e5a_noncoherent_iq_acquisition_caf.cc @@ -132,9 +132,6 @@ GalileoE5aNoncoherentIQAcquisitionCaf::GalileoE5aNoncoherentIQAcquisitionCaf( } -GalileoE5aNoncoherentIQAcquisitionCaf::~GalileoE5aNoncoherentIQAcquisitionCaf() = default; - - void GalileoE5aNoncoherentIQAcquisitionCaf::stop_acquisition() { } diff --git a/src/algorithms/acquisition/adapters/galileo_e5a_noncoherent_iq_acquisition_caf.h b/src/algorithms/acquisition/adapters/galileo_e5a_noncoherent_iq_acquisition_caf.h index 7064c0aa9..c76dd090b 100644 --- a/src/algorithms/acquisition/adapters/galileo_e5a_noncoherent_iq_acquisition_caf.h +++ b/src/algorithms/acquisition/adapters/galileo_e5a_noncoherent_iq_acquisition_caf.h @@ -55,7 +55,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GalileoE5aNoncoherentIQAcquisitionCaf(); + ~GalileoE5aNoncoherentIQAcquisitionCaf() = default; inline std::string role() override { diff --git a/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition.cc b/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition.cc index 442c78e08..ace2fc968 100644 --- a/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition.cc +++ b/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition.cc @@ -165,9 +165,6 @@ GalileoE5aPcpsAcquisition::GalileoE5aPcpsAcquisition(ConfigurationInterface* con } -GalileoE5aPcpsAcquisition::~GalileoE5aPcpsAcquisition() = default; - - void GalileoE5aPcpsAcquisition::stop_acquisition() { } diff --git a/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition.h b/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition.h index f6b694a67..8db725c84 100644 --- a/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition.h +++ b/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition.h @@ -49,7 +49,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GalileoE5aPcpsAcquisition(); + ~GalileoE5aPcpsAcquisition() = default; inline std::string role() override { 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 a0bd49ba0..e2a2a21f4 100644 --- a/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition_fpga.cc +++ b/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition_fpga.cc @@ -197,9 +197,6 @@ GalileoE5aPcpsAcquisitionFpga::GalileoE5aPcpsAcquisitionFpga(ConfigurationInterf } -GalileoE5aPcpsAcquisitionFpga::~GalileoE5aPcpsAcquisitionFpga() = default; - - void GalileoE5aPcpsAcquisitionFpga::stop_acquisition() { // this command causes the SW to reset the HW. 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 37e0bf9dd..da9f1e1c3 100644 --- a/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition_fpga.h +++ b/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition_fpga.h @@ -59,7 +59,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GalileoE5aPcpsAcquisitionFpga(); + ~GalileoE5aPcpsAcquisitionFpga() = default; inline std::string role() override { diff --git a/src/algorithms/acquisition/adapters/glonass_l1_ca_pcps_acquisition.cc b/src/algorithms/acquisition/adapters/glonass_l1_ca_pcps_acquisition.cc index bdac10535..39a7b773e 100644 --- a/src/algorithms/acquisition/adapters/glonass_l1_ca_pcps_acquisition.cc +++ b/src/algorithms/acquisition/adapters/glonass_l1_ca_pcps_acquisition.cc @@ -138,9 +138,6 @@ GlonassL1CaPcpsAcquisition::GlonassL1CaPcpsAcquisition( } -GlonassL1CaPcpsAcquisition::~GlonassL1CaPcpsAcquisition() = default; - - void GlonassL1CaPcpsAcquisition::stop_acquisition() { } diff --git a/src/algorithms/acquisition/adapters/glonass_l1_ca_pcps_acquisition.h b/src/algorithms/acquisition/adapters/glonass_l1_ca_pcps_acquisition.h index 1768c3bb4..fd790653e 100644 --- a/src/algorithms/acquisition/adapters/glonass_l1_ca_pcps_acquisition.h +++ b/src/algorithms/acquisition/adapters/glonass_l1_ca_pcps_acquisition.h @@ -57,7 +57,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GlonassL1CaPcpsAcquisition(); + ~GlonassL1CaPcpsAcquisition() = default; inline std::string role() override { diff --git a/src/algorithms/acquisition/adapters/glonass_l2_ca_pcps_acquisition.cc b/src/algorithms/acquisition/adapters/glonass_l2_ca_pcps_acquisition.cc index 2210eebbf..b8c8f2858 100644 --- a/src/algorithms/acquisition/adapters/glonass_l2_ca_pcps_acquisition.cc +++ b/src/algorithms/acquisition/adapters/glonass_l2_ca_pcps_acquisition.cc @@ -137,9 +137,6 @@ GlonassL2CaPcpsAcquisition::GlonassL2CaPcpsAcquisition( } -GlonassL2CaPcpsAcquisition::~GlonassL2CaPcpsAcquisition() = default; - - void GlonassL2CaPcpsAcquisition::stop_acquisition() { } diff --git a/src/algorithms/acquisition/adapters/glonass_l2_ca_pcps_acquisition.h b/src/algorithms/acquisition/adapters/glonass_l2_ca_pcps_acquisition.h index efe36e7ea..861903453 100644 --- a/src/algorithms/acquisition/adapters/glonass_l2_ca_pcps_acquisition.h +++ b/src/algorithms/acquisition/adapters/glonass_l2_ca_pcps_acquisition.h @@ -56,7 +56,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GlonassL2CaPcpsAcquisition(); + ~GlonassL2CaPcpsAcquisition() = default; inline std::string role() override { diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.cc b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.cc index 9c50bb3c1..9325e8aba 100644 --- a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.cc +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.cc @@ -161,9 +161,6 @@ GpsL1CaPcpsAcquisition::GpsL1CaPcpsAcquisition( } -GpsL1CaPcpsAcquisition::~GpsL1CaPcpsAcquisition() = default; - - void GpsL1CaPcpsAcquisition::stop_acquisition() { } diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.h b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.h index bef0202bc..2f1142142 100644 --- a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.h +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.h @@ -62,7 +62,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GpsL1CaPcpsAcquisition(); + ~GpsL1CaPcpsAcquisition() = default; inline std::string role() override { diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition_fine_doppler.cc b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition_fine_doppler.cc index 1c67657b8..dd71190a5 100644 --- a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition_fine_doppler.cc +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition_fine_doppler.cc @@ -109,9 +109,6 @@ GpsL1CaPcpsAcquisitionFineDoppler::GpsL1CaPcpsAcquisitionFineDoppler( } -GpsL1CaPcpsAcquisitionFineDoppler::~GpsL1CaPcpsAcquisitionFineDoppler() = default; - - void GpsL1CaPcpsAcquisitionFineDoppler::stop_acquisition() { } diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition_fine_doppler.h b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition_fine_doppler.h index 80fc080b6..5230d3b1c 100644 --- a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition_fine_doppler.h +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition_fine_doppler.h @@ -55,7 +55,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GpsL1CaPcpsAcquisitionFineDoppler(); + ~GpsL1CaPcpsAcquisitionFineDoppler() = default; inline std::string role() override { 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 7216d09d5..998da32a0 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 @@ -175,9 +175,6 @@ GpsL1CaPcpsAcquisitionFpga::GpsL1CaPcpsAcquisitionFpga( } -GpsL1CaPcpsAcquisitionFpga::~GpsL1CaPcpsAcquisitionFpga() = default; - - void GpsL1CaPcpsAcquisitionFpga::stop_acquisition() { // this command causes the SW to reset the HW. diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition_fpga.h b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition_fpga.h index 39b8d2e1f..6b2471636 100644 --- a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition_fpga.h +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition_fpga.h @@ -60,7 +60,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GpsL1CaPcpsAcquisitionFpga(); + ~GpsL1CaPcpsAcquisitionFpga() = default; inline std::string role() override { diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_assisted_acquisition.cc b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_assisted_acquisition.cc index 592648bd6..b45fe8a70 100644 --- a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_assisted_acquisition.cc +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_assisted_acquisition.cc @@ -101,9 +101,6 @@ GpsL1CaPcpsAssistedAcquisition::GpsL1CaPcpsAssistedAcquisition( } -GpsL1CaPcpsAssistedAcquisition::~GpsL1CaPcpsAssistedAcquisition() = default; - - void GpsL1CaPcpsAssistedAcquisition::stop_acquisition() { } diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_assisted_acquisition.h b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_assisted_acquisition.h index 9b38e6608..7c79f2343 100644 --- a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_assisted_acquisition.h +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_assisted_acquisition.h @@ -55,7 +55,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GpsL1CaPcpsAssistedAcquisition(); + ~GpsL1CaPcpsAssistedAcquisition() = default; inline std::string role() override { diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_opencl_acquisition.cc b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_opencl_acquisition.cc index de5832cf1..4072cd795 100644 --- a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_opencl_acquisition.cc +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_opencl_acquisition.cc @@ -121,9 +121,6 @@ GpsL1CaPcpsOpenClAcquisition::GpsL1CaPcpsOpenClAcquisition( } -GpsL1CaPcpsOpenClAcquisition::~GpsL1CaPcpsOpenClAcquisition() = default; - - void GpsL1CaPcpsOpenClAcquisition::stop_acquisition() { } diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_opencl_acquisition.h b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_opencl_acquisition.h index c70d77a54..637c4b22c 100644 --- a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_opencl_acquisition.h +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_opencl_acquisition.h @@ -54,7 +54,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GpsL1CaPcpsOpenClAcquisition(); + ~GpsL1CaPcpsOpenClAcquisition() = default; inline std::string role() override { diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_quicksync_acquisition.cc b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_quicksync_acquisition.cc index 251216eab..aaa2594f8 100644 --- a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_quicksync_acquisition.cc +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_quicksync_acquisition.cc @@ -150,9 +150,6 @@ GpsL1CaPcpsQuickSyncAcquisition::GpsL1CaPcpsQuickSyncAcquisition( } -GpsL1CaPcpsQuickSyncAcquisition::~GpsL1CaPcpsQuickSyncAcquisition() = default; - - void GpsL1CaPcpsQuickSyncAcquisition::stop_acquisition() { } diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_quicksync_acquisition.h b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_quicksync_acquisition.h index 7f5390782..a5aca4f6d 100644 --- a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_quicksync_acquisition.h +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_quicksync_acquisition.h @@ -56,7 +56,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GpsL1CaPcpsQuickSyncAcquisition(); + ~GpsL1CaPcpsQuickSyncAcquisition() = default; inline std::string role() override { diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_tong_acquisition.cc b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_tong_acquisition.cc index c670cc0bb..62bdbc045 100644 --- a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_tong_acquisition.cc +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_tong_acquisition.cc @@ -112,9 +112,6 @@ GpsL1CaPcpsTongAcquisition::GpsL1CaPcpsTongAcquisition( } -GpsL1CaPcpsTongAcquisition::~GpsL1CaPcpsTongAcquisition() = default; - - void GpsL1CaPcpsTongAcquisition::stop_acquisition() { } diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_tong_acquisition.h b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_tong_acquisition.h index 7193e5466..4e69f8e36 100644 --- a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_tong_acquisition.h +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_tong_acquisition.h @@ -55,7 +55,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GpsL1CaPcpsTongAcquisition(); + ~GpsL1CaPcpsTongAcquisition() = default; inline std::string role() override { diff --git a/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.cc b/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.cc index d424bdb5f..d5f0a1dee 100644 --- a/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.cc +++ b/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.cc @@ -165,9 +165,6 @@ GpsL2MPcpsAcquisition::GpsL2MPcpsAcquisition( } -GpsL2MPcpsAcquisition::~GpsL2MPcpsAcquisition() = default; - - void GpsL2MPcpsAcquisition::stop_acquisition() { } diff --git a/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.h b/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.h index 25a792d69..6a9b63cfc 100644 --- a/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.h +++ b/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.h @@ -59,7 +59,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GpsL2MPcpsAcquisition(); + ~GpsL2MPcpsAcquisition() = default; inline std::string role() override { 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 17d98fc25..c51cadcc8 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 @@ -164,9 +164,6 @@ GpsL2MPcpsAcquisitionFpga::GpsL2MPcpsAcquisitionFpga( } -GpsL2MPcpsAcquisitionFpga::~GpsL2MPcpsAcquisitionFpga() = default; - - void GpsL2MPcpsAcquisitionFpga::stop_acquisition() { } 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 9507abffd..d560f04d3 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 @@ -58,7 +58,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GpsL2MPcpsAcquisitionFpga(); + ~GpsL2MPcpsAcquisitionFpga() = default; inline std::string role() override { diff --git a/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition.cc b/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition.cc index 8b0a6e793..ffc881d85 100644 --- a/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition.cc +++ b/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition.cc @@ -160,9 +160,6 @@ GpsL5iPcpsAcquisition::GpsL5iPcpsAcquisition( } -GpsL5iPcpsAcquisition::~GpsL5iPcpsAcquisition() = default; - - void GpsL5iPcpsAcquisition::stop_acquisition() { } diff --git a/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition.h b/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition.h index 17a1b634c..8d404a6b4 100644 --- a/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition.h +++ b/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition.h @@ -59,7 +59,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GpsL5iPcpsAcquisition(); + ~GpsL5iPcpsAcquisition() = default; inline std::string role() override { 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 30bd9d407..fbafae22c 100644 --- a/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition_fpga.cc +++ b/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition_fpga.cc @@ -178,9 +178,6 @@ GpsL5iPcpsAcquisitionFpga::GpsL5iPcpsAcquisitionFpga( } -GpsL5iPcpsAcquisitionFpga::~GpsL5iPcpsAcquisitionFpga() = default; - - void GpsL5iPcpsAcquisitionFpga::stop_acquisition() { // this command causes the SW to reset the HW. 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 1d5c8e922..ce9a2485e 100644 --- a/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition_fpga.h +++ b/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition_fpga.h @@ -59,7 +59,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GpsL5iPcpsAcquisitionFpga(); + ~GpsL5iPcpsAcquisitionFpga() = default; inline std::string role() override { diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc index c4b42360f..217665fd1 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc @@ -206,9 +206,6 @@ pcps_acquisition::pcps_acquisition(const Acq_Conf& conf_) : gr::block("pcps_acqu } -pcps_acquisition::~pcps_acquisition() = default; - - void pcps_acquisition::set_resampler_latency(uint32_t latency_samples) { gr::thread::scoped_lock lock(d_setlock); // require mutex with work function called by the scheduler diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.h b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.h index cfdf5c103..2d12f192b 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.h +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.h @@ -90,7 +90,7 @@ pcps_acquisition_sptr pcps_make_acquisition(const Acq_Conf& conf_); class pcps_acquisition : public gr::block { public: - ~pcps_acquisition(); + ~pcps_acquisition() = default; /*! * \brief Set acquisition/tracking common Gnss_Synchro object pointer diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fpga.cc b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fpga.cc index 2d9929063..c721a924a 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fpga.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fpga.cc @@ -84,9 +84,6 @@ pcps_acquisition_fpga::pcps_acquisition_fpga(pcpsconf_fpga_t conf_) } -pcps_acquisition_fpga::~pcps_acquisition_fpga() = default; - - void pcps_acquisition_fpga::set_local_code() { acquisition_fpga->set_local_code(d_gnss_synchro->PRN); diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fpga.h b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fpga.h index ad9d66af1..b2933c7f5 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fpga.h +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fpga.h @@ -89,7 +89,7 @@ pcps_acquisition_fpga_sptr pcps_make_acquisition_fpga(pcpsconf_fpga_t conf_); class pcps_acquisition_fpga { public: - ~pcps_acquisition_fpga(); + ~pcps_acquisition_fpga() = default; /*! * \brief Set acquisition/tracking common Gnss_Synchro object pointer diff --git a/src/algorithms/acquisition/libs/fpga_acquisition.cc b/src/algorithms/acquisition/libs/fpga_acquisition.cc index 16d5534de..7e74b7d01 100644 --- a/src/algorithms/acquisition/libs/fpga_acquisition.cc +++ b/src/algorithms/acquisition/libs/fpga_acquisition.cc @@ -108,9 +108,6 @@ Fpga_Acquisition::Fpga_Acquisition(std::string device_name, } -Fpga_Acquisition::~Fpga_Acquisition() = default; - - bool Fpga_Acquisition::set_local_code(uint32_t PRN) { // select the code with the chosen PRN diff --git a/src/algorithms/acquisition/libs/fpga_acquisition.h b/src/algorithms/acquisition/libs/fpga_acquisition.h index dd28f4314..0e8b1926d 100644 --- a/src/algorithms/acquisition/libs/fpga_acquisition.h +++ b/src/algorithms/acquisition/libs/fpga_acquisition.h @@ -56,7 +56,7 @@ public: uint32_t *all_fft_codes, uint32_t excludelimit); - ~Fpga_Acquisition(); + ~Fpga_Acquisition() = default; bool set_local_code(uint32_t PRN); diff --git a/src/algorithms/channel/adapters/channel.cc b/src/algorithms/channel/adapters/channel.cc index 2cea8e915..717627527 100644 --- a/src/algorithms/channel/adapters/channel.cc +++ b/src/algorithms/channel/adapters/channel.cc @@ -118,9 +118,6 @@ Channel::Channel(ConfigurationInterface* configuration, uint32_t channel, std::s } -Channel::~Channel() = default; - - void Channel::connect(gr::top_block_sptr top_block) { if (!flag_enable_fpga) diff --git a/src/algorithms/channel/adapters/channel.h b/src/algorithms/channel/adapters/channel.h index 9e4048a2d..289e5528d 100644 --- a/src/algorithms/channel/adapters/channel.h +++ b/src/algorithms/channel/adapters/channel.h @@ -69,7 +69,7 @@ public: std::shared_ptr trk, std::shared_ptr nav, std::string role, std::string implementation, std::shared_ptr> queue); - virtual ~Channel(); //!< Virtual destructor + ~Channel() = default; //!< Destructor void connect(gr::top_block_sptr top_block) override; //!< connects the tracking block to the top_block and to the telemetry void disconnect(gr::top_block_sptr top_block) override; diff --git a/src/algorithms/channel/libs/channel_msg_receiver_cc.cc b/src/algorithms/channel/libs/channel_msg_receiver_cc.cc index c7cc8846f..9daa85086 100644 --- a/src/algorithms/channel/libs/channel_msg_receiver_cc.cc +++ b/src/algorithms/channel/libs/channel_msg_receiver_cc.cc @@ -55,9 +55,6 @@ channel_msg_receiver_cc::channel_msg_receiver_cc(std::shared_ptr cha } -channel_msg_receiver_cc::~channel_msg_receiver_cc() = default; - - void channel_msg_receiver_cc::msg_handler_events(pmt::pmt_t msg) { bool result = false; diff --git a/src/algorithms/channel/libs/channel_msg_receiver_cc.h b/src/algorithms/channel/libs/channel_msg_receiver_cc.h index 8b38e10ab..11e41e783 100644 --- a/src/algorithms/channel/libs/channel_msg_receiver_cc.h +++ b/src/algorithms/channel/libs/channel_msg_receiver_cc.h @@ -48,7 +48,7 @@ channel_msg_receiver_cc_sptr channel_msg_receiver_make_cc(std::shared_ptr channel_fsm, bool repeat); diff --git a/src/algorithms/conditioner/adapters/array_signal_conditioner.cc b/src/algorithms/conditioner/adapters/array_signal_conditioner.cc index d82535e6c..0570029f9 100644 --- a/src/algorithms/conditioner/adapters/array_signal_conditioner.cc +++ b/src/algorithms/conditioner/adapters/array_signal_conditioner.cc @@ -54,10 +54,6 @@ ArraySignalConditioner::ArraySignalConditioner(ConfigurationInterface *configura } -// Destructor -ArraySignalConditioner::~ArraySignalConditioner() = default; - - void ArraySignalConditioner::connect(gr::top_block_sptr top_block) { // note: the array signal conditioner do not have data type adapter, and must use the array input filter (multichannel) diff --git a/src/algorithms/conditioner/adapters/array_signal_conditioner.h b/src/algorithms/conditioner/adapters/array_signal_conditioner.h index b8f43de03..a686df724 100644 --- a/src/algorithms/conditioner/adapters/array_signal_conditioner.h +++ b/src/algorithms/conditioner/adapters/array_signal_conditioner.h @@ -55,8 +55,8 @@ public: std::shared_ptr data_type_adapt, std::shared_ptr in_filt, std::shared_ptr res, std::string role, std::string implementation); - //! Virtual destructor - virtual ~ArraySignalConditioner(); + //! Destructor + ~ArraySignalConditioner() = default; void connect(gr::top_block_sptr top_block) override; void disconnect(gr::top_block_sptr top_block) override; diff --git a/src/algorithms/conditioner/adapters/signal_conditioner.cc b/src/algorithms/conditioner/adapters/signal_conditioner.cc index 72b6ab404..81232b497 100644 --- a/src/algorithms/conditioner/adapters/signal_conditioner.cc +++ b/src/algorithms/conditioner/adapters/signal_conditioner.cc @@ -54,10 +54,6 @@ SignalConditioner::SignalConditioner(ConfigurationInterface *configuration, } -// Destructor -SignalConditioner::~SignalConditioner() = default; - - void SignalConditioner::connect(gr::top_block_sptr top_block) { if (connected_) diff --git a/src/algorithms/conditioner/adapters/signal_conditioner.h b/src/algorithms/conditioner/adapters/signal_conditioner.h index 455c6e287..93cc867f7 100644 --- a/src/algorithms/conditioner/adapters/signal_conditioner.h +++ b/src/algorithms/conditioner/adapters/signal_conditioner.h @@ -52,8 +52,8 @@ public: std::shared_ptr data_type_adapt, std::shared_ptr in_filt, std::shared_ptr res, std::string role, std::string implementation); - //! Virtual destructor - virtual ~SignalConditioner(); + //! Destructor + ~SignalConditioner() = default; void connect(gr::top_block_sptr top_block) override; void disconnect(gr::top_block_sptr top_block) override; diff --git a/src/algorithms/data_type_adapter/adapters/byte_to_short.cc b/src/algorithms/data_type_adapter/adapters/byte_to_short.cc index 778d42d09..715f33721 100644 --- a/src/algorithms/data_type_adapter/adapters/byte_to_short.cc +++ b/src/algorithms/data_type_adapter/adapters/byte_to_short.cc @@ -71,9 +71,6 @@ ByteToShort::ByteToShort(ConfigurationInterface* configuration, std::string role } -ByteToShort::~ByteToShort() = default; - - void ByteToShort::connect(gr::top_block_sptr top_block) { if (dump_) diff --git a/src/algorithms/data_type_adapter/adapters/byte_to_short.h b/src/algorithms/data_type_adapter/adapters/byte_to_short.h index 9b90f1d3b..ab20856f1 100644 --- a/src/algorithms/data_type_adapter/adapters/byte_to_short.h +++ b/src/algorithms/data_type_adapter/adapters/byte_to_short.h @@ -49,7 +49,7 @@ public: std::string role, unsigned int in_streams, unsigned int out_streams); - virtual ~ByteToShort(); + ~ByteToShort() = default; inline std::string role() override { diff --git a/src/algorithms/data_type_adapter/adapters/ibyte_to_cbyte.cc b/src/algorithms/data_type_adapter/adapters/ibyte_to_cbyte.cc index bc044be04..2549f343d 100644 --- a/src/algorithms/data_type_adapter/adapters/ibyte_to_cbyte.cc +++ b/src/algorithms/data_type_adapter/adapters/ibyte_to_cbyte.cc @@ -76,9 +76,6 @@ IbyteToCbyte::IbyteToCbyte(ConfigurationInterface* configuration, const std::str } -IbyteToCbyte::~IbyteToCbyte() = default; - - void IbyteToCbyte::connect(gr::top_block_sptr top_block) { if (dump_) diff --git a/src/algorithms/data_type_adapter/adapters/ibyte_to_cbyte.h b/src/algorithms/data_type_adapter/adapters/ibyte_to_cbyte.h index 3fb202a1a..243866b31 100644 --- a/src/algorithms/data_type_adapter/adapters/ibyte_to_cbyte.h +++ b/src/algorithms/data_type_adapter/adapters/ibyte_to_cbyte.h @@ -51,7 +51,7 @@ public: const std::string& role, unsigned int in_streams, unsigned int out_streams); - virtual ~IbyteToCbyte(); + ~IbyteToCbyte() = default; inline std::string role() override { diff --git a/src/algorithms/data_type_adapter/adapters/ibyte_to_complex.cc b/src/algorithms/data_type_adapter/adapters/ibyte_to_complex.cc index e32c4adca..9ffe86d2f 100644 --- a/src/algorithms/data_type_adapter/adapters/ibyte_to_complex.cc +++ b/src/algorithms/data_type_adapter/adapters/ibyte_to_complex.cc @@ -74,9 +74,6 @@ IbyteToComplex::IbyteToComplex(ConfigurationInterface* configuration, const std: } -IbyteToComplex::~IbyteToComplex() = default; - - void IbyteToComplex::connect(gr::top_block_sptr top_block) { if (dump_) diff --git a/src/algorithms/data_type_adapter/adapters/ibyte_to_complex.h b/src/algorithms/data_type_adapter/adapters/ibyte_to_complex.h index 9271689bc..8302a2fdd 100644 --- a/src/algorithms/data_type_adapter/adapters/ibyte_to_complex.h +++ b/src/algorithms/data_type_adapter/adapters/ibyte_to_complex.h @@ -51,7 +51,7 @@ public: const std::string& role, unsigned int in_streams, unsigned int out_streams); - virtual ~IbyteToComplex(); + ~IbyteToComplex() = default; inline std::string role() override { diff --git a/src/algorithms/data_type_adapter/adapters/ibyte_to_cshort.cc b/src/algorithms/data_type_adapter/adapters/ibyte_to_cshort.cc index 89aa9f7e8..5f1e44cb3 100644 --- a/src/algorithms/data_type_adapter/adapters/ibyte_to_cshort.cc +++ b/src/algorithms/data_type_adapter/adapters/ibyte_to_cshort.cc @@ -76,9 +76,6 @@ IbyteToCshort::IbyteToCshort(ConfigurationInterface* configuration, const std::s } -IbyteToCshort::~IbyteToCshort() = default; - - void IbyteToCshort::connect(gr::top_block_sptr top_block) { if (dump_) diff --git a/src/algorithms/data_type_adapter/adapters/ibyte_to_cshort.h b/src/algorithms/data_type_adapter/adapters/ibyte_to_cshort.h index 9e7c5b74b..028ba777b 100644 --- a/src/algorithms/data_type_adapter/adapters/ibyte_to_cshort.h +++ b/src/algorithms/data_type_adapter/adapters/ibyte_to_cshort.h @@ -51,7 +51,7 @@ public: const std::string& role, unsigned int in_streams, unsigned int out_streams); - virtual ~IbyteToCshort(); + ~IbyteToCshort() = default; inline std::string role() override { diff --git a/src/algorithms/data_type_adapter/adapters/ishort_to_complex.cc b/src/algorithms/data_type_adapter/adapters/ishort_to_complex.cc index 8f9d564b1..457e0fc32 100644 --- a/src/algorithms/data_type_adapter/adapters/ishort_to_complex.cc +++ b/src/algorithms/data_type_adapter/adapters/ishort_to_complex.cc @@ -74,9 +74,6 @@ IshortToComplex::IshortToComplex(ConfigurationInterface* configuration, const st } -IshortToComplex::~IshortToComplex() = default; - - void IshortToComplex::connect(gr::top_block_sptr top_block) { if (dump_) diff --git a/src/algorithms/data_type_adapter/adapters/ishort_to_complex.h b/src/algorithms/data_type_adapter/adapters/ishort_to_complex.h index 73d1133a8..a12fdf8fe 100644 --- a/src/algorithms/data_type_adapter/adapters/ishort_to_complex.h +++ b/src/algorithms/data_type_adapter/adapters/ishort_to_complex.h @@ -50,7 +50,7 @@ public: const std::string& role, unsigned int in_streams, unsigned int out_streams); - virtual ~IshortToComplex(); + ~IshortToComplex() = default; inline std::string role() override { diff --git a/src/algorithms/data_type_adapter/adapters/ishort_to_cshort.cc b/src/algorithms/data_type_adapter/adapters/ishort_to_cshort.cc index 0af4407c5..67dba11bd 100644 --- a/src/algorithms/data_type_adapter/adapters/ishort_to_cshort.cc +++ b/src/algorithms/data_type_adapter/adapters/ishort_to_cshort.cc @@ -76,9 +76,6 @@ IshortToCshort::IshortToCshort(ConfigurationInterface* configuration, const std: } -IshortToCshort::~IshortToCshort() = default; - - void IshortToCshort::connect(gr::top_block_sptr top_block) { if (dump_) diff --git a/src/algorithms/data_type_adapter/adapters/ishort_to_cshort.h b/src/algorithms/data_type_adapter/adapters/ishort_to_cshort.h index 925065a1d..d067f2625 100644 --- a/src/algorithms/data_type_adapter/adapters/ishort_to_cshort.h +++ b/src/algorithms/data_type_adapter/adapters/ishort_to_cshort.h @@ -51,7 +51,7 @@ public: const std::string& role, unsigned int in_streams, unsigned int out_streams); - virtual ~IshortToCshort(); + ~IshortToCshort() = default; inline std::string role() override { diff --git a/src/algorithms/input_filter/adapters/beamformer_filter.cc b/src/algorithms/input_filter/adapters/beamformer_filter.cc index 52f46ca6b..b2632c971 100644 --- a/src/algorithms/input_filter/adapters/beamformer_filter.cc +++ b/src/algorithms/input_filter/adapters/beamformer_filter.cc @@ -77,9 +77,6 @@ BeamformerFilter::BeamformerFilter( } -BeamformerFilter::~BeamformerFilter() = default; - - void BeamformerFilter::connect(gr::top_block_sptr top_block) { if (dump_) diff --git a/src/algorithms/input_filter/adapters/beamformer_filter.h b/src/algorithms/input_filter/adapters/beamformer_filter.h index 89df25223..86403e5ba 100644 --- a/src/algorithms/input_filter/adapters/beamformer_filter.h +++ b/src/algorithms/input_filter/adapters/beamformer_filter.h @@ -50,7 +50,7 @@ public: const std::string& role, unsigned int in_stream, unsigned int out_stream); - virtual ~BeamformerFilter(); + ~BeamformerFilter() = default; inline std::string role() override { @@ -86,4 +86,4 @@ private: gr::block_sptr file_sink_; }; -#endif /*GNSS_SDR_BEAMFORMER_FILTER_H_*/ +#endif /* GNSS_SDR_BEAMFORMER_FILTER_H_ */ diff --git a/src/algorithms/input_filter/adapters/fir_filter.cc b/src/algorithms/input_filter/adapters/fir_filter.cc index 9529bcb6c..83790a049 100644 --- a/src/algorithms/input_filter/adapters/fir_filter.cc +++ b/src/algorithms/input_filter/adapters/fir_filter.cc @@ -140,9 +140,6 @@ FirFilter::FirFilter(ConfigurationInterface* configuration, std::string role, } -FirFilter::~FirFilter() = default; - - void FirFilter::connect(gr::top_block_sptr top_block) { if ((taps_item_type_ == "float") && (input_item_type_ == "gr_complex") && (output_item_type_ == "gr_complex")) diff --git a/src/algorithms/input_filter/adapters/fir_filter.h b/src/algorithms/input_filter/adapters/fir_filter.h index 85626f2cc..c76bbe2b4 100644 --- a/src/algorithms/input_filter/adapters/fir_filter.h +++ b/src/algorithms/input_filter/adapters/fir_filter.h @@ -73,7 +73,7 @@ public: unsigned int out_streams); //! Destructor - virtual ~FirFilter(); + ~FirFilter() = default; inline std::string role() override { diff --git a/src/algorithms/input_filter/adapters/freq_xlating_fir_filter.cc b/src/algorithms/input_filter/adapters/freq_xlating_fir_filter.cc index f6e062ab8..2f4be2663 100644 --- a/src/algorithms/input_filter/adapters/freq_xlating_fir_filter.cc +++ b/src/algorithms/input_filter/adapters/freq_xlating_fir_filter.cc @@ -121,7 +121,7 @@ FreqXlatingFirFilter::FreqXlatingFirFilter(ConfigurationInterface* configuration } size_t item_size; - LOG(INFO) << "Created freq_xlating_fir_filter with " << taps_.size()<<" taps"; + LOG(INFO) << "Created freq_xlating_fir_filter with " << taps_.size() << " taps"; if ((taps_item_type_ == "float") && (input_item_type_ == "gr_complex") && (output_item_type_ == "gr_complex")) { item_size = sizeof(gr_complex); //output @@ -195,9 +195,6 @@ FreqXlatingFirFilter::FreqXlatingFirFilter(ConfigurationInterface* configuration } -FreqXlatingFirFilter::~FreqXlatingFirFilter() = default; - - void FreqXlatingFirFilter::connect(gr::top_block_sptr top_block) { if ((taps_item_type_ == "float") && (input_item_type_ == "gr_complex") && (output_item_type_ == "gr_complex")) diff --git a/src/algorithms/input_filter/adapters/freq_xlating_fir_filter.h b/src/algorithms/input_filter/adapters/freq_xlating_fir_filter.h index fad4f89cd..9d8ec4f03 100644 --- a/src/algorithms/input_filter/adapters/freq_xlating_fir_filter.h +++ b/src/algorithms/input_filter/adapters/freq_xlating_fir_filter.h @@ -71,7 +71,7 @@ public: std::string role, unsigned int in_streams, unsigned int out_streams); - virtual ~FreqXlatingFirFilter(); + ~FreqXlatingFirFilter() = default; inline std::string role() override { diff --git a/src/algorithms/input_filter/adapters/notch_filter.cc b/src/algorithms/input_filter/adapters/notch_filter.cc index 98bb16b7e..76844359d 100644 --- a/src/algorithms/input_filter/adapters/notch_filter.cc +++ b/src/algorithms/input_filter/adapters/notch_filter.cc @@ -90,9 +90,6 @@ NotchFilter::NotchFilter(ConfigurationInterface* configuration, const std::strin } -NotchFilter::~NotchFilter() = default; - - void NotchFilter::connect(gr::top_block_sptr top_block) { if (dump_) diff --git a/src/algorithms/input_filter/adapters/notch_filter.h b/src/algorithms/input_filter/adapters/notch_filter.h index c0e1f9510..ae9c4be74 100644 --- a/src/algorithms/input_filter/adapters/notch_filter.h +++ b/src/algorithms/input_filter/adapters/notch_filter.h @@ -48,7 +48,7 @@ public: const std::string& role, unsigned int in_streams, unsigned int out_streams); - virtual ~NotchFilter(); + ~NotchFilter() = default; std::string role() { return role_; @@ -79,4 +79,4 @@ private: notch_sptr notch_filter_; }; -#endif //GNSS_SDR_NOTCH_FILTER_H_ +#endif // GNSS_SDR_NOTCH_FILTER_H_ diff --git a/src/algorithms/input_filter/adapters/notch_filter_lite.cc b/src/algorithms/input_filter/adapters/notch_filter_lite.cc index 6ebf5cb05..a8feac37e 100644 --- a/src/algorithms/input_filter/adapters/notch_filter_lite.cc +++ b/src/algorithms/input_filter/adapters/notch_filter_lite.cc @@ -98,9 +98,6 @@ NotchFilterLite::NotchFilterLite(ConfigurationInterface* configuration, const st } -NotchFilterLite::~NotchFilterLite() = default; - - void NotchFilterLite::connect(gr::top_block_sptr top_block) { if (dump_) diff --git a/src/algorithms/input_filter/adapters/notch_filter_lite.h b/src/algorithms/input_filter/adapters/notch_filter_lite.h index d8352706d..0053f5e09 100644 --- a/src/algorithms/input_filter/adapters/notch_filter_lite.h +++ b/src/algorithms/input_filter/adapters/notch_filter_lite.h @@ -48,7 +48,7 @@ public: const std::string& role, unsigned int in_streams, unsigned int out_streams); - virtual ~NotchFilterLite(); + ~NotchFilterLite() = default; std::string role() { return role_; @@ -79,4 +79,4 @@ private: notch_lite_sptr notch_filter_lite_; }; -#endif //GNSS_SDR_NOTCH_FILTER_LITE_H_ +#endif // GNSS_SDR_NOTCH_FILTER_LITE_H_ diff --git a/src/algorithms/input_filter/adapters/pulse_blanking_filter.cc b/src/algorithms/input_filter/adapters/pulse_blanking_filter.cc index 67b86c817..806dc3978 100644 --- a/src/algorithms/input_filter/adapters/pulse_blanking_filter.cc +++ b/src/algorithms/input_filter/adapters/pulse_blanking_filter.cc @@ -105,9 +105,6 @@ PulseBlankingFilter::PulseBlankingFilter(ConfigurationInterface* configuration, } -PulseBlankingFilter::~PulseBlankingFilter() = default; - - void PulseBlankingFilter::connect(gr::top_block_sptr top_block) { if (input_item_type_ == "gr_complex") diff --git a/src/algorithms/input_filter/adapters/pulse_blanking_filter.h b/src/algorithms/input_filter/adapters/pulse_blanking_filter.h index 87f8c4994..a9c04c5af 100644 --- a/src/algorithms/input_filter/adapters/pulse_blanking_filter.h +++ b/src/algorithms/input_filter/adapters/pulse_blanking_filter.h @@ -51,7 +51,7 @@ public: std::string role, unsigned int in_streams, unsigned int out_streams); - virtual ~PulseBlankingFilter(); + ~PulseBlankingFilter() = default; inline std::string role() override { diff --git a/src/algorithms/libs/pass_through.cc b/src/algorithms/libs/pass_through.cc index 549740b84..8ca0127e1 100644 --- a/src/algorithms/libs/pass_through.cc +++ b/src/algorithms/libs/pass_through.cc @@ -129,9 +129,6 @@ Pass_Through::Pass_Through(ConfigurationInterface* configuration, const std::str } -Pass_Through::~Pass_Through() = default; - - void Pass_Through::connect(gr::top_block_sptr top_block) { if (top_block) diff --git a/src/algorithms/libs/pass_through.h b/src/algorithms/libs/pass_through.h index ec8046862..d15091dc9 100644 --- a/src/algorithms/libs/pass_through.h +++ b/src/algorithms/libs/pass_through.h @@ -56,7 +56,7 @@ public: unsigned int in_stream, unsigned int out_stream); - virtual ~Pass_Through(); + ~Pass_Through() = default; inline std::string role() override { diff --git a/src/algorithms/observables/adapters/hybrid_observables.cc b/src/algorithms/observables/adapters/hybrid_observables.cc index e038e47ff..6842ff9ea 100644 --- a/src/algorithms/observables/adapters/hybrid_observables.cc +++ b/src/algorithms/observables/adapters/hybrid_observables.cc @@ -50,9 +50,6 @@ HybridObservables::HybridObservables(ConfigurationInterface* configuration, } -HybridObservables::~HybridObservables() = default; - - void HybridObservables::connect(gr::top_block_sptr top_block) { if (top_block) diff --git a/src/algorithms/observables/adapters/hybrid_observables.h b/src/algorithms/observables/adapters/hybrid_observables.h index 7e2d6c674..1ae5adf2a 100644 --- a/src/algorithms/observables/adapters/hybrid_observables.h +++ b/src/algorithms/observables/adapters/hybrid_observables.h @@ -54,7 +54,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~HybridObservables(); + ~HybridObservables() = default; inline std::string role() override { diff --git a/src/algorithms/resampler/adapters/direct_resampler_conditioner.cc b/src/algorithms/resampler/adapters/direct_resampler_conditioner.cc index 37e60b6fa..a6c3f2a4b 100644 --- a/src/algorithms/resampler/adapters/direct_resampler_conditioner.cc +++ b/src/algorithms/resampler/adapters/direct_resampler_conditioner.cc @@ -113,9 +113,6 @@ DirectResamplerConditioner::DirectResamplerConditioner( } -DirectResamplerConditioner::~DirectResamplerConditioner() = default; - - void DirectResamplerConditioner::connect(gr::top_block_sptr top_block) { if (dump_) diff --git a/src/algorithms/resampler/adapters/direct_resampler_conditioner.h b/src/algorithms/resampler/adapters/direct_resampler_conditioner.h index 300ce297f..642e4da9b 100644 --- a/src/algorithms/resampler/adapters/direct_resampler_conditioner.h +++ b/src/algorithms/resampler/adapters/direct_resampler_conditioner.h @@ -50,7 +50,7 @@ public: const std::string& role, unsigned int in_stream, unsigned int out_stream); - virtual ~DirectResamplerConditioner(); + ~DirectResamplerConditioner() = default; inline std::string role() override { diff --git a/src/algorithms/resampler/adapters/mmse_resampler_conditioner.cc b/src/algorithms/resampler/adapters/mmse_resampler_conditioner.cc index 4639f1a78..e51859d96 100644 --- a/src/algorithms/resampler/adapters/mmse_resampler_conditioner.cc +++ b/src/algorithms/resampler/adapters/mmse_resampler_conditioner.cc @@ -105,9 +105,6 @@ MmseResamplerConditioner::MmseResamplerConditioner( } -MmseResamplerConditioner::~MmseResamplerConditioner() = default; - - void MmseResamplerConditioner::connect(gr::top_block_sptr top_block) { if (dump_) diff --git a/src/algorithms/resampler/adapters/mmse_resampler_conditioner.h b/src/algorithms/resampler/adapters/mmse_resampler_conditioner.h index 641975e83..644c88deb 100644 --- a/src/algorithms/resampler/adapters/mmse_resampler_conditioner.h +++ b/src/algorithms/resampler/adapters/mmse_resampler_conditioner.h @@ -58,7 +58,7 @@ public: const std::string& role, unsigned int in_stream, unsigned int out_stream); - virtual ~MmseResamplerConditioner(); + ~MmseResamplerConditioner() = default; inline std::string role() override { diff --git a/src/algorithms/resampler/gnuradio_blocks/direct_resampler_conditioner_cb.cc b/src/algorithms/resampler/gnuradio_blocks/direct_resampler_conditioner_cb.cc index 99948c3bb..a0fdc1824 100644 --- a/src/algorithms/resampler/gnuradio_blocks/direct_resampler_conditioner_cb.cc +++ b/src/algorithms/resampler/gnuradio_blocks/direct_resampler_conditioner_cb.cc @@ -70,9 +70,6 @@ direct_resampler_conditioner_cb::direct_resampler_conditioner_cb( } -direct_resampler_conditioner_cb::~direct_resampler_conditioner_cb() = default; - - void direct_resampler_conditioner_cb::forecast(int noutput_items, gr_vector_int &ninput_items_required) { diff --git a/src/algorithms/resampler/gnuradio_blocks/direct_resampler_conditioner_cb.h b/src/algorithms/resampler/gnuradio_blocks/direct_resampler_conditioner_cb.h index e7ceb9683..3c7a92174 100644 --- a/src/algorithms/resampler/gnuradio_blocks/direct_resampler_conditioner_cb.h +++ b/src/algorithms/resampler/gnuradio_blocks/direct_resampler_conditioner_cb.h @@ -50,7 +50,7 @@ direct_resampler_conditioner_cb_sptr direct_resampler_make_conditioner_cb( class direct_resampler_conditioner_cb : public gr::block { public: - ~direct_resampler_conditioner_cb(); + ~direct_resampler_conditioner_cb() = default; inline unsigned int sample_freq_in() const { diff --git a/src/algorithms/resampler/gnuradio_blocks/direct_resampler_conditioner_cc.cc b/src/algorithms/resampler/gnuradio_blocks/direct_resampler_conditioner_cc.cc index b302272ca..8529fb8f0 100644 --- a/src/algorithms/resampler/gnuradio_blocks/direct_resampler_conditioner_cc.cc +++ b/src/algorithms/resampler/gnuradio_blocks/direct_resampler_conditioner_cc.cc @@ -68,9 +68,6 @@ direct_resampler_conditioner_cc::direct_resampler_conditioner_cc( } -direct_resampler_conditioner_cc::~direct_resampler_conditioner_cc() = default; - - void direct_resampler_conditioner_cc::forecast(int noutput_items, gr_vector_int &ninput_items_required) { diff --git a/src/algorithms/resampler/gnuradio_blocks/direct_resampler_conditioner_cc.h b/src/algorithms/resampler/gnuradio_blocks/direct_resampler_conditioner_cc.h index 6469aada5..88092561d 100644 --- a/src/algorithms/resampler/gnuradio_blocks/direct_resampler_conditioner_cc.h +++ b/src/algorithms/resampler/gnuradio_blocks/direct_resampler_conditioner_cc.h @@ -58,7 +58,7 @@ direct_resampler_conditioner_cc_sptr direct_resampler_make_conditioner_cc( class direct_resampler_conditioner_cc : public gr::block { public: - ~direct_resampler_conditioner_cc(); + ~direct_resampler_conditioner_cc() = default; inline unsigned int sample_freq_in() const { return d_sample_freq_in; diff --git a/src/algorithms/resampler/gnuradio_blocks/direct_resampler_conditioner_cs.cc b/src/algorithms/resampler/gnuradio_blocks/direct_resampler_conditioner_cs.cc index 6a4b5a8d3..0b338d981 100644 --- a/src/algorithms/resampler/gnuradio_blocks/direct_resampler_conditioner_cs.cc +++ b/src/algorithms/resampler/gnuradio_blocks/direct_resampler_conditioner_cs.cc @@ -71,9 +71,6 @@ direct_resampler_conditioner_cs::direct_resampler_conditioner_cs( } -direct_resampler_conditioner_cs::~direct_resampler_conditioner_cs() = default; - - void direct_resampler_conditioner_cs::forecast(int noutput_items, gr_vector_int &ninput_items_required) { diff --git a/src/algorithms/resampler/gnuradio_blocks/direct_resampler_conditioner_cs.h b/src/algorithms/resampler/gnuradio_blocks/direct_resampler_conditioner_cs.h index 5b643be93..a47bef251 100644 --- a/src/algorithms/resampler/gnuradio_blocks/direct_resampler_conditioner_cs.h +++ b/src/algorithms/resampler/gnuradio_blocks/direct_resampler_conditioner_cs.h @@ -50,7 +50,7 @@ direct_resampler_conditioner_cs_sptr direct_resampler_make_conditioner_cs( class direct_resampler_conditioner_cs : public gr::block { public: - ~direct_resampler_conditioner_cs(); + ~direct_resampler_conditioner_cs() = default; inline unsigned int sample_freq_in() const { diff --git a/src/algorithms/signal_generator/adapters/signal_generator.cc b/src/algorithms/signal_generator/adapters/signal_generator.cc index 31636f246..700cd6810 100644 --- a/src/algorithms/signal_generator/adapters/signal_generator.cc +++ b/src/algorithms/signal_generator/adapters/signal_generator.cc @@ -156,9 +156,6 @@ SignalGenerator::SignalGenerator(ConfigurationInterface* configuration, } -SignalGenerator::~SignalGenerator() = default; - - void SignalGenerator::connect(gr::top_block_sptr top_block) { if (item_type_ == "gr_complex") diff --git a/src/algorithms/signal_generator/adapters/signal_generator.h b/src/algorithms/signal_generator/adapters/signal_generator.h index d2adfc27e..73a408d3f 100644 --- a/src/algorithms/signal_generator/adapters/signal_generator.h +++ b/src/algorithms/signal_generator/adapters/signal_generator.h @@ -56,7 +56,7 @@ public: const std::string& role, unsigned int in_stream, unsigned int out_stream, std::shared_ptr > queue); - virtual ~SignalGenerator(); + ~SignalGenerator() = default; inline std::string role() override { diff --git a/src/algorithms/signal_source/adapters/custom_udp_signal_source.cc b/src/algorithms/signal_source/adapters/custom_udp_signal_source.cc index a130b32f8..192db786d 100644 --- a/src/algorithms/signal_source/adapters/custom_udp_signal_source.cc +++ b/src/algorithms/signal_source/adapters/custom_udp_signal_source.cc @@ -109,9 +109,6 @@ CustomUDPSignalSource::CustomUDPSignalSource(ConfigurationInterface* configurati } -CustomUDPSignalSource::~CustomUDPSignalSource() = default; - - void CustomUDPSignalSource::connect(gr::top_block_sptr top_block) { // connect null sinks to unused streams diff --git a/src/algorithms/signal_source/adapters/custom_udp_signal_source.h b/src/algorithms/signal_source/adapters/custom_udp_signal_source.h index 3d8d400de..ac0f85d41 100644 --- a/src/algorithms/signal_source/adapters/custom_udp_signal_source.h +++ b/src/algorithms/signal_source/adapters/custom_udp_signal_source.h @@ -57,7 +57,7 @@ public: const std::string& role, unsigned int in_stream, unsigned int out_stream, std::shared_ptr> queue); - virtual ~CustomUDPSignalSource(); + ~CustomUDPSignalSource() = default; inline std::string role() override { diff --git a/src/algorithms/signal_source/adapters/file_signal_source.cc b/src/algorithms/signal_source/adapters/file_signal_source.cc index b478b6363..ee6f8d7cd 100644 --- a/src/algorithms/signal_source/adapters/file_signal_source.cc +++ b/src/algorithms/signal_source/adapters/file_signal_source.cc @@ -255,9 +255,6 @@ FileSignalSource::FileSignalSource(ConfigurationInterface* configuration, } -FileSignalSource::~FileSignalSource() = default; - - void FileSignalSource::connect(gr::top_block_sptr top_block) { if (samples_ > 0) diff --git a/src/algorithms/signal_source/adapters/file_signal_source.h b/src/algorithms/signal_source/adapters/file_signal_source.h index 86d87798a..16a8a2c44 100644 --- a/src/algorithms/signal_source/adapters/file_signal_source.h +++ b/src/algorithms/signal_source/adapters/file_signal_source.h @@ -59,7 +59,7 @@ public: unsigned int in_streams, unsigned int out_streams, std::shared_ptr> queue); - virtual ~FileSignalSource(); + ~FileSignalSource() = default; inline std::string role() override { diff --git a/src/algorithms/signal_source/adapters/flexiband_signal_source.cc b/src/algorithms/signal_source/adapters/flexiband_signal_source.cc index 478a6973d..5fd4b8dbc 100644 --- a/src/algorithms/signal_source/adapters/flexiband_signal_source.cc +++ b/src/algorithms/signal_source/adapters/flexiband_signal_source.cc @@ -111,9 +111,6 @@ FlexibandSignalSource::FlexibandSignalSource(ConfigurationInterface* configurati } -FlexibandSignalSource::~FlexibandSignalSource() = default; - - void FlexibandSignalSource::connect(gr::top_block_sptr top_block) { for (int n = 0; n < (n_channels_ * 2); n++) diff --git a/src/algorithms/signal_source/adapters/flexiband_signal_source.h b/src/algorithms/signal_source/adapters/flexiband_signal_source.h index 56c2aff09..ca2b87ba0 100644 --- a/src/algorithms/signal_source/adapters/flexiband_signal_source.h +++ b/src/algorithms/signal_source/adapters/flexiband_signal_source.h @@ -59,7 +59,7 @@ public: const std::string& role, unsigned int in_stream, unsigned int out_stream, std::shared_ptr> queue); - virtual ~FlexibandSignalSource(); + ~FlexibandSignalSource() = default; inline std::string role() override { diff --git a/src/algorithms/signal_source/adapters/gn3s_signal_source.cc b/src/algorithms/signal_source/adapters/gn3s_signal_source.cc index 4a699d09d..3c6adf815 100644 --- a/src/algorithms/signal_source/adapters/gn3s_signal_source.cc +++ b/src/algorithms/signal_source/adapters/gn3s_signal_source.cc @@ -75,11 +75,6 @@ Gn3sSignalSource::Gn3sSignalSource(ConfigurationInterface* configuration, } -Gn3sSignalSource::~Gn3sSignalSource() -{ -} - - void Gn3sSignalSource::connect(gr::top_block_sptr top_block) { if (dump_) diff --git a/src/algorithms/signal_source/adapters/gn3s_signal_source.h b/src/algorithms/signal_source/adapters/gn3s_signal_source.h index e34b91afe..caf7cae02 100644 --- a/src/algorithms/signal_source/adapters/gn3s_signal_source.h +++ b/src/algorithms/signal_source/adapters/gn3s_signal_source.h @@ -52,7 +52,7 @@ public: std::string role, unsigned int in_stream, unsigned int out_stream, std::shared_ptr> queue); - virtual ~Gn3sSignalSource(); + ~Gn3sSignalSource() = default; inline std::string role() override { diff --git a/src/algorithms/signal_source/adapters/labsat_signal_source.cc b/src/algorithms/signal_source/adapters/labsat_signal_source.cc index e6366261a..442c3d907 100644 --- a/src/algorithms/signal_source/adapters/labsat_signal_source.cc +++ b/src/algorithms/signal_source/adapters/labsat_signal_source.cc @@ -82,9 +82,6 @@ LabsatSignalSource::LabsatSignalSource(ConfigurationInterface* configuration, } -LabsatSignalSource::~LabsatSignalSource() = default; - - void LabsatSignalSource::connect(gr::top_block_sptr top_block) { if (dump_) diff --git a/src/algorithms/signal_source/adapters/labsat_signal_source.h b/src/algorithms/signal_source/adapters/labsat_signal_source.h index 9bf5d2057..094f98cab 100644 --- a/src/algorithms/signal_source/adapters/labsat_signal_source.h +++ b/src/algorithms/signal_source/adapters/labsat_signal_source.h @@ -51,7 +51,7 @@ public: const std::string& role, unsigned int in_stream, unsigned int out_stream, std::shared_ptr> queue); - virtual ~LabsatSignalSource(); + ~LabsatSignalSource() = default; inline std::string role() override { diff --git a/src/algorithms/signal_source/adapters/multichannel_file_signal_source.cc b/src/algorithms/signal_source/adapters/multichannel_file_signal_source.cc index 330b3e43c..88b0c231e 100644 --- a/src/algorithms/signal_source/adapters/multichannel_file_signal_source.cc +++ b/src/algorithms/signal_source/adapters/multichannel_file_signal_source.cc @@ -249,9 +249,6 @@ MultichannelFileSignalSource::MultichannelFileSignalSource(ConfigurationInterfac } -MultichannelFileSignalSource::~MultichannelFileSignalSource() = default; - - void MultichannelFileSignalSource::connect(gr::top_block_sptr top_block) { if (enable_throttle_control_ == true) diff --git a/src/algorithms/signal_source/adapters/multichannel_file_signal_source.h b/src/algorithms/signal_source/adapters/multichannel_file_signal_source.h index db3a9c57c..6e6c5e648 100644 --- a/src/algorithms/signal_source/adapters/multichannel_file_signal_source.h +++ b/src/algorithms/signal_source/adapters/multichannel_file_signal_source.h @@ -59,7 +59,7 @@ public: unsigned int in_streams, unsigned int out_streams, std::shared_ptr> queue); - virtual ~MultichannelFileSignalSource(); + ~MultichannelFileSignalSource() = default; inline std::string role() override { diff --git a/src/algorithms/signal_source/adapters/nsr_file_signal_source.cc b/src/algorithms/signal_source/adapters/nsr_file_signal_source.cc index dc00bcecb..25868eeb3 100644 --- a/src/algorithms/signal_source/adapters/nsr_file_signal_source.cc +++ b/src/algorithms/signal_source/adapters/nsr_file_signal_source.cc @@ -181,9 +181,6 @@ NsrFileSignalSource::NsrFileSignalSource(ConfigurationInterface* configuration, } -NsrFileSignalSource::~NsrFileSignalSource() = default; - - void NsrFileSignalSource::connect(gr::top_block_sptr top_block) { if (samples_ > 0) diff --git a/src/algorithms/signal_source/adapters/nsr_file_signal_source.h b/src/algorithms/signal_source/adapters/nsr_file_signal_source.h index 2efaa09b3..c36e08be0 100644 --- a/src/algorithms/signal_source/adapters/nsr_file_signal_source.h +++ b/src/algorithms/signal_source/adapters/nsr_file_signal_source.h @@ -58,7 +58,7 @@ public: unsigned int in_streams, unsigned int out_streams, std::shared_ptr> queue); - virtual ~NsrFileSignalSource(); + ~NsrFileSignalSource() = default; inline std::string role() override { return role_; diff --git a/src/algorithms/signal_source/adapters/osmosdr_signal_source.cc b/src/algorithms/signal_source/adapters/osmosdr_signal_source.cc index 38f823248..6b1fec12a 100644 --- a/src/algorithms/signal_source/adapters/osmosdr_signal_source.cc +++ b/src/algorithms/signal_source/adapters/osmosdr_signal_source.cc @@ -155,9 +155,6 @@ OsmosdrSignalSource::OsmosdrSignalSource(ConfigurationInterface* configuration, } -OsmosdrSignalSource::~OsmosdrSignalSource() = default; - - void OsmosdrSignalSource::driver_instance() { try diff --git a/src/algorithms/signal_source/adapters/osmosdr_signal_source.h b/src/algorithms/signal_source/adapters/osmosdr_signal_source.h index 8a96f32d6..7fbbb1e8b 100644 --- a/src/algorithms/signal_source/adapters/osmosdr_signal_source.h +++ b/src/algorithms/signal_source/adapters/osmosdr_signal_source.h @@ -57,7 +57,7 @@ public: const std::string& role, unsigned int in_stream, unsigned int out_stream, std::shared_ptr> queue); - virtual ~OsmosdrSignalSource(); + ~OsmosdrSignalSource() = default; inline std::string role() override { diff --git a/src/algorithms/signal_source/adapters/plutosdr_signal_source.cc b/src/algorithms/signal_source/adapters/plutosdr_signal_source.cc index ba6af1fd6..8aa96e3a4 100644 --- a/src/algorithms/signal_source/adapters/plutosdr_signal_source.cc +++ b/src/algorithms/signal_source/adapters/plutosdr_signal_source.cc @@ -103,9 +103,6 @@ PlutosdrSignalSource::PlutosdrSignalSource(ConfigurationInterface* configuration } -PlutosdrSignalSource::~PlutosdrSignalSource() = default; - - void PlutosdrSignalSource::connect(gr::top_block_sptr top_block) { if (samples_ != 0) diff --git a/src/algorithms/signal_source/adapters/plutosdr_signal_source.h b/src/algorithms/signal_source/adapters/plutosdr_signal_source.h index bc105d171..7b2ccb6b1 100644 --- a/src/algorithms/signal_source/adapters/plutosdr_signal_source.h +++ b/src/algorithms/signal_source/adapters/plutosdr_signal_source.h @@ -56,7 +56,7 @@ public: const std::string& role, unsigned int in_stream, unsigned int out_stream, std::shared_ptr> queue); - virtual ~PlutosdrSignalSource(); + ~PlutosdrSignalSource() = default; std::string role() override { diff --git a/src/algorithms/signal_source/adapters/raw_array_signal_source.cc b/src/algorithms/signal_source/adapters/raw_array_signal_source.cc index d54a7cb19..611597940 100644 --- a/src/algorithms/signal_source/adapters/raw_array_signal_source.cc +++ b/src/algorithms/signal_source/adapters/raw_array_signal_source.cc @@ -94,9 +94,6 @@ RawArraySignalSource::RawArraySignalSource(ConfigurationInterface* configuration } -RawArraySignalSource::~RawArraySignalSource() = default; - - void RawArraySignalSource::connect(gr::top_block_sptr top_block) { if (dump_) diff --git a/src/algorithms/signal_source/adapters/raw_array_signal_source.h b/src/algorithms/signal_source/adapters/raw_array_signal_source.h index 750efb3fe..96848afda 100644 --- a/src/algorithms/signal_source/adapters/raw_array_signal_source.h +++ b/src/algorithms/signal_source/adapters/raw_array_signal_source.h @@ -51,7 +51,7 @@ public: std::string role, unsigned int in_stream, unsigned int out_stream, std::shared_ptr> queue); - virtual ~RawArraySignalSource(); + ~RawArraySignalSource() = default; inline std::string role() override { diff --git a/src/algorithms/signal_source/adapters/rtl_tcp_signal_source.cc b/src/algorithms/signal_source/adapters/rtl_tcp_signal_source.cc index 478e6b1c7..0f608e62f 100644 --- a/src/algorithms/signal_source/adapters/rtl_tcp_signal_source.cc +++ b/src/algorithms/signal_source/adapters/rtl_tcp_signal_source.cc @@ -46,9 +46,9 @@ RtlTcpSignalSource::RtlTcpSignalSource(ConfigurationInterface* configuration, unsigned int in_stream, unsigned int out_stream, std::shared_ptr> queue) : role_(role), - in_stream_(in_stream), - out_stream_(out_stream), - queue_(std::move(queue)) + in_stream_(in_stream), + out_stream_(out_stream), + queue_(std::move(queue)) { // DUMP PARAMETERS std::string empty = ""; @@ -143,9 +143,6 @@ RtlTcpSignalSource::RtlTcpSignalSource(ConfigurationInterface* configuration, } -RtlTcpSignalSource::~RtlTcpSignalSource() = default; - - void RtlTcpSignalSource::MakeBlock() { try diff --git a/src/algorithms/signal_source/adapters/rtl_tcp_signal_source.h b/src/algorithms/signal_source/adapters/rtl_tcp_signal_source.h index 2fcb9d871..6e649ddd0 100644 --- a/src/algorithms/signal_source/adapters/rtl_tcp_signal_source.h +++ b/src/algorithms/signal_source/adapters/rtl_tcp_signal_source.h @@ -60,7 +60,7 @@ public: unsigned int out_stream, std::shared_ptr> queue); - virtual ~RtlTcpSignalSource(); + ~RtlTcpSignalSource() = default; inline std::string role() override { diff --git a/src/algorithms/signal_source/adapters/spir_file_signal_source.cc b/src/algorithms/signal_source/adapters/spir_file_signal_source.cc index 91287020c..f17b3d4dd 100644 --- a/src/algorithms/signal_source/adapters/spir_file_signal_source.cc +++ b/src/algorithms/signal_source/adapters/spir_file_signal_source.cc @@ -180,9 +180,6 @@ SpirFileSignalSource::SpirFileSignalSource(ConfigurationInterface* configuration } -SpirFileSignalSource::~SpirFileSignalSource() = default; - - void SpirFileSignalSource::connect(gr::top_block_sptr top_block) { if (samples_ > 0) diff --git a/src/algorithms/signal_source/adapters/spir_file_signal_source.h b/src/algorithms/signal_source/adapters/spir_file_signal_source.h index 09aff8c09..7b84b2d65 100644 --- a/src/algorithms/signal_source/adapters/spir_file_signal_source.h +++ b/src/algorithms/signal_source/adapters/spir_file_signal_source.h @@ -56,7 +56,7 @@ public: unsigned int in_streams, unsigned int out_streams, std::shared_ptr> queue); - virtual ~SpirFileSignalSource(); + ~SpirFileSignalSource() = default; inline std::string role() override { return role_; diff --git a/src/algorithms/signal_source/adapters/spir_gss6450_file_signal_source.cc b/src/algorithms/signal_source/adapters/spir_gss6450_file_signal_source.cc index 4b6239ba5..4b28d30df 100644 --- a/src/algorithms/signal_source/adapters/spir_gss6450_file_signal_source.cc +++ b/src/algorithms/signal_source/adapters/spir_gss6450_file_signal_source.cc @@ -179,9 +179,6 @@ SpirGSS6450FileSignalSource::SpirGSS6450FileSignalSource(ConfigurationInterface* } -SpirGSS6450FileSignalSource::~SpirGSS6450FileSignalSource() = default; - - void SpirGSS6450FileSignalSource::connect(gr::top_block_sptr top_block) { if (samples_ > 0) diff --git a/src/algorithms/signal_source/adapters/spir_gss6450_file_signal_source.h b/src/algorithms/signal_source/adapters/spir_gss6450_file_signal_source.h index 61edd479c..66103fd7f 100644 --- a/src/algorithms/signal_source/adapters/spir_gss6450_file_signal_source.h +++ b/src/algorithms/signal_source/adapters/spir_gss6450_file_signal_source.h @@ -61,7 +61,7 @@ public: SpirGSS6450FileSignalSource(ConfigurationInterface* configuration, const std::string& role, uint32_t in_streams, uint32_t out_streams, std::shared_ptr> queue); - virtual ~SpirGSS6450FileSignalSource(); + ~SpirGSS6450FileSignalSource() = default; inline std::string role() override { return role_; diff --git a/src/algorithms/signal_source/adapters/two_bit_cpx_file_signal_source.cc b/src/algorithms/signal_source/adapters/two_bit_cpx_file_signal_source.cc index 9e0b802d4..5e0e6b1e8 100644 --- a/src/algorithms/signal_source/adapters/two_bit_cpx_file_signal_source.cc +++ b/src/algorithms/signal_source/adapters/two_bit_cpx_file_signal_source.cc @@ -46,9 +46,9 @@ TwoBitCpxFileSignalSource::TwoBitCpxFileSignalSource(ConfigurationInterface* con unsigned int in_streams, unsigned int out_streams, std::shared_ptr> queue) : role_(role), - in_streams_(in_streams), - out_streams_(out_streams), - queue_(std::move(queue)) + in_streams_(in_streams), + out_streams_(out_streams), + queue_(std::move(queue)) { std::string default_filename = "../data/my_capture.dat"; std::string default_item_type = "byte"; @@ -186,9 +186,6 @@ TwoBitCpxFileSignalSource::TwoBitCpxFileSignalSource(ConfigurationInterface* con } -TwoBitCpxFileSignalSource::~TwoBitCpxFileSignalSource() = default; - - void TwoBitCpxFileSignalSource::connect(gr::top_block_sptr top_block) { if (samples_ > 0) diff --git a/src/algorithms/signal_source/adapters/two_bit_cpx_file_signal_source.h b/src/algorithms/signal_source/adapters/two_bit_cpx_file_signal_source.h index dea315cec..8bd31b4f8 100644 --- a/src/algorithms/signal_source/adapters/two_bit_cpx_file_signal_source.h +++ b/src/algorithms/signal_source/adapters/two_bit_cpx_file_signal_source.h @@ -62,7 +62,7 @@ public: unsigned int out_streams, std::shared_ptr> queue); - virtual ~TwoBitCpxFileSignalSource(); + ~TwoBitCpxFileSignalSource() = default; inline std::string role() override { return role_; diff --git a/src/algorithms/signal_source/adapters/two_bit_packed_file_signal_source.cc b/src/algorithms/signal_source/adapters/two_bit_packed_file_signal_source.cc index 4b0c00345..b60a7b210 100644 --- a/src/algorithms/signal_source/adapters/two_bit_packed_file_signal_source.cc +++ b/src/algorithms/signal_source/adapters/two_bit_packed_file_signal_source.cc @@ -48,9 +48,9 @@ TwoBitPackedFileSignalSource::TwoBitPackedFileSignalSource(ConfigurationInterfac unsigned int in_streams, unsigned int out_streams, std::shared_ptr> queue) : role_(role), - in_streams_(in_streams), - out_streams_(out_streams), - queue_(std::move(queue)) + in_streams_(in_streams), + out_streams_(out_streams), + queue_(std::move(queue)) { std::string default_filename = "../data/my_capture.dat"; std::string default_item_type = "byte"; @@ -250,9 +250,6 @@ TwoBitPackedFileSignalSource::TwoBitPackedFileSignalSource(ConfigurationInterfac } -TwoBitPackedFileSignalSource::~TwoBitPackedFileSignalSource() = default; - - void TwoBitPackedFileSignalSource::connect(gr::top_block_sptr top_block) { gr::basic_block_sptr left_block = file_source_; diff --git a/src/algorithms/signal_source/adapters/two_bit_packed_file_signal_source.h b/src/algorithms/signal_source/adapters/two_bit_packed_file_signal_source.h index ea2bb2d5a..a9018fc3c 100644 --- a/src/algorithms/signal_source/adapters/two_bit_packed_file_signal_source.h +++ b/src/algorithms/signal_source/adapters/two_bit_packed_file_signal_source.h @@ -61,7 +61,7 @@ public: unsigned int in_streams, unsigned int out_streams, std::shared_ptr> queue); - virtual ~TwoBitPackedFileSignalSource(); + ~TwoBitPackedFileSignalSource() = default; inline std::string role() override { return role_; diff --git a/src/algorithms/signal_source/adapters/uhd_signal_source.cc b/src/algorithms/signal_source/adapters/uhd_signal_source.cc index 16ab70b8e..dc2de3603 100644 --- a/src/algorithms/signal_source/adapters/uhd_signal_source.cc +++ b/src/algorithms/signal_source/adapters/uhd_signal_source.cc @@ -238,9 +238,6 @@ UhdSignalSource::UhdSignalSource(ConfigurationInterface* configuration, } -UhdSignalSource::~UhdSignalSource() = default; - - void UhdSignalSource::connect(gr::top_block_sptr top_block) { for (int i = 0; i < RF_channels_; i++) diff --git a/src/algorithms/signal_source/adapters/uhd_signal_source.h b/src/algorithms/signal_source/adapters/uhd_signal_source.h index 232f6934f..d6b401fac 100644 --- a/src/algorithms/signal_source/adapters/uhd_signal_source.h +++ b/src/algorithms/signal_source/adapters/uhd_signal_source.h @@ -55,7 +55,7 @@ public: const std::string& role, unsigned int in_stream, unsigned int out_stream, std::shared_ptr> queue); - virtual ~UhdSignalSource(); + ~UhdSignalSource() = default; inline std::string role() override { diff --git a/src/algorithms/signal_source/gnuradio_blocks/unpack_2bit_samples.cc b/src/algorithms/signal_source/gnuradio_blocks/unpack_2bit_samples.cc index db56ff0b2..7f09e0647 100644 --- a/src/algorithms/signal_source/gnuradio_blocks/unpack_2bit_samples.cc +++ b/src/algorithms/signal_source/gnuradio_blocks/unpack_2bit_samples.cc @@ -133,9 +133,6 @@ unpack_2bit_samples::unpack_2bit_samples(bool big_endian_bytes, } -unpack_2bit_samples::~unpack_2bit_samples() = default; - - int unpack_2bit_samples::work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) diff --git a/src/algorithms/signal_source/gnuradio_blocks/unpack_2bit_samples.h b/src/algorithms/signal_source/gnuradio_blocks/unpack_2bit_samples.h index f91e2d8d4..d477e71b4 100644 --- a/src/algorithms/signal_source/gnuradio_blocks/unpack_2bit_samples.h +++ b/src/algorithms/signal_source/gnuradio_blocks/unpack_2bit_samples.h @@ -89,7 +89,7 @@ unpack_2bit_samples_sptr make_unpack_2bit_samples( class unpack_2bit_samples : public gr::sync_interpolator { public: - ~unpack_2bit_samples(); + ~unpack_2bit_samples() = default; unpack_2bit_samples(bool big_endian_bytes, size_t item_size, diff --git a/src/algorithms/signal_source/gnuradio_blocks/unpack_byte_2bit_cpx_samples.cc b/src/algorithms/signal_source/gnuradio_blocks/unpack_byte_2bit_cpx_samples.cc index 692bc22d7..32a74e4a3 100644 --- a/src/algorithms/signal_source/gnuradio_blocks/unpack_byte_2bit_cpx_samples.cc +++ b/src/algorithms/signal_source/gnuradio_blocks/unpack_byte_2bit_cpx_samples.cc @@ -57,9 +57,6 @@ unpack_byte_2bit_cpx_samples::unpack_byte_2bit_cpx_samples() : sync_interpolator } -unpack_byte_2bit_cpx_samples::~unpack_byte_2bit_cpx_samples() = default; - - int unpack_byte_2bit_cpx_samples::work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) diff --git a/src/algorithms/signal_source/gnuradio_blocks/unpack_byte_2bit_cpx_samples.h b/src/algorithms/signal_source/gnuradio_blocks/unpack_byte_2bit_cpx_samples.h index b399aba19..3c178285d 100644 --- a/src/algorithms/signal_source/gnuradio_blocks/unpack_byte_2bit_cpx_samples.h +++ b/src/algorithms/signal_source/gnuradio_blocks/unpack_byte_2bit_cpx_samples.h @@ -51,7 +51,7 @@ class unpack_byte_2bit_cpx_samples : public gr::sync_interpolator { public: unpack_byte_2bit_cpx_samples(); - ~unpack_byte_2bit_cpx_samples(); + ~unpack_byte_2bit_cpx_samples() = default; int work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); diff --git a/src/algorithms/signal_source/gnuradio_blocks/unpack_byte_2bit_samples.cc b/src/algorithms/signal_source/gnuradio_blocks/unpack_byte_2bit_samples.cc index 28637016b..e5a162b39 100644 --- a/src/algorithms/signal_source/gnuradio_blocks/unpack_byte_2bit_samples.cc +++ b/src/algorithms/signal_source/gnuradio_blocks/unpack_byte_2bit_samples.cc @@ -52,9 +52,6 @@ unpack_byte_2bit_samples::unpack_byte_2bit_samples() : sync_interpolator("unpack } -unpack_byte_2bit_samples::~unpack_byte_2bit_samples() = default; - - int unpack_byte_2bit_samples::work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) diff --git a/src/algorithms/signal_source/gnuradio_blocks/unpack_byte_2bit_samples.h b/src/algorithms/signal_source/gnuradio_blocks/unpack_byte_2bit_samples.h index b9b86c503..24d5847f1 100644 --- a/src/algorithms/signal_source/gnuradio_blocks/unpack_byte_2bit_samples.h +++ b/src/algorithms/signal_source/gnuradio_blocks/unpack_byte_2bit_samples.h @@ -47,7 +47,7 @@ class unpack_byte_2bit_samples : public gr::sync_interpolator { public: unpack_byte_2bit_samples(); - ~unpack_byte_2bit_samples(); + ~unpack_byte_2bit_samples() = default; int work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); diff --git a/src/algorithms/signal_source/gnuradio_blocks/unpack_byte_4bit_samples.cc b/src/algorithms/signal_source/gnuradio_blocks/unpack_byte_4bit_samples.cc index b20ccf21f..ccec3a713 100644 --- a/src/algorithms/signal_source/gnuradio_blocks/unpack_byte_4bit_samples.cc +++ b/src/algorithms/signal_source/gnuradio_blocks/unpack_byte_4bit_samples.cc @@ -47,9 +47,6 @@ unpack_byte_4bit_samples::unpack_byte_4bit_samples() : sync_interpolator("unpack } -unpack_byte_4bit_samples::~unpack_byte_4bit_samples() = default; - - int unpack_byte_4bit_samples::work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) diff --git a/src/algorithms/signal_source/gnuradio_blocks/unpack_byte_4bit_samples.h b/src/algorithms/signal_source/gnuradio_blocks/unpack_byte_4bit_samples.h index 599590a2c..e2614c9bf 100644 --- a/src/algorithms/signal_source/gnuradio_blocks/unpack_byte_4bit_samples.h +++ b/src/algorithms/signal_source/gnuradio_blocks/unpack_byte_4bit_samples.h @@ -49,7 +49,7 @@ class unpack_byte_4bit_samples : public gr::sync_interpolator { public: unpack_byte_4bit_samples(); - ~unpack_byte_4bit_samples(); + ~unpack_byte_4bit_samples() = default; int work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); diff --git a/src/algorithms/signal_source/gnuradio_blocks/unpack_intspir_1bit_samples.cc b/src/algorithms/signal_source/gnuradio_blocks/unpack_intspir_1bit_samples.cc index f2a805f17..f89c41f24 100644 --- a/src/algorithms/signal_source/gnuradio_blocks/unpack_intspir_1bit_samples.cc +++ b/src/algorithms/signal_source/gnuradio_blocks/unpack_intspir_1bit_samples.cc @@ -47,9 +47,6 @@ unpack_intspir_1bit_samples::unpack_intspir_1bit_samples() : sync_interpolator(" } -unpack_intspir_1bit_samples::~unpack_intspir_1bit_samples() = default; - - int unpack_intspir_1bit_samples::work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) diff --git a/src/algorithms/signal_source/gnuradio_blocks/unpack_intspir_1bit_samples.h b/src/algorithms/signal_source/gnuradio_blocks/unpack_intspir_1bit_samples.h index 7be626bf7..b09708150 100644 --- a/src/algorithms/signal_source/gnuradio_blocks/unpack_intspir_1bit_samples.h +++ b/src/algorithms/signal_source/gnuradio_blocks/unpack_intspir_1bit_samples.h @@ -47,7 +47,7 @@ class unpack_intspir_1bit_samples : public gr::sync_interpolator { public: unpack_intspir_1bit_samples(); - ~unpack_intspir_1bit_samples(); + ~unpack_intspir_1bit_samples() = default; int work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); diff --git a/src/algorithms/signal_source/gnuradio_blocks/unpack_spir_gss6450_samples.cc b/src/algorithms/signal_source/gnuradio_blocks/unpack_spir_gss6450_samples.cc index 02b9e3d30..c2a9e5fc7 100644 --- a/src/algorithms/signal_source/gnuradio_blocks/unpack_spir_gss6450_samples.cc +++ b/src/algorithms/signal_source/gnuradio_blocks/unpack_spir_gss6450_samples.cc @@ -49,9 +49,6 @@ unpack_spir_gss6450_samples::unpack_spir_gss6450_samples(unsigned int adc_nbit) } -unpack_spir_gss6450_samples::~unpack_spir_gss6450_samples() = default; - - void unpack_spir_gss6450_samples::decode_4bits_word(uint32_t input_uint32, gr_complex* out, int adc_bits) { int8_t tmp_char; diff --git a/src/algorithms/signal_source/gnuradio_blocks/unpack_spir_gss6450_samples.h b/src/algorithms/signal_source/gnuradio_blocks/unpack_spir_gss6450_samples.h index dcb0552ca..4098961a5 100644 --- a/src/algorithms/signal_source/gnuradio_blocks/unpack_spir_gss6450_samples.h +++ b/src/algorithms/signal_source/gnuradio_blocks/unpack_spir_gss6450_samples.h @@ -49,7 +49,7 @@ public: friend unpack_spir_gss6450_samples_sptr make_unpack_spir_gss6450_samples_sptr(unsigned int adc_nbit); void decode_4bits_word(uint32_t input_uint32, gr_complex *out, int adc_bits); unpack_spir_gss6450_samples(unsigned int adc_nbit); - ~unpack_spir_gss6450_samples(); + ~unpack_spir_gss6450_samples() = default; private: unsigned int adc_bits; diff --git a/src/algorithms/telemetry_decoder/adapters/beidou_b1i_telemetry_decoder.cc b/src/algorithms/telemetry_decoder/adapters/beidou_b1i_telemetry_decoder.cc index 0850297cf..66766ab1c 100644 --- a/src/algorithms/telemetry_decoder/adapters/beidou_b1i_telemetry_decoder.cc +++ b/src/algorithms/telemetry_decoder/adapters/beidou_b1i_telemetry_decoder.cc @@ -61,9 +61,6 @@ BeidouB1iTelemetryDecoder::BeidouB1iTelemetryDecoder(ConfigurationInterface* con } -BeidouB1iTelemetryDecoder::~BeidouB1iTelemetryDecoder() = default; - - void BeidouB1iTelemetryDecoder::set_satellite(const Gnss_Satellite& satellite) { satellite_ = Gnss_Satellite(satellite.get_system(), satellite.get_PRN()); diff --git a/src/algorithms/telemetry_decoder/adapters/beidou_b1i_telemetry_decoder.h b/src/algorithms/telemetry_decoder/adapters/beidou_b1i_telemetry_decoder.h index cf6d466fe..9ec4eacd4 100644 --- a/src/algorithms/telemetry_decoder/adapters/beidou_b1i_telemetry_decoder.h +++ b/src/algorithms/telemetry_decoder/adapters/beidou_b1i_telemetry_decoder.h @@ -54,7 +54,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~BeidouB1iTelemetryDecoder(); + ~BeidouB1iTelemetryDecoder() = default; inline std::string role() override { diff --git a/src/algorithms/telemetry_decoder/adapters/beidou_b3i_telemetry_decoder.cc b/src/algorithms/telemetry_decoder/adapters/beidou_b3i_telemetry_decoder.cc index 702041239..110b4cb74 100644 --- a/src/algorithms/telemetry_decoder/adapters/beidou_b3i_telemetry_decoder.cc +++ b/src/algorithms/telemetry_decoder/adapters/beidou_b3i_telemetry_decoder.cc @@ -34,7 +34,7 @@ #include BeidouB3iTelemetryDecoder::BeidouB3iTelemetryDecoder( - ConfigurationInterface *configuration, const std::string& role, + ConfigurationInterface *configuration, const std::string &role, unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) { @@ -58,9 +58,6 @@ BeidouB3iTelemetryDecoder::BeidouB3iTelemetryDecoder( } -BeidouB3iTelemetryDecoder::~BeidouB3iTelemetryDecoder() = default; - - void BeidouB3iTelemetryDecoder::set_satellite(const Gnss_Satellite &satellite) { satellite_ = Gnss_Satellite(satellite.get_system(), satellite.get_PRN()); diff --git a/src/algorithms/telemetry_decoder/adapters/beidou_b3i_telemetry_decoder.h b/src/algorithms/telemetry_decoder/adapters/beidou_b3i_telemetry_decoder.h index f38f6c3b4..17b02a202 100644 --- a/src/algorithms/telemetry_decoder/adapters/beidou_b3i_telemetry_decoder.h +++ b/src/algorithms/telemetry_decoder/adapters/beidou_b3i_telemetry_decoder.h @@ -51,7 +51,7 @@ public: const std::string &role, unsigned int in_streams, unsigned int out_streams); - virtual ~BeidouB3iTelemetryDecoder(); + ~BeidouB3iTelemetryDecoder() = default; inline std::string role() override { return role_; } diff --git a/src/algorithms/telemetry_decoder/adapters/galileo_e1b_telemetry_decoder.cc b/src/algorithms/telemetry_decoder/adapters/galileo_e1b_telemetry_decoder.cc index f6614cd5f..fe97a9b2f 100644 --- a/src/algorithms/telemetry_decoder/adapters/galileo_e1b_telemetry_decoder.cc +++ b/src/algorithms/telemetry_decoder/adapters/galileo_e1b_telemetry_decoder.cc @@ -62,9 +62,6 @@ GalileoE1BTelemetryDecoder::GalileoE1BTelemetryDecoder(ConfigurationInterface* c } -GalileoE1BTelemetryDecoder::~GalileoE1BTelemetryDecoder() = default; - - void GalileoE1BTelemetryDecoder::set_satellite(const Gnss_Satellite& satellite) { satellite_ = Gnss_Satellite(satellite.get_system(), satellite.get_PRN()); diff --git a/src/algorithms/telemetry_decoder/adapters/galileo_e1b_telemetry_decoder.h b/src/algorithms/telemetry_decoder/adapters/galileo_e1b_telemetry_decoder.h index 5a00b5887..4082cbeca 100644 --- a/src/algorithms/telemetry_decoder/adapters/galileo_e1b_telemetry_decoder.h +++ b/src/algorithms/telemetry_decoder/adapters/galileo_e1b_telemetry_decoder.h @@ -56,7 +56,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GalileoE1BTelemetryDecoder(); + ~GalileoE1BTelemetryDecoder() = default; inline std::string role() override { diff --git a/src/algorithms/telemetry_decoder/adapters/galileo_e5a_telemetry_decoder.cc b/src/algorithms/telemetry_decoder/adapters/galileo_e5a_telemetry_decoder.cc index 7c1dff20f..fbcacf310 100644 --- a/src/algorithms/telemetry_decoder/adapters/galileo_e5a_telemetry_decoder.cc +++ b/src/algorithms/telemetry_decoder/adapters/galileo_e5a_telemetry_decoder.cc @@ -65,9 +65,6 @@ GalileoE5aTelemetryDecoder::GalileoE5aTelemetryDecoder(ConfigurationInterface* c } -GalileoE5aTelemetryDecoder::~GalileoE5aTelemetryDecoder() = default; - - void GalileoE5aTelemetryDecoder::set_satellite(const Gnss_Satellite& satellite) { satellite_ = Gnss_Satellite(satellite.get_system(), satellite.get_PRN()); diff --git a/src/algorithms/telemetry_decoder/adapters/galileo_e5a_telemetry_decoder.h b/src/algorithms/telemetry_decoder/adapters/galileo_e5a_telemetry_decoder.h index 55ae5a6e8..b40283b11 100644 --- a/src/algorithms/telemetry_decoder/adapters/galileo_e5a_telemetry_decoder.h +++ b/src/algorithms/telemetry_decoder/adapters/galileo_e5a_telemetry_decoder.h @@ -57,7 +57,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GalileoE5aTelemetryDecoder(); + ~GalileoE5aTelemetryDecoder() = default; inline std::string role() override { diff --git a/src/algorithms/telemetry_decoder/adapters/glonass_l1_ca_telemetry_decoder.cc b/src/algorithms/telemetry_decoder/adapters/glonass_l1_ca_telemetry_decoder.cc index fce316a5d..fd692bb21 100644 --- a/src/algorithms/telemetry_decoder/adapters/glonass_l1_ca_telemetry_decoder.cc +++ b/src/algorithms/telemetry_decoder/adapters/glonass_l1_ca_telemetry_decoder.cc @@ -62,9 +62,6 @@ GlonassL1CaTelemetryDecoder::GlonassL1CaTelemetryDecoder(ConfigurationInterface* } -GlonassL1CaTelemetryDecoder::~GlonassL1CaTelemetryDecoder() = default; - - void GlonassL1CaTelemetryDecoder::set_satellite(const Gnss_Satellite& satellite) { satellite_ = Gnss_Satellite(satellite.get_system(), satellite.get_PRN()); diff --git a/src/algorithms/telemetry_decoder/adapters/glonass_l1_ca_telemetry_decoder.h b/src/algorithms/telemetry_decoder/adapters/glonass_l1_ca_telemetry_decoder.h index ae031a3f0..89c4c21fd 100644 --- a/src/algorithms/telemetry_decoder/adapters/glonass_l1_ca_telemetry_decoder.h +++ b/src/algorithms/telemetry_decoder/adapters/glonass_l1_ca_telemetry_decoder.h @@ -54,7 +54,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GlonassL1CaTelemetryDecoder(); + ~GlonassL1CaTelemetryDecoder() = default; std::string role() override { return role_; diff --git a/src/algorithms/telemetry_decoder/adapters/glonass_l2_ca_telemetry_decoder.cc b/src/algorithms/telemetry_decoder/adapters/glonass_l2_ca_telemetry_decoder.cc index 2c8aad54f..9fbf9583b 100644 --- a/src/algorithms/telemetry_decoder/adapters/glonass_l2_ca_telemetry_decoder.cc +++ b/src/algorithms/telemetry_decoder/adapters/glonass_l2_ca_telemetry_decoder.cc @@ -61,9 +61,6 @@ GlonassL2CaTelemetryDecoder::GlonassL2CaTelemetryDecoder(ConfigurationInterface* } -GlonassL2CaTelemetryDecoder::~GlonassL2CaTelemetryDecoder() = default; - - void GlonassL2CaTelemetryDecoder::set_satellite(const Gnss_Satellite& satellite) { satellite_ = Gnss_Satellite(satellite.get_system(), satellite.get_PRN()); diff --git a/src/algorithms/telemetry_decoder/adapters/glonass_l2_ca_telemetry_decoder.h b/src/algorithms/telemetry_decoder/adapters/glonass_l2_ca_telemetry_decoder.h index cdd6be49d..de722a93f 100644 --- a/src/algorithms/telemetry_decoder/adapters/glonass_l2_ca_telemetry_decoder.h +++ b/src/algorithms/telemetry_decoder/adapters/glonass_l2_ca_telemetry_decoder.h @@ -53,7 +53,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GlonassL2CaTelemetryDecoder(); + ~GlonassL2CaTelemetryDecoder() = default; std::string role() override { return role_; diff --git a/src/algorithms/telemetry_decoder/adapters/gps_l1_ca_telemetry_decoder.cc b/src/algorithms/telemetry_decoder/adapters/gps_l1_ca_telemetry_decoder.cc index 5fadb8025..f389eef1d 100644 --- a/src/algorithms/telemetry_decoder/adapters/gps_l1_ca_telemetry_decoder.cc +++ b/src/algorithms/telemetry_decoder/adapters/gps_l1_ca_telemetry_decoder.cc @@ -61,9 +61,6 @@ GpsL1CaTelemetryDecoder::GpsL1CaTelemetryDecoder(ConfigurationInterface* configu } -GpsL1CaTelemetryDecoder::~GpsL1CaTelemetryDecoder() = default; - - void GpsL1CaTelemetryDecoder::set_satellite(const Gnss_Satellite& satellite) { satellite_ = Gnss_Satellite(satellite.get_system(), satellite.get_PRN()); diff --git a/src/algorithms/telemetry_decoder/adapters/gps_l1_ca_telemetry_decoder.h b/src/algorithms/telemetry_decoder/adapters/gps_l1_ca_telemetry_decoder.h index af1959226..0c899be8e 100644 --- a/src/algorithms/telemetry_decoder/adapters/gps_l1_ca_telemetry_decoder.h +++ b/src/algorithms/telemetry_decoder/adapters/gps_l1_ca_telemetry_decoder.h @@ -53,7 +53,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GpsL1CaTelemetryDecoder(); + ~GpsL1CaTelemetryDecoder() = default; inline std::string role() override { diff --git a/src/algorithms/telemetry_decoder/adapters/gps_l2c_telemetry_decoder.cc b/src/algorithms/telemetry_decoder/adapters/gps_l2c_telemetry_decoder.cc index eccee3f2d..8d088e2e9 100644 --- a/src/algorithms/telemetry_decoder/adapters/gps_l2c_telemetry_decoder.cc +++ b/src/algorithms/telemetry_decoder/adapters/gps_l2c_telemetry_decoder.cc @@ -61,9 +61,6 @@ GpsL2CTelemetryDecoder::GpsL2CTelemetryDecoder(ConfigurationInterface* configura } -GpsL2CTelemetryDecoder::~GpsL2CTelemetryDecoder() = default; - - void GpsL2CTelemetryDecoder::set_satellite(const Gnss_Satellite& satellite) { satellite_ = Gnss_Satellite(satellite.get_system(), satellite.get_PRN()); diff --git a/src/algorithms/telemetry_decoder/adapters/gps_l2c_telemetry_decoder.h b/src/algorithms/telemetry_decoder/adapters/gps_l2c_telemetry_decoder.h index b1ff4d866..1d33abcaa 100644 --- a/src/algorithms/telemetry_decoder/adapters/gps_l2c_telemetry_decoder.h +++ b/src/algorithms/telemetry_decoder/adapters/gps_l2c_telemetry_decoder.h @@ -53,7 +53,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GpsL2CTelemetryDecoder(); + ~GpsL2CTelemetryDecoder() = default; inline std::string role() override { diff --git a/src/algorithms/telemetry_decoder/adapters/gps_l5_telemetry_decoder.cc b/src/algorithms/telemetry_decoder/adapters/gps_l5_telemetry_decoder.cc index c50ec9f51..ac98b8e45 100644 --- a/src/algorithms/telemetry_decoder/adapters/gps_l5_telemetry_decoder.cc +++ b/src/algorithms/telemetry_decoder/adapters/gps_l5_telemetry_decoder.cc @@ -61,9 +61,6 @@ GpsL5TelemetryDecoder::GpsL5TelemetryDecoder(ConfigurationInterface* configurati } -GpsL5TelemetryDecoder::~GpsL5TelemetryDecoder() = default; - - void GpsL5TelemetryDecoder::set_satellite(const Gnss_Satellite& satellite) { satellite_ = Gnss_Satellite(satellite.get_system(), satellite.get_PRN()); diff --git a/src/algorithms/telemetry_decoder/adapters/gps_l5_telemetry_decoder.h b/src/algorithms/telemetry_decoder/adapters/gps_l5_telemetry_decoder.h index 40d4bd62e..d97904346 100644 --- a/src/algorithms/telemetry_decoder/adapters/gps_l5_telemetry_decoder.h +++ b/src/algorithms/telemetry_decoder/adapters/gps_l5_telemetry_decoder.h @@ -55,7 +55,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GpsL5TelemetryDecoder(); + ~GpsL5TelemetryDecoder() = default; inline std::string role() override { diff --git a/src/algorithms/telemetry_decoder/adapters/sbas_l1_telemetry_decoder.cc b/src/algorithms/telemetry_decoder/adapters/sbas_l1_telemetry_decoder.cc index 2621402ab..1c88ec4a6 100644 --- a/src/algorithms/telemetry_decoder/adapters/sbas_l1_telemetry_decoder.cc +++ b/src/algorithms/telemetry_decoder/adapters/sbas_l1_telemetry_decoder.cc @@ -61,9 +61,6 @@ SbasL1TelemetryDecoder::SbasL1TelemetryDecoder(ConfigurationInterface* configura } -SbasL1TelemetryDecoder::~SbasL1TelemetryDecoder() = default; - - void SbasL1TelemetryDecoder::set_satellite(const Gnss_Satellite& satellite) { satellite_ = Gnss_Satellite(satellite.get_system(), satellite.get_PRN()); diff --git a/src/algorithms/telemetry_decoder/adapters/sbas_l1_telemetry_decoder.h b/src/algorithms/telemetry_decoder/adapters/sbas_l1_telemetry_decoder.h index 94671da4b..cf09159c5 100644 --- a/src/algorithms/telemetry_decoder/adapters/sbas_l1_telemetry_decoder.h +++ b/src/algorithms/telemetry_decoder/adapters/sbas_l1_telemetry_decoder.h @@ -55,7 +55,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~SbasL1TelemetryDecoder(); + ~SbasL1TelemetryDecoder() = default; inline std::string role() override { diff --git a/src/algorithms/tracking/adapters/beidou_b1i_dll_pll_tracking.cc b/src/algorithms/tracking/adapters/beidou_b1i_dll_pll_tracking.cc index ca7a1a045..b7a243301 100644 --- a/src/algorithms/tracking/adapters/beidou_b1i_dll_pll_tracking.cc +++ b/src/algorithms/tracking/adapters/beidou_b1i_dll_pll_tracking.cc @@ -183,14 +183,12 @@ BeidouB1iDllPllTracking::BeidouB1iDllPllTracking( } -BeidouB1iDllPllTracking::~BeidouB1iDllPllTracking() = default; - - void BeidouB1iDllPllTracking::start_tracking() { tracking_->start_tracking(); } + void BeidouB1iDllPllTracking::stop_tracking() { tracking_->stop_tracking(); diff --git a/src/algorithms/tracking/adapters/beidou_b1i_dll_pll_tracking.h b/src/algorithms/tracking/adapters/beidou_b1i_dll_pll_tracking.h index 0716c0142..78af587b8 100644 --- a/src/algorithms/tracking/adapters/beidou_b1i_dll_pll_tracking.h +++ b/src/algorithms/tracking/adapters/beidou_b1i_dll_pll_tracking.h @@ -54,7 +54,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~BeidouB1iDllPllTracking(); + ~BeidouB1iDllPllTracking() = default; inline std::string role() override { diff --git a/src/algorithms/tracking/adapters/beidou_b3i_dll_pll_tracking.cc b/src/algorithms/tracking/adapters/beidou_b3i_dll_pll_tracking.cc index b5e4339ef..7d7131fa3 100644 --- a/src/algorithms/tracking/adapters/beidou_b3i_dll_pll_tracking.cc +++ b/src/algorithms/tracking/adapters/beidou_b3i_dll_pll_tracking.cc @@ -187,9 +187,6 @@ BeidouB3iDllPllTracking::BeidouB3iDllPllTracking( } -BeidouB3iDllPllTracking::~BeidouB3iDllPllTracking() = default; - - void BeidouB3iDllPllTracking::start_tracking() { tracking_->start_tracking(); diff --git a/src/algorithms/tracking/adapters/beidou_b3i_dll_pll_tracking.h b/src/algorithms/tracking/adapters/beidou_b3i_dll_pll_tracking.h index d56d10069..c057c807e 100644 --- a/src/algorithms/tracking/adapters/beidou_b3i_dll_pll_tracking.h +++ b/src/algorithms/tracking/adapters/beidou_b3i_dll_pll_tracking.h @@ -54,7 +54,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~BeidouB3iDllPllTracking(); + ~BeidouB3iDllPllTracking() = default; inline std::string role() override { diff --git a/src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking.cc b/src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking.cc index 62e36c4a8..754b3ec3a 100644 --- a/src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking.cc +++ b/src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking.cc @@ -192,9 +192,6 @@ GalileoE1DllPllVemlTracking::GalileoE1DllPllVemlTracking( } -GalileoE1DllPllVemlTracking::~GalileoE1DllPllVemlTracking() = default; - - void GalileoE1DllPllVemlTracking::stop_tracking() { } diff --git a/src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking.h b/src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking.h index 035daf48e..a0dacbfff 100644 --- a/src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking.h +++ b/src/algorithms/tracking/adapters/galileo_e1_dll_pll_veml_tracking.h @@ -56,7 +56,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GalileoE1DllPllVemlTracking(); + ~GalileoE1DllPllVemlTracking() = default; inline std::string role() override { diff --git a/src/algorithms/tracking/adapters/galileo_e1_tcp_connector_tracking.cc b/src/algorithms/tracking/adapters/galileo_e1_tcp_connector_tracking.cc index 7864dcea4..cc0792fc5 100644 --- a/src/algorithms/tracking/adapters/galileo_e1_tcp_connector_tracking.cc +++ b/src/algorithms/tracking/adapters/galileo_e1_tcp_connector_tracking.cc @@ -114,9 +114,6 @@ GalileoE1TcpConnectorTracking::GalileoE1TcpConnectorTracking( } -GalileoE1TcpConnectorTracking::~GalileoE1TcpConnectorTracking() = default; - - void GalileoE1TcpConnectorTracking::stop_tracking() { } @@ -142,6 +139,7 @@ void GalileoE1TcpConnectorTracking::set_gnss_synchro(Gnss_Synchro* p_gnss_synchr tracking_->set_gnss_synchro(p_gnss_synchro); } + void GalileoE1TcpConnectorTracking::connect(gr::top_block_sptr top_block) { if (top_block) @@ -150,6 +148,7 @@ void GalileoE1TcpConnectorTracking::connect(gr::top_block_sptr top_block) //nothing to connect, now the tracking uses gr_sync_decimator } + void GalileoE1TcpConnectorTracking::disconnect(gr::top_block_sptr top_block) { if (top_block) @@ -158,11 +157,13 @@ void GalileoE1TcpConnectorTracking::disconnect(gr::top_block_sptr top_block) //nothing to disconnect, now the tracking uses gr_sync_decimator } + gr::basic_block_sptr GalileoE1TcpConnectorTracking::get_left_block() { return tracking_; } + gr::basic_block_sptr GalileoE1TcpConnectorTracking::get_right_block() { return tracking_; diff --git a/src/algorithms/tracking/adapters/galileo_e1_tcp_connector_tracking.h b/src/algorithms/tracking/adapters/galileo_e1_tcp_connector_tracking.h index ff68056f7..1db7ec363 100644 --- a/src/algorithms/tracking/adapters/galileo_e1_tcp_connector_tracking.h +++ b/src/algorithms/tracking/adapters/galileo_e1_tcp_connector_tracking.h @@ -57,7 +57,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GalileoE1TcpConnectorTracking(); + ~GalileoE1TcpConnectorTracking() = default; inline std::string role() override { diff --git a/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking.cc b/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking.cc index 6b790063f..201597bbf 100644 --- a/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking.cc +++ b/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking.cc @@ -188,9 +188,6 @@ GalileoE5aDllPllTracking::GalileoE5aDllPllTracking( } -GalileoE5aDllPllTracking::~GalileoE5aDllPllTracking() = default; - - void GalileoE5aDllPllTracking::stop_tracking() { } diff --git a/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking.h b/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking.h index fe29757d7..723208277 100644 --- a/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking.h +++ b/src/algorithms/tracking/adapters/galileo_e5a_dll_pll_tracking.h @@ -54,7 +54,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GalileoE5aDllPllTracking(); + ~GalileoE5aDllPllTracking() = default; inline std::string role() override { diff --git a/src/algorithms/tracking/adapters/glonass_l1_ca_dll_pll_c_aid_tracking.cc b/src/algorithms/tracking/adapters/glonass_l1_ca_dll_pll_c_aid_tracking.cc index 0c425cf0c..983f16863 100644 --- a/src/algorithms/tracking/adapters/glonass_l1_ca_dll_pll_c_aid_tracking.cc +++ b/src/algorithms/tracking/adapters/glonass_l1_ca_dll_pll_c_aid_tracking.cc @@ -135,9 +135,6 @@ GlonassL1CaDllPllCAidTracking::GlonassL1CaDllPllCAidTracking( } -GlonassL1CaDllPllCAidTracking::~GlonassL1CaDllPllCAidTracking() = default; - - void GlonassL1CaDllPllCAidTracking::stop_tracking() { } diff --git a/src/algorithms/tracking/adapters/glonass_l1_ca_dll_pll_c_aid_tracking.h b/src/algorithms/tracking/adapters/glonass_l1_ca_dll_pll_c_aid_tracking.h index d50003964..3ca61a690 100644 --- a/src/algorithms/tracking/adapters/glonass_l1_ca_dll_pll_c_aid_tracking.h +++ b/src/algorithms/tracking/adapters/glonass_l1_ca_dll_pll_c_aid_tracking.h @@ -58,7 +58,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GlonassL1CaDllPllCAidTracking(); + ~GlonassL1CaDllPllCAidTracking() = default; inline std::string role() override { diff --git a/src/algorithms/tracking/adapters/glonass_l1_ca_dll_pll_tracking.cc b/src/algorithms/tracking/adapters/glonass_l1_ca_dll_pll_tracking.cc index dc4b39f9a..90359e119 100644 --- a/src/algorithms/tracking/adapters/glonass_l1_ca_dll_pll_tracking.cc +++ b/src/algorithms/tracking/adapters/glonass_l1_ca_dll_pll_tracking.cc @@ -108,9 +108,6 @@ GlonassL1CaDllPllTracking::GlonassL1CaDllPllTracking( } -GlonassL1CaDllPllTracking::~GlonassL1CaDllPllTracking() = default; - - void GlonassL1CaDllPllTracking::stop_tracking() { } diff --git a/src/algorithms/tracking/adapters/glonass_l1_ca_dll_pll_tracking.h b/src/algorithms/tracking/adapters/glonass_l1_ca_dll_pll_tracking.h index cd8482113..1bb0a3a44 100644 --- a/src/algorithms/tracking/adapters/glonass_l1_ca_dll_pll_tracking.h +++ b/src/algorithms/tracking/adapters/glonass_l1_ca_dll_pll_tracking.h @@ -56,7 +56,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GlonassL1CaDllPllTracking(); + ~GlonassL1CaDllPllTracking() = default; inline std::string role() override { diff --git a/src/algorithms/tracking/adapters/glonass_l2_ca_dll_pll_c_aid_tracking.cc b/src/algorithms/tracking/adapters/glonass_l2_ca_dll_pll_c_aid_tracking.cc index 15bdbd3ae..bb91fa4d3 100644 --- a/src/algorithms/tracking/adapters/glonass_l2_ca_dll_pll_c_aid_tracking.cc +++ b/src/algorithms/tracking/adapters/glonass_l2_ca_dll_pll_c_aid_tracking.cc @@ -133,9 +133,6 @@ GlonassL2CaDllPllCAidTracking::GlonassL2CaDllPllCAidTracking( } -GlonassL2CaDllPllCAidTracking::~GlonassL2CaDllPllCAidTracking() = default; - - void GlonassL2CaDllPllCAidTracking::stop_tracking() { } diff --git a/src/algorithms/tracking/adapters/glonass_l2_ca_dll_pll_c_aid_tracking.h b/src/algorithms/tracking/adapters/glonass_l2_ca_dll_pll_c_aid_tracking.h index b5659c527..6d6613a49 100644 --- a/src/algorithms/tracking/adapters/glonass_l2_ca_dll_pll_c_aid_tracking.h +++ b/src/algorithms/tracking/adapters/glonass_l2_ca_dll_pll_c_aid_tracking.h @@ -56,7 +56,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GlonassL2CaDllPllCAidTracking(); + ~GlonassL2CaDllPllCAidTracking() = default; inline std::string role() override { diff --git a/src/algorithms/tracking/adapters/glonass_l2_ca_dll_pll_tracking.cc b/src/algorithms/tracking/adapters/glonass_l2_ca_dll_pll_tracking.cc index 9647e4f20..6f2086f33 100644 --- a/src/algorithms/tracking/adapters/glonass_l2_ca_dll_pll_tracking.cc +++ b/src/algorithms/tracking/adapters/glonass_l2_ca_dll_pll_tracking.cc @@ -106,9 +106,6 @@ GlonassL2CaDllPllTracking::GlonassL2CaDllPllTracking( } -GlonassL2CaDllPllTracking::~GlonassL2CaDllPllTracking() = default; - - void GlonassL2CaDllPllTracking::stop_tracking() { } diff --git a/src/algorithms/tracking/adapters/glonass_l2_ca_dll_pll_tracking.h b/src/algorithms/tracking/adapters/glonass_l2_ca_dll_pll_tracking.h index 1ca41a94b..4dc60f587 100644 --- a/src/algorithms/tracking/adapters/glonass_l2_ca_dll_pll_tracking.h +++ b/src/algorithms/tracking/adapters/glonass_l2_ca_dll_pll_tracking.h @@ -55,7 +55,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GlonassL2CaDllPllTracking(); + ~GlonassL2CaDllPllTracking() = default; inline std::string role() override { diff --git a/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking.cc b/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking.cc index ad8e9d920..668ae88f8 100644 --- a/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking.cc +++ b/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking.cc @@ -194,9 +194,6 @@ GpsL1CaDllPllTracking::GpsL1CaDllPllTracking( } -GpsL1CaDllPllTracking::~GpsL1CaDllPllTracking() = default; - - void GpsL1CaDllPllTracking::stop_tracking() { tracking_->stop_tracking(); diff --git a/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking.h b/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking.h index 288de9ae0..b0138fa8a 100644 --- a/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking.h +++ b/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_tracking.h @@ -55,7 +55,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GpsL1CaDllPllTracking(); + ~GpsL1CaDllPllTracking() = default; inline std::string role() override { diff --git a/src/algorithms/tracking/adapters/gps_l1_ca_kf_tracking.cc b/src/algorithms/tracking/adapters/gps_l1_ca_kf_tracking.cc index c3b96d3e5..855c9436c 100644 --- a/src/algorithms/tracking/adapters/gps_l1_ca_kf_tracking.cc +++ b/src/algorithms/tracking/adapters/gps_l1_ca_kf_tracking.cc @@ -118,9 +118,6 @@ GpsL1CaKfTracking::GpsL1CaKfTracking( } -GpsL1CaKfTracking::~GpsL1CaKfTracking() = default; - - void GpsL1CaKfTracking::stop_tracking() { } diff --git a/src/algorithms/tracking/adapters/gps_l1_ca_kf_tracking.h b/src/algorithms/tracking/adapters/gps_l1_ca_kf_tracking.h index e26198619..9aad5abf3 100644 --- a/src/algorithms/tracking/adapters/gps_l1_ca_kf_tracking.h +++ b/src/algorithms/tracking/adapters/gps_l1_ca_kf_tracking.h @@ -57,7 +57,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GpsL1CaKfTracking(); + ~GpsL1CaKfTracking() = default; inline std::string role() override { diff --git a/src/algorithms/tracking/adapters/gps_l1_ca_tcp_connector_tracking.cc b/src/algorithms/tracking/adapters/gps_l1_ca_tcp_connector_tracking.cc index 2cb2d0741..2c06dffb4 100644 --- a/src/algorithms/tracking/adapters/gps_l1_ca_tcp_connector_tracking.cc +++ b/src/algorithms/tracking/adapters/gps_l1_ca_tcp_connector_tracking.cc @@ -98,9 +98,6 @@ GpsL1CaTcpConnectorTracking::GpsL1CaTcpConnectorTracking( } -GpsL1CaTcpConnectorTracking::~GpsL1CaTcpConnectorTracking() = default; - - void GpsL1CaTcpConnectorTracking::stop_tracking() { } @@ -126,6 +123,7 @@ void GpsL1CaTcpConnectorTracking::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) tracking_->set_gnss_synchro(p_gnss_synchro); } + void GpsL1CaTcpConnectorTracking::connect(gr::top_block_sptr top_block) { if (top_block) @@ -134,6 +132,7 @@ void GpsL1CaTcpConnectorTracking::connect(gr::top_block_sptr top_block) //nothing to connect, now the tracking uses gr_sync_decimator } + void GpsL1CaTcpConnectorTracking::disconnect(gr::top_block_sptr top_block) { if (top_block) @@ -142,11 +141,13 @@ void GpsL1CaTcpConnectorTracking::disconnect(gr::top_block_sptr top_block) //nothing to disconnect, now the tracking uses gr_sync_decimator } + gr::basic_block_sptr GpsL1CaTcpConnectorTracking::get_left_block() { return tracking_; } + gr::basic_block_sptr GpsL1CaTcpConnectorTracking::get_right_block() { return tracking_; diff --git a/src/algorithms/tracking/adapters/gps_l1_ca_tcp_connector_tracking.h b/src/algorithms/tracking/adapters/gps_l1_ca_tcp_connector_tracking.h index 1e910839e..b31ca921d 100644 --- a/src/algorithms/tracking/adapters/gps_l1_ca_tcp_connector_tracking.h +++ b/src/algorithms/tracking/adapters/gps_l1_ca_tcp_connector_tracking.h @@ -56,7 +56,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GpsL1CaTcpConnectorTracking(); + ~GpsL1CaTcpConnectorTracking() = default; inline std::string role() override { @@ -91,6 +91,7 @@ public: void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) override; void start_tracking() override; + /*! * \brief Stop running tracking */ @@ -99,9 +100,7 @@ public: private: gps_l1_ca_tcp_connector_tracking_cc_sptr tracking_; size_t item_size_; - unsigned int channel_; - std::string role_; unsigned int in_streams_; unsigned int out_streams_; diff --git a/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking.cc b/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking.cc index 98304fec5..5d6587d78 100644 --- a/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking.cc +++ b/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking.cc @@ -170,13 +170,11 @@ GpsL2MDllPllTracking::GpsL2MDllPllTracking( } -GpsL2MDllPllTracking::~GpsL2MDllPllTracking() = default; - - void GpsL2MDllPllTracking::stop_tracking() { } + void GpsL2MDllPllTracking::start_tracking() { tracking_->start_tracking(); diff --git a/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking.h b/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking.h index 20618a4cf..297b6f8cc 100644 --- a/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking.h +++ b/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking.h @@ -55,7 +55,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GpsL2MDllPllTracking(); + ~GpsL2MDllPllTracking() = default; inline std::string role() override { @@ -90,6 +90,7 @@ public: void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) override; void start_tracking() override; + /*! * \brief Stop running tracking */ diff --git a/src/algorithms/tracking/adapters/gps_l5_dll_pll_tracking.cc b/src/algorithms/tracking/adapters/gps_l5_dll_pll_tracking.cc index 8595a3fdc..d7c4d0454 100644 --- a/src/algorithms/tracking/adapters/gps_l5_dll_pll_tracking.cc +++ b/src/algorithms/tracking/adapters/gps_l5_dll_pll_tracking.cc @@ -190,9 +190,6 @@ GpsL5DllPllTracking::GpsL5DllPllTracking( } -GpsL5DllPllTracking::~GpsL5DllPllTracking() = default; - - void GpsL5DllPllTracking::stop_tracking() { } diff --git a/src/algorithms/tracking/adapters/gps_l5_dll_pll_tracking.h b/src/algorithms/tracking/adapters/gps_l5_dll_pll_tracking.h index 763df8bb0..8b71b442b 100644 --- a/src/algorithms/tracking/adapters/gps_l5_dll_pll_tracking.h +++ b/src/algorithms/tracking/adapters/gps_l5_dll_pll_tracking.h @@ -54,7 +54,7 @@ public: unsigned int in_streams, unsigned int out_streams); - virtual ~GpsL5DllPllTracking(); + ~GpsL5DllPllTracking() = default; inline std::string role() override { diff --git a/src/algorithms/tracking/libs/bayesian_estimation.cc b/src/algorithms/tracking/libs/bayesian_estimation.cc index 73ab4cd3e..1c4c56a88 100644 --- a/src/algorithms/tracking/libs/bayesian_estimation.cc +++ b/src/algorithms/tracking/libs/bayesian_estimation.cc @@ -6,10 +6,10 @@ * the properties of a stochastic process based on a sequence of * discrete samples of the sequence. * - * [1]: LaMountain, Gerald, Vilà-Valls, Jordi, Closas, Pau, "Bayesian - * Covariance Estimation for Kalman Filter based Digital Carrier + * [1]: LaMountain, Gerald, Vilà-Valls, Jordi, Closas, Pau, "Bayesian + * Covariance Estimation for Kalman Filter based Digital Carrier * Synchronization," Proceedings of the 31st International Technical Meeting - * of the Satellite Division of The Institute of Navigation + * of the Satellite Division of The Institute of Navigation * (ION GNSS+ 2018), Miami, Florida, September 2018, pp. 3575-3586. * https://doi.org/10.33012/2018.15911 * @@ -57,6 +57,7 @@ Bayesian_estimator::Bayesian_estimator() Psi_est = Psi_prior; } + Bayesian_estimator::Bayesian_estimator(int ny) { mu_prior = arma::zeros(ny, 1); @@ -68,6 +69,7 @@ Bayesian_estimator::Bayesian_estimator(int ny) Psi_est = Psi_prior; } + Bayesian_estimator::Bayesian_estimator(const arma::vec& mu_prior_0, int kappa_prior_0, int nu_prior_0, const arma::mat& Psi_prior_0) { mu_prior = mu_prior_0; @@ -79,7 +81,6 @@ Bayesian_estimator::Bayesian_estimator(const arma::vec& mu_prior_0, int kappa_pr Psi_est = Psi_prior; } -Bayesian_estimator::~Bayesian_estimator() = default; void Bayesian_estimator::init(const arma::mat& mu_prior_0, int kappa_prior_0, int nu_prior_0, const arma::mat& Psi_prior_0) { @@ -92,6 +93,7 @@ void Bayesian_estimator::init(const arma::mat& mu_prior_0, int kappa_prior_0, in Psi_est = Psi_prior; } + /* * Perform Bayesian noise estimation using the normal-inverse-Wishart priors stored in * the class structure, and update the priors according to the computed posteriors @@ -179,11 +181,13 @@ void Bayesian_estimator::update_sequential(const arma::vec& data, const arma::ve Psi_prior = Psi_posterior; } + arma::mat Bayesian_estimator::get_mu_est() const { return mu_est; } + arma::mat Bayesian_estimator::get_Psi_est() const { return Psi_est; diff --git a/src/algorithms/tracking/libs/bayesian_estimation.h b/src/algorithms/tracking/libs/bayesian_estimation.h index 001b19fcd..ccaf7f54d 100644 --- a/src/algorithms/tracking/libs/bayesian_estimation.h +++ b/src/algorithms/tracking/libs/bayesian_estimation.h @@ -6,10 +6,10 @@ * the properties of a stochastic process based on a sequence of * discrete samples of the sequence. * - * [1]: LaMountain, Gerald, Vilà-Valls, Jordi, Closas, Pau, "Bayesian - * Covariance Estimation for Kalman Filter based Digital Carrier + * [1]: LaMountain, Gerald, Vilà-Valls, Jordi, Closas, Pau, "Bayesian + * Covariance Estimation for Kalman Filter based Digital Carrier * Synchronization," Proceedings of the 31st International Technical Meeting - * of the Satellite Division of The Institute of Navigation + * of the Satellite Division of The Institute of Navigation * (ION GNSS+ 2018), Miami, Florida, September 2018, pp. 3575-3586. * https://doi.org/10.33012/2018.15911 * @@ -67,7 +67,7 @@ public: Bayesian_estimator(); Bayesian_estimator(int ny); Bayesian_estimator(const arma::vec& mu_prior_0, int kappa_prior_0, int nu_prior_0, const arma::mat& Psi_prior_0); - ~Bayesian_estimator(); + ~Bayesian_estimator() = default; void init(const arma::mat& mu_prior_0, int kappa_prior_0, int nu_prior_0, const arma::mat& Psi_prior_0); diff --git a/src/algorithms/tracking/libs/nonlinear_tracking.cc b/src/algorithms/tracking/libs/nonlinear_tracking.cc index 645185730..aae5c0026 100644 --- a/src/algorithms/tracking/libs/nonlinear_tracking.cc +++ b/src/algorithms/tracking/libs/nonlinear_tracking.cc @@ -75,9 +75,6 @@ CubatureFilter::CubatureFilter(const arma::vec& x_pred_0, const arma::mat& P_x_p } -CubatureFilter::~CubatureFilter() = default; - - void CubatureFilter::initialize(const arma::mat& x_pred_0, const arma::mat& P_x_pred_0) { x_pred_out = x_pred_0; @@ -236,9 +233,6 @@ UnscentedFilter::UnscentedFilter(const arma::vec& x_pred_0, const arma::mat& P_x } -UnscentedFilter::~UnscentedFilter() = default; - - void UnscentedFilter::initialize(const arma::mat& x_pred_0, const arma::mat& P_x_pred_0) { x_pred_out = x_pred_0; @@ -274,7 +268,6 @@ void UnscentedFilter::predict_sequential(const arma::vec& x_post, const arma::ma arma::mat Xi_post = arma::zeros(nx, np); arma::mat Xi_pred = arma::zeros(nx, np); - Xi_post.col(0) = x_post; Xi_pred.col(0) = (*transition_fcn)(Xi_post.col(0)); for (uint8_t i = 1; i <= nx; i++) diff --git a/src/algorithms/tracking/libs/nonlinear_tracking.h b/src/algorithms/tracking/libs/nonlinear_tracking.h index 642645ea1..a8c853bcf 100644 --- a/src/algorithms/tracking/libs/nonlinear_tracking.h +++ b/src/algorithms/tracking/libs/nonlinear_tracking.h @@ -62,7 +62,7 @@ public: CubatureFilter(); CubatureFilter(int nx); CubatureFilter(const arma::vec& x_pred_0, const arma::mat& P_x_pred_0); - ~CubatureFilter(); + ~CubatureFilter() = default; // Reinitialization function void initialize(const arma::mat& x_pred_0, const arma::mat& P_x_pred_0); @@ -91,7 +91,7 @@ public: UnscentedFilter(); UnscentedFilter(int nx); UnscentedFilter(const arma::vec& x_pred_0, const arma::mat& P_x_pred_0); - ~UnscentedFilter(); + ~UnscentedFilter() = default; // Reinitialization function void initialize(const arma::mat& x_pred_0, const arma::mat& P_x_pred_0); diff --git a/src/algorithms/tracking/libs/tcp_communication.cc b/src/algorithms/tracking/libs/tcp_communication.cc index d68c80733..a5ec1dfdf 100644 --- a/src/algorithms/tracking/libs/tcp_communication.cc +++ b/src/algorithms/tracking/libs/tcp_communication.cc @@ -38,9 +38,6 @@ Tcp_Communication::Tcp_Communication() : tcp_socket_(io_context_) {} // NOLINT -Tcp_Communication::~Tcp_Communication() = default; - - int Tcp_Communication::listen_tcp_connection(size_t d_port_, size_t d_port_ch0_) { try diff --git a/src/algorithms/tracking/libs/tcp_communication.h b/src/algorithms/tracking/libs/tcp_communication.h index 33cab1a1c..ae7018198 100644 --- a/src/algorithms/tracking/libs/tcp_communication.h +++ b/src/algorithms/tracking/libs/tcp_communication.h @@ -53,7 +53,7 @@ class Tcp_Communication { public: Tcp_Communication(); - ~Tcp_Communication(); + ~Tcp_Communication() = default; int listen_tcp_connection(size_t d_port_, size_t d_port_ch0_); void send_receive_tcp_packet_galileo_e1(boost::array buf, Tcp_Packet_Data *tcp_data_); diff --git a/src/algorithms/tracking/libs/tcp_packet_data.cc b/src/algorithms/tracking/libs/tcp_packet_data.cc index a48c3631a..01bcb067d 100644 --- a/src/algorithms/tracking/libs/tcp_packet_data.cc +++ b/src/algorithms/tracking/libs/tcp_packet_data.cc @@ -36,5 +36,3 @@ Tcp_Packet_Data::Tcp_Packet_Data() proc_pack_carr_error = 0; proc_pack_carrier_doppler_hz = 0; } - -Tcp_Packet_Data::~Tcp_Packet_Data() = default; diff --git a/src/algorithms/tracking/libs/tcp_packet_data.h b/src/algorithms/tracking/libs/tcp_packet_data.h index 44eb4346e..2ff71b9f9 100644 --- a/src/algorithms/tracking/libs/tcp_packet_data.h +++ b/src/algorithms/tracking/libs/tcp_packet_data.h @@ -39,7 +39,7 @@ class Tcp_Packet_Data { public: Tcp_Packet_Data(); - ~Tcp_Packet_Data(); + ~Tcp_Packet_Data() = default; float proc_pack_code_error; float proc_pack_carr_error; float proc_pack_carrier_doppler_hz; diff --git a/src/algorithms/tracking/libs/tracking_2nd_DLL_filter.cc b/src/algorithms/tracking/libs/tracking_2nd_DLL_filter.cc index 01b8641ea..4bb96d590 100644 --- a/src/algorithms/tracking/libs/tracking_2nd_DLL_filter.cc +++ b/src/algorithms/tracking/libs/tracking_2nd_DLL_filter.cc @@ -50,7 +50,7 @@ void Tracking_2nd_DLL_filter::calculate_lopp_coef(float* tau1, float* tau2, floa void Tracking_2nd_DLL_filter::set_DLL_BW(float dll_bw_hz) { - //Calculate filter coefficient values + // Calculate filter coefficient values d_dllnoisebandwidth = dll_bw_hz; calculate_lopp_coef(&d_tau1_code, &d_tau2_code, d_dllnoisebandwidth, d_dlldampingratio, 1.0); // Calculate filter coefficient values } @@ -87,9 +87,6 @@ Tracking_2nd_DLL_filter::Tracking_2nd_DLL_filter() } -Tracking_2nd_DLL_filter::~Tracking_2nd_DLL_filter() = default; - - void Tracking_2nd_DLL_filter::set_pdi(float pdi_code) { d_pdi_code = pdi_code; // Summation interval for code diff --git a/src/algorithms/tracking/libs/tracking_2nd_DLL_filter.h b/src/algorithms/tracking/libs/tracking_2nd_DLL_filter.h index 21e7aa8b8..fa90b21db 100644 --- a/src/algorithms/tracking/libs/tracking_2nd_DLL_filter.h +++ b/src/algorithms/tracking/libs/tracking_2nd_DLL_filter.h @@ -54,7 +54,7 @@ public: float get_code_nco(float DLL_discriminator); //!< Numerically controlled oscillator Tracking_2nd_DLL_filter(float pdi_code); Tracking_2nd_DLL_filter(); - ~Tracking_2nd_DLL_filter(); + ~Tracking_2nd_DLL_filter() = default; private: // PLL filter parameters diff --git a/src/algorithms/tracking/libs/tracking_2nd_PLL_filter.cc b/src/algorithms/tracking/libs/tracking_2nd_PLL_filter.cc index e2da9d943..60aea865b 100644 --- a/src/algorithms/tracking/libs/tracking_2nd_PLL_filter.cc +++ b/src/algorithms/tracking/libs/tracking_2nd_PLL_filter.cc @@ -93,9 +93,6 @@ Tracking_2nd_PLL_filter::Tracking_2nd_PLL_filter() } -Tracking_2nd_PLL_filter::~Tracking_2nd_PLL_filter() = default; - - void Tracking_2nd_PLL_filter::set_pdi(float pdi_carr) { d_pdi_carr = pdi_carr; // Summation interval for code diff --git a/src/algorithms/tracking/libs/tracking_2nd_PLL_filter.h b/src/algorithms/tracking/libs/tracking_2nd_PLL_filter.h index 53e2349cf..a00453024 100644 --- a/src/algorithms/tracking/libs/tracking_2nd_PLL_filter.h +++ b/src/algorithms/tracking/libs/tracking_2nd_PLL_filter.h @@ -53,7 +53,7 @@ public: float get_carrier_nco(float PLL_discriminator); Tracking_2nd_PLL_filter(float pdi_carr); Tracking_2nd_PLL_filter(); - ~Tracking_2nd_PLL_filter(); + ~Tracking_2nd_PLL_filter() = default; private: // PLL filter parameters diff --git a/src/algorithms/tracking/libs/tracking_FLL_PLL_filter.cc b/src/algorithms/tracking/libs/tracking_FLL_PLL_filter.cc index 665ab29e6..cdcebc1d2 100644 --- a/src/algorithms/tracking/libs/tracking_FLL_PLL_filter.cc +++ b/src/algorithms/tracking/libs/tracking_FLL_PLL_filter.cc @@ -50,9 +50,6 @@ Tracking_FLL_PLL_filter::Tracking_FLL_PLL_filter() } -Tracking_FLL_PLL_filter::~Tracking_FLL_PLL_filter() = default; - - void Tracking_FLL_PLL_filter::set_params(float fll_bw_hz, float pll_bw_hz, int order) { /* diff --git a/src/algorithms/tracking/libs/tracking_FLL_PLL_filter.h b/src/algorithms/tracking/libs/tracking_FLL_PLL_filter.h index 40785ea60..4a5b208e2 100644 --- a/src/algorithms/tracking/libs/tracking_FLL_PLL_filter.h +++ b/src/algorithms/tracking/libs/tracking_FLL_PLL_filter.h @@ -41,7 +41,7 @@ public: void initialize(float d_acq_carrier_doppler_hz); float get_carrier_error(float FLL_discriminator, float PLL_discriminator, float correlation_time_s); Tracking_FLL_PLL_filter(); - ~Tracking_FLL_PLL_filter(); + ~Tracking_FLL_PLL_filter() = default; private: // FLL + PLL filter parameters diff --git a/src/core/libs/channel_status_msg_receiver.cc b/src/core/libs/channel_status_msg_receiver.cc index bed7f1ff2..001a01bbb 100644 --- a/src/core/libs/channel_status_msg_receiver.cc +++ b/src/core/libs/channel_status_msg_receiver.cc @@ -53,9 +53,6 @@ channel_status_msg_receiver::channel_status_msg_receiver() : gr::block("channel_ } -channel_status_msg_receiver::~channel_status_msg_receiver() = default; - - void channel_status_msg_receiver::msg_handler_events(const pmt::pmt_t& msg) { gr::thread::scoped_lock lock(d_setlock); // require mutex with msg_handler_events function called by the scheduler diff --git a/src/core/libs/channel_status_msg_receiver.h b/src/core/libs/channel_status_msg_receiver.h index 196484ed4..112dd6eaa 100644 --- a/src/core/libs/channel_status_msg_receiver.h +++ b/src/core/libs/channel_status_msg_receiver.h @@ -49,7 +49,7 @@ channel_status_msg_receiver_sptr channel_status_msg_receiver_make(); class channel_status_msg_receiver : public gr::block { public: - ~channel_status_msg_receiver(); //!< Default destructor + ~channel_status_msg_receiver() = default; //!< Default destructor /*! * \brief return the current status map of all channels with valid telemetry diff --git a/src/core/libs/gnss_sdr_sample_counter.cc b/src/core/libs/gnss_sdr_sample_counter.cc index a20032edd..954d5d674 100644 --- a/src/core/libs/gnss_sdr_sample_counter.cc +++ b/src/core/libs/gnss_sdr_sample_counter.cc @@ -65,9 +65,6 @@ gnss_sdr_sample_counter::gnss_sdr_sample_counter( } -gnss_sdr_sample_counter::~gnss_sdr_sample_counter() = default; - - gnss_sdr_sample_counter_sptr gnss_sdr_make_sample_counter(double _fs, int32_t _interval_ms, size_t _size) { gnss_sdr_sample_counter_sptr sample_counter_(new gnss_sdr_sample_counter(_fs, _interval_ms, _size)); diff --git a/src/core/libs/gnss_sdr_sample_counter.h b/src/core/libs/gnss_sdr_sample_counter.h index 4fbf1f103..41e598670 100644 --- a/src/core/libs/gnss_sdr_sample_counter.h +++ b/src/core/libs/gnss_sdr_sample_counter.h @@ -51,7 +51,7 @@ gnss_sdr_sample_counter_sptr gnss_sdr_make_sample_counter( class gnss_sdr_sample_counter : public gr::sync_decimator { public: - ~gnss_sdr_sample_counter(); + ~gnss_sdr_sample_counter() = default; int work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); diff --git a/src/core/libs/gnss_sdr_supl_client.cc b/src/core/libs/gnss_sdr_supl_client.cc index ae7d60db0..68f7ef8b7 100644 --- a/src/core/libs/gnss_sdr_supl_client.cc +++ b/src/core/libs/gnss_sdr_supl_client.cc @@ -57,9 +57,6 @@ Gnss_Sdr_Supl_Client::Gnss_Sdr_Supl_Client() } -Gnss_Sdr_Supl_Client::~Gnss_Sdr_Supl_Client() = default; - - void Gnss_Sdr_Supl_Client::print_assistance() { if (assist.set & SUPL_RRLP_ASSIST_REFTIME) diff --git a/src/core/libs/gnss_sdr_supl_client.h b/src/core/libs/gnss_sdr_supl_client.h index ebae162ee..14fae5f34 100644 --- a/src/core/libs/gnss_sdr_supl_client.h +++ b/src/core/libs/gnss_sdr_supl_client.h @@ -64,7 +64,7 @@ class Gnss_Sdr_Supl_Client { public: Gnss_Sdr_Supl_Client(); - ~Gnss_Sdr_Supl_Client(); + ~Gnss_Sdr_Supl_Client() = default; // SUPL SERVER INFO std::string server_name; diff --git a/src/core/libs/gnss_sdr_time_counter.cc b/src/core/libs/gnss_sdr_time_counter.cc index 1daabf071..2bf29fa77 100644 --- a/src/core/libs/gnss_sdr_time_counter.cc +++ b/src/core/libs/gnss_sdr_time_counter.cc @@ -52,9 +52,6 @@ gnss_sdr_time_counter::gnss_sdr_time_counter() : gr::block("time_counter", } -gnss_sdr_time_counter::~gnss_sdr_time_counter() = default; - - gnss_sdr_time_counter_sptr gnss_sdr_make_time_counter() { gnss_sdr_time_counter_sptr counter_(new gnss_sdr_time_counter()); diff --git a/src/core/libs/gnss_sdr_time_counter.h b/src/core/libs/gnss_sdr_time_counter.h index bbf17d9fc..71a7d595a 100644 --- a/src/core/libs/gnss_sdr_time_counter.h +++ b/src/core/libs/gnss_sdr_time_counter.h @@ -46,7 +46,7 @@ gnss_sdr_time_counter_sptr gnss_sdr_make_time_counter(); class gnss_sdr_time_counter : public gr::block { public: - ~gnss_sdr_time_counter(); + ~gnss_sdr_time_counter() = default; int general_work(int noutput_items __attribute__((unused)), gr_vector_int &ninput_items __attribute__((unused)), gr_vector_const_void_star &input_items __attribute__((unused)), diff --git a/src/core/libs/string_converter.cc b/src/core/libs/string_converter.cc index ab84dab07..cc6b4fe3c 100644 --- a/src/core/libs/string_converter.cc +++ b/src/core/libs/string_converter.cc @@ -34,12 +34,6 @@ #include -StringConverter::StringConverter() = default; - - -StringConverter::~StringConverter() = default; - - bool StringConverter::convert(const std::string& value, bool default_value) { if (value == "true") diff --git a/src/core/libs/string_converter.h b/src/core/libs/string_converter.h index 1514db265..7b0c32ae3 100644 --- a/src/core/libs/string_converter.h +++ b/src/core/libs/string_converter.h @@ -43,8 +43,8 @@ class StringConverter { public: - StringConverter(); - virtual ~StringConverter(); + StringConverter() = default; + ~StringConverter() = default; bool convert(const std::string& value, bool default_value); int64_t convert(const std::string& value, int64_t default_value); diff --git a/src/core/monitor/gnss_synchro_monitor.cc b/src/core/monitor/gnss_synchro_monitor.cc index 28e26cdf4..cdf68e31d 100644 --- a/src/core/monitor/gnss_synchro_monitor.cc +++ b/src/core/monitor/gnss_synchro_monitor.cc @@ -69,9 +69,6 @@ gnss_synchro_monitor::gnss_synchro_monitor(unsigned int n_channels, } -gnss_synchro_monitor::~gnss_synchro_monitor() = default; - - int gnss_synchro_monitor::work(int noutput_items, gr_vector_const_void_star& input_items, gr_vector_void_star& output_items __attribute__((unused))) { diff --git a/src/core/monitor/gnss_synchro_monitor.h b/src/core/monitor/gnss_synchro_monitor.h index 7cb104154..301d12e7c 100644 --- a/src/core/monitor/gnss_synchro_monitor.h +++ b/src/core/monitor/gnss_synchro_monitor.h @@ -61,7 +61,7 @@ gnss_synchro_monitor_sptr gnss_synchro_make_monitor(unsigned int n_channels, class gnss_synchro_monitor : public gr::sync_block { public: - ~gnss_synchro_monitor(); //!< Default destructor + ~gnss_synchro_monitor() = default; //!< Default destructor int work(int noutput_items, gr_vector_const_void_star& input_items, gr_vector_void_star& output_items); diff --git a/src/core/receiver/gnss_block_factory.cc b/src/core/receiver/gnss_block_factory.cc index f7574a986..d6e0eafdc 100644 --- a/src/core/receiver/gnss_block_factory.cc +++ b/src/core/receiver/gnss_block_factory.cc @@ -175,17 +175,11 @@ #endif -GNSSBlockFactory::GNSSBlockFactory() = default; - - -GNSSBlockFactory::~GNSSBlockFactory() = default; - - std::unique_ptr GNSSBlockFactory::GetSignalSource( const std::shared_ptr& configuration, const std::shared_ptr> queue, int ID) // NOLINT(performance-unnecessary-value-param) { std::string default_implementation = "File_Signal_Source"; - std::string role = "SignalSource"; //backwards compatibility for old conf files + std::string role = "SignalSource"; // backwards compatibility for old conf files try { if (ID != -1) @@ -207,7 +201,7 @@ std::unique_ptr GNSSBlockFactory::GetSignalConditioner( const std::shared_ptr& configuration, int ID) { std::string default_implementation = "Pass_Through"; - //backwards compatibility for old conf files + // backwards compatibility for old conf files std::string role_conditioner = "SignalConditioner"; std::string role_datatypeadapter = "DataTypeAdapter"; std::string role_inputfilter = "InputFilter"; @@ -251,7 +245,7 @@ std::unique_ptr GNSSBlockFactory::GetSignalConditioner( if (signal_conditioner == "Array_Signal_Conditioner") { - //instantiate the array version + // instantiate the array version std::unique_ptr conditioner_(new ArraySignalConditioner(configuration.get(), GetBlock(configuration, role_datatypeadapter, data_type_adapter, 1, 1), GetBlock(configuration, role_inputfilter, input_filter, 1, 1), @@ -260,7 +254,7 @@ std::unique_ptr GNSSBlockFactory::GetSignalConditioner( return conditioner_; } - //single-antenna version + // single-antenna version std::unique_ptr conditioner_(new SignalConditioner(configuration.get(), GetBlock(configuration, role_datatypeadapter, data_type_adapter, 1, 1), GetBlock(configuration, role_inputfilter, input_filter, 1, 1), @@ -317,14 +311,14 @@ std::unique_ptr GNSSBlockFactory::GetPVT(const std::shared_p } -//********* GPS L1 C/A CHANNEL ***************** +// ********* GPS L1 C/A CHANNEL ***************** std::unique_ptr GNSSBlockFactory::GetChannel_1C( const std::shared_ptr& configuration, const std::string& acq, const std::string& trk, const std::string& tlm, int channel, std::shared_ptr> queue) { - //"appendix" is added to the "role" with the aim of Acquisition, Tracking and Telemetry Decoder adapters - //can find their specific configurations when they read the config + // "appendix" is added to the "role" with the aim of Acquisition, Tracking and Telemetry Decoder adapters + // can find their specific configurations when they read the config //TODO: REMOVE APPENDIX!! AND CHECK ALTERNATIVE MECHANISM TO GET PARTICULARIZED PARAMETERS LOG(INFO) << "Instantiating Channel " << channel << " with Acquisition Implementation: " << acq << ", Tracking Implementation: " << trk << ", Telemetry Decoder implementation: " << tlm; @@ -385,7 +379,7 @@ std::unique_ptr GNSSBlockFactory::GetChannel_1C( } -//********* GPS L2C (M) CHANNEL ***************** +// ********* GPS L2C (M) CHANNEL ***************** std::unique_ptr GNSSBlockFactory::GetChannel_2S( const std::shared_ptr& configuration, const std::string& acq, const std::string& trk, const std::string& tlm, int channel, @@ -449,7 +443,7 @@ std::unique_ptr GNSSBlockFactory::GetChannel_2S( } -//********* GALILEO E1 B CHANNEL ***************** +// ********* GALILEO E1 B CHANNEL ***************** std::unique_ptr GNSSBlockFactory::GetChannel_1B( const std::shared_ptr& configuration, const std::string& acq, const std::string& trk, const std::string& tlm, int channel, @@ -516,7 +510,7 @@ std::unique_ptr GNSSBlockFactory::GetChannel_1B( } -//********* GALILEO E5a CHANNEL ***************** +// ********* GALILEO E5a CHANNEL ***************** std::unique_ptr GNSSBlockFactory::GetChannel_5X( const std::shared_ptr& configuration, const std::string& acq, const std::string& trk, const std::string& tlm, int channel, @@ -583,7 +577,7 @@ std::unique_ptr GNSSBlockFactory::GetChannel_5X( } -//********* GLONASS L1 C/A CHANNEL ***************** +// ********* GLONASS L1 C/A CHANNEL ***************** std::unique_ptr GNSSBlockFactory::GetChannel_1G( const std::shared_ptr& configuration, const std::string& acq, const std::string& trk, const std::string& tlm, int channel, @@ -651,7 +645,7 @@ std::unique_ptr GNSSBlockFactory::GetChannel_1G( } -//********* GLONASS L2 C/A CHANNEL ***************** +// ********* GLONASS L2 C/A CHANNEL ***************** std::unique_ptr GNSSBlockFactory::GetChannel_2G( const std::shared_ptr& configuration, const std::string& acq, const std::string& trk, const std::string& tlm, int channel, @@ -719,7 +713,7 @@ std::unique_ptr GNSSBlockFactory::GetChannel_2G( } -//********* GPS L5 CHANNEL ***************** +// ********* GPS L5 CHANNEL ***************** std::unique_ptr GNSSBlockFactory::GetChannel_L5( const std::shared_ptr& configuration, const std::string& acq, const std::string& trk, const std::string& tlm, int channel, @@ -786,7 +780,7 @@ std::unique_ptr GNSSBlockFactory::GetChannel_L5( } -//********* BeiDou B1I CHANNEL ***************** +// ********* BeiDou B1I CHANNEL ***************** std::unique_ptr GNSSBlockFactory::GetChannel_B1( const std::shared_ptr& configuration, const std::string& acq, const std::string& trk, const std::string& tlm, int channel, @@ -853,7 +847,7 @@ std::unique_ptr GNSSBlockFactory::GetChannel_B1( } -//********* BeiDou B3I CHANNEL ***************** +// ********* BeiDou B3I CHANNEL ***************** std::unique_ptr GNSSBlockFactory::GetChannel_B3( const std::shared_ptr& configuration, const std::string& acq, const std::string& trk, const std::string& tlm, int channel, @@ -953,7 +947,7 @@ std::unique_ptr>> GNSSBlockFacto std::unique_ptr>> channels(new std::vector>(total_channels)); try { - //**************** GPS L1 C/A CHANNELS ********************** + // **************** GPS L1 C/A CHANNELS ********************** LOG(INFO) << "Getting " << Channels_1C_count << " GPS L1 C/A channels"; acquisition_implementation = configuration->property("Acquisition_1C.implementation", default_implementation); tracking_implementation = configuration->property("Tracking_1C.implementation", default_implementation); @@ -961,11 +955,11 @@ std::unique_ptr>> GNSSBlockFacto for (unsigned int i = 0; i < Channels_1C_count; i++) { - //(i.e. Acquisition_1C0.implementation=xxxx) + // (i.e. Acquisition_1C0.implementation=xxxx) std::string acquisition_implementation_specific = configuration->property( "Acquisition_1C" + std::to_string(channel_absolute_id) + ".implementation", acquisition_implementation); - //(i.e. Tracking_1C0.implementation=xxxx) + // (i.e. Tracking_1C0.implementation=xxxx) std::string tracking_implementation_specific = configuration->property( "Tracking_1C" + std::to_string(channel_absolute_id) + ".implementation", tracking_implementation); @@ -983,18 +977,18 @@ std::unique_ptr>> GNSSBlockFacto channel_absolute_id++; } - //**************** GPS L2C (M) CHANNELS ********************** + // **************** GPS L2C (M) CHANNELS ********************** LOG(INFO) << "Getting " << Channels_2S_count << " GPS L2C (M) channels"; tracking_implementation = configuration->property("Tracking_2S.implementation", default_implementation); telemetry_decoder_implementation = configuration->property("TelemetryDecoder_2S.implementation", default_implementation); acquisition_implementation = configuration->property("Acquisition_2S.implementation", default_implementation); for (unsigned int i = 0; i < Channels_2S_count; i++) { - //(i.e. Acquisition_1C0.implementation=xxxx) + // (i.e. Acquisition_1C0.implementation=xxxx) std::string acquisition_implementation_specific = configuration->property( "Acquisition_2S" + std::to_string(channel_absolute_id) + ".implementation", acquisition_implementation); - //(i.e. Tracking_1C0.implementation=xxxx) + // (i.e. Tracking_1C0.implementation=xxxx) std::string tracking_implementation_specific = configuration->property( "Tracking_2S" + std::to_string(channel_absolute_id) + ".implementation", tracking_implementation); @@ -1012,18 +1006,18 @@ std::unique_ptr>> GNSSBlockFacto channel_absolute_id++; } - //**************** GPS L5 CHANNELS ********************** + // **************** GPS L5 CHANNELS ********************** LOG(INFO) << "Getting " << Channels_L5_count << " GPS L5 channels"; tracking_implementation = configuration->property("Tracking_L5.implementation", default_implementation); telemetry_decoder_implementation = configuration->property("TelemetryDecoder_L5.implementation", default_implementation); acquisition_implementation = configuration->property("Acquisition_L5.implementation", default_implementation); for (unsigned int i = 0; i < Channels_L5_count; i++) { - //(i.e. Acquisition_1C0.implementation=xxxx) + // (i.e. Acquisition_1C0.implementation=xxxx) std::string acquisition_implementation_specific = configuration->property( "Acquisition_L5" + std::to_string(channel_absolute_id) + ".implementation", acquisition_implementation); - //(i.e. Tracking_1C0.implementation=xxxx) + // (i.e. Tracking_1C0.implementation=xxxx) std::string tracking_implementation_specific = configuration->property( "Tracking_L5" + std::to_string(channel_absolute_id) + ".implementation", tracking_implementation); @@ -1041,18 +1035,18 @@ std::unique_ptr>> GNSSBlockFacto channel_absolute_id++; } - //**************** GALILEO E1 B (I/NAV OS) CHANNELS ********************** + // **************** GALILEO E1 B (I/NAV OS) CHANNELS ********************** LOG(INFO) << "Getting " << Channels_1B_count << " GALILEO E1 B (I/NAV OS) channels"; tracking_implementation = configuration->property("Tracking_1B.implementation", default_implementation); telemetry_decoder_implementation = configuration->property("TelemetryDecoder_1B.implementation", default_implementation); acquisition_implementation = configuration->property("Acquisition_1B.implementation", default_implementation); for (unsigned int i = 0; i < Channels_1B_count; i++) { - //(i.e. Acquisition_1C0.implementation=xxxx) + // (i.e. Acquisition_1C0.implementation=xxxx) std::string acquisition_implementation_specific = configuration->property( "Acquisition_1B" + std::to_string(channel_absolute_id) + ".implementation", acquisition_implementation); - //(i.e. Tracking_1C0.implementation=xxxx) + // (i.e. Tracking_1C0.implementation=xxxx) std::string tracking_implementation_specific = configuration->property( "Tracking_1B" + std::to_string(channel_absolute_id) + ".implementation", tracking_implementation); @@ -1070,18 +1064,18 @@ std::unique_ptr>> GNSSBlockFacto channel_absolute_id++; } - //**************** GALILEO E5a I (F/NAV OS) CHANNELS ********************** + // **************** GALILEO E5a I (F/NAV OS) CHANNELS ********************** LOG(INFO) << "Getting " << Channels_5X_count << " GALILEO E5a I (F/NAV OS) channels"; tracking_implementation = configuration->property("Tracking_5X.implementation", default_implementation); telemetry_decoder_implementation = configuration->property("TelemetryDecoder_5X.implementation", default_implementation); acquisition_implementation = configuration->property("Acquisition_5X.implementation", default_implementation); for (unsigned int i = 0; i < Channels_5X_count; i++) { - //(i.e. Acquisition_1C0.implementation=xxxx) + // (i.e. Acquisition_1C0.implementation=xxxx) std::string acquisition_implementation_specific = configuration->property( "Acquisition_5X" + std::to_string(channel_absolute_id) + ".implementation", acquisition_implementation); - //(i.e. Tracking_1C0.implementation=xxxx) + // (i.e. Tracking_1C0.implementation=xxxx) std::string tracking_implementation_specific = configuration->property( "Tracking_5X" + std::to_string(channel_absolute_id) + ".implementation", tracking_implementation); @@ -1099,7 +1093,7 @@ std::unique_ptr>> GNSSBlockFacto channel_absolute_id++; } - //**************** GLONASS L1 C/A CHANNELS ********************** + // **************** GLONASS L1 C/A CHANNELS ********************** LOG(INFO) << "Getting " << Channels_1G_count << " GLONASS L1 C/A channels"; acquisition_implementation = configuration->property("Acquisition_1G.implementation", default_implementation); tracking_implementation = configuration->property("Tracking_1G.implementation", default_implementation); @@ -1107,11 +1101,11 @@ std::unique_ptr>> GNSSBlockFacto for (unsigned int i = 0; i < Channels_1G_count; i++) { - //(i.e. Acquisition_1G0.implementation=xxxx) + // (i.e. Acquisition_1G0.implementation=xxxx) std::string acquisition_implementation_specific = configuration->property( "Acquisition_1G" + std::to_string(channel_absolute_id) + ".implementation", acquisition_implementation); - //(i.e. Tracking_1G0.implementation=xxxx) + // (i.e. Tracking_1G0.implementation=xxxx) std::string tracking_implementation_specific = configuration->property( "Tracking_1G" + std::to_string(channel_absolute_id) + ".implementation", tracking_implementation); @@ -1129,7 +1123,7 @@ std::unique_ptr>> GNSSBlockFacto channel_absolute_id++; } - //**************** GLONASS L2 C/A CHANNELS ********************** + // **************** GLONASS L2 C/A CHANNELS ********************** LOG(INFO) << "Getting " << Channels_2G_count << " GLONASS L2 C/A channels"; acquisition_implementation = configuration->property("Acquisition_2G.implementation", default_implementation); tracking_implementation = configuration->property("Tracking_2G.implementation", default_implementation); @@ -1137,11 +1131,11 @@ std::unique_ptr>> GNSSBlockFacto for (unsigned int i = 0; i < Channels_2G_count; i++) { - //(i.e. Acquisition_2G0.implementation=xxxx) + // (i.e. Acquisition_2G0.implementation=xxxx) std::string acquisition_implementation_specific = configuration->property( "Acquisition_2G" + std::to_string(channel_absolute_id) + ".implementation", acquisition_implementation); - //(i.e. Tracking_2G0.implementation=xxxx) + // (i.e. Tracking_2G0.implementation=xxxx) std::string tracking_implementation_specific = configuration->property( "Tracking_2G" + std::to_string(channel_absolute_id) + ".implementation", tracking_implementation); @@ -1159,7 +1153,7 @@ std::unique_ptr>> GNSSBlockFacto channel_absolute_id++; } - //**************** BEIDOU B1I CHANNELS ********************** + // **************** BEIDOU B1I CHANNELS ********************** LOG(INFO) << "Getting " << Channels_B1_count << " BEIDOU B1I channels"; acquisition_implementation = configuration->property("Acquisition_B1.implementation", default_implementation); tracking_implementation = configuration->property("Tracking_B1.implementation", default_implementation); @@ -1167,11 +1161,11 @@ std::unique_ptr>> GNSSBlockFacto for (unsigned int i = 0; i < Channels_B1_count; i++) { - //(i.e. Acquisition_2G0.implementation=xxxx) + // (i.e. Acquisition_2G0.implementation=xxxx) std::string acquisition_implementation_specific = configuration->property( "Acquisition_B1" + std::to_string(channel_absolute_id) + ".implementation", acquisition_implementation); - //(i.e. Tracking_2G0.implementation=xxxx) + // (i.e. Tracking_2G0.implementation=xxxx) std::string tracking_implementation_specific = configuration->property( "Tracking_B1" + std::to_string(channel_absolute_id) + ".implementation", tracking_implementation); @@ -1189,7 +1183,7 @@ std::unique_ptr>> GNSSBlockFacto channel_absolute_id++; } - //**************** BEIDOU B3I CHANNELS ********************** + // **************** BEIDOU B3I CHANNELS ********************** LOG(INFO) << "Getting " << Channels_B3_count << " BEIDOU B3I channels"; acquisition_implementation = configuration->property("Acquisition_B3.implementation", default_implementation); tracking_implementation = configuration->property("Tracking_B3.implementation", default_implementation); @@ -1197,11 +1191,11 @@ std::unique_ptr>> GNSSBlockFacto for (unsigned int i = 0; i < Channels_B3_count; i++) { - //(i.e. Acquisition_2G0.implementation=xxxx) + // (i.e. Acquisition_2G0.implementation=xxxx) std::string acquisition_implementation_specific = configuration->property( "Acquisition_B3" + std::to_string(channel_absolute_id) + ".implementation", acquisition_implementation); - //(i.e. Tracking_2G0.implementation=xxxx) + // (i.e. Tracking_2G0.implementation=xxxx) std::string tracking_implementation_specific = configuration->property( "Tracking_B3" + std::to_string(channel_absolute_id) + ".implementation", tracking_implementation); @@ -1245,14 +1239,14 @@ std::unique_ptr GNSSBlockFactory::GetBlock( { std::unique_ptr block; - //PASS THROUGH ---------------------------------------------------------------- + // PASS THROUGH ------------------------------------------------------------ if (implementation == "Pass_Through") { std::unique_ptr block_(new Pass_Through(configuration.get(), role, in_streams, out_streams)); block = std::move(block_); } - // SIGNAL SOURCES ------------------------------------------------------------- + // SIGNAL SOURCES ---------------------------------------------------------- else if (implementation == "File_Signal_Source") { try diff --git a/src/core/receiver/gnss_block_factory.h b/src/core/receiver/gnss_block_factory.h index af9889c89..040f0a5dd 100644 --- a/src/core/receiver/gnss_block_factory.h +++ b/src/core/receiver/gnss_block_factory.h @@ -56,8 +56,8 @@ class TelemetryDecoderInterface; class GNSSBlockFactory { public: - GNSSBlockFactory(); - virtual ~GNSSBlockFactory(); + GNSSBlockFactory() = default; + ~GNSSBlockFactory() = default; std::unique_ptr GetSignalSource(const std::shared_ptr& configuration, const std::shared_ptr> queue, int ID = -1); // NOLINT(performance-unnecessary-value-param) diff --git a/src/core/receiver/tcp_cmd_interface.cc b/src/core/receiver/tcp_cmd_interface.cc index 20d3618a6..9a10bb5f7 100644 --- a/src/core/receiver/tcp_cmd_interface.cc +++ b/src/core/receiver/tcp_cmd_interface.cc @@ -57,9 +57,6 @@ TcpCmdInterface::TcpCmdInterface() } -TcpCmdInterface::~TcpCmdInterface() = default; - - void TcpCmdInterface::register_functions() { functions["status"] = std::bind(&TcpCmdInterface::status, this, std::placeholders::_1); diff --git a/src/core/receiver/tcp_cmd_interface.h b/src/core/receiver/tcp_cmd_interface.h index 993a68312..7ba25b80a 100644 --- a/src/core/receiver/tcp_cmd_interface.h +++ b/src/core/receiver/tcp_cmd_interface.h @@ -49,7 +49,7 @@ class TcpCmdInterface { public: TcpCmdInterface(); - virtual ~TcpCmdInterface(); + ~TcpCmdInterface() = default; void run_cmd_server(int tcp_port); void set_msg_queue(std::shared_ptr> control_queue); diff --git a/src/utils/front-end-cal/front_end_cal.cc b/src/utils/front-end-cal/front_end_cal.cc index 7dbd89e91..37526da7e 100644 --- a/src/utils/front-end-cal/front_end_cal.cc +++ b/src/utils/front-end-cal/front_end_cal.cc @@ -53,9 +53,6 @@ extern Concurrent_Map global_gps_utc_model_map; extern Concurrent_Map global_gps_almanac_map; extern Concurrent_Map global_gps_acq_assist_map; -FrontEndCal::FrontEndCal() = default; - -FrontEndCal::~FrontEndCal() = default; bool FrontEndCal::read_assistance_from_XML() { diff --git a/src/utils/front-end-cal/front_end_cal.h b/src/utils/front-end-cal/front_end_cal.h index 6bb495c4c..8f5d2690c 100644 --- a/src/utils/front-end-cal/front_end_cal.h +++ b/src/utils/front-end-cal/front_end_cal.h @@ -40,63 +40,10 @@ class ConfigurationInterface; class FrontEndCal { -private: - std::shared_ptr configuration_; - - /*! - * \brief LLA2ECEF Convert geodetic coordinates to Earth-centered Earth-fixed - * (ECEF) coordinates. P = LLA2ECEF( LLA ) converts an M-by-3 array of geodetic coordinates - * (latitude, longitude and altitude), LLA, to an M-by-3 array of ECEF - * coordinates, P. LLA is in [degrees degrees meters]. P is in meters. - * The default ellipsoid planet is WGS84. Original copyright (c) by Kai Borre. - */ - arma::vec lla2ecef(const arma::vec &lla); - /*! - * GEODETIC2ECEF Convert geodetic to geocentric (ECEF) coordinates - * [X, Y, Z] = GEODETIC2ECEF(PHI, LAMBDA, H, ELLIPSOID) converts geodetic - * point locations specified by the coordinate arrays PHI (geodetic - * latitude in radians), LAMBDA (longitude in radians), and H (ellipsoidal - * height) to geocentric Cartesian coordinates X, Y, and Z. The geodetic - * coordinates refer to the reference ellipsoid specified by ELLIPSOID (a - * row vector with the form [semimajor axis, eccentricity]). H must use - * the same units as the semimajor axis; X, Y, and Z will be expressed in - * these units also. - * - * The geocentric Cartesian coordinate system is fixed with respect to the - * Earth, with its origin at the center of the ellipsoid and its X-, Y-, - * and Z-axes intersecting the surface at the following points: - * PHI LAMBDA - * X-axis: 0 0 (Equator at the Prime Meridian) - * Y-axis: 0 pi/2 (Equator at 90-degrees East - * Z-axis: pi/2 0 (North Pole) - * - * A common synonym is Earth-Centered, Earth-Fixed coordinates, or ECEF. - * - * See also ECEF2GEODETIC, ECEF2LV, GEODETIC2GEOCENTRICLAT, LV2ECEF. - * - * Copyright 2004-2009 The MathWorks, Inc. - * $Revision: 1.1.6.4 $ $Date: 2009/04/15 23:34:46 $ - * Reference - * --------- - * Paul R. Wolf and Bon A. Dewitt, "Elements of Photogrammetry with - * Applications in GIS," 3rd Ed., McGraw-Hill, 2000 (Appendix F-3). - */ - arma::vec geodetic2ecef(double phi, double lambda, double h, const arma::vec &ellipsoid); - /*! - * \brief Reads the ephemeris data from an external XML file - * - */ - bool read_assistance_from_XML(); - /*! - * \brief Connects to Secure User Location Protocol (SUPL) server to obtain - * the current GPS ephemeris and GPS assistance data. - * - */ - int Get_SUPL_Assist(); - - const std::string eph_default_xml_filename = "./gps_ephemeris.xml"; - public: + FrontEndCal() = default; + ~FrontEndCal() = default; + /*! * \brief Sets the configuration data required by get_ephemeris function * @@ -135,8 +82,62 @@ public: */ void GPS_L1_front_end_model_E4000(double f_bb_true_Hz, double f_bb_meas_Hz, double fs_nominal_hz, double *estimated_fs_Hz, double *estimated_f_if_Hz, double *f_osc_err_ppm); - FrontEndCal(); - ~FrontEndCal(); +private: + std::shared_ptr configuration_; + + /* + * LLA2ECEF Convert geodetic coordinates to Earth-centered Earth-fixed + * (ECEF) coordinates. P = LLA2ECEF( LLA ) converts an M-by-3 array of geodetic coordinates + * (latitude, longitude and altitude), LLA, to an M-by-3 array of ECEF + * coordinates, P. LLA is in [degrees degrees meters]. P is in meters. + * The default ellipsoid planet is WGS84. Original copyright (c) by Kai Borre. + */ + arma::vec lla2ecef(const arma::vec &lla); + + /* + * GEODETIC2ECEF Convert geodetic to geocentric (ECEF) coordinates + * [X, Y, Z] = GEODETIC2ECEF(PHI, LAMBDA, H, ELLIPSOID) converts geodetic + * point locations specified by the coordinate arrays PHI (geodetic + * latitude in radians), LAMBDA (longitude in radians), and H (ellipsoidal + * height) to geocentric Cartesian coordinates X, Y, and Z. The geodetic + * coordinates refer to the reference ellipsoid specified by ELLIPSOID (a + * row vector with the form [semimajor axis, eccentricity]). H must use + * the same units as the semimajor axis; X, Y, and Z will be expressed in + * these units also. + * + * The geocentric Cartesian coordinate system is fixed with respect to the + * Earth, with its origin at the center of the ellipsoid and its X-, Y-, + * and Z-axes intersecting the surface at the following points: + * PHI LAMBDA + * X-axis: 0 0 (Equator at the Prime Meridian) + * Y-axis: 0 pi/2 (Equator at 90-degrees East + * Z-axis: pi/2 0 (North Pole) + * + * A common synonym is Earth-Centered, Earth-Fixed coordinates, or ECEF. + * + * See also ECEF2GEODETIC, ECEF2LV, GEODETIC2GEOCENTRICLAT, LV2ECEF. + * + * Copyright 2004-2009 The MathWorks, Inc. + * $Revision: 1.1.6.4 $ $Date: 2009/04/15 23:34:46 $ + * Reference + * --------- + * Paul R. Wolf and Bon A. Dewitt, "Elements of Photogrammetry with + * Applications in GIS," 3rd Ed., McGraw-Hill, 2000 (Appendix F-3). + */ + arma::vec geodetic2ecef(double phi, double lambda, double h, const arma::vec &ellipsoid); + + /* + * Reads the ephemeris data from an external XML file + */ + bool read_assistance_from_XML(); + + /* + * Connects to Secure User Location Protocol (SUPL) server to obtain + * the current GPS ephemeris and GPS assistance data. + */ + int Get_SUPL_Assist(); + + const std::string eph_default_xml_filename = "./gps_ephemeris.xml"; }; #endif From a172b755f7621a0ad6eb74f78f2116560cbd4484 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sun, 21 Jul 2019 19:37:13 +0200 Subject: [PATCH 27/36] Fix typo --- .../acquisition/adapters/beidou_b1i_pcps_acquisition.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/algorithms/acquisition/adapters/beidou_b1i_pcps_acquisition.cc b/src/algorithms/acquisition/adapters/beidou_b1i_pcps_acquisition.cc index d3d73b2ca..8dff90e91 100644 --- a/src/algorithms/acquisition/adapters/beidou_b1i_pcps_acquisition.cc +++ b/src/algorithms/acquisition/adapters/beidou_b1i_pcps_acquisition.cc @@ -133,7 +133,7 @@ BeidouB1iPcpsAcquisition::BeidouB1iPcpsAcquisition( { LOG(ERROR) << "This implementation does not provide an output stream"; } -}; +} void BeidouB1iPcpsAcquisition::stop_acquisition() From 5ba04708a9c45df458df51cc7483d7a7a8450e69 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sun, 21 Jul 2019 20:36:41 +0200 Subject: [PATCH 28/36] Remove unused variable --- src/utils/front-end-cal/main.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/src/utils/front-end-cal/main.cc b/src/utils/front-end-cal/main.cc index 696abfa6c..55874eedb 100644 --- a/src/utils/front-end-cal/main.cc +++ b/src/utils/front-end-cal/main.cc @@ -367,7 +367,6 @@ int main(int argc, char** argv) int64_t fs_in_ = configuration->property("GNSS-SDR.internal_fs_sps", 2048000); configuration->set_property("Acquisition.max_dwells", "10"); - GNSSBlockFactory block_factory; acquisition = new GpsL1CaPcpsAcquisitionFineDoppler(configuration.get(), "Acquisition", 1, 1); acquisition->set_channel(1); From 09b6b2305e5424d9666d40171518d2871040e2ea Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Mon, 22 Jul 2019 14:13:57 +0200 Subject: [PATCH 29/36] Handle redefinition of Boost_VERSION variable in CMake 3.15 See Policy CMP0093 https://cmake.org/cmake/help/v3.15/policy/CMP0093.html#policy:CMP0093 CMake 3.15 policies enabled by default (see https://cmake.org/cmake/help/v3.15/manual/cmake-policies.7.html#manual:cmake-policies(7) ) --- CMakeLists.txt | 17 +++++++---------- src/algorithms/PVT/adapters/CMakeLists.txt | 2 +- .../PVT/gnuradio_blocks/CMakeLists.txt | 2 +- src/algorithms/PVT/libs/CMakeLists.txt | 4 ++-- .../volk_gnsssdr/cmake/Modules/VolkBoost.cmake | 18 ++++++++---------- .../gnuradio_blocks/CMakeLists.txt | 4 ++-- src/algorithms/tracking/libs/CMakeLists.txt | 4 ++-- src/core/monitor/CMakeLists.txt | 5 ++--- src/core/receiver/CMakeLists.txt | 4 ++-- 9 files changed, 27 insertions(+), 33 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9e4865db9..9aeba759f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,7 +23,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.14.5) +cmake_minimum_required(VERSION 2.8.12...3.15) project(gnss-sdr CXX C) list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/Modules) @@ -682,15 +682,12 @@ set_package_properties(Boost PROPERTIES TYPE REQUIRED ) -if(CMAKE_VERSION VERSION_GREATER 3.14) - set_package_properties(Boost PROPERTIES - DESCRIPTION "Portable C++ source libraries (found: v${Boost_VERSION_STRING})" - ) -else() - set_package_properties(Boost PROPERTIES - DESCRIPTION "Portable C++ source libraries (found: v${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION})" - ) +if(CMAKE_VERSION VERSION_LESS 3.14) + set(Boost_VERSION_STRING "${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}") endif() +set_package_properties(Boost PROPERTIES + DESCRIPTION "Portable C++ source libraries (found: v${Boost_VERSION_STRING})" +) if(CMAKE_VERSION VERSION_LESS 3.5) if(NOT TARGET Boost::boost) @@ -761,7 +758,7 @@ if(CMAKE_VERSION VERSION_LESS 3.5) endif() # Fix for Boost Asio < 1.70 when using Clang in macOS -if(${Boost_VERSION} VERSION_LESS 107000) +if(Boost_VERSION_STRING VERSION_LESS 1.70.0) # Check if we have std::string_view include(CheckCXXSourceCompiles) check_cxx_source_compiles(" diff --git a/src/algorithms/PVT/adapters/CMakeLists.txt b/src/algorithms/PVT/adapters/CMakeLists.txt index 013fcdd83..bed0f0dfc 100644 --- a/src/algorithms/PVT/adapters/CMakeLists.txt +++ b/src/algorithms/PVT/adapters/CMakeLists.txt @@ -44,7 +44,7 @@ target_include_directories(pvt_adapters ${CMAKE_SOURCE_DIR}/src/core/interfaces ) -if(Boost_VERSION LESS 105800) +if(Boost_VERSION_STRING VERSION_LESS 1.58.0) target_compile_definitions(pvt_adapters PRIVATE -DOLD_BOOST=1) endif() diff --git a/src/algorithms/PVT/gnuradio_blocks/CMakeLists.txt b/src/algorithms/PVT/gnuradio_blocks/CMakeLists.txt index 081a1ab49..bb4c2d432 100644 --- a/src/algorithms/PVT/gnuradio_blocks/CMakeLists.txt +++ b/src/algorithms/PVT/gnuradio_blocks/CMakeLists.txt @@ -62,7 +62,7 @@ if(ENABLE_CLANG_TIDY) endif() endif() -if(Boost_VERSION LESS 105800) +if(Boost_VERSION_STRING VERSION_LESS 1.58.0) target_compile_definitions(pvt_gr_blocks PRIVATE -DOLD_BOOST=1) endif() diff --git a/src/algorithms/PVT/libs/CMakeLists.txt b/src/algorithms/PVT/libs/CMakeLists.txt index 6850f3515..d20cac4c6 100644 --- a/src/algorithms/PVT/libs/CMakeLists.txt +++ b/src/algorithms/PVT/libs/CMakeLists.txt @@ -95,7 +95,7 @@ target_include_directories(pvt_libs target_compile_definitions(pvt_libs PRIVATE -DGNSS_SDR_VERSION="${VERSION}") -if(Boost_VERSION VERSION_GREATER "106599") +if(Boost_VERSION_STRING VERSION_GREATER 1.65.99) target_compile_definitions(pvt_libs PUBLIC -DBOOST_GREATER_1_65 @@ -104,7 +104,7 @@ endif() # Fix for Boost Asio < 1.70 if(OS_IS_MACOSX) - if((CMAKE_CXX_COMPILER_ID MATCHES "Clang") AND (${Boost_VERSION} VERSION_LESS 107000)) + if((CMAKE_CXX_COMPILER_ID MATCHES "Clang") AND (Boost_VERSION_STRING VERSION_LESS 1.70.0)) if(${has_string_view}) target_compile_definitions(pvt_libs PUBLIC diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cmake/Modules/VolkBoost.cmake b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cmake/Modules/VolkBoost.cmake index 2aea96b2a..1a966bbe3 100644 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cmake/Modules/VolkBoost.cmake +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cmake/Modules/VolkBoost.cmake @@ -73,23 +73,21 @@ if(ENABLE_BAD_BOOST) message(STATUS "Enabling use of known bad versions of Boost.") endif() -# For any unsuitable Boost version, add the version number below in -# the following format: XXYYZZ -# Where: -# XX is the major version ('10' for version 1) -# YY is the minor version number ('46' for 1.46) -# ZZ is the patcher version number (typically just '00') set(Boost_NOGO_VERSIONS - 104600 104601 104700 105200 + "1.46.0" "1.46.1" "1.47.0" "1.52.0" ) +if(CMAKE_VERSION VERSION_LESS 3.14) + set(Boost_VERSION_STRING "${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}") +endif() + foreach(ver ${Boost_NOGO_VERSIONS}) - if("${Boost_VERSION}" STREQUAL "${ver}") + if("${Boost_VERSION_STRING}" STREQUAL "${ver}") if(NOT ENABLE_BAD_BOOST) - message(STATUS "WARNING: Found a known bad version of Boost (v${Boost_VERSION}). Disabling.") + message(STATUS "WARNING: Found a known bad version of Boost (v${Boost_VERSION_STRING}). Disabling.") set(Boost_FOUND FALSE) else() - message(STATUS "WARNING: Found a known bad version of Boost (v${Boost_VERSION}). Continuing anyway.") + message(STATUS "WARNING: Found a known bad version of Boost (v${Boost_VERSION_STRING}). Continuing anyway.") set(Boost_FOUND TRUE) endif() endif() diff --git a/src/algorithms/signal_source/gnuradio_blocks/CMakeLists.txt b/src/algorithms/signal_source/gnuradio_blocks/CMakeLists.txt index 6a1ff6e62..7331f0478 100644 --- a/src/algorithms/signal_source/gnuradio_blocks/CMakeLists.txt +++ b/src/algorithms/signal_source/gnuradio_blocks/CMakeLists.txt @@ -83,7 +83,7 @@ endif() # Fix for Boost Asio < 1.70 if(OS_IS_MACOSX) - if((CMAKE_CXX_COMPILER_ID MATCHES "Clang") AND (${Boost_VERSION} VERSION_LESS 107000)) + if((CMAKE_CXX_COMPILER_ID MATCHES "Clang") AND (Boost_VERSION_STRING VERSION_LESS 1.70.0)) if(${has_string_view}) target_compile_definitions(signal_source_gr_blocks PUBLIC @@ -98,7 +98,7 @@ if(OS_IS_MACOSX) endif() endif() -if(Boost_VERSION VERSION_GREATER "106599") +if(Boost_VERSION_STRING VERSION_GREATER 1.65.99) target_compile_definitions(signal_source_gr_blocks PUBLIC -DBOOST_GREATER_1_65 diff --git a/src/algorithms/tracking/libs/CMakeLists.txt b/src/algorithms/tracking/libs/CMakeLists.txt index 77178d036..09cc778a7 100644 --- a/src/algorithms/tracking/libs/CMakeLists.txt +++ b/src/algorithms/tracking/libs/CMakeLists.txt @@ -110,7 +110,7 @@ if(NOT CMAKE_VERSION VERSION_GREATER 3.11) ) endif() -if(Boost_VERSION VERSION_GREATER "106599") +if(Boost_VERSION_STRING VERSION_GREATER 1.65.99) target_compile_definitions(tracking_libs PUBLIC -DBOOST_GREATER_1_65 @@ -119,7 +119,7 @@ endif() # Fix for Boost Asio < 1.70 if(OS_IS_MACOSX) - if((CMAKE_CXX_COMPILER_ID MATCHES "Clang") AND (${Boost_VERSION} VERSION_LESS 107000)) + if((CMAKE_CXX_COMPILER_ID MATCHES "Clang") AND (Boost_VERSION_STRING VERSION_LESS 1.70.0)) if(${has_string_view}) target_compile_definitions(tracking_libs PUBLIC diff --git a/src/core/monitor/CMakeLists.txt b/src/core/monitor/CMakeLists.txt index 7fb4008dd..5d0b710d3 100644 --- a/src/core/monitor/CMakeLists.txt +++ b/src/core/monitor/CMakeLists.txt @@ -60,7 +60,7 @@ target_include_directories(core_monitor ) -if(Boost_VERSION VERSION_GREATER "106599") +if(Boost_VERSION_STRING VERSION_GREATER 1.65.99) target_compile_definitions(core_monitor PUBLIC -DBOOST_GREATER_1_65 @@ -70,7 +70,7 @@ endif() # Fix for Boost Asio < 1.70 if(OS_IS_MACOSX) - if((CMAKE_CXX_COMPILER_ID MATCHES "Clang") AND (${Boost_VERSION} VERSION_LESS 107000)) + if((CMAKE_CXX_COMPILER_ID MATCHES "Clang") AND (Boost_VERSION_STRING VERSION_LESS 1.70.0)) if(${has_string_view}) target_compile_definitions(core_monitor PUBLIC @@ -96,7 +96,6 @@ if(ENABLE_CLANG_TIDY) endif() - set_property(TARGET core_monitor APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES $ diff --git a/src/core/receiver/CMakeLists.txt b/src/core/receiver/CMakeLists.txt index 08e8bec98..95435e407 100644 --- a/src/core/receiver/CMakeLists.txt +++ b/src/core/receiver/CMakeLists.txt @@ -124,7 +124,7 @@ if(ENABLE_CUDA) target_compile_definitions(core_receiver PRIVATE -DCUDA_GPU_ACCEL=1) endif() -if(Boost_VERSION VERSION_GREATER "106599") +if(Boost_VERSION_STRING VERSION_GREATER 1.65.99) target_compile_definitions(core_receiver PRIVATE -DBOOST_GREATER_1_65 @@ -158,7 +158,7 @@ target_link_libraries(core_receiver # Fix for Boost Asio < 1.70 if(OS_IS_MACOSX) - if((CMAKE_CXX_COMPILER_ID MATCHES "Clang") AND (${Boost_VERSION} VERSION_LESS 107000)) + if((CMAKE_CXX_COMPILER_ID MATCHES "Clang") AND (Boost_VERSION_STRING VERSION_LESS 1.70.0)) if(${has_string_view}) target_compile_definitions(core_receiver PUBLIC From 31b6f9defd1373afccba6cca517a052bde05d213 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Mon, 22 Jul 2019 14:46:36 +0200 Subject: [PATCH 30/36] Explicitly set CMake policy CMP0093 to NEW --- CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9aeba759f..94e370795 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -685,6 +685,9 @@ set_package_properties(Boost PROPERTIES if(CMAKE_VERSION VERSION_LESS 3.14) set(Boost_VERSION_STRING "${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}") endif() +if(POLICY CMP0093) + cmake_policy(SET CMP0093 NEW) # FindBoost reports Boost_VERSION in x.y.z format. +endif() set_package_properties(Boost PROPERTIES DESCRIPTION "Portable C++ source libraries (found: v${Boost_VERSION_STRING})" ) From 27b1baf0b78f9af35272b9cde8ac72889de9efc6 Mon Sep 17 00:00:00 2001 From: Javier Arribas Date: Tue, 23 Jul 2019 17:56:02 +0200 Subject: [PATCH 31/36] completing the acquisition assistance option from primary frequencies (e.g. L1, E1) to secondary frequencies (e.g. L5, E5) --- .../galileo_e1_pcps_ambiguous_acquisition.cc | 8 +++ .../galileo_e1_pcps_ambiguous_acquisition.h | 6 ++ .../adapters/galileo_e5a_pcps_acquisition.cc | 7 ++ .../adapters/galileo_e5a_pcps_acquisition.h | 6 ++ .../adapters/gps_l1_ca_pcps_acquisition.cc | 7 ++ .../adapters/gps_l1_ca_pcps_acquisition.h | 6 ++ .../adapters/gps_l2_m_pcps_acquisition.cc | 7 ++ .../adapters/gps_l2_m_pcps_acquisition.h | 6 ++ .../adapters/gps_l5i_pcps_acquisition.cc | 7 ++ .../adapters/gps_l5i_pcps_acquisition.h | 6 ++ .../gnuradio_blocks/pcps_acquisition.cc | 35 +++++----- .../gnuradio_blocks/pcps_acquisition.h | 19 +++++- src/algorithms/channel/adapters/channel.cc | 4 ++ src/algorithms/channel/adapters/channel.h | 2 + src/core/interfaces/acquisition_interface.h | 4 ++ src/core/interfaces/channel_interface.h | 1 + src/core/receiver/gnss_flowgraph.cc | 66 ++++++++++++------- src/core/receiver/gnss_flowgraph.h | 1 + 18 files changed, 153 insertions(+), 45 deletions(-) diff --git a/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition.cc b/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition.cc index bf97d2df3..70cd2b9bf 100644 --- a/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition.cc +++ b/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition.cc @@ -154,6 +154,7 @@ GalileoE1PcpsAmbiguousAcquisition::GalileoE1PcpsAmbiguousAcquisition( channel_ = 0; threshold_ = 0.0; doppler_step_ = 0; + doppler_center_ = 0; gnss_synchro_ = nullptr; if (in_streams_ > 1) @@ -211,6 +212,13 @@ void GalileoE1PcpsAmbiguousAcquisition::set_doppler_step(unsigned int doppler_st acquisition_->set_doppler_step(doppler_step_); } +void GalileoE1PcpsAmbiguousAcquisition::set_doppler_center(int doppler_center) +{ + doppler_center_ = doppler_center; + + acquisition_->set_doppler_center(doppler_center_); +} + void GalileoE1PcpsAmbiguousAcquisition::set_gnss_synchro(Gnss_Synchro* gnss_synchro) { diff --git a/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition.h b/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition.h index 79b2a1f41..9e3e02c9e 100644 --- a/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition.h +++ b/src/algorithms/acquisition/adapters/galileo_e1_pcps_ambiguous_acquisition.h @@ -123,6 +123,11 @@ public: */ void set_doppler_step(unsigned int doppler_step) override; + /*! + * \brief Set Doppler center for the grid search + */ + void set_doppler_center(int doppler_center) override; + /*! * \brief Initializes acquisition algorithm. */ @@ -176,6 +181,7 @@ private: float threshold_; unsigned int doppler_max_; unsigned int doppler_step_; + int doppler_center_; unsigned int sampled_ms_; unsigned int max_dwells_; int64_t fs_in_; diff --git a/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition.cc b/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition.cc index ace2fc968..a49e7a221 100644 --- a/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition.cc +++ b/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition.cc @@ -152,6 +152,7 @@ GalileoE5aPcpsAcquisition::GalileoE5aPcpsAcquisition(ConfigurationInterface* con channel_ = 0; threshold_ = 0.0; doppler_step_ = 0; + doppler_center_ = 0; gnss_synchro_ = nullptr; if (in_streams_ > 1) @@ -208,6 +209,12 @@ void GalileoE5aPcpsAcquisition::set_doppler_step(unsigned int doppler_step) acquisition_->set_doppler_step(doppler_step_); } +void GalileoE5aPcpsAcquisition::set_doppler_center(int doppler_center) +{ + doppler_center_ = doppler_center; + + acquisition_->set_doppler_center(doppler_center_); +} void GalileoE5aPcpsAcquisition::set_gnss_synchro(Gnss_Synchro* gnss_synchro) { diff --git a/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition.h b/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition.h index 8db725c84..abef41b5f 100644 --- a/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition.h +++ b/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition.h @@ -111,6 +111,11 @@ public: */ void set_doppler_step(unsigned int doppler_step) override; + /*! + * \brief Set Doppler center for the grid search + */ + void set_doppler_center(int doppler_center) override; + /*! * \brief Initializes acquisition algorithm. */ @@ -169,6 +174,7 @@ private: std::weak_ptr channel_fsm_; unsigned int doppler_max_; unsigned int doppler_step_; + unsigned int doppler_center_; unsigned int sampled_ms_; unsigned int max_dwells_; unsigned int in_streams_; diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.cc b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.cc index 9325e8aba..879d9f20a 100644 --- a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.cc +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.cc @@ -148,6 +148,7 @@ GpsL1CaPcpsAcquisition::GpsL1CaPcpsAcquisition( channel_ = 0; threshold_ = 0.0; doppler_step_ = 0; + doppler_center_ = 0; gnss_synchro_ = nullptr; if (in_streams_ > 1) @@ -200,6 +201,12 @@ void GpsL1CaPcpsAcquisition::set_doppler_step(unsigned int doppler_step) acquisition_->set_doppler_step(doppler_step_); } +void GpsL1CaPcpsAcquisition::set_doppler_center(int doppler_center) +{ + doppler_center_ = doppler_center; + + acquisition_->set_doppler_center(doppler_center_); +} void GpsL1CaPcpsAcquisition::set_gnss_synchro(Gnss_Synchro* gnss_synchro) { diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.h b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.h index 2f1142142..f3eaff714 100644 --- a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.h +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.h @@ -127,6 +127,11 @@ public: */ void set_doppler_step(unsigned int doppler_step) override; + /*! + * \brief Set Doppler center for the grid search + */ + void set_doppler_center(int doppler_center) override; + /*! * \brief Initializes acquisition algorithm. */ @@ -179,6 +184,7 @@ private: float threshold_; unsigned int doppler_max_; unsigned int doppler_step_; + unsigned int doppler_center_; unsigned int sampled_ms_; unsigned int max_dwells_; int64_t fs_in_; diff --git a/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.cc b/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.cc index d5f0a1dee..06223f2f7 100644 --- a/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.cc +++ b/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.cc @@ -151,6 +151,7 @@ GpsL2MPcpsAcquisition::GpsL2MPcpsAcquisition( channel_ = 0; threshold_ = 0.0; doppler_step_ = 0; + doppler_center_ = 0; gnss_synchro_ = nullptr; num_codes_ = acq_parameters_.sampled_ms / acq_parameters_.ms_per_code; @@ -210,6 +211,12 @@ void GpsL2MPcpsAcquisition::set_doppler_step(unsigned int doppler_step) acquisition_->set_doppler_step(doppler_step_); } +void GpsL2MPcpsAcquisition::set_doppler_center(int doppler_center) +{ + doppler_center_ = doppler_center; + + acquisition_->set_doppler_center(doppler_center_); +} void GpsL2MPcpsAcquisition::set_gnss_synchro(Gnss_Synchro* gnss_synchro) { diff --git a/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.h b/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.h index 6a9b63cfc..268b1f3f3 100644 --- a/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.h +++ b/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.h @@ -124,6 +124,11 @@ public: */ void set_doppler_step(unsigned int doppler_step) override; + /*! + * \brief Set Doppler center for the grid search + */ + void set_doppler_center(int doppler_center) override; + /*! * \brief Initializes acquisition algorithm. */ @@ -176,6 +181,7 @@ private: float threshold_; unsigned int doppler_max_; unsigned int doppler_step_; + unsigned int doppler_center_; unsigned int max_dwells_; int64_t fs_in_; bool dump_; diff --git a/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition.cc b/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition.cc index ffc881d85..d0689f25c 100644 --- a/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition.cc +++ b/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition.cc @@ -147,6 +147,7 @@ GpsL5iPcpsAcquisition::GpsL5iPcpsAcquisition( channel_ = 0; threshold_ = 0.0; doppler_step_ = 0; + doppler_center_ = 0; gnss_synchro_ = nullptr; if (in_streams_ > 1) @@ -205,6 +206,12 @@ void GpsL5iPcpsAcquisition::set_doppler_step(unsigned int doppler_step) acquisition_->set_doppler_step(doppler_step_); } +void GpsL5iPcpsAcquisition::set_doppler_center(int doppler_center) +{ + doppler_center_ = doppler_center; + + acquisition_->set_doppler_center(doppler_center_); +} void GpsL5iPcpsAcquisition::set_gnss_synchro(Gnss_Synchro* gnss_synchro) { diff --git a/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition.h b/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition.h index 8d404a6b4..a0191df2f 100644 --- a/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition.h +++ b/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition.h @@ -124,6 +124,11 @@ public: */ void set_doppler_step(unsigned int doppler_step) override; + /*! + * \brief Set Doppler center for the grid search + */ + void set_doppler_center(int doppler_center) override; + /*! * \brief Initializes acquisition algorithm. */ @@ -176,6 +181,7 @@ private: float threshold_; unsigned int doppler_max_; unsigned int doppler_step_; + unsigned int doppler_center_; unsigned int max_dwells_; int64_t fs_in_; bool dump_; diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc index 217665fd1..56ba1563e 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc @@ -48,7 +48,6 @@ #else #include #endif -#include #include #include #include // for from_long @@ -90,7 +89,7 @@ pcps_acquisition::pcps_acquisition(const Acq_Conf& conf_) : gr::block("pcps_acqu d_active = false; d_positive_acq = 0; d_state = 0; - d_old_freq = 0LL; + d_doppler_bias = 0; d_num_noncoherent_integrations_counter = 0U; d_consumed_samples = acq_parameters.sampled_ms * acq_parameters.samples_per_ms * (acq_parameters.bit_transition_flag ? 2 : 1); if (acq_parameters.sampled_ms == acq_parameters.ms_per_code) @@ -107,6 +106,7 @@ pcps_acquisition::pcps_acquisition(const Acq_Conf& conf_) : gr::block("pcps_acqu d_num_doppler_bins = 0U; d_threshold = 0.0; d_doppler_step = 0U; + d_doppler_center = 0U; d_doppler_center_step_two = 0.0; d_test_statistics = 0.0; d_channel = 0U; @@ -215,8 +215,6 @@ void pcps_acquisition::set_resampler_latency(uint32_t latency_samples) void pcps_acquisition::set_local_code(std::complex* code) { - // reset the intermediate frequency - d_old_freq = 0LL; // This will check if it's fdma, if yes will update the intermediate frequency and the doppler grid if (is_fdma()) { @@ -253,17 +251,19 @@ void pcps_acquisition::set_local_code(std::complex* code) bool pcps_acquisition::is_fdma() { + // reset the intermediate frequency + d_doppler_bias = 0; // Dealing with FDMA system if (strcmp(d_gnss_synchro->Signal, "1G") == 0) { - d_old_freq += DFRQ1_GLO * GLONASS_PRN.at(d_gnss_synchro->PRN); - LOG(INFO) << "Trying to acquire SV PRN " << d_gnss_synchro->PRN << " with freq " << d_old_freq << " in Glonass Channel " << GLONASS_PRN.at(d_gnss_synchro->PRN) << std::endl; + d_doppler_bias = static_cast(DFRQ1_GLO * GLONASS_PRN.at(d_gnss_synchro->PRN)); + LOG(INFO) << "Trying to acquire SV PRN " << d_gnss_synchro->PRN << " with freq " << d_doppler_bias << " in Glonass Channel " << GLONASS_PRN.at(d_gnss_synchro->PRN) << std::endl; return true; } if (strcmp(d_gnss_synchro->Signal, "2G") == 0) { - d_old_freq += DFRQ2_GLO * GLONASS_PRN.at(d_gnss_synchro->PRN); - LOG(INFO) << "Trying to acquire SV PRN " << d_gnss_synchro->PRN << " with freq " << d_old_freq << " in Glonass Channel " << GLONASS_PRN.at(d_gnss_synchro->PRN) << std::endl; + d_doppler_bias += static_cast(DFRQ2_GLO * GLONASS_PRN.at(d_gnss_synchro->PRN)); + LOG(INFO) << "Trying to acquire SV PRN " << d_gnss_synchro->PRN << " with freq " << d_doppler_bias << " in Glonass Channel " << GLONASS_PRN.at(d_gnss_synchro->PRN) << std::endl; return true; } return false; @@ -318,14 +318,10 @@ void pcps_acquisition::init() for (uint32_t doppler_index = 0; doppler_index < d_num_doppler_bins; doppler_index++) { - for (uint32_t k = 0; k < d_fft_size; k++) - { - d_magnitude_grid[doppler_index][k] = 0.0; - } - int32_t doppler = -static_cast(acq_parameters.doppler_max) + d_doppler_step * doppler_index; - update_local_carrier(gsl::span(d_grid_doppler_wipeoffs[doppler_index].data(), d_fft_size), d_old_freq + doppler); + std::fill(d_magnitude_grid[doppler_index].begin(), d_magnitude_grid[doppler_index].end(), 0.0); } + update_grid_doppler_wipeoffs(); d_worker_active = false; if (d_dump) @@ -341,8 +337,8 @@ void pcps_acquisition::update_grid_doppler_wipeoffs() { for (uint32_t doppler_index = 0; doppler_index < d_num_doppler_bins; doppler_index++) { - int32_t doppler = -static_cast(acq_parameters.doppler_max) + d_doppler_step * doppler_index; - update_local_carrier(gsl::span(d_grid_doppler_wipeoffs[doppler_index].data(), d_fft_size), d_old_freq + doppler); + int32_t doppler = -static_cast(acq_parameters.doppler_max) + d_doppler_center + d_doppler_step * doppler_index; + update_local_carrier(gsl::span(d_grid_doppler_wipeoffs[doppler_index].data(), d_fft_size), d_doppler_bias + doppler); } } @@ -394,7 +390,8 @@ void pcps_acquisition::send_positive_acquisition() << ", code phase " << d_gnss_synchro->Acq_delay_samples << ", doppler " << d_gnss_synchro->Acq_doppler_hz << ", magnitude " << d_mag - << ", input signal power " << d_input_power; + << ", input signal power " << d_input_power + << ", Assist doppler_center " << d_doppler_center; d_positive_acq = 1; if (!d_channel_fsm.expired()) @@ -552,7 +549,7 @@ float pcps_acquisition::max_to_input_power_statistic(uint32_t& indext, int32_t& indext = index_time; if (!d_step_two) { - doppler = -static_cast(doppler_max) + doppler_step * static_cast(index_doppler); + doppler = -static_cast(doppler_max) + d_doppler_center + doppler_step * static_cast(index_doppler); } else { @@ -590,7 +587,7 @@ float pcps_acquisition::first_vs_second_peak_statistic(uint32_t& indext, int32_t if (!d_step_two) { - doppler = -static_cast(doppler_max) + doppler_step * static_cast(index_doppler); + doppler = -static_cast(doppler_max) + d_doppler_center + doppler_step * static_cast(index_doppler); } else { diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.h b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.h index 2d12f192b..291e5349c 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.h +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.h @@ -55,6 +55,7 @@ #include "acq_conf.h" #include "channel_fsm.h" #include +#include #include #include #include // for gr_complex @@ -188,6 +189,21 @@ public: d_doppler_step = doppler_step; } + /*! + * \brief Set Doppler center frequency for the grid search. It will refresh the Doppler grid. + * \param doppler_center - Frequency center of the search grid [Hz]. + */ + inline void set_doppler_center(int32_t doppler_center) + { + gr::thread::scoped_lock lock(d_setlock); // require mutex with work function called by the scheduler + if (doppler_center != d_doppler_center) + { + DLOG(INFO) << " Doppler assistance for Channel: " << d_channel << " => Doppler: " << doppler_center << "[Hz]"; + d_doppler_center = doppler_center; + update_grid_doppler_wipeoffs(); + } + } + void set_resampler_latency(uint32_t latency_samples); /*! @@ -211,6 +227,8 @@ private: uint32_t d_channel; uint32_t d_samplesPerChip; uint32_t d_doppler_step; + int32_t d_doppler_center; + int32_t d_doppler_bias; uint32_t d_num_noncoherent_integrations_counter; uint32_t d_fft_size; uint32_t d_consumed_samples; @@ -220,7 +238,6 @@ private: uint32_t d_buffer_count; uint64_t d_sample_counter; int64_t d_dump_number; - int64_t d_old_freq; float d_threshold; float d_mag; float d_input_power; diff --git a/src/algorithms/channel/adapters/channel.cc b/src/algorithms/channel/adapters/channel.cc index 717627527..52dea94e2 100644 --- a/src/algorithms/channel/adapters/channel.cc +++ b/src/algorithms/channel/adapters/channel.cc @@ -232,6 +232,10 @@ void Channel::stop_channel() } +void Channel::assist_acquisition_doppler(double Carrier_Doppler_hz) +{ + acq_->set_doppler_center(static_cast(Carrier_Doppler_hz)); +} void Channel::start_acquisition() { std::lock_guard lk(mx); diff --git a/src/algorithms/channel/adapters/channel.h b/src/algorithms/channel/adapters/channel.h index 289e5528d..5964b0a06 100644 --- a/src/algorithms/channel/adapters/channel.h +++ b/src/algorithms/channel/adapters/channel.h @@ -87,6 +87,8 @@ public: void stop_channel() override; //!< Stop the State Machine void set_signal(const Gnss_Signal& gnss_signal_) override; //!< Sets the channel GNSS signal + void assist_acquisition_doppler(double Carrier_Doppler_hz) override; + inline std::shared_ptr acquisition() { return acq_; } inline std::shared_ptr tracking() { return trk_; } inline std::shared_ptr telemetry() { return nav_; } diff --git a/src/core/interfaces/acquisition_interface.h b/src/core/interfaces/acquisition_interface.h index 641df0792..011713602 100644 --- a/src/core/interfaces/acquisition_interface.h +++ b/src/core/interfaces/acquisition_interface.h @@ -62,6 +62,10 @@ public: virtual void set_threshold(float threshold) = 0; virtual void set_doppler_max(unsigned int doppler_max) = 0; virtual void set_doppler_step(unsigned int doppler_step) = 0; + virtual void set_doppler_center(int doppler_center __attribute__((unused))) + { + return; + } virtual void init() = 0; virtual void set_local_code() = 0; virtual void set_state(int state) = 0; diff --git a/src/core/interfaces/channel_interface.h b/src/core/interfaces/channel_interface.h index d4f97aea5..3f5236d9a 100644 --- a/src/core/interfaces/channel_interface.h +++ b/src/core/interfaces/channel_interface.h @@ -57,6 +57,7 @@ public: virtual gr::basic_block_sptr get_right_block() = 0; virtual Gnss_Signal get_signal() const = 0; virtual void start_acquisition() = 0; + virtual void assist_acquisition_doppler(double Carrier_Doppler_hz) = 0; virtual void stop_channel() = 0; virtual void set_signal(const Gnss_Signal&) = 0; }; diff --git a/src/core/receiver/gnss_flowgraph.cc b/src/core/receiver/gnss_flowgraph.cc index 36ec45e61..2562e094b 100644 --- a/src/core/receiver/gnss_flowgraph.cc +++ b/src/core/receiver/gnss_flowgraph.cc @@ -1163,7 +1163,24 @@ void GNSSFlowgraph::remove_signal(const Gnss_Signal& gs) break; } } - +//project Doppler from primary frequency to secondary frequency +double GNSSFlowgraph::project_doppler(std::string searched_signal, double primary_freq_doppler_hz) +{ + switch (mapStringValues_[searched_signal]) + { + case evGPS_L5: + return (primary_freq_doppler_hz / FREQ1) * FREQ5; + break; + case evGAL_5X: + return (primary_freq_doppler_hz / FREQ1) * FREQ5; + break; + case evGPS_2S: + return (primary_freq_doppler_hz / FREQ1) * FREQ2; + break; + default: + return primary_freq_doppler_hz; + } +} void GNSSFlowgraph::acquisition_manager(unsigned int who) { @@ -1186,10 +1203,11 @@ void GNSSFlowgraph::acquisition_manager(unsigned int who) bool assistance_available = false; bool start_acquisition = false; Gnss_Signal gnss_signal; + float estimated_doppler; + double RX_time; + if (sat_ == 0) { - float estimated_doppler; - double RX_time; gnss_signal = search_next_signal(channels_[current_channel]->get_signal().get_signal_str(), true, is_primary_freq, @@ -1198,12 +1216,6 @@ void GNSSFlowgraph::acquisition_manager(unsigned int who) RX_time); channels_[current_channel]->set_signal(gnss_signal); start_acquisition = is_primary_freq or assistance_available or !configuration_->property("GNSS-SDR.assist_dual_frequency_acq", false); - // if (assistance_available) - // { - // std::cout << "Channel " << current_channel - // << " assistance available for " << channels_[current_channel]->get_signal().get_satellite() - // << ", Signal " << channels_[current_channel]->get_signal().get_signal_str() << std::endl; - // } } else { @@ -1217,6 +1229,15 @@ void GNSSFlowgraph::acquisition_manager(unsigned int who) DLOG(INFO) << "Channel " << current_channel << " Starting acquisition " << channels_[current_channel]->get_signal().get_satellite() << ", Signal " << channels_[current_channel]->get_signal().get_signal_str(); + if (assistance_available == true and configuration_->property("GNSS-SDR.assist_dual_frequency_acq", false)) + { + channels_[current_channel]->assist_acquisition_doppler(project_doppler(channels_[current_channel]->get_signal().get_signal_str(), estimated_doppler)); + } + else + { + //set Doppler center to 0 Hz + channels_[current_channel]->assist_acquisition_doppler(0); + } #ifndef ENABLE_FPGA channels_[current_channel]->start_acquisition(); #else @@ -1232,11 +1253,6 @@ void GNSSFlowgraph::acquisition_manager(unsigned int who) << " secondary frequency acquisition assistance not available in " << channels_[current_channel]->get_signal().get_satellite() << ", Signal " << channels_[current_channel]->get_signal().get_signal_str(); - - // std::cout << "Channel " << current_channel - // << " secondary frequency acquisition assistance not available in " - // << channels_[current_channel]->get_signal().get_satellite() - // << ", Signal " << channels_[current_channel]->get_signal().get_signal_str() << std::endl; } } DLOG(INFO) << "Channel " << current_channel << " in state " << channels_state_[current_channel]; @@ -1272,6 +1288,7 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) std::lock_guard lock(signal_list_mutex); DLOG(INFO) << "Received " << what << " from " << who; + Gnss_Signal gs = channels_[who]->get_signal(); unsigned int sat = 0; if (who < 200) { @@ -1287,12 +1304,7 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) switch (what) { case 0: - DLOG(INFO) << "Channel " << who << " ACQ FAILED satellite " << channels_[who]->get_signal().get_satellite() << ", Signal " << channels_[who]->get_signal().get_signal_str(); - if (sat == 0) - { - Gnss_Signal gs = channels_[who]->get_signal(); - push_back_signal(gs); - } + DLOG(INFO) << "Channel " << who << " ACQ FAILED satellite " << gs.get_satellite() << ", Signal " << gs.get_signal_str(); channels_state_[who] = 0; if (acq_channels_count_ > 0) { @@ -1300,11 +1312,16 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) } // call the acquisition manager to assign new satellite and start next acquisition (if required) acquisition_manager(who); + //push back the old signal AFTER assigning a new one to avoid selecting the same signal + if (sat == 0) + { + push_back_signal(gs); + } break; case 1: - DLOG(INFO) << "Channel " << who << " ACQ SUCCESS satellite " << channels_[who]->get_signal().get_satellite(); + DLOG(INFO) << "Channel " << who << " ACQ SUCCESS satellite " << gs.get_satellite(); // If the satellite is in the list of available ones, remove it. - remove_signal(channels_[who]->get_signal()); + remove_signal(gs); channels_state_[who] = 2; if (acq_channels_count_ > 0) @@ -1316,13 +1333,13 @@ void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) break; case 2: - DLOG(INFO) << "Channel " << who << " TRK FAILED satellite " << channels_[who]->get_signal().get_satellite(); + DLOG(INFO) << "Channel " << who << " TRK FAILED satellite " << gs.get_satellite(); if (acq_channels_count_ < max_acq_channels_) { // try to acquire the same satellite channels_state_[who] = 1; acq_channels_count_++; - DLOG(INFO) << "Channel " << who << " Starting acquisition " << channels_[who]->get_signal().get_satellite() << ", Signal " << channels_[who]->get_signal().get_signal_str(); + DLOG(INFO) << "Channel " << who << " Starting acquisition " << gs.get_satellite() << ", Signal " << gs.get_signal_str(); #ifndef ENABLE_FPGA channels_[who]->start_acquisition(); #else @@ -1917,7 +1934,6 @@ Gnss_Signal GNSSFlowgraph::search_next_signal(const std::string& searched_signal { estimated_doppler = current_status.second->Carrier_Doppler_hz; RX_time = current_status.second->RX_time; - // std::cout << " Channel: " << it->first << " => Doppler: " << estimated_doppler << "[Hz] \n"; // 3. return the GPS L2 satellite and remove it from list result = *it2; if (pop) diff --git a/src/core/receiver/gnss_flowgraph.h b/src/core/receiver/gnss_flowgraph.h index 6e52cff1f..121271b62 100644 --- a/src/core/receiver/gnss_flowgraph.h +++ b/src/core/receiver/gnss_flowgraph.h @@ -181,6 +181,7 @@ private: void push_back_signal(const Gnss_Signal& gs); void remove_signal(const Gnss_Signal& gs); + double project_doppler(std::string searched_signal, double primary_freq_doppler_hz); bool connected_; bool running_; int sources_count_; From 05faf97b703779623c8ac7c924f723b3cc03bbad Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Tue, 23 Jul 2019 18:54:32 +0200 Subject: [PATCH 32/36] Switch to automatically managed static memory --- ...o_e5a_noncoherent_iq_acquisition_caf_cc.cc | 188 +++++------------- ...eo_e5a_noncoherent_iq_acquisition_caf_cc.h | 27 +-- .../galileo_pcps_8ms_acquisition_cc.cc | 58 ++---- .../galileo_pcps_8ms_acquisition_cc.h | 11 +- .../pcps_assisted_acquisition_cc.cc | 35 ++-- .../pcps_assisted_acquisition_cc.h | 5 +- .../pcps_cccwsr_acquisition_cc.cc | 79 +++----- .../pcps_cccwsr_acquisition_cc.h | 19 +- .../pcps_opencl_acquisition_cc.cc | 110 ++++------ .../pcps_opencl_acquisition_cc.h | 10 +- .../pcps_quicksync_acquisition_cc.cc | 136 +++++-------- .../pcps_quicksync_acquisition_cc.h | 20 +- .../pcps_tong_acquisition_cc.cc | 70 ++----- .../pcps_tong_acquisition_cc.h | 9 +- 14 files changed, 278 insertions(+), 499 deletions(-) diff --git a/src/algorithms/acquisition/gnuradio_blocks/galileo_e5a_noncoherent_iq_acquisition_caf_cc.cc b/src/algorithms/acquisition/gnuradio_blocks/galileo_e5a_noncoherent_iq_acquisition_caf_cc.cc index e94642af5..3175edd25 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/galileo_e5a_noncoherent_iq_acquisition_caf_cc.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/galileo_e5a_noncoherent_iq_acquisition_caf_cc.cc @@ -106,42 +106,26 @@ galileo_e5a_noncoherentIQ_acquisition_caf_cc::galileo_e5a_noncoherentIQ_acquisit d_both_signal_components = both_signal_components_; d_CAF_window_hz = CAF_window_hz_; - d_inbuffer = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); - d_fft_code_I_A = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); - d_magnitudeIA = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(float), volk_gnsssdr_get_alignment())); + d_inbuffer.reserve(d_fft_size); + d_fft_code_I_A.reserve(d_fft_size); + d_magnitudeIA.reserve(d_fft_size); if (d_both_signal_components == true) { - d_fft_code_Q_A = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); - d_magnitudeQA = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(float), volk_gnsssdr_get_alignment())); - } - else - { - d_fft_code_Q_A = nullptr; - d_magnitudeQA = nullptr; + d_fft_code_Q_A.reserve(d_fft_size); + d_magnitudeQA.reserve(d_fft_size); } + // IF COHERENT INTEGRATION TIME > 1 if (d_sampled_ms > 1) { - d_fft_code_I_B = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); - d_magnitudeIB = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(float), volk_gnsssdr_get_alignment())); + d_fft_code_I_B.reserve(d_fft_size); + d_magnitudeIB.reserve(d_fft_size); if (d_both_signal_components == true) { - d_fft_code_Q_B = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); - d_magnitudeQB = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(float), volk_gnsssdr_get_alignment())); + d_fft_code_Q_B.reserve(d_fft_size); + d_magnitudeQB.reserve(d_fft_size); } - else - { - d_fft_code_Q_B = nullptr; - d_magnitudeQB = nullptr; - } - } - else - { - d_fft_code_I_B = nullptr; - d_magnitudeIB = nullptr; - d_fft_code_Q_B = nullptr; - d_magnitudeQB = nullptr; } // Direct FFT @@ -157,14 +141,10 @@ galileo_e5a_noncoherentIQ_acquisition_caf_cc::galileo_e5a_noncoherentIQ_acquisit d_doppler_resolution = 0; d_threshold = 0; d_doppler_step = 250; - d_grid_doppler_wipeoffs = nullptr; d_gnss_synchro = nullptr; d_code_phase = 0; d_doppler_freq = 0; d_test_statistics = 0; - d_CAF_vector = nullptr; - d_CAF_vector_I = nullptr; - d_CAF_vector_Q = nullptr; d_channel = 0; d_gr_stream_buffer = 0; } @@ -172,44 +152,6 @@ galileo_e5a_noncoherentIQ_acquisition_caf_cc::galileo_e5a_noncoherentIQ_acquisit galileo_e5a_noncoherentIQ_acquisition_caf_cc::~galileo_e5a_noncoherentIQ_acquisition_caf_cc() { - if (d_num_doppler_bins > 0) - { - for (unsigned int i = 0; i < d_num_doppler_bins; i++) - { - volk_gnsssdr_free(d_grid_doppler_wipeoffs[i]); - } - delete[] d_grid_doppler_wipeoffs; - } - - volk_gnsssdr_free(d_inbuffer); - volk_gnsssdr_free(d_fft_code_I_A); - volk_gnsssdr_free(d_magnitudeIA); - if (d_both_signal_components == true) - { - volk_gnsssdr_free(d_fft_code_Q_A); - volk_gnsssdr_free(d_magnitudeQA); - } - // IF INTEGRATION TIME > 1 - if (d_sampled_ms > 1) - { - volk_gnsssdr_free(d_fft_code_I_B); - volk_gnsssdr_free(d_magnitudeIB); - if (d_both_signal_components == true) - { - volk_gnsssdr_free(d_fft_code_Q_B); - volk_gnsssdr_free(d_magnitudeQB); - } - } - if (d_CAF_window_hz > 0) - { - volk_gnsssdr_free(d_CAF_vector); - volk_gnsssdr_free(d_CAF_vector_I); - if (d_both_signal_components == true) - { - volk_gnsssdr_free(d_CAF_vector_Q); - } - } - try { if (d_dump) @@ -236,8 +178,8 @@ void galileo_e5a_noncoherentIQ_acquisition_caf_cc::set_local_code(std::complexexecute(); // We need the FFT of local code - //Conjugate the local code - volk_32fc_conjugate_32fc(d_fft_code_I_A, d_fft_if->get_outbuf(), d_fft_size); + // Conjugate the local code + volk_32fc_conjugate_32fc(d_fft_code_I_A.data(), d_fft_if->get_outbuf(), d_fft_size); // SAME FOR PILOT SIGNAL if (d_both_signal_components == true) @@ -247,8 +189,8 @@ void galileo_e5a_noncoherentIQ_acquisition_caf_cc::set_local_code(std::complexexecute(); // We need the FFT of local code - //Conjugate the local code - volk_32fc_conjugate_32fc(d_fft_code_Q_A, d_fft_if->get_outbuf(), d_fft_size); + // Conjugate the local code + volk_32fc_conjugate_32fc(d_fft_code_Q_A.data(), d_fft_if->get_outbuf(), d_fft_size); } // IF INTEGRATION TIME > 1 code, we need to evaluate the other possible combination // Note: max integration time allowed = 3ms (dealt in adapter) @@ -261,8 +203,8 @@ void galileo_e5a_noncoherentIQ_acquisition_caf_cc::set_local_code(std::complexexecute(); // We need the FFT of local code - //Conjugate the local code - volk_32fc_conjugate_32fc(d_fft_code_I_B, d_fft_if->get_outbuf(), d_fft_size); + // Conjugate the local code + volk_32fc_conjugate_32fc(d_fft_code_I_B.data(), d_fft_if->get_outbuf(), d_fft_size); if (d_both_signal_components == true) { @@ -272,8 +214,8 @@ void galileo_e5a_noncoherentIQ_acquisition_caf_cc::set_local_code(std::complexexecute(); // We need the FFT of local code - //Conjugate the local code - volk_32fc_conjugate_32fc(d_fft_code_Q_B, d_fft_if->get_outbuf(), d_fft_size); + // Conjugate the local code + volk_32fc_conjugate_32fc(d_fft_code_Q_B.data(), d_fft_if->get_outbuf(), d_fft_size); } } } @@ -304,26 +246,24 @@ void galileo_e5a_noncoherentIQ_acquisition_caf_cc::init() } // Create the carrier Doppler wipeoff signals - d_grid_doppler_wipeoffs = new gr_complex *[d_num_doppler_bins]; + d_grid_doppler_wipeoffs = std::vector>(d_num_doppler_bins, std::vector(d_fft_size)); for (unsigned int doppler_index = 0; doppler_index < d_num_doppler_bins; doppler_index++) { - d_grid_doppler_wipeoffs[doppler_index] = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); int doppler = -static_cast(d_doppler_max) + d_doppler_step * doppler_index; float phase_step_rad = GALILEO_TWO_PI * doppler / static_cast(d_fs_in); std::array _phase{}; - volk_gnsssdr_s32f_sincos_32fc(d_grid_doppler_wipeoffs[doppler_index], -phase_step_rad, _phase.data(), d_fft_size); + volk_gnsssdr_s32f_sincos_32fc(d_grid_doppler_wipeoffs[doppler_index].data(), -phase_step_rad, _phase.data(), d_fft_size); } /* CAF Filtering to resolve doppler ambiguity. Phase and quadrature must be processed * separately before non-coherent integration */ - // if (d_CAF_filter) if (d_CAF_window_hz > 0) { - d_CAF_vector = static_cast(volk_gnsssdr_malloc(d_num_doppler_bins * sizeof(float), volk_gnsssdr_get_alignment())); - d_CAF_vector_I = static_cast(volk_gnsssdr_malloc(d_num_doppler_bins * sizeof(float), volk_gnsssdr_get_alignment())); + d_CAF_vector.reserve(d_num_doppler_bins); + d_CAF_vector_I.reserve(d_num_doppler_bins); if (d_both_signal_components == true) { - d_CAF_vector_Q = static_cast(volk_gnsssdr_malloc(d_num_doppler_bins * sizeof(float), volk_gnsssdr_get_alignment())); + d_CAF_vector_Q.reserve(d_num_doppler_bins); } } } @@ -369,8 +309,8 @@ int galileo_e5a_noncoherentIQ_acquisition_caf_cc::general_work(int noutput_items * 7. Declare positive or negative acquisition using a message port */ - int acquisition_message = -1; //0=STOP_CHANNEL 1=ACQ_SUCCEES 2=ACQ_FAIL - /* States: 0 Stop Channel + int acquisition_message = -1; // 0=STOP_CHANNEL 1=ACQ_SUCCEES 2=ACQ_FAIL + /* States: 0 Stop Channel * 1 Load the buffer until it reaches fft_size * 2 Acquisition algorithm * 3 Positive acquisition @@ -382,7 +322,7 @@ int galileo_e5a_noncoherentIQ_acquisition_caf_cc::general_work(int noutput_items { if (d_active) { - //restart acquisition variables + // restart acquisition variables d_gnss_synchro->Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0ULL; @@ -400,7 +340,7 @@ int galileo_e5a_noncoherentIQ_acquisition_caf_cc::general_work(int noutput_items } case 1: { - const auto *in = reinterpret_cast(input_items[0]); //Get the input samples pointer + const auto *in = reinterpret_cast(input_items[0]); // Get the input samples pointer unsigned int buff_increment; if ((ninput_items[0] + d_buffer_count) <= d_fft_size) { @@ -424,7 +364,7 @@ int galileo_e5a_noncoherentIQ_acquisition_caf_cc::general_work(int noutput_items case 2: { // Fill last part of the buffer and reset counter - const auto *in = reinterpret_cast(input_items[0]); //Get the input samples pointer + const auto *in = reinterpret_cast(input_items[0]); // Get the input samples pointer if (d_buffer_count < d_fft_size) { memcpy(&d_inbuffer[d_buffer_count], in, sizeof(gr_complex) * (d_fft_size - d_buffer_count)); @@ -455,19 +395,18 @@ int galileo_e5a_noncoherentIQ_acquisition_caf_cc::general_work(int noutput_items << ", doppler_step: " << d_doppler_step; // 1- Compute the input signal power estimation - volk_32fc_magnitude_squared_32f(d_magnitudeIA, d_inbuffer, d_fft_size); - volk_32f_accumulator_s32f(&d_input_power, d_magnitudeIA, d_fft_size); + volk_32fc_magnitude_squared_32f(d_magnitudeIA.data(), d_inbuffer.data(), d_fft_size); + volk_32f_accumulator_s32f(&d_input_power, d_magnitudeIA.data(), d_fft_size); d_input_power /= static_cast(d_fft_size); // 2- Doppler frequency search loop for (unsigned int doppler_index = 0; doppler_index < d_num_doppler_bins; doppler_index++) { // doppler search steps - doppler = -static_cast(d_doppler_max) + d_doppler_step * doppler_index; - volk_32fc_x2_multiply_32fc(d_fft_if->get_inbuf(), d_inbuffer, - d_grid_doppler_wipeoffs[doppler_index], d_fft_size); + volk_32fc_x2_multiply_32fc(d_fft_if->get_inbuf(), d_inbuffer.data(), + d_grid_doppler_wipeoffs[doppler_index].data(), d_fft_size); // 3- Perform the FFT-based convolution (parallel time search) // Compute the FFT of the carrier wiped--off incoming signal @@ -477,14 +416,14 @@ int galileo_e5a_noncoherentIQ_acquisition_caf_cc::general_work(int noutput_items // Multiply carrier wiped--off, Fourier transformed incoming signal // with the local FFT'd code reference using SIMD operations with VOLK library volk_32fc_x2_multiply_32fc(d_ifft->get_inbuf(), - d_fft_if->get_outbuf(), d_fft_code_I_A, d_fft_size); + d_fft_if->get_outbuf(), d_fft_code_I_A.data(), d_fft_size); // compute the inverse FFT d_ifft->execute(); // Search maximum - volk_32fc_magnitude_squared_32f(d_magnitudeIA, d_ifft->get_outbuf(), d_fft_size); - volk_gnsssdr_32f_index_max_32u(&indext_IA, d_magnitudeIA, d_fft_size); + volk_32fc_magnitude_squared_32f(d_magnitudeIA.data(), d_ifft->get_outbuf(), d_fft_size); + volk_gnsssdr_32f_index_max_32u(&indext_IA, d_magnitudeIA.data(), d_fft_size); // Normalize the maximum value to correct the scale factor introduced by FFTW magt_IA = d_magnitudeIA[indext_IA] / (fft_normalization_factor * fft_normalization_factor); @@ -492,30 +431,30 @@ int galileo_e5a_noncoherentIQ_acquisition_caf_cc::general_work(int noutput_items { // REPEAT FOR ALL CODES. CODE_QA volk_32fc_x2_multiply_32fc(d_ifft->get_inbuf(), - d_fft_if->get_outbuf(), d_fft_code_Q_A, d_fft_size); + d_fft_if->get_outbuf(), d_fft_code_Q_A.data(), d_fft_size); d_ifft->execute(); - volk_32fc_magnitude_squared_32f(d_magnitudeQA, d_ifft->get_outbuf(), d_fft_size); - volk_gnsssdr_32f_index_max_32u(&indext_QA, d_magnitudeQA, d_fft_size); + volk_32fc_magnitude_squared_32f(d_magnitudeQA.data(), d_ifft->get_outbuf(), d_fft_size); + volk_gnsssdr_32f_index_max_32u(&indext_QA, d_magnitudeQA.data(), d_fft_size); magt_QA = d_magnitudeQA[indext_QA] / (fft_normalization_factor * fft_normalization_factor); } if (d_sampled_ms > 1) // If Integration time > 1 code { // REPEAT FOR ALL CODES. CODE_IB volk_32fc_x2_multiply_32fc(d_ifft->get_inbuf(), - d_fft_if->get_outbuf(), d_fft_code_I_B, d_fft_size); + d_fft_if->get_outbuf(), d_fft_code_I_B.data(), d_fft_size); d_ifft->execute(); - volk_32fc_magnitude_squared_32f(d_magnitudeIB, d_ifft->get_outbuf(), d_fft_size); - volk_gnsssdr_32f_index_max_32u(&indext_IB, d_magnitudeIB, d_fft_size); + volk_32fc_magnitude_squared_32f(d_magnitudeIB.data(), d_ifft->get_outbuf(), d_fft_size); + volk_gnsssdr_32f_index_max_32u(&indext_IB, d_magnitudeIB.data(), d_fft_size); magt_IB = d_magnitudeIB[indext_IB] / (fft_normalization_factor * fft_normalization_factor); if (d_both_signal_components == true) { // REPEAT FOR ALL CODES. CODE_QB volk_32fc_x2_multiply_32fc(d_ifft->get_inbuf(), - d_fft_if->get_outbuf(), d_fft_code_Q_B, d_fft_size); + d_fft_if->get_outbuf(), d_fft_code_Q_B.data(), d_fft_size); d_ifft->execute(); - volk_32fc_magnitude_squared_32f(d_magnitudeQB, d_ifft->get_outbuf(), d_fft_size); - volk_gnsssdr_32f_index_max_32u(&indext_QB, d_magnitudeQB, d_fft_size); + volk_32fc_magnitude_squared_32f(d_magnitudeQB.data(), d_ifft->get_outbuf(), d_fft_size); + volk_gnsssdr_32f_index_max_32u(&indext_QB, d_magnitudeQB.data(), d_fft_size); magt_QB = d_magnitudeIB[indext_QB] / (fft_normalization_factor * fft_normalization_factor); } } @@ -528,7 +467,6 @@ int galileo_e5a_noncoherentIQ_acquisition_caf_cc::general_work(int noutput_items { if (magt_IA >= magt_IB) { - // if (d_CAF_filter) {d_CAF_vector_I[doppler_index] = magt_IA;} if (d_CAF_window_hz > 0) { d_CAF_vector_I[doppler_index] = d_magnitudeIA[indext_IA]; @@ -538,7 +476,6 @@ int galileo_e5a_noncoherentIQ_acquisition_caf_cc::general_work(int noutput_items // Integrate non-coherently I+Q if (magt_QA >= magt_QB) { - // if (d_CAF_filter) {d_CAF_vector_Q[doppler_index] = magt_QA;} if (d_CAF_window_hz > 0) { d_CAF_vector_Q[doppler_index] = d_magnitudeQA[indext_QA]; @@ -550,7 +487,6 @@ int galileo_e5a_noncoherentIQ_acquisition_caf_cc::general_work(int noutput_items } else { - // if (d_CAF_filter) {d_CAF_vector_Q[doppler_index] = magt_QB;} if (d_CAF_window_hz > 0) { d_CAF_vector_Q[doppler_index] = d_magnitudeQB[indext_QB]; @@ -561,12 +497,11 @@ int galileo_e5a_noncoherentIQ_acquisition_caf_cc::general_work(int noutput_items } } } - volk_gnsssdr_32f_index_max_32u(&indext, d_magnitudeIA, d_fft_size); + volk_gnsssdr_32f_index_max_32u(&indext, d_magnitudeIA.data(), d_fft_size); magt = d_magnitudeIA[indext] / (fft_normalization_factor * fft_normalization_factor); } else { - // if (d_CAF_filter) {d_CAF_vector_I[doppler_index] = magt_IB;} if (d_CAF_window_hz > 0) { d_CAF_vector_I[doppler_index] = d_magnitudeIB[indext_IB]; @@ -576,7 +511,6 @@ int galileo_e5a_noncoherentIQ_acquisition_caf_cc::general_work(int noutput_items // Integrate non-coherently I+Q if (magt_QA >= magt_QB) { - //if (d_CAF_filter) {d_CAF_vector_Q[doppler_index] = magt_QA;} if (d_CAF_window_hz > 0) { d_CAF_vector_Q[doppler_index] = d_magnitudeQA[indext_QA]; @@ -588,7 +522,6 @@ int galileo_e5a_noncoherentIQ_acquisition_caf_cc::general_work(int noutput_items } else { - // if (d_CAF_filter) {d_CAF_vector_Q[doppler_index] = magt_QB;} if (d_CAF_window_hz > 0) { d_CAF_vector_Q[doppler_index] = d_magnitudeQB[indext_QB]; @@ -599,20 +532,18 @@ int galileo_e5a_noncoherentIQ_acquisition_caf_cc::general_work(int noutput_items } } } - volk_gnsssdr_32f_index_max_32u(&indext, d_magnitudeIB, d_fft_size); + volk_gnsssdr_32f_index_max_32u(&indext, d_magnitudeIB.data(), d_fft_size); magt = d_magnitudeIB[indext] / (fft_normalization_factor * fft_normalization_factor); } } else { - // if (d_CAF_filter) {d_CAF_vector_I[doppler_index] = magt_IA;} if (d_CAF_window_hz > 0) { d_CAF_vector_I[doppler_index] = d_magnitudeIA[indext_IA]; } if (d_both_signal_components) { - // if (d_CAF_filter) {d_CAF_vector_Q[doppler_index] = magt_QA;} if (d_CAF_window_hz > 0) { d_CAF_vector_Q[doppler_index] = d_magnitudeQA[indext_QA]; @@ -623,7 +554,7 @@ int galileo_e5a_noncoherentIQ_acquisition_caf_cc::general_work(int noutput_items d_magnitudeIA[i] += d_magnitudeQA[i]; } } - volk_gnsssdr_32f_index_max_32u(&indext, d_magnitudeIA, d_fft_size); + volk_gnsssdr_32f_index_max_32u(&indext, d_magnitudeIA.data(), d_fft_size); magt = d_magnitudeIA[indext] / (fft_normalization_factor * fft_normalization_factor); } @@ -662,16 +593,16 @@ int galileo_e5a_noncoherentIQ_acquisition_caf_cc::general_work(int noutput_items { if (magt_IA >= magt_IB) { - d_dump_file.write(reinterpret_cast(d_magnitudeIA), n); + d_dump_file.write(reinterpret_cast(d_magnitudeIA.data()), n); } else { - d_dump_file.write(reinterpret_cast(d_magnitudeIB), n); + d_dump_file.write(reinterpret_cast(d_magnitudeIB.data()), n); } } else { - d_dump_file.write(reinterpret_cast(d_magnitudeIA), n); + d_dump_file.write(reinterpret_cast(d_magnitudeIA.data()), n); } d_dump_file.close(); } @@ -681,7 +612,7 @@ int galileo_e5a_noncoherentIQ_acquisition_caf_cc::general_work(int noutput_items if (d_CAF_window_hz > 0) { int CAF_bins_half; - auto *accum = static_cast(volk_gnsssdr_malloc(sizeof(float), volk_gnsssdr_get_alignment())); + std::array accum{}; CAF_bins_half = d_CAF_window_hz / (2 * d_doppler_step); float weighting_factor; weighting_factor = 0.5 / static_cast(CAF_bins_half); @@ -691,22 +622,18 @@ int galileo_e5a_noncoherentIQ_acquisition_caf_cc::general_work(int noutput_items for (int doppler_index = 0; doppler_index < CAF_bins_half; doppler_index++) { d_CAF_vector[doppler_index] = 0; - // volk_32f_accumulator_s32f_a(&d_CAF_vector[doppler_index], d_CAF_vector_I, CAF_bins_half+doppler_index+1); for (int i = 0; i < CAF_bins_half + doppler_index + 1; i++) { d_CAF_vector[doppler_index] += d_CAF_vector_I[i] * (1 - weighting_factor * static_cast((doppler_index - i))); } - // d_CAF_vector[doppler_index] /= CAF_bins_half+doppler_index+1; d_CAF_vector[doppler_index] /= 1 + CAF_bins_half + doppler_index - weighting_factor * CAF_bins_half * (CAF_bins_half + 1) / 2 - weighting_factor * doppler_index * (doppler_index + 1) / 2; // triangles = [n*(n+1)/2] if (d_both_signal_components) { accum[0] = 0; - // volk_32f_accumulator_s32f_a(&accum[0], d_CAF_vector_Q, CAF_bins_half+doppler_index+1); for (int i = 0; i < CAF_bins_half + doppler_index + 1; i++) { accum[0] += d_CAF_vector_Q[i] * (1 - weighting_factor * static_cast(abs(doppler_index - i))); } - // accum[0] /= CAF_bins_half+doppler_index+1; accum[0] /= 1 + CAF_bins_half + doppler_index - weighting_factor * CAF_bins_half * (CAF_bins_half + 1) / 2 - weighting_factor * doppler_index * (doppler_index + 1) / 2; // triangles = [n*(n+1)/2] d_CAF_vector[doppler_index] += accum[0]; } @@ -715,22 +642,18 @@ int galileo_e5a_noncoherentIQ_acquisition_caf_cc::general_work(int noutput_items for (unsigned int doppler_index = CAF_bins_half; doppler_index < d_num_doppler_bins - CAF_bins_half; doppler_index++) { d_CAF_vector[doppler_index] = 0; - // volk_32f_accumulator_s32f_a(&d_CAF_vector[doppler_index], &d_CAF_vector_I[doppler_index-CAF_bins_half], 2*CAF_bins_half+1); for (int i = doppler_index - CAF_bins_half; i < static_cast(doppler_index + CAF_bins_half + 1); i++) { d_CAF_vector[doppler_index] += d_CAF_vector_I[i] * (1 - weighting_factor * static_cast((doppler_index - i))); } - // d_CAF_vector[doppler_index] /= 2*CAF_bins_half+1; d_CAF_vector[doppler_index] /= 1 + 2 * CAF_bins_half - 2 * weighting_factor * CAF_bins_half * (CAF_bins_half + 1) / 2; if (d_both_signal_components) { accum[0] = 0; - // volk_32f_accumulator_s32f_a(&accum[0], &d_CAF_vector_Q[doppler_index-CAF_bins_half], 2*CAF_bins_half); for (int i = doppler_index - CAF_bins_half; i < static_cast(doppler_index + CAF_bins_half + 1); i++) { accum[0] += d_CAF_vector_Q[i] * (1 - weighting_factor * static_cast((doppler_index - i))); } - // accum[0] /= 2*CAF_bins_half+1; accum[0] /= 1 + 2 * CAF_bins_half - 2 * weighting_factor * CAF_bins_half * (CAF_bins_half + 1) / 2; d_CAF_vector[doppler_index] += accum[0]; } @@ -739,29 +662,25 @@ int galileo_e5a_noncoherentIQ_acquisition_caf_cc::general_work(int noutput_items for (int doppler_index = d_num_doppler_bins - CAF_bins_half; doppler_index < static_cast(d_num_doppler_bins); doppler_index++) { d_CAF_vector[doppler_index] = 0; - // volk_32f_accumulator_s32f_a(&d_CAF_vector[doppler_index], &d_CAF_vector_I[doppler_index-CAF_bins_half], CAF_bins_half + (d_num_doppler_bins-doppler_index)); for (int i = doppler_index - CAF_bins_half; i < static_cast(d_num_doppler_bins); i++) { d_CAF_vector[doppler_index] += d_CAF_vector_I[i] * (1 - weighting_factor * (abs(doppler_index - i))); } - // d_CAF_vector[doppler_index] /= CAF_bins_half+(d_num_doppler_bins-doppler_index); d_CAF_vector[doppler_index] /= 1 + CAF_bins_half + (d_num_doppler_bins - doppler_index - 1) - weighting_factor * CAF_bins_half * (CAF_bins_half + 1) / 2 - weighting_factor * (d_num_doppler_bins - doppler_index - 1) * (d_num_doppler_bins - doppler_index) / 2; if (d_both_signal_components) { accum[0] = 0; - // volk_32f_accumulator_s32f_a(&accum[0], &d_CAF_vector_Q[doppler_index-CAF_bins_half], CAF_bins_half + (d_num_doppler_bins-doppler_index)); for (int i = doppler_index - CAF_bins_half; i < static_cast(d_num_doppler_bins); i++) { accum[0] += d_CAF_vector_Q[i] * (1 - weighting_factor * (abs(doppler_index - i))); } - // accum[0] /= CAF_bins_half+(d_num_doppler_bins-doppler_index); accum[0] /= 1 + CAF_bins_half + (d_num_doppler_bins - doppler_index - 1) - weighting_factor * CAF_bins_half * (CAF_bins_half + 1) / 2 - weighting_factor * (d_num_doppler_bins - doppler_index - 1) * (d_num_doppler_bins - doppler_index) / 2; d_CAF_vector[doppler_index] += accum[0]; } } // Recompute the maximum doppler peak - volk_gnsssdr_32f_index_max_32u(&indext, d_CAF_vector, d_num_doppler_bins); + volk_gnsssdr_32f_index_max_32u(&indext, d_CAF_vector.data(), d_num_doppler_bins); doppler = -static_cast(d_doppler_max) + d_doppler_step * indext; d_gnss_synchro->Acq_doppler_hz = static_cast(doppler); // Dump if required, appended at the end of the file @@ -772,10 +691,9 @@ int galileo_e5a_noncoherentIQ_acquisition_caf_cc::general_work(int noutput_items filename.str(""); filename << "../data/test_statistics_E5a_sat_" << d_gnss_synchro->PRN << "_CAF.dat"; d_dump_file.open(filename.str().c_str(), std::ios::out | std::ios::binary); - d_dump_file.write(reinterpret_cast(d_CAF_vector), n); + d_dump_file.write(reinterpret_cast(d_CAF_vector.data()), n); d_dump_file.close(); } - volk_gnsssdr_free(accum); } if (d_well_count == d_max_dwells) diff --git a/src/algorithms/acquisition/gnuradio_blocks/galileo_e5a_noncoherent_iq_acquisition_caf_cc.h b/src/algorithms/acquisition/gnuradio_blocks/galileo_e5a_noncoherent_iq_acquisition_caf_cc.h index 3cc43bebb..cd1977b49 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/galileo_e5a_noncoherent_iq_acquisition_caf_cc.h +++ b/src/algorithms/acquisition/gnuradio_blocks/galileo_e5a_noncoherent_iq_acquisition_caf_cc.h @@ -47,6 +47,7 @@ #include #include #include +#include class galileo_e5a_noncoherentIQ_acquisition_caf_cc; @@ -221,23 +222,23 @@ private: unsigned int d_well_count; unsigned int d_fft_size; uint64_t d_sample_counter; - gr_complex** d_grid_doppler_wipeoffs; + std::vector> d_grid_doppler_wipeoffs; unsigned int d_num_doppler_bins; - gr_complex* d_fft_code_I_A; - gr_complex* d_fft_code_I_B; - gr_complex* d_fft_code_Q_A; - gr_complex* d_fft_code_Q_B; - gr_complex* d_inbuffer; + std::vector d_fft_code_I_A; + std::vector d_fft_code_I_B; + std::vector d_fft_code_Q_A; + std::vector d_fft_code_Q_B; + std::vector d_inbuffer; std::shared_ptr d_fft_if; std::shared_ptr d_ifft; Gnss_Synchro* d_gnss_synchro; unsigned int d_code_phase; float d_doppler_freq; float d_mag; - float* d_magnitudeIA; - float* d_magnitudeIB; - float* d_magnitudeQA; - float* d_magnitudeQB; + std::vector d_magnitudeIA; + std::vector d_magnitudeIB; + std::vector d_magnitudeQA; + std::vector d_magnitudeQB; float d_input_power; float d_test_statistics; bool d_bit_transition_flag; @@ -247,9 +248,9 @@ private: bool d_dump; bool d_both_signal_components; int d_CAF_window_hz; - float* d_CAF_vector; - float* d_CAF_vector_I; - float* d_CAF_vector_Q; + std::vector d_CAF_vector; + std::vector d_CAF_vector_I; + std::vector d_CAF_vector_Q; unsigned int d_channel; std::string d_dump_filename; unsigned int d_buffer_count; 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 bc77ac955..5b287e077 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 @@ -82,9 +82,9 @@ galileo_pcps_8ms_acquisition_cc::galileo_pcps_8ms_acquisition_cc( d_input_power = 0.0; d_num_doppler_bins = 0; - d_fft_code_A = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); - d_fft_code_B = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); - d_magnitude = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(float), volk_gnsssdr_get_alignment())); + d_fft_code_A = std::vector(d_fft_size, lv_cmake(0.0F, 0.0F)); + d_fft_code_B = std::vector(d_fft_size, lv_cmake(0.0F, 0.0F)); + d_magnitude = std::vector(d_fft_size, 0.0F); // Direct FFT d_fft_if = std::make_shared(d_fft_size, true); @@ -99,7 +99,6 @@ galileo_pcps_8ms_acquisition_cc::galileo_pcps_8ms_acquisition_cc( d_doppler_resolution = 0; d_threshold = 0; d_doppler_step = 0; - d_grid_doppler_wipeoffs = nullptr; d_gnss_synchro = nullptr; d_code_phase = 0; d_doppler_freq = 0; @@ -110,19 +109,6 @@ galileo_pcps_8ms_acquisition_cc::galileo_pcps_8ms_acquisition_cc( galileo_pcps_8ms_acquisition_cc::~galileo_pcps_8ms_acquisition_cc() { - if (d_num_doppler_bins > 0) - { - for (uint32_t i = 0; i < d_num_doppler_bins; i++) - { - volk_gnsssdr_free(d_grid_doppler_wipeoffs[i]); - } - delete[] d_grid_doppler_wipeoffs; - } - - volk_gnsssdr_free(d_fft_code_A); - volk_gnsssdr_free(d_fft_code_B); - volk_gnsssdr_free(d_magnitude); - try { if (d_dump) @@ -148,8 +134,8 @@ void galileo_pcps_8ms_acquisition_cc::set_local_code(std::complex *code) d_fft_if->execute(); // We need the FFT of local code - //Conjugate the local code - volk_32fc_conjugate_32fc(d_fft_code_A, d_fft_if->get_outbuf(), d_fft_size); + // Conjugate the local code + volk_32fc_conjugate_32fc(d_fft_code_A.data(), d_fft_if->get_outbuf(), d_fft_size); // code B: two replicas of a primary code; the second replica is inverted. volk_32fc_s32fc_multiply_32fc(&(d_fft_if->get_inbuf())[d_samples_per_code], @@ -158,8 +144,8 @@ void galileo_pcps_8ms_acquisition_cc::set_local_code(std::complex *code) d_fft_if->execute(); // We need the FFT of local code - //Conjugate the local code - volk_32fc_conjugate_32fc(d_fft_code_B, d_fft_if->get_outbuf(), d_fft_size); + // Conjugate the local code + volk_32fc_conjugate_32fc(d_fft_code_B.data(), d_fft_if->get_outbuf(), d_fft_size); } @@ -184,16 +170,14 @@ void galileo_pcps_8ms_acquisition_cc::init() { d_num_doppler_bins++; } - // Create the carrier Doppler wipeoff signals - d_grid_doppler_wipeoffs = new gr_complex *[d_num_doppler_bins]; + d_grid_doppler_wipeoffs = std::vector>(d_num_doppler_bins, std::vector(d_fft_size)); for (uint32_t doppler_index = 0; doppler_index < d_num_doppler_bins; doppler_index++) { - d_grid_doppler_wipeoffs[doppler_index] = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); int32_t doppler = -static_cast(d_doppler_max) + d_doppler_step * doppler_index; float phase_step_rad = static_cast(GALILEO_TWO_PI) * doppler / static_cast(d_fs_in); std::array _phase{}; - volk_gnsssdr_s32f_sincos_32fc(d_grid_doppler_wipeoffs[doppler_index], -phase_step_rad, _phase.data(), d_fft_size); + volk_gnsssdr_s32f_sincos_32fc(d_grid_doppler_wipeoffs[doppler_index].data(), -phase_step_rad, _phase.data(), d_fft_size); } } @@ -226,7 +210,7 @@ int galileo_pcps_8ms_acquisition_cc::general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items __attribute__((unused))) { - int32_t acquisition_message = -1; //0=STOP_CHANNEL 1=ACQ_SUCCEES 2=ACQ_FAIL + int32_t acquisition_message = -1; // 0=STOP_CHANNEL 1=ACQ_SUCCEES 2=ACQ_FAIL switch (d_state) { @@ -234,7 +218,7 @@ int galileo_pcps_8ms_acquisition_cc::general_work(int noutput_items, { if (d_active) { - //restart acquisition variables + // restart acquisition variables d_gnss_synchro->Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0ULL; @@ -263,7 +247,7 @@ int galileo_pcps_8ms_acquisition_cc::general_work(int noutput_items, float magt = 0.0; float magt_A = 0.0; float magt_B = 0.0; - const auto *in = reinterpret_cast(input_items[0]); //Get the input samples pointer + const auto *in = reinterpret_cast(input_items[0]); // Get the input samples pointer float fft_normalization_factor = static_cast(d_fft_size) * static_cast(d_fft_size); d_input_power = 0.0; d_mag = 0.0; @@ -279,8 +263,8 @@ int galileo_pcps_8ms_acquisition_cc::general_work(int noutput_items, << ", doppler_step: " << d_doppler_step; // 1- Compute the input signal power estimation - volk_32fc_magnitude_squared_32f(d_magnitude, in, d_fft_size); - volk_32f_accumulator_s32f(&d_input_power, d_magnitude, d_fft_size); + volk_32fc_magnitude_squared_32f(d_magnitude.data(), in, d_fft_size); + volk_32f_accumulator_s32f(&d_input_power, d_magnitude.data(), d_fft_size); d_input_power /= static_cast(d_fft_size); // 2- Doppler frequency search loop @@ -290,7 +274,7 @@ int galileo_pcps_8ms_acquisition_cc::general_work(int noutput_items, doppler = -static_cast(d_doppler_max) + d_doppler_step * doppler_index; volk_32fc_x2_multiply_32fc(d_fft_if->get_inbuf(), in, - d_grid_doppler_wipeoffs[doppler_index], d_fft_size); + d_grid_doppler_wipeoffs[doppler_index].data(), d_fft_size); // 3- Perform the FFT-based convolution (parallel time search) // Compute the FFT of the carrier wiped--off incoming signal @@ -300,14 +284,14 @@ int galileo_pcps_8ms_acquisition_cc::general_work(int noutput_items, // with the local FFT'd code A reference using SIMD operations with // VOLK library volk_32fc_x2_multiply_32fc(d_ifft->get_inbuf(), - d_fft_if->get_outbuf(), d_fft_code_A, d_fft_size); + d_fft_if->get_outbuf(), d_fft_code_A.data(), d_fft_size); // compute the inverse FFT d_ifft->execute(); // Search maximum - volk_32fc_magnitude_squared_32f(d_magnitude, d_ifft->get_outbuf(), d_fft_size); - volk_gnsssdr_32f_index_max_32u(&indext_A, d_magnitude, d_fft_size); + volk_32fc_magnitude_squared_32f(d_magnitude.data(), d_ifft->get_outbuf(), d_fft_size); + volk_gnsssdr_32f_index_max_32u(&indext_A, d_magnitude.data(), d_fft_size); // Normalize the maximum value to correct the scale factor introduced by FFTW magt_A = d_magnitude[indext_A] / (fft_normalization_factor * fft_normalization_factor); @@ -316,14 +300,14 @@ int galileo_pcps_8ms_acquisition_cc::general_work(int noutput_items, // with the local FFT'd code B reference using SIMD operations with // VOLK library volk_32fc_x2_multiply_32fc(d_ifft->get_inbuf(), - d_fft_if->get_outbuf(), d_fft_code_B, d_fft_size); + d_fft_if->get_outbuf(), d_fft_code_B.data(), d_fft_size); // compute the inverse FFT d_ifft->execute(); // Search maximum - volk_32fc_magnitude_squared_32f(d_magnitude, d_ifft->get_outbuf(), d_fft_size); - volk_gnsssdr_32f_index_max_32u(&indext_B, d_magnitude, d_fft_size); + volk_32fc_magnitude_squared_32f(d_magnitude.data(), d_ifft->get_outbuf(), d_fft_size); + volk_gnsssdr_32f_index_max_32u(&indext_B, d_magnitude.data(), d_fft_size); // Normalize the maximum value to correct the scale factor introduced by FFTW magt_B = d_magnitude[indext_B] / (fft_normalization_factor * fft_normalization_factor); diff --git a/src/algorithms/acquisition/gnuradio_blocks/galileo_pcps_8ms_acquisition_cc.h b/src/algorithms/acquisition/gnuradio_blocks/galileo_pcps_8ms_acquisition_cc.h index 36dd9d7fe..6559f8819 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/galileo_pcps_8ms_acquisition_cc.h +++ b/src/algorithms/acquisition/gnuradio_blocks/galileo_pcps_8ms_acquisition_cc.h @@ -41,6 +41,7 @@ #include #include #include +#include class galileo_pcps_8ms_acquisition_cc; @@ -206,17 +207,17 @@ private: uint32_t d_well_count; uint32_t d_fft_size; uint64_t d_sample_counter; - gr_complex** d_grid_doppler_wipeoffs; + std::vector> d_grid_doppler_wipeoffs; uint32_t d_num_doppler_bins; - gr_complex* d_fft_code_A; - gr_complex* d_fft_code_B; + std::vector d_fft_code_A; + std::vector d_fft_code_B; std::shared_ptr d_fft_if; std::shared_ptr d_ifft; Gnss_Synchro* d_gnss_synchro; uint32_t d_code_phase; float d_doppler_freq; float d_mag; - float* d_magnitude; + std::vector d_magnitude; float d_input_power; float d_test_statistics; std::ofstream d_dump_file; @@ -228,4 +229,4 @@ private: std::string d_dump_filename; }; -#endif /* GNSS_SDR_PCPS_8MS_ACQUISITION_CC_H_*/ +#endif /* GNSS_SDR_PCPS_8MS_ACQUISITION_CC_H_ */ diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_assisted_acquisition_cc.cc b/src/algorithms/acquisition/gnuradio_blocks/pcps_assisted_acquisition_cc.cc index 2577fea7f..58ae3942f 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_assisted_acquisition_cc.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_assisted_acquisition_cc.cc @@ -43,6 +43,7 @@ #include #include + extern Concurrent_Map global_gps_acq_assist_map; @@ -79,8 +80,7 @@ pcps_assisted_acquisition_cc::pcps_assisted_acquisition_cc( d_input_power = 0.0; d_state = 0; d_disable_assist = false; - d_fft_codes = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); - d_carrier = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); + d_fft_codes.reserve(d_fft_size); // Direct FFT d_fft_if = std::make_shared(d_fft_size, true); @@ -115,8 +115,6 @@ void pcps_assisted_acquisition_cc::set_doppler_step(uint32_t doppler_step) pcps_assisted_acquisition_cc::~pcps_assisted_acquisition_cc() { - volk_gnsssdr_free(d_carrier); - volk_gnsssdr_free(d_fft_codes); try { if (d_dump) @@ -156,8 +154,8 @@ void pcps_assisted_acquisition_cc::init() d_fft_if->execute(); // We need the FFT of local code - //Conjugate the local code - volk_32fc_conjugate_32fc(d_fft_codes, d_fft_if->get_outbuf(), d_fft_size); + // Conjugate the local code + volk_32fc_conjugate_32fc(d_fft_codes.data(), d_fft_if->get_outbuf(), d_fft_size); } @@ -279,10 +277,10 @@ double pcps_assisted_acquisition_cc::search_maximum() std::streamsize n = 2 * sizeof(float) * (d_fft_size); // complex file write filename.str(""); filename << "../data/test_statistics_" << d_gnss_synchro->System - << "_" << d_gnss_synchro->Signal << "_sat_" + << "_" << d_gnss_synchro->Signal[0] << d_gnss_synchro->Signal[1] << "_sat_" << d_gnss_synchro->PRN << "_doppler_" << d_gnss_synchro->Acq_doppler_hz << ".dat"; d_dump_file.open(filename.str().c_str(), std::ios::out | std::ios::binary); - d_dump_file.write(reinterpret_cast(d_grid_data[index_doppler].data()), n); //write directly |abs(x)|^2 in this Doppler bin? + d_dump_file.write(reinterpret_cast(d_grid_data[index_doppler].data()), n); // write directly |abs(x)|^2 in this Doppler bin? d_dump_file.close(); } @@ -292,16 +290,14 @@ double pcps_assisted_acquisition_cc::search_maximum() float pcps_assisted_acquisition_cc::estimate_input_power(gr_vector_const_void_star &input_items) { - const auto *in = reinterpret_cast(input_items[0]); //Get the input samples pointer + const auto *in = reinterpret_cast(input_items[0]); // Get the input samples pointer // 1- Compute the input signal power estimation - auto *p_tmp_vector = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(float), volk_gnsssdr_get_alignment())); + std::vector p_tmp_vector(d_fft_size); - volk_32fc_magnitude_squared_32f(p_tmp_vector, in, d_fft_size); + volk_32fc_magnitude_squared_32f(p_tmp_vector.data(), in, d_fft_size); - const float *p_const_tmp_vector = p_tmp_vector; float power; - volk_32f_accumulator_s32f(&power, p_const_tmp_vector, d_fft_size); - volk_gnsssdr_free(p_tmp_vector); + volk_32f_accumulator_s32f(&power, p_tmp_vector.data(), d_fft_size); return (power / static_cast(d_fft_size)); } @@ -309,7 +305,7 @@ float pcps_assisted_acquisition_cc::estimate_input_power(gr_vector_const_void_st int32_t pcps_assisted_acquisition_cc::compute_and_accumulate_grid(gr_vector_const_void_star &input_items) { // initialize acquisition algorithm - const auto *in = reinterpret_cast(input_items[0]); //Get the input samples pointer + const auto *in = reinterpret_cast(input_items[0]); // Get the input samples pointer DLOG(INFO) << "Channel: " << d_channel << " , doing acquisition of satellite: " << d_gnss_synchro->System << " " @@ -319,7 +315,7 @@ int32_t pcps_assisted_acquisition_cc::compute_and_accumulate_grid(gr_vector_cons << ", doppler_step: " << d_doppler_step; // 2- Doppler frequency search loop - auto *p_tmp_vector = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(float), volk_gnsssdr_get_alignment())); + std::vector p_tmp_vector(d_fft_size); for (int32_t doppler_index = 0; doppler_index < d_num_doppler_points; doppler_index++) { @@ -332,17 +328,16 @@ int32_t pcps_assisted_acquisition_cc::compute_and_accumulate_grid(gr_vector_cons // Multiply carrier wiped--off, Fourier transformed incoming signal // with the local FFT'd code reference using SIMD operations with VOLK library - volk_32fc_x2_multiply_32fc(d_ifft->get_inbuf(), d_fft_if->get_outbuf(), d_fft_codes, d_fft_size); + volk_32fc_x2_multiply_32fc(d_ifft->get_inbuf(), d_fft_if->get_outbuf(), d_fft_codes.data(), d_fft_size); // compute the inverse FFT d_ifft->execute(); // save the grid matrix delay file - volk_32fc_magnitude_squared_32f(p_tmp_vector, d_ifft->get_outbuf(), d_fft_size); + volk_32fc_magnitude_squared_32f(p_tmp_vector.data(), d_ifft->get_outbuf(), d_fft_size); const float *old_vector = d_grid_data[doppler_index].data(); - volk_32f_x2_add_32f(d_grid_data[doppler_index].data(), old_vector, p_tmp_vector, d_fft_size); + volk_32f_x2_add_32f(d_grid_data[doppler_index].data(), old_vector, p_tmp_vector.data(), d_fft_size); } - volk_gnsssdr_free(p_tmp_vector); return d_fft_size; } diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_assisted_acquisition_cc.h b/src/algorithms/acquisition/gnuradio_blocks/pcps_assisted_acquisition_cc.h index 3c57dd80b..2ff5b668e 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_assisted_acquisition_cc.h +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_assisted_acquisition_cc.h @@ -215,8 +215,7 @@ private: uint32_t d_sampled_ms; uint32_t d_fft_size; uint64_t d_sample_counter; - gr_complex* d_carrier; - gr_complex* d_fft_codes; + std::vector d_fft_codes; std::vector> d_grid_data; std::vector>> d_grid_doppler_wipeoffs; @@ -239,4 +238,4 @@ private: std::string d_dump_filename; }; -#endif /* GNSS_SDR_PCPS_assisted_acquisition_cc_H_*/ +#endif /* GNSS_SDR_PCPS_ASSISTED_ACQUISITION_CC_H_ */ 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 40ae575aa..f7f032b2a 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_cccwsr_acquisition_cc.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_cccwsr_acquisition_cc.cc @@ -88,13 +88,13 @@ pcps_cccwsr_acquisition_cc::pcps_cccwsr_acquisition_cc( d_input_power = 0.0; d_num_doppler_bins = 0; - d_fft_code_data = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); - d_fft_code_pilot = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); - d_data_correlation = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); - d_pilot_correlation = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); - d_correlation_plus = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); - d_correlation_minus = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); - d_magnitude = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(float), volk_gnsssdr_get_alignment())); + d_fft_code_data.reserve(d_fft_size); + d_fft_code_pilot.reserve(d_fft_size); + d_data_correlation.reserve(d_fft_size); + d_pilot_correlation.reserve(d_fft_size); + d_correlation_plus.reserve(d_fft_size); + d_correlation_minus.reserve(d_fft_size); + d_magnitude.reserve(d_fft_size); // Direct FFT d_fft_if = std::make_shared(d_fft_size, true); @@ -109,7 +109,6 @@ pcps_cccwsr_acquisition_cc::pcps_cccwsr_acquisition_cc( d_doppler_resolution = 0; d_threshold = 0; d_doppler_step = 0; - d_grid_doppler_wipeoffs = nullptr; d_gnss_synchro = nullptr; d_code_phase = 0; d_doppler_freq = 0; @@ -120,23 +119,6 @@ pcps_cccwsr_acquisition_cc::pcps_cccwsr_acquisition_cc( pcps_cccwsr_acquisition_cc::~pcps_cccwsr_acquisition_cc() { - if (d_num_doppler_bins > 0) - { - for (uint32_t i = 0; i < d_num_doppler_bins; i++) - { - volk_gnsssdr_free(d_grid_doppler_wipeoffs[i]); - } - delete[] d_grid_doppler_wipeoffs; - } - - volk_gnsssdr_free(d_fft_code_data); - volk_gnsssdr_free(d_fft_code_pilot); - volk_gnsssdr_free(d_data_correlation); - volk_gnsssdr_free(d_pilot_correlation); - volk_gnsssdr_free(d_correlation_plus); - volk_gnsssdr_free(d_correlation_minus); - volk_gnsssdr_free(d_magnitude); - try { if (d_dump) @@ -163,16 +145,16 @@ void pcps_cccwsr_acquisition_cc::set_local_code(std::complex *code_data, d_fft_if->execute(); // We need the FFT of local code - //Conjugate the local code - volk_32fc_conjugate_32fc(d_fft_code_data, d_fft_if->get_outbuf(), d_fft_size); + // Conjugate the local code + volk_32fc_conjugate_32fc(d_fft_code_data.data(), d_fft_if->get_outbuf(), d_fft_size); // Pilot code (E1C) memcpy(d_fft_if->get_inbuf(), code_pilot, sizeof(gr_complex) * d_fft_size); d_fft_if->execute(); // We need the FFT of local code - //Conjugate the local code, - volk_32fc_conjugate_32fc(d_fft_code_pilot, d_fft_if->get_outbuf(), d_fft_size); + // Conjugate the local code, + volk_32fc_conjugate_32fc(d_fft_code_pilot.data(), d_fft_if->get_outbuf(), d_fft_size); } @@ -199,15 +181,13 @@ void pcps_cccwsr_acquisition_cc::init() } // Create the carrier Doppler wipeoff signals - d_grid_doppler_wipeoffs = new gr_complex *[d_num_doppler_bins]; + d_grid_doppler_wipeoffs = std::vector>(d_num_doppler_bins, std::vector(d_fft_size)); for (uint32_t doppler_index = 0; doppler_index < d_num_doppler_bins; doppler_index++) { - d_grid_doppler_wipeoffs[doppler_index] = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); - int32_t doppler = -static_cast(d_doppler_max) + d_doppler_step * doppler_index; float phase_step_rad = GPS_TWO_PI * doppler / static_cast(d_fs_in); std::array _phase{}; - volk_gnsssdr_s32f_sincos_32fc(d_grid_doppler_wipeoffs[doppler_index], -phase_step_rad, _phase.data(), d_fft_size); + volk_gnsssdr_s32f_sincos_32fc(d_grid_doppler_wipeoffs[doppler_index].data(), -phase_step_rad, _phase.data(), d_fft_size); } } @@ -240,7 +220,7 @@ int pcps_cccwsr_acquisition_cc::general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items __attribute__((unused))) { - int32_t acquisition_message = -1; //0=STOP_CHANNEL 1=ACQ_SUCCEES 2=ACQ_FAIL + int32_t acquisition_message = -1; // 0=STOP_CHANNEL 1=ACQ_SUCCEES 2=ACQ_FAIL switch (d_state) { @@ -248,7 +228,7 @@ int pcps_cccwsr_acquisition_cc::general_work(int noutput_items, { if (d_active) { - //restart acquisition variables + // restart acquisition variables d_gnss_synchro->Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0ULL; @@ -277,7 +257,7 @@ int pcps_cccwsr_acquisition_cc::general_work(int noutput_items, float magt = 0.0; float magt_plus = 0.0; float magt_minus = 0.0; - const auto *in = reinterpret_cast(input_items[0]); //Get the input samples pointer + const auto *in = reinterpret_cast(input_items[0]); // Get the input samples pointer float fft_normalization_factor = static_cast(d_fft_size) * static_cast(d_fft_size); d_sample_counter += static_cast(d_fft_size); // sample counter @@ -291,19 +271,18 @@ int pcps_cccwsr_acquisition_cc::general_work(int noutput_items, << ", doppler_step: " << d_doppler_step; // 1- Compute the input signal power estimation - volk_32fc_magnitude_squared_32f(d_magnitude, in, d_fft_size); - volk_32f_accumulator_s32f(&d_input_power, d_magnitude, d_fft_size); + volk_32fc_magnitude_squared_32f(d_magnitude.data(), in, d_fft_size); + volk_32f_accumulator_s32f(&d_input_power, d_magnitude.data(), d_fft_size); d_input_power /= static_cast(d_fft_size); // 2- Doppler frequency search loop for (uint32_t doppler_index = 0; doppler_index < d_num_doppler_bins; doppler_index++) { // doppler search steps - doppler = -static_cast(d_doppler_max) + d_doppler_step * doppler_index; volk_32fc_x2_multiply_32fc(d_fft_if->get_inbuf(), in, - d_grid_doppler_wipeoffs[doppler_index], d_fft_size); + d_grid_doppler_wipeoffs[doppler_index].data(), d_fft_size); // 3- Perform the FFT-based convolution (parallel time search) // Compute the FFT of the carrier wiped--off incoming signal @@ -313,27 +292,27 @@ int pcps_cccwsr_acquisition_cc::general_work(int noutput_items, // with the local FFT'd data code reference (E1B) using SIMD operations // with VOLK library volk_32fc_x2_multiply_32fc(d_ifft->get_inbuf(), - d_fft_if->get_outbuf(), d_fft_code_data, d_fft_size); + d_fft_if->get_outbuf(), d_fft_code_data.data(), d_fft_size); // compute the inverse FFT d_ifft->execute(); // Copy the result of the correlation between wiped--off signal and data code in // d_data_correlation. - memcpy(d_data_correlation, d_ifft->get_outbuf(), sizeof(gr_complex) * d_fft_size); + memcpy(d_data_correlation.data(), d_ifft->get_outbuf(), sizeof(gr_complex) * d_fft_size); // Multiply carrier wiped--off, Fourier transformed incoming signal // with the local FFT'd pilot code reference (E1C) using SIMD operations // with VOLK library volk_32fc_x2_multiply_32fc(d_ifft->get_inbuf(), - d_fft_if->get_outbuf(), d_fft_code_pilot, d_fft_size); + d_fft_if->get_outbuf(), d_fft_code_pilot.data(), d_fft_size); // Compute the inverse FFT d_ifft->execute(); // Copy the result of the correlation between wiped--off signal and pilot code in // d_data_correlation. - memcpy(d_pilot_correlation, d_ifft->get_outbuf(), sizeof(gr_complex) * d_fft_size); + memcpy(d_pilot_correlation.data(), d_ifft->get_outbuf(), sizeof(gr_complex) * d_fft_size); for (uint32_t i = 0; i < d_fft_size; i++) { @@ -346,12 +325,12 @@ int pcps_cccwsr_acquisition_cc::general_work(int noutput_items, d_data_correlation[i].imag() - d_pilot_correlation[i].real()); } - volk_32fc_magnitude_squared_32f(d_magnitude, d_correlation_plus, d_fft_size); - volk_gnsssdr_32f_index_max_32u(&indext_plus, d_magnitude, d_fft_size); + volk_32fc_magnitude_squared_32f(d_magnitude.data(), d_correlation_plus.data(), d_fft_size); + volk_gnsssdr_32f_index_max_32u(&indext_plus, d_magnitude.data(), d_fft_size); magt_plus = d_magnitude[indext_plus] / (fft_normalization_factor * fft_normalization_factor); - volk_32fc_magnitude_squared_32f(d_magnitude, d_correlation_minus, d_fft_size); - volk_gnsssdr_32f_index_max_32u(&indext_minus, d_magnitude, d_fft_size); + volk_32fc_magnitude_squared_32f(d_magnitude.data(), d_correlation_minus.data(), d_fft_size); + volk_gnsssdr_32f_index_max_32u(&indext_minus, d_magnitude.data(), d_fft_size); magt_minus = d_magnitude[indext_minus] / (fft_normalization_factor * fft_normalization_factor); if (magt_plus >= magt_minus) @@ -382,10 +361,10 @@ int pcps_cccwsr_acquisition_cc::general_work(int noutput_items, std::streamsize n = 2 * sizeof(float) * (d_fft_size); // complex file write filename.str(""); filename << "../data/test_statistics_" << d_gnss_synchro->System - << "_" << d_gnss_synchro->Signal << "_sat_" + << "_" << d_gnss_synchro->Signal[0] << d_gnss_synchro->Signal[1] << "_sat_" << d_gnss_synchro->PRN << "_doppler_" << doppler << ".dat"; d_dump_file.open(filename.str().c_str(), std::ios::out | std::ios::binary); - d_dump_file.write(reinterpret_cast(d_ifft->get_outbuf()), n); //write directly |abs(x)|^2 in this Doppler bin? + d_dump_file.write(reinterpret_cast(d_ifft->get_outbuf()), n); // write directly |abs(x)|^2 in this Doppler bin? d_dump_file.close(); } } diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_cccwsr_acquisition_cc.h b/src/algorithms/acquisition/gnuradio_blocks/pcps_cccwsr_acquisition_cc.h index 9fed31338..03f723c1d 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_cccwsr_acquisition_cc.h +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_cccwsr_acquisition_cc.h @@ -46,6 +46,7 @@ #include #include #include +#include class pcps_cccwsr_acquisition_cc; @@ -201,21 +202,21 @@ private: uint32_t d_well_count; uint32_t d_fft_size; uint64_t d_sample_counter; - gr_complex** d_grid_doppler_wipeoffs; + std::vector> d_grid_doppler_wipeoffs; uint32_t d_num_doppler_bins; - gr_complex* d_fft_code_data; - gr_complex* d_fft_code_pilot; + std::vector d_fft_code_data; + std::vector d_fft_code_pilot; std::shared_ptr d_fft_if; std::shared_ptr d_ifft; Gnss_Synchro* d_gnss_synchro; uint32_t d_code_phase; float d_doppler_freq; float d_mag; - float* d_magnitude; - gr_complex* d_data_correlation; - gr_complex* d_pilot_correlation; - gr_complex* d_correlation_plus; - gr_complex* d_correlation_minus; + std::vector d_magnitude; + std::vector d_data_correlation; + std::vector d_pilot_correlation; + std::vector d_correlation_plus; + std::vector d_correlation_minus; float d_input_power; float d_test_statistics; std::ofstream d_dump_file; @@ -227,4 +228,4 @@ private: std::string d_dump_filename; }; -#endif /* GNSS_SDR_PCPS_CCCWSR_ACQUISITION_CC_H_*/ +#endif /* GNSS_SDR_PCPS_CCCWSR_ACQUISITION_CC_H_ */ 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 d17e323f6..5d362352a 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_opencl_acquisition_cc.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_opencl_acquisition_cc.cc @@ -112,19 +112,10 @@ pcps_opencl_acquisition_cc::pcps_opencl_acquisition_cc( d_in_dwell_count = 0; d_cl_fft_batch_size = 1; - d_in_buffer = new gr_complex *[d_max_dwells]; - for (uint32_t i = 0; i < d_max_dwells; i++) - { - d_in_buffer[i] = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); - } - d_magnitude = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(float), volk_gnsssdr_get_alignment())); - d_fft_codes = static_cast(volk_gnsssdr_malloc(d_fft_size_pow2 * sizeof(gr_complex), volk_gnsssdr_get_alignment())); - d_zero_vector = static_cast(volk_gnsssdr_malloc((d_fft_size_pow2 - d_fft_size) * sizeof(gr_complex), volk_gnsssdr_get_alignment())); - - for (uint32_t i = 0; i < (d_fft_size_pow2 - d_fft_size); i++) - { - d_zero_vector[i] = gr_complex(0.0, 0.0); - } + d_in_buffer = std::vector>(d_max_dwells, std::vector(d_fft_size)); + d_magnitude.reserve(d_fft_size); + d_fft_codes.reserve(d_fft_size_pow2); + d_zero_vector = std::vector(d_fft_size_pow2 - d_fft_size, 0.0); d_opencl = init_opencl_environment("math_kernel.cl"); @@ -145,25 +136,6 @@ pcps_opencl_acquisition_cc::pcps_opencl_acquisition_cc( pcps_opencl_acquisition_cc::~pcps_opencl_acquisition_cc() { - if (d_num_doppler_bins > 0) - { - for (uint32_t i = 0; i < d_num_doppler_bins; i++) - { - volk_gnsssdr_free(d_grid_doppler_wipeoffs[i]); - } - delete[] d_grid_doppler_wipeoffs; - } - - for (uint32_t i = 0; i < d_max_dwells; i++) - { - volk_gnsssdr_free(d_in_buffer[i]); - } - delete[] d_in_buffer; - - volk_gnsssdr_free(d_fft_codes); - volk_gnsssdr_free(d_magnitude); - volk_gnsssdr_free(d_zero_vector); - if (d_opencl == 0) { delete d_cl_queue; @@ -200,7 +172,7 @@ pcps_opencl_acquisition_cc::~pcps_opencl_acquisition_cc() int pcps_opencl_acquisition_cc::init_opencl_environment(const std::string &kernel_filename) { - //get all platforms (drivers) + // get all platforms (drivers) std::vector all_platforms; cl::Platform::get(&all_platforms); @@ -210,11 +182,11 @@ int pcps_opencl_acquisition_cc::init_opencl_environment(const std::string &kerne return 1; } - d_cl_platform = all_platforms[0]; //get default platform + d_cl_platform = all_platforms[0]; // get default platform std::cout << "Using platform: " << d_cl_platform.getInfo() << std::endl; - //get default GPU device of the default platform + // get default GPU device of the default platform std::vector gpu_devices; d_cl_platform.getDevices(CL_DEVICE_TYPE_GPU, &gpu_devices); @@ -239,8 +211,6 @@ int pcps_opencl_acquisition_cc::init_opencl_environment(const std::string &kerne (std::istreambuf_iterator())); kernel_file.close(); - // std::cout << "Kernel code: \n" << kernel_code << std::endl; - cl::Program::Sources sources; sources.push_back({kernel_code.c_str(), kernel_code.length()}); @@ -262,10 +232,10 @@ int pcps_opencl_acquisition_cc::init_opencl_environment(const std::string &kerne d_cl_buffer_2 = new cl::Buffer(d_cl_context, CL_MEM_READ_WRITE, sizeof(gr_complex) * d_fft_size_pow2); d_cl_buffer_magnitude = new cl::Buffer(d_cl_context, CL_MEM_READ_WRITE, sizeof(float) * d_fft_size); - //create queue to which we will push commands for the device. + // create queue to which we will push commands for the device. d_cl_queue = new cl::CommandQueue(d_cl_context, d_cl_device); - //create FFT plan + // create FFT plan cl_int err; clFFT_Dim3 dim = {d_fft_size_pow2, 1, 1}; @@ -312,7 +282,7 @@ void pcps_opencl_acquisition_cc::init() } // Create the carrier Doppler wipeoff signals - d_grid_doppler_wipeoffs = new gr_complex *[d_num_doppler_bins]; + d_grid_doppler_wipeoffs = std::vector>(d_num_doppler_bins, std::vector(d_fft_size)); if (d_opencl == 0) { d_cl_buffer_grid_doppler_wipeoffs = new cl::Buffer *[d_num_doppler_bins]; @@ -320,12 +290,10 @@ void pcps_opencl_acquisition_cc::init() for (uint32_t doppler_index = 0; doppler_index < d_num_doppler_bins; doppler_index++) { - d_grid_doppler_wipeoffs[doppler_index] = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); - int doppler = -static_cast(d_doppler_max) + d_doppler_step * doppler_index; float phase_step_rad = static_cast(GPS_TWO_PI) * doppler / static_cast(d_fs_in); std::array _phase{}; - volk_gnsssdr_s32f_sincos_32fc(d_grid_doppler_wipeoffs[doppler_index], -phase_step_rad, _phase.data(), d_fft_size); + volk_gnsssdr_s32f_sincos_32fc(d_grid_doppler_wipeoffs[doppler_index].data(), -phase_step_rad, _phase.data(), d_fft_size); if (d_opencl == 0) { @@ -334,7 +302,7 @@ void pcps_opencl_acquisition_cc::init() d_cl_queue->enqueueWriteBuffer(*(d_cl_buffer_grid_doppler_wipeoffs[doppler_index]), CL_TRUE, 0, sizeof(gr_complex) * d_fft_size, - d_grid_doppler_wipeoffs[doppler_index]); + d_grid_doppler_wipeoffs[doppler_index].data()); } } @@ -342,7 +310,7 @@ void pcps_opencl_acquisition_cc::init() if (d_opencl == 0) { d_cl_queue->enqueueWriteBuffer(*d_cl_buffer_1, CL_TRUE, sizeof(gr_complex) * d_fft_size, - sizeof(gr_complex) * (d_fft_size_pow2 - d_fft_size), d_zero_vector); + sizeof(gr_complex) * (d_fft_size_pow2 - d_fft_size), d_zero_vector.data()); } } @@ -356,7 +324,7 @@ void pcps_opencl_acquisition_cc::set_local_code(std::complex *code) d_cl_queue->enqueueWriteBuffer(*d_cl_buffer_2, CL_TRUE, sizeof(gr_complex) * d_fft_size, sizeof(gr_complex) * (d_fft_size_pow2 - 2 * d_fft_size), - d_zero_vector); + d_zero_vector.data()); d_cl_queue->enqueueWriteBuffer(*d_cl_buffer_2, CL_TRUE, sizeof(gr_complex) * (d_fft_size_pow2 - d_fft_size), sizeof(gr_complex) * d_fft_size, code); @@ -365,10 +333,10 @@ void pcps_opencl_acquisition_cc::set_local_code(std::complex *code) clFFT_Forward, (*d_cl_buffer_2)(), (*d_cl_buffer_2)(), 0, nullptr, nullptr); - //Conjucate the local code + // Conjucate the local code cl::Kernel kernel = cl::Kernel(d_cl_program, "conj_vector"); - kernel.setArg(0, *d_cl_buffer_2); //input - kernel.setArg(1, *d_cl_buffer_fft_codes); //output + kernel.setArg(0, *d_cl_buffer_2); // input + kernel.setArg(1, *d_cl_buffer_fft_codes); // output d_cl_queue->enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(d_fft_size_pow2), cl::NullRange); } else @@ -377,8 +345,8 @@ void pcps_opencl_acquisition_cc::set_local_code(std::complex *code) d_fft_if->execute(); // We need the FFT of local code - //Conjugate the local code - volk_32fc_conjugate_32fc(d_fft_codes, d_fft_if->get_outbuf(), d_fft_size); + // Conjugate the local code + volk_32fc_conjugate_32fc(d_fft_codes.data(), d_fft_if->get_outbuf(), d_fft_size); } } @@ -390,7 +358,6 @@ void pcps_opencl_acquisition_cc::acquisition_core_volk() uint32_t indext = 0; float magt = 0.0; float fft_normalization_factor = static_cast(d_fft_size) * static_cast(d_fft_size); - gr_complex *in = d_in_buffer[d_well_count]; uint64_t samplestamp = d_sample_counter_buffer[d_well_count]; d_input_power = 0.0; @@ -405,8 +372,8 @@ void pcps_opencl_acquisition_cc::acquisition_core_volk() << ", doppler_step: " << d_doppler_step; // 1- Compute the input signal power estimation - volk_32fc_magnitude_squared_32f(d_magnitude, in, d_fft_size); - volk_32f_accumulator_s32f(&d_input_power, d_magnitude, d_fft_size); + volk_32fc_magnitude_squared_32f(d_magnitude.data(), d_in_buffer[d_well_count].data(), d_fft_size); + volk_32f_accumulator_s32f(&d_input_power, d_magnitude.data(), d_fft_size); d_input_power /= static_cast(d_fft_size); // 2- Doppler frequency search loop @@ -415,8 +382,8 @@ void pcps_opencl_acquisition_cc::acquisition_core_volk() // doppler search steps doppler = -static_cast(d_doppler_max) + d_doppler_step * doppler_index; - volk_32fc_x2_multiply_32fc(d_fft_if->get_inbuf(), in, - d_grid_doppler_wipeoffs[doppler_index], d_fft_size); + volk_32fc_x2_multiply_32fc(d_fft_if->get_inbuf(), d_in_buffer[d_well_count].data(), + d_grid_doppler_wipeoffs[doppler_index].data(), d_fft_size); // 3- Perform the FFT-based convolution (parallel time search) // Compute the FFT of the carrier wiped--off incoming signal @@ -425,14 +392,14 @@ void pcps_opencl_acquisition_cc::acquisition_core_volk() // Multiply carrier wiped--off, Fourier transformed incoming signal // with the local FFT'd code reference using SIMD operations with VOLK library volk_32fc_x2_multiply_32fc(d_ifft->get_inbuf(), - d_fft_if->get_outbuf(), d_fft_codes, d_fft_size); + d_fft_if->get_outbuf(), d_fft_codes.data(), d_fft_size); // compute the inverse FFT d_ifft->execute(); // Search maximum - volk_32fc_magnitude_squared_32f(d_magnitude, d_ifft->get_outbuf(), d_fft_size); - volk_gnsssdr_32f_index_max_32u(&indext, d_magnitude, d_fft_size); + volk_32fc_magnitude_squared_32f(d_magnitude.data(), d_ifft->get_outbuf(), d_fft_size); + volk_gnsssdr_32f_index_max_32u(&indext, d_magnitude.data(), d_fft_size); // Normalize the maximum value to correct the scale factor introduced by FFTW magt = d_magnitude[indext] / (fft_normalization_factor * fft_normalization_factor); @@ -469,7 +436,7 @@ void pcps_opencl_acquisition_cc::acquisition_core_volk() std::streamsize n = 2 * sizeof(float) * (d_fft_size); // complex file write filename.str(""); filename << "../data/test_statistics_" << d_gnss_synchro->System - << "_" << d_gnss_synchro->Signal << "_sat_" + << "_" << d_gnss_synchro->Signal[0] << d_gnss_synchro->Signal[1] << "_sat_" << d_gnss_synchro->PRN << "_doppler_" << doppler << ".dat"; d_dump_file.open(filename.str().c_str(), std::ios::out | std::ios::binary); d_dump_file.write(reinterpret_cast(d_ifft->get_outbuf()), n); //write directly |abs(x)|^2 in this Doppler bin? @@ -514,14 +481,13 @@ void pcps_opencl_acquisition_cc::acquisition_core_opencl() uint32_t indext = 0; float magt = 0.0; float fft_normalization_factor = (static_cast(d_fft_size_pow2) * static_cast(d_fft_size)); //This works, but I am not sure why. - gr_complex *in = d_in_buffer[d_well_count]; uint64_t samplestamp = d_sample_counter_buffer[d_well_count]; d_input_power = 0.0; d_mag = 0.0; // write input vector in buffer of OpenCL device - d_cl_queue->enqueueWriteBuffer(*d_cl_buffer_in, CL_TRUE, 0, sizeof(gr_complex) * d_fft_size, in); + d_cl_queue->enqueueWriteBuffer(*d_cl_buffer_in, CL_TRUE, 0, sizeof(gr_complex) * d_fft_size, d_in_buffer[d_well_count].data()); d_well_count++; @@ -539,8 +505,8 @@ void pcps_opencl_acquisition_cc::acquisition_core_opencl() << ", doppler_step: " << d_doppler_step; // 1- Compute the input signal power estimation - volk_32fc_magnitude_squared_32f(d_magnitude, in, d_fft_size); - volk_32f_accumulator_s32f(&d_input_power, d_magnitude, d_fft_size); + volk_32fc_magnitude_squared_32f(d_magnitude.data(), d_in_buffer[d_well_count].data(), d_fft_size); + volk_32f_accumulator_s32f(&d_input_power, d_magnitude.data(), d_fft_size); d_input_power /= static_cast(d_fft_size); cl::Kernel kernel; @@ -549,10 +515,9 @@ void pcps_opencl_acquisition_cc::acquisition_core_opencl() for (uint32_t doppler_index = 0; doppler_index < d_num_doppler_bins; doppler_index++) { // doppler search steps - doppler = -static_cast(d_doppler_max) + d_doppler_step * doppler_index; - //Multiply input signal with doppler wipe-off + // Multiply input signal with doppler wipe-off kernel = cl::Kernel(d_cl_program, "mult_vectors"); kernel.setArg(0, *d_cl_buffer_in); //input 1 kernel.setArg(1, *d_cl_buffer_grid_doppler_wipeoffs[doppler_index]); //input 2 @@ -563,7 +528,6 @@ void pcps_opencl_acquisition_cc::acquisition_core_opencl() // In the previous operation, we store the result in the first d_fft_size positions // of d_cl_buffer_1. The rest d_fft_size_pow2-d_fft_size already have zeros // (zero-padding is made in init() for optimization purposes). - clFFT_ExecuteInterleaved((*d_cl_queue)(), d_cl_fft_plan, d_cl_fft_batch_size, clFFT_Forward, (*d_cl_buffer_1)(), (*d_cl_buffer_2)(), 0, nullptr, nullptr); @@ -592,11 +556,11 @@ void pcps_opencl_acquisition_cc::acquisition_core_opencl() // This is the only function that blocks this thread until all previously enqueued // OpenCL commands are completed. d_cl_queue->enqueueReadBuffer(*d_cl_buffer_magnitude, CL_TRUE, 0, - sizeof(float) * d_fft_size, d_magnitude); + sizeof(float) * d_fft_size, d_magnitude.data()); // Search maximum // @TODO: find an efficient way to search the maximum with OpenCL in the GPU. - volk_gnsssdr_32f_index_max_32u(&indext, d_magnitude, d_fft_size); + volk_gnsssdr_32f_index_max_32u(&indext, d_magnitude.data(), d_fft_size); // Normalize the maximum value to correct the scale factor introduced by FFTW magt = d_magnitude[indext] / (fft_normalization_factor * fft_normalization_factor); @@ -633,7 +597,7 @@ void pcps_opencl_acquisition_cc::acquisition_core_opencl() std::streamsize n = 2 * sizeof(float) * (d_fft_size); // complex file write filename.str(""); filename << "../data/test_statistics_" << d_gnss_synchro->System - << "_" << d_gnss_synchro->Signal << "_sat_" + << "_" << d_gnss_synchro->Signal[0] << d_gnss_synchro->Signal[1] << "_sat_" << d_gnss_synchro->PRN << "_doppler_" << doppler << ".dat"; d_dump_file.open(filename.str().c_str(), std::ios::out | std::ios::binary); d_dump_file.write(reinterpret_cast(d_ifft->get_outbuf()), n); //write directly |abs(x)|^2 in this Doppler bin? @@ -705,14 +669,14 @@ int pcps_opencl_acquisition_cc::general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items __attribute__((unused))) { - int acquisition_message = -1; //0=STOP_CHANNEL 1=ACQ_SUCCEES 2=ACQ_FAIL + int acquisition_message = -1; // 0=STOP_CHANNEL 1=ACQ_SUCCEES 2=ACQ_FAIL switch (d_state) { case 0: { if (d_active) { - //restart acquisition variables + // restart acquisition variables d_gnss_synchro->Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0ULL; @@ -742,7 +706,7 @@ int pcps_opencl_acquisition_cc::general_work(int noutput_items, uint32_t num_dwells = std::min(static_cast(d_max_dwells - d_in_dwell_count), ninput_items[0]); for (uint32_t i = 0; i < num_dwells; i++) { - memcpy(d_in_buffer[d_in_dwell_count++], static_cast(input_items[i]), + memcpy(d_in_buffer[d_in_dwell_count++].data(), static_cast(input_items[i]), sizeof(gr_complex) * d_fft_size); d_sample_counter += static_cast(d_fft_size); d_sample_counter_buffer.push_back(d_sample_counter); diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_opencl_acquisition_cc.h b/src/algorithms/acquisition/gnuradio_blocks/pcps_opencl_acquisition_cc.h index 5eec41228..93b3701dc 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_opencl_acquisition_cc.h +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_opencl_acquisition_cc.h @@ -241,16 +241,16 @@ private: uint32_t d_fft_size_pow2; int* d_max_doppler_indexs; uint64_t d_sample_counter; - gr_complex** d_grid_doppler_wipeoffs; + std::vector> d_grid_doppler_wipeoffs; uint32_t d_num_doppler_bins; - gr_complex* d_fft_codes; + std::vector d_fft_codes; std::shared_ptr d_fft_if; std::shared_ptr d_ifft; Gnss_Synchro* d_gnss_synchro; uint32_t d_code_phase; float d_doppler_freq; float d_mag; - float* d_magnitude; + std::vector d_magnitude; float d_input_power; float d_test_statistics; bool d_bit_transition_flag; @@ -261,8 +261,8 @@ private: bool d_dump; uint32_t d_channel; std::string d_dump_filename; - gr_complex* d_zero_vector; - gr_complex** d_in_buffer; + std::vector d_zero_vector; + std::vector> d_in_buffer; std::vector d_sample_counter_buffer; uint32_t d_in_dwell_count; std::weak_ptr d_channel_fsm; 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 8d0c7e97f..be42c9763 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_quicksync_acquisition_cc.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_quicksync_acquisition_cc.cc @@ -91,19 +91,19 @@ pcps_quicksync_acquisition_cc::pcps_quicksync_acquisition_cc( d_bit_transition_flag = bit_transition_flag; d_folding_factor = folding_factor; - //fft size is reduced. + // fft size is reduced. d_fft_size = (d_samples_per_code) / d_folding_factor; - d_fft_codes = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); - d_magnitude = static_cast(volk_gnsssdr_malloc(d_samples_per_code * d_folding_factor * sizeof(float), volk_gnsssdr_get_alignment())); - d_magnitude_folded = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(float), volk_gnsssdr_get_alignment())); + d_fft_codes.reserve(d_fft_size); + d_magnitude.reserve(d_samples_per_code * d_folding_factor); + d_magnitude_folded.reserve(d_fft_size); - d_possible_delay = new uint32_t[d_folding_factor]; - d_corr_output_f = new float[d_folding_factor]; + d_possible_delay.reserve(d_folding_factor); + d_corr_output_f.reserve(d_folding_factor); /*Create the d_code signal , which would store the values of the code in its original form to perform later correlation in time domain*/ - d_code = new gr_complex[d_samples_per_code](); + d_code = std::vector(d_samples_per_code, lv_cmake(0.0F, 0.0F)); // Direct FFT d_fft_if = std::make_shared(d_fft_size, true); @@ -114,46 +114,22 @@ pcps_quicksync_acquisition_cc::pcps_quicksync_acquisition_cc( d_dump = dump; d_dump_filename = std::move(dump_filename); - d_corr_acumulator = nullptr; - d_signal_folded = nullptr; - d_code_folded = new gr_complex[d_fft_size](); + d_code_folded = std::vector(d_fft_size, lv_cmake(0.0F, 0.0F)); + d_signal_folded.reserve(d_fft_size); d_noise_floor_power = 0; d_doppler_resolution = 0; d_threshold = 0; d_doppler_step = 0; - d_grid_doppler_wipeoffs = nullptr; d_gnss_synchro = nullptr; d_code_phase = 0; d_doppler_freq = 0; d_test_statistics = 0; d_channel = 0; - //d_code_folded = 0; - - // DLOG(INFO) << "END CONSTRUCTOR"; } pcps_quicksync_acquisition_cc::~pcps_quicksync_acquisition_cc() { - //DLOG(INFO) << "START DESTROYER"; - if (d_num_doppler_bins > 0) - { - for (uint32_t i = 0; i < d_num_doppler_bins; i++) - { - volk_gnsssdr_free(d_grid_doppler_wipeoffs[i]); - } - delete[] d_grid_doppler_wipeoffs; - } - - volk_gnsssdr_free(d_fft_codes); - volk_gnsssdr_free(d_magnitude); - volk_gnsssdr_free(d_magnitude_folded); - - delete d_code; - delete d_possible_delay; - delete d_corr_output_f; - delete[] d_code_folded; - try { if (d_dump) @@ -174,16 +150,15 @@ pcps_quicksync_acquisition_cc::~pcps_quicksync_acquisition_cc() void pcps_quicksync_acquisition_cc::set_local_code(std::complex* code) { - /*save a local copy of the code without the folding process to perform corre- - lation in time in the final steps of the acquisition stage*/ - memcpy(d_code, code, sizeof(gr_complex) * d_samples_per_code); + /* save a local copy of the code without the folding process to perform corre- + lation in time in the final steps of the acquisition stage */ + memcpy(d_code.data(), code, sizeof(gr_complex) * d_samples_per_code); - //d_code_folded = new gr_complex[d_fft_size](); - memcpy(d_fft_if->get_inbuf(), d_code_folded, sizeof(gr_complex) * (d_fft_size)); + memcpy(d_fft_if->get_inbuf(), d_code_folded.data(), sizeof(gr_complex) * (d_fft_size)); - /*perform folding of the code by the factorial factor parameter. Notice that + /* perform folding of the code by the factorial factor parameter. Notice that folding of the code in the time stage would result in a downsampled spectrum - in the frequency domain after applying the fftw operation*/ + in the frequency domain after applying the fftw operation */ for (uint32_t i = 0; i < d_folding_factor; i++) { std::transform((code + i * d_fft_size), (code + ((i + 1) * d_fft_size)), @@ -193,8 +168,8 @@ void pcps_quicksync_acquisition_cc::set_local_code(std::complex* code) d_fft_if->execute(); // We need the FFT of local code - //Conjugate the local code - volk_32fc_conjugate_32fc(d_fft_codes, d_fft_if->get_outbuf(), d_fft_size); + // Conjugate the local code + volk_32fc_conjugate_32fc(d_fft_codes.data(), d_fft_if->get_outbuf(), d_fft_size); } @@ -204,8 +179,6 @@ void pcps_quicksync_acquisition_cc::init() d_gnss_synchro->Flag_valid_symbol_output = false; d_gnss_synchro->Flag_valid_pseudorange = false; d_gnss_synchro->Flag_valid_word = false; - - //DLOG(INFO) << "START init"; d_gnss_synchro->Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0ULL; @@ -228,16 +201,14 @@ void pcps_quicksync_acquisition_cc::init() } // Create the carrier Doppler wipeoff signals - d_grid_doppler_wipeoffs = new gr_complex*[d_num_doppler_bins]; + d_grid_doppler_wipeoffs = std::vector>(d_num_doppler_bins, std::vector(d_samples_per_code * d_folding_factor)); for (uint32_t doppler_index = 0; doppler_index < d_num_doppler_bins; doppler_index++) { - d_grid_doppler_wipeoffs[doppler_index] = static_cast(volk_gnsssdr_malloc(d_samples_per_code * d_folding_factor * sizeof(gr_complex), volk_gnsssdr_get_alignment())); int32_t doppler = -static_cast(d_doppler_max) + d_doppler_step * doppler_index; float phase_step_rad = GPS_TWO_PI * doppler / static_cast(d_fs_in); std::array _phase{}; - volk_gnsssdr_s32f_sincos_32fc(d_grid_doppler_wipeoffs[doppler_index], -phase_step_rad, _phase.data(), d_samples_per_code * d_folding_factor); + volk_gnsssdr_s32f_sincos_32fc(d_grid_doppler_wipeoffs[doppler_index].data(), -phase_step_rad, _phase.data(), d_samples_per_code * d_folding_factor); } - // DLOG(INFO) << "end init"; } @@ -279,17 +250,16 @@ int pcps_quicksync_acquisition_cc::general_work(int noutput_items, * 5. Compute the test statistics and compare to the threshold * 6. Declare positive or negative acquisition using a message queue */ - //DLOG(INFO) << "START GENERAL WORK"; - int32_t acquisition_message = -1; //0=STOP_CHANNEL 1=ACQ_SUCCEES 2=ACQ_FAIL - //std::cout<<"general_work in quicksync gnuradio block"<Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0ULL; @@ -304,29 +274,27 @@ int pcps_quicksync_acquisition_cc::general_work(int noutput_items, 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"; + // DLOG(INFO) << "END CASE 0"; break; } case 1: { // initialize acquisition implementing the QuickSync algorithm - //DLOG(INFO) << "START CASE 1"; + // DLOG(INFO) << "START CASE 1"; int32_t doppler; uint32_t indext = 0; float magt = 0.0; const auto* in = reinterpret_cast(input_items[0]); // Get the input samples pointer - auto* in_temp = static_cast(volk_gnsssdr_malloc(d_samples_per_code * d_folding_factor * sizeof(gr_complex), volk_gnsssdr_get_alignment())); - auto* in_temp_folded = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); - + std::vector in_temp(d_samples_per_code * d_folding_factor); // Create a signal to store a signal of size 1ms, to perform correlation // in time. No folding on this data is required - auto* in_1code = static_cast(volk_gnsssdr_malloc(d_samples_per_code * sizeof(gr_complex), volk_gnsssdr_get_alignment())); + std::vector in_1code(d_samples_per_code); // Stores the values of the correlation output between the local code // and the signal with doppler shift corrected - auto* corr_output = static_cast(volk_gnsssdr_malloc(d_samples_per_code * sizeof(gr_complex), volk_gnsssdr_get_alignment())); + std::vector corr_output(d_samples_per_code); // Stores a copy of the folded version of the signal.This is used for // the FFT operations in future steps of execution*/ @@ -355,8 +323,8 @@ int pcps_quicksync_acquisition_cc::general_work(int noutput_items, // 1- Compute the input signal power estimation. This operation is // being performed in a signal of size nxp - volk_32fc_magnitude_squared_32f(d_magnitude, in, d_samples_per_code * d_folding_factor); - volk_32f_accumulator_s32f(&d_input_power, d_magnitude, d_samples_per_code * d_folding_factor); + volk_32fc_magnitude_squared_32f(d_magnitude.data(), in, d_samples_per_code * d_folding_factor); + volk_32f_accumulator_s32f(&d_input_power, d_magnitude.data(), d_samples_per_code * d_folding_factor); d_input_power /= static_cast(d_samples_per_code * d_folding_factor); for (uint32_t doppler_index = 0; doppler_index < d_num_doppler_bins; doppler_index++) @@ -364,8 +332,8 @@ int pcps_quicksync_acquisition_cc::general_work(int noutput_items, // Ensure that the signal is going to start with all samples // at zero. This is done to avoid over acumulation when performing // the folding process to be stored in d_fft_if->get_inbuf() - d_signal_folded = new gr_complex[d_fft_size](); - memcpy(d_fft_if->get_inbuf(), d_signal_folded, sizeof(gr_complex) * (d_fft_size)); + d_signal_folded = std::vector(d_fft_size, lv_cmake(0.0F, 0.0F)); + memcpy(d_fft_if->get_inbuf(), d_signal_folded.data(), sizeof(gr_complex) * (d_fft_size)); // Doppler search steps and then multiplication of the incoming // signal with the doppler wipeoffs to eliminate frequency offset @@ -374,8 +342,8 @@ int pcps_quicksync_acquisition_cc::general_work(int noutput_items, // Perform multiplication of the incoming signal with the // complex exponential vector. This removes the frequency doppler // shift offset - volk_32fc_x2_multiply_32fc(in_temp, in, - d_grid_doppler_wipeoffs[doppler_index], + volk_32fc_x2_multiply_32fc(in_temp.data(), in, + d_grid_doppler_wipeoffs[doppler_index].data(), d_samples_per_code * d_folding_factor); // Perform folding of the carrier wiped-off incoming signal. Since @@ -383,8 +351,8 @@ int pcps_quicksync_acquisition_cc::general_work(int noutput_items, // incoming raw data signal is of d_folding_factor^2 for (int32_t i = 0; i < static_cast(d_folding_factor * d_folding_factor); i++) { - std::transform((in_temp + i * d_fft_size), - (in_temp + ((i + 1) * d_fft_size)), + std::transform((in_temp.data() + i * d_fft_size), + (in_temp.data() + ((i + 1) * d_fft_size)), d_fft_if->get_inbuf(), d_fft_if->get_inbuf(), std::plus()); @@ -398,24 +366,22 @@ int pcps_quicksync_acquisition_cc::general_work(int noutput_items, // signal with the local FFT'd code reference using SIMD // operations with VOLK library volk_32fc_x2_multiply_32fc(d_ifft->get_inbuf(), - d_fft_if->get_outbuf(), d_fft_codes, d_fft_size); + d_fft_if->get_outbuf(), d_fft_codes.data(), d_fft_size); // compute the inverse FFT of the aliased signal d_ifft->execute(); // Compute the magnitude and get the maximum value with its // index position - volk_32fc_magnitude_squared_32f(d_magnitude_folded, + volk_32fc_magnitude_squared_32f(d_magnitude_folded.data(), d_ifft->get_outbuf(), d_fft_size); // Normalize the maximum value to correct the scale factor // introduced by FFTW - volk_gnsssdr_32f_index_max_32u(&indext, d_magnitude_folded, d_fft_size); + volk_gnsssdr_32f_index_max_32u(&indext, d_magnitude_folded.data(), d_fft_size); magt = d_magnitude_folded[indext] / (fft_normalization_factor * fft_normalization_factor); - delete[] d_signal_folded; - // 4- record the maximum peak and the associated synchronization parameters if (d_mag < magt) { @@ -443,7 +409,7 @@ int pcps_quicksync_acquisition_cc::general_work(int noutput_items, { // Copy a signal of 1 code length into suggested buffer. // The copied signal must have doppler effect corrected*/ - memcpy(in_1code, &in_temp[d_possible_delay[i]], + memcpy(in_1code.data(), &in_temp[d_possible_delay[i]], sizeof(gr_complex) * (d_samples_per_code)); // Perform multiplication of the unmodified local @@ -451,7 +417,7 @@ int pcps_quicksync_acquisition_cc::general_work(int noutput_items, // effect corrected and accumulates its value. This // is indeed correlation in time for an specific value // of a shift - volk_32fc_x2_multiply_32fc(corr_output, in_1code, d_code, d_samples_per_code); + volk_32fc_x2_multiply_32fc(corr_output.data(), in_1code.data(), d_code.data(), d_samples_per_code); for (int32_t j = 0; j < d_samples_per_code; j++) { @@ -459,8 +425,8 @@ int pcps_quicksync_acquisition_cc::general_work(int noutput_items, } } // Obtain maximum value of correlation given the possible delay selected - volk_32fc_magnitude_squared_32f(d_corr_output_f, complex_acumulator.data(), d_folding_factor); - volk_gnsssdr_32f_index_max_32u(&indext, d_corr_output_f, d_folding_factor); + volk_32fc_magnitude_squared_32f(d_corr_output_f.data(), complex_acumulator.data(), d_folding_factor); + volk_gnsssdr_32f_index_max_32u(&indext, d_corr_output_f.data(), d_folding_factor); // Now save the real code phase in the gnss_syncro block for use in other stages d_gnss_synchro->Acq_delay_samples = static_cast(d_possible_delay[indext]); @@ -483,10 +449,10 @@ int pcps_quicksync_acquisition_cc::general_work(int noutput_items, std::streamsize n = sizeof(float) * (d_fft_size); // complex file write filename.str(""); filename << "../data/test_statistics_" << d_gnss_synchro->System - << "_" << d_gnss_synchro->Signal << "_sat_" + << "_" << d_gnss_synchro->Signal[0] << d_gnss_synchro->Signal[1] << "_sat_" << d_gnss_synchro->PRN << "_doppler_" << doppler << ".dat"; d_dump_file.open(filename.str().c_str(), std::ios::out | std::ios::binary); - d_dump_file.write(reinterpret_cast(d_magnitude_folded), n); // write directly |abs(x)|^2 in this Doppler bin? + d_dump_file.write(reinterpret_cast(d_magnitude_folded.data()), n); // write directly |abs(x)|^2 in this Doppler bin? d_dump_file.close(); } } @@ -517,10 +483,6 @@ int pcps_quicksync_acquisition_cc::general_work(int noutput_items, } } - volk_gnsssdr_free(in_temp); - volk_gnsssdr_free(in_temp_folded); - volk_gnsssdr_free(in_1code); - volk_gnsssdr_free(corr_output); consume_each(1); break; @@ -528,7 +490,7 @@ int pcps_quicksync_acquisition_cc::general_work(int noutput_items, case 2: { - //DLOG(INFO) << "START CASE 2"; + // DLOG(INFO) << "START CASE 2"; // 6.1- Declare positive acquisition using a message port DLOG(INFO) << "positive acquisition"; DLOG(INFO) << "satellite " << d_gnss_synchro->System << " " << d_gnss_synchro->PRN; @@ -554,13 +516,13 @@ int pcps_quicksync_acquisition_cc::general_work(int noutput_items, acquisition_message = 1; this->message_port_pub(pmt::mp("events"), pmt::from_long(acquisition_message)); - //DLOG(INFO) << "END CASE 2"; + // DLOG(INFO) << "END CASE 2"; break; } case 3: { - //DLOG(INFO) << "START CASE 3"; + // DLOG(INFO) << "START CASE 3"; // 6.2- Declare negative acquisition using a message port DLOG(INFO) << "negative acquisition"; DLOG(INFO) << "satellite " << d_gnss_synchro->System << " " << d_gnss_synchro->PRN; @@ -586,7 +548,7 @@ int pcps_quicksync_acquisition_cc::general_work(int noutput_items, acquisition_message = 2; this->message_port_pub(pmt::mp("events"), pmt::from_long(acquisition_message)); - //DLOG(INFO) << "END CASE 3"; + // DLOG(INFO) << "END CASE 3"; break; } } diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_quicksync_acquisition_cc.h b/src/algorithms/acquisition/gnuradio_blocks/pcps_quicksync_acquisition_cc.h index 2f0bdda3a..51af616c9 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_quicksync_acquisition_cc.h +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_quicksync_acquisition_cc.h @@ -62,6 +62,7 @@ #include #include #include +#include class pcps_quicksync_acquisition_cc; @@ -213,14 +214,13 @@ private: void calculate_magnitudes(gr_complex* fft_begin, int32_t doppler_shift, int32_t doppler_offset); - gr_complex* d_code; + std::vector d_code; uint32_t d_folding_factor; // also referred in the paper as 'p' - float* d_corr_acumulator; - uint32_t* d_possible_delay; - float* d_corr_output_f; - float* d_magnitude_folded; - gr_complex* d_signal_folded; - gr_complex* d_code_folded; + std::vector d_possible_delay; + std::vector d_corr_output_f; + std::vector d_magnitude_folded; + std::vector d_signal_folded; + std::vector d_code_folded; float d_noise_floor_power; int64_t d_fs_in; int32_t d_samples_per_ms; @@ -235,16 +235,16 @@ private: uint32_t d_well_count; uint32_t d_fft_size; uint64_t d_sample_counter; - gr_complex** d_grid_doppler_wipeoffs; + std::vector> d_grid_doppler_wipeoffs; uint32_t d_num_doppler_bins; - gr_complex* d_fft_codes; + std::vector d_fft_codes; std::shared_ptr d_fft_if; std::shared_ptr d_ifft; Gnss_Synchro* d_gnss_synchro; uint32_t d_code_phase; float d_doppler_freq; float d_mag; - float* d_magnitude; + std::vector d_magnitude; float d_input_power; float d_test_statistics; bool d_bit_transition_flag; 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 ca592a8e2..c673352a0 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_tong_acquisition_cc.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_tong_acquisition_cc.cc @@ -109,8 +109,8 @@ pcps_tong_acquisition_cc::pcps_tong_acquisition_cc( d_input_power = 0.0; d_num_doppler_bins = 0; - d_fft_codes = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); - d_magnitude = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(float), volk_gnsssdr_get_alignment())); + d_fft_codes.reserve(d_fft_size); + d_magnitude.reserve(d_fft_size); // Direct FFT d_fft_if = std::make_shared(d_fft_size, true); @@ -125,8 +125,6 @@ pcps_tong_acquisition_cc::pcps_tong_acquisition_cc( d_doppler_resolution = 0; d_threshold = 0; d_doppler_step = 0; - d_grid_data = nullptr; - d_grid_doppler_wipeoffs = nullptr; d_gnss_synchro = nullptr; d_code_phase = 0; d_doppler_freq = 0; @@ -137,20 +135,6 @@ pcps_tong_acquisition_cc::pcps_tong_acquisition_cc( pcps_tong_acquisition_cc::~pcps_tong_acquisition_cc() { - if (d_num_doppler_bins > 0) - { - for (uint32_t i = 0; i < d_num_doppler_bins; i++) - { - volk_gnsssdr_free(d_grid_doppler_wipeoffs[i]); - volk_gnsssdr_free(d_grid_data[i]); - } - delete[] d_grid_doppler_wipeoffs; - delete[] d_grid_data; - } - - volk_gnsssdr_free(d_fft_codes); - volk_gnsssdr_free(d_magnitude); - try { if (d_dump) @@ -175,8 +159,8 @@ void pcps_tong_acquisition_cc::set_local_code(std::complex *code) d_fft_if->execute(); // We need the FFT of local code - //Conjugate the local code - volk_32fc_conjugate_32fc(d_fft_codes, d_fft_if->get_outbuf(), d_fft_size); + // Conjugate the local code + volk_32fc_conjugate_32fc(d_fft_codes.data(), d_fft_if->get_outbuf(), d_fft_size); } @@ -203,23 +187,14 @@ void pcps_tong_acquisition_cc::init() } // Create the carrier Doppler wipeoff signals and allocate data grid. - d_grid_doppler_wipeoffs = new gr_complex *[d_num_doppler_bins]; - d_grid_data = new float *[d_num_doppler_bins]; + d_grid_doppler_wipeoffs = std::vector>(d_num_doppler_bins, std::vector(d_fft_size)); + d_grid_data = std::vector>(d_num_doppler_bins, std::vector(d_fft_size, 0.0)); for (uint32_t doppler_index = 0; doppler_index < d_num_doppler_bins; doppler_index++) { - d_grid_doppler_wipeoffs[doppler_index] = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(gr_complex), volk_gnsssdr_get_alignment())); - int32_t doppler = -static_cast(d_doppler_max) + d_doppler_step * doppler_index; float phase_step_rad = GPS_TWO_PI * doppler / static_cast(d_fs_in); std::array _phase{}; - volk_gnsssdr_s32f_sincos_32fc(d_grid_doppler_wipeoffs[doppler_index], -phase_step_rad, _phase.data(), d_fft_size); - - d_grid_data[doppler_index] = static_cast(volk_gnsssdr_malloc(d_fft_size * sizeof(float), volk_gnsssdr_get_alignment())); - - for (uint32_t i = 0; i < d_fft_size; i++) - { - d_grid_data[doppler_index][i] = 0; - } + volk_gnsssdr_s32f_sincos_32fc(d_grid_doppler_wipeoffs[doppler_index].data(), -phase_step_rad, _phase.data(), d_fft_size); } } @@ -243,7 +218,7 @@ void pcps_tong_acquisition_cc::set_state(int32_t state) { for (uint32_t i = 0; i < d_fft_size; i++) { - d_grid_data[doppler_index][i] = 0; + d_grid_data[doppler_index][i] = 0.0; } } } @@ -261,7 +236,7 @@ int pcps_tong_acquisition_cc::general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items __attribute__((unused))) { - int32_t acquisition_message = -1; //0=STOP_CHANNEL 1=ACQ_SUCCEES 2=ACQ_FAIL + int32_t acquisition_message = -1; // 0=STOP_CHANNEL 1=ACQ_SUCCEES 2=ACQ_FAIL switch (d_state) { @@ -269,7 +244,7 @@ int pcps_tong_acquisition_cc::general_work(int noutput_items, { if (d_active) { - //restart acquisition variables + // restart acquisition variables d_gnss_synchro->Acq_delay_samples = 0.0; d_gnss_synchro->Acq_doppler_hz = 0.0; d_gnss_synchro->Acq_samplestamp_samples = 0ULL; @@ -284,7 +259,7 @@ int pcps_tong_acquisition_cc::general_work(int noutput_items, { for (uint32_t i = 0; i < d_fft_size; i++) { - d_grid_data[doppler_index][i] = 0; + d_grid_data[doppler_index][i] = 0.0; } } @@ -303,7 +278,7 @@ int pcps_tong_acquisition_cc::general_work(int noutput_items, int32_t doppler; uint32_t indext = 0; float magt = 0.0; - const auto *in = reinterpret_cast(input_items[0]); //Get the input samples pointer + const auto *in = reinterpret_cast(input_items[0]); // Get the input samples pointer float fft_normalization_factor = static_cast(d_fft_size) * static_cast(d_fft_size); d_input_power = 0.0; d_mag = 0.0; @@ -319,19 +294,18 @@ int pcps_tong_acquisition_cc::general_work(int noutput_items, << ", doppler_step: " << d_doppler_step; // 1- Compute the input signal power estimation - volk_32fc_magnitude_squared_32f(d_magnitude, in, d_fft_size); - volk_32f_accumulator_s32f(&d_input_power, d_magnitude, d_fft_size); + volk_32fc_magnitude_squared_32f(d_magnitude.data(), in, d_fft_size); + volk_32f_accumulator_s32f(&d_input_power, d_magnitude.data(), d_fft_size); d_input_power /= static_cast(d_fft_size); // 2- Doppler frequency search loop for (uint32_t doppler_index = 0; doppler_index < d_num_doppler_bins; doppler_index++) { // doppler search steps - doppler = -static_cast(d_doppler_max) + d_doppler_step * doppler_index; volk_32fc_x2_multiply_32fc(d_fft_if->get_inbuf(), in, - d_grid_doppler_wipeoffs[doppler_index], d_fft_size); + d_grid_doppler_wipeoffs[doppler_index].data(), d_fft_size); // 3- Perform the FFT-based convolution (parallel time search) // Compute the FFT of the carrier wiped--off incoming signal @@ -340,24 +314,24 @@ int pcps_tong_acquisition_cc::general_work(int noutput_items, // Multiply carrier wiped--off, Fourier transformed incoming signal // with the local FFT'd code reference using SIMD operations with VOLK library volk_32fc_x2_multiply_32fc(d_ifft->get_inbuf(), - d_fft_if->get_outbuf(), d_fft_codes, d_fft_size); + d_fft_if->get_outbuf(), d_fft_codes.data(), d_fft_size); // compute the inverse FFT d_ifft->execute(); // Compute magnitude - volk_32fc_magnitude_squared_32f(d_magnitude, d_ifft->get_outbuf(), d_fft_size); + volk_32fc_magnitude_squared_32f(d_magnitude.data(), d_ifft->get_outbuf(), d_fft_size); // Compute vector of test statistics corresponding to current doppler index. - volk_32f_s32f_multiply_32f(d_magnitude, d_magnitude, + volk_32f_s32f_multiply_32f(d_magnitude.data(), d_magnitude.data(), 1 / (fft_normalization_factor * fft_normalization_factor * d_input_power), d_fft_size); // Accumulate test statistics in d_grid_data. - volk_32f_x2_add_32f(d_grid_data[doppler_index], d_magnitude, d_grid_data[doppler_index], d_fft_size); + volk_32f_x2_add_32f(d_grid_data[doppler_index].data(), d_magnitude.data(), d_grid_data[doppler_index].data(), d_fft_size); // Search maximum - volk_gnsssdr_32f_index_max_32u(&indext, d_grid_data[doppler_index], d_fft_size); + volk_gnsssdr_32f_index_max_32u(&indext, d_grid_data[doppler_index].data(), d_fft_size); magt = d_grid_data[doppler_index][indext]; @@ -378,10 +352,10 @@ int pcps_tong_acquisition_cc::general_work(int noutput_items, std::streamsize n = 2 * sizeof(float) * (d_fft_size); // complex file write filename.str(""); filename << "../data/test_statistics_" << d_gnss_synchro->System - << "_" << d_gnss_synchro->Signal << "_sat_" + << "_" << d_gnss_synchro->Signal[0] << d_gnss_synchro->Signal[1] << "_sat_" << d_gnss_synchro->PRN << "_doppler_" << doppler << ".dat"; d_dump_file.open(filename.str().c_str(), std::ios::out | std::ios::binary); - d_dump_file.write(reinterpret_cast(d_ifft->get_outbuf()), n); //write directly |abs(x)|^2 in this Doppler bin? + d_dump_file.write(reinterpret_cast(d_ifft->get_outbuf()), n); // write directly |abs(x)|^2 in this Doppler bin? d_dump_file.close(); } } diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_tong_acquisition_cc.h b/src/algorithms/acquisition/gnuradio_blocks/pcps_tong_acquisition_cc.h index c4a9e77f0..cffdbd970 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_tong_acquisition_cc.h +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_tong_acquisition_cc.h @@ -59,6 +59,7 @@ #include #include #include +#include class pcps_tong_acquisition_cc; @@ -220,17 +221,17 @@ private: uint32_t d_tong_max_dwells; uint32_t d_fft_size; uint64_t d_sample_counter; - gr_complex** d_grid_doppler_wipeoffs; + std::vector> d_grid_doppler_wipeoffs; uint32_t d_num_doppler_bins; - gr_complex* d_fft_codes; - float** d_grid_data; + std::vector d_fft_codes; + std::vector> d_grid_data; std::shared_ptr d_fft_if; std::shared_ptr d_ifft; Gnss_Synchro* d_gnss_synchro; uint32_t d_code_phase; float d_doppler_freq; float d_mag; - float* d_magnitude; + std::vector d_magnitude; float d_input_power; float d_test_statistics; std::ofstream d_dump_file; From bf1ac2cb5083a134a6fe131551a8f7311e517214 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Tue, 23 Jul 2019 19:01:18 +0200 Subject: [PATCH 33/36] Simplify GSL usage --- .../acquisition/gnuradio_blocks/pcps_acquisition.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc index 217665fd1..f52f8bafd 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc @@ -323,7 +323,7 @@ void pcps_acquisition::init() d_magnitude_grid[doppler_index][k] = 0.0; } int32_t doppler = -static_cast(acq_parameters.doppler_max) + d_doppler_step * doppler_index; - update_local_carrier(gsl::span(d_grid_doppler_wipeoffs[doppler_index].data(), d_fft_size), d_old_freq + doppler); + update_local_carrier(d_grid_doppler_wipeoffs[doppler_index], d_old_freq + doppler); } d_worker_active = false; @@ -342,7 +342,7 @@ void pcps_acquisition::update_grid_doppler_wipeoffs() for (uint32_t doppler_index = 0; doppler_index < d_num_doppler_bins; doppler_index++) { int32_t doppler = -static_cast(acq_parameters.doppler_max) + d_doppler_step * doppler_index; - update_local_carrier(gsl::span(d_grid_doppler_wipeoffs[doppler_index].data(), d_fft_size), d_old_freq + doppler); + update_local_carrier(d_grid_doppler_wipeoffs[doppler_index], d_old_freq + doppler); } } @@ -352,7 +352,7 @@ void pcps_acquisition::update_grid_doppler_wipeoffs_step2() for (uint32_t doppler_index = 0; doppler_index < d_num_doppler_bins_step2; doppler_index++) { float doppler = (static_cast(doppler_index) - static_cast(floor(d_num_doppler_bins_step2 / 2.0))) * acq_parameters.doppler_step2; - update_local_carrier(gsl::span(d_grid_doppler_wipeoffs_step_two[doppler_index].data(), d_fft_size), d_doppler_center_step_two + doppler); + update_local_carrier(d_grid_doppler_wipeoffs_step_two[doppler_index], d_doppler_center_step_two + doppler); } } From 6796a73820794a045d2beeae2f6e8cdbb3379ad4 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Tue, 23 Jul 2019 19:04:01 +0200 Subject: [PATCH 34/36] Avoid pointer arithmetics --- .../gnuradio_blocks/beidou_b1i_telemetry_decoder_gs.cc | 6 +++--- .../gnuradio_blocks/beidou_b1i_telemetry_decoder_gs.h | 2 +- .../gnuradio_blocks/beidou_b3i_telemetry_decoder_gs.cc | 10 +++++----- .../gnuradio_blocks/beidou_b3i_telemetry_decoder_gs.h | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b1i_telemetry_decoder_gs.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b1i_telemetry_decoder_gs.cc index fa2fc8646..f2128af5a 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b1i_telemetry_decoder_gs.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b1i_telemetry_decoder_gs.cc @@ -128,7 +128,7 @@ beidou_b1i_telemetry_decoder_gs::~beidou_b1i_telemetry_decoder_gs() } -void beidou_b1i_telemetry_decoder_gs::decode_bch15_11_01(const int32_t *bits, int32_t *decbits) +void beidou_b1i_telemetry_decoder_gs::decode_bch15_11_01(const int32_t *bits, std::array &decbits) { int32_t bit, err; std::array reg{1, 1, 1, 1}; @@ -184,8 +184,8 @@ void beidou_b1i_telemetry_decoder_gs::decode_word( } } - decode_bch15_11_01(&bitsbch[0], first_branch.data()); - decode_bch15_11_01(&bitsbch[15], second_branch.data()); + decode_bch15_11_01(&bitsbch[0], first_branch); + decode_bch15_11_01(&bitsbch[15], second_branch); for (uint32_t j = 0; j < 11; j++) { diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b1i_telemetry_decoder_gs.h b/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b1i_telemetry_decoder_gs.h index feab58693..d39eb0108 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b1i_telemetry_decoder_gs.h +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b1i_telemetry_decoder_gs.h @@ -82,7 +82,7 @@ private: void decode_subframe(float *symbols); void decode_word(int32_t word_counter, const float *enc_word_symbols, int32_t *dec_word_symbols); - void decode_bch15_11_01(const int32_t *bits, int32_t *decbits); + void decode_bch15_11_01(const int32_t *bits, std::array &decbits); // Preamble decoding std::array d_preamble_samples{}; diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b3i_telemetry_decoder_gs.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b3i_telemetry_decoder_gs.cc index 53f0087cf..cf9e4f300 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b3i_telemetry_decoder_gs.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b3i_telemetry_decoder_gs.cc @@ -129,7 +129,7 @@ beidou_b3i_telemetry_decoder_gs::~beidou_b3i_telemetry_decoder_gs() void beidou_b3i_telemetry_decoder_gs::decode_bch15_11_01(const int32_t *bits, - int32_t *decbits) + std::array &decbits) { int32_t bit, err; std::array reg{1, 1, 1, 1}; @@ -185,8 +185,8 @@ void beidou_b3i_telemetry_decoder_gs::decode_word( } } - decode_bch15_11_01(&bitsbch[0], first_branch.data()); - decode_bch15_11_01(&bitsbch[15], second_branch.data()); + decode_bch15_11_01(&bitsbch[0], first_branch); + decode_bch15_11_01(&bitsbch[15], second_branch); for (uint32_t j = 0; j < 11; j++) { @@ -409,8 +409,8 @@ int beidou_b3i_telemetry_decoder_gs::general_work( const auto **in = reinterpret_cast(&input_items[0]); // Get the input buffer pointer Gnss_Synchro current_symbol{}; // structure to save the synchronization - // information and send the output object to the - // next block + // information and send the output object to the + // next block // 1. Copy the current tracking output current_symbol = in[0][0]; d_symbol_history.push_back(current_symbol.Prompt_I); // add new symbol to the symbol queue diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b3i_telemetry_decoder_gs.h b/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b3i_telemetry_decoder_gs.h index dda4e483d..acb3557d7 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b3i_telemetry_decoder_gs.h +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b3i_telemetry_decoder_gs.h @@ -79,7 +79,7 @@ private: void decode_subframe(float *symbols); void decode_word(int32_t word_counter, const float *enc_word_symbols, int32_t *dec_word_symbols); - void decode_bch15_11_01(const int32_t *bits, int32_t *decbits); + void decode_bch15_11_01(const int32_t *bits, std::array &decbits); // Preamble decoding std::array d_preamble_samples{}; From 2a64b57574702cd649aa2c4ee11ff9618526bcbb Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Tue, 23 Jul 2019 21:08:45 +0200 Subject: [PATCH 35/36] Remove unused parameter --- .../tracking/gnuradio_blocks/dll_pll_veml_tracking.cc | 6 ------ .../tracking/gnuradio_blocks/dll_pll_veml_tracking.h | 1 - 2 files changed, 7 deletions(-) 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 7841c9a46..373173a8b 100644 --- a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.cc +++ b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.cc @@ -113,7 +113,6 @@ dll_pll_veml_tracking::dll_pll_veml_tracking(const Dll_Pll_Conf &conf_) : gr::bl d_secondary_code_string = nullptr; d_data_secondary_code_length = 0U; d_data_secondary_code_string = nullptr; - d_preambles_symbols = nullptr; d_preamble_length_symbols = 0; signal_type = std::string(trk_parameters.signal); @@ -754,11 +753,6 @@ void dll_pll_veml_tracking::start_tracking() dll_pll_veml_tracking::~dll_pll_veml_tracking() { - if (signal_type == "1C") - { - volk_gnsssdr_free(d_preambles_symbols); - } - if (d_dump_file.is_open()) { try diff --git a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.h b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.h index cfb8ff79b..babdf5f66 100644 --- a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.h +++ b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.h @@ -111,7 +111,6 @@ private: std::string *d_data_secondary_code_string; std::string signal_pretty_name; - int32_t *d_preambles_symbols; int32_t d_preamble_length_symbols; // dll filter buffer From f18a9adb5579622fb7fa7b015a37656d6e00843d Mon Sep 17 00:00:00 2001 From: Javier Arribas Date: Wed, 24 Jul 2019 12:00:25 +0200 Subject: [PATCH 36/36] Correct data type in acquisition set doppler center --- .../acquisition/adapters/galileo_e5a_pcps_acquisition.h | 2 +- .../acquisition/adapters/gps_l1_ca_pcps_acquisition.h | 2 +- src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.h | 2 +- src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition.h b/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition.h index abef41b5f..75f1fa91b 100644 --- a/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition.h +++ b/src/algorithms/acquisition/adapters/galileo_e5a_pcps_acquisition.h @@ -174,7 +174,7 @@ private: std::weak_ptr channel_fsm_; unsigned int doppler_max_; unsigned int doppler_step_; - unsigned int doppler_center_; + int doppler_center_; unsigned int sampled_ms_; unsigned int max_dwells_; unsigned int in_streams_; diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.h b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.h index f3eaff714..0f3372a7d 100644 --- a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.h +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.h @@ -184,7 +184,7 @@ private: float threshold_; unsigned int doppler_max_; unsigned int doppler_step_; - unsigned int doppler_center_; + int doppler_center_; unsigned int sampled_ms_; unsigned int max_dwells_; int64_t fs_in_; diff --git a/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.h b/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.h index 268b1f3f3..bde265550 100644 --- a/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.h +++ b/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.h @@ -181,7 +181,7 @@ private: float threshold_; unsigned int doppler_max_; unsigned int doppler_step_; - unsigned int doppler_center_; + int doppler_center_; unsigned int max_dwells_; int64_t fs_in_; bool dump_; diff --git a/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition.h b/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition.h index a0191df2f..963638efb 100644 --- a/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition.h +++ b/src/algorithms/acquisition/adapters/gps_l5i_pcps_acquisition.h @@ -181,7 +181,7 @@ private: float threshold_; unsigned int doppler_max_; unsigned int doppler_step_; - unsigned int doppler_center_; + int doppler_center_; unsigned int max_dwells_; int64_t fs_in_; bool dump_;