Major changes in flowgraph, configuration file and channel. Added gnss_signal class.

git-svn-id: https://svn.code.sf.net/p/gnss-sdr/code/trunk@146 64b25241-fba3-4117-9849-534c7e92360d
This commit is contained in:
Luis Esteve 2012-01-27 11:58:55 +00:00
parent 22925909fd
commit ec57e48f4e
13 changed files with 642 additions and 529 deletions

View File

@ -17,8 +17,7 @@ ControlThread.wait_for_flowgraph=false
SignalSource.implementation=File_Signal_Source SignalSource.implementation=File_Signal_Source
;#filename: path to file with the captured GNSS signal samples to be processed ;#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. ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version.
SignalSource.item_type=gr_complex SignalSource.item_type=gr_complex
@ -48,10 +47,90 @@ SignalConditioner.sample_freq_in=4000000
SignalConditioner.sample_freq_out=4000000 SignalConditioner.sample_freq_out=4000000
SignalConditioner.dump=false SignalConditioner.dump=false
;######### CHANNELS CONFIGURATION CONFIG ############ ;######### CHANNELS GLOBAL CONFIG ############
;#count: Number of avalable satellite channels. ;#count: Number of available satellite channels.
Channels.count=4 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 ############ ;######### ACQUISITION GLOBAL CONFIG ############
;#dump: Enable or disable the acquisition internal data file logging [true] or [false] ;#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. ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version.
Acquisition.item_type=gr_complex Acquisition.item_type=gr_complex
;#if: Signal intermediate frequency in [Hz] ;#if: Signal intermediate frequency in [Hz]
Acquisition.if=0 Acquisition.if=0
@ -76,7 +156,7 @@ Acquisition.sampled_ms=1
Acquisition0.implementation=GPS_L1_CA_PCPS_Acquisition Acquisition0.implementation=GPS_L1_CA_PCPS_Acquisition
;#threshold: Acquisition threshold ;#threshold: Acquisition threshold
Acquisition0.threshold=60 Acquisition0.threshold=70
;#doppler_max: Maximum expected Doppler shift [Hz] ;#doppler_max: Maximum expected Doppler shift [Hz]
Acquisition0.doppler_max=10000 Acquisition0.doppler_max=10000
@ -84,43 +164,36 @@ Acquisition0.doppler_max=10000
;#doppler_max: Doppler step in the grid search [Hz] ;#doppler_max: Doppler step in the grid search [Hz]
Acquisition0.doppler_step=250 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. ;#repeat_satellite: Use only jointly with the satellte PRN ID option.
;#Enable repeat_satellite to keep searching the same satellite during the runtime. ;#Enable repeat_satellite to keep searching the same satellite during the runtime.
;Acquisition0.repeat_satellite=true ;Acquisition0.repeat_satellite=true
;######### ACQUISITION CH 1 CONFIG ############ ;######### ACQUISITION CH 1 CONFIG ############
Acquisition1.implementation=GPS_L1_CA_PCPS_Acquisition Acquisition1.implementation=GPS_L1_CA_PCPS_Acquisition
Acquisition1.threshold=40 Acquisition1.threshold=70
Acquisition1.doppler_max=10000 Acquisition1.doppler_max=10000
Acquisition1.doppler_step=250 Acquisition1.doppler_step=250
;Acquisition1.satellite=32
;Acquisition1.repeat_satellite=true ;Acquisition1.repeat_satellite=true
;######### ACQUISITION CH 2 CONFIG ############ ;######### ACQUISITION CH 2 CONFIG ############
Acquisition2.implementation=GPS_L1_CA_PCPS_Acquisition Acquisition2.implementation=GPS_L1_CA_PCPS_Acquisition
Acquisition2.threshold=40 Acquisition2.threshold=70
Acquisition2.doppler_max=10000 Acquisition2.doppler_max=10000
Acquisition2.doppler_step=250 Acquisition2.doppler_step=250
;Acquisition2.satellite=11
;Acquisition2.repeat_satellite=true ;Acquisition2.repeat_satellite=true
;######### ACQUISITION CH 3 CONFIG ############ ;######### ACQUISITION CH 3 CONFIG ############
Acquisition3.implementation=GPS_L1_CA_PCPS_Acquisition Acquisition3.implementation=GPS_L1_CA_PCPS_Acquisition
Acquisition3.threshold=40 Acquisition3.threshold=70
Acquisition3.doppler_max=10000 Acquisition3.doppler_max=10000
Acquisition3.doppler_step=250 Acquisition3.doppler_step=250
;Acquisition3.satellite=1
;Acquisition3.repeat_satellite=true ;Acquisition3.repeat_satellite=true
;######### ACQUISITION CH 4 CONFIG ############ ;######### ACQUISITION CH 4 CONFIG ############
Acquisition4.implementation=GPS_L1_CA_PCPS_Acquisition Acquisition4.implementation=GPS_L1_CA_PCPS_Acquisition
Acquisition4.threshold=40 Acquisition4.threshold=70
Acquisition4.doppler_max=10000 Acquisition4.doppler_max=10000
Acquisition4.doppler_step=250 Acquisition4.doppler_step=250
;Acquisition4.satellite=31
;Acquisition4.repeat_satellite=true ;Acquisition4.repeat_satellite=true
;######### ACQUISITION CH 5 CONFIG ############ ;######### ACQUISITION CH 5 CONFIG ############
@ -128,29 +201,26 @@ Acquisition5.implementation=GPS_L1_CA_PCPS_Acquisition
Acquisition5.threshold=70 Acquisition5.threshold=70
Acquisition5.doppler_max=10000 Acquisition5.doppler_max=10000
Acquisition5.doppler_step=250 Acquisition5.doppler_step=250
;Acquisition5.satellite=20
;Acquisition5.repeat_satellite=true ;Acquisition5.repeat_satellite=true
;######### ACQUISITION CH 6 CONFIG ############ ;######### ACQUISITION CH 6 CONFIG ############
Acquisition6.implementation=GPS_L1_CA_PCPS_Acquisition Acquisition6.implementation=GPS_L1_CA_PCPS_Acquisition
Acquisition6.threshold=60 Acquisition6.threshold=70
Acquisition6.doppler_max=10000 Acquisition6.doppler_max=10000
Acquisition6.doppler_step=250 Acquisition6.doppler_step=250
;Acquisition6.satellite=22
;Acquisition6.repeat_satellite=true ;Acquisition6.repeat_satellite=true
;######### ACQUISITION CH 7 CONFIG ############ ;######### ACQUISITION CH 7 CONFIG ############
Acquisition7.implementation=GPS_L1_CA_PCPS_Acquisition Acquisition7.implementation=GPS_L1_CA_PCPS_Acquisition
Acquisition7.threshold=60 Acquisition7.threshold=70
Acquisition7.doppler_max=10000 Acquisition7.doppler_max=10000
Acquisition7.doppler_step=250 Acquisition7.doppler_step=250
;Acquisition7.satellite=23
;Acquisition7.repeat_satellite=true ;Acquisition7.repeat_satellite=true
;######### TRACKING GLOBAL CONFIG ############ ;######### TRACKING GLOBAL CONFIG ############
;#implementatiion: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_FLL_PLL_Tracking] ;#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. ;#item_type: Type and resolution for each of the signal samples. Use only [gr_complex] in this version.
Tracking.item_type=gr_complex Tracking.item_type=gr_complex
@ -220,4 +290,4 @@ PVT.dump_filename=./PVT
;# Receiver output filter: Leave this block disabled in this version ;# Receiver output filter: Leave this block disabled in this version
OutputFilter.implementation=Null_Sink_Output_Filter OutputFilter.implementation=Null_Sink_Output_Filter
OutputFilter.filename=data/gnss-sdr.dat OutputFilter.filename=data/gnss-sdr.dat
OutputFilter.item_type=gr_complex OutputFilter.item_type=gr_complex

View File

@ -47,10 +47,90 @@ SignalConditioner.sample_freq_in=4000000
SignalConditioner.sample_freq_out=4000000 SignalConditioner.sample_freq_out=4000000
SignalConditioner.dump=false SignalConditioner.dump=false
;######### CHANNELS CONFIGURATION CONFIG ############ ;######### CHANNELS GLOBAL CONFIG ############
;#count: Number of avalable satellite channels. ;#count: Number of available satellite channels.
Channels.count=4 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 ############ ;######### ACQUISITION GLOBAL CONFIG ############
;#dump: Enable or disable the acquisition internal data file logging [true] or [false] ;#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] ;#doppler_max: Doppler step in the grid search [Hz]
Acquisition0.doppler_step=250 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. ;#repeat_satellite: Use only jointly with the satellte PRN ID option.
;#Enable repeat_satellite to keep searching the same satellite during the runtime. ;#Enable repeat_satellite to keep searching the same satellite during the runtime.
;Acquisition0.repeat_satellite=true ;Acquisition0.repeat_satellite=true
@ -96,7 +173,6 @@ Acquisition1.implementation=GPS_L1_CA_PCPS_Acquisition
Acquisition1.threshold=70 Acquisition1.threshold=70
Acquisition1.doppler_max=10000 Acquisition1.doppler_max=10000
Acquisition1.doppler_step=250 Acquisition1.doppler_step=250
;Acquisition1.satellite=32
;Acquisition1.repeat_satellite=true ;Acquisition1.repeat_satellite=true
;######### ACQUISITION CH 2 CONFIG ############ ;######### ACQUISITION CH 2 CONFIG ############
@ -104,7 +180,6 @@ Acquisition2.implementation=GPS_L1_CA_PCPS_Acquisition
Acquisition2.threshold=70 Acquisition2.threshold=70
Acquisition2.doppler_max=10000 Acquisition2.doppler_max=10000
Acquisition2.doppler_step=250 Acquisition2.doppler_step=250
;Acquisition2.satellite=11
;Acquisition2.repeat_satellite=true ;Acquisition2.repeat_satellite=true
;######### ACQUISITION CH 3 CONFIG ############ ;######### ACQUISITION CH 3 CONFIG ############
@ -112,7 +187,6 @@ Acquisition3.implementation=GPS_L1_CA_PCPS_Acquisition
Acquisition3.threshold=70 Acquisition3.threshold=70
Acquisition3.doppler_max=10000 Acquisition3.doppler_max=10000
Acquisition3.doppler_step=250 Acquisition3.doppler_step=250
;Acquisition3.satellite=1
;Acquisition3.repeat_satellite=true ;Acquisition3.repeat_satellite=true
;######### ACQUISITION CH 4 CONFIG ############ ;######### ACQUISITION CH 4 CONFIG ############
@ -120,7 +194,6 @@ Acquisition4.implementation=GPS_L1_CA_PCPS_Acquisition
Acquisition4.threshold=70 Acquisition4.threshold=70
Acquisition4.doppler_max=10000 Acquisition4.doppler_max=10000
Acquisition4.doppler_step=250 Acquisition4.doppler_step=250
;Acquisition4.satellite=31
;Acquisition4.repeat_satellite=true ;Acquisition4.repeat_satellite=true
;######### ACQUISITION CH 5 CONFIG ############ ;######### ACQUISITION CH 5 CONFIG ############
@ -128,7 +201,6 @@ Acquisition5.implementation=GPS_L1_CA_PCPS_Acquisition
Acquisition5.threshold=70 Acquisition5.threshold=70
Acquisition5.doppler_max=10000 Acquisition5.doppler_max=10000
Acquisition5.doppler_step=250 Acquisition5.doppler_step=250
;Acquisition5.satellite=20
;Acquisition5.repeat_satellite=true ;Acquisition5.repeat_satellite=true
;######### ACQUISITION CH 6 CONFIG ############ ;######### ACQUISITION CH 6 CONFIG ############
@ -136,7 +208,6 @@ Acquisition6.implementation=GPS_L1_CA_PCPS_Acquisition
Acquisition6.threshold=70 Acquisition6.threshold=70
Acquisition6.doppler_max=10000 Acquisition6.doppler_max=10000
Acquisition6.doppler_step=250 Acquisition6.doppler_step=250
;Acquisition6.satellite=22
;Acquisition6.repeat_satellite=true ;Acquisition6.repeat_satellite=true
;######### ACQUISITION CH 7 CONFIG ############ ;######### ACQUISITION CH 7 CONFIG ############
@ -144,7 +215,6 @@ Acquisition7.implementation=GPS_L1_CA_PCPS_Acquisition
Acquisition7.threshold=70 Acquisition7.threshold=70
Acquisition7.doppler_max=10000 Acquisition7.doppler_max=10000
Acquisition7.doppler_step=250 Acquisition7.doppler_step=250
;Acquisition7.satellite=23
;Acquisition7.repeat_satellite=true ;Acquisition7.repeat_satellite=true
;######### TRACKING GLOBAL CONFIG ############ ;######### TRACKING GLOBAL CONFIG ############

View File

@ -69,6 +69,7 @@ public:
gr_basic_block_sptr get_left_block(); gr_basic_block_sptr get_left_block();
gr_basic_block_sptr get_right_block(); gr_basic_block_sptr get_right_block();
void set_synchro(Gnss_Synchro p_gnss_synchro);
void set_satellite(Gnss_Satellite satellite); void set_satellite(Gnss_Satellite satellite);
void set_channel(unsigned int channel); void set_channel(unsigned int channel);
void set_threshold(float threshold); void set_threshold(float threshold);
@ -92,6 +93,7 @@ private:
size_t item_size_; size_t item_size_;
std::string item_type_; std::string item_type_;
unsigned int vector_length_; unsigned int vector_length_;
Gnss_Synchro* gnss_synchro_;
Gnss_Satellite gnss_satellite_; Gnss_Satellite gnss_satellite_;
//unsigned int satellite_; //unsigned int satellite_;
unsigned int channel_; unsigned int channel_;

View File

@ -71,11 +71,13 @@ gps_l1_ca_pcps_acquisition_cc::gps_l1_ca_pcps_acquisition_cc(
d_doppler_max = doppler_max; d_doppler_max = doppler_max;
d_satellite = Gnss_Satellite(); d_satellite = Gnss_Satellite();
d_fft_size = d_sampled_ms * d_samples_per_ms; d_fft_size = d_sampled_ms * d_samples_per_ms;
d_doppler_freq = 0.0; //d_doppler_freq = 0.0;
d_code_phase = 0; //d_code_phase = 0;
d_mag = 0; d_mag = 0;
d_input_power = 0.0; d_input_power = 0.0;
d_gnss_synchro = new Gnss_Synchro();
d_sine_if = new gr_complex[d_fft_size]; d_sine_if = new gr_complex[d_fft_size];
d_fft_codes = (gr_complex*)malloc(sizeof(gr_complex) * d_samples_per_ms); 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() gps_l1_ca_pcps_acquisition_cc::~gps_l1_ca_pcps_acquisition_cc()
{ {
delete d_gnss_synchro;
delete[] d_sine_if; delete[] d_sine_if;
delete[] d_fft_codes; delete[] d_fft_codes;
delete d_ifft; delete d_ifft;
delete d_fft_if; delete d_fft_if;
if (d_dump) if (d_dump)
{ {
d_dump_file.close(); 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) void gps_l1_ca_pcps_acquisition_cc::set_satellite(Gnss_Satellite satellite)
{ {
d_satellite = Gnss_Satellite(satellite.get_system(), satellite.get_PRN()); d_satellite = Gnss_Satellite(satellite.get_system(), satellite.get_PRN());
d_code_phase = 0; // ¿qué diferencia hay con d_satellite=satellite; ?
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_mag = 0.0;
d_input_power = 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() //TODO Optimize it ! try conj()
for (unsigned int i = 0; i < d_fft_size; i++) for (unsigned int i = 0; i < d_fft_size; i++)
{ {
//d_fft_codes[i] = std::complex<float>(
// d_fft_if->get_outbuf()[i].real(),
// -d_fft_if->get_outbuf()[i].imag());
d_fft_codes[i] = std::complex<float>(conj(d_fft_if->get_outbuf()[i])); d_fft_codes[i] = std::complex<float>(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 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, 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_int &ninput_items, gr_vector_const_void_star &input_items,
gr_vector_void_star &output_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 //restart acquisition variables
d_code_phase = 0; d_gnss_synchro->Acq_delay_samples=0.0;
d_doppler_freq = 0; d_gnss_synchro->Acq_doppler_hz=0.0;
//d_code_phase = 0;
//d_doppler_freq = 0;
d_mag = 0.0; d_mag = 0.0;
d_input_power = 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) if (d_mag < magt)
{ {
d_mag = magt; d_mag = magt;
d_code_phase = indext; d_gnss_synchro->Acq_delay_samples= (double)indext;
d_doppler_freq = doppler; 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) << "sample_stamp " << d_sample_counter;
DLOG(INFO) << "test statistics value " << d_test_statistics; DLOG(INFO) << "test statistics value " << d_test_statistics;
DLOG(INFO) << "test statistics threshold " << d_threshold; DLOG(INFO) << "test statistics threshold " << d_threshold;
DLOG(INFO) << "code phase " << d_code_phase; DLOG(INFO) << "code phase " << d_gnss_synchro->Acq_delay_samples;
DLOG(INFO) << "doppler " << d_doppler_freq; DLOG(INFO) << "doppler " << d_gnss_synchro->Acq_doppler_hz;
DLOG(INFO) << "magnitude " << d_mag; DLOG(INFO) << "magnitude " << d_mag;
DLOG(INFO) << "input signal power " << d_input_power; 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) << "sample_stamp " << d_sample_counter;
DLOG(INFO) << "test statistics value " << d_test_statistics; DLOG(INFO) << "test statistics value " << d_test_statistics;
DLOG(INFO) << "test statistics threshold " << d_threshold; DLOG(INFO) << "test statistics threshold " << d_threshold;
DLOG(INFO) << "code phase " << d_code_phase; DLOG(INFO) << "code phase " << d_gnss_synchro->Acq_delay_samples;
DLOG(INFO) << "doppler " << d_doppler_freq; DLOG(INFO) << "doppler " << d_gnss_synchro->Acq_doppler_hz;
DLOG(INFO) << "magnitude " << d_mag; DLOG(INFO) << "magnitude " << d_mag;
DLOG(INFO) << "input signal power " << d_input_power; DLOG(INFO) << "input signal power " << d_input_power;
} }

View File

@ -44,128 +44,135 @@
#include <boost/thread/thread.hpp> #include <boost/thread/thread.hpp>
#include "concurrent_queue.h" #include "concurrent_queue.h"
#include "gnss_satellite.h" #include "gnss_satellite.h"
#include "gnss_synchro.h"
class gps_l1_ca_pcps_acquisition_cc; class gps_l1_ca_pcps_acquisition_cc;
typedef boost::shared_ptr<gps_l1_ca_pcps_acquisition_cc> typedef boost::shared_ptr<gps_l1_ca_pcps_acquisition_cc>
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_acquisition_cc_sptr
gps_l1_ca_pcps_make_acquisition_cc(unsigned int sampled_ms, gps_l1_ca_pcps_make_acquisition_cc(unsigned int sampled_ms,
unsigned int doppler_max, long freq, long fs_in, int samples_per_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); gr_msg_queue_sptr queue, bool dump, std::string dump_filename);
/*! /*!
* \brief This class implements a PCPS acquisition block for GPS L1 C/A * \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: private:
friend gps_l1_ca_pcps_acquisition_cc_sptr friend gps_l1_ca_pcps_acquisition_cc_sptr
gps_l1_ca_pcps_make_acquisition_cc(unsigned int sampled_ms, gps_l1_ca_pcps_make_acquisition_cc(unsigned int sampled_ms,
unsigned int doppler_max, long freq, long fs_in, unsigned int doppler_max, long freq, long fs_in,
int samples_per_ms, gr_msg_queue_sptr queue, bool dump, int samples_per_ms, gr_msg_queue_sptr queue, bool dump,
std::string dump_filename); std::string dump_filename);
gps_l1_ca_pcps_acquisition_cc(unsigned int sampled_ms, gps_l1_ca_pcps_acquisition_cc(unsigned int sampled_ms,
unsigned int doppler_max, long freq, long fs_in, unsigned int doppler_max, long freq, long fs_in,
int samples_per_ms, gr_msg_queue_sptr queue, bool dump, int samples_per_ms, gr_msg_queue_sptr queue, bool dump,
std::string dump_filename); std::string dump_filename);
void calculate_magnitudes(gr_complex* fft_begin, int doppler_shift, void calculate_magnitudes(gr_complex* fft_begin, int doppler_shift,
int doppler_offset); int doppler_offset);
long d_fs_in; long d_fs_in;
long d_freq; long d_freq;
int d_samples_per_ms; int d_samples_per_ms;
unsigned int d_doppler_resolution; unsigned int d_doppler_resolution;
Gnss_Satellite d_satellite; Gnss_Satellite d_satellite;
float d_threshold; float d_threshold;
std::string d_satellite_str; std::string d_satellite_str;
unsigned int d_doppler_max; unsigned int d_doppler_max;
unsigned int d_doppler_step; unsigned int d_doppler_step;
unsigned int d_sampled_ms; unsigned int d_sampled_ms;
unsigned int d_fft_size; unsigned int d_fft_size;
unsigned long int d_sample_counter; unsigned long int d_sample_counter;
unsigned long int d_acq_sample_stamp; unsigned long int d_acq_sample_stamp;
gr_complex* d_sine_if; 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; Gnss_Synchro *d_gnss_synchro;
float d_doppler_freq; unsigned int d_code_phase;
float d_mag; float d_doppler_freq;
float d_input_power; float d_mag;
float d_test_statistics; float d_input_power;
float d_test_statistics;
gr_msg_queue_sptr d_queue; gr_msg_queue_sptr d_queue;
concurrent_queue<int> *d_channel_internal_queue; concurrent_queue<int> *d_channel_internal_queue;
std::ofstream d_dump_file; std::ofstream d_dump_file;
bool d_active; bool d_active;
bool d_dump; bool d_dump;
unsigned int d_channel; unsigned int d_channel;
std::string d_dump_filename; std::string d_dump_filename;
public: public:
~gps_l1_ca_pcps_acquisition_cc(); ~gps_l1_ca_pcps_acquisition_cc();
signed int prn_code_phase(); void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro)
float doppler_freq() {
{ d_gnss_synchro = p_gnss_synchro;
return d_doppler_freq; }
} signed int prn_code_phase()
unsigned int mag() {
{ return d_code_phase;
return d_mag; }
} float doppler_freq()
{
return d_doppler_freq;
}
unsigned int mag()
{
return d_mag;
}
unsigned long int get_sample_stamp() unsigned long int get_sample_stamp()
{ {
return d_acq_sample_stamp; return d_acq_sample_stamp;
} }
void set_satellite(Gnss_Satellite satellite); void set_satellite(Gnss_Satellite satellite);
void set_active(bool active) void set_active(bool active)
{ {
d_active = active; d_active = active;
} }
void set_channel(unsigned int channel) void set_channel(unsigned int channel)
{ {
d_channel = channel; d_channel = channel;
} }
void set_threshold(float threshold) void set_threshold(float threshold)
{ {
d_threshold = threshold; d_threshold = threshold;
} }
void set_doppler_max(unsigned int doppler_max) void set_doppler_max(unsigned int doppler_max)
{ {
d_doppler_max = doppler_max; d_doppler_max = doppler_max;
} }
void set_doppler_step(unsigned int doppler_step) void set_doppler_step(unsigned int doppler_step)
{ {
d_doppler_step = doppler_step; d_doppler_step = doppler_step;
} }
void set_channel_queue(concurrent_queue<int> *channel_internal_queue) void set_channel_queue(concurrent_queue<int> *channel_internal_queue)
{ {
d_channel_internal_queue = channel_internal_queue; d_channel_internal_queue = channel_internal_queue;
} }
int general_work(int noutput_items, gr_vector_int &ninput_items, int general_work(int noutput_items, gr_vector_int &ninput_items,
gr_vector_const_void_star &input_items, gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items); gr_vector_void_star &output_items);
}; };
#endif /* GNSS_SDR_GPS_L1_CA_PCPS_ACQUISITION_CC_H*/ #endif /* GNSS_SDR_GPS_L1_CA_PCPS_ACQUISITION_CC_H*/

View File

@ -87,6 +87,7 @@ Channel::Channel(ConfigurationInterface *configuration, unsigned int channel,
connected_ = false; connected_ = false;
message_ = 0; message_ = 0;
gnss_satellite_ = Gnss_Satellite(); 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_); acq_->set_satellite(gnss_satellite_);
trk_->set_satellite(gnss_satellite_); trk_->set_satellite(gnss_satellite_);
nav_->set_satellite(gnss_satellite_); nav_->set_satellite(gnss_satellite_);

View File

@ -41,6 +41,7 @@
#include "gps_l1_ca_channel_fsm.h" #include "gps_l1_ca_channel_fsm.h"
#include "control_message_factory.h" #include "control_message_factory.h"
#include "concurrent_queue.h" #include "concurrent_queue.h"
#include "gnss_signal.h"
class ConfigurationInterface; class ConfigurationInterface;
@ -78,7 +79,7 @@ public:
size_t item_size(){ return 0; } 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_; } AcquisitionInterface* acquisition(){ return acq_; }
@ -87,7 +88,7 @@ public:
TelemetryDecoderInterface* telemetry(){ return nav_; } TelemetryDecoderInterface* telemetry(){ return nav_; }
void start_acquisition(); void start_acquisition();
void set_satellite(Gnss_Satellite satellite); void set_signal(Gnss_Signal gnss_signal_);
void start(); void start();
/*! /*!
@ -108,6 +109,7 @@ private:
unsigned int channel_; unsigned int channel_;
Gnss_Satellite gnss_satellite_; Gnss_Satellite gnss_satellite_;
Gnss_Signal gnss_signal_;
bool connected_; bool connected_;
bool stop_; bool stop_;
int message_; int message_;

View File

@ -38,7 +38,7 @@
#define GNSS_SDR_CHANNEL_INTERFACE_H_ #define GNSS_SDR_CHANNEL_INTERFACE_H_
#include "gnss_block_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. * \brief This abstract class represents an interface to a channel GNSS block.
@ -53,9 +53,9 @@ class ChannelInterface: public GNSSBlockInterface
public: public:
virtual Gnss_Satellite get_satellite() const = 0; virtual Gnss_Signal get_signal() const = 0;
virtual void start_acquisition() = 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 start() = 0;
virtual void stop() = 0; virtual void stop() = 0;
}; };

View File

@ -44,278 +44,224 @@
#include "channel_interface.h" #include "channel_interface.h"
#include "gnss_block_factory.h" #include "gnss_block_factory.h"
using google::LogMessage; using google::LogMessage;
GNSSFlowgraph::GNSSFlowgraph(ConfigurationInterface *configuration, GNSSFlowgraph::GNSSFlowgraph(ConfigurationInterface *configuration,
gr_msg_queue_sptr queue) gr_msg_queue_sptr queue) {
{ connected_ = false;
connected_ = false; running_ = false;
running_ = false; configuration_ = configuration;
configuration_ = configuration; blocks_ = new std::vector<GNSSBlockInterface*>();
blocks_ = new std::vector<GNSSBlockInterface*>(); block_factory_ = new GNSSBlockFactory();
block_factory_ = new GNSSBlockFactory(); queue_ = queue;
queue_ = queue; //available_GNSS_signals_ = new std::list<Gnss_Satellite>();
available_GPS_satellites_IDs_ = new std::list<Gnss_Satellite>();
init(); init();
} }
GNSSFlowgraph::~GNSSFlowgraph() GNSSFlowgraph::~GNSSFlowgraph() {
{
delete block_factory_; delete block_factory_;
for (unsigned int i = 0; i < blocks_->size(); i++) for (unsigned int i = 0; i < blocks_->size(); i++) {
{ delete blocks_->at(i);
delete blocks_->at(i); }
} blocks_->clear();
blocks_->clear();
delete blocks_; delete blocks_;
} }
void GNSSFlowgraph::start() void GNSSFlowgraph::start() {
{ if (running_) {
if (running_) LOG_AT_LEVEL(WARNING) << "Already running";
{ return;
LOG_AT_LEVEL(WARNING) << "Already running"; }
return;
}
try try {
{ top_block_->start();
top_block_->start(); } catch (std::exception& e) {
} LOG_AT_LEVEL(ERROR) << "Unable to start flowgraph";
catch (std::exception& e) LOG_AT_LEVEL(ERROR) << e.what();
{ return;
LOG_AT_LEVEL(ERROR) << "Unable to start flowgraph"; }
LOG_AT_LEVEL(ERROR) << e.what();
return;
}
running_ = true; running_ = true;
} }
void GNSSFlowgraph::stop() void GNSSFlowgraph::stop() {
{ for (unsigned int i = 0; i < channels_count_; i++) {
for (unsigned int i = 0; i < channels_count_; i++) channel(i)->stop();
{ }
channel(i)->stop(); DLOG(INFO) << "Threads finished. Return to main program.";
} top_block_->stop();
DLOG(INFO) << "Threads finished. Return to main program."; running_ = false;
top_block_->stop();
running_ = false;
} }
void GNSSFlowgraph::connect() void GNSSFlowgraph::connect() {
{ /* Connects the blocks in the flowgraph
/* Connects the blocks in the flowgraph *
* * Signal Source > Signal conditioner >> Channels >> Observables >> PVT > Output filter
* Signal Source > Signal conditioner >> Channels >> Observables >> PVT > Output filter */
*/ DLOG(INFO) << "Connecting flowgraph";
DLOG(INFO) << "Connecting flowgraph"; if (connected_) {
if (connected_) LOG_AT_LEVEL(WARNING) << "flowgraph already connected";
{ return;
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 > Signal conditioner >
{ try {
signal_source()->connect(top_block_); signal_conditioner()->connect(top_block_);
} } catch (std::exception& e) {
catch (std::exception& e) LOG_AT_LEVEL(ERROR)
{ << "Can't connect signal conditioner block internally";
LOG_AT_LEVEL(ERROR) << "Can't connect signal source block internally"; LOG_AT_LEVEL(ERROR) << e.what();
LOG_AT_LEVEL(ERROR) << e.what(); top_block_->disconnect_all();
top_block_->disconnect_all(); return;
return; }
}
// Signal Source > Signal conditioner > for (unsigned int i = 0; i < channels_count_; i++) {
try try {
{ channel(i)->connect(top_block_);
signal_conditioner()->connect(top_block_); } catch (std::exception& e) {
} LOG_AT_LEVEL(ERROR) << "Can't connect channel " << i
catch (std::exception& e) << " internally";
{ LOG_AT_LEVEL(ERROR) << e.what();
LOG_AT_LEVEL(ERROR) top_block_->disconnect_all();
<< "Can't connect signal conditioner block internally"; return;
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++) // Signal Source > Signal conditioner >> Channels >> Observables > PVT
{ try {
try pvt()->connect(top_block_);
{ } catch (std::exception& e) {
channel(i)->connect(top_block_); LOG_AT_LEVEL(ERROR) << "Can't connect PVT block internally";
} LOG_AT_LEVEL(ERROR) << e.what();
catch (std::exception& e) top_block_->disconnect_all();
{ return;
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 > 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 DLOG(INFO) << "blocks connected internally";
{
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;
}
// Signal Source > Signal conditioner >> Channels >> Observables > PVT // Signal Source > Signal conditioner >
try try {
{ top_block_->connect(signal_source()->get_right_block(), 0,
pvt()->connect(top_block_); signal_conditioner()->get_left_block(), 0);
} } catch (std::exception& e) {
catch (std::exception& e) LOG_AT_LEVEL(ERROR)
{ << "Can't connect signal source to signal conditioner";
LOG_AT_LEVEL(ERROR) << "Can't connect PVT block internally"; LOG_AT_LEVEL(ERROR) << e.what();
LOG_AT_LEVEL(ERROR) << e.what(); top_block_->disconnect_all();
top_block_->disconnect_all(); return;
return; }
} DLOG(INFO) << "Signal source connected to signal conditioner";
// Signal Source > Signal conditioner >> Channels >> Observables > PVT > Output Filter // Signal Source > Signal conditioner >> channels_count_ number of Channels in parallel
try for (unsigned int i = 0; i < channels_count_; i++) {
{ try {
output_filter()->connect(top_block_); top_block_->connect(signal_conditioner()->get_right_block(), 0,
} channel(i)->get_left_block(), 0);
catch (std::exception& e) } catch (std::exception& e) {
{ LOG_AT_LEVEL(ERROR)
LOG_AT_LEVEL(ERROR) << "Can't connect output filter block internally"; << "Can't connect signal conditioner to channel " << i;
LOG_AT_LEVEL(ERROR) << e.what(); LOG_AT_LEVEL(ERROR) << e.what();
top_block_->disconnect_all(); top_block_->disconnect_all();
return; return;
} }
DLOG(INFO) << "blocks connected internally"; DLOG(INFO) << "signal conditioner connected to channel " << i;
// Signal Source > Signal conditioner > // Signal Source > Signal conditioner >> Channels >> Observables
try try {
{ top_block_->connect(channel(i)->get_right_block(), 0,
top_block_->connect(signal_source()->get_right_block(), 0, observables()->get_left_block(), i);
signal_conditioner()->get_left_block(), 0); } catch (std::exception& e) {
} LOG_AT_LEVEL(ERROR) << "Can't connect channel " << i
catch (std::exception& e) << " to observables";
{ LOG_AT_LEVEL(ERROR) << e.what();
LOG_AT_LEVEL(ERROR) top_block_->disconnect_all();
<< "Can't connect signal source to signal conditioner"; return;
LOG_AT_LEVEL(ERROR) << e.what(); }
top_block_->disconnect_all();
return;
}
DLOG(INFO) << "Signal source connected to signal conditioner";
// Signal Source > Signal conditioner >> channels_count_ number of Channels in parallel channel(i)->set_signal(available_GNSS_signals_.front());
for (unsigned int i = 0; i < channels_count_; i++) std::cout << "Channel " << i << " assigned to "
{ << available_GNSS_signals_.front() << std::endl;
try available_GNSS_signals_.pop_front();
{ channel(i)->start();
top_block_->connect(signal_conditioner()->get_right_block(), 0, //channel(i)->start_acquisition();
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) << "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 {
try top_block_->connect(pvt()->get_right_block(), 0,
{ output_filter()->get_left_block(), 0);
top_block_->connect(channel(i)->get_right_block(), 0, } catch (std::exception& e) {
observables()->get_left_block(), i); LOG_AT_LEVEL(ERROR) << "Can't connect PVT to output filter";
} LOG_AT_LEVEL(ERROR) << e.what();
catch (std::exception& e) top_block_->disconnect_all();
{ return;
LOG_AT_LEVEL(ERROR) << "Can't connect channel " << i }
<< " to observables";
LOG_AT_LEVEL(ERROR) << e.what();
top_block_->disconnect_all();
return;
}
channel(i)->set_satellite(available_GPS_satellites_IDs_->front()); DLOG(INFO) << "PVT connected to output filter";
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) << "Channel " << i connected_ = true;
<< " connected to observables and ready for acquisition"; DLOG(INFO) << "Flowgraph connected";
} top_block_->dump();
/*
* 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();
} }
void GNSSFlowgraph::wait() void GNSSFlowgraph::wait() {
{ if (!running_) {
if (!running_) LOG_AT_LEVEL(WARNING) << "Can't apply wait. Flowgraph is not running";
{ return;
LOG_AT_LEVEL(WARNING) << "Can't apply wait. Flowgraph is not running"; }
return; top_block_->wait();
} DLOG(INFO) << "Flowgraph finished calculations";
top_block_->wait(); running_ = false;
DLOG(INFO) << "Flowgraph finished calculations";
running_ = false;
} }
/* /*
@ -324,179 +270,168 @@ void GNSSFlowgraph::wait()
* \param[in] who Who generated the action * \param[in] who Who generated the action
* \param[in] what What is the action 0: acquisition failed * \param[in] what What is the action 0: acquisition failed
*/ */
void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) void GNSSFlowgraph::apply_action(unsigned int who, unsigned int what) {
{ DLOG(INFO) << "received " << what << " from " << who;
DLOG(INFO) << "received " << what << " from " << who;
switch (what) switch (what) {
{ case 0:
case 0:
LOG_AT_LEVEL(INFO) << "Channel " << who LOG_AT_LEVEL(INFO) << "Channel " << who << " ACQ FAILED satellite "
<< " ACQ FAILED satellite " << channel(who)->get_satellite(); << channel(who)->get_signal().get_satellite();
available_GPS_satellites_IDs_->push_back( available_GNSS_signals_.push_back(channel(who)->get_signal());
channel(who)->get_satellite()); channel(who)->set_signal(available_GNSS_signals_.front());
channel(who)->set_satellite( available_GNSS_signals_.pop_front();
available_GPS_satellites_IDs_->front()); channel(who)->start_acquisition();
available_GPS_satellites_IDs_->pop_front(); break;
channel(who)->start_acquisition(); // TODO: Tracking messages
break;
// TODO: Tracking messages
default: default:
break; break;
} }
DLOG(INFO) << "Number of available satellites: " DLOG(INFO) << "Number of available satellites: "
<< available_GPS_satellites_IDs_->size(); << available_GNSS_signals_.size();
} }
void GNSSFlowgraph::set_configuration(ConfigurationInterface* configuration) void GNSSFlowgraph::set_configuration(ConfigurationInterface* configuration) {
{ if (running_) {
if (running_) LOG_AT_LEVEL(WARNING)
{ << "Unable to update configuration while flowgraph running";
LOG_AT_LEVEL(WARNING) << "Unable to update configuration while flowgraph running"; return;
return; }
}
if (connected_) if (connected_) {
{ LOG_AT_LEVEL(WARNING)
LOG_AT_LEVEL(WARNING) << "Unable to update configuration while flowgraph connected"; << "Unable to update configuration while flowgraph connected";
} }
configuration_ = configuration; configuration_ = configuration;
} }
GNSSBlockInterface* GNSSFlowgraph::signal_source() GNSSBlockInterface* GNSSFlowgraph::signal_source() {
{ return blocks_->at(0);
return blocks_->at(0);
} }
GNSSBlockInterface* GNSSFlowgraph::signal_conditioner() GNSSBlockInterface* GNSSFlowgraph::signal_conditioner() {
{ return blocks_->at(1);
return blocks_->at(1);
} }
ChannelInterface* GNSSFlowgraph::channel(unsigned int index) ChannelInterface* GNSSFlowgraph::channel(unsigned int index) {
{ return (ChannelInterface*) blocks_->at(index + 5);
return (ChannelInterface*)blocks_->at(index + 5);
} }
GNSSBlockInterface* GNSSFlowgraph::observables() GNSSBlockInterface* GNSSFlowgraph::observables() {
{ return blocks_->at(2);
return blocks_->at(2);
} }
GNSSBlockInterface* GNSSFlowgraph::pvt() GNSSBlockInterface* GNSSFlowgraph::pvt() {
{ return blocks_->at(3);
return blocks_->at(3);
} }
GNSSBlockInterface* GNSSFlowgraph::output_filter() GNSSBlockInterface* GNSSFlowgraph::output_filter() {
{ return blocks_->at(4);
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<GNSSBlockInterface*>* channels = block_factory_->GetChannels(
configuration_, queue_);
channels_count_ = channels->size();
void GNSSFlowgraph::init() for (unsigned int i = 0; i < channels_count_; i++) {
{ blocks_->push_back(channels->at(i));
/* }
* 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<GNSSBlockInterface*>* channels = block_factory_->GetChannels( top_block_ = gr_make_top_block("GNSSFlowgraph");
configuration_, queue_);
channels_count_ = channels->size(); delete channels;
for (unsigned int i = 0; i < channels_count_; i++) // fill the available_GNSS_signals_ queue with the satellites ID's to be searched by the acquisition
{
blocks_->push_back(channels->at(i));
}
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 DLOG(INFO) << "Blocks instantiated. " << channels_count_ << " channels.";
set_satellites_list();
applied_actions_ = 0;
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 * \TODO Describe GNSS satellites more nicely, with RINEX notation
* See http://igscb.jpl.nasa.gov/igscb/data/format/rinex301.pdf (page 5) * See http://igscb.jpl.nasa.gov/igscb/data/format/rinex301.pdf (page 5)
*/ */
std::set<unsigned int> available_gps_prn = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, std::set<unsigned int> available_gps_prn = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 25, 26, 27, 28,
21, 22, 23 , 25, 26, 27, 28, 29, 30, 29, 30, 31, 32 };
31, 32};
std::set<unsigned int>::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<Gnss_Signal>::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<std::string>(i) + ".system",
default_system));
std::string gnss_signal = (configuration_->property("Channel"
+ boost::lexical_cast<std::string>(i) + ".signal",
default_signal));
unsigned int sat = configuration_->property("Channel"
+ boost::lexical_cast<std::string>(i) + ".satellite", 0);
std::set<unsigned int>::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(); std::cout << "Signal queue: " << std::endl;
available_gps_prn_iter++) for (std::list<Gnss_Signal>::iterator it =
{ available_GNSS_signals_.begin(); it
sv = Gnss_Satellite(std::string("GPS"), *available_gps_prn_iter); != available_GNSS_signals_.end(); it++) {
available_GPS_satellites_IDs_->push_back(sv); std::cout << *it << std::endl;
} }
std::list<Gnss_Satellite>::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<std::string>(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<unsigned int>::iterator it =
// available_GPS_satellites_IDs_->begin(); it
// != available_GPS_satellites_IDs_->end(); it++)
// {
// std::cout << *it << ", ";
// }
// std::cout << std::endl;
} }
void GNSSFlowgraph::apply_action(unsigned int what) void GNSSFlowgraph::apply_action(unsigned int what) {
{ DLOG(INFO) << "Applied action " << what << " to flowgraph";
DLOG(INFO) << "Applied action " << what << " to flowgraph"; applied_actions_++;
applied_actions_++;
} }

View File

@ -41,7 +41,7 @@
#include <gnuradio/gr_top_block.h> #include <gnuradio/gr_top_block.h>
#include <gnuradio/gr_msg_queue.h> #include <gnuradio/gr_msg_queue.h>
#include "GPS_L1_CA.h" #include "GPS_L1_CA.h"
#include "gnss_satellite.h" #include "gnss_signal.h"
class GNSSBlockInterface; class GNSSBlockInterface;
class ChannelInterface; class ChannelInterface;
@ -117,7 +117,7 @@ private:
void init(); void init();
void apply_action(unsigned int what); void apply_action(unsigned int what);
void set_satellites_list(); void set_signals_list();
bool connected_; bool connected_;
bool running_; bool running_;
@ -134,10 +134,8 @@ private:
gr_top_block_sptr top_block_; gr_top_block_sptr top_block_;
gr_msg_queue_sptr queue_; gr_msg_queue_sptr queue_;
std::list<Gnss_Satellite>* available_GPS_satellites_IDs_; std::list<Gnss_Signal> available_GNSS_signals_;
std::queue<unsigned int>* available_Galileo_satellites_IDs_;
Gnss_Satellite sv;
}; };
#endif /*GNSS_SDR_GNSS_FLOWGRAPH_H_*/ #endif /*GNSS_SDR_GNSS_FLOWGRAPH_H_*/

View File

@ -43,12 +43,33 @@ Gnss_Signal::~Gnss_Signal()
{ {
} }
std::string Gnss_Signal::get_signal() std::string Gnss_Signal::get_signal() const
{ {
return this->signal; return this->signal;
} }
Gnss_Satellite Gnss_Signal::get_satellite() Gnss_Satellite Gnss_Signal::get_satellite() const
{ {
return this->satellite; 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;
}

View File

@ -49,8 +49,11 @@ public:
Gnss_Signal(); Gnss_Signal();
Gnss_Signal(Gnss_Satellite satellite_,std::string signal_); Gnss_Signal(Gnss_Satellite satellite_,std::string signal_);
~Gnss_Signal(); ~Gnss_Signal();
std::string get_signal(); std::string get_signal() const;
Gnss_Satellite get_satellite(); 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 #endif

View File

@ -55,6 +55,8 @@ exe run_tests : test_main.cc
../core/receiver//gnss_flowgraph ../core/receiver//gnss_flowgraph
../core/system_parameters//gps_navigation_message ../core/system_parameters//gps_navigation_message
../core/system_parameters//gnss_satellite ../core/system_parameters//gnss_satellite
../core/system_parameters//gnss_signal
../core/system_parameters//gnss_synchro
../..//gflags ../..//gflags
../..//glog ../..//glog
../..//gnuradio-core ../..//gnuradio-core