From a2cddc8da03a25a7d7cb7011a9965eab9bca7870 Mon Sep 17 00:00:00 2001 From: Tom Henderson Date: Tue, 7 Sep 2021 16:22:23 -0700 Subject: [PATCH] mobility: Expose child mobility model to parent position --- .../model/hierarchical-mobility-model.cc | 2 +- src/mobility/model/mobility-model.cc | 13 ++++++++++++ src/mobility/model/mobility-model.h | 20 +++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/mobility/model/hierarchical-mobility-model.cc b/src/mobility/model/hierarchical-mobility-model.cc index 6be31ec04..de75b2d6b 100644 --- a/src/mobility/model/hierarchical-mobility-model.cc +++ b/src/mobility/model/hierarchical-mobility-model.cc @@ -117,7 +117,7 @@ HierarchicalMobilityModel::DoGetPosition (void) const return m_child->GetPosition (); } Vector parentPosition = m_parent->GetPosition (); - Vector childPosition = m_child->GetPosition (); + Vector childPosition = m_child->GetPositionWithReference (parentPosition); return Vector (parentPosition.x + childPosition.x, parentPosition.y + childPosition.y, parentPosition.z + childPosition.z); diff --git a/src/mobility/model/mobility-model.cc b/src/mobility/model/mobility-model.cc index 022f3d77f..e683f5a17 100644 --- a/src/mobility/model/mobility-model.cc +++ b/src/mobility/model/mobility-model.cc @@ -65,6 +65,19 @@ MobilityModel::GetPosition (void) const { return DoGetPosition (); } +Vector +MobilityModel::GetPositionWithReference (const Vector& referencePosition) const +{ + return DoGetPositionWithReference (referencePosition); +} + +// Default implementation ignores referencePosition +Vector +MobilityModel::DoGetPositionWithReference (const Vector& referencePosition) const +{ + return DoGetPosition (); +} + Vector MobilityModel::GetVelocity (void) const { diff --git a/src/mobility/model/mobility-model.h b/src/mobility/model/mobility-model.h index 6333d1af8..60d288f9c 100644 --- a/src/mobility/model/mobility-model.h +++ b/src/mobility/model/mobility-model.h @@ -51,6 +51,18 @@ public: * \return the current position */ Vector GetPosition (void) const; + /** + * This method may be used if the position returned may depend on some + * reference position provided. For example, in a hierarchical mobility + * model that is buildings-aware, the child mobility model may not be able + * to determine if it is inside or outside of a building unless it knows + * the parent position. + * + * \param referencePosition reference position to consider + * \return the current position based on the provided referencePosition + * \sa ns3::MobilityModel::DoGetPositionWithReference + */ + Vector GetPositionWithReference (const Vector &referencePosition) const; /** * \param position the position to set. */ @@ -100,6 +112,14 @@ private: * implement this method. */ virtual Vector DoGetPosition (void) const = 0; + /** + * \param referencePosition the reference position to consider + * \return the current position. + * + * Unless subclasses override, this method will disregard the reference + * position and return "DoGetPosition (void)". + */ + virtual Vector DoGetPositionWithReference (const Vector& referencePosition) const; /** * \param position the position to set. *