mirror of
				https://github.com/gnss-sdr/gnss-sdr
				synced 2025-10-31 07:13:03 +00:00 
			
		
		
		
	Adding TOW update consistency check in GPS L5 telemetry decoder
This commit is contained in:
		| @@ -64,7 +64,7 @@ gps_l5_telemetry_decoder_gs::gps_l5_telemetry_decoder_gs( | |||||||
|     this->message_port_register_out(pmt::mp("telemetry_to_trk")); |     this->message_port_register_out(pmt::mp("telemetry_to_trk")); | ||||||
|     d_last_valid_preamble = 0; |     d_last_valid_preamble = 0; | ||||||
|     d_sent_tlm_failed_msg = false; |     d_sent_tlm_failed_msg = false; | ||||||
|     d_max_symbols_without_valid_frame = GPS_L5_CNAV_DATA_PAGE_BITS * GPS_L5_SAMPLES_PER_SYMBOL * GPS_L5_SYMBOLS_PER_BIT * 20;  //rise alarm if 20 consecutive subframes have no valid CRC |     d_max_symbols_without_valid_frame = GPS_L5_CNAV_DATA_PAGE_BITS * GPS_L5_SAMPLES_PER_SYMBOL * GPS_L5_SYMBOLS_PER_BIT * 10;  //rise alarm if 20 consecutive subframes have no valid CRC | ||||||
|  |  | ||||||
|     // initialize internal vars |     // initialize internal vars | ||||||
|     d_dump = dump; |     d_dump = dump; | ||||||
| @@ -152,7 +152,9 @@ void gps_l5_telemetry_decoder_gs::set_channel(int32_t channel) | |||||||
| void gps_l5_telemetry_decoder_gs::reset() | void gps_l5_telemetry_decoder_gs::reset() | ||||||
| { | { | ||||||
|     d_last_valid_preamble = d_sample_counter; |     d_last_valid_preamble = d_sample_counter; | ||||||
|  |     d_TOW_at_current_symbol_ms = 0; | ||||||
|     d_sent_tlm_failed_msg = false; |     d_sent_tlm_failed_msg = false; | ||||||
|  |     d_flag_valid_word = false; | ||||||
|     DLOG(INFO) << "Telemetry decoder reset for satellite " << d_satellite; |     DLOG(INFO) << "Telemetry decoder reset for satellite " << d_satellite; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -211,7 +213,7 @@ int gps_l5_telemetry_decoder_gs::general_work(int noutput_items __attribute__((u | |||||||
|                             symbol_value = -1; |                             symbol_value = -1; | ||||||
|                         } |                         } | ||||||
|                     new_sym = true; |                     new_sym = true; | ||||||
|                     sym_hist.clear(); |                     //sym_hist.clear(); | ||||||
|                 } |                 } | ||||||
|             else |             else | ||||||
|                 { |                 { | ||||||
| @@ -268,15 +270,33 @@ int gps_l5_telemetry_decoder_gs::general_work(int noutput_items __attribute__((u | |||||||
|  |  | ||||||
|             // update TOW at the preamble instant |             // update TOW at the preamble instant | ||||||
|             d_TOW_at_Preamble_ms = msg.tow * 6000; |             d_TOW_at_Preamble_ms = msg.tow * 6000; | ||||||
|             d_last_valid_preamble = d_sample_counter; |  | ||||||
|             // The time of the last input symbol can be computed from the message ToW and |             // The time of the last input symbol can be computed from the message ToW and | ||||||
|             // delay by the formulae: |             // delay by the formulae: | ||||||
|             // \code |             // \code | ||||||
|             // symbolTime_ms = msg->tow * 6000 + *pdelay * 10 + (12 * 10); 12 symbols of the encoder's transitory |             // symbolTime_ms = msg->tow * 6000 + *pdelay * 10 + (12 * 10); 12 symbols of the encoder's transitory | ||||||
|  |  | ||||||
|  |             //check TOW update consistency | ||||||
|  |             uint32_t last_d_TOW_at_current_symbol_ms = d_TOW_at_current_symbol_ms; | ||||||
|             d_TOW_at_current_symbol_ms = msg.tow * 6000 + (delay + 12) * GPS_L5I_SYMBOL_PERIOD_MS; |             d_TOW_at_current_symbol_ms = msg.tow * 6000 + (delay + 12) * GPS_L5I_SYMBOL_PERIOD_MS; | ||||||
|             d_flag_valid_word = true; |             if (last_d_TOW_at_current_symbol_ms != 0 and abs(static_cast<int64_t>(d_TOW_at_current_symbol_ms) - int64_t(last_d_TOW_at_current_symbol_ms)) > 1) | ||||||
|  |                 { | ||||||
|  |                     DLOG(INFO) << "Warning: GPS L5 TOW update in ch " << d_channel | ||||||
|  |                                << " does not match the TLM TOW counter " << static_cast<int64_t>(d_TOW_at_current_symbol_ms) - int64_t(last_d_TOW_at_current_symbol_ms) << " ms " | ||||||
|  |                                << " with delay: " << delay << " msg tow: " << msg.tow * 6000 << " ms \n"; | ||||||
|  |  | ||||||
|  |                     d_TOW_at_current_symbol_ms = 0; | ||||||
|  |                     d_flag_valid_word = false; | ||||||
|                 } |                 } | ||||||
|             else |             else | ||||||
|  |                 { | ||||||
|  |                     d_last_valid_preamble = d_sample_counter; | ||||||
|  |                     d_flag_valid_word = true; | ||||||
|  |                 } | ||||||
|  |         } | ||||||
|  |     else | ||||||
|  |         { | ||||||
|  |             if (d_flag_valid_word) | ||||||
|                 { |                 { | ||||||
|                     d_TOW_at_current_symbol_ms += GPS_L5I_PERIOD_MS; |                     d_TOW_at_current_symbol_ms += GPS_L5I_PERIOD_MS; | ||||||
|                     if (current_synchro_data.Flag_valid_symbol_output == false) |                     if (current_synchro_data.Flag_valid_symbol_output == false) | ||||||
| @@ -284,6 +304,7 @@ int gps_l5_telemetry_decoder_gs::general_work(int noutput_items __attribute__((u | |||||||
|                             d_flag_valid_word = false; |                             d_flag_valid_word = false; | ||||||
|                         } |                         } | ||||||
|                 } |                 } | ||||||
|  |         } | ||||||
|  |  | ||||||
|     if (d_flag_valid_word == true) |     if (d_flag_valid_word == true) | ||||||
|         { |         { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Javier Arribas
					Javier Arribas