A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
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/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 
48 {
49 
50 }
52 {
53 
54 }
55 
56 TypeId
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 
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 
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
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.",
195  MakeUanModesListAccessor (&UanPhyDual::GetModesPhy1, &UanPhyDual::SetModesPhy1),
196  MakeUanModesListChecker () )
197  .AddAttribute ("SupportedModesPhy2",
198  "List of modes supported by Phy2.",
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.",
225  .AddTraceSource ("RxError",
226  "A packet was received unsuccessfully.",
228  .AddTraceSource ("Tx",
229  "Packet transmission beginning.",
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
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
654 {
655  m_recErrCb (pkt, sinr);
656  m_rxErrLogger (pkt, sinr, m_phy1->GetMode (0));
657 }
658 
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 }
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:79
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
virtual void DoDispose()
This method is called by Object::Dispose or by the object's destructor, whichever comes first...
std::string GetName(void) const
Get the mode name.
Definition: uan-tx-mode.cc:75
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register the class in the ns-3 factory.
Definition: object-base.h:38
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
static TypeId GetTypeId(void)
Register this type.
Definition: uan-phy-dual.cc:57
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:51
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:170
virtual bool IsStateSleep(void)
double GetCcaThresholdPhy2(void) const
Get the CCA threshold signal strength required to detect channel busy.
virtual void DoDispose(void)
This method is called by Object::Dispose or by the object's destructor, whichever comes first...
Definition: object.cc:335
Container for UanTxModes.
Definition: uan-tx-mode.h:255
#define NS_FATAL_ERROR(msg)
fatal error handling
Definition: fatal-error.h:95
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)
Unspecified/undefined.
Definition: uan-tx-mode.h:54
bool IsPhy2Rx(void)
virtual void SetDevice(Ptr< UanNetDevice > device)
Set the device hosting this Phy.
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.
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:67
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
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...
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)
TracedCallback< Ptr< const Packet >, double, UanTxMode > m_txLogger
A packet was sent from this Phy.
Definition: uan-phy-dual.h:261
UanModesList GetModesPhy2(void) const
Get the list of available modes.
Common packet header fields.
hold objects of type Ptr
Definition: pointer.h:33
virtual void SetRxGainDb(double gain)
Set the receiver gain.
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
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.
static Time Now(void)
Return the "current simulation time".
Definition: simulator.cc:180
void RxErrFromSubPhy(Ptr< Packet > pkt, double sinr)
Handle callback and logger for packets received with error.
void SetModesPhy2(UanModesList modes)
Set the available modes.
Base class for UAN Phy models.
Definition: uan-phy.h:175
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:203
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:213
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.
UanAddress GetSrc(void) const
Get the source address.
TracedCallback< Ptr< const Packet >, double, UanTxMode > m_rxErrLogger
A packet was received unsuccessfully.
Definition: uan-phy-dual.h:259
virtual double GetRxGainDb(void)
Get the receiver gain added to signal at receiver in dB.
a base class which provides memory management and object aggregation
Definition: object.h:64
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:47
Hold a floating point type.
Definition: double.h:41
TracedCallback< Ptr< const Packet >, double, UanTxMode > m_rxOkLogger
A packet was received successfully.
Definition: uan-phy-dual.h:257
bool IsPhy1Idle(void)
static UanModesList GetDefaultModes(void)
Get the default transmission modes.
Definition: uan-phy-gen.cc:420
virtual Ptr< UanNetDevice > GetDevice(void)
Get the device hosting this Phy.
a unique identifier for an interface.
Definition: type-id.h:49
bool IsPhy2Tx(void)
TypeId SetParent(TypeId tid)
Definition: type-id.cc:610
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.
void SetRxGainDbPhy1(double gain)
Set the receiver gain.
void SetCcaThresholdPhy2(double thresh)
Set the threshold for detecting channel busy.
Attribute Value class for UanTxModes.
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.