25#include "ns3/double.h"
28#include "ns3/singleton.h"
29#include "ns3/string.h"
39NS_LOG_COMPONENT_DEFINE(
"SatFadingExternalInputTraceContainer");
50 TypeId(
"ns3::SatFadingExternalInputTraceContainer")
52 .AddConstructor<SatFadingExternalInputTraceContainer>()
53 .AddAttribute(
"UtInputMode",
54 "Input mode to read trace source files from given index table.",
56 MakeEnumAccessor<SatFadingExternalInputTraceContainer::InputMode_t>(
65 "UtRtnUpIndexFileName",
66 "Index file defining trace source files for return up link/UTs.",
67 StringValue(
"BeamId-1_256_UT_fading_rtnup_trace_index.txt"),
71 "UtFwdDownIndexFileName",
72 "Index file defining trace source files for forward down link/UTs.",
73 StringValue(
"BeamId-1_256_UT_fading_fwddwn_trace_index.txt"),
77 "GwFwdUpIndexFileName",
78 "Index file defining trace source files for forward up link/GWs.",
79 StringValue(
"GW_fading_fwdup_traces.txt"),
83 "GwRtnDownIndexFileName",
84 "Index file defining trace source files for return down link/GWs.",
85 StringValue(
"GW_fading_rtndwn_traces.txt"),
90 "Maximum distance allowed to fading source in position based mode [m].",
93 MakeDoubleChecker<double>());
102 NS_LOG_FUNCTION(
this);
108 NS_LOG_FUNCTION(
this);
110 Object::NotifyConstructionCompleted();
113 "/additional-input/ext-fadingtraces/input/";
118 NS_LOG_FUNCTION(
this);
127 NS_LOG_FUNCTION(
this);
142 Ptr<MobilityModel> mobility)
144 NS_LOG_FUNCTION(
this << utId);
151 Ptr<SatFadingExternalInputTrace> ftRet =
157 Ptr<SatFadingExternalInputTrace> ftFwd =
166 m_utFadingMap.insert(std::make_pair(utId, std::make_pair(ftRet, ftFwd)));
171 Ptr<MobilityModel> mobility)
173 NS_LOG_FUNCTION(
this << gwId);
180 Ptr<SatFadingExternalInputTrace> ftRet =
186 Ptr<SatFadingExternalInputTrace> ftFwd =
195 m_gwFadingMap.insert(std::make_pair(gwId, std::make_pair(ftRet, ftFwd)));
198Ptr<SatFadingExternalInputTrace>
201 Ptr<MobilityModel> mobility)
203 NS_LOG_FUNCTION(
this << nodeId);
205 Ptr<SatFadingExternalInputTrace> ft;
209 std::map<uint32_t, ChannelTracePair_t>::iterator iter =
m_utFadingMap.find(nodeId);
220 std::map<uint32_t, ChannelTracePair_t>::iterator iter =
m_utFadingMap.find(nodeId);
231 std::map<uint32_t, ChannelTracePair_t>::iterator iter =
m_gwFadingMap.find(nodeId);
242 std::map<uint32_t, ChannelTracePair_t>::iterator iter =
m_gwFadingMap.find(nodeId);
253 NS_LOG_ERROR(
this <<
" not valid channel type!");
263 NS_LOG_FUNCTION(
this << numOfUts << numOfGws);
264 NS_ASSERT(numOfUts > 0);
265 NS_ASSERT(numOfGws > 0);
279 for (uint32_t i = 1; i <= numOfUts; i++)
281 std::map<uint32_t, ChannelTracePair_t>::iterator iter =
m_utFadingMap.find(i);
290 for (uint32_t i = 1; i <= numOfGws; i++)
292 std::map<uint32_t, ChannelTracePair_t>::iterator iter =
m_gwFadingMap.find(i);
306 std::map<uint32_t, ChannelTracePair_t>::const_iterator cit;
309 if (!cit->second.first->TestFadingTrace())
313 if (!cit->second.second->TestFadingTrace())
322 if (!cit->second.first->TestFadingTrace())
326 if (!cit->second.second->TestFadingTrace())
340 NS_LOG_FUNCTION(
this << indexFile);
343 std::ifstream* ifs =
new std::ifstream((
m_dataPath + indexFile).c_str(), std::ios::in);
347 double lat, lon, alt;
349 std::string fileName;
351 *ifs >>
id >> fileName >> lat >> lon >> alt;
355 NS_LOG_DEBUG(
this <<
" id = " <<
id <<
" file = " << fileName
356 <<
" latitude [deg] = " << lat <<
" longitude [deg] = " << lon);
360 container.push_back(item);
363 *ifs >>
id >> fileName >> lat >> lon >> alt;
370 NS_FATAL_ERROR(
m_dataPath << indexFile <<
" index file not found.");
376Ptr<SatFadingExternalInputTrace>
382 Ptr<MobilityModel> mobility)
384 NS_LOG_FUNCTION(
this << mobility);
386 Ptr<SatFadingExternalInputTrace> trace;
387 std::string fileName;
392 if (container.empty() || (
id > container.size()))
394 NS_FATAL_ERROR(
"No input available!");
398 fileName = container.at(
id).first;
403 if (container.empty())
405 NS_FATAL_ERROR(
"No input available!");
409 fileName = container.at(std::rand() % container.size()).first;
418 NS_FATAL_ERROR(
"Not supported mode.");
422 NS_LOG_INFO(
"Creation info: Mode=" <<
m_utInputMode <<
", ID (GW/UT)=" <<
id
423 <<
", FileName=" << fileName);
427 TraceInputContainer_t::iterator it =
m_loadedTraces.find(fileName);
432 trace = Create<SatFadingExternalInputTrace>(fileType,
m_dataPath + fileName);
445 Ptr<MobilityModel> mobility)
447 NS_LOG_FUNCTION(
this << mobility);
449 std::string fileName;
450 double currentDistanceToFading = std::numeric_limits<double>::max();
451 Vector position = mobility->GetPosition();
453 for (TraceFileContainer_t::iterator it = container.begin(); it != container.end(); it++)
455 Vector fadingPosition = it->second.ToVector();
457 double distanceToFading = CalculateDistance(position, fadingPosition);
459 if (distanceToFading < currentDistanceToFading)
461 currentDistanceToFading = distanceToFading;
462 fileName = it->first;
469 "No valid fading based on position (min found distance, max allowed distance): "
474 NS_LOG_INFO(
"Minimum distance to fading trace source: " << currentDistanceToFading);
GeoCoordinate class is used to store and operate with geodetic coordinates.
ChannelType_t
Types of channel.
static Ptr< SatEnvVariables > GetInstance()
SatArqSequenceNumber is handling the sequence numbers for the ARQ process.