[hamradio-commits] [gnss-sdr] 136/303: Add work on the hybrid receiver

Carles Fernandez carles_fernandez-guest at moszumanska.debian.org
Mon Feb 13 22:35:55 UTC 2017


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 ea8e605fb5389c53464c25f1df644aaff9e7b173
Author: Carles Fernandez <carles.fernandez at gmail.com>
Date:   Thu Nov 3 00:07:05 2016 +0100

    Add work on the hybrid receiver
---
 src/algorithms/PVT/adapters/hybrid_pvt.cc          |  60 +++-
 .../PVT/gnuradio_blocks/hybrid_pvt_cc.cc           | 337 +++++++++++++++++----
 src/algorithms/PVT/gnuradio_blocks/hybrid_pvt_cc.h |  15 +-
 src/algorithms/PVT/libs/hybrid_ls_pvt.h            |   3 +
 .../observables/adapters/hybrid_observables.cc     |  18 +-
 .../gnuradio_blocks/hybrid_observables_cc.cc       |  92 +++---
 6 files changed, 399 insertions(+), 126 deletions(-)

diff --git a/src/algorithms/PVT/adapters/hybrid_pvt.cc b/src/algorithms/PVT/adapters/hybrid_pvt.cc
index dcd202b..98b7a38 100644
--- a/src/algorithms/PVT/adapters/hybrid_pvt.cc
+++ b/src/algorithms/PVT/adapters/hybrid_pvt.cc
@@ -110,8 +110,66 @@ HybridPvt::HybridPvt(ConfigurationInterface* configuration,
     //std::string ref_time_xml_filename = configuration_->property("GNSS-SDR.SUPL_gps_ref_time_xml", ref_time_default_xml_filename);
     //std::string ref_location_xml_filename = configuration_->property("GNSS-SDR.SUPL_gps_ref_location_xml", ref_location_default_xml_filename);
 
+    // Infer the type of receiver
+    /*
+     *   TYPE  |  RECEIVER
+     *     0   |  Unknown
+     *     1   |  GPS L1 C/A
+     *     2   |  GPS L2C
+     *     3   |  GPS L5
+     *     4   |  Galileo E1B
+     *     5   |  Galileo E5a
+     *     6   |  Galileo E5b
+     *     7   |  GPS L1 C/A + GPS L2C
+     *     8   |  GPS L1 C/A + GPS L5
+     *     9   |  GPS L1 C/A + Galileo E1B
+     *    10   |  GPS L1 C/A + Galileo E5a
+     *    11   |  GPS L1 C/A + Galileo E5b
+     *    12   |  Galileo E1B + GPS L2C
+     *    13   |  Galileo E1B + GPS L5
+     *    14   |  Galileo E1B + Galileo E5a
+     *    15   |  Galileo E1B + Galileo E5b
+     *    16   |  GPS L2C + GPS L5
+     *    17   |  GPS L2C + Galileo E5a
+     *    18   |  GPS L2C + Galileo E5b
+     *    19   |  GPS L5 + Galileo E5a
+     *    20   |  GPS L5 + Galileo E5b
+     *    21   |  GPS L1 C/A + Galileo E1B + GPS L2C
+     *    22   |  GPS L1 C/A + Galileo E1B + GPS L5
+     */
+    int gps_1C_count = configuration->property("Channels_1C.count", 0);
+    int gps_2S_count = configuration->property("Channels_2S.count", 0);
+    int gal_1B_count = configuration->property("Channels_1B.count", 0);
+    int gal_E5a_count = configuration->property("Channels_5X.count", 0); // GPS L5 or Galileo E5a ?
+    int gal_E5b_count = configuration->property("Channels_7X.count", 0);
+
+    unsigned int type_of_receiver = 0;
+    if( (gps_1C_count != 0) && (gps_2S_count == 0)  && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0)) type_of_receiver = 1;
+    if( (gps_1C_count == 0) && (gps_2S_count != 0)  && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0)) type_of_receiver = 2;
+
+    if( (gps_1C_count == 0) && (gps_2S_count == 0)  && (gal_1B_count != 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0)) type_of_receiver = 4;
+    if( (gps_1C_count == 0) && (gps_2S_count == 0)  && (gal_1B_count == 0) && (gal_E5a_count != 0) && (gal_E5b_count == 0)) type_of_receiver = 5;
+    if( (gps_1C_count == 0) && (gps_2S_count == 0)  && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count != 0)) type_of_receiver = 6;
+
+    if( (gps_1C_count != 0) && (gps_2S_count != 0)  && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0)) type_of_receiver = 7;
+    //if( (gps_1C_count != 0) && (gps_2S_count == 0)  && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0)) type_of_receiver = 8;
+    if( (gps_1C_count != 0) && (gps_2S_count == 0)  && (gal_1B_count != 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0)) type_of_receiver = 9;
+    if( (gps_1C_count != 0) && (gps_2S_count == 0)  && (gal_1B_count == 0) && (gal_E5a_count != 0) && (gal_E5b_count == 0)) type_of_receiver = 10;
+    if( (gps_1C_count != 0) && (gps_2S_count == 0)  && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count != 0)) type_of_receiver = 11;
+    if( (gps_1C_count == 0) && (gps_2S_count != 0)  && (gal_1B_count != 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0)) type_of_receiver = 12;
+    //if( (gps_1C_count == 0) && (gps_2S_count == 0)  && (gal_1B_count != 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0)) type_of_receiver = 13;
+    if( (gps_1C_count == 0) && (gps_2S_count == 0)  && (gal_1B_count != 0) && (gal_E5a_count != 0) && (gal_E5b_count == 0)) type_of_receiver = 14;
+    if( (gps_1C_count == 0) && (gps_2S_count == 0)  && (gal_1B_count != 0) && (gal_E5a_count == 0) && (gal_E5b_count != 0)) type_of_receiver = 15;
+    //if( (gps_1C_count == 0) && (gps_2S_count == 0)  && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0)) type_of_receiver = 16;
+    if( (gps_1C_count == 0) && (gps_2S_count != 0)  && (gal_1B_count == 0) && (gal_E5a_count != 0) && (gal_E5b_count == 0)) type_of_receiver = 17;
+    if( (gps_1C_count == 0) && (gps_2S_count != 0)  && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count != 0)) type_of_receiver = 18;
+    //if( (gps_1C_count == 0) && (gps_2S_count == 0)  && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0)) type_of_receiver = 19;
+    //if( (gps_1C_count == 0) && (gps_2S_count == 0)  && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0)) type_of_receiver = 20;
+    if( (gps_1C_count != 0) && (gps_2S_count != 0)  && (gal_1B_count != 0) && (gal_E5a_count == 0) && (gal_E5b_count == 0)) type_of_receiver = 21;
+    //if( (gps_1C_count == 0) && (gps_2S_count == 0)  && (gal_1B_count == 0) && (gal_E5a_count == 0) && (gal_E5b_count = 0)) type_of_receiver = 22;
+
     // make PVT object
-    pvt_ = hybrid_make_pvt_cc(in_streams_, dump_, dump_filename_, averaging_depth, flag_averaging, output_rate_ms, display_rate_ms, flag_nmea_tty_port, nmea_dump_filename, nmea_dump_devname, flag_rtcm_server, flag_rtcm_tty_port, rtcm_tcp_port, rtcm_station_id, rtcm_msg_rate_ms, rtcm_dump_devname);
+    pvt_ = hybrid_make_pvt_cc(in_streams_, dump_, dump_filename_, averaging_depth, flag_averaging, output_rate_ms, display_rate_ms, flag_nmea_tty_port, nmea_dump_filename, nmea_dump_devname, flag_rtcm_server, flag_rtcm_tty_port, rtcm_tcp_port, rtcm_station_id, rtcm_msg_rate_ms, rtcm_dump_devname, type_of_receiver);
     DLOG(INFO) << "pvt(" << pvt_->unique_id() << ")";
 }
 
diff --git a/src/algorithms/PVT/gnuradio_blocks/hybrid_pvt_cc.cc b/src/algorithms/PVT/gnuradio_blocks/hybrid_pvt_cc.cc
index 6e87576..c0b7281 100644
--- a/src/algorithms/PVT/gnuradio_blocks/hybrid_pvt_cc.cc
+++ b/src/algorithms/PVT/gnuradio_blocks/hybrid_pvt_cc.cc
@@ -57,7 +57,8 @@ hybrid_make_pvt_cc(unsigned int nchannels,
         unsigned short rtcm_tcp_port,
         unsigned short rtcm_station_id,
         std::map<int,int> rtcm_msg_rate_ms,
-        std::string rtcm_dump_devname)
+        std::string rtcm_dump_devname,
+        const unsigned int type_of_receiver)
 {
     return hybrid_pvt_cc_sptr(new hybrid_pvt_cc(nchannels,
             dump,
@@ -74,7 +75,8 @@ hybrid_make_pvt_cc(unsigned int nchannels,
             rtcm_tcp_port,
             rtcm_station_id,
             rtcm_msg_rate_ms,
-            rtcm_dump_devname));
+            rtcm_dump_devname,
+            type_of_receiver));
 }
 
 
@@ -148,6 +150,32 @@ void hybrid_pvt_cc::msg_handler_telemetry(pmt::pmt_t msg)
                     d_ls_pvt->galileo_almanac = *galileo_almanac;
                     DLOG(INFO) << "New Galileo Almanac has arrived ";
                 }
+
+            else if (pmt::any_ref(msg).type() == typeid(std::shared_ptr<Gps_CNAV_Ephemeris>) )
+                {
+                    // ### GPS CNAV message ###
+                    std::shared_ptr<Gps_CNAV_Ephemeris> gps_cnav_ephemeris;
+                    gps_cnav_ephemeris = boost::any_cast<std::shared_ptr<Gps_CNAV_Ephemeris>>(pmt::any_ref(msg));
+                    // update/insert new ephemeris record to the global ephemeris map
+                    d_ls_pvt->gps_cnav_ephemeris_map[gps_cnav_ephemeris->i_satellite_PRN] = *gps_cnav_ephemeris;
+                    DLOG(INFO) << "New GPS CNAV ephemeris record has arrived ";
+                }
+            else if (pmt::any_ref(msg).type() == typeid(std::shared_ptr<Gps_CNAV_Iono>) )
+                {
+                    // ### GPS CNAV IONO ###
+                    std::shared_ptr<Gps_CNAV_Iono> gps_cnav_iono;
+                    gps_cnav_iono = boost::any_cast<std::shared_ptr<Gps_CNAV_Iono>>(pmt::any_ref(msg));
+                    d_ls_pvt->gps_cnav_iono = *gps_cnav_iono;
+                    DLOG(INFO) << "New CNAV IONO record has arrived ";
+                }
+            else if (pmt::any_ref(msg).type() == typeid(std::shared_ptr<Gps_CNAV_Utc_Model>) )
+                {
+                    // ### GPS CNAV UTC MODEL ###
+                    std::shared_ptr<Gps_CNAV_Utc_Model> gps_cnav_utc_model;
+                    gps_cnav_utc_model = boost::any_cast<std::shared_ptr<Gps_CNAV_Utc_Model>>(pmt::any_ref(msg));
+                    d_ls_pvt->gps_cnav_utc_model = *gps_cnav_utc_model;
+                    DLOG(INFO) << "New CNAV UTC record has arrived ";
+                }
             else
                 {
                     LOG(WARNING) << "msg_handler_telemetry unknown object type!";
@@ -171,7 +199,7 @@ hybrid_pvt_cc::hybrid_pvt_cc(unsigned int nchannels, bool dump, std::string dump
         int averaging_depth, bool flag_averaging, int output_rate_ms, int display_rate_ms, bool flag_nmea_tty_port,
         std::string nmea_dump_filename, std::string nmea_dump_devname,
         bool flag_rtcm_server, bool flag_rtcm_tty_port, unsigned short rtcm_tcp_port,
-        unsigned short rtcm_station_id, std::map<int,int> rtcm_msg_rate_ms, std::string rtcm_dump_devname) :
+        unsigned short rtcm_station_id, std::map<int,int> rtcm_msg_rate_ms, std::string rtcm_dump_devname, const unsigned int type_of_receiver) :
                 gr::block("hybrid_pvt_cc", gr::io_signature::make(nchannels, nchannels,  sizeof(Gnss_Synchro)),
                 gr::io_signature::make(0, 0, sizeof(gr_complex)))
 
@@ -182,6 +210,7 @@ hybrid_pvt_cc::hybrid_pvt_cc(unsigned int nchannels, bool dump, std::string dump
     d_nchannels = nchannels;
     d_dump_filename = dump_filename;
     std::string dump_ls_pvt_filename = dump_filename;
+    type_of_rx = type_of_receiver;
 
     // GPS Ephemeris data message port in
     this->message_port_register_in(pmt::mp("telemetry"));
@@ -296,7 +325,7 @@ hybrid_pvt_cc::~hybrid_pvt_cc()
 
 
 
-bool hybrid_pvt_cc::pseudoranges_pairCompare_min(const std::pair<int,Gnss_Synchro>& a, const std::pair<int,Gnss_Synchro>& b)
+bool hybrid_pvt_cc::observables_pairCompare_min(const std::pair<int,Gnss_Synchro>& a, const std::pair<int,Gnss_Synchro>& b)
 {
     return (a.second.Pseudorange_m) < (b.second.Pseudorange_m);
 }
@@ -340,7 +369,7 @@ int hybrid_pvt_cc::general_work (int noutput_items __attribute__((unused)), gr_v
     unsigned int gps_channel = 0;
     unsigned int gal_channel = 0;
 
-    gnss_pseudoranges_map.clear();
+    gnss_observables_map.clear();
 
     Gnss_Synchro **in = (Gnss_Synchro **)  &input_items[0]; //Get the input pointer
 
@@ -351,7 +380,7 @@ int hybrid_pvt_cc::general_work (int noutput_items __attribute__((unused)), gr_v
         {
             if (in[i][0].Flag_valid_pseudorange == true)
                 {
-                    gnss_pseudoranges_map.insert(std::pair<int,Gnss_Synchro>(i, in[i][0])); // store valid pseudoranges in a map.
+                    gnss_observables_map.insert(std::pair<int,Gnss_Synchro>(i, in[i][0])); // store valid observables in a map.
                     //d_rx_time = in[i][0].d_TOW_at_current_symbol; // all the channels have the same RX timestamp (common RX time pseudoranges)
                     d_TOW_at_curr_symbol_constellation = in[i][0].d_TOW_at_current_symbol; // d_TOW_at_current_symbol not corrected by delta t (just for debug)
                     d_rx_time = in[i][0].d_TOW_hybrid_at_current_symbol; // hybrid rx time, all the channels have the same RX timestamp (common RX time pseudoranges)
@@ -371,20 +400,57 @@ int hybrid_pvt_cc::general_work (int noutput_items __attribute__((unused)), gr_v
                                     d_rtcm_printer->lock_time(d_ls_pvt->galileo_ephemeris_map.find(in[i][0].PRN)->second, d_rx_time, in[i][0]); // keep track of locking time
                                 }
                         }
+                    if(d_ls_pvt->gps_cnav_ephemeris_map.size() > 0)
+                        {
+                            std::map<int,Gps_CNAV_Ephemeris>::iterator tmp_eph_iter = d_ls_pvt->gps_cnav_ephemeris_map.find(in[i][0].PRN);
+                            if(tmp_eph_iter != d_ls_pvt->gps_cnav_ephemeris_map.end())
+                                {
+                                    d_rtcm_printer->lock_time(d_ls_pvt->gps_cnav_ephemeris_map.find(in[i][0].PRN)->second, d_rx_time, in[i][0]); // keep track of locking time
+                                }
+                        }
                 }
         }
 
+    std::map<int, Galileo_Ephemeris>::iterator galileo_ephemeris_iter;
+    std::map<int, Gps_Ephemeris>::iterator gps_ephemeris_iter;
+    std::map<int, Gps_CNAV_Ephemeris>::iterator gps_cnav_ephemeris_iter;
+    std::map<int, Gnss_Synchro>::iterator gnss_observables_iter;
+
+    /*
+     *   TYPE  |  RECEIVER
+     *     0   |  Unknown
+     *     1   |  GPS L1 C/A
+     *     2   |  GPS L2C
+     *     3   |  GPS L5
+     *     4   |  Galileo E1B
+     *     5   |  Galileo E5a
+     *     6   |  Galileo E5b
+     *     7   |  GPS L1 C/A + GPS L2C
+     *     8   |  GPS L1 C/A + GPS L5
+     *     9   |  GPS L1 C/A + Galileo E1B
+     *    10   |  GPS L1 C/A + Galileo E5a
+     *    11   |  GPS L1 C/A + Galileo E5b
+     *    12   |  Galileo E1B + GPS L2C
+     *    13   |  Galileo E1B + GPS L5
+     *    14   |  Galileo E1B + Galileo E5a
+     *    15   |  Galileo E1B + Galileo E5b
+     *    16   |  GPS L2C + GPS L5
+     *    17   |  GPS L2C + Galileo E5a
+     *    18   |  GPS L2C + Galileo E5b
+     *    19   |  GPS L5 + Galileo E5a
+     *    20   |  GPS L5 + Galileo E5b
+     *    21   |  GPS L1 C/A + Galileo E1B + GPS L2C
+     *    22   |  GPS L1 C/A + Galileo E1B + GPS L5
+     */
+
     // ############ 2 COMPUTE THE PVT ################################
-    // ToDo: relax this condition because the receiver should work even with NO GALILEO SATELLITES
-    //if (gnss_pseudoranges_map.size() > 0 and d_ls_pvt->galileo_ephemeris_map.size() > 0 and d_ls_pvt->gps_ephemeris_map.size() > 0)
-    if (gnss_pseudoranges_map.size() > 0)
+    if (gnss_observables_map.size() > 0)
         {
-            //std::cout << "Both GPS and Galileo ephemeris map have been filled " << std::endl;
             // compute on the fly PVT solution
             if ((d_sample_counter % d_output_rate_ms) == 0)
                 {
                     bool pvt_result;
-                    pvt_result = d_ls_pvt->get_PVT(gnss_pseudoranges_map, d_rx_time, d_flag_averaging);
+                    pvt_result = d_ls_pvt->get_PVT(gnss_observables_map, d_rx_time, d_flag_averaging);
 
                     if (pvt_result == true)
                         {
@@ -394,19 +460,117 @@ int hybrid_pvt_cc::general_work (int noutput_items __attribute__((unused)), gr_v
 
                             if (!b_rinex_header_writen) //  & we have utc data in nav message!
                                 {
-                                    std::map<int, Galileo_Ephemeris>::iterator galileo_ephemeris_iter;
                                     galileo_ephemeris_iter = d_ls_pvt->galileo_ephemeris_map.begin();
-                                    std::map<int, Gps_Ephemeris>::iterator gps_ephemeris_iter;
                                     gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.begin();
-                                    if ((galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end()) && (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end()) )
+                                    gps_cnav_ephemeris_iter = d_ls_pvt->gps_cnav_ephemeris_map.begin();
+
+                                    if(type_of_rx == 1) // GPS L1 C/A only
+                                        {
+                                            if (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end())
+                                                {
+                                                    rp->rinex_obs_header(rp->obsFile, gps_ephemeris_iter->second, d_rx_time);
+                                                    rp->rinex_nav_header(rp->navFile, d_ls_pvt->gps_iono, d_ls_pvt->gps_utc_model);
+                                                    b_rinex_header_writen = true; // do not write header anymore
+                                                }
+                                        }
+                                    if(type_of_rx == 2) // GPS L2C only
+                                        {
+                                            if (gps_cnav_ephemeris_iter != d_ls_pvt->gps_cnav_ephemeris_map.end())
+                                                {
+                                                    rp->rinex_obs_header(rp->obsFile, gps_cnav_ephemeris_iter->second, d_rx_time);
+                                                    rp->rinex_nav_header(rp->navFile, d_ls_pvt->gps_cnav_iono, d_ls_pvt->gps_cnav_utc_model);
+                                                    b_rinex_header_writen = true; // do not write header anymore
+                                                }
+                                        }
+                                    if(type_of_rx == 4) // Galileo E1B only
+                                        {
+                                            if (galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end())
+                                                {
+                                                    rp->rinex_obs_header(rp->obsFile, galileo_ephemeris_iter->second, d_rx_time);
+                                                    rp->rinex_nav_header(rp->navGalFile, d_ls_pvt->galileo_iono, d_ls_pvt->galileo_utc_model, d_ls_pvt->galileo_almanac);
+                                                    b_rinex_header_writen = true; // do not write header anymore
+                                                }
+                                        }
+                                    if(type_of_rx == 5) // Galileo E5a only
+                                        {
+                                            std::string signal("5X");
+                                            if (galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end())
+                                                {
+                                                    rp->rinex_obs_header(rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, signal);
+                                                    rp->rinex_nav_header(rp->navGalFile, d_ls_pvt->galileo_iono, d_ls_pvt->galileo_utc_model, d_ls_pvt->galileo_almanac);
+                                                    b_rinex_header_writen = true; // do not write header anymore
+                                                }
+                                        }
+                                    if(type_of_rx == 6) // Galileo E5b only
                                         {
-                                            if (arrived_galileo_almanac)
+                                            std::string signal("7X");
+                                            if (galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end())
                                                 {
-                                                    rp->rinex_obs_header(rp->obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, d_rx_time);
+                                                    rp->rinex_obs_header(rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, signal);
+                                                    rp->rinex_nav_header(rp->navGalFile, d_ls_pvt->galileo_iono, d_ls_pvt->galileo_utc_model, d_ls_pvt->galileo_almanac);
+                                                    b_rinex_header_writen = true; // do not write header anymore
+                                                }
+                                        }
+                                    if(type_of_rx == 7) // GPS L1 C/A + GPS L2C
+                                        {
+                                            if ((gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end()) && (gps_cnav_ephemeris_iter != d_ls_pvt->gps_cnav_ephemeris_map.end()))
+                                                {
+                                                    rp->rinex_obs_header(rp->obsFile, gps_ephemeris_iter->second, gps_cnav_ephemeris_iter->second, d_rx_time);
+                                                    rp->rinex_nav_header(rp->navFile, d_ls_pvt->gps_iono, d_ls_pvt->gps_utc_model);
+                                                    b_rinex_header_writen = true; // do not write header anymore
+                                                }
+                                        }
+
+                                    if(type_of_rx == 9) // GPS L1 C/A + Galileo E1B
+                                        {
+                                            if ((galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end()) && (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end()) )
+                                                {
+                                                    std::string gal_signal("1B");
+                                                    rp->rinex_obs_header(rp->obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, d_rx_time, gal_signal);
                                                     rp->rinex_nav_header(rp->navMixFile,  d_ls_pvt->gps_iono,  d_ls_pvt->gps_utc_model, d_ls_pvt->galileo_iono, d_ls_pvt->galileo_utc_model, d_ls_pvt->galileo_almanac);
                                                     b_rinex_header_writen = true; // do not write header anymore
                                                 }
                                         }
+                                    if(type_of_rx == 10) //  GPS L1 C/A + Galileo E5a
+                                        {
+                                            if ((galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end()) && (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end()) )
+                                                {
+                                                    std::string gal_signal("5X");
+                                                    rp->rinex_obs_header(rp->obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, d_rx_time, gal_signal);
+                                                    rp->rinex_nav_header(rp->navMixFile,  d_ls_pvt->gps_iono,  d_ls_pvt->gps_utc_model, d_ls_pvt->galileo_iono, d_ls_pvt->galileo_utc_model, d_ls_pvt->galileo_almanac);
+                                                    b_rinex_header_writen = true; // do not write header anymore
+                                                }
+                                        }
+                                    if(type_of_rx == 11) //  GPS L1 C/A + Galileo E5b
+                                        {
+                                            if ((galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end()) && (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end()) )
+                                                {
+                                                    std::string gal_signal("7X");
+                                                    rp->rinex_obs_header(rp->obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, d_rx_time, gal_signal);
+                                                    rp->rinex_nav_header(rp->navMixFile,  d_ls_pvt->gps_iono,  d_ls_pvt->gps_utc_model, d_ls_pvt->galileo_iono, d_ls_pvt->galileo_utc_model, d_ls_pvt->galileo_almanac);
+                                                    b_rinex_header_writen = true; // do not write header anymore
+                                                }
+                                        }
+                                    if(type_of_rx == 14) //  Galileo E1B + Galileo E5a
+                                        {
+                                            if ((galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end()) )
+                                                {
+                                                    std::string gal_signal("1B 5X");
+                                                    rp->rinex_obs_header(rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, gal_signal);
+                                                    rp->rinex_nav_header(rp->navGalFile,  d_ls_pvt->galileo_iono, d_ls_pvt->galileo_utc_model, d_ls_pvt->galileo_almanac);
+                                                    b_rinex_header_writen = true; // do not write header anymore
+                                                }
+                                        }
+                                    if(type_of_rx == 15) //  Galileo E1B + Galileo E5b
+                                        {
+                                            if ((galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end()) )
+                                                {
+                                                    std::string gal_signal("1B 7X");
+                                                    rp->rinex_obs_header(rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, gal_signal);
+                                                    rp->rinex_nav_header(rp->navGalFile,  d_ls_pvt->galileo_iono, d_ls_pvt->galileo_utc_model, d_ls_pvt->galileo_almanac);
+                                                    b_rinex_header_writen = true; // do not write header anymore
+                                                }
+                                        }
                                 }
                             if(b_rinex_header_writen) // Put here another condition to separate annotations (e.g 30 s)
                                 {
@@ -414,58 +578,123 @@ int hybrid_pvt_cc::general_work (int noutput_items __attribute__((unused)), gr_v
                                     // Notice that d_sample_counter period is 4ms (for Galileo correlators)
                                     if ((d_sample_counter - d_last_sample_nav_output) >= 6000)
                                         {
-                                            rp->log_rinex_nav(rp->navMixFile, d_ls_pvt->gps_ephemeris_map, d_ls_pvt->galileo_ephemeris_map);
+                                            if(type_of_rx == 1) // GPS L1 C/A only
+                                                {
+                                                    rp->log_rinex_nav(rp->navFile, d_ls_pvt->gps_ephemeris_map);
+                                                }
+                                            if(type_of_rx == 2) // GPS L2C only
+                                                {
+                                                    rp->log_rinex_nav(rp->navFile, d_ls_pvt->gps_cnav_ephemeris_map);
+                                                }
+                                            if( (type_of_rx == 4) || (type_of_rx == 5)  || (type_of_rx == 6) ) // Galileo
+                                                {
+                                                    rp->log_rinex_nav(rp->navGalFile, d_ls_pvt->galileo_ephemeris_map);
+                                                }
+                                            if(type_of_rx == 7) // GPS L1 C/A + GPS L2C
+                                                {
+                                                    rp->log_rinex_nav(rp->navFile, d_ls_pvt->gps_cnav_ephemeris_map);
+                                                }
+                                            if((type_of_rx == 9) || (type_of_rx == 10) || (type_of_rx == 11)) // GPS L1 C/A + Galileo
+                                                {
+                                                    rp->log_rinex_nav(rp->navMixFile, d_ls_pvt->gps_ephemeris_map, d_ls_pvt->galileo_ephemeris_map);
+                                                }
+
+
+
+
+
                                             d_last_sample_nav_output = d_sample_counter;
                                         }
-                                    std::map<int, Galileo_Ephemeris>::iterator galileo_ephemeris_iter;
                                     galileo_ephemeris_iter = d_ls_pvt->galileo_ephemeris_map.begin();
-                                    std::map<int, Gps_Ephemeris>::iterator gps_ephemeris_iter;
                                     gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.begin();
-                                    if ((galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end()) && (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end())  )
+                                    gps_cnav_ephemeris_iter = d_ls_pvt->gps_cnav_ephemeris_map.begin();
+
+                                    if(type_of_rx == 1) // GPS L1 C/A only
+                                        {
+                                            if (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end())
+                                                {
+                                                    rp->log_rinex_obs(rp->obsFile, gps_ephemeris_iter->second, d_rx_time, gnss_observables_map);
+                                                }
+                                            if (!b_rinex_header_updated && (d_ls_pvt->gps_utc_model.d_A0 != 0))
+                                                {
+                                                    rp->update_obs_header(rp->obsFile, d_ls_pvt->gps_utc_model);
+                                                    rp->update_nav_header(rp->navFile, d_ls_pvt->gps_utc_model, d_ls_pvt->gps_iono);
+                                                    b_rinex_header_updated = true;
+                                                }
+                                        }
+                                    if(type_of_rx == 2) // GPS L2C only
+                                        {
+                                            if (gps_cnav_ephemeris_iter != d_ls_pvt->gps_cnav_ephemeris_map.end())
+                                                {
+                                                    rp->log_rinex_obs(rp->obsFile, gps_cnav_ephemeris_iter->second, d_rx_time, gnss_observables_map);
+                                                }
+                                            if (!b_rinex_header_updated && (d_ls_pvt->gps_cnav_utc_model.d_A0 != 0))
+                                                {
+                                                    rp->update_obs_header(rp->obsFile, d_ls_pvt->gps_cnav_utc_model);
+                                                    rp->update_nav_header(rp->navFile, d_ls_pvt->gps_cnav_utc_model, d_ls_pvt->gps_cnav_iono);
+                                                    b_rinex_header_updated = true;
+                                                }
+                                        }
+                                    if(type_of_rx == 4) // Galileo E1B only
                                         {
-                                            rp->log_rinex_obs(rp->obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, d_rx_time, gnss_pseudoranges_map);
+                                            if (galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end())
+                                                {
+                                                    rp->log_rinex_obs(rp->obsFile, galileo_ephemeris_iter->second, d_rx_time, gnss_observables_map);
+                                                }
+                                            if (!b_rinex_header_updated && (d_ls_pvt->galileo_utc_model.A0_6 != 0))
+                                                {
+                                                    rp->update_nav_header(rp->navGalFile, d_ls_pvt->galileo_iono, d_ls_pvt->galileo_utc_model, d_ls_pvt->galileo_almanac);
+                                                    rp->update_obs_header(rp->obsFile, d_ls_pvt->galileo_utc_model);
+                                                    b_rinex_header_updated = true;
+                                                }
                                         }
-                                    if (!b_rinex_header_updated && (d_ls_pvt->gps_utc_model.d_A0 != 0))
+
+                                    if(type_of_rx == 9) // GPS L1 C/A + Galileo E1B
                                         {
-                                            rp->update_obs_header(rp->obsFile, d_ls_pvt->gps_utc_model);
-                                            rp->update_nav_header(rp->navMixFile, d_ls_pvt->gps_iono,  d_ls_pvt->gps_utc_model, d_ls_pvt->galileo_iono, d_ls_pvt->galileo_utc_model, d_ls_pvt->galileo_almanac);
-                                            b_rinex_header_updated = true;
+                                            if ((galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end()) && (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end())  )
+                                                {
+                                                    rp->log_rinex_obs(rp->obsFile, gps_ephemeris_iter->second, galileo_ephemeris_iter->second, d_rx_time, gnss_observables_map);
+                                                }
+                                            if (!b_rinex_header_updated && (d_ls_pvt->gps_utc_model.d_A0 != 0))
+                                                {
+                                                    rp->update_obs_header(rp->obsFile, d_ls_pvt->gps_utc_model);
+                                                    rp->update_nav_header(rp->navMixFile, d_ls_pvt->gps_iono,  d_ls_pvt->gps_utc_model, d_ls_pvt->galileo_iono, d_ls_pvt->galileo_utc_model, d_ls_pvt->galileo_almanac);
+                                                    b_rinex_header_updated = true;
+                                                }
                                         }
+
                                 }
 
                             if(b_rtcm_writing_started)
                                 {
                                     if(((d_sample_counter % (d_rtcm_MT1019_rate_ms / 4)) == 0) && (d_rtcm_MT1019_rate_ms != 0))
                                         {
-                                            for(std::map<int,Gps_Ephemeris>::iterator gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.begin(); gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end(); gps_ephemeris_iter++ )
+                                            for(gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.begin(); gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end(); gps_ephemeris_iter++ )
                                                 {
                                                     d_rtcm_printer->Print_Rtcm_MT1019(gps_ephemeris_iter->second);
                                                 }
                                         }
                                     if(((d_sample_counter % (d_rtcm_MT1045_rate_ms / 4)) == 0) && (d_rtcm_MT1045_rate_ms != 0))
                                         {
-                                            for(std::map<int,Galileo_Ephemeris>::iterator gal_ephemeris_iter = d_ls_pvt->galileo_ephemeris_map.begin(); gal_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end(); gal_ephemeris_iter++ )
+                                            for(galileo_ephemeris_iter = d_ls_pvt->galileo_ephemeris_map.begin(); galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end(); galileo_ephemeris_iter++ )
                                                 {
-                                                    d_rtcm_printer->Print_Rtcm_MT1045(gal_ephemeris_iter->second);
+                                                    d_rtcm_printer->Print_Rtcm_MT1045(galileo_ephemeris_iter->second);
                                                 }
                                         }
                                     if(((d_sample_counter % (d_rtcm_MT1097_rate_ms / 4) ) == 0) || ((d_sample_counter % (d_rtcm_MT1077_rate_ms / 4) ) == 0))
                                         {
-                                            std::map<int,Gnss_Synchro>::iterator gnss_pseudoranges_iter;
-                                            std::map<int,Gps_Ephemeris>::iterator gps_ephemeris_iter;
-                                            gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.end();
-                                            std::map<int,Galileo_Ephemeris>::iterator gal_ephemeris_iter;
-                                            gal_ephemeris_iter = d_ls_pvt->galileo_ephemeris_map.end();
+                                            //gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.end();
+                                            //galileo_ephemeris_iter = d_ls_pvt->galileo_ephemeris_map.end();
                                             unsigned int i = 0;
-                                            for (gnss_pseudoranges_iter = gnss_pseudoranges_map.begin(); gnss_pseudoranges_iter != gnss_pseudoranges_map.end(); gnss_pseudoranges_iter++)
+                                            for (gnss_observables_iter = gnss_observables_map.begin(); gnss_observables_iter != gnss_observables_map.end(); gnss_observables_iter++)
                                                 {
-                                                    std::string system(&gnss_pseudoranges_iter->second.System, 1);
+                                                    std::string system(&gnss_observables_iter->second.System, 1);
                                                     if(gps_channel == 0)
                                                         {
                                                             if(system.compare("G") == 0)
                                                                 {
                                                                     // This is a channel with valid GPS signal
-                                                                    gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.find(gnss_pseudoranges_iter->second.PRN);
+                                                                    gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.find(gnss_observables_iter->second.PRN);
                                                                     if (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end())
                                                                         {
                                                                             gps_channel = i;
@@ -476,8 +705,8 @@ int hybrid_pvt_cc::general_work (int noutput_items __attribute__((unused)), gr_v
                                                         {
                                                             if(system.compare("E") == 0)
                                                                 {
-                                                                    gal_ephemeris_iter = d_ls_pvt->galileo_ephemeris_map.find(gnss_pseudoranges_iter->second.PRN);
-                                                                    if (gal_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end())
+                                                                    galileo_ephemeris_iter = d_ls_pvt->galileo_ephemeris_map.find(gnss_observables_iter->second.PRN);
+                                                                    if (galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end())
                                                                         {
                                                                             gal_channel = i;
                                                                         }
@@ -488,16 +717,16 @@ int hybrid_pvt_cc::general_work (int noutput_items __attribute__((unused)), gr_v
                                             if(((d_sample_counter % (d_rtcm_MT1097_rate_ms / 4) ) == 0) && (d_rtcm_MT1097_rate_ms != 0) )
                                                 {
 
-                                                    if (gal_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end())
+                                                    if (galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end())
                                                         {
-                                                            d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, gal_ephemeris_iter->second, d_rx_time, gnss_pseudoranges_map, 0, 0, 0, 0, 0);
+                                                            d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, galileo_ephemeris_iter->second, d_rx_time, gnss_observables_map, 0, 0, 0, 0, 0);
                                                         }
                                                 }
                                             if(((d_sample_counter % (d_rtcm_MT1077_rate_ms / 4) ) == 0) && (d_rtcm_MT1077_rate_ms != 0) )
                                                 {
                                                     if (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end())
                                                         {
-                                                            d_rtcm_printer->Print_Rtcm_MSM(7, gps_ephemeris_iter->second, {}, {}, d_rx_time, gnss_pseudoranges_map, 0, 0, 0, 0, 0);
+                                                            d_rtcm_printer->Print_Rtcm_MSM(7, gps_ephemeris_iter->second, {}, {}, d_rx_time, gnss_observables_map, 0, 0, 0, 0, 0);
                                                         }
                                                 }
                                         }
@@ -513,27 +742,23 @@ int hybrid_pvt_cc::general_work (int noutput_items __attribute__((unused)), gr_v
                                         }
                                     if(d_rtcm_MT1045_rate_ms != 0)
                                         {
-                                            for(std::map<int,Galileo_Ephemeris>::iterator gal_ephemeris_iter = d_ls_pvt->galileo_ephemeris_map.begin(); gal_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end(); gal_ephemeris_iter++ )
+                                            for(galileo_ephemeris_iter = d_ls_pvt->galileo_ephemeris_map.begin(); galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end(); galileo_ephemeris_iter++ )
                                                 {
-                                                    d_rtcm_printer->Print_Rtcm_MT1045(gal_ephemeris_iter->second);
+                                                    d_rtcm_printer->Print_Rtcm_MT1045(galileo_ephemeris_iter->second);
                                                 }
                                         }
 
-                                    std::map<int,Gnss_Synchro>::iterator gnss_pseudoranges_iter;
-                                    std::map<int,Gps_Ephemeris>::iterator gps_ephemeris_iter;
-                                    gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.end();
-                                    std::map<int,Galileo_Ephemeris>::iterator gal_ephemeris_iter;
-                                    gal_ephemeris_iter = d_ls_pvt->galileo_ephemeris_map.end();
+
                                     unsigned int i = 0;
-                                    for (gnss_pseudoranges_iter = gnss_pseudoranges_map.begin(); gnss_pseudoranges_iter != gnss_pseudoranges_map.end(); gnss_pseudoranges_iter++)
+                                    for (gnss_observables_iter = gnss_observables_map.begin(); gnss_observables_iter != gnss_observables_map.end(); gnss_observables_iter++)
                                         {
-                                            std::string system(&gnss_pseudoranges_iter->second.System, 1);
+                                            std::string system(&gnss_observables_iter->second.System, 1);
                                             if(gps_channel == 0)
                                                 {
                                                     if(system.compare("G") == 0)
                                                         {
                                                             // This is a channel with valid GPS signal
-                                                            gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.find(gnss_pseudoranges_iter->second.PRN);
+                                                            gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.find(gnss_observables_iter->second.PRN);
                                                             if (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end())
                                                                 {
                                                                     gps_channel = i;
@@ -544,8 +769,8 @@ int hybrid_pvt_cc::general_work (int noutput_items __attribute__((unused)), gr_v
                                                 {
                                                     if(system.compare("E") == 0)
                                                         {
-                                                            gal_ephemeris_iter = d_ls_pvt->galileo_ephemeris_map.find(gnss_pseudoranges_iter->second.PRN);
-                                                            if (gal_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end())
+                                                            galileo_ephemeris_iter = d_ls_pvt->galileo_ephemeris_map.find(gnss_observables_iter->second.PRN);
+                                                            if (galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end())
                                                                 {
                                                                     gal_channel = i;
                                                                 }
@@ -556,12 +781,12 @@ int hybrid_pvt_cc::general_work (int noutput_items __attribute__((unused)), gr_v
 
                                     if (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end() && (d_rtcm_MT1077_rate_ms != 0))
                                         {
-                                            d_rtcm_printer->Print_Rtcm_MSM(7, gps_ephemeris_iter->second, {}, {}, d_rx_time, gnss_pseudoranges_map, 0, 0, 0, 0, 0);
+                                            d_rtcm_printer->Print_Rtcm_MSM(7, gps_ephemeris_iter->second, {}, {}, d_rx_time, gnss_observables_map, 0, 0, 0, 0, 0);
                                         }
 
-                                    if (gal_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end() && (d_rtcm_MT1097_rate_ms != 0) )
+                                    if (galileo_ephemeris_iter != d_ls_pvt->galileo_ephemeris_map.end() && (d_rtcm_MT1097_rate_ms != 0) )
                                         {
-                                            d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, gal_ephemeris_iter->second, d_rx_time, gnss_pseudoranges_map, 0, 0, 0, 0, 0);
+                                            d_rtcm_printer->Print_Rtcm_MSM(7, {}, {}, galileo_ephemeris_iter->second, d_rx_time, gnss_observables_map, 0, 0, 0, 0, 0);
                                         }
                                     b_rtcm_writing_started = true;
                                 }
diff --git a/src/algorithms/PVT/gnuradio_blocks/hybrid_pvt_cc.h b/src/algorithms/PVT/gnuradio_blocks/hybrid_pvt_cc.h
index 21ccfef..1dba21f 100644
--- a/src/algorithms/PVT/gnuradio_blocks/hybrid_pvt_cc.h
+++ b/src/algorithms/PVT/gnuradio_blocks/hybrid_pvt_cc.h
@@ -65,7 +65,8 @@ hybrid_pvt_cc_sptr hybrid_make_pvt_cc(unsigned int n_channels,
                                               unsigned short rtcm_tcp_port,
                                               unsigned short rtcm_station_id,
                                               std::map<int,int> rtcm_msg_rate_ms,
-                                              std::string rtcm_dump_devname);
+                                              std::string rtcm_dump_devname,
+                                              const unsigned int type_of_receiver);
 
 /*!
  * \brief This class implements a block that computes the PVT solution with Galileo E1 signals
@@ -88,7 +89,8 @@ private:
                                                          unsigned short rtcm_tcp_port,
                                                          unsigned short rtcm_station_id,
                                                          std::map<int,int> rtcm_msg_rate_ms,
-                                                         std::string rtcm_dump_devname);
+                                                         std::string rtcm_dump_devname,
+                                                         const unsigned int type_of_receiver);
     hybrid_pvt_cc(unsigned int nchannels,
                       bool dump, std::string dump_filename,
                       int averaging_depth,
@@ -103,7 +105,8 @@ private:
                       unsigned short rtcm_tcp_port,
                       unsigned short rtcm_station_id,
                       std::map<int,int> rtcm_msg_rate_ms,
-                      std::string rtcm_dump_devname);
+                      std::string rtcm_dump_devname,
+                      const unsigned int type_of_receiver);
 
     void msg_handler_telemetry(pmt::pmt_t msg);
 
@@ -137,8 +140,10 @@ private:
     double d_rx_time;
     double d_TOW_at_curr_symbol_constellation;
     std::shared_ptr<hybrid_ls_pvt> d_ls_pvt;
-    std::map<int,Gnss_Synchro> gnss_pseudoranges_map;
-    bool pseudoranges_pairCompare_min(const std::pair<int,Gnss_Synchro>& a, const std::pair<int,Gnss_Synchro>& b);
+    std::map<int,Gnss_Synchro> gnss_observables_map;
+    bool observables_pairCompare_min(const std::pair<int,Gnss_Synchro>& a, const std::pair<int,Gnss_Synchro>& b);
+
+    unsigned int type_of_rx;
 
     bool first_fix;
     key_t sysv_msg_key;
diff --git a/src/algorithms/PVT/libs/hybrid_ls_pvt.h b/src/algorithms/PVT/libs/hybrid_ls_pvt.h
index c085d29..99f54e2 100644
--- a/src/algorithms/PVT/libs/hybrid_ls_pvt.h
+++ b/src/algorithms/PVT/libs/hybrid_ls_pvt.h
@@ -74,6 +74,9 @@ public:
     Gps_Utc_Model gps_utc_model;
     Gps_Iono gps_iono;
 
+    Gps_CNAV_Iono gps_cnav_iono;
+    Gps_CNAV_Utc_Model gps_cnav_utc_model;
+
     double d_galileo_current_time;
 
     int count_valid_position;
diff --git a/src/algorithms/observables/adapters/hybrid_observables.cc b/src/algorithms/observables/adapters/hybrid_observables.cc
index 7168531..e1d539d 100644
--- a/src/algorithms/observables/adapters/hybrid_observables.cc
+++ b/src/algorithms/observables/adapters/hybrid_observables.cc
@@ -42,9 +42,9 @@ HybridObservables::HybridObservables(ConfigurationInterface* configuration,
         std::string role,
         unsigned int in_streams,
         unsigned int out_streams) :
-                    role_(role),
-                    in_streams_(in_streams),
-                    out_streams_(out_streams)
+                            role_(role),
+                            in_streams_(in_streams),
+                            out_streams_(out_streams)
 {
     std::string default_dump_filename = "./observables.dat";
     DLOG(INFO) << "role " << role;
@@ -52,13 +52,13 @@ HybridObservables::HybridObservables(ConfigurationInterface* configuration,
     dump_filename_ = configuration->property(role + ".dump_filename", default_dump_filename);
     unsigned int default_depth = 0;
     if (GPS_L1_CA_HISTORY_DEEP == GALILEO_E1_HISTORY_DEEP)
-    {
-      default_depth = GPS_L1_CA_HISTORY_DEEP;
-    }
+        {
+            default_depth = GPS_L1_CA_HISTORY_DEEP;
+        }
     else
-    {
-      default_depth = 100;
-    }
+        {
+            default_depth = 100;
+        }
     unsigned int history_deep = configuration->property(role + ".averaging_depth", default_depth);
     observables_ = hybrid_make_observables_cc(in_streams_, dump_, dump_filename_, history_deep);
     DLOG(INFO) << "pseudorange(" << observables_->unique_id() << ")";
diff --git a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc
index ab22fd8..9a88419 100644
--- a/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc
+++ b/src/algorithms/observables/gnuradio_blocks/hybrid_observables_cc.cc
@@ -92,30 +92,17 @@ hybrid_observables_cc::hybrid_observables_cc(unsigned int nchannels, bool dump,
 }
 
 
-
 hybrid_observables_cc::~hybrid_observables_cc()
 {
     d_dump_file.close();
 }
 
 
-
-//bool Hybrid_pairCompare_gnss_synchro_Prn_delay_ms(const std::pair<int,Gnss_Synchro>& a, const std::pair<int,Gnss_Synchro>& b)
-//{
-//    return (a.second.Prn_timestamp_ms) < (b.second.Prn_timestamp_ms);
-//}
-
-
 bool Hybrid_pairCompare_gnss_synchro_d_TOW_hybrid_at_current_symbol(const std::pair<int,Gnss_Synchro>& a, const std::pair<int,Gnss_Synchro>& b)
 {
     return (a.second.d_TOW_hybrid_at_current_symbol) < (b.second.d_TOW_hybrid_at_current_symbol);
 }
 
-bool Hybrid_pairCompare_gnss_synchro_d_TOW_at_current_symbol(const std::pair<int,Gnss_Synchro>& a, const std::pair<int,Gnss_Synchro>& b)
-{
-    return (a.second.d_TOW_at_current_symbol) < (b.second.d_TOW_at_current_symbol);
-}
-
 
 int hybrid_observables_cc::general_work (int noutput_items,
     gr_vector_int &ninput_items,
@@ -127,7 +114,6 @@ int hybrid_observables_cc::general_work (int noutput_items,
 
     Gnss_Synchro current_gnss_synchro[d_nchannels];
     std::map<int,Gnss_Synchro> current_gnss_synchro_map;
-    //std::map<int,Gnss_Synchro> current_gnss_synchro_map_gps_only;
     std::map<int,Gnss_Synchro>::iterator gnss_synchro_iter;
 
     if (d_nchannels != ninput_items.size())
@@ -151,37 +137,33 @@ int hybrid_observables_cc::general_work (int noutput_items,
                 {
                     //record the word structure in a map for pseudorange computation
                     current_gnss_synchro_map.insert(std::pair<int, Gnss_Synchro>(current_gnss_synchro[i].Channel_ID, current_gnss_synchro[i]));
-    //                if (current_gnss_synchro[i].System == 'G')
-    //                    {
-    //                        current_gnss_synchro_map_gps_only.insert(std::pair<int, Gnss_Synchro>(current_gnss_synchro[i].Channel_ID, current_gnss_synchro[i]));
-    //                    }
                     //################### SAVE DOPPLER AND ACC CARRIER PHASE HISTORIC DATA FOR INTERPOLATION IN OBSERVABLE MODULE #######
                     d_carrier_doppler_queue_hz[i].push_back(current_gnss_synchro[i].Carrier_Doppler_hz);
                     d_acc_carrier_phase_queue_rads[i].push_back(current_gnss_synchro[i].Carrier_phase_rads);
                     // save TOW history
                     d_symbol_TOW_queue_s[i].push_back(current_gnss_synchro[i].d_TOW_at_current_symbol);
                     if (d_carrier_doppler_queue_hz[i].size() > history_deep)
-                                  {
-                                      d_carrier_doppler_queue_hz[i].pop_front();
-                                  }
+                        {
+                            d_carrier_doppler_queue_hz[i].pop_front();
+                        }
                     if (d_acc_carrier_phase_queue_rads[i].size() > history_deep)
-                                  {
-                                      d_acc_carrier_phase_queue_rads[i].pop_front();
-                                  }
+                        {
+                            d_acc_carrier_phase_queue_rads[i].pop_front();
+                        }
                     if (d_symbol_TOW_queue_s[i].size() > history_deep)
-                                  {
-                                      d_symbol_TOW_queue_s[i].pop_front();
-                                  }
+                        {
+                            d_symbol_TOW_queue_s[i].pop_front();
+                        }
                 }
-                else
+            else
                 {
-                  // Clear the observables history for this channel
-                        if (d_symbol_TOW_queue_s[i].size() > 0)
-                            {
-                                d_symbol_TOW_queue_s[i].clear();
-                                d_carrier_doppler_queue_hz[i].clear();
-                                d_acc_carrier_phase_queue_rads[i].clear();
-                            }
+                    // Clear the observables history for this channel
+                    if (d_symbol_TOW_queue_s[i].size() > 0)
+                        {
+                            d_symbol_TOW_queue_s[i].clear();
+                            d_carrier_doppler_queue_hz[i].clear();
+                            d_acc_carrier_phase_queue_rads[i].clear();
+                        }
                 }
         }
 
@@ -189,8 +171,19 @@ int hybrid_observables_cc::general_work (int noutput_items,
      * 2. Compute RAW pseudoranges using COMMON RECEPTION TIME algorithm. Use only the valid channels (channels that are tracking a satellite)
      */
     DLOG(INFO) << "gnss_synchro set size=" << current_gnss_synchro_map.size();
-
-    if(current_gnss_synchro_map.size() > 0)// and current_gnss_synchro_map_gps_only.size()>0)
+    double traveltime_ms;
+    double pseudorange_m;
+    double delta_rx_time_ms;
+    double delta_TOW_ms;
+    arma::vec symbol_TOW_vec_s;
+    arma::vec dopper_vec_hz;
+    arma::vec dopper_vec_interp_hz;
+    arma::vec acc_phase_vec_rads;
+    arma::vec acc_phase_vec_interp_rads;
+    arma::vec desired_symbol_TOW(1);
+    double start_offset_ms = 0.0;
+
+    if(current_gnss_synchro_map.size() > 0)
         {
             /*
              *  2.1 Use CURRENT set of measurements and find the nearest satellite
@@ -206,30 +199,19 @@ int hybrid_observables_cc::general_work (int noutput_items,
             //int reference_channel= gnss_synchro_iter->second.Channel_ID;
 
             // Now compute RX time differences due to the PRN alignment in the correlators
-            double traveltime_ms;
-            double pseudorange_m;
-            double delta_rx_time_ms;
-            double delta_TOW_ms;
-            arma::vec symbol_TOW_vec_s;
-            arma::vec dopper_vec_hz;
-            arma::vec dopper_vec_interp_hz;
-            arma::vec acc_phase_vec_rads;
-            arma::vec acc_phase_vec_interp_rads;
-            arma::vec desired_symbol_TOW(1);
-            double start_offset_ms = 0.0;
             for(gnss_synchro_iter = current_gnss_synchro_map.begin(); gnss_synchro_iter != current_gnss_synchro_map.end(); gnss_synchro_iter++)
                 {
                     // check and correct synchronization in cross-system pseudoranges!
                     delta_rx_time_ms = gnss_synchro_iter->second.Prn_timestamp_ms - d_ref_PRN_rx_time_ms;
                     delta_TOW_ms = (d_TOW_reference - gnss_synchro_iter->second.d_TOW_hybrid_at_current_symbol) * 1000.0;
                     if(gnss_synchro_iter->second.System == 'E')
-                    {
-                        start_offset_ms = GALILEO_STARTOFFSET_ms;
-                    }
+                        {
+                            start_offset_ms = GALILEO_STARTOFFSET_ms;
+                        }
                     if(gnss_synchro_iter->second.System == 'G')
-                    {
-                        start_offset_ms = GPS_STARTOFFSET_ms;
-                    }
+                        {
+                            start_offset_ms = GPS_STARTOFFSET_ms;
+                        }
                     //compute the pseudorange
                     traveltime_ms = delta_TOW_ms + delta_rx_time_ms + start_offset_ms;
                     pseudorange_m = traveltime_ms * GALILEO_C_m_ms; // [m]
@@ -244,7 +226,7 @@ int hybrid_observables_cc::general_work (int noutput_items,
                     //current_gnss_synchro[gnss_synchro_iter->second.Channel_ID] = gnss_synchro_iter->second;
                     current_gnss_synchro[gnss_synchro_iter->second.Channel_ID].Pseudorange_m = pseudorange_m;
                     current_gnss_synchro[gnss_synchro_iter->second.Channel_ID].Flag_valid_pseudorange = true;
-                    current_gnss_synchro[gnss_synchro_iter->second.Channel_ID].d_TOW_hybrid_at_current_symbol = round(d_TOW_reference * 1000) / 1000 + GPS_STARTOFFSET_ms / 1000.0;
+                    current_gnss_synchro[gnss_synchro_iter->second.Channel_ID].d_TOW_hybrid_at_current_symbol = round(d_TOW_reference * 1000) / 1000 + start_offset_ms / 1000.0;
                     if (d_symbol_TOW_queue_s[gnss_synchro_iter->second.Channel_ID].size() >= history_deep)
                         {
                             // compute interpolated observation values for Doppler and Accumulate carrier phase

-- 
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