mirror of
https://github.com/gnss-sdr/gnss-sdr
synced 2024-12-14 12:10:34 +00:00
Mara Branzanti contribution for Google Summer of Code (GSoC 2013)
- Galileo Telemetry page decoder - Galileo Ephemeris and almanac decoder (still experimental!) git-svn-id: https://svn.code.sf.net/p/gnss-sdr/code/trunk@399 64b25241-fba3-4117-9849-534c7e92360d
This commit is contained in:
parent
9bfd2bb32a
commit
01dd425e58
5
README
5
README
@ -215,6 +215,11 @@ By default, CMake will build the Release version, meaning that the compiler will
|
|||||||
|
|
||||||
$ cd gnss-sdr/build
|
$ cd gnss-sdr/build
|
||||||
$ cmake -DCMAKE_BUILD_TYPE=Debug ../
|
$ cmake -DCMAKE_BUILD_TYPE=Debug ../
|
||||||
|
|
||||||
|
for eclipse
|
||||||
|
cmake -G "Eclipse CDT4 - Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug -DECLIPSE_CDT4_GENERATE_SOURCE_PROJECT=TRUE -DCMAKE_ECLIPSE_VERSION=3.7 -DCMAKE_ECLIPSE_MAKE_ARGUMENTS=-j8 ../
|
||||||
|
|
||||||
|
|
||||||
$ make
|
$ make
|
||||||
$ make install
|
$ make install
|
||||||
|
|
||||||
|
@ -229,8 +229,8 @@ int galileo_e1b_telemetry_decoder_cc::general_work (int noutput_items, gr_vector
|
|||||||
if (abs(preamble_diff - GALILEO_INAV_PREAMBLE_PERIOD_SYMBOLS) < 1)
|
if (abs(preamble_diff - GALILEO_INAV_PREAMBLE_PERIOD_SYMBOLS) < 1)
|
||||||
{
|
{
|
||||||
|
|
||||||
//std::cout<<"d_sample_counter="<<d_sample_counter<<std::endl;
|
std::cout<<"d_sample_counter="<<d_sample_counter<<std::endl;
|
||||||
//std::cout<<"corr_value="<<corr_value<<std::endl;
|
std::cout<<"corr_value="<<corr_value<<std::endl;
|
||||||
// NEW Galileo page part is received
|
// NEW Galileo page part is received
|
||||||
// 0. fetch the symbols into an array
|
// 0. fetch the symbols into an array
|
||||||
int frame_length=GALILEO_INAV_PAGE_PART_SYMBOLS-d_symbols_per_preamble;
|
int frame_length=GALILEO_INAV_PAGE_PART_SYMBOLS-d_symbols_per_preamble;
|
||||||
@ -239,9 +239,14 @@ int galileo_e1b_telemetry_decoder_cc::general_work (int noutput_items, gr_vector
|
|||||||
|
|
||||||
for (int i=0;i<frame_length;i++)
|
for (int i=0;i<frame_length;i++)
|
||||||
{
|
{
|
||||||
page_part_symbols[i]=in[0][i+d_symbols_per_preamble].Prompt_I; // because last symbol of the preamble is just received now!
|
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!
|
||||||
|
|
||||||
|
}else{
|
||||||
|
page_part_symbols[i]=-in[0][i+d_symbols_per_preamble].Prompt_I; // because last symbol of the preamble is just received now!
|
||||||
|
}
|
||||||
|
}
|
||||||
// 1. De-interleave
|
// 1. De-interleave
|
||||||
deinterleaver(GALILEO_INAV_INTERLEAVER_ROWS,GALILEO_INAV_INTERLEAVER_COLS,page_part_symbols, page_part_symbols_deint);
|
deinterleaver(GALILEO_INAV_INTERLEAVER_ROWS,GALILEO_INAV_INTERLEAVER_COLS,page_part_symbols, page_part_symbols_deint);
|
||||||
|
|
||||||
@ -250,11 +255,7 @@ int galileo_e1b_telemetry_decoder_cc::general_work (int noutput_items, gr_vector
|
|||||||
// 2.2 Take into account the possible inversion of the polarity due to PLL lock at 180º
|
// 2.2 Take into account the possible inversion of the polarity due to PLL lock at 180º
|
||||||
for (int i=0;i<frame_length;i++)
|
for (int i=0;i<frame_length;i++)
|
||||||
{
|
{
|
||||||
if (corr_value<0)
|
if ((i+1)%2==0)
|
||||||
{
|
|
||||||
page_part_symbols_deint[i]=-page_part_symbols_deint[i];
|
|
||||||
}
|
|
||||||
if (i%2==0)
|
|
||||||
{
|
{
|
||||||
page_part_symbols_deint[i]=-page_part_symbols_deint[i];
|
page_part_symbols_deint[i]=-page_part_symbols_deint[i];
|
||||||
}
|
}
|
||||||
@ -265,49 +266,44 @@ int galileo_e1b_telemetry_decoder_cc::general_work (int noutput_items, gr_vector
|
|||||||
|
|
||||||
// 3. Call the Galileo page decoder
|
// 3. Call the Galileo page decoder
|
||||||
|
|
||||||
// std::cout<<"frame_symbols=[";
|
std::string page_String;
|
||||||
// for (int i=0;i<frame_length;i++)
|
|
||||||
// {
|
//std::cout<<"frame_bits=[";
|
||||||
// if (page_part_symbols[i]>0)
|
for(int i=0; i < (frame_length/2); i++)
|
||||||
// {
|
{
|
||||||
// std::cout<<",1";
|
if (page_part_bits[i]>0)
|
||||||
// }else{
|
{
|
||||||
// std::cout<<",0";
|
page_String.push_back('1');
|
||||||
// }
|
//std::cout<<",1";
|
||||||
// }
|
}else{
|
||||||
// std::cout<<"]"<<std::endl;
|
page_String.push_back('0');
|
||||||
// std::cout<<"frame_symbols_deint=[";
|
//std::cout<<",0";
|
||||||
// for (int i=0;i<frame_length;i++)
|
}
|
||||||
// {
|
|
||||||
// if (page_part_symbols_deint[i]>0)
|
//sprintf(&page_String[i], "%d", page_part_bits[i]); // this produces a memory core dumped...
|
||||||
// {
|
}
|
||||||
// std::cout<<",1";
|
//std::cout<<"]"<<std::endl;
|
||||||
// }else{
|
|
||||||
// std::cout<<",0";
|
Galileo_Navigation_Message decode_page;
|
||||||
// }
|
|
||||||
// }
|
std::cout<<"page_string="<<page_String<<std::endl; //correctly transformed to char
|
||||||
// std::cout<<"]"<<std::endl;
|
|
||||||
//
|
|
||||||
// std::cout<<"frame_bits=[";
|
if (page_part_bits[0]==1)
|
||||||
// for (int i=0;i<frame_length/2;i++)
|
{
|
||||||
// {
|
std::cout<<"Page Odd"<<std::endl;
|
||||||
// if (page_part_bits[i]>0)
|
decode_page.split_page(page_String.c_str(), flag_even_word_arrived);
|
||||||
// {
|
flag_even_word_arrived=0;
|
||||||
// std::cout<<",1";
|
std::cout<<"Page type ="<< page_part_bits[1]<<std::endl;
|
||||||
// }else{
|
}
|
||||||
// std::cout<<",0";
|
else
|
||||||
// }
|
{
|
||||||
// }
|
std::cout<<"Page Even"<<std::endl;
|
||||||
// std::cout<<"]"<<std::endl;
|
decode_page.split_page(page_String.c_str(), flag_even_word_arrived);
|
||||||
|
flag_even_word_arrived=1;
|
||||||
|
std::cout<<"Page type ="<< page_part_bits[1]<<std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
if (page_part_bits[0]==1)
|
|
||||||
{
|
|
||||||
std::cout<<"Page Odd"<<std::endl;
|
|
||||||
}else
|
|
||||||
{
|
|
||||||
std::cout<<"Page Even"<<std::endl;
|
|
||||||
}
|
|
||||||
//ToDo: Call here the frame decoder
|
|
||||||
|
|
||||||
|
|
||||||
d_flag_preamble = true;
|
d_flag_preamble = true;
|
||||||
|
@ -70,6 +70,7 @@ public:
|
|||||||
~galileo_e1b_telemetry_decoder_cc();
|
~galileo_e1b_telemetry_decoder_cc();
|
||||||
void set_satellite(Gnss_Satellite satellite); //!< Set satellite PRN
|
void set_satellite(Gnss_Satellite satellite); //!< Set satellite PRN
|
||||||
void set_channel(int channel); //!< Set receiver's channel
|
void set_channel(int channel); //!< Set receiver's channel
|
||||||
|
int flag_even_word_arrived;
|
||||||
/*!
|
/*!
|
||||||
* \brief Set the satellite data queue
|
* \brief Set the satellite data queue
|
||||||
*/
|
*/
|
||||||
@ -109,6 +110,7 @@ private:
|
|||||||
|
|
||||||
long d_fs_in;
|
long d_fs_in;
|
||||||
|
|
||||||
|
|
||||||
//gr::trellis::interleaver d_interleaver;
|
//gr::trellis::interleaver d_interleaver;
|
||||||
|
|
||||||
// navigation message vars
|
// navigation message vars
|
||||||
|
@ -67,18 +67,209 @@ const int GALILEO_PAGE_TYPE_BITS = 6;
|
|||||||
const int GALILEO_DATA_JK_BITS =128;
|
const int GALILEO_DATA_JK_BITS =128;
|
||||||
|
|
||||||
const std::vector<std::pair<int,int>> type({{1,6}});
|
const std::vector<std::pair<int,int>> type({{1,6}});
|
||||||
|
const std::vector<std::pair<int,int>> PAGE_TYPE_bit({{1,6}});;
|
||||||
|
|
||||||
|
/*Page 1 - Word type 1: Ephemeris (1/4)*/
|
||||||
|
const std::vector<std::pair<int,int>> IOD_nav_1_bit({{7,10}});
|
||||||
|
const std::vector<std::pair<int,int>> T0E_1_bit({{17,14}});
|
||||||
|
const double t0e_1_LSB = 60;
|
||||||
|
const std::vector<std::pair<int,int>> M0_1_bit({{31,32}});
|
||||||
|
const double M0_1_LSB = TWO_N31;
|
||||||
|
const std::vector<std::pair<int,int>> e_1_bit({{63,32}});
|
||||||
|
const double e_1_LSB = TWO_N33;
|
||||||
|
const std::vector<std::pair<int,int>> A_1_bit({{95,32}});
|
||||||
|
const double A_1_LSB_gal = TWO_N19;
|
||||||
|
//last two bits are reserved
|
||||||
|
|
||||||
|
|
||||||
|
/*Page 2 - Word type 2: Ephemeris (2/4)*/
|
||||||
|
const std::vector<std::pair<int,int>> IOD_nav_2_bit({{7,10}});
|
||||||
|
const std::vector<std::pair<int,int>> OMEGA_0_2_bit({{17,32}});
|
||||||
|
const double OMEGA_0_2_LSB = TWO_N31;
|
||||||
|
const std::vector<std::pair<int,int>> i_0_2_bit({{49,32}});
|
||||||
|
const double i_0_2_LSB = TWO_N31;
|
||||||
|
const std::vector<std::pair<int,int>> omega_2_bit({{81,32}});
|
||||||
|
const double omega_2_LSB = TWO_N31;
|
||||||
|
const std::vector<std::pair<int,int>> iDot_2_bit({{113,14}});
|
||||||
|
const double iDot_2_LSB = TWO_N43;
|
||||||
|
//last two bits are reserved
|
||||||
|
|
||||||
|
|
||||||
|
/*Word type 3: Ephemeris (3/4) and SISA*/
|
||||||
|
const std::vector<std::pair<int,int>> IOD_nav_3_bit({{7,10}});
|
||||||
|
const std::vector<std::pair<int,int>> OMEGA_dot_3_bit({{17,24}});
|
||||||
|
const double OMEGA_dot_3_LSB = TWO_N43;
|
||||||
|
const std::vector<std::pair<int,int>> delta_n_3_bit({{41,16}});
|
||||||
|
const double delta_n_3_LSB = TWO_N43;
|
||||||
|
const std::vector<std::pair<int,int>> C_uc_3_bit({{57,16}});
|
||||||
|
const double C_uc_3_LSB = TWO_N29;
|
||||||
|
const std::vector<std::pair<int,int>> C_us_3_bit({{73,16}});
|
||||||
|
const double C_us_3_LSB = TWO_N29;
|
||||||
|
const std::vector<std::pair<int,int>> C_rc_3_bit({{89,16}});
|
||||||
|
const double C_rc_3_LSB = TWO_N5;
|
||||||
|
const std::vector<std::pair<int,int>> C_rs_3_bit({{105,16}});
|
||||||
|
const double C_rs_3_LSB = TWO_N5;
|
||||||
|
const std::vector<std::pair<int,int>> SISA_3_bit({{121,8}});
|
||||||
|
|
||||||
|
|
||||||
|
/*Word type 4: Ephemeris (4/4) and Clock correction parameters*/
|
||||||
|
const std::vector<std::pair<int,int>> IOD_nav_4_bit({{7,10}});
|
||||||
|
const std::vector<std::pair<int,int>> SV_ID_PRN_4_bit({{17,6}});
|
||||||
|
const std::vector<std::pair<int,int>> C_ic_4_bit({{23,16}});
|
||||||
|
const double C_ic_4_LSB = TWO_N29;
|
||||||
|
const std::vector<std::pair<int,int>> C_is_4_bit({{39,16}});
|
||||||
|
const double C_is_4_LSB = TWO_N29;
|
||||||
|
const std::vector<std::pair<int,int>> t0c_4_bit({{55,14}}); //
|
||||||
|
const double t0c_4_LSB = 60;
|
||||||
|
const std::vector<std::pair<int,int>> af0_4_bit({{69,31}}); //
|
||||||
|
const double af0_4_LSB = TWO_N34;
|
||||||
|
const std::vector<std::pair<int,int>> af1_4_bit({{100,21}}); //
|
||||||
|
const double af1_4_LSB = TWO_N46;
|
||||||
|
const std::vector<std::pair<int,int>> af2_4_bit({{121,6}});
|
||||||
|
const double af2_4_LSB = TWO_N59;
|
||||||
|
const std::vector<std::pair<int,int>> spare_4_bit({{121,6}});
|
||||||
|
//last two bits are reserved
|
||||||
|
|
||||||
|
|
||||||
|
/*Word type 5: Ionospheric correction, BGD, signal health and data validity status and GST*/
|
||||||
|
/*Ionospheric correction*/
|
||||||
|
/*Az*/
|
||||||
|
const std::vector<std::pair<int,int>> ai0_5_bit({{7,11}}); //
|
||||||
|
const double ai0_5_LSB = TWO_N2;
|
||||||
|
const std::vector<std::pair<int,int>> ai1_5_bit({{18,11}}); //
|
||||||
|
const double ai1_5_LSB = TWO_N8;
|
||||||
|
const std::vector<std::pair<int,int>> ai2_5_bit({{29,14}}); //
|
||||||
|
const double ai2_5_LSB = TWO_N15;
|
||||||
|
/*Ionospheric disturbance flag*/
|
||||||
|
const std::vector<std::pair<int,int>> Region1_5_bit({{43,1}}); //
|
||||||
|
const std::vector<std::pair<int,int>> Region2_5_bit({{44,1}}); //
|
||||||
|
const std::vector<std::pair<int,int>> Region3_5_bit({{45,1}}); //
|
||||||
|
const std::vector<std::pair<int,int>> Region4_5_bit({{46,1}}); //
|
||||||
|
const std::vector<std::pair<int,int>> Region5_5_bit({{47,1}}); //
|
||||||
|
const std::vector<std::pair<int,int>> BGD_E1E5a_5_bit({{48,10}}); //
|
||||||
|
const double BGD_E1E5a_5_LSB = TWO_N32;
|
||||||
|
const std::vector<std::pair<int,int>> BGD_E1E5b_5_bit({{58,10}}); //
|
||||||
|
const double BGD_E1E5b_5_LSB = TWO_N35;
|
||||||
|
const std::vector<std::pair<int,int>> E5b_HS_5_bit({{68,2}}); //
|
||||||
|
const std::vector<std::pair<int,int>> E1B_HS_5_bit({{70,2}}); //
|
||||||
|
const std::vector<std::pair<int,int>> E5b_DVS_5_bit({{72,1}}); //
|
||||||
|
const std::vector<std::pair<int,int>> E1B_DVS_5_bit({{73,1}}); //
|
||||||
|
/*GST*/
|
||||||
|
const std::vector<std::pair<int,int>> WN_5_bit({{74,12}});
|
||||||
|
const std::vector<std::pair<int,int>> TOW_5_bit({{86,20}});
|
||||||
|
const std::vector<std::pair<int,int>> spare_5_bit({{106,23}});
|
||||||
|
|
||||||
|
|
||||||
|
/* Page 6 */
|
||||||
|
const std::vector<std::pair<int,int>> A0_6_bit({{7,32}});
|
||||||
|
const double A0_6_LSB = TWO_N30;
|
||||||
|
const std::vector<std::pair<int,int>> A1_6_bit({{39,24}});
|
||||||
|
const double A1_6_LSB = TWO_N50;
|
||||||
|
const std::vector<std::pair<int,int>> Delta_tLS_6_bit({{63,8}});
|
||||||
|
const std::vector<std::pair<int,int>> t0t_6_bit({{71,8}});
|
||||||
|
const double t0t_6_LSB = 3600;
|
||||||
|
const std::vector<std::pair<int,int>> WNot_6_bit({{79,8}});
|
||||||
|
const std::vector<std::pair<int,int>> WN_LSF_6_bit({{86,8}});
|
||||||
|
const std::vector<std::pair<int,int>> DN_6_bit({{95,3}});
|
||||||
|
const std::vector<std::pair<int,int>> Delta_tLSF_6_bit({{97,8}});
|
||||||
|
const std::vector<std::pair<int,int>> TOW_6_bit({{106,20}});
|
||||||
|
|
||||||
|
/* Page 7 */
|
||||||
|
const std::vector<std::pair<int,int>>IOD_a_7_bit({{7,4}});
|
||||||
|
const std::vector<std::pair<int,int>>WN_a_7_bit({{11,2}});
|
||||||
|
const std::vector<std::pair<int,int>>t0a_7_bit({{13,10}});
|
||||||
|
const double t0a_7_LSB = 600;
|
||||||
|
const std::vector<std::pair<int,int>>SVID1_7_bit({{23,6}});
|
||||||
|
const std::vector<std::pair<int,int>>Delta_alpha_7_bit({{29,13}});
|
||||||
|
const double Delta_alpha_7_LSB = TWO_N9;
|
||||||
|
const std::vector<std::pair<int,int>>e_7_bit({{42,11}});
|
||||||
|
const double e_7_LSB = TWO_N16;
|
||||||
|
const std::vector<std::pair<int,int>>omega_7_bit({{53,16}});
|
||||||
|
const double omega_7_LSB = TWO_N15;
|
||||||
|
const std::vector<std::pair<int,int>>delta_i_7_bit({{69,11}});
|
||||||
|
const double delta_i_7_LSB = TWO_N14;
|
||||||
|
const std::vector<std::pair<int,int>>Omega0_7_bit({{80,16}});
|
||||||
|
const double Omega0_7_LSB = TWO_N15;
|
||||||
|
const std::vector<std::pair<int,int>>Omega_dot_7_bit({{96,11}});
|
||||||
|
const double Omega_dot_7_LSB = TWO_N33;
|
||||||
|
const std::vector<std::pair<int,int>>M0_7_bit({{107,16}});
|
||||||
|
const double M0_7_LSB = TWO_N15;
|
||||||
|
/* Page 8 */
|
||||||
|
const std::vector<std::pair<int,int>>IOD_a_8_bit({{7,4}});
|
||||||
|
const std::vector<std::pair<int,int>>af0_8_bit({{11,16}});
|
||||||
|
const double af0_8_LSB = TWO_N19;
|
||||||
|
const std::vector<std::pair<int,int>>af1_8_bit({{27,13}});
|
||||||
|
const double af1_8_LSB = TWO_N38;
|
||||||
|
const std::vector<std::pair<int,int>>E5b_HS_8_bit({{40,2}});
|
||||||
|
const std::vector<std::pair<int,int>>E1B_HS_8_bit({{42,2}});
|
||||||
|
const std::vector<std::pair<int,int>>SVID2_8_bit({{44,6}});
|
||||||
|
const std::vector<std::pair<int,int>>DELTA_A_8_bit({{50,13}});
|
||||||
|
const double DELTA_A_8_LSB = TWO_N9;
|
||||||
|
const std::vector<std::pair<int,int>>e_8_bit({{63,11}});
|
||||||
|
const double e_8_LSB = TWO_N16;
|
||||||
|
const std::vector<std::pair<int,int>>omega_8_bit({{74,16}});
|
||||||
|
const double omega_8_LSB = TWO_N15;
|
||||||
|
const std::vector<std::pair<int,int>>delta_i_8_bit({{90,11}});
|
||||||
|
const double delta_i_8_LSB = TWO_N14;
|
||||||
|
const std::vector<std::pair<int,int>>Omega0_8_bit({{101,16}});
|
||||||
|
const double Omega0_8_LSB = TWO_N15;
|
||||||
|
const std::vector<std::pair<int,int>>Omega_dot_8_bit({{117,11}});
|
||||||
|
const double Omega_dot_8_LSB = TWO_N33;
|
||||||
|
|
||||||
|
/* Page 9 */
|
||||||
|
const std::vector<std::pair<int,int>>IOD_a_9_bit({{7,4}});
|
||||||
|
const std::vector<std::pair<int,int>>WN_a_9_bit({{11,2}});
|
||||||
|
const std::vector<std::pair<int,int>>t0a_9_bit({{13,10}});
|
||||||
|
const double t0a_9_LSB = 600;
|
||||||
|
const std::vector<std::pair<int,int>>M0_9_bit({{23,16}});
|
||||||
|
const double M0_9_LSB = TWO_N15;
|
||||||
|
const std::vector<std::pair<int,int>>af0_9_bit({{39,16}});
|
||||||
|
const double af0_9_LSB = TWO_N19;
|
||||||
|
const std::vector<std::pair<int,int>>af1_9_bit({{54,13}});
|
||||||
|
const double af1_9_LSB = TWO_N38;
|
||||||
|
const std::vector<std::pair<int,int>>E5b_HS_9_bit({{68,2}});
|
||||||
|
const std::vector<std::pair<int,int>>E1B_HS_9_bit({{70,2}});
|
||||||
|
const std::vector<std::pair<int,int>>SVID3_9_bit({{72,6}});
|
||||||
|
const std::vector<std::pair<int,int>>DELTA_A_9_bit({{78,13}});
|
||||||
|
const double DELTA_A_9_LSB = TWO_N9;
|
||||||
|
const std::vector<std::pair<int,int>>e_9_bit({{91,11}});
|
||||||
|
const double e_9_LSB = TWO_N16;
|
||||||
|
const std::vector<std::pair<int,int>>omega_9_bit({{102,16}});
|
||||||
|
const double omega_9_LSB = TWO_N15;
|
||||||
|
const std::vector<std::pair<int,int>>delta_i_9_bit({{118,11}});
|
||||||
|
const double delta_i_9_LSB = TWO_N14;
|
||||||
|
|
||||||
|
/* Page 10 */
|
||||||
|
const std::vector<std::pair<int,int>>IOD_a_10_bit({{7,4}});
|
||||||
|
const std::vector<std::pair<int,int>>Omega0_10_bit({{11,16}});
|
||||||
|
const double Omega0_10_LSB = TWO_N15;
|
||||||
|
const std::vector<std::pair<int,int>>Omega_dot_10_bit({{27,11}});
|
||||||
|
const double Omega_dot_10_LSB = TWO_N33;
|
||||||
|
const std::vector<std::pair<int,int>>M0_10_bit({{38,16}});
|
||||||
|
const double M0_10_LSB = TWO_N15;
|
||||||
|
const std::vector<std::pair<int,int>>af0_10_bit({{54,16}});
|
||||||
|
const double af0_10_LSB = TWO_N19;
|
||||||
|
const std::vector<std::pair<int,int>>af1_10_bit({{70,13}});
|
||||||
|
const double af1_10_LSB = TWO_N38;
|
||||||
|
const std::vector<std::pair<int,int>>E5b_HS_10_bit({{83,2}});
|
||||||
|
const std::vector<std::pair<int,int>>E1B_HS_10_bit({{85,2}});
|
||||||
|
const std::vector<std::pair<int,int>> A_0G_10_bit({{87,16}});
|
||||||
|
const double A_0G_10_LSB = TWO_N35;
|
||||||
|
const std::vector<std::pair<int,int>>A_1G_10_bit({{103,12}});
|
||||||
|
const double A_1G_10_LSB = TWO_N51;
|
||||||
|
|
||||||
|
const std::vector<std::pair<int,int>>t_0G_10_bit({{115,9}});
|
||||||
|
const double t_0G_10_LSB = 3600;
|
||||||
|
const std::vector<std::pair<int,int>>WN_0G_10_bit({{123,6}});
|
||||||
|
|
||||||
|
|
||||||
|
/* Page 0 */
|
||||||
|
const std::vector<std::pair<int,int>>Time_0_bit({{7,2}});
|
||||||
|
const std::vector<std::pair<int,int>>WN_0_bit({{97,12}});
|
||||||
|
const std::vector<std::pair<int,int>> TOW_0_bit({{109,20}});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*Page 1*/
|
|
||||||
const std::vector<std::pair<int,int>> PAGE_TYPE_bit({{1,6}});
|
|
||||||
const std::vector<std::pair<int,int>> IOD_nav_page1({{7,10}});
|
|
||||||
const std::vector<std::pair<int,int>> T0E_bit({{17,14}});
|
|
||||||
const double t0e_LSB = 60;
|
|
||||||
const std::vector<std::pair<int,int>> M0_bit({{31,32}});
|
|
||||||
const double M0_LSB = TWO_N31;
|
|
||||||
const std::vector<std::pair<int,int>> e_bit({{63,32}});
|
|
||||||
const double e_LSB = TWO_N33;
|
|
||||||
const std::vector<std::pair<int,int>> A_bit({{95,32}});
|
|
||||||
const double A_LSB = TWO_N19;
|
|
||||||
|
|
||||||
// Galileo E1 primary codes
|
// Galileo E1 primary codes
|
||||||
|
|
||||||
|
@ -51,8 +51,15 @@ const double TWO_P32 = (4294967296.0); //!< 2^32 this is too big for
|
|||||||
const double TWO_P56 = (7.205759403792794e+016); //!< 2^56
|
const double TWO_P56 = (7.205759403792794e+016); //!< 2^56
|
||||||
const double TWO_P57 = (1.441151880758559e+017); //!< 2^57
|
const double TWO_P57 = (1.441151880758559e+017); //!< 2^57
|
||||||
|
|
||||||
|
const double TWO_N2 = (0.25); //!< 2^-2
|
||||||
const double TWO_N5 = (0.03125); //!< 2^-5
|
const double TWO_N5 = (0.03125); //!< 2^-5
|
||||||
|
const double TWO_N8 = (0.00390625); //!< 2^-8
|
||||||
|
const double TWO_N9 = (0.001953125); //!< 2^-9
|
||||||
|
|
||||||
const double TWO_N11 = (4.882812500000000e-004); //!< 2^-11
|
const double TWO_N11 = (4.882812500000000e-004); //!< 2^-11
|
||||||
|
const double TWO_N14 = (0.00006103515625); //!< 2^-14
|
||||||
|
const double TWO_N15 = (0.00003051757813); //!< 2^-15
|
||||||
|
const double TWO_N16 = (0.0000152587890625); //!< 2^-16
|
||||||
const double TWO_N19 = (1.907348632812500e-006); //!< 2^-19
|
const double TWO_N19 = (1.907348632812500e-006); //!< 2^-19
|
||||||
const double TWO_N20 = (9.536743164062500e-007); //!< 2^-20
|
const double TWO_N20 = (9.536743164062500e-007); //!< 2^-20
|
||||||
const double TWO_N21 = (4.768371582031250e-007); //!< 2^-21
|
const double TWO_N21 = (4.768371582031250e-007); //!< 2^-21
|
||||||
@ -64,10 +71,17 @@ const double TWO_N30 = (9.313225746154785e-010); //!< 2^-30
|
|||||||
const double TWO_N31 = (4.656612873077393e-010); //!< 2^-31
|
const double TWO_N31 = (4.656612873077393e-010); //!< 2^-31
|
||||||
const double TWO_N32 = (2.328306436538696e-010); //!< 2^-32
|
const double TWO_N32 = (2.328306436538696e-010); //!< 2^-32
|
||||||
const double TWO_N33 = (1.164153218269348e-010); //!< 2^-33
|
const double TWO_N33 = (1.164153218269348e-010); //!< 2^-33
|
||||||
|
const double TWO_N34 = (5.82076609134674e-011); //!< 2^-34
|
||||||
|
const double TWO_N35 = (2.91038304567337e-011); //!< 2^-35
|
||||||
|
|
||||||
const double TWO_N38 = (3.637978807091713e-012); //!< 2^-38
|
const double TWO_N38 = (3.637978807091713e-012); //!< 2^-38
|
||||||
const double TWO_N43 = (1.136868377216160e-013); //!< 2^-43
|
const double TWO_N43 = (1.136868377216160e-013); //!< 2^-43
|
||||||
|
const double TWO_N46 = (1.4210854715202e-014); //!< 2^-46
|
||||||
|
|
||||||
const double TWO_N50 = (8.881784197001252e-016); //!< 2^-50
|
const double TWO_N50 = (8.881784197001252e-016); //!< 2^-50
|
||||||
|
const double TWO_N51 = (4.44089209850063e+016); //!< 2^-51
|
||||||
const double TWO_N55 = (2.775557561562891e-017); //!< 2^-55
|
const double TWO_N55 = (2.775557561562891e-017); //!< 2^-55
|
||||||
|
const double TWO_N59 = (1.73472347597681e-018); //!< 2^-59
|
||||||
|
|
||||||
const double PI_TWO_N19 = (5.992112452678286e-006); //!< Pi*2^-19
|
const double PI_TWO_N19 = (5.992112452678286e-006); //!< Pi*2^-19
|
||||||
const double PI_TWO_N43 = (3.571577341960839e-013); //!< Pi*2^-43
|
const double PI_TWO_N43 = (3.571577341960839e-013); //!< Pi*2^-43
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -51,45 +51,160 @@ class Galileo_Navigation_Message {
|
|||||||
private:
|
private:
|
||||||
|
|
||||||
|
|
||||||
//bool read_navigation_bool(std::bitset<GALILEO_SUBFRAME_BITS> bits, const std::vector<std::pair<int,int> > parameter);
|
bool read_navigation_bool(std::bitset<GALILEO_DATA_JK_BITS> bits, const std::vector<std::pair<int,int> > parameter);
|
||||||
//void print_galileo_word_bytes(unsigned int GPS_word);
|
//void print_galileo_word_bytes(unsigned int GPS_word);
|
||||||
unsigned long int read_navigation_unsigned(std::bitset<GALILEO_DATA_JK_BITS> bits, const std::vector< std::pair<int,int> > parameter);
|
unsigned long int read_navigation_unsigned(std::bitset<GALILEO_DATA_JK_BITS> bits, const std::vector< std::pair<int,int> > parameter);
|
||||||
unsigned long int read_page_type_unsigned(std::bitset<GALILEO_PAGE_TYPE_BITS> bits, const std::vector< std::pair<int,int> > parameter);
|
unsigned long int read_page_type_unsigned(std::bitset<GALILEO_PAGE_TYPE_BITS> bits, const std::vector< std::pair<int,int> > parameter);
|
||||||
//signed long int read_navigation_signed(std::bitset<GALILEO_SUBFRAME_BITS> bits, const std::vector<std::pair<int,int> > parameter);
|
signed long int read_navigation_signed(std::bitset<GALILEO_DATA_JK_BITS> bits, const std::vector<std::pair<int,int> > parameter);
|
||||||
|
|
||||||
int x,y;
|
int x,y;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
int flag_even_word;
|
||||||
|
|
||||||
/*Word type 1: Ephemeris (1/4)*/
|
/*Word type 1: Ephemeris (1/4)*/
|
||||||
int IOD_nav_1; // IOD_nav page 1
|
int IOD_nav_1; // IOD_nav page 1
|
||||||
double t0e; // Ephemeris reference time [s]
|
double t0e_1; // Ephemeris reference time [s]
|
||||||
double M0; // Mean anomaly at reference time [semi-circles]
|
double M0_1; // Mean anomaly at reference time [semi-circles]
|
||||||
double e; // Eccentricity
|
double e_1; // Eccentricity
|
||||||
double A; // Square root of the semi-major axis [metres^1/2]
|
double A_1; // Square root of the semi-major axis [metres^1/2]
|
||||||
|
|
||||||
/*Word type 2: Ephemeris (2/4)*/
|
/*Word type 2: Ephemeris (2/4)*/
|
||||||
|
int IOD_nav_2; // IOD_nav page 2
|
||||||
|
double OMEGA_0_2; // Longitude of ascending node of orbital plane at weekly epoch [semi-circles]
|
||||||
|
double i_0_2; // Inclination angle at reference time [semi-circles]
|
||||||
|
double omega_2; // Argument of perigee [semi-circles]
|
||||||
|
double iDot_2; // Rate of inclination angle [semi-circles/sec]
|
||||||
|
|
||||||
/*Word type 3: Ephemeris (3/4) and SISA*/
|
/*Word type 3: Ephemeris (3/4) and SISA*/
|
||||||
|
int IOD_nav_3; //
|
||||||
|
double OMEGA_dot_3; // Rate of right ascension [semi-circles/sec]
|
||||||
|
double delta_n_3; // Mean motion difference from computed value [semi-circles/sec]
|
||||||
|
double C_uc_3; // Amplitude of the cosine harmonic correction term to the argument of latitude [radians]
|
||||||
|
double C_us_3; // Amplitude of the sine harmonic correction term to the argument of latitude [radians]
|
||||||
|
double C_rc_3; // Amplitude of the cosine harmonic correction term to the orbit radius [meters]
|
||||||
|
double C_rs_3; // Amplitude of the sine harmonic correction term to the orbit radius [meters]
|
||||||
|
double SISA_3; //
|
||||||
|
|
||||||
/*Word type 4: Ephemeris (4/4) and Clock correction parameters*/
|
/*Word type 4: Ephemeris (4/4) and Clock correction parameters*/
|
||||||
|
int IOD_nav_4; //
|
||||||
/*Word type 5: Ionospheric correction, BGD, signal health and data validity status and GST*/
|
int SV_ID_PRN_4; //
|
||||||
|
double C_ic_4; // Amplitude of the cosine harmonic correction term to the angle of inclination [radians]
|
||||||
/*Word type 6: GST-UTC conversion parameters*/
|
double C_is_4; // Amplitude of the sine harmonic correction term to the angle of inclination [radians]
|
||||||
|
/*Clock correction parameters*/
|
||||||
/*Word type 7: Almanac for SVID1 (1/2), almanac reference time and almanac reference week number*/
|
double t0c_4; //Clock correction data reference Time of Week [sec]
|
||||||
|
double af0_4; //SV clock bias correction coefficient [s]
|
||||||
/*Word type 8: Almanac for SVID1 (2/2) and SVID2 (1/2)*/
|
double af1_4; //SV clock drift correction coefficient [s/s]
|
||||||
|
double af2_4; //SV clock drift rate correction coefficient [s/s^2]
|
||||||
/*Word type 9: Almanac for SVID2 (2/2) and SVID3 (1/2)*/
|
double spare_4;
|
||||||
|
|
||||||
/*Word type 10: Almanac for SVID3 (2/2) and GST-GPS conversion parameters*/
|
|
||||||
|
|
||||||
/*Word type 0: I/NAV Spare Word*/
|
|
||||||
|
|
||||||
|
|
||||||
void split_page(char *page); /* Takes in input a page (Odd or Even) of 120 bit, split it according ICD 4.3.2.3 and join Data_k with Data_j*/
|
/*Word type 5: Ionospheric correction, BGD, signal health and data validity status and GST*/
|
||||||
|
/*Ionospheric correction*/
|
||||||
|
/*Az*/
|
||||||
|
double ai0_5; //Effective Ionisation Level 1st order parameter [sfu]
|
||||||
|
double ai1_5; //Effective Ionisation Level 2st order parameter [sfu/degree]
|
||||||
|
double ai2_5; //Effective Ionisation Level 3st order parameter [sfu/degree]
|
||||||
|
|
||||||
|
/*Ionospheric disturbance flag*/
|
||||||
|
bool Region1_flag_5; // Ionospheric Disturbance Flag for region 1
|
||||||
|
bool Region2_flag_5; // Ionospheric Disturbance Flag for region 2
|
||||||
|
bool Region3_flag_5; // Ionospheric Disturbance Flag for region 3
|
||||||
|
bool Region4_flag_5; // Ionospheric Disturbance Flag for region 4
|
||||||
|
bool Region5_flag_5; // Ionospheric Disturbance Flag for region 5
|
||||||
|
double BGD_E1E5a_5; //E1-E5a Broadcast Group Delay [s]
|
||||||
|
double BGD_E1E5b_5; //E1-E5b Broadcast Group Delay [s]
|
||||||
|
|
||||||
|
double E5b_HS_5; //
|
||||||
|
double E1B_HS_5; //
|
||||||
|
double E5b_DVS_5; //
|
||||||
|
double E1B_DVS_5; //
|
||||||
|
/*GST*/
|
||||||
|
double WN_5;
|
||||||
|
double TOW_5;
|
||||||
|
|
||||||
|
double spare_5;
|
||||||
|
/*Word type 6: GST-UTC conversion parameters*/
|
||||||
|
|
||||||
|
double A0_6;
|
||||||
|
double A1_6;
|
||||||
|
double Delta_tLS_6;
|
||||||
|
double t0t_6;
|
||||||
|
double WNot_6;
|
||||||
|
double WN_LSF_6;
|
||||||
|
double DN_6;
|
||||||
|
double Delta_tLSF_6;
|
||||||
|
double TOW_6;
|
||||||
|
|
||||||
|
/*Word type 7: Almanac for SVID1 (1/2), almanac reference time and almanac reference week number*/
|
||||||
|
int IOD_a_7;
|
||||||
|
double WN_a_7;
|
||||||
|
double t0a_7;
|
||||||
|
int SVID1_7;
|
||||||
|
double Delta_alpha_7;
|
||||||
|
double e_7;
|
||||||
|
double omega_7;
|
||||||
|
double delta_i_7;
|
||||||
|
double Omega0_7;
|
||||||
|
double Omega_dot_7;
|
||||||
|
double M0_7;
|
||||||
|
|
||||||
|
/*Word type 8: Almanac for SVID1 (2/2) and SVID2 (1/2)*/
|
||||||
|
int IOD_a_8;
|
||||||
|
double af0_8;
|
||||||
|
double af1_8;
|
||||||
|
double E5b_HS_8;
|
||||||
|
double E1B_HS_8;
|
||||||
|
int SVID2_8;
|
||||||
|
double DELTA_A_8;
|
||||||
|
double e_8;
|
||||||
|
double omega_8;
|
||||||
|
double delta_i_8;
|
||||||
|
double Omega0_8;
|
||||||
|
double Omega_dot_8;
|
||||||
|
|
||||||
|
/*Word type 9: Almanac for SVID2 (2/2) and SVID3 (1/2)*/
|
||||||
|
|
||||||
|
int IOD_a_9;
|
||||||
|
double WN_a_9;
|
||||||
|
double t0a_9;
|
||||||
|
double M0_9;
|
||||||
|
double af0_9;
|
||||||
|
double af1_9;
|
||||||
|
double E5b_HS_9;
|
||||||
|
double E1B_HS_9;
|
||||||
|
int SVID3_9;
|
||||||
|
double DELTA_A_9;
|
||||||
|
double e_9;
|
||||||
|
double omega_9;
|
||||||
|
double delta_i_9;
|
||||||
|
|
||||||
|
|
||||||
|
/*Word type 10: Almanac for SVID3 (2/2) and GST-GPS conversion parameters*/
|
||||||
|
|
||||||
|
int IOD_a_10;
|
||||||
|
double Omega0_10;
|
||||||
|
double Omega_dot_10;
|
||||||
|
double M0_10;
|
||||||
|
double af0_10;
|
||||||
|
double af1_10;
|
||||||
|
double E5b_HS_10;
|
||||||
|
double E1B_HS_10;
|
||||||
|
double A_0G_10;
|
||||||
|
double A_1G_10;
|
||||||
|
double t_0G_10;
|
||||||
|
double WN_0G_10;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*Word type 0: I/NAV Spare Word*/
|
||||||
|
double Time_0;
|
||||||
|
double WN_0;
|
||||||
|
double TOW_0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void split_page(const char *page, int flag_even_word); /* Takes in input a page (Odd or Even) of 120 bit, split it according ICD 4.3.2.3 and join Data_k with Data_j*/
|
||||||
|
|
||||||
int page_jk_decoder(char *data_jk); /* Takes in input Data_jk (128 bit) and split it in ephemeris parameters according ICD 4.3.5*/
|
int page_jk_decoder(char *data_jk); /* Takes in input Data_jk (128 bit) and split it in ephemeris parameters according ICD 4.3.5*/
|
||||||
|
|
||||||
|
@ -45,7 +45,7 @@
|
|||||||
#include "gps_iono.h"
|
#include "gps_iono.h"
|
||||||
#include "gps_almanac.h"
|
#include "gps_almanac.h"
|
||||||
#include "gps_utc_model.h"
|
#include "gps_utc_model.h"
|
||||||
|
#include "GPS_L1_CA.h"
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
Loading…
Reference in New Issue
Block a user