28 #include "ns3/double.h"
31 #include "ns3/traced-callback.h"
32 #include "ns3/trace-source-accessor.h"
33 #include "ns3/simulator.h"
61 .AddConstructor<UanPhyCalcSinrDual> ()
78 NS_LOG_WARN (
"Calculating SINR for unsupported modulation type");
81 double intKp = -
DbToKp (rxPowerDb);
82 UanTransducer::ArrivalList::const_iterator it = arrivalList.begin ();
83 for (; it != arrivalList.end (); it++)
86 if (std::abs ( (
double) it->GetTxMode ().GetCenterFreqHz () - (double) mode.
GetCenterFreqHz ())
87 < (
double)(it->GetTxMode ().GetBandwidthHz () / 2 + mode.
GetBandwidthHz () / 2) - 0.5)
94 it->GetPacket ()->PeekHeader (ch2);
101 << mode.
GetName () <<
" Int mode: " << it->GetTxMode ().GetName () <<
" Separation: "
102 << std::abs ( (
double) it->GetTxMode ().GetCenterFreqHz () - (double) mode.
GetCenterFreqHz ())
103 <<
" Combined bandwidths: " << (
double)(it->GetTxMode ().GetBandwidthHz () / 2 + mode.
GetBandwidthHz () / 2) - 0.5);
106 intKp +=
DbToKp (it->GetRxPowerDb ());
110 double totalIntDb =
KpToDb (intKp +
DbToKp (ambNoiseDb));
112 NS_LOG_DEBUG (
Simulator::Now ().GetSeconds () <<
" Calculating SINR: RxPower = " << rxPowerDb <<
" dB. Number of interferers = " << arrivalList.size () <<
" Interference + noise power = " << totalIntDb <<
" dB. SINR = " << rxPowerDb - totalIntDb <<
" dB.");
113 return rxPowerDb - totalIntDb;
120 m_phy1 = CreateObject<UanPhyGen> ();
121 m_phy2 = CreateObject<UanPhyGen> ();
124 m_phy2->SetReceiveOkCallback (
m_recOkCb);
161 .AddConstructor<UanPhyDual> ()
162 .AddAttribute (
"CcaThresholdPhy1",
163 "Aggregate energy of incoming signals to move to CCA Busy state dB of Phy1.",
166 MakeDoubleChecker<double> ())
167 .AddAttribute (
"CcaThresholdPhy2",
168 "Aggregate energy of incoming signals to move to CCA Busy state dB of Phy2.",
171 MakeDoubleChecker<double> ())
172 .AddAttribute (
"TxPowerPhy1",
173 "Transmission output power in dB of Phy1.",
176 MakeDoubleChecker<double> ())
177 .AddAttribute (
"TxPowerPhy2",
178 "Transmission output power in dB of Phy2.",
181 MakeDoubleChecker<double> ())
182 .AddAttribute (
"RxGainPhy1",
183 "Gain added to incoming signal at receiver of Phy1.",
186 MakeDoubleChecker<double> ())
187 .AddAttribute (
"RxGainPhy2",
188 "Gain added to incoming signal at receiver of Phy2.",
191 MakeDoubleChecker<double> ())
192 .AddAttribute (
"SupportedModesPhy1",
193 "List of modes supported by Phy1.",
196 MakeUanModesListChecker () )
197 .AddAttribute (
"SupportedModesPhy2",
198 "List of modes supported by Phy2.",
201 MakeUanModesListChecker () )
202 .AddAttribute (
"PerModelPhy1",
203 "Functor to calculate PER based on SINR and TxMode for Phy1.",
206 MakePointerChecker<UanPhyPer> ())
207 .AddAttribute (
"PerModelPhy2",
208 "Functor to calculate PER based on SINR and TxMode for Phy2.",
211 MakePointerChecker<UanPhyPer> ())
212 .AddAttribute (
"SinrModelPhy1",
213 "Functor to calculate SINR based on pkt arrivals and modes for Phy1.",
216 MakePointerChecker<UanPhyCalcSinr> ())
217 .AddAttribute (
"SinrModelPhy2",
218 "Functor to calculate SINR based on pkt arrivals and modes for Phy2.",
221 MakePointerChecker<UanPhyCalcSinr> ())
222 .AddTraceSource (
"RxOk",
223 "A packet was received successfully.",
225 .AddTraceSource (
"RxError",
226 "A packet was received unsuccessfully.",
228 .AddTraceSource (
"Tx",
229 "Packet transmission beginning.",
256 m_phy1->SendPacket (pkt, modeNum);
263 m_phy2->SendPacket (pkt, modeNum -
m_phy1->GetNModes ());
269 m_phy1->RegisterListener (listener);
270 m_phy2->RegisterListener (listener);
282 m_phy1->SetReceiveOkCallback (cb);
283 m_phy2->SetReceiveOkCallback (cb);
289 m_phy1->SetReceiveErrorCallback (cb);
290 m_phy2->SetReceiveErrorCallback (cb);
296 m_phy1->SetRxGainDb (gain);
297 m_phy2->SetRxGainDb (gain);
302 m_phy1->SetRxGainDb (gain);
308 m_phy2->SetRxGainDb (gain);
314 m_phy1->SetTxPowerDb (txpwr);
315 m_phy2->SetTxPowerDb (txpwr);
321 m_phy1->SetTxPowerDb (txpwr);
326 m_phy2->SetTxPowerDb (txpwr);
332 NS_LOG_WARN (
"SetRxThresholdDb is deprecated and has no effect. Look at PER Functor attribute");
333 m_phy1->SetRxThresholdDb (thresh);
334 m_phy2->SetRxThresholdDb (thresh);
339 m_phy1->SetCcaThresholdDb (thresh);
340 m_phy2->SetCcaThresholdDb (thresh);
346 m_phy1->SetCcaThresholdDb (thresh);
351 m_phy2->SetCcaThresholdDb (thresh);
357 NS_LOG_WARN (
"Warning: UanPhyDual::GetRxGainDb returns RxGain of Phy 1");
358 return m_phy1->GetRxGainDb ();
363 return m_phy1->GetRxGainDb ();
368 return m_phy2->GetRxGainDb ();
374 NS_LOG_WARN (
"Warning: Dual Phy only returns TxPowerDb of Phy 1");
375 return m_phy1->GetTxPowerDb ();
381 return m_phy1->GetTxPowerDb ();
387 return m_phy2->GetTxPowerDb ();
393 return m_phy1->GetRxThresholdDb ();
399 NS_LOG_WARN (
"Dual Phy only returns CCAThreshold of Phy 1");
400 return m_phy1->GetCcaThresholdDb ();
405 return m_phy1->GetCcaThresholdDb ();
410 return m_phy2->GetCcaThresholdDb ();
416 return m_phy1->IsStateIdle ();
421 return m_phy2->IsStateIdle ();
427 return m_phy1->IsStateRx ();
433 return m_phy2->IsStateRx ();
439 return m_phy1->IsStateTx ();
445 return m_phy1->GetPacketRx ();
451 return m_phy2->GetPacketRx ();
457 return m_phy2->IsStateTx ();
462 return m_phy1->IsStateSleep () &&
m_phy2->IsStateSleep ();
467 return m_phy1->IsStateIdle () &&
m_phy2->IsStateIdle ();
487 return m_phy1->IsStateCcaBusy () ||
m_phy2->IsStateCcaBusy ();
492 return m_phy1->GetChannel ();
497 return m_phy1->GetDevice ();
502 m_phy1->SetChannel (channel);
503 m_phy2->SetChannel (channel);
508 m_phy1->SetDevice (device);
509 m_phy2->SetDevice (device);
525 m_phy1->NotifyIntChange ();
526 m_phy2->NotifyIntChange ();
532 m_phy1->SetTransducer (trans);
533 m_phy2->SetTransducer (trans);
538 NS_LOG_WARN (
"DualPhy Returning transducer of Phy1");
539 return m_phy1->GetTransducer ();
551 return m_phy1->GetMode (n);
564 m_phy1->GetAttribute (
"SupportedModes", modeValue);
565 return modeValue.Get ();
572 m_phy2->GetAttribute (
"SupportedModes", modeValue);
573 return modeValue.Get ();
592 m_phy1->GetAttribute (
"PerModel", perValue);
600 m_phy2->GetAttribute (
"PerModel", perValue);
620 m_phy1->GetAttribute (
"SinrModel", sinrValue);
628 m_phy2->GetAttribute (
"SinrModel", sinrValue);
662 NS_FATAL_ERROR (
"GetPacketRx not valid for UanPhyDual. Must specify GetPhy1PacketRx or GetPhy2PacketRx");
663 return Create<Packet> ();
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 "...
virtual void DoDispose()
This method is called by Object::Dispose or by the object's destructor, whichever comes first...
std::string GetName(void) const
Get the mode name.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register the class in the ns-3 factory.
virtual uint32_t GetNModes(void)
Get the number of transmission modes supported by this Phy.
RxOkCallback m_recOkCb
Callback when packet received without errors.
static TypeId GetTypeId(void)
Register this type.
virtual Ptr< UanTransducer > GetTransducer(void)
Get the attached transducer.
virtual void SetEnergyModelCallback(DeviceEnergyModel::ChangeStateCallback callback)
Set the DeviceEnergyModel callback for UanPhy device.
virtual ~UanPhyCalcSinrDual()
Destructor.
Ptr< UanPhy > m_phy1
First Phy layer.
Ptr< UanPhy > m_phy2
Second Phy layer.
Ptr< Packet > GetPacketRx(void) const
Get the packet currently being received.
virtual void SetMac(Ptr< UanMac > mac)
Set the MAC forwarding messages to this Phy.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
virtual bool IsStateSleep(void)
double GetCcaThresholdPhy2(void) const
Get the CCA threshold signal strength required to detect channel busy.
virtual void DoDispose(void)
This method is called by Object::Dispose or by the object's destructor, whichever comes first...
Container for UanTxModes.
#define NS_FATAL_ERROR(msg)
fatal error handling
ModulationType GetModType(void) const
Get the modulation type of the mode.
virtual bool IsStateTx(void)
virtual void SetCcaThresholdDb(double thresh)
Set the threshold for detecting channel busy.
virtual void SetDevice(Ptr< UanNetDevice > device)
Set the device hosting this Phy.
virtual Ptr< UanChannel > GetChannel(void) const
Get the attached channel.
virtual ~UanPhyDual()
Dummy destructor.
virtual void SetTxPowerDb(double txpwr)
Set the transmit power.
virtual bool IsStateBusy(void)
virtual double GetRxThresholdDb(void)
Get the minimum received signal strength required to receive a packet without errors.
void SetCcaThresholdPhy1(double thresh)
Set the threshold for detecting channel busy.
virtual bool IsStateIdle(void)
virtual double CalcSinrDb(Ptr< Packet > pkt, Time arrTime, double rxPowerDb, double ambNoiseDb, UanTxMode mode, UanPdp pdp, const UanTransducer::ArrivalList &arrivalList) const
Calculate the SINR value for a packet.
double GetRxGainDbPhy1(void) const
Get the receiver gain added to signal at receiver in dB.
virtual void NotifyTransStartTx(Ptr< Packet > packet, double txPowerDb, UanTxMode txMode)
Called when a transmission is beginning on the attched transducer.
double KpToDb(double kp) const
Convert kilopascals to dB re 1 uPa.
virtual void SendPacket(Ptr< Packet > pkt, uint32_t modeNum)
Send a packet using a specific transmission mode.
Ptr< Packet > GetPhy1PacketRx(void) const
Get the packet currently being received.
The power delay profile returned by propagation models.
Abstraction of packet modulation information.
virtual void Clear(void)
Clear all pointer references.
std::list< UanPacketArrival > ArrivalList
List of arriving packets overlapping in time.
virtual void NotifyIntChange(void)
Called when there has been a change in the ammount of interference this node is experiencing from oth...
virtual void SetChannel(Ptr< UanChannel > channel)
Attach to a channel.
Ptr< UanPhyPer > GetPerModelPhy2(void) const
Get the error probability model.
UanModesList GetModesPhy1(void) const
Get the list of available modes.
void SetModesPhy1(UanModesList modes)
Set the available modes.
uint32_t PeekHeader(Header &header) const
Deserialize but does not remove the header from the internal buffer.
Ptr< UanPhyCalcSinr > GetSinrModelPhy2(void) const
Get the SINR calculator.
TracedCallback< Ptr< const Packet >, double, UanTxMode > m_txLogger
A packet was sent from this Phy.
UanModesList GetModesPhy2(void) const
Get the list of available modes.
virtual void SetRxGainDb(double gain)
Set the receiver gain.
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
RxErrCallback m_recErrCb
Callback when packet received with errors.
void SetPerModelPhy1(Ptr< UanPhyPer > per)
Set the error probability model.
uint32_t GetCenterFreqHz(void) const
Get the transmission center frequency.
Interface for PHY event listener.
virtual void SetRxThresholdDb(double thresh) NS_DEPRECATED
Set the minimum SINR threshold to receive a packet without errors.
virtual void StartRxPacket(Ptr< Packet > pkt, double rxPowerDb, UanTxMode txMode, UanPdp pdp)
Packet arriving from channel: i.e.
void RxOkFromSubPhy(Ptr< Packet > pkt, double sinr, UanTxMode mode)
Handle callback and logger for packets received without error.
void SetTxPowerDbPhy1(double txpwr)
Set the transmit power.
virtual bool IsStateRx(void)
void SetTxPowerDbPhy2(double txpwr)
Set the transmit power.
double DbToKp(double db) const
Convert dB re 1 uPa to kilopascals.
double GetCcaThresholdPhy1(void) const
Get the CCA threshold signal strength required to detect channel busy.
static Time Now(void)
Return the "current simulation time".
void RxErrFromSubPhy(Ptr< Packet > pkt, double sinr)
Handle callback and logger for packets received with error.
void SetModesPhy2(UanModesList modes)
Set the available modes.
Base class for UAN Phy models.
void SetSinrModelPhy2(Ptr< UanPhyCalcSinr > calcSinr)
Set the SINR calculator.
void SetSinrModelPhy1(Ptr< UanPhyCalcSinr > calcSinr)
Set the SINR calculator.
virtual void SetReceiveOkCallback(RxOkCallback cb)
Set the callback to be used when a packet is received without error.
virtual void SetTransducer(Ptr< UanTransducer > trans)
Attach a transducer to this Phy.
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model...
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
double GetTxPowerDbPhy1(void) const
Get the current transmit power, in dB.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
virtual void RegisterListener(UanPhyListener *listener)
Register a UanPhyListener to be notified of common UanPhy events.
static TypeId GetTypeId()
Register this type.
Ptr< UanPhyCalcSinr > GetSinrModelPhy1(void) const
Get the SINR calculator.
virtual void SetReceiveErrorCallback(RxErrCallback cb)
Set the callback to be used when a packet is received with errors.
double GetTxPowerDbPhy2(void) const
Get the current transmit power, in dB.
TracedCallback< Ptr< const Packet >, double, UanTxMode > m_rxErrLogger
A packet was received unsuccessfully.
virtual double GetRxGainDb(void)
Get the receiver gain added to signal at receiver in dB.
a base class which provides memory management and object aggregation
virtual bool IsStateCcaBusy(void)
uint32_t GetBandwidthHz(void) const
Get the transmission signal bandwidth.
UanPhyCalcSinrDual()
Constructor.
Hold a floating point type.
TracedCallback< Ptr< const Packet >, double, UanTxMode > m_rxOkLogger
A packet was received successfully.
static UanModesList GetDefaultModes(void)
Get the default transmission modes.
virtual Ptr< UanNetDevice > GetDevice(void)
Get the device hosting this Phy.
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
Ptr< Packet > GetPhy2PacketRx(void) const
Get the packet currently being received.
double GetRxGainDbPhy2(void) const
Get the receiver gain added to signal at receiver in dB.
void SetPerModelPhy2(Ptr< UanPhyPer > per)
Set the error probability model.
virtual double GetCcaThresholdDb(void)
Get the CCA threshold signal strength required to detect channel busy.
void SetRxGainDbPhy2(double gain)
Set the receiver gain.
void SetRxGainDbPhy1(double gain)
Set the receiver gain.
void SetCcaThresholdPhy2(double thresh)
Set the threshold for detecting channel busy.
Attribute Value class for UanTxModes.
Ptr< UanPhyPer > GetPerModelPhy1(void) const
Get the error probability model.
virtual UanTxMode GetMode(uint32_t n)
Get a specific transmission mode.
virtual void EnergyDepletionHandler(void)
Handle the energy depletion event.
virtual double GetTxPowerDb(void)
Get the current transmit power, in dB.