diff --git a/conf/gnss-sdr.conf b/conf/gnss-sdr.conf index 12986d4ca..467d4d143 100644 --- a/conf/gnss-sdr.conf +++ b/conf/gnss-sdr.conf @@ -17,8 +17,7 @@ ControlThread.wait_for_flowgraph=false SignalSource.implementation=File_Signal_Source ;#filename: path to file with the captured GNSS signal samples to be processed -SignalSource.filename=/media/DATALOGGER/Barcelona _ctae_cttc_logs/gps/ctae-cttc1_df16_tram5.dat - +SignalSource.filename=/home/luis/Project/signals/cap2/agilent_cap2.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. SignalSource.item_type=gr_complex @@ -48,10 +47,90 @@ SignalConditioner.sample_freq_in=4000000 SignalConditioner.sample_freq_out=4000000 SignalConditioner.dump=false -;######### CHANNELS CONFIGURATION CONFIG ############ -;#count: Number of avalable satellite channels. +;######### CHANNELS GLOBAL CONFIG ############ +;#count: Number of available satellite channels. Channels.count=4 +;######### CHANNEL 0 CONFIG ############ +;#system: GPS, GLONASS, GALILEO, SBAS or COMPASS +;#if the option is disabled by default is assigned GPS +Channel0.system=GPS + +;#signal: +;# "1C" GPS L1 C/A +;# "1P" GPS L1 P +;# "1W" GPS L1 Z-tracking and similar (AS on) +;# "1Y" GPS L1 Y +;# "1M" GPS L1 M +;# "1N" GPS L1 codeless +;# "2C" GPS L2 C/A +;# "2D" GPS L2 L1(C/A)+(P2-P1) semi-codeless +;# "2S" GPS L2 L2C (M) +;# "2L" GPS L2 L2C (L) +;# "2X" GPS L2 L2C (M+L) +;# "2P" GPS L2 P +;# "2W" GPS L2 Z-tracking and similar (AS on) +;# "2Y" GPS L2 Y +;# "2M" GPS GPS L2 M +;# "2N" GPS L2 codeless +;# "5I" GPS L5 I +;# "5Q" GPS L5 Q +;# "5X" GPS L5 I+Q +;# "1C" GLONASS G1 C/A +;# "1P" GLONASS G1 P +;# "2C" GLONASS G2 C/A (Glonass M) +;# "2P" GLONASS G2 P +;# "1A" GALILEO E1 A (PRS) +;# "1B" GALILEO E1 B (I/NAV OS/CS/SoL) +;# "1C" GALILEO E1 C (no data) +;# "1X" GALILEO E1 B+C +;# "1Z" GALILEO E1 A+B+C +;# "5I" GALILEO E5a I (F/NAV OS) +;# "5Q" GALILEO E5a Q (no data) +;# "5X" GALILEO E5a I+Q +;# "7I" GALILEO E5b I +;# "7Q" GALILEO E5b Q +;# "7X" GALILEO E5b I+Q +;# "8I" GALILEO E5 I +;# "8Q" GALILEO E5 Q +;# "8X" GALILEO E5 I+Q +;# "6A" GALILEO E6 A +;# "6B" GALILEO E6 B +;# "6C" GALILEO E6 C +;# "6X" GALILEO E6 B+C +;# "6Z" GALILEO E6 A+B+C +;# "1C" SBAS L1 C/A +;# "5I" SBAS L5 I +;# "5Q" SBAS L5 Q +;# "5X" SBAS L5 I+Q +;# "2I" COMPASS E2 I +;# "2Q" COMPASS E2 Q +;# "2X" COMPASS E2 IQ +;# "7I" COMPASS E5b I +;# "7Q" COMPASS E5b Q +;# "7X" COMPASS E5b IQ +;# "6I" COMPASS E6 I +;# "6Q" COMPASS E6 Q +;# "6X" COMPASS E6 IQ +;#if the option is disabled by default is assigned "1C" GPS L1 C/A +Channel0.signal=1C + +;#satellite: Satellite PRN ID for this channel. Disable this option to random search +Channel0.satellite=1 + +;######### CHANNEL 1 CONFIG ############ + +Channel1.system=GPS +Channel1.signal=1C +Channel1.satellite=14 + +;######### CHANNEL 2 CONFIG ############ + +Channel2.system=GPS +Channel2.signal=1C +Channel2.satellite=21 + + ;######### ACQUISITION GLOBAL CONFIG ############ ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] @@ -63,6 +142,7 @@ Acquisition.dump_filename=./acq_dump.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. Acquisition.item_type=gr_complex + ;#if: Signal intermediate frequency in [Hz] Acquisition.if=0 @@ -76,7 +156,7 @@ Acquisition.sampled_ms=1 Acquisition0.implementation=GPS_L1_CA_PCPS_Acquisition ;#threshold: Acquisition threshold -Acquisition0.threshold=60 +Acquisition0.threshold=70 ;#doppler_max: Maximum expected Doppler shift [Hz] Acquisition0.doppler_max=10000 @@ -84,43 +164,36 @@ Acquisition0.doppler_max=10000 ;#doppler_max: Doppler step in the grid search [Hz] Acquisition0.doppler_step=250 -;#satellite: Satellite PRN ID for this channel. Disable this option to random search -;Acquisition0.satellite=14 - ;#repeat_satellite: Use only jointly with the satellte PRN ID option. ;#Enable repeat_satellite to keep searching the same satellite during the runtime. ;Acquisition0.repeat_satellite=true ;######### ACQUISITION CH 1 CONFIG ############ Acquisition1.implementation=GPS_L1_CA_PCPS_Acquisition -Acquisition1.threshold=40 +Acquisition1.threshold=70 Acquisition1.doppler_max=10000 Acquisition1.doppler_step=250 -;Acquisition1.satellite=32 ;Acquisition1.repeat_satellite=true ;######### ACQUISITION CH 2 CONFIG ############ Acquisition2.implementation=GPS_L1_CA_PCPS_Acquisition -Acquisition2.threshold=40 +Acquisition2.threshold=70 Acquisition2.doppler_max=10000 Acquisition2.doppler_step=250 -;Acquisition2.satellite=11 ;Acquisition2.repeat_satellite=true ;######### ACQUISITION CH 3 CONFIG ############ Acquisition3.implementation=GPS_L1_CA_PCPS_Acquisition -Acquisition3.threshold=40 +Acquisition3.threshold=70 Acquisition3.doppler_max=10000 Acquisition3.doppler_step=250 -;Acquisition3.satellite=1 ;Acquisition3.repeat_satellite=true ;######### ACQUISITION CH 4 CONFIG ############ Acquisition4.implementation=GPS_L1_CA_PCPS_Acquisition -Acquisition4.threshold=40 +Acquisition4.threshold=70 Acquisition4.doppler_max=10000 Acquisition4.doppler_step=250 -;Acquisition4.satellite=31 ;Acquisition4.repeat_satellite=true ;######### ACQUISITION CH 5 CONFIG ############ @@ -128,29 +201,26 @@ Acquisition5.implementation=GPS_L1_CA_PCPS_Acquisition Acquisition5.threshold=70 Acquisition5.doppler_max=10000 Acquisition5.doppler_step=250 -;Acquisition5.satellite=20 ;Acquisition5.repeat_satellite=true ;######### ACQUISITION CH 6 CONFIG ############ Acquisition6.implementation=GPS_L1_CA_PCPS_Acquisition -Acquisition6.threshold=60 +Acquisition6.threshold=70 Acquisition6.doppler_max=10000 Acquisition6.doppler_step=250 -;Acquisition6.satellite=22 ;Acquisition6.repeat_satellite=true ;######### ACQUISITION CH 7 CONFIG ############ Acquisition7.implementation=GPS_L1_CA_PCPS_Acquisition -Acquisition7.threshold=60 +Acquisition7.threshold=70 Acquisition7.doppler_max=10000 Acquisition7.doppler_step=250 -;Acquisition7.satellite=23 ;Acquisition7.repeat_satellite=true ;######### TRACKING GLOBAL CONFIG ############ ;#implementatiion: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_FLL_PLL_Tracking] -Tracking.implementation=GPS_L1_CA_DLL_FLL_PLL_Tracking +Tracking.implementation=GPS_L1_CA_DLL_PLL_Tracking ;#item_type: Type and resolution for each of the signal samples. Use only [gr_complex] in this version. Tracking.item_type=gr_complex @@ -220,4 +290,4 @@ PVT.dump_filename=./PVT ;# Receiver output filter: Leave this block disabled in this version OutputFilter.implementation=Null_Sink_Output_Filter OutputFilter.filename=data/gnss-sdr.dat -OutputFilter.item_type=gr_complex +OutputFilter.item_type=gr_complex \ No newline at end of file diff --git a/conf/master.conf b/conf/master.conf index 9aa92f517..55b09812f 100644 --- a/conf/master.conf +++ b/conf/master.conf @@ -47,10 +47,90 @@ SignalConditioner.sample_freq_in=4000000 SignalConditioner.sample_freq_out=4000000 SignalConditioner.dump=false -;######### CHANNELS CONFIGURATION CONFIG ############ -;#count: Number of avalable satellite channels. +;######### CHANNELS GLOBAL CONFIG ############ +;#count: Number of available satellite channels. Channels.count=4 +;######### CHANNEL 0 CONFIG ############ +;#system: GPS, GLONASS, GALILEO, SBAS or COMPASS +;#if the option is disabled by default is assigned GPS +Channel0.system=GPS + +;#signal: +;# "1C" GPS L1 C/A +;# "1P" GPS L1 P +;# "1W" GPS L1 Z-tracking and similar (AS on) +;# "1Y" GPS L1 Y +;# "1M" GPS L1 M +;# "1N" GPS L1 codeless +;# "2C" GPS L2 C/A +;# "2D" GPS L2 L1(C/A)+(P2-P1) semi-codeless +;# "2S" GPS L2 L2C (M) +;# "2L" GPS L2 L2C (L) +;# "2X" GPS L2 L2C (M+L) +;# "2P" GPS L2 P +;# "2W" GPS L2 Z-tracking and similar (AS on) +;# "2Y" GPS L2 Y +;# "2M" GPS GPS L2 M +;# "2N" GPS L2 codeless +;# "5I" GPS L5 I +;# "5Q" GPS L5 Q +;# "5X" GPS L5 I+Q +;# "1C" GLONASS G1 C/A +;# "1P" GLONASS G1 P +;# "2C" GLONASS G2 C/A (Glonass M) +;# "2P" GLONASS G2 P +;# "1A" GALILEO E1 A (PRS) +;# "1B" GALILEO E1 B (I/NAV OS/CS/SoL) +;# "1C" GALILEO E1 C (no data) +;# "1X" GALILEO E1 B+C +;# "1Z" GALILEO E1 A+B+C +;# "5I" GALILEO E5a I (F/NAV OS) +;# "5Q" GALILEO E5a Q (no data) +;# "5X" GALILEO E5a I+Q +;# "7I" GALILEO E5b I +;# "7Q" GALILEO E5b Q +;# "7X" GALILEO E5b I+Q +;# "8I" GALILEO E5 I +;# "8Q" GALILEO E5 Q +;# "8X" GALILEO E5 I+Q +;# "6A" GALILEO E6 A +;# "6B" GALILEO E6 B +;# "6C" GALILEO E6 C +;# "6X" GALILEO E6 B+C +;# "6Z" GALILEO E6 A+B+C +;# "1C" SBAS L1 C/A +;# "5I" SBAS L5 I +;# "5Q" SBAS L5 Q +;# "5X" SBAS L5 I+Q +;# "2I" COMPASS E2 I +;# "2Q" COMPASS E2 Q +;# "2X" COMPASS E2 IQ +;# "7I" COMPASS E5b I +;# "7Q" COMPASS E5b Q +;# "7X" COMPASS E5b IQ +;# "6I" COMPASS E6 I +;# "6Q" COMPASS E6 Q +;# "6X" COMPASS E6 IQ +;#if the option is disabled by default is assigned "1C" GPS L1 C/A +Channel0.signal=1C + +;#satellite: Satellite PRN ID for this channel. Disable this option to random search +Channel0.satellite=1 + +;######### CHANNEL 1 CONFIG ############ + +Channel1.system=GPS +Channel1.signal=1C +Channel1.satellite=14 + +;######### CHANNEL 2 CONFIG ############ + +Channel2.system=GPS +Channel2.signal=1C +Channel2.satellite=21 + + ;######### ACQUISITION GLOBAL CONFIG ############ ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] @@ -84,9 +164,6 @@ Acquisition0.doppler_max=10000 ;#doppler_max: Doppler step in the grid search [Hz] Acquisition0.doppler_step=250 -;#satellite: Satellite PRN ID for this channel. Disable this option to random search -;Acquisition0.satellite=14 - ;#repeat_satellite: Use only jointly with the satellte PRN ID option. ;#Enable repeat_satellite to keep searching the same satellite during the runtime. ;Acquisition0.repeat_satellite=true @@ -96,7 +173,6 @@ Acquisition1.implementation=GPS_L1_CA_PCPS_Acquisition Acquisition1.threshold=70 Acquisition1.doppler_max=10000 Acquisition1.doppler_step=250 -;Acquisition1.satellite=32 ;Acquisition1.repeat_satellite=true ;######### ACQUISITION CH 2 CONFIG ############ @@ -104,7 +180,6 @@ Acquisition2.implementation=GPS_L1_CA_PCPS_Acquisition Acquisition2.threshold=70 Acquisition2.doppler_max=10000 Acquisition2.doppler_step=250 -;Acquisition2.satellite=11 ;Acquisition2.repeat_satellite=true ;######### ACQUISITION CH 3 CONFIG ############ @@ -112,7 +187,6 @@ Acquisition3.implementation=GPS_L1_CA_PCPS_Acquisition Acquisition3.threshold=70 Acquisition3.doppler_max=10000 Acquisition3.doppler_step=250 -;Acquisition3.satellite=1 ;Acquisition3.repeat_satellite=true ;######### ACQUISITION CH 4 CONFIG ############ @@ -120,7 +194,6 @@ Acquisition4.implementation=GPS_L1_CA_PCPS_Acquisition Acquisition4.threshold=70 Acquisition4.doppler_max=10000 Acquisition4.doppler_step=250 -;Acquisition4.satellite=31 ;Acquisition4.repeat_satellite=true ;######### ACQUISITION CH 5 CONFIG ############ @@ -128,7 +201,6 @@ Acquisition5.implementation=GPS_L1_CA_PCPS_Acquisition Acquisition5.threshold=70 Acquisition5.doppler_max=10000 Acquisition5.doppler_step=250 -;Acquisition5.satellite=20 ;Acquisition5.repeat_satellite=true ;######### ACQUISITION CH 6 CONFIG ############ @@ -136,7 +208,6 @@ Acquisition6.implementation=GPS_L1_CA_PCPS_Acquisition Acquisition6.threshold=70 Acquisition6.doppler_max=10000 Acquisition6.doppler_step=250 -;Acquisition6.satellite=22 ;Acquisition6.repeat_satellite=true ;######### ACQUISITION CH 7 CONFIG ############ @@ -144,7 +215,6 @@ Acquisition7.implementation=GPS_L1_CA_PCPS_Acquisition Acquisition7.threshold=70 Acquisition7.doppler_max=10000 Acquisition7.doppler_step=250 -;Acquisition7.satellite=23 ;Acquisition7.repeat_satellite=true ;######### TRACKING GLOBAL CONFIG ############ diff --git a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.h b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.h index fd4ff439a..52d7c27c4 100644 --- a/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.h +++ b/src/algorithms/acquisition/adapters/gps_l1_ca_pcps_acquisition.h @@ -69,6 +69,7 @@ public: gr_basic_block_sptr get_left_block(); gr_basic_block_sptr get_right_block(); + void set_synchro(Gnss_Synchro p_gnss_synchro); void set_satellite(Gnss_Satellite satellite); void set_channel(unsigned int channel); void set_threshold(float threshold); @@ -92,6 +93,7 @@ private: size_t item_size_; std::string item_type_; unsigned int vector_length_; + Gnss_Synchro* gnss_synchro_; Gnss_Satellite gnss_satellite_; //unsigned int satellite_; unsigned int channel_; diff --git a/src/algorithms/acquisition/gnuradio_blocks/gps_l1_ca_pcps_acquisition_cc.cc b/src/algorithms/acquisition/gnuradio_blocks/gps_l1_ca_pcps_acquisition_cc.cc index 623a6b414..ac930ed6c 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/gps_l1_ca_pcps_acquisition_cc.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/gps_l1_ca_pcps_acquisition_cc.cc @@ -71,11 +71,13 @@ gps_l1_ca_pcps_acquisition_cc::gps_l1_ca_pcps_acquisition_cc( d_doppler_max = doppler_max; d_satellite = Gnss_Satellite(); d_fft_size = d_sampled_ms * d_samples_per_ms; - d_doppler_freq = 0.0; - d_code_phase = 0; + //d_doppler_freq = 0.0; + //d_code_phase = 0; d_mag = 0; d_input_power = 0.0; + d_gnss_synchro = new Gnss_Synchro(); + d_sine_if = new gr_complex[d_fft_size]; d_fft_codes = (gr_complex*)malloc(sizeof(gr_complex) * d_samples_per_ms); @@ -102,11 +104,13 @@ gps_l1_ca_pcps_acquisition_cc::gps_l1_ca_pcps_acquisition_cc( gps_l1_ca_pcps_acquisition_cc::~gps_l1_ca_pcps_acquisition_cc() { + delete d_gnss_synchro; delete[] d_sine_if; delete[] d_fft_codes; delete d_ifft; delete d_fft_if; + if (d_dump) { d_dump_file.close(); @@ -119,8 +123,11 @@ gps_l1_ca_pcps_acquisition_cc::~gps_l1_ca_pcps_acquisition_cc() void gps_l1_ca_pcps_acquisition_cc::set_satellite(Gnss_Satellite satellite) { d_satellite = Gnss_Satellite(satellite.get_system(), satellite.get_PRN()); - d_code_phase = 0; - d_doppler_freq = 0; + // ¿qué diferencia hay con d_satellite=satellite; ? + d_gnss_synchro->Acq_delay_samples=0.0; + d_gnss_synchro->Acq_doppler_hz=0.0; + //d_code_phase = 0; + //d_doppler_freq = 0; d_mag = 0.0; d_input_power = 0.0; @@ -135,9 +142,6 @@ void gps_l1_ca_pcps_acquisition_cc::set_satellite(Gnss_Satellite satellite) //TODO Optimize it ! try conj() for (unsigned int i = 0; i < d_fft_size; i++) { - //d_fft_codes[i] = std::complex( - // d_fft_if->get_outbuf()[i].real(), - // -d_fft_if->get_outbuf()[i].imag()); d_fft_codes[i] = std::complex(conj(d_fft_if->get_outbuf()[i])); d_fft_codes[i] = d_fft_codes[i] / (float)d_fft_size; //to correct the scale factor introduced by FFTW } @@ -160,12 +164,6 @@ void gps_l1_ca_pcps_acquisition_cc::set_satellite(Gnss_Satellite satellite) - -signed int gps_l1_ca_pcps_acquisition_cc::prn_code_phase() -{ - return d_code_phase; -} - int gps_l1_ca_pcps_acquisition_cc::general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) @@ -193,8 +191,10 @@ int gps_l1_ca_pcps_acquisition_cc::general_work(int noutput_items, //restart acquisition variables - d_code_phase = 0; - d_doppler_freq = 0; + d_gnss_synchro->Acq_delay_samples=0.0; + d_gnss_synchro->Acq_doppler_hz=0.0; + //d_code_phase = 0; + //d_doppler_freq = 0; d_mag = 0.0; d_input_power = 0.0; @@ -278,8 +278,10 @@ int gps_l1_ca_pcps_acquisition_cc::general_work(int noutput_items, if (d_mag < magt) { d_mag = magt; - d_code_phase = indext; - d_doppler_freq = doppler; + d_gnss_synchro->Acq_delay_samples= (double)indext; + d_gnss_synchro->Acq_doppler_hz= (double)doppler; + //d_code_phase = indext; + //d_doppler_freq = doppler; } } @@ -299,8 +301,8 @@ int gps_l1_ca_pcps_acquisition_cc::general_work(int noutput_items, DLOG(INFO) << "sample_stamp " << d_sample_counter; DLOG(INFO) << "test statistics value " << d_test_statistics; DLOG(INFO) << "test statistics threshold " << d_threshold; - DLOG(INFO) << "code phase " << d_code_phase; - DLOG(INFO) << "doppler " << d_doppler_freq; + DLOG(INFO) << "code phase " << d_gnss_synchro->Acq_delay_samples; + DLOG(INFO) << "doppler " << d_gnss_synchro->Acq_doppler_hz; DLOG(INFO) << "magnitude " << d_mag; DLOG(INFO) << "input signal power " << d_input_power; } @@ -311,8 +313,8 @@ int gps_l1_ca_pcps_acquisition_cc::general_work(int noutput_items, DLOG(INFO) << "sample_stamp " << d_sample_counter; DLOG(INFO) << "test statistics value " << d_test_statistics; DLOG(INFO) << "test statistics threshold " << d_threshold; - DLOG(INFO) << "code phase " << d_code_phase; - DLOG(INFO) << "doppler " << d_doppler_freq; + DLOG(INFO) << "code phase " << d_gnss_synchro->Acq_delay_samples; + DLOG(INFO) << "doppler " << d_gnss_synchro->Acq_doppler_hz; DLOG(INFO) << "magnitude " << d_mag; DLOG(INFO) << "input signal power " << d_input_power; } diff --git a/src/algorithms/acquisition/gnuradio_blocks/gps_l1_ca_pcps_acquisition_cc.h b/src/algorithms/acquisition/gnuradio_blocks/gps_l1_ca_pcps_acquisition_cc.h index d56ffec5e..32e36a4ba 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/gps_l1_ca_pcps_acquisition_cc.h +++ b/src/algorithms/acquisition/gnuradio_blocks/gps_l1_ca_pcps_acquisition_cc.h @@ -44,128 +44,135 @@ #include #include "concurrent_queue.h" #include "gnss_satellite.h" - +#include "gnss_synchro.h" class gps_l1_ca_pcps_acquisition_cc; typedef boost::shared_ptr - gps_l1_ca_pcps_acquisition_cc_sptr; + gps_l1_ca_pcps_acquisition_cc_sptr; gps_l1_ca_pcps_acquisition_cc_sptr gps_l1_ca_pcps_make_acquisition_cc(unsigned int sampled_ms, - unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, - gr_msg_queue_sptr queue, bool dump, std::string dump_filename); + unsigned int doppler_max, long freq, long fs_in, int samples_per_ms, + gr_msg_queue_sptr queue, bool dump, std::string dump_filename); /*! * \brief This class implements a PCPS acquisition block for GPS L1 C/A */ -class gps_l1_ca_pcps_acquisition_cc: public gr_block -{ +class gps_l1_ca_pcps_acquisition_cc: public gr_block { private: - friend gps_l1_ca_pcps_acquisition_cc_sptr - gps_l1_ca_pcps_make_acquisition_cc(unsigned int sampled_ms, - unsigned int doppler_max, long freq, long fs_in, - int samples_per_ms, gr_msg_queue_sptr queue, bool dump, - std::string dump_filename); + friend gps_l1_ca_pcps_acquisition_cc_sptr + gps_l1_ca_pcps_make_acquisition_cc(unsigned int sampled_ms, + unsigned int doppler_max, long freq, long fs_in, + int samples_per_ms, gr_msg_queue_sptr queue, bool dump, + std::string dump_filename); - gps_l1_ca_pcps_acquisition_cc(unsigned int sampled_ms, - unsigned int doppler_max, long freq, long fs_in, - int samples_per_ms, gr_msg_queue_sptr queue, bool dump, - std::string dump_filename); + gps_l1_ca_pcps_acquisition_cc(unsigned int sampled_ms, + unsigned int doppler_max, long freq, long fs_in, + int samples_per_ms, gr_msg_queue_sptr queue, bool dump, + std::string dump_filename); - void calculate_magnitudes(gr_complex* fft_begin, int doppler_shift, - int doppler_offset); + void calculate_magnitudes(gr_complex* fft_begin, int doppler_shift, + int doppler_offset); - long d_fs_in; - long d_freq; - int d_samples_per_ms; - unsigned int d_doppler_resolution; - Gnss_Satellite d_satellite; - float d_threshold; - std::string d_satellite_str; - unsigned int d_doppler_max; - unsigned int d_doppler_step; - unsigned int d_sampled_ms; - unsigned int d_fft_size; - unsigned long int d_sample_counter; - unsigned long int d_acq_sample_stamp; - gr_complex* d_sine_if; + long d_fs_in; + long d_freq; + int d_samples_per_ms; + unsigned int d_doppler_resolution; + Gnss_Satellite d_satellite; + float d_threshold; + std::string d_satellite_str; + unsigned int d_doppler_max; + unsigned int d_doppler_step; + unsigned int d_sampled_ms; + unsigned int d_fft_size; + unsigned long int d_sample_counter; + unsigned long int d_acq_sample_stamp; + gr_complex* d_sine_if; - gr_complex* d_fft_codes; + gr_complex* d_fft_codes; - gri_fft_complex* d_fft_if; + gri_fft_complex* d_fft_if; - gri_fft_complex* d_ifft; + gri_fft_complex* d_ifft; - unsigned int d_code_phase; - float d_doppler_freq; - float d_mag; - float d_input_power; - float d_test_statistics; + Gnss_Synchro *d_gnss_synchro; + unsigned int d_code_phase; + float d_doppler_freq; + float d_mag; + float d_input_power; + float d_test_statistics; - gr_msg_queue_sptr d_queue; - concurrent_queue *d_channel_internal_queue; - std::ofstream d_dump_file; + gr_msg_queue_sptr d_queue; + concurrent_queue *d_channel_internal_queue; + std::ofstream d_dump_file; - bool d_active; - bool d_dump; - unsigned int d_channel; - std::string d_dump_filename; + bool d_active; + bool d_dump; + unsigned int d_channel; + std::string d_dump_filename; public: - ~gps_l1_ca_pcps_acquisition_cc(); + ~gps_l1_ca_pcps_acquisition_cc(); - signed int prn_code_phase(); - float doppler_freq() - { - return d_doppler_freq; - } - unsigned int mag() - { - return d_mag; - } + void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) + { + d_gnss_synchro = p_gnss_synchro; + } + signed int prn_code_phase() + { + return d_code_phase; + } + float doppler_freq() + { + return d_doppler_freq; + } + unsigned int mag() + { + return d_mag; + } - unsigned long int get_sample_stamp() - { - return d_acq_sample_stamp; - } + unsigned long int get_sample_stamp() + { + return d_acq_sample_stamp; + } - void set_satellite(Gnss_Satellite satellite); + void set_satellite(Gnss_Satellite satellite); - void set_active(bool active) - { - d_active = active; - } + void set_active(bool active) + { + d_active = active; + } - void set_channel(unsigned int channel) - { - d_channel = channel; - } + void set_channel(unsigned int channel) + { + d_channel = channel; + } - void set_threshold(float threshold) - { - d_threshold = threshold; - } + void set_threshold(float threshold) + { + d_threshold = threshold; + } - void set_doppler_max(unsigned int doppler_max) - { - d_doppler_max = doppler_max; - } + void set_doppler_max(unsigned int doppler_max) + { + d_doppler_max = doppler_max; + } - void set_doppler_step(unsigned int doppler_step) - { - d_doppler_step = doppler_step; - } + void set_doppler_step(unsigned int doppler_step) + { + d_doppler_step = doppler_step; + } - void set_channel_queue(concurrent_queue *channel_internal_queue) - { - d_channel_internal_queue = channel_internal_queue; - } + void set_channel_queue(concurrent_queue *channel_internal_queue) + { + d_channel_internal_queue = channel_internal_queue; + } - int general_work(int noutput_items, gr_vector_int &ninput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items); + int general_work(int noutput_items, gr_vector_int &ninput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); }; #endif /* GNSS_SDR_GPS_L1_CA_PCPS_ACQUISITION_CC_H*/ diff --git a/src/algorithms/channel/adapters/channel.cc b/src/algorithms/channel/adapters/channel.cc index b7b531769..5d794c9bb 100644 --- a/src/algorithms/channel/adapters/channel.cc +++ b/src/algorithms/channel/adapters/channel.cc @@ -87,6 +87,7 @@ Channel::Channel(ConfigurationInterface *configuration, unsigned int channel, connected_ = false; message_ = 0; gnss_satellite_ = Gnss_Satellite(); + gnss_signal_ = Gnss_Signal(); } @@ -168,9 +169,9 @@ gr_basic_block_sptr Channel::get_right_block() -void Channel::set_satellite(Gnss_Satellite satellite) +void Channel::set_signal(Gnss_Signal gnss_signal) { - gnss_satellite_ = Gnss_Satellite(satellite.get_system(), satellite.get_PRN()); + gnss_satellite_ = gnss_signal.get_satellite(); acq_->set_satellite(gnss_satellite_); trk_->set_satellite(gnss_satellite_); nav_->set_satellite(gnss_satellite_); diff --git a/src/algorithms/channel/adapters/channel.h b/src/algorithms/channel/adapters/channel.h index aaedf508d..ed432dfc4 100644 --- a/src/algorithms/channel/adapters/channel.h +++ b/src/algorithms/channel/adapters/channel.h @@ -41,6 +41,7 @@ #include "gps_l1_ca_channel_fsm.h" #include "control_message_factory.h" #include "concurrent_queue.h" +#include "gnss_signal.h" class ConfigurationInterface; @@ -78,7 +79,7 @@ public: size_t item_size(){ return 0; } - Gnss_Satellite get_satellite() const { return gnss_satellite_; } + Gnss_Signal get_signal() const { return gnss_signal_; } AcquisitionInterface* acquisition(){ return acq_; } @@ -87,7 +88,7 @@ public: TelemetryDecoderInterface* telemetry(){ return nav_; } void start_acquisition(); - void set_satellite(Gnss_Satellite satellite); + void set_signal(Gnss_Signal gnss_signal_); void start(); /*! @@ -108,6 +109,7 @@ private: unsigned int channel_; Gnss_Satellite gnss_satellite_; + Gnss_Signal gnss_signal_; bool connected_; bool stop_; int message_; diff --git a/src/core/interfaces/channel_interface.h b/src/core/interfaces/channel_interface.h index 6ef75943e..00673b510 100644 --- a/src/core/interfaces/channel_interface.h +++ b/src/core/interfaces/channel_interface.h @@ -38,7 +38,7 @@ #define GNSS_SDR_CHANNEL_INTERFACE_H_ #include "gnss_block_interface.h" -#include "gnss_satellite.h" +#include "gnss_signal.h" /*! * \brief This abstract class represents an interface to a channel GNSS block. @@ -53,9 +53,9 @@ class ChannelInterface: public GNSSBlockInterface public: - virtual Gnss_Satellite get_satellite() const = 0; + virtual Gnss_Signal get_signal() const = 0; virtual void start_acquisition() = 0; - virtual void set_satellite(Gnss_Satellite) = 0; + virtual void set_signal(Gnss_Signal) = 0; virtual void start() = 0; virtual void stop() = 0; }; diff --git a/src/core/receiver/gnss_flowgraph.cc b/src/core/receiver/gnss_flowgraph.cc index 53902d7be..3acfe0dd9 100644 --- a/src/core/receiver/gnss_flowgraph.cc +++ b/src/core/receiver/gnss_flowgraph.cc @@ -44,278 +44,224 @@ #include "channel_interface.h" #include "gnss_block_factory.h" - using google::LogMessage; GNSSFlowgraph::GNSSFlowgraph(ConfigurationInterface *configuration, - gr_msg_queue_sptr queue) -{ - connected_ = false; - running_ = false; - configuration_ = configuration; - blocks_ = new std::vector(); - block_factory_ = new GNSSBlockFactory(); - queue_ = queue; - available_GPS_satellites_IDs_ = new std::list(); + gr_msg_queue_sptr queue) { + connected_ = false; + running_ = false; + configuration_ = configuration; + blocks_ = new std::vector(); + block_factory_ = new GNSSBlockFactory(); + queue_ = queue; + //available_GNSS_signals_ = new std::list(); - init(); + init(); } -GNSSFlowgraph::~GNSSFlowgraph() -{ +GNSSFlowgraph::~GNSSFlowgraph() { - delete block_factory_; + delete block_factory_; - for (unsigned int i = 0; i < blocks_->size(); i++) - { - delete blocks_->at(i); - } - blocks_->clear(); + for (unsigned int i = 0; i < blocks_->size(); i++) { + delete blocks_->at(i); + } + blocks_->clear(); - delete blocks_; + delete blocks_; } -void GNSSFlowgraph::start() -{ - if (running_) - { - LOG_AT_LEVEL(WARNING) << "Already running"; - return; - } +void GNSSFlowgraph::start() { + if (running_) { + LOG_AT_LEVEL(WARNING) << "Already running"; + return; + } - try - { - top_block_->start(); - } - catch (std::exception& e) - { - LOG_AT_LEVEL(ERROR) << "Unable to start flowgraph"; - LOG_AT_LEVEL(ERROR) << e.what(); - return; - } + try { + top_block_->start(); + } catch (std::exception& e) { + LOG_AT_LEVEL(ERROR) << "Unable to start flowgraph"; + LOG_AT_LEVEL(ERROR) << e.what(); + return; + } - running_ = true; + running_ = true; } -void GNSSFlowgraph::stop() -{ - for (unsigned int i = 0; i < channels_count_; i++) - { - channel(i)->stop(); - } - DLOG(INFO) << "Threads finished. Return to main program."; - top_block_->stop(); - running_ = false; +void GNSSFlowgraph::stop() { + for (unsigned int i = 0; i < channels_count_; i++) { + channel(i)->stop(); + } + DLOG(INFO) << "Threads finished. Return to main program."; + top_block_->stop(); + running_ = false; } -void GNSSFlowgraph::connect() -{ - /* Connects the blocks in the flowgraph - * - * Signal Source > Signal conditioner >> Channels >> Observables >> PVT > Output filter - */ - DLOG(INFO) << "Connecting flowgraph"; - if (connected_) - { - LOG_AT_LEVEL(WARNING) << "flowgraph already connected"; - return; - } +void GNSSFlowgraph::connect() { + /* Connects the blocks in the flowgraph + * + * Signal Source > Signal conditioner >> Channels >> Observables >> PVT > Output filter + */ + DLOG(INFO) << "Connecting flowgraph"; + if (connected_) { + LOG_AT_LEVEL(WARNING) << "flowgraph already connected"; + return; + } + try { + signal_source()->connect(top_block_); + } catch (std::exception& e) { + LOG_AT_LEVEL(ERROR) << "Can't connect signal source block internally"; + LOG_AT_LEVEL(ERROR) << e.what(); + top_block_->disconnect_all(); + return; + } - try - { - signal_source()->connect(top_block_); - } - catch (std::exception& e) - { - LOG_AT_LEVEL(ERROR) << "Can't connect signal source block internally"; - LOG_AT_LEVEL(ERROR) << e.what(); - top_block_->disconnect_all(); - return; - } + // Signal Source > Signal conditioner > + try { + signal_conditioner()->connect(top_block_); + } catch (std::exception& e) { + LOG_AT_LEVEL(ERROR) + << "Can't connect signal conditioner block internally"; + LOG_AT_LEVEL(ERROR) << e.what(); + top_block_->disconnect_all(); + return; + } - // Signal Source > Signal conditioner > - try - { - signal_conditioner()->connect(top_block_); - } - catch (std::exception& e) - { - LOG_AT_LEVEL(ERROR) - << "Can't connect signal conditioner block internally"; - LOG_AT_LEVEL(ERROR) << e.what(); - top_block_->disconnect_all(); - return; - } + for (unsigned int i = 0; i < channels_count_; i++) { + try { + channel(i)->connect(top_block_); + } catch (std::exception& e) { + LOG_AT_LEVEL(ERROR) << "Can't connect channel " << i + << " internally"; + LOG_AT_LEVEL(ERROR) << e.what(); + top_block_->disconnect_all(); + return; + } + } + try { + observables()->connect(top_block_); + } catch (std::exception& e) { + LOG_AT_LEVEL(ERROR) << "Can't connect observables block internally"; + LOG_AT_LEVEL(ERROR) << e.what(); + top_block_->disconnect_all(); + return; + } - for (unsigned int i = 0; i < channels_count_; i++) - { - try - { - channel(i)->connect(top_block_); - } - catch (std::exception& e) - { - LOG_AT_LEVEL(ERROR) << "Can't connect channel " << i - << " internally"; - LOG_AT_LEVEL(ERROR) << e.what(); - top_block_->disconnect_all(); - return; - } - } + // Signal Source > Signal conditioner >> Channels >> Observables > PVT + try { + pvt()->connect(top_block_); + } catch (std::exception& e) { + LOG_AT_LEVEL(ERROR) << "Can't connect PVT block internally"; + LOG_AT_LEVEL(ERROR) << e.what(); + top_block_->disconnect_all(); + return; + } + // Signal Source > Signal conditioner >> Channels >> Observables > PVT > Output Filter + try { + output_filter()->connect(top_block_); + } catch (std::exception& e) { + LOG_AT_LEVEL(ERROR) << "Can't connect output filter block internally"; + LOG_AT_LEVEL(ERROR) << e.what(); + top_block_->disconnect_all(); + return; + } - try - { - observables()->connect(top_block_); - } - catch (std::exception& e) - { - LOG_AT_LEVEL(ERROR) << "Can't connect observables block internally"; - LOG_AT_LEVEL(ERROR) << e.what(); - top_block_->disconnect_all(); - return; - } + DLOG(INFO) << "blocks connected internally"; - // Signal Source > Signal conditioner >> Channels >> Observables > PVT - try - { - pvt()->connect(top_block_); - } - catch (std::exception& e) - { - LOG_AT_LEVEL(ERROR) << "Can't connect PVT block internally"; - LOG_AT_LEVEL(ERROR) << e.what(); - top_block_->disconnect_all(); - return; - } + // Signal Source > Signal conditioner > + try { + top_block_->connect(signal_source()->get_right_block(), 0, + signal_conditioner()->get_left_block(), 0); + } catch (std::exception& e) { + LOG_AT_LEVEL(ERROR) + << "Can't connect signal source to signal conditioner"; + LOG_AT_LEVEL(ERROR) << e.what(); + top_block_->disconnect_all(); + return; + } + DLOG(INFO) << "Signal source connected to signal conditioner"; - // Signal Source > Signal conditioner >> Channels >> Observables > PVT > Output Filter - try - { - output_filter()->connect(top_block_); - } - catch (std::exception& e) - { - LOG_AT_LEVEL(ERROR) << "Can't connect output filter block internally"; - LOG_AT_LEVEL(ERROR) << e.what(); - top_block_->disconnect_all(); - return; - } + // Signal Source > Signal conditioner >> channels_count_ number of Channels in parallel + for (unsigned int i = 0; i < channels_count_; i++) { + try { + top_block_->connect(signal_conditioner()->get_right_block(), 0, + channel(i)->get_left_block(), 0); + } catch (std::exception& e) { + LOG_AT_LEVEL(ERROR) + << "Can't connect signal conditioner to channel " << i; + LOG_AT_LEVEL(ERROR) << e.what(); + top_block_->disconnect_all(); + return; + } - DLOG(INFO) << "blocks connected internally"; + DLOG(INFO) << "signal conditioner connected to channel " << i; - // Signal Source > Signal conditioner > - try - { - top_block_->connect(signal_source()->get_right_block(), 0, - signal_conditioner()->get_left_block(), 0); - } - catch (std::exception& e) - { - LOG_AT_LEVEL(ERROR) - << "Can't connect signal source to signal conditioner"; - LOG_AT_LEVEL(ERROR) << e.what(); - top_block_->disconnect_all(); - return; - } - DLOG(INFO) << "Signal source connected to signal conditioner"; + // Signal Source > Signal conditioner >> Channels >> Observables + try { + top_block_->connect(channel(i)->get_right_block(), 0, + observables()->get_left_block(), i); + } catch (std::exception& e) { + LOG_AT_LEVEL(ERROR) << "Can't connect channel " << i + << " to observables"; + LOG_AT_LEVEL(ERROR) << e.what(); + top_block_->disconnect_all(); + return; + } - // Signal Source > Signal conditioner >> channels_count_ number of Channels in parallel - for (unsigned int i = 0; i < channels_count_; i++) - { - try - { - top_block_->connect(signal_conditioner()->get_right_block(), 0, - channel(i)->get_left_block(), 0); - } - catch (std::exception& e) - { - LOG_AT_LEVEL(ERROR) - << "Can't connect signal conditioner to channel " << i; - LOG_AT_LEVEL(ERROR) << e.what(); - top_block_->disconnect_all(); - return; - } + channel(i)->set_signal(available_GNSS_signals_.front()); + std::cout << "Channel " << i << " assigned to " + << available_GNSS_signals_.front() << std::endl; + available_GNSS_signals_.pop_front(); + channel(i)->start(); + //channel(i)->start_acquisition(); - DLOG(INFO) << "signal conditioner connected to channel " << i; + DLOG(INFO) << "Channel " << i + << " connected to observables and ready for acquisition"; + } + /* + * Connect the observables output of each channel to the PVT block + */ + try { + for (unsigned int i = 0; i < channels_count_; i++) { + top_block_->connect(observables()->get_right_block(), i, + pvt()->get_left_block(), i); + } + } catch (std::exception& e) { + LOG_AT_LEVEL(ERROR) << "Can't connect observables to PVT"; + LOG_AT_LEVEL(ERROR) << e.what(); + top_block_->disconnect_all(); + return; + } - // Signal Source > Signal conditioner >> Channels >> Observables - try - { - top_block_->connect(channel(i)->get_right_block(), 0, - observables()->get_left_block(), i); - } - catch (std::exception& e) - { - LOG_AT_LEVEL(ERROR) << "Can't connect channel " << i - << " to observables"; - LOG_AT_LEVEL(ERROR) << e.what(); - top_block_->disconnect_all(); - return; - } + try { + top_block_->connect(pvt()->get_right_block(), 0, + output_filter()->get_left_block(), 0); + } catch (std::exception& e) { + LOG_AT_LEVEL(ERROR) << "Can't connect PVT to output filter"; + LOG_AT_LEVEL(ERROR) << e.what(); + top_block_->disconnect_all(); + return; + } - channel(i)->set_satellite(available_GPS_satellites_IDs_->front()); - std::cout << "Channel " << i << " satellite " - << available_GPS_satellites_IDs_->front() << std::endl; - available_GPS_satellites_IDs_->pop_front(); - channel(i)->start(); - //channel(i)->start_acquisition(); + DLOG(INFO) << "PVT connected to output filter"; - DLOG(INFO) << "Channel " << i - << " connected to observables and ready for acquisition"; - } - /* - * Connect the observables output of each channel to the PVT block - */ - try - { - for (unsigned int i = 0; i < channels_count_; i++) - { - top_block_->connect(observables()->get_right_block(), i, - pvt()->get_left_block(), i); - } - } - catch (std::exception& e) - { - LOG_AT_LEVEL(ERROR) << "Can't connect observables to PVT"; - LOG_AT_LEVEL(ERROR) << e.what(); - top_block_->disconnect_all(); - return; - } - - try - { - top_block_->connect(pvt()->get_right_block(), 0, - output_filter()->get_left_block(), 0); - } - catch (std::exception& e) - { - LOG_AT_LEVEL(ERROR) << "Can't connect PVT to output filter"; - LOG_AT_LEVEL(ERROR) << e.what(); - top_block_->disconnect_all(); - return; - } - - DLOG(INFO) << "PVT connected to output filter"; - - connected_ = true; - DLOG(INFO) << "Flowgraph connected"; - top_block_->dump(); + connected_ = true; + DLOG(INFO) << "Flowgraph connected"; + top_block_->dump(); } -void GNSSFlowgraph::wait() -{ - if (!running_) - { - LOG_AT_LEVEL(WARNING) << "Can't apply wait. Flowgraph is not running"; - return; - } - top_block_->wait(); - DLOG(INFO) << "Flowgraph finished calculations"; - running_ = false; +void GNSSFlowgraph::wait() { + if (!running_) { + LOG_AT_LEVEL(WARNING) << "Can't apply wait. Flowgraph is not running"; + return; + } + top_block_->wait(); + DLOG(INFO) << "Flowgraph finished calculations"; + running_ = false; } /* @@ -324,179 +270,168 @@ void GNSSFlowgraph::wait() * \param[in] who Who generated the action * \param[in] what What is the action 0: acquisition failed */ -void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) -{ - DLOG(INFO) << "received " << what << " from " << who; +void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) { + DLOG(INFO) << "received " << what << " from " << who; - switch (what) - { - case 0: + switch (what) { + case 0: - LOG_AT_LEVEL(INFO) << "Channel " << who - << " ACQ FAILED satellite " << channel(who)->get_satellite(); - available_GPS_satellites_IDs_->push_back( - channel(who)->get_satellite()); - channel(who)->set_satellite( - available_GPS_satellites_IDs_->front()); - available_GPS_satellites_IDs_->pop_front(); - channel(who)->start_acquisition(); - break; - // TODO: Tracking messages + LOG_AT_LEVEL(INFO) << "Channel " << who << " ACQ FAILED satellite " + << channel(who)->get_signal().get_satellite(); + available_GNSS_signals_.push_back(channel(who)->get_signal()); + channel(who)->set_signal(available_GNSS_signals_.front()); + available_GNSS_signals_.pop_front(); + channel(who)->start_acquisition(); + break; + // TODO: Tracking messages - default: - break; - } + default: + break; + } - DLOG(INFO) << "Number of available satellites: " - << available_GPS_satellites_IDs_->size(); + DLOG(INFO) << "Number of available satellites: " + << available_GNSS_signals_.size(); } -void GNSSFlowgraph::set_configuration(ConfigurationInterface* configuration) -{ - if (running_) - { - LOG_AT_LEVEL(WARNING) << "Unable to update configuration while flowgraph running"; - return; - } +void GNSSFlowgraph::set_configuration(ConfigurationInterface* configuration) { + if (running_) { + LOG_AT_LEVEL(WARNING) + << "Unable to update configuration while flowgraph running"; + return; + } - if (connected_) - { - LOG_AT_LEVEL(WARNING) << "Unable to update configuration while flowgraph connected"; - } + if (connected_) { + LOG_AT_LEVEL(WARNING) + << "Unable to update configuration while flowgraph connected"; + } - configuration_ = configuration; + configuration_ = configuration; } -GNSSBlockInterface* GNSSFlowgraph::signal_source() -{ - return blocks_->at(0); +GNSSBlockInterface* GNSSFlowgraph::signal_source() { + return blocks_->at(0); } -GNSSBlockInterface* GNSSFlowgraph::signal_conditioner() -{ - return blocks_->at(1); +GNSSBlockInterface* GNSSFlowgraph::signal_conditioner() { + return blocks_->at(1); } -ChannelInterface* GNSSFlowgraph::channel(unsigned int index) -{ - return (ChannelInterface*)blocks_->at(index + 5); +ChannelInterface* GNSSFlowgraph::channel(unsigned int index) { + return (ChannelInterface*) blocks_->at(index + 5); } -GNSSBlockInterface* GNSSFlowgraph::observables() -{ - return blocks_->at(2); +GNSSBlockInterface* GNSSFlowgraph::observables() { + return blocks_->at(2); } -GNSSBlockInterface* GNSSFlowgraph::pvt() -{ - return blocks_->at(3); +GNSSBlockInterface* GNSSFlowgraph::pvt() { + return blocks_->at(3); } -GNSSBlockInterface* GNSSFlowgraph::output_filter() -{ - return blocks_->at(4); +GNSSBlockInterface* GNSSFlowgraph::output_filter() { + return blocks_->at(4); } +void GNSSFlowgraph::init() { + /* + * Instantiates the receiver blocks + */ + blocks_->push_back(block_factory_->GetSignalSource(configuration_, queue_)); + blocks_->push_back(block_factory_->GetSignalConditioner(configuration_, + queue_)); + blocks_->push_back(block_factory_->GetObservables(configuration_, queue_)); + blocks_->push_back(block_factory_->GetPVT(configuration_, queue_)); + blocks_->push_back(block_factory_->GetOutputFilter(configuration_, queue_)); + std::vector* channels = block_factory_->GetChannels( + configuration_, queue_); + channels_count_ = channels->size(); -void GNSSFlowgraph::init() -{ - /* - * Instantiates the receiver blocks - */ - blocks_->push_back( - block_factory_->GetSignalSource(configuration_, queue_)); - blocks_->push_back(block_factory_->GetSignalConditioner(configuration_, - queue_)); - blocks_->push_back(block_factory_->GetObservables(configuration_, queue_)); - blocks_->push_back(block_factory_->GetPVT(configuration_, queue_)); - blocks_->push_back( - block_factory_->GetOutputFilter(configuration_, queue_)); + for (unsigned int i = 0; i < channels_count_; i++) { + blocks_->push_back(channels->at(i)); + } - std::vector* channels = block_factory_->GetChannels( - configuration_, queue_); + top_block_ = gr_make_top_block("GNSSFlowgraph"); - channels_count_ = channels->size(); + delete channels; - for (unsigned int i = 0; i < channels_count_; i++) - { - blocks_->push_back(channels->at(i)); - } + // fill the available_GNSS_signals_ queue with the satellites ID's to be searched by the acquisition - top_block_ = gr_make_top_block("GNSSFlowgraph"); + set_signals_list(); - delete channels; + applied_actions_ = 0; - // fill the available_GPS_satellites_IDs_ queue with the satellites ID's to be searched by the acquisition - - set_satellites_list(); - - applied_actions_ = 0; - - DLOG(INFO) << "Blocks instantiated. " << channels_count_ - << " channels."; + DLOG(INFO) << "Blocks instantiated. " << channels_count_ << " channels."; } -void GNSSFlowgraph::set_satellites_list() -{ +void GNSSFlowgraph::set_signals_list() { - /* - * Sets a sequential list of satellites (1...32) - */ + /* + * Sets a sequential list of satellites (1...32) + */ - /* - * \TODO Describe GNSS satellites more nicely, with RINEX notation - * See http://igscb.jpl.nasa.gov/igscb/data/format/rinex301.pdf (page 5) - */ - std::set available_gps_prn = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23 , 25, 26, 27, 28, 29, 30, - 31, 32}; + /* + * \TODO Describe GNSS satellites more nicely, with RINEX notation + * See http://igscb.jpl.nasa.gov/igscb/data/format/rinex301.pdf (page 5) + */ + std::set available_gps_prn = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 25, 26, 27, 28, + 29, 30, 31, 32 }; + + std::set::iterator available_gps_prn_iter; + + Gnss_Signal signal_value; + + /* + * Loop to create the list of GNSS Signals + * To add signals from other systems, add another loop 'for' + */ + + for (available_gps_prn_iter = available_gps_prn.begin(); available_gps_prn_iter + != available_gps_prn.end(); available_gps_prn_iter++) { + signal_value = Gnss_Signal(Gnss_Satellite(std::string("GPS"), *available_gps_prn_iter),std::string("1C")); + available_GNSS_signals_.push_back(signal_value); + } + + std::list::iterator gnss_it = + available_GNSS_signals_.begin(); + + for (unsigned int i = 0; i < channels_count_; i++) { + std::string default_system = "GPS"; + std::string default_signal = "1C"; + + std::string gnss_system = (configuration_->property("Channel" + + boost::lexical_cast(i) + ".system", + default_system)); + std::string gnss_signal = (configuration_->property("Channel" + + boost::lexical_cast(i) + ".signal", + default_signal)); + unsigned int sat = configuration_->property("Channel" + + boost::lexical_cast(i) + ".satellite", 0); - std::set::iterator available_gps_prn_iter; + if ((sat == 0) || (sat == gnss_it->get_satellite().get_PRN())) // 0 = not PRN in configuration file + { + gnss_it++; + } else { + signal_value = Gnss_Signal(Gnss_Satellite(gnss_system, sat),gnss_signal); + available_GNSS_signals_.remove(signal_value); + available_GNSS_signals_.insert(gnss_it, signal_value); + } - for (available_gps_prn_iter = available_gps_prn.begin(); - available_gps_prn_iter != available_gps_prn.end(); - available_gps_prn_iter++) - { - sv = Gnss_Satellite(std::string("GPS"), *available_gps_prn_iter); - available_GPS_satellites_IDs_->push_back(sv); - } - - std::list::iterator it = - available_GPS_satellites_IDs_->begin(); - - for (unsigned int i = 0; i < channels_count_; i++) - { - unsigned int sat = configuration_->property("Acquisition" + boost::lexical_cast(i) + ".satellite", 0); - if ((sat == 0) || (sat == it->get_PRN())) // 0 = not PRN in configuration file - { - it++; - } - else - { - sv = Gnss_Satellite(std::string("GPS"), it->get_PRN()); - available_GPS_satellites_IDs_->remove(sv); - available_GPS_satellites_IDs_->insert(it, sv); - } - } - - // std::cout << "Satellite queue: "; - // for (std::list::iterator it = - // available_GPS_satellites_IDs_->begin(); it - // != available_GPS_satellites_IDs_->end(); it++) - // { - // std::cout << *it << ", "; - // } - // std::cout << std::endl; + } + std::cout << "Signal queue: " << std::endl; + for (std::list::iterator it = + available_GNSS_signals_.begin(); it + != available_GNSS_signals_.end(); it++) { + std::cout << *it << std::endl; + } } -void GNSSFlowgraph::apply_action(unsigned int what) -{ - DLOG(INFO) << "Applied action " << what << " to flowgraph"; - applied_actions_++; +void GNSSFlowgraph::apply_action(unsigned int what) { + DLOG(INFO) << "Applied action " << what << " to flowgraph"; + applied_actions_++; } diff --git a/src/core/receiver/gnss_flowgraph.h b/src/core/receiver/gnss_flowgraph.h index cb45db7dd..ac4ce966a 100644 --- a/src/core/receiver/gnss_flowgraph.h +++ b/src/core/receiver/gnss_flowgraph.h @@ -41,7 +41,7 @@ #include #include #include "GPS_L1_CA.h" -#include "gnss_satellite.h" +#include "gnss_signal.h" class GNSSBlockInterface; class ChannelInterface; @@ -117,7 +117,7 @@ private: void init(); void apply_action(unsigned int what); - void set_satellites_list(); + void set_signals_list(); bool connected_; bool running_; @@ -134,10 +134,8 @@ private: gr_top_block_sptr top_block_; gr_msg_queue_sptr queue_; - std::list* available_GPS_satellites_IDs_; - std::queue* available_Galileo_satellites_IDs_; + std::list available_GNSS_signals_; - Gnss_Satellite sv; }; #endif /*GNSS_SDR_GNSS_FLOWGRAPH_H_*/ diff --git a/src/core/system_parameters/gnss_signal.cc b/src/core/system_parameters/gnss_signal.cc index 405032fd3..e0e1e4e52 100644 --- a/src/core/system_parameters/gnss_signal.cc +++ b/src/core/system_parameters/gnss_signal.cc @@ -43,12 +43,33 @@ Gnss_Signal::~Gnss_Signal() { } -std::string Gnss_Signal::get_signal() +std::string Gnss_Signal::get_signal() const { return this->signal; } -Gnss_Satellite Gnss_Signal::get_satellite() +Gnss_Satellite Gnss_Signal::get_satellite() const { return this->satellite; } +std::ostream& operator<<(std::ostream &out, const Gnss_Signal &sig) // output +{ + //std::string psystem = sat::get_system() + out << sig.get_satellite() << " Signal " << sig.get_signal() ; + return out; +} + +bool operator== (const Gnss_Signal &sig1, const Gnss_Signal &sig2) +{ + bool equal = false; + + if (sig1.get_satellite() == sig2.get_satellite()) + { + if (sig1.get_signal() == (sig2.get_signal())) + { + equal = true; + } + } + return equal; +} + diff --git a/src/core/system_parameters/gnss_signal.h b/src/core/system_parameters/gnss_signal.h index 66612e0c7..258647c3d 100644 --- a/src/core/system_parameters/gnss_signal.h +++ b/src/core/system_parameters/gnss_signal.h @@ -49,8 +49,11 @@ public: Gnss_Signal(); Gnss_Signal(Gnss_Satellite satellite_,std::string signal_); ~Gnss_Signal(); - std::string get_signal(); - Gnss_Satellite get_satellite(); + std::string get_signal() const; + Gnss_Satellite get_satellite() const; + friend bool operator== (const Gnss_Signal &, const Gnss_Signal &); // operator== for comparison + friend std::ostream& operator<<(std::ostream &, const Gnss_Signal &); // operator<< for pretty printing + }; #endif diff --git a/src/tests/jamfile.jam b/src/tests/jamfile.jam index c14f02e8c..6f9f09174 100644 --- a/src/tests/jamfile.jam +++ b/src/tests/jamfile.jam @@ -55,6 +55,8 @@ exe run_tests : test_main.cc ../core/receiver//gnss_flowgraph ../core/system_parameters//gps_navigation_message ../core/system_parameters//gnss_satellite +../core/system_parameters//gnss_signal +../core/system_parameters//gnss_synchro ../..//gflags ../..//glog ../..//gnuradio-core