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);
563 UanModesListValue modeValue;
564 m_phy1->GetAttribute (
"SupportedModes", modeValue);
565 return modeValue.Get ();
571 UanModesListValue modeValue;
572 m_phy2->GetAttribute (
"SupportedModes", modeValue);
573 return modeValue.Get ();
579 m_phy1->SetAttribute (
"SupportedModes", UanModesListValue (modes));
585 m_phy2->SetAttribute (
"SupportedModes", UanModesListValue (modes));
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> ();
keep track of time values and allow control of global simulation resolution
#define NS_LOG_FUNCTION(parameters)
std::string GetName(void) const
virtual uint32_t GetNModes(void)
static TypeId GetTypeId(void)
virtual Ptr< UanTransducer > GetTransducer(void)
virtual void SetEnergyModelCallback(DeviceEnergyModel::ChangeStateCallback callback)
virtual ~UanPhyCalcSinrDual()
Ptr< Packet > GetPacketRx(void) const
virtual void SetMac(Ptr< UanMac > mac)
#define NS_LOG_COMPONENT_DEFINE(name)
virtual bool IsStateSleep(void)
double GetCcaThresholdPhy2(void) const
virtual void DoDispose(void)
Container for UanTxModes.
ModulationType GetModType(void) const
virtual bool IsStateTx(void)
virtual void SetCcaThresholdDb(double thresh)
#define NS_FATAL_ERROR(msg)
fatal error handling
virtual void SetDevice(Ptr< UanNetDevice > device)
virtual Ptr< UanChannel > GetChannel(void) const
virtual void SetTxPowerDb(double txpwr)
virtual bool IsStateBusy(void)
virtual double GetRxThresholdDb(void)
void SetCcaThresholdPhy1(double thresh)
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
double GetRxGainDbPhy1(void) const
virtual void NotifyTransStartTx(Ptr< Packet > packet, double txPowerDb, UanTxMode txMode)
double KpToDb(double kp) const
Converts kilopascals to dB re 1 uPa.
virtual void SendPacket(Ptr< Packet > pkt, uint32_t modeNum)
Ptr< Packet > GetPhy1PacketRx(void) const
NS_OBJECT_ENSURE_REGISTERED(AntennaModel)
Abstraction of packet modulation information.
std::list< UanPacketArrival > ArrivalList
Arrival list is a standard template library list of UanPacketArrivals objects.
virtual void NotifyIntChange(void)
virtual void SetChannel(Ptr< UanChannel > channel)
Ptr< UanPhyPer > GetPerModelPhy2(void) const
UanModesList GetModesPhy1(void) const
void SetModesPhy1(UanModesList modes)
uint32_t PeekHeader(Header &header) const
Ptr< UanPhyCalcSinr > GetSinrModelPhy2(void) const
TracedCallback< Ptr< const Packet >, double, UanTxMode > m_txLogger
UanModesList GetModesPhy2(void) const
hold objects of type Ptr<T>
virtual void SetRxGainDb(double gain)
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
void SetPerModelPhy1(Ptr< UanPhyPer > per)
uint32_t GetCenterFreqHz(void) const
Interface for PHY event listener A class which implements this interface may register with Phy object...
virtual void SetRxThresholdDb(double thresh) NS_DEPRECATED
virtual void StartRxPacket(Ptr< Packet > pkt, double rxPowerDb, UanTxMode txMode, UanPdp pdp)
Packet arriving from channel: i.e. leading bit of packet has arrived.
void RxOkFromSubPhy(Ptr< Packet > pkt, double sinr, UanTxMode mode)
virtual bool IsStateRx(void)
double DbToKp(double db) const
Converts dB re 1 uPa to kilopascals.
double GetCcaThresholdPhy1(void) const
void RxErrFromSubPhy(Ptr< Packet > pkt, double sinr)
void SetModesPhy2(UanModesList modes)
Base class for UAN Phy models.
void SetSinrModelPhy2(Ptr< UanPhyCalcSinr > calcSinr)
void SetSinrModelPhy1(Ptr< UanPhyCalcSinr > calcSinr)
virtual void SetReceiveOkCallback(RxOkCallback cb)
virtual void SetTransducer(Ptr< UanTransducer > trans)
int64_t AssignStreams(int64_t stream)
double GetTxPowerDbPhy1(void) const
void SetTxPowerDbPhy2(double)
#define NS_LOG_DEBUG(msg)
virtual void RegisterListener(UanPhyListener *listener)
Register a class to receive phy state change notifications.
static TypeId GetTypeId()
Ptr< UanPhyCalcSinr > GetSinrModelPhy1(void) const
virtual void SetReceiveErrorCallback(RxErrCallback cb)
double GetTxPowerDbPhy2(void) const
TracedCallback< Ptr< const Packet >, double, UanTxMode > m_rxErrLogger
virtual double GetRxGainDb(void)
a base class which provides memory management and object aggregation
virtual bool IsStateCcaBusy(void)
uint32_t GetBandwidthHz(void) const
Hold an floating point type.
TracedCallback< Ptr< const Packet >, double, UanTxMode > m_rxOkLogger
static UanModesList GetDefaultModes(void)
virtual Ptr< UanNetDevice > GetDevice(void)
a unique identifier for an interface.
void SetTxPowerDbPhy1(double)
TypeId SetParent(TypeId tid)
Ptr< Packet > GetPhy2PacketRx(void) const
double GetRxGainDbPhy2(void) const
void SetPerModelPhy2(Ptr< UanPhyPer > per)
virtual double GetCcaThresholdDb(void)
void SetRxGainDbPhy2(double gain)
void SetRxGainDbPhy1(double gain)
void SetCcaThresholdPhy2(double thresh)
Ptr< UanPhyPer > GetPerModelPhy1(void) const
virtual UanTxMode GetMode(uint32_t n)
virtual void EnergyDepletionHandler(void)
virtual double GetTxPowerDb(void)