From 268e4d5ec9800de28e3e2cc4f87283bd2ca22c28 Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Thu, 11 Oct 2007 16:16:31 +0200 Subject: [PATCH] support DefaultValue --- src/devices/wifi/propagation-loss-model.cc | 111 ++++++++++++++++++++- src/devices/wifi/propagation-loss-model.h | 19 +++- 2 files changed, 127 insertions(+), 3 deletions(-) diff --git a/src/devices/wifi/propagation-loss-model.cc b/src/devices/wifi/propagation-loss-model.cc index ea7ba30fe..d899c8cb0 100644 --- a/src/devices/wifi/propagation-loss-model.cc +++ b/src/devices/wifi/propagation-loss-model.cc @@ -1,16 +1,98 @@ #include "propagation-loss-model.h" +#include "ns3/default-value.h" +#include "ns3/random-variable-default-value.h" #include namespace ns3 { +enum ModelType { + FRIIS, + RANDOM, + PATH_LOSS +}; + +static EnumDefaultValue g_modelType +("PropagationLossModelType", + "The type of propagation loss model.", + PATH_LOSS, "PathLoss", + FRIIS, "Friis", + RANDOM, "Random", + 0, (void *)0); + +static NumericDefaultValue g_friisLambda +("FriisPropagationLambda", + "The wavelength to use by default for every FriisPropagationLossModel (default is 5.15 GHz at 300 000 km/s).", + 300000000.0 / 5.150e9); + +static NumericDefaultValue g_friisSystemLoss +("FriisPropagationSystemLoss", + "The system loss to use by default for every FriisPropagationLossModel", + 1.0); + +static RandomVariableDefaultValue g_random +("RandomPropagation", + "The distribution (in dbm) to choose the propagation loss.", + "Constant:1.0"); + +static NumericDefaultValue g_pathLossExponent +("PathLossPropagationExponent", + "The exponent of the Path Loss propagation model", + 3.0); + +static EnumDefaultValue g_pathLossReference +("PathLossPropagationReferenceType", + "The type of reference propagation model.", + FRIIS, "Friis", + RANDOM, "Random", + 0, (void *)0); + const double FriisPropagationLossModel::PI = 3.1415; PropagationLossModel::~PropagationLossModel () {} +Ptr +PropagationLossModel::CreateDefault (void) +{ + switch (g_modelType.GetValue ()) { + case FRIIS: + return Create (); + break; + case RANDOM: + return Create (); + break; + case PATH_LOSS: + return Create (); + break; + default: + NS_ASSERT (false); + return 0; + break; + } +} + +RandomPropagationLossModel::RandomPropagationLossModel () + : m_variable (g_random.GetCopy ()) +{} + +RandomPropagationLossModel::RandomPropagationLossModel (const RandomVariable &variable) + : m_variable (variable.Copy ()) +{} +RandomPropagationLossModel::~RandomPropagationLossModel () +{ + delete m_variable; +} + +double +RandomPropagationLossModel::GetRxPower (double txPowerDbm, + double distance) const +{ + return txPowerDbm - m_variable->GetValue (); +} + FriisPropagationLossModel::FriisPropagationLossModel () - : m_lambda (), - m_systemLoss (1.0) + : m_lambda (g_friisLambda.GetValue ()), + m_systemLoss (g_friisSystemLoss.GetValue ()) {} void FriisPropagationLossModel::SetSystemLoss (double systemLoss) @@ -83,6 +165,8 @@ FriisPropagationLossModel::GetRxPower (double txPowerDbm, PathLossPropagationLossModel::PathLossPropagationLossModel () + : m_exponent (g_pathLossExponent.GetValue ()), + m_reference (CreateDefaultReference ()) {} void @@ -90,12 +174,35 @@ PathLossPropagationLossModel::SetPathLossExponent (double n) { m_exponent = n; } +void +PathLossPropagationLossModel::SetReferenceModel (Ptr model) +{ + m_reference = model; +} double PathLossPropagationLossModel::GetPathLossExponent (void) const { return m_exponent; } +Ptr +PathLossPropagationLossModel::CreateDefaultReference (void) +{ + switch (g_pathLossReference.GetValue ()) { + case RANDOM: + return Create (); + break; + case FRIIS: + return Create (); + break; + case PATH_LOSS: + default: + NS_ASSERT (false); + return 0; + break; + } +} + double PathLossPropagationLossModel::DbToW (double db) const { diff --git a/src/devices/wifi/propagation-loss-model.h b/src/devices/wifi/propagation-loss-model.h index 65e1a568f..16d15fc09 100644 --- a/src/devices/wifi/propagation-loss-model.h +++ b/src/devices/wifi/propagation-loss-model.h @@ -5,12 +5,29 @@ namespace ns3 { +class RandomVariable; + class PropagationLossModel : public Object { public: virtual ~PropagationLossModel (); virtual double GetRxPower (double txPowerDbm, double distance) const = 0; + + static Ptr CreateDefault (void); +}; + +class RandomPropagationLossModel : public PropagationLossModel +{ +public: + RandomPropagationLossModel (); + RandomPropagationLossModel (const RandomVariable &variable); + virtual ~RandomPropagationLossModel (); + + virtual double GetRxPower (double txPowerDbm, + double distance) const; +private: + RandomVariable *m_variable; }; class FriisPropagationLossModel : public PropagationLossModel @@ -48,8 +65,8 @@ public: double distance) const; private: double DbToW (double db) const; + static Ptr CreateDefaultReference (void); - double m_lambda; double m_exponent; Ptr m_reference; };