add hierarchical support to MobilityHelper
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Fri, 08 Feb 2008 17:52:20 +0100
changeset 2401 281ea8b13525
parent 2400 99a92e7f17b2
child 2402 0950067d70a2
add hierarchical support to MobilityHelper
src/mobility/hierarchical-mobility-model.cc
src/mobility/hierarchical-mobility-model.h
src/mobility/mobility-helper.cc
src/mobility/mobility-helper.h
--- a/src/mobility/hierarchical-mobility-model.cc	Fri Feb 08 17:27:38 2008 +0100
+++ b/src/mobility/hierarchical-mobility-model.cc	Fri Feb 08 17:52:20 2008 +0100
@@ -28,32 +28,48 @@
 HierarchicalMobilityModel::GetTypeId (void)
 {
   static TypeId tid = TypeId ("HierarchicalMobilityModel")
-    .SetParent<MobilityModel> ();
+    .SetParent<MobilityModel> ()
+    .AddConstructor<HierarchicalMobilityModel> ()
+    .AddParameter ("child", "The child mobility model.",
+                   MakePtrParamSpec (&HierarchicalMobilityModel::SetChild))
+    .AddParameter ("parent", "The parent mobility model.",
+                   MakePtrParamSpec (&HierarchicalMobilityModel::SetParent))
+    ;
   return tid;
 }
 
-HierarchicalMobilityModel::HierarchicalMobilityModel (Ptr<MobilityModel> child, Ptr<MobilityModel> parent)
-  : m_child (child),
-    m_parent (parent)
+HierarchicalMobilityModel::HierarchicalMobilityModel ()
+{}
+
+void 
+HierarchicalMobilityModel::SetChild (Ptr<MobilityModel> model)
 {
-  Ptr<MobilityModelNotifier> childNotifier = 
+  m_child = model;
+  Ptr<MobilityModelNotifier> notifier = 
     m_child->QueryInterface<MobilityModelNotifier> ();
-  Ptr<MobilityModelNotifier> parentNotifier = 
-    m_parent->QueryInterface<MobilityModelNotifier> ();
-  if (childNotifier == 0)
+  if (notifier == 0)
     {
-      childNotifier = CreateObject<MobilityModelNotifier> ();
-      child->AddInterface (childNotifier);
+      notifier = CreateObject<MobilityModelNotifier> ();
+      m_child->AddInterface (notifier);
     }
-  if (parentNotifier == 0)
+  notifier->TraceConnect ("/course-changed", MakeCallback (&HierarchicalMobilityModel::ChildChanged, this));
+}
+
+void 
+HierarchicalMobilityModel::SetParent (Ptr<MobilityModel> model)
+{
+  m_parent = model;
+  Ptr<MobilityModelNotifier> notifier = 
+    m_parent->QueryInterface<MobilityModelNotifier> ();
+  if (notifier == 0)
     {
-      parentNotifier = CreateObject<MobilityModelNotifier> ();
-      parent->AddInterface (parentNotifier);
+      notifier = CreateObject<MobilityModelNotifier> ();
+      m_parent->AddInterface (notifier);
     }
-  childNotifier->TraceConnect ("/course-changed", MakeCallback (&HierarchicalMobilityModel::ChildChanged, this));
-  parentNotifier->TraceConnect ("/course-changed", MakeCallback (&HierarchicalMobilityModel::ParentChanged, this));
+  notifier->TraceConnect ("/course-changed", MakeCallback (&HierarchicalMobilityModel::ParentChanged, this));
 }
 
+
 Ptr<MobilityModel> 
 HierarchicalMobilityModel::GetChild (void) const
 {
--- a/src/mobility/hierarchical-mobility-model.h	Fri Feb 08 17:27:38 2008 +0100
+++ b/src/mobility/hierarchical-mobility-model.h	Fri Feb 08 17:52:20 2008 +0100
@@ -35,11 +35,7 @@
 public:
   static TypeId GetTypeId (void);
 
-  /**
-   * \param child the "relative" mobility model
-   * \param parent the "reference" mobility model
-   */
-  HierarchicalMobilityModel (Ptr<MobilityModel> child, Ptr<MobilityModel> parent);
+  HierarchicalMobilityModel ();
 
   /**
    * \returns the child mobility model.
@@ -62,6 +58,8 @@
   virtual void DoSetPosition (const Vector &position);
   virtual Vector DoGetVelocity (void) const;
 
+  void SetChild (Ptr<MobilityModel> model);
+  void SetParent (Ptr<MobilityModel> model);
   void ParentChanged (const TraceContext &context, Ptr<const MobilityModel> model);
   void ChildChanged (const TraceContext &context, Ptr<const MobilityModel> model);
 
--- a/src/mobility/mobility-helper.cc	Fri Feb 08 17:27:38 2008 +0100
+++ b/src/mobility/mobility-helper.cc	Fri Feb 08 17:52:20 2008 +0100
@@ -2,6 +2,7 @@
 #include "mobility-model.h"
 #include "mobility-model-notifier.h"
 #include "position-allocator.h"
+#include "hierarchical-mobility-model.h"
 
 namespace ns3 {
 
@@ -73,6 +74,19 @@
   m_mobility.Set (n9, v9);
 }
 
+void 
+MobilityHelper::PushReferenceMobilityModel (Ptr<Object> reference)
+{
+  Ptr<MobilityModel> mobility = reference->QueryInterface<MobilityModel> ();
+  m_mobilityStack.push_back (mobility);
+}
+void 
+MobilityHelper::PopReferenceMobilityModel (void)
+{
+  m_mobilityStack.pop_back ();
+}
+
+
 std::string 
 MobilityHelper::GetMobilityModelType (void) const
 {
@@ -94,7 +108,19 @@
 	      NS_FATAL_ERROR ("The requested mobility model is not a mobility model: \""<< 
 			      m_mobility.GetTypeId ().GetName ()<<"\"");
 	    }
-	  object->AddInterface (model);
+	  if (m_mobilityStack.empty ())
+	    {
+	      object->AddInterface (model);
+	    }
+	  else
+	    {
+	      // we need to setup a hierarchical mobility model
+	      Ptr<MobilityModel> parent = m_mobilityStack.back ();
+	      Ptr<MobilityModel> hierarchical = 
+		CreateObjectWith<HierarchicalMobilityModel> ("child", model,
+							     "parent", parent);
+	      object->AddInterface (hierarchical);
+	    }
 	}
       Vector position = m_position->GetNext ();
       model->SetPosition (position);
--- a/src/mobility/mobility-helper.h	Fri Feb 08 17:27:38 2008 +0100
+++ b/src/mobility/mobility-helper.h	Fri Feb 08 17:52:20 2008 +0100
@@ -9,6 +9,7 @@
 namespace ns3 {
 
 class PositionAllocator;
+class MobilityModel;
 
 class MobilityHelper
 {
@@ -42,6 +43,9 @@
 			 std::string n8 = "", PValue v8 = PValue (),
 			 std::string n9 = "", PValue v9 = PValue ());
 
+  void PushReferenceMobilityModel (Ptr<Object> reference);
+  void PopReferenceMobilityModel (void);
+
   std::string GetMobilityModelType (void) const;
 
   template <typename T>
@@ -49,6 +53,7 @@
 private:
   void Layout (const std::vector<Ptr<Object> > &objects);
 
+  std::vector<Ptr<MobilityModel> > m_mobilityStack;
   bool m_notifierEnabled;
   ObjectFactory m_mobility;
   Ptr<PositionAllocator> m_position;