1
0
mirror of https://github.com/gnss-sdr/gnss-sdr synced 2024-06-18 02:59:58 +00:00
gnss-sdr/src/core/system_parameters/gnss_satellite.cc

722 lines
26 KiB
C++

/*!
* \file gnss_satellite.cc
* \brief Implementation of the Gnss_Satellite class
* \author Carles Fernandez-Prades, 2012. cfernandez(at)cttc.es
*
* -------------------------------------------------------------------------
*
* Copyright (C) 2010-2018 (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 <https://www.gnu.org/licenses/>.
*
* -------------------------------------------------------------------------
*/
#include "gnss_satellite.h"
#include <glog/logging.h>
Gnss_Satellite::Gnss_Satellite()
{
Gnss_Satellite::reset();
}
Gnss_Satellite::Gnss_Satellite(const std::string& system_, uint32_t PRN_)
{
Gnss_Satellite::reset();
Gnss_Satellite::set_system(system_);
Gnss_Satellite::set_PRN(PRN_);
Gnss_Satellite::set_block(system_, PRN_);
}
Gnss_Satellite::~Gnss_Satellite()
{
}
void Gnss_Satellite::reset()
{
system_set = {"GPS", "Glonass", "SBAS", "Galileo", "Beidou"};
satelliteSystem["GPS"] = "G";
satelliteSystem["Glonass"] = "R";
satelliteSystem["SBAS"] = "S";
satelliteSystem["Galileo"] = "E";
satelliteSystem["Beidou"] = "C";
PRN = 0;
system = std::string("");
block = std::string("");
rf_link = 0;
}
std::ostream& operator<<(std::ostream& out, const Gnss_Satellite& sat) // output
{
std::string tag("");
std::string tag2("");
if (sat.get_system().compare("Galileo") == 0) tag = "E";
if (sat.get_PRN() < 10) tag2 = "0";
out << sat.get_system() << " PRN " << tag << tag2 << sat.get_PRN() << " (Block " << sat.get_block() << ")";
return out;
}
bool operator==(const Gnss_Satellite& sat1, const Gnss_Satellite& sat2)
{
bool equal = false;
if (sat1.get_system().compare(sat2.get_system()) == 0)
{
if (sat1.get_PRN() == (sat2.get_PRN()))
{
equal = true;
}
}
return equal;
}
/*
Gnss_Satellite& Gnss_Satellite::operator=(const Gnss_Satellite &rhs) {
// Only do assignment if RHS is a different object from this.
if (this != &rhs) {
// Deallocate, allocate new space, copy values...
const std::string system_ = rhs.get_system();
const uint32_t PRN_ = rhs.get_PRN();
const std::string block_ = rhs.get_block();
// const int32_t rf_link_ = 0;
this->set_system(system_);
this->set_PRN(PRN_);
this->set_block(system_, PRN_);
//this.rf_link = rf_link_;
}
return *this;
}*/
void Gnss_Satellite::set_system(const std::string& system_)
{
// Set the satellite system {"GPS", "Glonass", "SBAS", "Galileo", "Compass"}
std::set<std::string>::iterator it = system_set.find(system_);
if (it != system_set.cend())
{
system = system_;
}
else
{
DLOG(INFO) << "System " << system_ << " is not defined {GPS, Glonass, SBAS, Galileo, Beidou}. Initialization?";
system = std::string("");
}
}
void Gnss_Satellite::update_PRN(uint32_t PRN_)
{
if (system.compare("Glonass") != 0)
{
DLOG(INFO) << "Trying to update PRN for not GLONASS system";
PRN = 0;
}
else
{
if (PRN_ < 1 or PRN_ > 24)
{
DLOG(INFO) << "This PRN is not defined";
// Adjusting for PRN 26, now used in
PRN = PRN_;
}
else
{
PRN = PRN_;
}
}
}
void Gnss_Satellite::set_PRN(uint32_t PRN_)
{
// Set satellite's PRN
if (system.compare("") == 0)
{
DLOG(INFO) << "Trying to define PRN while system is not defined";
PRN = 0;
}
if (system.compare("GPS") == 0)
{
if (PRN_ < 1 or PRN_ > 32)
{
DLOG(INFO) << "This PRN is not defined";
PRN = 0;
}
else
{
PRN = PRN_;
}
}
else if (system.compare("Glonass") == 0)
{
if (PRN_ < 1 or PRN_ > 24)
{
DLOG(INFO) << "This PRN is not defined";
PRN = 0;
}
else
{
PRN = PRN_;
}
}
else if (system.compare("SBAS") == 0)
{
if (PRN_ == 120)
{
PRN = PRN_;
} // EGNOS Test Platform.Inmarsat 3-F2 (Atlantic Ocean Region-East)
else if (PRN_ == 123)
{
PRN = PRN_;
} // EGNOS Operational Platform. Astra 5B
else if (PRN_ == 131)
{
PRN = PRN_;
} // WAAS Eutelsat 117 West B
else if (PRN_ == 135)
{
PRN = PRN_;
} // WAAS Galaxy 15
else if (PRN_ == 136)
{
PRN = PRN_;
} // EGNOS Operational Platform. SES-5 (a.k.a. Sirius 5 or Astra 4B)
else if (PRN_ == 138)
{
PRN = PRN_;
} // WAAS Anik F1R
else
{
DLOG(INFO) << "This PRN is not defined";
PRN = 0;
}
}
else if (system.compare("Galileo") == 0)
{
if (PRN_ < 1 or PRN_ > 36)
{
DLOG(INFO) << "This PRN is not defined";
PRN = 0;
}
else
{
PRN = PRN_;
}
}
else if (system.compare("Beidou") == 0)
{
if (PRN_ < 1 or PRN_ > 36)
{
DLOG(INFO) << "This PRN is not defined";
PRN = 0;
}
else
{
PRN = PRN_;
}
}
else
{
DLOG(INFO) << "System " << system << " is not defined";
PRN = 0;
}
}
int32_t Gnss_Satellite::get_rf_link() const
{
// Get satellite's rf link. Identifies the GLONASS Frequency Channel
int32_t rf_link_;
rf_link_ = rf_link;
return rf_link_;
}
uint32_t Gnss_Satellite::get_PRN() const
{
// Get satellite's PRN
uint32_t PRN_;
PRN_ = PRN;
return PRN_;
}
std::string Gnss_Satellite::get_system() const
{
// Get the satellite system {"GPS", "Glonass", "SBAS", "Galileo", "Beidou"}
std::string system_;
system_ = system;
return system_;
}
std::string Gnss_Satellite::get_system_short() const
{
// Get the satellite system {"G", "R", "S", "E", "C"}
return satelliteSystem.at(system);
}
std::string Gnss_Satellite::get_block() const
{
// Get the satellite block
std::string block_;
block_ = block;
return block_;
}
std::string Gnss_Satellite::what_block(const std::string& system_, uint32_t PRN_)
{
std::string block_ = "Unknown";
if (system_.compare("GPS") == 0)
{
// info from https://www.navcen.uscg.gov/?Do=constellationStatus
switch (PRN_)
{
case 1:
block_ = std::string("IIF"); // Plane D
break;
case 2:
block_ = std::string("IIR"); // Plane D
break;
case 3:
block_ = std::string("IIF"); // Plane E
break;
case 4:
block_ = std::string("Unknown");
break;
case 5:
block_ = std::string("IIR-M"); // Plane E
break;
case 6:
block_ = std::string("IIF"); // Plane D
break;
case 7:
block_ = std::string("IIR-M"); // Plane A
break;
case 8:
block_ = std::string("IIF"); // Plane C
break;
case 9:
block_ = std::string("IIF"); // Plane F
break;
case 10:
block_ = std::string("IIF"); // Plane E
break;
case 11:
block_ = std::string("IIR"); // Plane D
break;
case 12:
block_ = std::string("IIR-M"); // Plane B
break;
case 13:
block_ = std::string("IIR"); // Plane F
break;
case 14:
block_ = std::string("IIR"); // Plane F
break;
case 15:
block_ = std::string("IIR-M"); // Plane F
break;
case 16:
block_ = std::string("IIR"); // Plane B
break;
case 17:
block_ = std::string("IIR-M"); // Plane C
break;
case 18:
block_ = std::string("IIR"); // Plane E
break;
case 19:
block_ = std::string("IIR"); // Plane D
break;
case 20:
block_ = std::string("IIR"); // Plane B
break;
case 21:
block_ = std::string("IIR"); // Plane D
break;
case 22:
block_ = std::string("IIR"); // Plane E
break;
case 23:
block_ = std::string("IIR"); // Plane F
break;
case 24:
block_ = std::string("IIF"); // Plane A
break;
case 25:
block_ = std::string("IIF"); // Plane B
break;
case 26:
block_ = std::string("IIF"); // Plane B
break;
case 27:
block_ = std::string("IIF"); // Plane C
break;
case 28:
block_ = std::string("IIR"); // Plane B
break;
case 29:
block_ = std::string("IIR-M"); // Plane C
break;
case 30:
block_ = std::string("IIF"); // Plane A
break;
case 31:
block_ = std::string("IIR-M"); // Plane A
break;
case 32:
block_ = std::string("IIF"); // Plane F
break;
default:
block_ = std::string("Unknown");
}
}
if (system_.compare("Glonass") == 0)
{
// Info from http://www.sdcm.ru/smglo/grupglo?version=eng&site=extern
// See also http://www.glonass-center.ru/en/GLONASS/
switch (PRN_)
{
case 1:
block_ = std::string("1"); // Plane 1
rf_link = 1;
break;
case 2:
block_ = std::string("-4"); // Plane 1
rf_link = -4;
break;
case 3:
block_ = std::string("5"); // Plane 1
rf_link = 5;
break;
case 4:
block_ = std::string("6"); // Plane 1
rf_link = 6;
break;
case 5:
block_ = std::string("1"); // Plane 1
rf_link = 1;
break;
case 6:
block_ = std::string("-4"); // Plane 1
rf_link = -4;
break;
case 7:
block_ = std::string("5"); // Plane 1
rf_link = 5;
break;
case 8:
block_ = std::string("6"); // Plane 1
rf_link = 6;
break;
case 9:
block_ = std::string("-2"); // Plane 2
rf_link = -2;
break;
case 10:
block_ = std::string("-7"); // Plane 2
rf_link = -7;
break;
case 11:
block_ = std::string("0"); // Plane 2
rf_link = 0;
break;
case 12:
block_ = std::string("-1"); // Plane 2
rf_link = -1;
break;
case 13:
block_ = std::string("-2"); // Plane 2
rf_link = -2;
break;
case 14:
block_ = std::string("-7"); // Plane 2
rf_link = -7;
break;
case 15:
block_ = std::string("0"); // Plane 2
rf_link = 0;
break;
case 16:
block_ = std::string("-1"); // Plane 2
rf_link = -1;
break;
case 17:
block_ = std::string("4"); // Plane 3
rf_link = 4;
break;
case 18:
block_ = std::string("-3"); // Plane 3
rf_link = -3;
break;
case 19:
block_ = std::string("3"); // Plane 3
rf_link = 3;
break;
case 20:
block_ = std::string("2"); // Plane 3
rf_link = 2;
break;
case 21:
block_ = std::string("4"); // Plane 3
rf_link = 4;
break;
case 22:
block_ = std::string("-3"); // Plane 3
rf_link = -3;
break;
case 23:
block_ = std::string("3"); // Plane 3
rf_link = 3;
break;
case 24:
block_ = std::string("2"); // Plane 3
rf_link = 2;
break;
default:
block_ = std::string("Unknown");
}
}
if (system_.compare("SBAS") == 0)
{
switch (PRN_)
{
case 120:
block_ = std::string("EGNOS Test Platform"); // Inmarsat 3-F2 (Atlantic Ocean Region-East)
break;
case 123:
block_ = std::string("EGNOS"); // EGNOS Operational Platform. Astra 5B
break;
case 131:
block_ = std::string("WAAS"); // WAAS Eutelsat 117 West B
break;
case 135:
block_ = std::string("WAAS"); // WAAS Galaxy 15
break;
case 136:
block_ = std::string("EGNOS"); // EGNOS Operational Platform. SES-5 (a.k.a. Sirius 5 or Astra 4B)
break;
case 138:
block_ = std::string("WAAS"); // WAAS Anik F1R
break;
default:
block_ = std::string("Unknown");
}
}
if (system_.compare("Galileo") == 0)
{
// Check http://en.wikipedia.org/wiki/List_of_Galileo_satellites and https://www.gsc-europa.eu/system-status/Constellation-Information
switch (PRN_)
{
case 1:
block_ = std::string("FOC-FM10"); // Galileo Full Operational Capability (FOC) satellite FM10 / GSAT-0210, launched on May 24, 2016.
break;
case 2:
block_ = std::string("FOC-FM11"); // Galileo Full Operational Capability (FOC) satellite FM11 / GSAT-0211, launched on May 24, 2016.
break;
case 3:
block_ = std::string("FOC-FM12"); // Galileo Full Operational Capability (FOC) satellite FM12 / GSAT-0212, launched on November 17, 2016.
break;
case 4:
block_ = std::string("FOC-FM13"); // Galileo Full Operational Capability (FOC) satellite FM13 / GSAT-0213, launched on November 17, 2016.
break;
case 5:
block_ = std::string("FOC-FM14"); // Galileo Full Operational Capability (FOC) satellite FM14 / GSAT-0214, launched on November 17, 2016.
break;
case 7:
block_ = std::string("FOC-FM7"); // Galileo Full Operational Capability (FOC) satellite FM7 / GSAT-0207, launched on November 17, 2016.
break;
case 8:
block_ = std::string("FOC-FM8"); // Galileo Full Operational Capability (FOC) satellite FM8 / GSAT0208, launched on December 17, 2015.
break;
case 9:
block_ = std::string("FOC-FM9"); // Galileo Full Operational Capability (FOC) satellite FM9 / GSAT0209, launched on December 17, 2015.
break;
case 11:
block_ = std::string("IOV-PFM"); // PFM, the ProtoFlight Model / GSAT0101, launched from French Guiana at 10:30 GMT on October 21, 2011.
break;
case 12:
block_ = std::string("IOV-FM2"); // Galileo In-Orbit Validation (IOV) satellite FM2 (Flight Model 2) also known as GSAT0102, from French Guiana at 10:30 GMT on October 21, 2011.
break;
case 13:
block_ = std::string("FOC-FM20"); // Galileo Full Operational Capability (FOC) satellite FM20 / GSAT0220, launched on Jul. 25, 2018. UNDER COMMISSIONING.
break;
case 14:
block_ = std::string("FOC-FM2*"); // Galileo Full Operational Capability (FOC) satellite FM2 / GSAT0202, launched into incorrect orbit on August 22, 2014. Moved to usable orbit in March, 2015. UNDER TESTING.
break;
case 15:
block_ = std::string("FOC-FM21"); // Galileo Full Operational Capability (FOC) satellite FM21 / GSAT0221, launched on Jul. 25, 2018. UNDER COMMISSIONING.
break;
case 18:
block_ = std::string("FOC-FM1*"); // Galileo Full Operational Capability (FOC) satellite FM1 / GSAT0201, launched into incorrect orbit on August 22, 2014. Moved to usable orbit in December, 2014. UNDER TESTING.
break;
case 19:
block_ = std::string("IOV-FM3"); // Galileo In-Orbit Validation (IOV) satellite FM3 (Flight Model 3) / GSAT0103, launched on October 12, 2012.
break;
case 20:
block_ = std::string("IOV-FM4**"); // Galileo In-Orbit Validation (IOV) satellite FM4 (Flight Model 4) / GSAT0104, launched on October 12, 2012. Payload power problem beginning May 27, 2014 led to permanent loss of E5 and E6 transmissions, E1 transmission restored. UNAVAILABLE FROM 2014-05-27 UNTIL FURTHER NOTICE
break;
case 21:
block_ = std::string("FOC-FM15"); // Galileo Full Operational Capability (FOC) satellite FM15 / GSAT0215, launched on Dec. 12, 2017. UNDER COMMISSIONING.
break;
case 22:
block_ = std::string("FOC-FM4**"); // Galileo Full Operational Capability (FOC) satellite FM4 / GSAT0204, launched on March 27, 2015. REMOVED FROM ACTIVE SERVICE ON 2017-12-08 UNTIL FURTHER NOTICE FOR CONSTELLATION MANAGEMENT PURPOSES.
break;
case 24:
block_ = std::string("FOC-FM5"); // Galileo Full Operational Capability (FOC) satellite FM5 / GSAT0205, launched on Sept. 11, 2015.
break;
case 25:
block_ = std::string("FOC-FM16"); // Galileo Full Operational Capability (FOC) satellite FM16 / GSAT0216, launched on Dec. 12, 2017. UNDER COMMISSIONING.
break;
case 26:
block_ = std::string("FOC-FM3"); // Galileo Full Operational Capability (FOC) satellite FM3 / GSAT0203, launched on March 27, 2015.
break;
case 27:
block_ = std::string("FOC-FM17"); // Galileo Full Operational Capability (FOC) satellite FM17 / GSAT0217, launched on Dec. 12, 2017. UNDER COMMISSIONING.
break;
case 30:
block_ = std::string("FOC-FM6"); // Galileo Full Operational Capability (FOC) satellite FM6 / GSAT0206, launched on Sept. 11, 2015.
break;
case 31:
block_ = std::string("FOC-FM18"); // Galileo Full Operational Capability (FOC) satellite FM18 / GSAT0218, launched on Dec. 12, 2017. UNDER COMMISSIONING.
break;
case 33:
block_ = std::string("FOC-FM22"); // Galileo Full Operational Capability (FOC) satellite FM22 / GSAT0222, launched on Jul. 25, 2018. UNDER COMMISSIONING.
break;
case 36:
block_ = std::string("FOC-FM19"); // Galileo Full Operational Capability (FOC) satellite FM19 / GSAT0219, launched on Jul. 25, 2018. UNDER COMMISSIONING.
break;
default:
block_ = std::string("Unknown(Simulated)");
}
}
if (system_.compare("Beidou") == 0)
{
// Check https://en.wikipedia.org/wiki/List_of_BeiDou_satellites
switch ( PRN_ )
{
case 1:
block_ = std::string("Compass-G1");
break;
case 2:
block_ = std::string("Compass-G6");
break;
case 3:
block_ = std::string("Compass-G3");
break;
case 4:
block_ = std::string("Compass-G4");
break;
case 5:
block_ = std::string("Compass-G5");
break;
case 6:
block_ = std::string("Compass-IGSO1");
break;
case 7:
block_ = std::string("Compass-IGSO2");
break;
case 8:
block_ = std::string("Compass-IGSO3");
break;
case 9:
block_ = std::string("Compass-IGSO4");
break;
case 10:
block_ = std::string("Compass-IGSO5");
break;
case 11:
block_ = std::string("Compass-M3");
break;
case 12:
block_ = std::string("Compass-M4");
break;
case 13:
block_ = std::string("Compass-M2");
break;
case 14:
block_ = std::string("Compass-M5");
break;
case 17:
block_ = std::string("Compass-G7");
break;
case 19:
block_ = std::string("BeiDou-3 M1");
break;
case 20:
block_ = std::string("BeiDou-3 M2");
break;
case 21:
block_ = std::string("BeiDou-3 M3");
break;
case 22:
block_ = std::string("BeiDou-3 M4");
break;
case 27:
block_ = std::string("BeiDou-3 M7");
break;
case 28:
block_ = std::string("BeiDou-3 M8");
break;
case 29:
block_ = std::string("BeiDou-3 M9");
break;
case 30:
block_ = std::string("BeiDou-3 M10");
break;
case 31:
block_ = std::string("BDS I1-S");
break;
case 32:
block_ = std::string("BDS I2-S");
break;
case 33:
block_ = std::string("BDS M1-S");
break;
case 34:
block_ = std::string("BDS M2-S");
break;
case 35:
block_ = std::string("BDS M3-S");
break;
default:
block_ = std::string("Unknown(Simulated)");
}
}
return block_;
}
void Gnss_Satellite::set_block(const std::string& system_, uint32_t PRN_)
{
block = what_block(system_, PRN_);
}