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
257 {
258  NS_LOG_DEBUG ("Not Implemented");
259 }
260 
261 void
262 UanPhyDual::SendPacket (Ptr<Packet> pkt, uint32_t modeNum)
263 {
264  if (modeNum <= m_phy1->GetNModes () - 1)
265  {
266  NS_LOG_DEBUG (Simulator::Now ().GetSeconds () << " Sending packet on Phy1 with mode number " << modeNum);
267  m_txLogger (pkt, m_phy1->GetTxPowerDb (), m_phy1->GetMode (modeNum));
268  m_phy1->SendPacket (pkt, modeNum);
269 
270  }
271  else
272  {
273  NS_LOG_DEBUG (Simulator::Now ().GetSeconds () << " Sending packet on Phy2 with mode number " << modeNum - m_phy1->GetNModes ());
274  m_txLogger (pkt, m_phy2->GetTxPowerDb (), m_phy2->GetMode (modeNum - m_phy1->GetNModes ()));
275  m_phy2->SendPacket (pkt, modeNum - m_phy1->GetNModes ());
276  }
277 }
278 void
280 {
281  m_phy1->RegisterListener (listener);
282  m_phy2->RegisterListener (listener);
283 }
284 
285 void
286 UanPhyDual::StartRxPacket (Ptr<Packet> pkt, double rxPowerDb, UanTxMode txMode, UanPdp pdp)
287 {
288  // Not called. StartRxPacket in m_phy1 and m_phy2 are called directly from Transducer.
289 }
290 
291 void
293 {
294  m_phy1->SetReceiveOkCallback (cb);
295  m_phy2->SetReceiveOkCallback (cb);
296 }
297 
298 void
300 {
301  m_phy1->SetReceiveErrorCallback (cb);
302  m_phy2->SetReceiveErrorCallback (cb);
303 }
304 
305 void
307 {
308  m_phy1->SetRxGainDb (gain);
309  m_phy2->SetRxGainDb (gain);
310 }
311 void
313 {
314  m_phy1->SetRxGainDb (gain);
315 }
316 
317 void
319 {
320  m_phy2->SetRxGainDb (gain);
321 }
322 
323 void
325 {
326  m_phy1->SetTxPowerDb (txpwr);
327  m_phy2->SetTxPowerDb (txpwr);
328 }
329 
330 void
332 {
333  m_phy1->SetTxPowerDb (txpwr);
334 }
335 void
337 {
338  m_phy2->SetTxPowerDb (txpwr);
339 }
340 
341 void
343 {
344  NS_LOG_WARN ("SetRxThresholdDb is deprecated and has no effect. Look at PER Functor attribute");
345  m_phy1->SetRxThresholdDb (thresh);
346  m_phy2->SetRxThresholdDb (thresh);
347 }
348 void
350 {
351  m_phy1->SetCcaThresholdDb (thresh);
352  m_phy2->SetCcaThresholdDb (thresh);
353 }
354 
355 void
357 {
358  m_phy1->SetCcaThresholdDb (thresh);
359 }
360 void
362 {
363  m_phy2->SetCcaThresholdDb (thresh);
364 }
365 
366 double
368 {
369  NS_LOG_WARN ("Warning: UanPhyDual::GetRxGainDb returns RxGain of Phy 1");
370  return m_phy1->GetRxGainDb ();
371 }
372 double
374 {
375  return m_phy1->GetRxGainDb ();
376 }
377 double
379 {
380  return m_phy2->GetRxGainDb ();
381 }
382 
383 double
385 {
386  NS_LOG_WARN ("Warning: Dual Phy only returns TxPowerDb of Phy 1");
387  return m_phy1->GetTxPowerDb ();
388 }
389 
390 double
392 {
393  return m_phy1->GetTxPowerDb ();
394 }
395 
396 double
398 {
399  return m_phy2->GetTxPowerDb ();
400 }
401 
402 double
404 {
405  return m_phy1->GetRxThresholdDb ();
406 }
407 
408 double
410 {
411  NS_LOG_WARN ("Dual Phy only returns CCAThreshold of Phy 1");
412  return m_phy1->GetCcaThresholdDb ();
413 }
414 double
416 {
417  return m_phy1->GetCcaThresholdDb ();
418 }
419 double
421 {
422  return m_phy2->GetCcaThresholdDb ();
423 }
424 
425 bool
427 {
428  return m_phy1->IsStateIdle ();
429 }
430 bool
432 {
433  return m_phy2->IsStateIdle ();
434 }
435 
436 bool
438 {
439  return m_phy1->IsStateRx ();
440 }
441 
442 bool
444 {
445  return m_phy2->IsStateRx ();
446 }
447 
448 bool
450 {
451  return m_phy1->IsStateTx ();
452 }
453 
456 {
457  return m_phy1->GetPacketRx ();
458 }
459 
462 {
463  return m_phy2->GetPacketRx ();
464 }
465 
466 bool
468 {
469  return m_phy2->IsStateTx ();
470 }
471 bool
473 {
474  return m_phy1->IsStateSleep () && m_phy2->IsStateSleep ();
475 }
476 bool
478 {
479  return m_phy1->IsStateIdle () && m_phy2->IsStateIdle ();
480 }
481 bool
483 {
484  return !IsStateIdle () || !IsStateSleep ();
485 }
486 bool
488 {
489  return m_phy1->IsStateRx () || m_phy2->IsStateRx ();
490 }
491 bool
493 {
494  return m_phy1->IsStateTx () || m_phy2->IsStateTx ();
495 }
496 bool
498 {
499  return m_phy1->IsStateCcaBusy () || m_phy2->IsStateCcaBusy ();
500 }
503 {
504  return m_phy1->GetChannel ();
505 }
508 {
509  return m_phy1->GetDevice ();
510 }
511 void
513 {
514  m_phy1->SetChannel (channel);
515  m_phy2->SetChannel (channel);
516 }
517 void
519 {
520  m_phy1->SetDevice (device);
521  m_phy2->SetDevice (device);
522 }
523 void
525 {
526  m_phy1->SetMac (mac);
527  m_phy2->SetMac (mac);
528 }
529 void
530 UanPhyDual::NotifyTransStartTx (Ptr<Packet> packet, double txPowerDb, UanTxMode txMode)
531 {
532 
533 }
534 void
536 {
537  m_phy1->NotifyIntChange ();
538  m_phy2->NotifyIntChange ();
539 
540 }
541 void
543 {
544  m_phy1->SetTransducer (trans);
545  m_phy2->SetTransducer (trans);
546 }
549 {
550  NS_LOG_WARN ("DualPhy Returning transducer of Phy1");
551  return m_phy1->GetTransducer ();
552 }
553 uint32_t
555 {
556  return m_phy1->GetNModes () + m_phy2->GetNModes ();
557 }
558 UanTxMode
560 {
561  if (n < m_phy1->GetNModes ())
562  {
563  return m_phy1->GetMode (n);
564  }
565  else
566  {
567  return m_phy2->GetMode (n - m_phy1->GetNModes ());
568  }
569 }
570 
573 {
574 
575  UanModesListValue modeValue;
576  m_phy1->GetAttribute ("SupportedModes", modeValue);
577  return modeValue.Get ();
578 }
579 
582 {
583  UanModesListValue modeValue;
584  m_phy2->GetAttribute ("SupportedModes", modeValue);
585  return modeValue.Get ();
586 }
587 
588 void
590 {
591  m_phy1->SetAttribute ("SupportedModes", UanModesListValue (modes));
592 }
593 
594 void
596 {
597  m_phy2->SetAttribute ("SupportedModes", UanModesListValue (modes));
598 }
599 
602 {
603  PointerValue perValue;
604  m_phy1->GetAttribute ("PerModel", perValue);
605  return perValue;
606 }
607 
610 {
611  PointerValue perValue;
612  m_phy2->GetAttribute ("PerModel", perValue);
613  return perValue;
614 }
615 
616 void
618 {
619  m_phy1->SetAttribute ("PerModel", PointerValue (per));
620 }
621 
622 void
624 {
625  m_phy2->SetAttribute ("PerModel", PointerValue (per));
626 }
627 
630 {
631  PointerValue sinrValue;
632  m_phy1->GetAttribute ("SinrModel", sinrValue);
633  return sinrValue;
634 }
635 
638 {
639  PointerValue sinrValue;
640  m_phy2->GetAttribute ("SinrModel", sinrValue);
641  return sinrValue;
642 }
643 
644 void
646 {
647  m_phy1->SetAttribute ("SinrModel", PointerValue (sinr));
648 }
649 
650 void
652 {
653  m_phy2->SetAttribute ("SinrModel", PointerValue (sinr));
654 }
655 
656 void
658 {
659  NS_LOG_DEBUG (Simulator::Now ().GetSeconds () << " Received packet");
660  m_recOkCb (pkt, sinr, mode);
661  m_rxOkLogger (pkt, sinr, mode);
662 }
663 
664 void
666 {
667  m_recErrCb (pkt, sinr);
668  m_rxErrLogger (pkt, sinr, m_phy1->GetMode (0));
669 }
670 
673 {
674  NS_FATAL_ERROR ("GetPacketRx not valid for UanPhyDual. Must specify GetPhy1PacketRx or GetPhy2PacketRx");
675  return Create<Packet> ();
676 }
677 
678 int64_t
680 {
681  NS_LOG_FUNCTION (this << stream);
682  return 0;
683 }
684 
685 }
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:264
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:253
Ptr< UanPhy > m_phy2
Second Phy layer.
Definition: uan-phy-dual.h:255
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:162
virtual void DoDispose(void)
Destructor implementation.
Definition: object.cc:346
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:262
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.
virtual void EnergyRechargeHandler(void)
Handle the energy recharge event.
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:266
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 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:260
static Time Now(void)
Return the current simulation virtual time.
Definition: simulator.cc:224
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:258
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.
virtual NS_DEPRECATED void SetRxThresholdDb(double thresh)
Set the minimum SINR threshold to receive a packet without errors.
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:904
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.