A Discrete-Event Network Simulator
API
hierarchical-mobility-model.cc
Go to the documentation of this file.
1/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2007 INRIA
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation;
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 *
18 * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
19 */
21#include "ns3/pointer.h"
22#include "ns3/log.h"
23#include "ns3/simulator.h"
24
25namespace ns3 {
26
27NS_LOG_COMPONENT_DEFINE ("HierarchicalMobilityModel");
28
29NS_OBJECT_ENSURE_REGISTERED (HierarchicalMobilityModel);
30
31TypeId
33{
34 static TypeId tid = TypeId ("ns3::HierarchicalMobilityModel")
36 .SetGroupName ("Mobility")
37 .AddConstructor<HierarchicalMobilityModel> ()
38 .AddAttribute ("Child", "The child mobility model.",
39 PointerValue (),
42 MakePointerChecker<MobilityModel> ())
43 .AddAttribute ("Parent", "The parent mobility model.",
44 PointerValue (),
47 MakePointerChecker<MobilityModel> ())
48 ;
49 return tid;
50}
51
53 : m_child (0),
54 m_parent (0)
55{
56 NS_LOG_FUNCTION (this);
57}
58
59void
61{
62 NS_LOG_FUNCTION (this << model);
63 Ptr<MobilityModel> oldChild = m_child;
64 Vector pos;
65 if (m_child)
66 {
67 NS_LOG_DEBUG ("Disconnecting previous child model " << m_child);
68 pos = GetPosition ();
70 }
71 m_child = model;
73
74 // if we had a child before, then we had a valid position before;
75 // try to preserve the old absolute position.
76 if (oldChild)
77 {
78 NS_LOG_DEBUG ("Restoring previous position " << pos);
79 SetPosition (pos);
80 }
81}
82
83void
85{
86 NS_LOG_FUNCTION (this << model);
87 Vector pos;
88 if (m_child)
89 {
90 pos = GetPosition ();
91 }
92 if (m_parent)
93 {
94 NS_LOG_DEBUG ("Disconnecting previous parent model " << m_child);
96 }
97 m_parent = model;
98 if (m_parent)
99 {
101 }
102 // try to preserve the old position across parent changes
103 if (m_child)
104 {
105 NS_LOG_DEBUG ("Restoring previous position " << pos);
106 SetPosition (pos);
107 }
108}
109
110
113{
114 return m_child;
115}
116
119{
120 return m_parent;
121}
122
123Vector
125{
126 if (!m_parent)
127 {
128 return m_child->GetPosition ();
129 }
130 Vector parentPosition = m_parent->GetPosition ();
131 Vector childPosition = m_child->GetPositionWithReference (parentPosition);
132 return Vector (parentPosition.x + childPosition.x,
133 parentPosition.y + childPosition.y,
134 parentPosition.z + childPosition.z);
135}
136void
138{
139 NS_LOG_FUNCTION (this << position);
140 if (m_child == 0)
141 {
142 return;
143 }
144 // This implementation of DoSetPosition is really an arbitrary choice.
145 // anything else would have been ok.
146 if (m_parent)
147 {
148 Vector parentPosition = m_parent->GetPosition ();
149 Vector childPosition (position.x - parentPosition.x,
150 position.y - parentPosition.y,
151 position.z - parentPosition.z);
152 m_child->SetPosition (childPosition);
153 }
154 else
155 {
156 m_child->SetPosition (position);
157 }
158}
159Vector
161{
162 if (m_parent)
163 {
164 Vector parentSpeed = m_parent->GetVelocity ();
165 Vector childSpeed = m_child->GetVelocity ();
166 Vector speed (parentSpeed.x + childSpeed.x,
167 parentSpeed.y + childSpeed.y,
168 parentSpeed.z + childSpeed.z);
169 return speed;
170 }
171 else
172 {
173 return m_child->GetVelocity ();
174 }
175}
176
177void
179{
181}
182
183void
185{
187}
188
189void
191{
192 NS_LOG_FUNCTION (this);
193 if (m_parent && !m_parent->IsInitialized ())
194 {
196 }
198}
199
200int64_t
202{
203 NS_LOG_FUNCTION (this << stream);
204 int64_t streamsAllocated = 0;
205 streamsAllocated += m_parent->AssignStreams (stream);
206 streamsAllocated += m_child->AssignStreams (stream + streamsAllocated);
207 return streamsAllocated;
208}
209
210} // namespace ns3
Ptr< MobilityModel > m_child
pointer to child mobility model
static TypeId GetTypeId(void)
Register this type with the TypeId system.
virtual void DoSetPosition(const Vector &position)
void ChildChanged(Ptr< const MobilityModel > model)
Callback for when child mobility model course change occurs.
Ptr< MobilityModel > m_parent
pointer to parent mobility model
void SetParent(Ptr< MobilityModel > model)
Sets the parent mobility model to a new one, possibly replacing an existing one.
Ptr< MobilityModel > GetParent(void) const
virtual int64_t DoAssignStreams(int64_t)
The default implementation does nothing but return the passed-in parameter.
virtual void DoInitialize(void)
Initialize() implementation.
void SetChild(Ptr< MobilityModel > model)
Sets the child mobility model to a new one, possibly replacing an existing one.
void ParentChanged(Ptr< const MobilityModel > model)
Callback for when parent mobility model course change occurs.
Ptr< MobilityModel > GetChild(void) const
Keep track of the current position and velocity of an object.
Vector GetPositionWithReference(const Vector &referencePosition) const
This method may be used if the position returned may depend on some reference position provided.
Vector GetVelocity(void) const
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model.
void NotifyCourseChange(void) const
Must be invoked by subclasses when the course of the position changes to notify course change listene...
void SetPosition(const Vector &position)
Vector GetPosition(void) const
bool TraceConnectWithoutContext(std::string name, const CallbackBase &cb)
Connect a TraceSource to a Callback without a context.
Definition: object-base.cc:364
bool TraceDisconnectWithoutContext(std::string name, const CallbackBase &cb)
Disconnect from a TraceSource a Callback previously connected without a context.
Definition: object-base.cc:390
bool IsInitialized(void) const
Check if the object has been initialized.
Definition: object.cc:208
void Initialize(void)
Invoke DoInitialize on all Objects aggregated to this one.
Definition: object.cc:183
Hold objects of type Ptr<T>.
Definition: pointer.h:37
a unique identifier for an interface.
Definition: type-id.h:59
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:922
Ptr< const AttributeAccessor > MakePointerAccessor(T1 a1)
Definition: pointer.h:227
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:273
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:45
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Callback< R, Ts... > MakeCallback(R(T::*memPtr)(Ts...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
Definition: callback.h:1648