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>
53 for (TxSpectrumModelInfoMap_t::iterator it = rhs.begin ();
57 SpectrumConverterMap_t::iterator jt;
58 for (jt = it->second.m_spectrumConverterMap.begin ();
59 jt != it->second.m_spectrumConverterMap.end ();
62 lhs <<
"(" << it->first <<
"," << jt->first <<
") ";
69 : m_txSpectrumModel (txSpectrumModel)
75 : m_rxSpectrumModel (rxSpectrumModel)
100 static TypeId tid =
TypeId (
"ns3::MultiModelSpectrumChannel")
102 .AddConstructor<MultiModelSpectrumChannel> ()
103 .AddAttribute (
"MaxLossDb",
104 "If a single-frequency PropagationLossModel is used, this value "
105 "represents the maximum loss in dB for which transmissions will be "
106 "passed to the receiving PHY. Signals for which the PropagationLossModel "
107 "returns a loss bigger than this value will not be propagated to the receiver. "
108 "This parameter is to be used to reduce "
109 "the computational load by not propagating signals that are far beyond "
110 "the interference range. Note that the default value corresponds to "
111 "considering all signals for reception. Tune this value with care. ",
114 MakeDoubleChecker<double> ())
115 .AddTraceSource (
"PathLoss",
116 "This trace is fired "
117 "whenever a new path loss value is calculated. The first and second parameters "
118 "to the trace are pointers respectively to the TX and RX SpectrumPhy instances, "
119 "whereas the third parameters is the loss value in dB. Note that the loss value "
120 "reported by this trace is the single-frequency loss value obtained by evaluating "
121 "only the TX and RX AntennaModels and the PropagationLossModel. In particular, note that "
122 "SpectrumPropagationLossModel (even if present) is never used to evaluate the loss value "
123 "reported in this trace. ",
138 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)");
142 std::vector<Ptr<SpectrumPhy> >::const_iterator it;
152 std::set<Ptr<SpectrumPhy> >::iterator phyIt = rxInfoIterator->second.m_rxPhySet.find (phy);
153 if (phyIt != rxInfoIterator->second.m_rxPhySet.end ())
155 rxInfoIterator->second.m_rxPhySet.erase (phyIt);
168 std::pair<RxSpectrumModelInfoMap_t::iterator, bool> ret;
172 std::pair<std::set<Ptr<SpectrumPhy> >::iterator,
bool> ret2 = ret.first->second.m_rxPhySet.insert (phy);
181 NS_LOG_LOGIC (
"Creating converters between SpectrumModelUids " << txSpectrumModel->
GetUid () <<
" and " << rxSpectrumModelUid );
183 std::pair<SpectrumConverterMap_t::iterator, bool> ret2;
184 ret2 = txInfoIterator->second.m_spectrumConverterMap.insert (std::make_pair (rxSpectrumModelUid, converter));
191 std::pair<std::set<Ptr<SpectrumPhy> >::iterator,
bool> ret2 = rxInfoIterator->second.m_rxPhySet.insert (phy);
198 TxSpectrumModelInfoMap_t::const_iterator
209 std::pair<TxSpectrumModelInfoMap_t::iterator, bool> ret;
212 txInfoIterator = ret.first;
222 if (rxSpectrumModelUid != txSpectrumModelUid)
224 NS_LOG_LOGIC (
"Creating converters between SpectrumModelUids " << txSpectrumModelUid <<
" and " << rxSpectrumModelUid );
227 std::pair<SpectrumConverterMap_t::iterator, bool> ret2;
228 ret2 = txInfoIterator->second.m_spectrumConverterMap.insert (std::make_pair (rxSpectrumModelUid, converter));
235 NS_LOG_LOGIC (
"SpectrumModelUid " << txSpectrumModelUid <<
" already present");
237 return txInfoIterator;
253 NS_LOG_LOGIC (
" txSpectrumModelUid " << txSpectrumModelUid);
259 NS_LOG_LOGIC (
"converter map for TX SpectrumModel with Uid " << txInfoIteratorerator->first);
260 NS_LOG_LOGIC (
"converter map size: " << txInfoIteratorerator->second.m_spectrumConverterMap.size ());
261 NS_LOG_LOGIC (
"converter map first element: " << txInfoIteratorerator->second.m_spectrumConverterMap.begin ()->first);
267 SpectrumModelUid_t rxSpectrumModelUid = rxInfoIterator->second.m_rxSpectrumModel->GetUid ();
268 NS_LOG_LOGIC (
" rxSpectrumModelUids " << rxSpectrumModelUid);
271 if (txSpectrumModelUid == rxSpectrumModelUid)
274 convertedTxPowerSpectrum = txParams->psd;
278 NS_LOG_LOGIC (
" converting txPowerSpectrum SpectrumModelUids" << txSpectrumModelUid <<
" --> " << rxSpectrumModelUid);
279 SpectrumConverterMap_t::const_iterator rxConverterIterator = txInfoIteratorerator->second.m_spectrumConverterMap.find (rxSpectrumModelUid);
280 NS_ASSERT (rxConverterIterator != txInfoIteratorerator->second.m_spectrumConverterMap.end ());
281 convertedTxPowerSpectrum = rxConverterIterator->second.Convert (txParams->psd);
285 for (std::set<
Ptr<SpectrumPhy> >::const_iterator rxPhyIterator = rxInfoIterator->second.m_rxPhySet.begin ();
286 rxPhyIterator != rxInfoIterator->second.m_rxPhySet.end ();
289 NS_ASSERT_MSG ((*rxPhyIterator)->GetRxSpectrumModel ()->GetUid () == rxSpectrumModelUid,
290 "SpectrumModel change was not notified to MultiModelSpectrumChannel (i.e., AddRx should be called again after model is changed)");
292 if ((*rxPhyIterator) != txParams->txPhy)
294 NS_LOG_LOGIC (
" copying signal parameters " << txParams);
296 rxParams->psd = Copy<SpectrumValue> (convertedTxPowerSpectrum);
297 Time delay = MicroSeconds (0);
301 if (txMobility && receiverMobility)
303 double pathLossDb = 0;
304 if (rxParams->txAntenna != 0)
307 double txAntennaGain = rxParams->txAntenna->GetGainDb (txAngles);
308 NS_LOG_LOGIC (
"txAntennaGain = " << txAntennaGain <<
" dB");
309 pathLossDb -= txAntennaGain;
315 double rxAntennaGain = rxAntenna->GetGainDb (rxAngles);
316 NS_LOG_LOGIC (
"rxAntennaGain = " << rxAntennaGain <<
" dB");
317 pathLossDb -= rxAntennaGain;
322 NS_LOG_LOGIC (
"propagationGainDb = " << propagationGainDb <<
" dB");
323 pathLossDb -= propagationGainDb;
325 NS_LOG_LOGIC (
"total pathLoss = " << pathLossDb <<
" dB");
332 double pathGainLinear = std::pow (10.0, (-pathLossDb) / 10.0);
333 *(rxParams->psd) *= pathGainLinear;
350 uint32_t dstNode = netDev->GetNode ()->GetId ();
352 rxParams, *rxPhyIterator);
358 rxParams, *rxPhyIterator);
401 for (std::set<
Ptr<SpectrumPhy> >::const_iterator phyIt = rxInfoIterator->second.m_rxPhySet.begin ();
402 phyIt != rxInfoIterator->second.m_rxPhySet.end ();
407 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
virtual void StartRx(Ptr< SpectrumSignalParameters > params)=0
Notify the SpectrumPhy instance of an incoming signal.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register the class in the ns-3 factory.
#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
virtual void DoDispose(void)
This method is called by Object::Dispose or by the object's destructor, whichever comes first...
#define NS_FATAL_ERROR(msg)
fatal error handling
RxSpectrumModelInfoMap_t m_rxSpectrumModelInfoMap
data structure holding, for each RX spectrum model, all the corresponding SpectrumPhy instances...
virtual Ptr< const SpectrumModel > GetRxSpectrumModel() const =0
static EventId Schedule(Time const &time, MEM mem_ptr, OBJ obj)
Schedule an event to expire at the relative time "time" is reached.
virtual Ptr< SpectrumPropagationLossModel > GetSpectrumPropagationLossModel(void)
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...
virtual uint32_t GetNDevices(void) const
SpectrumModelUid_t GetUid() const
static TypeId GetTypeId(void)
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
static void ScheduleWithContext(uint32_t context, Time const &time, MEM mem_ptr, OBJ obj)
Schedule an event with the given context.
#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
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
RxSpectrumModelInfo(Ptr< const SpectrumModel > rxSpectrumModel)
void DoDispose()
This method is called by Object::Dispose or by the object's destructor, whichever comes first...
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...
TracedCallback< Ptr< SpectrumPhy >, Ptr< SpectrumPhy >, double > m_pathLossTrace
virtual void StartTx(Ptr< SpectrumSignalParameters > params)
Used by attached PHY instances to transmit signals on the channel.
std::map< SpectrumModelUid_t, TxSpectrumModelInfo > TxSpectrumModelInfoMap_t
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.
struct holding the azimuth and inclination angles of spherical coordinates.
TxSpectrumModelInfo(Ptr< const SpectrumModel > txSpectrumModel)
Hold a floating point type.
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)