From e1873a408d01ad8945e8523db6d3c1808357dd87 Mon Sep 17 00:00:00 2001 From: Javier Arribas Date: Tue, 16 May 2017 18:26:29 +0200 Subject: [PATCH] Removing the sample forecast requirements on Galileo E1 telemetry decoder --- .../galileo_e1b_telemetry_decoder_cc.cc | 107 ++++++++---------- .../galileo_e1b_telemetry_decoder_cc.h | 10 +- 2 files changed, 48 insertions(+), 69 deletions(-) diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e1b_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e1b_telemetry_decoder_cc.cc index 5f8e637a8..bb37bd57f 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e1b_telemetry_decoder_cc.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/galileo_e1b_telemetry_decoder_cc.cc @@ -54,16 +54,6 @@ galileo_e1b_make_telemetry_decoder_cc(Gnss_Satellite satellite, bool dump) } - -void galileo_e1b_telemetry_decoder_cc::forecast (int noutput_items, gr_vector_int &ninput_items_required) -{ - if(noutput_items != 0) - { - ninput_items_required[0] = GALILEO_INAV_PAGE_SYMBOLS; // set the required sample history - } -} - - void galileo_e1b_telemetry_decoder_cc::viterbi_decoder(double *page_part_symbols, int *page_part_bits) { int CodeLength = 240; @@ -161,7 +151,6 @@ galileo_e1b_telemetry_decoder_cc::galileo_e1b_telemetry_decoder_cc( d_flag_frame_sync = false; d_flag_parity = false; - d_TOW_at_Preamble = 0; d_TOW_at_current_symbol = 0; delta_t = 0; d_CRC_error_counter = 0; @@ -286,25 +275,34 @@ int galileo_e1b_telemetry_decoder_cc::general_work (int noutput_items __attribut int preamble_diff = 0; Gnss_Synchro **out = (Gnss_Synchro **) &output_items[0]; - d_sample_counter++; //count for the processed samples - - // ########### Output the tracking data to navigation and PVT ########## const Gnss_Synchro **in = (const Gnss_Synchro **) &input_items[0]; //Get the input samples pointer - // TODO Optimize me! - //******* preamble correlation ******** - for (int i = 0; i < d_symbols_per_preamble; i++) - { - if (in[0][i].Prompt_I < 0) // symbols clipping - { - corr_value -= d_preambles_symbols[i]; - } - else - { - corr_value += d_preambles_symbols[i]; - } - } + Gnss_Synchro current_symbol; //structure to save the synchronization information and send the output object to the next block + //1. Copy the current tracking output + current_symbol = in[0][0]; + d_symbol_history.push_back(current_symbol); //add new symbol to the symbol queue + d_sample_counter++; //count for the processed samples + consume_each(1); + d_flag_preamble = false; + unsigned int required_symbols=GALILEO_INAV_PAGE_SYMBOLS+d_symbols_per_preamble; + + if (d_symbol_history.size()>required_symbols) + { + // TODO Optimize me! + //******* preamble correlation ******** + for (int i = 0; i < d_symbols_per_preamble; i++) + { + if (d_symbol_history.at(i).Prompt_I < 0) // symbols clipping + { + corr_value -= d_preambles_symbols[i]; + } + else + { + corr_value += d_preambles_symbols[i]; + } + } + } //******* frame sync ****************** if (d_stat == 0) //no preamble information @@ -351,12 +349,12 @@ int galileo_e1b_telemetry_decoder_cc::general_work (int noutput_items __attribut { if (corr_value > 0) { - page_part_symbols[i] = in[0][i + d_symbols_per_preamble].Prompt_I; // because last symbol of the preamble is just received now! + page_part_symbols[i] = d_symbol_history.at(i + d_symbols_per_preamble).Prompt_I; // because last symbol of the preamble is just received now! } else { - page_part_symbols[i] = -in[0][i + d_symbols_per_preamble].Prompt_I; // because last symbol of the preamble is just received now! + page_part_symbols[i] = -d_symbol_history.at(i + d_symbols_per_preamble).Prompt_I; // because last symbol of the preamble is just received now! } } @@ -371,7 +369,7 @@ int galileo_e1b_telemetry_decoder_cc::general_work (int noutput_items __attribut { d_flag_frame_sync = true; DLOG(INFO) << " Frame sync SAT " << this->d_satellite << " with preamble start at " - << in[0][0].Tracking_sample_counter << " [samples]"; + << d_symbol_history.at(0).Tracking_sample_counter << " [samples]"; } } else @@ -388,47 +386,27 @@ int galileo_e1b_telemetry_decoder_cc::general_work (int noutput_items __attribut } } - 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][0]; //2. Add the telemetry decoder information if (this->d_flag_preamble == true and d_nav.flag_TOW_set == true) //update TOW at the preamble instant - // JAVI: 30/06/2014 - // TOW, in Galileo, is referred to the START of the PAGE PART, that is, THE FIRST SYMBOL OF THAT PAGE, NOT THE PREAMBLE. - // thus, no correction should be done. d_TOW_at_Preamble should be renamed to d_TOW_at_page_start. - // Since we detected the preamble, then, we are in the last symbol of that preamble, or just at the start of the first page symbol. - //flag preamble is true after the all page (even and odd) is received. I/NAV page period is 2 SECONDS { if(d_nav.flag_TOW_5 == true) //page 5 arrived and decoded, so we are in the odd page (since Tow refers to the even page, we have to add 1 sec) { - //std::cout<< "Using TOW_5 for timestamping" << std::endl; - d_TOW_at_Preamble = d_nav.TOW_5 + GALILEO_INAV_PAGE_PART_SECONDS; //TOW_5 refers to the even preamble, but when we decode it we are in the odd part, so 1 second later - /* 1 sec (GALILEO_INAV_PAGE_PART_SYMBOLS*GALILEO_E1_CODE_PERIOD) is added because - * if we have a TOW value it means that we are at the beginning of the last page part - * (GNU Radio history keeps in a buffer the rest of the incoming frame part)*/ - d_TOW_at_current_symbol = d_TOW_at_Preamble;//-GALILEO_E1_CODE_PERIOD;//+ (double)GALILEO_INAV_PREAMBLE_LENGTH_BITS/(double)GALILEO_TELEMETRY_RATE_BITS_SECOND; + //TOW_5 refers to the even preamble, but when we decode it we are in the odd part, so 1 second later plus the decoding delay + d_TOW_at_current_symbol = d_nav.TOW_5 + GALILEO_INAV_PAGE_PART_SECONDS+((double)required_symbols)*GALILEO_E1_CODE_PERIOD; //-GALILEO_E1_CODE_PERIOD;//+ (double)GALILEO_INAV_PREAMBLE_LENGTH_BITS/(double)GALILEO_TELEMETRY_RATE_BITS_SECOND; d_nav.flag_TOW_5 = false; } else if(d_nav.flag_TOW_6 == true) //page 6 arrived and decoded, so we are in the odd page (since Tow refers to the even page, we have to add 1 sec) { - //std::cout<< "Using TOW_6 for timestamping" << std::endl; - d_TOW_at_Preamble = d_nav.TOW_6 + GALILEO_INAV_PAGE_PART_SECONDS; - //TOW_6 refers to the even preamble, but when we decode it we are in the odd part, so 1 second later - /* 1 sec (GALILEO_INAV_PAGE_PART_SYMBOLS*GALILEO_E1_CODE_PERIOD) is added because - * if we have a TOW value it means that we are at the beginning of the last page part - * (GNU Radio history keeps in a buffer the rest of the incoming frame part)*/ - d_TOW_at_current_symbol = d_TOW_at_Preamble;//-GALILEO_E1_CODE_PERIOD;//+ (double)GALILEO_INAV_PREAMBLE_LENGTH_BITS/(double)GALILEO_TELEMETRY_RATE_BITS_SECOND; + //TOW_6 refers to the even preamble, but when we decode it we are in the odd part, so 1 second later plus the decoding delay + d_TOW_at_current_symbol = d_nav.TOW_6 + GALILEO_INAV_PAGE_PART_SECONDS+((double)required_symbols)*GALILEO_E1_CODE_PERIOD;//-GALILEO_E1_CODE_PERIOD;//+ (double)GALILEO_INAV_PREAMBLE_LENGTH_BITS/(double)GALILEO_TELEMETRY_RATE_BITS_SECOND; d_nav.flag_TOW_6 = false; } else { //this page has no timing information - d_TOW_at_Preamble = d_TOW_at_Preamble + GALILEO_INAV_PAGE_SECONDS; d_TOW_at_current_symbol = d_TOW_at_current_symbol + GALILEO_E1_CODE_PERIOD;// + GALILEO_INAV_PAGE_PART_SYMBOLS*GALILEO_E1_CODE_PERIOD; } } @@ -446,15 +424,15 @@ int galileo_e1b_telemetry_decoder_cc::general_work (int noutput_items __attribut if (d_flag_frame_sync == true and d_nav.flag_TOW_set == true) { - current_synchro_data.Flag_valid_word = true; + current_symbol.Flag_valid_word = true; } else { - current_synchro_data.Flag_valid_word = false; + current_symbol.Flag_valid_word = false; } - current_synchro_data.TOW_at_current_symbol_s = floor(d_TOW_at_current_symbol*1000.0)/1000.0; - current_synchro_data.TOW_at_current_symbol_s -=delta_t; //Galileo to GPS TOW + current_symbol.TOW_at_current_symbol_s = floor(d_TOW_at_current_symbol*1000.0)/1000.0; + current_symbol.TOW_at_current_symbol_s -=delta_t; //Galileo to GPS TOW if(d_dump == true) { @@ -465,9 +443,9 @@ int galileo_e1b_telemetry_decoder_cc::general_work (int noutput_items __attribut unsigned long int tmp_ulong_int; tmp_double = d_TOW_at_current_symbol; d_dump_file.write((char*)&tmp_double, sizeof(double)); - tmp_ulong_int = current_synchro_data.Tracking_sample_counter; + tmp_ulong_int = current_symbol.Tracking_sample_counter; d_dump_file.write((char*)&tmp_ulong_int, sizeof(unsigned long int)); - tmp_double = d_TOW_at_Preamble; + tmp_double = 0; d_dump_file.write((char*)&tmp_double, sizeof(double)); } catch (const std::ifstream::failure & e) @@ -475,11 +453,16 @@ int galileo_e1b_telemetry_decoder_cc::general_work (int noutput_items __attribut LOG(WARNING) << "Exception writing observables dump file " << e.what(); } } + + // remove used symbols from history + if (d_symbol_history.size()>required_symbols) + { + d_symbol_history.pop_front(); + } //3. Make the output (copy the object contents to the GNURadio reserved memory) - *out[0] = current_synchro_data; + *out[0] = current_symbol; //std::cout<<"GPS L1 TLM output on CH="<d_channel << " SAMPLE STAMP="< d_symbol_history; + long unsigned int d_sample_counter; long unsigned int d_preamble_index; unsigned int d_stat; @@ -109,7 +106,6 @@ private: Gnss_Satellite d_satellite; int d_channel; - double d_TOW_at_Preamble; double d_TOW_at_current_symbol; bool flag_TOW_set;