00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "hierarchical-mobility-model.h"
00021 #include "ns3/pointer.h"
00022
00023 namespace ns3 {
00024
00025 NS_OBJECT_ENSURE_REGISTERED (HierarchicalMobilityModel);
00026
00027 TypeId
00028 HierarchicalMobilityModel::GetTypeId (void)
00029 {
00030 static TypeId tid = TypeId ("ns3::HierarchicalMobilityModel")
00031 .SetParent<MobilityModel> ()
00032 .AddConstructor<HierarchicalMobilityModel> ()
00033 .AddAttribute ("Child", "The child mobility model.",
00034 PointerValue (),
00035 MakePointerAccessor (&HierarchicalMobilityModel::SetChild,
00036 &HierarchicalMobilityModel::GetChild),
00037 MakePointerChecker<MobilityModel> ())
00038 .AddAttribute ("Parent", "The parent mobility model.",
00039 PointerValue (),
00040 MakePointerAccessor (&HierarchicalMobilityModel::SetParent,
00041 &HierarchicalMobilityModel::GetParent),
00042 MakePointerChecker<MobilityModel> ())
00043 ;
00044 return tid;
00045 }
00046
00047 HierarchicalMobilityModel::HierarchicalMobilityModel ()
00048 : m_child (0),
00049 m_parent (0)
00050 {}
00051
00052 void
00053 HierarchicalMobilityModel::SetChild (Ptr<MobilityModel> model)
00054 {
00055 m_child = model;
00056 m_child->TraceConnectWithoutContext ("CourseChange", MakeCallback (&HierarchicalMobilityModel::ChildChanged, this));
00057 }
00058
00059 void
00060 HierarchicalMobilityModel::SetParent (Ptr<MobilityModel> model)
00061 {
00062 m_parent = model;
00063 m_parent->TraceConnectWithoutContext ("CourseChange", MakeCallback (&HierarchicalMobilityModel::ParentChanged, this));
00064 }
00065
00066
00067 Ptr<MobilityModel>
00068 HierarchicalMobilityModel::GetChild (void) const
00069 {
00070 return m_child;
00071 }
00072
00073 Ptr<MobilityModel>
00074 HierarchicalMobilityModel::GetParent (void) const
00075 {
00076 return m_parent;
00077 }
00078
00079 Vector
00080 HierarchicalMobilityModel::DoGetPosition (void) const
00081 {
00082 Vector parentPosition = m_parent->GetPosition ();
00083 Vector childPosition = m_child->GetPosition ();
00084 return Vector (parentPosition.x + childPosition.x,
00085 parentPosition.y + childPosition.y,
00086 parentPosition.z + childPosition.z);
00087 }
00088 void
00089 HierarchicalMobilityModel::DoSetPosition (const Vector &position)
00090 {
00091 if (m_parent == 0 || m_child == 0)
00092 {
00093 return;
00094 }
00095
00096
00097 Vector parentPosition = m_parent->GetPosition ();
00098 Vector childPosition (position.x - parentPosition.x,
00099 position.y - parentPosition.y,
00100 position.z - parentPosition.z);
00101 m_child->SetPosition (childPosition);
00102 }
00103 Vector
00104 HierarchicalMobilityModel::DoGetVelocity (void) const
00105 {
00106 Vector parentSpeed = m_parent->GetVelocity ();
00107 Vector childSpeed = m_child->GetVelocity ();
00108 Vector speed (parentSpeed.x + childSpeed.x,
00109 parentSpeed.y + childSpeed.y,
00110 parentSpeed.z + childSpeed.z);
00111 return speed;
00112 }
00113
00114 void
00115 HierarchicalMobilityModel::ParentChanged (Ptr<const MobilityModel> model)
00116 {
00117 MobilityModel::NotifyCourseChange ();
00118 }
00119
00120 void
00121 HierarchicalMobilityModel::ChildChanged (Ptr<const MobilityModel> model)
00122 {
00123 MobilityModel::NotifyCourseChange ();
00124 }
00125
00126
00127
00128 }