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 ("SupportedModesPhy1",
186  "List of modes supported by Phy1.",
190  .AddAttribute ("SupportedModesPhy2",
191  "List of modes supported by Phy2.",
195  .AddAttribute ("PerModelPhy1",
196  "Functor to calculate PER based on SINR and TxMode for Phy1.",
197  StringValue ("ns3::UanPhyPerGenDefault"),
199  MakePointerChecker<UanPhyPer> ())
200  .AddAttribute ("PerModelPhy2",
201  "Functor to calculate PER based on SINR and TxMode for Phy2.",
202  StringValue ("ns3::UanPhyPerGenDefault"),
204  MakePointerChecker<UanPhyPer> ())
205  .AddAttribute ("SinrModelPhy1",
206  "Functor to calculate SINR based on pkt arrivals and modes for Phy1.",
207  StringValue ("ns3::UanPhyCalcSinrDual"),
209  MakePointerChecker<UanPhyCalcSinr> ())
210  .AddAttribute ("SinrModelPhy2",
211  "Functor to calculate SINR based on pkt arrivals and modes for Phy2.",
212  StringValue ("ns3::UanPhyCalcSinrDual"),
214  MakePointerChecker<UanPhyCalcSinr> ())
215  .AddTraceSource ("RxOk",
216  "A packet was received successfully.",
218  "ns3::UanPhy::TracedCallback")
219  .AddTraceSource ("RxError",
220  "A packet was received unsuccessfully.",
222  "ns3::UanPhy::TracedCallback")
223  .AddTraceSource ("Tx",
224  "Packet transmission beginning.",
226  "ns3::UanPhy::TracedCallback")
227 
228  ;
229 
230  return tid;
231 }
232 
233 void
235 {
236  NS_LOG_DEBUG ("Not Implemented");
237 }
238 
239 void
241 {
242  NS_LOG_DEBUG ("Not Implemented");
243 }
244 
245 void
247 {
248  NS_LOG_DEBUG ("Not Implemented");
249 }
250 
251 void
252 UanPhyDual::SendPacket (Ptr<Packet> pkt, uint32_t modeNum)
253 {
254  if (modeNum <= m_phy1->GetNModes () - 1)
255  {
256  NS_LOG_DEBUG (Simulator::Now ().GetSeconds () << " Sending packet on Phy1 with mode number " << modeNum);
257  m_txLogger (pkt, m_phy1->GetTxPowerDb (), m_phy1->GetMode (modeNum));
258  m_phy1->SendPacket (pkt, modeNum);
259 
260  }
261  else
262  {
263  NS_LOG_DEBUG (Simulator::Now ().GetSeconds () << " Sending packet on Phy2 with mode number " << modeNum - m_phy1->GetNModes ());
264  m_txLogger (pkt, m_phy2->GetTxPowerDb (), m_phy2->GetMode (modeNum - m_phy1->GetNModes ()));
265  m_phy2->SendPacket (pkt, modeNum - m_phy1->GetNModes ());
266  }
267 }
268 void
270 {
271  m_phy1->RegisterListener (listener);
272  m_phy2->RegisterListener (listener);
273 }
274 
275 void
276 UanPhyDual::StartRxPacket (Ptr<Packet> pkt, double rxPowerDb, UanTxMode txMode, UanPdp pdp)
277 {
278  // Not called. StartRxPacket in m_phy1 and m_phy2 are called directly from Transducer.
279 }
280 
281 void
283 {
284  m_phy1->SetReceiveOkCallback (cb);
285  m_phy2->SetReceiveOkCallback (cb);
286 }
287 
288 void
290 {
291  m_phy1->SetReceiveErrorCallback (cb);
292  m_phy2->SetReceiveErrorCallback (cb);
293 }
294 
295 
296 void
298 {
299  m_phy1->SetTxPowerDb (txpwr);
300  m_phy2->SetTxPowerDb (txpwr);
301 }
302 
303 void
305 {
306  m_phy1->SetTxPowerDb (txpwr);
307 }
308 void
310 {
311  m_phy2->SetTxPowerDb (txpwr);
312 }
313 
314 void
316 {
317  m_phy1->SetRxThresholdDb (thresh);
318  m_phy2->SetRxThresholdDb (thresh);
319 }
320 void
322 {
323  m_phy1->SetCcaThresholdDb (thresh);
324  m_phy2->SetCcaThresholdDb (thresh);
325 }
326 
327 void
329 {
330  m_phy1->SetCcaThresholdDb (thresh);
331 }
332 void
334 {
335  m_phy2->SetCcaThresholdDb (thresh);
336 }
337 
338 
339 double
341 {
342  NS_LOG_WARN ("Warning: Dual Phy only returns TxPowerDb of Phy 1");
343  return m_phy1->GetTxPowerDb ();
344 }
345 
346 double
348 {
349  return m_phy1->GetTxPowerDb ();
350 }
351 
352 double
354 {
355  return m_phy2->GetTxPowerDb ();
356 }
357 
358 double
360 {
361  return m_phy1->GetRxThresholdDb ();
362 }
363 
364 double
366 {
367  NS_LOG_WARN ("Dual Phy only returns CCAThreshold of Phy 1");
368  return m_phy1->GetCcaThresholdDb ();
369 }
370 double
372 {
373  return m_phy1->GetCcaThresholdDb ();
374 }
375 double
377 {
378  return m_phy2->GetCcaThresholdDb ();
379 }
380 
381 bool
383 {
384  return m_phy1->IsStateIdle ();
385 }
386 bool
388 {
389  return m_phy2->IsStateIdle ();
390 }
391 
392 bool
394 {
395  return m_phy1->IsStateRx ();
396 }
397 
398 bool
400 {
401  return m_phy2->IsStateRx ();
402 }
403 
404 bool
406 {
407  return m_phy1->IsStateTx ();
408 }
409 
412 {
413  return m_phy1->GetPacketRx ();
414 }
415 
418 {
419  return m_phy2->GetPacketRx ();
420 }
421 
422 bool
424 {
425  return m_phy2->IsStateTx ();
426 }
427 bool
429 {
430  return m_phy1->IsStateSleep () && m_phy2->IsStateSleep ();
431 }
432 bool
434 {
435  return m_phy1->IsStateIdle () && m_phy2->IsStateIdle ();
436 }
437 bool
439 {
440  return !IsStateIdle () || !IsStateSleep ();
441 }
442 bool
444 {
445  return m_phy1->IsStateRx () || m_phy2->IsStateRx ();
446 }
447 bool
449 {
450  return m_phy1->IsStateTx () || m_phy2->IsStateTx ();
451 }
452 bool
454 {
455  return m_phy1->IsStateCcaBusy () || m_phy2->IsStateCcaBusy ();
456 }
459 {
460  return m_phy1->GetChannel ();
461 }
464 {
465  return m_phy1->GetDevice ();
466 }
467 void
469 {
470  m_phy1->SetChannel (channel);
471  m_phy2->SetChannel (channel);
472 }
473 void
475 {
476  m_phy1->SetDevice (device);
477  m_phy2->SetDevice (device);
478 }
479 void
481 {
482  m_phy1->SetMac (mac);
483  m_phy2->SetMac (mac);
484 }
485 void
486 UanPhyDual::NotifyTransStartTx (Ptr<Packet> packet, double txPowerDb, UanTxMode txMode)
487 {
488 
489 }
490 void
492 {
493  m_phy1->NotifyIntChange ();
494  m_phy2->NotifyIntChange ();
495 
496 }
497 void
499 {
500  m_phy1->SetTransducer (trans);
501  m_phy2->SetTransducer (trans);
502 }
505 {
506  NS_LOG_WARN ("DualPhy Returning transducer of Phy1");
507  return m_phy1->GetTransducer ();
508 }
509 uint32_t
511 {
512  return m_phy1->GetNModes () + m_phy2->GetNModes ();
513 }
514 UanTxMode
516 {
517  if (n < m_phy1->GetNModes ())
518  {
519  return m_phy1->GetMode (n);
520  }
521  else
522  {
523  return m_phy2->GetMode (n - m_phy1->GetNModes ());
524  }
525 }
526 
529 {
530 
531  UanModesListValue modeValue;
532  m_phy1->GetAttribute ("SupportedModes", modeValue);
533  return modeValue.Get ();
534 }
535 
538 {
539  UanModesListValue modeValue;
540  m_phy2->GetAttribute ("SupportedModes", modeValue);
541  return modeValue.Get ();
542 }
543 
544 void
546 {
547  m_phy1->SetAttribute ("SupportedModes", UanModesListValue (modes));
548 }
549 
550 void
552 {
553  m_phy2->SetAttribute ("SupportedModes", UanModesListValue (modes));
554 }
555 
558 {
559  PointerValue perValue;
560  m_phy1->GetAttribute ("PerModel", perValue);
561  return perValue;
562 }
563 
566 {
567  PointerValue perValue;
568  m_phy2->GetAttribute ("PerModel", perValue);
569  return perValue;
570 }
571 
572 void
574 {
575  m_phy1->SetAttribute ("PerModel", PointerValue (per));
576 }
577 
578 void
580 {
581  m_phy2->SetAttribute ("PerModel", PointerValue (per));
582 }
583 
586 {
587  PointerValue sinrValue;
588  m_phy1->GetAttribute ("SinrModel", sinrValue);
589  return sinrValue;
590 }
591 
594 {
595  PointerValue sinrValue;
596  m_phy2->GetAttribute ("SinrModel", sinrValue);
597  return sinrValue;
598 }
599 
600 void
602 {
603  m_phy1->SetAttribute ("SinrModel", PointerValue (sinr));
604 }
605 
606 void
608 {
609  m_phy2->SetAttribute ("SinrModel", PointerValue (sinr));
610 }
611 
612 void
614 {
615  NS_LOG_DEBUG (Simulator::Now ().GetSeconds () << " Received packet");
616  m_recOkCb (pkt, sinr, mode);
617  m_rxOkLogger (pkt, sinr, mode);
618 }
619 
620 void
622 {
623  m_recErrCb (pkt, sinr);
624  m_rxErrLogger (pkt, sinr, m_phy1->GetMode (0));
625 }
626 
629 {
630  NS_FATAL_ERROR ("GetPacketRx not valid for UanPhyDual. Must specify GetPhy1PacketRx or GetPhy2PacketRx");
631  return Create<Packet> ();
632 }
633 
634 int64_t
636 {
637  NS_LOG_FUNCTION (this << stream);
638  return 0;
639 }
640 
641 }
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:45
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:254
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:243
Ptr< UanPhy > m_phy2
Second Phy layer.
Definition: uan-phy-dual.h:245
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
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:252
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:277
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
RxErrCallback m_recErrCb
Callback when packet received with errors.
Definition: uan-phy-dual.h:256
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:250
static Time Now(void)
Return the current simulation virtual time.
Definition: simulator.cc:249
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:248
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 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:261
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:269
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 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:569
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:914
Ptr< Packet > GetPhy2PacketRx(void) const
Get the packet currently being received.
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.
Default SINR model for UanPhyDual.
Definition: uan-phy-dual.h:42
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.