From d3038dd162dbd7018d6eb1f9c6dc00f696af005f Mon Sep 17 00:00:00 2001 From: Gastd Date: Tue, 22 Aug 2017 19:49:55 -0300 Subject: [PATCH] Add unit test for new tracking blocks --- ...onass_l1_ca_dll_pll_c_aid_tracking_test.cc | 230 +++++++++++++++++ .../glonass_l1_ca_dll_pll_tracking_test.cc | 233 ++++++++++++++++++ 2 files changed, 463 insertions(+) create mode 100644 src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_c_aid_tracking_test.cc create mode 100644 src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_tracking_test.cc 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 new file mode 100644 index 000000000..5bb4fbdf8 --- /dev/null +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_c_aid_tracking_test.cc @@ -0,0 +1,230 @@ +/*! + * \file glonass_l1_ca_dll_pll_c_aid_tracking_test.cc + * \brief This class implements a tracking test for GLONASS_L1_CA_DLL_PLL_Tracking + * implementation based on some input parameters. + * \author Gabriel Araujo, 2017. gabriel.araujo.5000(at)gmail.com + * \author Luis Esteve, 2017. luis(at)epsilon-formacion.com + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2012-2017 (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 +#include +#include +#include +#include +#include +#include +#include +#include +#include "gnss_block_factory.h" +#include "gnss_block_interface.h" +#include "tracking_interface.h" +#include "in_memory_configuration.h" +#include "gnss_sdr_valve.h" +#include "gnss_synchro.h" +// #include "signal_conditioner.h" +#include "glonass_l1_ca_dll_pll_c_aid_tracking.h" + + +// ######## GNURADIO BLOCK MESSAGE RECEVER ######### +class GlonassL1CaDllPllCAidTrackingTest_msg_rx; + +typedef boost::shared_ptr GlonassL1CaDllPllCAidTrackingTest_msg_rx_sptr; + +GlonassL1CaDllPllCAidTrackingTest_msg_rx_sptr GlonassL1CaDllPllCAidTrackingTest_msg_rx_make(); + +class GlonassL1CaDllPllCAidTrackingTest_msg_rx : public gr::block +{ +private: + friend GlonassL1CaDllPllCAidTrackingTest_msg_rx_sptr GlonassL1CaDllPllCAidTrackingTest_msg_rx_make(); + void msg_handler_events(pmt::pmt_t msg); + GlonassL1CaDllPllCAidTrackingTest_msg_rx(); + +public: + int rx_message; + ~GlonassL1CaDllPllCAidTrackingTest_msg_rx(); //!< Default destructor + +}; + +GlonassL1CaDllPllCAidTrackingTest_msg_rx_sptr GlonassL1CaDllPllCAidTrackingTest_msg_rx_make() +{ + return GlonassL1CaDllPllCAidTrackingTest_msg_rx_sptr(new GlonassL1CaDllPllCAidTrackingTest_msg_rx()); +} + +void GlonassL1CaDllPllCAidTrackingTest_msg_rx::msg_handler_events(pmt::pmt_t msg) +{ + try + { + long int message = pmt::to_long(msg); + rx_message = message; + } + catch(boost::bad_any_cast& e) + { + LOG(WARNING) << "msg_handler_telemetry Bad any cast!"; + rx_message = 0; + } +} + +GlonassL1CaDllPllCAidTrackingTest_msg_rx::GlonassL1CaDllPllCAidTrackingTest_msg_rx() : + gr::block("GlonassL1CaDllPllCAidTrackingTest_msg_rx", gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0)) +{ + this->message_port_register_in(pmt::mp("events")); + this->set_msg_handler(pmt::mp("events"), boost::bind(&GlonassL1CaDllPllCAidTrackingTest_msg_rx::msg_handler_events, this, _1)); + rx_message = 0; +} + +GlonassL1CaDllPllCAidTrackingTest_msg_rx::~GlonassL1CaDllPllCAidTrackingTest_msg_rx() +{} + + +// ########################################################### + + +class GlonassL1CaDllPllCAidTrackingTest: public ::testing::Test +{ +protected: + GlonassL1CaDllPllCAidTrackingTest() + { + factory = std::make_shared(); + config = std::make_shared(); + item_size = sizeof(gr_complex); + gnss_synchro = Gnss_Synchro(); + } + + ~GlonassL1CaDllPllCAidTrackingTest() + {} + + void init(); + + gr::msg_queue::sptr queue; + gr::top_block_sptr top_block; + std::shared_ptr factory; + std::shared_ptr config; + Gnss_Synchro gnss_synchro; + size_t item_size; +}; + + +void GlonassL1CaDllPllCAidTrackingTest::init() +{ + gnss_synchro.Channel_ID = 0; + gnss_synchro.System = 'R'; + std::string signal = "1G"; + signal.copy(gnss_synchro.Signal, 2, 0); + gnss_synchro.PRN = 11; + + config->set_property("GNSS-SDR.internal_fs_hz", "6625000"); + + + std::string path = std::string(TEST_PATH); + std::string file = path + "signal_samples/NT1065_GLONASS_L1_20160831_fs6625e6_if0e3_schar_10s.bin"; + const char * file_name = file.c_str(); + + config->set_property("SignalSource.implementation","File_Signal_Source"); + config->set_property("SignalSource.filename",file_name); + config->set_property("SignalSource.item_type","ibyte"); + config->set_property("SignalSource.sampling_frequency","6625000"); + + config->set_property("SignalConditioner.implementation","Signal_Conditioner"); + config->set_property("DataTypeAdapter.implementation","Ibyte_To_Complex"); + config->set_property("InputFilter.implementation","Pass_Through"); + config->set_property("InputFilter.item_type","gr_complex"); + config->set_property("Resampler.implementation","Direct_Resampler"); + config->set_property("Resampler.sample_freq_in","6625000"); + config->set_property("Resampler.sample_freq_out","2000000"); + config->set_property("Resampler.item_type","gr_complex"); + + config->set_property("Tracking_1G.item_type", "gr_complex"); + config->set_property("Tracking_1G.dump", "true"); + config->set_property("Tracking_1G.if", "0.0"); + config->set_property("Tracking_1G.dump_filename", "./tracking_ch_"); + config->set_property("Tracking_1G.implementation", "GLONASS_L1_CA_DLL_PLL_C_Aid_Tracking"); + config->set_property("Tracking_1G.early_late_space_chips", "0.5"); + config->set_property("Tracking_1G.order", "2"); + config->set_property("Tracking_1G.pll_bw_hz", "20"); + config->set_property("Tracking_1G.dll_bw_hz", "4"); +} + +TEST_F(GlonassL1CaDllPllCAidTrackingTest, ValidationOfResults) +{ + struct timeval tv; + long long int begin = 0; + long long int end = 0; + int fs_in = 6625000; + int nsamples = fs_in*4e-3*2; + + init(); + queue = gr::msg_queue::make(0); + 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(); + + gnss_synchro.Acq_delay_samples = 1343; + gnss_synchro.Acq_doppler_hz = -2750; + // gnss_synchro.Acq_doppler_hz = -2750; + gnss_synchro.Acq_samplestamp_samples = 0; + + ASSERT_NO_THROW( { + tracking->set_channel(gnss_synchro.Channel_ID); + }) << "Failure setting channel." << std::endl; + + ASSERT_NO_THROW( { + tracking->set_gnss_synchro(&gnss_synchro); + }) << "Failure setting gnss_synchro." << std::endl; + + ASSERT_NO_THROW( { + tracking->connect(top_block); + }) << "Failure connecting tracking to the top_block." << std::endl; + + ASSERT_NO_THROW( { + gr::analog::sig_source_c::sptr sin_source = gr::analog::sig_source_c::make(fs_in, gr::analog::GR_SIN_WAVE, 1000, 1, gr_complex(0)); + std::string path = std::string(TEST_PATH); + std::string file = path + "signal_samples/NT1065_GLONASS_L1_20160831_fs6625e6_if0e3_4ms.bin"; + const char * file_name = file.c_str(); + gr::blocks::file_source::sptr file_source = gr::blocks::file_source::make(sizeof(gr_complex), file_name, false); + boost::shared_ptr valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue); + gr::blocks::null_sink::sptr sink = gr::blocks::null_sink::make(sizeof(Gnss_Synchro)); + top_block->connect(file_source, 0, valve, 0); + top_block->connect(valve, 0, tracking->get_left_block(), 0); + top_block->connect(tracking->get_right_block(), 0, sink, 0); + top_block->msg_connect(tracking->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); + }) << "Failure connecting the blocks of tracking test." << std::endl; + + tracking->start_tracking(); + + EXPECT_NO_THROW( { + gettimeofday(&tv, NULL); + begin = tv.tv_sec *1000000 + tv.tv_usec; + top_block->run(); // Start threads and wait + gettimeofday(&tv, NULL); + end = tv.tv_sec *1000000 + tv.tv_usec; + }) << "Failure running the top_block." << std::endl; + + // TODO: Verify tracking results + std::cout << "Tracked " << nsamples << " samples in " << (end - begin) << " microseconds" << std::endl; +} 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 new file mode 100644 index 000000000..9827a00ed --- /dev/null +++ b/src/tests/unit-tests/signal-processing-blocks/tracking/glonass_l1_ca_dll_pll_tracking_test.cc @@ -0,0 +1,233 @@ +/*! + * \file glonass_l1_ca_dll_pll_tracking_test.cc + * \brief This class implements a tracking test for GLONASS_L1_CA_DLL_PLL_Tracking + * implementation based on some input parameters. + * \author Gabriel Araujo, 2017. gabriel.araujo.5000(at)gmail.com + * \author Luis Esteve, 2017. luis(at)epsilon-formacion.com + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2012-2017 (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 +#include +#include +#include +#include +#include +#include +#include +#include +#include "gnss_block_factory.h" +#include "gnss_block_interface.h" +#include "tracking_interface.h" +#include "in_memory_configuration.h" +#include "gnss_sdr_valve.h" +#include "gnss_synchro.h" +#include "array_signal_conditioner.h" +#include "signal_conditioner.h" +#include "ibyte_to_complex.h" +#include "direct_resampler_conditioner.h" +#include "glonass_l1_ca_dll_pll_tracking.h" + + +// ######## GNURADIO BLOCK MESSAGE RECEVER ######### +class GlonassL1CaDllPllTrackingTest_msg_rx; + +typedef boost::shared_ptr GlonassL1CaDllPllTrackingTest_msg_rx_sptr; + +GlonassL1CaDllPllTrackingTest_msg_rx_sptr GlonassL1CaDllPllTrackingTest_msg_rx_make(); + +class GlonassL1CaDllPllTrackingTest_msg_rx : public gr::block +{ +private: + friend GlonassL1CaDllPllTrackingTest_msg_rx_sptr GlonassL1CaDllPllTrackingTest_msg_rx_make(); + void msg_handler_events(pmt::pmt_t msg); + GlonassL1CaDllPllTrackingTest_msg_rx(); + +public: + int rx_message; + ~GlonassL1CaDllPllTrackingTest_msg_rx(); //!< Default destructor + +}; + +GlonassL1CaDllPllTrackingTest_msg_rx_sptr GlonassL1CaDllPllTrackingTest_msg_rx_make() +{ + return GlonassL1CaDllPllTrackingTest_msg_rx_sptr(new GlonassL1CaDllPllTrackingTest_msg_rx()); +} + +void GlonassL1CaDllPllTrackingTest_msg_rx::msg_handler_events(pmt::pmt_t msg) +{ + try + { + long int message = pmt::to_long(msg); + rx_message = message; + } + catch(boost::bad_any_cast& e) + { + LOG(WARNING) << "msg_handler_telemetry Bad any cast!"; + rx_message = 0; + } +} + +GlonassL1CaDllPllTrackingTest_msg_rx::GlonassL1CaDllPllTrackingTest_msg_rx() : + gr::block("GlonassL1CaDllPllTrackingTest_msg_rx", gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0)) +{ + this->message_port_register_in(pmt::mp("events")); + this->set_msg_handler(pmt::mp("events"), boost::bind(&GlonassL1CaDllPllTrackingTest_msg_rx::msg_handler_events, this, _1)); + rx_message = 0; +} + +GlonassL1CaDllPllTrackingTest_msg_rx::~GlonassL1CaDllPllTrackingTest_msg_rx() +{} + + +// ########################################################### + + +class GlonassL1CaDllPllTrackingTest: public ::testing::Test +{ +protected: + GlonassL1CaDllPllTrackingTest() + { + factory = std::make_shared(); + config = std::make_shared(); + item_size = sizeof(gr_complex); + gnss_synchro = Gnss_Synchro(); + } + + ~GlonassL1CaDllPllTrackingTest() + {} + + void init(); + + gr::msg_queue::sptr queue; + gr::top_block_sptr top_block; + std::shared_ptr factory; + std::shared_ptr config; + Gnss_Synchro gnss_synchro; + size_t item_size; +}; + + +void GlonassL1CaDllPllTrackingTest::init() +{ + gnss_synchro.Channel_ID = 0; + gnss_synchro.System = 'R'; + std::string signal = "1G"; + signal.copy(gnss_synchro.Signal, 2, 0); + gnss_synchro.PRN = 11; + + config->set_property("GNSS-SDR.internal_fs_hz", "6625000"); + + + std::string path = std::string(TEST_PATH); + std::string file = path + "signal_samples/NT1065_GLONASS_L1_20160831_fs6625e6_if0e3_schar_10s.bin"; + const char * file_name = file.c_str(); + + config->set_property("SignalSource.implementation","File_Signal_Source"); + config->set_property("SignalSource.filename",file_name); + config->set_property("SignalSource.item_type","ibyte"); + config->set_property("SignalSource.sampling_frequency","6625000"); + + config->set_property("SignalConditioner.implementation","Signal_Conditioner"); + config->set_property("DataTypeAdapter.implementation","Ibyte_To_Complex"); + config->set_property("InputFilter.implementation","Pass_Through"); + config->set_property("InputFilter.item_type","gr_complex"); + config->set_property("Resampler.implementation","Direct_Resampler"); + config->set_property("Resampler.sample_freq_in","6625000"); + config->set_property("Resampler.sample_freq_out","2000000"); + config->set_property("Resampler.item_type","gr_complex"); + + config->set_property("Tracking_1G.item_type", "gr_complex"); + config->set_property("Tracking_1G.dump", "true"); + config->set_property("Tracking_1G.if", "0.0"); + config->set_property("Tracking_1G.dump_filename", "./tracking_ch_"); + config->set_property("Tracking_1G.implementation", "GLONASS_L1_CA_DLL_PLL_Tracking"); + config->set_property("Tracking_1G.early_late_space_chips", "0.5"); + config->set_property("Tracking_1G.order", "2"); + config->set_property("Tracking_1G.pll_bw_hz", "20"); + config->set_property("Tracking_1G.dll_bw_hz", "4"); +} + +TEST_F(GlonassL1CaDllPllTrackingTest, ValidationOfResults) +{ + struct timeval tv; + long long int begin = 0; + long long int end = 0; + int fs_in = 6625000; + int nsamples = fs_in*4e-3*2; + + init(); + queue = gr::msg_queue::make(0); + 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(); + + gnss_synchro.Acq_delay_samples = 1343; + gnss_synchro.Acq_doppler_hz = -2750; + // gnss_synchro.Acq_doppler_hz = -2750; + gnss_synchro.Acq_samplestamp_samples = 0; + + ASSERT_NO_THROW( { + tracking->set_channel(gnss_synchro.Channel_ID); + }) << "Failure setting channel." << std::endl; + + ASSERT_NO_THROW( { + tracking->set_gnss_synchro(&gnss_synchro); + }) << "Failure setting gnss_synchro." << std::endl; + + ASSERT_NO_THROW( { + tracking->connect(top_block); + }) << "Failure connecting tracking to the top_block." << std::endl; + + ASSERT_NO_THROW( { + gr::analog::sig_source_c::sptr sin_source = gr::analog::sig_source_c::make(fs_in, gr::analog::GR_SIN_WAVE, 1000, 1, gr_complex(0)); + std::string path = std::string(TEST_PATH); + std::string file = path + "signal_samples/NT1065_GLONASS_L1_20160831_fs6625e6_if0e3_4ms.bin"; + const char * file_name = file.c_str(); + gr::blocks::file_source::sptr file_source = gr::blocks::file_source::make(sizeof(gr_complex), file_name, false); + boost::shared_ptr valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue); + gr::blocks::null_sink::sptr sink = gr::blocks::null_sink::make(sizeof(Gnss_Synchro)); + top_block->connect(file_source, 0, valve, 0); + top_block->connect(valve, 0, tracking->get_left_block(), 0); + top_block->connect(tracking->get_right_block(), 0, sink, 0); + top_block->msg_connect(tracking->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); + }) << "Failure connecting the blocks of tracking test." << std::endl; + + tracking->start_tracking(); + + EXPECT_NO_THROW( { + gettimeofday(&tv, NULL); + begin = tv.tv_sec *1000000 + tv.tv_usec; + top_block->run(); // Start threads and wait + gettimeofday(&tv, NULL); + end = tv.tv_sec *1000000 + tv.tv_usec; + }) << "Failure running the top_block." << std::endl; + + // TODO: Verify tracking results + std::cout << "Tracked " << nsamples << " samples in " << (end - begin) << " microseconds" << std::endl; +}