mirror of
				https://github.com/gnss-sdr/gnss-sdr
				synced 2025-10-31 07:13:03 +00:00 
			
		
		
		
	Minor changes
This commit is contained in:
		| @@ -35,7 +35,7 @@ obsd_t insert_obs_to_rtklib(obsd_t & rtklib_obs, const Gnss_Synchro & gnss_synch | ||||
| { | ||||
|     rtklib_obs.D[band] = gnss_synchro.Carrier_Doppler_hz; | ||||
|     rtklib_obs.P[band] = gnss_synchro.Pseudorange_m; | ||||
|     rtklib_obs.L[band] = gnss_synchro.Carrier_phase_rads / (2.0 * PI); | ||||
|     rtklib_obs.L[band] = gnss_synchro.Carrier_phase_rads / PI_2; | ||||
|     switch(band) | ||||
|     { | ||||
|         case 0: | ||||
| @@ -165,8 +165,6 @@ eph_t eph_to_rtklib(const Gps_Ephemeris & gps_eph) | ||||
|     rtklib_sat.toc = gpst2time(rtklib_sat.week, toc); | ||||
|     rtklib_sat.ttr = gpst2time(rtklib_sat.week, tow); | ||||
|  | ||||
|     //printf("EPHEMERIS TIME [%i]: %s,%f\n\r",rtklib_sat.sat,time_str(rtklib_sat.toe,3),rtklib_sat.toe.sec); | ||||
|  | ||||
|     return rtklib_sat; | ||||
| } | ||||
|  | ||||
| @@ -183,7 +181,7 @@ eph_t eph_to_rtklib(const Gps_CNAV_Ephemeris & gps_cnav_eph) | ||||
|     rtklib_sat.OMG0 = gps_cnav_eph.d_OMEGA0; | ||||
|     // Compute the angle between the ascending node and the Greenwich meridian | ||||
|     const double OMEGA_DOT_REF = -2.6e-9; // semicircles / s, see IS-GPS-200H pp. 164 | ||||
|     double d_OMEGA_DOT = OMEGA_DOT_REF * GPS_L2_PI + gps_cnav_eph.d_DELTA_OMEGA_DOT; | ||||
|     double d_OMEGA_DOT = OMEGA_DOT_REF * PI + gps_cnav_eph.d_DELTA_OMEGA_DOT; | ||||
|     rtklib_sat.OMGd = d_OMEGA_DOT; | ||||
|     rtklib_sat.omg = gps_cnav_eph.d_OMEGA; | ||||
|     rtklib_sat.i0 = gps_cnav_eph.d_i_0; | ||||
|   | ||||
| @@ -34,10 +34,6 @@ | ||||
| #include <gnuradio/io_signature.h> | ||||
| #include <glog/logging.h> | ||||
| #include "concurrent_queue.h" | ||||
| #include "gps_cnav_ephemeris.h" | ||||
| #include "gps_almanac.h" | ||||
| #include "gps_cnav_iono.h" | ||||
| #include "gps_cnav_utc_model.h" | ||||
| #include "configuration_interface.h" | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -36,6 +36,7 @@ | ||||
| #include <string> | ||||
| #include "telemetry_decoder_interface.h" | ||||
| #include "gps_l5_telemetry_decoder_cc.h" | ||||
| #include "gnss_satellite.h" | ||||
|  | ||||
|  | ||||
| class ConfigurationInterface; | ||||
|   | ||||
| @@ -37,6 +37,8 @@ | ||||
| #include <boost/lexical_cast.hpp> | ||||
| #include "gnss_synchro.h" | ||||
| #include "gps_l5_telemetry_decoder_cc.h" | ||||
| #include "gps_cnav_ephemeris.h" | ||||
| #include "gps_cnav_iono.h" | ||||
|  | ||||
| using google::LogMessage; | ||||
|  | ||||
| @@ -70,6 +72,19 @@ gps_l5_telemetry_decoder_cc::gps_l5_telemetry_decoder_cc( | ||||
|  | ||||
|     //initialize the CNAV frame decoder (libswiftcnav) | ||||
|     cnav_msg_decoder_init(&d_cnav_decoder); | ||||
|     for(int aux = 0; aux < GPS_L5_NH_CODE_LENGTH; aux++) | ||||
|         { | ||||
|             if(GPS_L5_NH_CODE[aux] == 0) | ||||
|                 { | ||||
|                     bits_NH[aux] = -1.0; | ||||
|                 } | ||||
|             else | ||||
|                 { | ||||
|                     bits_NH[aux] = 1.0; | ||||
|                 } | ||||
|         } | ||||
|     sync_NH = false; | ||||
|     new_sym = false; | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -96,26 +111,58 @@ int gps_l5_telemetry_decoder_cc::general_work (int noutput_items __attribute__(( | ||||
|     Gnss_Synchro *out = reinterpret_cast<Gnss_Synchro *>(output_items[0]);           // Get the output buffer pointer | ||||
|     const Gnss_Synchro *in = reinterpret_cast<const Gnss_Synchro *>(input_items[0]); // Get the input buffer pointer | ||||
|  | ||||
|     // UPDATE GNSS SYNCHRO DATA | ||||
|     Gnss_Synchro current_synchro_data; //structure to save the synchronization information and send the output object to the next block | ||||
|     //1. Copy the current tracking output | ||||
|     current_synchro_data = in[0]; | ||||
|     consume_each(1); //one by one | ||||
|     sym_hist.push_back(in[0].Prompt_I); | ||||
|     double symbol_value = 0.0; | ||||
|  | ||||
|     if(sym_hist.size() == GPS_L5_NH_CODE_LENGTH) | ||||
|         { | ||||
|             std::deque<double>::iterator it; | ||||
|             int corr_NH = 0; | ||||
|             it = sym_hist.begin(); | ||||
|             for(int i = 0; i < GPS_L5_NH_CODE_LENGTH; i++) | ||||
|                 { | ||||
|                     if((bits_NH[i] * (*it)) > 0.0){corr_NH += 1;} | ||||
|                     else{corr_NH -= 1;} | ||||
|                     it++; | ||||
|                 } | ||||
|             if(abs(corr_NH) == GPS_L5_NH_CODE_LENGTH){sync_NH = true;} | ||||
|             else | ||||
|                 { | ||||
|                     sym_hist.pop_front(); | ||||
|                     sync_NH = false; | ||||
|                 } | ||||
|             if (sync_NH) | ||||
|                 { | ||||
|                     new_sym = true; | ||||
|                     for(it = sym_hist.begin(); it != sym_hist.end(); it++) | ||||
|                         { | ||||
|                             symbol_value += (*it); | ||||
|                         } | ||||
|                     sym_hist.clear(); | ||||
|                 } | ||||
|         } | ||||
|  | ||||
|     bool flag_new_cnav_frame = false; | ||||
|     cnav_msg_t msg; | ||||
|     u32 delay = 0; | ||||
|  | ||||
|     //add the symbol to the decoder | ||||
|     u8 symbol_clip = static_cast<u8>(in[0].Prompt_I > 0) * 255; | ||||
|     if(new_sym) | ||||
|         { | ||||
|             u8 symbol_clip = static_cast<u8>(symbol_value > 0.0) * 255; | ||||
|             flag_new_cnav_frame = cnav_msg_decoder_add_symbol(&d_cnav_decoder, symbol_clip, &msg, &delay); | ||||
|  | ||||
|     consume_each(1); //one by one | ||||
|  | ||||
|     // UPDATE GNSS SYNCHRO DATA | ||||
|     Gnss_Synchro current_synchro_data; //structure to save the synchronization information and send the output object to the next block | ||||
|  | ||||
|     //1. Copy the current tracking output | ||||
|     current_synchro_data = in[0]; | ||||
|  | ||||
|             new_sym = false; | ||||
|         } | ||||
|     //2. Add the telemetry decoder information | ||||
|     //check if new CNAV frame is available | ||||
|     if (flag_new_cnav_frame == true) | ||||
|         { | ||||
|             std::cout << "NEW CNAV FRAME" << std::endl; | ||||
|             std::bitset<GPS_L5_CNAV_DATA_PAGE_BITS> raw_bits; | ||||
|             //Expand packet bits to bitsets. Notice the reverse order of the bits sequence, required by the CNAV message decoder | ||||
|             for (u32 i = 0; i < GPS_L5_CNAV_DATA_PAGE_BITS ; i++) | ||||
| @@ -169,12 +216,6 @@ int gps_l5_telemetry_decoder_cc::general_work (int noutput_items __attribute__(( | ||||
|     current_synchro_data.TOW_at_current_symbol_s = d_TOW_at_current_symbol; | ||||
|     current_synchro_data.Flag_valid_word = d_flag_valid_word; | ||||
|  | ||||
|     //    if (flag_PLL_180_deg_phase_locked == true) | ||||
|     //        { | ||||
|     //            //correct the accumulated phase for the Costas loop phase shift, if required | ||||
|     //            current_synchro_data.Carrier_phase_rads += GPS_PI; | ||||
|     //        } | ||||
|  | ||||
|     if(d_dump == true) | ||||
|         { | ||||
|             // MULTIPLEXED FILE RECORDING - Record results to file | ||||
|   | ||||
| @@ -31,17 +31,15 @@ | ||||
| #ifndef GNSS_SDR_GPS_L5_TELEMETRY_DECODER_CC_H | ||||
| #define GNSS_SDR_GPS_L5_TELEMETRY_DECODER_CC_H | ||||
|  | ||||
| #include <algorithm> // for copy | ||||
| #include <algorithm> | ||||
| #include <deque> | ||||
| #include <fstream> | ||||
| #include <string> | ||||
| #include <utility> // for pair | ||||
| #include <utility> | ||||
| #include <vector> | ||||
| #include <gnuradio/block.h> | ||||
| #include "gnss_satellite.h" | ||||
| #include "gps_cnav_navigation_message.h" | ||||
| #include "gps_cnav_ephemeris.h" | ||||
| #include "gps_cnav_iono.h" | ||||
| #include "concurrent_queue.h" | ||||
|  | ||||
| extern "C" { | ||||
| @@ -99,6 +97,10 @@ private: | ||||
|     bool d_flag_valid_word; | ||||
|  | ||||
|     Gps_CNAV_Navigation_Message d_CNAV_Message; | ||||
|     double bits_NH[GPS_L5_NH_CODE_LENGTH]; | ||||
|     std::deque<double> sym_hist; | ||||
|     bool sync_NH; | ||||
|     bool new_sym; | ||||
| }; | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -49,11 +49,9 @@ | ||||
|  */ | ||||
| /** Viterbi decoder reversed polynomial A */ | ||||
| #define GPS_L2C_V27_POLY_A       (0x4F) /* 0b01001111 - reversed 0171*/ | ||||
| #define GPS_L5_V27_POLY_A       (0x4F) /* 0b01001111 - reversed 0171*/ | ||||
|  | ||||
| /** Viterbi decoder reversed polynomial B */ | ||||
| #define GPS_L2C_V27_POLY_B       (0x6D) /* 0b01101101 - reversed 0133 */ | ||||
| #define GPS_L5_V27_POLY_B       (0x6D) /* 0b01101101 - reversed 0133 */ | ||||
| /* | ||||
|  * GPS L2C message constants. | ||||
|  */ | ||||
|   | ||||
| @@ -49,16 +49,12 @@ | ||||
|  | ||||
| /** Size of the Viterbi decoder history. */ | ||||
| #define GPS_L2_V27_HISTORY_LENGTH_BITS 64 | ||||
| #define GPS_L5_V27_HISTORY_LENGTH_BITS 64 | ||||
| /** Bits to accumulate before decoding starts. */ | ||||
| #define GPS_L2C_V27_INIT_BITS    (32) | ||||
| #define GPS_L5_V27_INIT_BITS    (32) | ||||
| /** Bits to decode at a time. */ | ||||
| #define GPS_L2C_V27_DECODE_BITS  (32) | ||||
| #define GPS_L5_V27_DECODE_BITS  (32) | ||||
| /** Bits in decoder tail. We ignore them. */ | ||||
| #define GPS_L2C_V27_DELAY_BITS   (32) | ||||
| #define GPS_L5_V27_DELAY_BITS   (32) | ||||
| /** | ||||
|  * GPS CNAV message container. | ||||
|  * | ||||
| @@ -73,15 +69,6 @@ typedef struct | ||||
|     u8   raw_msg[GPS_L2C_V27_DECODE_BITS + GPS_L2C_V27_DELAY_BITS]; /**< RAW MSG for GNSS-SDR */ | ||||
| } cnav_msg_t; | ||||
|  | ||||
| typedef struct | ||||
| { | ||||
|     u8   prn;    /**< SV PRN. 0..31 */ | ||||
|     u8   msg_id; /**< Message id. 0..31 */ | ||||
|     u32  tow;    /**< GPS ToW in 6-second units. Multiply to 6 to get seconds. */ | ||||
|     bool alert;  /**< CNAV message alert flag */ | ||||
|     u8   raw_msg[GPS_L5_V27_DECODE_BITS + GPS_L5_V27_DELAY_BITS]; /**< RAW MSG for GNSS-SDR */ | ||||
| } cnav_L5_msg_t; | ||||
|  | ||||
| /** | ||||
|  * GPS CNAV decoder component. | ||||
|  * This component controls symbol decoding string. | ||||
| @@ -109,27 +96,6 @@ typedef struct { | ||||
|      *   do not produce output. */ | ||||
| } cnav_v27_part_t; | ||||
|  | ||||
| typedef struct { | ||||
|     v27_t          dec;           /**< Viterbi block decoder object */ | ||||
|     v27_decision_t decisions[GPS_L5_V27_HISTORY_LENGTH_BITS]; | ||||
|     /**< Decision graph */ | ||||
|     unsigned char  symbols[(GPS_L5_V27_INIT_BITS + GPS_L5_V27_DECODE_BITS) * 2]; | ||||
|     /**< Symbol buffer */ | ||||
|     size_t         n_symbols;     /**< Count of symbols in the symbol buffer */ | ||||
|     unsigned char  decoded[GPS_L5_V27_DECODE_BITS + GPS_L5_V27_DELAY_BITS]; | ||||
|     /**< Decode buffer */ | ||||
|     size_t         n_decoded;     /**< Number of bits in the decode buffer */ | ||||
|     bool           preamble_seen; /**< When true, the decode buffer is aligned on | ||||
|      *   preamble. */ | ||||
|     bool           invert;        /**< When true, indicates the bits are inverted */ | ||||
|     bool           message_lock;  /**< When true, indicates the message boundary | ||||
|      *   is found. */ | ||||
|     bool           crc_ok;        /**< Flag that the last message had good CRC */ | ||||
|     size_t         n_crc_fail;    /**< Counter for CRC failures */ | ||||
|     bool           init;          /**< Initial state flag. When true, initial bits | ||||
|      *   do not produce output. */ | ||||
| } cnav_L5_v27_part_t; | ||||
|  | ||||
| /** | ||||
|  * GPS CNAV message lock and decoder object. | ||||
|  * | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /*! | ||||
|  * \file gps_l5idll_pll_tracking.cc | ||||
|  * \file gps_l5i_dll_pll_tracking.cc | ||||
|  * \brief  Interface of an adapter of a DLL+PLL tracking loop block | ||||
|  * for GPS L5i to a TrackingInterface | ||||
|  * \author Javier Arribas, 2017. jarribas(at)cttc.es | ||||
|   | ||||
| @@ -62,7 +62,7 @@ public: | ||||
|         return role_; | ||||
|     } | ||||
|  | ||||
|     //! Returns "GPS_L2_M_DLL_PLL_Tracking" | ||||
|     //! Returns "GPS_L5i_DLL_PLL_Tracking" | ||||
|     inline std::string implementation() override | ||||
|     { | ||||
|         return "GPS_L5i_DLL_PLL_Tracking"; | ||||
|   | ||||
| @@ -642,8 +642,8 @@ int Galileo_E5a_Dll_Pll_Tracking_cc::general_work (int noutput_items __attribute | ||||
|             // The first Prompt output not equal to 0 is synchronized with the transition of a navigation data bit. | ||||
|             if (d_secondary_lock && d_first_transition) | ||||
|                 { | ||||
|                     current_synchro_data.Prompt_I = static_cast<double>((d_Prompt_data).real()); | ||||
|                     current_synchro_data.Prompt_Q = static_cast<double>((d_Prompt_data).imag()); | ||||
|                     current_synchro_data.Prompt_I = static_cast<double>(d_Prompt_data.real()); | ||||
|                     current_synchro_data.Prompt_Q = static_cast<double>(d_Prompt_data.imag()); | ||||
|                     current_synchro_data.Tracking_sample_counter = d_sample_counter + d_current_prn_length_samples; | ||||
|                     current_synchro_data.Code_phase_samples = d_rem_code_phase_samples; | ||||
|                     current_synchro_data.Carrier_phase_rads = d_acc_carrier_phase_rad; | ||||
|   | ||||
| @@ -257,14 +257,14 @@ void gps_l5i_dll_pll_tracking_cc::start_tracking() | ||||
|     sys = sys_.substr(0,1); | ||||
|  | ||||
|     // DEBUG OUTPUT | ||||
|     std::cout << "Tracking of GPS L2CM signal started on channel " << d_channel << " for satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << std::endl; | ||||
|     LOG(INFO) << "Starting GPS L2CM tracking of satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << " on channel " << d_channel; | ||||
|     std::cout << "Tracking of GPS L5i signal started on channel " << d_channel << " for satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << std::endl; | ||||
|     LOG(INFO) << "Starting GPS L5i tracking of satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << " on channel " << d_channel; | ||||
|  | ||||
|     // enable tracking | ||||
|     d_pull_in = true; | ||||
|     d_enable_tracking = true; | ||||
|  | ||||
|     LOG(INFO) << "GPS L2CM PULL-IN Doppler [Hz]=" << d_carrier_doppler_hz | ||||
|     LOG(INFO) << "GPS L5i PULL-IN Doppler [Hz]=" << d_carrier_doppler_hz | ||||
|               << " Code Phase correction [samples]=" << delay_correction_samples | ||||
|               << " PULL-IN Code Phase [samples]=" << d_acq_code_phase_samples; | ||||
| } | ||||
|   | ||||
| @@ -240,6 +240,7 @@ std::unique_ptr<GNSSBlockInterface> GNSSBlockFactory::GetObservables(std::shared | ||||
|     Galileo_channels += configuration->property("Channels_5X.count", 0); | ||||
|     unsigned int GPS_channels = configuration->property("Channels_1C.count", 0); | ||||
|     GPS_channels += configuration->property("Channels_2S.count", 0); | ||||
|     GPS_channels += configuration->property("Channels_L5.count", 0); | ||||
|     return GetBlock(configuration, "Observables", implementation, Galileo_channels + GPS_channels, Galileo_channels + GPS_channels); | ||||
| } | ||||
|  | ||||
| @@ -254,6 +255,7 @@ std::unique_ptr<GNSSBlockInterface> GNSSBlockFactory::GetPVT(std::shared_ptr<Con | ||||
|     Galileo_channels += configuration->property("Channels_5X.count", 0); | ||||
|     unsigned int GPS_channels = configuration->property("Channels_1C.count", 0); | ||||
|     GPS_channels += configuration->property("Channels_2S.count", 0); | ||||
|     GPS_channels += configuration->property("Channels_L5.count", 0); | ||||
|     return GetBlock(configuration, "PVT", implementation, Galileo_channels + GPS_channels, 0); | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										183
									
								
								src/core/system_parameters/GPS_CNAV.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										183
									
								
								src/core/system_parameters/GPS_CNAV.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,183 @@ | ||||
| /*! | ||||
|  * \file GPS_CNAV.h | ||||
|  * \brief  Defines parameters for GPS CNAV | ||||
|  * \author Antonio Ramos, 2017. antonio.ramos(at)cttc.es | ||||
|  * | ||||
|  * ------------------------------------------------------------------------- | ||||
|  * | ||||
|  * Copyright (C) 2010-2017  (see AUTHORS file for a list of contributors) | ||||
|  * | ||||
|  * GNSS-SDR is a software defined Global Navigation | ||||
|  *          Satellite Systems receiver | ||||
|  * | ||||
|  * This file is part of GNSS-SDR. | ||||
|  * | ||||
|  * GNSS-SDR is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * GNSS-SDR is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with GNSS-SDR. If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * ------------------------------------------------------------------------- | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef GNSS_SDR_GPS_CNAV_H_ | ||||
| #define GNSS_SDR_GPS_CNAV_H_ | ||||
|  | ||||
| #include <cstdint> | ||||
| #include <vector> | ||||
| #include <utility> // std::pair | ||||
| #include "MATH_CONSTANTS.h" | ||||
|  | ||||
| // CNAV GPS NAVIGATION MESSAGE STRUCTURE | ||||
| // NAVIGATION MESSAGE FIELDS POSITIONS (from IS-GPS-200E Appendix III) | ||||
|  | ||||
| #define GPS_CNAV_PREAMBLE {1, 0, 0, 0, 1, 0, 1, 1} | ||||
| #define GPS_CNAV_PREAMBLE_STR "10001011" | ||||
| #define GPS_CNAV_INV_PREAMBLE_STR "01110100" | ||||
|  | ||||
| const int GPS_CNAV_DATA_PAGE_BITS = 300; | ||||
|  | ||||
| // common to all messages | ||||
| const std::vector<std::pair<int,int> > CNAV_PRN( { {9,6} } ); | ||||
| const std::vector<std::pair<int,int> > CNAV_MSG_TYPE( { {15,6} } ); | ||||
| const std::vector<std::pair<int,int> > CNAV_TOW( { {21,17} } ); //GPS Time Of Week in seconds | ||||
| const double CNAV_TOW_LSB = 6.0; | ||||
| const std::vector<std::pair<int,int> > CNAV_ALERT_FLAG( { {38,1} } ); | ||||
|  | ||||
| // MESSAGE TYPE 10 (Ephemeris 1) | ||||
|  | ||||
| const std::vector<std::pair<int,int> > CNAV_WN({{39,13}}); | ||||
| const std::vector<std::pair<int,int> > CNAV_HEALTH({{52,3}}); | ||||
| const std::vector<std::pair<int,int> > CNAV_TOP1({{55,11}}); | ||||
| const double CNAV_TOP1_LSB = 300.0; | ||||
| const std::vector<std::pair<int,int> > CNAV_URA({{66,5}}); | ||||
|  | ||||
| const std::vector<std::pair<int,int> > CNAV_TOE1({{71,11}}); | ||||
| const double CNAV_TOE1_LSB = 300.0; | ||||
|  | ||||
| const std::vector<std::pair<int,int> > CNAV_DELTA_A({{82,26}}); //Relative to AREF = 26,559,710 meters | ||||
| const double CNAV_DELTA_A_LSB = TWO_N9; | ||||
|  | ||||
| const std::vector<std::pair<int,int> > CNAV_A_DOT({{108,25}}); | ||||
| const double CNAV_A_DOT_LSB = TWO_N21; | ||||
|  | ||||
| const std::vector<std::pair<int,int> > CNAV_DELTA_N0({{133,17}}); | ||||
| const double CNAV_DELTA_N0_LSB = TWO_N44*PI; //semi-circles to radians | ||||
| const std::vector<std::pair<int,int> > CNAV_DELTA_N0_DOT({{150,23}}); | ||||
| const double CNAV_DELTA_N0_DOT_LSB = TWO_N57*PI;//semi-circles to radians | ||||
| const std::vector<std::pair<int,int> > CNAV_M0({{173,33}}); | ||||
| const double CNAV_M0_LSB = TWO_N32*PI;//semi-circles to radians | ||||
| const std::vector<std::pair<int,int> > CNAV_E_ECCENTRICITY({{206,33}}); | ||||
| const double CNAV_E_ECCENTRICITY_LSB = TWO_N34; | ||||
| const std::vector<std::pair<int,int> > CNAV_OMEGA({{239,33}}); | ||||
| const double CNAV_OMEGA_LSB = TWO_N32*PI;//semi-circles to radians | ||||
| const std::vector<std::pair<int,int> > CNAV_INTEGRITY_FLAG({{272,1}}); | ||||
| const std::vector<std::pair<int,int> > CNAV_L2_PHASING_FLAG({{273,1}}); | ||||
|  | ||||
| // MESSAGE TYPE 11 (Ephemeris 2) | ||||
|  | ||||
| const std::vector<std::pair<int,int> > CNAV_TOE2({{39,11}}); | ||||
| const double CNAV_TOE2_LSB = 300.0; | ||||
| const std::vector<std::pair<int,int> > CNAV_OMEGA0({{50,33}}); | ||||
| const double CNAV_OMEGA0_LSB = TWO_N32*PI;//semi-circles to radians | ||||
| const std::vector<std::pair<int,int> > CNAV_I0({{83,33}}); | ||||
| const double CNAV_I0_LSB = TWO_N32*PI;//semi-circles to radians | ||||
| const std::vector<std::pair<int,int> > CNAV_DELTA_OMEGA_DOT({{116,17}}); //Relative to REF = -2.6 x 10-9 semi-circles/second. | ||||
| const double CNAV_DELTA_OMEGA_DOT_LSB = TWO_N44*PI;//semi-circles to radians | ||||
| const std::vector<std::pair<int,int> > CNAV_I0_DOT({{133,15}}); | ||||
| const double CNAV_I0_DOT_LSB = TWO_N44*PI;//semi-circles to radians | ||||
| const std::vector<std::pair<int,int> > CNAV_CIS({{148,16}}); | ||||
| const double CNAV_CIS_LSB = TWO_N30; | ||||
| const std::vector<std::pair<int,int> > CNAV_CIC({{164,16}}); | ||||
| const double CNAV_CIC_LSB = TWO_N30; | ||||
| const std::vector<std::pair<int,int> > CNAV_CRS({{180,24}}); | ||||
| const double CNAV_CRS_LSB = TWO_N8; | ||||
| const std::vector<std::pair<int,int> > CNAV_CRC({{204,24}}); | ||||
| const double CNAV_CRC_LSB = TWO_N8; | ||||
| const std::vector<std::pair<int,int> > CNAV_CUS({{228,21}}); | ||||
| const double CNAV_CUS_LSB = TWO_N30; | ||||
| const std::vector<std::pair<int,int> > CNAV_CUC({{249,21}}); | ||||
| const double CNAV_CUC_LSB = TWO_N30; | ||||
|  | ||||
|  | ||||
| // MESSAGE TYPE 30 (CLOCK, IONO, GRUP DELAY) | ||||
|  | ||||
| const std::vector<std::pair<int,int> > CNAV_TOP2({{39,11}}); | ||||
| const double CNAV_TOP2_LSB = 300.0; | ||||
| const std::vector<std::pair<int,int> > CNAV_URA_NED0({{50,5}}); | ||||
| const std::vector<std::pair<int,int> > CNAV_URA_NED1({{55,3}}); | ||||
| const std::vector<std::pair<int,int> > CNAV_URA_NED2({{58,3}}); | ||||
| const std::vector<std::pair<int,int> > CNAV_TOC({{61,11}}); | ||||
| const double CNAV_TOC_LSB = 300.0; | ||||
| const std::vector<std::pair<int,int> > CNAV_AF0({{72,26}}); | ||||
| const double CNAV_AF0_LSB = TWO_N60; | ||||
| const std::vector<std::pair<int,int> > CNAV_AF1({{98,20}}); | ||||
| const double CNAV_AF1_LSB = TWO_N48; | ||||
| const std::vector<std::pair<int,int> > CNAV_AF2({{118,10}}); | ||||
| const double CNAV_AF2_LSB = TWO_N35; | ||||
| const std::vector<std::pair<int,int> > CNAV_TGD({{128,13}}); | ||||
| const double CNAV_TGD_LSB = TWO_N35; | ||||
| const std::vector<std::pair<int,int> > CNAV_ISCL1({{141,13}}); | ||||
| const double CNAV_ISCL1_LSB = TWO_N35; | ||||
| const std::vector<std::pair<int,int> > CNAV_ISCL2({{154,13}}); | ||||
| const double CNAV_ISCL2_LSB = TWO_N35; | ||||
| const std::vector<std::pair<int,int> > CNAV_ISCL5I({{167,13}}); | ||||
| const double CNAV_ISCL5I_LSB = TWO_N35; | ||||
| const std::vector<std::pair<int,int> > CNAV_ISCL5Q({{180,13}}); | ||||
| const double CNAV_ISCL5Q_LSB = TWO_N35; | ||||
| //Ionospheric parameters | ||||
| const std::vector<std::pair<int,int> > CNAV_ALPHA0({{193,8}}); | ||||
| const double CNAV_ALPHA0_LSB = TWO_N30; | ||||
| const std::vector<std::pair<int,int> > CNAV_ALPHA1({{201,8}}); | ||||
| const double CNAV_ALPHA1_LSB = TWO_N27; | ||||
| const std::vector<std::pair<int,int> > CNAV_ALPHA2({{209,8}}); | ||||
| const double CNAV_ALPHA2_LSB = TWO_N24; | ||||
| const std::vector<std::pair<int,int> > CNAV_ALPHA3({{217,8}}); | ||||
| const double CNAV_ALPHA3_LSB = TWO_N24; | ||||
| const std::vector<std::pair<int,int> > CNAV_BETA0({{225,8}}); | ||||
| const double CNAV_BETA0_LSB = TWO_P11; | ||||
| const std::vector<std::pair<int,int> > CNAV_BETA1({{233,8}}); | ||||
| const double CNAV_BETA1_LSB = TWO_P14; | ||||
| const std::vector<std::pair<int,int> > CNAV_BETA2({{241,8}}); | ||||
| const double CNAV_BETA2_LSB = TWO_P16; | ||||
| const std::vector<std::pair<int,int> > CNAV_BETA3({{249,8}}); | ||||
| const double CNAV_BETA3_LSB = TWO_P16; | ||||
| const std::vector<std::pair<int,int> > CNAV_WNOP({{257,8}}); | ||||
|  | ||||
|  | ||||
| // MESSAGE TYPE 33 (CLOCK and UTC) | ||||
|  | ||||
| const std::vector<std::pair<int,int> > CNAV_A0({{128,16}}); | ||||
| const double CNAV_A0_LSB = TWO_N35; | ||||
| const std::vector<std::pair<int,int> > CNAV_A1({{144,13}}); | ||||
| const double CNAV_A1_LSB = TWO_N51; | ||||
| const std::vector<std::pair<int,int> > CNAV_A2({{157,7}}); | ||||
| const double CNAV_A2_LSB = TWO_N68; | ||||
| const std::vector<std::pair<int,int> > CNAV_DELTA_TLS({{164,8}}); | ||||
| const double CNAV_DELTA_TLS_LSB = 1; | ||||
| const std::vector<std::pair<int,int> > CNAV_TOT({{172,16}}); | ||||
| const double CNAV_TOT_LSB = TWO_P4; | ||||
| const std::vector<std::pair<int,int> > CNAV_WN_OT({{188,13}}); | ||||
| const double CNAV_WN_OT_LSB = 1; | ||||
| const std::vector<std::pair<int,int> > CNAV_WN_LSF({{201,13}}); | ||||
| const double CNAV_WN_LSF_LSB = 1; | ||||
| const std::vector<std::pair<int,int> > CNAV_DN({{214,4}}); | ||||
| const double CNAV_DN_LSB = 1; | ||||
| const std::vector<std::pair<int,int> > CNAV_DELTA_TLSF({{218,8}}); | ||||
| const double CNAV_DELTA_TLSF_LSB = 1; | ||||
|  | ||||
|  | ||||
| // TODO: Add more frames (Almanac, etc...) | ||||
|  | ||||
|  | ||||
|  | ||||
| #endif /* GNSS_SDR_GPS_CNAV_H_ */ | ||||
| @@ -37,6 +37,7 @@ | ||||
| #include <utility> // std::pair | ||||
| #include "MATH_CONSTANTS.h" | ||||
| #include "gnss_frequencies.h" | ||||
| #include "GPS_CNAV.h" | ||||
|  | ||||
| // Physical constants | ||||
| const double GPS_L2_C_m_s       = 299792458.0;      //!< The speed of light, [m/s] | ||||
| @@ -92,152 +93,10 @@ const int32_t GPS_L2C_M_INIT_REG[115] = | ||||
|                 0706202440,  0705056276,  0020373522,  0746013617, | ||||
|                 0132720621,  0434015513,  0566721727,  0140633660}; | ||||
|  | ||||
| // CNAV GPS NAVIGATION MESSAGE STRUCTURE | ||||
| // NAVIGATION MESSAGE FIELDS POSITIONS (from IS-GPS-200E Appendix III) | ||||
|  | ||||
| #define GPS_CNAV_PREAMBLE {1, 0, 0, 0, 1, 0, 1, 1} | ||||
| #define GPS_CNAV_PREAMBLE_STR "10001011" | ||||
| #define GPS_CNAV_INV_PREAMBLE_STR "01110100" | ||||
|  | ||||
| const int GPS_L2_CNAV_DATA_PAGE_BITS = 300; //!< GPS L2 CNAV page length, including preamble and CRC [bits] | ||||
| const int GPS_L2_SYMBOLS_PER_BIT = 2; | ||||
| const int GPS_L2_SAMPLES_PER_SYMBOL = 1; | ||||
| const int GPS_L2_CNAV_DATA_PAGE_SYMBOLS = 600; | ||||
| const int GPS_L2_CNAV_DATA_PAGE_DURATION_S = 12; | ||||
|  | ||||
| // common to all messages | ||||
| const std::vector<std::pair<int,int> > CNAV_PRN( { {9,6} } ); | ||||
| const std::vector<std::pair<int,int> > CNAV_MSG_TYPE( { {15,6} } ); | ||||
| const std::vector<std::pair<int,int> > CNAV_TOW( { {21,17} } ); //GPS Time Of Week in seconds | ||||
| const double CNAV_TOW_LSB = 6.0; | ||||
| const std::vector<std::pair<int,int> > CNAV_ALERT_FLAG( { {38,1} } ); | ||||
|  | ||||
| // MESSAGE TYPE 10 (Ephemeris 1) | ||||
|  | ||||
| const std::vector<std::pair<int,int> > CNAV_WN({{39,13}}); | ||||
| const std::vector<std::pair<int,int> > CNAV_HEALTH({{52,3}}); | ||||
| const std::vector<std::pair<int,int> > CNAV_TOP1({{55,11}}); | ||||
| const double CNAV_TOP1_LSB = 300.0; | ||||
| const std::vector<std::pair<int,int> > CNAV_URA({{66,5}}); | ||||
|  | ||||
| const std::vector<std::pair<int,int> > CNAV_TOE1({{71,11}}); | ||||
| const double CNAV_TOE1_LSB = 300.0; | ||||
|  | ||||
| const std::vector<std::pair<int,int> > CNAV_DELTA_A({{82,26}}); //Relative to AREF = 26,559,710 meters | ||||
| const double CNAV_DELTA_A_LSB = TWO_N9; | ||||
|  | ||||
| const std::vector<std::pair<int,int> > CNAV_A_DOT({{108,25}}); | ||||
| const double CNAV_A_DOT_LSB = TWO_N21; | ||||
|  | ||||
| const std::vector<std::pair<int,int> > CNAV_DELTA_N0({{133,17}}); | ||||
| const double CNAV_DELTA_N0_LSB = TWO_N44*GPS_L2_PI; //semi-circles to radians | ||||
| const std::vector<std::pair<int,int> > CNAV_DELTA_N0_DOT({{150,23}}); | ||||
| const double CNAV_DELTA_N0_DOT_LSB = TWO_N57*GPS_L2_PI;//semi-circles to radians | ||||
| const std::vector<std::pair<int,int> > CNAV_M0({{173,33}}); | ||||
| const double CNAV_M0_LSB = TWO_N32*GPS_L2_PI;//semi-circles to radians | ||||
| const std::vector<std::pair<int,int> > CNAV_E_ECCENTRICITY({{206,33}}); | ||||
| const double CNAV_E_ECCENTRICITY_LSB = TWO_N34; | ||||
| const std::vector<std::pair<int,int> > CNAV_OMEGA({{239,33}}); | ||||
| const double CNAV_OMEGA_LSB = TWO_N32*GPS_L2_PI;//semi-circles to radians | ||||
| const std::vector<std::pair<int,int> > CNAV_INTEGRITY_FLAG({{272,1}}); | ||||
| const std::vector<std::pair<int,int> > CNAV_L2_PHASING_FLAG({{273,1}}); | ||||
|  | ||||
| // MESSAGE TYPE 11 (Ephemeris 2) | ||||
|  | ||||
| const std::vector<std::pair<int,int> > CNAV_TOE2({{39,11}}); | ||||
| const double CNAV_TOE2_LSB = 300.0; | ||||
| const std::vector<std::pair<int,int> > CNAV_OMEGA0({{50,33}}); | ||||
| const double CNAV_OMEGA0_LSB = TWO_N32*GPS_L2_PI;//semi-circles to radians | ||||
| const std::vector<std::pair<int,int> > CNAV_I0({{83,33}}); | ||||
| const double CNAV_I0_LSB = TWO_N32*GPS_L2_PI;//semi-circles to radians | ||||
| const std::vector<std::pair<int,int> > CNAV_DELTA_OMEGA_DOT({{116,17}}); //Relative to REF = -2.6 x 10-9 semi-circles/second. | ||||
| const double CNAV_DELTA_OMEGA_DOT_LSB = TWO_N44*GPS_L2_PI;//semi-circles to radians | ||||
| const std::vector<std::pair<int,int> > CNAV_I0_DOT({{133,15}}); | ||||
| const double CNAV_I0_DOT_LSB = TWO_N44*GPS_L2_PI;//semi-circles to radians | ||||
| const std::vector<std::pair<int,int> > CNAV_CIS({{148,16}}); | ||||
| const double CNAV_CIS_LSB = TWO_N30; | ||||
| const std::vector<std::pair<int,int> > CNAV_CIC({{164,16}}); | ||||
| const double CNAV_CIC_LSB = TWO_N30; | ||||
| const std::vector<std::pair<int,int> > CNAV_CRS({{180,24}}); | ||||
| const double CNAV_CRS_LSB = TWO_N8; | ||||
| const std::vector<std::pair<int,int> > CNAV_CRC({{204,24}}); | ||||
| const double CNAV_CRC_LSB = TWO_N8; | ||||
| const std::vector<std::pair<int,int> > CNAV_CUS({{228,21}}); | ||||
| const double CNAV_CUS_LSB = TWO_N30; | ||||
| const std::vector<std::pair<int,int> > CNAV_CUC({{249,21}}); | ||||
| const double CNAV_CUC_LSB = TWO_N30; | ||||
|  | ||||
|  | ||||
| // MESSAGE TYPE 30 (CLOCK, IONO, GRUP DELAY) | ||||
|  | ||||
| const std::vector<std::pair<int,int> > CNAV_TOP2({{39,11}}); | ||||
| const double CNAV_TOP2_LSB = 300.0; | ||||
|  | ||||
| const std::vector<std::pair<int,int> > CNAV_URA_NED0({{50,5}}); | ||||
| const std::vector<std::pair<int,int> > CNAV_URA_NED1({{55,3}}); | ||||
| const std::vector<std::pair<int,int> > CNAV_URA_NED2({{58,3}}); | ||||
| const std::vector<std::pair<int,int> > CNAV_TOC({{61,11}}); | ||||
| const double CNAV_TOC_LSB = 300.0; | ||||
| const std::vector<std::pair<int,int> > CNAV_AF0({{72,26}}); | ||||
| const double CNAV_AF0_LSB = TWO_N60; | ||||
| const std::vector<std::pair<int,int> > CNAV_AF1({{98,20}}); | ||||
| const double CNAV_AF1_LSB = TWO_N48; | ||||
| const std::vector<std::pair<int,int> > CNAV_AF2({{118,10}}); | ||||
| const double CNAV_AF2_LSB = TWO_N35; | ||||
| const std::vector<std::pair<int,int> > CNAV_TGD({{128,13}}); | ||||
| const double CNAV_TGD_LSB = TWO_N35; | ||||
| const std::vector<std::pair<int,int> > CNAV_ISCL1({{141,13}}); | ||||
| const double CNAV_ISCL1_LSB = TWO_N35; | ||||
| const std::vector<std::pair<int,int> > CNAV_ISCL2({{154,13}}); | ||||
| const double CNAV_ISCL2_LSB = TWO_N35; | ||||
| const std::vector<std::pair<int,int> > CNAV_ISCL5I({{167,13}}); | ||||
| const double CNAV_ISCL5I_LSB = TWO_N35; | ||||
| const std::vector<std::pair<int,int> > CNAV_ISCL5Q({{180,13}}); | ||||
| const double CNAV_ISCL5Q_LSB = TWO_N35; | ||||
| //Ionospheric parameters | ||||
| const std::vector<std::pair<int,int> > CNAV_ALPHA0({{193,8}}); | ||||
| const double CNAV_ALPHA0_LSB = TWO_N30; | ||||
| const std::vector<std::pair<int,int> > CNAV_ALPHA1({{201,8}}); | ||||
| const double CNAV_ALPHA1_LSB = TWO_N27; | ||||
| const std::vector<std::pair<int,int> > CNAV_ALPHA2({{209,8}}); | ||||
| const double CNAV_ALPHA2_LSB = TWO_N24; | ||||
| const std::vector<std::pair<int,int> > CNAV_ALPHA3({{217,8}}); | ||||
| const double CNAV_ALPHA3_LSB = TWO_N24; | ||||
| const std::vector<std::pair<int,int> > CNAV_BETA0({{225,8}}); | ||||
| const double CNAV_BETA0_LSB = TWO_P11; | ||||
| const std::vector<std::pair<int,int> > CNAV_BETA1({{233,8}}); | ||||
| const double CNAV_BETA1_LSB = TWO_P14; | ||||
| const std::vector<std::pair<int,int> > CNAV_BETA2({{241,8}}); | ||||
| const double CNAV_BETA2_LSB = TWO_P16; | ||||
| const std::vector<std::pair<int,int> > CNAV_BETA3({{249,8}}); | ||||
| const double CNAV_BETA3_LSB = TWO_P16; | ||||
| const std::vector<std::pair<int,int> > CNAV_WNOP({{257,8}}); | ||||
|  | ||||
|  | ||||
| // MESSAGE TYPE 33 (CLOCK and UTC) | ||||
|  | ||||
| const std::vector<std::pair<int,int> > CNAV_A0({{128,16}}); | ||||
| const double CNAV_A0_LSB = TWO_N35; | ||||
| const std::vector<std::pair<int,int> > CNAV_A1({{144,13}}); | ||||
| const double CNAV_A1_LSB = TWO_N51; | ||||
| const std::vector<std::pair<int,int> > CNAV_A2({{157,7}}); | ||||
| const double CNAV_A2_LSB = TWO_N68; | ||||
| const std::vector<std::pair<int,int> > CNAV_DELTA_TLS({{164,8}}); | ||||
| const double CNAV_DELTA_TLS_LSB = 1; | ||||
| const std::vector<std::pair<int,int> > CNAV_TOT({{172,16}}); | ||||
| const double CNAV_TOT_LSB = TWO_P4; | ||||
| const std::vector<std::pair<int,int> > CNAV_WN_OT({{188,13}}); | ||||
| const double CNAV_WN_OT_LSB = 1; | ||||
| const std::vector<std::pair<int,int> > CNAV_WN_LSF({{201,13}}); | ||||
| const double CNAV_WN_LSF_LSB = 1; | ||||
| const std::vector<std::pair<int,int> > CNAV_DN({{214,4}}); | ||||
| const double CNAV_DN_LSB = 1; | ||||
| const std::vector<std::pair<int,int> > CNAV_DELTA_TLSF({{218,8}}); | ||||
| const double CNAV_DELTA_TLSF_LSB = 1; | ||||
|  | ||||
|  | ||||
| // TODO: Add more frames (Almanac, etc...) | ||||
|  | ||||
|  | ||||
|  | ||||
| #endif /* GNSS_SDR_GPS_L2C_H_ */ | ||||
|   | ||||
| @@ -35,7 +35,7 @@ | ||||
| #include <cstdint> | ||||
| #include "MATH_CONSTANTS.h" | ||||
| #include "gnss_frequencies.h" | ||||
| #include "GPS_L2C.h" // CNAV GPS NAVIGATION MESSAGE STRUCTURE | ||||
| #include "GPS_CNAV.h" | ||||
|  | ||||
| // Physical constants | ||||
| const double GPS_L5_C_m_s       = 299792458.0;          //!< The speed of light, [m/s] | ||||
| @@ -179,6 +179,7 @@ const int GPS_L5_SYMBOLS_PER_BIT = 2; | ||||
| const int GPS_L5_SAMPLES_PER_SYMBOL = 10; | ||||
| const int GPS_L5_CNAV_DATA_PAGE_SYMBOLS = 600; | ||||
| const int GPS_L5_CNAV_DATA_PAGE_DURATION_S = 6; | ||||
|  | ||||
| const int GPS_L5_NH_CODE_LENGTH = 10; | ||||
| const int GPS_L5_NH_CODE[10] = {0, 0, 0, 0, 1, 1, 0, 1, 0, 1}; | ||||
|  | ||||
| #endif /* GNSS_SDR_GPS_L5_H_ */ | ||||
|   | ||||
| @@ -42,6 +42,7 @@ | ||||
| */ | ||||
|  | ||||
| const double PI = 3.1415926535897932;             //!<  pi | ||||
| const double PI_2 = 2.0 * PI;                     //!<  2 * pi | ||||
|  | ||||
| const double TWO_P4 = (16);                       //!< 2^4 | ||||
| const double TWO_P11 = (2048);                    //!< 2^11 | ||||
|   | ||||
| @@ -32,7 +32,6 @@ | ||||
|  | ||||
| #include "gps_cnav_ephemeris.h" | ||||
| #include <cmath> | ||||
| #include "GPS_L2C.h" | ||||
| #include <iostream> | ||||
|  | ||||
| Gps_CNAV_Ephemeris::Gps_CNAV_Ephemeris() | ||||
| @@ -168,7 +167,7 @@ double Gps_CNAV_Ephemeris::sv_clock_relativistic_term(double transmitTime) | ||||
|         { | ||||
|             E_old   = E; | ||||
|             E       = M + d_e_eccentricity * sin(E); | ||||
|             dE      = fmod(E - E_old, 2.0 * GPS_L2_PI); | ||||
|             dE      = fmod(E - E_old, 2.0 * PI); | ||||
|             if (fabs(dE) < 1e-12) | ||||
|                 { | ||||
|                     //Necessary precision is reached, exit from the loop | ||||
| @@ -239,7 +238,7 @@ double Gps_CNAV_Ephemeris::satellitePosition(double transmitTime) | ||||
|         { | ||||
|             E_old   = E; | ||||
|             E       = M + d_e_eccentricity * sin(E); | ||||
|             dE      = fmod(E - E_old, 2 * GPS_L2_PI); | ||||
|             dE      = fmod(E - E_old, 2 * PI); | ||||
|             if (fabs(dE) < 1e-12) | ||||
|                 { | ||||
|                     //Necessary precision is reached, exit from the loop | ||||
| @@ -268,7 +267,7 @@ double Gps_CNAV_Ephemeris::satellitePosition(double transmitTime) | ||||
|     i = d_i_0 + d_IDOT * tk + d_Cic * cos(2*phi) + d_Cis * sin(2*phi); | ||||
|  | ||||
|     // Compute the angle between the ascending node and the Greenwich meridian | ||||
|     double d_OMEGA_DOT = OMEGA_DOT_REF*GPS_L2_PI + d_DELTA_OMEGA_DOT; | ||||
|     double d_OMEGA_DOT = OMEGA_DOT_REF*PI + d_DELTA_OMEGA_DOT; | ||||
|     Omega = d_OMEGA0 + (d_OMEGA_DOT - OMEGA_EARTH_DOT)*tk - OMEGA_EARTH_DOT * d_Toe1; | ||||
|  | ||||
|     // Reduce to between 0 and 2*pi rad | ||||
| @@ -291,7 +290,7 @@ double Gps_CNAV_Ephemeris::satellitePosition(double transmitTime) | ||||
|     double dtr_s = d_A_f0 + d_A_f1 * tk + d_A_f2 * tk * tk; | ||||
|  | ||||
|     /* relativity correction */ | ||||
|     dtr_s -= 2.0 * sqrt(GM * a) * d_e_eccentricity * sin(E) / (GPS_L2_C_m_s * GPS_L2_C_m_s); | ||||
|     dtr_s -= 2.0 * sqrt(GM * a) * d_e_eccentricity * sin(E) / (SPEED_OF_LIGHT * SPEED_OF_LIGHT); | ||||
|  | ||||
|     return dtr_s; | ||||
| } | ||||
|   | ||||
| @@ -32,7 +32,7 @@ | ||||
| #ifndef GNSS_SDR_GPS_CNAV_EPHEMERIS_H_ | ||||
| #define GNSS_SDR_GPS_CNAV_EPHEMERIS_H_ | ||||
|  | ||||
| #include "GPS_L2C.h" | ||||
| #include "GPS_CNAV.h" | ||||
| #include "boost/assign.hpp" | ||||
| #include <boost/serialization/nvp.hpp> | ||||
|  | ||||
|   | ||||
| @@ -73,11 +73,11 @@ Gps_CNAV_Navigation_Message::Gps_CNAV_Navigation_Message() | ||||
|  | ||||
|  | ||||
|  | ||||
| bool Gps_CNAV_Navigation_Message::read_navigation_bool(std::bitset<GPS_L2_CNAV_DATA_PAGE_BITS> bits, const std::vector<std::pair<int,int>> parameter) | ||||
| bool Gps_CNAV_Navigation_Message::read_navigation_bool(std::bitset<GPS_CNAV_DATA_PAGE_BITS> bits, const std::vector<std::pair<int,int>> parameter) | ||||
| { | ||||
|     bool value; | ||||
|  | ||||
|     if (bits[GPS_L2_CNAV_DATA_PAGE_BITS - parameter[0].first] == 1) | ||||
|     if (bits[GPS_CNAV_DATA_PAGE_BITS - parameter[0].first] == 1) | ||||
|         { | ||||
|             value = true; | ||||
|         } | ||||
| @@ -89,7 +89,7 @@ bool Gps_CNAV_Navigation_Message::read_navigation_bool(std::bitset<GPS_L2_CNAV_D | ||||
| } | ||||
|  | ||||
|  | ||||
| unsigned long int Gps_CNAV_Navigation_Message::read_navigation_unsigned(std::bitset<GPS_L2_CNAV_DATA_PAGE_BITS> bits, const std::vector<std::pair<int,int>> parameter) | ||||
| unsigned long int Gps_CNAV_Navigation_Message::read_navigation_unsigned(std::bitset<GPS_CNAV_DATA_PAGE_BITS> bits, const std::vector<std::pair<int,int>> parameter) | ||||
| { | ||||
|     unsigned long int value = 0; | ||||
|     int num_of_slices = parameter.size(); | ||||
| @@ -98,7 +98,7 @@ unsigned long int Gps_CNAV_Navigation_Message::read_navigation_unsigned(std::bit | ||||
|             for (int j = 0; j < parameter[i].second; j++) | ||||
|                 { | ||||
|                     value <<= 1; //shift left | ||||
|                     if (bits[GPS_L2_CNAV_DATA_PAGE_BITS - parameter[i].first - j] == 1) | ||||
|                     if (bits[GPS_CNAV_DATA_PAGE_BITS - parameter[i].first - j] == 1) | ||||
|                         { | ||||
|                             value += 1; // insert the bit | ||||
|                         } | ||||
| @@ -108,7 +108,7 @@ unsigned long int Gps_CNAV_Navigation_Message::read_navigation_unsigned(std::bit | ||||
| } | ||||
|  | ||||
|  | ||||
| signed long int Gps_CNAV_Navigation_Message::read_navigation_signed(std::bitset<GPS_L2_CNAV_DATA_PAGE_BITS> bits, const std::vector<std::pair<int,int>> parameter) | ||||
| signed long int Gps_CNAV_Navigation_Message::read_navigation_signed(std::bitset<GPS_CNAV_DATA_PAGE_BITS> bits, const std::vector<std::pair<int,int>> parameter) | ||||
| { | ||||
|     signed long int value = 0; | ||||
|     int num_of_slices = parameter.size(); | ||||
| @@ -117,7 +117,7 @@ signed long int Gps_CNAV_Navigation_Message::read_navigation_signed(std::bitset< | ||||
|     if (long_int_size_bytes == 8) // if a long int takes 8 bytes, we are in a 64 bits system | ||||
|         { | ||||
|             // read the MSB and perform the sign extension | ||||
|             if (bits[GPS_L2_CNAV_DATA_PAGE_BITS - parameter[0].first] == 1) | ||||
|             if (bits[GPS_CNAV_DATA_PAGE_BITS - parameter[0].first] == 1) | ||||
|                 { | ||||
|                     value ^= 0xFFFFFFFFFFFFFFFF; //64 bits variable | ||||
|                 } | ||||
| @@ -132,7 +132,7 @@ signed long int Gps_CNAV_Navigation_Message::read_navigation_signed(std::bitset< | ||||
|                         { | ||||
|                             value <<= 1; //shift left | ||||
|                             value &= 0xFFFFFFFFFFFFFFFE; //reset the corresponding bit (for the 64 bits variable) | ||||
|                             if (bits[GPS_L2_CNAV_DATA_PAGE_BITS - parameter[i].first - j] == 1) | ||||
|                             if (bits[GPS_CNAV_DATA_PAGE_BITS - parameter[i].first - j] == 1) | ||||
|                                 { | ||||
|                                     value += 1; // insert the bit | ||||
|                                 } | ||||
| @@ -142,7 +142,7 @@ signed long int Gps_CNAV_Navigation_Message::read_navigation_signed(std::bitset< | ||||
|     else  // we assume we are in a 32 bits system | ||||
|         { | ||||
|             // read the MSB and perform the sign extension | ||||
|             if (bits[GPS_L2_CNAV_DATA_PAGE_BITS - parameter[0].first] == 1) | ||||
|             if (bits[GPS_CNAV_DATA_PAGE_BITS - parameter[0].first] == 1) | ||||
|                 { | ||||
|                     value ^= 0xFFFFFFFF; | ||||
|                 } | ||||
| @@ -157,7 +157,7 @@ signed long int Gps_CNAV_Navigation_Message::read_navigation_signed(std::bitset< | ||||
|                         { | ||||
|                             value <<= 1; //shift left | ||||
|                             value &= 0xFFFFFFFE; //reset the corresponding bit | ||||
|                             if (bits[GPS_L2_CNAV_DATA_PAGE_BITS - parameter[i].first - j] == 1) | ||||
|                             if (bits[GPS_CNAV_DATA_PAGE_BITS - parameter[i].first - j] == 1) | ||||
|                                 { | ||||
|                                     value += 1; // insert the bit | ||||
|                                 } | ||||
| @@ -168,7 +168,7 @@ signed long int Gps_CNAV_Navigation_Message::read_navigation_signed(std::bitset< | ||||
| } | ||||
|  | ||||
|  | ||||
| void Gps_CNAV_Navigation_Message::decode_page(std::bitset<GPS_L2_CNAV_DATA_PAGE_BITS> data_bits) | ||||
| void Gps_CNAV_Navigation_Message::decode_page(std::bitset<GPS_CNAV_DATA_PAGE_BITS> data_bits) | ||||
| { | ||||
|     int PRN; | ||||
|     int page_type; | ||||
|   | ||||
| @@ -38,8 +38,7 @@ | ||||
| #include <string> | ||||
| #include <vector> | ||||
| #include <utility> | ||||
| #include "GPS_L2C.h" | ||||
| #include "GPS_L5.h" | ||||
| #include "GPS_CNAV.h" | ||||
| #include "gps_cnav_ephemeris.h" | ||||
| #include "gps_cnav_iono.h" | ||||
| #include "gps_cnav_utc_model.h" | ||||
| @@ -56,9 +55,9 @@ | ||||
| class Gps_CNAV_Navigation_Message | ||||
| { | ||||
| private: | ||||
|     unsigned long int read_navigation_unsigned(std::bitset<GPS_L2_CNAV_DATA_PAGE_BITS> bits, const std::vector<std::pair<int,int>> parameter); | ||||
|     signed long int read_navigation_signed(std::bitset<GPS_L2_CNAV_DATA_PAGE_BITS> bits, const std::vector<std::pair<int,int>> parameter); | ||||
|     bool read_navigation_bool(std::bitset<GPS_L2_CNAV_DATA_PAGE_BITS> bits, const std::vector<std::pair<int,int>> parameter); | ||||
|     unsigned long int read_navigation_unsigned(std::bitset<GPS_CNAV_DATA_PAGE_BITS> bits, const std::vector<std::pair<int,int>> parameter); | ||||
|     signed long int read_navigation_signed(std::bitset<GPS_CNAV_DATA_PAGE_BITS> bits, const std::vector<std::pair<int,int>> parameter); | ||||
|     bool read_navigation_bool(std::bitset<GPS_CNAV_DATA_PAGE_BITS> bits, const std::vector<std::pair<int,int>> parameter); | ||||
|  | ||||
|     Gps_CNAV_Ephemeris ephemeris_record; | ||||
|     Gps_CNAV_Iono iono_record; | ||||
| @@ -90,7 +89,7 @@ public: | ||||
|     // public functions | ||||
|     void reset(); | ||||
|  | ||||
|     void decode_page(std::bitset<GPS_L2_CNAV_DATA_PAGE_BITS> data_bits); | ||||
|     void decode_page(std::bitset<GPS_CNAV_DATA_PAGE_BITS> data_bits); | ||||
|     /*! | ||||
|      * \brief Obtain a GPS SV Ephemeris class filled with current SV data | ||||
|      */ | ||||
|   | ||||
| @@ -41,6 +41,7 @@ | ||||
| #include <boost/dynamic_bitset.hpp> | ||||
| #include <glog/logging.h> | ||||
| #include "Galileo_E1.h" | ||||
| #include "GPS_L2C.h" | ||||
|  | ||||
| using google::LogMessage; | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Antonio Ramos
					Antonio Ramos