/*!
* \file GLONASS_L1_CA.h
* \brief Defines system parameters for GLONASS L1 C/A signal and NAV data
* \author Damian Miralles, 2017. dmiralles2009(at)gmail.com
*
* -------------------------------------------------------------------------
*
* Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors)
*
* GNSS-SDR is a software defined Global Navigation
* Satellite Systems receiver
*
* This file is part of GNSS-SDR.
*
* GNSS-SDR is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* GNSS-SDR is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNSS-SDR. If not, see .
*
* -------------------------------------------------------------------------
*/
#ifndef GNSS_SDR_GLONASS_L1_CA_H_
#define GNSS_SDR_GLONASS_L1_CA_H_
#include
#include // std::pair
#include "MATH_CONSTANTS.h"
#include "gnss_frequencies.h"
// Physical constants
const double GLONASS_C_m_s = SPEED_OF_LIGHT; //!< The speed of light, [m/s]
const double GLONASS_C_m_ms = 299792.4580; //!< The speed of light, [m/ms]
const double GLONASS_PI = 3.1415926535898; //!< Pi as defined in IS-GPS-200E
const double GLONASS_TWO_PI = 6.283185307179586; //!< 2Pi as defined in IS-GPS-200E
const double GLONASS_OMEGA_EARTH_DOT = 7.292115e-5; //!< Earth rotation rate, [rad/s]
const double GLONASS_GM = 398600.4418e9; //!< Universal gravitational constant times the mass of the Earth, [m^3/s^2]
const double GLONASS_fM_a = 0.35e9; //!< Gravitational constant of atmosphere [m^3/s^2]
const double GLONASS_SEMI_MAJOR_AXIS = 6378136; //!< Semi-major axis of Earth [m]
const double GLONASS_FLATTENING = 1/29825784; //!< Flattening parameter
const double GLONASS_GRAVITY = 97803284; //!< Equatorial acceleration of gravity [mGal]
const double GLONASS_GRAVITY_CORRECTION = 0.87; //!< Correction to acceleration of gravity at sea-level due to Atmosphere[мGal]
const double GLONASS_J2 = 1082625.75e-9; //!< Second zonal harmonic of the geopotential
const double GLONASS_J4 = -2370.89e-9; //! GLONASS_PRN =
{{ 0, 8,}, //For test
{ 1, 1,}, //Plane 1
{ 2,-4,}, //Plane 1
{ 3, 5,}, //Plane 1
{ 4, 6,}, //Plane 1
{ 5, 1,}, //Plane 1
{ 6,-4,}, //Plane 1
{ 7, 5,}, //Plane 1
{ 8, 6,}, //Plane 1
{ 9,-2,}, //Plane 2
{10,-7,}, //Plane 2
{11, 0,}, //Plane 2
{12,-1,}, //Plane 2
{13,-2,}, //Plane 2
{14,-7,}, //Plane 2
{15, 0,}, //Plane 2
{16,-1,}, //Plane 2
{17, 4,}, //Plane 3
{18,-3,}, //Plane 3
{19, 3,}, //Plane 3
{20, 2,}, //Plane 3
{21, 4,}, //Plane 3
{22,-3,}, //Plane 3
{23, 3,}, //Plane 3
{24, 2}}; //Plane 3
const double GLONASS_STARTOFFSET_ms = 68.802; //[ms] Initial sign. travel time (this cannot go here)
// OBSERVABLE HISTORY DEEP FOR INTERPOLATION
const int GLONASS_L1_CA_HISTORY_DEEP = 100;
// NAVIGATION MESSAGE DEMODULATION AND DECODING
#define GLONASS_GNAV_PREAMBLE {1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0}
const double GLONASS_GNAV_PREAMBLE_DURATION_S = 0.3;
const int GLONASS_GNAV_PREAMBLE_LENGTH_BITS = 30;
const int GLONASS_GNAV_PREAMBLE_LENGTH_SYMBOLS = 300;
const int GLONASS_GNAV_PREAMBLE_PERIOD_SYMBOLS = 1700;
const int GLONASS_GNAV_TELEMETRY_RATE_BITS_SECOND = 50; //!< NAV message bit rate [bits/s]
const int GLONASS_GNAV_TELEMETRY_SYMBOLS_PER_BIT = 10;
const int GLONASS_GNAV_TELEMETRY_SYMBOLS_PER_PREAMBLE_BIT = 10;
const int GLONASS_GNAV_TELEMETRY_RATE_SYMBOLS_SECOND = GLONASS_GNAV_TELEMETRY_RATE_BITS_SECOND*GLONASS_GNAV_TELEMETRY_SYMBOLS_PER_BIT; //!< NAV message bit rate [symbols/s]
const int GLONASS_GNAV_STRING_SYMBOLS = 2000; //!< Number of bits per string in the GNAV message (85 data bits + 30 time mark bits) [bits]
const int GLONASS_GNAV_STRING_BITS = 85; //!< Number of bits per string in the GNAV message (85 data bits + 30 time mark bits) [bits]
const int GLONASS_GNAV_HAMMING_CODE_BITS = 8; //!< Number of bits in hamming code sequence of GNAV message
const std::vector GLONASS_GNAV_CRC_I_INDEX {9, 10, 12, 13, 15, 17, 19, 20, 22, 24, 26, 28, 30, 32, 34, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84};
const std::vector GLONASS_GNAV_CRC_J_INDEX {9, 11, 12, 14, 15, 18, 19, 21, 22, 25, 26, 29, 30, 33, 34, 36, 37, 40, 41, 44, 45, 48, 49, 52, 53, 56, 57, 60, 61, 64, 65, 67, 68, 71, 72, 75, 76, 79, 80, 83, 84};
const std::vector GLONASS_GNAV_CRC_K_INDEX {10, 11, 12, 16, 17, 18, 19, 23, 24, 25, 26, 31, 32, 33, 34, 38, 39, 40, 41, 46, 47, 48, 49, 54, 55, 56, 57, 62, 63, 64, 65, 69, 70, 71, 72, 77, 78, 79, 80, 85};
const std::vector GLONASS_GNAV_CRC_L_INDEX {9, 11, 12, 14, 15, 18, 19, 21, 22, 25, 26, 29, 30, 33, 34, 36, 37, 40, 41, 44, 45, 48, 49, 52, 53, 56, 57, 60, 61, 64, 65, 67, 68, 71, 72, 75, 76, 79, 80, 83, 84};
const std::vector GLONASS_GNAV_CRC_M_INDEX {20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 81, 82, 83, 84, 85};
const std::vector GLONASS_GNAV_CRC_N_INDEX {35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85};
const std::vector GLONASS_GNAV_CRC_P_INDEX {66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85};
const std::vector GLONASS_GNAV_CRC_Q_INDEX {9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85};
// GLONASS GNAV NAVIGATION MESSAGE STRUCTURE
// NAVIGATION MESSAGE FIELDS POSITIONS (from IS-GPS-200E Appendix II)
// FRAME 1-4
// COMMON FIELDS
const std::vector> STRING_ID({{2,4}});
const std::vector> KX({{78,8}});
//STRING 1
const std::vector> P1({{8,2}});
const std::vector> T_K_HR({{10,5}});
const std::vector> T_K_MIN({{15,6}});
const std::vector> T_K_SEC({{21,1}});
const std::vector> X_N_DOT ({{22,24}});
const std::vector> X_N_DOT_DOT ({{46,5}});
const std::vector> X_N({{51,27}});
//STRING 2
const std::vector> B_N({{6,3}});
const std::vector> P2({{9,1}});
const std::vector> T_B({{10,7}});
const std::vector> Y_N_DOT ({{22,24}});
const std::vector> Y_N_DOT_DOT ({{46,5}});
const std::vector> Y_N({{51,27}});
//STRING 3
const std::vector> P3({{6,1}});
const std::vector> GAMMA_N({{7,11}});
const std::vector> P({{19,2}});
const std::vector> EPH_L_N({{21,1}});
const std::vector> Z_N_DOT ({{22,24}});
const std::vector> Z_N_DOT_DOT ({{46,5}});
const std::vector> Z_N({{51,27}});
// STRING 4
const std::vector> TAU_N({{6,22}});
const std::vector> DELTA_TAU_N({{28,5}});
const std::vector> E_N({{33,5}});
const std::vector> P4 ({{52,1}});
const std::vector> F_T ({{53,4}});
const std::vector> N_T({{60,11}});
const std::vector> N({{71,5}});
const std::vector> M({{76,2}});
// STRING 5
const std::vector> N_A({{6,11}});
const std::vector> TAU_C({{17,32}});
const std::vector> N_4({{50,5}});
const std::vector> TAU_GPS({{55,22}});
const std::vector> ALM_L_N({{77,1}});
// STRING 6, 8, 10, 12, 14
const std::vector> C_N({{6,1}});
const std::vector> M_N_A({{7,2}});
const std::vector> n_A({{9,5}});
const std::vector> TAU_N_A({{14,10}});
const std::vector> LAMBDA_N_A({{24,21}});
const std::vector> DELTA_I_N_A({{45,18}});
const std::vector> EPSILON_N_A({{63,15}});
//STRING 7, 9, 11, 13, 15
const std::vector> OMEGA_N_A({{6,16}});
const std::vector> T_LAMBDA_N_A({{22,21}});
const std::vector> DELTA_T_N_A({{43,22}});
const std::vector> DELTA_T_DOT_N_A({{65,7}});
const std::vector> H_N_A({{72,5}});
// STRING 14 FRAME 5
const std::vector> B1({{6,11}});
const std::vector> B2({{17,10}});
#endif /* GNSS_SDR_GLONASS_L1_CA_H_ */