2018-06-24 20:31:44 +00:00
/*!
2018-07-19 14:26:51 +00:00
* \ file tracking_test . cc
2018-06-24 20:31:44 +00:00
* \ brief This class implements a tracking Pull - In test for GPS_L1_CA_DLL_PLL_Tracking
* implementation based on some input parameters .
* \ author Javier Arribas , 2018. jarribas ( at ) cttc . es
*
*
2020-07-28 14:57:15 +00:00
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2018-06-24 20:31:44 +00:00
*
2020-12-30 12:35:06 +00:00
* GNSS - SDR is a Global Navigation Satellite System software - defined receiver .
2018-06-24 20:31:44 +00:00
* This file is part of GNSS - SDR .
*
2020-12-30 12:35:06 +00:00
* Copyright ( C ) 2012 - 2020 ( see AUTHORS file for a list of contributors )
2020-02-08 00:20:02 +00:00
* SPDX - License - Identifier : GPL - 3.0 - or - later
2018-06-24 20:31:44 +00:00
*
2020-07-28 14:57:15 +00:00
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2018-06-24 20:31:44 +00:00
*/
# include "GPS_L1_CA.h"
2018-12-03 16:58:18 +00:00
# include "GPS_L2C.h"
# include "GPS_L5.h"
2018-12-10 13:24:42 +00:00
# include "Galileo_E1.h"
2018-12-03 16:58:18 +00:00
# include "Galileo_E5a.h"
2018-12-10 17:12:14 +00:00
# include "acquisition_msg_rx.h"
2019-07-16 15:41:12 +00:00
# include "concurrent_queue.h"
2018-09-07 12:36:11 +00:00
# include "galileo_e1_pcps_ambiguous_acquisition.h"
2018-07-19 14:26:51 +00:00
# include "galileo_e5a_noncoherent_iq_acquisition_caf.h"
# include "galileo_e5a_pcps_acquisition.h"
2018-12-09 21:00:09 +00:00
# include "gnss_block_factory.h"
2020-11-03 19:51:57 +00:00
# include "gnss_block_interface.h"
2021-01-16 13:37:19 +00:00
# include "gnss_sdr_filesystem.h"
2018-12-09 21:00:09 +00:00
# include "gnss_sdr_valve.h"
# include "gnuplot_i.h"
# include "gps_l1_ca_pcps_acquisition.h"
# include "gps_l1_ca_pcps_acquisition_fine_doppler.h"
# include "gps_l2_m_pcps_acquisition.h"
2018-07-19 14:26:51 +00:00
# include "gps_l5i_pcps_acquisition.h"
2018-06-24 20:31:44 +00:00
# include "in_memory_configuration.h"
# include "signal_generator_flags.h"
# include "test_flags.h"
2018-12-09 21:00:09 +00:00
# include "tracking_dump_reader.h"
# include "tracking_interface.h"
2018-06-24 20:31:44 +00:00
# include "tracking_tests_flags.h"
2018-12-09 21:00:09 +00:00
# include "tracking_true_obs_reader.h"
# include <armadillo>
2018-09-07 12:36:11 +00:00
# include <gnuradio/blocks/file_source.h>
2018-12-09 21:00:09 +00:00
# include <gnuradio/blocks/head.h>
2018-09-07 12:36:11 +00:00
# include <gnuradio/blocks/interleaved_char_to_complex.h>
# include <gnuradio/blocks/null_sink.h>
# include <gnuradio/blocks/skiphead.h>
2018-12-10 13:24:42 +00:00
# include <gnuradio/filter/firdes.h>
2018-12-09 21:00:09 +00:00
# include <gnuradio/top_block.h>
2018-09-07 12:36:11 +00:00
# include <gtest/gtest.h>
2019-07-17 13:56:30 +00:00
# include <pmt/pmt.h>
2018-09-07 12:36:11 +00:00
# include <chrono>
# include <cstdint>
2019-02-11 17:38:42 +00:00
# include <utility>
2018-09-07 12:36:11 +00:00
# include <vector>
2019-06-10 19:41:13 +00:00
2020-04-26 06:41:49 +00:00
# if HAS_GENERIC_LAMBDA
# else
2020-06-06 21:41:38 +00:00
# include <boost/bind/bind.hpp>
2020-04-26 06:41:49 +00:00
# endif
2018-12-10 13:24:42 +00:00
# ifdef GR_GREATER_38
# include <gnuradio/filter/fir_filter_blk.h>
# else
# include <gnuradio/filter/fir_filter_ccf.h>
# endif
2018-06-24 20:31:44 +00:00
2021-10-30 03:43:22 +00:00
# if PMT_USES_BOOST_ANY
namespace wht = boost ;
# else
namespace wht = std ;
# endif
2018-07-02 15:43:34 +00:00
// ######## GNURADIO TRACKING BLOCK MESSAGE RECEVER #########
2018-07-19 14:26:51 +00:00
class TrackingPullInTest_msg_rx ;
2018-06-24 20:31:44 +00:00
2020-11-03 19:51:57 +00:00
using TrackingPullInTest_msg_rx_sptr = gnss_shared_ptr < TrackingPullInTest_msg_rx > ;
2018-06-24 20:31:44 +00:00
2018-07-19 14:26:51 +00:00
TrackingPullInTest_msg_rx_sptr TrackingPullInTest_msg_rx_make ( ) ;
2018-06-24 20:31:44 +00:00
2018-07-19 14:26:51 +00:00
class TrackingPullInTest_msg_rx : public gr : : block
2018-06-24 20:31:44 +00:00
{
private :
2018-07-19 14:26:51 +00:00
friend TrackingPullInTest_msg_rx_sptr TrackingPullInTest_msg_rx_make ( ) ;
2020-08-03 06:13:21 +00:00
void msg_handler_channel_events ( const pmt : : pmt_t msg ) ;
2018-07-19 14:26:51 +00:00
TrackingPullInTest_msg_rx ( ) ;
2018-06-24 20:31:44 +00:00
public :
int rx_message ;
2018-07-19 14:26:51 +00:00
~ TrackingPullInTest_msg_rx ( ) ; //!< Default destructor
2018-06-24 20:31:44 +00:00
} ;
2018-07-19 14:26:51 +00:00
TrackingPullInTest_msg_rx_sptr TrackingPullInTest_msg_rx_make ( )
2018-06-24 20:31:44 +00:00
{
2018-07-19 14:26:51 +00:00
return TrackingPullInTest_msg_rx_sptr ( new TrackingPullInTest_msg_rx ( ) ) ;
2018-06-24 20:31:44 +00:00
}
2020-08-03 06:13:21 +00:00
void TrackingPullInTest_msg_rx : : msg_handler_channel_events ( const pmt : : pmt_t msg )
2018-06-24 20:31:44 +00:00
{
try
{
2019-02-11 17:38:42 +00:00
int64_t message = pmt : : to_long ( std : : move ( msg ) ) ;
2019-08-18 23:29:04 +00:00
rx_message = message ; // 3 -> loss of lock
2020-07-07 16:53:50 +00:00
// std::cout << "Received trk message: " << rx_message << '\n';
2018-06-24 20:31:44 +00:00
}
2021-10-30 03:43:22 +00:00
catch ( const wht : : bad_any_cast & e )
2018-06-24 20:31:44 +00:00
{
2018-07-02 15:43:34 +00:00
LOG ( WARNING ) < < " msg_handler_tracking Bad cast! " ;
2018-06-24 20:31:44 +00:00
rx_message = 0 ;
}
}
2018-07-19 14:26:51 +00:00
TrackingPullInTest_msg_rx : : TrackingPullInTest_msg_rx ( ) : gr : : block ( " TrackingPullInTest_msg_rx " , gr : : io_signature : : make ( 0 , 0 , 0 ) , gr : : io_signature : : make ( 0 , 0 , 0 ) )
2018-06-24 20:31:44 +00:00
{
this - > message_port_register_in ( pmt : : mp ( " events " ) ) ;
2020-04-26 06:41:49 +00:00
this - > set_msg_handler ( pmt : : mp ( " events " ) ,
# if HAS_GENERIC_LAMBDA
2020-08-03 06:13:21 +00:00
[ this ] ( auto & & PH1 ) { msg_handler_channel_events ( PH1 ) ; } ) ;
2020-04-26 06:41:49 +00:00
# else
2020-06-12 22:32:40 +00:00
# if USE_BOOST_BIND_PLACEHOLDERS
2020-08-03 06:13:21 +00:00
boost : : bind ( & TrackingPullInTest_msg_rx : : msg_handler_channel_events , this , boost : : placeholders : : _1 ) ) ;
2020-05-18 20:50:34 +00:00
# else
2020-08-03 06:13:21 +00:00
boost : : bind ( & TrackingPullInTest_msg_rx : : msg_handler_channel_events , this , _1 ) ) ;
2020-05-18 20:50:34 +00:00
# endif
2020-04-26 06:41:49 +00:00
# endif
2018-06-24 20:31:44 +00:00
rx_message = 0 ;
}
2019-02-11 20:13:02 +00:00
TrackingPullInTest_msg_rx : : ~ TrackingPullInTest_msg_rx ( ) = default ;
2018-06-24 20:31:44 +00:00
// ###########################################################
2018-07-19 14:26:51 +00:00
class TrackingPullInTest : public : : testing : : Test
2018-06-24 20:31:44 +00:00
{
public :
2018-12-03 16:58:18 +00:00
enum StringValue
{
evGPS_1C ,
evGPS_2S ,
evGPS_L5 ,
evSBAS_1C ,
evGAL_1B ,
evGAL_5X ,
evGLO_1G ,
evGLO_2G
} ;
std : : map < std : : string , StringValue > mapStringValues_ ;
2018-06-24 20:31:44 +00:00
std : : string generator_binary ;
std : : string p1 ;
std : : string p2 ;
std : : string p3 ;
std : : string p4 ;
std : : string p5 ;
std : : string p6 ;
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
std : : string implementation = FLAGS_trk_test_implementation ;
2018-06-24 20:31:44 +00:00
const int baseband_sampling_freq = FLAGS_fs_gen_sps ;
std : : string filename_rinex_obs = FLAGS_filename_rinex_obs ;
2018-07-03 13:18:45 +00:00
std : : string filename_raw_data = FLAGS_signal_file ;
2024-04-29 06:27:33 +00:00
# else
std : : string implementation = absl : : GetFlag ( FLAGS_trk_test_implementation ) ;
const int baseband_sampling_freq = absl : : GetFlag ( FLAGS_fs_gen_sps ) ;
std : : string filename_rinex_obs = absl : : GetFlag ( FLAGS_filename_rinex_obs ) ;
std : : string filename_raw_data = absl : : GetFlag ( FLAGS_signal_file ) ;
# endif
2018-06-24 20:31:44 +00:00
2018-07-02 15:43:34 +00:00
std : : map < int , double > doppler_measurements_map ;
std : : map < int , double > code_delay_measurements_map ;
2018-08-10 19:16:10 +00:00
std : : map < int , uint64_t > acq_samplestamp_map ;
2018-07-02 15:43:34 +00:00
2018-06-24 20:31:44 +00:00
int configure_generator ( double CN0_dBHz , int file_idx ) ;
int generate_signal ( ) ;
std : : vector < double > check_results_doppler ( arma : : vec & true_time_s ,
arma : : vec & true_value ,
arma : : vec & meas_time_s ,
arma : : vec & meas_value ,
double & mean_error ,
double & std_dev_error ) ;
std : : vector < double > check_results_acc_carrier_phase ( arma : : vec & true_time_s ,
arma : : vec & true_value ,
arma : : vec & meas_time_s ,
arma : : vec & meas_value ,
double & mean_error ,
double & std_dev_error ) ;
std : : vector < double > check_results_codephase ( arma : : vec & true_time_s ,
arma : : vec & true_value ,
arma : : vec & meas_time_s ,
arma : : vec & meas_value ,
double & mean_error ,
double & std_dev_error ) ;
2018-07-19 14:26:51 +00:00
TrackingPullInTest ( )
2018-06-24 20:31:44 +00:00
{
factory = std : : make_shared < GNSSBlockFactory > ( ) ;
config = std : : make_shared < InMemoryConfiguration > ( ) ;
item_size = sizeof ( gr_complex ) ;
gnss_synchro = Gnss_Synchro ( ) ;
2018-12-03 16:58:18 +00:00
mapStringValues_ [ " 1C " ] = evGPS_1C ;
mapStringValues_ [ " 2S " ] = evGPS_2S ;
mapStringValues_ [ " L5 " ] = evGPS_L5 ;
mapStringValues_ [ " 1B " ] = evGAL_1B ;
mapStringValues_ [ " 5X " ] = evGAL_5X ;
mapStringValues_ [ " 1G " ] = evGLO_1G ;
mapStringValues_ [ " 2G " ] = evGLO_2G ;
2018-06-24 20:31:44 +00:00
}
2019-02-11 20:13:02 +00:00
~ TrackingPullInTest ( ) = default ;
2018-06-24 20:31:44 +00:00
void configure_receiver ( double PLL_wide_bw_hz ,
double DLL_wide_bw_hz ,
double PLL_narrow_bw_hz ,
double DLL_narrow_bw_hz ,
int extend_correlation_symbols ) ;
2018-08-01 07:55:59 +00:00
bool acquire_signal ( int SV_ID ) ;
2020-02-26 21:40:00 +00:00
2018-06-24 20:31:44 +00:00
std : : shared_ptr < GNSSBlockFactory > factory ;
std : : shared_ptr < InMemoryConfiguration > config ;
Gnss_Synchro gnss_synchro ;
size_t item_size ;
2018-11-14 17:28:14 +00:00
2019-07-16 15:41:12 +00:00
std : : shared_ptr < Concurrent_Queue < pmt : : pmt_t > > queue ;
2018-06-24 20:31:44 +00:00
} ;
2018-07-19 14:26:51 +00:00
int TrackingPullInTest : : configure_generator ( double CN0_dBHz , int file_idx )
2018-06-24 20:31:44 +00:00
{
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2018-06-24 20:31:44 +00:00
// Configure signal generator
generator_binary = FLAGS_generator_binary ;
p1 = std : : string ( " -rinex_nav_file= " ) + FLAGS_rinex_nav_file ;
if ( FLAGS_dynamic_position . empty ( ) )
{
p2 = std : : string ( " -static_position= " ) + FLAGS_static_position + std : : string ( " , " ) + std : : to_string ( FLAGS_duration * 10 ) ;
}
else
{
p2 = std : : string ( " -obs_pos_file= " ) + std : : string ( FLAGS_dynamic_position ) ;
}
2018-07-03 13:18:45 +00:00
p3 = std : : string ( " -rinex_obs_file= " ) + FLAGS_filename_rinex_obs ; // RINEX 2.10 observation file output
p4 = std : : string ( " -sig_out_file= " ) + FLAGS_signal_file + std : : to_string ( file_idx ) ; // Baseband signal output file. Will be stored in int8_t IQ multiplexed samples
2019-08-18 23:29:04 +00:00
p5 = std : : string ( " -sampling_freq= " ) + std : : to_string ( baseband_sampling_freq ) ; // Baseband sampling frequency [MSps]
2018-07-03 13:18:45 +00:00
p6 = std : : string ( " -CN0_dBHz= " ) + std : : to_string ( CN0_dBHz ) ; // Signal generator CN0
2024-04-29 06:27:33 +00:00
# else
// Configure signal generator
generator_binary = absl : : GetFlag ( FLAGS_generator_binary ) ;
p1 = std : : string ( " -rinex_nav_file= " ) + absl : : GetFlag ( FLAGS_rinex_nav_file ) ;
if ( absl : : GetFlag ( FLAGS_dynamic_position ) . empty ( ) )
{
p2 = std : : string ( " -static_position= " ) + absl : : GetFlag ( FLAGS_static_position ) + std : : string ( " , " ) + std : : to_string ( absl : : GetFlag ( FLAGS_duration ) * 10 ) ;
}
else
{
p2 = std : : string ( " -obs_pos_file= " ) + std : : string ( absl : : GetFlag ( FLAGS_dynamic_position ) ) ;
}
p3 = std : : string ( " -rinex_obs_file= " ) + absl : : GetFlag ( FLAGS_filename_rinex_obs ) ; // RINEX 2.10 observation file output
p4 = std : : string ( " -sig_out_file= " ) + absl : : GetFlag ( FLAGS_signal_file ) + std : : to_string ( file_idx ) ; // Baseband signal output file. Will be stored in int8_t IQ multiplexed samples
p5 = std : : string ( " -sampling_freq= " ) + std : : to_string ( baseband_sampling_freq ) ; // Baseband sampling frequency [MSps]
p6 = std : : string ( " -CN0_dBHz= " ) + std : : to_string ( CN0_dBHz ) ; // Signal generator CN0
# endif
2018-06-24 20:31:44 +00:00
return 0 ;
}
2018-07-19 14:26:51 +00:00
int TrackingPullInTest : : generate_signal ( )
2018-06-24 20:31:44 +00:00
{
int child_status ;
2019-02-11 17:38:42 +00:00
char * const parmList [ ] = { & generator_binary [ 0 ] , & generator_binary [ 0 ] , & p1 [ 0 ] , & p2 [ 0 ] , & p3 [ 0 ] , & p4 [ 0 ] , & p5 [ 0 ] , & p6 [ 0 ] , nullptr } ;
2018-06-24 20:31:44 +00:00
int pid ;
if ( ( pid = fork ( ) ) = = - 1 )
2019-02-11 20:13:02 +00:00
{
perror ( " fork err " ) ;
}
2018-06-24 20:31:44 +00:00
else if ( pid = = 0 )
{
execv ( & generator_binary [ 0 ] , parmList ) ;
2020-07-07 16:53:50 +00:00
std : : cout < < " Return not expected. Must be an execv err. \n " ;
2018-06-24 20:31:44 +00:00
std : : terminate ( ) ;
}
waitpid ( pid , & child_status , 0 ) ;
2020-07-07 16:53:50 +00:00
std : : cout < < " Signal and Observables RINEX and RAW files created. \n " ;
2018-06-24 20:31:44 +00:00
return 0 ;
}
2018-07-19 14:26:51 +00:00
void TrackingPullInTest : : configure_receiver (
2018-06-24 20:31:44 +00:00
double PLL_wide_bw_hz ,
double DLL_wide_bw_hz ,
double PLL_narrow_bw_hz ,
double DLL_narrow_bw_hz ,
int extend_correlation_symbols )
{
config = std : : make_shared < InMemoryConfiguration > ( ) ;
2018-07-19 14:26:51 +00:00
config - > set_property ( " Tracking.dump " , " true " ) ;
config - > set_property ( " Tracking.dump_filename " , " ./tracking_ch_ " ) ;
config - > set_property ( " Tracking.implementation " , implementation ) ;
config - > set_property ( " Tracking.item_type " , " gr_complex " ) ;
config - > set_property ( " Tracking.pll_bw_hz " , std : : to_string ( PLL_wide_bw_hz ) ) ;
config - > set_property ( " Tracking.dll_bw_hz " , std : : to_string ( DLL_wide_bw_hz ) ) ;
config - > set_property ( " Tracking.extend_correlation_symbols " , std : : to_string ( extend_correlation_symbols ) ) ;
config - > set_property ( " Tracking.pll_bw_narrow_hz " , std : : to_string ( PLL_narrow_bw_hz ) ) ;
config - > set_property ( " Tracking.dll_bw_narrow_hz " , std : : to_string ( DLL_narrow_bw_hz ) ) ;
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2018-07-19 14:26:51 +00:00
gnss_synchro . PRN = FLAGS_test_satellite_PRN ;
2024-04-29 06:27:33 +00:00
# else
gnss_synchro . PRN = absl : : GetFlag ( FLAGS_test_satellite_PRN ) ;
# endif
2018-07-19 14:26:51 +00:00
gnss_synchro . Channel_ID = 0 ;
2018-06-24 20:31:44 +00:00
config - > set_property ( " GNSS-SDR.internal_fs_sps " , std : : to_string ( baseband_sampling_freq ) ) ;
2018-07-19 14:26:51 +00:00
std : : string System_and_Signal ;
2019-02-11 17:38:42 +00:00
if ( implementation = = " GPS_L1_CA_DLL_PLL_Tracking " )
2018-07-19 14:26:51 +00:00
{
gnss_synchro . System = ' G ' ;
std : : string signal = " 1C " ;
System_and_Signal = " GPS L1 CA " ;
signal . copy ( gnss_synchro . Signal , 2 , 0 ) ;
config - > set_property ( " Tracking.early_late_space_chips " , " 0.5 " ) ;
config - > set_property ( " Tracking.early_late_space_narrow_chips " , " 0.5 " ) ;
}
2019-02-11 17:38:42 +00:00
else if ( implementation = = " Galileo_E1_DLL_PLL_VEML_Tracking " )
2018-07-19 14:26:51 +00:00
{
gnss_synchro . System = ' E ' ;
std : : string signal = " 1B " ;
System_and_Signal = " Galileo E1B " ;
signal . copy ( gnss_synchro . Signal , 2 , 0 ) ;
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.early_late_space_narrow_chips " , " 0.15 " ) ;
config - > set_property ( " Tracking.very_early_late_space_narrow_chips " , " 0.6 " ) ;
config - > set_property ( " Tracking.track_pilot " , " true " ) ;
}
2019-02-11 17:38:42 +00:00
else if ( implementation = = " GPS_L2_M_DLL_PLL_Tracking " )
2018-07-19 14:26:51 +00:00
{
gnss_synchro . System = ' G ' ;
std : : string signal = " 2S " ;
System_and_Signal = " GPS L2CM " ;
signal . copy ( gnss_synchro . Signal , 2 , 0 ) ;
config - > set_property ( " Tracking.early_late_space_chips " , " 0.5 " ) ;
2018-12-05 15:50:32 +00:00
config - > set_property ( " Tracking.track_pilot " , " true " ) ;
2018-07-19 14:26:51 +00:00
}
2019-02-11 17:38:42 +00:00
else if ( implementation = = " Galileo_E5a_DLL_PLL_Tracking " or implementation = = " Galileo_E5a_DLL_PLL_Tracking_b " )
2018-07-19 14:26:51 +00:00
{
gnss_synchro . System = ' E ' ;
std : : string signal = " 5X " ;
System_and_Signal = " Galileo E5a " ;
signal . copy ( gnss_synchro . Signal , 2 , 0 ) ;
2019-02-11 17:38:42 +00:00
if ( implementation = = " Galileo_E5a_DLL_PLL_Tracking_b " )
2018-07-19 14:26:51 +00:00
{
config - > supersede_property ( " Tracking.implementation " , std : : string ( " Galileo_E5a_DLL_PLL_Tracking " ) ) ;
}
config - > set_property ( " Tracking.early_late_space_chips " , " 0.5 " ) ;
2018-12-05 15:50:32 +00:00
config - > set_property ( " Tracking.track_pilot " , " true " ) ;
2018-07-19 14:26:51 +00:00
config - > set_property ( " Tracking.order " , " 2 " ) ;
}
2019-02-11 17:38:42 +00:00
else if ( implementation = = " GPS_L5_DLL_PLL_Tracking " )
2018-07-19 14:26:51 +00:00
{
gnss_synchro . System = ' G ' ;
std : : string signal = " L5 " ;
System_and_Signal = " GPS L5I " ;
signal . copy ( gnss_synchro . Signal , 2 , 0 ) ;
config - > set_property ( " Tracking.early_late_space_chips " , " 0.5 " ) ;
2018-12-05 15:50:32 +00:00
config - > set_property ( " Tracking.track_pilot " , " true " ) ;
2018-07-19 14:26:51 +00:00
config - > set_property ( " Tracking.order " , " 2 " ) ;
}
else
{
std : : cout < < " The test can not run with the selected tracking implementation \n " ;
throw ( std : : exception ( ) ) ;
}
2018-06-24 20:31:44 +00:00
std : : cout < < " ***************************************** \n " ;
std : : cout < < " *** Tracking configuration parameters *** \n " ;
std : : cout < < " ***************************************** \n " ;
2018-07-19 14:26:51 +00:00
std : : cout < < " Signal: " < < System_and_Signal < < " \n " ;
std : : cout < < " implementation: " < < config - > property ( " Tracking.implementation " , std : : string ( " undefined " ) ) < < " \n " ;
std : : cout < < " pll_bw_hz: " < < config - > property ( " Tracking.pll_bw_hz " , 0.0 ) < < " Hz \n " ;
std : : cout < < " dll_bw_hz: " < < config - > property ( " Tracking.dll_bw_hz " , 0.0 ) < < " Hz \n " ;
std : : cout < < " pll_bw_narrow_hz: " < < config - > property ( " Tracking.pll_bw_narrow_hz " , 0.0 ) < < " Hz \n " ;
std : : cout < < " dll_bw_narrow_hz: " < < config - > property ( " Tracking.dll_bw_narrow_hz " , 0.0 ) < < " Hz \n " ;
std : : cout < < " extend_correlation_symbols: " < < config - > property ( " Tracking.extend_correlation_symbols " , 0 ) < < " Symbols \n " ;
2018-06-24 20:31:44 +00:00
std : : cout < < " ***************************************** \n " ;
std : : cout < < " ***************************************** \n " ;
}
2018-08-01 07:55:59 +00:00
bool TrackingPullInTest : : acquire_signal ( int SV_ID )
2018-07-02 15:43:34 +00:00
{
// 1. Setup GNU Radio flowgraph (file_source -> Acquisition_10m)
2020-02-26 21:40:00 +00:00
gr : : top_block_sptr top_block_acq ;
top_block_acq = gr : : make_top_block ( " Acquisition test " ) ;
2018-07-02 15:43:34 +00:00
// Satellite signal definition
Gnss_Synchro tmp_gnss_synchro ;
tmp_gnss_synchro . Channel_ID = 0 ;
2018-12-03 16:58:18 +00:00
2018-07-02 15:43:34 +00:00
config = std : : make_shared < InMemoryConfiguration > ( ) ;
config - > set_property ( " GNSS-SDR.internal_fs_sps " , std : : to_string ( baseband_sampling_freq ) ) ;
2024-04-29 06:27:33 +00:00
// Enable automatic resampler for the acquisition, if required
# if USE_GLOG_AND_GFLAGS
2018-12-03 16:58:18 +00:00
if ( FLAGS_use_acquisition_resampler = = true )
2024-04-29 06:27:33 +00:00
# else
if ( absl : : GetFlag ( FLAGS_use_acquisition_resampler ) = = true )
# endif
2018-12-03 16:58:18 +00:00
{
config - > set_property ( " GNSS-SDR.use_acquisition_resampler " , " true " ) ;
}
2018-07-07 13:39:09 +00:00
config - > set_property ( " Acquisition.blocking_on_standby " , " true " ) ;
2018-07-19 14:26:51 +00:00
config - > set_property ( " Acquisition.blocking " , " true " ) ;
2018-07-20 09:06:39 +00:00
config - > set_property ( " Acquisition.dump " , " false " ) ;
2018-07-07 13:39:09 +00:00
config - > set_property ( " Acquisition.dump_filename " , " ./data/acquisition.dat " ) ;
2018-07-19 14:26:51 +00:00
std : : shared_ptr < AcquisitionInterface > acquisition ;
std : : string System_and_Signal ;
2018-12-03 16:58:18 +00:00
std : : string signal ;
2019-08-18 23:29:04 +00:00
// create the correspondign acquisition block according to the desired tracking signal
2019-02-11 17:38:42 +00:00
if ( implementation = = " GPS_L1_CA_DLL_PLL_Tracking " )
2018-07-19 14:26:51 +00:00
{
tmp_gnss_synchro . System = ' G ' ;
2018-12-03 16:58:18 +00:00
signal = " 1C " ;
2018-08-01 07:55:59 +00:00
const char * str = signal . c_str ( ) ; // get a C style null terminated string
std : : memcpy ( static_cast < void * > ( tmp_gnss_synchro . Signal ) , str , 3 ) ; // copy string into synchro char array: 2 char + null
2018-07-19 14:26:51 +00:00
tmp_gnss_synchro . PRN = SV_ID ;
System_and_Signal = " GPS L1 CA " ;
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2018-07-19 14:26:51 +00:00
config - > set_property ( " Acquisition.max_dwells " , std : : to_string ( FLAGS_external_signal_acquisition_dwells ) ) ;
2024-04-29 06:27:33 +00:00
# else
config - > set_property ( " Acquisition.max_dwells " , std : : to_string ( absl : : GetFlag ( FLAGS_external_signal_acquisition_dwells ) ) ) ;
# endif
2019-08-18 23:29:04 +00:00
// acquisition = std::make_shared<GpsL1CaPcpsAcquisitionFineDoppler>(config.get(), "Acquisition", 1, 0);
2018-08-07 18:16:43 +00:00
acquisition = std : : make_shared < GpsL1CaPcpsAcquisition > ( config . get ( ) , " Acquisition " , 1 , 0 ) ;
2018-07-19 14:26:51 +00:00
}
2019-02-11 17:38:42 +00:00
else if ( implementation = = " Galileo_E1_DLL_PLL_VEML_Tracking " )
2018-07-19 14:26:51 +00:00
{
tmp_gnss_synchro . System = ' E ' ;
2018-12-03 16:58:18 +00:00
signal = " 1B " ;
2018-08-01 07:55:59 +00:00
const char * str = signal . c_str ( ) ; // get a C style null terminated string
std : : memcpy ( static_cast < void * > ( tmp_gnss_synchro . Signal ) , str , 3 ) ; // copy string into synchro char array: 2 char + null
2018-07-19 14:26:51 +00:00
tmp_gnss_synchro . PRN = SV_ID ;
System_and_Signal = " Galileo E1B " ;
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2018-07-19 14:26:51 +00:00
config - > set_property ( " Acquisition.max_dwells " , std : : to_string ( FLAGS_external_signal_acquisition_dwells ) ) ;
2024-04-29 06:27:33 +00:00
# else
config - > set_property ( " Acquisition.max_dwells " , std : : to_string ( absl : : GetFlag ( FLAGS_external_signal_acquisition_dwells ) ) ) ;
# endif
2018-07-19 14:26:51 +00:00
acquisition = std : : make_shared < GalileoE1PcpsAmbiguousAcquisition > ( config . get ( ) , " Acquisition " , 1 , 0 ) ;
}
2019-02-11 17:38:42 +00:00
else if ( implementation = = " GPS_L2_M_DLL_PLL_Tracking " )
2018-07-19 14:26:51 +00:00
{
tmp_gnss_synchro . System = ' G ' ;
2018-12-03 16:58:18 +00:00
signal = " 2S " ;
2018-08-01 07:55:59 +00:00
const char * str = signal . c_str ( ) ; // get a C style null terminated string
std : : memcpy ( static_cast < void * > ( tmp_gnss_synchro . Signal ) , str , 3 ) ; // copy string into synchro char array: 2 char + null
2018-07-19 14:26:51 +00:00
tmp_gnss_synchro . PRN = SV_ID ;
System_and_Signal = " GPS L2CM " ;
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2018-07-19 14:26:51 +00:00
config - > set_property ( " Acquisition.max_dwells " , std : : to_string ( FLAGS_external_signal_acquisition_dwells ) ) ;
2024-04-29 06:27:33 +00:00
# else
config - > set_property ( " Acquisition.max_dwells " , std : : to_string ( absl : : GetFlag ( FLAGS_external_signal_acquisition_dwells ) ) ) ;
# endif
2018-07-19 14:26:51 +00:00
acquisition = std : : make_shared < GpsL2MPcpsAcquisition > ( config . get ( ) , " Acquisition " , 1 , 0 ) ;
}
2019-02-11 17:38:42 +00:00
else if ( implementation = = " Galileo_E5a_DLL_PLL_Tracking_b " )
2018-07-19 14:26:51 +00:00
{
tmp_gnss_synchro . System = ' E ' ;
2018-12-03 16:58:18 +00:00
signal = " 5X " ;
2018-08-01 07:55:59 +00:00
const char * str = signal . c_str ( ) ; // get a C style null terminated string
std : : memcpy ( static_cast < void * > ( tmp_gnss_synchro . Signal ) , str , 3 ) ; // copy string into synchro char array: 2 char + null
2018-07-19 14:26:51 +00:00
tmp_gnss_synchro . PRN = SV_ID ;
System_and_Signal = " Galileo E5a " ;
config - > set_property ( " Acquisition_5X.coherent_integration_time_ms " , " 1 " ) ;
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2018-07-19 14:26:51 +00:00
config - > set_property ( " Acquisition.max_dwells " , std : : to_string ( FLAGS_external_signal_acquisition_dwells ) ) ;
2024-04-29 06:27:33 +00:00
# else
config - > set_property ( " Acquisition.max_dwells " , std : : to_string ( absl : : GetFlag ( FLAGS_external_signal_acquisition_dwells ) ) ) ;
# endif
2019-08-18 23:29:04 +00:00
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.
2018-07-19 14:26:51 +00:00
config - > set_property ( " Acquisition.bit_transition_flag " , " false " ) ;
acquisition = std : : make_shared < GalileoE5aNoncoherentIQAcquisitionCaf > ( config . get ( ) , " Acquisition " , 1 , 0 ) ;
}
2019-02-11 17:38:42 +00:00
else if ( implementation = = " Galileo_E5a_DLL_PLL_Tracking " )
2018-07-19 14:26:51 +00:00
{
tmp_gnss_synchro . System = ' E ' ;
2018-12-03 16:58:18 +00:00
signal = " 5X " ;
2018-08-01 07:55:59 +00:00
const char * str = signal . c_str ( ) ; // get a C style null terminated string
std : : memcpy ( static_cast < void * > ( tmp_gnss_synchro . Signal ) , str , 3 ) ; // copy string into synchro char array: 2 char + null
2018-07-19 14:26:51 +00:00
tmp_gnss_synchro . PRN = SV_ID ;
System_and_Signal = " Galileo E5a " ;
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2018-07-19 14:26:51 +00:00
config - > set_property ( " Acquisition.max_dwells " , std : : to_string ( FLAGS_external_signal_acquisition_dwells ) ) ;
2024-04-29 06:27:33 +00:00
# else
config - > set_property ( " Acquisition.max_dwells " , std : : to_string ( absl : : GetFlag ( FLAGS_external_signal_acquisition_dwells ) ) ) ;
# endif
2018-07-19 14:26:51 +00:00
acquisition = std : : make_shared < GalileoE5aPcpsAcquisition > ( config . get ( ) , " Acquisition " , 1 , 0 ) ;
}
2019-02-11 17:38:42 +00:00
else if ( implementation = = " GPS_L5_DLL_PLL_Tracking " )
2018-07-19 14:26:51 +00:00
{
tmp_gnss_synchro . System = ' G ' ;
2018-12-03 16:58:18 +00:00
signal = " L5 " ;
2018-08-01 07:55:59 +00:00
const char * str = signal . c_str ( ) ; // get a C style null terminated string
std : : memcpy ( static_cast < void * > ( tmp_gnss_synchro . Signal ) , str , 3 ) ; // copy string into synchro char array: 2 char + null
2018-07-19 14:26:51 +00:00
tmp_gnss_synchro . PRN = SV_ID ;
System_and_Signal = " GPS L5I " ;
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2018-07-19 14:26:51 +00:00
config - > set_property ( " Acquisition.max_dwells " , std : : to_string ( FLAGS_external_signal_acquisition_dwells ) ) ;
2024-04-29 06:27:33 +00:00
# else
config - > set_property ( " Acquisition.max_dwells " , std : : to_string ( absl : : GetFlag ( FLAGS_external_signal_acquisition_dwells ) ) ) ;
# endif
2018-07-19 14:26:51 +00:00
acquisition = std : : make_shared < GpsL5iPcpsAcquisition > ( config . get ( ) , " Acquisition " , 1 , 0 ) ;
}
else
{
std : : cout < < " The test can not run with the selected tracking implementation \n " ;
throw ( std : : exception ( ) ) ;
}
2018-07-02 15:43:34 +00:00
acquisition - > set_gnss_synchro ( & tmp_gnss_synchro ) ;
2018-07-19 14:26:51 +00:00
acquisition - > set_channel ( 0 ) ;
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2018-07-19 14:26:51 +00:00
acquisition - > set_doppler_max ( config - > property ( " Acquisition.doppler_max " , FLAGS_external_signal_acquisition_doppler_max_hz ) ) ;
acquisition - > set_doppler_step ( config - > property ( " Acquisition.doppler_step " , FLAGS_external_signal_acquisition_doppler_step_hz ) ) ;
2018-07-04 14:56:47 +00:00
acquisition - > set_threshold ( config - > property ( " Acquisition.threshold " , FLAGS_external_signal_acquisition_threshold ) ) ;
2024-04-29 06:27:33 +00:00
# else
acquisition - > set_doppler_max ( config - > property ( " Acquisition.doppler_max " , absl : : GetFlag ( FLAGS_external_signal_acquisition_doppler_max_hz ) ) ) ;
acquisition - > set_doppler_step ( config - > property ( " Acquisition.doppler_step " , absl : : GetFlag ( FLAGS_external_signal_acquisition_doppler_step_hz ) ) ) ;
acquisition - > set_threshold ( config - > property ( " Acquisition.threshold " , absl : : GetFlag ( FLAGS_external_signal_acquisition_threshold ) ) ) ;
# endif
2018-07-19 14:26:51 +00:00
acquisition - > init ( ) ;
acquisition - > set_local_code ( ) ;
acquisition - > set_state ( 1 ) ; // Ensure that acquisition starts at the first sample
2020-02-26 21:40:00 +00:00
acquisition - > connect ( top_block_acq ) ;
2018-07-07 13:39:09 +00:00
gr : : blocks : : file_source : : sptr file_source ;
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2018-07-07 13:39:09 +00:00
std : : string file = FLAGS_signal_file ;
2024-04-29 06:27:33 +00:00
# else
std : : string file = absl : : GetFlag ( FLAGS_signal_file ) ;
# endif
2018-07-07 13:39:09 +00:00
const char * file_name = file . c_str ( ) ;
file_source = gr : : blocks : : file_source : : make ( sizeof ( int8_t ) , file_name , false ) ;
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2019-08-18 23:29:04 +00:00
file_source - > seek ( 2 * FLAGS_skip_samples , SEEK_SET ) ; // skip head. ibyte, two bytes per complex sample
2024-04-29 06:27:33 +00:00
# else
file_source - > seek ( 2 * absl : : GetFlag ( FLAGS_skip_samples ) , SEEK_SET ) ; // skip head. ibyte, two bytes per complex sample
# endif
2018-07-07 13:39:09 +00:00
gr : : blocks : : interleaved_char_to_complex : : sptr gr_interleaved_char_to_complex = gr : : blocks : : interleaved_char_to_complex : : make ( ) ;
2019-08-18 23:29:04 +00:00
// gr::blocks::head::sptr head_samples = gr::blocks::head::make(sizeof(gr_complex), baseband_sampling_freq * FLAGS_duration);
2018-07-07 13:39:09 +00:00
2020-02-26 21:40:00 +00:00
top_block_acq - > connect ( file_source , 0 , gr_interleaved_char_to_complex , 0 ) ;
2018-07-02 15:43:34 +00:00
2024-04-29 06:27:33 +00:00
// Enable automatic resampler for the acquisition, if required
# if USE_GLOG_AND_GFLAGS
2018-12-03 16:58:18 +00:00
if ( FLAGS_use_acquisition_resampler = = true )
2024-04-29 06:27:33 +00:00
# else
if ( absl : : GetFlag ( FLAGS_use_acquisition_resampler ) = = true )
# endif
2018-12-03 16:58:18 +00:00
{
2019-08-18 23:29:04 +00:00
// create acquisition resamplers if required
2018-12-03 16:58:18 +00:00
double resampler_ratio = 1.0 ;
double opt_fs = baseband_sampling_freq ;
2019-08-18 23:29:04 +00:00
// find the signal associated to this channel
2018-12-03 16:58:18 +00:00
switch ( mapStringValues_ [ signal ] )
{
case evGPS_1C :
2019-08-31 09:37:29 +00:00
opt_fs = GPS_L1_CA_OPT_ACQ_FS_SPS ;
2018-12-03 16:58:18 +00:00
break ;
case evGPS_2S :
2019-08-31 09:37:29 +00:00
opt_fs = GPS_L2C_OPT_ACQ_FS_SPS ;
2018-12-03 16:58:18 +00:00
break ;
case evGPS_L5 :
2019-08-31 09:37:29 +00:00
opt_fs = GPS_L5_OPT_ACQ_FS_SPS ;
2018-12-03 16:58:18 +00:00
break ;
case evSBAS_1C :
2019-08-31 09:37:29 +00:00
opt_fs = GPS_L1_CA_OPT_ACQ_FS_SPS ;
2018-12-03 16:58:18 +00:00
break ;
case evGAL_1B :
2019-08-31 09:37:29 +00:00
opt_fs = GALILEO_E1_OPT_ACQ_FS_SPS ;
2018-12-03 16:58:18 +00:00
break ;
case evGAL_5X :
2019-08-31 09:37:29 +00:00
opt_fs = GALILEO_E5A_OPT_ACQ_FS_SPS ;
2018-12-03 16:58:18 +00:00
break ;
case evGLO_1G :
opt_fs = baseband_sampling_freq ;
break ;
case evGLO_2G :
opt_fs = baseband_sampling_freq ;
break ;
}
if ( opt_fs < baseband_sampling_freq )
{
resampler_ratio = baseband_sampling_freq / opt_fs ;
2018-12-05 15:50:32 +00:00
int decimation = floor ( resampler_ratio ) ;
2018-12-03 16:58:18 +00:00
while ( baseband_sampling_freq % decimation > 0 )
{
decimation - - ;
} ;
double acq_fs = baseband_sampling_freq / decimation ;
2018-12-05 15:50:32 +00:00
if ( decimation > 1 )
{
2019-08-18 23:29:04 +00:00
// create a FIR low pass filter
2018-12-05 15:50:32 +00:00
std : : vector < float > taps ;
taps = gr : : filter : : firdes : : low_pass ( 1.0 ,
baseband_sampling_freq ,
acq_fs / 2.1 ,
2020-12-19 11:40:57 +00:00
acq_fs / 10 ) ;
2020-07-07 16:53:50 +00:00
std : : cout < < " Enabled decimation low pass filter with " < < taps . size ( ) < < " taps and decimation factor of " < < decimation < < ' \n ' ;
2018-12-05 15:50:32 +00:00
acquisition - > set_resampler_latency ( ( taps . size ( ) - 1 ) / 2 ) ;
gr : : basic_block_sptr fir_filter_ccf_ = gr : : filter : : fir_filter_ccf : : make ( decimation , taps ) ;
2020-02-26 21:40:00 +00:00
top_block_acq - > connect ( gr_interleaved_char_to_complex , 0 , fir_filter_ccf_ , 0 ) ;
top_block_acq - > connect ( fir_filter_ccf_ , 0 , acquisition - > get_left_block ( ) , 0 ) ;
2018-12-05 15:50:32 +00:00
}
else
{
std : : cout < < " Disabled acquisition resampler because the input sampling frequency is too low \n " ;
2020-02-26 21:40:00 +00:00
top_block_acq - > connect ( gr_interleaved_char_to_complex , 0 , acquisition - > get_left_block ( ) , 0 ) ;
2018-12-05 15:50:32 +00:00
}
}
else
{
std : : cout < < " Disabled acquisition resampler because the input sampling frequency is too low \n " ;
2020-02-26 21:40:00 +00:00
top_block_acq - > connect ( gr_interleaved_char_to_complex , 0 , acquisition - > get_left_block ( ) , 0 ) ;
2018-12-03 16:58:18 +00:00
}
}
else
{
2020-02-26 21:40:00 +00:00
top_block_acq - > connect ( gr_interleaved_char_to_complex , 0 , acquisition - > get_left_block ( ) , 0 ) ;
// top_block_acq->connect(head_samples, 0, acquisition->get_left_block(), 0);
2018-12-03 16:58:18 +00:00
}
2020-11-03 19:51:57 +00:00
gnss_shared_ptr < Acquisition_msg_rx > msg_rx ;
2018-07-02 15:43:34 +00:00
try
{
msg_rx = Acquisition_msg_rx_make ( ) ;
}
catch ( const std : : exception & e )
{
2020-07-07 16:53:50 +00:00
std : : cout < < " Failure connecting the message port system: " < < e . what ( ) < < ' \n ' ;
2018-07-02 15:43:34 +00:00
exit ( 0 ) ;
}
2020-02-26 21:40:00 +00:00
msg_rx - > top_block = top_block_acq ;
top_block_acq - > msg_connect ( acquisition - > get_right_block ( ) , pmt : : mp ( " events " ) , msg_rx , pmt : : mp ( " events " ) ) ;
2018-07-02 15:43:34 +00:00
// 5. Run the flowgraph
// Get visible GPS satellites (positive acquisitions with Doppler measurements)
// record startup time
std : : chrono : : time_point < std : : chrono : : system_clock > start , end ;
std : : chrono : : duration < double > elapsed_seconds ;
start = std : : chrono : : system_clock : : now ( ) ;
bool start_msg = true ;
doppler_measurements_map . clear ( ) ;
code_delay_measurements_map . clear ( ) ;
acq_samplestamp_map . clear ( ) ;
2018-08-01 13:51:46 +00:00
unsigned int MAX_PRN_IDX = 0 ;
2018-07-07 13:39:09 +00:00
2018-08-01 13:51:46 +00:00
switch ( tmp_gnss_synchro . System )
{
case ' G ' :
MAX_PRN_IDX = 33 ;
break ;
case ' E ' :
MAX_PRN_IDX = 37 ;
break ;
default :
MAX_PRN_IDX = 33 ;
}
for ( unsigned int PRN = 1 ; PRN < MAX_PRN_IDX ; PRN + + )
2018-07-02 15:43:34 +00:00
{
tmp_gnss_synchro . PRN = PRN ;
acquisition - > set_gnss_synchro ( & tmp_gnss_synchro ) ;
acquisition - > init ( ) ;
acquisition - > set_local_code ( ) ;
acquisition - > reset ( ) ;
2018-07-07 13:39:09 +00:00
acquisition - > set_state ( 1 ) ;
2018-07-02 15:43:34 +00:00
msg_rx - > rx_message = 0 ;
2020-02-26 21:40:00 +00:00
top_block_acq - > run ( ) ;
2018-07-02 15:43:34 +00:00
if ( start_msg = = true )
{
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2020-07-07 16:53:50 +00:00
std : : cout < < " Reading external signal file: " < < FLAGS_signal_file < < ' \n ' ;
2024-04-29 06:27:33 +00:00
# else
std : : cout < < " Reading external signal file: " < < absl : : GetFlag ( FLAGS_signal_file ) < < ' \n ' ;
# endif
2020-07-07 16:53:50 +00:00
std : : cout < < " Searching for " < < System_and_Signal < < " Satellites... \n " ;
2018-07-02 15:43:34 +00:00
std : : cout < < " [ " ;
start_msg = false ;
}
while ( msg_rx - > rx_message = = 0 )
{
usleep ( 100000 ) ;
}
if ( msg_rx - > rx_message = = 1 )
{
std : : cout < < " " < < PRN < < " " ;
doppler_measurements_map . insert ( std : : pair < int , double > ( PRN , tmp_gnss_synchro . Acq_doppler_hz ) ) ;
2018-12-05 15:50:32 +00:00
code_delay_measurements_map . insert ( std : : pair < int , double > ( PRN , tmp_gnss_synchro . Acq_delay_samples ) ) ;
acq_samplestamp_map . insert ( std : : pair < int , double > ( PRN , tmp_gnss_synchro . Acq_samplestamp_samples ) ) ;
2018-07-02 15:43:34 +00:00
}
else
{
std : : cout < < " . " ;
}
2020-02-26 21:40:00 +00:00
top_block_acq - > stop ( ) ;
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2019-08-18 23:29:04 +00:00
file_source - > seek ( 2 * FLAGS_skip_samples , SEEK_SET ) ; // skip head. ibyte, two bytes per complex sample
2024-04-29 06:27:33 +00:00
# else
file_source - > seek ( 2 * absl : : GetFlag ( FLAGS_skip_samples ) , SEEK_SET ) ; // skip head. ibyte, two bytes per complex sample
# endif
2018-07-02 15:43:34 +00:00
std : : cout . flush ( ) ;
}
2020-07-07 16:53:50 +00:00
std : : cout < < " ] \n " ;
2018-07-07 13:39:09 +00:00
std : : cout < < " ------------------------------------------- \n " ;
for ( auto & x : doppler_measurements_map )
{
2018-07-19 14:26:51 +00:00
std : : cout < < " DETECTED SATELLITE " < < System_and_Signal < < " PRN: " < < x . first < < " with Doppler: " < < x . second < < " [Hz], code phase: " < < code_delay_measurements_map . at ( x . first ) < < " [samples] at signal SampleStamp " < < acq_samplestamp_map . at ( x . first ) < < " \n " ;
2018-07-07 13:39:09 +00:00
}
2018-07-02 15:43:34 +00:00
// report the elapsed time
end = std : : chrono : : system_clock : : now ( ) ;
elapsed_seconds = end - start ;
std : : cout < < " Total signal acquisition run time "
< < elapsed_seconds . count ( )
2020-07-07 16:53:50 +00:00
< < " [seconds] \n " ;
2018-07-02 15:43:34 +00:00
return true ;
}
2020-02-26 21:40:00 +00:00
2018-07-19 14:26:51 +00:00
TEST_F ( TrackingPullInTest , ValidationOfResults )
2018-06-24 20:31:44 +00:00
{
2019-08-18 23:29:04 +00:00
// *************************************************
// ***** STEP 1: Prepare the parameters sweep ******
// *************************************************
2024-04-29 06:27:33 +00:00
std : : vector < double > acq_doppler_error_hz_values ;
2019-08-18 23:29:04 +00:00
std : : vector < std : : vector < double > > acq_delay_error_chips_values ; // vector of vector
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2018-07-03 13:18:45 +00:00
for ( double doppler_hz = FLAGS_acq_Doppler_error_hz_start ; doppler_hz > = FLAGS_acq_Doppler_error_hz_stop ; doppler_hz = doppler_hz + FLAGS_acq_Doppler_error_hz_step )
2024-04-29 06:27:33 +00:00
# else
for ( double doppler_hz = absl : : GetFlag ( FLAGS_acq_Doppler_error_hz_start ) ; doppler_hz > = absl : : GetFlag ( FLAGS_acq_Doppler_error_hz_stop ) ; doppler_hz = doppler_hz + absl : : GetFlag ( FLAGS_acq_Doppler_error_hz_step ) )
# endif
2018-06-24 20:31:44 +00:00
{
acq_doppler_error_hz_values . push_back ( doppler_hz ) ;
std : : vector < double > tmp_vector ;
2024-04-29 06:27:33 +00:00
// Code Delay Sweep
# if USE_GLOG_AND_GFLAGS
2018-07-03 13:18:45 +00:00
for ( double code_delay_chips = FLAGS_acq_Delay_error_chips_start ; code_delay_chips > = FLAGS_acq_Delay_error_chips_stop ; code_delay_chips = code_delay_chips + FLAGS_acq_Delay_error_chips_step )
2024-04-29 06:27:33 +00:00
# else
for ( double code_delay_chips = absl : : GetFlag ( FLAGS_acq_Delay_error_chips_start ) ; code_delay_chips > = absl : : GetFlag ( FLAGS_acq_Delay_error_chips_stop ) ; code_delay_chips = code_delay_chips + absl : : GetFlag ( FLAGS_acq_Delay_error_chips_step ) )
# endif
2018-06-24 20:31:44 +00:00
{
tmp_vector . push_back ( code_delay_chips ) ;
}
acq_delay_error_chips_values . push_back ( tmp_vector ) ;
}
2019-08-18 23:29:04 +00:00
// ***********************************************************
// ***** STEP 2: Generate the input signal (if required) *****
// ***********************************************************
2018-06-24 20:31:44 +00:00
std : : vector < double > generator_CN0_values ;
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2018-07-02 15:43:34 +00:00
if ( FLAGS_enable_external_signal_file )
2024-04-29 06:27:33 +00:00
# else
if ( absl : : GetFlag ( FLAGS_enable_external_signal_file ) )
# endif
2018-07-03 13:18:45 +00:00
{
generator_CN0_values . push_back ( 999 ) ; // an external input signal capture is selected, no CN0 information available
}
else
2018-06-24 20:31:44 +00:00
{
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2018-07-02 15:43:34 +00:00
if ( FLAGS_CN0_dBHz_start = = FLAGS_CN0_dBHz_stop )
{
generator_CN0_values . push_back ( FLAGS_CN0_dBHz_start ) ;
}
else
{
for ( double cn0 = FLAGS_CN0_dBHz_start ; cn0 > FLAGS_CN0_dBHz_stop ; cn0 = cn0 - FLAGS_CN0_dB_step )
{
generator_CN0_values . push_back ( cn0 ) ;
}
}
2024-04-29 06:27:33 +00:00
# else
if ( absl : : GetFlag ( FLAGS_CN0_dBHz_start ) = = absl : : GetFlag ( FLAGS_CN0_dBHz_stop ) )
{
generator_CN0_values . push_back ( absl : : GetFlag ( FLAGS_CN0_dBHz_start ) ) ;
}
else
{
for ( double cn0 = absl : : GetFlag ( FLAGS_CN0_dBHz_start ) ; cn0 > absl : : GetFlag ( FLAGS_CN0_dBHz_stop ) ; cn0 = cn0 - absl : : GetFlag ( FLAGS_CN0_dB_step ) )
{
generator_CN0_values . push_back ( cn0 ) ;
}
}
# endif
2018-06-24 20:31:44 +00:00
}
2024-04-29 06:27:33 +00:00
// use generator or use an external capture file
# if USE_GLOG_AND_GFLAGS
2018-06-24 20:31:44 +00:00
if ( FLAGS_enable_external_signal_file )
2024-04-29 06:27:33 +00:00
# else
if ( absl : : GetFlag ( FLAGS_enable_external_signal_file ) )
# endif
2018-06-24 20:31:44 +00:00
{
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2019-08-18 23:29:04 +00:00
// create and configure an acquisition block and perform an acquisition to obtain the synchronization parameters
2018-08-01 07:55:59 +00:00
ASSERT_EQ ( acquire_signal ( FLAGS_test_satellite_PRN ) , true ) ;
2018-07-03 13:18:45 +00:00
bool found_satellite = doppler_measurements_map . find ( FLAGS_test_satellite_PRN ) ! = doppler_measurements_map . end ( ) ;
EXPECT_TRUE ( found_satellite ) < < " Error: satellite SV: " < < FLAGS_test_satellite_PRN < < " is not acquired " ;
2024-04-29 06:27:33 +00:00
# else
ASSERT_EQ ( acquire_signal ( absl : : GetFlag ( FLAGS_test_satellite_PRN ) ) , true ) ;
bool found_satellite = doppler_measurements_map . find ( absl : : GetFlag ( FLAGS_test_satellite_PRN ) ) ! = doppler_measurements_map . end ( ) ;
EXPECT_TRUE ( found_satellite ) < < " Error: satellite SV: " < < absl : : GetFlag ( FLAGS_test_satellite_PRN ) < < " is not acquired " ;
# endif
2019-02-11 20:13:02 +00:00
if ( ! found_satellite )
{
return ;
}
2018-06-24 20:31:44 +00:00
}
else
{
for ( unsigned int current_cn0_idx = 0 ; current_cn0_idx < generator_CN0_values . size ( ) ; current_cn0_idx + + )
{
// Configure the signal generator
configure_generator ( generator_CN0_values . at ( current_cn0_idx ) , current_cn0_idx ) ;
// Generate signal raw signal samples and observations RINEX file
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2018-06-24 20:31:44 +00:00
if ( FLAGS_disable_generator = = false )
2024-04-29 06:27:33 +00:00
# else
if ( absl : : GetFlag ( FLAGS_disable_generator ) = = false )
# endif
2018-06-24 20:31:44 +00:00
{
generate_signal ( ) ;
}
}
}
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2018-06-24 20:31:44 +00:00
configure_receiver ( FLAGS_PLL_bw_hz_start ,
FLAGS_DLL_bw_hz_start ,
FLAGS_PLL_narrow_bw_hz ,
FLAGS_DLL_narrow_bw_hz ,
FLAGS_extend_correlation_symbols ) ;
2024-04-29 06:27:33 +00:00
# else
configure_receiver ( absl : : GetFlag ( FLAGS_PLL_bw_hz_start ) ,
absl : : GetFlag ( FLAGS_DLL_bw_hz_start ) ,
absl : : GetFlag ( FLAGS_PLL_narrow_bw_hz ) ,
absl : : GetFlag ( FLAGS_DLL_narrow_bw_hz ) ,
absl : : GetFlag ( FLAGS_extend_correlation_symbols ) ) ;
# endif
2018-06-24 20:31:44 +00:00
2019-08-18 23:29:04 +00:00
// ******************************************************************************************
// ***** Obtain the initial signal sinchronization parameters (emulating an acquisition) ****
// ******************************************************************************************
2018-06-24 20:31:44 +00:00
int test_satellite_PRN = 0 ;
2018-07-02 15:43:34 +00:00
double true_acq_doppler_hz = 0.0 ;
double true_acq_delay_samples = 0.0 ;
2018-08-10 19:16:10 +00:00
uint64_t acq_samplestamp_samples = 0 ;
2018-07-02 15:43:34 +00:00
2019-02-22 14:57:15 +00:00
Tracking_True_Obs_Reader true_obs_data ;
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2018-06-24 20:31:44 +00:00
if ( ! FLAGS_enable_external_signal_file )
{
test_satellite_PRN = FLAGS_test_satellite_PRN ;
2024-04-29 06:27:33 +00:00
# else
if ( ! absl : : GetFlag ( FLAGS_enable_external_signal_file ) )
{
test_satellite_PRN = absl : : GetFlag ( FLAGS_test_satellite_PRN ) ;
# endif
2018-06-24 20:31:44 +00:00
std : : string true_obs_file = std : : string ( " ./gps_l1_ca_obs_prn " ) ;
true_obs_file . append ( std : : to_string ( test_satellite_PRN ) ) ;
true_obs_file . append ( " .dat " ) ;
true_obs_data . close_obs_file ( ) ;
ASSERT_EQ ( true_obs_data . open_obs_file ( true_obs_file ) , true ) < < " Failure opening true observables file " ;
// load acquisition data based on the first epoch of the true observations
ASSERT_EQ ( true_obs_data . read_binary_obs ( ) , true )
2020-07-07 16:53:50 +00:00
< < " Failure reading true tracking dump file. \n "
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2018-06-24 20:31:44 +00:00
< < " Maybe sat PRN # " + std : : to_string ( FLAGS_test_satellite_PRN ) +
2024-04-29 06:27:33 +00:00
# else
< < " Maybe sat PRN # " + std : : to_string ( absl : : GetFlag ( FLAGS_test_satellite_PRN ) ) +
# endif
2018-06-24 20:31:44 +00:00
" is not available? " ;
2020-07-07 16:53:50 +00:00
std : : cout < < " Testing satellite PRN= " < < test_satellite_PRN < < ' \n ' ;
std : : cout < < " True Initial Doppler " < < true_obs_data . doppler_l1_hz < < " [Hz], true Initial code delay [Chips]= " < < true_obs_data . prn_delay_chips < < " [Chips] \n " ;
2018-07-02 15:43:34 +00:00
true_acq_doppler_hz = true_obs_data . doppler_l1_hz ;
2019-08-31 09:37:29 +00:00
true_acq_delay_samples = ( GPS_L1_CA_CODE_LENGTH_CHIPS - true_obs_data . prn_delay_chips / GPS_L1_CA_CODE_LENGTH_CHIPS ) * static_cast < double > ( baseband_sampling_freq ) * GPS_L1_CA_CODE_PERIOD_S ;
2018-07-02 15:43:34 +00:00
acq_samplestamp_samples = 0 ;
2018-06-24 20:31:44 +00:00
}
else
{
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2018-07-02 15:43:34 +00:00
true_acq_doppler_hz = doppler_measurements_map . find ( FLAGS_test_satellite_PRN ) - > second ;
true_acq_delay_samples = code_delay_measurements_map . find ( FLAGS_test_satellite_PRN ) - > second ;
2024-04-29 06:27:33 +00:00
# else
true_acq_doppler_hz = doppler_measurements_map . find ( absl : : GetFlag ( FLAGS_test_satellite_PRN ) ) - > second ;
true_acq_delay_samples = code_delay_measurements_map . find ( absl : : GetFlag ( FLAGS_test_satellite_PRN ) ) - > second ;
# endif
2018-07-04 14:56:47 +00:00
acq_samplestamp_samples = 0 ;
std : : cout < < " Estimated Initial Doppler " < < true_acq_doppler_hz
< < " [Hz], estimated Initial code delay " < < true_acq_delay_samples < < " [Samples] "
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2020-07-07 16:53:50 +00:00
< < " Acquisition SampleStamp is " < < acq_samplestamp_map . find ( FLAGS_test_satellite_PRN ) - > second < < ' \n ' ;
2024-04-29 06:27:33 +00:00
# else
< < " Acquisition SampleStamp is " < < acq_samplestamp_map . find ( absl : : GetFlag ( FLAGS_test_satellite_PRN ) ) - > second < < ' \n ' ;
# endif
2018-06-24 20:31:44 +00:00
}
2018-11-14 17:28:14 +00:00
// create the msg queue for valve
2019-07-18 17:29:14 +00:00
queue = std : : make_shared < Concurrent_Queue < pmt : : pmt_t > > ( ) ;
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2018-11-14 17:28:14 +00:00
long long int acq_to_trk_delay_samples = ceil ( static_cast < double > ( FLAGS_fs_gen_sps ) * FLAGS_acq_to_trk_delay_s ) ;
2024-04-29 06:27:33 +00:00
# else
long long int acq_to_trk_delay_samples = ceil ( static_cast < double > ( absl : : GetFlag ( FLAGS_fs_gen_sps ) ) * absl : : GetFlag ( FLAGS_acq_to_trk_delay_s ) ) ;
# endif
2020-06-18 09:49:28 +00:00
auto resetable_valve_ = gnss_sdr_make_valve ( sizeof ( gr_complex ) , acq_to_trk_delay_samples , queue . get ( ) , false ) ;
2018-11-14 17:28:14 +00:00
2019-08-18 23:29:04 +00:00
// CN0 LOOP
2018-06-24 20:31:44 +00:00
std : : vector < std : : vector < double > > pull_in_results_v_v ;
2018-07-02 15:43:34 +00:00
2018-06-24 20:31:44 +00:00
for ( unsigned int current_cn0_idx = 0 ; current_cn0_idx < generator_CN0_values . size ( ) ; current_cn0_idx + + )
{
std : : vector < double > pull_in_results_v ;
for ( unsigned int current_acq_doppler_error_idx = 0 ; current_acq_doppler_error_idx < acq_doppler_error_hz_values . size ( ) ; current_acq_doppler_error_idx + + )
{
for ( unsigned int current_acq_code_error_idx = 0 ; current_acq_code_error_idx < acq_delay_error_chips_values . at ( current_acq_doppler_error_idx ) . size ( ) ; current_acq_code_error_idx + + )
{
2018-07-02 15:43:34 +00:00
gnss_synchro . Acq_samplestamp_samples = acq_samplestamp_samples ;
2019-08-18 23:29:04 +00:00
// simulate a Doppler error in acquisition
2018-07-02 15:43:34 +00:00
gnss_synchro . Acq_doppler_hz = true_acq_doppler_hz + acq_doppler_error_hz_values . at ( current_acq_doppler_error_idx ) ;
2019-08-18 23:29:04 +00:00
// simulate Code Delay error in acquisition
2019-08-31 09:37:29 +00:00
gnss_synchro . Acq_delay_samples = true_acq_delay_samples + ( acq_delay_error_chips_values . at ( current_acq_doppler_error_idx ) . at ( current_acq_code_error_idx ) / GPS_L1_CA_CODE_RATE_CPS ) * static_cast < double > ( baseband_sampling_freq ) ;
2018-06-24 20:31:44 +00:00
2019-08-18 23:29:04 +00:00
// create flowgraph
2020-02-26 21:40:00 +00:00
auto top_block_trk = gr : : make_top_block ( " Tracking test " ) ;
2020-07-13 13:17:15 +00:00
std : : shared_ptr < GNSSBlockInterface > trk_ = factory - > GetBlock ( config . get ( ) , " Tracking " , 1 , 1 ) ;
2018-06-24 20:31:44 +00:00
std : : shared_ptr < TrackingInterface > tracking = std : : dynamic_pointer_cast < TrackingInterface > ( trk_ ) ;
2020-04-02 21:59:35 +00:00
auto msg_rx = TrackingPullInTest_msg_rx_make ( ) ;
2018-06-24 20:31:44 +00:00
ASSERT_NO_THROW ( {
tracking - > set_channel ( gnss_synchro . Channel_ID ) ;
} ) < < " Failure setting channel. " ;
ASSERT_NO_THROW ( {
tracking - > set_gnss_synchro ( & gnss_synchro ) ;
} ) < < " Failure setting gnss_synchro. " ;
ASSERT_NO_THROW ( {
2020-02-26 21:40:00 +00:00
tracking - > connect ( top_block_trk ) ;
2018-06-24 20:31:44 +00:00
} ) < < " Failure connecting tracking to the top_block. " ;
2018-07-02 15:43:34 +00:00
std : : string file ;
2018-06-24 20:31:44 +00:00
ASSERT_NO_THROW ( {
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2018-07-02 15:43:34 +00:00
if ( ! FLAGS_enable_external_signal_file )
2024-04-29 06:27:33 +00:00
# else
if ( ! absl : : GetFlag ( FLAGS_enable_external_signal_file ) )
# endif
2018-07-02 15:43:34 +00:00
{
file = " ./ " + filename_raw_data + std : : to_string ( current_cn0_idx ) ;
}
else
{
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2018-07-03 13:18:45 +00:00
file = FLAGS_signal_file ;
2024-04-29 06:27:33 +00:00
# else
file = absl : : GetFlag ( FLAGS_signal_file ) ;
# endif
2018-07-02 15:43:34 +00:00
}
2018-06-24 20:31:44 +00:00
const char * file_name = file . c_str ( ) ;
gr : : blocks : : file_source : : sptr file_source = gr : : blocks : : file_source : : make ( sizeof ( int8_t ) , file_name , false ) ;
gr : : blocks : : interleaved_char_to_complex : : sptr gr_interleaved_char_to_complex = gr : : blocks : : interleaved_char_to_complex : : make ( ) ;
gr : : blocks : : null_sink : : sptr sink = gr : : blocks : : null_sink : : make ( sizeof ( Gnss_Synchro ) ) ;
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2018-07-07 13:39:09 +00:00
gr : : blocks : : head : : sptr head_samples = gr : : blocks : : head : : make ( sizeof ( gr_complex ) , baseband_sampling_freq * FLAGS_duration ) ;
2024-04-29 06:27:33 +00:00
# else
gr : : blocks : : head : : sptr head_samples = gr : : blocks : : head : : make ( sizeof ( gr_complex ) , baseband_sampling_freq * absl : : GetFlag ( FLAGS_duration ) ) ;
# endif
2020-02-26 21:40:00 +00:00
top_block_trk - > connect ( file_source , 0 , gr_interleaved_char_to_complex , 0 ) ;
top_block_trk - > connect ( gr_interleaved_char_to_complex , 0 , head_samples , 0 ) ;
2018-11-14 17:28:14 +00:00
if ( acq_to_trk_delay_samples > 0 )
{
2020-02-26 21:40:00 +00:00
top_block_trk - > connect ( head_samples , 0 , resetable_valve_ , 0 ) ;
top_block_trk - > connect ( resetable_valve_ , 0 , tracking - > get_left_block ( ) , 0 ) ;
2018-11-14 17:28:14 +00:00
}
else
{
2020-02-26 21:40:00 +00:00
top_block_trk - > connect ( head_samples , 0 , tracking - > get_left_block ( ) , 0 ) ;
2018-11-14 17:28:14 +00:00
}
2020-02-26 21:40:00 +00:00
top_block_trk - > connect ( tracking - > get_right_block ( ) , 0 , sink , 0 ) ;
top_block_trk - > msg_connect ( tracking - > get_right_block ( ) , pmt : : mp ( " events " ) , msg_rx , pmt : : mp ( " events " ) ) ;
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2019-08-18 23:29:04 +00:00
file_source - > seek ( 2 * FLAGS_skip_samples , 0 ) ; // skip head. ibyte, two bytes per complex sample
2024-04-29 06:27:33 +00:00
# else
file_source - > seek ( 2 * absl : : GetFlag ( FLAGS_skip_samples ) , 0 ) ; // skip head. ibyte, two bytes per complex sample
# endif
2018-06-24 20:31:44 +00:00
} ) < < " Failure connecting the blocks of tracking test. " ;
2019-08-18 23:29:04 +00:00
// ********************************************************************
// ***** STEP 5: Perform the signal tracking and read the results *****
// ********************************************************************
2020-07-07 16:53:50 +00:00
std : : cout < < " --- START TRACKING WITH PULL-IN ERROR: " < < acq_doppler_error_hz_values . at ( current_acq_doppler_error_idx ) < < " [Hz] and " < < acq_delay_error_chips_values . at ( current_acq_doppler_error_idx ) . at ( current_acq_code_error_idx ) < < " [Chips] --- \n " ;
2018-06-24 20:31:44 +00:00
std : : chrono : : time_point < std : : chrono : : system_clock > start , end ;
2018-11-14 17:28:14 +00:00
if ( acq_to_trk_delay_samples > 0 )
{
EXPECT_NO_THROW ( {
start = std : : chrono : : system_clock : : now ( ) ;
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2018-11-14 17:28:14 +00:00
std : : cout < < " --- SIMULATING A PULL-IN DELAY OF " < < FLAGS_acq_to_trk_delay_s < < " SECONDS --- \n " ;
2024-04-29 06:27:33 +00:00
# else
std : : cout < < " --- SIMULATING A PULL-IN DELAY OF " < < absl : : GetFlag ( FLAGS_acq_to_trk_delay_s ) < < " SECONDS --- \n " ;
# endif
2020-02-26 21:40:00 +00:00
top_block_trk - > start ( ) ;
2018-11-14 17:28:14 +00:00
std : : cout < < " Waiting for valve... \n " ;
2019-08-18 23:29:04 +00:00
// wait the valve message indicating the circulation of the amount of samples of the delay
2019-07-17 13:56:30 +00:00
pmt : : pmt_t msg ;
queue - > wait_and_pop ( msg ) ;
2018-11-14 17:28:14 +00:00
std : : cout < < " Starting tracking... \n " ;
tracking - > start_tracking ( ) ;
resetable_valve_ - > open_valve ( ) ;
std : : cout < < " Waiting flowgraph.. \n " ;
2020-02-26 21:40:00 +00:00
top_block_trk - > wait ( ) ;
2018-11-14 17:28:14 +00:00
end = std : : chrono : : system_clock : : now ( ) ;
} ) < < " Failure running the top_block. " ;
}
else
{
tracking - > start_tracking ( ) ;
EXPECT_NO_THROW ( {
start = std : : chrono : : system_clock : : now ( ) ;
2020-02-26 21:40:00 +00:00
top_block_trk - > run ( ) ; // Start threads and wait
2018-11-14 17:28:14 +00:00
end = std : : chrono : : system_clock : : now ( ) ;
} ) < < " Failure running the top_block. " ;
}
2018-06-24 20:31:44 +00:00
std : : chrono : : duration < double > elapsed_seconds = end - start ;
2020-07-07 16:53:50 +00:00
std : : cout < < " Signal tracking completed in " < < elapsed_seconds . count ( ) < < " seconds \n " ;
2018-06-24 20:31:44 +00:00
2019-08-18 23:29:04 +00:00
pull_in_results_v . push_back ( msg_rx - > rx_message ! = 3 ) ; // save last asynchronous tracking message in order to detect a loss of lock
2018-06-24 20:31:44 +00:00
2024-04-29 06:27:33 +00:00
// ********************************
// ***** STEP 7: Plot results *****
// ********************************
# if USE_GLOG_AND_GFLAGS
2018-07-03 13:18:45 +00:00
if ( FLAGS_plot_detail_level > = 2 and FLAGS_show_plots )
2024-04-29 06:27:33 +00:00
# else
if ( absl : : GetFlag ( FLAGS_plot_detail_level ) > = 2 and absl : : GetFlag ( FLAGS_show_plots ) )
# endif
2018-06-24 20:31:44 +00:00
{
2019-08-18 23:29:04 +00:00
// load the measured values
2019-02-22 14:57:15 +00:00
Tracking_Dump_Reader trk_dump ;
2018-06-24 20:31:44 +00:00
ASSERT_EQ ( trk_dump . open_obs_file ( std : : string ( " ./tracking_ch_0.dat " ) ) , true )
< < " Failure opening tracking dump file " ;
2018-08-10 19:16:10 +00:00
int64_t n_measured_epochs = trk_dump . num_epochs ( ) ;
2019-08-18 23:29:04 +00:00
// todo: use vectors instead
2018-06-24 20:31:44 +00:00
arma : : vec trk_timestamp_s = arma : : zeros ( n_measured_epochs , 1 ) ;
arma : : vec trk_acc_carrier_phase_cycles = arma : : zeros ( n_measured_epochs , 1 ) ;
arma : : vec trk_Doppler_Hz = arma : : zeros ( n_measured_epochs , 1 ) ;
arma : : vec trk_prn_delay_chips = arma : : zeros ( n_measured_epochs , 1 ) ;
std : : vector < double > timestamp_s ;
std : : vector < double > prompt ;
std : : vector < double > early ;
std : : vector < double > late ;
2018-07-20 09:06:39 +00:00
std : : vector < double > v_early ;
std : : vector < double > v_late ;
2018-06-24 20:31:44 +00:00
std : : vector < double > promptI ;
std : : vector < double > promptQ ;
std : : vector < double > CN0_dBHz ;
2018-08-07 18:16:43 +00:00
std : : vector < double > Doppler ;
2018-08-10 19:16:10 +00:00
int64_t epoch_counter = 0 ;
2018-06-24 20:31:44 +00:00
while ( trk_dump . read_binary_obs ( ) )
{
trk_timestamp_s ( epoch_counter ) = static_cast < double > ( trk_dump . PRN_start_sample_count ) / static_cast < double > ( baseband_sampling_freq ) ;
2020-07-05 18:20:02 +00:00
trk_acc_carrier_phase_cycles ( epoch_counter ) = trk_dump . acc_carrier_phase_rad / TWO_PI ;
2018-06-24 20:31:44 +00:00
trk_Doppler_Hz ( epoch_counter ) = trk_dump . carrier_doppler_hz ;
double delay_chips = GPS_L1_CA_CODE_LENGTH_CHIPS - GPS_L1_CA_CODE_LENGTH_CHIPS * ( fmod ( ( static_cast < double > ( trk_dump . PRN_start_sample_count ) + trk_dump . aux1 ) / static_cast < double > ( baseband_sampling_freq ) , 1.0e-3 ) / 1.0e-3 ) ;
trk_prn_delay_chips ( epoch_counter ) = delay_chips ;
timestamp_s . push_back ( trk_timestamp_s ( epoch_counter ) ) ;
prompt . push_back ( trk_dump . abs_P ) ;
early . push_back ( trk_dump . abs_E ) ;
late . push_back ( trk_dump . abs_L ) ;
2018-07-20 09:06:39 +00:00
v_early . push_back ( trk_dump . abs_VE ) ;
v_late . push_back ( trk_dump . abs_VL ) ;
2018-06-24 20:31:44 +00:00
promptI . push_back ( trk_dump . prompt_I ) ;
promptQ . push_back ( trk_dump . prompt_Q ) ;
CN0_dBHz . push_back ( trk_dump . CN0_SNV_dB_Hz ) ;
2018-08-07 18:16:43 +00:00
Doppler . push_back ( trk_dump . carrier_doppler_hz ) ;
2018-06-24 20:31:44 +00:00
epoch_counter + + ;
}
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2018-06-24 20:31:44 +00:00
const std : : string gnuplot_executable ( FLAGS_gnuplot_executable ) ;
2024-04-29 06:27:33 +00:00
# else
const std : : string gnuplot_executable ( absl : : GetFlag ( FLAGS_gnuplot_executable ) ) ;
# endif
2018-06-24 20:31:44 +00:00
if ( gnuplot_executable . empty ( ) )
{
2020-07-07 16:53:50 +00:00
std : : cout < < " WARNING: Although the flag show_plots has been set to TRUE, \n " ;
std : : cout < < " gnuplot has not been found in your system. \n " ;
std : : cout < < " Test results will not be plotted. \n " ;
2018-06-24 20:31:44 +00:00
}
else
{
try
{
2019-06-10 19:41:13 +00:00
fs : : path p ( gnuplot_executable ) ;
fs : : path dir = p . parent_path ( ) ;
2019-02-11 17:38:42 +00:00
const std : : string & gnuplot_path = dir . native ( ) ;
2018-06-24 20:31:44 +00:00
Gnuplot : : set_GNUPlotPath ( gnuplot_path ) ;
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2019-02-11 17:38:42 +00:00
auto decimate = static_cast < unsigned int > ( FLAGS_plot_decimate ) ;
2018-06-24 20:31:44 +00:00
2018-07-02 15:43:34 +00:00
if ( FLAGS_plot_detail_level > = 2 and FLAGS_show_plots )
2018-06-24 20:31:44 +00:00
{
Gnuplot g1 ( " linespoints " ) ;
2018-07-02 15:43:34 +00:00
g1 . showonscreen ( ) ; // window output
if ( ! FLAGS_enable_external_signal_file )
{
g1 . set_title ( std : : to_string ( generator_CN0_values . at ( current_cn0_idx ) ) + " dB-Hz, " + " PLL/DLL BW: " + std : : to_string ( FLAGS_PLL_bw_hz_start ) + " , " + std : : to_string ( FLAGS_DLL_bw_hz_start ) + " [Hz], GPS L1 C/A (PRN # " + std : : to_string ( FLAGS_test_satellite_PRN ) + " ) " ) ;
}
else
{
2018-08-01 07:55:59 +00:00
g1 . set_title ( " D_e= " + std : : to_string ( acq_doppler_error_hz_values . at ( current_acq_doppler_error_idx ) ) + " [Hz] " + " T_e= " + std : : to_string ( acq_delay_error_chips_values . at ( current_acq_doppler_error_idx ) . at ( current_acq_code_error_idx ) ) + " [Chips], PLL/DLL BW: " + std : : to_string ( FLAGS_PLL_bw_hz_start ) + " , " + std : : to_string ( FLAGS_DLL_bw_hz_start ) + " [Hz], (PRN # " + std : : to_string ( FLAGS_test_satellite_PRN ) + " ) " ) ;
2018-07-02 15:43:34 +00:00
}
2024-04-29 06:27:33 +00:00
# else
auto decimate = static_cast < unsigned int > ( absl : : GetFlag ( FLAGS_plot_decimate ) ) ;
if ( absl : : GetFlag ( FLAGS_plot_detail_level ) > = 2 and absl : : GetFlag ( FLAGS_show_plots ) )
{
Gnuplot g1 ( " linespoints " ) ;
g1 . showonscreen ( ) ; // window output
if ( ! absl : : GetFlag ( FLAGS_enable_external_signal_file ) )
{
g1 . set_title ( std : : to_string ( generator_CN0_values . at ( current_cn0_idx ) ) + " dB-Hz, " + " PLL/DLL BW: " + std : : to_string ( absl : : GetFlag ( FLAGS_PLL_bw_hz_start ) ) + " , " + std : : to_string ( absl : : GetFlag ( FLAGS_DLL_bw_hz_start ) ) + " [Hz], GPS L1 C/A (PRN # " + std : : to_string ( absl : : GetFlag ( FLAGS_test_satellite_PRN ) ) + " ) " ) ;
}
else
{
g1 . set_title ( " D_e= " + std : : to_string ( acq_doppler_error_hz_values . at ( current_acq_doppler_error_idx ) ) + " [Hz] " + " T_e= " + std : : to_string ( acq_delay_error_chips_values . at ( current_acq_doppler_error_idx ) . at ( current_acq_code_error_idx ) ) + " [Chips], PLL/DLL BW: " + std : : to_string ( absl : : GetFlag ( FLAGS_PLL_bw_hz_start ) ) + " , " + std : : to_string ( absl : : GetFlag ( FLAGS_DLL_bw_hz_start ) ) + " [Hz], (PRN # " + std : : to_string ( absl : : GetFlag ( FLAGS_test_satellite_PRN ) ) + " ) " ) ;
}
# endif
2018-07-02 15:43:34 +00:00
2018-06-24 20:31:44 +00:00
g1 . set_grid ( ) ;
g1 . set_xlabel ( " Time [s] " ) ;
g1 . set_ylabel ( " Correlators' output " ) ;
2019-08-18 23:29:04 +00:00
// g1.cmd("set key box opaque");
2018-06-24 20:31:44 +00:00
g1 . plot_xy ( trk_timestamp_s , prompt , " Prompt " , decimate ) ;
g1 . plot_xy ( trk_timestamp_s , early , " Early " , decimate ) ;
g1 . plot_xy ( trk_timestamp_s , late , " Late " , decimate ) ;
2019-02-11 17:38:42 +00:00
if ( implementation = = " Galileo_E1_DLL_PLL_VEML_Tracking " )
2018-07-20 09:06:39 +00:00
{
g1 . plot_xy ( trk_timestamp_s , v_early , " Very Early " , decimate ) ;
g1 . plot_xy ( trk_timestamp_s , v_late , " Very Late " , decimate ) ;
}
2018-06-24 20:31:44 +00:00
g1 . set_legend ( ) ;
2018-08-01 07:55:59 +00:00
g1 . savetops ( " Correlators_outputs " ) ;
2018-06-24 20:31:44 +00:00
Gnuplot g2 ( " points " ) ;
2018-07-02 15:43:34 +00:00
g2 . showonscreen ( ) ; // window output
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2018-07-02 15:43:34 +00:00
if ( ! FLAGS_enable_external_signal_file )
{
2018-08-01 07:55:59 +00:00
g2 . set_title ( std : : to_string ( generator_CN0_values . at ( current_cn0_idx ) ) + " dB-Hz Constellation " + " PLL/DLL BW: " + std : : to_string ( FLAGS_PLL_bw_hz_start ) + " , " + std : : to_string ( FLAGS_DLL_bw_hz_start ) + " [Hz], (PRN # " + std : : to_string ( FLAGS_test_satellite_PRN ) + " ) " ) ;
2018-07-02 15:43:34 +00:00
}
else
{
2018-08-01 07:55:59 +00:00
g2 . set_title ( " D_e= " + std : : to_string ( acq_doppler_error_hz_values . at ( current_acq_doppler_error_idx ) ) + " [Hz] " + " T_e= " + std : : to_string ( acq_delay_error_chips_values . at ( current_acq_doppler_error_idx ) . at ( current_acq_code_error_idx ) ) + " [Chips], PLL/DLL BW: " + std : : to_string ( FLAGS_PLL_bw_hz_start ) + " , " + std : : to_string ( FLAGS_DLL_bw_hz_start ) + " [Hz], (PRN # " + std : : to_string ( FLAGS_test_satellite_PRN ) + " ) " ) ;
2018-07-02 15:43:34 +00:00
}
2024-04-29 06:27:33 +00:00
# else
if ( ! absl : : GetFlag ( FLAGS_enable_external_signal_file ) )
{
g2 . set_title ( std : : to_string ( generator_CN0_values . at ( current_cn0_idx ) ) + " dB-Hz Constellation " + " PLL/DLL BW: " + std : : to_string ( absl : : GetFlag ( FLAGS_PLL_bw_hz_start ) ) + " , " + std : : to_string ( absl : : GetFlag ( FLAGS_DLL_bw_hz_start ) ) + " [Hz], (PRN # " + std : : to_string ( absl : : GetFlag ( FLAGS_test_satellite_PRN ) ) + " ) " ) ;
}
else
{
g2 . set_title ( " D_e= " + std : : to_string ( acq_doppler_error_hz_values . at ( current_acq_doppler_error_idx ) ) + " [Hz] " + " T_e= " + std : : to_string ( acq_delay_error_chips_values . at ( current_acq_doppler_error_idx ) . at ( current_acq_code_error_idx ) ) + " [Chips], PLL/DLL BW: " + std : : to_string ( absl : : GetFlag ( FLAGS_PLL_bw_hz_start ) ) + " , " + std : : to_string ( absl : : GetFlag ( FLAGS_DLL_bw_hz_start ) ) + " [Hz], (PRN # " + std : : to_string ( absl : : GetFlag ( FLAGS_test_satellite_PRN ) ) + " ) " ) ;
}
# endif
2018-06-24 20:31:44 +00:00
g2 . set_grid ( ) ;
g2 . set_xlabel ( " Inphase " ) ;
g2 . set_ylabel ( " Quadrature " ) ;
2019-08-18 23:29:04 +00:00
// g2.cmd("set size ratio -1");
2018-06-24 20:31:44 +00:00
g2 . plot_xy ( promptI , promptQ ) ;
2018-08-01 07:55:59 +00:00
g2 . savetops ( " Constellation " ) ;
2018-06-24 20:31:44 +00:00
Gnuplot g3 ( " linespoints " ) ;
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2018-07-02 15:43:34 +00:00
if ( ! FLAGS_enable_external_signal_file )
{
g3 . set_title ( std : : to_string ( generator_CN0_values . at ( current_cn0_idx ) ) + " dB-Hz, GPS L1 C/A tracking CN0 output (PRN # " + std : : to_string ( FLAGS_test_satellite_PRN ) + " ) " ) ;
}
else
{
2018-08-01 07:55:59 +00:00
g3 . set_title ( " D_e= " + std : : to_string ( acq_doppler_error_hz_values . at ( current_acq_doppler_error_idx ) ) + " [Hz] " + " T_e= " + std : : to_string ( acq_delay_error_chips_values . at ( current_acq_doppler_error_idx ) . at ( current_acq_code_error_idx ) ) + " [Chips] PLL/DLL BW: " + std : : to_string ( FLAGS_PLL_bw_hz_start ) + " , " + std : : to_string ( FLAGS_DLL_bw_hz_start ) + " [Hz], (PRN # " + std : : to_string ( FLAGS_test_satellite_PRN ) + " ) " ) ;
2018-07-02 15:43:34 +00:00
}
2024-04-29 06:27:33 +00:00
# else
if ( ! absl : : GetFlag ( FLAGS_enable_external_signal_file ) )
{
g3 . set_title ( std : : to_string ( generator_CN0_values . at ( current_cn0_idx ) ) + " dB-Hz, GPS L1 C/A tracking CN0 output (PRN # " + std : : to_string ( absl : : GetFlag ( FLAGS_test_satellite_PRN ) ) + " ) " ) ;
}
else
{
g3 . set_title ( " D_e= " + std : : to_string ( acq_doppler_error_hz_values . at ( current_acq_doppler_error_idx ) ) + " [Hz] " + " T_e= " + std : : to_string ( acq_delay_error_chips_values . at ( current_acq_doppler_error_idx ) . at ( current_acq_code_error_idx ) ) + " [Chips] PLL/DLL BW: " + std : : to_string ( absl : : GetFlag ( FLAGS_PLL_bw_hz_start ) ) + " , " + std : : to_string ( absl : : GetFlag ( FLAGS_DLL_bw_hz_start ) ) + " [Hz], (PRN # " + std : : to_string ( absl : : GetFlag ( FLAGS_test_satellite_PRN ) ) + " ) " ) ;
}
# endif
2018-06-24 20:31:44 +00:00
g3 . set_grid ( ) ;
g3 . set_xlabel ( " Time [s] " ) ;
g3 . set_ylabel ( " Reported CN0 [dB-Hz] " ) ;
g3 . cmd ( " set key box opaque " ) ;
g3 . plot_xy ( trk_timestamp_s , CN0_dBHz ,
std : : to_string ( static_cast < int > ( round ( generator_CN0_values . at ( current_cn0_idx ) ) ) ) + " [dB-Hz] " , decimate ) ;
g3 . set_legend ( ) ;
2018-08-01 07:55:59 +00:00
g3 . savetops ( " CN0_output " ) ;
2018-07-02 15:43:34 +00:00
g3 . showonscreen ( ) ; // window output
2018-08-07 18:16:43 +00:00
Gnuplot g4 ( " linespoints " ) ;
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2018-08-07 18:16:43 +00:00
if ( ! FLAGS_enable_external_signal_file )
{
g4 . set_title ( std : : to_string ( generator_CN0_values . at ( current_cn0_idx ) ) + " dB-Hz, GPS L1 C/A tracking CN0 output (PRN # " + std : : to_string ( FLAGS_test_satellite_PRN ) + " ) " ) ;
}
else
{
g4 . set_title ( " D_e= " + std : : to_string ( acq_doppler_error_hz_values . at ( current_acq_doppler_error_idx ) ) + " [Hz] " + " T_e= " + std : : to_string ( acq_delay_error_chips_values . at ( current_acq_doppler_error_idx ) . at ( current_acq_code_error_idx ) ) + " [Chips] PLL/DLL BW: " + std : : to_string ( FLAGS_PLL_bw_hz_start ) + " , " + std : : to_string ( FLAGS_DLL_bw_hz_start ) + " [Hz], (PRN # " + std : : to_string ( FLAGS_test_satellite_PRN ) + " ) " ) ;
}
2024-04-29 06:27:33 +00:00
# else
if ( ! absl : : GetFlag ( FLAGS_enable_external_signal_file ) )
{
g4 . set_title ( std : : to_string ( generator_CN0_values . at ( current_cn0_idx ) ) + " dB-Hz, GPS L1 C/A tracking CN0 output (PRN # " + std : : to_string ( absl : : GetFlag ( FLAGS_test_satellite_PRN ) ) + " ) " ) ;
}
else
{
g4 . set_title ( " D_e= " + std : : to_string ( acq_doppler_error_hz_values . at ( current_acq_doppler_error_idx ) ) + " [Hz] " + " T_e= " + std : : to_string ( acq_delay_error_chips_values . at ( current_acq_doppler_error_idx ) . at ( current_acq_code_error_idx ) ) + " [Chips] PLL/DLL BW: " + std : : to_string ( absl : : GetFlag ( FLAGS_PLL_bw_hz_start ) ) + " , " + std : : to_string ( absl : : GetFlag ( FLAGS_DLL_bw_hz_start ) ) + " [Hz], (PRN # " + std : : to_string ( absl : : GetFlag ( FLAGS_test_satellite_PRN ) ) + " ) " ) ;
}
# endif
2018-08-07 18:16:43 +00:00
g4 . set_grid ( ) ;
g4 . set_xlabel ( " Time [s] " ) ;
g4 . set_ylabel ( " Estimated Doppler [Hz] " ) ;
g4 . cmd ( " set key box opaque " ) ;
g4 . plot_xy ( trk_timestamp_s , Doppler ,
std : : to_string ( static_cast < int > ( round ( generator_CN0_values . at ( current_cn0_idx ) ) ) ) + " [dB-Hz] " , decimate ) ;
g4 . set_legend ( ) ;
g4 . savetops ( " Doppler " ) ;
g4 . showonscreen ( ) ; // window output
2018-06-24 20:31:44 +00:00
}
}
catch ( const GnuplotException & ge )
{
2020-07-07 16:53:50 +00:00
std : : cout < < ge . what ( ) < < ' \n ' ;
2018-06-24 20:31:44 +00:00
}
}
2019-08-18 23:29:04 +00:00
} // end plot
} // end acquisition Delay errors loop
} // end acquisition Doppler errors loop
2018-06-24 20:31:44 +00:00
pull_in_results_v_v . push_back ( pull_in_results_v ) ;
2019-08-18 23:29:04 +00:00
} // end CN0 LOOP
2019-08-17 13:29:31 +00:00
2019-08-18 23:29:04 +00:00
// build the mesh grid
2018-06-24 20:31:44 +00:00
std : : vector < double > doppler_error_mesh ;
std : : vector < double > code_delay_error_mesh ;
for ( unsigned int current_acq_doppler_error_idx = 0 ; current_acq_doppler_error_idx < acq_doppler_error_hz_values . size ( ) ; current_acq_doppler_error_idx + + )
{
for ( unsigned int current_acq_code_error_idx = 0 ; current_acq_code_error_idx < acq_delay_error_chips_values . at ( current_acq_doppler_error_idx ) . size ( ) ; current_acq_code_error_idx + + )
{
doppler_error_mesh . push_back ( acq_doppler_error_hz_values . at ( current_acq_doppler_error_idx ) ) ;
code_delay_error_mesh . push_back ( acq_delay_error_chips_values . at ( current_acq_doppler_error_idx ) . at ( current_acq_code_error_idx ) ) ;
}
}
for ( unsigned int current_cn0_idx = 0 ; current_cn0_idx < generator_CN0_values . size ( ) ; current_cn0_idx + + )
{
std : : vector < double > pull_in_result_mesh ;
pull_in_result_mesh = pull_in_results_v_v . at ( current_cn0_idx ) ;
2019-08-18 23:29:04 +00:00
// plot grid
2018-06-24 20:31:44 +00:00
Gnuplot g4 ( " points palette pointsize 2 pointtype 7 " ) ;
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2018-07-02 15:43:34 +00:00
if ( FLAGS_show_plots )
2024-04-29 06:27:33 +00:00
# else
if ( absl : : GetFlag ( FLAGS_show_plots ) )
# endif
2018-07-02 15:43:34 +00:00
{
g4 . showonscreen ( ) ; // window output
}
else
{
g4 . disablescreen ( ) ;
}
2019-02-11 17:38:42 +00:00
g4 . cmd ( R " (set palette defined ( 0 " black " , 1 " green " )) " ) ;
2018-06-24 20:31:44 +00:00
g4 . cmd ( " set key off " ) ;
g4 . cmd ( " set view map " ) ;
2018-07-02 15:43:34 +00:00
std : : string title ;
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2018-07-02 15:43:34 +00:00
if ( ! FLAGS_enable_external_signal_file )
{
title = std : : string ( " Tracking Pull-in result grid at CN0: " + std : : to_string ( static_cast < int > ( round ( generator_CN0_values . at ( current_cn0_idx ) ) ) ) + " [dB-Hz], PLL/DLL BW: " + std : : to_string ( FLAGS_PLL_bw_hz_start ) + " , " + std : : to_string ( FLAGS_DLL_bw_hz_start ) + " [Hz]. " ) ;
}
else
{
title = std : : string ( " Tracking Pull-in result grid, PLL/DLL BW: " + std : : to_string ( FLAGS_PLL_bw_hz_start ) + " , " + std : : to_string ( FLAGS_DLL_bw_hz_start ) + " [Hz], GPS L1 C/A (PRN # " + std : : to_string ( FLAGS_test_satellite_PRN ) + " ) " ) ;
}
2024-04-29 06:27:33 +00:00
# else
if ( ! absl : : GetFlag ( FLAGS_enable_external_signal_file ) )
{
title = std : : string ( " Tracking Pull-in result grid at CN0: " + std : : to_string ( static_cast < int > ( round ( generator_CN0_values . at ( current_cn0_idx ) ) ) ) + " [dB-Hz], PLL/DLL BW: " + std : : to_string ( absl : : GetFlag ( FLAGS_PLL_bw_hz_start ) ) + " , " + std : : to_string ( absl : : GetFlag ( FLAGS_DLL_bw_hz_start ) ) + " [Hz]. " ) ;
}
else
{
title = std : : string ( " Tracking Pull-in result grid, PLL/DLL BW: " + std : : to_string ( absl : : GetFlag ( FLAGS_PLL_bw_hz_start ) ) + " , " + std : : to_string ( absl : : GetFlag ( FLAGS_DLL_bw_hz_start ) ) + " [Hz], GPS L1 C/A (PRN # " + std : : to_string ( absl : : GetFlag ( FLAGS_test_satellite_PRN ) ) + " ) " ) ;
}
# endif
2018-06-24 20:31:44 +00:00
g4 . set_title ( title ) ;
g4 . set_grid ( ) ;
g4 . set_xlabel ( " Acquisition Doppler error [Hz] " ) ;
g4 . set_ylabel ( " Acquisition Code Delay error [Chips] " ) ;
2018-07-02 15:43:34 +00:00
g4 . cmd ( " set cbrange[0:1] " ) ;
2018-06-24 20:31:44 +00:00
g4 . plot_xyz ( doppler_error_mesh ,
code_delay_error_mesh ,
pull_in_result_mesh ) ;
g4 . set_legend ( ) ;
2024-04-29 06:27:33 +00:00
# if USE_GLOG_AND_GFLAGS
2018-07-02 15:43:34 +00:00
if ( ! FLAGS_enable_external_signal_file )
2024-04-29 06:27:33 +00:00
# else
if ( ! absl : : GetFlag ( FLAGS_enable_external_signal_file ) )
# endif
2018-07-02 15:43:34 +00:00
{
g4 . savetops ( " trk_pull_in_grid_ " + std : : to_string ( static_cast < int > ( round ( generator_CN0_values . at ( current_cn0_idx ) ) ) ) ) ;
g4 . savetopdf ( " trk_pull_in_grid_ " + std : : to_string ( static_cast < int > ( round ( generator_CN0_values . at ( current_cn0_idx ) ) ) ) , 12 ) ;
}
else
{
2018-07-03 13:18:45 +00:00
g4 . savetops ( " trk_pull_in_grid_external_file " ) ;
g4 . savetopdf ( " trk_pull_in_grid_external_file " , 12 ) ;
2018-07-02 15:43:34 +00:00
}
2018-06-24 20:31:44 +00:00
}
}