26#include "ns3/simulator.h"
27#include "ns3/singleton.h"
38NS_LOG_COMPONENT_DEFINE(
"SatPerPacketInterference");
48 static TypeId tid = TypeId(
"ns3::SatPerPacketInterference")
50 .AddConstructor<SatPerPacketInterference>();
63 NS_LOG_FUNCTION(
this);
75 NS_LOG_FUNCTION(
this << channelType << rxBandwidthHz);
79 NS_FATAL_ERROR(
"SatPerPacketInterference::SatPerPacketInterference - Invalid value");
85 NS_LOG_FUNCTION(
this);
90Ptr<SatInterference::InterferenceChangeEvent>
93 NS_LOG_FUNCTION(
this << duration << power << rxAddress);
95 Ptr<SatInterference::InterferenceChangeEvent> event;
96 event = Create<SatInterference::InterferenceChangeEvent>(
m_nextEventId++,
100 Time now =
event->GetStartTime();
102 NS_LOG_INFO(
"Add change: Duration= " << duration <<
", Power= " << power <<
", Time: " << now);
112 long double powerValue;
113 std::tie(eventID, powerValue, std::ignore) = i->second;
115 NS_LOG_INFO(
"Change to erase: Time= " << i->first <<
", Id= " << eventID
116 <<
", PowerValue= " << powerValue);
142 std::make_pair(event->GetEndTime(),
InterferenceChange(event->GetId(), -power,
true)));
149 NS_FATAL_ERROR(
"First power negative!!!");
155std::vector<std::pair<double, double>>
158 NS_LOG_FUNCTION(
this);
162 NS_FATAL_ERROR(
"Receiving is not set on!!!");
166 double rxDuration =
event->GetDuration().GetDouble();
167 double rxEndTime =
event->GetEndTime().GetDouble();
168 bool ownStartReached =
false;
170 NS_LOG_INFO(
"Calculate: IfPower (W)= " << ifPowerW <<
", Event ID= " << event->GetId()
171 <<
", Duration= " << event->GetDuration()
172 <<
", StartTime= " << event->GetStartTime()
173 <<
", EndTime= " << event->GetEndTime());
181 long double powerValue;
183 std::tie(eventID, powerValue, isEndEvent) = currentItem->second;
185 if (event->GetId() == eventID)
189 NS_LOG_INFO(
"IfPower after end event: " << ifPowerW);
195 ownStartReached =
true;
198 else if (ownStartReached)
202 double itemTime = currentItem->first.GetDouble();
205 NS_LOG_INFO(
"Update (partial): ID: " << eventID <<
", Power (W)= " << powerValue
206 <<
", Time= " << currentItem->first
207 <<
", DeltaTime= " << (rxEndTime - itemTime));
209 NS_LOG_INFO(
"IfPower after update: " << ifPowerW);
214 ifPowerW += powerValue;
216 NS_LOG_INFO(
"Update (full): ID: " << eventID <<
", Power (W)= " << powerValue);
217 NS_LOG_INFO(
"IfPower after update: " << ifPowerW);
225 std::vector<double> tempVector;
226 tempVector.push_back(Now().GetSeconds());
228 Singleton<SatInterferenceOutputTraceContainer>::Get()->AddToContainer(
229 std::make_pair(event->GetSatEarthStationAddress(),
m_channelType),
233 std::vector<std::pair<double, double>> ifPowerPerFragment;
234 ifPowerPerFragment.emplace_back(1.0, ifPowerW);
236 return ifPowerPerFragment;
247 double interferenceValue,
250 ifPowerW += timeRatio * interferenceValue;
256 NS_LOG_FUNCTION(
this);
266 NS_LOG_FUNCTION(
this);
268 std::pair<std::set<uint32_t>::iterator,
bool> result =
m_rxEventIds.insert(event->GetId());
270 NS_ASSERT(result.second);
277 NS_LOG_FUNCTION(
this);
290 NS_LOG_FUNCTION(
this);
292 SatInterference::DoDispose();
298 NS_LOG_FUNCTION(
this << rxBandwidth);
300 if (rxBandwidth <= std::numeric_limits<double>::epsilon())
302 NS_FATAL_ERROR(
"SatPerPacketInterference::SetRxBandwidth - Invalid value");
ChannelType_t
Types of channel.
void Reset(void)
Resets current interference.
SatInterference()
Constructor for Satellite interference base class.
Packet by packet interference.
virtual void DoReset(void)
Resets current interference.
bool m_rxing
flag to indicate that at least one receiving is on
double m_rxBandwidth_Hz
RX Bandwidth in Hz.
SatPerPacketInterference()
void SetRxBandwidth(double rxBandwidth)
long double m_residualPowerW
Residual power value for interference.
static TypeId GetTypeId(void)
~SatPerPacketInterference()
virtual void DoNotifyRxEnd(Ptr< SatInterference::InterferenceChangeEvent > event)
Notifies that RX is ended by a receiver.
InterferenceChanges m_interferenceChanges
interference change list
virtual void DoNotifyRxStart(Ptr< SatInterference::InterferenceChangeEvent > event)
Notifies that RX is started by a receiver.
uint32_t m_nextEventId
event id for Events
std::set< uint32_t > m_rxEventIds
notified interference event IDs
virtual void onInterferentEvent(long double timeRatio, double interferenceValue, double &ifPowerW)
Helper function meant for subclasses to override.
std::tuple< uint32_t, long double, bool > InterferenceChange
virtual std::vector< std::pair< double, double > > DoCalculate(Ptr< SatInterference::InterferenceChangeEvent > event)
Calculates interference power for the given reference Sets final power at end time to finalPower.
SatEnums::ChannelType_t m_channelType
virtual void onOwnStartReached(double ifPowerW)
Helper function meant for subclasses to override.
virtual Ptr< SatInterference::InterferenceChangeEvent > DoAdd(Time rxDuration, double rxPower, Address rxAddress)
Adds interference power to interference object.
SatArqSequenceNumber is handling the sequence numbers for the ARQ process.