Bug fixes in Galileo E5a telemetry decoding. Code cleaning in Galileo E5a tracking

This commit is contained in:
Javier Arribas 2017-05-11 12:53:58 +02:00
parent deb916b342
commit b2531cb926
6 changed files with 205 additions and 149 deletions

View File

@ -29,7 +29,7 @@ GNSS-SDR.SUPL_CI=0x31b0
SignalSource.implementation=Flexiband_Signal_Source
SignalSource.flag_read_file=true
SignalSource.signal_file=/media/javier/SISTEMA/signals/fraunhofer/L125_III1b_210s.usb ; <- PUT YOUR FILE HERE
SignalSource.signal_file=/home/javier/signals/L125_III1b_210s.usb ; <- PUT YOUR FILE HERE
;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version.
SignalSource.item_type=gr_complex
@ -38,7 +38,7 @@ SignalSource.item_type=gr_complex
SignalSource.firmware_file=flexiband_III-1b.bit
;#RF_channels: Number of RF channels present in the frontend device, must agree the FPGA firmware file
SignalSource.RF_channels=2
SignalSource.RF_channels=3
;#frontend channels gain. Not usable yet!
SignalSource.gain1=0
@ -74,7 +74,7 @@ DataTypeAdapter0.item_type=gr_complex
InputFilter0.implementation=Freq_Xlating_Fir_Filter
;#dump: Dump the filtered data to a file.
InputFilter0.dump=true
InputFilter0.dump=false
;#dump_filename: Log path and filename.
InputFilter0.dump_filename=../data/input_filter_ch0.dat
@ -237,22 +237,29 @@ InputFilter1.decimation_factor=4
;## Resamples the input data.
Resampler1.implementation=Pass_Through
;######################################################
;######### RF CHANNEL 2 SIGNAL CONDITIONER ############
;######################################################
;######### SIGNAL_CONDITIONER 2 CONFIG ############
;## It holds blocks to change data type, filter and resample input data.
SignalConditioner2.implementation=Pass_Through
SignalConditioner2.implementation=Signal_Conditioner
;######### DATA_TYPE_ADAPTER 2 CONFIG ############
DataTypeAdapter2.implementation=Pass_Through
DataTypeAdapter2.item_type=gr_complex
;######### INPUT_FILTER 2 CONFIG ############
InputFilter2.implementation=Pass_Through
;## Filter the input data. Can be combined with frequency translation for IF signals
InputFilter2.implementation=Freq_Xlating_Fir_Filter
;#dump: Dump the filtered data to a file.
InputFilter2.dump=false
;#dump_filename: Log path and filename.
InputFilter2.dump_filename=../data/input_filter.dat
InputFilter2.dump_filename=../data/input_filter_ch2.dat
;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version.
InputFilter2.input_item_type=gr_complex
@ -260,15 +267,66 @@ InputFilter2.input_item_type=gr_complex
;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version.
InputFilter2.output_item_type=gr_complex
;######### RESAMPLER CONFIG 2 ############
;#taps_item_type: Type and resolution for the taps of the filter. Use only float in this version.
InputFilter2.taps_item_type=float
;#number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time
InputFilter2.number_of_taps=5
;#number_of _bands: Number of frequency bands in the filter.
InputFilter2.number_of_bands=2
;#bands: frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...].
;#Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2)
;#The number of band_begin and band_end elements must match the number of bands
InputFilter2.band1_begin=0.0
InputFilter2.band1_end=0.45
InputFilter2.band2_begin=0.55
InputFilter2.band2_end=1.0
;#ampl: desired amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...].
;#The number of ampl_begin and ampl_end elements must match the number of bands
InputFilter2.ampl1_begin=1.0
InputFilter2.ampl1_end=1.0
InputFilter2.ampl2_begin=0.0
InputFilter2.ampl2_end=0.0
;#band_error: weighting applied to each band (usually 1).
;#The number of band_error elements must match the number of bands
InputFilter2.band1_error=1.0
InputFilter2.band2_error=1.0
;#filter_type: one of "bandpass", "hilbert" or "differentiator"
InputFilter2.filter_type=bandpass
;#grid_density: determines how accurately the filter will be constructed.
;The minimum value is 16; higher values are slower to compute the filter.
InputFilter2.grid_density=16
;#The following options are used only in Freq_Xlating_Fir_Filter implementation.
;#InputFilter0.IF is the intermediate frequency (in Hz) shifted down to zero Hz
;FOR USE GNSS-SDR WITH RTLSDR DONGLES USER MUST SET THE CALIBRATED SAMPLE RATE HERE
; i.e. using front-end-cal as reported here:http://www.cttc.es/publication/turning-a-television-into-a-gnss-receiver/
InputFilter2.sampling_frequency=40000000
;# IF deviation due to front-end LO inaccuracies [HZ]
InputFilter2.IF=0
;# Decimation factor after the frequency tranaslating block
InputFilter2.decimation_factor=8
;######### RESAMPLER CONFIG 1 ############
;## Resamples the input data.
Resampler2.implementation=Pass_Through
;######### CHANNELS GLOBAL CONFIG ############
;#count: Number of available GPS satellite channels.
Channels_1C.count=11
Channels_2S.count=0
Channels_1C.count=1
Channels_2S.count=1
Channels_5X.count=2
;#GPS.prns=7,8
@ -283,10 +341,11 @@ Channels.in_acquisition=1
;# CHANNEL NUMBERING ORDER: GPS L1 C/A, GPS L2 L2C (M), GALILEO E1 B, GALILEO E5a
;# CHANNEL CONNECTION
Channel0.RF_channel_ID=0
Channel1.RF_channel_ID=0
Channel2.RF_channel_ID=0
Channel3.RF_channel_ID=0
Channel1.RF_channel_ID=1
Channel2.RF_channel_ID=2
Channel3.RF_channel_ID=2
Channel4.RF_channel_ID=0
Channel5.RF_channel_ID=0
Channel6.RF_channel_ID=0
@ -333,6 +392,22 @@ Acquisition_2S.doppler_min=-5000
Acquisition_2S.doppler_step=60
Acquisition_2S.max_dwells=1
;# GALILEO E5a
Acquisition_5X.dump=false
Acquisition_5X.dump_filename=./acq_dump.dat
Acquisition_5X.item_type=gr_complex
Acquisition_5X.if=0
Acquisition_5X.coherent_integration_time_ms=1
Acquisition_5X.implementation=Galileo_E5a_Noncoherent_IQ_Acquisition_CAF
Acquisition_5X.threshold=0.008
Acquisition_5X.doppler_max=10000
Acquisition_5X.doppler_step=250
Acquisition_5X.bit_transition_flag=false
Acquisition_5X.max_dwells=1
Acquisition_5X.CAF_window_hz=0 ; **Only for E5a** Resolves doppler ambiguity averaging the specified BW in the winner code delay. If set to 0 CAF filter is desactivated. Recommended value 3000 Hz
Acquisition_5X.Zero_padding=0 ; **Only for E5a** Avoids power loss and doppler ambiguity in bit transitions by correlating one code with twice the input data length, ensuring that at least one full code is present without transitions. If set to 1 it is ON, if set to 0 it is OFF.
;######### TRACKING CONFIG ############
@ -359,16 +434,28 @@ Tracking_2S.dll_bw_hz=0.25;
Tracking_2S.order=2;
Tracking_2S.early_late_space_chips=0.5;
Tracking_5X.implementation=Galileo_E5a_DLL_PLL_Tracking
Tracking_5X.item_type=gr_complex
Tracking_5X.if=0
Tracking_5X.dump=false
Tracking_5X.dump_filename=./tracking_ch_
Tracking_5X.pll_bw_hz_init=20.0; **Only for E5a** PLL loop filter bandwidth during initialization [Hz]
Tracking_5X.dll_bw_hz_init=20.0; **Only for E5a** DLL loop filter bandwidth during initialization [Hz]
Tracking_5X.ti_ms=1; **Only for E5a** loop filter integration time after initialization (secondary code delay search)[ms]
Tracking_5X.pll_bw_hz=20.0;
Tracking_5X.dll_bw_hz=20.0;
Tracking_5X.order=2;
Tracking_5X.early_late_space_chips=0.5;
;######### TELEMETRY DECODER CONFIG ############
TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder
TelemetryDecoder_1C.dump=false
TelemetryDecoder_1C.decimation_factor=1;
TelemetryDecoder_2S.implementation=GPS_L2C_Telemetry_Decoder
TelemetryDecoder_2S.dump=false
TelemetryDecoder_2S.decimation_factor=1;
TelemetryDecoder_5X.implementation=Galileo_E5a_Telemetry_Decoder
TelemetryDecoder_5X.dump=false
;######### OBSERVABLES CONFIG ############
;#implementation:

View File

@ -2,6 +2,7 @@
* \file galileo_e5a_telemetry_decoder_cc.cc
* \brief Implementation of a Galileo FNAV message demodulator block
* \author Marc Sales, 2014. marcsales92(at)gmail.com
* Javier Arribas, 2017. jarribas(at)cttc.es
* \based on work from:
* <ul>
* <li> Javier Arribas, 2011. jarribas(at)cttc.es
@ -45,7 +46,7 @@
#include "convolutional.h"
#define CRC_ERROR_LIMIT 6
#define GALILEO_E5a_CRC_ERROR_LIMIT 6
using google::LogMessage;
@ -200,10 +201,8 @@ galileo_e5a_telemetry_decoder_cc::galileo_e5a_telemetry_decoder_cc(
d_dump = dump;
d_satellite = Gnss_Satellite(satellite.get_system(), satellite.get_PRN());
LOG(INFO) << "GALILEO E5A TELEMETRY PROCESSING: satellite " << d_satellite;
//d_samples_per_symbol = ( Galileo_E5a_CODE_CHIP_RATE_HZ / Galileo_E5a_CODE_LENGTH_CHIPS ) / Galileo_E1_B_SYMBOL_RATE_BPS;
// set the preamble
//unsigned short int preambles_bits[GALILEO_FNAV_PREAMBLE_LENGTH_BITS] = GALILEO_FNAV_PREAMBLE;
for (int i = 0; i < GALILEO_FNAV_PREAMBLE_LENGTH_BITS; i++)
{
if (GALILEO_FNAV_PREAMBLE.at(i) == '0')
@ -216,27 +215,6 @@ galileo_e5a_telemetry_decoder_cc::galileo_e5a_telemetry_decoder_cc(
}
}
// memcpy((unsigned short int*)this->d_preambles_bits, (unsigned short int*)preambles_bits, GALILEO_FNAV_PREAMBLE_LENGTH_BITS*sizeof(unsigned short int));
// // preamble bits to sampled symbols
// d_preambles_symbols = (signed int*)malloc(sizeof(signed int) * GALILEO_FNAV_SAMPLES_PER_PREAMBLE);
// int n = 0;
// for (int i = 0; i < GALILEO_FNAV_PREAMBLE_LENGTH_BITS; i++)
// {
// for (unsigned int j = 0; j < GALILEO_FNAV_SAMPLES_PER_SYMBOL; j++)
// {
// if (d_preambles_bits[i] == 1)
// {
// d_preambles_symbols[n] = 1;
// }
// else
// {
// d_preambles_symbols[n] = -1;
// }
// n++;
// }
// }
//
d_sample_counter = 0;
d_state = 0;
d_preamble_lock = false;
@ -397,16 +375,6 @@ int galileo_e5a_telemetry_decoder_cc::general_work (int noutput_items __attribut
// **** Attempt Preamble correlation ****
bool corr_flag = true;
int corr_sign = 0; // sequence can be found inverted
// corr_sign = d_preamble_bits[0] * d_page_symbols[d_symbol_counter - GALILEO_FNAV_PREAMBLE_LENGTH_BITS];
// for (int i = 1; i < GALILEO_FNAV_PREAMBLE_LENGTH_BITS; i++)
// {
// if ((d_preamble_bits[i] * d_page_symbols[i + d_symbol_counter - GALILEO_FNAV_PREAMBLE_LENGTH_BITS]) != corr_sign)
// {
// //exit for if one bit doesn't correlate
// corr_flag = false;
// break;
// }
// }
// check if the preamble starts positive correlated or negative correlated
if (d_page_symbols[d_symbol_counter - GALILEO_FNAV_PREAMBLE_LENGTH_BITS] < 0) // symbols clipping
{
@ -453,7 +421,7 @@ int galileo_e5a_telemetry_decoder_cc::general_work (int noutput_items __attribut
else
{
d_CRC_error_counter++;
if (d_CRC_error_counter > CRC_ERROR_LIMIT)
if (d_CRC_error_counter > GALILEO_E5a_CRC_ERROR_LIMIT)
{
LOG(INFO) << "Lost of frame sync SAT " << this->d_satellite;
d_state = 1;

View File

@ -2,6 +2,7 @@
* \file galileo_e5a_telemetry_decoder_cc.cc
* \brief Implementation of a Galileo FNAV message demodulator block
* \author Marc Sales, 2014. marcsales92(at)gmail.com
* Javier Arribas, 2017. jarribas(at)cttc.es
* \based on work from:
* <ul>
* <li> Javier Arribas, 2011. jarribas(at)cttc.es

View File

@ -301,8 +301,8 @@ void Galileo_E5a_Dll_Pll_Tracking_cc::start_tracking()
sys = sys_.substr(0,1);
// DEBUG OUTPUT
std::cout << "Tracking start on channel " << d_channel << " for satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << std::endl;
LOG(INFO) << "Starting tracking of satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << " on channel " << d_channel;
std::cout << "Tracking Galileo E5a start on channel " << d_channel << " for satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << std::endl;
LOG(INFO) << "Galileo E5a starting tracking of satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << " on channel " << d_channel;
// enable tracking
@ -564,7 +564,7 @@ int Galileo_E5a_Dll_Pll_Tracking_cc::general_work (int noutput_items __attribute
acquire_secondary(); // changes d_secondary_lock and d_secondary_delay
if (d_secondary_lock == true)
{
std::cout << "Secondary code locked." << std::endl;
std::cout << "Galileo E5a secondary code locked for satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << std::endl;
d_current_ti_ms = d_ti_ms;
// Change loop parameters ==========================================
d_code_loop_filter.set_pdi(d_current_ti_ms * GALILEO_E5a_CODE_PERIOD);
@ -574,7 +574,7 @@ int Galileo_E5a_Dll_Pll_Tracking_cc::general_work (int noutput_items __attribute
}
else
{
std::cout << "Secondary code delay couldn't be resolved." << std::endl;
//std::cout << "Secondary code delay couldn't be resolved." << std::endl;
d_carrier_lock_fail_counter++;
if (d_carrier_lock_fail_counter > MAXIMUM_LOCK_FAIL_COUNTER)
{

View File

@ -75,150 +75,150 @@ const int GALILEO_FNAV_DATA_FRAME_BYTES = 27;
const std::vector<std::pair<int,int>> FNAV_PAGE_TYPE_bit({{1,6}});
/* WORD 1 iono corrections. FNAV (Galileo E5a message)*/
const std::vector<std::pair<int,int>> FNAV_SV_ID_PRN_1_bit({{6,6}});
const std::vector<std::pair<int,int>> FNAV_IODnav_1_bit({{12,10}});
const std::vector<std::pair<int,int>> FNAV_t0c_1_bit({{22,14}});
const std::vector<std::pair<int,int>> FNAV_SV_ID_PRN_1_bit({{7,6}});
const std::vector<std::pair<int,int>> FNAV_IODnav_1_bit({{13,10}});
const std::vector<std::pair<int,int>> FNAV_t0c_1_bit({{23,14}});
const double FNAV_t0c_1_LSB = 60;
const std::vector<std::pair<int,int>> FNAV_af0_1_bit({{36,31}});
const std::vector<std::pair<int,int>> FNAV_af0_1_bit({{37,31}});
const double FNAV_af0_1_LSB = TWO_N34;
const std::vector<std::pair<int,int>> FNAV_af1_1_bit({{67,21}});
const std::vector<std::pair<int,int>> FNAV_af1_1_bit({{68,21}});
const double FNAV_af1_1_LSB = TWO_N46;
const std::vector<std::pair<int,int>> FNAV_af2_1_bit({{88,6}});
const std::vector<std::pair<int,int>> FNAV_af2_1_bit({{89,6}});
const double FNAV_af2_1_LSB = TWO_N59;
const std::vector<std::pair<int,int>> FNAV_SISA_1_bit({{94,8}});
const std::vector<std::pair<int,int>> FNAV_ai0_1_bit({{102,11}});
const std::vector<std::pair<int,int>> FNAV_SISA_1_bit({{95,8}});
const std::vector<std::pair<int,int>> FNAV_ai0_1_bit({{103,11}});
const double FNAV_ai0_1_LSB = TWO_N2;
const std::vector<std::pair<int,int>> FNAV_ai1_1_bit({{113,11}});
const std::vector<std::pair<int,int>> FNAV_ai1_1_bit({{114,11}});
const double FNAV_ai1_1_LSB = TWO_N8;
const std::vector<std::pair<int,int>> FNAV_ai2_1_bit({{124,14}});
const std::vector<std::pair<int,int>> FNAV_ai2_1_bit({{125,14}});
const double FNAV_ai2_1_LSB = TWO_N15;
const std::vector<std::pair<int,int>> FNAV_region1_1_bit({{138,1}});
const std::vector<std::pair<int,int>> FNAV_region2_1_bit({{139,1}});
const std::vector<std::pair<int,int>> FNAV_region3_1_bit({{140,1}});
const std::vector<std::pair<int,int>> FNAV_region4_1_bit({{141,1}});
const std::vector<std::pair<int,int>> FNAV_region5_1_bit({{142,1}});
const std::vector<std::pair<int,int>> FNAV_BGD_1_bit({{143,10}});
const std::vector<std::pair<int,int>> FNAV_region1_1_bit({{139,1}});
const std::vector<std::pair<int,int>> FNAV_region2_1_bit({{140,1}});
const std::vector<std::pair<int,int>> FNAV_region3_1_bit({{141,1}});
const std::vector<std::pair<int,int>> FNAV_region4_1_bit({{142,1}});
const std::vector<std::pair<int,int>> FNAV_region5_1_bit({{143,1}});
const std::vector<std::pair<int,int>> FNAV_BGD_1_bit({{144,10}});
const double FNAV_BGD_1_LSB = TWO_N32;
const std::vector<std::pair<int,int>> FNAV_E5ahs_1_bit({{153,2}});
const std::vector<std::pair<int,int>> FNAV_WN_1_bit({{155,12}});
const std::vector<std::pair<int,int>> FNAV_TOW_1_bit({{167,20}});
const std::vector<std::pair<int,int>> FNAV_E5advs_1_bit({{187,1}});
const std::vector<std::pair<int,int>> FNAV_E5ahs_1_bit({{154,2}});
const std::vector<std::pair<int,int>> FNAV_WN_1_bit({{156,12}});
const std::vector<std::pair<int,int>> FNAV_TOW_1_bit({{168,20}});
const std::vector<std::pair<int,int>> FNAV_E5advs_1_bit({{189,1}});
// WORD 2 Ephemeris (1/3)
const std::vector<std::pair<int,int>> FNAV_IODnav_2_bit({{6,10}});
const std::vector<std::pair<int,int>> FNAV_M0_2_bit({{16,32}});
const std::vector<std::pair<int,int>> FNAV_IODnav_2_bit({{7,10}});
const std::vector<std::pair<int,int>> FNAV_M0_2_bit({{17,32}});
const double FNAV_M0_2_LSB = PI_TWO_N31;
const std::vector<std::pair<int,int>> FNAV_omegadot_2_bit({{48,24}});
const std::vector<std::pair<int,int>> FNAV_omegadot_2_bit({{49,24}});
const double FNAV_omegadot_2_LSB = PI_TWO_N43;
const std::vector<std::pair<int,int>> FNAV_e_2_bit({{72,32}});
const std::vector<std::pair<int,int>> FNAV_e_2_bit({{73,32}});
const double FNAV_e_2_LSB = TWO_N33;
const std::vector<std::pair<int,int>> FNAV_a12_2_bit({{104,32}});
const std::vector<std::pair<int,int>> FNAV_a12_2_bit({{105,32}});
const double FNAV_a12_2_LSB = TWO_N19;
const std::vector<std::pair<int,int>> FNAV_omega0_2_bit({{136,32}});
const std::vector<std::pair<int,int>> FNAV_omega0_2_bit({{137,32}});
const double FNAV_omega0_2_LSB = PI_TWO_N31;
const std::vector<std::pair<int,int>> FNAV_idot_2_bit({{168,14}});
const std::vector<std::pair<int,int>> FNAV_idot_2_bit({{169,14}});
const double FNAV_idot_2_LSB = PI_TWO_N43;
const std::vector<std::pair<int,int>> FNAV_WN_2_bit({{182,12}});
const std::vector<std::pair<int,int>> FNAV_TOW_2_bit({{194,20}});
const std::vector<std::pair<int,int>> FNAV_WN_2_bit({{183,12}});
const std::vector<std::pair<int,int>> FNAV_TOW_2_bit({{195,20}});
// WORD 3 Ephemeris (2/3)
const std::vector<std::pair<int,int>> FNAV_IODnav_3_bit({{6,10}});
const std::vector<std::pair<int,int>> FNAV_i0_3_bit({{16,32}});
const std::vector<std::pair<int,int>> FNAV_IODnav_3_bit({{7,10}});
const std::vector<std::pair<int,int>> FNAV_i0_3_bit({{17,32}});
const double FNAV_i0_3_LSB = PI_TWO_N31;
const std::vector<std::pair<int,int>> FNAV_w_3_bit({{48,32}});
const std::vector<std::pair<int,int>> FNAV_w_3_bit({{49,32}});
const double FNAV_w_3_LSB = PI_TWO_N31;
const std::vector<std::pair<int,int>> FNAV_deltan_3_bit({{80,16}});
const std::vector<std::pair<int,int>> FNAV_deltan_3_bit({{81,16}});
const double FNAV_deltan_3_LSB = PI_TWO_N43;
const std::vector<std::pair<int,int>> FNAV_Cuc_3_bit({{96,16}});
const std::vector<std::pair<int,int>> FNAV_Cuc_3_bit({{97,16}});
const double FNAV_Cuc_3_LSB = TWO_N29;
const std::vector<std::pair<int,int>> FNAV_Cus_3_bit({{112,16}});
const std::vector<std::pair<int,int>> FNAV_Cus_3_bit({{113,16}});
const double FNAV_Cus_3_LSB = TWO_N29;
const std::vector<std::pair<int,int>> FNAV_Crc_3_bit({{128,16}});
const std::vector<std::pair<int,int>> FNAV_Crc_3_bit({{129,16}});
const double FNAV_Crc_3_LSB = TWO_N5;
const std::vector<std::pair<int,int>> FNAV_Crs_3_bit({{144,16}});
const std::vector<std::pair<int,int>> FNAV_Crs_3_bit({{145,16}});
const double FNAV_Crs_3_LSB = TWO_N5;
const std::vector<std::pair<int,int>> FNAV_t0e_3_bit({{160,14}});
const std::vector<std::pair<int,int>> FNAV_t0e_3_bit({{161,14}});
const double FNAV_t0e_3_LSB = 60;
const std::vector<std::pair<int,int>> FNAV_WN_3_bit({{174,12}});
const std::vector<std::pair<int,int>> FNAV_TOW_3_bit({{186,20}});
const std::vector<std::pair<int,int>> FNAV_WN_3_bit({{175,12}});
const std::vector<std::pair<int,int>> FNAV_TOW_3_bit({{187,20}});
// WORD 4 Ephemeris (3/3)
const std::vector<std::pair<int,int>> FNAV_IODnav_4_bit({{6,10}});
const std::vector<std::pair<int,int>> FNAV_Cic_4_bit({{16,16}});
const std::vector<std::pair<int,int>> FNAV_IODnav_4_bit({{7,10}});
const std::vector<std::pair<int,int>> FNAV_Cic_4_bit({{18,16}});
const double FNAV_Cic_4_LSB = TWO_N29;
const std::vector<std::pair<int,int>> FNAV_Cis_4_bit({{32,16}});
const std::vector<std::pair<int,int>> FNAV_Cis_4_bit({{33,16}});
const double FNAV_Cis_4_LSB = TWO_N29;
const std::vector<std::pair<int,int>> FNAV_A0_4_bit({{48,32}});
const std::vector<std::pair<int,int>> FNAV_A0_4_bit({{49,32}});
const double FNAV_A0_4_LSB = TWO_N30;
const std::vector<std::pair<int,int>> FNAV_A1_4_bit({{80,24}});
const std::vector<std::pair<int,int>> FNAV_A1_4_bit({{81,24}});
const double FNAV_A1_4_LSB = TWO_N50;
const std::vector<std::pair<int,int>> FNAV_deltatls_4_bit({{104,8}});
const std::vector<std::pair<int,int>> FNAV_t0t_4_bit({{112,8}});
const std::vector<std::pair<int,int>> FNAV_deltatls_4_bit({{105,8}});
const std::vector<std::pair<int,int>> FNAV_t0t_4_bit({{113,8}});
const double FNAV_t0t_4_LSB = 3600;
const std::vector<std::pair<int,int>> FNAV_WNot_4_bit({{120,8}});
const std::vector<std::pair<int,int>> FNAV_WNlsf_4_bit({{128,8}});
const std::vector<std::pair<int,int>> FNAV_DN_4_bit({{136,3}});
const std::vector<std::pair<int,int>> FNAV_deltatlsf_4_bit({{139,8}});
const std::vector<std::pair<int,int>> FNAV_t0g_4_bit({{147,8}});
const std::vector<std::pair<int,int>> FNAV_WNot_4_bit({{121,8}});
const std::vector<std::pair<int,int>> FNAV_WNlsf_4_bit({{129,8}});
const std::vector<std::pair<int,int>> FNAV_DN_4_bit({{137,3}});
const std::vector<std::pair<int,int>> FNAV_deltatlsf_4_bit({{140,8}});
const std::vector<std::pair<int,int>> FNAV_t0g_4_bit({{148,8}});
const double FNAV_t0g_4_LSB = 3600;
const std::vector<std::pair<int,int>> FNAV_A0g_4_bit({{155,16}});
const std::vector<std::pair<int,int>> FNAV_A0g_4_bit({{156,16}});
const double FNAV_A0g_4_LSB = TWO_N35;
const std::vector<std::pair<int,int>> FNAV_A1g_4_bit({{171,12}});
const std::vector<std::pair<int,int>> FNAV_A1g_4_bit({{172,12}});
const double FNAV_A1g_4_LSB = TWO_N51;
const std::vector<std::pair<int,int>> FNAV_WN0g_4_bit({{183,6}});
const std::vector<std::pair<int,int>> FNAV_TOW_4_bit({{189,20}});
const std::vector<std::pair<int,int>> FNAV_WN0g_4_bit({{184,6}});
const std::vector<std::pair<int,int>> FNAV_TOW_4_bit({{190,20}});
// WORD 5 Almanac SVID1 SVID2(1/2)
const std::vector<std::pair<int,int>> FNAV_IODa_5_bit({{6,4}});
const std::vector<std::pair<int,int>> FNAV_WNa_5_bit({{10,2}});
const std::vector<std::pair<int,int>> FNAV_t0a_5_bit({{12,10}});
const std::vector<std::pair<int,int>> FNAV_IODa_5_bit({{7,4}});
const std::vector<std::pair<int,int>> FNAV_WNa_5_bit({{11,2}});
const std::vector<std::pair<int,int>> FNAV_t0a_5_bit({{13,10}});
const double FNAV_t0a_5_LSB = 600;
const std::vector<std::pair<int,int>> FNAV_SVID1_5_bit({{22,6}});
const std::vector<std::pair<int,int>> FNAV_Deltaa12_1_5_bit({{28,13}});
const std::vector<std::pair<int,int>> FNAV_SVID1_5_bit({{23,6}});
const std::vector<std::pair<int,int>> FNAV_Deltaa12_1_5_bit({{29,13}});
const double FNAV_Deltaa12_5_LSB = TWO_N9;
const std::vector<std::pair<int,int>> FNAV_e_1_5_bit({{41,11}});
const std::vector<std::pair<int,int>> FNAV_e_1_5_bit({{42,11}});
const double FNAV_e_5_LSB = TWO_N16;
const std::vector<std::pair<int,int>> FNAV_w_1_5_bit({{52,16}});
const std::vector<std::pair<int,int>> FNAV_w_1_5_bit({{53,16}});
const double FNAV_w_5_LSB = TWO_N15;
const std::vector<std::pair<int,int>> FNAV_deltai_1_5_bit({{68,11}});
const std::vector<std::pair<int,int>> FNAV_deltai_1_5_bit({{69,11}});
const double FNAV_deltai_5_LSB = TWO_N14;
const std::vector<std::pair<int,int>> FNAV_Omega0_1_5_bit({{79,16}});
const std::vector<std::pair<int,int>> FNAV_Omega0_1_5_bit({{80,16}});
const double FNAV_Omega0_5_LSB = TWO_N15;
const std::vector<std::pair<int,int>> FNAV_Omegadot_1_5_bit({{95,11}});
const std::vector<std::pair<int,int>> FNAV_Omegadot_1_5_bit({{96,11}});
const double FNAV_Omegadot_5_LSB = TWO_N33;
const std::vector<std::pair<int,int>> FNAV_M0_1_5_bit({{106,16}});
const std::vector<std::pair<int,int>> FNAV_M0_1_5_bit({{107,16}});
const double FNAV_M0_5_LSB = TWO_N15;
const std::vector<std::pair<int,int>> FNAV_af0_1_5_bit({{122,16}});
const std::vector<std::pair<int,int>> FNAV_af0_1_5_bit({{123,16}});
const double FNAV_af0_5_LSB = TWO_N19;
const std::vector<std::pair<int,int>> FNAV_af1_1_5_bit({{138,13}});
const std::vector<std::pair<int,int>> FNAV_af1_1_5_bit({{139,13}});
const double FNAV_af1_5_LSB = TWO_N38;
const std::vector<std::pair<int,int>> FNAV_E5ahs_1_5_bit({{151,2}});
const std::vector<std::pair<int,int>> FNAV_SVID2_5_bit({{153,6}});
const std::vector<std::pair<int,int>> FNAV_Deltaa12_2_5_bit({{159,13}});
const std::vector<std::pair<int,int>> FNAV_e_2_5_bit({{172,11}});
const std::vector<std::pair<int,int>> FNAV_w_2_5_bit({{183,16}});
const std::vector<std::pair<int,int>> FNAV_deltai_2_5_bit({{199,11}});
const std::vector<std::pair<int,int>> FNAV_E5ahs_1_5_bit({{152,2}});
const std::vector<std::pair<int,int>> FNAV_SVID2_5_bit({{154,6}});
const std::vector<std::pair<int,int>> FNAV_Deltaa12_2_5_bit({{160,13}});
const std::vector<std::pair<int,int>> FNAV_e_2_5_bit({{173,11}});
const std::vector<std::pair<int,int>> FNAV_w_2_5_bit({{184,16}});
const std::vector<std::pair<int,int>> FNAV_deltai_2_5_bit({{200,11}});
//const std::vector<std::pair<int,int>> FNAV_Omega012_2_5_bit({{210,4}});
// WORD 6 Almanac SVID2(1/2) SVID3
const std::vector<std::pair<int,int>> FNAV_IODa_6_bit({{6,4}});
const std::vector<std::pair<int,int>> FNAV_IODa_6_bit({{7,4}});
//const std::vector<std::pair<int,int>> FNAV_Omega022_2_6_bit({{10,12}});
const std::vector<std::pair<int,int>> FNAV_Omegadot_2_6_bit({{22,11}});
const std::vector<std::pair<int,int>> FNAV_M0_2_6_bit({{33,16}});
const std::vector<std::pair<int,int>> FNAV_af0_2_6_bit({{49,16}});
const std::vector<std::pair<int,int>> FNAV_af1_2_6_bit({{65,13}});
const std::vector<std::pair<int,int>> FNAV_E5ahs_2_6_bit({{78,2}});
const std::vector<std::pair<int,int>> FNAV_SVID3_6_bit({{80,6}});
const std::vector<std::pair<int,int>> FNAV_Deltaa12_3_6_bit({{86,13}});
const std::vector<std::pair<int,int>> FNAV_e_3_6_bit({{99,11}});
const std::vector<std::pair<int,int>> FNAV_w_3_6_bit({{110,16}});
const std::vector<std::pair<int,int>> FNAV_deltai_3_6_bit({{126,11}});
const std::vector<std::pair<int,int>> FNAV_Omega0_3_6_bit({{137,16}});
const std::vector<std::pair<int,int>> FNAV_Omegadot_3_6_bit({{153,11}});
const std::vector<std::pair<int,int>> FNAV_M0_3_6_bit({{164,16}});
const std::vector<std::pair<int,int>> FNAV_af0_3_6_bit({{180,16}});
const std::vector<std::pair<int,int>> FNAV_af1_3_6_bit({{196,13}});
const std::vector<std::pair<int,int>> FNAV_E5ahs_3_6_bit({{209,2}});
const std::vector<std::pair<int,int>> FNAV_Omegadot_2_6_bit({{23,11}});
const std::vector<std::pair<int,int>> FNAV_M0_2_6_bit({{34,16}});
const std::vector<std::pair<int,int>> FNAV_af0_2_6_bit({{50,16}});
const std::vector<std::pair<int,int>> FNAV_af1_2_6_bit({{66,13}});
const std::vector<std::pair<int,int>> FNAV_E5ahs_2_6_bit({{79,2}});
const std::vector<std::pair<int,int>> FNAV_SVID3_6_bit({{81,6}});
const std::vector<std::pair<int,int>> FNAV_Deltaa12_3_6_bit({{87,13}});
const std::vector<std::pair<int,int>> FNAV_e_3_6_bit({{100,11}});
const std::vector<std::pair<int,int>> FNAV_w_3_6_bit({{111,16}});
const std::vector<std::pair<int,int>> FNAV_deltai_3_6_bit({{127,11}});
const std::vector<std::pair<int,int>> FNAV_Omega0_3_6_bit({{138,16}});
const std::vector<std::pair<int,int>> FNAV_Omegadot_3_6_bit({{154,11}});
const std::vector<std::pair<int,int>> FNAV_M0_3_6_bit({{165,16}});
const std::vector<std::pair<int,int>> FNAV_af0_3_6_bit({{181,16}});
const std::vector<std::pair<int,int>> FNAV_af1_3_6_bit({{197,13}});
const std::vector<std::pair<int,int>> FNAV_E5ahs_3_6_bit({{210,2}});
// Galileo E5a-I primary codes
const std::string Galileo_E5a_I_PRIMARY_CODE[Galileo_E5a_NUMBER_OF_CODES] = {

View File

@ -69,7 +69,7 @@ void Galileo_Fnav_Message::reset()
/* WORD 1 SVID, Clock correction, SISA, Ionospheric correction, BGD, GST, Signal
* health and Data validity status*/
FNAV_SV_ID_PRN_1 = 0;
FNAV_IODnav_1 = 0;
FNAV_IODnav_1 = -1;
FNAV_t0c_1 = 0;
FNAV_af0_1 = 0;
FNAV_af1_1 = 0;
@ -90,7 +90,7 @@ void Galileo_Fnav_Message::reset()
FNAV_E5advs_1 = 0;
// WORD 2 Ephemeris (1/3) and GST
FNAV_IODnav_2 = 0;
FNAV_IODnav_2 = -2;
FNAV_M0_2 = 0;
FNAV_omegadot_2 = 0;
FNAV_e_2 = 0;
@ -101,7 +101,7 @@ void Galileo_Fnav_Message::reset()
FNAV_TOW_2 = 0;
// WORD 3 Ephemeris (2/3) and GST
FNAV_IODnav_3 = 0;
FNAV_IODnav_3 = -3;
FNAV_i0_3 = 0;
FNAV_w_3 = 0;
FNAV_deltan_3 = 0;
@ -115,7 +115,7 @@ void Galileo_Fnav_Message::reset()
/* WORD 4 Ephemeris (3/3), GST-UTC conversion, GST-GPS conversion and TOW.
Note that the clock is repeated in this page type*/
FNAV_IODnav_4 = 0;
FNAV_IODnav_4 = -4;
FNAV_Cic_4 = 0;
FNAV_Cis_4 = 0;
FNAV_A0_4 = 0;