26 #include <ns3/simulator.h>
27 #include <ns3/singleton.h>
31 NS_LOG_COMPONENT_DEFINE(
"SatPerPacketInterference");
36 NS_OBJECT_ENSURE_REGISTERED(SatPerPacketInterference);
41 static TypeId tid = TypeId(
"ns3::SatPerPacketInterference")
43 .AddConstructor<SatPerPacketInterference>();
51 NS_LOG_FUNCTION(
this);
57 : m_residualPowerW(0.0),
60 m_enableTraceOutput(false),
64 NS_LOG_FUNCTION(
this);
69 : m_residualPowerW(0.0),
72 m_enableTraceOutput(true),
73 m_channelType(channelType),
74 m_rxBandwidth_Hz(rxBandwidthHz)
76 NS_LOG_FUNCTION(
this << channelType << rxBandwidthHz);
80 NS_FATAL_ERROR(
"SatPerPacketInterference::SatPerPacketInterference - Invalid value");
86 NS_LOG_FUNCTION(
this);
91 Ptr<SatInterference::InterferenceChangeEvent>
94 NS_LOG_FUNCTION(
this << duration << power << rxAddress);
96 Ptr<SatInterference::InterferenceChangeEvent> event;
97 event = Create<SatInterference::InterferenceChangeEvent>(
m_nextEventId++,
101 Time now =
event->GetStartTime();
103 NS_LOG_INFO(
"Add change: Duration= " << duration <<
", Power= " << power <<
", Time: " << now);
113 long double powerValue;
114 std::tie(eventID, powerValue, std::ignore) = i->second;
116 NS_LOG_INFO(
"Change to erase: Time= " << i->first <<
", Id= " << eventID
117 <<
", PowerValue= " << powerValue);
143 std::make_pair(event->GetEndTime(),
InterferenceChange(event->GetId(), -power,
true)));
150 NS_FATAL_ERROR(
"First power negative!!!");
156 std::vector<std::pair<double, double>>
159 NS_LOG_FUNCTION(
this);
163 NS_FATAL_ERROR(
"Receiving is not set on!!!");
167 double rxDuration =
event->GetDuration().GetDouble();
168 double rxEndTime =
event->GetEndTime().GetDouble();
169 bool ownStartReached =
false;
171 NS_LOG_INFO(
"Calculate: IfPower (W)= " << ifPowerW <<
", Event ID= " << event->GetId()
172 <<
", Duration= " << event->GetDuration()
173 <<
", StartTime= " << event->GetStartTime()
174 <<
", EndTime= " << event->GetEndTime());
182 long double powerValue;
184 std::tie(eventID, powerValue, isEndEvent) = currentItem->second;
186 if (event->GetId() == eventID)
190 NS_LOG_INFO(
"IfPower after end event: " << ifPowerW);
196 ownStartReached =
true;
199 else if (ownStartReached)
203 double itemTime = currentItem->first.GetDouble();
206 NS_LOG_INFO(
"Update (partial): ID: " << eventID <<
", Power (W)= " << powerValue
207 <<
", Time= " << currentItem->first
208 <<
", DeltaTime= " << (rxEndTime - itemTime));
210 NS_LOG_INFO(
"IfPower after update: " << ifPowerW);
215 ifPowerW += powerValue;
217 NS_LOG_INFO(
"Update (full): ID: " << eventID <<
", Power (W)= " << powerValue);
218 NS_LOG_INFO(
"IfPower after update: " << ifPowerW);
226 std::vector<double> tempVector;
227 tempVector.push_back(Now().GetSeconds());
229 Singleton<SatInterferenceOutputTraceContainer>::Get()->AddToContainer(
230 std::make_pair(event->GetSatEarthStationAddress(),
m_channelType),
234 std::vector<std::pair<double, double>> ifPowerPerFragment;
235 ifPowerPerFragment.emplace_back(1.0, ifPowerW);
237 return ifPowerPerFragment;
248 double interferenceValue,
251 ifPowerW += timeRatio * interferenceValue;
257 NS_LOG_FUNCTION(
this);
267 NS_LOG_FUNCTION(
this);
269 std::pair<std::set<uint32_t>::iterator,
bool> result =
m_rxEventIds.insert(event->GetId());
271 NS_ASSERT(result.second);
278 NS_LOG_FUNCTION(
this);
291 NS_LOG_FUNCTION(
this);
293 SatInterference::DoDispose();
299 NS_LOG_FUNCTION(
this << rxBandwidth);
301 if (rxBandwidth <= std::numeric_limits<double>::epsilon())
303 NS_FATAL_ERROR(
"SatPerPacketInterference::SetRxBandwidth - Invalid value");
ChannelType_t
Types of channel.
Abstract class defining interface for interference calculations objects.
void Reset(void)
Resets current 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
TypeId GetInstanceTypeId(void) const
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.