diff --git a/model/leo-propagation-loss-model.cc b/model/leo-propagation-loss-model.cc index 178c496..78a99cc 100644 --- a/model/leo-propagation-loss-model.cc +++ b/model/leo-propagation-loss-model.cc @@ -1,7 +1,10 @@ /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ +#include + #include "ns3/log.h" #include "ns3/mobility-model.h" +#include "ns3/double.h" #include "leo-propagation-loss-model.h" @@ -18,6 +21,16 @@ LeoPropagationLossModel::GetTypeId (void) .SetParent () .SetGroupName ("Leo") .AddConstructor () + .AddAttribute ("MaxDistance", + "Cut-off distance for signal propagation", + DoubleValue (1000000.0), + MakeDoubleAccessor (&LeoPropagationLossModel::m_cutoffDistance), + MakeDoubleChecker ()) + .AddAttribute ("MaxAngle", + "Cut-off angle for signal propagation", + DoubleValue (20.0), + MakeDoubleAccessor (&LeoPropagationLossModel::m_cutoffAngle), + MakeDoubleChecker ()) ; return tid; } @@ -31,17 +44,24 @@ LeoPropagationLossModel::~LeoPropagationLossModel () } double -LeoPropagationLossModel::DoCalcRxPower (double txPowerDbm, - Ptr a, - Ptr b) const +LeoPropagationLossModel::GetAngle (Ptr a, Ptr b) { - //Vector aPos = a->GetPosition (); - //Vector bPos = b->GetPosition (); + Vector3D pa = a->GetPosition (); + Vector3D pb = b->GetPosition (); - // TODO perform line-earth intersection (ray tracing) - // TODO check angle between satellite and ground-station - // primitivec cut-of at 1000 km - if (a->GetDistanceFrom (b) > 1000000.0) + double prod = abs ((pa.x * pb.x) + (pa.y * pb.y) + (pa.z * pb.z)); + double norm = pb.GetLength () * pa.GetLength (); + + return acos (prod / norm); +} + +double +LeoPropagationLossModel::DoCalcRxPower (double txPowerDbm, + Ptr a, + Ptr b) const +{ + // TODO create attributes for max distance and angle + if (a->GetDistanceFrom (b) > m_cutoffDistance && GetAngle (a, b) > m_cutoffAngle) { return 0; } diff --git a/model/leo-propagation-loss-model.h b/model/leo-propagation-loss-model.h index 88acfce..84696e4 100644 --- a/model/leo-propagation-loss-model.h +++ b/model/leo-propagation-loss-model.h @@ -14,7 +14,21 @@ public: static TypeId GetTypeId (void); LeoPropagationLossModel (); virtual ~LeoPropagationLossModel (); + + static double GetAngle (Ptr a, Ptr b); + private: + + /** + * Cutoff distance for signal + */ + double m_cutoffDistance; + + /** + * Cutoff angle for signal + */ + double m_cutoffAngle; + /** * Returns the Rx Power taking into account only the particular * PropagationLossModel. diff --git a/test/isl-test-suite.cc b/test/isl-test-suite.cc index e916b02..9e8c020 100644 --- a/test/isl-test-suite.cc +++ b/test/isl-test-suite.cc @@ -41,10 +41,10 @@ IslIcmpTestCase::DoRun (void) std::vector satWps = { // TODO use different waypoints - "contrib/leo/data/test/waypoints.txt", - "contrib/leo/data/test/waypoints.txt", - "contrib/leo/data/test/waypoints.txt", - "contrib/leo/data/test/waypoints.txt", + "contrib/leo/data/starlink/45391.waypoints", + "contrib/leo/data/starlink/45392.waypoints", + "contrib/leo/data/starlink/45393.waypoints", + "contrib/leo/data/starlink/45394.waypoints", }; LeoSatNodeHelper satHelper; @@ -76,7 +76,7 @@ IslIcmpTestCase::DoRun (void) ApplicationContainer clientApps; for (uint32_t i = 0; i < satellites.GetN (); i ++) { - UdpEchoClientHelper echoClient (islIp.GetAddress ((i+1) % satellites.GetN (), 0), 9); + UdpEchoClientHelper echoClient (islIp.GetAddress ((i+3) % satellites.GetN (), 0), 9); echoClient.SetAttribute ("MaxPackets", UintegerValue (10)); echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0))); echoClient.SetAttribute ("PacketSize", UintegerValue (1024)); diff --git a/test/leo-mobility-test-suite.cc b/test/leo-mobility-test-suite.cc index d315b28..5c14576 100644 --- a/test/leo-mobility-test-suite.cc +++ b/test/leo-mobility-test-suite.cc @@ -2,9 +2,12 @@ #include "ns3/leo-module.h" #include "ns3/test.h" +#include "ns3/log.h" using namespace ns3; +NS_LOG_COMPONENT_DEFINE ("LeoMobilityTestSuite"); + class LeoMobilityWaypointTestCase : public TestCase { public: @@ -25,7 +28,7 @@ LeoMobilityWaypointTestCase::DoRun (void) { Ptr container = CreateObject (); container->SetAttribute("File", StringValue ("contrib/leo/data/waypoints.txt")); - container->SetAttribute("LastTime", TimeValue (Time (1))); + container->SetAttribute("LastTime", TimeValue (Time (0))); Ptr mobility = CreateObject (); Waypoint wp; @@ -33,8 +36,9 @@ LeoMobilityWaypointTestCase::DoRun (void) { mobility->AddWaypoint (wp); } + NS_LOG_INFO ("Model has " << mobility->WaypointsLeft () << " waypoints left"); - NS_TEST_ASSERT_MSG_EQ ((mobility->WaypointsLeft () > 0), true, "Reading waypoints from empty"); + NS_TEST_ASSERT_MSG_EQ ((mobility->WaypointsLeft () > 2), true, "Reading waypoints from empty"); } class LeoMobilityTestSuite : public TestSuite diff --git a/test/leo-propagation-test-suite.cc b/test/leo-propagation-test-suite.cc new file mode 100644 index 0000000..19acfe6 --- /dev/null +++ b/test/leo-propagation-test-suite.cc @@ -0,0 +1,126 @@ +/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ + +#include "ns3/core-module.h" +#include "ns3/test.h" + +#include "ns3/leo-module.h" + +using namespace ns3; + +class LeoPropagationAngleTestCase1 : public TestCase +{ +public: + LeoPropagationAngleTestCase1 (); + virtual ~LeoPropagationAngleTestCase1 (); + +private: + virtual void DoRun (void); +}; + +LeoPropagationAngleTestCase1::LeoPropagationAngleTestCase1 () + : TestCase ("Test angle computation 90 deg") +{ +} + +LeoPropagationAngleTestCase1::~LeoPropagationAngleTestCase1 () +{ +} + +void +LeoPropagationAngleTestCase1::DoRun (void) +{ + Ptr a = CreateObject (); + a->SetPosition (Vector3D (10, 0, 0)); + Ptr b = CreateObject (); + b->SetPosition (Vector3D (0, 10, 0)); + + double angle = LeoPropagationLossModel::GetAngle (a, b); + + NS_TEST_ASSERT_MSG_EQ ((1.570 < angle && angle < 1.571), true, "Angle should be 90 deg."); +} + +class LeoPropagationAngleTestCase2 : public TestCase +{ +public: + LeoPropagationAngleTestCase2 (); + virtual ~LeoPropagationAngleTestCase2 (); + +private: + virtual void DoRun (void); +}; + +LeoPropagationAngleTestCase2::LeoPropagationAngleTestCase2 () + : TestCase ("Test angle computation 0 deg") +{ +} + +LeoPropagationAngleTestCase2::~LeoPropagationAngleTestCase2 () +{ +} + +void +LeoPropagationAngleTestCase2::DoRun (void) +{ + Ptr a = CreateObject (); + a->SetPosition (Vector3D (10, 0, 0)); + Ptr b = CreateObject (); + b->SetPosition (Vector3D (10, 0, 0)); + + double angle = LeoPropagationLossModel::GetAngle (a, b); + + NS_TEST_ASSERT_MSG_EQ ((-0.1 < angle && angle < 0.1), true, "Angle should be 0 deg."); +} + +class LeoPropagationAngleTestCase3 : public TestCase +{ +public: + LeoPropagationAngleTestCase3 (); + virtual ~LeoPropagationAngleTestCase3 (); + +private: + virtual void DoRun (void); +}; + +LeoPropagationAngleTestCase3::LeoPropagationAngleTestCase3 () + : TestCase ("Test angle computation 0 vector") +{ +} + +LeoPropagationAngleTestCase3::~LeoPropagationAngleTestCase3 () +{ +} + +void +LeoPropagationAngleTestCase3::DoRun (void) +{ + Ptr a = CreateObject (); + a->SetPosition (Vector3D (0, 0, 0)); + Ptr b = CreateObject (); + b->SetPosition (Vector3D (0, 0, 0)); + + double angle = LeoPropagationLossModel::GetAngle (a, b); + + NS_TEST_ASSERT_MSG_EQ (isnan(angle), true, "Angle should be NaN"); +} + +// The TestSuite class names the TestSuite, identifies what type of TestSuite, +// and enables the TestCases to be run. Typically, only the constructor for +// this class must be defined +// +class LeoPropagationTestSuite : public TestSuite +{ +public: + LeoPropagationTestSuite (); +}; + +LeoPropagationTestSuite::LeoPropagationTestSuite () + : TestSuite ("leo-propagation", UNIT) +{ + // TestDuration for TestCase can be QUICK, EXTENSIVE or TAKES_FOREVER + AddTestCase (new LeoPropagationAngleTestCase1, TestCase::QUICK); + AddTestCase (new LeoPropagationAngleTestCase2, TestCase::QUICK); + AddTestCase (new LeoPropagationAngleTestCase3, TestCase::QUICK); +} + +// Do not forget to allocate an instance of this TestSuite +static LeoPropagationTestSuite leoTestSuite; diff --git a/wscript b/wscript index 4030384..4b2b619 100644 --- a/wscript +++ b/wscript @@ -29,6 +29,7 @@ def build(bld): module_test = bld.create_ns3_module_test_library('leo') module_test.source = [ 'test/leo-test-suite.cc', + 'test/leo-propagation-test-suite.cc', 'test/isl-test-suite.cc', 'test/isl-mock-channel-test-suite.cc', 'test/leo-mock-channel-test-suite.cc',