[hamradio-commits] [gnss-sdr] 117/126: Integrating the RTCM message printer

Carles Fernandez carles_fernandez-guest at moszumanska.debian.org
Sat Dec 26 18:38:08 UTC 2015


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

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

commit f70df3e581e12b2959a726be5ec92f2559500ed5
Author: Carles Fernandez <carles.fernandez at gmail.com>
Date:   Thu Dec 24 20:56:41 2015 +0100

    Integrating the RTCM message printer
    
    Now the GPS L1 receiver generates 1002 and 1019 messages. Bugs in the
    Rtcm class fixed.
---
 src/algorithms/PVT/adapters/galileo_e1_pvt.cc      | 10 ++-
 src/algorithms/PVT/adapters/gps_l1_ca_pvt.cc       | 11 +++-
 src/algorithms/PVT/adapters/hybrid_pvt.cc          | 10 ++-
 .../PVT/gnuradio_blocks/galileo_e1_pvt_cc.cc       | 12 +++-
 .../PVT/gnuradio_blocks/galileo_e1_pvt_cc.h        | 17 ++++-
 .../PVT/gnuradio_blocks/gps_l1_ca_pvt_cc.cc        | 48 +++++++++++++-
 .../PVT/gnuradio_blocks/gps_l1_ca_pvt_cc.h         | 19 +++++-
 .../PVT/gnuradio_blocks/hybrid_pvt_cc.cc           | 11 +++-
 src/algorithms/PVT/gnuradio_blocks/hybrid_pvt_cc.h | 17 ++++-
 src/algorithms/PVT/libs/rtcm_printer.cc            | 75 ++++++++++++++++++++--
 src/algorithms/PVT/libs/rtcm_printer.h             |  5 +-
 src/core/system_parameters/rtcm.cc                 |  8 +--
 src/tests/gnss_block/rtcm_printer_test.cc          |  6 +-
 13 files changed, 215 insertions(+), 34 deletions(-)

diff --git a/src/algorithms/PVT/adapters/galileo_e1_pvt.cc b/src/algorithms/PVT/adapters/galileo_e1_pvt.cc
index ac43d85..78074d5 100644
--- a/src/algorithms/PVT/adapters/galileo_e1_pvt.cc
+++ b/src/algorithms/PVT/adapters/galileo_e1_pvt.cc
@@ -53,6 +53,7 @@ GalileoE1Pvt::GalileoE1Pvt(ConfigurationInterface* configuration,
     std::string default_dump_filename = "./pvt.dat";
     std::string default_nmea_dump_filename = "./nmea_pvt.nmea";
     std::string default_nmea_dump_devname = "/dev/tty1";
+    std::string default_rtcm_dump_devname = "/dev/pts/1";
     DLOG(INFO) << "role " << role;
     dump_ = configuration->property(role + ".dump", false);
     dump_filename_ = configuration->property(role + ".dump_filename", default_dump_filename);
@@ -74,8 +75,15 @@ GalileoE1Pvt::GalileoE1Pvt(ConfigurationInterface* configuration,
     nmea_dump_filename = configuration->property(role + ".nmea_dump_filename", default_nmea_dump_filename);
     std::string nmea_dump_devname;
     nmea_dump_devname = configuration->property(role + ".nmea_dump_devname", default_nmea_dump_devname);
+    // RTCM Printer settings
+    bool flag_rtcm_tty_port;
+    flag_rtcm_tty_port = configuration->property(role + ".flag_rtcm_tty_port", false);
+    std::string rtcm_dump_devname;
+    rtcm_dump_devname = configuration->property(role + ".rtcm_dump_devname", default_rtcm_dump_devname);
+    bool flag_rtcm_server;
+    flag_rtcm_server = configuration->property(role + ".flag_rtcm_server", false);
     // make PVT object
-    pvt_ = galileo_e1_make_pvt_cc(in_streams_, queue_, dump_, dump_filename_, averaging_depth, flag_averaging, output_rate_ms, display_rate_ms, flag_nmea_tty_port, nmea_dump_filename, nmea_dump_devname);
+    pvt_ = galileo_e1_make_pvt_cc(in_streams_, queue_, 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_dump_devname);
     DLOG(INFO) << "pvt(" << pvt_->unique_id() << ")";
 }
 
diff --git a/src/algorithms/PVT/adapters/gps_l1_ca_pvt.cc b/src/algorithms/PVT/adapters/gps_l1_ca_pvt.cc
index b72eb3f..c05bc3c 100644
--- a/src/algorithms/PVT/adapters/gps_l1_ca_pvt.cc
+++ b/src/algorithms/PVT/adapters/gps_l1_ca_pvt.cc
@@ -52,6 +52,7 @@ GpsL1CaPvt::GpsL1CaPvt(ConfigurationInterface* configuration,
     std::string default_dump_filename = "./pvt.dat";
     std::string default_nmea_dump_filename = "./nmea_pvt.nmea";
     std::string default_nmea_dump_devname = "/dev/tty1";
+    std::string default_rtcm_dump_devname = "/dev/pts/1";
     DLOG(INFO) << "role " << role;
     dump_ = configuration->property(role + ".dump", false);
     dump_filename_ = configuration->property(role + ".dump_filename", default_dump_filename);
@@ -73,8 +74,16 @@ GpsL1CaPvt::GpsL1CaPvt(ConfigurationInterface* configuration,
     nmea_dump_filename = configuration->property(role + ".nmea_dump_filename", default_nmea_dump_filename);
     std::string nmea_dump_devname;
     nmea_dump_devname = configuration->property(role + ".nmea_dump_devname", default_nmea_dump_devname);
+    // RTCM Printer settings
+    bool flag_rtcm_tty_port;
+    flag_rtcm_tty_port = configuration->property(role + ".flag_rtcm_tty_port", false);
+    std::string rtcm_dump_devname;
+    rtcm_dump_devname = configuration->property(role + ".rtcm_dump_devname", default_rtcm_dump_devname);
+    bool flag_rtcm_server;
+    flag_rtcm_server = configuration->property(role + ".flag_rtcm_server", false);
+
     // make PVT object
-    pvt_ = gps_l1_ca_make_pvt_cc(in_streams_, queue_, dump_, dump_filename_, averaging_depth, flag_averaging, output_rate_ms, display_rate_ms, flag_nmea_tty_port, nmea_dump_filename, nmea_dump_devname);
+    pvt_ = gps_l1_ca_make_pvt_cc(in_streams_, queue_, 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_dump_devname );
     DLOG(INFO) << "pvt(" << pvt_->unique_id() << ")";
 }
 
diff --git a/src/algorithms/PVT/adapters/hybrid_pvt.cc b/src/algorithms/PVT/adapters/hybrid_pvt.cc
index 6b7b751..155c243 100644
--- a/src/algorithms/PVT/adapters/hybrid_pvt.cc
+++ b/src/algorithms/PVT/adapters/hybrid_pvt.cc
@@ -53,6 +53,7 @@ HybridPvt::HybridPvt(ConfigurationInterface* configuration,
     std::string default_dump_filename = "./pvt.dat";
     std::string default_nmea_dump_filename = "./nmea_pvt.nmea";
     std::string default_nmea_dump_devname = "/dev/tty1";
+    std::string default_rtcm_dump_devname = "/dev/pts/1";
     DLOG(INFO) << "role " << role;
     dump_ = configuration->property(role + ".dump", false);
     dump_filename_ = configuration->property(role + ".dump_filename", default_dump_filename);
@@ -74,8 +75,15 @@ HybridPvt::HybridPvt(ConfigurationInterface* configuration,
     nmea_dump_filename = configuration->property(role + ".nmea_dump_filename", default_nmea_dump_filename);
     std::string nmea_dump_devname;
     nmea_dump_devname = configuration->property(role + ".nmea_dump_devname", default_nmea_dump_devname);
+    // RTCM Printer settings
+    bool flag_rtcm_tty_port;
+    flag_rtcm_tty_port = configuration->property(role + ".flag_rtcm_tty_port", false);
+    std::string rtcm_dump_devname;
+    rtcm_dump_devname = configuration->property(role + ".rtcm_dump_devname", default_rtcm_dump_devname);
+    bool flag_rtcm_server;
+    flag_rtcm_server = configuration->property(role + ".flag_rtcm_server", false);
     // make PVT object
-    pvt_ = hybrid_make_pvt_cc(in_streams_, queue_, dump_, dump_filename_, averaging_depth, flag_averaging, output_rate_ms, display_rate_ms, flag_nmea_tty_port, nmea_dump_filename, nmea_dump_devname);
+    pvt_ = hybrid_make_pvt_cc(in_streams_, queue_, 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_dump_devname);
     DLOG(INFO) << "pvt(" << pvt_->unique_id() << ")";
 }
 
diff --git a/src/algorithms/PVT/gnuradio_blocks/galileo_e1_pvt_cc.cc b/src/algorithms/PVT/gnuradio_blocks/galileo_e1_pvt_cc.cc
index b5d4ec4..ad33f39 100644
--- a/src/algorithms/PVT/gnuradio_blocks/galileo_e1_pvt_cc.cc
+++ b/src/algorithms/PVT/gnuradio_blocks/galileo_e1_pvt_cc.cc
@@ -51,13 +51,13 @@ extern concurrent_map<Galileo_Utc_Model> global_galileo_utc_model_map;
 extern concurrent_map<Galileo_Almanac> global_galileo_almanac_map;
 
 galileo_e1_pvt_cc_sptr
-galileo_e1_make_pvt_cc(unsigned int nchannels, boost::shared_ptr<gr::msg_queue> queue, bool dump, std::string dump_filename, 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)
+galileo_e1_make_pvt_cc(unsigned int nchannels, boost::shared_ptr<gr::msg_queue> queue, bool dump, std::string dump_filename, 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, std::string rtcm_dump_devname)
 {
-    return galileo_e1_pvt_cc_sptr(new galileo_e1_pvt_cc(nchannels, queue, dump, dump_filename, averaging_depth, flag_averaging, output_rate_ms, display_rate_ms, flag_nmea_tty_port, nmea_dump_filename, nmea_dump_devname));
+    return galileo_e1_pvt_cc_sptr(new galileo_e1_pvt_cc(nchannels, queue, 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_dump_devname));
 }
 
 
-galileo_e1_pvt_cc::galileo_e1_pvt_cc(unsigned int nchannels, boost::shared_ptr<gr::msg_queue> queue, bool dump, std::string dump_filename, 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) :
+galileo_e1_pvt_cc::galileo_e1_pvt_cc(unsigned int nchannels, boost::shared_ptr<gr::msg_queue> queue, bool dump, std::string dump_filename, 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, std::string rtcm_dump_devname) :
 		                		                gr::block("galileo_e1_pvt_cc", gr::io_signature::make(nchannels, nchannels,  sizeof(Gnss_Synchro)),
 		                		                        gr::io_signature::make(1, 1, sizeof(gr_complex)))
 {
@@ -84,6 +84,12 @@ galileo_e1_pvt_cc::galileo_e1_pvt_cc(unsigned int nchannels, boost::shared_ptr<g
 
     //initialize nmea_printer
     d_nmea_printer = std::make_shared<Nmea_Printer>(nmea_dump_filename, flag_nmea_tty_port, nmea_dump_devname);
+
+    //initialize rtcm_printer
+    std::string rtcm_dump_filename;
+    rtcm_dump_filename = d_dump_filename;
+    d_rtcm_printer = std::make_shared<Rtcm_Printer>(rtcm_dump_filename, flag_rtcm_server, flag_rtcm_tty_port, rtcm_dump_devname);
+
     d_dump_filename.append("_raw.dat");
     dump_ls_pvt_filename.append("_ls_pvt.dat");
     d_averaging_depth = averaging_depth;
diff --git a/src/algorithms/PVT/gnuradio_blocks/galileo_e1_pvt_cc.h b/src/algorithms/PVT/gnuradio_blocks/galileo_e1_pvt_cc.h
index 993c5ad..3eb07f3 100644
--- a/src/algorithms/PVT/gnuradio_blocks/galileo_e1_pvt_cc.h
+++ b/src/algorithms/PVT/gnuradio_blocks/galileo_e1_pvt_cc.h
@@ -47,6 +47,7 @@
 #include "kml_printer.h"
 #include "rinex_printer.h"
 #include "geojson_printer.h"
+#include "rtcm_printer.h"
 #include "galileo_e1_ls_pvt.h"
 #include "Galileo_E1.h"
 
@@ -64,7 +65,10 @@ galileo_e1_pvt_cc_sptr galileo_e1_make_pvt_cc(unsigned int n_channels,
                                               int display_rate_ms,
                                               bool flag_nmea_tty_port,
                                               std::string nmea_dump_filename,
-                                              std::string nmea_dump_devname);
+                                              std::string nmea_dump_devname,
+                                              bool flag_rtcm_server,
+                                              bool flag_rtcm_tty_port,
+                                              std::string rtcm_dump_devname);
 
 /*!
  * \brief This class implements a block that computes the PVT solution with Galileo E1 signals
@@ -82,7 +86,10 @@ private:
                                                          int display_rate_ms,
                                                          bool flag_nmea_tty_port,
                                                          std::string nmea_dump_filename,
-                                                         std::string nmea_dump_devname);
+                                                         std::string nmea_dump_devname,
+                                                         bool flag_rtcm_server,
+                                                         bool flag_rtcm_tty_port,
+                                                         std::string rtcm_dump_devname);
     galileo_e1_pvt_cc(unsigned int nchannels,
                       boost::shared_ptr<gr::msg_queue> queue,
                       bool dump, std::string dump_filename,
@@ -92,7 +99,10 @@ private:
                       int display_rate_ms,
                       bool flag_nmea_tty_port,
                       std::string nmea_dump_filename,
-                      std::string nmea_dump_devname);
+                      std::string nmea_dump_devname,
+                      bool flag_rtcm_server,
+                      bool flag_rtcm_tty_port,
+                      std::string rtcm_dump_devname);
     boost::shared_ptr<gr::msg_queue> d_queue;
     bool d_dump;
     bool b_rinex_header_writen;
@@ -110,6 +120,7 @@ private:
     std::shared_ptr<Kml_Printer> d_kml_dump;
     std::shared_ptr<Nmea_Printer> d_nmea_printer;
     std::shared_ptr<GeoJSON_Printer> d_geojson_printer;
+    std::shared_ptr<Rtcm_Printer> d_rtcm_printer;
 
     double d_rx_time;
     std::shared_ptr<galileo_e1_ls_pvt> d_ls_pvt;
diff --git a/src/algorithms/PVT/gnuradio_blocks/gps_l1_ca_pvt_cc.cc b/src/algorithms/PVT/gnuradio_blocks/gps_l1_ca_pvt_cc.cc
index 3d72e2c..f45276b 100644
--- a/src/algorithms/PVT/gnuradio_blocks/gps_l1_ca_pvt_cc.cc
+++ b/src/algorithms/PVT/gnuradio_blocks/gps_l1_ca_pvt_cc.cc
@@ -56,9 +56,9 @@ extern concurrent_map<Sbas_Satellite_Correction> global_sbas_sat_corr_map;
 extern concurrent_map<Sbas_Ephemeris> global_sbas_ephemeris_map;
 
 gps_l1_ca_pvt_cc_sptr
-gps_l1_ca_make_pvt_cc(unsigned int nchannels, boost::shared_ptr<gr::msg_queue> queue, bool dump, std::string dump_filename, 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)
+gps_l1_ca_make_pvt_cc(unsigned int nchannels, boost::shared_ptr<gr::msg_queue> queue, bool dump, std::string dump_filename, 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, std::string rtcm_dump_devname)
 {
-    return gps_l1_ca_pvt_cc_sptr(new gps_l1_ca_pvt_cc(nchannels, queue, dump, dump_filename, averaging_depth, flag_averaging, output_rate_ms, display_rate_ms, flag_nmea_tty_port, nmea_dump_filename, nmea_dump_devname));
+    return gps_l1_ca_pvt_cc_sptr(new gps_l1_ca_pvt_cc(nchannels, queue, 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_dump_devname));
 }
 
 
@@ -71,7 +71,10 @@ gps_l1_ca_pvt_cc::gps_l1_ca_pvt_cc(unsigned int nchannels,
         int display_rate_ms,
         bool flag_nmea_tty_port,
         std::string nmea_dump_filename,
-        std::string nmea_dump_devname) :
+        std::string nmea_dump_devname,
+        bool flag_rtcm_server,
+        bool flag_rtcm_tty_port,
+        std::string rtcm_dump_devname) :
              gr::block("gps_l1_ca_pvt_cc", gr::io_signature::make(nchannels, nchannels,  sizeof(Gnss_Synchro)),
              gr::io_signature::make(1, 1, sizeof(gr_complex)) )
 {
@@ -98,6 +101,12 @@ gps_l1_ca_pvt_cc::gps_l1_ca_pvt_cc(unsigned int nchannels,
     //initialize nmea_printer
     d_nmea_printer = std::make_shared<Nmea_Printer>(nmea_dump_filename, flag_nmea_tty_port, nmea_dump_devname);
 
+    //initialize rtcm_printer
+    std::string rtcm_dump_filename;
+    rtcm_dump_filename = d_dump_filename;
+    d_rtcm_printer = std::make_shared<Rtcm_Printer>(rtcm_dump_filename, flag_rtcm_server, flag_rtcm_tty_port, rtcm_dump_devname);
+    b_rtcm_writing_started = false;
+
     d_dump_filename.append("_raw.dat");
     dump_ls_pvt_filename.append("_ls_pvt.dat");
     d_averaging_depth = averaging_depth;
@@ -303,6 +312,39 @@ int gps_l1_ca_pvt_cc::general_work (int noutput_items, gr_vector_int &ninput_ite
                                             b_rinex_header_updated = true;
                                         }
                                 }
+                            if(b_rtcm_writing_started)
+                                {
+                                    if((d_sample_counter % 1000) == 0)
+                                        {
+                                            std::map<int,Gps_Ephemeris>::iterator gps_ephemeris_iter;
+                                            gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.begin();
+                                            if (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end())
+                                                {
+                                                    d_rtcm_printer->Print_Rtcm_MT1002(gps_ephemeris_iter->second, d_rx_time, gnss_pseudoranges_map);
+                                                }
+                                        }
+                                    if((d_sample_counter % 5000) == 0)
+                                        {
+                                            std::map<int,Gps_Ephemeris>::iterator gps_ephemeris_iter;
+                                            gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.begin();
+                                            if (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end())
+                                                {
+                                                    d_rtcm_printer->Print_Rtcm_MT1019(gps_ephemeris_iter->second);
+                                                }
+                                        }
+                                }
+
+                            if(!b_rtcm_writing_started) // the first time
+                                {
+                                    std::map<int,Gps_Ephemeris>::iterator gps_ephemeris_iter;
+                                    gps_ephemeris_iter = d_ls_pvt->gps_ephemeris_map.begin();
+                                    if (gps_ephemeris_iter != d_ls_pvt->gps_ephemeris_map.end())
+                                        {
+                                            d_rtcm_printer->Print_Rtcm_MT1019(gps_ephemeris_iter->second);
+                                            d_rtcm_printer->Print_Rtcm_MT1002(gps_ephemeris_iter->second, d_rx_time, gnss_pseudoranges_map);
+                                        }
+                                    b_rtcm_writing_started = true;
+                                }
                         }
                 }
 
diff --git a/src/algorithms/PVT/gnuradio_blocks/gps_l1_ca_pvt_cc.h b/src/algorithms/PVT/gnuradio_blocks/gps_l1_ca_pvt_cc.h
index 9764046..6c1ea24 100644
--- a/src/algorithms/PVT/gnuradio_blocks/gps_l1_ca_pvt_cc.h
+++ b/src/algorithms/PVT/gnuradio_blocks/gps_l1_ca_pvt_cc.h
@@ -46,6 +46,7 @@
 #include "kml_printer.h"
 #include "rinex_printer.h"
 #include "geojson_printer.h"
+#include "rtcm_printer.h"
 #include "gps_l1_ca_ls_pvt.h"
 #include "GPS_L1_CA.h"
 
@@ -63,7 +64,11 @@ gps_l1_ca_pvt_cc_sptr gps_l1_ca_make_pvt_cc(unsigned int n_channels,
                                             int display_rate_ms,
                                             bool flag_nmea_tty_port,
                                             std::string nmea_dump_filename,
-                                            std::string nmea_dump_devname);
+                                            std::string nmea_dump_devname,
+                                            bool flag_rtcm_server,
+                                            bool flag_rtcm_tty_port,
+                                            std::string rtcm_dump_devname
+);
 
 /*!
  * \brief This class implements a block that computes the PVT solution
@@ -81,7 +86,10 @@ private:
                                                        int display_rate_ms,
                                                        bool flag_nmea_tty_port,
                                                        std::string nmea_dump_filename,
-                                                       std::string nmea_dump_devname);
+                                                       std::string nmea_dump_devname,
+                                                       bool flag_rtcm_server,
+                                                       bool flag_rtcm_tty_port,
+                                                       std::string rtcm_dump_devname);
     gps_l1_ca_pvt_cc(unsigned int nchannels,
                      boost::shared_ptr<gr::msg_queue> queue,
                      bool dump,
@@ -92,12 +100,16 @@ private:
                      int display_rate_ms,
                      bool flag_nmea_tty_port,
                      std::string nmea_dump_filename,
-                     std::string nmea_dump_devname);
+                     std::string nmea_dump_devname,
+                     bool flag_rtcm_server,
+                     bool flag_rtcm_tty_port,
+                     std::string rtcm_dump_devname);
     boost::shared_ptr<gr::msg_queue> d_queue;
     bool d_dump;
     bool b_rinex_header_writen;
     bool b_rinex_sbs_header_writen;
     bool b_rinex_header_updated;
+    bool b_rtcm_writing_started;
     std::shared_ptr<Rinex_Printer> rp;
     unsigned int d_nchannels;
     std::string d_dump_filename;
@@ -111,6 +123,7 @@ private:
     std::shared_ptr<Kml_Printer> d_kml_printer;
     std::shared_ptr<Nmea_Printer> d_nmea_printer;
     std::shared_ptr<GeoJSON_Printer> d_geojson_printer;
+    std::shared_ptr<Rtcm_Printer> d_rtcm_printer;
     double d_rx_time;
     std::shared_ptr<gps_l1_ca_ls_pvt> d_ls_pvt;
 
diff --git a/src/algorithms/PVT/gnuradio_blocks/hybrid_pvt_cc.cc b/src/algorithms/PVT/gnuradio_blocks/hybrid_pvt_cc.cc
index d043d86..abf1412 100644
--- a/src/algorithms/PVT/gnuradio_blocks/hybrid_pvt_cc.cc
+++ b/src/algorithms/PVT/gnuradio_blocks/hybrid_pvt_cc.cc
@@ -55,13 +55,13 @@ extern concurrent_map<Gps_Iono> global_gps_iono_map;
 extern concurrent_map<Gps_Utc_Model> global_gps_utc_model_map;
 
 hybrid_pvt_cc_sptr
-hybrid_make_pvt_cc(unsigned int nchannels, boost::shared_ptr<gr::msg_queue> queue, bool dump, std::string dump_filename, 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)
+hybrid_make_pvt_cc(unsigned int nchannels, boost::shared_ptr<gr::msg_queue> queue, bool dump, std::string dump_filename, 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, std::string rtcm_dump_devname)
 {
-    return hybrid_pvt_cc_sptr(new hybrid_pvt_cc(nchannels, queue, dump, dump_filename, averaging_depth, flag_averaging, output_rate_ms, display_rate_ms, flag_nmea_tty_port, nmea_dump_filename, nmea_dump_devname));
+    return hybrid_pvt_cc_sptr(new hybrid_pvt_cc(nchannels, queue, 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_dump_devname));
 }
 
 
-hybrid_pvt_cc::hybrid_pvt_cc(unsigned int nchannels, boost::shared_ptr<gr::msg_queue> queue, bool dump, std::string dump_filename, 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) :
+hybrid_pvt_cc::hybrid_pvt_cc(unsigned int nchannels, boost::shared_ptr<gr::msg_queue> queue, bool dump, std::string dump_filename, 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, std::string rtcm_dump_devname) :
 		                		                        gr::block("hybrid_pvt_cc", gr::io_signature::make(nchannels, nchannels,  sizeof(Gnss_Synchro)),
 		                		                        gr::io_signature::make(1, 1, sizeof(gr_complex)))
 {
@@ -89,6 +89,11 @@ hybrid_pvt_cc::hybrid_pvt_cc(unsigned int nchannels, boost::shared_ptr<gr::msg_q
     //initialize nmea_printer
     d_nmea_printer = std::make_shared<Nmea_Printer>(nmea_dump_filename, flag_nmea_tty_port, nmea_dump_devname);
 
+    //initialize rtcm_printer
+    std::string rtcm_dump_filename;
+    rtcm_dump_filename = d_dump_filename;
+    d_rtcm_printer = std::make_shared<Rtcm_Printer>(rtcm_dump_filename, flag_rtcm_server, flag_rtcm_tty_port, rtcm_dump_devname);
+
     d_dump_filename.append("_raw.dat");
     dump_ls_pvt_filename.append("_ls_pvt.dat");
     d_averaging_depth = averaging_depth;
diff --git a/src/algorithms/PVT/gnuradio_blocks/hybrid_pvt_cc.h b/src/algorithms/PVT/gnuradio_blocks/hybrid_pvt_cc.h
index eb6e8a9..b708719 100644
--- a/src/algorithms/PVT/gnuradio_blocks/hybrid_pvt_cc.h
+++ b/src/algorithms/PVT/gnuradio_blocks/hybrid_pvt_cc.h
@@ -51,6 +51,7 @@
 #include "kml_printer.h"
 #include "geojson_printer.h"
 #include "rinex_printer.h"
+#include "rtcm_printer.h"
 #include "hybrid_ls_pvt.h"
 #include "GPS_L1_CA.h"
 #include "Galileo_E1.h"
@@ -69,7 +70,10 @@ hybrid_pvt_cc_sptr hybrid_make_pvt_cc(unsigned int n_channels,
                                               int display_rate_ms,
                                               bool flag_nmea_tty_port,
                                               std::string nmea_dump_filename,
-                                              std::string nmea_dump_devname);
+                                              std::string nmea_dump_devname,
+                                              bool flag_rtcm_server,
+                                              bool flag_rtcm_tty_port,
+                                              std::string rtcm_dump_devname);
 
 /*!
  * \brief This class implements a block that computes the PVT solution with Galileo E1 signals
@@ -87,7 +91,10 @@ private:
                                                          int display_rate_ms,
                                                          bool flag_nmea_tty_port,
                                                          std::string nmea_dump_filename,
-                                                         std::string nmea_dump_devname);
+                                                         std::string nmea_dump_devname,
+                                                         bool flag_rtcm_server,
+                                                         bool flag_rtcm_tty_port,
+                                                         std::string rtcm_dump_devname);
     hybrid_pvt_cc(unsigned int nchannels,
                       boost::shared_ptr<gr::msg_queue> queue,
                       bool dump, std::string dump_filename,
@@ -97,7 +104,10 @@ private:
                       int display_rate_ms,
                       bool flag_nmea_tty_port,
                       std::string nmea_dump_filename,
-                      std::string nmea_dump_devname);
+                      std::string nmea_dump_devname,
+                      bool flag_rtcm_server,
+                      bool flag_rtcm_tty_port,
+                      std::string rtcm_dump_devname);
     boost::shared_ptr<gr::msg_queue> d_queue;
     bool d_dump;
     bool b_rinex_header_writen;
@@ -115,6 +125,7 @@ private:
     std::shared_ptr<Kml_Printer> d_kml_dump;
     std::shared_ptr<Nmea_Printer> d_nmea_printer;
     std::shared_ptr<GeoJSON_Printer> d_geojson_printer;
+    std::shared_ptr<Rtcm_Printer> d_rtcm_printer;
     double d_rx_time;
     double d_TOW_at_curr_symbol_constellation;
     std::shared_ptr<hybrid_ls_pvt> d_ls_pvt;
diff --git a/src/algorithms/PVT/libs/rtcm_printer.cc b/src/algorithms/PVT/libs/rtcm_printer.cc
index 24b184e..5279e4f 100644
--- a/src/algorithms/PVT/libs/rtcm_printer.cc
+++ b/src/algorithms/PVT/libs/rtcm_printer.cc
@@ -32,6 +32,9 @@
  */
 
 #include "rtcm_printer.h"
+#include <ctime>
+#include <iostream>
+#include <iomanip>
 #include <fcntl.h>    // for O_RDWR
 #include <termios.h>  // for tcgetattr
 #include <gflags/gflags.h>
@@ -40,9 +43,56 @@
 using google::LogMessage;
 
 
-Rtcm_Printer::Rtcm_Printer(std::string filename, bool flag_rtcm_tty_port, std::string rtcm_dump_devname)
+Rtcm_Printer::Rtcm_Printer(std::string filename, bool flag_rtcm_server, bool flag_rtcm_tty_port, std::string rtcm_dump_devname, bool time_tag_name)
 {
-    rtcm_filename = filename;
+    time_t rawtime;
+    struct tm * timeinfo;
+    time ( &rawtime );
+    timeinfo = localtime ( &rawtime );
+
+    if (time_tag_name)
+        {
+            std::stringstream strm0;
+            const int year = timeinfo->tm_year - 100;
+            strm0 << year;
+            const int month = timeinfo->tm_mon + 1;
+            if(month < 10)
+                {
+                    strm0 << "0";
+                }
+            strm0 << month;
+            const int day = timeinfo->tm_mday;
+            if(day < 10)
+                {
+                    strm0 << "0";
+                }
+            strm0 << day << "_";
+            const int hour = timeinfo->tm_hour;
+            if(hour < 10)
+                {
+                    strm0 << "0";
+                }
+            strm0 << hour;
+            const int min = timeinfo->tm_min;
+            if(min < 10)
+                {
+                    strm0 << "0";
+                }
+            strm0 << min;
+            const int sec = timeinfo->tm_sec;
+            if(sec < 10)
+                {
+                    strm0 << "0";
+                }
+            strm0 << sec;
+
+            rtcm_filename = filename + "_" +  strm0.str() + ".rtcm";
+        }
+    else
+        {
+            rtcm_filename = filename + ".rtcm";
+        }
+
     rtcm_file_descriptor.open(rtcm_filename.c_str(), std::ios::out);
     if (rtcm_file_descriptor.is_open())
         {
@@ -62,14 +112,21 @@ Rtcm_Printer::Rtcm_Printer(std::string filename, bool flag_rtcm_tty_port, std::s
         {
             rtcm_dev_descriptor = -1;
         }
+
     rtcm = std::make_shared<Rtcm>();
+    if(flag_rtcm_server)
+        {
+            rtcm->run_server();
+        }
 }
 
 
-
-
 Rtcm_Printer::~Rtcm_Printer()
 {
+    if(rtcm->is_server_running())
+        {
+            rtcm->stop_server();
+        }
     if (rtcm_file_descriptor.is_open())
         {
             long pos;
@@ -92,6 +149,14 @@ bool Rtcm_Printer::Print_Rtcm_MT1001(const Gps_Ephemeris& gps_eph, double obs_ti
 }
 
 
+bool Rtcm_Printer::Print_Rtcm_MT1002(const Gps_Ephemeris& gps_eph, double obs_time, const std::map<int, Gnss_Synchro> & pseudoranges)
+{
+    std::string m1002 = rtcm->print_MT1002(gps_eph, obs_time, pseudoranges);
+    Rtcm_Printer::Print_Message(m1002);
+    return true;
+}
+
+
 bool Rtcm_Printer::Print_Rtcm_MT1019(const Gps_Ephemeris & gps_eph)
 {
     std::string m1019 = rtcm->print_MT1019(gps_eph);
@@ -156,7 +221,7 @@ void Rtcm_Printer::close_serial()
 
 
 
-bool Rtcm_Printer::Print_Message(std::string message)
+bool Rtcm_Printer::Print_Message(const std::string & message)
 {
     //write to file
     try
diff --git a/src/algorithms/PVT/libs/rtcm_printer.h b/src/algorithms/PVT/libs/rtcm_printer.h
index f342d87..13a8974 100644
--- a/src/algorithms/PVT/libs/rtcm_printer.h
+++ b/src/algorithms/PVT/libs/rtcm_printer.h
@@ -48,7 +48,7 @@ public:
     /*!
      * \brief Default constructor.
      */
-    Rtcm_Printer(std::string filename, bool flag_rtcm_tty_port, std::string rtcm_dump_filename);
+    Rtcm_Printer(std::string filename, bool flag_rtcm_server, bool flag_rtcm_tty_port, std::string rtcm_dump_filename, bool time_tag_name = true);
 
     /*!
      * \brief Default destructor.
@@ -56,6 +56,7 @@ public:
     ~Rtcm_Printer();
 
     bool Print_Rtcm_MT1001(const Gps_Ephemeris& gps_eph, double obs_time, const std::map<int, Gnss_Synchro> & pseudoranges);
+    bool Print_Rtcm_MT1002(const Gps_Ephemeris& gps_eph, double obs_time, const std::map<int, Gnss_Synchro> & pseudoranges);
     bool Print_Rtcm_MT1019(const Gps_Ephemeris & gps_eph); //<! GPS Ephemeris, should be broadcast in the event that the IODC does not match the IODE, and every 2 minutes.
     bool Print_Rtcm_MT1045(const Galileo_Ephemeris & gal_eph); //<! Galileo Ephemeris, should be broadcast every 2 minutes
 
@@ -69,7 +70,7 @@ private:
     int init_serial (std::string serial_device); //serial port control
     void close_serial ();
     std::shared_ptr<Rtcm> rtcm;
-    bool Print_Message(std::string message);
+    bool Print_Message(const std::string & message);
 };
 
 #endif
diff --git a/src/core/system_parameters/rtcm.cc b/src/core/system_parameters/rtcm.cc
index 8a3e559..39257aa 100644
--- a/src/core/system_parameters/rtcm.cc
+++ b/src/core/system_parameters/rtcm.cc
@@ -409,7 +409,7 @@ std::string Rtcm::print_MT1001(const Gps_Ephemeris & gps_eph, double obs_time, c
             pseudoranges_iter != pseudoranges.end();
             pseudoranges_iter++)
         {
-            std::string system_(pseudoranges_iter->second.System, 1);
+            std::string system_(&pseudoranges_iter->second.System, 1);
             std::string sig_(pseudoranges_iter->second.Signal);
             if((system_.compare("G") == 0) && (sig_.compare("1C") == 0))
                 {
@@ -459,7 +459,7 @@ std::string Rtcm::print_MT1002(const Gps_Ephemeris & gps_eph, double obs_time, c
             pseudoranges_iter != pseudoranges.end();
             pseudoranges_iter++)
         {
-            std::string system_(pseudoranges_iter->second.System, 1);
+            std::string system_(&pseudoranges_iter->second.System, 1);
             std::string sig_(pseudoranges_iter->second.Signal);
             if((system_.compare("G") == 0) && (sig_.compare("1C") == 0))
                 {
@@ -533,7 +533,7 @@ std::string Rtcm::print_MT1003(const Gps_Ephemeris & ephL1, const Gps_CNAV_Ephem
             pseudoranges_iter != pseudoranges.end();
             pseudoranges_iter++)
         {
-            std::string system_(pseudoranges_iter->second.System, 1);
+            std::string system_(&pseudoranges_iter->second.System, 1);
             std::string sig_(pseudoranges_iter->second.Signal);
             if((system_.compare("G") == 0) && (sig_.compare("1C") == 0))
                 {
@@ -643,7 +643,7 @@ std::string Rtcm::print_MT1004(const Gps_Ephemeris & ephL1, const Gps_CNAV_Ephem
             pseudoranges_iter != pseudoranges.end();
             pseudoranges_iter++)
         {
-            std::string system_(pseudoranges_iter->second.System, 1);
+            std::string system_(&pseudoranges_iter->second.System, 1);
             std::string sig_(pseudoranges_iter->second.Signal);
             if((system_.compare("G") == 0) && (sig_.compare("1C") == 0))
                 {
diff --git a/src/tests/gnss_block/rtcm_printer_test.cc b/src/tests/gnss_block/rtcm_printer_test.cc
index 9268e36..74eed31 100644
--- a/src/tests/gnss_block/rtcm_printer_test.cc
+++ b/src/tests/gnss_block/rtcm_printer_test.cc
@@ -45,7 +45,8 @@ TEST(Rtcm_Printer_Test, Instantiate)
     std::string filename = "hello.rtcm";
     bool flag_rtcm_tty_port = false;
     std::string rtcm_dump_devname = "/dev/pts/4";
-    std::unique_ptr<Rtcm_Printer> RTCM_printer(new Rtcm_Printer(filename, flag_rtcm_tty_port, rtcm_dump_devname));
+    bool flag_rtcm_server = false;
+    std::unique_ptr<Rtcm_Printer> RTCM_printer(new Rtcm_Printer(filename, flag_rtcm_server, flag_rtcm_tty_port, rtcm_dump_devname));
 }
 
 TEST(Rtcm_Printer_Test, Run)
@@ -69,8 +70,9 @@ TEST(Rtcm_Printer_Test, Run)
     std::string filename = "test.rtcm";
     bool flag_rtcm_tty_port = false;
     std::string rtcm_dump_devname = "/dev/pts/4";
+    bool flag_rtcm_server = false;
 
-    std::unique_ptr<Rtcm_Printer> RTCM_printer(new Rtcm_Printer(filename, flag_rtcm_tty_port, rtcm_dump_devname));
+    std::unique_ptr<Rtcm_Printer> RTCM_printer(new Rtcm_Printer(filename, flag_rtcm_server, flag_rtcm_tty_port, rtcm_dump_devname));
 
     std::string reference_msg = "D300133ED7D30202980EDEEF34B4BD62AC0941986F33360B98";
     std::string testing_msg = RTCM_printer->print_MT1005_test();

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