A Discrete-Event Network Simulator
API
uan-phy-dual.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2009 University of Washington
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Leonard Tracy <lentracy@gmail.com>
19  * Andrea Sacco <andrea.sacco85@gmail.com>
20  */
21 
22 #include "uan-phy.h"
23 #include "uan-phy-dual.h"
24 #include "uan-phy-gen.h"
25 #include "uan-tx-mode.h"
26 #include "uan-net-device.h"
27 #include "uan-channel.h"
28 #include "ns3/double.h"
29 #include "ns3/string.h"
30 #include "ns3/log.h"
31 #include "ns3/ptr.h"
32 #include "ns3/traced-callback.h"
33 #include "ns3/trace-source-accessor.h"
34 #include "ns3/simulator.h"
35 #include "uan-header-common.h"
36 #include "uan-mac-rc.h"
37 
38 #include <cmath>
39 
40 
41 namespace ns3 {
42 
43 NS_LOG_COMPONENT_DEFINE ("UanPhyDual");
44 
45 NS_OBJECT_ENSURE_REGISTERED (UanPhyDual);
46 NS_OBJECT_ENSURE_REGISTERED (UanPhyCalcSinrDual);
47 
49 {
50 
51 }
53 {
54 
55 }
56 
57 TypeId
59 {
60  static TypeId tid = TypeId ("ns3::UanPhyCalcSinrDual")
62  .SetGroupName ("Uan")
63  .AddConstructor<UanPhyCalcSinrDual> ()
64  ;
65  return tid;
66 }
67 
68 double
70  Time arrTime,
71  double rxPowerDb,
72  double ambNoiseDb,
73  UanTxMode mode,
74  UanPdp pdp,
75  const UanTransducer::ArrivalList &arrivalList) const
76 {
77 
78  if (mode.GetModType () != UanTxMode::OTHER)
79  {
80  NS_LOG_WARN ("Calculating SINR for unsupported modulation type");
81  }
82 
83  double intKp = -DbToKp (rxPowerDb); // This packet is in the arrivalList
84  UanTransducer::ArrivalList::const_iterator it = arrivalList.begin ();
85  for (; it != arrivalList.end (); it++)
86  {
87  // Only count interference if there is overlap in incoming frequency
88  if (std::abs ( (double) it->GetTxMode ().GetCenterFreqHz () - (double) mode.GetCenterFreqHz ())
89  < (double)(it->GetTxMode ().GetBandwidthHz () / 2 + mode.GetBandwidthHz () / 2) - 0.5)
90  {
91  UanHeaderCommon ch, ch2;
92  if (pkt)
93  {
94  pkt->PeekHeader (ch);
95  }
96  it->GetPacket ()->PeekHeader (ch2);
97 
98  if (pkt)
99  {
100  if (ch.GetType () == UanMacRc::TYPE_DATA)
101  {
102  NS_LOG_DEBUG ("Adding interferer from " << ch2.GetSrc () << " against " << ch.GetSrc () << ": PktRxMode: "
103  << mode.GetName () << " Int mode: " << it->GetTxMode ().GetName () << " Separation: "
104  << std::abs ( (double) it->GetTxMode ().GetCenterFreqHz () - (double) mode.GetCenterFreqHz ())
105  << " Combined bandwidths: " << (double)(it->GetTxMode ().GetBandwidthHz () / 2 + mode.GetBandwidthHz () / 2) - 0.5);
106  }
107  }
108  intKp += DbToKp (it->GetRxPowerDb ());
109  }
110  }
111 
112  double totalIntDb = KpToDb (intKp + DbToKp (ambNoiseDb));
113 
114  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.");
115  return rxPowerDb - totalIntDb;
116 }
117 
119  : UanPhy ()
120 {
121 
122  m_phy1 = CreateObject<UanPhyGen> ();
123  m_phy2 = CreateObject<UanPhyGen> ();
124 
125  m_phy1->SetReceiveOkCallback (m_recOkCb);
126  m_phy2->SetReceiveOkCallback (m_recOkCb);
127 
128  m_phy1->SetReceiveErrorCallback (m_recErrCb);
129  m_phy2->SetReceiveErrorCallback (m_recErrCb);
130 
131 }
132 
134 {
135 }
136 
137 void
139 {
140  if (m_phy1)
141  {
142  m_phy1->Clear ();
143  m_phy1 = 0;
144  }
145  if (m_phy2)
146  {
147  m_phy2->Clear ();
148  m_phy2 = 0;
149  }
150 }
151 void
153 {
154  Clear ();
156 }
157 
158 TypeId
160 {
161  static TypeId tid = TypeId ("ns3::UanPhyDual")
162  .SetParent<UanPhy> ()
163  .SetGroupName ("Uan")
164  .AddConstructor<UanPhyDual> ()
165  .AddAttribute ("CcaThresholdPhy1",
166  "Aggregate energy of incoming signals to move to CCA Busy state dB of Phy1.",
167  DoubleValue (10),
169  MakeDoubleChecker<double> ())
170  .AddAttribute ("CcaThresholdPhy2",
171  "Aggregate energy of incoming signals to move to CCA Busy state dB of Phy2.",
172  DoubleValue (10),
174  MakeDoubleChecker<double> ())
175  .AddAttribute ("TxPowerPhy1",
176  "Transmission output power in dB of Phy1.",
177  DoubleValue (190),
179  MakeDoubleChecker<double> ())
180  .AddAttribute ("TxPowerPhy2",
181  "Transmission output power in dB of Phy2.",
182  DoubleValue (190),
184  MakeDoubleChecker<double> ())
185  .AddAttribute ("RxGainPhy1",
186  "Gain added to incoming signal at receiver of Phy1.",
187  DoubleValue (0),
189  MakeDoubleChecker<double> ())
190  .AddAttribute ("RxGainPhy2",
191  "Gain added to incoming signal at receiver of Phy2.",
192  DoubleValue (0),
194  MakeDoubleChecker<double> ())
195  .AddAttribute ("SupportedModesPhy1",
196  "List of modes supported by Phy1.",
200  .AddAttribute ("SupportedModesPhy2",
201  "List of modes supported by Phy2.",
205  .AddAttribute ("PerModelPhy1",
206  "Functor to calculate PER based on SINR and TxMode for Phy1.",
207  StringValue ("ns3::UanPhyPerGenDefault"),
209  MakePointerChecker<UanPhyPer> ())
210  .AddAttribute ("PerModelPhy2",
211  "Functor to calculate PER based on SINR and TxMode for Phy2.",
212  StringValue ("ns3::UanPhyPerGenDefault"),
214  MakePointerChecker<UanPhyPer> ())
215  .AddAttribute ("SinrModelPhy1",
216  "Functor to calculate SINR based on pkt arrivals and modes for Phy1.",
217  StringValue ("ns3::UanPhyCalcSinrDual"),
219  MakePointerChecker<UanPhyCalcSinr> ())
220  .AddAttribute ("SinrModelPhy2",
221  "Functor to calculate SINR based on pkt arrivals and modes for Phy2.",
222  StringValue ("ns3::UanPhyCalcSinrDual"),
224  MakePointerChecker<UanPhyCalcSinr> ())
225  .AddTraceSource ("RxOk",
226  "A packet was received successfully.",
228  "ns3::UanPhy::TracedCallback")
229  .AddTraceSource ("RxError",
230  "A packet was received unsuccessfully.",
232  "ns3::UanPhy::TracedCallback")
233  .AddTraceSource ("Tx",
234  "Packet transmission beginning.",
236  "ns3::UanPhy::TracedCallback")
237 
238  ;
239 
240  return tid;
241 }
242 
243 void
245 {
246  NS_LOG_DEBUG ("Not Implemented");
247 }
248 
249 void
251 {
252  NS_LOG_DEBUG ("Not Implemented");
253 }
254 
255 void
256 UanPhyDual::SendPacket (Ptr<Packet> pkt, uint32_t modeNum)
257 {
258  if (modeNum <= m_phy1->GetNModes () - 1)
259  {
260  NS_LOG_DEBUG (Simulator::Now ().GetSeconds () << " Sending packet on Phy1 with mode number " << modeNum);
261  m_txLogger (pkt, m_phy1->GetTxPowerDb (), m_phy1->GetMode (modeNum));
262  m_phy1->SendPacket (pkt, modeNum);
263 
264  }
265  else
266  {
267  NS_LOG_DEBUG (Simulator::Now ().GetSeconds () << " Sending packet on Phy2 with mode number " << modeNum - m_phy1->GetNModes ());
268  m_txLogger (pkt, m_phy2->GetTxPowerDb (), m_phy2->GetMode (modeNum - m_phy1->GetNModes ()));
269  m_phy2->SendPacket (pkt, modeNum - m_phy1->GetNModes ());
270  }
271 }
272 void
274 {
275  m_phy1->RegisterListener (listener);
276  m_phy2->RegisterListener (listener);
277 }
278 
279 void
280 UanPhyDual::StartRxPacket (Ptr<Packet> pkt, double rxPowerDb, UanTxMode txMode, UanPdp pdp)
281 {
282  // Not called. StartRxPacket in m_phy1 and m_phy2 are called directly from Transducer.
283 }
284 
285 void
287 {
288  m_phy1->SetReceiveOkCallback (cb);
289  m_phy2->SetReceiveOkCallback (cb);
290 }
291 
292 void
294 {
295  m_phy1->SetReceiveErrorCallback (cb);
296  m_phy2->SetReceiveErrorCallback (cb);
297 }
298 
299 void
301 {
302  m_phy1->SetRxGainDb (gain);
303  m_phy2->SetRxGainDb (gain);
304 }
305 void
307 {
308  m_phy1->SetRxGainDb (gain);
309 }
310 
311 void
313 {
314  m_phy2->SetRxGainDb (gain);
315 }
316 
317 void
319 {
320  m_phy1->SetTxPowerDb (txpwr);
321  m_phy2->SetTxPowerDb (txpwr);
322 }
323 
324 void
326 {
327  m_phy1->SetTxPowerDb (txpwr);
328 }
329 void
331 {
332  m_phy2->SetTxPowerDb (txpwr);
333 }
334 
335 void
337 {
338  NS_LOG_WARN ("SetRxThresholdDb is deprecated and has no effect. Look at PER Functor attribute");
339  m_phy1->SetRxThresholdDb (thresh);
340  m_phy2->SetRxThresholdDb (thresh);
341 }
342 void
344 {
345  m_phy1->SetCcaThresholdDb (thresh);
346  m_phy2->SetCcaThresholdDb (thresh);
347 }
348 
349 void
351 {
352  m_phy1->SetCcaThresholdDb (thresh);
353 }
354 void
356 {
357  m_phy2->SetCcaThresholdDb (thresh);
358 }
359 
360 double
362 {
363  NS_LOG_WARN ("Warning: UanPhyDual::GetRxGainDb returns RxGain of Phy 1");
364  return m_phy1->GetRxGainDb ();
365 }
366 double
368 {
369  return m_phy1->GetRxGainDb ();
370 }
371 double
373 {
374  return m_phy2->GetRxGainDb ();
375 }
376 
377 double
379 {
380  NS_LOG_WARN ("Warning: Dual Phy only returns TxPowerDb of Phy 1");
381  return m_phy1->GetTxPowerDb ();
382 }
383 
384 double
386 {
387  return m_phy1->GetTxPowerDb ();
388 }
389 
390 double
392 {
393  return m_phy2->GetTxPowerDb ();
394 }
395 
396 double
398 {
399  return m_phy1->GetRxThresholdDb ();
400 }
401 
402 double
404 {
405  NS_LOG_WARN ("Dual Phy only returns CCAThreshold of Phy 1");
406  return m_phy1->GetCcaThresholdDb ();
407 }
408 double
410 {
411  return m_phy1->GetCcaThresholdDb ();
412 }
413 double
415 {
416  return m_phy2->GetCcaThresholdDb ();
417 }
418 
419 bool
421 {
422  return m_phy1->IsStateIdle ();
423 }
424 bool
426 {
427  return m_phy2->IsStateIdle ();
428 }
429 
430 bool
432 {
433  return m_phy1->IsStateRx ();
434 }
435 
436 bool
438 {
439  return m_phy2->IsStateRx ();
440 }
441 
442 bool
444 {
445  return m_phy1->IsStateTx ();
446 }
447 
450 {
451  return m_phy1->GetPacketRx ();
452 }
453 
456 {
457  return m_phy2->GetPacketRx ();
458 }
459 
460 bool
462 {
463  return m_phy2->IsStateTx ();
464 }
465 bool
467 {
468  return m_phy1->IsStateSleep () && m_phy2->IsStateSleep ();
469 }
470 bool
472 {
473  return m_phy1->IsStateIdle () && m_phy2->IsStateIdle ();
474 }
475 bool
477 {
478  return !IsStateIdle () || !IsStateSleep ();
479 }
480 bool
482 {
483  return m_phy1->IsStateRx () || m_phy2->IsStateRx ();
484 }
485 bool
487 {
488  return m_phy1->IsStateTx () || m_phy2->IsStateTx ();
489 }
490 bool
492 {
493  return m_phy1->IsStateCcaBusy () || m_phy2->IsStateCcaBusy ();
494 }
497 {
498  return m_phy1->GetChannel ();
499 }
502 {
503  return m_phy1->GetDevice ();
504 }
505 void
507 {
508  m_phy1->SetChannel (channel);
509  m_phy2->SetChannel (channel);
510 }
511 void
513 {
514  m_phy1->SetDevice (device);
515  m_phy2->SetDevice (device);
516 }
517 void
519 {
520  m_phy1->SetMac (mac);
521  m_phy2->SetMac (mac);
522 }
523 void
524 UanPhyDual::NotifyTransStartTx (Ptr<Packet> packet, double txPowerDb, UanTxMode txMode)
525 {
526 
527 }
528 void
530 {
531  m_phy1->NotifyIntChange ();
532  m_phy2->NotifyIntChange ();
533 
534 }
535 void
537 {
538  m_phy1->SetTransducer (trans);
539  m_phy2->SetTransducer (trans);
540 }
543 {
544  NS_LOG_WARN ("DualPhy Returning transducer of Phy1");
545  return m_phy1->GetTransducer ();
546 }
547 uint32_t
549 {
550  return m_phy1->GetNModes () + m_phy2->GetNModes ();
551 }
552 UanTxMode
554 {
555  if (n < m_phy1->GetNModes ())
556  {
557  return m_phy1->GetMode (n);
558  }
559  else
560  {
561  return m_phy2->GetMode (n - m_phy1->GetNModes ());
562  }
563 }
564 
567 {
568 
569  UanModesListValue modeValue;
570  m_phy1->GetAttribute ("SupportedModes", modeValue);
571  return modeValue.Get ();
572 }
573 
576 {
577  UanModesListValue modeValue;
578  m_phy2->GetAttribute ("SupportedModes", modeValue);
579  return modeValue.Get ();
580 }
581 
582 void
584 {
585  m_phy1->SetAttribute ("SupportedModes", UanModesListValue (modes));
586 }
587 
588 void
590 {
591  m_phy2->SetAttribute ("SupportedModes", UanModesListValue (modes));
592 }
593 
596 {
597  PointerValue perValue;
598  m_phy1->GetAttribute ("PerModel", perValue);
599  return perValue;
600 }
601 
604 {
605  PointerValue perValue;
606  m_phy2->GetAttribute ("PerModel", perValue);
607  return perValue;
608 }
609 
610 void
612 {
613  m_phy1->SetAttribute ("PerModel", PointerValue (per));
614 }
615 
616 void
618 {
619  m_phy2->SetAttribute ("PerModel", PointerValue (per));
620 }
621 
624 {
625  PointerValue sinrValue;
626  m_phy1->GetAttribute ("SinrModel", sinrValue);
627  return sinrValue;
628 }
629 
632 {
633  PointerValue sinrValue;
634  m_phy2->GetAttribute ("SinrModel", sinrValue);
635  return sinrValue;
636 }
637 
638 void
640 {
641  m_phy1->SetAttribute ("SinrModel", PointerValue (sinr));
642 }
643 
644 void
646 {
647  m_phy2->SetAttribute ("SinrModel", PointerValue (sinr));
648 }
649 
650 void
652 {
653  NS_LOG_DEBUG (Simulator::Now ().GetSeconds () << " Received packet");
654  m_recOkCb (pkt, sinr, mode);
655  m_rxOkLogger (pkt, sinr, mode);
656 }
657 
658 void
660 {
661  m_recErrCb (pkt, sinr);
662  m_rxErrLogger (pkt, sinr, m_phy1->GetMode (0));
663 }
664 
667 {
668  NS_FATAL_ERROR ("GetPacketRx not valid for UanPhyDual. Must specify GetPhy1PacketRx or GetPhy2PacketRx");
669  return Create<Packet> ();
670 }
671 
672 int64_t
674 {
675  NS_LOG_FUNCTION (this << stream);
676  return 0;
677 }
678 
679 }
tuple channel
Definition: third.py:85
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:102
Ptr< const AttributeChecker > MakeUanModesListChecker(void)
Definition: uan-tx-mode.cc:303
UanModesList Get(void) const
Definition: uan-tx-mode.cc:303
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
virtual void DoDispose()
Destructor implementation.
std::string GetName(void) const
Get the mode name.
Definition: uan-tx-mode.cc:75
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:44
virtual uint32_t GetNModes(void)
Get the number of transmission modes supported by this Phy.
RxOkCallback m_recOkCb
Callback when packet received without errors.
Definition: uan-phy-dual.h:263
Hold variables of type string.
Definition: string.h:41
static TypeId GetTypeId(void)
Register this type.
Definition: uan-phy-dual.cc:58
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.
Definition: uan-phy-dual.cc:52
Ptr< UanPhy > m_phy1
First Phy layer.
Definition: uan-phy-dual.h:252
Ptr< UanPhy > m_phy2
Second Phy layer.
Definition: uan-phy-dual.h:254
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.
Definition: log.h:201
virtual bool IsStateSleep(void)
double GetCcaThresholdPhy2(void) const
Get the CCA threshold signal strength required to detect channel busy.
Container for UanTxModes.
Definition: uan-tx-mode.h:257
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:145
virtual void DoDispose(void)
Destructor implementation.
Definition: object.cc:339
ModulationType GetModType(void) const
Get the modulation type of the mode.
Definition: uan-tx-mode.cc:39
virtual bool IsStateTx(void)
virtual void SetCcaThresholdDb(double thresh)
Set the threshold for detecting channel busy.
uint8_t GetType(void) const
Get the header type value.
bool IsPhy1Rx(void)
bool IsPhy2Rx(void)
virtual void SetDevice(Ptr< UanNetDevice > device)
Set the device hosting this Phy.
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
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.
Ptr< const AttributeAccessor > MakePointerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Definition: pointer.h:220
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.
Definition: uan-phy-dual.cc:69
double GetRxGainDbPhy1(void) const
Get the receiver gain added to signal at receiver in dB.
UanPhyDual()
Constructor.
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.
Definition: uan-phy.h:92
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.
Definition: uan-tx-mode.h:41
ns3::TracedCallback< Ptr< const Packet >, double, UanTxMode > m_txLogger
A packet was sent from this Phy.
Definition: uan-phy-dual.h:261
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...
tuple mac
Definition: third.py:92
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.
Definition: packet.cc:278
Ptr< UanPhyCalcSinr > GetSinrModelPhy2(void) const
Get the SINR calculator.
bool IsPhy2Idle(void)
UanModesList GetModesPhy2(void) const
Get the list of available modes.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Common packet header fields.
Hold objects of type Ptr.
Definition: pointer.h:36
virtual void SetRxGainDb(double gain)
Set the receiver gain.
RxErrCallback m_recErrCb
Callback when packet received with errors.
Definition: uan-phy-dual.h:265
void SetPerModelPhy1(Ptr< UanPhyPer > per)
Set the error probability model.
uint32_t GetCenterFreqHz(void) const
Get the transmission center frequency.
Definition: uan-tx-mode.cc:57
Interface for PHY event listener.
Definition: uan-phy.h:146
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.
Definition: uan-phy.h:82
double GetCcaThresholdPhy1(void) const
Get the CCA threshold signal strength required to detect channel busy.
ns3::TracedCallback< Ptr< const Packet >, double, UanTxMode > m_rxErrLogger
A packet was received unsuccessfully.
Definition: uan-phy-dual.h:259
static Time Now(void)
Return the current simulation virtual time.
Definition: simulator.cc:223
void RxErrFromSubPhy(Ptr< Packet > pkt, double sinr)
Handle callback and logger for packets received with error.
Class used for calculating SINR of packet in UanPhy.
Definition: uan-phy.h:44
ns3::TracedCallback< Ptr< const Packet >, double, UanTxMode > m_rxOkLogger
A packet was received successfully.
Definition: uan-phy-dual.h:257
void SetModesPhy2(UanModesList modes)
Set the available modes.
Base class for UAN Phy models.
Definition: uan-phy.h:175
Ptr< const AttributeAccessor > MakeDoubleAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Definition: double.h:42
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.
bool IsPhy1Tx(void)
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.
Definition: log.h:228
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.
Definition: log.h:236
Unspecified/undefined.
Definition: uan-tx-mode.h:54
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.
Two channel Phy.
Definition: uan-phy-dual.h:82
UanAddress GetSrc(void) const
Get the source address.
Ptr< const AttributeAccessor > MakeUanModesListAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Definition: uan-tx-mode.h:314
virtual double GetRxGainDb(void)
Get the receiver gain added to signal at receiver in dB.
virtual Ptr< UanNetDevice > GetDevice(void) const
Get the device hosting this Phy.
virtual bool IsStateCcaBusy(void)
uint32_t GetBandwidthHz(void) const
Get the transmission signal bandwidth.
Definition: uan-tx-mode.cc:63
UanPhyCalcSinrDual()
Constructor.
Definition: uan-phy-dual.cc:48
This class can be used to hold variables of floating point type such as 'double' or 'float'...
Definition: double.h:41
bool IsPhy1Idle(void)
static UanModesList GetDefaultModes(void)
Get the default transmission modes.
Definition: uan-phy-gen.cc:425
a unique identifier for an interface.
Definition: type-id.h:58
bool IsPhy2Tx(void)
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:826
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.
Default SINR model for UanPhyDual.
Definition: uan-phy-dual.h:42
void SetRxGainDbPhy1(double gain)
Set the receiver gain.
void SetCcaThresholdPhy2(double thresh)
Set the threshold for detecting channel busy.
AttributeValue implementation for UanModesList.
Definition: uan-tx-mode.h:314
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.