src/mobility/mobility-helper.cc
changeset 2401 281ea8b13525
parent 2399 fd9d94d518d2
child 2402 0950067d70a2
--- 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);