mirror of
				https://github.com/gnss-sdr/gnss-sdr
				synced 2025-10-29 22:42:59 +00:00 
			
		
		
		
	Print estimated CN0 on the terminal when navigation data is decoded
This commit is contained in:
		| @@ -57,6 +57,8 @@ All notable changes to GNSS-SDR will be documented in this file. | ||||
| - Now the program exits properly if a SIGINT signal is received (_e.g._, the | ||||
|   user pressing Ctrl+C, or another user application sending an interruption | ||||
|   signal). | ||||
| - The estimated CN0 value is now printed in the terminal when navigation data is | ||||
|   succesfully decoded. | ||||
|  | ||||
| ## [GNSS-SDR v0.0.18](https://github.com/gnss-sdr/gnss-sdr/releases/tag/v0.0.18) - 2023-04-06 | ||||
|  | ||||
|   | ||||
| @@ -33,6 +33,7 @@ | ||||
| #include <cstddef>          // for size_t | ||||
| #include <cstdlib>          // for abs | ||||
| #include <exception>        // for exception | ||||
| #include <iomanip>          // for setprecision | ||||
| #include <iostream>         // for cout | ||||
| #include <memory>           // for shared_ptr, make_shared | ||||
|  | ||||
| @@ -239,7 +240,7 @@ void beidou_b1i_telemetry_decoder_gs::decode_word( | ||||
| } | ||||
|  | ||||
|  | ||||
| void beidou_b1i_telemetry_decoder_gs::decode_subframe(float *frame_symbols) | ||||
| void beidou_b1i_telemetry_decoder_gs::decode_subframe(float *frame_symbols, double cn0) | ||||
| { | ||||
|     // 1. Transform from symbols to bits | ||||
|     std::string data_bits; | ||||
| @@ -296,32 +297,49 @@ void beidou_b1i_telemetry_decoder_gs::decode_subframe(float *frame_symbols) | ||||
|             // get object for this SV (mandatory) | ||||
|             const std::shared_ptr<Beidou_Dnav_Ephemeris> tmp_obj = std::make_shared<Beidou_Dnav_Ephemeris>(d_nav.get_ephemeris()); | ||||
|             this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); | ||||
|             LOG(INFO) << "BEIDOU DNAV Ephemeris have been received in channel" << d_channel << " from satellite " << d_satellite; | ||||
|             std::cout << "New BEIDOU B1I DNAV message received in channel " << d_channel << ": ephemeris from satellite " << d_satellite << '\n'; | ||||
|             LOG(INFO) << "BEIDOU DNAV Ephemeris have been received in channel" << d_channel << " from satellite " << d_satellite << " with CN0=" << cn0 << " dB-Hz"; | ||||
|             const auto default_precision{std::cout.precision()}; | ||||
|             std::cout << "New BEIDOU B1I DNAV message received in channel " << d_channel | ||||
|                       << ": ephemeris from satellite " << d_satellite | ||||
|                       << " with CN0=" << std::setprecision(2) << cn0 << " dB-Hz" << std::endl; | ||||
|             std::cout << std::setprecision(default_precision);  // restore defaults | ||||
|         } | ||||
|     if (d_nav.have_new_utc_model() == true) | ||||
|         { | ||||
|             // get object for this SV (mandatory) | ||||
|             const std::shared_ptr<Beidou_Dnav_Utc_Model> tmp_obj = std::make_shared<Beidou_Dnav_Utc_Model>(d_nav.get_utc_model()); | ||||
|             this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); | ||||
|             LOG(INFO) << "BEIDOU DNAV UTC Model data have been received in channel" << d_channel << " from satellite " << d_satellite; | ||||
|             std::cout << "New BEIDOU B1I DNAV utc model message received in channel " << d_channel << ": UTC model parameters from satellite " << d_satellite << '\n'; | ||||
|             LOG(INFO) << "BEIDOU DNAV UTC Model data have been received in channel" << d_channel << " from satellite " << d_satellite << " with CN0=" << cn0 << " dB-Hz"; | ||||
|             const auto default_precision{std::cout.precision()}; | ||||
|             std::cout << "New BEIDOU B1I DNAV utc model message received in channel " | ||||
|                       << d_channel | ||||
|                       << ": UTC model parameters from satellite " << d_satellite | ||||
|                       << " with CN0=" << std::setprecision(2) << cn0 << std::setprecision(default_precision) | ||||
|                       << " dB-Hz" << std::endl; | ||||
|         } | ||||
|     if (d_nav.have_new_iono() == true) | ||||
|         { | ||||
|             // get object for this SV (mandatory) | ||||
|             const std::shared_ptr<Beidou_Dnav_Iono> tmp_obj = std::make_shared<Beidou_Dnav_Iono>(d_nav.get_iono()); | ||||
|             this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); | ||||
|             LOG(INFO) << "BEIDOU DNAV Iono data have been received in channel" << d_channel << " from satellite " << d_satellite; | ||||
|             std::cout << "New BEIDOU B1I DNAV Iono message received in channel " << d_channel << ": Iono model parameters from satellite " << d_satellite << '\n'; | ||||
|             LOG(INFO) << "BEIDOU DNAV Iono data have been received in channel" << d_channel << " from satellite " << d_satellite << " with CN0=" << cn0 << " dB-Hz"; | ||||
|             const auto default_precision{std::cout.precision()}; | ||||
|             std::cout << "New BEIDOU B1I DNAV Iono message received in channel " << d_channel | ||||
|                       << ": Iono model parameters from satellite " << d_satellite | ||||
|                       << " with CN0=" << cn0 << std::setprecision(default_precision) | ||||
|                       << " dB-Hz" << std::endl; | ||||
|         } | ||||
|     if (d_nav.have_new_almanac() == true) | ||||
|         { | ||||
|             // uint32_t slot_nbr = d_nav.i_alm_satellite_PRN; | ||||
|             // std::shared_ptr<Beidou_Dnav_Almanac> tmp_obj = std::make_shared<Beidou_Dnav_Almanac>(d_nav.get_almanac(slot_nbr)); | ||||
|             // this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); | ||||
|             LOG(INFO) << "BEIDOU DNAV Almanac data have been received in channel" << d_channel << " from satellite " << d_satellite << '\n'; | ||||
|             std::cout << "New BEIDOU B1I DNAV almanac received in channel " << d_channel << " from satellite " << d_satellite << '\n'; | ||||
|             LOG(INFO) << "BEIDOU DNAV Almanac data have been received in channel" << d_channel << " from satellite " << d_satellite << " with CN0=" << cn0 << " dB-Hz"; | ||||
|             const auto default_precision{std::cout.precision()}; | ||||
|             std::cout << "New BEIDOU B1I DNAV almanac received in channel " << d_channel | ||||
|                       << " from satellite " << d_satellite | ||||
|                       << " with CN0=" << std::setprecision(2) << cn0 << std::setprecision(default_precision) | ||||
|                       << " dB-Hz" << std::endl; | ||||
|         } | ||||
| } | ||||
|  | ||||
| @@ -506,7 +524,7 @@ int beidou_b1i_telemetry_decoder_gs::general_work(int noutput_items __attribute_ | ||||
|                                 } | ||||
|  | ||||
|                             // call the decoder | ||||
|                             decode_subframe(d_subframe_symbols.data()); | ||||
|                             decode_subframe(d_subframe_symbols.data(), current_symbol.CN0_dB_hz); | ||||
|  | ||||
|                             if (d_nav.get_flag_CRC_test() == true) | ||||
|                                 { | ||||
| @@ -563,7 +581,7 @@ int beidou_b1i_telemetry_decoder_gs::general_work(int noutput_items __attribute_ | ||||
|                         } | ||||
|  | ||||
|                     // call the decoder | ||||
|                     decode_subframe(d_subframe_symbols.data()); | ||||
|                     decode_subframe(d_subframe_symbols.data(), current_symbol.CN0_dB_hz); | ||||
|  | ||||
|                     if (d_nav.get_flag_CRC_test() == true) | ||||
|                         { | ||||
|   | ||||
| @@ -75,7 +75,7 @@ private: | ||||
|  | ||||
|     beidou_b1i_telemetry_decoder_gs(const Gnss_Satellite &satellite, const Tlm_Conf &conf); | ||||
|  | ||||
|     void decode_subframe(float *symbols); | ||||
|     void decode_subframe(float *symbols, double cn0); | ||||
|     void decode_word(int32_t word_counter, const float *enc_word_symbols, int32_t *dec_word_symbols); | ||||
|     void decode_bch15_11_01(const int32_t *bits, std::array<int32_t, 15> &decbits); | ||||
|  | ||||
|   | ||||
| @@ -32,6 +32,7 @@ | ||||
| #include <cstddef>          // for size_t | ||||
| #include <cstdlib>          // for abs | ||||
| #include <exception>        // for exception | ||||
| #include <iomanip>          // for setprecision | ||||
| #include <iostream>         // for cout | ||||
| #include <memory>           // for shared_ptr, make_shared | ||||
|  | ||||
| @@ -239,7 +240,7 @@ void beidou_b3i_telemetry_decoder_gs::decode_word( | ||||
| } | ||||
|  | ||||
|  | ||||
| void beidou_b3i_telemetry_decoder_gs::decode_subframe(float *frame_symbols) | ||||
| void beidou_b3i_telemetry_decoder_gs::decode_subframe(float *frame_symbols, double cn0) | ||||
| { | ||||
|     // 1. Transform from symbols to bits | ||||
|     std::string data_bits; | ||||
| @@ -278,12 +279,12 @@ void beidou_b3i_telemetry_decoder_gs::decode_subframe(float *frame_symbols) | ||||
|     if (crc_ok) | ||||
|         { | ||||
|             DLOG(INFO) << "BeiDou DNAV CRC correct in channel " << d_channel | ||||
|                        << " from satellite " << d_satellite; | ||||
|                        << " from satellite " << d_satellite << " with CN0=" << cn0 << " dB-Hz"; | ||||
|         } | ||||
|     else | ||||
|         { | ||||
|             DLOG(INFO) << "BeiDou DNAV CRC error in channel " << d_channel | ||||
|                        << " from satellite " << d_satellite; | ||||
|                        << " from satellite " << d_satellite << " with CN0=" << cn0 << " dB-Hz"; | ||||
|         } | ||||
|     if (d_dump_crc_stats) | ||||
|         { | ||||
| @@ -298,9 +299,12 @@ void beidou_b3i_telemetry_decoder_gs::decode_subframe(float *frame_symbols) | ||||
|                 std::make_shared<Beidou_Dnav_Ephemeris>(d_nav.get_ephemeris()); | ||||
|             this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); | ||||
|             LOG(INFO) << "BEIDOU DNAV Ephemeris have been received in channel" | ||||
|                       << d_channel << " from satellite " << d_satellite; | ||||
|                       << d_channel << " from satellite " << d_satellite << " with CN0=" << cn0 << " dB-Hz"; | ||||
|             const auto default_precision{std::cout.precision()}; | ||||
|             std::cout << TEXT_YELLOW << "New BEIDOU B3I DNAV message received in channel " << d_channel | ||||
|                       << ": ephemeris from satellite " << d_satellite << TEXT_RESET << '\n'; | ||||
|                       << ": ephemeris from satellite " << d_satellite | ||||
|                       << " with CN0=" << std::setprecision(2) << cn0 << std::setprecision(default_precision) | ||||
|                       << " dB-Hz" << TEXT_RESET << std::endl; | ||||
|         } | ||||
|     if (d_nav.have_new_utc_model() == true) | ||||
|         { | ||||
| @@ -310,9 +314,12 @@ void beidou_b3i_telemetry_decoder_gs::decode_subframe(float *frame_symbols) | ||||
|             this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); | ||||
|             LOG(INFO) << "BEIDOU DNAV UTC Model data have been received in channel" | ||||
|                       << d_channel << " from satellite " << d_satellite; | ||||
|             const auto default_precision{std::cout.precision()}; | ||||
|             std::cout << TEXT_YELLOW << "New BEIDOU B3I DNAV utc model message received in channel " | ||||
|                       << d_channel << ": UTC model parameters from satellite " | ||||
|                       << d_satellite << TEXT_RESET << '\n'; | ||||
|                       << d_satellite | ||||
|                       << " with CN0=" << std::setprecision(2) << cn0 << std::setprecision(default_precision) | ||||
|                       << " dB-Hz" << TEXT_RESET << std::endl; | ||||
|         } | ||||
|     if (d_nav.have_new_iono() == true) | ||||
|         { | ||||
| @@ -321,10 +328,12 @@ void beidou_b3i_telemetry_decoder_gs::decode_subframe(float *frame_symbols) | ||||
|                 std::make_shared<Beidou_Dnav_Iono>(d_nav.get_iono()); | ||||
|             this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); | ||||
|             LOG(INFO) << "BEIDOU DNAV Iono data have been received in channel" << d_channel | ||||
|                       << " from satellite " << d_satellite; | ||||
|                       << " from satellite " << d_satellite << " with CN0=" << cn0 << " dB-Hz"; | ||||
|             const auto default_precision{std::cout.precision()}; | ||||
|             std::cout << TEXT_YELLOW << "New BEIDOU B3I DNAV Iono message received in channel " | ||||
|                       << d_channel << ": Iono model parameters from satellite " | ||||
|                       << d_satellite << TEXT_RESET << '\n'; | ||||
|                       << d_satellite << " with CN0=" << std::setprecision(2) << cn0 << std::setprecision(default_precision) | ||||
|                       << " dB-Hz" << TEXT_RESET << std::endl; | ||||
|         } | ||||
|     if (d_nav.have_new_almanac() == true) | ||||
|         { | ||||
| @@ -334,9 +343,12 @@ void beidou_b3i_telemetry_decoder_gs::decode_subframe(float *frame_symbols) | ||||
|             //            this->message_port_pub(pmt::mp("telemetry"), | ||||
|             //            pmt::make_any(tmp_obj)); | ||||
|             LOG(INFO) << "BEIDOU DNAV Almanac data have been received in channel" | ||||
|                       << d_channel << " from satellite " << d_satellite << '\n'; | ||||
|                       << d_channel << " from satellite " << d_satellite << " with CN0=" << cn0 << " dB-Hz"; | ||||
|             const auto default_precision{std::cout.precision()}; | ||||
|             std::cout << TEXT_YELLOW << "New BEIDOU B3I DNAV almanac received in channel " << d_channel | ||||
|                       << " from satellite " << d_satellite << TEXT_RESET << '\n'; | ||||
|                       << " from satellite " << d_satellite | ||||
|                       << " with CN0=" << std::setprecision(2) << cn0 << std::setprecision(default_precision) | ||||
|                       << " dB-Hz" << TEXT_RESET << std::endl; | ||||
|         } | ||||
| } | ||||
|  | ||||
| @@ -530,7 +542,7 @@ int beidou_b3i_telemetry_decoder_gs::general_work( | ||||
|                                 } | ||||
|  | ||||
|                             // call the decoder | ||||
|                             decode_subframe(d_subframe_symbols.data()); | ||||
|                             decode_subframe(d_subframe_symbols.data(), current_symbol.CN0_dB_hz); | ||||
|  | ||||
|                             if (d_nav.get_flag_CRC_test() == true) | ||||
|                                 { | ||||
| @@ -590,7 +602,7 @@ int beidou_b3i_telemetry_decoder_gs::general_work( | ||||
|                         } | ||||
|  | ||||
|                     // call the decoder | ||||
|                     decode_subframe(d_subframe_symbols.data()); | ||||
|                     decode_subframe(d_subframe_symbols.data(), current_symbol.CN0_dB_hz); | ||||
|  | ||||
|                     if (d_nav.get_flag_CRC_test() == true) | ||||
|                         { | ||||
|   | ||||
| @@ -73,7 +73,7 @@ private: | ||||
|  | ||||
|     beidou_b3i_telemetry_decoder_gs(const Gnss_Satellite &satellite, const Tlm_Conf &conf); | ||||
|  | ||||
|     void decode_subframe(float *symbols); | ||||
|     void decode_subframe(float *symbols, double cn0); | ||||
|     void decode_word(int32_t word_counter, const float *enc_word_symbols, | ||||
|         int32_t *dec_word_symbols); | ||||
|     void decode_bch15_11_01(const int32_t *bits, std::array<int32_t, 15> &decbits); | ||||
|   | ||||
| @@ -41,6 +41,7 @@ | ||||
| #include <cmath>                     // for std::fmod, std::abs | ||||
| #include <cstddef>                   // for size_t | ||||
| #include <exception>                 // for std::exception | ||||
| #include <iomanip>                   // for std::setprecision | ||||
| #include <iostream>                  // for std::cout | ||||
| #include <limits>                    // for std::numeric_limits | ||||
| #include <map>                       // for std::map | ||||
| @@ -350,7 +351,7 @@ void galileo_telemetry_decoder_gs::deinterleaver(int32_t rows, int32_t cols, con | ||||
| } | ||||
|  | ||||
|  | ||||
| void galileo_telemetry_decoder_gs::decode_INAV_word(float *page_part_symbols, int32_t frame_length) | ||||
| void galileo_telemetry_decoder_gs::decode_INAV_word(float *page_part_symbols, int32_t frame_length, double cn0) | ||||
| { | ||||
|     // 1. De-interleave | ||||
|     std::vector<float> page_part_symbols_soft_value(frame_length); | ||||
| @@ -431,11 +432,20 @@ void galileo_telemetry_decoder_gs::decode_INAV_word(float *page_part_symbols, in | ||||
|             const std::shared_ptr<Galileo_Ephemeris> tmp_obj = std::make_shared<Galileo_Ephemeris>(d_inav_nav.get_ephemeris()); | ||||
|             if (d_band == '1') | ||||
|                 { | ||||
|                     std::cout << "New Galileo E1 I/NAV message received in channel " << d_channel << ": ephemeris from satellite " << d_satellite << '\n'; | ||||
|                     const auto default_precision{std::cout.precision()}; | ||||
|                     std::cout << "New Galileo E1 I/NAV message received in channel " << d_channel | ||||
|                               << ": ephemeris from satellite " << d_satellite << " with CN0=" | ||||
|                               << std::setprecision(2) << cn0 << std::setprecision(default_precision) | ||||
|                               << " dB-Hz" << std::endl; | ||||
|                 } | ||||
|             else if (d_band == '7') | ||||
|                 { | ||||
|                     std::cout << TEXT_BLUE << "New Galileo E5b I/NAV message received in channel " << d_channel << ": ephemeris from satellite " << d_satellite << TEXT_RESET << '\n'; | ||||
|                     const auto default_precision{std::cout.precision()}; | ||||
|                     std::cout << TEXT_BLUE | ||||
|                               << "New Galileo E5b I/NAV message received in channel " << d_channel | ||||
|                               << ": ephemeris from satellite " << d_satellite << " with CN0=" | ||||
|                               << std::setprecision(2) << cn0 << std::setprecision(default_precision) | ||||
|                               << " dB-Hz" << TEXT_RESET << std::endl; | ||||
|                 } | ||||
|             this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); | ||||
|             d_first_eph_sent = true;  // do not send reduced CED anymore, since we have the full ephemeris set | ||||
| @@ -446,8 +456,12 @@ void galileo_telemetry_decoder_gs::decode_INAV_word(float *page_part_symbols, in | ||||
|             if ((d_band == '1') && d_use_ced && !d_first_eph_sent && (d_inav_nav.have_new_reduced_ced() == true)) | ||||
|                 { | ||||
|                     const std::shared_ptr<Galileo_Ephemeris> tmp_obj = std::make_shared<Galileo_Ephemeris>(d_inav_nav.get_reduced_ced()); | ||||
|                     std::cout << "New Galileo E1 I/NAV reduced CED message received in channel " << d_channel << " from satellite " << d_satellite << '\n'; | ||||
|                     this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); | ||||
|                     const auto default_precision{std::cout.precision()}; | ||||
|                     std::cout << "New Galileo E1 I/NAV reduced CED message received in channel " | ||||
|                               << d_channel << " from satellite " << d_satellite << " with CN0=" | ||||
|                               << std::setprecision(2) << cn0 << std::setprecision(default_precision) | ||||
|                               << " dB-Hz" << std::endl; | ||||
|                 } | ||||
|         } | ||||
|  | ||||
| @@ -455,30 +469,48 @@ void galileo_telemetry_decoder_gs::decode_INAV_word(float *page_part_symbols, in | ||||
|         { | ||||
|             // get object for this SV (mandatory) | ||||
|             const std::shared_ptr<Galileo_Iono> tmp_obj = std::make_shared<Galileo_Iono>(d_inav_nav.get_iono()); | ||||
|             this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); | ||||
|             if (d_band == '1') | ||||
|                 { | ||||
|                     std::cout << "New Galileo E1 I/NAV message received in channel " << d_channel << ": iono/GST model parameters from satellite " << d_satellite << '\n'; | ||||
|                     const auto default_precision{std::cout.precision()}; | ||||
|                     std::cout << "New Galileo E1 I/NAV message received in channel " << d_channel | ||||
|                               << ": iono/GST model parameters from satellite " << d_satellite | ||||
|                               << " with CN0=" << std::setprecision(2) << cn0 << std::setprecision(default_precision) | ||||
|                               << " dB-Hz" << std::endl; | ||||
|                 } | ||||
|             else if (d_band == '7') | ||||
|                 { | ||||
|                     std::cout << TEXT_BLUE << "New Galileo E5b I/NAV message received in channel " << d_channel << ": iono/GST model parameters from satellite " << d_satellite << TEXT_RESET << '\n'; | ||||
|                     const auto default_precision{std::cout.precision()}; | ||||
|                     std::cout << TEXT_BLUE << "New Galileo E5b I/NAV message received in channel " | ||||
|                               << d_channel << ": iono/GST model parameters from satellite " | ||||
|                               << d_satellite << " with CN0=" << std::setprecision(2) << cn0 << std::setprecision(default_precision) | ||||
|                               << " dB-Hz" << TEXT_RESET << std::endl; | ||||
|                 } | ||||
|             this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); | ||||
|         } | ||||
|  | ||||
|     if (d_inav_nav.have_new_utc_model() == true) | ||||
|         { | ||||
|             // get object for this SV (mandatory) | ||||
|             const std::shared_ptr<Galileo_Utc_Model> tmp_obj = std::make_shared<Galileo_Utc_Model>(d_inav_nav.get_utc_model()); | ||||
|             this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); | ||||
|             if (d_band == '1') | ||||
|                 { | ||||
|                     std::cout << "New Galileo E1 I/NAV message received in channel " << d_channel << ": UTC model parameters from satellite " << d_satellite << '\n'; | ||||
|                     const auto default_precision{std::cout.precision()}; | ||||
|                     std::cout << "New Galileo E1 I/NAV message received in channel " << d_channel | ||||
|                               << ": UTC model parameters from satellite " << d_satellite | ||||
|                               << " with CN0=" << std::setprecision(2) << cn0 << std::setprecision(default_precision) | ||||
|                               << " dB-Hz" << std::endl; | ||||
|                 } | ||||
|             else if (d_band == '7') | ||||
|                 { | ||||
|                     std::cout << TEXT_BLUE << "New Galileo E5b I/NAV message received in channel " << d_channel << ": UTC model parameters from satellite " << d_satellite << TEXT_RESET << '\n'; | ||||
|                     const auto default_precision{std::cout.precision()}; | ||||
|                     std::cout << TEXT_BLUE << "New Galileo E5b I/NAV message received in channel " | ||||
|                               << d_channel | ||||
|                               << ": UTC model parameters from satellite " << d_satellite | ||||
|                               << " with CN0=" << std::setprecision(2) << cn0 << std::setprecision(default_precision) | ||||
|                               << " dB-Hz" << TEXT_RESET << std::endl; | ||||
|                 } | ||||
|             this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); | ||||
|  | ||||
|             d_delta_t = tmp_obj->A_0G + tmp_obj->A_1G * (static_cast<double>(d_TOW_at_current_symbol_ms) / 1000.0 - tmp_obj->t_0G + 604800 * (std::fmod(static_cast<float>(d_inav_nav.get_Galileo_week() - tmp_obj->WN_0G), 64.0))); | ||||
|             DLOG(INFO) << "delta_t=" << d_delta_t << "[s]"; | ||||
|         } | ||||
| @@ -490,11 +522,18 @@ void galileo_telemetry_decoder_gs::decode_INAV_word(float *page_part_symbols, in | ||||
|             // debug | ||||
|             if (d_band == '1') | ||||
|                 { | ||||
|                     std::cout << "Galileo E1 I/NAV almanac received in channel " << d_channel << " from satellite " << d_satellite << '\n'; | ||||
|                     const auto default_precision{std::cout.precision()}; | ||||
|                     std::cout << "Galileo E1 I/NAV almanac received in channel " << d_channel | ||||
|                               << " from satellite " << d_satellite << " with CN0=" | ||||
|                               << std::setprecision(2) << cn0 << std::setprecision(default_precision) << " dB-Hz" << std::endl; | ||||
|                 } | ||||
|             else if (d_band == '7') | ||||
|                 { | ||||
|                     std::cout << TEXT_BLUE << "Galileo E5b I/NAV almanac received in channel " << d_channel << " from satellite " << d_satellite << TEXT_RESET << '\n'; | ||||
|                     const auto default_precision{std::cout.precision()}; | ||||
|                     std::cout << TEXT_BLUE << "Galileo E5b I/NAV almanac received in channel " | ||||
|                               << d_channel << " from satellite " << d_satellite << " with CN0=" | ||||
|                               << std::setprecision(2) << cn0 << std::setprecision(default_precision) | ||||
|                               << " dB-Hz" << TEXT_RESET << std::endl; | ||||
|                 } | ||||
|             DLOG(INFO) << "Current parameters:"; | ||||
|             DLOG(INFO) << "d_TOW_at_current_symbol_ms=" << d_TOW_at_current_symbol_ms; | ||||
| @@ -503,7 +542,7 @@ void galileo_telemetry_decoder_gs::decode_INAV_word(float *page_part_symbols, in | ||||
| } | ||||
|  | ||||
|  | ||||
| void galileo_telemetry_decoder_gs::decode_FNAV_word(float *page_symbols, int32_t frame_length) | ||||
| void galileo_telemetry_decoder_gs::decode_FNAV_word(float *page_symbols, int32_t frame_length, double cn0) | ||||
| { | ||||
|     // 1. De-interleave | ||||
|     std::vector<float> page_symbols_soft_value(frame_length); | ||||
| @@ -547,38 +586,51 @@ void galileo_telemetry_decoder_gs::decode_FNAV_word(float *page_symbols, int32_t | ||||
|     d_fnav_nav.split_page(page_String); | ||||
|     if (d_fnav_nav.get_flag_CRC_test() == true) | ||||
|         { | ||||
|             DLOG(INFO) << "Galileo E5a CRC correct in channel " << d_channel << " from satellite " << d_satellite; | ||||
|             DLOG(INFO) << "Galileo E5a CRC correct in channel " << d_channel << " from satellite " << d_satellite << " with CN0=" << cn0 << " dB-Hz"; | ||||
|         } | ||||
|     else | ||||
|         { | ||||
|             DLOG(INFO) << "Galileo E5a CRC error in channel " << d_channel << " from satellite " << d_satellite; | ||||
|             DLOG(INFO) << "Galileo E5a CRC error in channel " << d_channel << " from satellite " << d_satellite << " with CN0=" << cn0 << " dB-Hz"; | ||||
|         } | ||||
|  | ||||
|     // 4. Push the new navigation data to the queues | ||||
|     if (d_fnav_nav.have_new_ephemeris() == true) | ||||
|         { | ||||
|             const std::shared_ptr<Galileo_Ephemeris> tmp_obj = std::make_shared<Galileo_Ephemeris>(d_fnav_nav.get_ephemeris()); | ||||
|             std::cout << TEXT_MAGENTA << "New Galileo E5a F/NAV message received in channel " << d_channel << ": ephemeris from satellite " << d_satellite << TEXT_RESET << '\n'; | ||||
|             this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); | ||||
|             const auto default_precision{std::cout.precision()}; | ||||
|             std::cout << TEXT_MAGENTA << "New Galileo E5a F/NAV message received in channel " | ||||
|                       << d_channel << ": ephemeris from satellite " << d_satellite << " with CN0=" << std::setprecision(2) << cn0 | ||||
|                       << " dB-Hz" << TEXT_RESET << std::endl; | ||||
|             std::cout << std::setprecision(default_precision);  // restore defaults | ||||
|         } | ||||
|  | ||||
|     if (d_fnav_nav.have_new_iono_and_GST() == true) | ||||
|         { | ||||
|             const std::shared_ptr<Galileo_Iono> tmp_obj = std::make_shared<Galileo_Iono>(d_fnav_nav.get_iono()); | ||||
|             std::cout << TEXT_MAGENTA << "New Galileo E5a F/NAV message received in channel " << d_channel << ": iono/GST model parameters from satellite " << d_satellite << TEXT_RESET << '\n'; | ||||
|             this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); | ||||
|             const auto default_precision{std::cout.precision()}; | ||||
|             std::cout << TEXT_MAGENTA << "New Galileo E5a F/NAV message received in channel " | ||||
|                       << d_channel << ": iono/GST model parameters from satellite " << d_satellite | ||||
|                       << " with CN0=" << std::setprecision(2) << cn0 | ||||
|                       << " dB-Hz" << TEXT_RESET << std::endl; | ||||
|             std::cout << std::setprecision(default_precision);  // restore defaults | ||||
|         } | ||||
|  | ||||
|     if (d_fnav_nav.have_new_utc_model() == true) | ||||
|         { | ||||
|             const std::shared_ptr<Galileo_Utc_Model> tmp_obj = std::make_shared<Galileo_Utc_Model>(d_fnav_nav.get_utc_model()); | ||||
|             std::cout << TEXT_MAGENTA << "New Galileo E5a F/NAV message received in channel " << d_channel << ": UTC model parameters from satellite " << d_satellite << TEXT_RESET << '\n'; | ||||
|             this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); | ||||
|             const auto default_precision{std::cout.precision()}; | ||||
|             std::cout << TEXT_MAGENTA << "New Galileo E5a F/NAV message received in channel " | ||||
|                       << d_channel << ": UTC model parameters from satellite " << d_satellite | ||||
|                       << " dB-Hz" << TEXT_RESET << std::endl; | ||||
|             std::cout << std::setprecision(default_precision);  // restore defaults | ||||
|         } | ||||
| } | ||||
|  | ||||
|  | ||||
| void galileo_telemetry_decoder_gs::decode_CNAV_word(uint64_t time_stamp, float *page_symbols, int32_t page_length) | ||||
| void galileo_telemetry_decoder_gs::decode_CNAV_word(uint64_t time_stamp, float *page_symbols, int32_t page_length, double cn0) | ||||
| { | ||||
|     // 1. De-interleave | ||||
|     std::vector<float> page_symbols_soft_value(page_length); | ||||
| @@ -630,9 +682,13 @@ void galileo_telemetry_decoder_gs::decode_CNAV_word(uint64_t time_stamp, float * | ||||
|                     if (is_page_dummy != d_cnav_dummy_page) | ||||
|                         { | ||||
|                             d_cnav_dummy_page = is_page_dummy; | ||||
|                             const auto default_precision{std::cout.precision()}; | ||||
|                             std::cout << TEXT_MAGENTA << "Receiving Galileo E6 CNAV dummy pages in channel " | ||||
|                                       << d_channel << " from satellite " << d_satellite | ||||
|                                       << TEXT_RESET << '\n'; | ||||
|                                       << d_channel << " from satellite " | ||||
|                                       << d_satellite << " with CN0=" | ||||
|                                       << std::setprecision(2) << cn0 << " dB-Hz" | ||||
|                                       << TEXT_RESET << std::endl; | ||||
|                             std::cout << std::setprecision(default_precision);  // restore defaults | ||||
|                         } | ||||
|                 } | ||||
|             else | ||||
| @@ -646,10 +702,12 @@ void galileo_telemetry_decoder_gs::decode_CNAV_word(uint64_t time_stamp, float * | ||||
|                     if (d_print_cnav_page == true) | ||||
|                         { | ||||
|                             d_print_cnav_page = false;  // only print the first page | ||||
|                             const auto default_precision{std::cout.precision()}; | ||||
|                             std::cout << TEXT_MAGENTA << "Receiving Galileo E6 HAS pages" | ||||
|                                       << (d_cnav_nav.is_HAS_in_test_mode() == true ? " (test mode) " : " ") | ||||
|                                       << "in channel " << d_channel << " from satellite " << d_satellite | ||||
|                                       << TEXT_RESET << '\n'; | ||||
|                                       << "in channel " << d_channel << " from satellite " << d_satellite << " with CN0=" << std::setprecision(2) << cn0 << " dB-Hz" | ||||
|                                       << TEXT_RESET << std::endl; | ||||
|                             std::cout << std::setprecision(default_precision);  // restore defaults | ||||
|                         } | ||||
|                 } | ||||
|         } | ||||
| @@ -912,13 +970,13 @@ int galileo_telemetry_decoder_gs::general_work(int noutput_items __attribute__(( | ||||
|                     switch (d_frame_type) | ||||
|                         { | ||||
|                         case 1:  // INAV | ||||
|                             decode_INAV_word(d_page_part_symbols.data(), d_frame_length_symbols); | ||||
|                             decode_INAV_word(d_page_part_symbols.data(), d_frame_length_symbols, current_symbol.CN0_dB_hz); | ||||
|                             break; | ||||
|                         case 2:  // FNAV | ||||
|                             decode_FNAV_word(d_page_part_symbols.data(), d_frame_length_symbols); | ||||
|                             decode_FNAV_word(d_page_part_symbols.data(), d_frame_length_symbols, current_symbol.CN0_dB_hz); | ||||
|                             break; | ||||
|                         case 3:  // CNAV | ||||
|                             decode_CNAV_word(current_symbol.Tracking_sample_counter / static_cast<uint64_t>(current_symbol.fs), d_page_part_symbols.data(), d_frame_length_symbols); | ||||
|                             decode_CNAV_word(current_symbol.Tracking_sample_counter / static_cast<uint64_t>(current_symbol.fs), d_page_part_symbols.data(), d_frame_length_symbols, current_symbol.CN0_dB_hz); | ||||
|                             break; | ||||
|                         default: | ||||
|                             return -1; | ||||
|   | ||||
| @@ -82,9 +82,9 @@ private: | ||||
|  | ||||
|     void msg_handler_read_galileo_tow_map(const pmt::pmt_t &msg); | ||||
|     void deinterleaver(int32_t rows, int32_t cols, const float *in, float *out); | ||||
|     void decode_INAV_word(float *page_part_symbols, int32_t frame_length); | ||||
|     void decode_FNAV_word(float *page_symbols, int32_t frame_length); | ||||
|     void decode_CNAV_word(uint64_t time_stamp, float *page_symbols, int32_t page_length); | ||||
|     void decode_INAV_word(float *page_part_symbols, int32_t frame_length, double cn0); | ||||
|     void decode_FNAV_word(float *page_symbols, int32_t frame_length, double cn0); | ||||
|     void decode_CNAV_word(uint64_t time_stamp, float *page_symbols, int32_t page_length, double cn0); | ||||
|  | ||||
|     std::unique_ptr<Viterbi_Decoder> d_viterbi; | ||||
|     std::vector<int32_t> d_preamble_samples; | ||||
|   | ||||
| @@ -30,6 +30,7 @@ | ||||
| #include <cstddef>          // for size_t | ||||
| #include <cstdlib>          // for abs | ||||
| #include <exception>        // for exception | ||||
| #include <iomanip>          // for std::setprecision | ||||
| #include <iostream>         // for cout | ||||
| #include <memory>           // for shared_ptr, make_shared | ||||
|  | ||||
| @@ -152,7 +153,7 @@ glonass_l1_ca_telemetry_decoder_gs::~glonass_l1_ca_telemetry_decoder_gs() | ||||
| } | ||||
|  | ||||
|  | ||||
| void glonass_l1_ca_telemetry_decoder_gs::decode_string(const double *frame_symbols, int32_t frame_length) | ||||
| void glonass_l1_ca_telemetry_decoder_gs::decode_string(const double *frame_symbols, int32_t frame_length, double cn0) | ||||
| { | ||||
|     double chip_acc = 0.0; | ||||
|     int32_t chip_acc_counter = 0; | ||||
| @@ -238,7 +239,11 @@ void glonass_l1_ca_telemetry_decoder_gs::decode_string(const double *frame_symbo | ||||
|             const std::shared_ptr<Glonass_Gnav_Ephemeris> tmp_obj = std::make_shared<Glonass_Gnav_Ephemeris>(d_nav.get_ephemeris()); | ||||
|             this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); | ||||
|             LOG(INFO) << "GLONASS GNAV Ephemeris have been received in channel" << d_channel << " from satellite " << d_satellite; | ||||
|             std::cout << "New GLONASS L1 GNAV message received in channel " << d_channel << ": ephemeris from satellite " << d_satellite << '\n'; | ||||
|             const auto default_precision{std::cout.precision()}; | ||||
|             std::cout << "New GLONASS L1 GNAV message received in channel " << d_channel | ||||
|                       << ": ephemeris from satellite " << d_satellite | ||||
|                       << " with CN0=" << std::setprecision(2) << cn0 << std::setprecision(default_precision) | ||||
|                       << " dB-Hz" << std::endl; | ||||
|         } | ||||
|     if (d_nav.have_new_utc_model() == true) | ||||
|         { | ||||
| @@ -246,7 +251,11 @@ void glonass_l1_ca_telemetry_decoder_gs::decode_string(const double *frame_symbo | ||||
|             const std::shared_ptr<Glonass_Gnav_Utc_Model> tmp_obj = std::make_shared<Glonass_Gnav_Utc_Model>(d_nav.get_utc_model()); | ||||
|             this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); | ||||
|             LOG(INFO) << "GLONASS GNAV UTC Model data have been received in channel" << d_channel << " from satellite " << d_satellite; | ||||
|             std::cout << "New GLONASS L1 GNAV message received in channel " << d_channel << ": UTC model parameters from satellite " << d_satellite << '\n'; | ||||
|             const auto default_precision{std::cout.precision()}; | ||||
|             std::cout << "New GLONASS L1 GNAV message received in channel " << d_channel | ||||
|                       << ": UTC model parameters from satellite " << d_satellite | ||||
|                       << " with CN0=" << std::setprecision(2) << cn0 << std::setprecision(default_precision) | ||||
|                       << " dB-Hz" << std::endl; | ||||
|         } | ||||
|     if (d_nav.have_new_almanac() == true) | ||||
|         { | ||||
| @@ -255,7 +264,10 @@ void glonass_l1_ca_telemetry_decoder_gs::decode_string(const double *frame_symbo | ||||
|                 tmp_obj = std::make_shared<Glonass_Gnav_Almanac>(d_nav.get_almanac(slot_nbr)); | ||||
|             this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); | ||||
|             LOG(INFO) << "GLONASS GNAV Almanac data have been received in channel" << d_channel << " in slot number " << slot_nbr; | ||||
|             std::cout << "New GLONASS L1 GNAV almanac received in channel " << d_channel << " from satellite " << d_satellite << '\n'; | ||||
|             const auto default_precision{std::cout.precision()}; | ||||
|             std::cout << "New GLONASS L1 GNAV almanac received in channel " << d_channel << " from satellite " << d_satellite | ||||
|                       << " with CN0=" << std::setprecision(2) << cn0 << std::setprecision(default_precision) | ||||
|                       << " dB-Hz" << std::endl; | ||||
|         } | ||||
|     // 5. Update satellite information on system | ||||
|     if (d_nav.get_flag_update_slot_number() == true) | ||||
| @@ -405,7 +417,7 @@ int glonass_l1_ca_telemetry_decoder_gs::general_work(int noutput_items __attribu | ||||
|                         } | ||||
|  | ||||
|                     // call the decoder | ||||
|                     decode_string(string_symbols.data(), string_length); | ||||
|                     decode_string(string_symbols.data(), string_length, current_symbol.CN0_dB_hz); | ||||
|                     bool crc_ok = d_nav.get_flag_CRC_test(); | ||||
|                     if (crc_ok == true) | ||||
|                         { | ||||
|   | ||||
| @@ -81,7 +81,7 @@ private: | ||||
|  | ||||
|     const int32_t d_symbols_per_preamble = GLONASS_GNAV_PREAMBLE_LENGTH_SYMBOLS; | ||||
|  | ||||
|     void decode_string(const double *symbols, int32_t frame_length); | ||||
|     void decode_string(const double *symbols, int32_t frame_length, double cn0); | ||||
|  | ||||
|     // Help with coherent tracking | ||||
|  | ||||
|   | ||||
| @@ -30,6 +30,7 @@ | ||||
| #include <cstddef>          // for size_t | ||||
| #include <cstdlib>          // for abs | ||||
| #include <exception>        // for exception | ||||
| #include <iomanip>          // for std::setprecision | ||||
| #include <iostream>         // for cout | ||||
| #include <memory>           // for shared_ptr, make_shared | ||||
|  | ||||
| @@ -152,7 +153,7 @@ glonass_l2_ca_telemetry_decoder_gs::~glonass_l2_ca_telemetry_decoder_gs() | ||||
| } | ||||
|  | ||||
|  | ||||
| void glonass_l2_ca_telemetry_decoder_gs::decode_string(const double *frame_symbols, int32_t frame_length) | ||||
| void glonass_l2_ca_telemetry_decoder_gs::decode_string(const double *frame_symbols, int32_t frame_length, double cn0) | ||||
| { | ||||
|     double chip_acc = 0.0; | ||||
|     int32_t chip_acc_counter = 0; | ||||
| @@ -238,7 +239,11 @@ void glonass_l2_ca_telemetry_decoder_gs::decode_string(const double *frame_symbo | ||||
|             const std::shared_ptr<Glonass_Gnav_Ephemeris> tmp_obj = std::make_shared<Glonass_Gnav_Ephemeris>(d_nav.get_ephemeris()); | ||||
|             this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); | ||||
|             LOG(INFO) << "GLONASS GNAV Ephemeris have been received in channel" << d_channel << " from satellite " << d_satellite; | ||||
|             std::cout << TEXT_CYAN << "New GLONASS L2 GNAV message received in channel " << d_channel << ": ephemeris from satellite " << d_satellite << TEXT_RESET << '\n'; | ||||
|             const auto default_precision{std::cout.precision()}; | ||||
|             std::cout << TEXT_CYAN << "New GLONASS L2 GNAV message received in channel " << d_channel | ||||
|                       << ": ephemeris from satellite " << d_satellite | ||||
|                       << " with CN0=" << std::setprecision(2) << cn0 << std::setprecision(default_precision) | ||||
|                       << " dB-Hz" << TEXT_RESET << std::endl; | ||||
|         } | ||||
|     if (d_nav.have_new_utc_model() == true) | ||||
|         { | ||||
| @@ -246,7 +251,11 @@ void glonass_l2_ca_telemetry_decoder_gs::decode_string(const double *frame_symbo | ||||
|             const std::shared_ptr<Glonass_Gnav_Utc_Model> tmp_obj = std::make_shared<Glonass_Gnav_Utc_Model>(d_nav.get_utc_model()); | ||||
|             this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); | ||||
|             LOG(INFO) << "GLONASS GNAV UTC Model data have been received in channel" << d_channel << " from satellite " << d_satellite; | ||||
|             std::cout << TEXT_CYAN << "New GLONASS L2 GNAV message received in channel " << d_channel << ": UTC model parameters from satellite " << d_satellite << TEXT_RESET << '\n'; | ||||
|             const auto default_precision{std::cout.precision()}; | ||||
|             std::cout << TEXT_CYAN << "New GLONASS L2 GNAV message received in channel " << d_channel | ||||
|                       << ": UTC model parameters from satellite " << d_satellite | ||||
|                       << " with CN0=" << std::setprecision(2) << cn0 << std::setprecision(default_precision) | ||||
|                       << " dB-Hz" << TEXT_RESET << std::endl; | ||||
|         } | ||||
|     if (d_nav.have_new_almanac() == true) | ||||
|         { | ||||
| @@ -254,7 +263,11 @@ void glonass_l2_ca_telemetry_decoder_gs::decode_string(const double *frame_symbo | ||||
|             const std::shared_ptr<Glonass_Gnav_Almanac> tmp_obj = std::make_shared<Glonass_Gnav_Almanac>(d_nav.get_almanac(slot_nbr)); | ||||
|             this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); | ||||
|             LOG(INFO) << "GLONASS GNAV Almanac data have been received in channel" << d_channel << " in slot number " << slot_nbr; | ||||
|             std::cout << TEXT_CYAN << "New GLONASS L2 GNAV almanac received in channel " << d_channel << " from satellite " << d_satellite << TEXT_RESET << '\n'; | ||||
|             const auto default_precision{std::cout.precision()}; | ||||
|             std::cout << TEXT_CYAN << "New GLONASS L2 GNAV almanac received in channel " << d_channel | ||||
|                       << " from satellite " << d_satellite | ||||
|                       << " with CN0=" << std::setprecision(2) << cn0 << std::setprecision(default_precision) | ||||
|                       << " dB-Hz" << TEXT_RESET << std::endl; | ||||
|         } | ||||
|     // 5. Update satellite information on system | ||||
|     if (d_nav.get_flag_update_slot_number() == true) | ||||
| @@ -404,7 +417,7 @@ int glonass_l2_ca_telemetry_decoder_gs::general_work(int noutput_items __attribu | ||||
|                         } | ||||
|  | ||||
|                     // call the decoder | ||||
|                     decode_string(string_symbols.data(), string_length); | ||||
|                     decode_string(string_symbols.data(), string_length, current_symbol.CN0_dB_hz); | ||||
|                     if (d_nav.get_flag_CRC_test() == true) | ||||
|                         { | ||||
|                             d_CRC_error_counter = 0; | ||||
|   | ||||
| @@ -79,7 +79,7 @@ private: | ||||
|  | ||||
|     const int32_t d_symbols_per_preamble = GLONASS_GNAV_PREAMBLE_LENGTH_SYMBOLS; | ||||
|  | ||||
|     void decode_string(const double *symbols, int32_t frame_length); | ||||
|     void decode_string(const double *symbols, int32_t frame_length, double cn0); | ||||
|  | ||||
|     // Storage for incoming data | ||||
|     boost::circular_buffer<Gnss_Synchro> d_symbol_history; | ||||
|   | ||||
| @@ -33,6 +33,7 @@ | ||||
| #include <cstddef>          // for size_t | ||||
| #include <cstring>          // for memcpy | ||||
| #include <exception>        // for exception | ||||
| #include <iomanip>          // for setprecision | ||||
| #include <iostream>         // for cout | ||||
| #include <memory>           // for shared_ptr | ||||
| #include <vector> | ||||
| @@ -254,7 +255,7 @@ void gps_l1_ca_telemetry_decoder_gs::set_channel(int32_t channel) | ||||
| } | ||||
|  | ||||
|  | ||||
| bool gps_l1_ca_telemetry_decoder_gs::decode_subframe(bool flag_invert) | ||||
| bool gps_l1_ca_telemetry_decoder_gs::decode_subframe(double cn0, bool flag_invert) | ||||
| { | ||||
|     std::array<char, GPS_SUBFRAME_LENGTH> subframe{}; | ||||
|     int32_t frame_bit_index = 0; | ||||
| @@ -350,11 +351,6 @@ bool gps_l1_ca_telemetry_decoder_gs::decode_subframe(bool flag_invert) | ||||
|             const int32_t subframe_ID = d_nav.subframe_decoder(subframe.data());  // decode the subframe | ||||
|             if (subframe_ID > 0 && subframe_ID < 6) | ||||
|                 { | ||||
|                     std::cout << "New GPS NAV message received in channel " << this->d_channel << ": " | ||||
|                               << "subframe " | ||||
|                               << subframe_ID << " from satellite " | ||||
|                               << Gnss_Satellite(std::string("GPS"), d_nav.get_satellite_PRN()) << '\n'; | ||||
|  | ||||
|                     switch (subframe_ID) | ||||
|                         { | ||||
|                         case 1: | ||||
| @@ -401,6 +397,13 @@ bool gps_l1_ca_telemetry_decoder_gs::decode_subframe(bool flag_invert) | ||||
|                         default: | ||||
|                             break; | ||||
|                         } | ||||
|                     const auto default_precision{std::cout.precision()}; | ||||
|                     std::cout << "New GPS NAV message received in channel " << this->d_channel << ": " | ||||
|                               << "subframe " | ||||
|                               << subframe_ID << " from satellite " | ||||
|                               << Gnss_Satellite(std::string("GPS"), d_nav.get_satellite_PRN()) | ||||
|                               << " with CN0=" << std::setprecision(2) << cn0 << std::setprecision(default_precision) | ||||
|                               << " dB-Hz" << std::endl; | ||||
|                     return true; | ||||
|                 } | ||||
|         } | ||||
| @@ -499,7 +502,7 @@ int gps_l1_ca_telemetry_decoder_gs::general_work(int noutput_items __attribute__ | ||||
|                             } | ||||
|                         DLOG(INFO) << "Preamble detection for GPS L1 satellite " << this->d_satellite; | ||||
|                         d_prev_GPS_frame_4bytes = 0; | ||||
|                         if (decode_subframe(d_flag_PLL_180_deg_phase_locked)) | ||||
|                         if (decode_subframe(current_symbol.CN0_dB_hz, d_flag_PLL_180_deg_phase_locked)) | ||||
|                             { | ||||
|                                 d_CRC_error_counter = 0; | ||||
|                                 d_flag_preamble = true;  // valid preamble indicator (initialized to false every work()) | ||||
| @@ -525,7 +528,7 @@ int gps_l1_ca_telemetry_decoder_gs::general_work(int noutput_items __attribute__ | ||||
|                         // 0. fetch the symbols into an array | ||||
|                         d_preamble_index = d_sample_counter;  // record the preamble sample stamp (t_P) | ||||
|  | ||||
|                         if (decode_subframe(d_flag_PLL_180_deg_phase_locked)) | ||||
|                         if (decode_subframe(current_symbol.CN0_dB_hz, d_flag_PLL_180_deg_phase_locked)) | ||||
|                             { | ||||
|                                 d_CRC_error_counter = 0; | ||||
|                                 d_flag_preamble = true;  // valid preamble indicator (initialized to false every work()) | ||||
|   | ||||
| @@ -74,7 +74,7 @@ private: | ||||
|     gps_l1_ca_telemetry_decoder_gs(const Gnss_Satellite &satellite, const Tlm_Conf &conf); | ||||
|  | ||||
|     bool gps_word_parityCheck(uint32_t gpsword); | ||||
|     bool decode_subframe(bool flag_invert); | ||||
|     bool decode_subframe(double cn0, bool flag_invert); | ||||
|  | ||||
|     Gps_Navigation_Message d_nav; | ||||
|     Gnss_Satellite d_satellite; | ||||
|   | ||||
| @@ -32,6 +32,7 @@ | ||||
| #include <cmath>            // for round | ||||
| #include <cstddef>          // for size_t | ||||
| #include <exception>        // for exception | ||||
| #include <iomanip>          // for setprecision | ||||
| #include <iostream>         // for cout | ||||
| #include <memory>           // for shared_ptr, make_shared | ||||
|  | ||||
| @@ -257,21 +258,33 @@ int gps_l2c_telemetry_decoder_gs::general_work(int noutput_items __attribute__(( | ||||
|                 { | ||||
|                     // get ephemeris object for this SV | ||||
|                     const std::shared_ptr<Gps_CNAV_Ephemeris> tmp_obj = std::make_shared<Gps_CNAV_Ephemeris>(d_CNAV_Message.get_ephemeris()); | ||||
|                     std::cout << TEXT_BLUE << "New GPS CNAV message received in channel " << d_channel << ": ephemeris from satellite " << d_satellite << TEXT_RESET << '\n'; | ||||
|                     this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); | ||||
|                     const auto default_precision{std::cout.precision()}; | ||||
|                     std::cout << TEXT_BLUE << "New GPS CNAV message received in channel " << d_channel | ||||
|                               << ": ephemeris from satellite " << d_satellite | ||||
|                               << " with CN0=" << std::setprecision(2) << current_synchro_data.CN0_dB_hz << std::setprecision(default_precision) | ||||
|                               << " dB-Hz" << TEXT_RESET << std::endl; | ||||
|                 } | ||||
|             if (d_CNAV_Message.have_new_iono() == true) | ||||
|                 { | ||||
|                     const std::shared_ptr<Gps_CNAV_Iono> tmp_obj = std::make_shared<Gps_CNAV_Iono>(d_CNAV_Message.get_iono()); | ||||
|                     std::cout << TEXT_BLUE << "New GPS CNAV message received in channel " << d_channel << ": iono model parameters from satellite " << d_satellite << TEXT_RESET << '\n'; | ||||
|                     this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); | ||||
|                     const auto default_precision{std::cout.precision()}; | ||||
|                     std::cout << TEXT_BLUE << "New GPS CNAV message received in channel " << d_channel | ||||
|                               << ": iono model parameters from satellite " << d_satellite | ||||
|                               << " with CN0=" << std::setprecision(2) << current_synchro_data.CN0_dB_hz << std::setprecision(default_precision) | ||||
|                               << " dB-Hz" << TEXT_RESET << std::endl; | ||||
|                 } | ||||
|  | ||||
|             if (d_CNAV_Message.have_new_utc_model() == true) | ||||
|                 { | ||||
|                     const std::shared_ptr<Gps_CNAV_Utc_Model> tmp_obj = std::make_shared<Gps_CNAV_Utc_Model>(d_CNAV_Message.get_utc_model()); | ||||
|                     std::cout << TEXT_BLUE << "New GPS CNAV message received in channel " << d_channel << ": UTC model parameters from satellite " << d_satellite << TEXT_RESET << '\n'; | ||||
|                     this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); | ||||
|                     const auto default_precision{std::cout.precision()}; | ||||
|                     std::cout << TEXT_BLUE << "New GPS CNAV message received in channel " << d_channel | ||||
|                               << ": UTC model parameters from satellite " << d_satellite | ||||
|                               << " with CN0=" << std::setprecision(2) << current_synchro_data.CN0_dB_hz << std::setprecision(default_precision) | ||||
|                               << " dB-Hz" << TEXT_RESET << std::endl; | ||||
|                 } | ||||
|  | ||||
|             // update TOW at the preamble instant | ||||
|   | ||||
| @@ -31,6 +31,7 @@ | ||||
| #include <cstddef>          // for size_t | ||||
| #include <cstdlib>          // for std::llabs | ||||
| #include <exception>        // for std::exception | ||||
| #include <iomanip>          // for std::setprecision | ||||
| #include <iostream>         // for std::cout | ||||
|  | ||||
| gps_l5_telemetry_decoder_gs_sptr | ||||
| @@ -254,21 +255,33 @@ int gps_l5_telemetry_decoder_gs::general_work(int noutput_items __attribute__((u | ||||
|                 { | ||||
|                     // get ephemeris object for this SV | ||||
|                     const std::shared_ptr<Gps_CNAV_Ephemeris> tmp_obj = std::make_shared<Gps_CNAV_Ephemeris>(d_CNAV_Message.get_ephemeris()); | ||||
|                     std::cout << TEXT_MAGENTA << "New GPS L5 CNAV message received in channel " << d_channel << ": ephemeris from satellite " << d_satellite << TEXT_RESET << '\n'; | ||||
|                     this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); | ||||
|                     const auto default_precision{std::cout.precision()}; | ||||
|                     std::cout << TEXT_MAGENTA << "New GPS L5 CNAV message received in channel " << d_channel | ||||
|                               << ": ephemeris from satellite " << d_satellite | ||||
|                               << " with CN0=" << std::setprecision(2) << current_synchro_data.CN0_dB_hz | ||||
|                               << std::setprecision(default_precision) << " dB-Hz" << std::endl; | ||||
|                 } | ||||
|             if (d_CNAV_Message.have_new_iono() == true) | ||||
|                 { | ||||
|                     const std::shared_ptr<Gps_CNAV_Iono> tmp_obj = std::make_shared<Gps_CNAV_Iono>(d_CNAV_Message.get_iono()); | ||||
|                     std::cout << TEXT_MAGENTA << "New GPS L5 CNAV message received in channel " << d_channel << ": iono model parameters from satellite " << d_satellite << TEXT_RESET << '\n'; | ||||
|                     this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); | ||||
|                     const auto default_precision{std::cout.precision()}; | ||||
|                     std::cout << TEXT_MAGENTA << "New GPS L5 CNAV message received in channel " << d_channel | ||||
|                               << ": iono model parameters from satellite " << d_satellite | ||||
|                               << " with CN0=" << std::setprecision(2) << current_synchro_data.CN0_dB_hz << std::setprecision(default_precision) | ||||
|                               << " dB-Hz" << TEXT_RESET << std::endl; | ||||
|                 } | ||||
|  | ||||
|             if (d_CNAV_Message.have_new_utc_model() == true) | ||||
|                 { | ||||
|                     const std::shared_ptr<Gps_CNAV_Utc_Model> tmp_obj = std::make_shared<Gps_CNAV_Utc_Model>(d_CNAV_Message.get_utc_model()); | ||||
|                     std::cout << TEXT_MAGENTA << "New GPS L5 CNAV message received in channel " << d_channel << ": UTC model parameters from satellite " << d_satellite << TEXT_RESET << '\n'; | ||||
|                     this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj)); | ||||
|                     const auto default_precision{std::cout.precision()}; | ||||
|                     std::cout << TEXT_MAGENTA << "New GPS L5 CNAV message received in channel " << d_channel | ||||
|                               << ": UTC model parameters from satellite " << d_satellite | ||||
|                               << " with CN0=" << std::setprecision(2) << current_synchro_data.CN0_dB_hz | ||||
|                               << std::setprecision(default_precision) << " dB-Hz" << TEXT_RESET << std::endl; | ||||
|                 } | ||||
|  | ||||
|             // update TOW at the preamble instant | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Carles Fernandez
					Carles Fernandez