diff --git a/src/mobility/hierarchical-mobility-model.cc b/src/mobility/hierarchical-mobility-model.cc index 46f0150b3..dc14d2efe 100644 --- a/src/mobility/hierarchical-mobility-model.cc +++ b/src/mobility/hierarchical-mobility-model.cc @@ -28,32 +28,48 @@ TypeId HierarchicalMobilityModel::GetTypeId (void) { static TypeId tid = TypeId ("HierarchicalMobilityModel") - .SetParent (); + .SetParent () + .AddConstructor () + .AddParameter ("child", "The child mobility model.", + MakePtrParamSpec (&HierarchicalMobilityModel::SetChild)) + .AddParameter ("parent", "The parent mobility model.", + MakePtrParamSpec (&HierarchicalMobilityModel::SetParent)) + ; return tid; } -HierarchicalMobilityModel::HierarchicalMobilityModel (Ptr child, Ptr parent) - : m_child (child), - m_parent (parent) +HierarchicalMobilityModel::HierarchicalMobilityModel () +{} + +void +HierarchicalMobilityModel::SetChild (Ptr model) { - Ptr childNotifier = + m_child = model; + Ptr notifier = m_child->QueryInterface (); - Ptr parentNotifier = - m_parent->QueryInterface (); - if (childNotifier == 0) + if (notifier == 0) { - childNotifier = CreateObject (); - child->AddInterface (childNotifier); + notifier = CreateObject (); + m_child->AddInterface (notifier); } - if (parentNotifier == 0) - { - parentNotifier = CreateObject (); - parent->AddInterface (parentNotifier); - } - childNotifier->TraceConnect ("/course-changed", MakeCallback (&HierarchicalMobilityModel::ChildChanged, this)); - parentNotifier->TraceConnect ("/course-changed", MakeCallback (&HierarchicalMobilityModel::ParentChanged, this)); + notifier->TraceConnect ("/course-changed", MakeCallback (&HierarchicalMobilityModel::ChildChanged, this)); } +void +HierarchicalMobilityModel::SetParent (Ptr model) +{ + m_parent = model; + Ptr notifier = + m_parent->QueryInterface (); + if (notifier == 0) + { + notifier = CreateObject (); + m_parent->AddInterface (notifier); + } + notifier->TraceConnect ("/course-changed", MakeCallback (&HierarchicalMobilityModel::ParentChanged, this)); +} + + Ptr HierarchicalMobilityModel::GetChild (void) const { diff --git a/src/mobility/hierarchical-mobility-model.h b/src/mobility/hierarchical-mobility-model.h index e45380bbd..91191222e 100644 --- a/src/mobility/hierarchical-mobility-model.h +++ b/src/mobility/hierarchical-mobility-model.h @@ -35,11 +35,7 @@ class HierarchicalMobilityModel : public MobilityModel public: static TypeId GetTypeId (void); - /** - * \param child the "relative" mobility model - * \param parent the "reference" mobility model - */ - HierarchicalMobilityModel (Ptr child, Ptr parent); + HierarchicalMobilityModel (); /** * \returns the child mobility model. @@ -62,6 +58,8 @@ private: virtual void DoSetPosition (const Vector &position); virtual Vector DoGetVelocity (void) const; + void SetChild (Ptr model); + void SetParent (Ptr model); void ParentChanged (const TraceContext &context, Ptr model); void ChildChanged (const TraceContext &context, Ptr model); diff --git a/src/mobility/mobility-helper.cc b/src/mobility/mobility-helper.cc index d8ad0df1d..341465738 100644 --- a/src/mobility/mobility-helper.cc +++ b/src/mobility/mobility-helper.cc @@ -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 @@ MobilityHelper::SetMobilityModel (std::string type, m_mobility.Set (n9, v9); } +void +MobilityHelper::PushReferenceMobilityModel (Ptr reference) +{ + Ptr mobility = reference->QueryInterface (); + m_mobilityStack.push_back (mobility); +} +void +MobilityHelper::PopReferenceMobilityModel (void) +{ + m_mobilityStack.pop_back (); +} + + std::string MobilityHelper::GetMobilityModelType (void) const { @@ -94,7 +108,19 @@ MobilityHelper::Layout (const std::vector > &objects) 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 parent = m_mobilityStack.back (); + Ptr hierarchical = + CreateObjectWith ("child", model, + "parent", parent); + object->AddInterface (hierarchical); + } } Vector position = m_position->GetNext (); model->SetPosition (position); diff --git a/src/mobility/mobility-helper.h b/src/mobility/mobility-helper.h index 627285039..8a8d22f35 100644 --- a/src/mobility/mobility-helper.h +++ b/src/mobility/mobility-helper.h @@ -9,6 +9,7 @@ namespace ns3 { class PositionAllocator; +class MobilityModel; class MobilityHelper { @@ -42,6 +43,9 @@ public: std::string n8 = "", PValue v8 = PValue (), std::string n9 = "", PValue v9 = PValue ()); + void PushReferenceMobilityModel (Ptr reference); + void PopReferenceMobilityModel (void); + std::string GetMobilityModelType (void) const; template @@ -49,6 +53,7 @@ public: private: void Layout (const std::vector > &objects); + std::vector > m_mobilityStack; bool m_notifierEnabled; ObjectFactory m_mobility; Ptr m_position;