mirror of
https://github.com/gnss-sdr/gnss-sdr
synced 2025-01-30 19:04:51 +00:00
Merge branch 'glonass' of https://github.com/gnss-sdr/gnss-sdr into glonass
This commit is contained in:
commit
e6417032a9
@ -5,7 +5,7 @@ GNSS-SDR.internal_fs_sps=6625000
|
|||||||
|
|
||||||
;######### SIGNAL_SOURCE CONFIG ############
|
;######### SIGNAL_SOURCE CONFIG ############
|
||||||
SignalSource.implementation=File_Signal_Source
|
SignalSource.implementation=File_Signal_Source
|
||||||
SignalSource.filename=/archive/NT1065_GLONASS_L1_20160831_fs6625e6_if0e3_schar_1m.bin ; <- PUT YOUR FILE HERE
|
SignalSource.filename=/archive/NT1065_GLONASS_L1_20160923_fs6625e6_if0e3_schar.bin ; <- PUT YOUR FILE HERE
|
||||||
SignalSource.item_type=ibyte
|
SignalSource.item_type=ibyte
|
||||||
SignalSource.sampling_frequency=6625000
|
SignalSource.sampling_frequency=6625000
|
||||||
;SignalSource.freq=0
|
;SignalSource.freq=0
|
||||||
@ -25,20 +25,15 @@ Resampler.sample_freq_out=6625000
|
|||||||
Resampler.item_type=gr_complex
|
Resampler.item_type=gr_complex
|
||||||
|
|
||||||
;######### CHANNELS GLOBAL CONFIG ############
|
;######### CHANNELS GLOBAL CONFIG ############
|
||||||
|
Channel.signal=1G
|
||||||
|
Channels.in_acquisition=1
|
||||||
Channels_1G.count=5
|
Channels_1G.count=5
|
||||||
Channels.in_acquisition=5
|
|
||||||
Channel0.signal=1G
|
|
||||||
Channel1.signal=1G
|
|
||||||
Channel2.signal=1G
|
|
||||||
Channel3.signal=1G
|
|
||||||
Channel4.signal=1G
|
|
||||||
|
|
||||||
Channel0.satellite=11
|
Channel0.satellite=24 ; k=
|
||||||
Channel1.satellite=2
|
Channel1.satellite=1 ; k=1
|
||||||
Channel2.satellite=18
|
Channel2.satellite=2 ; k=-4
|
||||||
Channel3.satellite=12
|
Channel3.satellite=20 ; k=-5
|
||||||
Channel4.satellite=21
|
Channel4.satellite=21 ; k=4
|
||||||
; Possible list includes 2, 12, 21, 22
|
|
||||||
|
|
||||||
;######### ACQUISITION GLOBAL CONFIG ############
|
;######### ACQUISITION GLOBAL CONFIG ############
|
||||||
Acquisition_1G.implementation=GLONASS_L1_CA_PCPS_Acquisition
|
Acquisition_1G.implementation=GLONASS_L1_CA_PCPS_Acquisition
|
||||||
@ -53,9 +48,9 @@ Acquisition_1G.dump_filename=/archive/glo_acquisition.dat
|
|||||||
;Acquisition_1G.coherent_integration_time_ms=10
|
;Acquisition_1G.coherent_integration_time_ms=10
|
||||||
|
|
||||||
;######### TRACKING GLOBAL CONFIG ############
|
;######### TRACKING GLOBAL CONFIG ############
|
||||||
Tracking_1G.implementation=GLONASS_L1_CA_DLL_PLL_C_Aid_Tracking
|
Tracking_1G.implementation=GLONASS_L1_CA_DLL_PLL_Tracking
|
||||||
Tracking_1G.item_type=gr_complex
|
Tracking_1G.item_type=gr_complex
|
||||||
Tracking_1G.if=1
|
Tracking_1G.if=0
|
||||||
Tracking_1G.early_late_space_chips=0.5
|
Tracking_1G.early_late_space_chips=0.5
|
||||||
Tracking_1G.pll_bw_hz=25.0;
|
Tracking_1G.pll_bw_hz=25.0;
|
||||||
Tracking_1G.dll_bw_hz=3.0;
|
Tracking_1G.dll_bw_hz=3.0;
|
||||||
@ -63,10 +58,12 @@ Tracking_1G.dump=true;
|
|||||||
Tracking_1G.dump_filename=/archive/glo_tracking_ch_
|
Tracking_1G.dump_filename=/archive/glo_tracking_ch_
|
||||||
|
|
||||||
;######### TELEMETRY DECODER GPS CONFIG ############
|
;######### TELEMETRY DECODER GPS CONFIG ############
|
||||||
TelemetryDecoder_1G.implementation=GPS_L1_CA_Telemetry_Decoder
|
TelemetryDecoder_1G.implementation=GLONASS_L1_CA_Telemetry_Decoder
|
||||||
|
|
||||||
;######### OBSERVABLES CONFIG ############
|
;######### OBSERVABLES CONFIG ############
|
||||||
Observables.implementation=Hybrid_Observables
|
Observables.implementation=Hybrid_Observables
|
||||||
|
Observables.dump=true;
|
||||||
|
Observables.dump_filename=/archive/glo_observables.dat
|
||||||
|
|
||||||
;######### PVT CONFIG ############
|
;######### PVT CONFIG ############
|
||||||
PVT.implementation=RTKLIB_PVT
|
PVT.implementation=RTKLIB_PVT
|
||||||
|
@ -191,7 +191,8 @@ void rtklib_pvt_cc::msg_handler_telemetry(pmt::pmt_t msg)
|
|||||||
// insert new ephemeris record
|
// insert new ephemeris record
|
||||||
DLOG(INFO) << "GLONASS GNAV New Ephemeris record inserted in global map with TOW =" << glonass_gnav_eph->d_TOW
|
DLOG(INFO) << "GLONASS GNAV New Ephemeris record inserted in global map with TOW =" << glonass_gnav_eph->d_TOW
|
||||||
<< ", GLONASS GNAV Week Number =" << glonass_gnav_eph->d_WN
|
<< ", GLONASS GNAV Week Number =" << glonass_gnav_eph->d_WN
|
||||||
<< " and Ephemeris IOD = " << glonass_gnav_eph->compute_GLONASS_time(glonass_gnav_eph->d_t_b);
|
<< " and Ephemeris IOD = " << glonass_gnav_eph->compute_GLONASS_time(glonass_gnav_eph->d_t_b)
|
||||||
|
<< " from SV = " << glonass_gnav_eph->i_satellite_slot_number;
|
||||||
// update/insert new ephemeris record to the global ephemeris map
|
// update/insert new ephemeris record to the global ephemeris map
|
||||||
d_ls_pvt->glonass_gnav_ephemeris_map[glonass_gnav_eph->i_satellite_PRN] = *glonass_gnav_eph;
|
d_ls_pvt->glonass_gnav_ephemeris_map[glonass_gnav_eph->i_satellite_PRN] = *glonass_gnav_eph;
|
||||||
}
|
}
|
||||||
@ -209,7 +210,8 @@ void rtklib_pvt_cc::msg_handler_telemetry(pmt::pmt_t msg)
|
|||||||
std::shared_ptr<Glonass_Gnav_Almanac> glonass_gnav_almanac;
|
std::shared_ptr<Glonass_Gnav_Almanac> glonass_gnav_almanac;
|
||||||
glonass_gnav_almanac = boost::any_cast<std::shared_ptr<Glonass_Gnav_Almanac>>(pmt::any_ref(msg));
|
glonass_gnav_almanac = boost::any_cast<std::shared_ptr<Glonass_Gnav_Almanac>>(pmt::any_ref(msg));
|
||||||
d_ls_pvt->glonass_gnav_almanac = *glonass_gnav_almanac;
|
d_ls_pvt->glonass_gnav_almanac = *glonass_gnav_almanac;
|
||||||
DLOG(INFO) << "New GLONASS GNAV Almanac has arrived ";
|
DLOG(INFO) << "New GLONASS GNAV Almanac has arrived "
|
||||||
|
<< ", GLONASS GNAV Slot Number =" << glonass_gnav_almanac->d_n_A;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -139,6 +139,8 @@ void glonass_l1_ca_telemetry_decoder_cc::decode_string(double *frame_symbols,int
|
|||||||
// 1. Transform from symbols to bits
|
// 1. Transform from symbols to bits
|
||||||
std::string bi_binary_code;
|
std::string bi_binary_code;
|
||||||
std::string relative_code;
|
std::string relative_code;
|
||||||
|
std::string data_bits;
|
||||||
|
|
||||||
// Group samples into bi-binary code
|
// Group samples into bi-binary code
|
||||||
for(int i = 0; i < (frame_length); i++)
|
for(int i = 0; i < (frame_length); i++)
|
||||||
{
|
{
|
||||||
@ -173,9 +175,15 @@ void glonass_l1_ca_telemetry_decoder_cc::decode_string(double *frame_symbols,int
|
|||||||
relative_code.push_back('0');
|
relative_code.push_back('0');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Convert from relative code to data bits
|
||||||
|
data_bits.push_back('0');
|
||||||
|
for(int i = 1; i < (GLONASS_GNAV_STRING_BITS); i++)
|
||||||
|
{
|
||||||
|
data_bits.push_back(((relative_code[i-1]-'0') ^ (relative_code[i]-'0')) + '0');
|
||||||
|
}
|
||||||
|
|
||||||
// 2. Call the GLONASS GNAV string decoder
|
// 2. Call the GLONASS GNAV string decoder
|
||||||
d_nav.string_decoder(relative_code);
|
d_nav.string_decoder(data_bits);
|
||||||
|
|
||||||
// 3. Check operation executed correctly
|
// 3. Check operation executed correctly
|
||||||
if(d_nav.flag_CRC_test == true)
|
if(d_nav.flag_CRC_test == true)
|
||||||
@ -186,13 +194,13 @@ void glonass_l1_ca_telemetry_decoder_cc::decode_string(double *frame_symbols,int
|
|||||||
{
|
{
|
||||||
LOG(INFO) << "GLONASS GNAV CRC error on channel " << d_channel << " from satellite " << d_satellite;
|
LOG(INFO) << "GLONASS GNAV CRC error on channel " << d_channel << " from satellite " << d_satellite;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 4. Push the new navigation data to the queues
|
// 4. Push the new navigation data to the queues
|
||||||
if (d_nav.have_new_ephemeris() == true)
|
if (d_nav.have_new_ephemeris() == true)
|
||||||
{
|
{
|
||||||
// get object for this SV (mandatory)
|
// get object for this SV (mandatory)
|
||||||
std::shared_ptr<Glonass_Gnav_Ephemeris> tmp_obj = std::make_shared<Glonass_Gnav_Ephemeris>(d_nav.get_ephemeris());
|
std::shared_ptr<Glonass_Gnav_Ephemeris> tmp_obj = std::make_shared<Glonass_Gnav_Ephemeris>(d_nav.get_ephemeris());
|
||||||
this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj));
|
this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj));
|
||||||
|
LOG(INFO) << "GLONASS GNAV Ephemeris have been received on channel" << d_channel << " from satellite " << d_satellite;
|
||||||
|
|
||||||
}
|
}
|
||||||
if (d_nav.have_new_utc_model() == true)
|
if (d_nav.have_new_utc_model() == true)
|
||||||
@ -200,12 +208,21 @@ void glonass_l1_ca_telemetry_decoder_cc::decode_string(double *frame_symbols,int
|
|||||||
// get object for this SV (mandatory)
|
// get object for this SV (mandatory)
|
||||||
std::shared_ptr<Glonass_Gnav_Utc_Model> tmp_obj = std::make_shared<Glonass_Gnav_Utc_Model>(d_nav.get_utc_model());
|
std::shared_ptr<Glonass_Gnav_Utc_Model> tmp_obj = std::make_shared<Glonass_Gnav_Utc_Model>(d_nav.get_utc_model());
|
||||||
this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj));
|
this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj));
|
||||||
|
LOG(INFO) << "GLONASS GNAV UTC Model have been received on channel" << d_channel << " from satellite " << d_satellite;
|
||||||
}
|
}
|
||||||
if (d_nav.have_new_almanac() == true)
|
if (d_nav.have_new_almanac() == true)
|
||||||
{
|
{
|
||||||
unsigned int slot_nbr = d_nav.get_ephemeris().i_satellite_slot_number;
|
unsigned int slot_nbr = d_nav.i_alm_satellite_slot_number;
|
||||||
std::shared_ptr<Glonass_Gnav_Almanac> tmp_obj= std::make_shared<Glonass_Gnav_Almanac>(d_nav.get_almanac(slot_nbr));
|
std::shared_ptr<Glonass_Gnav_Almanac> tmp_obj= std::make_shared<Glonass_Gnav_Almanac>(d_nav.get_almanac(slot_nbr));
|
||||||
this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj));
|
this->message_port_pub(pmt::mp("telemetry"), pmt::make_any(tmp_obj));
|
||||||
|
LOG(INFO) << "GLONASS GNAV Almanac have been received on channel" << d_channel << " in slot number " << slot_nbr;
|
||||||
|
}
|
||||||
|
// 5. Update satellite information on system
|
||||||
|
if(d_nav.flag_update_slot_number == true)
|
||||||
|
{
|
||||||
|
LOG(INFO) << "GLONASS GNAV Slot Number Identified on channel " << d_channel;
|
||||||
|
d_satellite.what_block(d_satellite.get_system(), d_nav.get_ephemeris().d_n);
|
||||||
|
d_nav.flag_update_slot_number = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -334,10 +351,11 @@ int glonass_l1_ca_telemetry_decoder_cc::general_work (int noutput_items __attrib
|
|||||||
|
|
||||||
// UPDATE GNSS SYNCHRO DATA
|
// UPDATE GNSS SYNCHRO DATA
|
||||||
//2. Add the telemetry decoder information
|
//2. Add the telemetry decoder information
|
||||||
if (this->d_flag_preamble == true and d_nav.flag_TOW_set == true)
|
if (this->d_flag_preamble == true and d_nav.flag_TOW_new == true)
|
||||||
//update TOW at the preamble instant
|
//update TOW at the preamble instant
|
||||||
{
|
{
|
||||||
d_TOW_at_current_symbol = floor((d_nav.d_TOW + 2*GLONASS_L1_CA_CODE_PERIOD + GLONASS_GNAV_PREAMBLE_DURATION_S)*1000.0)/1000.0;
|
d_TOW_at_current_symbol = floor((d_nav.d_TOW - GLONASS_GNAV_PREAMBLE_DURATION_S)*1000.0)/1000.0;
|
||||||
|
d_nav.flag_TOW_new = false;
|
||||||
|
|
||||||
}
|
}
|
||||||
else //if there is not a new preamble, we define the TOW of the current symbol
|
else //if there is not a new preamble, we define the TOW of the current symbol
|
||||||
|
@ -58,7 +58,7 @@
|
|||||||
/*!
|
/*!
|
||||||
* \todo Include in definition header file
|
* \todo Include in definition header file
|
||||||
*/
|
*/
|
||||||
#define CN0_ESTIMATION_SAMPLES 20
|
#define CN0_ESTIMATION_SAMPLES 10
|
||||||
#define MINIMUM_VALID_CN0 25
|
#define MINIMUM_VALID_CN0 25
|
||||||
#define MAXIMUM_LOCK_FAIL_COUNTER 50
|
#define MAXIMUM_LOCK_FAIL_COUNTER 50
|
||||||
#define CARRIER_LOCK_THRESHOLD 0.85
|
#define CARRIER_LOCK_THRESHOLD 0.85
|
||||||
|
@ -59,7 +59,7 @@
|
|||||||
/*!
|
/*!
|
||||||
* \todo Include in definition header file
|
* \todo Include in definition header file
|
||||||
*/
|
*/
|
||||||
#define CN0_ESTIMATION_SAMPLES 20
|
#define CN0_ESTIMATION_SAMPLES 10
|
||||||
#define MINIMUM_VALID_CN0 25
|
#define MINIMUM_VALID_CN0 25
|
||||||
#define MAXIMUM_LOCK_FAIL_COUNTER 50
|
#define MAXIMUM_LOCK_FAIL_COUNTER 50
|
||||||
#define CARRIER_LOCK_THRESHOLD 0.85
|
#define CARRIER_LOCK_THRESHOLD 0.85
|
||||||
|
@ -56,7 +56,7 @@
|
|||||||
/*!
|
/*!
|
||||||
* \todo Include in definition header file
|
* \todo Include in definition header file
|
||||||
*/
|
*/
|
||||||
#define CN0_ESTIMATION_SAMPLES 20
|
#define CN0_ESTIMATION_SAMPLES 10
|
||||||
#define MINIMUM_VALID_CN0 25
|
#define MINIMUM_VALID_CN0 25
|
||||||
#define MAXIMUM_LOCK_FAIL_COUNTER 50
|
#define MAXIMUM_LOCK_FAIL_COUNTER 50
|
||||||
#define CARRIER_LOCK_THRESHOLD 0.85
|
#define CARRIER_LOCK_THRESHOLD 0.85
|
||||||
|
@ -598,7 +598,7 @@ void GNSSFlowgraph::set_signals_list()
|
|||||||
29, 30, 31, 32, 33, 34, 35, 36};
|
29, 30, 31, 32, 33, 34, 35, 36};
|
||||||
|
|
||||||
// Removing satellites sharing same frequency number(1 and 5, 2 and 6, 3 and 7, 4 and 6, 11 and 15, 12 and 16, 14 and 18, 17 and 21
|
// Removing satellites sharing same frequency number(1 and 5, 2 and 6, 3 and 7, 4 and 6, 11 and 15, 12 and 16, 14 and 18, 17 and 21
|
||||||
std::set<unsigned int> available_glonass_prn = { 1, 2, 3, 4, 9, 10, 11, 12, 18, 19, 20, 21 };
|
std::set<unsigned int> available_glonass_prn = { 1, 2, 3, 4, 9, 10, 11, 12, 18, 19, 20, 21, 24 };
|
||||||
|
|
||||||
std::string sv_list = configuration_->property("Galileo.prns", std::string("") );
|
std::string sv_list = configuration_->property("Galileo.prns", std::string("") );
|
||||||
|
|
||||||
|
@ -87,6 +87,7 @@ const double GLONASS_L1_CA_CODE_LENGTH_CHIPS = 511.0; //!< GLONASS L1 C/
|
|||||||
const double GLONASS_L1_CA_CODE_PERIOD = 0.001; //!< GLONASS L1 C/A code period [seconds]
|
const double GLONASS_L1_CA_CODE_PERIOD = 0.001; //!< GLONASS L1 C/A code period [seconds]
|
||||||
const double GLONASS_L1_CA_CHIP_PERIOD = 1.9569e-06; //!< GLONASS L1 C/A chip period [seconds]
|
const double GLONASS_L1_CA_CHIP_PERIOD = 1.9569e-06; //!< GLONASS L1 C/A chip period [seconds]
|
||||||
const double GLONASS_L1_CA_SYMBOL_RATE_BPS = 1000;
|
const double GLONASS_L1_CA_SYMBOL_RATE_BPS = 1000;
|
||||||
|
const int GLONASS_L1_CA_NBR_SATS = 24; // STRING DATA WITHOUT PREAMBLE
|
||||||
|
|
||||||
//FIXME Probably should use leap seconds definitions of rtklib
|
//FIXME Probably should use leap seconds definitions of rtklib
|
||||||
const double GLONASS_LEAP_SECONDS[21][7] = { /* leap seconds (y,m,d,h,m,s,utc-gpst) */
|
const double GLONASS_LEAP_SECONDS[21][7] = { /* leap seconds (y,m,d,h,m,s,utc-gpst) */
|
||||||
@ -135,7 +136,7 @@ const std::map<unsigned int, int> GLONASS_PRN =
|
|||||||
{17, 4,}, //Plane 3
|
{17, 4,}, //Plane 3
|
||||||
{18,-3,}, //Plane 3
|
{18,-3,}, //Plane 3
|
||||||
{19, 3,}, //Plane 3
|
{19, 3,}, //Plane 3
|
||||||
{20, 2,}, //Plane 3
|
{20, -5,}, //Plane 3
|
||||||
{21, 4,}, //Plane 3
|
{21, 4,}, //Plane 3
|
||||||
{22,-3,}, //Plane 3
|
{22,-3,}, //Plane 3
|
||||||
{23, 3,}, //Plane 3
|
{23, 3,}, //Plane 3
|
||||||
@ -164,9 +165,9 @@ const int GLONASS_GNAV_DATA_SYMBOLS = 1700; // STRING DATA WITHOUT PREAMBLE
|
|||||||
const std::vector<int> 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<int> 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<int> 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<int> 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<int> 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<int> 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<int> 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<int> GLONASS_GNAV_CRC_L_INDEX {13, 14, 15, 16, 17, 18, 19, 27, 28, 29, 30, 31, 32, 33, 34, 42, 43, 44, 45, 46, 47, 48, 49, 58, 59, 60, 61, 62, 63, 64, 65, 73, 74, 75, 76, 77, 78, 79, 80};
|
||||||
const std::vector<int> 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<int> 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<int> 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<int> 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};
|
||||||
const std::vector<int> 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<int> 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<int> 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};
|
const std::vector<int> 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};
|
||||||
|
|
||||||
|
@ -54,124 +54,5 @@ Glonass_Gnav_Almanac::Glonass_Gnav_Almanac()
|
|||||||
d_tau_n_A = 0.0;
|
d_tau_n_A = 0.0;
|
||||||
d_C_n = false;
|
d_C_n = false;
|
||||||
d_l_n = false;
|
d_l_n = false;
|
||||||
}
|
|
||||||
|
|
||||||
void Glonass_Gnav_Almanac::satellite_position(double N_A, double N_i, double t_i)
|
|
||||||
{
|
|
||||||
double T_nom = 43200; // [seconds]
|
|
||||||
double i_nom = D2R*63.0; // [rad]
|
|
||||||
|
|
||||||
double Delta_t = 0.0;
|
|
||||||
double i = 0.0;
|
|
||||||
double T = 0.0;
|
|
||||||
double n = 0.0;
|
|
||||||
double a = 0.0;
|
|
||||||
double lambda_dot = 0.0;
|
|
||||||
double omega_dot = 0.0;
|
|
||||||
double lambda = 0.0;
|
|
||||||
double omega = 0.0;
|
|
||||||
double E_P = 0.0;
|
|
||||||
double Delta_T = 0.0;
|
|
||||||
double M = 0.0;
|
|
||||||
double E = 0.0;
|
|
||||||
double E_old = 0.0;
|
|
||||||
double dE = 0.0;
|
|
||||||
|
|
||||||
double e1_x = 0.0;
|
|
||||||
double e1_y = 0.0;
|
|
||||||
double e1_z = 0.0;
|
|
||||||
|
|
||||||
double e2_x = 0.0;
|
|
||||||
double e2_y = 0.0;
|
|
||||||
double e2_z = 0.0;
|
|
||||||
// Compute time difference to reference time
|
|
||||||
Delta_t = (N_i - N_A) * 86400 + (t_i + d_t_lambda_n_A);
|
|
||||||
|
|
||||||
// Compute the actual inclination
|
|
||||||
i = i_nom + d_Delta_i_n_A;
|
|
||||||
|
|
||||||
// Compute the actual orbital period:
|
|
||||||
T = T_nom + d_Delta_T_n_A;
|
|
||||||
|
|
||||||
// Compute the mean motion
|
|
||||||
n = 2*GLONASS_PI/T;
|
|
||||||
|
|
||||||
// Compute the semi-major axis:
|
|
||||||
a = cbrt(GLONASS_GM/(n*n));
|
|
||||||
|
|
||||||
// Compute correction to longitude of ascending node
|
|
||||||
lambda_dot = -10*pow(GLONASS_SEMI_MAJOR_AXIS / a, 7/2)*D2R*cos(i)/86400;
|
|
||||||
|
|
||||||
// Compute correction to argument of perigee
|
|
||||||
omega_dot = 5*pow(GLONASS_SEMI_MAJOR_AXIS / a, 7/2)*D2R*(5*cos(i)*cos(i) - 1)/86400;
|
|
||||||
|
|
||||||
// Compute corrected longitude of ascending node:
|
|
||||||
lambda = d_lambda_n_A + (lambda_dot - GLONASS_OMEGA_EARTH_DOT)*Delta_t;
|
|
||||||
|
|
||||||
// Compute corrected argument of perigee:
|
|
||||||
omega = d_omega_n_A + omega_dot*Delta_t;
|
|
||||||
|
|
||||||
// Compute eccentric anomaly at point P: Note: P is that point of the orbit the true anomaly of which is identical to the argument of perigee.
|
|
||||||
E_P = 2*atan(tan((omega/2)*(sqrt((1 - d_epsilon_n_A)*(1 + d_epsilon_n_A)))));
|
|
||||||
|
|
||||||
// Compute time difference to perigee passing
|
|
||||||
if (omega < GLONASS_PI)
|
|
||||||
{
|
|
||||||
Delta_T = (E_P - d_epsilon_n_A*sin(E_P))/n;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Delta_T = (E_P - d_epsilon_n_A*sin(E_P))/n + T;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compute mean anomaly at epoch t_i:
|
|
||||||
M = n * (Delta_t - Delta_T);
|
|
||||||
|
|
||||||
// Compute eccentric anomaly at epoch t_i. Note: Kepler’s equation has to be solved iteratively
|
|
||||||
|
|
||||||
// Initial guess of eccentric anomaly
|
|
||||||
E = M;
|
|
||||||
|
|
||||||
// --- Iteratively compute eccentric anomaly ----------------------------
|
|
||||||
for (int ii = 1; ii < 20; ii++)
|
|
||||||
{
|
|
||||||
E_old = E;
|
|
||||||
E = M + d_epsilon_n_A * sin(E);
|
|
||||||
dE = fmod(E - E_old, 2.0 * GLONASS_PI);
|
|
||||||
if (fabs(dE) < 1e-12)
|
|
||||||
{
|
|
||||||
//Necessary precision is reached, exit from the loop
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compute position in orbital coordinate system
|
|
||||||
d_satpos_Xo = a*cos(E) - d_epsilon_n_A;
|
|
||||||
d_satpos_Yo = a*sqrt(1 - d_epsilon_n_A*d_epsilon_n_A)*sin(E);
|
|
||||||
d_satpos_Zo = a*0;
|
|
||||||
|
|
||||||
// Compute velocity in orbital coordinate system
|
|
||||||
d_satvel_Xo = a/(1-d_epsilon_n_A*cos(E))*(-n*sin(E));
|
|
||||||
d_satvel_Yo = a/(1-d_epsilon_n_A*cos(E))*(n*sqrt(1 - d_epsilon_n_A*d_epsilon_n_A)*cos(E));
|
|
||||||
d_satvel_Zo = a/(1-d_epsilon_n_A*cos(E))*(0);
|
|
||||||
|
|
||||||
// Determine orientation vectors of orbital coordinate system in ECEF system
|
|
||||||
e1_x = cos(omega)*cos(lambda) - sin(omega)*sin(lambda);
|
|
||||||
e1_y = cos(omega)*sin(lambda) + sin(omega)*cos(lambda)*cos(i);
|
|
||||||
e1_z = sin(omega)*sin(i);
|
|
||||||
|
|
||||||
e2_x = -sin(omega)*cos(lambda) - sin(omega)*sin(lambda)*cos(i);
|
|
||||||
e2_y = -sin(omega)*sin(lambda) + cos(omega)*cos(lambda)*cos(i);
|
|
||||||
e2_z = cos(omega)*sin(i);
|
|
||||||
|
|
||||||
// Convert position from orbital to ECEF system
|
|
||||||
d_satpos_X = d_satpos_Xo*e1_x + d_satpos_Xo*e2_x;
|
|
||||||
d_satpos_Y = d_satpos_Yo*e1_z + d_satpos_Yo*e2_y;
|
|
||||||
d_satpos_Z = d_satpos_Zo*e1_z + d_satpos_Zo*e2_z;
|
|
||||||
|
|
||||||
// Convert position from orbital to ECEF system
|
|
||||||
d_satvel_X = d_satvel_Xo*e1_x + d_satvel_Xo*e2_x + GLONASS_OMEGA_EARTH_DOT*d_satpos_Y;
|
|
||||||
d_satvel_Y = d_satvel_Yo*e1_z + d_satvel_Yo*e2_y - GLONASS_OMEGA_EARTH_DOT*d_satpos_X;
|
|
||||||
d_satvel_Z = d_satvel_Zo*e1_z + d_satvel_Zo*e2_z;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -49,13 +49,13 @@ class Glonass_Gnav_Almanac
|
|||||||
public:
|
public:
|
||||||
double d_n_A; //!< Conventional number of satellite within GLONASS space segment [dimensionless]
|
double d_n_A; //!< Conventional number of satellite within GLONASS space segment [dimensionless]
|
||||||
double d_H_n_A; //!< Carrier frequency number of navigation RF signal transmitted by d_nA satellite as table 4.10 (0-31) [dimensionless]
|
double d_H_n_A; //!< Carrier frequency number of navigation RF signal transmitted by d_nA satellite as table 4.10 (0-31) [dimensionless]
|
||||||
double d_lambda_n_A; //!< Longitude of the first (within the d_NA day) ascending node of d_nA [semi-circles]
|
double d_lambda_n_A; //!< Longitude of the first (within the d_NA day) ascending node of d_nA [radians]
|
||||||
double d_t_lambda_n_A; //!< Time of first ascending node passage [s]
|
double d_t_lambda_n_A; //!< Time of first ascending node passage [s]
|
||||||
double d_Delta_i_n_A; //!< Correction of the mean value of inclination of d_n_A satellite at instant t_lambda_n_A [semi-circles]
|
double d_Delta_i_n_A; //!< Correction of the mean value of inclination of d_n_A satellite at instant t_lambda_n_A [radians]
|
||||||
double d_Delta_T_n_A; //!< Correction to the mean value of Draconian period of d_n_A satellite at instant t_lambda_n_A[s / orbital period]
|
double d_Delta_T_n_A; //!< Correction to the mean value of Draconian period of d_n_A satellite at instant t_lambda_n_A [s / orbital period]
|
||||||
double d_Delta_T_n_A_dot; //!< Rate of change of Draconian period of d_n_A satellite at instant t_lambda_n_A [s / orbital period^2]
|
double d_Delta_T_n_A_dot; //!< Rate of change of Draconian period of d_n_A satellite at instant t_lambda_n_A [s / orbital period^2]
|
||||||
double d_epsilon_n_A; //!< Eccentricity of d_n_A satellite at instant t_lambda_n_A [dimensionless]
|
double d_epsilon_n_A; //!< Eccentricity of d_n_A satellite at instant t_lambda_n_A [dimensionless]
|
||||||
double d_omega_n_A; //!< Argument of preigree of d_n_A satellite at instant t_lambdan_A [semi-circles]
|
double d_omega_n_A; //!< Argument of perigee of d_n_A satellite at instant t_lambdan_A [radians]
|
||||||
double d_M_n_A; //!< Type of satellite n_A [dimensionless]
|
double d_M_n_A; //!< Type of satellite n_A [dimensionless]
|
||||||
double d_KP; //!< Notification on forthcoming leap second correction of UTC [dimensionless]
|
double d_KP; //!< Notification on forthcoming leap second correction of UTC [dimensionless]
|
||||||
double d_tau_n_A; //!< Coarse value of d_n_A satellite time correction to GLONASS time at instant t_lambdan_A[s]
|
double d_tau_n_A; //!< Coarse value of d_n_A satellite time correction to GLONASS time at instant t_lambdan_A[s]
|
||||||
@ -67,24 +67,6 @@ public:
|
|||||||
unsigned int i_satellite_PRN; //!< SV PRN Number, equivalent to slot number for compatibility with GPS
|
unsigned int i_satellite_PRN; //!< SV PRN Number, equivalent to slot number for compatibility with GPS
|
||||||
unsigned int i_satellite_slot_number; //!< SV Slot Number
|
unsigned int i_satellite_slot_number; //!< SV Slot Number
|
||||||
|
|
||||||
// satellite positions
|
|
||||||
double d_satpos_Xo; //!< Earth-fixed coordinate x of the satellite in PZ-90.02 coordinate system [km].
|
|
||||||
double d_satpos_Yo; //!< Earth-fixed coordinate y of the satellite in PZ-90.02 coordinate system [km]
|
|
||||||
double d_satpos_Zo; //!< Earth-fixed coordinate z of the satellite in PZ-90.02 coordinate system [km]
|
|
||||||
// Satellite velocity
|
|
||||||
double d_satvel_Xo; //!< Earth-fixed velocity coordinate x of the satellite in PZ-90.02 coordinate system [km/s]
|
|
||||||
double d_satvel_Yo; //!< Earth-fixed velocity coordinate y of the satellite in PZ-90.02 coordinate system [km/s]
|
|
||||||
double d_satvel_Zo; //!< Earth-fixed velocity coordinate z of the satellite in PZ-90.02 coordinate system [km/s]
|
|
||||||
|
|
||||||
// satellite positions
|
|
||||||
double d_satpos_X; //!< Earth-fixed coordinate x of the satellite in PZ-90.02 coordinate system [km].
|
|
||||||
double d_satpos_Y; //!< Earth-fixed coordinate y of the satellite in PZ-90.02 coordinate system [km]
|
|
||||||
double d_satpos_Z; //!< Earth-fixed coordinate z of the satellite in PZ-90.02 coordinate system [km]
|
|
||||||
// Satellite velocity
|
|
||||||
double d_satvel_X; //!< Earth-fixed velocity coordinate x of the satellite in PZ-90.02 coordinate system [km/s]
|
|
||||||
double d_satvel_Y; //!< Earth-fixed velocity coordinate y of the satellite in PZ-90.02 coordinate system [km/s]
|
|
||||||
double d_satvel_Z; //!< Earth-fixed velocity coordinate z of the satellite in PZ-90.02 coordinate system [km/s]
|
|
||||||
|
|
||||||
template<class Archive>
|
template<class Archive>
|
||||||
/*!
|
/*!
|
||||||
* \brief Serialize is a boost standard method to be called by the boost XML serialization. Here is used to save the almanac data on disk file.
|
* \brief Serialize is a boost standard method to be called by the boost XML serialization. Here is used to save the almanac data on disk file.
|
||||||
@ -113,7 +95,6 @@ public:
|
|||||||
archive & make_nvp("d_l_n", d_l_n);
|
archive & make_nvp("d_l_n", d_l_n);
|
||||||
}
|
}
|
||||||
|
|
||||||
void satellite_position(double N_A, double N_i, double t_i);
|
|
||||||
/*!
|
/*!
|
||||||
* Default constructor
|
* Default constructor
|
||||||
*/
|
*/
|
||||||
|
@ -43,9 +43,8 @@
|
|||||||
void Glonass_Gnav_Navigation_Message::reset()
|
void Glonass_Gnav_Navigation_Message::reset()
|
||||||
{
|
{
|
||||||
//!< Satellite Identification
|
//!< Satellite Identification
|
||||||
i_channel_ID = 0; //!< Channel ID assigned by the receiver
|
i_alm_satellite_slot_number = 0; //!< SV Orbit Slot Number
|
||||||
i_satellite_freq_channel = 0; //!< SV Frequency Slot Number
|
flag_update_slot_number = false;
|
||||||
i_satellite_slot_number = 0; //!< SV Orbit Slot Number
|
|
||||||
|
|
||||||
//!< Ephmeris Flags
|
//!< Ephmeris Flags
|
||||||
flag_all_ephemeris = false;
|
flag_all_ephemeris = false;
|
||||||
@ -74,12 +73,8 @@ void Glonass_Gnav_Navigation_Message::reset()
|
|||||||
|
|
||||||
//broadcast orbit 1
|
//broadcast orbit 1
|
||||||
flag_TOW_set = false;
|
flag_TOW_set = false;
|
||||||
|
flag_TOW_new = false;
|
||||||
d_TOW = 0.0; //!< Time of GPS Week of the ephemeris set (taken from subframes TOW) [s]
|
d_TOW = 0.0; //!< Time of GPS Week of the ephemeris set (taken from subframes TOW) [s]
|
||||||
d_TOW_F1 = 0.0; //!< Time of GPS Week from HOW word of Subframe 1 [s]
|
|
||||||
d_TOW_F2 = 0.0; //!< Time of GPS Week from HOW word of Subframe 2 [s]
|
|
||||||
d_TOW_F3 = 0.0; //!< Time of GPS Week from HOW word of Subframe 3 [s]
|
|
||||||
d_TOW_F4 = 0.0; //!< Time of GPS Week from HOW word of Subframe 4 [s]
|
|
||||||
d_TOW_F5 = 0.0; //!< Time of GPS Week from HOW word of Subframe 5 [s]
|
|
||||||
|
|
||||||
flag_CRC_test = false;
|
flag_CRC_test = false;
|
||||||
d_frame_ID = 0;
|
d_frame_ID = 0;
|
||||||
@ -90,6 +85,11 @@ void Glonass_Gnav_Navigation_Message::reset()
|
|||||||
d_dtr = 0.0;
|
d_dtr = 0.0;
|
||||||
d_satClkDrift = 0.0;
|
d_satClkDrift = 0.0;
|
||||||
|
|
||||||
|
// Data update information
|
||||||
|
d_previous_tb = 0.0;
|
||||||
|
for(unsigned int i = 0; i < GLONASS_L1_CA_NBR_SATS; i++)
|
||||||
|
d_previous_Na[i] = 0.0;
|
||||||
|
|
||||||
|
|
||||||
std::map<int,std::string> satelliteBlock; //!< Map that stores to which block the PRN belongs http://www.navcen.uscg.gov/?Do=constellationStatus
|
std::map<int,std::string> satelliteBlock; //!< Map that stores to which block the PRN belongs http://www.navcen.uscg.gov/?Do=constellationStatus
|
||||||
|
|
||||||
@ -134,7 +134,7 @@ bool Glonass_Gnav_Navigation_Message::CRC_test(std::bitset<GLONASS_GNAV_STRING_B
|
|||||||
sum_bits = 0;
|
sum_bits = 0;
|
||||||
for(int i = 0; i < static_cast<int>(GLONASS_GNAV_CRC_I_INDEX.size()); i++)
|
for(int i = 0; i < static_cast<int>(GLONASS_GNAV_CRC_I_INDEX.size()); i++)
|
||||||
{
|
{
|
||||||
sum_bits += string_bits[GLONASS_GNAV_CRC_I_INDEX[i]];
|
sum_bits += string_bits[GLONASS_GNAV_CRC_I_INDEX[i]-1];
|
||||||
}
|
}
|
||||||
C1 = string_bits[0]^(sum_bits%2);
|
C1 = string_bits[0]^(sum_bits%2);
|
||||||
|
|
||||||
@ -142,7 +142,7 @@ bool Glonass_Gnav_Navigation_Message::CRC_test(std::bitset<GLONASS_GNAV_STRING_B
|
|||||||
sum_bits = 0;
|
sum_bits = 0;
|
||||||
for(int j = 0; j < static_cast<int>(GLONASS_GNAV_CRC_J_INDEX.size()); j++)
|
for(int j = 0; j < static_cast<int>(GLONASS_GNAV_CRC_J_INDEX.size()); j++)
|
||||||
{
|
{
|
||||||
sum_bits += string_bits[GLONASS_GNAV_CRC_J_INDEX[j]];
|
sum_bits += string_bits[GLONASS_GNAV_CRC_J_INDEX[j]-1];
|
||||||
}
|
}
|
||||||
C2 = (string_bits[1])^(sum_bits%2);
|
C2 = (string_bits[1])^(sum_bits%2);
|
||||||
|
|
||||||
@ -150,7 +150,7 @@ bool Glonass_Gnav_Navigation_Message::CRC_test(std::bitset<GLONASS_GNAV_STRING_B
|
|||||||
sum_bits = 0;
|
sum_bits = 0;
|
||||||
for(int k = 0; k < static_cast<int>(GLONASS_GNAV_CRC_K_INDEX.size()); k++)
|
for(int k = 0; k < static_cast<int>(GLONASS_GNAV_CRC_K_INDEX.size()); k++)
|
||||||
{
|
{
|
||||||
sum_bits += string_bits[GLONASS_GNAV_CRC_K_INDEX[k]];
|
sum_bits += string_bits[GLONASS_GNAV_CRC_K_INDEX[k]-1];
|
||||||
}
|
}
|
||||||
C3 = string_bits[2]^(sum_bits%2);
|
C3 = string_bits[2]^(sum_bits%2);
|
||||||
|
|
||||||
@ -158,7 +158,7 @@ bool Glonass_Gnav_Navigation_Message::CRC_test(std::bitset<GLONASS_GNAV_STRING_B
|
|||||||
sum_bits = 0;
|
sum_bits = 0;
|
||||||
for(int l = 0; l < static_cast<int>(GLONASS_GNAV_CRC_L_INDEX.size()); l++)
|
for(int l = 0; l < static_cast<int>(GLONASS_GNAV_CRC_L_INDEX.size()); l++)
|
||||||
{
|
{
|
||||||
sum_bits += string_bits[GLONASS_GNAV_CRC_L_INDEX[l]];
|
sum_bits += string_bits[GLONASS_GNAV_CRC_L_INDEX[l]-1];
|
||||||
}
|
}
|
||||||
C4 = string_bits[3]^(sum_bits%2);
|
C4 = string_bits[3]^(sum_bits%2);
|
||||||
|
|
||||||
@ -166,7 +166,7 @@ bool Glonass_Gnav_Navigation_Message::CRC_test(std::bitset<GLONASS_GNAV_STRING_B
|
|||||||
sum_bits = 0;
|
sum_bits = 0;
|
||||||
for(int m = 0; m < static_cast<int>(GLONASS_GNAV_CRC_M_INDEX.size()); m++)
|
for(int m = 0; m < static_cast<int>(GLONASS_GNAV_CRC_M_INDEX.size()); m++)
|
||||||
{
|
{
|
||||||
sum_bits += string_bits[GLONASS_GNAV_CRC_M_INDEX[m]];
|
sum_bits += string_bits[GLONASS_GNAV_CRC_M_INDEX[m]-1];
|
||||||
}
|
}
|
||||||
C5 = string_bits[4]^(sum_bits%2);
|
C5 = string_bits[4]^(sum_bits%2);
|
||||||
|
|
||||||
@ -174,7 +174,7 @@ bool Glonass_Gnav_Navigation_Message::CRC_test(std::bitset<GLONASS_GNAV_STRING_B
|
|||||||
sum_bits = 0;
|
sum_bits = 0;
|
||||||
for(int n = 0; n < static_cast<int>(GLONASS_GNAV_CRC_N_INDEX.size()); n++)
|
for(int n = 0; n < static_cast<int>(GLONASS_GNAV_CRC_N_INDEX.size()); n++)
|
||||||
{
|
{
|
||||||
sum_bits += string_bits[GLONASS_GNAV_CRC_N_INDEX[n]];
|
sum_bits += string_bits[GLONASS_GNAV_CRC_N_INDEX[n]-1];
|
||||||
}
|
}
|
||||||
C6 = string_bits[5]^(sum_bits%2);
|
C6 = string_bits[5]^(sum_bits%2);
|
||||||
|
|
||||||
@ -182,7 +182,7 @@ bool Glonass_Gnav_Navigation_Message::CRC_test(std::bitset<GLONASS_GNAV_STRING_B
|
|||||||
sum_bits = 0;
|
sum_bits = 0;
|
||||||
for(int p = 0; p < static_cast<int>(GLONASS_GNAV_CRC_P_INDEX.size()); p++)
|
for(int p = 0; p < static_cast<int>(GLONASS_GNAV_CRC_P_INDEX.size()); p++)
|
||||||
{
|
{
|
||||||
sum_bits += string_bits[GLONASS_GNAV_CRC_P_INDEX[p]];
|
sum_bits += string_bits[GLONASS_GNAV_CRC_P_INDEX[p]-1];
|
||||||
}
|
}
|
||||||
C7 = string_bits[6]^(sum_bits%2);
|
C7 = string_bits[6]^(sum_bits%2);
|
||||||
|
|
||||||
@ -191,7 +191,7 @@ bool Glonass_Gnav_Navigation_Message::CRC_test(std::bitset<GLONASS_GNAV_STRING_B
|
|||||||
sum_hamming = 0;
|
sum_hamming = 0;
|
||||||
for(int q = 0; q < static_cast<int>(GLONASS_GNAV_CRC_Q_INDEX.size()); q++)
|
for(int q = 0; q < static_cast<int>(GLONASS_GNAV_CRC_Q_INDEX.size()); q++)
|
||||||
{
|
{
|
||||||
sum_bits += string_bits[GLONASS_GNAV_CRC_Q_INDEX[q]];
|
sum_bits += string_bits[GLONASS_GNAV_CRC_Q_INDEX[q]-1];
|
||||||
}
|
}
|
||||||
for(int q = 0; q < 8; q++)
|
for(int q = 0; q < 8; q++)
|
||||||
{
|
{
|
||||||
@ -200,17 +200,18 @@ bool Glonass_Gnav_Navigation_Message::CRC_test(std::bitset<GLONASS_GNAV_STRING_B
|
|||||||
C_Sigma = (sum_hamming%2)^(sum_bits%2);
|
C_Sigma = (sum_hamming%2)^(sum_bits%2);
|
||||||
|
|
||||||
//!< Verification of the data
|
//!< Verification of the data
|
||||||
// All of the checksums are equal to zero
|
// (a-i) All checksums (C1,...,C7 and C_Sigma) are equal to zero
|
||||||
if((C1 & C2 & C3 & C4 & C5 & C6 & C7 & C_Sigma) == 0 )
|
if((C1 + C2 + C3 + C4 + C5 + C6 + C7 + C_Sigma) == 0 )
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
// only one of the checksums (C1,...,C7) is equal to zero but C_Sigma = 1
|
// (a-ii) Only one of the checksums (C1,...,C7) is equal to zero but C_Sigma = 1
|
||||||
else if(C_Sigma == 1 && C1+C2+C3+C4+C5+C6+C7 == 6)
|
else if(C_Sigma == 1 && C1+C2+C3+C4+C5+C6+C7 == 6)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
// All other conditions are assumed errors. TODO: Add correction for case B
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -307,30 +308,82 @@ unsigned int Glonass_Gnav_Navigation_Message::get_frame_number(unsigned int sate
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//TODO Find print statement and make it an error
|
LOG(WARNING) << "GLONASS GNAV: Invalid Satellite Slot Number";
|
||||||
frame_ID = 0;
|
frame_ID = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return frame_ID;
|
return frame_ID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double Glonass_Gnav_Navigation_Message::get_WN()
|
||||||
|
{
|
||||||
|
double WN = 0.0;
|
||||||
|
double days = 0.0;
|
||||||
|
double total_sec = 0.0;
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
boost::gregorian::date gps_epoch { 1980, 1, 6 };
|
||||||
|
// Map to UTC
|
||||||
|
boost::gregorian::date glo_date(gnav_ephemeris.d_yr, 1, 1);
|
||||||
|
boost::gregorian::days d2(gnav_ephemeris.d_N_T);
|
||||||
|
glo_date = glo_date + d2;
|
||||||
|
|
||||||
|
|
||||||
|
boost::posix_time::time_duration t(-6, 0, 0);
|
||||||
|
boost::posix_time::ptime glo_time(glo_date, t);
|
||||||
|
boost::gregorian::date utc_date = glo_time.date();
|
||||||
|
|
||||||
|
days = static_cast<double>((utc_date - gps_epoch).days());
|
||||||
|
total_sec = days*86400;
|
||||||
|
|
||||||
|
for (i = 0; GLONASS_LEAP_SECONDS[i][0]>0; i++)
|
||||||
|
{
|
||||||
|
if (GLONASS_LEAP_SECONDS[i][0] == gnav_ephemeris.d_yr)
|
||||||
|
{
|
||||||
|
// We add the leap second when going from utc to gpst
|
||||||
|
total_sec += GLONASS_LEAP_SECONDS[i][6];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
WN = floor(total_sec/604800);
|
||||||
|
|
||||||
|
return WN;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
double Glonass_Gnav_Navigation_Message::get_TOW()
|
double Glonass_Gnav_Navigation_Message::get_TOW()
|
||||||
{
|
{
|
||||||
|
double TOD = 0.0;
|
||||||
double TOW = 0.0;
|
double TOW = 0.0;
|
||||||
|
double dayofweek = 0.0;
|
||||||
double utcsu2utc = 3*3600;
|
double utcsu2utc = 3*3600;
|
||||||
double glot2utcsu = 3*3600;
|
double glot2utcsu = 3*3600;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
TOW = gnav_ephemeris.d_t_k + glot2utcsu + utcsu2utc + gnav_utc_model.d_tau_c + gnav_utc_model.d_tau_gps;
|
// tk is relative to UTC(SU) + 3.00 hrs, so we need to convert to utc and add corrections
|
||||||
|
// tk plus 10 sec is the true tod since get_TOW is called when in str5
|
||||||
|
TOD = (gnav_ephemeris.d_t_k + 10) - glot2utcsu - utcsu2utc + gnav_utc_model.d_tau_c + gnav_utc_model.d_tau_gps;
|
||||||
|
|
||||||
|
|
||||||
|
boost::gregorian::date glo_date(gnav_ephemeris.d_yr, 1, 1);
|
||||||
|
boost::gregorian::days d2(gnav_ephemeris.d_N_T);
|
||||||
|
glo_date = glo_date + d2;
|
||||||
|
|
||||||
|
dayofweek = static_cast<double>(glo_date.day_of_week());
|
||||||
|
TOW = TOD + dayofweek*86400;
|
||||||
|
|
||||||
for (i = 0; GLONASS_LEAP_SECONDS[i][0]>0; i++)
|
for (i = 0; GLONASS_LEAP_SECONDS[i][0]>0; i++)
|
||||||
{
|
{
|
||||||
if (GLONASS_LEAP_SECONDS[i][0] == gnav_ephemeris.d_yr)
|
if (GLONASS_LEAP_SECONDS[i][0] == gnav_ephemeris.d_yr)
|
||||||
{
|
{
|
||||||
TOW -= GLONASS_LEAP_SECONDS[i][6];
|
// We add the leap second when going from utc to gpst
|
||||||
|
TOW += GLONASS_LEAP_SECONDS[i][6];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Compute the arithmetic modules to wrap around range
|
||||||
|
TOW = TOW - 604800*floor(TOW/604800);
|
||||||
|
|
||||||
return TOW;
|
return TOW;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -341,21 +394,24 @@ int Glonass_Gnav_Navigation_Message::string_decoder(std::string frame_string)
|
|||||||
d_string_ID = 0;
|
d_string_ID = 0;
|
||||||
d_frame_ID = 0;
|
d_frame_ID = 0;
|
||||||
|
|
||||||
// UNPACK BYTES TO BITS AND REMOVE THE CRC REDUNDANCE
|
// Unpack bytes to bits
|
||||||
std::bitset<GLONASS_GNAV_STRING_BITS> string_bits = std::bitset<GLONASS_GNAV_STRING_BITS>((frame_string));
|
std::bitset<GLONASS_GNAV_STRING_BITS> string_bits (frame_string);
|
||||||
d_string_ID = static_cast<unsigned int>(read_navigation_unsigned(string_bits, STRING_ID));
|
|
||||||
|
|
||||||
|
// Perform data verification and exit code if error in bit sequence
|
||||||
flag_CRC_test = CRC_test(string_bits);
|
flag_CRC_test = CRC_test(string_bits);
|
||||||
|
if(flag_CRC_test == false)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
|
||||||
// Decode all 15 string messages
|
// Decode all 15 string messages
|
||||||
switch (d_string_ID)
|
d_string_ID = static_cast<unsigned int>(read_navigation_unsigned(string_bits, STRING_ID));
|
||||||
{
|
switch (d_string_ID) {
|
||||||
case 1:
|
case 1:
|
||||||
//--- It is string 1 -----------------------------------------------
|
//--- It is string 1 -----------------------------------------------
|
||||||
gnav_ephemeris.d_P_1 = (static_cast<double>(read_navigation_unsigned(string_bits, P1)) + 1)*15;
|
gnav_ephemeris.d_P_1 = (static_cast<double>(read_navigation_unsigned(string_bits, P1)) + 1) * 15;
|
||||||
gnav_ephemeris.d_t_k = static_cast<double>(read_navigation_unsigned(string_bits, T_K_HR)) * 3600 +
|
gnav_ephemeris.d_t_k = static_cast<double>(read_navigation_unsigned(string_bits, T_K_HR)) * 3600 +
|
||||||
static_cast<double>(read_navigation_unsigned(string_bits, T_K_MIN)) * 60 +
|
static_cast<double>(read_navigation_unsigned(string_bits, T_K_MIN)) * 60 +
|
||||||
static_cast<double>(read_navigation_unsigned(string_bits, T_K_SEC)) * 30;
|
static_cast<double>(read_navigation_unsigned(string_bits, T_K_SEC)) * 30;
|
||||||
gnav_ephemeris.d_VXn = static_cast<double>(read_navigation_signed(string_bits, X_N_DOT)) * TWO_N20;
|
gnav_ephemeris.d_VXn = static_cast<double>(read_navigation_signed(string_bits, X_N_DOT)) * TWO_N20;
|
||||||
gnav_ephemeris.d_AXn = static_cast<double>(read_navigation_signed(string_bits, X_N_DOT_DOT)) * TWO_N30;
|
gnav_ephemeris.d_AXn = static_cast<double>(read_navigation_signed(string_bits, X_N_DOT_DOT)) * TWO_N30;
|
||||||
gnav_ephemeris.d_Xn = static_cast<double>(read_navigation_signed(string_bits, X_N)) * TWO_N11;
|
gnav_ephemeris.d_Xn = static_cast<double>(read_navigation_signed(string_bits, X_N)) * TWO_N11;
|
||||||
@ -370,12 +426,12 @@ int Glonass_Gnav_Navigation_Message::string_decoder(std::string frame_string)
|
|||||||
{
|
{
|
||||||
gnav_ephemeris.d_B_n = static_cast<double>(read_navigation_unsigned(string_bits, B_N));
|
gnav_ephemeris.d_B_n = static_cast<double>(read_navigation_unsigned(string_bits, B_N));
|
||||||
gnav_ephemeris.d_P_2 = static_cast<bool>(read_navigation_bool(string_bits, P2));
|
gnav_ephemeris.d_P_2 = static_cast<bool>(read_navigation_bool(string_bits, P2));
|
||||||
gnav_ephemeris.d_t_b = static_cast<double>(read_navigation_unsigned(string_bits, T_B))*gnav_ephemeris.d_P_1*60;
|
gnav_ephemeris.d_t_b = static_cast<double>(read_navigation_unsigned(string_bits, T_B)) * gnav_ephemeris.d_P_1 * 60;
|
||||||
gnav_ephemeris.d_VYn = static_cast<double>(read_navigation_signed(string_bits, Y_N_DOT))* TWO_N20;
|
gnav_ephemeris.d_VYn = static_cast<double>(read_navigation_signed(string_bits, Y_N_DOT)) * TWO_N20;
|
||||||
gnav_ephemeris.d_AYn = static_cast<double>(read_navigation_signed(string_bits, Y_N_DOT_DOT)) * TWO_N30;
|
gnav_ephemeris.d_AYn = static_cast<double>(read_navigation_signed(string_bits, Y_N_DOT_DOT)) * TWO_N30;
|
||||||
gnav_ephemeris.d_Yn = static_cast<double>(read_navigation_signed(string_bits, Y_N)) * TWO_N11;
|
gnav_ephemeris.d_Yn = static_cast<double>(read_navigation_signed(string_bits, Y_N)) * TWO_N11;
|
||||||
|
|
||||||
gnav_ephemeris.d_iode = read_navigation_unsigned(string_bits, T_B);
|
gnav_ephemeris.d_iode = read_navigation_unsigned(string_bits, T_B);
|
||||||
flag_ephemeris_str_2 = true;
|
flag_ephemeris_str_2 = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -383,92 +439,108 @@ int Glonass_Gnav_Navigation_Message::string_decoder(std::string frame_string)
|
|||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
// --- It is string 3 ----------------------------------------------
|
// --- It is string 3 ----------------------------------------------
|
||||||
gnav_ephemeris.d_P_3 = static_cast<bool>(read_navigation_bool(string_bits, P3));
|
if (flag_ephemeris_str_2 == true)
|
||||||
gnav_ephemeris.d_gamma_n = static_cast<double>(read_navigation_signed(string_bits, GAMMA_N)) * TWO_N40;
|
{
|
||||||
gnav_ephemeris.d_P = static_cast<double>(read_navigation_unsigned(string_bits, P));
|
gnav_ephemeris.d_P_3 = static_cast<bool>(read_navigation_bool(string_bits, P3));
|
||||||
gnav_ephemeris.d_l3rd_n = static_cast<bool>(read_navigation_bool(string_bits, EPH_L_N));
|
gnav_ephemeris.d_gamma_n = static_cast<double>(read_navigation_signed(string_bits, GAMMA_N)) * TWO_N40;
|
||||||
gnav_ephemeris.d_VZn = static_cast<double>(read_navigation_signed(string_bits, Z_N_DOT)) * TWO_N20;
|
gnav_ephemeris.d_P = static_cast<double>(read_navigation_unsigned(string_bits, P));
|
||||||
gnav_ephemeris.d_AZn = static_cast<double>(read_navigation_signed(string_bits, Z_N_DOT_DOT)) * TWO_N30;
|
gnav_ephemeris.d_l3rd_n = static_cast<bool>(read_navigation_bool(string_bits, EPH_L_N));
|
||||||
gnav_ephemeris.d_Zn = static_cast<double>(read_navigation_signed(string_bits, Z_N)) * TWO_N11;
|
gnav_ephemeris.d_VZn = static_cast<double>(read_navigation_signed(string_bits, Z_N_DOT)) * TWO_N20;
|
||||||
|
gnav_ephemeris.d_AZn = static_cast<double>(read_navigation_signed(string_bits, Z_N_DOT_DOT)) * TWO_N30;
|
||||||
|
gnav_ephemeris.d_Zn = static_cast<double>(read_navigation_signed(string_bits, Z_N)) * TWO_N11;
|
||||||
|
|
||||||
flag_ephemeris_str_3 = true;
|
flag_ephemeris_str_3 = true;
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 4:
|
case 4:
|
||||||
// --- It is string 4 ----------------------------------------------
|
// --- It is string 4 ----------------------------------------------
|
||||||
gnav_ephemeris.d_tau_n = static_cast<double>(read_navigation_signed(string_bits, TAU_N)) * TWO_N30;
|
if (flag_ephemeris_str_3 == true)
|
||||||
gnav_ephemeris.d_Delta_tau_n = static_cast<double>(read_navigation_signed(string_bits, DELTA_TAU_N)) * TWO_N30;
|
{
|
||||||
gnav_ephemeris.d_E_n = static_cast<double>(read_navigation_unsigned(string_bits, E_N));
|
gnav_ephemeris.d_tau_n = static_cast<double>(read_navigation_signed(string_bits, TAU_N)) * TWO_N30;
|
||||||
gnav_ephemeris.d_P_4 = static_cast<bool>(read_navigation_bool(string_bits, P4));
|
gnav_ephemeris.d_Delta_tau_n = static_cast<double>(read_navigation_signed(string_bits, DELTA_TAU_N)) * TWO_N30;
|
||||||
gnav_ephemeris.d_F_T = static_cast<double>(read_navigation_unsigned(string_bits, F_T));
|
gnav_ephemeris.d_E_n = static_cast<double>(read_navigation_unsigned(string_bits, E_N));
|
||||||
gnav_ephemeris.d_N_T = static_cast<double>(read_navigation_unsigned(string_bits, N_T));
|
gnav_ephemeris.d_P_4 = static_cast<bool>(read_navigation_bool(string_bits, P4));
|
||||||
gnav_ephemeris.d_n = static_cast<double>(read_navigation_unsigned(string_bits, N));
|
gnav_ephemeris.d_F_T = static_cast<double>(read_navigation_unsigned(string_bits, F_T));
|
||||||
gnav_ephemeris.d_M = static_cast<double>(read_navigation_unsigned(string_bits, M));
|
gnav_ephemeris.d_N_T = static_cast<double>(read_navigation_unsigned(string_bits, N_T));
|
||||||
|
gnav_ephemeris.d_n = static_cast<double>(read_navigation_unsigned(string_bits, N));
|
||||||
|
gnav_ephemeris.d_M = static_cast<double>(read_navigation_unsigned(string_bits, M));
|
||||||
|
|
||||||
// Fill in ephemeris deliverables in the code
|
// Fill in ephemeris deliverables in the code
|
||||||
gnav_ephemeris.i_satellite_slot_number = gnav_ephemeris.d_n;
|
flag_update_slot_number = true;
|
||||||
gnav_ephemeris.i_satellite_PRN = gnav_ephemeris.d_n;
|
gnav_ephemeris.i_satellite_slot_number = static_cast<unsigned int>(gnav_ephemeris.d_n);
|
||||||
|
gnav_ephemeris.i_satellite_PRN = static_cast<unsigned int>(gnav_ephemeris.d_n);
|
||||||
|
|
||||||
flag_ephemeris_str_4 = true;
|
flag_ephemeris_str_4 = true;
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 5:
|
case 5:
|
||||||
// --- It is string 5 ----------------------------------------------
|
// --- It is string 5 ----------------------------------------------
|
||||||
gnav_utc_model.d_N_A = static_cast<double>(read_navigation_unsigned(string_bits, N_A));
|
if (flag_ephemeris_str_4 == true)
|
||||||
gnav_utc_model.d_tau_c = static_cast<double>(read_navigation_signed(string_bits, TAU_C)) * TWO_N31;
|
|
||||||
gnav_utc_model.d_N_4 = static_cast<double>(read_navigation_unsigned(string_bits, N_4));
|
|
||||||
gnav_utc_model.d_tau_gps = static_cast<double>(read_navigation_signed(string_bits, TAU_GPS)) * TWO_N30;
|
|
||||||
gnav_ephemeris.d_l5th_n = static_cast<bool>(read_navigation_bool(string_bits, ALM_L_N));
|
|
||||||
|
|
||||||
flag_utc_model_str_5 = true;
|
|
||||||
// Compute Year and DoY based on Algorithm A3.11 of GLONASS ICD
|
|
||||||
if(flag_ephemeris_str_4 == true)
|
|
||||||
{
|
{
|
||||||
//Current year number J in the four-year interval is calculated:
|
gnav_utc_model.d_N_A = static_cast<double>(read_navigation_unsigned(string_bits, N_A));
|
||||||
if(gnav_ephemeris.d_N_T >= 1 && gnav_ephemeris.d_N_T <= 366)
|
gnav_utc_model.d_tau_c = static_cast<double>(read_navigation_signed(string_bits, TAU_C)) * TWO_N31;
|
||||||
{
|
gnav_utc_model.d_N_4 = static_cast<double>(read_navigation_unsigned(string_bits, N_4));
|
||||||
J = 1;
|
gnav_utc_model.d_tau_gps = static_cast<double>(read_navigation_signed(string_bits, TAU_GPS)) * TWO_N30;
|
||||||
}
|
gnav_ephemeris.d_l5th_n = static_cast<bool>(read_navigation_bool(string_bits, ALM_L_N));
|
||||||
else if ( gnav_ephemeris.d_N_T >= 367 && gnav_ephemeris.d_N_T <= 731)
|
|
||||||
{
|
flag_utc_model_str_5 = true;
|
||||||
J = 2;
|
|
||||||
}
|
// Compute Year and DoY based on Algorithm A3.11 of GLONASS ICD
|
||||||
else if (gnav_ephemeris.d_N_T >= 732 && gnav_ephemeris.d_N_T <= 1096)
|
// 1). Current year number J in the four-year interval is calculated
|
||||||
{
|
if (gnav_ephemeris.d_N_T >= 1 && gnav_ephemeris.d_N_T <= 366)
|
||||||
J = 3;
|
{
|
||||||
}
|
J = 1;
|
||||||
|
}
|
||||||
|
else if (gnav_ephemeris.d_N_T >= 367 && gnav_ephemeris.d_N_T <= 731)
|
||||||
|
{
|
||||||
|
J = 2;
|
||||||
|
}
|
||||||
|
else if (gnav_ephemeris.d_N_T >= 732 && gnav_ephemeris.d_N_T <= 1096)
|
||||||
|
{
|
||||||
|
J = 3;
|
||||||
|
}
|
||||||
else if (gnav_ephemeris.d_N_T >= 1097 && gnav_ephemeris.d_N_T <= 1461)
|
else if (gnav_ephemeris.d_N_T >= 1097 && gnav_ephemeris.d_N_T <= 1461)
|
||||||
{
|
{
|
||||||
J = 4;
|
J = 4;
|
||||||
}
|
}
|
||||||
// 2). Current year in common form is calculated by the following formula:
|
// 2). Current year in common form is calculated by the following formula:
|
||||||
gnav_ephemeris.d_yr = 1996 + 4.0*(gnav_utc_model.d_N_4 - 1.0) + (J - 1.0);
|
gnav_ephemeris.d_yr = 1996 + 4.0 * (gnav_utc_model.d_N_4 - 1.0) + (J - 1.0);
|
||||||
gnav_ephemeris.d_tau_c = gnav_utc_model.d_tau_c;
|
gnav_ephemeris.d_tau_c = gnav_utc_model.d_tau_c;
|
||||||
|
|
||||||
// 3). Set TOW once the year has been defined, it helps with leap second determination
|
// 3). Set TOW once the year has been defined, it helps with leap second determination
|
||||||
if(flag_ephemeris_str_1 == true)
|
if (flag_ephemeris_str_1 == true)
|
||||||
{
|
{
|
||||||
d_TOW = get_TOW();
|
d_TOW = get_TOW();
|
||||||
flag_TOW_set = true;
|
gnav_ephemeris.d_TOW = d_TOW;
|
||||||
}
|
gnav_ephemeris.d_WN = get_WN();
|
||||||
|
flag_TOW_set = true;
|
||||||
|
flag_TOW_new = true;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 6:
|
case 6:
|
||||||
// --- It is string 6 ----------------------------------------------
|
// --- It is string 6 ----------------------------------------------
|
||||||
i_satellite_slot_number = static_cast<unsigned int>(read_navigation_unsigned(string_bits, n_A));
|
i_alm_satellite_slot_number = static_cast<unsigned int>(read_navigation_unsigned(string_bits, n_A));
|
||||||
d_frame_ID = get_frame_number(i_satellite_slot_number);
|
d_frame_ID = get_frame_number(i_alm_satellite_slot_number);
|
||||||
|
// Make sure a valid frame_ID or satellite slot number is returned
|
||||||
|
if(d_frame_ID == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_C_n = static_cast<bool>(read_navigation_bool(string_bits, C_N));
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_C_n = static_cast<bool>(read_navigation_bool(string_bits, C_N));
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_M_n_A = static_cast<double>(read_navigation_unsigned(string_bits, M_N_A));
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_M_n_A = static_cast<double>(read_navigation_unsigned(string_bits, M_N_A));
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_n_A = static_cast<double>(read_navigation_unsigned(string_bits, n_A));
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A = static_cast<double>(read_navigation_unsigned(string_bits, n_A));
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_tau_n_A = static_cast<double>(read_navigation_unsigned(string_bits, TAU_N_A)) * TWO_N18;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_tau_n_A = static_cast<double>(read_navigation_unsigned(string_bits, TAU_N_A)) * TWO_N18;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_lambda_n_A = static_cast<double>(read_navigation_signed(string_bits, LAMBDA_N_A)) * TWO_N20;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_lambda_n_A = static_cast<double>(read_navigation_signed(string_bits, LAMBDA_N_A)) * TWO_N20 * GLONASS_PI;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_Delta_i_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_I_N_A)) * TWO_N20;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_i_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_I_N_A)) * TWO_N20 * GLONASS_PI;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_epsilon_n_A = static_cast<double>(read_navigation_unsigned(string_bits, EPSILON_N_A)) * TWO_N20;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_epsilon_n_A = static_cast<double>(read_navigation_unsigned(string_bits, EPSILON_N_A)) * TWO_N20;
|
||||||
|
|
||||||
flag_almanac_str_6 = true;
|
flag_almanac_str_6 = true;
|
||||||
|
|
||||||
@ -477,43 +549,46 @@ int Glonass_Gnav_Navigation_Message::string_decoder(std::string frame_string)
|
|||||||
case 7:
|
case 7:
|
||||||
// --- It is string 7 ----------------------------------------------
|
// --- It is string 7 ----------------------------------------------
|
||||||
if (flag_almanac_str_6 == true)
|
if (flag_almanac_str_6 == true)
|
||||||
{
|
{
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_omega_n_A = static_cast<double>(read_navigation_signed(string_bits, OMEGA_N_A)) * TWO_N15;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_omega_n_A = static_cast<double>(read_navigation_signed(string_bits, OMEGA_N_A)) * TWO_N15 * GLONASS_PI;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_t_lambda_n_A = static_cast<double>(read_navigation_unsigned(string_bits, T_LAMBDA_N_A)) * TWO_N5;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_t_lambda_n_A = static_cast<double>(read_navigation_unsigned(string_bits, T_LAMBDA_N_A)) * TWO_N5;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_Delta_T_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_N_A)) * TWO_N9;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_T_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_N_A)) * TWO_N9;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_Delta_T_n_A_dot = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_DOT_N_A)) * TWO_N14;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_T_n_A_dot = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_DOT_N_A)) * TWO_N14;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_H_n_A = static_cast<double>(read_navigation_unsigned(string_bits, H_N_A));
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A = static_cast<double>(read_navigation_unsigned(string_bits, H_N_A));
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_l_n = static_cast<bool>(read_navigation_bool(string_bits, ALM_L_N));
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_l_n = static_cast<bool>(read_navigation_bool(string_bits, ALM_L_N));
|
||||||
|
|
||||||
// Set satellite information for redundancy purposes
|
// Set satellite information for redundancy purposes
|
||||||
if(gnav_almanac[i_satellite_slot_number - 1].d_H_n_A > 24)
|
if (gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A > 24)
|
||||||
{
|
{
|
||||||
gnav_almanac[i_satellite_slot_number - 1].i_satellite_freq_channel = gnav_almanac[i_satellite_slot_number - 1].d_H_n_A - 32.0;
|
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_freq_channel = gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A - 32.0;
|
||||||
}
|
}
|
||||||
gnav_almanac[i_satellite_slot_number - 1].i_satellite_slot_number = gnav_almanac[i_satellite_slot_number - 1].d_n_A;
|
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_slot_number = gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].i_satellite_PRN = gnav_almanac[i_satellite_slot_number - 1].d_n_A;
|
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_PRN = gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A;
|
||||||
|
|
||||||
if(i_satellite_slot_number == gnav_ephemeris.i_satellite_slot_number)
|
if (i_alm_satellite_slot_number == gnav_ephemeris.i_satellite_slot_number)
|
||||||
{
|
{
|
||||||
gnav_ephemeris.i_satellite_freq_channel = gnav_almanac[i_satellite_slot_number - 1].i_satellite_freq_channel;
|
gnav_ephemeris.i_satellite_freq_channel = gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_freq_channel;
|
||||||
}
|
}
|
||||||
flag_almanac_str_7 = true;
|
flag_almanac_str_7 = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case 8:
|
case 8:
|
||||||
// --- It is string 8 ----------------------------------------------
|
// --- It is string 8 ----------------------------------------------
|
||||||
i_satellite_slot_number = static_cast<unsigned int>(read_navigation_unsigned(string_bits, n_A));
|
i_alm_satellite_slot_number = static_cast<unsigned int>(read_navigation_unsigned(string_bits, n_A));
|
||||||
d_frame_ID = get_frame_number(i_satellite_slot_number);
|
d_frame_ID = get_frame_number(i_alm_satellite_slot_number);
|
||||||
|
// Make sure a valid frame_ID or satellite slot number is returned
|
||||||
|
if(d_frame_ID == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_C_n = static_cast<bool>(read_navigation_bool(string_bits, C_N));
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_C_n = static_cast<bool>(read_navigation_bool(string_bits, C_N));
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_M_n_A = static_cast<double>(read_navigation_unsigned(string_bits, M_N_A));
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_M_n_A = static_cast<double>(read_navigation_unsigned(string_bits, M_N_A));
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_n_A = static_cast<double>(read_navigation_unsigned(string_bits, n_A));
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A = static_cast<double>(read_navigation_unsigned(string_bits, n_A));
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_tau_n_A = static_cast<double>(read_navigation_unsigned(string_bits, TAU_N_A)) * TWO_N18;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_tau_n_A = static_cast<double>(read_navigation_unsigned(string_bits, TAU_N_A)) * TWO_N18;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_lambda_n_A = static_cast<double>(read_navigation_signed(string_bits, LAMBDA_N_A)) * TWO_N20;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_lambda_n_A = static_cast<double>(read_navigation_signed(string_bits, LAMBDA_N_A)) * TWO_N20 * GLONASS_PI;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_Delta_i_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_I_N_A)) * TWO_N20;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_i_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_I_N_A)) * TWO_N20 * GLONASS_PI;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_epsilon_n_A = static_cast<double>(read_navigation_unsigned(string_bits, EPSILON_N_A)) * TWO_N20;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_epsilon_n_A = static_cast<double>(read_navigation_unsigned(string_bits, EPSILON_N_A)) * TWO_N20;
|
||||||
|
|
||||||
flag_almanac_str_8 = true;
|
flag_almanac_str_8 = true;
|
||||||
|
|
||||||
@ -521,38 +596,40 @@ int Glonass_Gnav_Navigation_Message::string_decoder(std::string frame_string)
|
|||||||
case 9:
|
case 9:
|
||||||
// --- It is string 9 ----------------------------------------------
|
// --- It is string 9 ----------------------------------------------
|
||||||
if (flag_almanac_str_8 == true)
|
if (flag_almanac_str_8 == true)
|
||||||
{
|
{
|
||||||
// TODO signed vs unsigned reading from datasheet
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_omega_n_A = static_cast<double>(read_navigation_signed(string_bits, OMEGA_N_A)) * TWO_N15 * GLONASS_PI;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_omega_n_A = static_cast<double>(read_navigation_signed(string_bits, OMEGA_N_A)) * TWO_N15;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_t_lambda_n_A = static_cast<double>(read_navigation_unsigned(string_bits, T_LAMBDA_N_A)) * TWO_N5;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_t_lambda_n_A = static_cast<double>(read_navigation_unsigned(string_bits, T_LAMBDA_N_A)) * TWO_N5;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_T_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_N_A)) * TWO_N9;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_Delta_T_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_N_A)) * TWO_N9;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_T_n_A_dot = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_DOT_N_A)) * TWO_N14;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_Delta_T_n_A_dot = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_DOT_N_A)) * TWO_N14;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A = static_cast<double>(read_navigation_unsigned(string_bits, H_N_A));
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_H_n_A = static_cast<double>(read_navigation_unsigned(string_bits, H_N_A)) -32.0;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_l_n = static_cast<bool>(read_navigation_bool(string_bits, ALM_L_N));
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_l_n = static_cast<bool>(read_navigation_bool(string_bits, ALM_L_N));
|
|
||||||
|
|
||||||
// Set satellite information for redundancy purposes
|
// Set satellite information for redundancy purposes
|
||||||
if(gnav_almanac[i_satellite_slot_number - 1].d_H_n_A > 24)
|
if (gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A > 24)
|
||||||
{
|
{
|
||||||
gnav_almanac[i_satellite_slot_number - 1].i_satellite_freq_channel = gnav_almanac[i_satellite_slot_number - 1].d_H_n_A - 32.0;
|
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_freq_channel = gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A - 32.0;
|
||||||
}
|
}
|
||||||
gnav_almanac[i_satellite_slot_number - 1].i_satellite_slot_number = gnav_almanac[i_satellite_slot_number - 1].d_n_A;
|
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_slot_number = gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].i_satellite_PRN = gnav_almanac[i_satellite_slot_number - 1].d_n_A;
|
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_PRN = gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A;
|
||||||
|
|
||||||
flag_almanac_str_9 = true;
|
flag_almanac_str_9 = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 10:
|
case 10:
|
||||||
// --- It is string 10 ---------------------------------------------
|
// --- It is string 10 ---------------------------------------------
|
||||||
i_satellite_slot_number = static_cast<unsigned int>(read_navigation_unsigned(string_bits, n_A));
|
i_alm_satellite_slot_number = static_cast<unsigned int>(read_navigation_unsigned(string_bits, n_A));
|
||||||
d_frame_ID = get_frame_number(i_satellite_slot_number);
|
d_frame_ID = get_frame_number(i_alm_satellite_slot_number);
|
||||||
|
// Make sure a valid frame_ID or satellite slot number is returned
|
||||||
|
if(d_frame_ID == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_C_n = static_cast<bool>(read_navigation_bool(string_bits, C_N));
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_C_n = static_cast<bool>(read_navigation_bool(string_bits, C_N));
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_M_n_A = static_cast<double>(read_navigation_unsigned(string_bits, M_N_A));
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_M_n_A = static_cast<double>(read_navigation_unsigned(string_bits, M_N_A));
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_n_A = static_cast<double>(read_navigation_unsigned(string_bits, n_A));
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A = static_cast<double>(read_navigation_unsigned(string_bits, n_A));
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_tau_n_A = static_cast<double>(read_navigation_unsigned(string_bits, TAU_N_A)) * TWO_N18;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_tau_n_A = static_cast<double>(read_navigation_unsigned(string_bits, TAU_N_A)) * TWO_N18;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_lambda_n_A = static_cast<double>(read_navigation_signed(string_bits, LAMBDA_N_A)) * TWO_N20;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_lambda_n_A = static_cast<double>(read_navigation_signed(string_bits, LAMBDA_N_A)) * TWO_N20 * GLONASS_PI;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_Delta_i_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_I_N_A)) * TWO_N20;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_i_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_I_N_A)) * TWO_N20 * GLONASS_PI;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_epsilon_n_A = static_cast<double>(read_navigation_unsigned(string_bits, EPSILON_N_A)) * TWO_N20;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_epsilon_n_A = static_cast<double>(read_navigation_unsigned(string_bits, EPSILON_N_A)) * TWO_N20;
|
||||||
|
|
||||||
flag_almanac_str_10 = true;
|
flag_almanac_str_10 = true;
|
||||||
|
|
||||||
@ -561,37 +638,39 @@ int Glonass_Gnav_Navigation_Message::string_decoder(std::string frame_string)
|
|||||||
case 11:
|
case 11:
|
||||||
// --- It is string 11 ---------------------------------------------
|
// --- It is string 11 ---------------------------------------------
|
||||||
if (flag_almanac_str_10 == true)
|
if (flag_almanac_str_10 == true)
|
||||||
{
|
{
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_omega_n_A = static_cast<double>(read_navigation_signed(string_bits, OMEGA_N_A)) * TWO_N15;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_omega_n_A = static_cast<double>(read_navigation_signed(string_bits, OMEGA_N_A)) * TWO_N15 * GLONASS_PI;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_t_lambda_n_A = static_cast<double>(read_navigation_unsigned(string_bits, T_LAMBDA_N_A)) * TWO_N5;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_t_lambda_n_A = static_cast<double>(read_navigation_unsigned(string_bits, T_LAMBDA_N_A)) * TWO_N5;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_Delta_T_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_N_A)) * TWO_N9;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_T_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_N_A)) * TWO_N9;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_Delta_T_n_A_dot = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_DOT_N_A)) * TWO_N14;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_T_n_A_dot = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_DOT_N_A)) * TWO_N14;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_H_n_A = static_cast<double>(read_navigation_unsigned(string_bits, H_N_A)) - 32.0;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A = static_cast<double>(read_navigation_unsigned(string_bits, H_N_A));
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_l_n = static_cast<bool>(read_navigation_bool(string_bits, ALM_L_N));
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_l_n = static_cast<bool>(read_navigation_bool(string_bits, ALM_L_N));
|
||||||
|
|
||||||
// Set satellite information for redundancy purposes
|
// Set satellite information for redundancy purposes
|
||||||
if(gnav_almanac[i_satellite_slot_number - 1].d_H_n_A > 24)
|
if (gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A > 24)
|
||||||
{
|
{
|
||||||
gnav_almanac[i_satellite_slot_number - 1].i_satellite_freq_channel = gnav_almanac[i_satellite_slot_number - 1].d_H_n_A - 32.0;
|
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_freq_channel = gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A - 32.0;
|
||||||
}
|
}
|
||||||
gnav_almanac[i_satellite_slot_number - 1].i_satellite_slot_number = gnav_almanac[i_satellite_slot_number - 1].d_n_A;
|
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_slot_number = gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].i_satellite_PRN = gnav_almanac[i_satellite_slot_number - 1].d_n_A;
|
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_PRN = gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A;
|
||||||
|
|
||||||
flag_almanac_str_11 = true;
|
flag_almanac_str_11 = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 12:
|
case 12:
|
||||||
// --- It is string 12 ---------------------------------------------
|
// --- It is string 12 ---------------------------------------------
|
||||||
i_satellite_slot_number = static_cast<unsigned int>(read_navigation_unsigned(string_bits, n_A));
|
i_alm_satellite_slot_number = static_cast<unsigned int>(read_navigation_unsigned(string_bits, n_A));
|
||||||
d_frame_ID = get_frame_number(i_satellite_slot_number);
|
d_frame_ID = get_frame_number(i_alm_satellite_slot_number);
|
||||||
|
// Make sure a valid frame_ID or satellite slot number is returned
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_C_n = static_cast<bool>(read_navigation_bool(string_bits, C_N));
|
if(d_frame_ID == 0)
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_M_n_A = static_cast<double>(read_navigation_unsigned(string_bits, M_N_A));
|
return 0;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_n_A = static_cast<double>(read_navigation_unsigned(string_bits, n_A));
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_C_n = static_cast<bool>(read_navigation_bool(string_bits, C_N));
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_tau_n_A = static_cast<double>(read_navigation_unsigned(string_bits, TAU_N_A)) * TWO_N18;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_M_n_A = static_cast<double>(read_navigation_unsigned(string_bits, M_N_A));
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_lambda_n_A = static_cast<double>(read_navigation_signed(string_bits, LAMBDA_N_A)) * TWO_N20;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A = static_cast<double>(read_navigation_unsigned(string_bits, n_A));
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_Delta_i_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_I_N_A)) * TWO_N20;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_tau_n_A = static_cast<double>(read_navigation_unsigned(string_bits, TAU_N_A)) * TWO_N18;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_epsilon_n_A = static_cast<double>(read_navigation_unsigned(string_bits, EPSILON_N_A)) * TWO_N20;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_lambda_n_A = static_cast<double>(read_navigation_signed(string_bits, LAMBDA_N_A)) * TWO_N20 * GLONASS_PI;
|
||||||
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_i_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_I_N_A)) * TWO_N20 * GLONASS_PI;
|
||||||
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_epsilon_n_A = static_cast<double>(read_navigation_unsigned(string_bits, EPSILON_N_A)) * TWO_N20;
|
||||||
|
|
||||||
flag_almanac_str_12 = true;
|
flag_almanac_str_12 = true;
|
||||||
|
|
||||||
@ -600,79 +679,80 @@ int Glonass_Gnav_Navigation_Message::string_decoder(std::string frame_string)
|
|||||||
case 13:
|
case 13:
|
||||||
// --- It is string 13 ---------------------------------------------
|
// --- It is string 13 ---------------------------------------------
|
||||||
if (flag_almanac_str_12 == true)
|
if (flag_almanac_str_12 == true)
|
||||||
{
|
{
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_omega_n_A = static_cast<double>(read_navigation_signed(string_bits, OMEGA_N_A)) * TWO_N15;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_omega_n_A = static_cast<double>(read_navigation_signed(string_bits, OMEGA_N_A)) * TWO_N15 * GLONASS_PI;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_t_lambda_n_A = static_cast<double>(read_navigation_unsigned(string_bits, T_LAMBDA_N_A)) * TWO_N5;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_t_lambda_n_A = static_cast<double>(read_navigation_unsigned(string_bits, T_LAMBDA_N_A)) * TWO_N5;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_Delta_T_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_N_A)) * TWO_N9;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_T_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_N_A)) * TWO_N9;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_Delta_T_n_A_dot = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_DOT_N_A)) * TWO_N14;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_T_n_A_dot = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_DOT_N_A)) * TWO_N14;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_H_n_A = static_cast<double>(read_navigation_unsigned(string_bits, H_N_A)) - 32.0;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A = static_cast<double>(read_navigation_unsigned(string_bits, H_N_A));
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_l_n = static_cast<bool>(read_navigation_bool(string_bits, ALM_L_N));
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_l_n = static_cast<bool>(read_navigation_bool(string_bits, ALM_L_N));
|
||||||
|
|
||||||
// Set satellite information for redundancy purposes
|
// Set satellite information for redundancy purposes
|
||||||
if(gnav_almanac[i_satellite_slot_number - 1].d_H_n_A > 24)
|
if (gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A > 24)
|
||||||
{
|
{
|
||||||
gnav_almanac[i_satellite_slot_number - 1].i_satellite_freq_channel = gnav_almanac[i_satellite_slot_number - 1].d_H_n_A - 32.0;
|
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_freq_channel = gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A - 32.0;
|
||||||
}
|
}
|
||||||
gnav_almanac[i_satellite_slot_number - 1].i_satellite_slot_number = gnav_almanac[i_satellite_slot_number - 1].d_n_A;
|
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_slot_number = gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].i_satellite_PRN = gnav_almanac[i_satellite_slot_number - 1].d_n_A;
|
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_PRN = gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A;
|
||||||
|
|
||||||
flag_almanac_str_13 = true;
|
flag_almanac_str_13 = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 14:
|
case 14:
|
||||||
// --- It is string 14 ---------------------------------------------
|
// --- It is string 14 ---------------------------------------------
|
||||||
if( d_frame_ID == 5)
|
if (d_frame_ID == 5)
|
||||||
{
|
{
|
||||||
gnav_utc_model.d_B1 = static_cast<double>(read_navigation_unsigned(string_bits, B1));
|
gnav_utc_model.d_B1 = static_cast<double>(read_navigation_unsigned(string_bits, B1));
|
||||||
gnav_utc_model.d_B2 = static_cast<double>(read_navigation_unsigned(string_bits, B2));
|
gnav_utc_model.d_B2 = static_cast<double>(read_navigation_unsigned(string_bits, B2));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
i_satellite_slot_number = static_cast<unsigned int>(read_navigation_unsigned(string_bits, n_A));
|
i_alm_satellite_slot_number = static_cast<unsigned int>(read_navigation_unsigned(string_bits, n_A));
|
||||||
d_frame_ID = get_frame_number(i_satellite_slot_number);
|
d_frame_ID = get_frame_number(i_alm_satellite_slot_number);
|
||||||
|
// Make sure a valid frame_ID or satellite slot number is returned
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_C_n = static_cast<bool>(read_navigation_bool(string_bits, C_N));
|
if(d_frame_ID == 0)
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_M_n_A = static_cast<double>(read_navigation_unsigned(string_bits, M_N_A));
|
return 0;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_n_A = static_cast<double>(read_navigation_unsigned(string_bits, n_A));
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_C_n = static_cast<bool>(read_navigation_bool(string_bits, C_N));
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_tau_n_A = static_cast<double>(read_navigation_unsigned(string_bits, TAU_N_A)) * TWO_N18;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_M_n_A = static_cast<double>(read_navigation_unsigned(string_bits, M_N_A));
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_lambda_n_A = static_cast<double>(read_navigation_signed(string_bits, LAMBDA_N_A)) * TWO_N20;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A = static_cast<double>(read_navigation_unsigned(string_bits, n_A));
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_Delta_i_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_I_N_A)) * TWO_N20;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_tau_n_A = static_cast<double>(read_navigation_unsigned(string_bits, TAU_N_A)) * TWO_N18;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_epsilon_n_A = static_cast<double>(read_navigation_unsigned(string_bits, EPSILON_N_A)) * TWO_N20;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_lambda_n_A = static_cast<double>(read_navigation_signed(string_bits, LAMBDA_N_A)) * TWO_N20 * GLONASS_PI;
|
||||||
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_i_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_I_N_A)) * TWO_N20 * GLONASS_PI;
|
||||||
flag_almanac_str_14 = true;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_epsilon_n_A = static_cast<double>(read_navigation_unsigned(string_bits, EPSILON_N_A)) * TWO_N20;
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
flag_almanac_str_14 = true;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 15:
|
case 15:
|
||||||
// --- It is string 9 ----------------------------------------------
|
// --- It is string 15 ----------------------------------------------
|
||||||
if (d_frame_ID != 5 and flag_almanac_str_14 == true )
|
if (d_frame_ID != 5 and flag_almanac_str_14 == true) {
|
||||||
{
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_omega_n_A = static_cast<double>(read_navigation_signed(string_bits, OMEGA_N_A)) * TWO_N15 * GLONASS_PI;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_omega_n_A = static_cast<double>(read_navigation_signed(string_bits, OMEGA_N_A)) * TWO_N15;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_t_lambda_n_A = static_cast<double>(read_navigation_unsigned(string_bits, T_LAMBDA_N_A)) * TWO_N5;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_t_lambda_n_A = static_cast<double>(read_navigation_unsigned(string_bits, T_LAMBDA_N_A)) * TWO_N5;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_T_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_N_A)) * TWO_N9;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_Delta_T_n_A = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_N_A)) * TWO_N9;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_Delta_T_n_A_dot = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_DOT_N_A)) * TWO_N14;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_Delta_T_n_A_dot = static_cast<double>(read_navigation_signed(string_bits, DELTA_T_DOT_N_A)) * TWO_N14;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A = static_cast<double>(read_navigation_unsigned(string_bits, H_N_A));
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_H_n_A = static_cast<double>(read_navigation_unsigned(string_bits, H_N_A)) - 32.0;
|
gnav_almanac[i_alm_satellite_slot_number - 1].d_l_n = static_cast<bool>(read_navigation_bool(string_bits, ALM_L_N));
|
||||||
gnav_almanac[i_satellite_slot_number - 1].d_l_n = static_cast<bool>(read_navigation_bool(string_bits, ALM_L_N));
|
|
||||||
|
|
||||||
// Set satellite information for redundancy purposes
|
// Set satellite information for redundancy purposes
|
||||||
if(gnav_almanac[i_satellite_slot_number - 1].d_H_n_A > 24)
|
if (gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A > 24)
|
||||||
{
|
{
|
||||||
gnav_almanac[i_satellite_slot_number - 1].i_satellite_freq_channel = gnav_almanac[i_satellite_slot_number - 1].d_H_n_A - 32.0;
|
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_freq_channel = gnav_almanac[i_alm_satellite_slot_number - 1].d_H_n_A - 32.0;
|
||||||
}
|
}
|
||||||
gnav_almanac[i_satellite_slot_number - 1].i_satellite_slot_number = gnav_almanac[i_satellite_slot_number - 1].d_n_A;
|
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_slot_number = gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A;
|
||||||
gnav_almanac[i_satellite_slot_number - 1].i_satellite_PRN = gnav_almanac[i_satellite_slot_number - 1].d_n_A;
|
gnav_almanac[i_alm_satellite_slot_number - 1].i_satellite_PRN = gnav_almanac[i_alm_satellite_slot_number - 1].d_n_A;
|
||||||
|
|
||||||
flag_almanac_str_15 = true;
|
flag_almanac_str_15 = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
LOG(INFO) << "GLONASS GNAV: Invalid String ID of received. Received " << d_string_ID << ", but acceptable range is from 1-15";
|
LOG(INFO) << "GLONASS GNAV: Invalid String ID of received. Received " << d_string_ID
|
||||||
|
<< ", but acceptable range is from 1-15";
|
||||||
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
} // switch string ID ...
|
} // switch string ID ...
|
||||||
|
|
||||||
|
|
||||||
return d_string_ID;
|
return d_string_ID;
|
||||||
}
|
}
|
||||||
@ -707,26 +787,29 @@ Glonass_Gnav_Almanac Glonass_Gnav_Navigation_Message::get_almanac(unsigned int s
|
|||||||
|
|
||||||
bool Glonass_Gnav_Navigation_Message::have_new_ephemeris() //Check if we have a new ephemeris stored in the galileo navigation class
|
bool Glonass_Gnav_Navigation_Message::have_new_ephemeris() //Check if we have a new ephemeris stored in the galileo navigation class
|
||||||
{
|
{
|
||||||
if ((flag_ephemeris_str_1 == true) and (flag_ephemeris_str_2 == true) and (flag_ephemeris_str_3 == true) and (flag_ephemeris_str_4 == true))
|
bool new_eph = false;
|
||||||
|
// We need to make sure we have received the ephemeris info plus the time info
|
||||||
|
if ((flag_ephemeris_str_1 == true) and (flag_ephemeris_str_2 == true) and
|
||||||
|
(flag_ephemeris_str_3 == true) and (flag_ephemeris_str_4 == true) and
|
||||||
|
(flag_utc_model_str_5 == true))
|
||||||
{
|
{
|
||||||
if (gnav_ephemeris.d_P_4 == 1)
|
if(d_previous_tb != gnav_ephemeris.d_t_b)
|
||||||
{
|
{
|
||||||
flag_ephemeris_str_1 = false;// clear the flag
|
flag_ephemeris_str_1 = false;// clear the flag
|
||||||
flag_ephemeris_str_2 = false;// clear the flag
|
flag_ephemeris_str_2 = false;// clear the flag
|
||||||
flag_ephemeris_str_3 = false;// clear the flag
|
flag_ephemeris_str_3 = false;// clear the flag
|
||||||
flag_ephemeris_str_4 = false;// clear the flag
|
flag_ephemeris_str_4 = false;// clear the flag
|
||||||
flag_all_ephemeris = true;
|
flag_all_ephemeris = true;
|
||||||
DLOG(INFO) << "Ephemeris (1, 2, 3, 4) have been received and belong to the same batch" << std::endl;
|
// Update the time of ephemeris information
|
||||||
|
d_previous_tb = gnav_ephemeris.d_t_b;
|
||||||
|
DLOG(INFO) << "GLONASS GNAV Ephemeris (1, 2, 3, 4) have been received and belong to the same batch" << std::endl;
|
||||||
|
new_eph = true;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
return false;
|
|
||||||
|
return new_eph;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -744,26 +827,54 @@ bool Glonass_Gnav_Navigation_Message::have_new_utc_model() // Check if we have a
|
|||||||
|
|
||||||
bool Glonass_Gnav_Navigation_Message::have_new_almanac() //Check if we have a new almanac data set stored in the galileo navigation class
|
bool Glonass_Gnav_Navigation_Message::have_new_almanac() //Check if we have a new almanac data set stored in the galileo navigation class
|
||||||
{
|
{
|
||||||
if ((flag_almanac_str_6 == true) and (flag_almanac_str_7 == true) and
|
bool new_alm = false;
|
||||||
(flag_almanac_str_8 == true) and (flag_almanac_str_9 == true) and
|
if ((flag_almanac_str_6 == true) and (flag_almanac_str_7 == true))
|
||||||
(flag_almanac_str_10 == true) and (flag_almanac_str_11 == true) and
|
|
||||||
(flag_almanac_str_12 == true) and (flag_almanac_str_13 == true) and
|
|
||||||
(flag_almanac_str_14 == true) and (flag_almanac_str_15 == true))
|
|
||||||
{
|
{
|
||||||
//All almanac have been received
|
if (d_previous_Na[i_alm_satellite_slot_number] != gnav_utc_model.d_N_A)
|
||||||
flag_almanac_str_6 = false;
|
{
|
||||||
flag_almanac_str_7 = false;
|
//All almanac have been received for this satellite
|
||||||
flag_almanac_str_8 = false;
|
flag_almanac_str_6 = false;
|
||||||
flag_almanac_str_9 = false;
|
flag_almanac_str_7 = false;
|
||||||
flag_almanac_str_10 = false;
|
new_alm = true;
|
||||||
flag_almanac_str_11 = false;
|
}
|
||||||
flag_almanac_str_12 = false;
|
|
||||||
flag_almanac_str_13 = false;
|
|
||||||
flag_almanac_str_14 = false;
|
|
||||||
flag_almanac_str_15 = false;
|
|
||||||
flag_all_almanac = true;
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
else
|
if ((flag_almanac_str_8 == true) and (flag_almanac_str_9 == true))
|
||||||
return false;
|
{
|
||||||
|
if (d_previous_Na[i_alm_satellite_slot_number] != gnav_utc_model.d_N_A)
|
||||||
|
{
|
||||||
|
flag_almanac_str_8 = false;
|
||||||
|
flag_almanac_str_9 = false;
|
||||||
|
new_alm = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if((flag_almanac_str_10 == true) and (flag_almanac_str_11 == true))
|
||||||
|
{
|
||||||
|
if (d_previous_Na[i_alm_satellite_slot_number] != gnav_utc_model.d_N_A)
|
||||||
|
{
|
||||||
|
flag_almanac_str_10 = false;
|
||||||
|
flag_almanac_str_11 = false;
|
||||||
|
new_alm = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if((flag_almanac_str_12 == true) and (flag_almanac_str_13 == true))
|
||||||
|
{
|
||||||
|
if (d_previous_Na[i_alm_satellite_slot_number] != gnav_utc_model.d_N_A)
|
||||||
|
{
|
||||||
|
flag_almanac_str_12 = false;
|
||||||
|
flag_almanac_str_13 = false;
|
||||||
|
new_alm = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if((flag_almanac_str_14 == true) and (flag_almanac_str_15 == true))
|
||||||
|
{
|
||||||
|
if (d_previous_Na[i_alm_satellite_slot_number] != gnav_utc_model.d_N_A)
|
||||||
|
{
|
||||||
|
flag_almanac_str_14 = false;
|
||||||
|
flag_almanac_str_15 = false;
|
||||||
|
new_alm = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new_alm;
|
||||||
}
|
}
|
||||||
|
@ -63,17 +63,13 @@ public:
|
|||||||
bool flag_CRC_test;
|
bool flag_CRC_test;
|
||||||
unsigned int d_frame_ID;
|
unsigned int d_frame_ID;
|
||||||
unsigned int d_string_ID;
|
unsigned int d_string_ID;
|
||||||
|
bool flag_update_slot_number;
|
||||||
|
|
||||||
Glonass_Gnav_Ephemeris gnav_ephemeris; //!< Ephemeris information decoded
|
Glonass_Gnav_Ephemeris gnav_ephemeris; //!< Ephemeris information decoded
|
||||||
Glonass_Gnav_Utc_Model gnav_utc_model; //!< UTC model information
|
Glonass_Gnav_Utc_Model gnav_utc_model; //!< UTC model information
|
||||||
Glonass_Gnav_Almanac gnav_almanac[24]; //!< Almanac information for all 24 satellites
|
Glonass_Gnav_Almanac gnav_almanac[GLONASS_L1_CA_NBR_SATS]; //!< Almanac information for all 24 satellites
|
||||||
|
|
||||||
//!< Satellite Identification
|
//!< Ephmeris Flags and control variables
|
||||||
int i_channel_ID; //!< Channel ID assigned by the receiver
|
|
||||||
unsigned int i_satellite_freq_channel; //!< SV Frequency Slot Number
|
|
||||||
unsigned int i_satellite_slot_number; //!< SV Orbit Slot Number
|
|
||||||
|
|
||||||
//!< Ephmeris Flags
|
|
||||||
bool flag_all_ephemeris; //!< Flag indicating that all strings containing ephemeris have been received
|
bool flag_all_ephemeris; //!< Flag indicating that all strings containing ephemeris have been received
|
||||||
bool flag_ephemeris_str_1; //!< Flag indicating that ephemeris 1/4 (string 1) have been received
|
bool flag_ephemeris_str_1; //!< Flag indicating that ephemeris 1/4 (string 1) have been received
|
||||||
bool flag_ephemeris_str_2; //!< Flag indicating that ephemeris 2/4 (string 2) have been received
|
bool flag_ephemeris_str_2; //!< Flag indicating that ephemeris 2/4 (string 2) have been received
|
||||||
@ -92,25 +88,26 @@ public:
|
|||||||
bool flag_almanac_str_13; //!< Flag indicating that almanac of string 13 have been received
|
bool flag_almanac_str_13; //!< Flag indicating that almanac of string 13 have been received
|
||||||
bool flag_almanac_str_14; //!< Flag indicating that almanac of string 14 have been received
|
bool flag_almanac_str_14; //!< Flag indicating that almanac of string 14 have been received
|
||||||
bool flag_almanac_str_15; //!< Flag indicating that almanac of string 15 have been received
|
bool flag_almanac_str_15; //!< Flag indicating that almanac of string 15 have been received
|
||||||
|
unsigned int i_alm_satellite_slot_number; //!< SV Orbit Slot Number
|
||||||
|
|
||||||
//!< UTC and System Clocks Flags
|
//!< UTC and System Clocks Flags
|
||||||
bool flag_utc_model_valid; //!< If set, it indicates that the UTC model parameters are filled
|
bool flag_utc_model_valid; //!< If set, it indicates that the UTC model parameters are filled
|
||||||
bool flag_utc_model_str_5; //!< Clock info send in string 5 of navigation data
|
bool flag_utc_model_str_5; //!< Clock info send in string 5 of navigation data
|
||||||
bool flag_utc_model_str_15; //!< Clock info send in string 15 of frame 5 of navigation data
|
bool flag_utc_model_str_15; //!< Clock info send in string 15 of frame 5 of navigation data
|
||||||
|
|
||||||
bool flag_TOW_set;
|
bool flag_TOW_set; //!< Flag indicating when the TOW has been set
|
||||||
|
bool flag_TOW_new; //!< Flag indicating when a new TOW has been computed
|
||||||
double d_TOW; //!< Time of GPS Week of the ephemeris set (taken from subframes TOW) [s]
|
double d_TOW; //!< Time of GPS Week of the ephemeris set (taken from subframes TOW) [s]
|
||||||
double d_TOW_F1; //!< Time of GPS Week from HOW word of Subframe 1 [s]
|
|
||||||
double d_TOW_F2; //!< Time of GPS Week from HOW word of Subframe 2 [s]
|
|
||||||
double d_TOW_F3; //!< Time of GPS Week from HOW word of Subframe 3 [s]
|
|
||||||
double d_TOW_F4; //!< Time of GPS Week from HOW word of Subframe 4 [s]
|
|
||||||
double d_TOW_F5; //!< Time of GPS Week from HOW word of Subframe 5 [s]
|
|
||||||
|
|
||||||
// Clock terms
|
// Clock terms
|
||||||
double d_satClkCorr; // Satellite clock error
|
double d_satClkCorr; // Satellite clock error
|
||||||
double d_dtr; // Relativistic clock correction term
|
double d_dtr; // Relativistic clock correction term
|
||||||
double d_satClkDrift; // Satellite clock drift
|
double d_satClkDrift; // Satellite clock drift
|
||||||
|
|
||||||
|
// Data update parameters
|
||||||
|
double d_previous_tb;
|
||||||
|
double d_previous_Na[GLONASS_L1_CA_NBR_SATS];
|
||||||
|
|
||||||
bool CRC_test(std::bitset<GLONASS_GNAV_STRING_BITS> bits);
|
bool CRC_test(std::bitset<GLONASS_GNAV_STRING_BITS> bits);
|
||||||
|
|
||||||
unsigned int get_frame_number(unsigned int satellite_slot_number);
|
unsigned int get_frame_number(unsigned int satellite_slot_number);
|
||||||
@ -162,6 +159,8 @@ public:
|
|||||||
*/
|
*/
|
||||||
double get_TOW();
|
double get_TOW();
|
||||||
|
|
||||||
|
double get_WN();
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Computes the Coordinated Universal Time (UTC) and returns it in [s]
|
* \brief Computes the Coordinated Universal Time (UTC) and returns it in [s]
|
||||||
*/
|
*/
|
||||||
|
@ -145,7 +145,6 @@ DECLARE_string(log_dir);
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "unit-tests/system-parameters/glonass_gnav_ephemeris_test.cc"
|
#include "unit-tests/system-parameters/glonass_gnav_ephemeris_test.cc"
|
||||||
#include "unit-tests/system-parameters/glonass_gnav_almanac_test.cc"
|
|
||||||
#include "unit-tests/system-parameters/glonass_gnav_nav_message_test.cc"
|
#include "unit-tests/system-parameters/glonass_gnav_nav_message_test.cc"
|
||||||
|
|
||||||
// For GPS NAVIGATION (L1)
|
// For GPS NAVIGATION (L1)
|
||||||
|
@ -1,76 +0,0 @@
|
|||||||
/*!
|
|
||||||
* \file code_generation_test.cc
|
|
||||||
* \note Code added as part of GSoC 2017 program
|
|
||||||
* \author Damian Miralles, 2017. dmiralles2009(at)gmail.com
|
|
||||||
* \see <a href="http://russianspacesystems.ru/wp-content/uploads/2016/08/ICD_GLONASS_eng_v5.1.pdf">GLONASS ICD</a>
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* -------------------------------------------------------------------------
|
|
||||||
*
|
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* -------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include <complex>
|
|
||||||
#include <ctime>
|
|
||||||
#include "gps_sdr_signal_processing.h"
|
|
||||||
#include "gnss_signal_processing.h"
|
|
||||||
|
|
||||||
#include <complex>
|
|
||||||
#include <ctime>
|
|
||||||
#include "gnss_signal_processing.h"
|
|
||||||
#include "glonass_gnav_almanac.h"
|
|
||||||
|
|
||||||
// See A 3.2.3
|
|
||||||
TEST(GlonassGnavAlmanacTest, SatellitePosition)
|
|
||||||
{
|
|
||||||
double N_i = 615; // [days]
|
|
||||||
double t_i = 33300.0; // [seconds]
|
|
||||||
double Xoi = 10947.021572; // [km]
|
|
||||||
double Yoi = 13078.978287; // [km]
|
|
||||||
double Zoi = 18922.063362; // [km]
|
|
||||||
double Vxoi = -3.375497; // [m/s]
|
|
||||||
double Vyoi = -0.161453; // [Кm/s]
|
|
||||||
double Vzoi = 2.060844; // [Кm/s]
|
|
||||||
double N_A = 615; // [days]
|
|
||||||
|
|
||||||
Glonass_Gnav_Almanac gnav_almanac;
|
|
||||||
|
|
||||||
|
|
||||||
gnav_almanac.d_lambda_n_A = -0.189986229; // [half cycles]
|
|
||||||
gnav_almanac.d_t_lambda_n_A = 27122.09375; // [second]
|
|
||||||
gnav_almanac.d_Delta_i_n_A = 0.011929512; // [half cycle]
|
|
||||||
gnav_almanac.d_Delta_T_n_A = -2655.76171875; // [seconds]
|
|
||||||
gnav_almanac.d_Delta_T_n_A_dot = 0.000549316; // [Secjnds/cycle2]
|
|
||||||
gnav_almanac.d_epsilon_n_A = 0.001482010; // [unitless]
|
|
||||||
gnav_almanac.d_omega_n_A = 0.440277100; // [Half cycle]
|
|
||||||
|
|
||||||
gnav_almanac.satellite_position(N_A, N_i, t_i);
|
|
||||||
|
|
||||||
ASSERT_TRUE(gnav_almanac.d_satpos_Xo - Xoi < DBL_EPSILON );
|
|
||||||
ASSERT_TRUE(gnav_almanac.d_satpos_Yo - Yoi < DBL_EPSILON );
|
|
||||||
ASSERT_TRUE(gnav_almanac.d_satpos_Zo - Zoi < DBL_EPSILON );
|
|
||||||
ASSERT_TRUE(gnav_almanac.d_satvel_Xo - Vxoi < DBL_EPSILON );
|
|
||||||
ASSERT_TRUE(gnav_almanac.d_satvel_Yo - Vyoi < DBL_EPSILON );
|
|
||||||
ASSERT_TRUE(gnav_almanac.d_satvel_Zo - Vzoi < DBL_EPSILON );
|
|
||||||
}
|
|
@ -44,7 +44,7 @@
|
|||||||
* \test The provided string was generated with a version of MATLAB GNSS-SDR that
|
* \test The provided string was generated with a version of MATLAB GNSS-SDR that
|
||||||
* the author coded to perform proper decoding of GLONASS GNAV signals.
|
* the author coded to perform proper decoding of GLONASS GNAV signals.
|
||||||
*/
|
*/
|
||||||
TEST(GlonassGnavNavigationMessageTest, CRCTest)
|
TEST(GlonassGnavNavigationMessageTest, CRCTestSuccess)
|
||||||
{
|
{
|
||||||
// Variables declarations in code
|
// Variables declarations in code
|
||||||
bool test_result;
|
bool test_result;
|
||||||
@ -59,6 +59,27 @@ TEST(GlonassGnavNavigationMessageTest, CRCTest)
|
|||||||
ASSERT_TRUE(test_result);
|
ASSERT_TRUE(test_result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Testing CRC computation for GLONASS GNAV data bits of a string
|
||||||
|
* \test The provided string was generated with a version of MATLAB GNSS-SDR that
|
||||||
|
* the author coded to perform proper decoding of GLONASS GNAV signals.
|
||||||
|
*/
|
||||||
|
TEST(GlonassGnavNavigationMessageTest, CRCTestFailure)
|
||||||
|
{
|
||||||
|
// Variables declarations in code
|
||||||
|
bool test_result;
|
||||||
|
// Constructor of string to bitset will flip the order of the bits. Needed for CRC computation
|
||||||
|
std::bitset<GLONASS_GNAV_STRING_BITS> string_bits (std::string ("0111100100001100000000000000000000000000110011110001100000000000000001100100011000000"));
|
||||||
|
Glonass_Gnav_Navigation_Message gnav_nav_message;
|
||||||
|
gnav_nav_message.reset();
|
||||||
|
|
||||||
|
// Call function to test
|
||||||
|
test_result = gnav_nav_message.CRC_test(string_bits);
|
||||||
|
|
||||||
|
// Check results in unit test assetions
|
||||||
|
ASSERT_FALSE(test_result);
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Testing string decoding for GLONASS GNAV messages
|
* \brief Testing string decoding for GLONASS GNAV messages
|
||||||
* \test The provided string (str1.....str15) was generated with a version of
|
* \test The provided string (str1.....str15) was generated with a version of
|
||||||
|
@ -4,19 +4,20 @@
|
|||||||
clearvars;
|
clearvars;
|
||||||
close all;
|
close all;
|
||||||
addpath('./libs');
|
addpath('./libs');
|
||||||
samplingFreq = 2600000; %[Hz]
|
samplingFreq = 6625000; %[Hz]
|
||||||
channels=2;
|
channels=5;
|
||||||
path='/home/javier/git/gnss-sdr/build/';
|
path='/archive/';
|
||||||
observables_log_path=[path 'observables.dat'];
|
observables_log_path=[path 'glo_observables.dat'];
|
||||||
GNSS_observables= read_hybrid_observables_dump(channels,observables_log_path);
|
GNSS_observables= read_hybrid_observables_dump(channels,observables_log_path);
|
||||||
|
|
||||||
|
%%
|
||||||
%optional:
|
%optional:
|
||||||
%search all channels having good satellite simultaneously
|
%search all channels having good satellite simultaneously
|
||||||
min_idx=1;
|
min_idx=1;
|
||||||
for n=1:1:channels
|
for n=1:1:channels
|
||||||
idx=find(GNSS_observables.valid(n,:)>0,1,'first');
|
idx=find(GNSS_observables.valid(n,:)>0,1,'first');
|
||||||
if min_idx<idx
|
if min_idx<idx
|
||||||
min_idx=idx;
|
min_idx=idx
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -1,193 +0,0 @@
|
|||||||
% /*!
|
|
||||||
% * \file glonass_l1_ca_dll_pll_read_tracking_dump.m
|
|
||||||
% * \brief Read GNSS-SDR Tracking dump binary file into MATLAB.
|
|
||||||
% * \author Damian Miralles, 2017. dmiralles2009(at)gmail.com
|
|
||||||
% * -------------------------------------------------------------------------
|
|
||||||
% *
|
|
||||||
% * Copyright (C) 2010-2011 (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 <http://www.gnu.org/licenses/>.
|
|
||||||
% *
|
|
||||||
% * -------------------------------------------------------------------------
|
|
||||||
% */
|
|
||||||
function [GNSS_tracking] = glonass_l1_ca_dll_pll_read_tracking_dump (filename, count)
|
|
||||||
|
|
||||||
%% usage: glonass_l1_ca_dll_pll_read_tracking_dump_64bits (filename, [count])
|
|
||||||
%%
|
|
||||||
%% open GNSS-SDR tracking binary log file .dat and return the contents
|
|
||||||
%%
|
|
||||||
|
|
||||||
m = nargchk (1,2,nargin);
|
|
||||||
num_float_vars=5;
|
|
||||||
num_unsigned_long_int_vars=1;
|
|
||||||
num_double_vars=11;
|
|
||||||
num_unsigned_int_vars=1;
|
|
||||||
double_size_bytes=8;
|
|
||||||
unsigned_long_int_size_bytes=8;
|
|
||||||
float_size_bytes=4;
|
|
||||||
long_int_size_bytes=4;
|
|
||||||
|
|
||||||
skip_bytes_each_read=float_size_bytes*num_float_vars+unsigned_long_int_size_bytes*num_unsigned_long_int_vars+double_size_bytes*num_double_vars+long_int_size_bytes*num_unsigned_int_vars;
|
|
||||||
bytes_shift=0;
|
|
||||||
if (m)
|
|
||||||
usage (m);
|
|
||||||
end
|
|
||||||
|
|
||||||
if (nargin < 2)
|
|
||||||
%count = Inf;
|
|
||||||
file_stats = dir(filename);
|
|
||||||
%round num bytes to read to integer number of samples (to protect the script from binary
|
|
||||||
%dump end file transitory)
|
|
||||||
count = (file_stats.bytes - mod(file_stats.bytes,skip_bytes_each_read))/skip_bytes_each_read;
|
|
||||||
end
|
|
||||||
%loops_counter = fread (f, count, 'uint32',4*12);
|
|
||||||
f = fopen (filename, 'rb');
|
|
||||||
if (f < 0)
|
|
||||||
else
|
|
||||||
v1 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes);
|
|
||||||
bytes_shift=bytes_shift+float_size_bytes;
|
|
||||||
fseek(f,bytes_shift,'bof'); % move to next interleaved float
|
|
||||||
v2 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes);
|
|
||||||
bytes_shift=bytes_shift+float_size_bytes;
|
|
||||||
fseek(f,bytes_shift,'bof'); % move to next interleaved float
|
|
||||||
v3 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes);
|
|
||||||
bytes_shift=bytes_shift+float_size_bytes;
|
|
||||||
fseek(f,bytes_shift,'bof'); % move to next interleaved float
|
|
||||||
v4 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes);
|
|
||||||
bytes_shift=bytes_shift+float_size_bytes;
|
|
||||||
fseek(f,bytes_shift,'bof'); % move to next interleaved float
|
|
||||||
v5 = fread (f, count, 'float',skip_bytes_each_read-float_size_bytes);
|
|
||||||
bytes_shift=bytes_shift+float_size_bytes;
|
|
||||||
fseek(f,bytes_shift,'bof'); % move to next interleaved unsigned_long_int
|
|
||||||
v6 = fread (f, count, 'uint64',skip_bytes_each_read-unsigned_long_int_size_bytes);
|
|
||||||
bytes_shift=bytes_shift+unsigned_long_int_size_bytes;
|
|
||||||
fseek(f,bytes_shift,'bof'); % move to next interleaved double
|
|
||||||
v7 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes);
|
|
||||||
bytes_shift=bytes_shift+double_size_bytes;
|
|
||||||
fseek(f,bytes_shift,'bof'); % move to next interleaved double
|
|
||||||
v8 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes);
|
|
||||||
bytes_shift=bytes_shift+double_size_bytes;
|
|
||||||
fseek(f,bytes_shift,'bof'); % move to next interleaved double
|
|
||||||
v9 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes);
|
|
||||||
bytes_shift=bytes_shift+double_size_bytes;
|
|
||||||
fseek(f,bytes_shift,'bof'); % move to next interleaved double
|
|
||||||
v10 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes);
|
|
||||||
bytes_shift=bytes_shift+double_size_bytes;
|
|
||||||
fseek(f,bytes_shift,'bof'); % move to next interleaved double
|
|
||||||
v11 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes);
|
|
||||||
bytes_shift=bytes_shift+double_size_bytes;
|
|
||||||
fseek(f,bytes_shift,'bof'); % move to next interleaved double
|
|
||||||
v12 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes);
|
|
||||||
bytes_shift=bytes_shift+double_size_bytes;
|
|
||||||
fseek(f,bytes_shift,'bof'); % move to next interleaved double
|
|
||||||
v13 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes);
|
|
||||||
bytes_shift=bytes_shift+double_size_bytes;
|
|
||||||
fseek(f,bytes_shift,'bof'); % move to next interleaved double
|
|
||||||
v14 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes);
|
|
||||||
bytes_shift=bytes_shift+double_size_bytes;
|
|
||||||
fseek(f,bytes_shift,'bof'); % move to next interleaved double
|
|
||||||
v15 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes);
|
|
||||||
bytes_shift=bytes_shift+double_size_bytes;
|
|
||||||
fseek(f,bytes_shift,'bof'); % move to next interleaved double
|
|
||||||
v16 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes);
|
|
||||||
bytes_shift=bytes_shift+double_size_bytes;
|
|
||||||
fseek(f,bytes_shift,'bof'); % move to next interleaved double
|
|
||||||
v17 = fread (f, count, 'float64',skip_bytes_each_read-double_size_bytes);
|
|
||||||
bytes_shift=bytes_shift+double_size_bytes;
|
|
||||||
fseek(f,bytes_shift,'bof'); % move to next interleaved double
|
|
||||||
v18 = fread (f, count, 'uint32',skip_bytes_each_read-double_size_bytes);
|
|
||||||
fclose (f);
|
|
||||||
|
|
||||||
%%%%%%%% output vars %%%%%%%%
|
|
||||||
|
|
||||||
% // EPR
|
|
||||||
% d_dump_file.write(reinterpret_cast<char*>(&tmp_E), sizeof(float));
|
|
||||||
% d_dump_file.write(reinterpret_cast<char*>(&tmp_P), sizeof(float));
|
|
||||||
% d_dump_file.write(reinterpret_cast<char*>(&tmp_L), sizeof(float));
|
|
||||||
% // PROMPT I and Q (to analyze navigation symbols)
|
|
||||||
% d_dump_file.write(reinterpret_cast<char*>(&prompt_I), sizeof(float));
|
|
||||||
% d_dump_file.write(reinterpret_cast<char*>(&prompt_Q), sizeof(float));
|
|
||||||
% // PRN start sample stamp
|
|
||||||
% //tmp_float=(float)d_sample_counter;
|
|
||||||
% d_dump_file.write(reinterpret_cast<char*>(&d_sample_counter), sizeof(unsigned long int));
|
|
||||||
% // accumulated carrier phase
|
|
||||||
% d_dump_file.write(reinterpret_cast<char*>(&d_acc_carrier_phase_rad), sizeof(double));
|
|
||||||
%
|
|
||||||
% // carrier and code frequency
|
|
||||||
% d_dump_file.write(reinterpret_cast<char*>(&d_carrier_doppler_hz), sizeof(double));
|
|
||||||
% d_dump_file.write(reinterpret_cast<char*>(&d_code_freq_chips), sizeof(double));
|
|
||||||
%
|
|
||||||
% //PLL commands
|
|
||||||
% d_dump_file.write(reinterpret_cast<char*>(&carr_phase_error_secs_Ti), sizeof(double));
|
|
||||||
% d_dump_file.write(reinterpret_cast<char*>(&d_carrier_doppler_hz), sizeof(double));
|
|
||||||
%
|
|
||||||
% //DLL commands
|
|
||||||
% d_dump_file.write(reinterpret_cast<char*>(&code_error_chips_Ti), sizeof(double));
|
|
||||||
% d_dump_file.write(reinterpret_cast<char*>(&code_error_filt_chips), sizeof(double));
|
|
||||||
%
|
|
||||||
% // CN0 and carrier lock test
|
|
||||||
% d_dump_file.write(reinterpret_cast<char*>(&d_CN0_SNV_dB_Hz), sizeof(double));
|
|
||||||
% d_dump_file.write(reinterpret_cast<char*>(&d_carrier_lock_test), sizeof(double));
|
|
||||||
%
|
|
||||||
% // AUX vars (for debug purposes)
|
|
||||||
% tmp_double = d_rem_code_phase_samples;
|
|
||||||
% d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double));
|
|
||||||
% tmp_double = static_cast<double>(d_sample_counter + d_current_prn_length_samples);
|
|
||||||
% d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double));
|
|
||||||
% // PRN
|
|
||||||
% unsigned int prn_ = d_acquisition_gnss_synchro->PRN;
|
|
||||||
% d_dump_file.write(reinterpret_cast<char*>(&prn_), sizeof(unsigned int));
|
|
||||||
E=v1;
|
|
||||||
P=v2;
|
|
||||||
L=v3;
|
|
||||||
prompt_I=v4;
|
|
||||||
prompt_Q=v5;
|
|
||||||
PRN_start_sample=v6;
|
|
||||||
acc_carrier_phase_rad=v7;
|
|
||||||
carrier_doppler_hz=v8;
|
|
||||||
code_freq_hz=v9;
|
|
||||||
carr_error=v10;
|
|
||||||
carr_nco=v11;
|
|
||||||
code_error=v12;
|
|
||||||
code_nco=v13;
|
|
||||||
CN0_SNV_dB_Hz=v14;
|
|
||||||
carrier_lock_test=v15;
|
|
||||||
var1=v16;
|
|
||||||
var2=v17;
|
|
||||||
PRN=v18;
|
|
||||||
|
|
||||||
GNSS_tracking.E=E;
|
|
||||||
GNSS_tracking.P=P;
|
|
||||||
GNSS_tracking.L=L;
|
|
||||||
GNSS_tracking.prompt_I=prompt_I;
|
|
||||||
GNSS_tracking.prompt_Q=prompt_Q;
|
|
||||||
GNSS_tracking.PRN_start_sample=PRN_start_sample;
|
|
||||||
GNSS_tracking.acc_carrier_phase_rad=acc_carrier_phase_rad;
|
|
||||||
GNSS_tracking.carrier_doppler_hz=carrier_doppler_hz;
|
|
||||||
GNSS_tracking.code_freq_hz=code_freq_hz;
|
|
||||||
GNSS_tracking.carr_error=carr_error;
|
|
||||||
GNSS_tracking.carr_nco=carr_nco;
|
|
||||||
GNSS_tracking.code_error=code_error
|
|
||||||
GNSS_tracking.code_nco=code_nco;
|
|
||||||
GNSS_tracking.CN0_SNV_dB_Hz=CN0_SNV_dB_Hz;
|
|
||||||
GNSS_tracking.carrier_lock_test=carrier_lock_test;
|
|
||||||
GNSS_tracking.d_rem_code_phase_samples=var1;
|
|
||||||
GNSS_tracking.var2=var2;
|
|
||||||
GNSS_tracking.PRN=PRN;
|
|
||||||
end
|
|
@ -166,18 +166,19 @@ for channelNr = channelList
|
|||||||
title (handles(4, 1), 'Carrier to Noise Ratio');
|
title (handles(4, 1), 'Carrier to Noise Ratio');
|
||||||
|
|
||||||
%----- Carrier Frequency --------------------------------
|
%----- Carrier Frequency --------------------------------
|
||||||
plot (handles(4, 2), timeAxisInSeconds, ...
|
plot (handles(4, 2), timeAxisInSeconds(2:end), ...
|
||||||
trackResults(channelNr).carrFreq(1:settings.msToProcess), 'Color',[0.42 0.25 0.39]);
|
trackResults(channelNr).carrFreq(2:settings.msToProcess), 'Color',[0.42 0.25 0.39]);
|
||||||
|
|
||||||
grid (handles(4, 2));
|
grid (handles(4, 2));
|
||||||
axis (handles(4, 2), 'tight');
|
axis (handles(4, 2));
|
||||||
xlabel(handles(4, 2), 'Time (s)');
|
xlabel(handles(4, 2), 'Time (s)');
|
||||||
ylabel(handles(4, 2), 'Freq (hz)');
|
ylabel(handles(4, 2), 'Freq (hz)');
|
||||||
title (handles(4, 2), 'Carrier Freq');
|
title (handles(4, 2), 'Carrier Freq');
|
||||||
|
|
||||||
%----- Code Frequency----------------------------------
|
%----- Code Frequency----------------------------------
|
||||||
plot (handles(4, 3), timeAxisInSeconds, ...
|
%--- Skip sample 0 to help with results display
|
||||||
trackResults(channelNr).codeFreq(1:settings.msToProcess), 'Color',[0.2 0.3 0.49]);
|
plot (handles(4, 3), timeAxisInSeconds(2:end), ...
|
||||||
|
trackResults(channelNr).codeFreq(2:settings.msToProcess), 'Color',[0.2 0.3 0.49]);
|
||||||
|
|
||||||
grid (handles(4, 3));
|
grid (handles(4, 3));
|
||||||
axis (handles(4, 3), 'tight');
|
axis (handles(4, 3), 'tight');
|
||||||
|
Loading…
Reference in New Issue
Block a user