[hamradio-commits] [gnss-sdr] 22/251: GPS L1 C/A + GPS L2C M dual frequency offline acquisition and tracking READY. Issues on PRN numbering are being investigated...

Carles Fernandez carles_fernandez-guest at moszumanska.debian.org
Wed Sep 2 00:22:32 UTC 2015


This is an automated email from the git hooks/post-receive script.

carles_fernandez-guest pushed a commit to branch master
in repository gnss-sdr.

commit 4c5efd1e8bc304d2ad7b0e8083fabfa4fadff917
Author: Javier <jarribas at cttc.es>
Date:   Tue May 5 18:18:16 2015 +0200

    GPS L1 C/A + GPS L2C M dual frequency offline acquisition and tracking
    READY. Issues on PRN numbering are being investigated...
---
 ...channel_GPS_L2_M_Flexiband_bin_file_III_1b.conf | 513 ++++++++++++++++++---
 src/algorithms/libs/gps_sdr_signal_processing.cc   |   6 +-
 .../telemetry_decoder/adapters/CMakeLists.txt      |   1 +
 .../adapters/gps_l2_m_telemetry_decoder.cc         | 122 +++++
 .../adapters/gps_l2_m_telemetry_decoder.h          |  96 ++++
 .../gnuradio_blocks/CMakeLists.txt                 |   1 +
 .../gps_l1_ca_telemetry_decoder_cc.cc              |   3 +-
 ...oder_cc.cc => gps_l2_m_telemetry_decoder_cc.cc} |  33 +-
 .../gps_l2_m_telemetry_decoder_cc.h                | 152 ++++++
 .../tracking/adapters/gps_l2_m_dll_pll_tracking.cc | 154 +++++++
 .../tracking/adapters/gps_l2_m_dll_pll_tracking.h  | 114 +++++
 .../gps_l1_ca_dll_pll_tracking_cc.cc               |   8 +-
 ...cking_cc.cc => gps_l2_m_dll_pll_tracking_cc.cc} |  98 ++--
 .../gnuradio_blocks/gps_l2_m_dll_pll_tracking_cc.h | 187 ++++++++
 src/core/receiver/gnss_block_factory.cc            |  27 +-
 src/tests/data/.gitignore                          |   1 +
 .../gnss_block/gps_l2_m_dll_pll_tracking_test.cc   | 167 +++++++
 .../gnss_block/gps_l2_m_pcps_acquisition_test.cc   | 275 +++++++++++
 18 files changed, 1824 insertions(+), 134 deletions(-)

diff --git a/conf/gnss-sdr_multichannel_GPS_L2_M_Flexiband_bin_file_III_1b.conf b/conf/gnss-sdr_multichannel_GPS_L2_M_Flexiband_bin_file_III_1b.conf
index 0c86a20..887da30 100644
--- a/conf/gnss-sdr_multichannel_GPS_L2_M_Flexiband_bin_file_III_1b.conf
+++ b/conf/gnss-sdr_multichannel_GPS_L2_M_Flexiband_bin_file_III_1b.conf
@@ -267,7 +267,7 @@ Resampler2.implementation=Pass_Through
 
 ;######### CHANNELS GLOBAL CONFIG ############
 ;#count: Number of available GPS satellite channels.
-Channels_GPS.count=2
+Channels_GPS.count=9
 ;#count: Number of available Galileo satellite channels.
 Channels_Galileo.count=0
 ;#in_acquisition: Number of channels simultaneously acquiring for the whole receiver
@@ -281,16 +281,66 @@ Channel0.RF_channel_ID=0
 Channel0.system=GPS
 Channel0.signal=1C
 
-Channel1.RF_channel_ID=1
-Channel1.system=GPS L2C M
-Channel1.signal=2S
+Channel1.RF_channel_ID=0
+Channel1.system=GPS
+Channel1.signal=1C
 
 Channel2.RF_channel_ID=0
+Channel2.system=GPS
+Channel2.signal=1C
+
 Channel3.RF_channel_ID=0
+Channel3.system=GPS
+Channel3.signal=1C
+
 Channel4.RF_channel_ID=0
+Channel4.system=GPS
+Channel4.signal=1C
+
 Channel5.RF_channel_ID=0
+Channel5.system=GPS
+Channel5.signal=1C
+
 Channel6.RF_channel_ID=0
+Channel6.system=GPS
+Channel6.signal=1C
+
 Channel7.RF_channel_ID=0
+Channel7.system=GPS
+Channel7.signal=1C
+
+
+Channel8.RF_channel_ID=1
+Channel8.system=GPS L2C M
+Channel8.signal=2S
+
+Channel9.RF_channel_ID=1
+Channel9.system=GPS L2C M
+Channel9.signal=2S
+
+Channel10.RF_channel_ID=1
+Channel10.system=GPS L2C M
+Channel10.signal=2S
+
+Channel11.RF_channel_ID=1
+Channel11.system=GPS L2C M
+Channel11.signal=2S
+
+Channel12.RF_channel_ID=1
+Channel12.system=GPS L2C M
+Channel12.signal=2S
+
+Channel13.RF_channel_ID=1
+Channel13.system=GPS L2C M
+Channel13.signal=2S
+
+Channel14.RF_channel_ID=1
+Channel14.system=GPS L2C M
+Channel14.signal=2S
+
+Channel15.RF_channel_ID=1
+Channel15.system=GPS L2C M
+Channel15.signal=2S
 
 ;#signal: 
 ;#if the option is disabled by default is assigned "1C" GPS L1 C/A
@@ -299,56 +349,208 @@ Channel.signal=1C
 ;######### SPECIFIC CHANNELS CONFIG ######
 ;#The following options are specific to each channel and overwrite the generic options 
 
-;#dump: Enable or disable the acquisition internal data file logging [true] or [false] 
+;# GPS L1 C/A
 Acquisition_GPS0.dump=false
-;#filename: Log path and filename
 Acquisition_GPS0.dump_filename=./acq_dump.dat
-;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version.
 Acquisition_GPS0.item_type=gr_complex
-;#if: Signal intermediate frequency in [Hz] 
 Acquisition_GPS0.if=0
-;#sampled_ms: Signal block duration for the acquisition signal detection [ms]
 Acquisition_GPS0.sampled_ms=1
-;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition]
 Acquisition_GPS0.implementation=GPS_L1_CA_PCPS_Acquisition_Fine_Doppler
-;#threshold: Acquisition threshold
-Acquisition_GPS0.threshold=0.015
-;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] 
+Acquisition_GPS0.threshold=0.015 
 ;Acquisition_GPS0.pfa=0.0001
-;#doppler_max: Maximum expected Doppler shift [Hz]
 Acquisition_GPS0.doppler_max=5000
-;#doppler_max: Maximum expected Doppler shift [Hz]
 Acquisition_GPS0.doppler_min=-5000
-;#doppler_step Doppler step in the grid search [Hz]
 Acquisition_GPS0.doppler_step=250
-;#maximum dwells
 Acquisition_GPS0.max_dwells=2
 
-;#dump: Enable or disable the acquisition internal data file logging [true] or [false] 
 Acquisition_GPS1.dump=false
-;#filename: Log path and filename
 Acquisition_GPS1.dump_filename=./acq_dump.dat
-;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version.
 Acquisition_GPS1.item_type=gr_complex
-;#if: Signal intermediate frequency in [Hz] 
 Acquisition_GPS1.if=0
-;#sampled_ms: Signal block duration for the acquisition signal detection [ms]
 Acquisition_GPS1.sampled_ms=1
-;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition]
 Acquisition_GPS1.implementation=GPS_L1_CA_PCPS_Acquisition_Fine_Doppler
-;#threshold: Acquisition threshold
-Acquisition_GPS1.threshold=0.015
-;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] 
+Acquisition_GPS1.threshold=0.015 
 ;Acquisition_GPS1.pfa=0.0001
-;#doppler_max: Maximum expected Doppler shift [Hz]
 Acquisition_GPS1.doppler_max=5000
-;#doppler_max: Maximum expected Doppler shift [Hz]
 Acquisition_GPS1.doppler_min=-5000
-;#doppler_step Doppler step in the grid search [Hz]
-Acquisition_GPS1.doppler_step=100
-;#maximum dwells
+Acquisition_GPS1.doppler_step=250
 Acquisition_GPS1.max_dwells=2
 
+Acquisition_GPS2.dump=false
+Acquisition_GPS2.dump_filename=./acq_dump.dat
+Acquisition_GPS2.item_type=gr_complex
+Acquisition_GPS2.if=0
+Acquisition_GPS2.sampled_ms=1
+Acquisition_GPS2.implementation=GPS_L1_CA_PCPS_Acquisition_Fine_Doppler
+Acquisition_GPS2.threshold=0.015 
+;Acquisition_GPS2.pfa=0.0001
+Acquisition_GPS2.doppler_max=5000
+Acquisition_GPS2.doppler_min=-5000
+Acquisition_GPS2.doppler_step=250
+Acquisition_GPS2.max_dwells=2
+
+Acquisition_GPS3.dump=false
+Acquisition_GPS3.dump_filename=./acq_dump.dat
+Acquisition_GPS3.item_type=gr_complex
+Acquisition_GPS3.if=0
+Acquisition_GPS3.sampled_ms=1
+Acquisition_GPS3.implementation=GPS_L1_CA_PCPS_Acquisition_Fine_Doppler
+Acquisition_GPS3.threshold=0.015 
+;Acquisition_GPS3.pfa=0.0001
+Acquisition_GPS3.doppler_max=5000
+Acquisition_GPS3.doppler_min=-5000
+Acquisition_GPS3.doppler_step=250
+Acquisition_GPS3.max_dwells=2
+
+Acquisition_GPS4.dump=false
+Acquisition_GPS4.dump_filename=./acq_dump.dat
+Acquisition_GPS4.item_type=gr_complex
+Acquisition_GPS4.if=0
+Acquisition_GPS4.sampled_ms=1
+Acquisition_GPS4.implementation=GPS_L1_CA_PCPS_Acquisition_Fine_Doppler
+Acquisition_GPS4.threshold=0.015 
+;Acquisition_GPS4.pfa=0.0001
+Acquisition_GPS4.doppler_max=5000
+Acquisition_GPS4.doppler_min=-5000
+Acquisition_GPS4.doppler_step=250
+Acquisition_GPS4.max_dwells=2
+
+Acquisition_GPS5.dump=false
+Acquisition_GPS5.dump_filename=./acq_dump.dat
+Acquisition_GPS5.item_type=gr_complex
+Acquisition_GPS5.if=0
+Acquisition_GPS5.sampled_ms=1
+Acquisition_GPS5.implementation=GPS_L1_CA_PCPS_Acquisition_Fine_Doppler
+Acquisition_GPS5.threshold=0.015 
+;Acquisition_GPS5.pfa=0.0001
+Acquisition_GPS5.doppler_max=5000
+Acquisition_GPS5.doppler_min=-5000
+Acquisition_GPS5.doppler_step=250
+Acquisition_GPS5.max_dwells=2
+
+Acquisition_GPS6.dump=false
+Acquisition_GPS6.dump_filename=./acq_dump.dat
+Acquisition_GPS6.item_type=gr_complex
+Acquisition_GPS6.if=0
+Acquisition_GPS6.sampled_ms=1
+Acquisition_GPS6.implementation=GPS_L1_CA_PCPS_Acquisition_Fine_Doppler
+Acquisition_GPS6.threshold=0.015 
+;Acquisition_GPS6.pfa=0.0001
+Acquisition_GPS6.doppler_max=5000
+Acquisition_GPS6.doppler_min=-5000
+Acquisition_GPS6.doppler_step=250
+Acquisition_GPS6.max_dwells=2
+
+Acquisition_GPS7.dump=false
+Acquisition_GPS7.dump_filename=./acq_dump.dat
+Acquisition_GPS7.item_type=gr_complex
+Acquisition_GPS7.if=0
+Acquisition_GPS7.sampled_ms=1
+Acquisition_GPS7.implementation=GPS_L1_CA_PCPS_Acquisition_Fine_Doppler
+Acquisition_GPS7.threshold=0.015 
+;Acquisition_GPS7.pfa=0.0001
+Acquisition_GPS7.doppler_max=5000
+Acquisition_GPS7.doppler_min=-5000
+Acquisition_GPS7.doppler_step=250
+Acquisition_GPS7.max_dwells=2
+
+
+;# GPS L2C M
+Acquisition_GPS8.dump=false
+Acquisition_GPS8.dump_filename=./acq_dump.dat
+Acquisition_GPS8.item_type=gr_complex
+Acquisition_GPS8.if=0
+Acquisition_GPS8.implementation=GPS_L2_M_PCPS_Acquisition
+Acquisition_GPS8.threshold=0.0005 
+;Acquisition_GPS8.pfa=0.001
+Acquisition_GPS8.doppler_max=5000
+Acquisition_GPS8.doppler_min=-5000
+Acquisition_GPS8.doppler_step=100
+Acquisition_GPS8.max_dwells=1
+
+Acquisition_GPS9.dump=false
+Acquisition_GPS9.dump_filename=./acq_dump.dat
+Acquisition_GPS9.item_type=gr_complex
+Acquisition_GPS9.if=0
+Acquisition_GPS9.implementation=GPS_L2_M_PCPS_Acquisition
+Acquisition_GPS9.threshold=0.0005 
+;Acquisition_GPS9.pfa=0.001
+Acquisition_GPS9.doppler_max=5000
+Acquisition_GPS9.doppler_min=-5000
+Acquisition_GPS9.doppler_step=100
+Acquisition_GPS9.max_dwells=1
+
+Acquisition_GPS10.dump=false
+Acquisition_GPS10.dump_filename=./acq_dump.dat
+Acquisition_GPS10.item_type=gr_complex
+Acquisition_GPS10.if=0
+Acquisition_GPS10.implementation=GPS_L2_M_PCPS_Acquisition
+Acquisition_GPS10.threshold=0.0005 
+;Acquisition_GPS10.pfa=0.001
+Acquisition_GPS10.doppler_max=5000
+Acquisition_GPS10.doppler_min=-5000
+Acquisition_GPS10.doppler_step=100
+Acquisition_GPS10.max_dwells=1
+
+Acquisition_GPS11.dump=false
+Acquisition_GPS11.dump_filename=./acq_dump.dat
+Acquisition_GPS11.item_type=gr_complex
+Acquisition_GPS11.if=0
+Acquisition_GPS11.implementation=GPS_L2_M_PCPS_Acquisition
+Acquisition_GPS11.threshold=0.0005 
+;Acquisition_GPS11.pfa=0.001
+Acquisition_GPS11.doppler_max=5000
+Acquisition_GPS11.doppler_min=-5000
+Acquisition_GPS11.doppler_step=100
+Acquisition_GPS11.max_dwells=1
+
+Acquisition_GPS12.dump=false
+Acquisition_GPS12.dump_filename=./acq_dump.dat
+Acquisition_GPS12.item_type=gr_complex
+Acquisition_GPS12.if=0
+Acquisition_GPS12.implementation=GPS_L2_M_PCPS_Acquisition
+Acquisition_GPS12.threshold=0.0005 
+;Acquisition_GPS12.pfa=0.001
+Acquisition_GPS12.doppler_max=5000
+Acquisition_GPS12.doppler_min=-5000
+Acquisition_GPS12.doppler_step=100
+Acquisition_GPS12.max_dwells=1
+
+Acquisition_GPS13.dump=false
+Acquisition_GPS13.dump_filename=./acq_dump.dat
+Acquisition_GPS13.item_type=gr_complex
+Acquisition_GPS13.if=0
+Acquisition_GPS13.implementation=GPS_L2_M_PCPS_Acquisition
+Acquisition_GPS13.threshold=0.0005 
+;Acquisition_GPS13.pfa=0.001
+Acquisition_GPS13.doppler_max=5000
+Acquisition_GPS13.doppler_min=-5000
+Acquisition_GPS13.doppler_step=100
+Acquisition_GPS13.max_dwells=1
+
+Acquisition_GPS14.dump=false
+Acquisition_GPS14.dump_filename=./acq_dump.dat
+Acquisition_GPS14.item_type=gr_complex
+Acquisition_GPS14.if=0
+Acquisition_GPS14.implementation=GPS_L2_M_PCPS_Acquisition
+Acquisition_GPS14.threshold=0.0005 
+;Acquisition_GPS14.pfa=0.001
+Acquisition_GPS14.doppler_max=5000
+Acquisition_GPS14.doppler_min=-5000
+Acquisition_GPS14.doppler_step=100
+Acquisition_GPS14.max_dwells=1
+
+Acquisition_GPS15.dump=false
+Acquisition_GPS15.dump_filename=./acq_dump.dat
+Acquisition_GPS15.item_type=gr_complex
+Acquisition_GPS15.if=0
+Acquisition_GPS15.implementation=GPS_L2_M_PCPS_Acquisition
+Acquisition_GPS15.threshold=0.0005 
+;Acquisition_GPS15.pfa=0.001
+Acquisition_GPS15.doppler_max=5000
+Acquisition_GPS15.doppler_min=-5000
+Acquisition_GPS15.doppler_step=100
+Acquisition_GPS15.max_dwells=1
 
 ;######### ACQUISITION GLOBAL CONFIG ############
 
@@ -385,50 +587,185 @@ Acquisition_GPS.max_dwells=1
 
 
 ;######### TRACKING CHANNEL 0 CONFIG ############
-
-;#implementation: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_FLL_PLL_Tracking]
 Tracking_GPS0.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_GPS0.item_type=gr_complex
-;#sampling_frequency: Signal Intermediate Frequency in [Hz] 
 Tracking_GPS0.if=0
-;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] 
 Tracking_GPS0.dump=false
-;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number.
 Tracking_GPS0.dump_filename=./tracking_ch_
-;#pll_bw_hz: PLL loop filter bandwidth [Hz]
 Tracking_GPS0.pll_bw_hz=40.0;
-;#dll_bw_hz: DLL loop filter bandwidth [Hz]
 Tracking_GPS0.dll_bw_hz=3.0;
-;#fll_bw_hz: FLL loop filter bandwidth [Hz]
 Tracking_GPS0.fll_bw_hz=10.0;
-;#order: PLL/DLL loop filter order [2] or [3]
 Tracking_GPS0.order=3;
-;#early_late_space_chips: correlator early-late space [chips]. Use [0.5]
 Tracking_GPS0.early_late_space_chips=0.5;
-
 ;######### TRACKING CHANNEL 1 CONFIG ############
-
-;#implementation: Selected tracking algorithm:
-Tracking_GPS1.implementation=GPS_L2_M_DLL_PLL_Tracking
-;#item_type: Type and resolution for each of the signal samples. Use only [gr_complex] in this version.
+Tracking_GPS1.implementation=GPS_L1_CA_DLL_PLL_Tracking
 Tracking_GPS1.item_type=gr_complex
-;#sampling_frequency: Signal Intermediate Frequency in [Hz] 
 Tracking_GPS1.if=0
-;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] 
 Tracking_GPS1.dump=false
-;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number.
 Tracking_GPS1.dump_filename=./tracking_ch_
-;#pll_bw_hz: PLL loop filter bandwidth [Hz]
 Tracking_GPS1.pll_bw_hz=40.0;
-;#dll_bw_hz: DLL loop filter bandwidth [Hz]
 Tracking_GPS1.dll_bw_hz=3.0;
-;#fll_bw_hz: FLL loop filter bandwidth [Hz]
 Tracking_GPS1.fll_bw_hz=10.0;
-;#order: PLL/DLL loop filter order [2] or [3]
 Tracking_GPS1.order=3;
-;#early_late_space_chips: correlator early-late space [chips]. Use [0.5]
 Tracking_GPS1.early_late_space_chips=0.5;
+;######### TRACKING CHANNEL 2 CONFIG ############
+Tracking_GPS2.implementation=GPS_L1_CA_DLL_PLL_Tracking
+Tracking_GPS2.item_type=gr_complex
+Tracking_GPS2.if=0
+Tracking_GPS2.dump=false
+Tracking_GPS2.dump_filename=./tracking_ch_
+Tracking_GPS2.pll_bw_hz=40.0;
+Tracking_GPS2.dll_bw_hz=3.0;
+Tracking_GPS2.fll_bw_hz=10.0;
+Tracking_GPS2.order=3;
+Tracking_GPS2.early_late_space_chips=0.5;
+;######### TRACKING CHANNEL 3 CONFIG ############
+Tracking_GPS3.implementation=GPS_L1_CA_DLL_PLL_Tracking
+Tracking_GPS3.item_type=gr_complex
+Tracking_GPS3.if=0
+Tracking_GPS3.dump=false
+Tracking_GPS3.dump_filename=./tracking_ch_
+Tracking_GPS3.pll_bw_hz=40.0;
+Tracking_GPS3.dll_bw_hz=3.0;
+Tracking_GPS3.fll_bw_hz=10.0;
+Tracking_GPS3.order=3;
+Tracking_GPS3.early_late_space_chips=0.5;
+
+;######### TRACKING CHANNEL 4 CONFIG ############
+Tracking_GPS4.implementation=GPS_L1_CA_DLL_PLL_Tracking
+Tracking_GPS4.item_type=gr_complex
+Tracking_GPS4.if=0
+Tracking_GPS4.dump=false
+Tracking_GPS4.dump_filename=./tracking_ch_
+Tracking_GPS4.pll_bw_hz=40.0;
+Tracking_GPS4.dll_bw_hz=3.0;
+Tracking_GPS4.fll_bw_hz=10.0;
+Tracking_GPS4.order=3;
+Tracking_GPS4.early_late_space_chips=0.5;
+;######### TRACKING CHANNEL 5 CONFIG ############
+Tracking_GPS5.implementation=GPS_L1_CA_DLL_PLL_Tracking
+Tracking_GPS5.item_type=gr_complex
+Tracking_GPS5.if=0
+Tracking_GPS5.dump=false
+Tracking_GPS5.dump_filename=./tracking_ch_
+Tracking_GPS5.pll_bw_hz=40.0;
+Tracking_GPS5.dll_bw_hz=3.0;
+Tracking_GPS5.fll_bw_hz=10.0;
+Tracking_GPS5.order=3;
+Tracking_GPS5.early_late_space_chips=0.5;
+;######### TRACKING CHANNEL 6 CONFIG ############
+Tracking_GPS6.implementation=GPS_L1_CA_DLL_PLL_Tracking
+Tracking_GPS6.item_type=gr_complex
+Tracking_GPS6.if=0
+Tracking_GPS6.dump=false
+Tracking_GPS6.dump_filename=./tracking_ch_
+Tracking_GPS6.pll_bw_hz=40.0;
+Tracking_GPS6.dll_bw_hz=3.0;
+Tracking_GPS6.fll_bw_hz=10.0;
+Tracking_GPS6.order=3;
+Tracking_GPS6.early_late_space_chips=0.5;
+;######### TRACKING CHANNEL 7 CONFIG ############
+Tracking_GPS7.implementation=GPS_L1_CA_DLL_PLL_Tracking
+Tracking_GPS7.item_type=gr_complex
+Tracking_GPS7.if=0
+Tracking_GPS7.dump=false
+Tracking_GPS7.dump_filename=./tracking_ch_
+Tracking_GPS7.pll_bw_hz=40.0;
+Tracking_GPS7.dll_bw_hz=3.0;
+Tracking_GPS7.fll_bw_hz=10.0;
+Tracking_GPS7.order=3;
+Tracking_GPS7.early_late_space_chips=0.5;
+
+;######### TRACKING CHANNEL 8 CONFIG ############
+Tracking_GPS8.implementation=GPS_L2_M_DLL_PLL_Tracking
+Tracking_GPS8.item_type=gr_complex
+Tracking_GPS8.if=0
+Tracking_GPS8.dump=false
+Tracking_GPS8.dump_filename=./tracking_ch_
+Tracking_GPS8.pll_bw_hz=2.0;
+Tracking_GPS8.dll_bw_hz=0.5;
+Tracking_GPS8.fll_bw_hz=2.0;
+Tracking_GPS8.order=2;
+Tracking_GPS8.early_late_space_chips=0.5;
+;######### TRACKING CHANNEL 9 CONFIG ############
+Tracking_GPS9.implementation=GPS_L2_M_DLL_PLL_Tracking
+Tracking_GPS9.item_type=gr_complex
+Tracking_GPS9.if=0
+Tracking_GPS9.dump=false
+Tracking_GPS9.dump_filename=./tracking_ch_
+Tracking_GPS9.pll_bw_hz=2.0;
+Tracking_GPS9.dll_bw_hz=0.5;
+Tracking_GPS9.fll_bw_hz=2.0;
+Tracking_GPS9.order=2;
+Tracking_GPS9.early_late_space_chips=0.5;
+;######### TRACKING CHANNEL 10 CONFIG ############
+Tracking_GPS10.implementation=GPS_L2_M_DLL_PLL_Tracking
+Tracking_GPS10.item_type=gr_complex
+Tracking_GPS10.if=0
+Tracking_GPS10.dump=false
+Tracking_GPS10.dump_filename=./tracking_ch_
+Tracking_GPS10.pll_bw_hz=2.0;
+Tracking_GPS10.dll_bw_hz=0.5;
+Tracking_GPS10.fll_bw_hz=2.0;
+Tracking_GPS10.order=2;
+Tracking_GPS10.early_late_space_chips=0.5;
+;######### TRACKING CHANNEL 11 CONFIG ############
+Tracking_GPS11.implementation=GPS_L2_M_DLL_PLL_Tracking
+Tracking_GPS11.item_type=gr_complex
+Tracking_GPS11.if=0
+Tracking_GPS11.dump=false
+Tracking_GPS11.dump_filename=./tracking_ch_
+Tracking_GPS11.pll_bw_hz=2.0;
+Tracking_GPS11.dll_bw_hz=0.5;
+Tracking_GPS11.fll_bw_hz=2.0;
+Tracking_GPS11.order=2;
+Tracking_GPS11.early_late_space_chips=0.5;
+
+;######### TRACKING CHANNEL 12 CONFIG ############
+Tracking_GPS12.implementation=GPS_L2_M_DLL_PLL_Tracking
+Tracking_GPS12.item_type=gr_complex
+Tracking_GPS12.if=0
+Tracking_GPS12.dump=false
+Tracking_GPS12.dump_filename=./tracking_ch_
+Tracking_GPS12.pll_bw_hz=2.0;
+Tracking_GPS12.dll_bw_hz=0.5;
+Tracking_GPS12.fll_bw_hz=2.0;
+Tracking_GPS12.order=2;
+Tracking_GPS12.early_late_space_chips=0.5;
+;######### TRACKING CHANNEL 13 CONFIG ############
+Tracking_GPS13.implementation=GPS_L2_M_DLL_PLL_Tracking
+Tracking_GPS13.item_type=gr_complex
+Tracking_GPS13.if=0
+Tracking_GPS13.dump=false
+Tracking_GPS13.dump_filename=./tracking_ch_
+Tracking_GPS13.pll_bw_hz=2.0;
+Tracking_GPS13.dll_bw_hz=0.5;
+Tracking_GPS13.fll_bw_hz=2.0;
+Tracking_GPS13.order=2;
+Tracking_GPS13.early_late_space_chips=0.5;
+;######### TRACKING CHANNEL 14 CONFIG ############
+Tracking_GPS14.implementation=GPS_L2_M_DLL_PLL_Tracking
+Tracking_GPS14.item_type=gr_complex
+Tracking_GPS14.if=0
+Tracking_GPS14.dump=false
+Tracking_GPS14.dump_filename=./tracking_ch_
+Tracking_GPS14.pll_bw_hz=2.0;
+Tracking_GPS14.dll_bw_hz=0.5;
+Tracking_GPS14.fll_bw_hz=2.0;
+Tracking_GPS14.order=2;
+Tracking_GPS14.early_late_space_chips=0.5;
+;######### TRACKING CHANNEL 15 CONFIG ############
+Tracking_GPS15.implementation=GPS_L2_M_DLL_PLL_Tracking
+Tracking_GPS15.item_type=gr_complex
+Tracking_GPS15.if=0
+Tracking_GPS15.dump=false
+Tracking_GPS15.dump_filename=./tracking_ch_
+Tracking_GPS15.pll_bw_hz=2.0;
+Tracking_GPS15.dll_bw_hz=0.5;
+Tracking_GPS15.fll_bw_hz=2.0;
+Tracking_GPS15.order=2;
+Tracking_GPS15.early_late_space_chips=0.5;
+
 
 ;######### TRACKING GLOBAL CONFIG ############
 
@@ -460,6 +797,72 @@ TelemetryDecoder_GPS.dump=false
 ;#decimation factor
 TelemetryDecoder_GPS.decimation_factor=1;
 
+TelemetryDecoder_GPS0.implementation=GPS_L1_CA_Telemetry_Decoder
+TelemetryDecoder_GPS0.dump=false
+TelemetryDecoder_GPS0.decimation_factor=20;
+
+TelemetryDecoder_GPS1.implementation=GPS_L1_CA_Telemetry_Decoder
+TelemetryDecoder_GPS1.dump=false
+TelemetryDecoder_GPS1.decimation_factor=20;
+
+TelemetryDecoder_GPS2.implementation=GPS_L1_CA_Telemetry_Decoder
+TelemetryDecoder_GPS2.dump=false
+TelemetryDecoder_GPS2.decimation_factor=20;
+
+TelemetryDecoder_GPS3.implementation=GPS_L1_CA_Telemetry_Decoder
+TelemetryDecoder_GPS3.dump=false
+TelemetryDecoder_GPS3.decimation_factor=20;
+
+TelemetryDecoder_GPS4.implementation=GPS_L1_CA_Telemetry_Decoder
+TelemetryDecoder_GPS4.dump=false
+TelemetryDecoder_GPS4.decimation_factor=20;
+
+TelemetryDecoder_GPS5.implementation=GPS_L1_CA_Telemetry_Decoder
+TelemetryDecoder_GPS5.dump=false
+TelemetryDecoder_GPS5.decimation_factor=20;
+
+TelemetryDecoder_GPS6.implementation=GPS_L1_CA_Telemetry_Decoder
+TelemetryDecoder_GPS6.dump=false
+TelemetryDecoder_GPS6.decimation_factor=20;
+
+TelemetryDecoder_GPS7.implementation=GPS_L1_CA_Telemetry_Decoder
+TelemetryDecoder_GPS7.dump=false
+TelemetryDecoder_GPS7.decimation_factor=20;
+
+
+TelemetryDecoder_GPS8.implementation=GPS_L2_M_Telemetry_Decoder
+TelemetryDecoder_GPS8.dump=false
+TelemetryDecoder_GPS8.decimation_factor=1;
+
+TelemetryDecoder_GPS9.implementation=GPS_L2_M_Telemetry_Decoder
+TelemetryDecoder_GPS9.dump=false
+TelemetryDecoder_GPS9.decimation_factor=1;
+
+TelemetryDecoder_GPS10.implementation=GPS_L2_M_Telemetry_Decoder
+TelemetryDecoder_GPS10.dump=false
+TelemetryDecoder_GPS10.decimation_factor=1;
+
+TelemetryDecoder_GPS11.implementation=GPS_L2_M_Telemetry_Decoder
+TelemetryDecoder_GPS11.dump=false
+TelemetryDecoder_GPS11.decimation_factor=1;
+
+TelemetryDecoder_GPS12.implementation=GPS_L2_M_Telemetry_Decoder
+TelemetryDecoder_GPS12.dump=false
+TelemetryDecoder_GPS12.decimation_factor=1;
+
+TelemetryDecoder_GPS13.implementation=GPS_L2_M_Telemetry_Decoder
+TelemetryDecoder_GPS13.dump=false
+TelemetryDecoder_GPS13.decimation_factor=1;
+
+TelemetryDecoder_GPS14.implementation=GPS_L2_M_Telemetry_Decoder
+TelemetryDecoder_GPS14.dump=false
+TelemetryDecoder_GPS14.decimation_factor=1;
+
+TelemetryDecoder_GPS15.implementation=GPS_L2_M_Telemetry_Decoder
+TelemetryDecoder_GPS15.dump=false
+TelemetryDecoder_GPS15.decimation_factor=1;
+
+
 ;######### OBSERVABLES CONFIG ############
 ;#implementation: Use [GPS_L1_CA_Observables] for GPS L1 C/A.
 Observables.implementation=GPS_L1_CA_Observables
diff --git a/src/algorithms/libs/gps_sdr_signal_processing.cc b/src/algorithms/libs/gps_sdr_signal_processing.cc
index 9037fc4..4b3ad17 100644
--- a/src/algorithms/libs/gps_sdr_signal_processing.cc
+++ b/src/algorithms/libs/gps_sdr_signal_processing.cc
@@ -54,11 +54,13 @@ void gps_l1_ca_code_gen_complex(std::complex<float>* _dest, signed int _prn, uns
     // compute delay array index for given PRN number
     if(120 <= _prn && _prn <= 138)
     {
-    	prn_idx = _prn - 88;	// SBAS PRNs are at array indices 31 to 50 (offset: -120+33-1 =-88)
+    	//prn_idx = _prn - 88;	// SBAS PRNs are at array indices 31 to 50 (offset: -120+33-1 =-88)
+    	prn_idx = _prn - 87;	// SBAS PRNs are at array indices 31 to 50 (offset: -120+33 =-87)
     }
     else
     {
-    	prn_idx = _prn-1;
+    	//prn_idx = _prn-1;
+    	prn_idx = _prn;
     }
 
     /* A simple error check */
diff --git a/src/algorithms/telemetry_decoder/adapters/CMakeLists.txt b/src/algorithms/telemetry_decoder/adapters/CMakeLists.txt
index f29ea2c..3eaacbf 100644
--- a/src/algorithms/telemetry_decoder/adapters/CMakeLists.txt
+++ b/src/algorithms/telemetry_decoder/adapters/CMakeLists.txt
@@ -18,6 +18,7 @@
 
 set(TELEMETRY_DECODER_ADAPTER_SOURCES 
 	gps_l1_ca_telemetry_decoder.cc 
+    gps_l2_m_telemetry_decoder.cc 
 	galileo_e1b_telemetry_decoder.cc
 	sbas_l1_telemetry_decoder.cc
 	galileo_e5a_telemetry_decoder.cc
diff --git a/src/algorithms/telemetry_decoder/adapters/gps_l2_m_telemetry_decoder.cc b/src/algorithms/telemetry_decoder/adapters/gps_l2_m_telemetry_decoder.cc
new file mode 100644
index 0000000..da02c29
--- /dev/null
+++ b/src/algorithms/telemetry_decoder/adapters/gps_l2_m_telemetry_decoder.cc
@@ -0,0 +1,122 @@
+/*!
+ * \file gps_l2_m_telemetry_decoder.cc
+ * \brief Implementation of an adapter of a GPS L2C M NAV data decoder block
+ * to a TelemetryDecoderInterface
+ * \author Javier Arribas, 2015. jarribas(at)cttc.es
+ *
+ * -------------------------------------------------------------------------
+ *
+ * Copyright (C) 2010-2015  (see AUTHORS file for a list of contributors)
+ *
+ * GNSS-SDR is a software defined Global Navigation
+ *          Satellite Systems receiver
+ *
+ * This file is part of GNSS-SDR.
+ *
+ * GNSS-SDR is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GNSS-SDR is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNSS-SDR. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * -------------------------------------------------------------------------
+ */
+
+
+#include "gps_l2_m_telemetry_decoder.h"
+#include <gnuradio/io_signature.h>
+#include <glog/logging.h>
+#include "gps_ephemeris.h"
+#include "gps_almanac.h"
+#include "gps_iono.h"
+#include "gps_utc_model.h"
+#include "configuration_interface.h"
+
+extern concurrent_queue<Gps_Ephemeris> global_gps_ephemeris_queue;
+extern concurrent_queue<Gps_Iono> global_gps_iono_queue;
+extern concurrent_queue<Gps_Utc_Model> global_gps_utc_model_queue;
+extern concurrent_queue<Gps_Almanac> global_gps_almanac_queue;
+
+
+using google::LogMessage;
+
+GpsL2MTelemetryDecoder::GpsL2MTelemetryDecoder(ConfigurationInterface* configuration,
+        std::string role,
+        unsigned int in_streams,
+        unsigned int out_streams,
+        boost::shared_ptr<gr::msg_queue> queue) :
+        role_(role),
+        in_streams_(in_streams),
+        out_streams_(out_streams),
+        queue_(queue)
+{
+    std::string default_item_type = "gr_complex";
+    std::string default_dump_filename = "./navigation.dat";
+    DLOG(INFO) << "role " << role;
+    DLOG(INFO) << "vector length " << vector_length_;
+    vector_length_ = configuration->property(role + ".vector_length", 2048);
+    dump_ = configuration->property(role + ".dump", false);
+    dump_filename_ = configuration->property(role + ".dump_filename", default_dump_filename);
+    int fs_in;
+    fs_in = configuration->property("GNSS-SDR.internal_fs_hz", 2048000);
+    // make telemetry decoder object
+    telemetry_decoder_ = gps_l2_m_make_telemetry_decoder_cc(satellite_, 0, (long)fs_in, vector_length_, queue_, dump_); // TODO fix me
+    DLOG(INFO) << "telemetry_decoder(" << telemetry_decoder_->unique_id() << ")";
+    // set the navigation msg queue;
+    telemetry_decoder_->set_ephemeris_queue(&global_gps_ephemeris_queue);
+    telemetry_decoder_->set_iono_queue(&global_gps_iono_queue);
+    telemetry_decoder_->set_almanac_queue(&global_gps_almanac_queue);
+    telemetry_decoder_->set_utc_model_queue(&global_gps_utc_model_queue);
+
+    //decimation factor
+    int decimation_factor = configuration->property(role + ".decimation_factor", 1);
+    telemetry_decoder_->set_decimation(decimation_factor);
+    LOG(INFO) << "global navigation message queue assigned to telemetry_decoder ("<< telemetry_decoder_->unique_id() << ")"<<"role "<<role;
+}
+
+
+GpsL2MTelemetryDecoder::~GpsL2MTelemetryDecoder()
+{}
+
+
+void GpsL2MTelemetryDecoder::set_satellite(Gnss_Satellite satellite)
+{
+    satellite_ = Gnss_Satellite(satellite.get_system(), satellite.get_PRN());
+    telemetry_decoder_->set_satellite(satellite_);
+    DLOG(INFO) << "TELEMETRY DECODER: satellite set to " << satellite_;
+}
+
+
+void GpsL2MTelemetryDecoder::connect(gr::top_block_sptr top_block)
+{
+    if(top_block) { /* top_block is not null */};
+    // Nothing to connect internally
+    DLOG(INFO) << "nothing to connect internally";
+}
+
+
+void GpsL2MTelemetryDecoder::disconnect(gr::top_block_sptr top_block)
+{
+    if(top_block) { /* top_block is not null */};
+    // Nothing to disconnect
+}
+
+
+gr::basic_block_sptr GpsL2MTelemetryDecoder::get_left_block()
+{
+    return telemetry_decoder_;
+}
+
+
+gr::basic_block_sptr GpsL2MTelemetryDecoder::get_right_block()
+{
+    return telemetry_decoder_;
+}
+
diff --git a/src/algorithms/telemetry_decoder/adapters/gps_l2_m_telemetry_decoder.h b/src/algorithms/telemetry_decoder/adapters/gps_l2_m_telemetry_decoder.h
new file mode 100644
index 0000000..506fdc4
--- /dev/null
+++ b/src/algorithms/telemetry_decoder/adapters/gps_l2_m_telemetry_decoder.h
@@ -0,0 +1,96 @@
+/*!
+ * \file gps_l2_m_telemetry_decoder.h
+ * \brief Interface of an adapter of a GPS L1 C/A NAV data decoder block
+ * to a TelemetryDecoderInterface
+ * \author Javier Arribas, 2015. jarribas(at)cttc.es
+ *
+ * -------------------------------------------------------------------------
+ *
+ * Copyright (C) 2010-2015  (see AUTHORS file for a list of contributors)
+ *
+ * GNSS-SDR is a software defined Global Navigation
+ *          Satellite Systems receiver
+ *
+ * This file is part of GNSS-SDR.
+ *
+ * GNSS-SDR is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GNSS-SDR is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNSS-SDR. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * -------------------------------------------------------------------------
+ */
+
+
+#ifndef GNSS_SDR_GPS_L2_M_TELEMETRY_DECODER_H_
+#define GNSS_SDR_GPS_L2_M_TELEMETRY_DECODER_H_
+
+#include <string>
+#include <gnuradio/msg_queue.h>
+#include "telemetry_decoder_interface.h"
+#include "gps_l2_m_telemetry_decoder_cc.h"
+
+
+class ConfigurationInterface;
+
+/*!
+ * \brief This class implements a NAV data decoder for GPS L2 M
+ */
+class GpsL2MTelemetryDecoder : public TelemetryDecoderInterface
+{
+public:
+    GpsL2MTelemetryDecoder(ConfigurationInterface* configuration,
+            std::string role,
+            unsigned int in_streams,
+            unsigned int out_streams,
+            boost::shared_ptr<gr::msg_queue> queue);
+
+    virtual ~GpsL2MTelemetryDecoder();
+    std::string role()
+    {
+        return role_;
+    }
+
+    //! Returns "gps_l2_m_telemetry_decoder"
+    std::string implementation()
+    {
+        return "gps_l2_m_telemetry_decoder";
+    }
+    void connect(gr::top_block_sptr top_block);
+    void disconnect(gr::top_block_sptr top_block);
+    gr::basic_block_sptr get_left_block();
+    gr::basic_block_sptr get_right_block();
+    void set_satellite(Gnss_Satellite satellite);
+    void set_channel(int channel){telemetry_decoder_->set_channel(channel);}
+    void reset()
+    {
+        return;
+    }
+    size_t item_size()
+    {
+        return 0;
+    }
+
+private:
+    gps_l2_m_telemetry_decoder_cc_sptr telemetry_decoder_;
+    Gnss_Satellite satellite_;
+    int channel_;
+    unsigned int vector_length_;
+    std::string item_type_;
+    bool dump_;
+    std::string dump_filename_;
+    std::string role_;
+    unsigned int in_streams_;
+    unsigned int out_streams_;
+    boost::shared_ptr<gr::msg_queue> queue_;
+};
+
+#endif
diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/CMakeLists.txt b/src/algorithms/telemetry_decoder/gnuradio_blocks/CMakeLists.txt
index b7c1e03..c4e9047 100644
--- a/src/algorithms/telemetry_decoder/gnuradio_blocks/CMakeLists.txt
+++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/CMakeLists.txt
@@ -18,6 +18,7 @@
 
 set(TELEMETRY_DECODER_GR_BLOCKS_SOURCES 
      gps_l1_ca_telemetry_decoder_cc.cc
+     gps_l2_m_telemetry_decoder_cc.cc
      galileo_e1b_telemetry_decoder_cc.cc
      sbas_l1_telemetry_decoder_cc.cc
      galileo_e5a_telemetry_decoder_cc.cc
diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc
index d800373..71aca1b 100644
--- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc
+++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc
@@ -86,7 +86,6 @@ gps_l1_ca_telemetry_decoder_cc::gps_l1_ca_telemetry_decoder_cc(
     d_queue = queue;
     d_dump = dump;
     d_satellite = Gnss_Satellite(satellite.get_system(), satellite.get_PRN());
-    LOG(INFO) << "TELEMETRY PROCESSING: satellite " << d_satellite;
     d_vector_length = vector_length;
     d_samples_per_bit = ( GPS_L1_CA_CODE_RATE_HZ / GPS_L1_CA_CODE_LENGTH_CHIPS ) / GPS_CA_TELEMETRY_RATE_BITS_SECOND;
     d_fs_in = fs_in;
@@ -357,7 +356,7 @@ int gps_l1_ca_telemetry_decoder_cc::general_work (int noutput_items, gr_vector_i
             d_average_count = 0;
             //3. Make the output (copy the object contents to the GNURadio reserved memory)
             *out[0] = current_synchro_data;
-            //std::cout<<"GPS TLM output on CH="<<this->d_channel << " SAMPLE STAMP="<<d_sample_counter/d_decimation_output_factor<<std::endl;
+            //std::cout<<"GPS L1 TLM output on CH="<<this->d_channel << " SAMPLE STAMP="<<d_sample_counter/d_decimation_output_factor<<std::endl;
             return 1;
         }
     else
diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2_m_telemetry_decoder_cc.cc
similarity index 92%
copy from src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc
copy to src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2_m_telemetry_decoder_cc.cc
index d800373..0910677 100644
--- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc
+++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2_m_telemetry_decoder_cc.cc
@@ -1,8 +1,8 @@
 /*!
- * \file gps_l1_ca_telemetry_decoder_cc.cc
+ * \file gps_l2_m_telemetry_decoder_cc.cc
  * \brief Implementation of a NAV message demodulator block based on
  * Kay Borre book MATLAB-based GPS receiver
- * \author Javier Arribas, 2011. jarribas(at)cttc.es
+ * \author Javier Arribas, 2015. jarribas(at)cttc.es
  *
  * -------------------------------------------------------------------------
  *
@@ -34,7 +34,7 @@
  */
 
 
-#include "gps_l1_ca_telemetry_decoder_cc.h"
+#include "gps_l2_m_telemetry_decoder_cc.h"
 #include <iostream>
 #include <sstream>
 #include <boost/lexical_cast.hpp>
@@ -51,17 +51,17 @@ using google::LogMessage;
 /*!
  * \todo name and move the magic numbers to GPS_L1_CA.h
  */
-gps_l1_ca_telemetry_decoder_cc_sptr
-gps_l1_ca_make_telemetry_decoder_cc(Gnss_Satellite satellite, long if_freq, long fs_in, unsigned
+gps_l2_m_telemetry_decoder_cc_sptr
+gps_l2_m_make_telemetry_decoder_cc(Gnss_Satellite satellite, long if_freq, long fs_in, unsigned
         int vector_length, boost::shared_ptr<gr::msg_queue> queue, bool dump)
 {
-    return gps_l1_ca_telemetry_decoder_cc_sptr(new gps_l1_ca_telemetry_decoder_cc(satellite, if_freq,
+    return gps_l2_m_telemetry_decoder_cc_sptr(new gps_l2_m_telemetry_decoder_cc(satellite, if_freq,
             fs_in, vector_length, queue, dump));
 }
 
 
 
-void gps_l1_ca_telemetry_decoder_cc::forecast (int noutput_items, gr_vector_int &ninput_items_required)
+void gps_l2_m_telemetry_decoder_cc::forecast (int noutput_items, gr_vector_int &ninput_items_required)
 {
     for (unsigned i = 0; i < 3; i++)
         {
@@ -71,7 +71,7 @@ void gps_l1_ca_telemetry_decoder_cc::forecast (int noutput_items, gr_vector_int
 
 
 
-gps_l1_ca_telemetry_decoder_cc::gps_l1_ca_telemetry_decoder_cc(
+gps_l2_m_telemetry_decoder_cc::gps_l2_m_telemetry_decoder_cc(
         Gnss_Satellite satellite,
         long if_freq,
         long fs_in,
@@ -86,7 +86,6 @@ gps_l1_ca_telemetry_decoder_cc::gps_l1_ca_telemetry_decoder_cc(
     d_queue = queue;
     d_dump = dump;
     d_satellite = Gnss_Satellite(satellite.get_system(), satellite.get_PRN());
-    LOG(INFO) << "TELEMETRY PROCESSING: satellite " << d_satellite;
     d_vector_length = vector_length;
     d_samples_per_bit = ( GPS_L1_CA_CODE_RATE_HZ / GPS_L1_CA_CODE_LENGTH_CHIPS ) / GPS_CA_TELEMETRY_RATE_BITS_SECOND;
     d_fs_in = fs_in;
@@ -135,7 +134,7 @@ gps_l1_ca_telemetry_decoder_cc::gps_l1_ca_telemetry_decoder_cc(
 }
 
 
-gps_l1_ca_telemetry_decoder_cc::~gps_l1_ca_telemetry_decoder_cc()
+gps_l2_m_telemetry_decoder_cc::~gps_l2_m_telemetry_decoder_cc()
 {
     delete d_preambles_symbols;
     d_dump_file.close();
@@ -143,7 +142,7 @@ gps_l1_ca_telemetry_decoder_cc::~gps_l1_ca_telemetry_decoder_cc()
 
 
 
-bool gps_l1_ca_telemetry_decoder_cc::gps_word_parityCheck(unsigned int gpsword)
+bool gps_l2_m_telemetry_decoder_cc::gps_word_parityCheck(unsigned int gpsword)
 {
     unsigned int d1, d2, d3, d4, d5, d6, d7, t, parity;
     /* XOR as many bits in parallel as possible.  The magic constants pick
@@ -166,7 +165,7 @@ bool gps_l1_ca_telemetry_decoder_cc::gps_word_parityCheck(unsigned int gpsword)
 }
 
 
-int gps_l1_ca_telemetry_decoder_cc::general_work (int noutput_items, gr_vector_int &ninput_items,
+int gps_l2_m_telemetry_decoder_cc::general_work (int noutput_items, gr_vector_int &ninput_items,
         gr_vector_const_void_star &input_items,	gr_vector_void_star &output_items)
 {
     int corr_value = 0;
@@ -275,7 +274,7 @@ int gps_l1_ca_telemetry_decoder_cc::general_work (int noutput_items, gr_vector_i
                         {
                             d_GPS_frame_4bytes ^= 0x3FFFFFC0; // invert the data bits (using XOR)
                         }
-                    if (gps_l1_ca_telemetry_decoder_cc::gps_word_parityCheck(d_GPS_frame_4bytes))
+                    if (gps_l2_m_telemetry_decoder_cc::gps_word_parityCheck(d_GPS_frame_4bytes))
                         {
                             memcpy(&d_GPS_FSM.d_GPS_frame_4bytes, &d_GPS_frame_4bytes, sizeof(char)*4);
                             d_GPS_FSM.d_preamble_time_ms = d_preamble_time_seconds*1000.0;
@@ -357,7 +356,7 @@ int gps_l1_ca_telemetry_decoder_cc::general_work (int noutput_items, gr_vector_i
             d_average_count = 0;
             //3. Make the output (copy the object contents to the GNURadio reserved memory)
             *out[0] = current_synchro_data;
-            //std::cout<<"GPS TLM output on CH="<<this->d_channel << " SAMPLE STAMP="<<d_sample_counter/d_decimation_output_factor<<std::endl;
+            //std::cout<<"GPS L2 TLM output on CH="<<this->d_channel << " SAMPLE STAMP="<<d_sample_counter/d_decimation_output_factor<<std::endl;
             return 1;
         }
     else
@@ -367,12 +366,12 @@ int gps_l1_ca_telemetry_decoder_cc::general_work (int noutput_items, gr_vector_i
 }
 
 
-void gps_l1_ca_telemetry_decoder_cc::set_decimation(int decimation)
+void gps_l2_m_telemetry_decoder_cc::set_decimation(int decimation)
 {
     d_decimation_output_factor = decimation;
 }
 
-void gps_l1_ca_telemetry_decoder_cc::set_satellite(Gnss_Satellite satellite)
+void gps_l2_m_telemetry_decoder_cc::set_satellite(Gnss_Satellite satellite)
 {
     d_satellite = Gnss_Satellite(satellite.get_system(), satellite.get_PRN());
     LOG(INFO) << "Setting decoder Finite State Machine to satellite "  << d_satellite;
@@ -381,7 +380,7 @@ void gps_l1_ca_telemetry_decoder_cc::set_satellite(Gnss_Satellite satellite)
 }
 
 
-void gps_l1_ca_telemetry_decoder_cc::set_channel(int channel)
+void gps_l2_m_telemetry_decoder_cc::set_channel(int channel)
 {
     d_channel = channel;
     d_GPS_FSM.i_channel_ID = channel;
diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2_m_telemetry_decoder_cc.h b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2_m_telemetry_decoder_cc.h
new file mode 100644
index 0000000..cbb5a68
--- /dev/null
+++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2_m_telemetry_decoder_cc.h
@@ -0,0 +1,152 @@
+/*!
+ * \file gps_l2_m_telemetry_decoder_cc.h
+ * \brief Interface of a NAV message demodulator block based on
+ * Kay Borre book MATLAB-based GPS receiver
+ * \author Javier Arribas, 2015. jarribas(at)cttc.es
+ * -------------------------------------------------------------------------
+ *
+ * Copyright (C) 2010-2015  (see AUTHORS file for a list of contributors)
+ *
+ * GNSS-SDR is a software defined Global Navigation
+ *          Satellite Systems receiver
+ *
+ * This file is part of GNSS-SDR.
+ *
+ * GNSS-SDR is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GNSS-SDR is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNSS-SDR. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * -------------------------------------------------------------------------
+ */
+
+#ifndef GNSS_SDR_GPS_L2_M_TELEMETRY_DECODER_CC_H
+#define	GNSS_SDR_GPS_L2_M_TELEMETRY_DECODER_CC_H
+
+#include <fstream>
+#include <string>
+#include <gnuradio/block.h>
+#include <gnuradio/msg_queue.h>
+#include "GPS_L1_CA.h"
+#include "gps_l1_ca_subframe_fsm.h"
+#include "concurrent_queue.h"
+#include "gnss_satellite.h"
+
+
+
+class gps_l2_m_telemetry_decoder_cc;
+
+typedef boost::shared_ptr<gps_l2_m_telemetry_decoder_cc> gps_l2_m_telemetry_decoder_cc_sptr;
+
+gps_l2_m_telemetry_decoder_cc_sptr
+gps_l2_m_make_telemetry_decoder_cc(Gnss_Satellite satellite, long if_freq, long fs_in, unsigned
+    int vector_length, boost::shared_ptr<gr::msg_queue> queue, bool dump);
+
+/*!
+ * \brief This class implements a block that decodes the NAV data defined in IS-GPS-200E
+ *
+ */
+class gps_l2_m_telemetry_decoder_cc : public gr::block
+{
+public:
+    ~gps_l2_m_telemetry_decoder_cc();
+    void set_satellite(Gnss_Satellite satellite);  //!< Set satellite PRN
+    void set_channel(int channel);                 //!< Set receiver's channel
+
+
+    /*!
+     * \brief Set decimation factor to average the GPS synchronization estimation output from the tracking module.
+     */
+    void set_decimation(int decimation);
+
+    /*!
+     * \brief Set the satellite data queue
+     */
+    void set_ephemeris_queue(concurrent_queue<Gps_Ephemeris> *ephemeris_queue){d_GPS_FSM.d_ephemeris_queue = ephemeris_queue;} //!< Set the ephemeris data queue
+    void set_iono_queue(concurrent_queue<Gps_Iono> *iono_queue){d_GPS_FSM.d_iono_queue = iono_queue;}                          //!< Set the iono data queue
+    void set_almanac_queue(concurrent_queue<Gps_Almanac> *almanac_queue){d_GPS_FSM.d_almanac_queue = almanac_queue;}           //!< Set the almanac data queue
+    void set_utc_model_queue(concurrent_queue<Gps_Utc_Model> *utc_model_queue){d_GPS_FSM.d_utc_model_queue = utc_model_queue;} //!< Set the UTC model data queue
+
+    /*!
+     * \brief This is where all signal processing takes place
+     */
+    int general_work (int noutput_items, gr_vector_int &ninput_items,
+            gr_vector_const_void_star &input_items, gr_vector_void_star &output_items);
+
+    /*!
+     * \brief Function which tells the scheduler how many input items
+     *        are required to produce noutput_items output items.
+     */
+    void forecast (int noutput_items, gr_vector_int &ninput_items_required);
+
+private:
+    friend gps_l2_m_telemetry_decoder_cc_sptr
+    gps_l2_m_make_telemetry_decoder_cc(Gnss_Satellite satellite, long if_freq, long fs_in,unsigned
+            int vector_length, boost::shared_ptr<gr::msg_queue> queue, bool dump);
+
+    gps_l2_m_telemetry_decoder_cc(Gnss_Satellite satellite, long if_freq, long fs_in, unsigned
+            int vector_length, boost::shared_ptr<gr::msg_queue> queue, bool dump);
+
+    bool gps_word_parityCheck(unsigned int gpsword);
+
+    // constants
+    unsigned short int d_preambles_bits[GPS_CA_PREAMBLE_LENGTH_BITS];
+    // class private vars
+
+    signed int *d_preambles_symbols;
+    unsigned int d_samples_per_bit;
+    long unsigned int d_sample_counter;
+    long unsigned int d_preamble_index;
+    unsigned int d_stat;
+    bool d_flag_frame_sync;
+
+    // symbols
+    double d_symbol_accumulator;
+    short int d_symbol_accumulator_counter;
+
+    //bits and frame
+    unsigned short int d_frame_bit_index;
+    unsigned int d_GPS_frame_4bytes;
+    unsigned int d_prev_GPS_frame_4bytes;
+    bool d_flag_parity;
+    bool d_flag_preamble;
+    int d_word_number;
+
+    // output averaging and decimation
+    int d_average_count;
+    int d_decimation_output_factor;
+
+    long d_fs_in;
+    //double d_preamble_duration_seconds;
+    // navigation message vars
+    Gps_Navigation_Message d_nav;
+    GpsL1CaSubframeFsm d_GPS_FSM;
+
+    boost::shared_ptr<gr::msg_queue> d_queue;
+    unsigned int d_vector_length;
+    bool d_dump;
+    Gnss_Satellite d_satellite;
+    int d_channel;
+
+    //std::deque<double> d_prn_start_sample_history;
+
+    double d_preamble_time_seconds;
+
+    double d_TOW_at_Preamble;
+    double d_TOW_at_current_symbol;
+    double Prn_timestamp_at_preamble_ms;
+    bool flag_TOW_set;
+
+    std::string d_dump_filename;
+    std::ofstream d_dump_file;
+};
+
+#endif
diff --git a/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking.cc b/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking.cc
new file mode 100644
index 0000000..25fef9f
--- /dev/null
+++ b/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking.cc
@@ -0,0 +1,154 @@
+/*!
+ * \file gps_l2_m_dll_pll_tracking.cc
+ * \brief Implementation of an adapter of a DLL+PLL tracking loop block
+ * for GPS L1 C/A to a TrackingInterface
+ * \author Javier Arribas, 2015. jarribas(at)cttc.es
+ *
+ * Code DLL + carrier PLL according to the algorithms described in:
+ * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen,
+ * A Software-Defined GPS and Galileo Receiver. A Single-Frequency
+ * Approach, Birkhauser, 2007
+ *
+ * -------------------------------------------------------------------------
+ *
+ * Copyright (C) 2010-2015  (see AUTHORS file for a list of contributors)
+ *
+ * GNSS-SDR is a software defined Global Navigation
+ *          Satellite Systems receiver
+ *
+ * This file is part of GNSS-SDR.
+ *
+ * GNSS-SDR is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GNSS-SDR is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNSS-SDR. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * -------------------------------------------------------------------------
+ */
+
+
+#include "gps_l2_m_dll_pll_tracking.h"
+#include <glog/logging.h>
+#include "GPS_L2C.h"
+#include "configuration_interface.h"
+
+
+using google::LogMessage;
+
+GpsL2MDllPllTracking::GpsL2MDllPllTracking(
+        ConfigurationInterface* configuration, std::string role,
+        unsigned int in_streams, unsigned int out_streams,
+        boost::shared_ptr<gr::msg_queue> queue) :
+                role_(role), in_streams_(in_streams), out_streams_(out_streams),
+                queue_(queue)
+{
+    LOG(INFO) << "role " << role;
+    //################# CONFIGURATION PARAMETERS ########################
+    int fs_in;
+    int vector_length;
+    int f_if;
+    bool dump;
+    std::string dump_filename;
+    std::string item_type;
+    std::string default_item_type = "gr_complex";
+    float pll_bw_hz;
+    float dll_bw_hz;
+    float early_late_space_chips;
+    item_type = configuration->property(role + ".item_type", default_item_type);
+    fs_in = configuration->property("GNSS-SDR.internal_fs_hz", 2048000);
+    f_if = configuration->property(role + ".if", 0);
+    dump = configuration->property(role + ".dump", false);
+    pll_bw_hz = configuration->property(role + ".pll_bw_hz", 50.0);
+    dll_bw_hz = configuration->property(role + ".dll_bw_hz", 2.0);
+    early_late_space_chips = configuration->property(role + ".early_late_space_chips", 0.5);
+    std::string default_dump_filename = "./track_ch";
+    dump_filename = configuration->property(role + ".dump_filename",
+            default_dump_filename); //unused!
+    vector_length = std::round(fs_in / (GPS_L2_M_CODE_RATE_HZ / GPS_L2_M_CODE_LENGTH_CHIPS));
+
+    //################# MAKE TRACKING GNURadio object ###################
+    if (item_type.compare("gr_complex") == 0)
+        {
+            item_size_ = sizeof(gr_complex);
+            tracking_ = gps_l2_m_dll_pll_make_tracking_cc(
+                    f_if,
+                    fs_in,
+                    vector_length,
+                    queue_,
+                    dump,
+                    dump_filename,
+                    pll_bw_hz,
+                    dll_bw_hz,
+                    early_late_space_chips);
+        }
+    else
+        {
+            LOG(WARNING) << item_type << " unknown tracking item type.";
+        }
+    DLOG(INFO) << "tracking(" << tracking_->unique_id() << ")";
+}
+
+
+GpsL2MDllPllTracking::~GpsL2MDllPllTracking()
+{}
+
+
+void GpsL2MDllPllTracking::start_tracking()
+{
+    tracking_->start_tracking();
+}
+
+/*
+ * Set tracking channel unique ID
+ */
+void GpsL2MDllPllTracking::set_channel(unsigned int channel)
+{
+    channel_ = channel;
+    tracking_->set_channel(channel);
+}
+
+/*
+ * Set tracking channel internal queue
+ */
+void GpsL2MDllPllTracking::set_channel_queue(
+        concurrent_queue<int> *channel_internal_queue)
+{
+    channel_internal_queue_ = channel_internal_queue;
+    tracking_->set_channel_queue(channel_internal_queue_);
+}
+
+void GpsL2MDllPllTracking::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro)
+{
+    tracking_->set_gnss_synchro(p_gnss_synchro);
+}
+
+void GpsL2MDllPllTracking::connect(gr::top_block_sptr top_block)
+{
+	if(top_block) { /* top_block is not null */};
+	//nothing to connect, now the tracking uses gr_sync_decimator
+}
+
+void GpsL2MDllPllTracking::disconnect(gr::top_block_sptr top_block)
+{
+	if(top_block) { /* top_block is not null */};
+	//nothing to disconnect, now the tracking uses gr_sync_decimator
+}
+
+gr::basic_block_sptr GpsL2MDllPllTracking::get_left_block()
+{
+    return tracking_;
+}
+
+gr::basic_block_sptr GpsL2MDllPllTracking::get_right_block()
+{
+    return tracking_;
+}
+
diff --git a/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking.h b/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking.h
new file mode 100644
index 0000000..06e9112
--- /dev/null
+++ b/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking.h
@@ -0,0 +1,114 @@
+/*!
+ * \file gps_l2_m_dll_pll_tracking.h
+ * \brief  Interface of an adapter of a DLL+PLL tracking loop block
+ * for GPS L1 C/A to a TrackingInterface
+ * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com
+ *         Javier Arribas, 2011. jarribas(at)cttc.es
+ *
+ * Code DLL + carrier PLL according to the algorithms described in:
+ * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen,
+ * A Software-Defined GPS and Galileo Receiver. A Single-Frequency
+ * Approach, Birkha user, 2007
+ *
+ * -------------------------------------------------------------------------
+ *
+ * Copyright (C) 2010-2015  (see AUTHORS file for a list of contributors)
+ *
+ * GNSS-SDR is a software defined Global Navigation
+ *          Satellite Systems receiver
+ *
+ * This file is part of GNSS-SDR.
+ *
+ * GNSS-SDR is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GNSS-SDR is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNSS-SDR. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * -------------------------------------------------------------------------
+ */
+
+#ifndef GNSS_SDR_gps_l2_m_dll_pll_tracking_H_
+#define GNSS_SDR_gps_l2_m_dll_pll_tracking_H_
+
+#include <string>
+#include <gnuradio/msg_queue.h>
+#include "tracking_interface.h"
+#include "gps_l2_m_dll_pll_tracking_cc.h"
+
+
+class ConfigurationInterface;
+
+/*!
+ * \brief This class implements a code DLL + carrier PLL tracking loop
+ */
+class GpsL2MDllPllTracking : public TrackingInterface
+{
+public:
+
+  GpsL2MDllPllTracking(ConfigurationInterface* configuration,
+            std::string role,
+            unsigned int in_streams,
+            unsigned int out_streams,
+            boost::shared_ptr<gr::msg_queue> queue);
+
+    virtual ~GpsL2MDllPllTracking();
+
+    std::string role()
+    {
+        return role_;
+    }
+
+    //! Returns "gps_l2_m_dll_pll_tracking"
+    std::string implementation()
+    {
+        return "gps_l2_m_dll_pll_tracking";
+    }
+    size_t item_size()
+    {
+        return item_size_;
+    }
+
+    void connect(gr::top_block_sptr top_block);
+    void disconnect(gr::top_block_sptr top_block);
+    gr::basic_block_sptr get_left_block();
+    gr::basic_block_sptr get_right_block();
+
+
+    /*!
+     * \brief Set tracking channel unique ID
+     */
+    void set_channel(unsigned int channel);
+
+    /*!
+     * \brief Set acquisition/tracking common Gnss_Synchro object pointer
+     * to efficiently exchange synchronization data between acquisition and tracking blocks
+     */
+    void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro);
+
+    /*!
+     * \brief Set tracking channel internal queue
+     */
+    void set_channel_queue(concurrent_queue<int> *channel_internal_queue);
+
+    void start_tracking();
+
+private:
+    gps_l2_m_dll_pll_tracking_cc_sptr tracking_;
+    size_t item_size_;
+    unsigned int channel_;
+    std::string role_;
+    unsigned int in_streams_;
+    unsigned int out_streams_;
+    boost::shared_ptr<gr::msg_queue> queue_;
+    concurrent_queue<int> *channel_internal_queue_;
+};
+
+#endif // GNSS_SDR_gps_l2_m_dll_pll_tracking_H_
diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_cc.cc
index 7b2fbed..586cb54 100644
--- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_cc.cc
+++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_cc.cc
@@ -509,8 +509,8 @@ int Gps_L1_Ca_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_in
                         {
                             d_last_seg = floor(d_sample_counter / d_fs_in);
                             std::cout << "Current input signal time = " << d_last_seg << " [s]" << std::endl;
-                            LOG(INFO) << "Tracking CH " << d_channel <<  ": Satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN)
-                                      << ", CN0 = " << d_CN0_SNV_dB_Hz << " [dB-Hz]";
+                            std::cout << "GPS L1 C/A Tracking CH " << d_channel <<  ": Satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN)
+                                      << ", CN0 = " << d_CN0_SNV_dB_Hz << " [dB-Hz]" << std::endl;
                             //if (d_last_seg==5) d_carrier_lock_fail_counter=500; //DEBUG: force unlock!
                         }
                 }
@@ -519,8 +519,8 @@ int Gps_L1_Ca_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_in
                     if (floor(d_sample_counter / d_fs_in) != d_last_seg)
                         {
                             d_last_seg = floor(d_sample_counter / d_fs_in);
-                            LOG(INFO) << "Tracking CH " << d_channel <<  ": Satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN)
-                                                    << ", CN0 = " << d_CN0_SNV_dB_Hz << " [dB-Hz]";
+                            std::cout<< "GPS L1 C/A Tracking CH " << d_channel <<  ": Satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN)
+                                                    << ", CN0 = " << d_CN0_SNV_dB_Hz << " [dB-Hz]"<< std::endl;
                             //std::cout<<"TRK CH "<<d_channel<<" Carrier_lock_test="<<d_carrier_lock_test<< std::endl;
                         }
                 }
diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/gps_l2_m_dll_pll_tracking_cc.cc
similarity index 89%
copy from src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_cc.cc
copy to src/algorithms/tracking/gnuradio_blocks/gps_l2_m_dll_pll_tracking_cc.cc
index 7b2fbed..6349e5a 100644
--- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_cc.cc
+++ b/src/algorithms/tracking/gnuradio_blocks/gps_l2_m_dll_pll_tracking_cc.cc
@@ -1,5 +1,5 @@
 /*!
- * \file gps_l1_ca_dll_pll_tracking_cc.cc
+ * \file gps_l2_m_dll_pll_tracking_cc.cc
  * \brief Implementation of a code DLL + carrier PLL tracking block
  * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com
  *         Javier Arribas, 2011. jarribas(at)cttc.es
@@ -34,7 +34,7 @@
  * -------------------------------------------------------------------------
  */
 
-#include "gps_l1_ca_dll_pll_tracking_cc.h"
+#include "gps_l2_m_dll_pll_tracking_cc.h"
 #include <cmath>
 #include <iostream>
 #include <memory>
@@ -43,10 +43,10 @@
 #include <gnuradio/io_signature.h>
 #include <glog/logging.h>
 #include "gnss_synchro.h"
-#include "gps_sdr_signal_processing.h"
+#include "gps_l2c_signal.h"
 #include "tracking_discriminators.h"
 #include "lock_detectors.h"
-#include "GPS_L1_CA.h"
+#include "GPS_L2C.h"
 #include "control_message_factory.h"
 
 
@@ -61,8 +61,8 @@
 
 using google::LogMessage;
 
-gps_l1_ca_dll_pll_tracking_cc_sptr
-gps_l1_ca_dll_pll_make_tracking_cc(
+gps_l2_m_dll_pll_tracking_cc_sptr
+gps_l2_m_dll_pll_make_tracking_cc(
         long if_freq,
         long fs_in,
         unsigned int vector_length,
@@ -73,13 +73,13 @@ gps_l1_ca_dll_pll_make_tracking_cc(
         float dll_bw_hz,
         float early_late_space_chips)
 {
-    return gps_l1_ca_dll_pll_tracking_cc_sptr(new Gps_L1_Ca_Dll_Pll_Tracking_cc(if_freq,
+    return gps_l2_m_dll_pll_tracking_cc_sptr(new gps_l2_m_dll_pll_tracking_cc(if_freq,
             fs_in, vector_length, queue, dump, dump_filename, pll_bw_hz, dll_bw_hz, early_late_space_chips));
 }
 
 
 
-void Gps_L1_Ca_Dll_Pll_Tracking_cc::forecast (int noutput_items,
+void gps_l2_m_dll_pll_tracking_cc::forecast (int noutput_items,
         gr_vector_int &ninput_items_required)
 {
     ninput_items_required[0] = static_cast<int>(d_vector_length) * 2; //set the required available samples in each call
@@ -87,7 +87,7 @@ void Gps_L1_Ca_Dll_Pll_Tracking_cc::forecast (int noutput_items,
 
 
 
-Gps_L1_Ca_Dll_Pll_Tracking_cc::Gps_L1_Ca_Dll_Pll_Tracking_cc(
+gps_l2_m_dll_pll_tracking_cc::gps_l2_m_dll_pll_tracking_cc(
         long if_freq,
         long fs_in,
         unsigned int vector_length,
@@ -97,7 +97,7 @@ Gps_L1_Ca_Dll_Pll_Tracking_cc::Gps_L1_Ca_Dll_Pll_Tracking_cc(
         float pll_bw_hz,
         float dll_bw_hz,
         float early_late_space_chips) :
-        gr::block("Gps_L1_Ca_Dll_Pll_Tracking_cc", gr::io_signature::make(1, 1, sizeof(gr_complex)),
+        gr::block("gps_l2_m_dll_pll_tracking_cc", gr::io_signature::make(1, 1, sizeof(gr_complex)),
                 gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)))
 {
     // initialize internal vars
@@ -108,6 +108,10 @@ Gps_L1_Ca_Dll_Pll_Tracking_cc::Gps_L1_Ca_Dll_Pll_Tracking_cc(
     d_vector_length = vector_length;
     d_dump_filename = dump_filename;
 
+    // DLL/PLL filter initialization
+    d_carrier_loop_filter=Tracking_2nd_PLL_filter(GPS_L2_M_PERIOD);
+    d_code_loop_filter=Tracking_2nd_DLL_filter(GPS_L2_M_PERIOD);
+
     // Initialize tracking  ==========================================
     d_code_loop_filter.set_DLL_BW(dll_bw_hz);
     d_carrier_loop_filter.set_PLL_BW(pll_bw_hz);
@@ -117,7 +121,7 @@ Gps_L1_Ca_Dll_Pll_Tracking_cc::Gps_L1_Ca_Dll_Pll_Tracking_cc(
 
     // Initialization of local code replica
     // Get space for a vector with the C/A code replica sampled 1x/chip
-    d_ca_code = static_cast<gr_complex*>(volk_malloc((GPS_L1_CA_CODE_LENGTH_CHIPS + 2) * sizeof(gr_complex), volk_get_alignment()));
+    d_ca_code = static_cast<gr_complex*>(volk_malloc((GPS_L2_M_CODE_LENGTH_CHIPS + 2) * sizeof(gr_complex), volk_get_alignment()));
 
     // Get space for the resampled early / prompt / late local replicas
     d_early_code = static_cast<gr_complex*>(volk_malloc(2 * d_vector_length * sizeof(gr_complex), volk_get_alignment()));
@@ -135,7 +139,7 @@ Gps_L1_Ca_Dll_Pll_Tracking_cc::Gps_L1_Ca_Dll_Pll_Tracking_cc(
 
     //--- Perform initializations ------------------------------
     // define initial code frequency basis of NCO
-    d_code_freq_chips = GPS_L1_CA_CODE_RATE_HZ;
+    d_code_freq_chips = GPS_L2_M_CODE_RATE_HZ;
     // define residual code phase (in chips)
     d_rem_code_phase_samples = 0.0;
     // define residual carrier phase
@@ -161,16 +165,15 @@ Gps_L1_Ca_Dll_Pll_Tracking_cc::Gps_L1_Ca_Dll_Pll_Tracking_cc(
     d_carrier_lock_threshold = CARRIER_LOCK_THRESHOLD;
 
     systemName["G"] = std::string("GPS");
-    systemName["S"] = std::string("SBAS");
-
 
     set_relative_rate(1.0/((double)d_vector_length*2));
-
     //set_min_output_buffer((long int)300);
+
+    LOG(INFO)<<"d_vector_length"<<d_vector_length<<std::endl;
 }
 
 
-void Gps_L1_Ca_Dll_Pll_Tracking_cc::start_tracking()
+void gps_l2_m_dll_pll_tracking_cc::start_tracking()
 {
     /*
      *  correct the code phase according to the delay between acq and trk
@@ -186,19 +189,19 @@ void Gps_L1_Ca_Dll_Pll_Tracking_cc::start_tracking()
     acq_trk_diff_seconds = static_cast<float>(acq_trk_diff_samples) / static_cast<float>(d_fs_in);
     //doppler effect
     // Fd=(C/(C+Vr))*F
-    float radial_velocity = (GPS_L1_FREQ_HZ + d_acq_carrier_doppler_hz) / GPS_L1_FREQ_HZ;
+    float radial_velocity = (GPS_L2_FREQ_HZ + d_acq_carrier_doppler_hz) / GPS_L2_FREQ_HZ;
     // new chip and prn sequence periods based on acq Doppler
     float T_chip_mod_seconds;
     float T_prn_mod_seconds;
     float T_prn_mod_samples;
-    d_code_freq_chips = radial_velocity * GPS_L1_CA_CODE_RATE_HZ;
+    d_code_freq_chips = radial_velocity * GPS_L2_M_CODE_RATE_HZ;
     T_chip_mod_seconds = 1/d_code_freq_chips;
-    T_prn_mod_seconds = T_chip_mod_seconds * GPS_L1_CA_CODE_LENGTH_CHIPS;
+    T_prn_mod_seconds = T_chip_mod_seconds * GPS_L2_M_CODE_LENGTH_CHIPS;
     T_prn_mod_samples = T_prn_mod_seconds * static_cast<float>(d_fs_in);
 
     d_current_prn_length_samples = round(T_prn_mod_samples);
 
-    float T_prn_true_seconds = GPS_L1_CA_CODE_LENGTH_CHIPS / GPS_L1_CA_CODE_RATE_HZ;
+    float T_prn_true_seconds = GPS_L2_M_CODE_LENGTH_CHIPS / GPS_L2_M_CODE_RATE_HZ;
     float T_prn_true_samples = T_prn_true_seconds * static_cast<float>(d_fs_in);
     float T_prn_diff_seconds=  T_prn_true_seconds - T_prn_mod_seconds;
     float N_prn_diff = acq_trk_diff_seconds / T_prn_true_seconds;
@@ -219,9 +222,9 @@ void Gps_L1_Ca_Dll_Pll_Tracking_cc::start_tracking()
     d_code_loop_filter.initialize();    // initialize the code filter
 
     // generate local reference ALWAYS starting at chip 1 (1 sample per chip)
-    gps_l1_ca_code_gen_complex(&d_ca_code[1], d_acquisition_gnss_synchro->PRN, 0);
-    d_ca_code[0] = d_ca_code[static_cast<int>(GPS_L1_CA_CODE_LENGTH_CHIPS)];
-    d_ca_code[static_cast<int>(GPS_L1_CA_CODE_LENGTH_CHIPS) + 1] = d_ca_code[1];
+    gps_l2c_m_code_gen_complex(&d_ca_code[1], d_acquisition_gnss_synchro->PRN);
+    d_ca_code[0] = d_ca_code[static_cast<int>(GPS_L2_M_CODE_LENGTH_CHIPS)];
+    d_ca_code[static_cast<int>(GPS_L2_M_CODE_LENGTH_CHIPS) + 1] = d_ca_code[1];
 
     d_carrier_lock_fail_counter = 0;
     d_rem_code_phase_samples = 0;
@@ -252,12 +255,12 @@ void Gps_L1_Ca_Dll_Pll_Tracking_cc::start_tracking()
 
 
 
-void Gps_L1_Ca_Dll_Pll_Tracking_cc::update_local_code()
+void gps_l2_m_dll_pll_tracking_cc::update_local_code()
 {
     double tcode_chips;
     double rem_code_phase_chips;
     int associated_chip_index;
-    int code_length_chips = static_cast<int>(GPS_L1_CA_CODE_LENGTH_CHIPS);
+    int code_length_chips = static_cast<int>(GPS_L2_M_CODE_LENGTH_CHIPS);
     double code_phase_step_chips;
     int early_late_spc_samples;
     int epl_loop_length_samples;
@@ -284,7 +287,7 @@ void Gps_L1_Ca_Dll_Pll_Tracking_cc::update_local_code()
 
 
 
-void Gps_L1_Ca_Dll_Pll_Tracking_cc::update_local_carrier()
+void gps_l2_m_dll_pll_tracking_cc::update_local_carrier()
 {
     float phase_rad, phase_step_rad;
 
@@ -302,7 +305,7 @@ void Gps_L1_Ca_Dll_Pll_Tracking_cc::update_local_carrier()
 
 
 
-Gps_L1_Ca_Dll_Pll_Tracking_cc::~Gps_L1_Ca_Dll_Pll_Tracking_cc()
+gps_l2_m_dll_pll_tracking_cc::~gps_l2_m_dll_pll_tracking_cc()
 {
     d_dump_file.close();
 
@@ -320,7 +323,7 @@ Gps_L1_Ca_Dll_Pll_Tracking_cc::~Gps_L1_Ca_Dll_Pll_Tracking_cc()
 
 
 
-int Gps_L1_Ca_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_int &ninput_items,
+int gps_l2_m_dll_pll_tracking_cc::general_work (int noutput_items, gr_vector_int &ninput_items,
         gr_vector_const_void_star &input_items, gr_vector_void_star &output_items)
 {
     // process vars
@@ -329,13 +332,12 @@ int Gps_L1_Ca_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_in
     float code_error_chips;
     float code_error_filt_chips;
 
-    // Block input data and block output stream pointers
-    const gr_complex* in = (gr_complex*) input_items[0]; //PRN start block alignment
-    Gnss_Synchro **out = (Gnss_Synchro **) &output_items[0];
-
     // GNSS_SYNCHRO OBJECT to interchange data between tracking->telemetry_decoder
     Gnss_Synchro current_synchro_data;
 
+    // Block input data and block output stream pointers
+    const gr_complex* in = (gr_complex*) input_items[0]; //PRN start block alignment
+    Gnss_Synchro **out = (Gnss_Synchro **) &output_items[0];
 
     if (d_enable_tracking == true)
         {
@@ -377,7 +379,6 @@ int Gps_L1_Ca_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_in
                     d_Early,
                     d_Prompt,
                     d_Late);
-
             // check for samples consistency (this should be done before in the receiver / here only if the source is a file)
             if (std::isnan((*d_Prompt).real()) == true or std::isnan((*d_Prompt).imag()) == true ) // or std::isinf(in[i].real())==true or std::isinf(in[i].imag())==true)
                 {
@@ -397,6 +398,7 @@ int Gps_L1_Ca_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_in
                     current_synchro_data.Flag_valid_pseudorange = false;
 
                     *out[0] = current_synchro_data;
+
                     return 1;
                 }
 
@@ -408,11 +410,11 @@ int Gps_L1_Ca_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_in
             // New carrier Doppler frequency estimation
             d_carrier_doppler_hz = d_acq_carrier_doppler_hz + carr_error_filt_hz;
             // New code Doppler frequency estimation
-            d_code_freq_chips = GPS_L1_CA_CODE_RATE_HZ + ((d_carrier_doppler_hz * GPS_L1_CA_CODE_RATE_HZ) / GPS_L1_FREQ_HZ);
+            d_code_freq_chips = GPS_L2_M_CODE_RATE_HZ + ((d_carrier_doppler_hz * GPS_L2_M_CODE_RATE_HZ) / GPS_L2_FREQ_HZ);
             //carrier phase accumulator for (K) doppler estimation
-            d_acc_carrier_phase_rad = d_acc_carrier_phase_rad + GPS_TWO_PI * d_carrier_doppler_hz * GPS_L1_CA_CODE_PERIOD;
+            d_acc_carrier_phase_rad = d_acc_carrier_phase_rad + GPS_TWO_PI * d_carrier_doppler_hz * GPS_L2_M_PERIOD;
             //remanent carrier phase to prevent overflow in the code NCO
-            d_rem_carr_phase_rad = d_rem_carr_phase_rad + GPS_TWO_PI * d_carrier_doppler_hz * GPS_L1_CA_CODE_PERIOD;
+            d_rem_carr_phase_rad = d_rem_carr_phase_rad + GPS_TWO_PI * d_carrier_doppler_hz * GPS_L2_M_PERIOD;
             d_rem_carr_phase_rad = fmod(d_rem_carr_phase_rad, GPS_TWO_PI);
 
             // ################## DLL ##########################################################
@@ -422,7 +424,7 @@ int Gps_L1_Ca_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_in
             code_error_filt_chips = d_code_loop_filter.get_code_nco(code_error_chips); //[chips/second]
             //Code phase accumulator
             float code_error_filt_secs;
-            code_error_filt_secs = (GPS_L1_CA_CODE_PERIOD * code_error_filt_chips) / GPS_L1_CA_CODE_RATE_HZ; //[seconds]
+            code_error_filt_secs = (GPS_L2_M_PERIOD * code_error_filt_chips) / GPS_L2_M_CODE_RATE_HZ; //[seconds]
             d_acc_code_phase_secs = d_acc_code_phase_secs + code_error_filt_secs;
 
             // ################## CARRIER AND CODE NCO BUFFER ALIGNEMENT #######################
@@ -433,7 +435,7 @@ int Gps_L1_Ca_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_in
             double K_blk_samples;
             // Compute the next buffer length based in the new period of the PRN sequence and the code phase error estimation
             T_chip_seconds = 1 / static_cast<double>(d_code_freq_chips);
-            T_prn_seconds = T_chip_seconds * GPS_L1_CA_CODE_LENGTH_CHIPS;
+            T_prn_seconds = T_chip_seconds * GPS_L2_M_CODE_LENGTH_CHIPS;
             T_prn_samples = T_prn_seconds * static_cast<double>(d_fs_in);
             K_blk_samples = T_prn_samples + d_rem_code_phase_samples + code_error_filt_secs * static_cast<double>(d_fs_in);
             d_current_prn_length_samples = round(K_blk_samples); //round to a discrete samples
@@ -450,7 +452,7 @@ int Gps_L1_Ca_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_in
                 {
                     d_cn0_estimation_counter = 0;
                     // Code lock indicator
-                    d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES, d_fs_in, GPS_L1_CA_CODE_LENGTH_CHIPS);
+                    d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES, d_fs_in, GPS_L2_M_CODE_LENGTH_CHIPS);
                     // Carrier lock indicator
                     d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES);
                     // Loss of lock detection
@@ -509,8 +511,8 @@ int Gps_L1_Ca_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_in
                         {
                             d_last_seg = floor(d_sample_counter / d_fs_in);
                             std::cout << "Current input signal time = " << d_last_seg << " [s]" << std::endl;
-                            LOG(INFO) << "Tracking CH " << d_channel <<  ": Satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN)
-                                      << ", CN0 = " << d_CN0_SNV_dB_Hz << " [dB-Hz]";
+                            std::cout  << "GPS L2C M Tracking CH " << d_channel <<  ": Satellite "
+                            		<< Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << ", CN0 = " << d_CN0_SNV_dB_Hz << " [dB-Hz]"<< std::endl;
                             //if (d_last_seg==5) d_carrier_lock_fail_counter=500; //DEBUG: force unlock!
                         }
                 }
@@ -519,8 +521,9 @@ int Gps_L1_Ca_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_in
                     if (floor(d_sample_counter / d_fs_in) != d_last_seg)
                         {
                             d_last_seg = floor(d_sample_counter / d_fs_in);
-                            LOG(INFO) << "Tracking CH " << d_channel <<  ": Satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN)
-                                                    << ", CN0 = " << d_CN0_SNV_dB_Hz << " [dB-Hz]";
+                            std::cout << "GPS L2C M Tracking CH " << d_channel <<  ": Satellite "
+                            << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN)
+                            << ", CN0 = " << d_CN0_SNV_dB_Hz << " [dB-Hz]"<<std::endl;
                             //std::cout<<"TRK CH "<<d_channel<<" Carrier_lock_test="<<d_carrier_lock_test<< std::endl;
                         }
                 }
@@ -607,16 +610,15 @@ int Gps_L1_Ca_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_in
                     LOG(WARNING) << "Exception writing trk dump file " << e.what();
             }
         }
-
     consume_each(d_current_prn_length_samples); // this is necessary in gr::block derivates
     d_sample_counter += d_current_prn_length_samples; //count for the processed samples
-    //LOG(INFO)<<"GPS tracking output end on CH="<<this->d_channel << " SAMPLE STAMP="<<d_sample_counter<<std::endl;
+    //LOG(INFO)<<"GPS L2 tracking output end on CH="<<this->d_channel << " SAMPLE STAMP="<<d_sample_counter<<std::endl;
     return 1; //output tracking result ALWAYS even in the case of d_enable_tracking==false
 }
 
 
 
-void Gps_L1_Ca_Dll_Pll_Tracking_cc::set_channel(unsigned int channel)
+void gps_l2_m_dll_pll_tracking_cc::set_channel(unsigned int channel)
 {
     d_channel = channel;
     LOG(INFO) << "Tracking Channel set to " << d_channel;
@@ -643,13 +645,13 @@ void Gps_L1_Ca_Dll_Pll_Tracking_cc::set_channel(unsigned int channel)
 
 
 
-void Gps_L1_Ca_Dll_Pll_Tracking_cc::set_channel_queue(concurrent_queue<int> *channel_internal_queue)
+void gps_l2_m_dll_pll_tracking_cc::set_channel_queue(concurrent_queue<int> *channel_internal_queue)
 {
     d_channel_internal_queue = channel_internal_queue;
 }
 
 
-void Gps_L1_Ca_Dll_Pll_Tracking_cc::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro)
+void gps_l2_m_dll_pll_tracking_cc::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro)
 {
     d_acquisition_gnss_synchro = p_gnss_synchro;
 }
diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l2_m_dll_pll_tracking_cc.h b/src/algorithms/tracking/gnuradio_blocks/gps_l2_m_dll_pll_tracking_cc.h
new file mode 100644
index 0000000..8432685
--- /dev/null
+++ b/src/algorithms/tracking/gnuradio_blocks/gps_l2_m_dll_pll_tracking_cc.h
@@ -0,0 +1,187 @@
+/*!
+ * \file gps_l2_m_dll_pll_tracking_cc.h
+ * \brief Interface of a code DLL + carrier PLL tracking block
+ * \author Javier Arribas, 2015. jarribas(at)cttc.es
+ *
+ * Code DLL + carrier PLL according to the algorithms described in:
+ * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen,
+ * A Software-Defined GPS and Galileo Receiver. A Single-Frequency Approach,
+ * Birkhauser, 2007
+ *
+ * -------------------------------------------------------------------------
+ *
+ * Copyright (C) 2010-2015  (see AUTHORS file for a list of contributors)
+ *
+ * GNSS-SDR is a software defined Global Navigation
+ *          Satellite Systems receiver
+ *
+ * This file is part of GNSS-SDR.
+ *
+ * GNSS-SDR is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GNSS-SDR is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNSS-SDR. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * -------------------------------------------------------------------------
+ */
+
+#ifndef GNSS_SDR_GPS_L2_M_DLL_PLL_TRACKING_CC_H
+#define	GNSS_SDR_GPS_L2_M_DLL_PLL_TRACKING_CC_H
+
+#include <fstream>
+#include <queue>
+#include <map>
+#include <string>
+#include <boost/thread/mutex.hpp>
+#include <boost/thread/thread.hpp>
+#include <gnuradio/block.h>
+#include <gnuradio/msg_queue.h>
+#include "concurrent_queue.h"
+#include "gps_sdr_signal_processing.h"
+#include "gnss_synchro.h"
+#include "tracking_2nd_DLL_filter.h"
+#include "tracking_2nd_PLL_filter.h"
+#include "correlator.h"
+
+class gps_l2_m_dll_pll_tracking_cc;
+
+typedef boost::shared_ptr<gps_l2_m_dll_pll_tracking_cc>
+        gps_l2_m_dll_pll_tracking_cc_sptr;
+
+gps_l2_m_dll_pll_tracking_cc_sptr
+gps_l2_m_dll_pll_make_tracking_cc(long if_freq,
+                                   long fs_in, unsigned
+                                   int vector_length,
+                                   boost::shared_ptr<gr::msg_queue> queue,
+                                   bool dump,
+                                   std::string dump_filename,
+                                   float pll_bw_hz,
+                                   float dll_bw_hz,
+                                   float early_late_space_chips);
+
+
+
+/*!
+ * \brief This class implements a DLL + PLL tracking loop block
+ */
+class gps_l2_m_dll_pll_tracking_cc: public gr::block
+{
+public:
+    ~gps_l2_m_dll_pll_tracking_cc();
+
+    void set_channel(unsigned int channel);
+    void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro);
+    void start_tracking();
+    void set_channel_queue(concurrent_queue<int> *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);
+
+    void forecast (int noutput_items, gr_vector_int &ninput_items_required);
+
+private:
+    friend gps_l2_m_dll_pll_tracking_cc_sptr
+    gps_l2_m_dll_pll_make_tracking_cc(long if_freq,
+            long fs_in, unsigned
+            int vector_length,
+            boost::shared_ptr<gr::msg_queue> queue,
+            bool dump,
+            std::string dump_filename,
+            float pll_bw_hz,
+            float dll_bw_hz,
+            float early_late_space_chips);
+
+    gps_l2_m_dll_pll_tracking_cc(long if_freq,
+            long fs_in, unsigned
+            int vector_length,
+            boost::shared_ptr<gr::msg_queue> queue,
+            bool dump,
+            std::string dump_filename,
+            float pll_bw_hz,
+            float dll_bw_hz,
+            float early_late_space_chips);
+    void update_local_code();
+    void update_local_carrier();
+
+    // tracking configuration vars
+    boost::shared_ptr<gr::msg_queue> d_queue;
+    concurrent_queue<int> *d_channel_internal_queue;
+    unsigned int d_vector_length;
+    bool d_dump;
+
+    Gnss_Synchro* d_acquisition_gnss_synchro;
+    unsigned int d_channel;
+    int d_last_seg;
+    long d_if_freq;
+    long d_fs_in;
+
+    double d_early_late_spc_chips;
+
+    gr_complex* d_ca_code;
+
+    gr_complex* d_early_code;
+    gr_complex* d_late_code;
+    gr_complex* d_prompt_code;
+    gr_complex* d_carr_sign;
+
+    gr_complex *d_Early;
+    gr_complex *d_Prompt;
+    gr_complex *d_Late;
+
+    // remaining code phase and carrier phase between tracking loops
+    double d_rem_code_phase_samples;
+    float d_rem_carr_phase_rad;
+
+    // PLL and DLL filter library
+    Tracking_2nd_DLL_filter d_code_loop_filter;
+    Tracking_2nd_PLL_filter d_carrier_loop_filter;
+
+    // acquisition
+    float d_acq_code_phase_samples;
+    float d_acq_carrier_doppler_hz;
+    // correlator
+    Correlator d_correlator;
+
+    // tracking vars
+    double d_code_freq_chips;
+    float d_carrier_doppler_hz;
+    float d_acc_carrier_phase_rad;
+    float d_code_phase_samples;
+    float d_acc_code_phase_secs;
+
+    //PRN period in samples
+    int d_current_prn_length_samples;
+
+    //processing samples counters
+    unsigned long int d_sample_counter;
+    unsigned long int d_acq_sample_stamp;
+
+    // CN0 estimation and lock detector
+    int d_cn0_estimation_counter;
+    gr_complex* d_Prompt_buffer;
+    float d_carrier_lock_test;
+    float d_CN0_SNV_dB_Hz;
+    float d_carrier_lock_threshold;
+    int d_carrier_lock_fail_counter;
+
+    // control vars
+    bool d_enable_tracking;
+    bool d_pull_in;
+
+    // file dump
+    std::string d_dump_filename;
+    std::ofstream d_dump_file;
+
+    std::map<std::string, std::string> systemName;
+    std::string sys;
+};
+
+#endif //GNSS_SDR_GPS_L2_M_DLL_PLL_TRACKING_CC_H
diff --git a/src/core/receiver/gnss_block_factory.cc b/src/core/receiver/gnss_block_factory.cc
index e67681b..a193501 100644
--- a/src/core/receiver/gnss_block_factory.cc
+++ b/src/core/receiver/gnss_block_factory.cc
@@ -84,6 +84,7 @@
 #include "galileo_e5a_dll_pll_tracking.h"
 #include "gps_l2_m_dll_pll_tracking.h"
 #include "gps_l1_ca_telemetry_decoder.h"
+#include "gps_l2_m_telemetry_decoder.h"
 #include "galileo_e1b_telemetry_decoder.h"
 #include "galileo_e5a_telemetry_decoder.h"
 #include "sbas_l1_telemetry_decoder.h"
@@ -256,16 +257,15 @@ std::unique_ptr<GNSSBlockInterface> GNSSBlockFactory::GetChannel_GPS(
         std::string acq, std::string trk, std::string tlm, int channel,
         boost::shared_ptr<gr::msg_queue> queue)
 {
-    std::stringstream stream;
-    stream << channel;
-    std::string id = stream.str();
-    LOG(INFO) << "Instantiating Channel " << id << " with Acquisition Implementation: "
+
+    LOG(INFO) << "Instantiating Channel " << channel << " with Acquisition Implementation: "
               << acq << ", Tracking Implementation: " << trk  << ", Telemetry Decoder implementation: " << tlm;
 
     std::unique_ptr<GNSSBlockInterface> pass_through_ = GetBlock(configuration, "Channel", "Pass_Through", 1, 1, queue);
     std::unique_ptr<AcquisitionInterface> acq_ = GetAcqBlock(configuration, "Acquisition_GPS", acq, 1, 1, queue);
-    std::unique_ptr<TrackingInterface> trk_ = GetTrkBlock(configuration, "Tracking_GPS", trk, 1, 1, queue);
-    std::unique_ptr<TelemetryDecoderInterface> tlm_ = GetTlmBlock(configuration, "TelemetryDecoder_GPS", tlm, 1, 1, queue);
+    std::unique_ptr<TrackingInterface> trk_ = GetTrkBlock(configuration, "Tracking_GPS" +boost::lexical_cast<std::string>(channel), trk, 1, 1, queue);
+
+    std::unique_ptr<TelemetryDecoderInterface> tlm_ = GetTlmBlock(configuration, "TelemetryDecoder_GPS"+boost::lexical_cast<std::string>(channel)  , tlm, 1, 1, queue);
 
     std::unique_ptr<GNSSBlockInterface> channel_(new Channel(configuration.get(), channel, pass_through_.release(),
             acq_.release(),
@@ -345,6 +345,14 @@ std::unique_ptr<std::vector<std::unique_ptr<GNSSBlockInterface>>> GNSSBlockFacto
             	tracking_implementation = tracking_implementation_specific;
             }
 
+            std::string telemetry_decoder_implementation_specific = configuration->property(
+                        "TelemetryDecoder_GPS" + boost::lexical_cast<std::string>(i) + ".implementation",
+                        default_implementation);
+            if(telemetry_decoder_implementation_specific.compare(default_implementation) != 0)
+            {
+            	telemetry_decoder = telemetry_decoder_implementation_specific;
+            }
+
             channels->push_back(std::move(GetChannel_GPS(configuration,
                     acquisition_implementation, tracking_implementation, telemetry_decoder, channel_absolute_id, queue)));
             channel_absolute_id++;
@@ -988,6 +996,7 @@ std::unique_ptr<TelemetryDecoderInterface> GNSSBlockFactory::GetTlmBlock(
 {
     std::unique_ptr<TelemetryDecoderInterface> block;
 
+    std::cout<<"implementation tlm="<<implementation<<std::endl;
     // TELEMETRY DECODERS ----------------------------------------------------------
     if (implementation.compare("GPS_L1_CA_Telemetry_Decoder") == 0)
         {
@@ -1013,6 +1022,12 @@ std::unique_ptr<TelemetryDecoderInterface> GNSSBlockFactory::GetTlmBlock(
                     out_streams, queue));
             block = std::move(block_);
         }
+    else if (implementation.compare("GPS_L2_M_Telemetry_Decoder") == 0)
+        {
+            std::unique_ptr<TelemetryDecoderInterface> block_(new GpsL2MTelemetryDecoder(configuration.get(), role, in_streams,
+                    out_streams, queue));
+            block = std::move(block_);
+        }
     else
         {
             // Log fatal. This causes execution to stop.
diff --git a/src/tests/data/.gitignore b/src/tests/data/.gitignore
new file mode 100644
index 0000000..a7004ac
--- /dev/null
+++ b/src/tests/data/.gitignore
@@ -0,0 +1 @@
+/gps_l2c_m_prn7_5msps.dat
diff --git a/src/tests/gnss_block/gps_l2_m_dll_pll_tracking_test.cc b/src/tests/gnss_block/gps_l2_m_dll_pll_tracking_test.cc
new file mode 100644
index 0000000..f135388
--- /dev/null
+++ b/src/tests/gnss_block/gps_l2_m_dll_pll_tracking_test.cc
@@ -0,0 +1,167 @@
+/*!
+ * \file gps_l2_m_dll_pll_tracking_test.cc
+ * \brief  This class implements a tracking test for Galileo_E5a_DLL_PLL_Tracking
+ *  implementation based on some input parameters.
+ * \author Javier Arribas, 2015. jarribas(at)cttc.es
+ *
+ *
+ * -------------------------------------------------------------------------
+ *
+ * Copyright (C) 2012-2015  (see AUTHORS file for a list of contributors)
+ *
+ * GNSS-SDR is a software defined Global Navigation
+ *          Satellite Systems receiver
+ *
+ * This file is part of GNSS-SDR.
+ *
+ * GNSS-SDR is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GNSS-SDR is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNSS-SDR. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * -------------------------------------------------------------------------
+ */
+
+
+#include <ctime>
+#include <iostream>
+#include <gnuradio/top_block.h>
+#include <gnuradio/blocks/file_source.h>
+#include <gnuradio/analog/sig_source_waveform.h>
+#include <gnuradio/analog/sig_source_c.h>
+#include <gnuradio/msg_queue.h>
+#include <gnuradio/blocks/null_sink.h>
+#include <gnuradio/blocks/skiphead.h>
+#include <gtest/gtest.h>
+#include "gnss_block_factory.h"
+#include "gnss_block_interface.h"
+#include "tracking_interface.h"
+#include "in_memory_configuration.h"
+#include "gnss_sdr_valve.h"
+#include "gnss_synchro.h"
+#include "gps_l2_m_dll_pll_tracking.h"
+
+
+class GpsL2MDllPllTrackingTest: public ::testing::Test
+{
+protected:
+	GpsL2MDllPllTrackingTest()
+    {
+        factory = std::make_shared<GNSSBlockFactory>();
+        config = std::make_shared<InMemoryConfiguration>();
+        item_size = sizeof(gr_complex);
+        stop = false;
+        message = 0;
+    }
+
+    ~GpsL2MDllPllTrackingTest()
+    {}
+
+    void init();
+
+    gr::msg_queue::sptr queue;
+    gr::top_block_sptr top_block;
+    std::shared_ptr<GNSSBlockFactory> factory;
+    std::shared_ptr<InMemoryConfiguration> config;
+    Gnss_Synchro gnss_synchro;
+    size_t item_size;
+    concurrent_queue<int> channel_internal_queue;
+    bool stop;
+    int message;
+};
+
+
+void GpsL2MDllPllTrackingTest::init()
+{
+    gnss_synchro.Channel_ID = 0;
+    gnss_synchro.System = 'G';
+    std::string signal = "2S";
+    signal.copy(gnss_synchro.Signal, 2, 0);
+    gnss_synchro.PRN = 15;
+
+    config->set_property("GNSS-SDR.internal_fs_hz", "4000000");
+    config->set_property("Tracking_GPS.item_type", "gr_complex");
+    config->set_property("Tracking_GPS.dump", "true");
+    config->set_property("Tracking_GPS.dump_filename", "../data/L2m_tracking_ch_");
+    config->set_property("Tracking_GPS.implementation", "GPS_L2_M_DLL_PLL_Tracking");
+    config->set_property("Tracking_GPS.early_late_space_chips", "0.5");
+    config->set_property("Tracking_GPS.order", "2");
+    config->set_property("Tracking_GPS.pll_bw_hz", "2");
+    config->set_property("Tracking_GPS.dll_bw_hz", "0.5");
+}
+
+TEST_F(GpsL2MDllPllTrackingTest, ValidationOfResults)
+{
+    struct timeval tv;
+    long long int begin = 0;
+    long long int end = 0;
+    int fs_in = 4000000;
+    int nsamples = fs_in*30;
+    init();
+    queue = gr::msg_queue::make(0);
+    top_block = gr::make_top_block("Tracking test");
+
+    std::shared_ptr<TrackingInterface> tracking = std::make_shared<GpsL2MDllPllTracking>(config.get(), "Tracking_GPS", 1, 1, queue);
+
+    //REAL
+    gnss_synchro.Acq_delay_samples = 2004;
+    gnss_synchro.Acq_doppler_hz = 2980;//1200;
+    gnss_synchro.Acq_samplestamp_samples = 0;
+
+    ASSERT_NO_THROW( {
+        tracking->set_channel(gnss_synchro.Channel_ID);
+    }) << "Failure setting channel." << std::endl;
+
+    ASSERT_NO_THROW( {
+        tracking->set_gnss_synchro(&gnss_synchro);
+    }) << "Failure setting gnss_synchro." << std::endl;
+
+    ASSERT_NO_THROW( {
+        tracking->set_channel_queue(&channel_internal_queue);
+    }) << "Failure setting channel_internal_queue." << std::endl;
+
+    ASSERT_NO_THROW( {
+        tracking->connect(top_block);
+    }) << "Failure connecting tracking to the top_block." << std::endl;
+
+    ASSERT_NO_THROW( {
+        //gr::analog::sig_source_c::sptr source = gr::analog::sig_source_c::make(fs_in, gr::analog::GR_SIN_WAVE, 1000, 1, gr_complex(0));
+
+
+        std::string path = std::string(TEST_PATH);
+        //std::string file = path + "signal_samples/GSoC_CTTC_capture_2012_07_26_4Msps_4ms.dat";
+        std::string file = "/datalogger/signals/Fraunhofer/L125_III1b_210s_L2_resampled.bin";
+        //std::string file = "/home/gnss/git/gnss-sdr/src/tests/data/gps_l2c_m_prn7_5msps.dat";
+        const char * file_name = file.c_str();
+        gr::blocks::file_source::sptr file_source = gr::blocks::file_source::make(sizeof(gr_complex), file_name, false);
+
+
+        boost::shared_ptr<gr::block> valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue);
+        gr::blocks::null_sink::sptr sink = gr::blocks::null_sink::make(sizeof(Gnss_Synchro));
+        top_block->connect(file_source, 0, valve, 0);
+        top_block->connect(valve, 0, tracking->get_left_block(), 0);
+        top_block->connect(tracking->get_right_block(), 0, sink, 0);
+
+    }) << "Failure connecting the blocks of tracking test." << std::endl;
+
+    tracking->start_tracking();
+
+    EXPECT_NO_THROW( {
+        gettimeofday(&tv, NULL);
+        begin = tv.tv_sec *1000000 + tv.tv_usec;
+        top_block->run(); // Start threads and wait
+        gettimeofday(&tv, NULL);
+        end = tv.tv_sec *1000000 + tv.tv_usec;
+    }) << "Failure running the top_block." << std::endl;
+
+    std::cout <<  "Tracked " << nsamples << " samples in " << (end - begin) << " microseconds" << std::endl;
+}
+
diff --git a/src/tests/gnss_block/gps_l2_m_pcps_acquisition_test.cc b/src/tests/gnss_block/gps_l2_m_pcps_acquisition_test.cc
new file mode 100644
index 0000000..355f452
--- /dev/null
+++ b/src/tests/gnss_block/gps_l2_m_pcps_acquisition_test.cc
@@ -0,0 +1,275 @@
+/*!
+ * \file gps_l1_ca_pcps_acquisition_test.cc
+ * \brief  This class implements an acquisition test for
+ * GpsL1CaPcpsAcquisition class based on some input parameters.
+ * \author Javier Arribas, 2015 (jarribas at cttc.es)
+ *
+ *
+ * -------------------------------------------------------------------------
+ *
+ * Copyright (C) 2010-2015  (see AUTHORS file for a list of contributors)
+ *
+ * GNSS-SDR is a software defined Global Navigation
+ *          Satellite Systems receiver
+ *
+ * This file is part of GNSS-SDR.
+ *
+ * GNSS-SDR is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GNSS-SDR is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNSS-SDR. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * -------------------------------------------------------------------------
+ */
+
+
+
+#include <ctime>
+#include <cstdlib>
+#include <iostream>
+#include <boost/chrono.hpp>
+#include <gnuradio/top_block.h>
+#include <gnuradio/blocks/file_source.h>
+#include <gnuradio/analog/sig_source_waveform.h>
+#include <gnuradio/analog/sig_source_c.h>
+#include <gnuradio/blocks/interleaved_short_to_complex.h>
+#include <gnuradio/blocks/char_to_short.h>
+#include <gnuradio/msg_queue.h>
+#include <gnuradio/blocks/null_sink.h>
+#include <gtest/gtest.h>
+#include "gnss_block_factory.h"
+#include "gnss_block_interface.h"
+#include "in_memory_configuration.h"
+#include "gnss_sdr_valve.h"
+#include "gnss_synchro.h"
+#include "gps_l2_m_pcps_acquisition.h"
+#include "GPS_L2C.h"
+
+
+class GpsL2MPcpsAcquisitionTest: public ::testing::Test
+{
+protected:
+    GpsL2MPcpsAcquisitionTest()
+    {
+        //queue = gr::msg_queue::make(0);
+        factory = std::make_shared<GNSSBlockFactory>();
+        config = std::make_shared<InMemoryConfiguration>();
+        item_size = sizeof(gr_complex);
+        stop = false;
+        message = 0;
+        sampling_freqeuncy_hz = 0;
+        nsamples=0;
+    }
+
+    ~GpsL2MPcpsAcquisitionTest()
+    {}
+
+    void init();
+    void start_queue();
+    void wait_message();
+    void stop_queue();
+
+    gr::msg_queue::sptr queue;
+    gr::top_block_sptr top_block;
+    std::shared_ptr<GNSSBlockFactory> factory;
+    std::shared_ptr<InMemoryConfiguration> config;
+    Gnss_Synchro gnss_synchro;
+    size_t item_size;
+    concurrent_queue<int> channel_internal_queue;
+    bool stop;
+    int message;
+    boost::thread ch_thread;
+
+    int sampling_freqeuncy_hz;
+    int nsamples;
+};
+
+
+void GpsL2MPcpsAcquisitionTest::init()
+{
+    gnss_synchro.Channel_ID = 0;
+    gnss_synchro.System = 'G';
+    std::string signal = "2S";
+    strcpy(gnss_synchro.Signal,signal.c_str());
+    gnss_synchro.PRN = 15;
+
+    sampling_freqeuncy_hz  = 4000000;
+    nsamples=round((double)sampling_freqeuncy_hz*GPS_L2_M_PERIOD)*2;
+    config->set_property("GNSS-SDR.internal_fs_hz", std::to_string(sampling_freqeuncy_hz));
+    config->set_property("Acquisition.item_type", "gr_complex");
+    config->set_property("Acquisition.if", "0");
+    config->set_property("Acquisition.dump", "true");
+    config->set_property("Acquisition.implementation", "GPS_L2_M_PCPS_Acquisition");
+    config->set_property("Acquisition.threshold", "0.001");
+    config->set_property("Acquisition.doppler_max", "5000");
+    config->set_property("Acquisition.doppler_step", "10");
+    config->set_property("Acquisition.repeat_satellite", "false");
+    config->set_property("Acquisition.pfa", "0.0");
+}
+
+
+void GpsL2MPcpsAcquisitionTest::start_queue()
+{
+    ch_thread = boost::thread(&GpsL2MPcpsAcquisitionTest::wait_message, this);
+}
+
+
+void GpsL2MPcpsAcquisitionTest::wait_message()
+{
+    while (!stop)
+        {
+            channel_internal_queue.wait_and_pop(message);
+            stop_queue();
+        }
+}
+
+
+
+void GpsL2MPcpsAcquisitionTest::stop_queue()
+{
+    stop = true;
+}
+
+
+
+TEST_F(GpsL2MPcpsAcquisitionTest, Instantiate)
+{
+    init();
+    queue = gr::msg_queue::make(0);
+    std::shared_ptr<GpsL2MPcpsAcquisition> acquisition = std::make_shared<GpsL2MPcpsAcquisition>(config.get(), "Acquisition", 1, 1, queue);
+}
+
+TEST_F(GpsL2MPcpsAcquisitionTest, ConnectAndRun)
+{
+    struct timeval tv;
+    long long int begin = 0;
+    long long int end = 0;
+    top_block = gr::make_top_block("Acquisition test");
+    queue = gr::msg_queue::make(0);
+
+    init();
+    std::shared_ptr<GpsL2MPcpsAcquisition> acquisition = std::make_shared<GpsL2MPcpsAcquisition>(config.get(), "Acquisition", 1, 1, queue);
+
+    ASSERT_NO_THROW( {
+        acquisition->connect(top_block);
+        boost::shared_ptr<gr::analog::sig_source_c> source = gr::analog::sig_source_c::make(sampling_freqeuncy_hz, gr::analog::GR_SIN_WAVE, 1000, 1, gr_complex(0));
+        boost::shared_ptr<gr::block> valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue);
+        top_block->connect(source, 0, valve, 0);
+        top_block->connect(valve, 0, acquisition->get_left_block(), 0);
+    }) << "Failure connecting the blocks of acquisition test." << std::endl;
+
+    EXPECT_NO_THROW( {
+        gettimeofday(&tv, NULL);
+        begin = tv.tv_sec * 1000000 + tv.tv_usec;
+        top_block->run(); // Start threads and wait
+        gettimeofday(&tv, NULL);
+        end = tv.tv_sec * 1000000 + tv.tv_usec;
+    }) << "Failure running the top_block." << std::endl;
+
+    std::cout <<  "Processed " << nsamples << " samples in " << (end - begin) << " microseconds" << std::endl;
+}
+
+TEST_F(GpsL2MPcpsAcquisitionTest, ValidationOfResults)
+{
+    struct timeval tv;
+    long long int begin = 0;
+    long long int end = 0;
+    top_block = gr::make_top_block("Acquisition test");
+    queue = gr::msg_queue::make(0);
+
+
+    double expected_delay_samples = 2004;
+    double expected_doppler_hz = 3000;
+    init();
+    start_queue();
+    std::shared_ptr<GpsL2MPcpsAcquisition> acquisition = std::make_shared<GpsL2MPcpsAcquisition>(config.get(), "Acquisition", 1, 1, queue);
+
+
+    ASSERT_NO_THROW( {
+        acquisition->set_channel(1);
+    }) << "Failure setting channel." << std::endl;
+
+    ASSERT_NO_THROW( {
+        acquisition->set_gnss_synchro(&gnss_synchro);
+    }) << "Failure setting gnss_synchro." << std::endl;
+
+    ASSERT_NO_THROW( {
+        acquisition->set_channel_queue(&channel_internal_queue);
+    }) << "Failure setting channel_internal_queue." << std::endl;
+
+    ASSERT_NO_THROW( {
+        acquisition->set_threshold(0.001);
+    }) << "Failure setting threshold." << std::endl;
+
+    ASSERT_NO_THROW( {
+        acquisition->set_doppler_max(5000);
+    }) << "Failure setting doppler_max." << std::endl;
+
+    ASSERT_NO_THROW( {
+        acquisition->set_doppler_step(10);
+    }) << "Failure setting doppler_step." << std::endl;
+
+    ASSERT_NO_THROW( {
+        acquisition->connect(top_block);
+    }) << "Failure connecting acquisition to the top_block." << std::endl;
+
+    ASSERT_NO_THROW( {
+        std::string path = std::string(TEST_PATH);
+        //std::string file = path + "signal_samples/GSoC_CTTC_capture_2012_07_26_4Msps_4ms.dat";
+        //std::string file = "/home/gnss/git/gnss-sdr/src/tests/data/gps_l2c_m_prn7_5msps.dat";
+        std::string file = "/datalogger/signals/Fraunhofer/L125_III1b_210s_L2_resampled.bin";
+        const char * file_name = file.c_str();
+        gr::blocks::file_source::sptr file_source = gr::blocks::file_source::make(sizeof(gr_complex), file_name, false);
+        //gr::blocks::interleaved_short_to_complex::sptr gr_interleaved_short_to_complex_ = gr::blocks::interleaved_short_to_complex::make();
+        //gr::blocks::char_to_short::sptr gr_char_to_short_ = gr::blocks::char_to_short::make();
+        boost::shared_ptr<gr::block> valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue);
+
+        //top_block->connect(file_source, 0, gr_char_to_short_, 0);
+    	//top_block->connect(gr_char_to_short_, 0, gr_interleaved_short_to_complex_ , 0);
+    	top_block->connect(file_source, 0, valve , 0);
+        top_block->connect(valve, 0, acquisition->get_left_block(), 0);
+
+    }) << "Failure connecting the blocks of acquisition test." << std::endl;
+
+
+    ASSERT_NO_THROW( {
+    	acquisition->set_state(1); // Ensure that acquisition starts at the first sample
+    	acquisition->init();
+    }) << "Failure set_state and init acquisition test" << std::endl;
+
+    EXPECT_NO_THROW( {
+        gettimeofday(&tv, NULL);
+        begin = tv.tv_sec * 1000000 + tv.tv_usec;
+        top_block->run(); // Start threads and wait
+        gettimeofday(&tv, NULL);
+        end = tv.tv_sec * 1000000 + tv.tv_usec;
+    }) << "Failure running the top_block." << std::endl;
+
+    stop_queue();
+
+    unsigned long int Acq_samplestamp_samples = gnss_synchro.Acq_samplestamp_samples;
+    std::cout <<  "Acquisition process runtime duration: " << (end - begin) << " microseconds" << std::endl;
+
+    std::cout <<  "gnss_synchro.Acq_doppler_hz = " << gnss_synchro.Acq_doppler_hz << " Hz" << std::endl;
+    std::cout <<  "gnss_synchro.Acq_delay_samples = " << gnss_synchro.Acq_delay_samples << " Samples" << std::endl;
+
+
+    ASSERT_EQ(1, message) << "Acquisition failure. Expected message: 1=ACQ SUCCESS.";
+
+    double delay_error_samples = std::abs(expected_delay_samples - gnss_synchro.Acq_delay_samples);
+    float delay_error_chips = (float)(delay_error_samples * 1023 / 4000);
+    double doppler_error_hz = std::abs(expected_doppler_hz - gnss_synchro.Acq_doppler_hz);
+
+    EXPECT_LE(doppler_error_hz, 200) << "Doppler error exceeds the expected value: 666 Hz = 2/(3*integration period)";
+    EXPECT_LT(delay_error_chips, 0.5) << "Delay error exceeds the expected value: 0.5 chips";
+
+    ch_thread.join();
+}

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-hamradio/gnss-sdr.git



More information about the pkg-hamradio-commits mailing list