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