From 981d8ba90bbdc5afb92db498fca82c637284fb3b Mon Sep 17 00:00:00 2001 From: Tom Henderson Date: Tue, 20 Jul 2010 14:22:04 -0700 Subject: [PATCH] Range-based propagation loss model added --- .../propagation-loss-model-test-suite.cc | 43 +++++++++++++++++++ src/common/propagation-loss-model.cc | 39 +++++++++++++++++ src/common/propagation-loss-model.h | 23 ++++++++++ 3 files changed, 105 insertions(+) diff --git a/src/common/propagation-loss-model-test-suite.cc b/src/common/propagation-loss-model-test-suite.cc index fc8e332c5..89f76e0da 100644 --- a/src/common/propagation-loss-model-test-suite.cc +++ b/src/common/propagation-loss-model-test-suite.cc @@ -420,6 +420,48 @@ MatrixPropagationLossModelTestCase::DoRun (void) return GetErrorStatus (); } +class RangePropagationLossModelTestCase : public TestCase +{ +public: + RangePropagationLossModelTestCase (); + virtual ~RangePropagationLossModelTestCase (); + +private: + virtual bool DoRun (void); +}; + +RangePropagationLossModelTestCase::RangePropagationLossModelTestCase () + : TestCase ("Test RangePropagationLossModel") +{ +} + +RangePropagationLossModelTestCase::~RangePropagationLossModelTestCase () +{ +} + +bool +RangePropagationLossModelTestCase::DoRun (void) +{ + Config::SetDefault ("ns3::RangePropagationLossModel::MaxRange", DoubleValue (127.2)); + Ptr a = CreateObject (); + a->SetPosition (Vector (0,0,0)); + Ptr b = CreateObject (); + b->SetPosition (Vector (127.1,0,0)); // within range + + Ptr lossModel = CreateObject (); + + double txPwrdBm = -80.0; + double tolerance = 1e-6; + double resultdBm = lossModel->CalcRxPower (txPwrdBm, a, b); + NS_TEST_EXPECT_MSG_EQ_TOL (resultdBm, txPwrdBm, tolerance, "Got unexpected rcv power"); + b->SetPosition (Vector (127.25,0,0)); // beyond range + resultdBm = lossModel->CalcRxPower (txPwrdBm, a, b); + NS_TEST_EXPECT_MSG_EQ_TOL (resultdBm, -1000.0, tolerance, "Got unexpected rcv power"); + Simulator::Destroy (); + + return GetErrorStatus (); +} + class PropagationLossModelsTestSuite : public TestSuite { public: @@ -433,6 +475,7 @@ PropagationLossModelsTestSuite::PropagationLossModelsTestSuite () AddTestCase (new TwoRayGroundPropagationLossModelTestCase); AddTestCase (new LogDistancePropagationLossModelTestCase); AddTestCase (new MatrixPropagationLossModelTestCase); + AddTestCase (new RangePropagationLossModelTestCase); } PropagationLossModelsTestSuite WifiPropagationLossModelsTestSuite; diff --git a/src/common/propagation-loss-model.cc b/src/common/propagation-loss-model.cc index 40bf63e51..5f18f71ba 100644 --- a/src/common/propagation-loss-model.cc +++ b/src/common/propagation-loss-model.cc @@ -790,4 +790,43 @@ MatrixPropagationLossModel::DoCalcRxPower (double txPowerDbm, // ------------------------------------------------------------------------- // +NS_OBJECT_ENSURE_REGISTERED (RangePropagationLossModel); + +TypeId +RangePropagationLossModel::GetTypeId (void) +{ + static TypeId tid = TypeId ("ns3::RangePropagationLossModel") + .SetParent () + .AddConstructor () + .AddAttribute ("MaxRange", + "Maximum Transmission Range (meters)", + DoubleValue (250), + MakeDoubleAccessor (&RangePropagationLossModel::m_range), + MakeDoubleChecker ()) + ; + return tid; +} + +RangePropagationLossModel::RangePropagationLossModel () +{ +} + +double +RangePropagationLossModel::DoCalcRxPower (double txPowerDbm, + Ptr a, + Ptr b) const +{ + double distance = a->GetDistanceFrom (b); + if (distance <= m_range) + { + return txPowerDbm; + } + else + { + return -1000; + } +} + +// ------------------------------------------------------------------------- // + } // namespace ns3 diff --git a/src/common/propagation-loss-model.h b/src/common/propagation-loss-model.h index 155c0ed16..7df2e5f84 100644 --- a/src/common/propagation-loss-model.h +++ b/src/common/propagation-loss-model.h @@ -503,6 +503,29 @@ private: std::map m_loss; }; +/** + * \brief The propagation loss depends only on the distance (range) between transmitter and receiver. + * + * The single MaxRange attribute (units of meters) determines path loss. + * Receivers at or within MaxRange meters receive the transmission at the + * transmit power level. Receivers beyond MaxRange receive at power + * -1000 dBm (effectively zero). +*/ +class RangePropagationLossModel : public PropagationLossModel +{ +public: + static TypeId GetTypeId (void); + RangePropagationLossModel (); +private: + RangePropagationLossModel (const RangePropagationLossModel& o); + RangePropagationLossModel& operator= (const RangePropagationLossModel& o); + virtual double DoCalcRxPower (double txPowerDbm, + Ptr a, + Ptr b) const; +private: + double m_range; +}; + } // namespace ns3 #endif /* PROPAGATION_LOSS_MODEL_H */