25 #include <ns3/boolean.h>
26 #include <ns3/double.h>
29 #include <ns3/string.h>
30 #include <ns3/uinteger.h>
38 NS_LOG_COMPONENT_DEFINE(
"SatBbFrameConf");
59 : m_modcod(
SatEnums::SAT_MODCOD_QPSK_1_TO_2),
61 m_frameDuration(Seconds(0.0)),
65 NS_LOG_FUNCTION(
this);
79 m_frameDuration(frameDur),
80 m_payloadBits(payloadBits),
88 NS_LOG_FUNCTION(
this);
95 NS_LOG_FUNCTION(
this);
102 NS_LOG_FUNCTION(
this);
109 NS_LOG_FUNCTION(
this);
116 NS_LOG_FUNCTION(
this);
123 NS_LOG_FUNCTION(
this << cnoRequirement);
130 NS_LOG_FUNCTION(
this);
140 : m_symbolRate(100000000.0),
141 m_symbolsPerSlot(90),
142 m_pilotBlockInSymbols(0),
143 m_pilotBlockIntervalInSlots(36),
144 m_plHeaderInSlots(1),
145 m_dummyFrameInSlots(36),
146 m_bbFrameHeaderSizeInBytes(10),
147 m_bbFrameHighOccupancyThreshold(0.9),
148 m_bbFrameLowOccupancyThreshold(0.5),
149 m_targetBler(0.00001),
151 m_defaultModCodDummyFramesS2X(
SatEnums::SAT_NONVALID_MODCOD),
152 m_defaultModCodDummyFramesS2XStr(
"QPSK_1_TO_4"),
153 m_defaultModCod(
SatEnums::SAT_NONVALID_MODCOD),
154 m_defaultModCodStr(
"QPSK_1_TO_2"),
155 m_shortFramePayloadInSlots(),
156 m_normalFramePayloadInSlots(),
158 m_bbFrameUsageMode(
SatEnums::NORMAL_FRAMES),
159 m_mostRobustShortFrameModcod(
SatEnums::SAT_NONVALID_MODCOD),
160 m_mostRobustNormalFrameModcod(
SatEnums::SAT_NONVALID_MODCOD),
162 m_bbFrameS2XPilots(true),
165 NS_LOG_FUNCTION(
this);
166 NS_FATAL_ERROR(
"Default constructor not supported!!!");
170 : m_symbolRate(symbolRate),
171 m_symbolsPerSlot(90),
172 m_pilotBlockInSymbols(0),
173 m_pilotBlockIntervalInSlots(36),
174 m_plHeaderInSlots(1),
175 m_dummyFrameInSlots(36),
176 m_bbFrameHeaderSizeInBytes(10),
177 m_bbFrameHighOccupancyThreshold(0.9),
178 m_bbFrameLowOccupancyThreshold(0.5),
179 m_targetBler(0.00001),
181 m_defaultModCodDummyFramesS2X(
SatEnums::SAT_NONVALID_MODCOD),
182 m_defaultModCodDummyFramesS2XStr(
"QPSK_1_TO_4"),
183 m_defaultModCod(
SatEnums::SAT_NONVALID_MODCOD),
184 m_defaultModCodStr(
"QPSK_1_TO_2"),
185 m_shortFramePayloadInSlots(),
186 m_normalFramePayloadInSlots(),
188 m_bbFrameUsageMode(
SatEnums::NORMAL_FRAMES),
189 m_mostRobustShortFrameModcod(
SatEnums::SAT_NONVALID_MODCOD),
190 m_mostRobustNormalFrameModcod(
SatEnums::SAT_NONVALID_MODCOD),
191 m_dvbVersion(dvbVersion),
192 m_bbFrameS2XPilots(true),
195 ObjectBase::ConstructSelf(AttributeConstructionList());
198 for (uint32_t i = 0; i < 7; ++i)
216 NS_FATAL_ERROR(
"Cannot use NORMAL_AND_SHORT_FRAMES with DVB-S2X ModCods");
230 NS_FATAL_ERROR(
"Unknown DVB version used");
237 ") is not in the list of used ModCods.");
241 std::vector<SatEnums::SatBbFrameType_t> frameTypes;
245 for (std::vector<SatEnums::SatModcod_t>::const_iterator mit =
m_modCodsUsed.begin();
252 for (std::vector<SatEnums::SatBbFrameType_t>::const_iterator fit = frameTypes.begin();
253 fit != frameTypes.end();
262 Ptr<SatDvbS2Waveform> wf = Create<SatDvbS2Waveform>(*mit, *fit, len, pl);
263 m_waveforms.insert(std::make_pair(std::make_pair(*mit, *fit), wf));
274 Ptr<SatDvbS2Waveform> wf = Create<SatDvbS2Waveform>(*mit, fit, len, pl);
275 m_waveforms.insert(std::make_pair(std::make_pair(*mit, fit), wf));
295 Ptr<SatDvbS2Waveform> wf = Create<SatDvbS2Waveform>(mit, fit, len, pl);
296 m_waveforms.insert(std::make_pair(std::make_pair(mit, fit), wf));
300 uint32_t payloadBitsForShortFrame = std::numeric_limits<uint32_t>::max();
301 uint32_t payloadBitsForNormalFrame = std::numeric_limits<uint32_t>::max();
304 for (waveformMap_t::const_reverse_iterator rit =
m_waveforms.rbegin();
311 if (rit->second->GetPayloadInBits() < payloadBitsForShortFrame)
313 payloadBitsForShortFrame = rit->second->GetPayloadInBits();
321 if (rit->second->GetPayloadInBits() < payloadBitsForNormalFrame)
323 payloadBitsForNormalFrame = rit->second->GetPayloadInBits();
334 "The most robust MODCOD not found for short frames, BB frame configuration error???");
341 "The most robust MODCOD not found for normal frames, BB frame configuration error???");
349 NS_FATAL_ERROR(
"The most robust MODCODs are different for short and normal frames!!!");
357 TypeId(
"ns3::SatBbFrameConf")
359 .AddAttribute(
"SymbolsPerSlot",
360 "Number of symbols per slot",
363 MakeUintegerChecker<uint32_t>())
364 .AddAttribute(
"PilotBlockInSymbols",
365 "Pilot block size in symbols",
368 MakeUintegerChecker<uint32_t>())
369 .AddAttribute(
"PilotBlockIntervalInSlots",
370 "Pilot block interval in slots",
373 MakeUintegerChecker<uint32_t>())
374 .AddAttribute(
"PlHeaderInSlots",
375 "PL header size in slots",
378 MakeUintegerChecker<uint32_t>())
379 .AddAttribute(
"DummyFrameInSlots",
380 "Dummy frame size in slots",
383 MakeUintegerChecker<uint32_t>())
384 .AddAttribute(
"TargetBLER",
385 "Block error rate target",
386 DoubleValue(0.00001),
388 MakeDoubleChecker<double>())
389 .AddAttribute(
"AcmEnabled",
393 MakeBooleanChecker())
394 .AddAttribute(
"DefaultModCod",
396 StringValue(
"QPSK_1_TO_2"),
399 .AddAttribute(
"DefaultModCodDummyFramesS2X",
400 "Default MODCOD for DVB-S2X Dummy Frames. In DVB-S2, Dummy Frames use "
402 StringValue(
"QPSK_1_TO_4"),
405 .AddAttribute(
"BbFrameHeaderInBytes",
406 "BB Frame header size in bytes",
409 MakeUintegerChecker<uint32_t>())
410 .AddAttribute(
"BbFrameHighOccupancyThreshold",
411 "BB Frame high occupancy threshold [0-1]",
414 MakeDoubleChecker<double>(0.0, 1.0))
415 .AddAttribute(
"BbFrameLowOccupancyThreshold",
416 "BB Frame low occupancy threshold [0-1]",
419 MakeDoubleChecker<double>(0.0, 1.0))
420 .AddAttribute(
"BBFrameUsageMode",
421 "Mode for selecting used BB Frames.",
429 "ShortAndNormalFrames"))
430 .AddAttribute(
"BBFramePilotsS2X",
431 "Use Pilots in DVB-S2X BB Frames.",
434 MakeBooleanChecker())
435 .AddAttribute(
"ModCodsUsed",
436 "List of DVB-S2X ModCods used. If nothing specified, all available "
441 .AddConstructor<SatBbFrameConf>();
453 NS_LOG_FUNCTION(
this);
459 NS_LOG_FUNCTION(
this);
468 double esnoRequirementDb =
469 linkResults->GetEsNoDb(it->second->GetModcod(), it->first.second,
m_targetBler);
483 NS_LOG_FUNCTION(
this);
494 NS_LOG_FUNCTION(
this);
498 std::vector<SatEnums::SatModcod_t>
501 NS_LOG_FUNCTION(
this);
509 NS_LOG_FUNCTION(
this << modcod << frameType);
511 uint32_t dataSlots(0);
525 NS_FATAL_ERROR(
"Unsupported enum SatBbFrameType_t!");
538 NS_LOG_FUNCTION(
this << modcod << frameType);
540 uint32_t dataSlots(0);
554 NS_FATAL_ERROR(
"Unsupported enum SatBbFrameType_t!");
564 uint32_t totalSymbols = dataSymbols + pilotSymbols;
567 return Seconds(frameLength);
573 NS_LOG_FUNCTION(
this);
589 NS_FATAL_ERROR(
"Incorrect DVB version");
601 prefix =
"SAT_MODCOD_";
605 prefix =
"SAT_MODCOD_S2X_";
606 suffix = std::string(
"_") +
611 NS_FATAL_ERROR(
"Incorrect DVB version");
614 while (getline(strm, name,
' '))
626 NS_LOG_FUNCTION(
this << modcod << frameType);
627 return m_waveforms.at(std::make_pair(modcod, frameType))->GetPayloadInBits();
633 NS_LOG_FUNCTION(
this);
641 NS_LOG_FUNCTION(
this << modcod << frameType);
642 return m_waveforms.at(std::make_pair(modcod, frameType))->GetFrameDuration();
648 NS_LOG_FUNCTION(
this);
655 NS_LOG_FUNCTION(
this << frameType);
664 for (waveformMap_t::const_reverse_iterator rit =
m_waveforms.rbegin();
668 if (rit->second->GetBbFrameType() == frameType)
670 double cnoReq = rit->second->GetCNoRequirement();
674 return rit->second->GetModcod();
684 NS_LOG_FUNCTION(
this << frameType);
698 NS_FATAL_ERROR(
"Not supported frame type!!!");
701 return mostRobustModcod;
707 NS_LOG_FUNCTION(
this);
714 NS_LOG_FUNCTION(
this);
This class implements the BB Frame configurations for DVB-S2.
SatEnums::BbFrameUsageMode_t m_bbFrameUsageMode
BBFrame usage mode.
double GetSymbolRate()
Symbol rate in baud.
uint32_t m_pilotBlockInSymbols
The size of the pilot block in symbols.
void GetModCodsList()
Get the list of ModCods from their string representation.
void DumpWaveforms() const
Dump waveform details for debugging purposes.
SatBbFrameConf()
Default constructor.
uint32_t m_symbolsPerSlot
The size of the (data) slot in symbols.
Time CalculateBbFrameDuration(SatEnums::SatModcod_t modcod, SatEnums::SatBbFrameType_t frameType) const
Calculate the BBFrame duration in Time.
double m_targetBler
Block error rate target for the waveforms.
void InitializeCNoRequirements(Ptr< SatLinkResultsFwd > linkResults)
Initialize the C/No requirements for a given BLER target.
virtual ~SatBbFrameConf()
Destructor for SatBbFrameConf.
double m_bbFrameLowOccupancyThreshold
The BB frame low occupancy threshold in range 0 - 1.
double m_bbFrameHighOccupancyThreshold
The BB frame high occupancy threshold in range 0 - 1.
std::map< uint32_t, uint32_t > m_normalFramePayloadInSlots
SatEnums::SatModcod_t m_defaultModCodDummyFramesS2X
Default MODCOD for DVB-S2X dummy Frames.
bool m_acmEnabled
Flag to indicate whether ACM is enabled or disabled.
static TypeId GetTypeId(void)
Get the type ID.
std::string m_defaultModCodStr
The string representation of default ModCod.
Time GetBbFrameDuration(SatEnums::SatModcod_t modcod, SatEnums::SatBbFrameType_t frameType) const
Get the BB frame frame duration.
std::vector< SatEnums::SatModcod_t > m_modCodsUsed
List of ModCods used.
bool m_bbFrameS2XPilots
Indicates if using pilots in BBFrames when DVB-S2X is chosen.
std::map< uint32_t, uint32_t > m_shortFramePayloadInSlots
uint32_t m_bbFrameHeaderSizeInBytes
The BB frame header size in bytes.
uint32_t m_plHeaderInSlots
The PL header size in slots.
SatEnums::SatModcod_t GetMostRobustModcod(SatEnums::SatBbFrameType_t frameType) const
Get the most robust MODCOD with a given BB frame type.
SatEnums::SatModcod_t m_mostRobustShortFrameModcod
The most robust MODCOD for short frame.
std::string m_defaultModCodDummyFramesS2XStr
String representation of default ModCod for DVB-S2X Dummy Frames.
virtual TypeId GetInstanceTypeId(void) const
Get the type ID of instance.
SatEnums::DvbVersion_t GetDvbVersion()
Indicates if using DVB-S2 or DVB-S2X.
SatEnums::DvbVersion_t m_dvbVersion
Indicates if using DVB-S2 or DVB-S2X.
uint32_t m_pilotBlockIntervalInSlots
Interval of pilot block in slots.
uint32_t GetBbFramePayloadBits(SatEnums::SatModcod_t modcod, SatEnums::SatBbFrameType_t frameType) const
Get the BB frame payload in bits.
Time GetDummyBbFrameDuration() const
Get the dummy frame duration in Time.
std::vector< SatEnums::SatModcod_t > GetModCodsUsed()
Get the list of ModCods used.
SatEnums::SatModcod_t GetDefaultModCod() const
Get the default MODCOD.
uint32_t CalculateBbFramePayloadBits(SatEnums::SatModcod_t modcod, SatEnums::SatBbFrameType_t frameType) const
Calculate the BBrame higher layer payload in bits.
SatEnums::SatModcod_t GetBestModcod(double cNo, SatEnums::SatBbFrameType_t frameType) const
Get the best MODCOD with a given BB frame type.
std::string m_modCodsUsedStr
String containing all DVB-S2X ModCods used.
waveformMap_t m_waveforms
Available "waveforms", i.e.
SatEnums::SatModcod_t m_defaultModCod
Default MODCOD is used.
SatEnums::SatModcod_t GetDefaultModCodDummyFramesS2X() const
Get the default MODCOD for short DVB-S2X frames.
SatEnums::SatModcod_t m_mostRobustNormalFrameModcod
The most robust MODCOD for long frame.
double m_symbolRate
Symbol rate in baud.
uint32_t m_dummyFrameInSlots
Dummy BBFrame length in slots.
SatEnums class is for simplifying the use of enumerators in the satellite module.
static SatModcod_t GetModcodFromName(const std::string name)
static void GetAvailableBbFrameTypes(std::vector< SatBbFrameType_t > &frameTypes)
SatBbFrameType_t
BB frame type used in DVB-S2 FWD link.
SatModcod_t
Modulation scheme and coding rate for DVB-S2.
static void GetAvailableModcodsFwdLinkS2X(std::vector< SatModcod_t > &modcods, SatEnums::BbFrameUsageMode_t type, bool pilots)
static std::string GetModcodTypeName(SatModcod_t modcod)
@ SHORT_AND_NORMAL_FRAMES
SHORT_AND_NORMAL_FRAMES.
@ SHORT_FRAMES
SHORT_FRAMES.
@ NORMAL_FRAMES
NORMAL_FRAMES.
DvbVersion_t
The scheduling algorithm used to fill the BBFrames.
static void GetAvailableModcodsFwdLink(std::vector< SatModcod_t > &modcods)
static SatEnums::SatBbFrameType_t GetFrameTypeS2X(SatEnums::SatModcod_t modcod)
static T DbToLinear(T db)
Converts decibels to linear.
static uint32_t GetModulatedBits(SatEnums::SatModcod_t modcod)
Get the modulated bits of a certain MODCOD.
static double GetCodingRate(SatEnums::SatModcod_t modcod)
Gets the coding rate of a certain MODCOD.
SatArqSequenceNumber is handling the sequence numbers for the ARQ process.
const uint32_t payloadConf[7][3]
1st col = modulated bits 2nd col = payload slots per normal frame 3rnd col = payload slots per short ...