A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
uan-phy-dual.cc
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/log.h"
30 #include "ns3/ptr.h"
31 #include "ns3/traced-callback.h"
32 #include "ns3/trace-source-accessor.h"
33 #include "ns3/simulator.h"
34 #include "uan-header-common.h"
35 #include "uan-mac-rc.h"
36 
37 #include <cmath>
38 
39 
40 NS_LOG_COMPONENT_DEFINE ("UanPhyDual");
41 
42 namespace ns3 {
43 
44 NS_OBJECT_ENSURE_REGISTERED (UanPhyDual);
45 NS_OBJECT_ENSURE_REGISTERED (UanPhyCalcSinrDual);
46 
47 UanPhyCalcSinrDual::UanPhyCalcSinrDual ()
48 {
49 
50 }
51 UanPhyCalcSinrDual::~UanPhyCalcSinrDual ()
52 {
53 
54 }
55 
56 TypeId
57 UanPhyCalcSinrDual::GetTypeId (void)
58 {
59  static TypeId tid = TypeId ("ns3::UanPhyCalcSinrDual")
60  .SetParent<Object> ()
61  .AddConstructor<UanPhyCalcSinrDual> ()
62  ;
63  return tid;
64 }
65 
66 double
68  Time arrTime,
69  double rxPowerDb,
70  double ambNoiseDb,
71  UanTxMode mode,
72  UanPdp pdp,
73  const UanTransducer::ArrivalList &arrivalList) const
74 {
75 
76  if (mode.GetModType () != UanTxMode::OTHER)
77  {
78  NS_LOG_WARN ("Calculating SINR for unsupported modulation type");
79  }
80 
81  double intKp = -DbToKp (rxPowerDb); // This packet is in the arrivalList
82  UanTransducer::ArrivalList::const_iterator it = arrivalList.begin ();
83  for (; it != arrivalList.end (); it++)
84  {
85  // Only count interference if there is overlap in incoming frequency
86  if (std::abs ( (double) it->GetTxMode ().GetCenterFreqHz () - (double) mode.GetCenterFreqHz ())
87  < (double)(it->GetTxMode ().GetBandwidthHz () / 2 + mode.GetBandwidthHz () / 2) - 0.5)
88  {
89  UanHeaderCommon ch, ch2;
90  if (pkt)
91  {
92  pkt->PeekHeader (ch);
93  }
94  it->GetPacket ()->PeekHeader (ch2);
95 
96  if (pkt)
97  {
98  if (ch.GetType () == UanMacRc::TYPE_DATA)
99  {
100  NS_LOG_DEBUG ("Adding interferer from " << ch2.GetSrc () << " against " << ch.GetSrc () << ": PktRxMode: "
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);
104  }
105  }
106  intKp += DbToKp (it->GetRxPowerDb ());
107  }
108  }
109 
110  double totalIntDb = KpToDb (intKp + DbToKp (ambNoiseDb));
111 
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;
114 }
115 
116 UanPhyDual::UanPhyDual ()
117  : UanPhy ()
118 {
119 
120  m_phy1 = CreateObject<UanPhyGen> ();
121  m_phy2 = CreateObject<UanPhyGen> ();
122 
123  m_phy1->SetReceiveOkCallback (m_recOkCb);
124  m_phy2->SetReceiveOkCallback (m_recOkCb);
125 
126  m_phy1->SetReceiveErrorCallback (m_recErrCb);
127  m_phy2->SetReceiveErrorCallback (m_recErrCb);
128 
129 }
130 
131 UanPhyDual::~UanPhyDual ()
132 {
133 }
134 
135 void
137 {
138  if (m_phy1)
139  {
140  m_phy1->Clear ();
141  m_phy1 = 0;
142  }
143  if (m_phy2)
144  {
145  m_phy2->Clear ();
146  m_phy2 = 0;
147  }
148 }
149 void
151 {
152  Clear ();
154 }
155 
156 TypeId
157 UanPhyDual::GetTypeId (void)
158 {
159  static TypeId tid = TypeId ("ns3::UanPhyDual")
160  .SetParent<UanPhy> ()
161  .AddConstructor<UanPhyDual> ()
162  .AddAttribute ("CcaThresholdPhy1",
163  "Aggregate energy of incoming signals to move to CCA Busy state dB of Phy1",
164  DoubleValue (10),
166  MakeDoubleChecker<double> ())
167  .AddAttribute ("CcaThresholdPhy2",
168  "Aggregate energy of incoming signals to move to CCA Busy state dB of Phy2",
169  DoubleValue (10),
171  MakeDoubleChecker<double> ())
172  .AddAttribute ("TxPowerPhy1",
173  "Transmission output power in dB of Phy1",
174  DoubleValue (190),
176  MakeDoubleChecker<double> ())
177  .AddAttribute ("TxPowerPhy2",
178  "Transmission output power in dB of Phy2",
179  DoubleValue (190),
181  MakeDoubleChecker<double> ())
182  .AddAttribute ("RxGainPhy1",
183  "Gain added to incoming signal at receiver of Phy1",
184  DoubleValue (0),
186  MakeDoubleChecker<double> ())
187  .AddAttribute ("RxGainPhy2",
188  "Gain added to incoming signal at receiver of Phy2",
189  DoubleValue (0),
191  MakeDoubleChecker<double> ())
192  .AddAttribute ("SupportedModesPhy1",
193  "List of modes supported by Phy1",
194  UanModesListValue (UanPhyGen::GetDefaultModes ()),
195  MakeUanModesListAccessor (&UanPhyDual::GetModesPhy1, &UanPhyDual::SetModesPhy1),
196  MakeUanModesListChecker () )
197  .AddAttribute ("SupportedModesPhy2",
198  "List of modes supported by Phy2",
199  UanModesListValue (UanPhyGen::GetDefaultModes ()),
200  MakeUanModesListAccessor (&UanPhyDual::GetModesPhy2, &UanPhyDual::SetModesPhy2),
201  MakeUanModesListChecker () )
202  .AddAttribute ("PerModelPhy1",
203  "Functor to calculate PER based on SINR and TxMode for Phy1",
204  PointerValue (CreateObject<UanPhyPerGenDefault> ()),
206  MakePointerChecker<UanPhyPer> ())
207  .AddAttribute ("PerModelPhy2",
208  "Functor to calculate PER based on SINR and TxMode for Phy2",
209  PointerValue (CreateObject<UanPhyPerGenDefault> ()),
211  MakePointerChecker<UanPhyPer> ())
212  .AddAttribute ("SinrModelPhy1",
213  "Functor to calculate SINR based on pkt arrivals and modes for Phy1",
214  PointerValue (CreateObject<UanPhyCalcSinrDual> ()),
216  MakePointerChecker<UanPhyCalcSinr> ())
217  .AddAttribute ("SinrModelPhy2",
218  "Functor to calculate SINR based on pkt arrivals and modes for Phy2",
219  PointerValue (CreateObject<UanPhyCalcSinrDual> ()),
221  MakePointerChecker<UanPhyCalcSinr> ())
222  .AddTraceSource ("RxOk",
223  "A packet was received successfully",
224  MakeTraceSourceAccessor (&UanPhyDual::m_rxOkLogger))
225  .AddTraceSource ("RxError",
226  "A packet was received unsuccessfully",
227  MakeTraceSourceAccessor (&UanPhyDual::m_rxErrLogger))
228  .AddTraceSource ("Tx",
229  "Packet transmission beginning",
230  MakeTraceSourceAccessor (&UanPhyDual::m_txLogger))
231 
232  ;
233 
234  return tid;
235 }
236 
237 void
239 {
240  NS_LOG_DEBUG ("Not Implemented");
241 }
242 
243 void
245 {
246  NS_LOG_DEBUG ("Not Implemented");
247 }
248 
249 void
250 UanPhyDual::SendPacket (Ptr<Packet> pkt, uint32_t modeNum)
251 {
252  if (modeNum <= m_phy1->GetNModes () - 1)
253  {
254  NS_LOG_DEBUG (Simulator::Now ().GetSeconds () << " Sending packet on Phy1 with mode number " << modeNum);
255  m_txLogger (pkt, m_phy1->GetTxPowerDb (), m_phy1->GetMode (modeNum));
256  m_phy1->SendPacket (pkt, modeNum);
257 
258  }
259  else
260  {
261  NS_LOG_DEBUG (Simulator::Now ().GetSeconds () << " Sending packet on Phy2 with mode number " << modeNum - m_phy1->GetNModes ());
262  m_txLogger (pkt, m_phy2->GetTxPowerDb (), m_phy2->GetMode (modeNum - m_phy1->GetNModes ()));
263  m_phy2->SendPacket (pkt, modeNum - m_phy1->GetNModes ());
264  }
265 }
266 void
268 {
269  m_phy1->RegisterListener (listener);
270  m_phy2->RegisterListener (listener);
271 }
272 
273 void
274 UanPhyDual::StartRxPacket (Ptr<Packet> pkt, double rxPowerDb, UanTxMode txMode, UanPdp pdp)
275 {
276  // Not called. StartRxPacket in m_phy1 and m_phy2 are called directly from Transducer.
277 }
278 
279 void
281 {
282  m_phy1->SetReceiveOkCallback (cb);
283  m_phy2->SetReceiveOkCallback (cb);
284 }
285 
286 void
288 {
289  m_phy1->SetReceiveErrorCallback (cb);
290  m_phy2->SetReceiveErrorCallback (cb);
291 }
292 
293 void
295 {
296  m_phy1->SetRxGainDb (gain);
297  m_phy2->SetRxGainDb (gain);
298 }
299 void
301 {
302  m_phy1->SetRxGainDb (gain);
303 }
304 
305 void
307 {
308  m_phy2->SetRxGainDb (gain);
309 }
310 
311 void
313 {
314  m_phy1->SetTxPowerDb (txpwr);
315  m_phy2->SetTxPowerDb (txpwr);
316 }
317 
318 void
320 {
321  m_phy1->SetTxPowerDb (txpwr);
322 }
323 void
325 {
326  m_phy2->SetTxPowerDb (txpwr);
327 }
328 
329 void
331 {
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);
335 }
336 void
338 {
339  m_phy1->SetCcaThresholdDb (thresh);
340  m_phy2->SetCcaThresholdDb (thresh);
341 }
342 
343 void
345 {
346  m_phy1->SetCcaThresholdDb (thresh);
347 }
348 void
350 {
351  m_phy2->SetCcaThresholdDb (thresh);
352 }
353 
354 double
356 {
357  NS_LOG_WARN ("Warning: UanPhyDual::GetRxGainDb returns RxGain of Phy 1");
358  return m_phy1->GetRxGainDb ();
359 }
360 double
362 {
363  return m_phy1->GetRxGainDb ();
364 }
365 double
367 {
368  return m_phy2->GetRxGainDb ();
369 }
370 
371 double
373 {
374  NS_LOG_WARN ("Warning: Dual Phy only returns TxPowerDb of Phy 1");
375  return m_phy1->GetTxPowerDb ();
376 }
377 
378 double
380 {
381  return m_phy1->GetTxPowerDb ();
382 }
383 
384 double
386 {
387  return m_phy2->GetTxPowerDb ();
388 }
389 
390 double
392 {
393  return m_phy1->GetRxThresholdDb ();
394 }
395 
396 double
398 {
399  NS_LOG_WARN ("Dual Phy only returns CCAThreshold of Phy 1");
400  return m_phy1->GetCcaThresholdDb ();
401 }
402 double
404 {
405  return m_phy1->GetCcaThresholdDb ();
406 }
407 double
409 {
410  return m_phy2->GetCcaThresholdDb ();
411 }
412 
413 bool
415 {
416  return m_phy1->IsStateIdle ();
417 }
418 bool
420 {
421  return m_phy2->IsStateIdle ();
422 }
423 
424 bool
426 {
427  return m_phy1->IsStateRx ();
428 }
429 
430 bool
432 {
433  return m_phy2->IsStateRx ();
434 }
435 
436 bool
438 {
439  return m_phy1->IsStateTx ();
440 }
441 
444 {
445  return m_phy1->GetPacketRx ();
446 }
447 
450 {
451  return m_phy2->GetPacketRx ();
452 }
453 
454 bool
456 {
457  return m_phy2->IsStateTx ();
458 }
459 bool
461 {
462  return m_phy1->IsStateSleep () && m_phy2->IsStateSleep ();
463 }
464 bool
466 {
467  return m_phy1->IsStateIdle () && m_phy2->IsStateIdle ();
468 }
469 bool
471 {
472  return !IsStateIdle () || !IsStateSleep ();
473 }
474 bool
476 {
477  return m_phy1->IsStateRx () || m_phy2->IsStateRx ();
478 }
479 bool
481 {
482  return m_phy1->IsStateTx () || m_phy2->IsStateTx ();
483 }
484 bool
486 {
487  return m_phy1->IsStateCcaBusy () || m_phy2->IsStateCcaBusy ();
488 }
491 {
492  return m_phy1->GetChannel ();
493 }
496 {
497  return m_phy1->GetDevice ();
498 }
499 void
501 {
502  m_phy1->SetChannel (channel);
503  m_phy2->SetChannel (channel);
504 }
505 void
507 {
508  m_phy1->SetDevice (device);
509  m_phy2->SetDevice (device);
510 }
511 void
513 {
514  m_phy1->SetMac (mac);
515  m_phy2->SetMac (mac);
516 }
517 void
518 UanPhyDual::NotifyTransStartTx (Ptr<Packet> packet, double txPowerDb, UanTxMode txMode)
519 {
520 
521 }
522 void
524 {
525  m_phy1->NotifyIntChange ();
526  m_phy2->NotifyIntChange ();
527 
528 }
529 void
531 {
532  m_phy1->SetTransducer (trans);
533  m_phy2->SetTransducer (trans);
534 }
537 {
538  NS_LOG_WARN ("DualPhy Returning transducer of Phy1");
539  return m_phy1->GetTransducer ();
540 }
541 uint32_t
543 {
544  return m_phy1->GetNModes () + m_phy2->GetNModes ();
545 }
546 UanTxMode
548 {
549  if (n < m_phy1->GetNModes ())
550  {
551  return m_phy1->GetMode (n);
552  }
553  else
554  {
555  return m_phy2->GetMode (n - m_phy1->GetNModes ());
556  }
557 }
558 
561 {
562 
563  UanModesListValue modeValue;
564  m_phy1->GetAttribute ("SupportedModes", modeValue);
565  return modeValue.Get ();
566 }
567 
570 {
571  UanModesListValue modeValue;
572  m_phy2->GetAttribute ("SupportedModes", modeValue);
573  return modeValue.Get ();
574 }
575 
576 void
578 {
579  m_phy1->SetAttribute ("SupportedModes", UanModesListValue (modes));
580 }
581 
582 void
584 {
585  m_phy2->SetAttribute ("SupportedModes", UanModesListValue (modes));
586 }
587 
590 {
591  PointerValue perValue;
592  m_phy1->GetAttribute ("PerModel", perValue);
593  return perValue;
594 }
595 
598 {
599  PointerValue perValue;
600  m_phy2->GetAttribute ("PerModel", perValue);
601  return perValue;
602 }
603 
604 void
606 {
607  m_phy1->SetAttribute ("PerModel", PointerValue (per));
608 }
609 
610 void
612 {
613  m_phy2->SetAttribute ("PerModel", PointerValue (per));
614 }
615 
618 {
619  PointerValue sinrValue;
620  m_phy1->GetAttribute ("SinrModel", sinrValue);
621  return sinrValue;
622 }
623 
626 {
627  PointerValue sinrValue;
628  m_phy2->GetAttribute ("SinrModel", sinrValue);
629  return sinrValue;
630 }
631 
632 void
634 {
635  m_phy1->SetAttribute ("SinrModel", PointerValue (sinr));
636 }
637 
638 void
640 {
641  m_phy2->SetAttribute ("SinrModel", PointerValue (sinr));
642 }
643 
644 void
645 UanPhyDual::RxOkFromSubPhy (Ptr<Packet> pkt, double sinr, UanTxMode mode)
646 {
647  NS_LOG_DEBUG (Simulator::Now ().GetSeconds () << " Received packet");
648  m_recOkCb (pkt, sinr, mode);
649  m_rxOkLogger (pkt, sinr, mode);
650 }
651 
652 void
653 UanPhyDual::RxErrFromSubPhy (Ptr<Packet> pkt, double sinr)
654 {
655  m_recErrCb (pkt, sinr);
656  m_rxErrLogger (pkt, sinr, m_phy1->GetMode (0));
657 }
658 
659 Ptr<Packet>
661 {
662  NS_FATAL_ERROR ("GetPacketRx not valid for UanPhyDual. Must specify GetPhy1PacketRx or GetPhy2PacketRx");
663  return Create<Packet> ();
664 }
665 
666 int64_t
668 {
669  NS_LOG_FUNCTION (this << stream);
670  return 0;
671 }
672 
673 }
keep track of time unit.
Definition: nstime.h:149
#define NS_LOG_FUNCTION(parameters)
Definition: log.h:311
virtual void DoDispose()
std::string GetName(void) const
Definition: uan-tx-mode.cc:75
virtual uint32_t GetNModes(void)
virtual Ptr< UanTransducer > GetTransducer(void)
virtual void SetEnergyModelCallback(DeviceEnergyModel::ChangeStateCallback callback)
Ptr< Packet > GetPacketRx(void) const
virtual void SetMac(Ptr< UanMac > mac)
#define NS_LOG_COMPONENT_DEFINE(name)
Definition: log.h:122
virtual bool IsStateSleep(void)
double GetCcaThresholdPhy2(void) const
virtual void DoDispose(void)
Definition: object.cc:335
Container for UanTxModes.
Definition: uan-tx-mode.h:162
ModulationType GetModType(void) const
Definition: uan-tx-mode.cc:39
virtual bool IsStateTx(void)
virtual void SetCcaThresholdDb(double thresh)
uint8_t GetType(void) const
bool IsPhy1Rx(void)
bool IsPhy2Rx(void)
#define NS_FATAL_ERROR(msg)
fatal error handling
Definition: fatal-error.h:72
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
Definition: uan-phy-dual.cc:67
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.
Definition: uan-phy.h:87
virtual void SendPacket(Ptr< Packet > pkt, uint32_t modeNum)
Ptr< Packet > GetPhy1PacketRx(void) const
Abstraction of packet modulation information.
Definition: uan-tx-mode.h:36
virtual void Clear(void)
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
Definition: packet.cc:294
Ptr< UanPhyCalcSinr > GetSinrModelPhy2(void) const
bool IsPhy2Idle(void)
UanModesList GetModesPhy2(void) const
hold objects of type Ptr<T>
Definition: pointer.h:33
virtual void SetRxGainDb(double gain)
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
void SetPerModelPhy1(Ptr< UanPhyPer > per)
uint32_t GetCenterFreqHz(void) const
Definition: uan-tx-mode.cc:57
Interface for PHY event listener A class which implements this interface may register with Phy object...
Definition: uan-phy.h:128
virtual void StartRxPacket(Ptr< Packet > pkt, double rxPowerDb, UanTxMode txMode, UanPdp pdp)
Packet arriving from channel: i.e. leading bit of packet has arrived.
virtual bool IsStateRx(void)
double DbToKp(double db) const
Converts dB re 1 uPa to kilopascals.
Definition: uan-phy.h:78
double GetCcaThresholdPhy1(void) const
static Time Now(void)
Definition: simulator.cc:179
void SetModesPhy2(UanModesList modes)
Base class for UAN Phy models.
Definition: uan-phy.h:166
void SetSinrModelPhy2(Ptr< UanPhyCalcSinr > calcSinr)
virtual void SetRxThresholdDb(double thresh)
void SetSinrModelPhy1(Ptr< UanPhyCalcSinr > calcSinr)
virtual void SetReceiveOkCallback(RxOkCallback cb)
bool IsPhy1Tx(void)
virtual void SetTransducer(Ptr< UanTransducer > trans)
int64_t AssignStreams(int64_t stream)
#define NS_LOG_WARN(msg)
Definition: log.h:246
double GetTxPowerDbPhy1(void) const
void SetTxPowerDbPhy2(double)
#define NS_LOG_DEBUG(msg)
Definition: log.h:255
virtual void RegisterListener(UanPhyListener *listener)
Register a class to receive phy state change notifications.
Ptr< UanPhyCalcSinr > GetSinrModelPhy1(void) const
virtual void SetReceiveErrorCallback(RxErrCallback cb)
double GetTxPowerDbPhy2(void) const
UanAddress GetSrc(void) const
virtual double GetRxGainDb(void)
virtual bool IsStateCcaBusy(void)
uint32_t GetBandwidthHz(void) const
Definition: uan-tx-mode.cc:63
Hold an floating point type.
Definition: double.h:41
bool IsPhy1Idle(void)
static UanModesList GetDefaultModes(void)
Definition: uan-phy-gen.cc:420
virtual Ptr< UanNetDevice > GetDevice(void)
a unique identifier for an interface.
Definition: type-id.h:44
void SetTxPowerDbPhy1(double)
bool IsPhy2Tx(void)
TypeId SetParent(TypeId tid)
Definition: type-id.cc:471
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)
virtual void SetReceiveOkCallback(RxOkCallback cb)=0