1
0
mirror of https://github.com/gnss-sdr/gnss-sdr synced 2025-08-03 20:33:49 +00:00

Changes the bits_slice structure by a vector of pair<int,int>. The former structure was not accepted by clang. Some code cleaning.

git-svn-id: https://svn.code.sf.net/p/gnss-sdr/code/trunk@311 64b25241-fba3-4117-9849-534c7e92360d
This commit is contained in:
Carles Fernandez 2013-01-13 01:24:43 +00:00
parent 31d742063a
commit bf4de38e8a
3 changed files with 764 additions and 784 deletions

View File

@ -5,7 +5,7 @@
*
* -------------------------------------------------------------------------
*
* Copyright (C) 2010-2012 (see AUTHORS file for a list of contributors)
* Copyright (C) 2010-2013 (see AUTHORS file for a list of contributors)
*
* GNSS-SDR is a software defined Global Navigation
* Satellite Systems receiver
@ -33,6 +33,8 @@
#define GNSS_SDR_GPS_L1_CA_H_
#include <complex>
#include <vector>
#include <utility>
#include <gnss_satellite.h>
// Physical constants
@ -79,22 +81,6 @@ const int GPS_SUBFRAME_BITS=300; //!< Number of bits per subframe
const int GPS_SUBFRAME_SECONDS = 6; //!< Subframe duration [seconds]
const int GPS_WORD_BITS = 30; //!< Number of bits per word in the NAV message [bits]
/*!
* \brief Navigation message bits slice structure: A portion of bits is indicated by
* the start position inside the subframe and the length in number of bits */
typedef struct bits_slice
{
int position;
int length;
bits_slice(int p,int l)
{
position=p;
length=l;
}
} bits_slice;
/* Constants for scaling the ephemeris found in the data message
the format is the following: TWO_N5 -> 2^-5, TWO_P4 -> 2^4, PI_TWO_N43 -> Pi*2^-43, etc etc
Additionally some of the PI*2^N terms are used in the tracking stuff
@ -133,7 +119,6 @@ const double TWO_N43 =(1.136868377216160e-013); //!< 2^-43
const double TWO_N50 = (8.881784197001252e-016); //!< 2^-50
const double TWO_N55 = (2.775557561562891e-017); //!< 2^-55
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_N31 = (1.462918079267160e-009); //!< Pi*2^-31
@ -147,130 +132,129 @@ const double PI_TWO_N23 =(3.745070282923929e-007); //!< Pi*2^-2
// SUBFRAME 1-5 (TLM and HOW)
const bits_slice TOW[]= {{31,17}};
const bits_slice INTEGRITY_STATUS_FLAG[] = {{23,1}};
const bits_slice ALERT_FLAG[] = {{48,1}};
const bits_slice ANTI_SPOOFING_FLAG[] = {{49,1}};
const bits_slice SUBFRAME_ID[]= {{50,3}};
const std::vector<std::pair<int,int>> TOW({{31,17}});
const std::vector<std::pair<int,int>> INTEGRITY_STATUS_FLAG({{23,1}});
const std::vector<std::pair<int,int>> ALERT_FLAG({{48,1}});
const std::vector<std::pair<int,int>> ANTI_SPOOFING_FLAG({{49,1}});
const std::vector<std::pair<int,int>> SUBFRAME_ID({{50,3}});
// SUBFRAME 1
const bits_slice GPS_WEEK[]= {{61,10}};
const bits_slice CA_OR_P_ON_L2[]= {{71,2}}; //*
const bits_slice SV_ACCURACY[]= {{73,4}};
const bits_slice SV_HEALTH[]= {{77,6}};
const bits_slice L2_P_DATA_FLAG[] = {{91,1}};
const bits_slice T_GD[]= {{197,8}};
const std::vector<std::pair<int,int>> GPS_WEEK({{61,10}});
const std::vector<std::pair<int,int>> CA_OR_P_ON_L2({{71,2}}); //*
const std::vector<std::pair<int,int>> SV_ACCURACY({{73,4}});
const std::vector<std::pair<int,int>> SV_HEALTH ({{77,6}});
const std::vector<std::pair<int,int>> L2_P_DATA_FLAG ({{91,1}});
const std::vector<std::pair<int,int>> T_GD({{197,8}});
const double T_GD_LSB = TWO_N31;
const bits_slice IODC[]= {{83,2},{211,8}};
const bits_slice T_OC[]= {{219,16}};
const std::vector<std::pair<int,int>> IODC({{83,2},{211,8}});
const std::vector<std::pair<int,int>> T_OC({{219,16}});
const double T_OC_LSB = TWO_P4;
const bits_slice A_F2[]= {{241,8}};
const std::vector<std::pair<int,int>> A_F2({{241,8}});
const double A_F2_LSB = TWO_N55;
const bits_slice A_F1[]= {{249,16}};
const std::vector<std::pair<int,int>> A_F1({{249,16}});
const double A_F1_LSB = TWO_N43;
const bits_slice A_F0[]= {{271,22}};
const std::vector<std::pair<int,int>> A_F0({{271,22}});
const double A_F0_LSB = TWO_N31;
// SUBFRAME 2
const bits_slice IODE_SF2[]= {{61,8}};
const bits_slice C_RS[]= {{69,16}};
const std::vector<std::pair<int,int>> IODE_SF2({{61,8}});
const std::vector<std::pair<int,int>> C_RS({{69,16}});
const double C_RS_LSB = TWO_N5;
const bits_slice DELTA_N[]= {{91,16}};
const std::vector<std::pair<int,int>> DELTA_N({{91,16}});
const double DELTA_N_LSB = PI_TWO_N43;
const bits_slice M_0[]= {{107,8},{121,24}};
const std::vector<std::pair<int,int>> M_0({{107,8},{121,24}});
const double M_0_LSB = PI_TWO_N31;
const bits_slice C_UC[]= {{151,16}};
const std::vector<std::pair<int,int>> C_UC({{151,16}});
const double C_UC_LSB = TWO_N29;
const bits_slice E[]= {{167,8},{181,24}};
const std::vector<std::pair<int,int>> E({{167,8},{181,24}});
const double E_LSB = TWO_N33;
const bits_slice C_US[]= {{211,16}};
const std::vector<std::pair<int,int>> C_US({{211,16}});
const double C_US_LSB = TWO_N29;
const bits_slice SQRT_A[]= {{227,8},{241,24}};
const std::vector<std::pair<int,int>> SQRT_A({{227,8},{241,24}});
const double SQRT_A_LSB = TWO_N19;
const bits_slice T_OE[]= {{271,16}};
const std::vector<std::pair<int,int>> T_OE({{271,16}});
const double T_OE_LSB = TWO_P4;
const bits_slice FIT_INTERVAL_FLAG[]= {{271,1}};
const bits_slice AODO[] = {{272,5}};
const std::vector<std::pair<int,int>> FIT_INTERVAL_FLAG({{271,1}});
const std::vector<std::pair<int,int>> AODO({{272,5}});
const int AODO_LSB = 900;
// SUBFRAME 3
const bits_slice C_IC[]= {{61,16}};
const std::vector<std::pair<int,int>> C_IC({{61,16}});
const double C_IC_LSB = TWO_N29;
const bits_slice OMEGA_0[]= {{77,8},{91,24}};
const std::vector<std::pair<int,int>> OMEGA_0({{77,8},{91,24}});
const double OMEGA_0_LSB = PI_TWO_N31;
const bits_slice C_IS[]= {{121,16}};
const std::vector<std::pair<int,int>> C_IS({{121,16}});
const double C_IS_LSB = TWO_N29;
const bits_slice I_0[]= {{137,8},{151,24}};
const std::vector<std::pair<int,int>> I_0({{137,8},{151,24}});
const double I_0_LSB = PI_TWO_N31;
const bits_slice C_RC[]= {{181,16}};
const std::vector<std::pair<int,int>> C_RC({{181,16}});
const double C_RC_LSB = TWO_N5;
const bits_slice OMEGA[]= {{197,8},{211,24}};
const std::vector<std::pair<int,int>> OMEGA({{197,8},{211,24}});
const double OMEGA_LSB = PI_TWO_N31;
const bits_slice OMEGA_DOT[]= {{241,24}};
const std::vector<std::pair<int,int>> OMEGA_DOT({{241,24}});
const double OMEGA_DOT_LSB = PI_TWO_N43;
const bits_slice IODE_SF3[]= {{271,8}};
const bits_slice I_DOT[]= {{279,14}};
const std::vector<std::pair<int,int>> IODE_SF3({{271,8}});
const std::vector<std::pair<int,int>> I_DOT({{279,14}});
const double I_DOT_LSB = PI_TWO_N43;
// SUBFRAME 4-5
const bits_slice SV_DATA_ID[]= {{61,2}};
const bits_slice SV_PAGE[]= {{63,6}};
const std::vector<std::pair<int,int>> SV_DATA_ID({{61,2}});
const std::vector<std::pair<int,int>> SV_PAGE({{63,6}});
// SUBFRAME 4
//! \todo read all pages of subframe 4
// Page 18 - Ionospheric and UTC data
const bits_slice ALPHA_0[]= {{69,8}};
const std::vector<std::pair<int,int>> ALPHA_0({{69,8}});
const double ALPHA_0_LSB = TWO_N30;
const bits_slice ALPHA_1[]= {{77,8}};
const std::vector<std::pair<int,int>> ALPHA_1({{77,8}});
const double ALPHA_1_LSB = TWO_N27;
const bits_slice ALPHA_2[]= {{91,8}};
const std::vector<std::pair<int,int>> ALPHA_2({{91,8}});
const double ALPHA_2_LSB = TWO_N24;
const bits_slice ALPHA_3[]= {{99,8}};
const std::vector<std::pair<int,int>> ALPHA_3({{99,8}});
const double ALPHA_3_LSB = TWO_N24;
const bits_slice BETA_0[]= {{107,8}};
const std::vector<std::pair<int,int>> BETA_0({{107,8}});
const double BETA_0_LSB = TWO_P11;
const bits_slice BETA_1[]= {{121,8}};
const std::vector<std::pair<int,int>> BETA_1({{121,8}});
const double BETA_1_LSB = TWO_P14;
const bits_slice BETA_2[]= {{129,8}};
const std::vector<std::pair<int,int>> BETA_2({{129,8}});
const double BETA_2_LSB = TWO_P16;
const bits_slice BETA_3[]= {{137,8}};
const std::vector<std::pair<int,int>> BETA_3({{137,8}});
const double BETA_3_LSB = TWO_P16;
const bits_slice A_1[]= {{151,24}};
const std::vector<std::pair<int,int>> A_1({{151,24}});
const double A_1_LSB = TWO_N50;
const bits_slice A_0[]= {{181,24},{211,8}};
const std::vector<std::pair<int,int>> A_0({{181,24},{211,8}});
const double A_0_LSB = TWO_N30;
const bits_slice T_OT[]= {{219,8}};
const std::vector<std::pair<int,int>> T_OT({{219,8}});
const double T_OT_LSB = TWO_P12;
const bits_slice WN_T[]= {{227,8}};
const std::vector<std::pair<int,int>> WN_T({{227,8}});
const double WN_T_LSB = 1;
const bits_slice DELTAT_LS[]= {{241,8}};
const std::vector<std::pair<int,int>> DELTAT_LS({{241,8}});
const double DELTAT_LS_LSB = 1;
const bits_slice WN_LSF[]= {{249,8}};
const std::vector<std::pair<int,int>> WN_LSF({{249,8}});
const double WN_LSF_LSB = 1;
const bits_slice DN[]= {{257,8}};
const std::vector<std::pair<int,int>> DN({{257,8}});
const double DN_LSB = 1;
const bits_slice DELTAT_LSF[]= {{271,8}};
const std::vector<std::pair<int,int>> DELTAT_LSF({{271,8}});
const double DELTAT_LSF_LSB = 1;
// Page 25 - Antispoofing, SV config and SV health (PRN 25 -32)
const bits_slice HEALTH_SV25[]={{229,6}};
const bits_slice HEALTH_SV26[]={{241,6}};
const bits_slice HEALTH_SV27[]={{247,6}};
const bits_slice HEALTH_SV28[]={{253,6}};
const bits_slice HEALTH_SV29[]={{259,6}};
const bits_slice HEALTH_SV30[]={{271,6}};
const bits_slice HEALTH_SV31[]={{277,6}};
const bits_slice HEALTH_SV32[]={{283,6}};
const std::vector<std::pair<int,int>> HEALTH_SV25({{229,6}});
const std::vector<std::pair<int,int>> HEALTH_SV26({{241,6}});
const std::vector<std::pair<int,int>> HEALTH_SV27({{247,6}});
const std::vector<std::pair<int,int>> HEALTH_SV28({{253,6}});
const std::vector<std::pair<int,int>> HEALTH_SV29({{259,6}});
const std::vector<std::pair<int,int>> HEALTH_SV30({{271,6}});
const std::vector<std::pair<int,int>> HEALTH_SV31({{277,6}});
const std::vector<std::pair<int,int>> HEALTH_SV32({{283,6}});
@ -281,33 +265,33 @@ const bits_slice HEALTH_SV32[]={{283,6}};
// page 25 - Health (PRN 1 - 24)
const bits_slice T_OA[]={{69,8}};
const std::vector<std::pair<int,int>> T_OA({{69,8}});
const double T_OA_LSB = TWO_P12;
const bits_slice WN_A[]={{77,8}};
const bits_slice HEALTH_SV1[]={{91,6}};
const bits_slice HEALTH_SV2[]={{97,6}};
const bits_slice HEALTH_SV3[]={{103,6}};
const bits_slice HEALTH_SV4[]={{109,6}};
const bits_slice HEALTH_SV5[]={{121,6}};
const bits_slice HEALTH_SV6[]={{127,6}};
const bits_slice HEALTH_SV7[]={{133,6}};
const bits_slice HEALTH_SV8[]={{139,6}};
const bits_slice HEALTH_SV9[]={{151,6}};
const bits_slice HEALTH_SV10[]={{157,6}};
const bits_slice HEALTH_SV11[]={{163,6}};
const bits_slice HEALTH_SV12[]={{169,6}};
const bits_slice HEALTH_SV13[]={{181,6}};
const bits_slice HEALTH_SV14[]={{187,6}};
const bits_slice HEALTH_SV15[]={{193,6}};
const bits_slice HEALTH_SV16[]={{199,6}};
const bits_slice HEALTH_SV17[]={{211,6}};
const bits_slice HEALTH_SV18[]={{217,6}};
const bits_slice HEALTH_SV19[]={{223,6}};
const bits_slice HEALTH_SV20[]={{229,6}};
const bits_slice HEALTH_SV21[]={{241,6}};
const bits_slice HEALTH_SV22[]={{247,6}};
const bits_slice HEALTH_SV23[]={{253,6}};
const bits_slice HEALTH_SV24[]={{259,6}};
const std::vector<std::pair<int,int>> WN_A({{77,8}});
const std::vector<std::pair<int,int>> HEALTH_SV1({{91,6}});
const std::vector<std::pair<int,int>> HEALTH_SV2({{97,6}});
const std::vector<std::pair<int,int>> HEALTH_SV3({{103,6}});
const std::vector<std::pair<int,int>> HEALTH_SV4({{109,6}});
const std::vector<std::pair<int,int>> HEALTH_SV5({{121,6}});
const std::vector<std::pair<int,int>> HEALTH_SV6({{127,6}});
const std::vector<std::pair<int,int>> HEALTH_SV7({{133,6}});
const std::vector<std::pair<int,int>> HEALTH_SV8({{139,6}});
const std::vector<std::pair<int,int>> HEALTH_SV9({{151,6}});
const std::vector<std::pair<int,int>> HEALTH_SV10({{157,6}});
const std::vector<std::pair<int,int>> HEALTH_SV11({{163,6}});
const std::vector<std::pair<int,int>> HEALTH_SV12({{169,6}});
const std::vector<std::pair<int,int>> HEALTH_SV13({{181,6}});
const std::vector<std::pair<int,int>> HEALTH_SV14({{187,6}});
const std::vector<std::pair<int,int>> HEALTH_SV15({{193,6}});
const std::vector<std::pair<int,int>> HEALTH_SV16({{199,6}});
const std::vector<std::pair<int,int>> HEALTH_SV17({{211,6}});
const std::vector<std::pair<int,int>> HEALTH_SV18({{217,6}});
const std::vector<std::pair<int,int>> HEALTH_SV19({{223,6}});
const std::vector<std::pair<int,int>> HEALTH_SV20({{229,6}});
const std::vector<std::pair<int,int>> HEALTH_SV21({{241,6}});
const std::vector<std::pair<int,int>> HEALTH_SV22({{247,6}});
const std::vector<std::pair<int,int>> HEALTH_SV23({{253,6}});
const std::vector<std::pair<int,int>> HEALTH_SV24({{259,6}});
/*

View File

@ -7,7 +7,7 @@
*
* -------------------------------------------------------------------------
*
* Copyright (C) 2010-2012 (see AUTHORS file for a list of contributors)
* Copyright (C) 2010-2013 (see AUTHORS file for a list of contributors)
*
* GNSS-SDR is a software defined Global Navigation
* Satellite Systems receiver
@ -34,8 +34,6 @@
#include <math.h>
#include "boost/date_time/posix_time/posix_time.hpp"
#define num_of_slices(x) sizeof(x)/sizeof(bits_slice)
void Gps_Navigation_Message::reset()
{
@ -106,7 +104,6 @@ void Gps_Navigation_Message::reset()
b_integrity_status_flag = false;
b_antispoofing_flag = false;
// Ionosphere and UTC
d_alpha0 = 0;
d_alpha1 = 0;
@ -196,11 +193,11 @@ void Gps_Navigation_Message::print_gps_word_bytes(unsigned int GPS_word)
bool Gps_Navigation_Message::read_navigation_bool(std::bitset<GPS_SUBFRAME_BITS> bits, const bits_slice *slices)
bool Gps_Navigation_Message::read_navigation_bool(std::bitset<GPS_SUBFRAME_BITS> bits, const std::vector<std::pair<int,int>> parameter)
{
bool value;
if (bits[GPS_SUBFRAME_BITS - slices[0].position] == 1)
if (bits[GPS_SUBFRAME_BITS - parameter[0].first] == 1)
{
value = true;
}
@ -214,16 +211,16 @@ bool Gps_Navigation_Message::read_navigation_bool(std::bitset<GPS_SUBFRAME_BITS>
unsigned long int Gps_Navigation_Message::read_navigation_unsigned(std::bitset<GPS_SUBFRAME_BITS> bits, const bits_slice *slices, int num_of_slices)
unsigned long int Gps_Navigation_Message::read_navigation_unsigned(std::bitset<GPS_SUBFRAME_BITS> bits, const std::vector<std::pair<int,int>> parameter)
{
unsigned long int value = 0;
int num_of_slices = parameter.size();
for (int i=0; i<num_of_slices; i++)
{
for (int j=0; j<slices[i].length; j++)
for (int j=0; j<parameter[i].second; j++)
{
value <<= 1; //shift left
if (bits[GPS_SUBFRAME_BITS - slices[i].position - j] == 1)
if (bits[GPS_SUBFRAME_BITS - parameter[i].first - j] == 1)
{
value += 1; // insert the bit
}
@ -236,17 +233,16 @@ unsigned long int Gps_Navigation_Message::read_navigation_unsigned(std::bitset<G
signed long int Gps_Navigation_Message::read_navigation_signed(std::bitset<GPS_SUBFRAME_BITS> bits, const bits_slice *slices, int num_of_slices)
signed long int Gps_Navigation_Message::read_navigation_signed(std::bitset<GPS_SUBFRAME_BITS> bits, const std::vector<std::pair<int,int>> parameter)
{
signed long int value = 0;
int num_of_slices = parameter.size();
// Discriminate between 64 bits and 32 bits compiler
int long_int_size_bytes = sizeof(signed long int);
if (long_int_size_bytes == 8) // if a long int takes 8 bytes, we are in a 64 bits system
{
// read the MSB and perform the sign extension
if (bits[GPS_SUBFRAME_BITS - slices[0].position] == 1)
if (bits[GPS_SUBFRAME_BITS - parameter[0].first] == 1)
{
value ^= 0xFFFFFFFFFFFFFFFF; //64 bits variable
}
@ -257,11 +253,11 @@ signed long int Gps_Navigation_Message::read_navigation_signed(std::bitset<GPS_S
for (int i=0; i<num_of_slices; i++)
{
for (int j=0; j<slices[i].length; j++)
for (int j=0; j<parameter[i].second; j++)
{
value <<= 1; //shift left
value &= 0xFFFFFFFFFFFFFFFE; //reset the corresponding bit (for the 64 bits variable)
if (bits[GPS_SUBFRAME_BITS - slices[i].position - j] == 1)
if (bits[GPS_SUBFRAME_BITS - parameter[i].first - j] == 1)
{
value += 1; // insert the bit
}
@ -271,7 +267,7 @@ signed long int Gps_Navigation_Message::read_navigation_signed(std::bitset<GPS_S
else // we assume we are in a 32 bits system
{
// read the MSB and perform the sign extension
if (bits[GPS_SUBFRAME_BITS-slices[0].position] == 1)
if (bits[GPS_SUBFRAME_BITS - parameter[0].first] == 1)
{
value ^= 0xFFFFFFFF;
}
@ -282,11 +278,11 @@ signed long int Gps_Navigation_Message::read_navigation_signed(std::bitset<GPS_S
for (int i=0; i<num_of_slices; i++)
{
for (int j=0; j<slices[i].length; j++)
for (int j=0; j<parameter[i].second; j++)
{
value <<= 1; //shift left
value &= 0xFFFFFFFE; //reset the corresponding bit
if (bits[GPS_SUBFRAME_BITS - slices[i].position - j] == 1)
if (bits[GPS_SUBFRAME_BITS - parameter[i].first - j] == 1)
{
value += 1; // insert the bit
}
@ -453,7 +449,7 @@ int Gps_Navigation_Message::subframe_decoder(char *subframe)
}
}
subframe_ID = (int)read_navigation_unsigned(subframe_bits, SUBFRAME_ID, num_of_slices(SUBFRAME_ID));
subframe_ID = (int)read_navigation_unsigned(subframe_bits, SUBFRAME_ID);
// Decode all 5 sub-frames
switch (subframe_ID)
@ -467,98 +463,98 @@ int Gps_Navigation_Message::subframe_decoder(char *subframe)
// subframe and we need the TOW of the first subframe in this data block
// (the variable subframe at this point contains bits of the last subframe).
//TOW = bin2dec(subframe(31:47)) * 6 - 30;
d_TOW_SF1 = (double)read_navigation_unsigned(subframe_bits, TOW, num_of_slices(TOW));
d_TOW_SF1 = (double)read_navigation_unsigned(subframe_bits, TOW);
//we are in the first subframe (the transmitted TOW is the start time of the next subframe) !
d_TOW_SF1 = d_TOW_SF1*6;
d_TOW = d_TOW_SF5; // Set transmission time
b_integrity_status_flag = read_navigation_bool(subframe_bits, INTEGRITY_STATUS_FLAG);
b_alert_flag = read_navigation_bool(subframe_bits, ALERT_FLAG);
b_antispoofing_flag = read_navigation_bool(subframe_bits, ANTI_SPOOFING_FLAG);
i_GPS_week = (int)read_navigation_unsigned(subframe_bits, GPS_WEEK, num_of_slices(GPS_WEEK));
i_SV_accuracy = (int)read_navigation_unsigned(subframe_bits, SV_ACCURACY, num_of_slices(SV_ACCURACY)); // (20.3.3.3.1.3)
i_SV_health = (int)read_navigation_unsigned(subframe_bits, SV_HEALTH, num_of_slices(SV_HEALTH));
i_GPS_week = (int)read_navigation_unsigned(subframe_bits, GPS_WEEK);
i_SV_accuracy = (int)read_navigation_unsigned(subframe_bits, SV_ACCURACY); // (20.3.3.3.1.3)
i_SV_health = (int)read_navigation_unsigned(subframe_bits, SV_HEALTH);
b_L2_P_data_flag = read_navigation_bool(subframe_bits, L2_P_DATA_FLAG); //
i_code_on_L2 = (int)read_navigation_unsigned(subframe_bits, CA_OR_P_ON_L2, num_of_slices(CA_OR_P_ON_L2));
d_TGD = (double)read_navigation_signed(subframe_bits, T_GD, num_of_slices(T_GD));
i_code_on_L2 = (int)read_navigation_unsigned(subframe_bits, CA_OR_P_ON_L2);
d_TGD = (double)read_navigation_signed(subframe_bits, T_GD);
d_TGD = d_TGD*T_GD_LSB;
d_IODC = (double)read_navigation_unsigned(subframe_bits, IODC, num_of_slices(IODC));
d_Toc = (double)read_navigation_unsigned(subframe_bits, T_OC, num_of_slices(T_OC));
d_IODC = (double)read_navigation_unsigned(subframe_bits, IODC);
d_Toc = (double)read_navigation_unsigned(subframe_bits, T_OC);
d_Toc = d_Toc*T_OC_LSB;
d_A_f0 = (double)read_navigation_signed(subframe_bits, A_F0, num_of_slices(A_F0));
d_A_f0 = (double)read_navigation_signed(subframe_bits, A_F0);
d_A_f0 = d_A_f0*A_F0_LSB;
d_A_f1 = (double)read_navigation_signed(subframe_bits, A_F1, num_of_slices(A_F1));
d_A_f1 = (double)read_navigation_signed(subframe_bits, A_F1);
d_A_f1 = d_A_f1*A_F1_LSB;
d_A_f2 = (double)read_navigation_signed(subframe_bits, A_F2, num_of_slices(A_F2));
d_A_f2 = (double)read_navigation_signed(subframe_bits, A_F2);
d_A_f2 = d_A_f2*A_F2_LSB;
break;
case 2: //--- It is subframe 2 -------------------
d_TOW_SF2 = (double)read_navigation_unsigned(subframe_bits, TOW, num_of_slices(TOW));
d_TOW_SF2 = (double)read_navigation_unsigned(subframe_bits, TOW);
d_TOW_SF2 = d_TOW_SF2*6;
d_TOW = d_TOW_SF1; // Set transmission time
b_integrity_status_flag = read_navigation_bool(subframe_bits, INTEGRITY_STATUS_FLAG);
b_alert_flag = read_navigation_bool(subframe_bits, ALERT_FLAG);
b_antispoofing_flag = read_navigation_bool(subframe_bits, ANTI_SPOOFING_FLAG);
d_IODE_SF2 = (double)read_navigation_unsigned(subframe_bits, IODE_SF2, num_of_slices(IODE_SF2));
d_Crs = (double)read_navigation_signed(subframe_bits, C_RS, num_of_slices(C_RS));
d_IODE_SF2 = (double)read_navigation_unsigned(subframe_bits, IODE_SF2);
d_Crs = (double)read_navigation_signed(subframe_bits, C_RS);
d_Crs = d_Crs * C_RS_LSB;
d_Delta_n = (double)read_navigation_signed(subframe_bits, DELTA_N, num_of_slices(DELTA_N));
d_Delta_n = (double)read_navigation_signed(subframe_bits, DELTA_N);
d_Delta_n = d_Delta_n * DELTA_N_LSB;
d_M_0 = (double)read_navigation_signed(subframe_bits, M_0, num_of_slices(M_0));
d_M_0 = (double)read_navigation_signed(subframe_bits, M_0);
d_M_0 = d_M_0 * M_0_LSB;
d_Cuc = (double)read_navigation_signed(subframe_bits, C_UC, num_of_slices(C_UC));
d_Cuc = (double)read_navigation_signed(subframe_bits, C_UC);
d_Cuc = d_Cuc * C_UC_LSB;
d_e_eccentricity = (double)read_navigation_unsigned(subframe_bits, E, num_of_slices(E));
d_e_eccentricity = (double)read_navigation_unsigned(subframe_bits, E);
d_e_eccentricity = d_e_eccentricity * E_LSB;
d_Cus = (double)read_navigation_signed(subframe_bits, C_US, num_of_slices(C_US));
d_Cus = (double)read_navigation_signed(subframe_bits, C_US);
d_Cus = d_Cus * C_US_LSB;
d_sqrt_A = (double)read_navigation_unsigned(subframe_bits, SQRT_A, num_of_slices(SQRT_A));
d_sqrt_A = (double)read_navigation_unsigned(subframe_bits, SQRT_A);
d_sqrt_A = d_sqrt_A * SQRT_A_LSB;
d_Toe = (double)read_navigation_unsigned(subframe_bits, T_OE, num_of_slices(T_OE));
d_Toe = (double)read_navigation_unsigned(subframe_bits, T_OE);
d_Toe = d_Toe * T_OE_LSB;
b_fit_interval_flag = read_navigation_bool(subframe_bits, FIT_INTERVAL_FLAG);
i_AODO = (int)read_navigation_unsigned(subframe_bits, AODO, num_of_slices(AODO));
i_AODO = (int)read_navigation_unsigned(subframe_bits, AODO);
i_AODO = i_AODO * AODO_LSB;
break;
case 3: // --- It is subframe 3 -------------------------------------
d_TOW_SF3 = (double)read_navigation_unsigned(subframe_bits, TOW, num_of_slices(TOW));
d_TOW_SF3 = (double)read_navigation_unsigned(subframe_bits, TOW);
d_TOW_SF3 = d_TOW_SF3*6;
d_TOW = d_TOW_SF2; // Set transmission time
b_integrity_status_flag = read_navigation_bool(subframe_bits, INTEGRITY_STATUS_FLAG);
b_alert_flag = read_navigation_bool(subframe_bits, ALERT_FLAG);
b_antispoofing_flag = read_navigation_bool(subframe_bits, ANTI_SPOOFING_FLAG);
d_Cic = (double)read_navigation_signed(subframe_bits, C_IC, num_of_slices(C_IC));
d_Cic = (double)read_navigation_signed(subframe_bits, C_IC);
d_Cic = d_Cic * C_IC_LSB;
d_OMEGA0 = (double)read_navigation_signed(subframe_bits, OMEGA_0, num_of_slices(OMEGA_0));
d_OMEGA0 = (double)read_navigation_signed(subframe_bits, OMEGA_0);
d_OMEGA0 = d_OMEGA0 * OMEGA_0_LSB;
d_Cis = (double)read_navigation_signed(subframe_bits, C_IS, num_of_slices(C_IS));
d_Cis = (double)read_navigation_signed(subframe_bits, C_IS);
d_Cis = d_Cis * C_IS_LSB;
d_i_0 = (double)read_navigation_signed(subframe_bits, I_0, num_of_slices(I_0));
d_i_0 = (double)read_navigation_signed(subframe_bits, I_0);
d_i_0 = d_i_0 * I_0_LSB;
d_Crc = (double)read_navigation_signed(subframe_bits, C_RC, num_of_slices(C_RC));
d_Crc = (double)read_navigation_signed(subframe_bits, C_RC);
d_Crc = d_Crc * C_RC_LSB;
d_OMEGA = (double)read_navigation_signed(subframe_bits, OMEGA, num_of_slices(OMEGA));
d_OMEGA = (double)read_navigation_signed(subframe_bits, OMEGA);
d_OMEGA = d_OMEGA * OMEGA_LSB;
d_OMEGA_DOT = (double)read_navigation_signed(subframe_bits, OMEGA_DOT, num_of_slices(OMEGA_DOT));
d_OMEGA_DOT = (double)read_navigation_signed(subframe_bits, OMEGA_DOT);
d_OMEGA_DOT = d_OMEGA_DOT * OMEGA_DOT_LSB;
d_IODE_SF3 = (double)read_navigation_unsigned(subframe_bits, IODE_SF3, num_of_slices(IODE_SF3));
d_IDOT = (double)read_navigation_signed(subframe_bits, I_DOT, num_of_slices(I_DOT));
d_IODE_SF3 = (double)read_navigation_unsigned(subframe_bits, IODE_SF3);
d_IDOT = (double)read_navigation_signed(subframe_bits, I_DOT);
d_IDOT = d_IDOT*I_DOT_LSB;
break;
case 4: // --- It is subframe 4 ---------- Almanac, ionospheric model, UTC parameters, SV health (PRN: 25-32)
d_TOW_SF4 = (double)read_navigation_unsigned(subframe_bits, TOW, num_of_slices(TOW));
d_TOW_SF4 = (double)read_navigation_unsigned(subframe_bits, TOW);
d_TOW_SF4 = d_TOW_SF4*6;
d_TOW = d_TOW_SF3; // Set transmission time
b_integrity_status_flag = read_navigation_bool(subframe_bits, INTEGRITY_STATUS_FLAG);
b_alert_flag = read_navigation_bool(subframe_bits, ALERT_FLAG);
b_antispoofing_flag = read_navigation_bool(subframe_bits, ANTI_SPOOFING_FLAG);
SV_data_ID = (int)read_navigation_unsigned(subframe_bits, SV_DATA_ID, num_of_slices(SV_DATA_ID));
SV_page = (int)read_navigation_unsigned(subframe_bits, SV_PAGE, num_of_slices(SV_PAGE));
SV_data_ID = (int)read_navigation_unsigned(subframe_bits, SV_DATA_ID);
SV_page = (int)read_navigation_unsigned(subframe_bits, SV_PAGE);
if (SV_page == 13)
{
@ -568,93 +564,93 @@ int Gps_Navigation_Message::subframe_decoder(char *subframe)
if (SV_page == 18)
{
// Page 18 - Ionospheric and UTC data
d_alpha0 = (double)read_navigation_signed(subframe_bits, ALPHA_0, num_of_slices(ALPHA_0));
d_alpha0 = (double)read_navigation_signed(subframe_bits, ALPHA_0);
d_alpha0 = d_alpha0 * ALPHA_0_LSB;
d_alpha1 = (double)read_navigation_signed(subframe_bits, ALPHA_1, num_of_slices(ALPHA_1));
d_alpha1 = (double)read_navigation_signed(subframe_bits, ALPHA_1);
d_alpha1 = d_alpha1 * ALPHA_1_LSB;
d_alpha2 = (double)read_navigation_signed(subframe_bits, ALPHA_2, num_of_slices(ALPHA_2));
d_alpha2 = (double)read_navigation_signed(subframe_bits, ALPHA_2);
d_alpha2 = d_alpha2 * ALPHA_2_LSB;
d_alpha3 = (double)read_navigation_signed(subframe_bits, ALPHA_3, num_of_slices(ALPHA_3));
d_alpha3 = (double)read_navigation_signed(subframe_bits, ALPHA_3);
d_alpha3 = d_alpha3 * ALPHA_3_LSB;
d_beta0 = (double)read_navigation_signed(subframe_bits, BETA_0, num_of_slices(BETA_0));
d_beta0 = (double)read_navigation_signed(subframe_bits, BETA_0);
d_beta0 = d_beta0 * BETA_0_LSB;
d_beta1 = (double)read_navigation_signed(subframe_bits, BETA_1, num_of_slices(BETA_1));
d_beta1 = (double)read_navigation_signed(subframe_bits, BETA_1);
d_beta1 = d_beta1 * BETA_1_LSB;
d_beta2 = (double)read_navigation_signed(subframe_bits, BETA_2, num_of_slices(BETA_2));
d_beta2 = (double)read_navigation_signed(subframe_bits, BETA_2);
d_beta2 = d_beta2 * BETA_2_LSB;
d_beta3 = (double)read_navigation_signed(subframe_bits, BETA_3, num_of_slices(BETA_3));
d_beta3 = (double)read_navigation_signed(subframe_bits, BETA_3);
d_beta3 = d_beta3 * BETA_3_LSB;
d_A1 = (double)read_navigation_signed(subframe_bits, A_1, num_of_slices(A_1));
d_A1 = (double)read_navigation_signed(subframe_bits, A_1);
d_A1 = d_A1 * A_1_LSB;
d_A0 = (double)read_navigation_signed(subframe_bits, A_0, num_of_slices(A_0));
d_A0 = (double)read_navigation_signed(subframe_bits, A_0);
d_A0 = d_A0 * A_0_LSB;
d_t_OT = (double)read_navigation_unsigned(subframe_bits, T_OT,num_of_slices(T_OT));
d_t_OT = (double)read_navigation_unsigned(subframe_bits, T_OT);
d_t_OT = d_t_OT * T_OT_LSB;
i_WN_T = (int)read_navigation_unsigned(subframe_bits, WN_T, num_of_slices(WN_T));
d_DeltaT_LS = (double)read_navigation_signed(subframe_bits, DELTAT_LS, num_of_slices(DELTAT_LS));
i_WN_LSF = (int)read_navigation_unsigned(subframe_bits, WN_LSF, num_of_slices(WN_LSF));
i_DN = (int)read_navigation_unsigned(subframe_bits, DN, num_of_slices(DN));; // Right-justified ?
d_DeltaT_LSF = (double)read_navigation_signed(subframe_bits, DELTAT_LSF, num_of_slices(DELTAT_LSF));
i_WN_T = (int)read_navigation_unsigned(subframe_bits, WN_T);
d_DeltaT_LS = (double)read_navigation_signed(subframe_bits, DELTAT_LS);
i_WN_LSF = (int)read_navigation_unsigned(subframe_bits, WN_LSF);
i_DN = (int)read_navigation_unsigned(subframe_bits, DN);; // Right-justified ?
d_DeltaT_LSF = (double)read_navigation_signed(subframe_bits, DELTAT_LSF);
}
if (SV_page == 25)
{
// Page 25 Anti-Spoofing, SV config and almanac health (PRN: 25-32)
//! \TODO Read Anti-Spoofing, SV config
almanacHealth[25] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV25, num_of_slices(HEALTH_SV25));
almanacHealth[26] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV26, num_of_slices(HEALTH_SV26));
almanacHealth[27] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV27, num_of_slices(HEALTH_SV27));
almanacHealth[28] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV28, num_of_slices(HEALTH_SV28));
almanacHealth[29] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV29, num_of_slices(HEALTH_SV29));
almanacHealth[30] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV30, num_of_slices(HEALTH_SV30));
almanacHealth[31] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV31, num_of_slices(HEALTH_SV31));
almanacHealth[32] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV32, num_of_slices(HEALTH_SV32));
almanacHealth[25] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV25);
almanacHealth[26] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV26);
almanacHealth[27] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV27);
almanacHealth[28] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV28);
almanacHealth[29] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV29);
almanacHealth[30] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV30);
almanacHealth[31] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV31);
almanacHealth[32] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV32);
}
break;
case 5://--- It is subframe 5 -----------------almanac health (PRN: 1-24) and Almanac reference week number and time.
d_TOW_SF5 = (double)read_navigation_unsigned(subframe_bits, TOW, num_of_slices(TOW));
d_TOW_SF5 = (double)read_navigation_unsigned(subframe_bits, TOW);
d_TOW_SF5 = d_TOW_SF5*6;
d_TOW = d_TOW_SF4; // Set transmission time
b_integrity_status_flag = read_navigation_bool(subframe_bits, INTEGRITY_STATUS_FLAG);
b_alert_flag = read_navigation_bool(subframe_bits, ALERT_FLAG);
b_antispoofing_flag = read_navigation_bool(subframe_bits, ANTI_SPOOFING_FLAG);
SV_data_ID = (int)read_navigation_unsigned(subframe_bits, SV_DATA_ID, num_of_slices(SV_DATA_ID));
SV_page = (int)read_navigation_unsigned(subframe_bits, SV_PAGE, num_of_slices(SV_PAGE));
SV_data_ID = (int)read_navigation_unsigned(subframe_bits, SV_DATA_ID);
SV_page = (int)read_navigation_unsigned(subframe_bits, SV_PAGE);
if (SV_page < 25)
{
//! \TODO read almanac
}
if (SV_page == 25)
{
d_Toa = (double)read_navigation_unsigned(subframe_bits,T_OA,num_of_slices(T_OA));
d_Toa = (double)read_navigation_unsigned(subframe_bits, T_OA);
d_Toa = d_Toa * T_OA_LSB;
i_WN_A = (int)read_navigation_unsigned(subframe_bits,WN_A,num_of_slices(WN_A));
almanacHealth[1] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV1, num_of_slices(HEALTH_SV1));
almanacHealth[2] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV2, num_of_slices(HEALTH_SV2));
almanacHealth[3] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV3, num_of_slices(HEALTH_SV3));
almanacHealth[4] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV4, num_of_slices(HEALTH_SV4));
almanacHealth[5] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV5, num_of_slices(HEALTH_SV5));
almanacHealth[6] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV6, num_of_slices(HEALTH_SV6));
almanacHealth[7] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV7, num_of_slices(HEALTH_SV7));
almanacHealth[8] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV8, num_of_slices(HEALTH_SV8));
almanacHealth[9] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV9, num_of_slices(HEALTH_SV9));
almanacHealth[10] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV10, num_of_slices(HEALTH_SV10));
almanacHealth[11] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV11, num_of_slices(HEALTH_SV11));
almanacHealth[12] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV12, num_of_slices(HEALTH_SV12));
almanacHealth[13] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV13, num_of_slices(HEALTH_SV13));
almanacHealth[14] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV14, num_of_slices(HEALTH_SV14));
almanacHealth[15] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV15, num_of_slices(HEALTH_SV15));
almanacHealth[16] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV16, num_of_slices(HEALTH_SV16));
almanacHealth[17] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV17, num_of_slices(HEALTH_SV17));
almanacHealth[18] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV18, num_of_slices(HEALTH_SV18));
almanacHealth[19] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV19, num_of_slices(HEALTH_SV19));
almanacHealth[20] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV20, num_of_slices(HEALTH_SV20));
almanacHealth[21] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV21, num_of_slices(HEALTH_SV21));
almanacHealth[22] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV22, num_of_slices(HEALTH_SV22));
almanacHealth[23] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV23, num_of_slices(HEALTH_SV23));
almanacHealth[24] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV24, num_of_slices(HEALTH_SV24));
i_WN_A = (int)read_navigation_unsigned(subframe_bits, WN_A);
almanacHealth[1] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV1);
almanacHealth[2] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV2);
almanacHealth[3] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV3);
almanacHealth[4] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV4);
almanacHealth[5] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV5);
almanacHealth[6] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV6);
almanacHealth[7] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV7);
almanacHealth[8] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV8);
almanacHealth[9] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV9);
almanacHealth[10] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV10);
almanacHealth[11] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV11);
almanacHealth[12] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV12);
almanacHealth[13] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV13);
almanacHealth[14] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV14);
almanacHealth[15] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV15);
almanacHealth[16] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV16);
almanacHealth[17] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV17);
almanacHealth[18] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV18);
almanacHealth[19] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV19);
almanacHealth[20] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV20);
almanacHealth[21] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV21);
almanacHealth[22] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV22);
almanacHealth[23] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV23);
almanacHealth[24] = (int)read_navigation_unsigned(subframe_bits, HEALTH_SV24);
}
break;

View File

@ -5,7 +5,7 @@
*
* -------------------------------------------------------------------------
*
* Copyright (C) 2010-2012 (see AUTHORS file for a list of contributors)
* Copyright (C) 2010-2013 (see AUTHORS file for a list of contributors)
*
* GNSS-SDR is a software defined Global Navigation
* Satellite Systems receiver
@ -29,8 +29,8 @@
*/
#ifndef GNSS_SDR_GPS_NAVIGATION_MESSAGE_H
#define GNSS_SDR_GPS_NAVIGATION_MESSAGE_H
#ifndef GNSS_SDR_GPS_NAVIGATION_MESSAGE_H_
#define GNSS_SDR_GPS_NAVIGATION_MESSAGE_H_
#include <iostream>
#include <map>
@ -51,9 +51,9 @@
class Gps_Navigation_Message
{
private:
unsigned long int read_navigation_unsigned(std::bitset<GPS_SUBFRAME_BITS> bits, const bits_slice *slices, int num_of_slices);
signed long int read_navigation_signed(std::bitset<GPS_SUBFRAME_BITS> bits, const bits_slice *slices, int num_of_slices);
bool read_navigation_bool(std::bitset<GPS_SUBFRAME_BITS> bits, const bits_slice *slices);
unsigned long int read_navigation_unsigned(std::bitset<GPS_SUBFRAME_BITS> bits, const std::vector<std::pair<int,int>> parameter);
signed long int read_navigation_signed(std::bitset<GPS_SUBFRAME_BITS> bits, const std::vector<std::pair<int,int>> parameter);
bool read_navigation_bool(std::bitset<GPS_SUBFRAME_BITS> bits, const std::vector<std::pair<int,int>> parameter);
void print_gps_word_bytes(unsigned int GPS_word);
/*
* Accounts for the beginning or end of week crossover