A Discrete-Event Network Simulator
API
uan-phy-gen.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-gen.h"
23 #include "uan-transducer.h"
24 #include "uan-channel.h"
25 #include "uan-net-device.h"
26 #include "ns3/simulator.h"
27 #include "ns3/traced-callback.h"
28 #include "ns3/ptr.h"
29 #include "ns3/trace-source-accessor.h"
30 #include "ns3/double.h"
31 #include "ns3/string.h"
32 #include "ns3/log.h"
33 #include "ns3/uan-tx-mode.h"
34 #include "ns3/node.h"
35 #include "ns3/uinteger.h"
36 #include "ns3/energy-source-container.h"
37 #include "ns3/acoustic-modem-energy-model.h"
38 
39 
40 namespace ns3 {
41 
42 NS_LOG_COMPONENT_DEFINE ("UanPhyGen");
43 
44 NS_OBJECT_ENSURE_REGISTERED (UanPhyGen);
45 NS_OBJECT_ENSURE_REGISTERED (UanPhyPerGenDefault);
46 NS_OBJECT_ENSURE_REGISTERED (UanPhyCalcSinrDefault);
47 NS_OBJECT_ENSURE_REGISTERED (UanPhyCalcSinrFhFsk);
48 NS_OBJECT_ENSURE_REGISTERED (UanPhyPerUmodem);
49 NS_OBJECT_ENSURE_REGISTERED (UanPhyPerCommonModes);
50 
51 
52 /*************** UanPhyCalcSinrDefault definition *****************/
54 {
55 
56 }
58 {
59 
60 }
61 
62 TypeId
64 {
65  static TypeId tid = TypeId ("ns3::UanPhyCalcSinrDefault")
67  .SetGroupName ("Uan")
68  .AddConstructor<UanPhyCalcSinrDefault> ()
69  ;
70  return tid;
71 }
72 
73 double
75  Time arrTime,
76  double rxPowerDb,
77  double ambNoiseDb,
78  UanTxMode mode,
79  UanPdp pdp,
80  const UanTransducer::ArrivalList &arrivalList) const
81 {
82  if (mode.GetModType () == UanTxMode::OTHER)
83  {
84  NS_LOG_WARN ("Calculating SINR for unsupported modulation type");
85  }
86 
87  double intKp = -DbToKp (rxPowerDb); // This packet is in the arrivalList
88  UanTransducer::ArrivalList::const_iterator it = arrivalList.begin ();
89  for (; it != arrivalList.end (); it++)
90  {
91  intKp += DbToKp (it->GetRxPowerDb ());
92  }
93 
94  double totalIntDb = KpToDb (intKp + DbToKp (ambNoiseDb));
95 
96  NS_LOG_DEBUG ("Calculating SINR: RxPower = " << rxPowerDb << " dB. Number of interferers = " << arrivalList.size () << " Interference + noise power = " << totalIntDb << " dB. SINR = " << rxPowerDb - totalIntDb << " dB.");
97  return rxPowerDb - totalIntDb;
98 }
99 
100 /*************** UanPhyCalcSinrFhFsk definition *****************/
102 {
103 
104 }
106 {
107 
108 }
109 
110 TypeId
112 {
113  static TypeId tid = TypeId ("ns3::UanPhyCalcSinrFhFsk")
115  .SetGroupName ("Uan")
116  .AddConstructor<UanPhyCalcSinrFhFsk> ()
117  .AddAttribute ("NumberOfHops",
118  "Number of frequencies in hopping pattern.",
119  UintegerValue (13),
121  MakeUintegerChecker<uint32_t> ())
122  ;
123  return tid;
124 }
125 double
127  Time arrTime,
128  double rxPowerDb,
129  double ambNoiseDb,
130  UanTxMode mode,
131  UanPdp pdp,
132  const UanTransducer::ArrivalList &arrivalList) const
133 {
134  if ((mode.GetModType () != UanTxMode::FSK) && (mode.GetConstellationSize () != 13))
135  {
136  NS_FATAL_ERROR ("Calculating SINR for unsupported mode type");
137  }
138 
139  Time ts = Seconds (1.0 / mode.GetPhyRateSps ());
140  Time clearingTime = (m_hops - 1.0) * ts;
141  double csp = pdp.SumTapsFromMaxNc (Time (), ts);
142 
143  // Get maximum arrival offset
144  double maxAmp = -1;
145  Time maxTapDelay (0);
146  UanPdp::Iterator pit = pdp.GetBegin ();
147  for (; pit != pdp.GetEnd (); pit++)
148  {
149  if (std::abs (pit->GetAmp ()) > maxAmp)
150  {
151  maxAmp = std::abs (pit->GetAmp ());
152  // Modified in order to subtract delay of first tap (maxTapDelay appears to be used later in code
153  // as delay from first reception, not from TX time)
154  maxTapDelay = pit->GetDelay () - pdp.GetTap(0).GetDelay();
155  }
156  }
157 
158 
159  double effRxPowerDb = rxPowerDb + KpToDb (csp);
160  //It appears to be just the first elements of the sum in Parrish paper,
161  // "System Design Considerations for Undersea Networks: Link and Multiple Access Protocols", eq. 14
162  double isiUpa = DbToKp(rxPowerDb) * pdp.SumTapsFromMaxNc (ts + clearingTime, ts); // added DpToKp()
163  UanTransducer::ArrivalList::const_iterator it = arrivalList.begin ();
164  double intKp = -DbToKp (effRxPowerDb);
165  for (; it != arrivalList.end (); it++)
166  {
167  UanPdp intPdp = it->GetPdp ();
168  Time tDelta = Abs (arrTime + maxTapDelay - it->GetArrivalTime ());
169  // We want tDelta in terms of a single symbol (i.e. if tDelta = 7.3 symbol+clearing
170  // times, the offset in terms of the arriving symbol power is
171  // 0.3 symbol+clearing times.
172 
173  tDelta = Rem (tDelta, ts + clearingTime);
174 
175  // Align to pktRx
176  if (arrTime + maxTapDelay > it->GetArrivalTime ())
177  {
178  tDelta = ts + clearingTime - tDelta;
179  }
180 
181  double intPower = 0.0;
182  if (tDelta < ts) // Case where there is overlap of a symbol due to interferer arriving just after desired signal
183  {
184  //Appears to be just the first two elements of the sum in Parrish paper, eq. 14
185  intPower += intPdp.SumTapsNc (Time (), ts - tDelta);
186  intPower += intPdp.SumTapsNc (ts - tDelta + clearingTime,
187  2 * ts - tDelta + clearingTime);
188  }
189  else // Account for case where there's overlap of a symbol due to interferer arriving with a tDelta of a symbol + clearing time later
190  {
191  // Appears to be just the first two elements of the sum in Parrish paper, eq. 14
192  Time start = ts + clearingTime - tDelta;
193  Time end = /*start +*/ ts; // Should only sum over portion of ts that overlaps, not entire ts
194  intPower += intPdp.SumTapsNc (start, end);
195 
196  start = start + ts + clearingTime;
197  //Should only sum over portion of ts that overlaps, not entire ts
198  end = end + ts + clearingTime; //start + Seconds (ts);
199  intPower += intPdp.SumTapsNc (start, end);
200  }
201  intKp += DbToKp (it->GetRxPowerDb ()) * intPower;
202  }
203 
204  double totalIntDb = KpToDb (isiUpa + intKp + DbToKp (ambNoiseDb));
205 
206  NS_LOG_DEBUG ("Calculating SINR: RxPower = " << rxPowerDb << " dB. Effective Rx power " << effRxPowerDb << " dB. Number of interferers = " << arrivalList.size () << " Interference + noise power = " << totalIntDb << " dB. SINR = " << effRxPowerDb - totalIntDb << " dB.");
207  return effRxPowerDb - totalIntDb;
208 }
209 
210 /*************** UanPhyPerGenDefault definition *****************/
212 {
213 
214 }
215 
217 {
218 
219 }
220 TypeId
222 {
223  static TypeId tid = TypeId ("ns3::UanPhyPerGenDefault")
224  .SetParent<UanPhyPer> ()
225  .SetGroupName ("Uan")
226  .AddConstructor<UanPhyPerGenDefault> ()
227  .AddAttribute ("Threshold", "SINR cutoff for good packet reception.",
228  DoubleValue (8),
230  MakeDoubleChecker<double> ());
231  return tid;
232 }
233 
234 
235 // Default PER calculation simply compares SINR to a threshold which is configurable
236 // via an attribute.
237 double
239 {
240  if (sinrDb >= m_thresh)
241  {
242  return 0;
243  }
244  else
245  {
246  return 1;
247  }
248 }
249 
250 /*************** UanPhyPerCommonModes definition *****************/
252  : UanPhyPer ()
253 {
254 
255 }
256 
258 {
259 
260 }
261 
262 TypeId
264 {
265  static TypeId tid = TypeId ("ns3::UanPhyPerCommonModes")
266  .SetParent<UanPhyPer> ()
267  .SetGroupName ("Uan")
268  .AddConstructor<UanPhyPerCommonModes> ();
269 
270  return tid;
271 }
272 
273 double
275 {
276  NS_LOG_FUNCTION (this);
277 
278  double EbNo = std::pow (10.0, sinrDb / 10.0);
279  double BER = 1.0;
280  double PER = 0.0;
281 
282  switch (mode.GetModType ())
283  {
284  case UanTxMode::PSK:
285  switch (mode.GetConstellationSize ())
286  {
287  case 2: // BPSK
288  {
289  BER = 0.5 * erfc (sqrt (EbNo));
290  break;
291  }
292  case 4: // QPSK, half BPSK EbNo
293  {
294  BER = 0.5 * erfc (sqrt (0.5 * EbNo));
295  break;
296  }
297 
298  default:
299  NS_FATAL_ERROR ("constellation " << mode.GetConstellationSize () << " not supported");
300  break;
301  }
302  break;
303 
304  // taken from Ronell B. Sicat, "Bit Error Probability Computations for M-ary Quadrature Amplitude Modulation",
305  // EE 242 Digital Communications and Codings, 2009
306  case UanTxMode::QAM:
307  {
308  // generic EbNo
309  EbNo *= mode.GetDataRateBps () / mode.GetBandwidthHz ();
310 
311  double M = (double) mode.GetConstellationSize ();
312 
313  // standard squared quantized QAM, even number of bits per symbol supported
314  int log2sqrtM = (int) ::std::log2 ( sqrt (M));
315 
316  double log2M = ::std::log2 (M);
317 
318  if ((int)log2M % 2)
319  {
320  NS_FATAL_ERROR ("constellation " << M << " not supported");
321  }
322 
323  double sqrtM = ::std::sqrt (M);
324 
325  NS_LOG_DEBUG ("M=" << M << "; log2sqrtM=" << log2sqrtM << "; log2M=" << log2M << "; sqrtM=" << sqrtM);
326 
327  BER = 0.0;
328 
329  // Eq (75)
330  for (int k = 0; k < log2sqrtM; k++)
331  {
332  int sum_items = (int) ((1.0 - ::std::pow ( 2.0, (-1.0) * (double) k)) * ::std::sqrt (M) - 1.0);
333  double pow2k = ::std::pow (2.0, (double) k - 1.0);
334 
335  NS_LOG_DEBUG ("k=" << k << "; sum_items=" << sum_items << "; pow2k=" << pow2k);
336 
337  double PbK = 0;
338 
339  // Eq (74)
340  for (int j = 0; j < sum_items; ++j)
341  {
342  PbK += ::std::pow (-1.0, (double) j * pow2k / sqrtM)
343  * (pow2k - ::std::floor ( (double) (j * pow2k / sqrtM) - 0.5))
344  * erfc ((2.0 * (double)j + 1.0) * ::std::sqrt (3.0 * (log2M * EbNo) / (2.0 * (M - 1.0))));
345 
346  NS_LOG_DEBUG ("j=" << j << "; PbK=" << PbK);
347 
348  }
349  PbK *= 1.0 / sqrtM;
350 
351  BER += PbK;
352 
353  NS_LOG_DEBUG ("k=" << k << "; PbK=" << PbK << "; BER=" << BER);
354  }
355 
356  BER *= 1.0 / (double) log2sqrtM;
357 
358  break;
359  }
360 
361  case UanTxMode::FSK:
362  switch (mode.GetConstellationSize ())
363  {
364  case 2:
365  {
366  BER = 0.5 * erfc (sqrt (0.5 * EbNo));
367  break;
368  }
369 
370  default:
371  NS_FATAL_ERROR ("constellation " << mode.GetConstellationSize () << " not supported");
372  }
373  break;
374 
375  default: // OTHER and error
376  NS_FATAL_ERROR ("Mode " << mode.GetModType () << " not supported");
377  break;
378  }
379 
380  PER = (1.0 - pow (1.0 - BER, (double) pkt->GetSize () * 8.0));
381 
382  NS_LOG_DEBUG ("BER=" << BER << "; PER=" << PER);
383 
384  return PER;
385 }
386 
387 /*************** UanPhyPerUmodem definition *****************/
389 {
390 
391 }
393 {
394 
395 }
396 
398 {
399  static TypeId tid = TypeId ("ns3::UanPhyPerUmodem")
400  .SetParent<UanPhyPer> ()
401  .SetGroupName ("Uan")
402  .AddConstructor<UanPhyPerUmodem> ()
403  ;
404  return tid;
405 }
406 
407 double
408 UanPhyPerUmodem::NChooseK (uint32_t n, uint32_t k)
409 {
410  double result;
411 
412  result = 1.0;
413 
414  for (uint32_t i = std::max (k,n - k) + 1; i <= n; ++i)
415  {
416  result *= i;
417  }
418 
419  for (uint32_t i = 2; i <= std::min (k,n - k); ++i)
420  {
421  result /= i;
422  }
423 
424  return result;
425 }
426 
427 double
429 {
430  uint32_t d[] =
431  { 12, 14, 16, 18, 20, 22, 24, 26, 28 };
432  double Bd[] =
433  {
434  33, 281, 2179, 15035LLU, 105166LLU, 692330LLU, 4580007LLU, 29692894LLU,
435  190453145LLU
436  };
437 
438  // double Rc = 1.0 / 2.0;
439  double ebno = std::pow (10.0, sinr / 10.0);
440  double perror = 1.0 / (2.0 + ebno);
441  double P[9];
442 
443  if ((mode.GetModType () != UanTxMode::FSK) && (mode.GetConstellationSize () != 13))
444  {
445  NS_FATAL_ERROR ("Calculating SINR for unsupported mode type");
446  }
447  if (sinr >= 10)
448  {
449  return 0;
450  }
451  if (sinr <= 6)
452  {
453  return 1;
454  }
455 
456  for (uint32_t r = 0; r < 9; r++)
457  {
458  double sumd = 0;
459  for (uint32_t k = 0; k < d[r]; k++)
460  {
461  sumd = sumd + NChooseK (d[r] - 1 + k, k) * std::pow (1 - perror, (double) k);
462  }
463  P[r] = std::pow (perror, (double) d[r]) * sumd;
464 
465  }
466 
467  double Pb = 0;
468  for (uint32_t r = 0; r < 8; r++)
469  {
470  Pb = Pb + Bd[r] * P[r];
471  }
472 
473  // cout << "Pb = " << Pb << endl;
474  uint32_t bits = pkt->GetSize () * 8;
475 
476  double Ppacket = 1;
477  double temp = NChooseK (bits, 0);
478  temp *= std::pow ( (1 - Pb), (double) bits);
479  Ppacket -= temp;
480  temp = NChooseK (288, 1) * Pb * std::pow ( (1 - Pb), bits - 1.0);
481  Ppacket -= temp;
482 
483  if (Ppacket > 1)
484  {
485  return 1;
486  }
487  else
488  {
489  return Ppacket;
490  }
491 }
492 
493 /*************** UanPhyGen definition *****************/
495  : UanPhy (),
496  m_state (IDLE),
497  m_channel (0),
498  m_transducer (0),
499  m_device (0),
500  m_mac (0),
501  m_txPwrDb (0),
502  m_rxThreshDb (0),
503  m_ccaThreshDb (0),
504  m_pktRx (0),
505  m_pktTx (0),
506  m_cleared (false)
507 {
508  m_pg = CreateObject<UniformRandomVariable> ();
509 
511 }
512 
514 {
515 
516 }
517 
518 void
520 {
521  if (m_cleared)
522  {
523  return;
524  }
525  m_cleared = true;
526  m_listeners.clear ();
527  if (m_channel)
528  {
529  m_channel->Clear ();
530  m_channel = 0;
531  }
532  if (m_transducer)
533  {
534  m_transducer->Clear ();
535  m_transducer = 0;
536  }
537  if (m_device)
538  {
539  m_device->Clear ();
540  m_device = 0;
541  }
542  if (m_mac)
543  {
544  m_mac->Clear ();
545  m_mac = 0;
546  }
547  if (m_per)
548  {
549  m_per->Clear ();
550  m_per = 0;
551  }
552  if (m_sinr)
553  {
554  m_sinr->Clear ();
555  m_sinr = 0;
556  }
557  m_pktRx = 0;
558 }
559 
560 void
562 {
563  Clear ();
566 }
567 
570 {
571  UanModesList l;
572  l.AppendMode (UanTxModeFactory::CreateMode (UanTxMode::FSK, 80, 80, 22000, 4000, 13, "FH-FSK")); // micromodem only
573  l.AppendMode (UanTxModeFactory::CreateMode (UanTxMode::PSK, 200, 200, 22000, 4000, 4, "QPSK"));
574  l.AppendMode (UanTxModeFactory::CreateMode (UanTxMode::PSK, 5000, 5000, 25000, 5000, 4, "QPSK")); // micromodem2
575 
576  return l;
577 }
578 
579 TypeId
581 {
582 
583  static TypeId tid = TypeId ("ns3::UanPhyGen")
584  .SetParent<UanPhy> ()
585  .SetGroupName ("Uan")
586  .AddConstructor<UanPhyGen> ()
587  .AddAttribute ("CcaThreshold",
588  "Aggregate energy of incoming signals to move to CCA Busy state dB.",
589  DoubleValue (10),
591  MakeDoubleChecker<double> ())
592  .AddAttribute ("RxThreshold",
593  "Required SNR for signal acquisition in dB.",
594  DoubleValue (10),
596  MakeDoubleChecker<double> ())
597  .AddAttribute ("TxPower",
598  "Transmission output power in dB.",
599  DoubleValue (190),
601  MakeDoubleChecker<double> ())
602  .AddAttribute ("SupportedModes",
603  "List of modes supported by this PHY.",
607  .AddAttribute ("PerModel",
608  "Functor to calculate PER based on SINR and TxMode.",
609  StringValue ("ns3::UanPhyPerGenDefault"),
611  MakePointerChecker<UanPhyPer> ())
612  .AddAttribute ("SinrModel",
613  "Functor to calculate SINR based on pkt arrivals and modes.",
614  StringValue ("ns3::UanPhyCalcSinrDefault"),
616  MakePointerChecker<UanPhyCalcSinr> ())
617  .AddTraceSource ("RxOk",
618  "A packet was received successfully.",
620  "ns3::UanPhy::TracedCallback")
621  .AddTraceSource ("RxError",
622  "A packet was received unsuccessfully.",
624  "ns3::UanPhy::TracedCallback")
625  .AddTraceSource ("Tx",
626  "Packet transmission beginning.",
628  "ns3::UanPhy::TracedCallback")
629  ;
630  return tid;
631 
632 }
633 
634 void
636 {
637  NS_LOG_FUNCTION (this);
638  m_energyCallback = cb;
639 }
640 
641 void
643 {
644  NS_LOG_FUNCTION (this);
645 
646  if (!m_energyCallback.IsNull ())
647  {
648  m_energyCallback (state);
649  }
650 }
651 
652 void
654 {
655  NS_LOG_FUNCTION (this);
656  NS_LOG_DEBUG ("Energy depleted at node " << m_device->GetNode ()->GetId () <<
657  ", stopping rx/tx activities");
658 
659  m_state = DISABLED;
660  if (m_txEndEvent.IsRunning ())
661  {
664  m_pktTx = 0;
665  }
666  if (m_rxEndEvent.IsRunning ())
667  {
670  m_pktRx = 0;
671  }
672 }
673 
674 void
676 {
677  NS_LOG_FUNCTION (this);
678  NS_LOG_DEBUG ("Energy recharged at node " << m_device->GetNode ()->GetId () <<
679  ", restoring rx/tx activities");
680 
681  m_state = IDLE;
682 }
683 
684 void
685 UanPhyGen::SendPacket (Ptr<Packet> pkt, uint32_t modeNum)
686 {
687  NS_LOG_DEBUG ("PHY " << m_mac->GetAddress () << ": Transmitting packet");
688  if (m_state == DISABLED)
689  {
690  NS_LOG_DEBUG ("Energy depleted, node cannot transmit any packet. Dropping.");
691  return;
692  }
693 
694  if (m_state == TX)
695  {
696  NS_LOG_DEBUG ("PHY requested to TX while already Transmitting. Dropping packet.");
697  return;
698  }
699  else if (m_state == SLEEP)
700  {
701  NS_LOG_DEBUG ("PHY requested to TX while sleeping. Dropping packet.");
702  return;
703  }
704 
705  UanTxMode txMode = GetMode (modeNum);
706 
707  if (m_pktRx != 0)
708  {
709  m_minRxSinrDb = -1e30;
710  m_pktRx = 0;
711  }
712 
713  m_transducer->Transmit (Ptr<UanPhy> (this), pkt, m_txPwrDb, txMode);
714  m_state = TX;
716  double txdelay = pkt->GetSize () * 8.0 / txMode.GetDataRateBps ();
717  m_pktTx = pkt;
719  NS_LOG_DEBUG ("PHY " << m_mac->GetAddress () << " notifying listeners");
720  NotifyListenersTxStart (Seconds (txdelay));
721  m_txLogger (pkt, m_txPwrDb, txMode);
722 }
723 
724 void
726 {
727  if (m_state == SLEEP || m_state == DISABLED)
728  {
729  NS_LOG_DEBUG ("Transmission ended but node sleeping or dead");
730  return;
731  }
732 
733  NS_ASSERT (m_state == TX);
735  {
736  m_state = CCABUSY;
738  }
739  else
740  {
741  m_state = IDLE;
742  }
744 
746 }
747 
748 void
750 {
751  m_listeners.push_back (listener);
752 }
753 
754 
755 void
756 UanPhyGen::StartRxPacket (Ptr<Packet> pkt, double rxPowerDb, UanTxMode txMode, UanPdp pdp)
757 {
758  NS_LOG_DEBUG ("PHY " << m_mac->GetAddress () << ": rx power after RX gain = " << rxPowerDb << " dB re uPa");
759 
760  switch (m_state)
761  {
762  case DISABLED:
763  NS_LOG_DEBUG ("Energy depleted, node cannot receive any packet. Dropping.");
764  NotifyRxDrop (pkt); // traced source netanim
765  return;
766  case TX:
767  NotifyRxDrop (pkt); // traced source netanim
768  NS_ASSERT (false);
769  break;
770  case RX:
771  {
772  NS_ASSERT (m_pktRx);
774  m_minRxSinrDb = (newSinrDb < m_minRxSinrDb) ? newSinrDb : m_minRxSinrDb;
775  NS_LOG_DEBUG ("PHY " << m_mac->GetAddress () << ": Starting RX in RX mode. SINR of pktRx = " << m_minRxSinrDb);
776  NotifyRxBegin (pkt); // traced source netanim
777  }
778  break;
779 
780  case CCABUSY:
781  case IDLE:
782  {
783  NS_ASSERT (!m_pktRx);
784  bool hasmode = false;
785  for (uint32_t i = 0; i < GetNModes (); i++)
786  {
787  if (txMode.GetUid () == GetMode (i).GetUid ())
788  {
789  hasmode = true;
790  break;
791  }
792  }
793  if (!hasmode)
794  {
795  break;
796  }
797 
798 
799  double newsinr = CalculateSinrDb (pkt, Simulator::Now (), rxPowerDb, txMode, pdp);
800  NS_LOG_DEBUG ("PHY " << m_mac->GetAddress () << ": Starting RX in IDLE mode. SINR = " << newsinr);
801  if (newsinr > m_rxThreshDb)
802  {
803  m_state = RX;
805  NotifyRxBegin (pkt); // traced source netanim
806  m_rxRecvPwrDb = rxPowerDb;
807  m_minRxSinrDb = newsinr;
808  m_pktRx = pkt;
810  m_pktRxMode = txMode;
811  m_pktRxPdp = pdp;
812  double txdelay = pkt->GetSize () * 8.0 / txMode.GetDataRateBps ();
813  m_rxEndEvent = Simulator::Schedule (Seconds (txdelay), &UanPhyGen::RxEndEvent, this, pkt, rxPowerDb, txMode);
815  }
816 
817  }
818  break;
819  case SLEEP:
820  NS_LOG_DEBUG ("Sleep mode. Dropping packet.");
821  NotifyRxDrop (pkt); // traced source netanim
822  break;
823  }
824 
826  {
827  m_state = CCABUSY;
829  }
830 
831 }
832 
833 void
834 UanPhyGen::RxEndEvent (Ptr<Packet> pkt, double rxPowerDb, UanTxMode txMode)
835 {
836  NS_UNUSED (rxPowerDb);
837  if (pkt != m_pktRx)
838  {
839  return;
840  }
841 
842  if (m_state == DISABLED || m_state == SLEEP)
843  {
844  NS_LOG_DEBUG ("Sleep mode or dead. Dropping packet");
845  m_pktRx = 0;
846  NotifyRxDrop (pkt); // traced source netanim
847  return;
848  }
849 
850  NotifyRxEnd (pkt); // traced source netanim
852  {
853  m_state = CCABUSY;
855  }
856  else
857  {
858  m_state = IDLE;
860  }
861 
862  if (m_pg->GetValue (0, 1) > m_per->CalcPer (m_pktRx, m_minRxSinrDb, txMode))
863  {
864  m_rxOkLogger (pkt, m_minRxSinrDb, txMode);
866  if (!m_recOkCb.IsNull ())
867  {
868  m_recOkCb (pkt, m_minRxSinrDb, txMode);
869  }
870 
871  }
872  else
873  {
874  m_rxErrLogger (pkt, m_minRxSinrDb, txMode);
876  if (!m_recErrCb.IsNull ())
877  {
878  m_recErrCb (pkt, m_minRxSinrDb);
879  }
880  }
881 
882  m_pktRx = 0;
883 }
884 
885 void
887 {
888  m_recOkCb = cb;
889 }
890 
891 void
893 {
894  m_recErrCb = cb;
895 }
896 bool
898 {
899  return m_state == SLEEP;
900 }
901 bool
903 {
904  return m_state == IDLE;
905 }
906 bool
908 {
909  return !IsStateIdle () && !IsStateSleep ();
910 }
911 bool
913 {
914  return m_state == RX;
915 }
916 bool
918 {
919  return m_state == TX;
920 }
921 
922 bool
924 {
925  return m_state == CCABUSY;
926 }
927 
928 
929 void
931 {
932  m_txPwrDb = txpwr;
933 }
934 void
936 {
937  m_rxThreshDb = thresh;
938 }
939 void
941 {
942  m_ccaThreshDb = thresh;
943 }
944 
945 double
947 {
948  return m_txPwrDb;
949 
950 }
951 
952 double
954 {
955  return m_rxThreshDb;
956 }
957 double
959 {
960  return m_ccaThreshDb;
961 }
962 
965 {
966  return m_channel;
967 }
968 
971 {
972  return m_device;
973 }
974 
977 {
978  return m_transducer;
979 }
980 void
982 {
983  m_channel = channel;
984 }
985 
986 void
988 {
989  m_device = device;
990 }
991 
992 void
994 {
995  m_mac = mac;
996 }
997 
998 void
1000 {
1001  m_transducer = trans;
1002  m_transducer->AddPhy (this);
1003 }
1004 
1005 void
1007 {
1008  if (sleep )
1009  {
1010  m_state = SLEEP;
1011  if (!m_energyCallback.IsNull ())
1012  {
1014  }
1015  }
1016  else if (m_state == SLEEP)
1017  {
1019  {
1020  m_state = CCABUSY;
1022  }
1023  else
1024  {
1025  m_state = IDLE;
1026  }
1027 
1028  if (!m_energyCallback.IsNull ())
1029  {
1031  }
1032  }
1033 }
1034 
1035 int64_t
1037 {
1038  NS_LOG_FUNCTION (this << stream);
1039  m_pg->SetStream (stream);
1040  return 1;
1041 }
1042 
1043 void
1044 UanPhyGen::NotifyTransStartTx (Ptr<Packet> packet, double txPowerDb, UanTxMode txMode)
1045 {
1046  NS_UNUSED (txPowerDb);
1047  if (m_pktRx)
1048  {
1049  m_minRxSinrDb = -1e30;
1050  }
1051 }
1052 
1053 void
1055 {
1057  {
1058  m_state = IDLE;
1060  }
1061 }
1062 
1063 double
1064 UanPhyGen::CalculateSinrDb (Ptr<Packet> pkt, Time arrTime, double rxPowerDb, UanTxMode mode, UanPdp pdp)
1065 {
1066  double noiseDb = m_channel->GetNoiseDbHz ( (double) mode.GetCenterFreqHz () / 1000.0) + 10 * std::log10 (mode.GetBandwidthHz ());
1067  return m_sinr->CalcSinrDb (pkt, arrTime, rxPowerDb, noiseDb, mode, pdp, m_transducer->GetArrivalList ());
1068 }
1069 
1070 double
1072 {
1073 
1074  const UanTransducer::ArrivalList &arrivalList = m_transducer->GetArrivalList ();
1075 
1076  UanTransducer::ArrivalList::const_iterator it = arrivalList.begin ();
1077 
1078  double interfPower = 0;
1079 
1080  for (; it != arrivalList.end (); it++)
1081  {
1082  if (pkt != it->GetPacket ())
1083  {
1084  interfPower += DbToKp (it->GetRxPowerDb ());
1085  }
1086  }
1087 
1088  return KpToDb (interfPower);
1089 
1090 }
1091 
1092 double
1094 {
1095  return std::pow (10, db / 10.0);
1096 }
1097 double
1099 {
1100  return 10 * std::log10 (kp);
1101 }
1102 
1103 void
1105 {
1106  ListenerList::const_iterator it = m_listeners.begin ();
1107  for (; it != m_listeners.end (); it++)
1108  {
1109  (*it)->NotifyRxStart ();
1110  }
1111 
1112 }
1113 void
1115 {
1116  ListenerList::const_iterator it = m_listeners.begin ();
1117  for (; it != m_listeners.end (); it++)
1118  {
1119  (*it)->NotifyRxEndOk ();
1120  }
1121 }
1122 void
1124 {
1125  ListenerList::const_iterator it = m_listeners.begin ();
1126  for (; it != m_listeners.end (); it++)
1127  {
1128  (*it)->NotifyRxEndError ();
1129  }
1130 }
1131 void
1133 {
1134  ListenerList::const_iterator it = m_listeners.begin ();
1135  for (; it != m_listeners.end (); it++)
1136  {
1137  (*it)->NotifyCcaStart ();
1138  }
1139 }
1140 void
1142 {
1143  ListenerList::const_iterator it = m_listeners.begin ();
1144  for (; it != m_listeners.end (); it++)
1145  {
1146  (*it)->NotifyCcaEnd ();
1147  }
1148 }
1149 
1150 void
1152 {
1153  ListenerList::const_iterator it = m_listeners.begin ();
1154  for (; it != m_listeners.end (); it++)
1155  {
1156  (*it)->NotifyTxStart (duration);
1157  }
1158 }
1159 
1160 void
1162 {
1163  ListenerList::const_iterator it = m_listeners.begin ();
1164  for (; it != m_listeners.end (); it++)
1165  {
1166  (*it)->NotifyTxEnd ();
1167  }
1168 }
1169 
1170 uint32_t
1172 {
1173  return m_modes.GetNModes ();
1174 }
1175 
1176 UanTxMode
1178 {
1179  NS_ASSERT (n < m_modes.GetNModes ());
1180 
1181  return m_modes[n];
1182 }
1183 
1186 {
1187  return m_pktRx;
1188 }
1189 
1190 
1191 } // namespace ns3
virtual void NotifyTransStartTx(Ptr< Packet > packet, double txPowerDb, UanTxMode txMode)
Called when a transmission is beginning on the attached transducer.
virtual bool IsStateBusy(void)
Definition: uan-phy-gen.cc:907
static EventId Schedule(Time const &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
Definition: simulator.h:557
virtual Ptr< UanTransducer > GetTransducer(void)
Get the attached transducer.
Definition: uan-phy-gen.cc:976
double SumTapsNc(Time begin, Time end) const
Compute the non-coherent sum of tap amplitudes between a start and end time.
virtual double GetRxThresholdDb(void)
Get the minimum received signal strength required to receive a packet without errors.
Definition: uan-phy-gen.cc:953
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
std::vector< Tap >::const_iterator Iterator
Convenience iterator typedef.
virtual bool IsStateRx(void)
Definition: uan-phy-gen.cc:912
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
double KpToDb(double kp)
Convert kilopascals to dB.
void SetStream(int64_t stream)
Specifies the stream number for the RngStream.
Iterator GetBegin(void) const
Get the beginning of the tap vector.
virtual void SetEnergyModelCallback(DeviceEnergyModel::ChangeStateCallback cb)
Set the DeviceEnergyModel callback for UanPhy device.
Definition: uan-phy-gen.cc:635
uint32_t m_hops
Number of hops.
Definition: uan-phy-gen.h:251
Transmitting.
Definition: uan-phy.h:187
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:45
void NotifyRxDrop(Ptr< const Packet > packet)
Called when the Phy drops a packet.
Definition: uan-phy.cc:144
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Definition: packet.h:852
Ptr< Packet > m_pktTx
Sent packet.
Definition: uan-phy-gen.h:345
Hold variables of type string.
Definition: string.h:41
virtual void SetReceiveErrorCallback(RxErrCallback cb)
Set the callback to be used when a packet is received with errors.
Definition: uan-phy-gen.cc:892
#define min(a, b)
Definition: 80211b.c:42
double CalculateSinrDb(Ptr< Packet > pkt, Time arrTime, double rxPowerDb, UanTxMode mode, UanPdp pdp)
Calculate the SINR value for a packet.
virtual void EnergyDepletionHandler(void)
Handle the energy depletion event.
Definition: uan-phy-gen.cc:653
virtual void SetTransducer(Ptr< UanTransducer > trans)
Attach a transducer to this Phy.
Definition: uan-phy-gen.cc:999
def start()
Definition: core.py:1855
Packet error rate calculation for common tx modes based on UanPhyPerUmodem.
Definition: uan-phy-gen.h:126
uint32_t GetDataRateBps(void) const
Get the data rate of the transmit mode.
Definition: uan-tx-mode.cc:45
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
Definition: assert.h:67
virtual ~UanPhyGen()
Dummy destructor, see DoDispose.
Definition: uan-phy-gen.cc:513
Ptr< UniformRandomVariable > m_pg
Provides uniform random variables.
Definition: uan-phy-gen.h:358
Channel is IDLE, no packet is being transmitted.
Definition: csma-channel.h:75
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
double m_rxRecvPwrDb
Receiver power.
Definition: uan-phy-gen.h:347
Packet error rate calculation assuming WHOI Micromodem-like PHY (FH-FSK)
Definition: uan-phy-gen.h:74
virtual void SetSleepMode(bool sleep)
Set the Phy SLEEP mode.
#define NS_UNUSED(x)
Mark a local variable as unused.
Definition: unused.h:36
virtual void StartRxPacket(Ptr< Packet > pkt, double rxPowerDb, UanTxMode txMode, UanPdp pdp)
Packet arriving from channel: i.e.
Definition: uan-phy-gen.cc:756
Channel busy.
Definition: uan-phy.h:185
virtual uint32_t GetNModes(void)
Get the number of transmission modes supported by this Phy.
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:165
uint32_t GetBandwidthHz(void) const
Get the transmission signal bandwidth.
Definition: uan-tx-mode.cc:63
virtual double GetTxPowerDb(void)
Get the current transmit power, in dB.
Definition: uan-phy-gen.cc:946
static void Cancel(const EventId &id)
Set the cancel bit on this event: the event&#39;s associated function will not be invoked when it expires...
Definition: simulator.cc:268
virtual double GetCcaThresholdDb(void)
Get the CCA threshold signal strength required to detect channel busy.
Definition: uan-phy-gen.cc:958
virtual void DoDispose(void)
Destructor implementation.
Definition: object.cc:346
EventId m_rxEndEvent
Rx event.
Definition: uan-phy-gen.h:355
double m_rxThreshDb
Receive SINR threshold.
Definition: uan-phy-gen.h:341
uint32_t GetNModes(void) const
Get the number of modes in this list.
Definition: uan-tx-mode.cc:259
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-gen.cc:74
void NotifyTxDrop(Ptr< const Packet > packet)
Called when the transducer attempts to transmit a new packet while already transmitting a prior packe...
Definition: uan-phy.cc:126
void NotifyRxEnd(Ptr< const Packet > packet)
Called when a packet is received without error.
Definition: uan-phy.cc:138
EventId m_txEndEvent
Tx event.
Definition: uan-phy-gen.h:354
static UanTxMode CreateMode(UanTxMode::ModulationType type, uint32_t dataRateBps, uint32_t phyRateSps, uint32_t cfHz, uint32_t bwHz, uint32_t constSize, std::string name)
Definition: uan-tx-mode.cc:132
Ptr< UanPhyPer > m_per
Error model.
Definition: uan-phy-gen.h:337
Unspecified/undefined.
Definition: uan-tx-mode.h:54
virtual void DoDispose()
Destructor implementation.
Definition: uan-phy-gen.cc:561
channel
Definition: third.py:92
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
Time m_pktRxArrTime
Packet arrival time.
Definition: uan-phy-gen.h:348
bool m_cleared
Flag when we&#39;ve been cleared.
Definition: uan-phy-gen.h:352
static TypeId GetTypeId(void)
Register this type.
Definition: uan-phy-gen.cc:397
double NChooseK(uint32_t n, uint32_t k)
Binomial coefficient.
Definition: uan-phy-gen.cc:408
Quadrature amplitude modulation.
Definition: uan-tx-mode.h:52
WHOI Micromodem like FH-FSK model.
Definition: uan-phy-gen.h:227
static TypeId GetTypeId(void)
Register this type.
Definition: uan-phy-gen.cc:580
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:227
virtual bool IsStateTx(void)
Definition: uan-phy-gen.cc:917
#define max(a, b)
Definition: 80211b.c:43
virtual void SetDevice(Ptr< UanNetDevice > device)
Set the device hosting this Phy.
Definition: uan-phy-gen.cc:987
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model...
virtual void EnergyRechargeHandler(void)
Handle the energy recharge event.
Definition: uan-phy-gen.cc:675
ns3::TracedCallback< Ptr< const Packet >, double, UanTxMode > m_rxErrLogger
A packet destined for this Phy was received with error.
Definition: uan-phy-gen.h:365
virtual ~UanPhyPerUmodem()
Destructor.
Definition: uan-phy-gen.cc:392
Hold an unsigned integer type.
Definition: uinteger.h:44
Ptr< UanNetDevice > m_device
Device hosting this Phy.
Definition: uan-phy-gen.h:335
double m_txPwrDb
Transmit power.
Definition: uan-phy-gen.h:340
The power delay profile returned by propagation models.
Receiving.
Definition: uan-phy.h:186
Abstraction of packet modulation information.
Definition: uan-tx-mode.h:41
mac
Definition: third.py:99
double m_thresh
SINR threshold.
Definition: uan-phy-gen.h:60
Time Rem(const Time &lhs, const Time &rhs)
Remainder (modulus) from the quotient of two Times.
Definition: nstime.h:1149
Idle state.
Definition: uan-phy.h:184
Calculate packet error probability, based on received SINR and modulation (mode). ...
Definition: uan-phy.h:110
DeviceEnergyModel::ChangeStateCallback m_energyCallback
Energy model callback.
Definition: uan-phy-gen.h:361
uint32_t GetPhyRateSps(void) const
Get the physical signaling rate.
Definition: uan-tx-mode.cc:51
double m_ccaThreshDb
CCA busy threshold.
Definition: uan-phy-gen.h:342
void NotifyListenersRxGood(void)
Call UanListener::NotifyRxEndOk on all listeners.
void NotifyListenersCcaEnd(void)
Call UanListener::NotifyCcaEnd on all listeners.
Generic PHY model.
Definition: uan-phy-gen.h:266
std::list< UanPacketArrival > ArrivalList
List of arriving packets overlapping in time.
Ptr< Packet > m_pktRx
Received packet.
Definition: uan-phy-gen.h:344
Phase shift keying.
Definition: uan-tx-mode.h:51
double DbToKp(double db) const
Convert dB re 1 uPa to kilopascals.
Definition: uan-phy.h:82
virtual void SetCcaThresholdDb(double thresh)
Set the threshold for detecting channel busy.
Definition: uan-phy-gen.cc:940
void NotifyListenersTxEnd(void)
Call UanListener::NotifyTxEnd on all listeners.
Sleeping.
Definition: uan-phy.h:188
virtual void NotifyIntChange(void)
Called when there has been a change in the amount of interference this node is experiencing from othe...
UanPdp m_pktRxPdp
Power delay profile of packet.
Definition: uan-phy-gen.h:349
Ptr< UanPhyCalcSinr > m_sinr
SINR calculator.
Definition: uan-phy-gen.h:338
int64x64_t Abs(const int64x64_t &value)
Absolute value.
Definition: int64x64.h:205
virtual Ptr< UanChannel > GetChannel(void) const
Get the attached channel.
Definition: uan-phy-gen.cc:964
virtual UanTxMode GetMode(uint32_t n)
Get a specific transmission mode.
virtual void SetRxThresholdDb(double thresh)
Set the minimum SINR threshold to receive a packet without errors.
Definition: uan-phy-gen.cc:935
Frequency shift keying.
Definition: uan-tx-mode.h:53
void NotifyRxBegin(Ptr< const Packet > packet)
Called when the Phy begins to receive a packet.
Definition: uan-phy.cc:132
void TxEndEvent()
Event to process end of packet transmission.
Definition: uan-phy-gen.cc:725
Every class exported by the ns3 library is enclosed in the ns3 namespace.
double DbToKp(double db)
Convert dB to kilopascals.
RxOkCallback m_recOkCb
Callback for packets received without error.
Definition: uan-phy-gen.h:331
UanModesList m_modes
List of modes supported by this PHY.
Definition: uan-phy-gen.h:327
Interface for PHY event listener.
Definition: uan-phy.h:146
static TypeId GetTypeId(void)
Register this type.
Definition: uan-phy-gen.cc:221
double GetValue(double min, double max)
Get the next random value, as a double in the specified range .
void UpdatePowerConsumption(const State state)
Update energy source with new state.
Definition: uan-phy-gen.cc:642
const Tap & GetTap(uint32_t i) const
Get the Tap at the specified delay index.
void NotifyListenersRxStart(void)
Call UanListener::NotifyRxStart on all listeners.
virtual double CalcPer(Ptr< Packet > pkt, double sinrDb, UanTxMode mode)
Calculate the packet error probability based on SINR at the receiver and a tx mode.
Definition: uan-phy-gen.cc:428
State m_state
Phy state.
Definition: uan-phy-gen.h:329
virtual ~UanPhyCalcSinrFhFsk()
Destructor.
Definition: uan-phy-gen.cc:105
void RxEndEvent(Ptr< Packet > pkt, double rxPowerDb, UanTxMode txMode)
Event to process end of packet reception.
Definition: uan-phy-gen.cc:834
static Time Now(void)
Return the current simulation virtual time.
Definition: simulator.cc:195
virtual void SetChannel(Ptr< UanChannel > channel)
Attach to a channel.
Definition: uan-phy-gen.cc:981
Default SINR calculator for UanPhyGen.
Definition: uan-phy-gen.h:166
virtual double CalcPer(Ptr< Packet > pkt, double sinrDb, UanTxMode mode)
Calculate the Packet ERror probability based on SINR at the receiver and a tx mode.
Definition: uan-phy-gen.cc:274
Class used for calculating SINR of packet in UanPhy.
Definition: uan-phy.h:44
Ptr< const AttributeChecker > MakeUanModesListChecker(void)
Definition: uan-tx-mode.cc:303
Ptr< UanMac > m_mac
MAC layer.
Definition: uan-phy-gen.h:336
Base class for UAN Phy models.
Definition: uan-phy.h:178
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
uint32_t GetCenterFreqHz(void) const
Get the transmission center frequency.
Definition: uan-tx-mode.cc:57
virtual ~UanPhyPerGenDefault()
Destructor.
Definition: uan-phy-gen.cc:216
double KpToDb(double kp) const
Convert kilopascals to dB re 1 uPa.
Definition: uan-phy.h:92
UanPhyCalcSinrFhFsk()
Constructor.
Definition: uan-phy-gen.cc:101
uint32_t GetUid(void) const
Get a unique id for the mode.
Definition: uan-tx-mode.cc:81
Time GetDelay(void) const
Get the delay time, usually from first arrival of signal.
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
Definition: log.h:265
ns3::TracedCallback< Ptr< const Packet >, double, UanTxMode > m_txLogger
A packet was sent from this Phy.
Definition: uan-phy-gen.h:367
virtual bool IsStateIdle(void)
Definition: uan-phy-gen.cc:902
RxErrCallback m_recErrCb
Callback for packets received with errors.
Definition: uan-phy-gen.h:332
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:273
static TypeId GetTypeId(void)
Register this type.
Definition: uan-phy-gen.cc:63
Ptr< UanChannel > m_channel
Attached channel.
Definition: uan-phy-gen.h:333
void NotifyListenersCcaStart(void)
Call UanListener::NotifyCcaStart on all listeners.
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1289
void AppendMode(UanTxMode mode)
Add mode to this list.
Definition: uan-tx-mode.cc:232
bool IsRunning(void) const
This method is syntactic sugar for !IsExpired().
Definition: event-id.cc:71
double GetInterferenceDb(Ptr< Packet > pkt)
Calculate interference power from overlapping packet arrivals, in dB.
virtual Ptr< UanNetDevice > GetDevice(void) const
Get the device hosting this Phy.
Definition: uan-phy-gen.cc:970
static TypeId GetTypeId(void)
Register this type.
Definition: uan-phy-gen.cc:263
void NotifyListenersRxBad(void)
Call UanListener::NotifyRxEndError on all listeners.
Ptr< UanTransducer > m_transducer
Associated transducer.
Definition: uan-phy-gen.h:334
void Nullify(void)
Discard the implementation, set it to null.
Definition: callback.h:1391
UanPhyPerUmodem()
Constructor.
Definition: uan-phy-gen.cc:388
UanPhyPerGenDefault()
Constructor.
Definition: uan-phy-gen.cc:211
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
static TypeId GetTypeId(void)
Register this type.
Definition: uan-phy-gen.cc:111
UanPhyGen()
Constructor.
Definition: uan-phy-gen.cc:494
virtual ~UanPhyPerCommonModes()
Destructor.
Definition: uan-phy-gen.cc:257
virtual Ptr< Packet > GetPacketRx(void) const
Get the packet currently being received.
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-gen.cc:126
virtual ~UanPhyCalcSinrDefault()
Destructor.
Definition: uan-phy-gen.cc:57
Iterator GetEnd(void) const
Get the end of the tap list (one beyond the last entry).
virtual void SendPacket(Ptr< Packet > pkt, uint32_t modeNum)
Send a packet using a specific transmission mode.
Definition: uan-phy-gen.cc:685
Default Packet Error Rate calculator for UanPhyGen.
Definition: uan-phy-gen.h:44
double SumTapsFromMaxNc(Time delay, Time duration) const
Compute the non-coherent sum of tap amplitudes starting after a delay from the maximum amplitude for ...
UanTxMode m_pktRxMode
Packet transmission mode at receiver.
Definition: uan-phy-gen.h:350
ListenerList m_listeners
List of listeners.
Definition: uan-phy-gen.h:330
virtual bool IsStateCcaBusy(void)
Definition: uan-phy-gen.cc:923
virtual void RegisterListener(UanPhyListener *listener)
Register a UanPhyListener to be notified of common UanPhy events.
Definition: uan-phy-gen.cc:749
bool IsNull(void) const
Check for null implementation.
Definition: callback.h:1386
double m_minRxSinrDb
Minimum receive SINR during packet reception.
Definition: uan-phy-gen.h:346
This class can be used to hold variables of floating point type such as &#39;double&#39; or &#39;float&#39;...
Definition: double.h:41
virtual bool IsStateSleep(void)
Definition: uan-phy-gen.cc:897
virtual void SetMac(Ptr< UanMac > mac)
Set the MAC forwarding messages to this Phy.
Definition: uan-phy-gen.cc:993
virtual void SetReceiveOkCallback(RxOkCallback cb)
Set the callback to be used when a packet is received without error.
Definition: uan-phy-gen.cc:886
UanPhyPerCommonModes()
Constructor.
Definition: uan-phy-gen.cc:251
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Definition: uinteger.h:45
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
virtual double CalcPer(Ptr< Packet > pkt, double sinrDb, UanTxMode mode)
Calculate the packet error probability based on SINR at the receiver and a tx mode.
Definition: uan-phy-gen.cc:238
uint32_t GetConstellationSize(void) const
Get the number of constellation points in the modulation scheme.
Definition: uan-tx-mode.cc:69
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:923
virtual void Clear(void)
Clear all pointer references.
Definition: uan-phy-gen.cc:519
UanPhyCalcSinrDefault()
Constructor.
Definition: uan-phy-gen.cc:53
ns3::TracedCallback< Ptr< const Packet >, double, UanTxMode > m_rxOkLogger
A packet destined for this Phy was received without error.
Definition: uan-phy-gen.h:363
void NotifyListenersTxStart(Time duration)
Call UanListener::NotifyTxStart on all listeners.
AttributeValue implementation for UanModesList.
Definition: uan-tx-mode.h:314
virtual void SetTxPowerDb(double txpwr)
Set the transmit power.
Definition: uan-phy-gen.cc:930
ModulationType GetModType(void) const
Get the modulation type of the mode.
Definition: uan-tx-mode.cc:39