21 #include <ns3/object-factory.h>
24 #include <ns3/simulator.h>
25 #include <ns3/trace-source-accessor.h>
26 #include <ns3/packet-burst.h>
27 #include <ns3/callback.h>
28 #include <ns3/antenna-model.h>
30 #include "half-duplex-ideal-phy.h"
31 #include "half-duplex-ideal-phy-signal-parameters.h"
32 #include "spectrum-error-model.h"
39 NS_OBJECT_ENSURE_REGISTERED (HalfDuplexIdealPhy);
41 HalfDuplexIdealPhy::HalfDuplexIdealPhy ()
48 m_interference.SetErrorModel (CreateObject<ShannonSpectrumErrorModel> ());
52 HalfDuplexIdealPhy::~HalfDuplexIdealPhy ()
67 m_phyMacTxEndCallback = MakeNullCallback< void, Ptr<const Packet> > ();
68 m_phyMacRxStartCallback = MakeNullCallback< void > ();
69 m_phyMacRxEndErrorCallback = MakeNullCallback< void > ();
70 m_phyMacRxEndOkCallback = MakeNullCallback< void, Ptr<Packet> > ();
78 case HalfDuplexIdealPhy::IDLE:
81 case HalfDuplexIdealPhy::RX:
84 case HalfDuplexIdealPhy::TX:
96 HalfDuplexIdealPhy::GetTypeId (
void)
98 static TypeId tid = TypeId (
"ns3::HalfDuplexIdealPhy")
99 .SetParent<SpectrumPhy> ()
100 .AddConstructor<HalfDuplexIdealPhy> ()
101 .AddAttribute (
"Rate",
102 "The PHY rate used by this device",
103 DataRateValue (DataRate (
"1Mbps")),
106 MakeDataRateChecker ())
107 .AddTraceSource (
"TxStart",
108 "Trace fired when a new transmission is started",
110 .AddTraceSource (
"TxEnd",
111 "Trace fired when a previosuly started transmission is finished",
113 .AddTraceSource (
"RxStart",
114 "Trace fired when the start of a signal is detected",
116 .AddTraceSource (
"RxAbort",
117 "Trace fired when a previously started RX is aborted before time",
119 .AddTraceSource (
"RxEndOk",
120 "Trace fired when a previosuly started RX terminates successfully",
122 .AddTraceSource (
"RxEndError",
123 "Trace fired when a previosuly started RX terminates with an error (packet is corrupted)",
175 return m_txPsd->GetSpectrumModel ();
219 m_phyMacTxEndCallback = c;
226 m_phyMacRxStartCallback = c;
234 m_phyMacRxEndErrorCallback = c;
242 m_phyMacRxEndOkCallback = c;
260 HalfDuplexIdealPhy::ChangeState (State newState)
262 NS_LOG_LOGIC (
this <<
" state: " << m_state <<
" -> " << newState);
272 m_phyTxStartTrace (p);
286 txParams->duration =
Seconds (txTimeSeconds);
287 txParams->txPhy = GetObject<SpectrumPhy> ();
288 txParams->txAntenna = m_antenna;
289 txParams->psd = m_txPsd;
290 txParams->data = m_txPacket;
292 NS_LOG_LOGIC (
this <<
" tx power: " << 10 * std::log10 (
Integral (*(txParams->psd))) + 30 <<
" dBm");
293 m_channel->StartTx (txParams);
308 HalfDuplexIdealPhy::EndTx ()
315 m_phyTxEndTrace (m_txPacket);
317 if (!m_phyMacTxEndCallback.IsNull ())
319 m_phyMacTxEndCallback (m_txPacket);
332 NS_LOG_LOGIC (
this <<
" rx power: " << 10 * std::log10 (
Integral (*(spectrumParams->psd))) + 30 <<
" dBm");
335 m_interference.
AddSignal (spectrumParams->psd, spectrumParams->duration);
362 m_phyRxStartTrace (p);
364 m_rxPsd = rxParams->psd;
366 if (!m_phyMacRxStartCallback.IsNull ())
368 NS_LOG_LOGIC (
this <<
" calling m_phyMacRxStartCallback");
369 m_phyMacRxStartCallback ();
373 NS_LOG_LOGIC (
this <<
" m_phyMacRxStartCallback is NULL");
375 m_interference.
StartRx (p, rxParams->psd);
376 NS_LOG_LOGIC (
this <<
" scheduling EndRx with delay " << rxParams->duration);
377 m_endRxEventId =
Simulator::Schedule (rxParams->duration, &HalfDuplexIdealPhy::EndRx,
this);
393 HalfDuplexIdealPhy::AbortRx ()
400 m_phyRxAbortTrace (m_rxPacket);
408 HalfDuplexIdealPhy::EndRx ()
415 bool rxOk = m_interference.
EndRx ();
419 m_phyRxEndOkTrace (m_rxPacket);
420 if (!m_phyMacRxEndOkCallback.IsNull ())
422 NS_LOG_LOGIC (
this <<
" calling m_phyMacRxEndOkCallback");
423 m_phyMacRxEndOkCallback (m_rxPacket);
427 NS_LOG_LOGIC (
this <<
" m_phyMacRxEndOkCallback is NULL");
432 m_phyRxEndErrorTrace (m_rxPacket);
433 if (!m_phyMacRxEndErrorCallback.IsNull ())
435 NS_LOG_LOGIC (
this <<
" calling m_phyMacRxEndErrorCallback");
436 m_phyMacRxEndErrorCallback ();
440 NS_LOG_LOGIC (
this <<
" m_phyMacRxEndErrorCallback is NULL");
void SetRate(DataRate rate)
void SetGenericPhyTxEndCallback(GenericPhyTxEndCallback c)
#define NS_LOG_FUNCTION(parameters)
double Integral(const SpectrumValue &arg)
bool StartTx(Ptr< Packet > p)
#define NS_ASSERT(condition)
void SetNoisePowerSpectralDensity(Ptr< const SpectrumValue > noisePsd)
void SetGenericPhyRxStartCallback(GenericPhyRxStartCallback c)
#define NS_LOG_COMPONENT_DEFINE(name)
uint32_t GetSize(void) const
virtual void DoDispose(void)
void AddSignal(Ptr< const SpectrumValue > spd, const Time duration)
static EventId Schedule(Time const &time, MEM mem_ptr, OBJ obj)
Ptr< MobilityModel > GetMobility()
void StartRx(Ptr< SpectrumSignalParameters > params)
void StartRx(Ptr< const Packet > p, Ptr< const SpectrumValue > rxPsd)
Class for representing data rates.
double CalculateTxTime(uint32_t bytes) const
Calculate transmission time.
void SetDevice(Ptr< NetDevice > d)
void SetAntenna(Ptr< AntennaModel > a)
void SetGenericPhyRxEndOkCallback(GenericPhyRxEndOkCallback c)
virtual void DoDispose(void)
Ptr< AntennaModel > GetRxAntenna()
#define NS_LOG_LOGIC(msg)
void SetNoisePowerSpectralDensity(Ptr< const SpectrumValue > noisePsd)
Ptr< NetDevice > GetDevice()
std::ostream & operator<<(std::ostream &os, const Angles &a)
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
void SetGenericPhyRxEndErrorCallback(GenericPhyRxEndErrorCallback c)
Time Seconds(double seconds)
create ns3::Time instances in units of seconds.
void SetChannel(Ptr< SpectrumChannel > c)
void SetMobility(Ptr< MobilityModel > m)
void SetTxPowerSpectralDensity(Ptr< SpectrumValue > txPsd)
Ptr< const SpectrumModel > GetRxSpectrumModel() const