21 #include <ns3/object.h>
22 #include <ns3/simulator.h>
24 #include <ns3/packet.h>
25 #include <ns3/packet-burst.h>
26 #include <ns3/net-device.h>
28 #include <ns3/double.h>
29 #include <ns3/mobility-model.h>
30 #include <ns3/spectrum-phy.h>
31 #include <ns3/spectrum-converter.h>
32 #include <ns3/spectrum-propagation-loss-model.h>
33 #include <ns3/propagation-loss-model.h>
34 #include <ns3/propagation-delay-model.h>
35 #include <ns3/antenna-model.h>
36 #include <ns3/angles.h>
57 for (TxSpectrumModelInfoMap_t::iterator it = rhs.begin ();
61 SpectrumConverterMap_t::iterator jt;
62 for (jt = it->second.m_spectrumConverterMap.begin ();
63 jt != it->second.m_spectrumConverterMap.end ();
66 lhs <<
"(" << it->first <<
"," << jt->first <<
") ";
73 : m_txSpectrumModel (txSpectrumModel)
79 : m_rxSpectrumModel (rxSpectrumModel)
104 static TypeId tid =
TypeId (
"ns3::MultiModelSpectrumChannel")
106 .SetGroupName (
"Spectrum")
108 .AddAttribute (
"MaxLossDb",
109 "If a single-frequency PropagationLossModel is used, "
110 "this value represents the maximum loss in dB for which "
111 "transmissions will be passed to the receiving PHY. "
112 "Signals for which the PropagationLossModel returns "
113 "a loss bigger than this value will not be propagated "
114 "to the receiver. This parameter is to be used to reduce "
115 "the computational load by not propagating signals that "
116 "are far beyond the interference range. Note that the "
117 "default value corresponds to considering all signals "
118 "for reception. Tune this value with care. ",
121 MakeDoubleChecker<double> ())
122 .AddTraceSource (
"PathLoss",
123 "This trace is fired whenever a new path loss value "
124 "is calculated. The first and second parameters "
125 "to the trace are pointers respectively to the "
126 "TX and RX SpectrumPhy instances, whereas the "
127 "third parameters is the loss value in dB. "
128 "Note that the loss value reported by this trace is "
129 "the single-frequency loss value obtained by evaluating "
130 "only the TX and RX AntennaModels and the "
131 "PropagationLossModel. In particular, note that "
132 "SpectrumPropagationLossModel (even if present) "
133 "is never used to evaluate the loss value "
134 "reported in this trace. ",
136 "ns3::SpectrumChannel::LossTracedCallback")
150 NS_ASSERT_MSG ((0 != rxSpectrumModel),
"phy->GetRxSpectrumModel () returned 0. Please check that the RxSpectrumModel is already set for the phy before calling MultiModelSpectrumChannel::AddRx (phy)");
154 std::vector<Ptr<SpectrumPhy> >::const_iterator it;
164 std::set<Ptr<SpectrumPhy> >::iterator phyIt = rxInfoIterator->second.m_rxPhySet.find (phy);
165 if (phyIt != rxInfoIterator->second.m_rxPhySet.end ())
167 rxInfoIterator->second.m_rxPhySet.erase (phyIt);
180 std::pair<RxSpectrumModelInfoMap_t::iterator, bool> ret;
184 std::pair<std::set<Ptr<SpectrumPhy> >::iterator,
bool> ret2 = ret.first->second.m_rxPhySet.insert (phy);
193 NS_LOG_LOGIC (
"Creating converters between SpectrumModelUids " << txSpectrumModel->
GetUid () <<
" and " << rxSpectrumModelUid );
195 std::pair<SpectrumConverterMap_t::iterator, bool> ret2;
196 ret2 = txInfoIterator->second.m_spectrumConverterMap.insert (std::make_pair (rxSpectrumModelUid, converter));
203 std::pair<std::set<Ptr<SpectrumPhy> >::iterator,
bool> ret2 = rxInfoIterator->second.m_rxPhySet.insert (phy);
210 TxSpectrumModelInfoMap_t::const_iterator
221 std::pair<TxSpectrumModelInfoMap_t::iterator, bool> ret;
224 txInfoIterator = ret.first;
234 if (rxSpectrumModelUid != txSpectrumModelUid)
236 NS_LOG_LOGIC (
"Creating converters between SpectrumModelUids " << txSpectrumModelUid <<
" and " << rxSpectrumModelUid );
239 std::pair<SpectrumConverterMap_t::iterator, bool> ret2;
240 ret2 = txInfoIterator->second.m_spectrumConverterMap.insert (std::make_pair (rxSpectrumModelUid, converter));
247 NS_LOG_LOGIC (
"SpectrumModelUid " << txSpectrumModelUid <<
" already present");
249 return txInfoIterator;
265 NS_LOG_LOGIC (
" txSpectrumModelUid " << txSpectrumModelUid);
271 NS_LOG_LOGIC (
"converter map for TX SpectrumModel with Uid " << txInfoIteratorerator->first);
272 NS_LOG_LOGIC (
"converter map size: " << txInfoIteratorerator->second.m_spectrumConverterMap.size ());
273 NS_LOG_LOGIC (
"converter map first element: " << txInfoIteratorerator->second.m_spectrumConverterMap.begin ()->first);
279 SpectrumModelUid_t rxSpectrumModelUid = rxInfoIterator->second.m_rxSpectrumModel->GetUid ();
280 NS_LOG_LOGIC (
" rxSpectrumModelUids " << rxSpectrumModelUid);
283 if (txSpectrumModelUid == rxSpectrumModelUid)
286 convertedTxPowerSpectrum = txParams->psd;
290 NS_LOG_LOGIC (
" converting txPowerSpectrum SpectrumModelUids" << txSpectrumModelUid <<
" --> " << rxSpectrumModelUid);
291 SpectrumConverterMap_t::const_iterator rxConverterIterator = txInfoIteratorerator->second.m_spectrumConverterMap.find (rxSpectrumModelUid);
292 NS_ASSERT (rxConverterIterator != txInfoIteratorerator->second.m_spectrumConverterMap.end ());
293 convertedTxPowerSpectrum = rxConverterIterator->second.Convert (txParams->psd);
297 for (std::set<
Ptr<SpectrumPhy> >::const_iterator rxPhyIterator = rxInfoIterator->second.m_rxPhySet.begin ();
298 rxPhyIterator != rxInfoIterator->second.m_rxPhySet.end ();
301 NS_ASSERT_MSG ((*rxPhyIterator)->GetRxSpectrumModel ()->GetUid () == rxSpectrumModelUid,
302 "SpectrumModel change was not notified to MultiModelSpectrumChannel (i.e., AddRx should be called again after model is changed)");
304 if ((*rxPhyIterator) != txParams->txPhy)
306 NS_LOG_LOGIC (
" copying signal parameters " << txParams);
308 rxParams->psd = Copy<SpectrumValue> (convertedTxPowerSpectrum);
313 if (txMobility && receiverMobility)
315 double pathLossDb = 0;
316 if (rxParams->txAntenna != 0)
319 double txAntennaGain = rxParams->txAntenna->GetGainDb (txAngles);
320 NS_LOG_LOGIC (
"txAntennaGain = " << txAntennaGain <<
" dB");
321 pathLossDb -= txAntennaGain;
327 double rxAntennaGain = rxAntenna->GetGainDb (rxAngles);
328 NS_LOG_LOGIC (
"rxAntennaGain = " << rxAntennaGain <<
" dB");
329 pathLossDb -= rxAntennaGain;
334 NS_LOG_LOGIC (
"propagationGainDb = " << propagationGainDb <<
" dB");
335 pathLossDb -= propagationGainDb;
337 NS_LOG_LOGIC (
"total pathLoss = " << pathLossDb <<
" dB");
344 double pathGainLinear = std::pow (10.0, (-pathLossDb) / 10.0);
345 *(rxParams->psd) *= pathGainLinear;
362 uint32_t dstNode = netDev->GetNode ()->GetId ();
364 rxParams, *rxPhyIterator);
370 rxParams, *rxPhyIterator);
413 for (std::set<
Ptr<SpectrumPhy> >::const_iterator phyIt = rxInfoIterator->second.m_rxPhySet.begin ();
414 phyIt != rxInfoIterator->second.m_rxPhySet.end ();
419 return (*phyIt)->GetDevice ();
Ptr< SpectrumPropagationLossModel > m_spectrumPropagationLoss
Frequency-dependent propagation loss model to be used with this channel.
Simulation virtual time values and global simulation resolution.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
uint32_t SpectrumModelUid_t
Uid for SpectrumModels.
The Rx spectrum model information.
virtual void StartRx(Ptr< SpectrumSignalParameters > params)=0
Notify the SpectrumPhy instance of an incoming signal.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
double m_maxLossDb
Maximum loss [dB].
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
virtual void AddPropagationLossModel(Ptr< PropagationLossModel > loss)
Set the single-frequency propagation loss model to be used.
Vector GetPosition(void) const
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
RxSpectrumModelInfoMap_t m_rxSpectrumModelInfoMap
Data structure holding, for each RX spectrum model, all the corresponding SpectrumPhy instances...
virtual void DoDispose(void)
Destructor implementation.
virtual Ptr< const SpectrumModel > GetRxSpectrumModel() const =0
This SpectrumChannel implementation can handle the presence of SpectrumPhy instances which can use di...
uint32_t m_numDevices
Number of devices connected to the channel.
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
virtual Ptr< SpectrumPropagationLossModel > GetSpectrumPropagationLossModel(void)
Get the frequency-dependent propagation loss model.
Ptr< PropagationDelayModel > m_propagationDelay
Propagation delay model to be used with this channel.
Ptr< PropagationLossModel > m_propagationLoss
Single-frequency propagation loss model to be used with this channel.
Class which implements a converter between SpectrumValue which are defined over different SpectrumMod...
static EventId Schedule(Time const &delay, MEM mem_ptr, OBJ obj)
Schedule an event to expire after delay.
virtual uint32_t GetNDevices(void) const
SpectrumModelUid_t GetUid() const
static TypeId GetTypeId(void)
Get the type ID.
virtual void AddRx(Ptr< SpectrumPhy > phy)
Add a SpectrumPhy to a channel, so it can receive packets.
TxSpectrumModelInfoMap_t::const_iterator FindAndEventuallyAddTxSpectrumModel(Ptr< const SpectrumModel > txSpectrumModel)
This method checks if m_rxSpectrumModelInfoMap contains an entry for the given TX SpectrumModel...
double CalcRxPower(double txPowerDbm, Ptr< MobilityModel > a, Ptr< MobilityModel > b) const
Returns the Rx Power taking into account all the PropagatinLossModel(s) chained to the current one...
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
std::ostream & operator<<(std::ostream &os, const Angles &a)
print a struct Angles to output
Every class exported by the ns3 library is enclosed in the ns3 namespace.
RxSpectrumModelInfo(Ptr< const SpectrumModel > rxSpectrumModel)
Constructor.
void DoDispose()
Destructor implementation.
virtual void AddSpectrumPropagationLossModel(Ptr< SpectrumPropagationLossModel > loss)
Set the frequency-dependent propagation loss model to be used.
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Ptr< const AttributeAccessor > MakeDoubleAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
TracedCallback< Ptr< SpectrumPhy >, Ptr< SpectrumPhy >, double > m_pathLossTrace
static void ScheduleWithContext(uint32_t context, Time const &delay, MEM mem_ptr, OBJ obj)
Schedule an event with the given context.
virtual void StartTx(Ptr< SpectrumSignalParameters > params)
Used by attached PHY instances to transmit signals on the channel.
virtual Ptr< NetDevice > GetDevice(uint32_t i) const
virtual void SetPropagationDelayModel(Ptr< PropagationDelayModel > delay)
Set the propagation delay model to be used.
TxSpectrumModelInfoMap_t m_txSpectrumModelInfoMap
Data structure holding, for each TX SpectrumModel, all the converters to any RX SpectrumModel, and all the corresponding SpectrumPhy instances.
Defines the interface for spectrum-aware channel implementations.
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
struct holding the azimuth and inclination angles of spherical coordinates.
TxSpectrumModelInfo(Ptr< const SpectrumModel > txSpectrumModel)
Constructor.
This class can be used to hold variables of floating point type such as 'double' or 'float'...
MultiModelSpectrumChannel()
a unique identifier for an interface.
virtual void StartRx(Ptr< SpectrumSignalParameters > params, Ptr< SpectrumPhy > receiver)
Used internally to reschedule transmission after the propagation delay.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
std::map< SpectrumModelUid_t, TxSpectrumModelInfo > TxSpectrumModelInfoMap_t
Container: SpectrumModelUid_t, TxSpectrumModelInfo.
The Tx spectrum model information.