diff --git a/docs/protobuf/gnss_synchro.proto b/docs/protobuf/gnss_synchro.proto index 7319fa212..c67ecf42b 100644 --- a/docs/protobuf/gnss_synchro.proto +++ b/docs/protobuf/gnss_synchro.proto @@ -36,6 +36,7 @@ message GnssSynchro { double rx_time = 23; // Receiving time after the start of the week, in s bool flag_valid_pseudorange = 24; // Pseudorange computation status double interp_tow_ms = 25; // Interpolated time of week, in ms + bool flag_PLL_180_deg_phase_locked = 26; // PLL lock at 180ยบ } /* Observables represents a collection of GnssSynchro annotations */ diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_telemetry_decoder_gs.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_telemetry_decoder_gs.cc index 89c51e727..41b59795a 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_telemetry_decoder_gs.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_telemetry_decoder_gs.cc @@ -1032,6 +1032,11 @@ int galileo_telemetry_decoder_gs::general_work(int noutput_items __attribute__(( { // correct the accumulated phase for the Costas loop phase shift, if required current_symbol.Carrier_phase_rads += GNSS_PI; + current_symbol.Flag_PLL_180_deg_phase_locked = true; + } + else + { + current_symbol.Flag_PLL_180_deg_phase_locked = false; } if (d_dump == true) diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_gs.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_gs.cc index 2fba8cce2..fd44a542d 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_gs.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_gs.cc @@ -574,6 +574,11 @@ int gps_l1_ca_telemetry_decoder_gs::general_work(int noutput_items __attribute__ { // correct the accumulated phase for the Costas loop phase shift, if required current_symbol.Carrier_phase_rads += GNSS_PI; + current_symbol.Flag_PLL_180_deg_phase_locked = true; + } + else + { + current_symbol.Flag_PLL_180_deg_phase_locked = false; } if (d_dump == true) diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_gs.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_gs.cc index 11b5d080e..dac360f43 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_gs.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2c_telemetry_decoder_gs.cc @@ -311,6 +311,11 @@ int gps_l2c_telemetry_decoder_gs::general_work(int noutput_items __attribute__(( { // correct the accumulated phase for the Costas loop phase shift, if required current_synchro_data.Carrier_phase_rads += GNSS_PI; + current_synchro_data.Flag_PLL_180_deg_phase_locked = true; + } + else + { + current_synchro_data.Flag_PLL_180_deg_phase_locked = false; } current_synchro_data.TOW_at_current_symbol_ms = round(d_TOW_at_current_symbol * 1000.0); diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l5_telemetry_decoder_gs.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l5_telemetry_decoder_gs.cc index 30c7a9cde..97b724261 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l5_telemetry_decoder_gs.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l5_telemetry_decoder_gs.cc @@ -325,6 +325,11 @@ int gps_l5_telemetry_decoder_gs::general_work(int noutput_items __attribute__((u { // correct the accumulated phase for the Costas loop phase shift, if required current_synchro_data.Carrier_phase_rads += GNSS_PI; + current_synchro_data.Flag_PLL_180_deg_phase_locked = true; + } + else + { + current_synchro_data.Flag_PLL_180_deg_phase_locked = false; } current_synchro_data.TOW_at_current_symbol_ms = d_TOW_at_current_symbol_ms; current_synchro_data.Flag_valid_word = d_flag_valid_word; diff --git a/src/core/monitor/serdes_gnss_synchro.h b/src/core/monitor/serdes_gnss_synchro.h index 6edbac87e..35bbed909 100644 --- a/src/core/monitor/serdes_gnss_synchro.h +++ b/src/core/monitor/serdes_gnss_synchro.h @@ -112,6 +112,7 @@ public: obs->set_pseudorange_m(gs.Pseudorange_m); obs->set_rx_time(gs.RX_time); obs->set_flag_valid_pseudorange(gs.Flag_valid_pseudorange); + obs->set_flag_pll_180_deg_phase_locked(gs.Flag_PLL_180_deg_phase_locked); obs->set_interp_tow_ms(gs.interp_TOW_ms); } observables.SerializeToString(&data); @@ -156,6 +157,7 @@ public: gs.Pseudorange_m = gs_read.pseudorange_m(); gs.RX_time = gs_read.rx_time(); gs.Flag_valid_pseudorange = gs_read.flag_valid_pseudorange(); + gs.Flag_PLL_180_deg_phase_locked = gs_read.flag_pll_180_deg_phase_locked(); gs.interp_TOW_ms = gs_read.interp_tow_ms(); vgs.push_back(gs); diff --git a/src/core/system_parameters/gnss_synchro.h b/src/core/system_parameters/gnss_synchro.h index cc0e0e13a..f2934f5de 100644 --- a/src/core/system_parameters/gnss_synchro.h +++ b/src/core/system_parameters/gnss_synchro.h @@ -74,10 +74,11 @@ public: double interp_TOW_ms{}; //!< Set by Observables processing block // Flags - bool Flag_valid_acquisition{}; //!< Set by Acquisition processing block - bool Flag_valid_symbol_output{}; //!< Set by Tracking processing block - bool Flag_valid_word{}; //!< Set by Telemetry Decoder processing block - bool Flag_valid_pseudorange{}; //!< Set by Observables processing block + bool Flag_valid_acquisition{}; //!< Set by Acquisition processing block + bool Flag_valid_symbol_output{}; //!< Set by Tracking processing block + bool Flag_valid_word{}; //!< Set by Telemetry Decoder processing block + bool Flag_valid_pseudorange{}; //!< Set by Observables processing block + bool Flag_PLL_180_deg_phase_locked{}; //!< Set by Telemetry Decoder processing block /// Copy constructor Gnss_Synchro(const Gnss_Synchro& other) noexcept @@ -118,6 +119,7 @@ public: this->Flag_valid_symbol_output = rhs.Flag_valid_symbol_output; this->Flag_valid_word = rhs.Flag_valid_word; this->Flag_valid_pseudorange = rhs.Flag_valid_pseudorange; + this->Flag_PLL_180_deg_phase_locked = rhs.Flag_PLL_180_deg_phase_locked; } return *this; }; @@ -160,6 +162,7 @@ public: this->Flag_valid_symbol_output = other.Flag_valid_symbol_output; this->Flag_valid_word = other.Flag_valid_word; this->Flag_valid_pseudorange = other.Flag_valid_pseudorange; + this->Flag_PLL_180_deg_phase_locked = other.Flag_PLL_180_deg_phase_locked; } return *this; }; @@ -206,6 +209,7 @@ public: ar& BOOST_SERIALIZATION_NVP(Flag_valid_symbol_output); ar& BOOST_SERIALIZATION_NVP(Flag_valid_word); ar& BOOST_SERIALIZATION_NVP(Flag_valid_pseudorange); + ar& BOOST_SERIALIZATION_NVP(Flag_PLL_180_deg_phase_locked); } };