mirror of
				https://github.com/gnss-sdr/gnss-sdr
				synced 2025-10-31 15:23:04 +00:00 
			
		
		
		
	Adding RTCM Data Fields for GLONASS processing
Adds GLONASS related data fields (DFxxx) for RTCM messages including MS1020, MS1087 and general MSM message types
This commit is contained in:
		 Damian Miralles
					Damian Miralles
				
			
				
					committed by
					
						 Damian Miralles
						Damian Miralles
					
				
			
			
				
	
			
			
			 Damian Miralles
						Damian Miralles
					
				
			
						parent
						
							6669482e91
						
					
				
				
					commit
					e58cd5450d
				
			| @@ -74,7 +74,7 @@ geph_t eph_to_rtklib(const Glonass_Gnav_Ephemeris & glonass_gnav_eph) | ||||
|     rtklib_sat.sat    = glonass_gnav_eph.i_satellite_slot_number;       /* satellite number */ | ||||
|     rtklib_sat.iode   = glonass_gnav_eph.d_t_b;                         /* IODE (0-6 bit of tb field) */ | ||||
|     rtklib_sat.frq    = glonass_gnav_eph.i_satellite_freq_channel;      /* satellite frequency number */ | ||||
|     rtklib_sat.svh    = glonass_gnav_eph.d_l_n;                         /* satellite health*/ | ||||
|     rtklib_sat.svh    = glonass_gnav_eph.d_l3rd_n;                         /* satellite health*/ | ||||
|     rtklib_sat.sva    = glonass_gnav_eph.d_F_T;                         /* satellite accuracy*/ | ||||
|     rtklib_sat.age    = glonass_gnav_eph.d_E_n;                         /* satellite age*/ | ||||
|     rtklib_sat.pos[0] = glonass_gnav_eph.d_Xn*1000;                     /* satellite position (ecef) (m) */ | ||||
|   | ||||
| @@ -78,6 +78,8 @@ const double GLONASS_SUN_SEMI_MAJOR_AXIS    = 1.49598e8;            //!< Semi-ma | ||||
| const double GLONASS_SUN_ECCENTRICITY       = 0.016719;             //!< Eccentricity of solar orbit | ||||
|  | ||||
| // carrier and code frequencies | ||||
| const double GLONASS_L2_FREQ_HZ              = FREQ2_GLO;     //!< L1 [Hz] | ||||
|  | ||||
| const double GLONASS_L1_FREQ_HZ              = FREQ1_GLO;     //!< L1 [Hz] | ||||
| const double GLONASS_L1_DFREQ_HZ             = DFRQ1_GLO;     //!< Freq Bias for GLONASS L1 [Hz] | ||||
| const double GLONASS_L1_CA_CODE_RATE_HZ      = 0.511e6;       //!< GLONASS L1 C/A code rate [chips/s] | ||||
|   | ||||
| @@ -71,7 +71,8 @@ Glonass_Gnav_Ephemeris::Glonass_Gnav_Ephemeris() | ||||
|     d_P_2 = 0.0;             //!< Flag of oddness ("1") or evenness ("0") of the value of (tb) [dimensionless] | ||||
|     d_P_3 = 0.0;             //!< Flag indicating a number of satellites for which almanac is transmitted within given frame: "1" corresponds to 5 satellites and "0" corresponds to 4 satellites [dimensionless] | ||||
|     d_P_4 = 0.0;             //!< Flag to show that ephemeris parameters are present. "1" indicates that updated ephemeris or frequency/time parameters have been uploaded by the control segment [dimensionless] | ||||
|     d_l_n = 0.0;             //!< Health flag for nth satellite; ln = 0 indicates the n-th satellite is helthy, ln = 1 indicates malfunction of this nth satellite [dimensionless] | ||||
|     d_l3rd_n = 0.0;          //!< Health flag for nth satellite; ln = 0 indicates the n-th satellite is helthy, ln = 1 indicates malfunction of this nth satellite [dimensionless] | ||||
|     d_l5th_n = 0.0;             //!< Health flag for nth satellite; ln = 0 indicates the n-th satellite is helthy, ln = 1 indicates malfunction of this nth satellite [dimensionless] | ||||
|  | ||||
|     // clock terms derived from ephemeris data | ||||
|     d_satClkDrift = 0.0;    //!< GLONASS clock error | ||||
|   | ||||
| @@ -95,7 +95,8 @@ public: | ||||
|     double d_P_2;           //!< Flag of oddness ("1") or evenness ("0") of the value of (tb) [dimensionless] | ||||
|     double d_P_3;           //!< Flag indicating a number of satellites for which almanac is transmitted within given frame: "1" corresponds to 5 satellites and "0" corresponds to 4 satellites [dimensionless] | ||||
|     double d_P_4;           //!< Flag to show that ephemeris parameters are present. "1" indicates that updated ephemeris or frequency/time parameters have been uploaded by the control segment [dimensionless] | ||||
|     double d_l_n;           //!< Health flag for nth satellite; ln = 0 indicates the n-th satellite is helthy, ln = 1 indicates malfunction of this nth satellite [dimensionless] | ||||
|     double d_l3rd_n;           //!< Health flag for nth satellite; ln = 0 indicates the n-th satellite is helthy, ln = 1 indicates malfunction of this nth satellite [dimensionless] | ||||
|     double d_l5th_n;           //!< Health flag for nth satellite; ln = 0 indicates the n-th satellite is helthy, ln = 1 indicates malfunction of this nth satellite [dimensionless] | ||||
|  | ||||
|     // Inmediate deliverables of ephemeris information | ||||
|     //TODO check how freq channel is managed in gnav message. I think it is a number greater thn 0 | ||||
| @@ -164,7 +165,8 @@ public: | ||||
|         archive & make_nvp("d_P_2", d_P_2);         //!< Flag of oddness ("1") or evenness ("0") of the value of (tb) [dimensionless] | ||||
|         archive & make_nvp("d_P_3", d_P_3);         //!< Flag indicating a number of satellites for which almanac is transmitted within given frame: "1" corresponds to 5 satellites and "0" corresponds to 4 satellites [dimensionless] | ||||
|         archive & make_nvp("d_P_4", d_P_4);         //!< Flag to show that ephemeris parameters are present. "1" indicates that updated ephemeris or frequency/time parameters have been uploaded by the control segment [dimensionless] | ||||
|         archive & make_nvp("d_l_n", d_l_n);         //!< Health flag for nth satellite; ln = 0 indicates the n-th satellite is helthy, ln = 1 indicates malfunction of this nth satellite [dimensionless] | ||||
|         archive & make_nvp("d_l3rd_n", d_l3rd_n);         //!< Health flag for nth satellite; ln = 0 indicates the n-th satellite is helthy, ln = 1 indicates malfunction of this nth satellite [dimensionless] | ||||
|         archive & make_nvp("d_l5th_n", d_l5th_n);         //!< Health flag for nth satellite; ln = 0 indicates the n-th satellite is helthy, ln = 1 indicates malfunction of this nth satellite [dimensionless] | ||||
|     } | ||||
|  | ||||
|     /*! | ||||
|   | ||||
| @@ -394,7 +394,7 @@ int Glonass_Gnav_Navigation_Message::string_decoder(char * frame_string) | ||||
|             gnav_ephemeris.d_P_3 = static_cast<double>(read_navigation_unsigned(string_bits, P3)); | ||||
|             gnav_ephemeris.d_gamma_n = static_cast<double>(read_navigation_signed(string_bits, GAMMA_N)) * TWO_N30; | ||||
|             gnav_ephemeris.d_P = static_cast<double>(read_navigation_unsigned(string_bits, P)); | ||||
|             gnav_ephemeris.d_l_n = static_cast<double>(read_navigation_unsigned(string_bits, EPH_L_N)); | ||||
|             gnav_ephemeris.d_l3rd_n = static_cast<double>(read_navigation_unsigned(string_bits, EPH_L_N)); | ||||
|             gnav_ephemeris.d_VZn = static_cast<double>(read_navigation_signed(string_bits, Z_N_DOT)) * TWO_N20; | ||||
|             gnav_ephemeris.d_AZn = static_cast<double>(read_navigation_signed(string_bits, Z_N_DOT_DOT)) * TWO_N30; | ||||
|             gnav_ephemeris.d_Zn = static_cast<double>(read_navigation_signed(string_bits, Z_N)) * TWO_N11; | ||||
| @@ -428,7 +428,7 @@ int Glonass_Gnav_Navigation_Message::string_decoder(char * frame_string) | ||||
|             gnav_utc_model.d_tau_c = static_cast<double>(read_navigation_signed(string_bits, TAU_C)) * TWO_N31; | ||||
|             gnav_utc_model.d_N_4 = static_cast<double>(read_navigation_unsigned(string_bits, N_4)); | ||||
|             gnav_utc_model.d_tau_gps = static_cast<double>(read_navigation_signed(string_bits, TAU_GPS)) * TWO_N30; | ||||
|             gnav_ephemeris.d_l_n = static_cast<double>(read_navigation_unsigned(string_bits, ALM_L_N)); | ||||
|             gnav_ephemeris.d_l5th_n = static_cast<double>(read_navigation_unsigned(string_bits, ALM_L_N)); | ||||
|  | ||||
|             // Compute Year and DoY based on Algorithm A3.11 of GLONASS ICD | ||||
|             if(flag_ephemeris_str_4 == true) | ||||
|   | ||||
| @@ -1709,15 +1709,18 @@ int Rtcm::read_MT1019(const std::string & message, Gps_Ephemeris & gps_eph) | ||||
| // | ||||
| // ******************************************************** | ||||
|  | ||||
| std::string Rtcm::print_MT1020(const Glonass_Gnav_Ephemeris & glonass_gnav_eph) | ||||
| std::string Rtcm::print_MT1020(const Glonass_Gnav_Ephemeris & glonass_gnav_eph, const Glonass_Gnav_Utc_Model & glonass_gnav_utc_model) | ||||
| { | ||||
|     unsigned int msg_number = 1020; | ||||
|     unsigned int glonass_gnav_alm_health = 0; | ||||
|     unsigned int glonass_gnav_alm_health_ind = 0; | ||||
|     unsigned int fifth_str_additional_data_ind = 1; | ||||
|  | ||||
|     Rtcm::set_DF002(msg_number); | ||||
|     Rtcm::set_DF038(glonass_gnav_eph); | ||||
|     Rtcm::set_DF040(glonass_gnav_eph); | ||||
|     Rtcm::set_DF104(glonass_gnav_eph); | ||||
|     Rtcm::set_DF105(glonass_gnav_eph); | ||||
|     Rtcm::set_DF104(glonass_gnav_alm_health); | ||||
|     Rtcm::set_DF105(glonass_gnav_alm_health_ind); | ||||
|     Rtcm::set_DF106(glonass_gnav_eph); | ||||
|     Rtcm::set_DF107(glonass_gnav_eph); | ||||
|     Rtcm::set_DF108(glonass_gnav_eph); | ||||
| @@ -1743,11 +1746,11 @@ std::string Rtcm::print_MT1020(const Glonass_Gnav_Ephemeris & glonass_gnav_eph) | ||||
|     Rtcm::set_DF128(glonass_gnav_eph); | ||||
|     Rtcm::set_DF129(glonass_gnav_eph); | ||||
|     Rtcm::set_DF130(glonass_gnav_eph); | ||||
|     Rtcm::set_DF131(glonass_gnav_eph); | ||||
|     Rtcm::set_DF132(glonass_gnav_eph); | ||||
|     Rtcm::set_DF133(glonass_gnav_eph); | ||||
|     Rtcm::set_DF134(glonass_gnav_eph); | ||||
|     Rtcm::set_DF135(glonass_gnav_eph); | ||||
|     Rtcm::set_DF131(fifth_str_additional_data_ind); | ||||
|     Rtcm::set_DF132(glonass_gnav_utc_model); | ||||
|     Rtcm::set_DF133(glonass_gnav_utc_model); | ||||
|     Rtcm::set_DF134(glonass_gnav_utc_model); | ||||
|     Rtcm::set_DF135(glonass_gnav_utc_model); | ||||
|     Rtcm::set_DF136(glonass_gnav_eph); | ||||
|  | ||||
|     std::string data; | ||||
| @@ -1804,10 +1807,13 @@ std::string Rtcm::print_MT1020(const Glonass_Gnav_Ephemeris & glonass_gnav_eph) | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::read_MT1020(const std::string & message, Glonass_Gnav_Ephemeris & glonass_gnav_eph) | ||||
| int Rtcm::read_MT1020(const std::string & message, Glonass_Gnav_Ephemeris & glonass_gnav_eph, Glonass_Gnav_Utc_Model & glonass_gnav_utc_model) | ||||
| { | ||||
|     // Convert message to binary | ||||
|     std::string message_bin = Rtcm::binary_data_to_bin(message); | ||||
|     int glonass_gnav_alm_health; | ||||
|     int glonass_gnav_alm_health_ind; | ||||
|     int fifth_str_additional_data_ind; | ||||
|  | ||||
|     if(!Rtcm::check_CRC(message) ) | ||||
|         { | ||||
| @@ -1845,20 +1851,21 @@ int Rtcm::read_MT1020(const std::string & message, Glonass_Gnav_Ephemeris & glon | ||||
|     glonass_gnav_eph.i_satellite_freq_channel = static_cast<unsigned int>(Rtcm::bin_to_uint(message_bin.substr(index, 5))); | ||||
|     index += 5; | ||||
|  | ||||
|     glonass_gnav_eph.i_almanac_health = static_cast<int>(Rtcm::bin_to_uint(message_bin.substr(index, 1))); | ||||
|     glonass_gnav_alm_health = static_cast<int>(Rtcm::bin_to_uint(message_bin.substr(index, 1))); | ||||
|     index += 1; | ||||
|  | ||||
|     glonass_gnav_eph.i_alamanac_health_indi = static_cast<int>(Rtcm::bin_to_uint(message_bin.substr(index, 1))); | ||||
|     glonass_gnav_alm_health_ind = static_cast<int>(Rtcm::bin_to_uint(message_bin.substr(index, 1))); | ||||
|     index += 1; | ||||
|  | ||||
|     glonass_gnav_eph.d_P_1 = static_cast<int>(Rtcm::bin_to_uint(message_bin.substr(index, 2))); | ||||
|     index += 2; | ||||
|  | ||||
|     glonass_gnav_eph.d_t_k = static_cast<double>(Rtcm::bin_to_int(message_bin.substr(index, 1)))*30 | ||||
|     static_cast<double>(Rtcm::bin_to_int(message_bin.substr(index, 5)))*3600 + | ||||
|                              static_cast<double>(Rtcm::bin_to_int(message_bin.substr(index, 6)))*60 | ||||
|                              ; | ||||
|     index += 12; | ||||
|     glonass_gnav_eph.d_t_k += static_cast<double>(Rtcm::bin_to_int(message_bin.substr(index, 5)))*3600; | ||||
|     index += 5; | ||||
|     glonass_gnav_eph.d_t_k += static_cast<double>(Rtcm::bin_to_int(message_bin.substr(index, 6)))*60; | ||||
|     index += 6; | ||||
|     glonass_gnav_eph.d_t_k += static_cast<double>(Rtcm::bin_to_int(message_bin.substr(index, 1)))*30; | ||||
|     index += 1; | ||||
|  | ||||
|     glonass_gnav_eph.d_B_n = static_cast<double>(Rtcm::bin_to_uint(message_bin.substr(index, 1))); | ||||
|     index += 1; | ||||
| @@ -1906,7 +1913,7 @@ int Rtcm::read_MT1020(const std::string & message, Glonass_Gnav_Ephemeris & glon | ||||
|     glonass_gnav_eph.d_P = static_cast<double>(Rtcm::bin_to_uint(message_bin.substr(index, 2))); | ||||
|     index += 2; | ||||
|  | ||||
|     glonass_gnav_eph.d_l_n = static_cast<double>(Rtcm::bin_to_uint(message_bin.substr(index, 1))); | ||||
|     glonass_gnav_eph.d_l3rd_n = static_cast<double>(Rtcm::bin_to_uint(message_bin.substr(index, 1))); | ||||
|     index += 1; | ||||
|  | ||||
|     glonass_gnav_eph.d_tau_n = static_cast<double>(Rtcm::bin_to_uint(message_bin.substr(index, 22)))* TWO_N30; | ||||
| @@ -1930,22 +1937,22 @@ int Rtcm::read_MT1020(const std::string & message, Glonass_Gnav_Ephemeris & glon | ||||
|     glonass_gnav_eph.d_M = static_cast<double>(Rtcm::bin_to_uint(message_bin.substr(index, 2))); | ||||
|     index += 2; | ||||
|  | ||||
|     glonass_gnav_eph.d_i_0 = static_cast<double>(Rtcm::bin_to_uint(message_bin.substr(index, 1))); | ||||
|     fifth_str_additional_data_ind = static_cast<double>(Rtcm::bin_to_uint(message_bin.substr(index, 1))); | ||||
|     index += 1; | ||||
|  | ||||
|     glonass_gnav_eph.d_N_A = static_cast<double>(Rtcm::bin_to_uint(message_bin.substr(index, 11))); | ||||
|     glonass_gnav_utc_model.d_N_A = static_cast<double>(Rtcm::bin_to_uint(message_bin.substr(index, 11))); | ||||
|     index += 11; | ||||
|  | ||||
|     glonass_gnav_eph.d_tau_c = static_cast<double>(Rtcm::bin_to_int(message_bin.substr(index, 32)))* TWO_N31; | ||||
|     glonass_gnav_utc_model.d_tau_c = static_cast<double>(Rtcm::bin_to_int(message_bin.substr(index, 32)))* TWO_N31; | ||||
|     index += 32; | ||||
|  | ||||
|     glonass_gnav_eph.d_N_4 = static_cast<double>(Rtcm::bin_to_uint(message_bin.substr(index, 5))); | ||||
|     glonass_gnav_utc_model.d_N_4 = static_cast<double>(Rtcm::bin_to_uint(message_bin.substr(index, 5))); | ||||
|     index += 5; | ||||
|  | ||||
|     glonass_gnav_eph.d_tau_gps = static_cast<double>(Rtcm::bin_to_int(message_bin.substr(index, 22)))* TWO_N30; | ||||
|     glonass_gnav_utc_model.d_tau_gps = static_cast<double>(Rtcm::bin_to_int(message_bin.substr(index, 22)))* TWO_N30; | ||||
|     index += 22; | ||||
|  | ||||
|     glonass_gnav_eph.d_l_n = static_cast<int>(Rtcm::bin_to_uint(message_bin.substr(index, 1))); | ||||
|     glonass_gnav_eph.d_l5th_n = static_cast<int>(Rtcm::bin_to_uint(message_bin.substr(index, 1))); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
| @@ -2247,8 +2254,9 @@ std::string Rtcm::print_MSM_1( const Gps_Ephemeris & gps_eph, | ||||
|     unsigned int msg_number = 0; | ||||
|     if(gps_eph.i_satellite_PRN != 0) msg_number = 1071; | ||||
|     if(gps_cnav_eph.i_satellite_PRN != 0) msg_number = 1071; | ||||
|     if(glo_gnav_eph.i_satellite_PRN != 0) msg_number = 1081; | ||||
|     if(gal_eph.i_satellite_PRN != 0) msg_number = 1091; | ||||
|     if(((gps_eph.i_satellite_PRN != 0) ||(gps_cnav_eph.i_satellite_PRN != 0) ) && (gal_eph.i_satellite_PRN != 0)) | ||||
|     if(((gps_eph.i_satellite_PRN != 0) ||(gps_cnav_eph.i_satellite_PRN != 0) ) && (gal_eph.i_satellite_PRN != 0) && (glo_gnav_eph.i_satellite_PRN != 0)) | ||||
|         { | ||||
|             LOG(WARNING) << "MSM messages for observables from different systems are not defined"; //print two messages? | ||||
|         } | ||||
| @@ -2293,9 +2301,10 @@ std::string Rtcm::get_MSM_header(unsigned int msg_number, | ||||
|         bool divergence_free, | ||||
|         bool more_messages) | ||||
| { | ||||
|     std::string sys(&observables.second.System, 1); | ||||
|     Rtcm::set_DF002(msg_number); | ||||
|     Rtcm::set_DF003(ref_id); | ||||
|     Rtcm::set_DF004(obs_time); | ||||
|  | ||||
|     Rtcm::set_DF393(more_messages); | ||||
|     Rtcm::set_DF409(0); // Issue of Data Station. 0: not utilized | ||||
|     std::bitset<7> DF001_ = std::bitset<7>("0000000"); | ||||
| @@ -2308,7 +2317,20 @@ std::string Rtcm::get_MSM_header(unsigned int msg_number, | ||||
|     Rtcm::set_DF395(observables); | ||||
|  | ||||
|     std::string header = DF002.to_string() + DF003.to_string(); | ||||
|     header += DF004.to_string(); | ||||
|     // GNSS Epoch Time Specific to each constellation | ||||
|     if((sys.compare("R") == 0 )) | ||||
|       { | ||||
|         // GLONASS Epoch Time | ||||
|         Rtcm::set_DF034(obs_time); | ||||
|         header += DF034.to_string(); | ||||
|       } | ||||
|     else | ||||
|       { | ||||
|         // GPS, Galileo Epoch Time | ||||
|         Rtcm::set_DF004(obs_time); | ||||
|         header += DF004.to_string(); | ||||
|       } | ||||
|  | ||||
|     header = header + DF393.to_string() + | ||||
|             DF409.to_string() + | ||||
|             DF001_.to_string() + | ||||
| @@ -2413,8 +2435,9 @@ std::string Rtcm::print_MSM_2( const Gps_Ephemeris & gps_eph, | ||||
|     unsigned int msg_number = 0; | ||||
|     if(gps_eph.i_satellite_PRN != 0) msg_number = 1072; | ||||
|     if(gps_cnav_eph.i_satellite_PRN != 0) msg_number = 1072; | ||||
|     if(glo_gnav_eph.i_satellite_PRN != 0) msg_number = 1082; | ||||
|     if(gal_eph.i_satellite_PRN != 0) msg_number = 1092; | ||||
|     if(((gps_eph.i_satellite_PRN != 0) ||(gps_cnav_eph.i_satellite_PRN != 0) ) && (gal_eph.i_satellite_PRN != 0)) | ||||
|     if(((gps_eph.i_satellite_PRN != 0) ||(gps_cnav_eph.i_satellite_PRN != 0) ) && (gal_eph.i_satellite_PRN != 0) && (glo_gnav_eph.i_satellite_PRN != 0)) | ||||
|         { | ||||
|             LOG(WARNING) << "MSM messages for observables from different systems are not defined"; //print two messages? | ||||
|         } | ||||
| @@ -2479,7 +2502,7 @@ std::string Rtcm::get_MSM_2_content_signal_data(const Gps_Ephemeris & ephNAV, | ||||
|     for(unsigned int cell = 0; cell < Ncells ; cell++) | ||||
|         { | ||||
|             Rtcm::set_DF401(ordered_by_PRN_pos.at( cell ).second); | ||||
|             Rtcm::set_DF402(ephNAV, ephCNAV, ephFNAV, obs_time, ordered_by_PRN_pos.at( cell ).second); | ||||
|             Rtcm::set_DF402(ephNAV, ephCNAV, ephFNAV, ephGNAV, obs_time, ordered_by_PRN_pos.at( cell ).second); | ||||
|             Rtcm::set_DF420(ordered_by_PRN_pos.at( cell ).second); | ||||
|             first_data_type += DF401.to_string(); | ||||
|             second_data_type += DF402.to_string(); | ||||
| @@ -2514,8 +2537,9 @@ std::string Rtcm::print_MSM_3( const Gps_Ephemeris & gps_eph, | ||||
|     unsigned int msg_number = 0; | ||||
|     if(gps_eph.i_satellite_PRN != 0) msg_number = 1073; | ||||
|     if(gps_cnav_eph.i_satellite_PRN != 0) msg_number = 1073; | ||||
|     if(glo_gnav_eph.i_satellite_PRN != 0) msg_number = 1083; | ||||
|     if(gal_eph.i_satellite_PRN != 0) msg_number = 1093; | ||||
|     if(((gps_eph.i_satellite_PRN != 0) ||(gps_cnav_eph.i_satellite_PRN != 0) ) && (gal_eph.i_satellite_PRN != 0)) | ||||
|     if(((gps_eph.i_satellite_PRN != 0) ||(gps_cnav_eph.i_satellite_PRN != 0) ) && (gal_eph.i_satellite_PRN != 0) && (glo_gnav_eph.i_satellite_PRN != 0)) | ||||
|         { | ||||
|             LOG(WARNING) << "MSM messages for observables from different systems are not defined"; //print two messages? | ||||
|         } | ||||
| @@ -2582,7 +2606,7 @@ std::string Rtcm::get_MSM_3_content_signal_data(const Gps_Ephemeris & ephNAV, | ||||
|         { | ||||
|             Rtcm::set_DF400(ordered_by_PRN_pos.at( cell ).second); | ||||
|             Rtcm::set_DF401(ordered_by_PRN_pos.at( cell ).second); | ||||
|             Rtcm::set_DF402(ephNAV, ephCNAV, ephFNAV, obs_time, ordered_by_PRN_pos.at( cell ).second); | ||||
|             Rtcm::set_DF402(ephNAV, ephCNAV, ephFNAV, ephGNAV, obs_time, ordered_by_PRN_pos.at( cell ).second); | ||||
|             Rtcm::set_DF420(ordered_by_PRN_pos.at( cell ).second); | ||||
|             first_data_type += DF400.to_string(); | ||||
|             second_data_type += DF401.to_string(); | ||||
| @@ -2617,8 +2641,9 @@ std::string Rtcm::print_MSM_4( const Gps_Ephemeris & gps_eph, | ||||
|     unsigned int msg_number = 0; | ||||
|     if(gps_eph.i_satellite_PRN != 0) msg_number = 1074; | ||||
|     if(gps_cnav_eph.i_satellite_PRN != 0) msg_number = 1074; | ||||
|     if(glo_gnav_eph.i_satellite_PRN != 0) msg_number = 1084; | ||||
|     if(gal_eph.i_satellite_PRN != 0) msg_number = 1094; | ||||
|     if(((gps_eph.i_satellite_PRN != 0) ||(gps_cnav_eph.i_satellite_PRN != 0) ) && (gal_eph.i_satellite_PRN != 0)) | ||||
|     if(((gps_eph.i_satellite_PRN != 0) ||(gps_cnav_eph.i_satellite_PRN != 0) ) && (gal_eph.i_satellite_PRN != 0) && (glo_gnav_eph.i_satellite_PRN != 0)) | ||||
|         { | ||||
|             LOG(WARNING) << "MSM messages for observables from different systems are not defined"; //print two messages? | ||||
|         } | ||||
| @@ -2726,7 +2751,7 @@ std::string Rtcm::get_MSM_4_content_signal_data(const Gps_Ephemeris & ephNAV, | ||||
|         { | ||||
|             Rtcm::set_DF400(ordered_by_PRN_pos.at( cell ).second); | ||||
|             Rtcm::set_DF401(ordered_by_PRN_pos.at( cell ).second); | ||||
|             Rtcm::set_DF402(ephNAV, ephCNAV, ephFNAV, obs_time, ordered_by_PRN_pos.at( cell ).second); | ||||
|             Rtcm::set_DF402(ephNAV, ephCNAV, ephFNAV, ephGNAV, obs_time, ordered_by_PRN_pos.at( cell ).second); | ||||
|             Rtcm::set_DF420(ordered_by_PRN_pos.at( cell ).second); | ||||
|             Rtcm::set_DF403(ordered_by_PRN_pos.at( cell ).second); | ||||
|             first_data_type += DF400.to_string(); | ||||
| @@ -2763,8 +2788,9 @@ std::string Rtcm::print_MSM_5( const Gps_Ephemeris & gps_eph, | ||||
|     unsigned int msg_number = 0; | ||||
|     if(gps_eph.i_satellite_PRN != 0) msg_number = 1075; | ||||
|     if(gps_cnav_eph.i_satellite_PRN != 0) msg_number = 1075; | ||||
|     if(glo_gnav_eph.i_satellite_PRN != 0) msg_number = 1085; | ||||
|     if(gal_eph.i_satellite_PRN != 0) msg_number = 1095; | ||||
|     if(((gps_eph.i_satellite_PRN != 0) ||(gps_cnav_eph.i_satellite_PRN != 0) ) && (gal_eph.i_satellite_PRN != 0)) | ||||
|     if(((gps_eph.i_satellite_PRN != 0) ||(gps_cnav_eph.i_satellite_PRN != 0) ) && (gal_eph.i_satellite_PRN != 0) && (glo_gnav_eph.i_satellite_PRN != 0)) | ||||
|         { | ||||
|             LOG(WARNING) << "MSM messages for observables from different systems are not defined"; //print two messages? | ||||
|         } | ||||
| @@ -2879,7 +2905,7 @@ std::string Rtcm::get_MSM_5_content_signal_data(const Gps_Ephemeris & ephNAV, | ||||
|         { | ||||
|             Rtcm::set_DF400(ordered_by_PRN_pos.at( cell ).second); | ||||
|             Rtcm::set_DF401(ordered_by_PRN_pos.at( cell ).second); | ||||
|             Rtcm::set_DF402(ephNAV, ephCNAV, ephFNAV, obs_time, ordered_by_PRN_pos.at( cell ).second); | ||||
|             Rtcm::set_DF402(ephNAV, ephCNAV, ephFNAV, ephGNAV, obs_time, ordered_by_PRN_pos.at( cell ).second); | ||||
|             Rtcm::set_DF420(ordered_by_PRN_pos.at( cell ).second); | ||||
|             Rtcm::set_DF403(ordered_by_PRN_pos.at( cell ).second); | ||||
|             Rtcm::set_DF404(ordered_by_PRN_pos.at( cell ).second); | ||||
| @@ -2919,8 +2945,9 @@ std::string Rtcm::print_MSM_6( const Gps_Ephemeris & gps_eph, | ||||
|     unsigned int msg_number = 0; | ||||
|     if(gps_eph.i_satellite_PRN != 0) msg_number = 1076; | ||||
|     if(gps_cnav_eph.i_satellite_PRN != 0) msg_number = 1076; | ||||
|     if(glo_gnav_eph.i_satellite_PRN != 0) msg_number = 1086; | ||||
|     if(gal_eph.i_satellite_PRN != 0) msg_number = 1096; | ||||
|     if(((gps_eph.i_satellite_PRN != 0) ||(gps_cnav_eph.i_satellite_PRN != 0) ) && (gal_eph.i_satellite_PRN != 0)) | ||||
|     if(((gps_eph.i_satellite_PRN != 0) ||(gps_cnav_eph.i_satellite_PRN != 0) ) && (gal_eph.i_satellite_PRN != 0) && (glo_gnav_eph.i_satellite_PRN != 0)) | ||||
|         { | ||||
|             LOG(WARNING) << "MSM messages for observables from different systems are not defined"; //print two messages? | ||||
|         } | ||||
| @@ -2988,7 +3015,7 @@ std::string Rtcm::get_MSM_6_content_signal_data(const Gps_Ephemeris & ephNAV, | ||||
|         { | ||||
|             Rtcm::set_DF405(ordered_by_PRN_pos.at( cell ).second); | ||||
|             Rtcm::set_DF406(ordered_by_PRN_pos.at( cell ).second); | ||||
|             Rtcm::set_DF407(ephNAV, ephCNAV, ephFNAV, obs_time, ordered_by_PRN_pos.at( cell ).second); | ||||
|             Rtcm::set_DF407(ephNAV, ephCNAV, ephFNAV, ephGNAV, obs_time, ordered_by_PRN_pos.at( cell ).second); | ||||
|             Rtcm::set_DF420(ordered_by_PRN_pos.at( cell ).second); | ||||
|             Rtcm::set_DF408(ordered_by_PRN_pos.at( cell ).second); | ||||
|             first_data_type += DF405.to_string(); | ||||
| @@ -3026,8 +3053,9 @@ std::string Rtcm::print_MSM_7( const Gps_Ephemeris & gps_eph, | ||||
|     unsigned int msg_number = 0; | ||||
|     if(gps_eph.i_satellite_PRN != 0) msg_number = 1077; | ||||
|     if(gps_cnav_eph.i_satellite_PRN != 0) msg_number = 1077; | ||||
|     if(glo_gnav_eph.i_satellite_PRN != 0) msg_number = 1087; | ||||
|     if(gal_eph.i_satellite_PRN != 0) msg_number = 1097; | ||||
|     if(((gps_eph.i_satellite_PRN != 0) || (gps_cnav_eph.i_satellite_PRN != 0) ) && (gal_eph.i_satellite_PRN != 0)) | ||||
|     if(((gps_eph.i_satellite_PRN != 0) || (gps_cnav_eph.i_satellite_PRN != 0) ) && (glo_gnav_eph.i_satellite_PRN != 0) && (gal_eph.i_satellite_PRN != 0)) | ||||
|         { | ||||
|             LOG(WARNING) << "MSM messages for observables from different systems are not defined"; //print two messages? | ||||
|         } | ||||
| @@ -3096,7 +3124,7 @@ std::string Rtcm::get_MSM_7_content_signal_data(const Gps_Ephemeris & ephNAV, | ||||
|         { | ||||
|             Rtcm::set_DF405(ordered_by_PRN_pos.at( cell ).second); | ||||
|             Rtcm::set_DF406(ordered_by_PRN_pos.at( cell ).second); | ||||
|             Rtcm::set_DF407(ephNAV, ephCNAV, ephFNAV, obs_time, ordered_by_PRN_pos.at( cell ).second); | ||||
|             Rtcm::set_DF407(ephNAV, ephCNAV, ephFNAV, ephGNAV, obs_time, ordered_by_PRN_pos.at( cell ).second); | ||||
|             Rtcm::set_DF420(ordered_by_PRN_pos.at( cell ).second); | ||||
|             Rtcm::set_DF408(ordered_by_PRN_pos.at( cell ).second); | ||||
|             Rtcm::set_DF404(ordered_by_PRN_pos.at( cell ).second); | ||||
| @@ -3724,7 +3752,7 @@ int Rtcm::set_DF034(double obs_time) | ||||
|     if(tk > 86400999) | ||||
|         { | ||||
|             LOG(WARNING) << "To large GLONASS Epoch Time (tk)! Set to the last millisecond of the day"; | ||||
|             tow = 86400999; | ||||
|             tk = 86400999; | ||||
|         } | ||||
|     DF034 = std::bitset<27>(tk); | ||||
|     return 0; | ||||
| @@ -3798,10 +3826,23 @@ int Rtcm::set_DF039(bool code_indicator) | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF040(unsigned short frequency_channel_number) | ||||
| int Rtcm::set_DF040(unsigned int frequency_channel_number) | ||||
| { | ||||
|     unsigned int freq_ = frequency_channel_number; | ||||
|     if(freq_ > 20) | ||||
|         { | ||||
|             LOG(WARNING) << "GLONASS Satellite Frequency Number must be between 0 and 20, but channel frequency number " << freq_ << " was found"; | ||||
|         } | ||||
|  | ||||
|     DF040 = std::bitset<5>(freq_); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF040(const Glonass_Gnav_Ephemeris & glonass_gnav_eph) | ||||
| { | ||||
|     unsigned int freq_ = glonass_gnav_eph.i_satellite_freq_channel; | ||||
|     if(prn_ > 20) | ||||
|     if(freq_ > 20) | ||||
|         { | ||||
|             LOG(WARNING) << "GLONASS Satellite Frequency Number must be between 0 and 20, but channel frequency number " << freq_ << " was found"; | ||||
|         } | ||||
| @@ -4186,6 +4227,264 @@ int Rtcm::set_DF103(const Gps_Ephemeris & gps_eph) | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF104(unsigned int glonass_gnav_alm_health) | ||||
| { | ||||
|     DF104 = std::bitset<1>(glonass_gnav_alm_health); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF105(unsigned int glonass_gnav_alm_health_ind) | ||||
| { | ||||
|     DF105 = std::bitset<1>(glonass_gnav_alm_health_ind); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF106(const Glonass_Gnav_Ephemeris & glonass_gnav_eph) | ||||
| { | ||||
|     unsigned int P_1 = static_cast<unsigned int>(std::round(glonass_gnav_eph.d_P_1)); | ||||
|     DF106 = std::bitset<2>(P_1); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF107(const Glonass_Gnav_Ephemeris & glonass_gnav_eph) | ||||
| { | ||||
|     // TODO Need to fix this here, bit position has a given order | ||||
|     DF107 = std::bitset<12>(glonass_gnav_eph.d_t_k); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF108(const Glonass_Gnav_Ephemeris & glonass_gnav_eph) | ||||
| { | ||||
|     DF108 = std::bitset<1>(glonass_gnav_eph.d_B_n); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF109(const Glonass_Gnav_Ephemeris & glonass_gnav_eph) | ||||
| { | ||||
|     DF109 = std::bitset<1>(glonass_gnav_eph.d_P_2); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF110(const Glonass_Gnav_Ephemeris & glonass_gnav_eph) | ||||
| { | ||||
|     unsigned int t_b = static_cast<unsigned int>(std::round(glonass_gnav_eph.d_t_b)); | ||||
|     DF110 = std::bitset<7>(t_b); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF111(const Glonass_Gnav_Ephemeris & glonass_gnav_eph) | ||||
| { | ||||
|     int VXn = static_cast<int>(std::round(glonass_gnav_eph.d_VXn/TWO_N20)); | ||||
|     DF111 = std::bitset<24>(VXn); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF112(const Glonass_Gnav_Ephemeris & glonass_gnav_eph) | ||||
| { | ||||
|     int Xn = static_cast<int>(std::round(glonass_gnav_eph.d_Xn/TWO_N11)); | ||||
|     DF112 = std::bitset<27>(Xn); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF113(const Glonass_Gnav_Ephemeris & glonass_gnav_eph) | ||||
| { | ||||
|     int AXn = static_cast<int>(std::round(glonass_gnav_eph.d_AXn/TWO_N11)); | ||||
|     DF113 = std::bitset<5>(AXn); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF114(const Glonass_Gnav_Ephemeris & glonass_gnav_eph) | ||||
| { | ||||
|     int VYn = static_cast<int>(std::round(glonass_gnav_eph.d_VYn/TWO_N20)); | ||||
|     DF114 = std::bitset<24>(VYn); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF115(const Glonass_Gnav_Ephemeris & glonass_gnav_eph) | ||||
| { | ||||
|     int Yn = static_cast<int>(std::round(glonass_gnav_eph.d_Yn/TWO_N11)); | ||||
|     DF115 = std::bitset<27>(Yn); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF116(const Glonass_Gnav_Ephemeris & glonass_gnav_eph) | ||||
| { | ||||
|     int AYn = static_cast<int>(std::round(glonass_gnav_eph.d_AYn/TWO_N11)); | ||||
|     DF116 = std::bitset<5>(AYn); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF117(const Glonass_Gnav_Ephemeris & glonass_gnav_eph) | ||||
| { | ||||
|     int VZn = static_cast<int>(std::round(glonass_gnav_eph.d_VZn/TWO_N20)); | ||||
|     DF117 = std::bitset<24>(VZn); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF118(const Glonass_Gnav_Ephemeris & glonass_gnav_eph) | ||||
| { | ||||
|     int Zn = static_cast<int>(std::round(glonass_gnav_eph.d_Zn/TWO_N11)); | ||||
|     DF118 = std::bitset<27>(Zn); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF119(const Glonass_Gnav_Ephemeris & glonass_gnav_eph) | ||||
| { | ||||
|     int AZn = static_cast<int>(std::round(glonass_gnav_eph.d_AZn/TWO_N11)); | ||||
|     DF119 = std::bitset<5>(AZn); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF120(const Glonass_Gnav_Ephemeris & glonass_gnav_eph) | ||||
| { | ||||
|     unsigned int P3 = static_cast<int>(std::round(glonass_gnav_eph.d_P_3/TWO_N11)); | ||||
|     DF120 = std::bitset<1>(P3); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF121(const Glonass_Gnav_Ephemeris & glonass_gnav_eph) | ||||
| { | ||||
|     int gamma_n = static_cast<int>(std::round(glonass_gnav_eph.d_gamma_n/TWO_N40)); | ||||
|     DF121 = std::bitset<11>(gamma_n); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF122(const Glonass_Gnav_Ephemeris & glonass_gnav_eph) | ||||
| { | ||||
|     unsigned int P = static_cast<unsigned int>(std::round(glonass_gnav_eph.d_P)); | ||||
|     DF122 = std::bitset<2>(P); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF123(const Glonass_Gnav_Ephemeris & glonass_gnav_eph) | ||||
| { | ||||
|     unsigned int ln = static_cast<unsigned int>((glonass_gnav_eph.d_l3rd_n)); | ||||
|     DF123 = std::bitset<1>(ln); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF124(const Glonass_Gnav_Ephemeris & glonass_gnav_eph) | ||||
| { | ||||
|     int tau_n = static_cast<int>(std::round(glonass_gnav_eph.d_tau_n/TWO_N30)); | ||||
|     DF124 = std::bitset<22>(tau_n); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF125(const Glonass_Gnav_Ephemeris & glonass_gnav_eph) | ||||
| { | ||||
|     int delta_tau_n = static_cast<int>(std::round(glonass_gnav_eph.d_Delta_tau_n)); | ||||
|     DF125 = std::bitset<5>(delta_tau_n); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF126(const Glonass_Gnav_Ephemeris & glonass_gnav_eph) | ||||
| { | ||||
|     unsigned int ecc = static_cast<unsigned int>(std::round(glonass_gnav_eph.d_E_n)); | ||||
|     DF126 = std::bitset<5>(ecc); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF127(const Glonass_Gnav_Ephemeris & glonass_gnav_eph) | ||||
| { | ||||
|     unsigned int P4= static_cast<unsigned int>(std::round(glonass_gnav_eph.d_P_4)); | ||||
|     DF127 = std::bitset<1>(P4); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF128(const Glonass_Gnav_Ephemeris & glonass_gnav_eph) | ||||
| { | ||||
|     unsigned int F_t = static_cast<unsigned int>(std::round(glonass_gnav_eph.d_F_T)); | ||||
|     DF128 = std::bitset<4>(F_t); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF129(const Glonass_Gnav_Ephemeris & glonass_gnav_eph) | ||||
| { | ||||
|     unsigned int N_t = static_cast<unsigned int>(std::round(glonass_gnav_eph.d_N_T)); | ||||
|     DF129 = std::bitset<11>(N_t); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF130(const Glonass_Gnav_Ephemeris & glonass_gnav_eph) | ||||
| { | ||||
|     unsigned int M = static_cast<unsigned int>(std::round(glonass_gnav_eph.d_M)); | ||||
|     DF130 = std::bitset<2>(M); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF131(unsigned int fifth_str_additional_data_ind) | ||||
| { | ||||
|     unsigned int fith_str_data = static_cast<unsigned int>(fifth_str_additional_data_ind); | ||||
|     DF131 = std::bitset<1>(fith_str_data); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF132(const Glonass_Gnav_Utc_Model & glonass_gnav_utc_model) | ||||
| { | ||||
|     unsigned int N_A = static_cast<unsigned int>(std::round(glonass_gnav_utc_model.d_N_A)); | ||||
|     DF132 = std::bitset<11>(N_A); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF133(const Glonass_Gnav_Utc_Model & glonass_gnav_utc_model) | ||||
| { | ||||
|     int tau_c = static_cast<int>(std::round(glonass_gnav_utc_model.d_tau_c/TWO_N31)); | ||||
|     DF133 = std::bitset<32>(tau_c); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF134(const Glonass_Gnav_Utc_Model & glonass_gnav_utc_model) | ||||
| { | ||||
|     unsigned int N_4 = static_cast<unsigned int>(std::round(glonass_gnav_utc_model.d_N_4)); | ||||
|     DF134 = std::bitset<11>(N_4); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF135(const Glonass_Gnav_Utc_Model & glonass_gnav_utc_model) | ||||
| { | ||||
|     int tau_gps = static_cast<int>(std::round(glonass_gnav_utc_model.d_tau_gps)/TWO_N30); | ||||
|     DF135 = std::bitset<22>(tau_gps); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF136(const Glonass_Gnav_Ephemeris & glonass_gnav_eph) | ||||
| { | ||||
|     unsigned int l_n = static_cast<unsigned int>(std::round(glonass_gnav_eph.d_l5th_n)); | ||||
|     DF136 = std::bitset<1>(l_n); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF137(const Gps_Ephemeris & gps_eph) | ||||
| @@ -4526,6 +4825,16 @@ int Rtcm::set_DF395(const std::map<int, Gnss_Synchro> & gnss_synchro) | ||||
|                     mask_position = 32 - 16; | ||||
|                     DF395.set(mask_position, true); | ||||
|                 } | ||||
|             if ((sig.compare("1C") == 0) && (sys.compare("R") == 0 ) ) | ||||
|                 { | ||||
|                     mask_position = 32 - 2; | ||||
|                     DF395.set(mask_position, true); | ||||
|                 } | ||||
|             if ((sig.compare("2C") == 0) && (sys.compare("R") == 0 ) ) | ||||
|                 { | ||||
|                     mask_position = 32 - 8; | ||||
|                     DF395.set(mask_position, true); | ||||
|                 } | ||||
|         } | ||||
|  | ||||
|     return 0; | ||||
| @@ -4786,27 +5095,38 @@ int Rtcm::set_DF401(const Gnss_Synchro & gnss_synchro) | ||||
|     double lambda = 0.0; | ||||
|     std::string sig_(gnss_synchro.Signal); | ||||
|     std::string sig = sig_.substr(0,2); | ||||
|     std::string sys(&gnss_synchro.System, 1); | ||||
|  | ||||
|     if (sig.compare("1C") == 0 ) | ||||
|     if ((sig.compare("1C") == 0) && (sys.compare("G") == 0 )) | ||||
|         { | ||||
|             lambda = GPS_C_m_s / GPS_L1_FREQ_HZ; | ||||
|         } | ||||
|     if (sig.compare("2S") == 0 ) | ||||
|     if ((sig.compare("2S")) == 0 && (sys.compare("G") == 0 )) | ||||
|         { | ||||
|             lambda = GPS_C_m_s / GPS_L2_FREQ_HZ; | ||||
|         } | ||||
|     if (sig.compare("5X") == 0 ) | ||||
|     if ((sig.compare("5X")) == 0 && (sys.compare("E") == 0 )) | ||||
|         { | ||||
|             lambda = GPS_C_m_s / Galileo_E5a_FREQ_HZ; | ||||
|         } | ||||
|     if (sig.compare("1B") == 0 ) | ||||
|     if ((sig.compare("1B")) == 0 && (sys.compare("E") == 0 )) | ||||
|         { | ||||
|             lambda = GPS_C_m_s / Galileo_E1_FREQ_HZ; | ||||
|         } | ||||
|     if (sig.compare("7X") == 0 ) | ||||
|     if ((sig.compare("7X")) == 0 && (sys.compare("E") == 0 )) | ||||
|         { | ||||
|             lambda = GPS_C_m_s / 1.207140e9; // Galileo_E1b_FREQ_HZ; | ||||
|         } | ||||
|       if ((sig.compare("1C") == 0) && (sys.compare("R") == 0 )) | ||||
|           { | ||||
|               // TODO Need to add slot number and freq number to gnss_syncro | ||||
|               lambda = GLONASS_C_m_s / (GLONASS_L1_FREQ_HZ); | ||||
|           } | ||||
|       if ((sig.compare("2C") == 0) && (sys.compare("R") == 0 )) | ||||
|           { | ||||
|               // TODO Need to add slot number and freq number to gnss_syncro | ||||
|               lambda = GLONASS_C_m_s / (GLONASS_L2_FREQ_HZ); | ||||
|           } | ||||
|  | ||||
|     phrng_m = (gnss_synchro.Carrier_phase_rads / GPS_TWO_PI ) * lambda - rough_range_m; | ||||
|  | ||||
| @@ -4837,23 +5157,33 @@ int Rtcm::set_DF401(const Gnss_Synchro & gnss_synchro) | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF402(const Gps_Ephemeris & ephNAV, const Gps_CNAV_Ephemeris & ephCNAV, const Galileo_Ephemeris & ephFNAV, double obs_time, const Gnss_Synchro & gnss_synchro) | ||||
| int Rtcm::set_DF402(const Gps_Ephemeris & ephNAV, const Gps_CNAV_Ephemeris & ephCNAV, const Galileo_Ephemeris & ephFNAV, const Glonass_Gnav_Ephemeris & ephGNAV, double obs_time, const Gnss_Synchro & gnss_synchro) | ||||
| { | ||||
|     unsigned int lock_time_period_s = 0; | ||||
|     unsigned int lock_time_indicator; | ||||
|     std::string sig_(gnss_synchro.Signal); | ||||
|     if(sig_.compare("1C")) | ||||
|     std::string sys(&gnss_synchro.System, 1); | ||||
|     if ((sig_.compare("1C") == 0) && (sys.compare("G") == 0 )) | ||||
|         { | ||||
|             lock_time_period_s = Rtcm::lock_time(ephNAV, obs_time, gnss_synchro); | ||||
|         } | ||||
|     if(sig_.compare("2S")) | ||||
|     if ((sig_.compare("2S") == 0) && (sys.compare("G") == 0 )) | ||||
|         { | ||||
|             lock_time_period_s = Rtcm::lock_time(ephCNAV, obs_time, gnss_synchro); | ||||
|         } | ||||
|     // TODO Should add system for galileo satellites | ||||
|     if(sig_.compare("1B") || sig_.compare("5X") || sig_.compare("7X") || sig_.compare("8X")) | ||||
|         { | ||||
|             lock_time_period_s = Rtcm::lock_time(ephFNAV, obs_time, gnss_synchro); | ||||
|         } | ||||
|     if ((sig_.compare("1C") == 0) && (sys.compare("R") == 0 )) | ||||
|         { | ||||
|             lock_time_period_s = Rtcm::lock_time(ephGNAV, obs_time, gnss_synchro); | ||||
|         } | ||||
|     if ((sig_.compare("2C") == 0) && (sys.compare("R") == 0 )) | ||||
|         { | ||||
|             lock_time_period_s = Rtcm::lock_time(ephGNAV, obs_time, gnss_synchro); | ||||
|         } | ||||
|     lock_time_indicator = Rtcm::msm_lock_time_indicator(lock_time_period_s); | ||||
|     DF402 = std::bitset<4>(lock_time_indicator); | ||||
|     return 0; | ||||
| @@ -4875,28 +5205,38 @@ int Rtcm::set_DF404(const Gnss_Synchro & gnss_synchro) | ||||
|     std::string sig_(gnss_synchro.Signal); | ||||
|     std::string sig = sig_.substr(0,2); | ||||
|     int fine_phaserange_rate; | ||||
|     std::string sys_(&gnss_synchro.System, 1); | ||||
|  | ||||
|     if (sig.compare("1C") == 0 ) | ||||
|     if ((sig_.compare("1C") == 0) && (sys_.compare("G") == 0 )) | ||||
|         { | ||||
|             lambda = GPS_C_m_s / GPS_L1_FREQ_HZ; | ||||
|         } | ||||
|     if (sig.compare("2S") == 0 ) | ||||
|     if ((sig_.compare("2S") == 0) && (sys_.compare("G") == 0 )) | ||||
|         { | ||||
|             lambda = GPS_C_m_s / GPS_L2_FREQ_HZ; | ||||
|         } | ||||
|     if (sig.compare("5X") == 0 ) | ||||
|     if ((sig_.compare("5X") == 0) && (sys_.compare("E") == 0 )) | ||||
|         { | ||||
|             lambda = GPS_C_m_s / Galileo_E5a_FREQ_HZ; | ||||
|         } | ||||
|     if (sig.compare("1B") == 0 ) | ||||
|     if ((sig_.compare("1B") == 0) && (sys_.compare("E") == 0 )) | ||||
|         { | ||||
|             lambda = GPS_C_m_s / Galileo_E1_FREQ_HZ; | ||||
|         } | ||||
|     if (sig.compare("7X") == 0 ) | ||||
|     if ((sig_.compare("7X") == 0 ) && (sys_.compare("E") == 0 )) | ||||
|         { | ||||
|             lambda = GPS_C_m_s / 1.207140e9; // Galileo_E1b_FREQ_HZ; | ||||
|         } | ||||
|  | ||||
|     if ((sig_.compare("1C") == 0) && (sys_.compare("R") == 0 )) | ||||
|         { | ||||
|             //TODO Need to add slot number and freq number to gnss syncro | ||||
|             lambda = GLONASS_C_m_s / (GLONASS_L1_FREQ_HZ); | ||||
|         } | ||||
|     if ((sig_.compare("2C") == 0) && (sys_.compare("R") == 0 )) | ||||
|         { | ||||
|             //TODO Need to add slot number and freq number to gnss syncro | ||||
|             lambda = GLONASS_C_m_s / (GLONASS_L2_FREQ_HZ); | ||||
|         } | ||||
|     double rough_phase_range_rate = std::round(- gnss_synchro.Carrier_Doppler_hz * lambda ); | ||||
|     double phrr = (- gnss_synchro.Carrier_Doppler_hz * lambda - rough_phase_range_rate); | ||||
|  | ||||
| @@ -4953,29 +5293,39 @@ int Rtcm::set_DF406(const Gnss_Synchro & gnss_synchro) | ||||
|     double phrng_m; | ||||
|     double lambda = 0.0; | ||||
|     std::string sig_(gnss_synchro.Signal); | ||||
|     std::string sig = sig_.substr(0,2); | ||||
|     sig_ = sig_.substr(0,2); | ||||
|     std::string sys_(&gnss_synchro.System, 1); | ||||
|  | ||||
|     if (sig.compare("1C") == 0 ) | ||||
|     if ((sig_.compare("1C") == 0) && (sys_.compare("G") == 0 ) ) | ||||
|         { | ||||
|             lambda = GPS_C_m_s / GPS_L1_FREQ_HZ; | ||||
|         } | ||||
|     if (sig.compare("2S") == 0 ) | ||||
|     if ((sig_.compare("2S") == 0) && (sys_.compare("G") == 0 ) ) | ||||
|         { | ||||
|             lambda = GPS_C_m_s / GPS_L2_FREQ_HZ; | ||||
|         } | ||||
|     if (sig.compare("5X") == 0 ) | ||||
|     if ((sig_.compare("5X") == 0) && (sys_.compare("E") == 0 ) ) | ||||
|         { | ||||
|             lambda = GPS_C_m_s / Galileo_E5a_FREQ_HZ; | ||||
|         } | ||||
|     if (sig.compare("1B") == 0 ) | ||||
|     if ((sig_.compare("1B") == 0) && (sys_.compare("E") == 0 ) ) | ||||
|         { | ||||
|             lambda = GPS_C_m_s / Galileo_E1_FREQ_HZ; | ||||
|         } | ||||
|     if (sig.compare("7X") == 0 ) | ||||
|     if ((sig_.compare("7X") == 0 ) && (sys_.compare("E") == 0 ) ) | ||||
|         { | ||||
|             lambda = GPS_C_m_s / 1.207140e9; // Galileo_E1b_FREQ_HZ; | ||||
|         } | ||||
|  | ||||
|     if ((sig_.compare("1C") == 0) && (sys_.compare("R") == 0 )) | ||||
|         { | ||||
|             //TODO Need to add slot number and freq number to gnss syncro | ||||
|             lambda = GLONASS_C_m_s / (GLONASS_L1_FREQ_HZ); | ||||
|         } | ||||
|     if ((sig_.compare("2C") == 0) && (sys_.compare("R") == 0 )) | ||||
|         { | ||||
|             //TODO Need to add slot number and freq number to gnss syncro | ||||
|             lambda = GLONASS_C_m_s / (GLONASS_L2_FREQ_HZ); | ||||
|         } | ||||
|     phrng_m = (gnss_synchro.Carrier_phase_rads / GPS_TWO_PI ) * lambda - rough_range_m; | ||||
|  | ||||
|     /* Substract phase - pseudorange integer cycle offset */ | ||||
| @@ -5005,24 +5355,33 @@ int Rtcm::set_DF406(const Gnss_Synchro & gnss_synchro) | ||||
| } | ||||
|  | ||||
|  | ||||
| int Rtcm::set_DF407(const Gps_Ephemeris & ephNAV, const Gps_CNAV_Ephemeris & ephCNAV, const Galileo_Ephemeris & ephFNAV, double obs_time, const Gnss_Synchro & gnss_synchro) | ||||
| int Rtcm::set_DF407(const Gps_Ephemeris & ephNAV, const Gps_CNAV_Ephemeris & ephCNAV, const Galileo_Ephemeris & ephFNAV, const Glonass_Gnav_Ephemeris & ephGNAV, double obs_time, const Gnss_Synchro & gnss_synchro) | ||||
| { | ||||
|     unsigned int lock_time_indicator; | ||||
|     unsigned int lock_time_period_s = 0; | ||||
|  | ||||
|     std::string sig_(gnss_synchro.Signal); | ||||
|     if(sig_.compare("1C")) | ||||
|     std::string sys_(&gnss_synchro.System, 1); | ||||
|     if((sig_.compare("1C")) && (sys_.compare("G") == 0 )) | ||||
|         { | ||||
|             lock_time_period_s = Rtcm::lock_time(ephNAV, obs_time, gnss_synchro); | ||||
|         } | ||||
|     if(sig_.compare("2S")) | ||||
|     if((sig_.compare("2S")) && (sys_.compare("G") == 0 )) | ||||
|         { | ||||
|             lock_time_period_s = Rtcm::lock_time(ephCNAV, obs_time, gnss_synchro); | ||||
|         } | ||||
|     if(sig_.compare("1B") || sig_.compare("5X") || sig_.compare("7X") || sig_.compare("8X")) | ||||
|     if((sig_.compare("1B") || sig_.compare("5X") || sig_.compare("7X") || sig_.compare("8X") ) && (sys_.compare("E") == 0 )) | ||||
|         { | ||||
|             lock_time_period_s = Rtcm::lock_time(ephFNAV, obs_time, gnss_synchro); | ||||
|         } | ||||
|     if ((sig_.compare("1C") == 0) && (sys_.compare("R") == 0 )) | ||||
|         { | ||||
|             lock_time_period_s = Rtcm::lock_time(ephGNAV, obs_time, gnss_synchro); | ||||
|         } | ||||
|     if ((sig_.compare("2C") == 0) && (sys_.compare("R") == 0 )) | ||||
|         { | ||||
|             lock_time_period_s = Rtcm::lock_time(ephGNAV, obs_time, gnss_synchro); | ||||
|         } | ||||
|     lock_time_indicator = Rtcm::msm_extended_lock_time_indicator(lock_time_period_s); | ||||
|     DF407 = std::bitset<10>(lock_time_indicator); | ||||
|     return 0; | ||||
|   | ||||
| @@ -158,7 +158,7 @@ public: | ||||
|      * \params observables Set of observables as defined by the platform | ||||
|      * \return string with message contents | ||||
|      */ | ||||
|     std::string print_MT1011(Glonass_Gnav_Ephemeris& glonass_gnav_ephL1, Glonass_Gnav_Ephemeris& glonass_gnav_ephL2, double obs_time, const std::map<int, Gnss_Synchro> & observables, unsigned short station_id); | ||||
|     std::string print_MT1011(const Glonass_Gnav_Ephemeris& glonass_gnav_ephL1, const Glonass_Gnav_Ephemeris& glonass_gnav_ephL2, double obs_time, const std::map<int, Gnss_Synchro> & observables, unsigned short station_id); | ||||
|     /*! | ||||
|      * \brief Prints Extended L1&L2 GLONASS RTK Observables | ||||
|      * \details This GLONASS message type is the most common observational message type, with L1/L2/SNR content.  This is one of the most common messages found. | ||||
| @@ -168,7 +168,7 @@ public: | ||||
|      * \params observables Set of observables as defined by the platform | ||||
|      * \return string with message contents | ||||
|      */ | ||||
|     std::string print_MT1012(Glonass_Gnav_Ephemeris& glonass_gnav_ephL1, Glonass_Gnav_Ephemeris& glonass_gnav_ephL2, double obs_time, const std::map<int, Gnss_Synchro> & observables, unsigned short station_id); | ||||
|     std::string print_MT1012(const Glonass_Gnav_Ephemeris& glonass_gnav_ephL1, const Glonass_Gnav_Ephemeris& glonass_gnav_ephL2, double obs_time, const std::map<int, Gnss_Synchro> & observables, unsigned short station_id); | ||||
|  | ||||
|     /*! | ||||
|      * \brief Prints message type 1019 (GPS Ephemeris), should be broadcast in the event that | ||||
| @@ -185,18 +185,20 @@ public: | ||||
|     * \brief Prints message type 1020 (GLONASS Ephemeris). | ||||
|     * \note Code added as part of GSoC 2017 program | ||||
|     * \param glonass_gnav_eph GLONASS GNAV Broadcast Ephemeris | ||||
|     * \param glonass_gnav_utc_model GLONASS GNAV Clock Information | ||||
|     * \return Returns message type as a string type | ||||
|     */ | ||||
|     std::string print_MT1020(const Glonass_Gnav_Ephemeris & glonass_gnav_eph); | ||||
|     std::string print_MT1020(const Glonass_Gnav_Ephemeris & glonass_gnav_eph, const Glonass_Gnav_Utc_Model & glonass_gnav_utc_model); | ||||
|  | ||||
|     /*! | ||||
|      * \brief Verifies and reads messages of type 1020 (GLONASS Ephemeris). | ||||
|      * \note Code added as part of GSoC 2017 program | ||||
|      * \param message Message to read as a string type | ||||
|      * \param glonass_gnav_eph GLONASS GNAV Broadcast Ephemeris | ||||
|      * \param glonass_gnav_utc_model GLONASS GNAV Clock Information | ||||
|      * \return Returns 1 if anything goes wrong, 0 otherwise. | ||||
|      */ | ||||
|     int read_MT1020(const std::string & message, Glonass_Gnav_Ephemeris & glonass_gnav_eph); | ||||
|     int read_MT1020(const std::string & message, Glonass_Gnav_Ephemeris & glonass_gnav_eph, Glonass_Gnav_Utc_Model & glonass_gnav_utc_model); | ||||
|  | ||||
|     /*! | ||||
|      * \brief Prints message type 1029 (Unicode Text String) | ||||
| @@ -1023,7 +1025,7 @@ private: | ||||
|     int set_DF036(bool divergence_free_smoothing_indicator); | ||||
|  | ||||
|     std::bitset<3> DF037;       //!< GLONASS Smoothing Interval | ||||
|     int set_DF037(unsigned short smoothing_interval); | ||||
|     int set_DF037(short int smoothing_interval); | ||||
|  | ||||
|     std::bitset<6> DF038;       //!< GLONASS Satellite ID (Satellite Slot Number) | ||||
|     int set_DF038(const Gnss_Synchro & gnss_synchro); | ||||
| @@ -1161,10 +1163,10 @@ private: | ||||
|     int set_DF103(const Gps_Ephemeris & gps_eph); | ||||
|  | ||||
|     std::bitset<1> DF104;       //!< GLONASS Almanac Health | ||||
|     int set_DF104(const Glonass_Gnav_Ephemeris & glonass_gnav_eph); | ||||
|     int set_DF104(unsigned int glonass_gnav_alm_health); | ||||
|  | ||||
|     std::bitset<1> DF105;       //!< GLONASS Almanac Health Availability Indicator | ||||
|     int set_DF105(const Glonass_Gnav_Ephemeris & glonass_gnav_eph); | ||||
|     int set_DF105(unsigned int glonass_gnav_alm_health_ind); | ||||
|  | ||||
|     std::bitset<2> DF106;       //!< GLONASS P1 Word | ||||
|     int set_DF106(const Glonass_Gnav_Ephemeris & glonass_gnav_eph); | ||||
| @@ -1235,26 +1237,26 @@ private: | ||||
|     std::bitset<4> DF128;       //!< GLONASS F_T | ||||
|     int set_DF128(const Glonass_Gnav_Ephemeris & glonass_gnav_eph); | ||||
|  | ||||
|     std::bitset<1> DF129;       //!< GLONASS N_T | ||||
|     std::bitset<11> DF129;       //!< GLONASS N_T | ||||
|     int set_DF129(const Glonass_Gnav_Ephemeris & glonass_gnav_eph); | ||||
|  | ||||
|     std::bitset<2> DF130;       //!< GLONASS M | ||||
|     int set_DF130(const Glonass_Gnav_Ephemeris & glonass_gnav_eph); | ||||
|  | ||||
|     std::bitset<1> DF131;       //!< GLONASS Availability of additional data | ||||
|     int set_DF131(const Glonass_Gnav_Ephemeris & glonass_gnav_eph); | ||||
|     int set_DF131(unsigned int fifth_str_additional_data_ind); | ||||
|  | ||||
|     std::bitset<11> DF132;       //!< GLONASS N_A | ||||
|     int set_DF132(const Glonass_Gnav_Ephemeris & glonass_gnav_eph); | ||||
|     int set_DF132(const Glonass_Gnav_Utc_Model & glonass_gnav_utc_model); | ||||
|  | ||||
|     std::bitset<32> DF133;       //!< GLONASS TAU_C | ||||
|     int set_DF133(const Glonass_Gnav_Ephemeris & glonass_gnav_eph); | ||||
|     int set_DF133(const Glonass_Gnav_Utc_Model & glonass_gnav_utc_model); | ||||
|  | ||||
|     std::bitset<5> DF134;       //!< GLONASS N_4 | ||||
|     int set_DF134(const Glonass_Gnav_Ephemeris & glonass_gnav_eph); | ||||
|     int set_DF134(const Glonass_Gnav_Utc_Model & glonass_gnav_utc_model); | ||||
|  | ||||
|     std::bitset<22> DF135;       //!< GLONASS TAU_GPS | ||||
|     int set_DF135(const Glonass_Gnav_Ephemeris & glonass_gnav_eph); | ||||
|     int set_DF135(const Glonass_Gnav_Utc_Model & glonass_gnav_utc_model); | ||||
|  | ||||
|     std::bitset<1> DF136;       //!< GLONASS L_N (FIFTH STRING) | ||||
|     int set_DF136(const Glonass_Gnav_Ephemeris & glonass_gnav_eph); | ||||
| @@ -1387,7 +1389,7 @@ private: | ||||
|     int set_DF401(const Gnss_Synchro & gnss_synchro); | ||||
|  | ||||
|     std::bitset<4> DF402; | ||||
|     int set_DF402(const Gps_Ephemeris & ephNAV, const Gps_CNAV_Ephemeris & ephCNAV, const Galileo_Ephemeris & ephFNAV, double obs_time, const Gnss_Synchro & gnss_synchro); | ||||
|     int set_DF402(const Gps_Ephemeris & ephNAV, const Gps_CNAV_Ephemeris & ephCNAV, const Galileo_Ephemeris & ephFNAV, const Glonass_Gnav_Ephemeris & ephGNAV, double obs_time, const Gnss_Synchro & gnss_synchro); | ||||
|  | ||||
|     std::bitset<6> DF403; | ||||
|     int set_DF403(const Gnss_Synchro & gnss_synchro); | ||||
| @@ -1402,7 +1404,7 @@ private: | ||||
|     int set_DF406(const Gnss_Synchro & gnss_synchro); | ||||
|  | ||||
|     std::bitset<10> DF407; | ||||
|     int set_DF407(const Gps_Ephemeris & ephNAV, const Gps_CNAV_Ephemeris & ephCNAV, const Galileo_Ephemeris & ephFNAV, double obs_time, const Gnss_Synchro & gnss_synchro); | ||||
|     int set_DF407(const Gps_Ephemeris & ephNAV, const Gps_CNAV_Ephemeris & ephCNAV, const Galileo_Ephemeris & ephFNAV, const Glonass_Gnav_Ephemeris & ephGNAV, double obs_time, const Gnss_Synchro & gnss_synchro); | ||||
|  | ||||
|     std::bitset<10> DF408; | ||||
|     int set_DF408(const Gnss_Synchro & gnss_synchro); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user