26#include "ns3/satellite-env-variables.h"
27#include "ns3/singleton.h"
28#include "ns3/string.h"
42NS_LOG_COMPONENT_DEFINE(
"SatAntennaGainPatternContainer");
54 static TypeId tid = TypeId(
"ns3::SatAntennaGainPatternContainer")
56 .AddConstructor<SatAntennaGainPatternContainer>();
62 NS_LOG_FUNCTION(
this);
64 NS_FATAL_ERROR(
"Constructor not in use");
68 std::string patternsFolder)
70 NS_LOG_FUNCTION(
this << nbSats << patternsFolder);
76 NS_LOG_INFO(
this <<
" directory for antenna patterns set to " <<
m_patternsFolder);
80 NS_FATAL_ERROR(
"SatAntennaGainPatternContainer::SatAntennaGainPatternContainer directory "
90 while ((ent = readdir(dir)) !=
nullptr)
92 std::string filename{ent->d_name};
93 std::size_t pathLength = filename.length();
97 if (filename.substr(pathLength) ==
".txt")
99 std::string num, stem = filename.substr(0, pathLength);
100 std::size_t found = stem.find_last_not_of(
numbers);
101 if (found == std::string::npos)
108 num = stem.substr(found + 1);
109 stem.erase(found + 1);
120 "SatAntennaGainPatternContainer::SatAntennaGainPatternContainer mixing "
121 "different prefix for antenna pattern names: "
122 << prefix <<
" and " << stem);
126 std::istringstream ss{num};
132 "SatAntennaGainPatternContainer::SatAntennaGainPatternContainer unable "
133 "to find beam number in "
134 << filePath <<
" file name");
137 Ptr<SatAntennaGainPattern> gainPattern =
138 CreateObject<SatAntennaGainPattern>(filePath, geoPos);
139 std::pair<std::map<uint32_t, Ptr<SatAntennaGainPattern>>::iterator,
bool> ret;
142 if (ret.second ==
false)
144 NS_FATAL_ERROR(
"SatAntennaGainPatternContainer::"
145 "SatAntennaGainPatternContainer an antenna pattern for beam "
146 << beamId <<
" already exists!");
156 const char* error = strerror(errno);
157 NS_FATAL_ERROR(
"SatAntennaGainPatternContainer::SatAntennaGainPatternContainer unable to "
165 NS_LOG_FUNCTION(
this);
171 NS_LOG_FUNCTION(
this);
176 std::ifstream* ifs =
new std::ifstream(geoPosFilename, std::ifstream::in);
180 NS_FATAL_ERROR(
"The file " << geoPosFilename <<
" is not found.");
183 double lat, lon, alt;
184 *ifs >> lat >> lon >> alt;
195Ptr<SatAntennaGainPattern>
198 NS_LOG_FUNCTION(
this << beamId);
200 std::map<uint32_t, Ptr<SatAntennaGainPattern>>::const_iterator agp =
205 "SatAntennaGainPatternContainer::GetAntennaGainPattern - unvalid beam id: " << beamId);
214 NS_LOG_FUNCTION(
this << satelliteId);
216 std::map<uint32_t, Ptr<SatMobilityModel>>::const_iterator mm =
221 "SatAntennaGainPatternContainer::GetAntennaGainPattern - unvalid satellite id: "
236 double bestGain(-100.0);
243 uint32_t i = entry.first;
244 double gain = entry.second->GetAntennaGain_lin(coord, mobility);
248 if (std::isnan(gain))
252 NS_LOG_WARN(
"SatAntennaGainPatternContainer::GetBestBeamId - Beam "
253 << i <<
" returned a NAN antenna gain value!");
257 NS_FATAL_ERROR(
"SatAntennaGainPatternContainer::GetBestBeamId - Beam "
258 << i <<
" returned a NAN antenna gain value!");
261 else if (gain > bestGain)
268 if (bestId == 0 && ignoreNan)
271 "SatAntennaGainPatternContainer::GetBestBeamId - did not find any good beam! The "
272 "ground station is probably too far from the satellite. Return 0 by default.");
289 return std::numeric_limits<double>::quiet_NaN();
293 return pattern->GetAntennaGain_lin(coord, mobility);
299 NS_LOG_FUNCTION(
this);
308 Ptr<SatMobilityModel> mobility)
310 NS_LOG_FUNCTION(
this << satelliteId << mobility);
321 uint32_t beamIdIterator = it->first;
322 BeamUserInfoMap_t::iterator infoIterator;
324 for (infoIterator = info.begin(); infoIterator != info.end(); infoIterator++)
326 uint32_t beamId = infoIterator->first.second;
327 if (beamId == beamIdIterator)
GeoCoordinate class is used to store and operate with geodetic coordinates.
double GetLatitude() const
Gets latitude value of coordinate.
double GetLongitude() const
Gets longitude value of coordinate.
Antenna gain pattern container holds all antenna patterns related to a satellite system.
double GetBeamGain(uint32_t satelliteId, uint32_t beamId, GeoCoordinate coord)
Get beam gain for given coordinates.
Ptr< SatAntennaGainPattern > GetAntennaGainPattern(uint32_t beamId) const
Get the antenna pattern of a specified beam id.
std::string m_patternsFolder
GeoCoordinate GetDefaultGeoPosition()
Load the default satellite position associated to these traces.
SatAntennaGainPatternContainer()
Default constructor.
uint32_t GetBestBeamId(uint32_t satelliteId, GeoCoordinate coord, bool ignoreNan)
Get the best beam id based on the antenna patterns in a specified geo coordinate.
std::map< uint32_t, Ptr< SatAntennaGainPattern > > m_antennaPatternMap
Container of antenna patterns.
uint32_t GetNAntennaGainPatterns() const
Get the number of stored antenna pattern.
void SetEnabledBeams(BeamUserInfoMap_t &info)
~SatAntennaGainPatternContainer()
static TypeId GetTypeId(void)
Get the type ID.
std::map< std::pair< uint32_t, uint32_t >, SatBeamUserInfo > BeamUserInfoMap_t
definition for beam map key is pair sat ID / beam ID and value is UT/user info.
void ConfigureBeamsMobility(uint32_t satelliteId, Ptr< SatMobilityModel > mobility)
Ptr< SatMobilityModel > GetAntennaMobility(uint32_t satelliteId) const
Get the mobility model of a specified satellite id.
std::map< uint32_t, Ptr< SatMobilityModel > > m_mobilityModelMap
Container of mobility models.
static Ptr< SatEnvVariables > GetInstance()
SatArqSequenceNumber is handling the sequence numbers for the ARQ process.
const std::string numbers