mobility models
This commit is contained in:
49
samples/main-grid-topology.cc
Normal file
49
samples/main-grid-topology.cc
Normal file
@@ -0,0 +1,49 @@
|
||||
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
|
||||
|
||||
#include "ns3/ptr.h"
|
||||
#include "ns3/grid-topology.h"
|
||||
#include "ns3/static-mobility-model.h"
|
||||
#include "ns3/internet-node.h"
|
||||
#include "ns3/command-line.h"
|
||||
|
||||
using namespace ns3;
|
||||
|
||||
int main (int argc, char *argv[])
|
||||
{
|
||||
CommandLine::Parse (argc, argv);
|
||||
|
||||
std::vector<Ptr<Object> > nodes;
|
||||
|
||||
// create an array of empty nodes for testing purposes
|
||||
for (uint32_t i = 0; i < 120; i++)
|
||||
{
|
||||
nodes.push_back (Create<InternetNode> ());
|
||||
}
|
||||
|
||||
// setup the grid itself: objects are layed out
|
||||
// started from (-100,-100) with 20 objects per row,
|
||||
// the x interval between each object is 5 meters
|
||||
// and the y interval between each object is 20 meters
|
||||
GridTopology grid (-100, -100, 20, 5, 20);
|
||||
|
||||
// each object will be attached a static position.
|
||||
grid.SetMobilityModel (StaticMobilityModel::cid);
|
||||
|
||||
// finalize the setup by attaching to each object
|
||||
// in the input array a position and initializing
|
||||
// this position with the calculated coordinates.
|
||||
grid.LayoutRowFirst (nodes.begin (), nodes.end ());
|
||||
|
||||
// iterate our nodes and print their position.
|
||||
for (std::vector<Ptr<Object> >::const_iterator j = nodes.begin ();
|
||||
j != nodes.end (); j++)
|
||||
{
|
||||
Ptr<Object> object = *j;
|
||||
Ptr<MobilityModel> position = object->QueryInterface<MobilityModel> (MobilityModel::iid);
|
||||
NS_ASSERT (position != 0);
|
||||
Position pos = position->Get ();
|
||||
std::cout << "x=" << pos.x << ", y=" << pos.y << ", z=" << pos.z << std::endl;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
53
samples/main-random-topology.cc
Normal file
53
samples/main-random-topology.cc
Normal file
@@ -0,0 +1,53 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include "ns3/ptr.h"
|
||||
#include "ns3/mobility-model.h"
|
||||
#include "ns3/mobility-model-notifier.h"
|
||||
#include "ns3/static-mobility-model.h"
|
||||
#include "ns3/random-topology.h"
|
||||
#include "ns3/default-value.h"
|
||||
#include "ns3/command-line.h"
|
||||
#include "ns3/simulator.h"
|
||||
#include "ns3/nstime.h"
|
||||
|
||||
using namespace ns3;
|
||||
|
||||
static void
|
||||
CourseChange (Ptr<const MobilityModel> position)
|
||||
{
|
||||
Position pos = position->Get ();
|
||||
std::cout << Simulator::Now () << ", pos=" << position << ", x=" << pos.x << ", y=" << pos.y
|
||||
<< ", z=" << pos.z << std::endl;
|
||||
}
|
||||
|
||||
int main (int argc, char *argv[])
|
||||
{
|
||||
Bind ("RandomDiscPositionX", "100");
|
||||
Bind ("RandomDiscPositionY", "50");
|
||||
Bind ("RandomDiscPositionRho", "Uniform:0:30");
|
||||
|
||||
Bind ("RandomTopologyPositionType", "RandomDiscPosition");
|
||||
Bind ("RandomTopologyMobilityType", "StaticMobilityModel");
|
||||
|
||||
CommandLine::Parse (argc, argv);
|
||||
|
||||
RandomTopology topology;
|
||||
|
||||
std::vector<Ptr<Object> > objects;
|
||||
for (uint32_t i = 0; i < 10000; i++)
|
||||
{
|
||||
Ptr<MobilityModelNotifier> notifier = Create<MobilityModelNotifier> ();
|
||||
notifier->RegisterListener (MakeCallback (&CourseChange));
|
||||
objects.push_back (notifier);
|
||||
}
|
||||
|
||||
topology.Layout (objects.begin (), objects.end ());
|
||||
|
||||
Simulator::StopAt (Seconds (100.0));
|
||||
|
||||
Simulator::Run ();
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -21,4 +21,8 @@ def build(bld):
|
||||
#obj = create_ns_prog('main-simple-p2p', 'main-simple-p2p.cc', deps=['node', 'p2p'])
|
||||
obj = create_ns_prog('main-default-value', 'main-default-value.cc',
|
||||
deps=['core', 'simulator', 'node', 'p2p'])
|
||||
obj = create_ns_prog('main-grid-topology', 'main-grid-topology.cc',
|
||||
deps=['core', 'simulator', 'mobility', 'internet-node'])
|
||||
obj = create_ns_prog('main-random-topology', 'main-random-topology.cc',
|
||||
deps=['core', 'simulator', 'mobility'])
|
||||
|
||||
|
||||
66
src/mobility/grid-topology.cc
Normal file
66
src/mobility/grid-topology.cc
Normal file
@@ -0,0 +1,66 @@
|
||||
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2007 INRIA
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
|
||||
*/
|
||||
#include "grid-topology.h"
|
||||
#include "static-mobility-model.h"
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
GridTopology::GridTopology (double xMin, double yMin, uint32_t n, double deltaX, double deltaY)
|
||||
: m_xMin (xMin),
|
||||
m_yMin (yMin),
|
||||
m_n (n),
|
||||
m_deltaX (deltaX),
|
||||
m_deltaY (deltaY),
|
||||
m_positionClassId (StaticMobilityModel::cid)
|
||||
{}
|
||||
|
||||
void
|
||||
GridTopology::SetMobilityModel (ClassId classId)
|
||||
{
|
||||
m_positionClassId = classId;
|
||||
}
|
||||
|
||||
void
|
||||
GridTopology::LayoutOneRowFirst (Ptr<Object> object, uint32_t i)
|
||||
{
|
||||
double x, y;
|
||||
x = m_xMin + m_deltaX * (i % m_n);
|
||||
y = m_yMin + m_deltaY * (i / m_n);
|
||||
Ptr<MobilityModel> mobility = ComponentManager::Create<MobilityModel> (m_positionClassId,
|
||||
MobilityModel::iid);
|
||||
object->AddInterface (mobility);
|
||||
mobility->Set (Position (x, y, 0.0));
|
||||
}
|
||||
|
||||
void
|
||||
GridTopology::LayoutOneColumnFirst (Ptr<Object> object, uint32_t i)
|
||||
{
|
||||
double x, y;
|
||||
x = m_xMin + m_deltaX * (i / m_n);
|
||||
y = m_yMin + m_deltaY * (i % m_n);
|
||||
Ptr<MobilityModel> mobility = ComponentManager::Create<MobilityModel> (m_positionClassId,
|
||||
MobilityModel::iid);
|
||||
object->AddInterface (mobility);
|
||||
mobility->Set (Position (x, y, 0.0));
|
||||
}
|
||||
|
||||
|
||||
} // namespace ns3
|
||||
120
src/mobility/grid-topology.h
Normal file
120
src/mobility/grid-topology.h
Normal file
@@ -0,0 +1,120 @@
|
||||
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2007 INRIA
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
|
||||
*/
|
||||
#ifndef GRID_TOPOLOGY_H
|
||||
#define GRID_TOPOLOGY_H
|
||||
|
||||
#include <vector>
|
||||
#include "ns3/component-manager.h"
|
||||
#include "ns3/ptr.h"
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
/**
|
||||
* \brief a 2D grid of objects
|
||||
*/
|
||||
class GridTopology
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* \param xMin the left boundary where the objects will start being arranged.
|
||||
* \param yMin the lower boundary where the objects will start being arranged.
|
||||
* \param n number of objects for each row or column
|
||||
* \param deltaX distance separating two adjacent objects along the x axis.
|
||||
* \param deltaY distance separating two adjacent objects along the y axis.
|
||||
*
|
||||
* The first object is positioned at (xMin,yMin).
|
||||
*/
|
||||
GridTopology (double xMin, double yMin, uint32_t n, double deltaX, double deltaY);
|
||||
|
||||
/**
|
||||
* \param classId the classId of the position object to attach to each
|
||||
* input object.
|
||||
*/
|
||||
void SetMobilityModel (ClassId classId);
|
||||
|
||||
/**
|
||||
* \param begin an iterator to the first object to layout.
|
||||
* \param end an iterator to the last object to layout.
|
||||
*
|
||||
* Attach a position (the type of position is specified through
|
||||
* the ClassId given to SetMobilityModelModel) to each input object
|
||||
* and configure its initial location with a set
|
||||
* of coordinates arranged according to a regular rectangular grid,
|
||||
* one row after the other.
|
||||
*/
|
||||
template <typename T>
|
||||
void LayoutRowFirst (const T &begin, const T &end);
|
||||
|
||||
/**
|
||||
* \param begin an iterator to the first object to layout.
|
||||
* \param end an iterator to the last object to layout.
|
||||
*
|
||||
* Attach a position (the type of position is specified through
|
||||
* the ClassId given to SetMobilityModelModel) to each input object
|
||||
* and configure its initial location with a set
|
||||
* of coordinates arranged according to a regular rectangular grid,
|
||||
* one column after the other.
|
||||
*/
|
||||
template <typename T>
|
||||
void LayoutColumnFirst (const T &begin, const T &end);
|
||||
private:
|
||||
GridTopology ();
|
||||
void LayoutOneRowFirst (Ptr<Object> object, uint32_t i);
|
||||
void LayoutOneColumnFirst (Ptr<Object> object, uint32_t i);
|
||||
double m_xMin;
|
||||
double m_yMin;
|
||||
uint32_t m_n;
|
||||
double m_deltaX;
|
||||
double m_deltaY;
|
||||
ClassId m_positionClassId;
|
||||
};
|
||||
|
||||
} // namespace ns3
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
template <typename T>
|
||||
void
|
||||
GridTopology::LayoutRowFirst (const T &begin, const T &end)
|
||||
{
|
||||
uint32_t j = 0;
|
||||
for (T i = begin; i != end; i++)
|
||||
{
|
||||
j++;
|
||||
LayoutOneRowFirst (*i, j);
|
||||
}
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void
|
||||
GridTopology::LayoutColumnFirst (const T &begin, const T &end)
|
||||
{
|
||||
uint32_t j = 0;
|
||||
for (T i = begin; i != end; i++)
|
||||
{
|
||||
j++;
|
||||
LayoutOneColumnFirst (*i, j);
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace ns3
|
||||
|
||||
#endif /* GRID_TOPOLOGY_H */
|
||||
105
src/mobility/hierarchical-mobility-model.cc
Normal file
105
src/mobility/hierarchical-mobility-model.cc
Normal file
@@ -0,0 +1,105 @@
|
||||
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2007 INRIA
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
|
||||
*/
|
||||
#include "hierarchical-mobility-model.h"
|
||||
#include "mobility-model-notifier.h"
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
HierarchicalMobilityModel::HierarchicalMobilityModel (Ptr<MobilityModel> child, Ptr<MobilityModel> parent)
|
||||
: m_child (child),
|
||||
m_parent (parent)
|
||||
{
|
||||
Ptr<MobilityModelNotifier> childNotifier =
|
||||
m_child->QueryInterface<MobilityModelNotifier> (MobilityModelNotifier::iid);
|
||||
Ptr<MobilityModelNotifier> parentNotifier =
|
||||
m_parent->QueryInterface<MobilityModelNotifier> (MobilityModelNotifier::iid);
|
||||
if (childNotifier == 0)
|
||||
{
|
||||
childNotifier = Create<MobilityModelNotifier> ();
|
||||
child->AddInterface (childNotifier);
|
||||
}
|
||||
if (parentNotifier == 0)
|
||||
{
|
||||
parentNotifier = Create<MobilityModelNotifier> ();
|
||||
parent->AddInterface (parentNotifier);
|
||||
}
|
||||
childNotifier->RegisterListener (MakeCallback (&HierarchicalMobilityModel::ChildChanged, this));
|
||||
parentNotifier->RegisterListener (MakeCallback (&HierarchicalMobilityModel::ParentChanged, this));
|
||||
}
|
||||
|
||||
Ptr<MobilityModel>
|
||||
HierarchicalMobilityModel::GetChild (void) const
|
||||
{
|
||||
return m_child;
|
||||
}
|
||||
|
||||
Ptr<MobilityModel>
|
||||
HierarchicalMobilityModel::GetParent (void) const
|
||||
{
|
||||
return m_parent;
|
||||
}
|
||||
|
||||
Position
|
||||
HierarchicalMobilityModel::DoGet (void) const
|
||||
{
|
||||
Position parentPosition = m_parent->Get ();
|
||||
Position childPosition = m_child->Get ();
|
||||
return Position (parentPosition.x + childPosition.x,
|
||||
parentPosition.y + childPosition.y,
|
||||
parentPosition.z + childPosition.z);
|
||||
}
|
||||
void
|
||||
HierarchicalMobilityModel::DoSet (const Position &position)
|
||||
{
|
||||
// This implementation of DoSet is really an arbitraty choice.
|
||||
// anything else would have been ok.
|
||||
Position parentPosition = m_parent->Get ();
|
||||
Position childPosition (position.x - parentPosition.x,
|
||||
position.y - parentPosition.y,
|
||||
position.z - parentPosition.z);
|
||||
m_child->Set (childPosition);
|
||||
}
|
||||
Speed
|
||||
HierarchicalMobilityModel::DoGetSpeed (void) const
|
||||
{
|
||||
Speed parentSpeed = m_parent->GetSpeed ();
|
||||
Speed childSpeed = m_child->GetSpeed ();
|
||||
Speed speed (parentSpeed.dx + childSpeed.dx,
|
||||
parentSpeed.dy + childSpeed.dy,
|
||||
parentSpeed.dz + childSpeed.dz);
|
||||
return speed;
|
||||
}
|
||||
|
||||
void
|
||||
HierarchicalMobilityModel::ParentChanged (Ptr<const MobilityModel> model)
|
||||
{
|
||||
MobilityModel::NotifyCourseChange ();
|
||||
}
|
||||
|
||||
void
|
||||
HierarchicalMobilityModel::ChildChanged (Ptr<const MobilityModel> model)
|
||||
{
|
||||
MobilityModel::NotifyCourseChange ();
|
||||
}
|
||||
|
||||
|
||||
|
||||
} // namespace ns3
|
||||
76
src/mobility/hierarchical-mobility-model.h
Normal file
76
src/mobility/hierarchical-mobility-model.h
Normal file
@@ -0,0 +1,76 @@
|
||||
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2007 INRIA
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
|
||||
*/
|
||||
#ifndef HIERARCHICAL_MOBILITY_MODEL_H
|
||||
#define HIERARCHICAL_MOBILITY_MODEL_H
|
||||
|
||||
#include "mobility-model.h"
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
/**
|
||||
* \brief a hierachical mobility model.
|
||||
*
|
||||
* This model allows you to specify the position of a
|
||||
* child object relative to a parent object.
|
||||
*/
|
||||
class HierarchicalMobilityModel : public MobilityModel
|
||||
{
|
||||
public:
|
||||
static const InterfaceId iid;
|
||||
|
||||
/**
|
||||
* \param child the "relative" mobility model
|
||||
* \param parent the "reference" mobility model
|
||||
*/
|
||||
HierarchicalMobilityModel (Ptr<MobilityModel> child, Ptr<MobilityModel> parent);
|
||||
|
||||
/**
|
||||
* \returns the child mobility model.
|
||||
*
|
||||
* This allows you to get access to the position of the child
|
||||
* relative to its parent.
|
||||
*/
|
||||
Ptr<MobilityModel> GetChild (void) const;
|
||||
/**
|
||||
* \returns the parent mobility model.
|
||||
*
|
||||
* This allows you to get access to the position of the
|
||||
* parent mobility model which is used as the reference
|
||||
* position by the child mobility model.
|
||||
*/
|
||||
Ptr<MobilityModel> GetParent (void) const;
|
||||
|
||||
private:
|
||||
virtual Position DoGet (void) const;
|
||||
virtual void DoSet (const Position &position);
|
||||
virtual Speed DoGetSpeed (void) const;
|
||||
|
||||
void ParentChanged (Ptr<const MobilityModel> model);
|
||||
void ChildChanged (Ptr<const MobilityModel> model);
|
||||
|
||||
Ptr<MobilityModel> m_child;
|
||||
Ptr<MobilityModel> m_parent;
|
||||
};
|
||||
|
||||
|
||||
} // namespace ns3
|
||||
|
||||
#endif /* HIERARCHICAL_MOBILITY_MODEL_H */
|
||||
68
src/mobility/mobility-model-notifier.cc
Normal file
68
src/mobility/mobility-model-notifier.cc
Normal file
@@ -0,0 +1,68 @@
|
||||
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2007 INRIA
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
|
||||
*/
|
||||
#include "mobility-model-notifier.h"
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
const InterfaceId MobilityModelNotifier::iid = MakeInterfaceId ("MobilityModelNotifier", Object::iid);
|
||||
const ClassId MobilityModelNotifier::cid =
|
||||
MakeClassId<MobilityModelNotifier> ("MobilityModelNotifier",
|
||||
MobilityModelNotifier::iid);
|
||||
|
||||
MobilityModelNotifier::MobilityModelNotifier ()
|
||||
{
|
||||
SetInterfaceId (MobilityModelNotifier::iid);
|
||||
}
|
||||
|
||||
void
|
||||
MobilityModelNotifier::RegisterListener (Listener listener)
|
||||
{
|
||||
m_listeners.push_back (listener);
|
||||
}
|
||||
void
|
||||
MobilityModelNotifier::UnregisterListener (Listener callback)
|
||||
{
|
||||
for (std::list<Listener>::iterator i = m_listeners.begin ();
|
||||
i != m_listeners.end ();)
|
||||
{
|
||||
Listener listener = *i;
|
||||
if (listener.IsEqual (callback))
|
||||
{
|
||||
i = m_listeners.erase (i);
|
||||
}
|
||||
else
|
||||
{
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
void
|
||||
MobilityModelNotifier::Notify (Ptr<const MobilityModel> position) const
|
||||
{
|
||||
for (std::list<Listener>::const_iterator i = m_listeners.begin ();
|
||||
i != m_listeners.end (); i++)
|
||||
{
|
||||
Listener listener = *i;
|
||||
listener (position);
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace ns3
|
||||
72
src/mobility/mobility-model-notifier.h
Normal file
72
src/mobility/mobility-model-notifier.h
Normal file
@@ -0,0 +1,72 @@
|
||||
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2007 INRIA
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
|
||||
*/
|
||||
#ifndef MOBILITY_MODEL_NOTIFIER_H
|
||||
#define MOBILITY_MODEL_NOTIFIER_H
|
||||
|
||||
#include "ns3/object.h"
|
||||
#include "ns3/component-manager.h"
|
||||
#include "ns3/callback.h"
|
||||
#include "mobility-model.h"
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
/**
|
||||
* \brief notify listeners of position changes.
|
||||
*/
|
||||
class MobilityModelNotifier : public Object
|
||||
{
|
||||
public:
|
||||
static const InterfaceId iid;
|
||||
static const ClassId cid;
|
||||
|
||||
typedef Callback<void,Ptr<const MobilityModel> > Listener;
|
||||
|
||||
/**
|
||||
* Create a new position notifier
|
||||
*/
|
||||
MobilityModelNotifier ();
|
||||
|
||||
/**
|
||||
* \param position the position which just changed.
|
||||
*/
|
||||
void Notify (Ptr<const MobilityModel> position) const;
|
||||
|
||||
/**
|
||||
* \param listener listener to add
|
||||
*
|
||||
* The listener will be notified upon every position change.
|
||||
*/
|
||||
void RegisterListener (Listener listener);
|
||||
/**
|
||||
* \param listener listener to remove
|
||||
*
|
||||
* The listener will not be notified anymore upon every
|
||||
* position change. It is not an error to try to unregister
|
||||
* a non-registered liste
|
||||
*/
|
||||
void UnregisterListener (Listener listener);
|
||||
private:
|
||||
std::list<Listener> m_listeners;
|
||||
};
|
||||
|
||||
} // namespace ns3
|
||||
|
||||
#endif /* MOBILITY_MODEL_NOTIFIER_H */
|
||||
73
src/mobility/mobility-model.cc
Normal file
73
src/mobility/mobility-model.cc
Normal file
@@ -0,0 +1,73 @@
|
||||
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2006,2007 INRIA
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
|
||||
*/
|
||||
#include "mobility-model.h"
|
||||
#include "mobility-model-notifier.h"
|
||||
#include <math.h>
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
const InterfaceId MobilityModel::iid = MakeInterfaceId ("MobilityModel", Object::iid);
|
||||
|
||||
MobilityModel::MobilityModel ()
|
||||
{
|
||||
SetInterfaceId (MobilityModel::iid);
|
||||
}
|
||||
|
||||
MobilityModel::~MobilityModel ()
|
||||
{}
|
||||
|
||||
Position
|
||||
MobilityModel::Get (void) const
|
||||
{
|
||||
return DoGet ();
|
||||
}
|
||||
Speed
|
||||
MobilityModel::GetSpeed (void) const
|
||||
{
|
||||
return DoGetSpeed ();
|
||||
}
|
||||
|
||||
void
|
||||
MobilityModel::Set (const Position &position)
|
||||
{
|
||||
DoSet (position);
|
||||
}
|
||||
|
||||
double
|
||||
MobilityModel::GetDistanceFrom (const MobilityModel &other) const
|
||||
{
|
||||
Position oPosition = other.DoGet ();
|
||||
Position position = DoGet ();
|
||||
return CalculateDistance (position, oPosition);
|
||||
}
|
||||
|
||||
void
|
||||
MobilityModel::NotifyCourseChange (void) const
|
||||
{
|
||||
Ptr<MobilityModelNotifier> notifier =
|
||||
QueryInterface<MobilityModelNotifier> (MobilityModelNotifier::iid);
|
||||
if (notifier != 0)
|
||||
{
|
||||
notifier->Notify (this);
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace ns3
|
||||
93
src/mobility/mobility-model.h
Normal file
93
src/mobility/mobility-model.h
Normal file
@@ -0,0 +1,93 @@
|
||||
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2006,2007 INRIA
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
|
||||
*/
|
||||
#ifndef MOBILITY_MODEL_H
|
||||
#define MOBILITY_MODEL_H
|
||||
|
||||
#include "ns3/object.h"
|
||||
#include "position.h"
|
||||
#include "speed.h"
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
/**
|
||||
* \brief keep track of the current position of an object
|
||||
*
|
||||
* All space coordinates in this class and its subclasses are
|
||||
* understood to be meters or meters/s. i.e., they are all
|
||||
* metric international units.
|
||||
*/
|
||||
class MobilityModel : public Object
|
||||
{
|
||||
public:
|
||||
static const InterfaceId iid;
|
||||
MobilityModel ();
|
||||
virtual ~MobilityModel () = 0;
|
||||
|
||||
/**
|
||||
* \returns the current position
|
||||
*/
|
||||
Position Get (void) const;
|
||||
/**
|
||||
* \param position the position to set.
|
||||
*/
|
||||
void Set (const Position &position);
|
||||
/**
|
||||
* \returns the current position.
|
||||
*/
|
||||
Speed GetSpeed (void) const;
|
||||
/**
|
||||
* \param position a reference to another mobility model
|
||||
* \returns the distance between the two objects. Unit is meters.
|
||||
*/
|
||||
double GetDistanceFrom (const MobilityModel &position) const;
|
||||
protected:
|
||||
/**
|
||||
* Must be invoked by subclasses when the course of the
|
||||
* position changes to notify course change listeners.
|
||||
*/
|
||||
void NotifyCourseChange (void) const;
|
||||
private:
|
||||
/**
|
||||
* \returns the current position.
|
||||
*
|
||||
* Concrete subclasses of this base class must
|
||||
* implement this method.
|
||||
*/
|
||||
virtual Position DoGet (void) const = 0;
|
||||
/**
|
||||
* \param position the position to set.
|
||||
*
|
||||
* Concrete subclasses of this base class must
|
||||
* implement this method.
|
||||
*/
|
||||
virtual void DoSet (const Position &position) = 0;
|
||||
/**
|
||||
* \returns the current speed.
|
||||
*
|
||||
* Concrete subclasses of this base class must
|
||||
* implement this method.
|
||||
*/
|
||||
virtual Speed DoGetSpeed (void) const = 0;
|
||||
};
|
||||
|
||||
}; // namespace ns3
|
||||
|
||||
#endif /* MOBILITY_MODEL_H */
|
||||
42
src/mobility/mobility.h
Normal file
42
src/mobility/mobility.h
Normal file
@@ -0,0 +1,42 @@
|
||||
/**
|
||||
* \defgroup mobility Mobility
|
||||
*
|
||||
* The mobility support includes:
|
||||
* - a set of mobility models which are used to track and maintain
|
||||
* the "current" cartesian position and speed of an object.
|
||||
*
|
||||
* - a "course change notifier" which can be used to register listeners
|
||||
* to the course changes of a mobility model: ns3::MobilityModelNotifier.
|
||||
*
|
||||
* - a set of topology constructors which are used to set the initial
|
||||
* position and associate a specific mobility model to a set of objects.
|
||||
*
|
||||
* The mobility models themselves are:
|
||||
* - ns3::StaticMobilityModel: a model which maintains a constant position
|
||||
* until it is changed by the user.
|
||||
*
|
||||
* - ns3::StaticSpeedMobilityModel: a model which maintains a constant speed
|
||||
* until it is changed by the user.
|
||||
*
|
||||
* - ns3::HierarchicalMobilityModel: a model which calculates the current
|
||||
* absolute position from a "reference" (parent) mobility model
|
||||
* and a "relative" (child) mobility model. This allows users to
|
||||
* compose mobility models.
|
||||
*
|
||||
* - ns3::RandomWalk2dMobilityModel: a 2d "brownian" motion mobility model
|
||||
* where the bounds of the mobility area are a rectangle.
|
||||
*
|
||||
* - ns3::RandomWaypointMobilityModel: a 3d random waypoint mobility model.
|
||||
*
|
||||
* - ns3::RandomDirection2dMobilityModel: a 2d random direction mobility
|
||||
* model where the bounds of the mobility are are a rectangle.
|
||||
*
|
||||
* The topology constructors:
|
||||
* - ns3::GridTopology: layout objects in a 2d grid.
|
||||
*
|
||||
* - ns3::RandomTopology: layout objects in a 3d space, according to a
|
||||
* RandomPosition model.
|
||||
*
|
||||
* - ns3::Ns2MobilityFileTopology: layout objects in a 3d space according
|
||||
* to an ns2 CMU mobility file (as generated by the setdest tool).
|
||||
*/
|
||||
29
src/mobility/position.cc
Normal file
29
src/mobility/position.cc
Normal file
@@ -0,0 +1,29 @@
|
||||
#include "position.h"
|
||||
#include <cmath>
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
|
||||
Position::Position (double _x, double _y, double _z)
|
||||
: x (_x),
|
||||
y (_y),
|
||||
z (_z)
|
||||
{}
|
||||
|
||||
Position::Position ()
|
||||
: x (0.0),
|
||||
y (0.0),
|
||||
z (0.0)
|
||||
{}
|
||||
|
||||
double
|
||||
CalculateDistance (const Position &a, const Position &b)
|
||||
{
|
||||
double dx = b.x - a.x;
|
||||
double dy = b.y - a.y;
|
||||
double dz = b.z - a.z;
|
||||
double distance = std::sqrt (dx * dx + dy * dy + dz * dz);
|
||||
return distance;
|
||||
}
|
||||
|
||||
} // namespace ns3
|
||||
44
src/mobility/position.h
Normal file
44
src/mobility/position.h
Normal file
@@ -0,0 +1,44 @@
|
||||
#ifndef POSITION_H
|
||||
#define POSITION_H
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
/**
|
||||
* \brief a 3d cartesian position vector
|
||||
*
|
||||
* Unit is meters.
|
||||
*/
|
||||
class Position
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* \param _x x coordinate of position vector
|
||||
* \param _y y coordinate of position vector
|
||||
* \param _z z coordinate of position vector
|
||||
*
|
||||
* Create position vector (_x, _y, _z)
|
||||
*/
|
||||
Position (double _x, double _y, double _z);
|
||||
/**
|
||||
* Create position vector (0.0, 0.0, 0.0)
|
||||
*/
|
||||
Position ();
|
||||
/**
|
||||
* x coordinate of position vector
|
||||
*/
|
||||
double x;
|
||||
/**
|
||||
* y coordinate of position vector
|
||||
*/
|
||||
double y;
|
||||
/**
|
||||
* z coordinate of position vector
|
||||
*/
|
||||
double z;
|
||||
};
|
||||
|
||||
double CalculateDistance (const Position &a, const Position &b);
|
||||
|
||||
} // namespace ns3
|
||||
|
||||
#endif /* POSITION_H */
|
||||
116
src/mobility/random-position.cc
Normal file
116
src/mobility/random-position.cc
Normal file
@@ -0,0 +1,116 @@
|
||||
#include "random-position.h"
|
||||
#include "ns3/random-variable.h"
|
||||
#include "ns3/default-value.h"
|
||||
#include "ns3/random-variable-default-value.h"
|
||||
#include "ns3/debug.h"
|
||||
#include <cmath>
|
||||
|
||||
NS_DEBUG_COMPONENT_DEFINE ("RandomPosition");
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
static RandomVariableDefaultValue
|
||||
g_rectangleX ("RandomRectanglePositionX",
|
||||
"A random variable which represents the x position of a position in a random rectangle.",
|
||||
"Uniform:0:200");
|
||||
|
||||
static RandomVariableDefaultValue
|
||||
g_rectangleY ("RandomRectanglePositionY",
|
||||
"A random variable which represents the y position of a position in a random rectangle.",
|
||||
"Uniform:0:200");
|
||||
|
||||
static RandomVariableDefaultValue
|
||||
g_discTheta ("RandomDiscPositionTheta",
|
||||
"A random variable which represents the angle (gradients) of a position in a random disc.",
|
||||
"Uniform:0:6.2830");
|
||||
|
||||
static RandomVariableDefaultValue
|
||||
g_discRho ("RandomDiscPositionRho",
|
||||
"A random variable which represents the radius of a position in a random disc.",
|
||||
"Uniform:0:200");
|
||||
|
||||
static NumericDefaultValue<double>
|
||||
g_discX ("RandomDiscPositionX",
|
||||
"The x coordinate of the center of the random position disc.",
|
||||
0.0);
|
||||
|
||||
static NumericDefaultValue<double>
|
||||
g_discY ("RandomDiscPositionY",
|
||||
"The y coordinate of the center of the random position disc.",
|
||||
0.0);
|
||||
|
||||
const InterfaceId RandomPosition::iid = MakeInterfaceId ("RandomPosition", Object::iid);
|
||||
|
||||
const ClassId RandomRectanglePosition::cid =
|
||||
MakeClassId<RandomRectanglePosition> ("RandomRectanglePosition",
|
||||
RandomPosition::iid);
|
||||
const ClassId RandomDiscPosition::cid =
|
||||
MakeClassId<RandomDiscPosition> ("RandomDiscPosition",
|
||||
RandomPosition::iid);
|
||||
|
||||
RandomPosition::RandomPosition ()
|
||||
{
|
||||
Object::SetInterfaceId (RandomPosition::iid);
|
||||
}
|
||||
|
||||
RandomPosition::~RandomPosition ()
|
||||
{}
|
||||
|
||||
RandomRectanglePosition::RandomRectanglePosition ()
|
||||
: m_x (g_rectangleX.GetCopy ()),
|
||||
m_y (g_rectangleY.GetCopy ())
|
||||
{}
|
||||
RandomRectanglePosition::RandomRectanglePosition (const RandomVariable &x,
|
||||
const RandomVariable &y)
|
||||
: m_x (x.Copy ()),
|
||||
m_y (y.Copy ())
|
||||
{}
|
||||
RandomRectanglePosition::~RandomRectanglePosition ()
|
||||
{
|
||||
delete m_x;
|
||||
delete m_y;
|
||||
m_x = 0;
|
||||
m_y = 0;
|
||||
}
|
||||
Position
|
||||
RandomRectanglePosition::Get (void) const
|
||||
{
|
||||
double x = m_x->GetValue ();
|
||||
double y = m_y->GetValue ();
|
||||
return Position (x, y, 0.0);
|
||||
}
|
||||
|
||||
RandomDiscPosition::RandomDiscPosition ()
|
||||
: m_theta (g_discTheta.GetCopy ()),
|
||||
m_rho (g_discRho.GetCopy ()),
|
||||
m_x (g_discX.GetValue ()),
|
||||
m_y (g_discY.GetValue ())
|
||||
{}
|
||||
RandomDiscPosition::RandomDiscPosition (const RandomVariable &theta,
|
||||
const RandomVariable &rho,
|
||||
double x, double y)
|
||||
: m_theta (theta.Copy ()),
|
||||
m_rho (rho.Copy ()),
|
||||
m_x (0.0),
|
||||
m_y (0.0)
|
||||
{}
|
||||
RandomDiscPosition::~RandomDiscPosition ()
|
||||
{
|
||||
delete m_theta;
|
||||
delete m_rho;
|
||||
m_theta = 0;
|
||||
m_rho = 0;
|
||||
}
|
||||
Position
|
||||
RandomDiscPosition::Get (void) const
|
||||
{
|
||||
double theta = m_theta->GetValue ();
|
||||
double rho = m_rho->GetValue ();
|
||||
double x = m_x + std::cos (theta) * rho;
|
||||
double y = m_y + std::sin (theta) * rho;
|
||||
NS_DEBUG ("Disc position x=" << x << ", y=" << y);
|
||||
return Position (x, y, 0.0);
|
||||
}
|
||||
|
||||
|
||||
} // namespace ns3
|
||||
96
src/mobility/random-position.h
Normal file
96
src/mobility/random-position.h
Normal file
@@ -0,0 +1,96 @@
|
||||
#ifndef RANDOM_POSITION_H
|
||||
#define RANDOM_POSITION_H
|
||||
|
||||
#include "ns3/object.h"
|
||||
#include "ns3/component-manager.h"
|
||||
#include "position.h"
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
class RandomVariable;
|
||||
|
||||
/**
|
||||
* \brief choose a position at random.
|
||||
*
|
||||
* This is a pure abstract base class.
|
||||
*/
|
||||
class RandomPosition : public Object
|
||||
{
|
||||
public:
|
||||
static const InterfaceId iid;
|
||||
RandomPosition ();
|
||||
virtual ~RandomPosition ();
|
||||
/**
|
||||
* \returns the next randomly-choosen position.
|
||||
*/
|
||||
virtual Position Get (void) const = 0;
|
||||
};
|
||||
|
||||
/**
|
||||
* \brief allocate random positions within a rectangle
|
||||
* according to a pair of random variables.
|
||||
*/
|
||||
class RandomRectanglePosition : public RandomPosition
|
||||
{
|
||||
public:
|
||||
static const ClassId cid;
|
||||
/**
|
||||
* Create a random position model based on the
|
||||
* Bind default values.
|
||||
*/
|
||||
RandomRectanglePosition ();
|
||||
/**
|
||||
* \param x the random variable which is used to choose
|
||||
* the x coordinates.
|
||||
* \param y the random variable which is used to choose
|
||||
* the y coordinates.
|
||||
*/
|
||||
RandomRectanglePosition (const RandomVariable &x,
|
||||
const RandomVariable &y);
|
||||
virtual ~RandomRectanglePosition ();
|
||||
virtual Position Get (void) const;
|
||||
private:
|
||||
RandomVariable *m_x;
|
||||
RandomVariable *m_y;
|
||||
};
|
||||
|
||||
/**
|
||||
* \brief allocate random positions within a disc
|
||||
* according to a pair of random variables.
|
||||
*/
|
||||
class RandomDiscPosition : public RandomPosition
|
||||
{
|
||||
public:
|
||||
static const ClassId cid;
|
||||
/**
|
||||
* Create a random position model based on the
|
||||
* Bind default values.
|
||||
*/
|
||||
RandomDiscPosition ();
|
||||
/**
|
||||
* \param theta the random variable used to pick
|
||||
* the angle of the random position in polar
|
||||
* coordinates.
|
||||
* \param rho the random variable used to pick the
|
||||
* radius of the random position in polar
|
||||
* coordinates.
|
||||
* \param x the x coordinate of the center of the
|
||||
* polar coodinate system.
|
||||
* \param y the y coordinate of the center of the
|
||||
* polar coodinate system.
|
||||
*/
|
||||
RandomDiscPosition (const RandomVariable &theta,
|
||||
const RandomVariable &rho,
|
||||
double x, double y);
|
||||
virtual ~RandomDiscPosition ();
|
||||
virtual Position Get (void) const;
|
||||
private:
|
||||
RandomVariable *m_theta;
|
||||
RandomVariable *m_rho;
|
||||
double m_x;
|
||||
double m_y;
|
||||
};
|
||||
|
||||
} // namespace ns3
|
||||
|
||||
#endif /* RANDOM_POSITION_H */
|
||||
78
src/mobility/random-topology.cc
Normal file
78
src/mobility/random-topology.cc
Normal file
@@ -0,0 +1,78 @@
|
||||
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2007 INRIA
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
|
||||
*/
|
||||
#include "ns3/random-variable-default-value.h"
|
||||
#include "random-topology.h"
|
||||
#include "random-position.h"
|
||||
#include "mobility-model.h"
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
static ClassIdDefaultValue
|
||||
g_position ("RandomTopologyPositionType",
|
||||
"The type of initial random position in a 3d topology.",
|
||||
RandomPosition::iid,
|
||||
"RandomRectanglePosition");
|
||||
|
||||
static ClassIdDefaultValue
|
||||
g_mobility ("RandomTopologyMobilityType",
|
||||
"The type of mobility model attached to an object in a 3d topology.",
|
||||
MobilityModel::iid,
|
||||
"StaticMobilityModel");
|
||||
|
||||
RandomTopology::RandomTopology ()
|
||||
: m_mobilityModel (g_mobility.GetValue ())
|
||||
{
|
||||
m_positionModel = ComponentManager::Create<RandomPosition> (g_position.GetValue (),
|
||||
RandomPosition::iid);
|
||||
}
|
||||
RandomTopology::RandomTopology (Ptr<RandomPosition> positionModel, ClassId mobilityModel)
|
||||
: m_positionModel (positionModel),
|
||||
m_mobilityModel (mobilityModel)
|
||||
{}
|
||||
RandomTopology::~RandomTopology ()
|
||||
{
|
||||
m_positionModel = 0;
|
||||
}
|
||||
|
||||
void
|
||||
RandomTopology::SetMobilityModel (ClassId classId)
|
||||
{
|
||||
m_mobilityModel = classId;
|
||||
}
|
||||
|
||||
void
|
||||
RandomTopology::SetPositionModel (Ptr<RandomPosition> positionModel)
|
||||
{
|
||||
m_positionModel = positionModel;
|
||||
}
|
||||
|
||||
void
|
||||
RandomTopology::LayoutOne (Ptr<Object> object)
|
||||
{
|
||||
Ptr<MobilityModel> mobility = ComponentManager::Create<MobilityModel> (m_mobilityModel,
|
||||
MobilityModel::iid);
|
||||
object->AddInterface (mobility);
|
||||
Position position = m_positionModel->Get ();
|
||||
mobility->Set (position);
|
||||
}
|
||||
|
||||
|
||||
} // namespace ns3
|
||||
113
src/mobility/random-topology.h
Normal file
113
src/mobility/random-topology.h
Normal file
@@ -0,0 +1,113 @@
|
||||
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2007 INRIA
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
|
||||
*/
|
||||
#ifndef RANDOM_TOPOLOGY_H
|
||||
#define RANDOM_TOPOLOGY_H
|
||||
|
||||
#include "ns3/ptr.h"
|
||||
#include "ns3/object.h"
|
||||
#include "ns3/component-manager.h"
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
class RandomPosition;
|
||||
|
||||
/**
|
||||
* \brief layout objects randomly in 3d space.
|
||||
*
|
||||
* This assigns an initial position to each object
|
||||
* according to its position model and assigns
|
||||
* an instance of a mobility model to each object
|
||||
* according to its mobility model class id.
|
||||
*/
|
||||
class RandomTopology
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Create a default random topology based
|
||||
* on Bind configuration.
|
||||
*/
|
||||
RandomTopology ();
|
||||
/**
|
||||
* \param positionModel model to set the initial position
|
||||
* of each object.
|
||||
* \param mobilityModel type of mobility model to attach to each object.
|
||||
*
|
||||
* Create a random topology based on the
|
||||
* specified position and mobility models.
|
||||
*/
|
||||
RandomTopology (Ptr<RandomPosition> positionModel,
|
||||
ClassId mobilityModel);
|
||||
|
||||
~RandomTopology ();
|
||||
|
||||
/**
|
||||
* \param classId the type of mobility model attached to each
|
||||
* input object if it does not have one already.
|
||||
*/
|
||||
void SetMobilityModel (ClassId classId);
|
||||
/**
|
||||
* \param positionModel the position model used to initialize
|
||||
* the position of each object.
|
||||
*/
|
||||
void SetPositionModel (Ptr<RandomPosition> positionModel);
|
||||
|
||||
/**
|
||||
* \param object the object to layout
|
||||
*
|
||||
* Assign an initial position and a mobility model
|
||||
* to the object.
|
||||
*/
|
||||
void LayoutOne (Ptr<Object> object);
|
||||
|
||||
/**
|
||||
* \param begin iterator which identifies the first
|
||||
* object to configure.
|
||||
* \param end iterator which identifies the last
|
||||
* object to configure.
|
||||
*
|
||||
* Assign an initial position and a mobility model
|
||||
* to the objects.
|
||||
*/
|
||||
template <typename T>
|
||||
void Layout (const T &begin, const T &end);
|
||||
private:
|
||||
Ptr<RandomPosition> m_positionModel;
|
||||
ClassId m_mobilityModel;
|
||||
};
|
||||
|
||||
} // namespace ns3
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
template <typename T>
|
||||
void
|
||||
RandomTopology::Layout (const T &begin, const T &end)
|
||||
{
|
||||
for (T i = begin; i != end; i++)
|
||||
{
|
||||
LayoutOne (*i);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} // namespace ns3
|
||||
|
||||
#endif /* RANDOM_TOPOLOGY_H */
|
||||
93
src/mobility/rectangle-default-value.cc
Normal file
93
src/mobility/rectangle-default-value.cc
Normal file
@@ -0,0 +1,93 @@
|
||||
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2007 INRIA
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
|
||||
*/
|
||||
|
||||
#include "rectangle-default-value.h"
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
RectangleDefaultValue::RectangleDefaultValue (std::string name,
|
||||
std::string help,
|
||||
double xMin, double xMax,
|
||||
double yMin, double yMax)
|
||||
: DefaultValueBase (name, help),
|
||||
m_default (xMin, xMax, yMin, yMax),
|
||||
m_rectangle (xMin, xMax, yMin, yMax)
|
||||
{
|
||||
DefaultValueList::Add (this);
|
||||
}
|
||||
|
||||
Rectangle
|
||||
RectangleDefaultValue::GetValue (void) const
|
||||
{
|
||||
return m_rectangle;
|
||||
}
|
||||
double
|
||||
RectangleDefaultValue::ReadDouble (std::string str, bool &ok)
|
||||
{
|
||||
double value;
|
||||
std::istringstream iss;
|
||||
iss.str (str);
|
||||
iss >> value;
|
||||
if (iss.bad () || iss.fail ())
|
||||
{
|
||||
ok = false;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
bool
|
||||
RectangleDefaultValue::DoParseValue (const std::string &value)
|
||||
{
|
||||
std::string::size_type xMinStart = 0;
|
||||
std::string::size_type xMinEnd = value.find_first_of(":", xMinStart);
|
||||
std::string::size_type xMaxStart = xMinEnd + 1;
|
||||
std::string::size_type xMaxEnd = value.find_first_of(":", xMaxStart);
|
||||
std::string::size_type yMinStart = xMaxEnd + 1;
|
||||
std::string::size_type yMinEnd = value.find_first_of(":", yMinStart);
|
||||
std::string::size_type yMaxStart = yMinEnd + 1;
|
||||
std::string::size_type yMaxEnd = std::string::npos;
|
||||
|
||||
std::string xMinString = value.substr (xMinStart, xMinEnd);
|
||||
std::string xMaxString = value.substr (xMaxStart, xMaxEnd);
|
||||
std::string yMinString = value.substr (yMinStart, yMinEnd);
|
||||
std::string yMaxString = value.substr (yMaxStart, yMaxEnd);
|
||||
|
||||
bool ok = true;
|
||||
m_rectangle.xMin = ReadDouble (xMinString, ok);
|
||||
m_rectangle.yMin = ReadDouble (yMinString, ok);
|
||||
m_rectangle.xMax = ReadDouble (xMaxString, ok);
|
||||
m_rectangle.yMax = ReadDouble (yMaxString, ok);
|
||||
return ok;
|
||||
}
|
||||
std::string
|
||||
RectangleDefaultValue::DoGetType (void) const
|
||||
{
|
||||
return "(xMin:xMax:yMin:yMax)";
|
||||
}
|
||||
std::string
|
||||
RectangleDefaultValue::DoGetDefaultValue (void) const
|
||||
{
|
||||
std::ostringstream oss;
|
||||
oss << m_default.xMin << ":" << m_default.xMax << ":" << m_default.yMin << ":" << m_default.yMax;
|
||||
return oss.str ();
|
||||
}
|
||||
|
||||
|
||||
} // namespace ns3
|
||||
51
src/mobility/rectangle-default-value.h
Normal file
51
src/mobility/rectangle-default-value.h
Normal file
@@ -0,0 +1,51 @@
|
||||
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2007 INRIA
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
|
||||
*/
|
||||
#ifndef RECTANGLE_DEFAULT_VALUE_H
|
||||
#define RECTANGLE_DEFAULT_VALUE_H
|
||||
|
||||
#include <string>
|
||||
#include "ns3/default-value.h"
|
||||
#include "rectangle.h"
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
class RectangleDefaultValue : public DefaultValueBase
|
||||
{
|
||||
public:
|
||||
RectangleDefaultValue (std::string name,
|
||||
std::string help,
|
||||
double xMin, double xMax,
|
||||
double yMin, double yMax);
|
||||
|
||||
Rectangle GetValue (void) const;
|
||||
private:
|
||||
double ReadDouble (std::string str, bool &ok);
|
||||
virtual bool DoParseValue (const std::string &value);
|
||||
virtual std::string DoGetType (void) const;
|
||||
virtual std::string DoGetDefaultValue (void) const;
|
||||
|
||||
Rectangle m_default;
|
||||
Rectangle m_rectangle;
|
||||
};
|
||||
|
||||
} // namespace ns3
|
||||
|
||||
#endif /* RECTANGLE_DEFAULT_VALUE_H */
|
||||
123
src/mobility/rectangle.cc
Normal file
123
src/mobility/rectangle.cc
Normal file
@@ -0,0 +1,123 @@
|
||||
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2007 INRIA
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
|
||||
*/
|
||||
#include "rectangle.h"
|
||||
#include "position.h"
|
||||
#include "speed.h"
|
||||
#include "ns3/assert.h"
|
||||
#include <cmath>
|
||||
#include <algorithm>
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
Rectangle::Rectangle (double _xMin, double _xMax,
|
||||
double _yMin, double _yMax)
|
||||
: xMin (_xMin),
|
||||
xMax (_xMax),
|
||||
yMin (_yMin),
|
||||
yMax (_yMax)
|
||||
{}
|
||||
|
||||
Rectangle::Rectangle ()
|
||||
: xMin (0.0),
|
||||
xMax (0.0),
|
||||
yMin (0.0),
|
||||
yMax (0.0)
|
||||
{}
|
||||
|
||||
bool
|
||||
Rectangle::IsInside (const Position &position) const
|
||||
{
|
||||
return
|
||||
position.x <= xMax && position.x >= xMin &&
|
||||
position.y <= yMax && position.y >= yMin;
|
||||
}
|
||||
|
||||
Rectangle::Side
|
||||
Rectangle::GetClosestSide (const Position &position) const
|
||||
{
|
||||
double xMinDist = std::abs (position.x - xMin);
|
||||
double xMaxDist = std::abs (xMax - position.x);
|
||||
double yMinDist = std::abs (position.y - yMin);
|
||||
double yMaxDist = std::abs (yMax - position.y);
|
||||
double minX = std::min (xMinDist, xMaxDist);
|
||||
double minY = std::min (yMinDist, yMaxDist);
|
||||
if (minX < minY)
|
||||
{
|
||||
if (xMinDist < xMaxDist)
|
||||
{
|
||||
return LEFT;
|
||||
}
|
||||
else
|
||||
{
|
||||
return RIGHT;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (yMinDist < yMaxDist)
|
||||
{
|
||||
return BOTTOM;
|
||||
}
|
||||
else
|
||||
{
|
||||
return TOP;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Position
|
||||
Rectangle::CalculateIntersection (const Position ¤t, const Speed &speed) const
|
||||
{
|
||||
double xMaxY = current.y + (xMax - current.x) / speed.dx * speed.dy;
|
||||
double xMinY = current.y + (xMin - current.x) / speed.dx * speed.dy;
|
||||
double yMaxX = current.x + (yMax - current.y) / speed.dy * speed.dx;
|
||||
double yMinX = current.x + (yMin - current.y) / speed.dy * speed.dx;
|
||||
bool xMaxOk = xMaxY <= yMax && xMaxY >= yMin;
|
||||
bool xMinOk = xMinY <= yMax && xMinY >= yMin;
|
||||
bool yMaxOk = yMaxX <= xMax && yMaxX >= xMin;
|
||||
bool yMinOk = yMinX <= xMax && yMinX >= xMin;
|
||||
if (xMaxOk && speed.dx >= 0)
|
||||
{
|
||||
return Position (xMax, xMaxY, 0.0);
|
||||
}
|
||||
else if (xMinOk && speed.dx <= 0)
|
||||
{
|
||||
return Position (xMin, xMinY, 0.0);
|
||||
}
|
||||
else if (yMaxOk && speed.dy >= 0)
|
||||
{
|
||||
return Position (yMaxX, yMax, 0.0);
|
||||
}
|
||||
else if (yMinOk && speed.dy <= 0)
|
||||
{
|
||||
return Position (yMinX, yMin, 0.0);
|
||||
}
|
||||
else
|
||||
{
|
||||
NS_ASSERT (false);
|
||||
// quiet compiler
|
||||
return Position (0.0, 0.0, 0.0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
} // namespace ns3
|
||||
67
src/mobility/rectangle.h
Normal file
67
src/mobility/rectangle.h
Normal file
@@ -0,0 +1,67 @@
|
||||
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2007 INRIA
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
|
||||
*/
|
||||
#ifndef RECTANGLE_H
|
||||
#define RECTANGLE_H
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
class Position;
|
||||
class Speed;
|
||||
|
||||
/**
|
||||
* \brief a 2d rectangle
|
||||
*/
|
||||
class Rectangle
|
||||
{
|
||||
public:
|
||||
enum Side {
|
||||
RIGHT,
|
||||
LEFT,
|
||||
TOP,
|
||||
BOTTOM
|
||||
};
|
||||
/**
|
||||
* \param _xMin x coordinates of left boundary.
|
||||
* \param _xMax x coordinates of right boundary.
|
||||
* \param _yMin y coordinates of bottom boundary.
|
||||
* \param _yMax y coordinates of top boundary.
|
||||
*
|
||||
* Create a rectangle.
|
||||
*/
|
||||
Rectangle (double _xMin, double _xMax,
|
||||
double _yMin, double _yMax);
|
||||
/**
|
||||
* Create a zero-sized rectangle located at coordinates (0.0,0.0)
|
||||
*/
|
||||
Rectangle ();
|
||||
bool IsInside (const Position &position) const;
|
||||
Side GetClosestSide (const Position &position) const;
|
||||
Position CalculateIntersection (const Position ¤t, const Speed &speed) const;
|
||||
|
||||
double xMin;
|
||||
double xMax;
|
||||
double yMin;
|
||||
double yMax;
|
||||
};
|
||||
|
||||
} // namespace ns3
|
||||
|
||||
#endif /* RECTANGLE_H */
|
||||
17
src/mobility/speed.cc
Normal file
17
src/mobility/speed.cc
Normal file
@@ -0,0 +1,17 @@
|
||||
#include "speed.h"
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
Speed::Speed (double _dx, double _dy, double _dz)
|
||||
: dx (_dx),
|
||||
dy (_dy),
|
||||
dz (_dz)
|
||||
{}
|
||||
|
||||
Speed::Speed ()
|
||||
: dx (0.0),
|
||||
dy (0.0),
|
||||
dz (0.0)
|
||||
{}
|
||||
|
||||
} // namespace ns3
|
||||
42
src/mobility/speed.h
Normal file
42
src/mobility/speed.h
Normal file
@@ -0,0 +1,42 @@
|
||||
#ifndef SPEED_H
|
||||
#define SPEED_H
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
/**
|
||||
* \brief keep track of 3d cartesian speed vectors
|
||||
*
|
||||
* Unit is meters/s.
|
||||
*/
|
||||
class Speed
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* \param _dx x coordinate of speed vector
|
||||
* \param _dy y coordinate of speed vector
|
||||
* \param _dz z coordinate of speed vector
|
||||
*
|
||||
* Create speed vector (_dx, _dy, _dz)
|
||||
*/
|
||||
Speed (double _dx, double _dy, double _dz);
|
||||
/**
|
||||
* Create speed vector (0.0, 0.0, 0.0)
|
||||
*/
|
||||
Speed ();
|
||||
/**
|
||||
* x coordinate of speed vector
|
||||
*/
|
||||
double dx;
|
||||
/**
|
||||
* y coordinate of speed vector
|
||||
*/
|
||||
double dy;
|
||||
/**
|
||||
* z coordinate of speed vector
|
||||
*/
|
||||
double dz;
|
||||
};
|
||||
|
||||
} // namespace ns3
|
||||
|
||||
#endif /* SPEED_H */
|
||||
57
src/mobility/static-mobility-model.cc
Normal file
57
src/mobility/static-mobility-model.cc
Normal file
@@ -0,0 +1,57 @@
|
||||
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2006 INRIA
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
|
||||
*/
|
||||
#include "static-mobility-model.h"
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
const ClassId StaticMobilityModel::cid = MakeClassId<StaticMobilityModel> ("StaticMobilityModel",
|
||||
MobilityModel::iid);
|
||||
|
||||
StaticMobilityModel::StaticMobilityModel ()
|
||||
{
|
||||
SetInterfaceId (StaticMobilityModel::iid);
|
||||
}
|
||||
StaticMobilityModel::StaticMobilityModel (const Position &position)
|
||||
: m_position (position)
|
||||
{
|
||||
SetInterfaceId (StaticMobilityModel::iid);
|
||||
}
|
||||
StaticMobilityModel::~StaticMobilityModel ()
|
||||
{}
|
||||
|
||||
Position
|
||||
StaticMobilityModel::DoGet (void) const
|
||||
{
|
||||
return m_position;
|
||||
}
|
||||
void
|
||||
StaticMobilityModel::DoSet (const Position &position)
|
||||
{
|
||||
m_position = position;
|
||||
NotifyCourseChange ();
|
||||
}
|
||||
Speed
|
||||
StaticMobilityModel::DoGetSpeed (void) const
|
||||
{
|
||||
return Speed ();
|
||||
}
|
||||
|
||||
}; // namespace ns3
|
||||
61
src/mobility/static-mobility-model.h
Normal file
61
src/mobility/static-mobility-model.h
Normal file
@@ -0,0 +1,61 @@
|
||||
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2006,2007 INRIA
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
|
||||
*/
|
||||
#ifndef STATIC_MOBILITY_MODEL_H
|
||||
#define STATIC_MOBILITY_MODEL_H
|
||||
|
||||
#include "ns3/component-manager.h"
|
||||
#include "mobility-model.h"
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
/**
|
||||
* \brief a position model for which the current position does not
|
||||
* change once it has been set and until it is set again
|
||||
* explicitely to a new value.
|
||||
*/
|
||||
class StaticMobilityModel : public MobilityModel
|
||||
{
|
||||
public:
|
||||
static const ClassId cid;
|
||||
/**
|
||||
* Create a position located at coordinates (0,0,0)
|
||||
*/
|
||||
StaticMobilityModel ();
|
||||
/**
|
||||
* \param position the initial position.
|
||||
*
|
||||
* Create a position located at coordinates (x,y,z).
|
||||
* Unit is meters
|
||||
*/
|
||||
StaticMobilityModel (const Position &position);
|
||||
virtual ~StaticMobilityModel ();
|
||||
|
||||
private:
|
||||
virtual Position DoGet (void) const;
|
||||
virtual void DoSet (const Position &position);
|
||||
virtual Speed DoGetSpeed (void) const;
|
||||
|
||||
Position m_position;
|
||||
};
|
||||
|
||||
}; // namespace ns3
|
||||
|
||||
#endif /* STATIC_MOBILITY_MODEL_H */
|
||||
100
src/mobility/static-speed-helper.cc
Normal file
100
src/mobility/static-speed-helper.cc
Normal file
@@ -0,0 +1,100 @@
|
||||
#include "ns3/simulator.h"
|
||||
#include "ns3/rectangle.h"
|
||||
#include "static-speed-helper.h"
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
StaticSpeedHelper::StaticSpeedHelper ()
|
||||
{}
|
||||
StaticSpeedHelper::StaticSpeedHelper (const Position &position)
|
||||
: m_position (position)
|
||||
{}
|
||||
StaticSpeedHelper::StaticSpeedHelper (const Position &position,
|
||||
const Speed &speed)
|
||||
: m_position (position),
|
||||
m_speed (speed)
|
||||
{}
|
||||
void
|
||||
StaticSpeedHelper::InitializePosition (const Position &position)
|
||||
{
|
||||
m_position = position;
|
||||
m_speed.dx = 0.0;
|
||||
m_speed.dy = 0.0;
|
||||
m_speed.dz = 0.0;
|
||||
m_lastUpdate = Simulator::Now ();
|
||||
m_pauseEnd = Simulator::Now ();
|
||||
}
|
||||
|
||||
void
|
||||
StaticSpeedHelper::Reset (const Speed &speed, const Time &pauseDelay)
|
||||
{
|
||||
Reset (speed);
|
||||
m_pauseEnd = Simulator::Now () + pauseDelay;
|
||||
}
|
||||
|
||||
Position
|
||||
StaticSpeedHelper::GetCurrentPosition (void) const
|
||||
{
|
||||
Update ();
|
||||
return m_position;
|
||||
}
|
||||
|
||||
Speed
|
||||
StaticSpeedHelper::GetSpeed (void) const
|
||||
{
|
||||
return m_speed;
|
||||
}
|
||||
void
|
||||
StaticSpeedHelper::SetSpeed (const Speed &speed)
|
||||
{
|
||||
Update ();
|
||||
m_speed = speed;
|
||||
}
|
||||
|
||||
void
|
||||
StaticSpeedHelper::Update (void) const
|
||||
{
|
||||
Time now = Simulator::Now ();
|
||||
if (m_pauseEnd > now)
|
||||
{
|
||||
return;
|
||||
}
|
||||
Time last = std::max (now, m_pauseEnd);
|
||||
if (m_lastUpdate >= last)
|
||||
{
|
||||
return;
|
||||
}
|
||||
Time deltaTime = now - last;
|
||||
m_lastUpdate = now;
|
||||
double deltaS = deltaTime.GetSeconds ();
|
||||
m_position.x += m_speed.dx * deltaS;
|
||||
m_position.y += m_speed.dy * deltaS;
|
||||
m_position.z += m_speed.dz * deltaS;
|
||||
}
|
||||
|
||||
void
|
||||
StaticSpeedHelper::Reset (const Speed &speed)
|
||||
{
|
||||
Update ();
|
||||
m_speed = speed;
|
||||
m_pauseEnd = Simulator::Now ();
|
||||
}
|
||||
void
|
||||
StaticSpeedHelper::UpdateFull (const Rectangle &bounds) const
|
||||
{
|
||||
Update ();
|
||||
m_position.x = std::min (bounds.xMax, m_position.x);
|
||||
m_position.x = std::max (bounds.xMin, m_position.x);
|
||||
m_position.y = std::min (bounds.yMax, m_position.y);
|
||||
m_position.y = std::max (bounds.yMin, m_position.y);
|
||||
}
|
||||
|
||||
Position
|
||||
StaticSpeedHelper::GetCurrentPosition (const Rectangle &bounds) const
|
||||
{
|
||||
UpdateFull (bounds);
|
||||
return m_position;
|
||||
}
|
||||
|
||||
|
||||
} // namespace ns3
|
||||
39
src/mobility/static-speed-helper.h
Normal file
39
src/mobility/static-speed-helper.h
Normal file
@@ -0,0 +1,39 @@
|
||||
#ifndef STATIC_SPEED_HELPER_H
|
||||
#define STATIC_SPEED_HELPER_H
|
||||
|
||||
#include "ns3/nstime.h"
|
||||
#include "position.h"
|
||||
#include "speed.h"
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
class Rectangle;
|
||||
|
||||
class StaticSpeedHelper
|
||||
{
|
||||
public:
|
||||
StaticSpeedHelper ();
|
||||
StaticSpeedHelper (const Position &position);
|
||||
StaticSpeedHelper (const Position &position,
|
||||
const Speed &speed);
|
||||
void InitializePosition (const Position &position);
|
||||
|
||||
void Reset (const Speed &speed, const Time &pauseDelay);
|
||||
void Reset (const Speed &speed);
|
||||
Position GetCurrentPosition (const Rectangle &bounds) const;
|
||||
Position GetCurrentPosition (void) const;
|
||||
Speed GetSpeed (void) const;
|
||||
void SetSpeed (const Speed &speed);
|
||||
|
||||
private:
|
||||
void Update (void) const;
|
||||
void UpdateFull (const Rectangle &rectangle) const;
|
||||
mutable Time m_lastUpdate;
|
||||
mutable Position m_position;
|
||||
Speed m_speed;
|
||||
Time m_pauseEnd;
|
||||
};
|
||||
|
||||
} // namespace ns3
|
||||
|
||||
#endif /* STATIC_SPEED_HELPER_H */
|
||||
77
src/mobility/static-speed-mobility-model.cc
Normal file
77
src/mobility/static-speed-mobility-model.cc
Normal file
@@ -0,0 +1,77 @@
|
||||
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2006, 2007 INRIA
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
|
||||
*/
|
||||
#include "static-speed-mobility-model.h"
|
||||
#include "ns3/simulator.h"
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
const InterfaceId StaticSpeedMobilityModel::iid =
|
||||
MakeInterfaceId ("StaticSpeedMobilityModel", MobilityModel::iid);
|
||||
const ClassId StaticSpeedMobilityModel::cid =
|
||||
MakeClassId<StaticSpeedMobilityModel> ("StaticSpeedMobilityModel",
|
||||
StaticSpeedMobilityModel::iid);
|
||||
|
||||
|
||||
StaticSpeedMobilityModel::StaticSpeedMobilityModel ()
|
||||
{
|
||||
SetInterfaceId (StaticSpeedMobilityModel::iid);
|
||||
}
|
||||
StaticSpeedMobilityModel::StaticSpeedMobilityModel (const Position &position)
|
||||
: m_helper (position)
|
||||
{
|
||||
SetInterfaceId (StaticSpeedMobilityModel::iid);
|
||||
}
|
||||
StaticSpeedMobilityModel::StaticSpeedMobilityModel (const Position &position,
|
||||
const Speed &speed)
|
||||
: m_helper (position, speed)
|
||||
{
|
||||
SetInterfaceId (StaticSpeedMobilityModel::iid);
|
||||
}
|
||||
|
||||
StaticSpeedMobilityModel::~StaticSpeedMobilityModel ()
|
||||
{}
|
||||
|
||||
void
|
||||
StaticSpeedMobilityModel::SetSpeed (const Speed speed)
|
||||
{
|
||||
m_helper.SetSpeed (speed);
|
||||
NotifyCourseChange ();
|
||||
}
|
||||
|
||||
|
||||
Position
|
||||
StaticSpeedMobilityModel::DoGet (void) const
|
||||
{
|
||||
return m_helper.GetCurrentPosition ();
|
||||
}
|
||||
void
|
||||
StaticSpeedMobilityModel::DoSet (const Position &position)
|
||||
{
|
||||
m_helper.InitializePosition (position);
|
||||
NotifyCourseChange ();
|
||||
}
|
||||
Speed
|
||||
StaticSpeedMobilityModel::DoGetSpeed (void) const
|
||||
{
|
||||
return m_helper.GetSpeed ();
|
||||
}
|
||||
|
||||
}; // namespace ns3
|
||||
80
src/mobility/static-speed-mobility-model.h
Normal file
80
src/mobility/static-speed-mobility-model.h
Normal file
@@ -0,0 +1,80 @@
|
||||
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2006, 2007 INRIA
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
|
||||
*/
|
||||
#ifndef STATIC_SPEED_MOBILITY_MODEL_H
|
||||
#define STATIC_SPEED_MOBILITY_MODEL_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include "mobility-model.h"
|
||||
#include "ns3/nstime.h"
|
||||
#include "ns3/component-manager.h"
|
||||
#include "static-speed-helper.h"
|
||||
#include "speed.h"
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
/**
|
||||
* \brief a position model for which the current speed does not
|
||||
* change once it has been set and until it is set again
|
||||
* explicitely to a new value.
|
||||
*/
|
||||
class StaticSpeedMobilityModel : public MobilityModel
|
||||
{
|
||||
public:
|
||||
static const InterfaceId iid;
|
||||
static const ClassId cid;
|
||||
/**
|
||||
* Create position located at coordinates (0,0,0) with
|
||||
* speed (0,0,0).
|
||||
*/
|
||||
StaticSpeedMobilityModel ();
|
||||
/**
|
||||
* Create a position located at coordinates (x,y,z) with
|
||||
* speed (0,0,0).
|
||||
*/
|
||||
StaticSpeedMobilityModel (const Position &position);
|
||||
/**
|
||||
*
|
||||
* Create a position located at coordinates (x,y,z) with
|
||||
* speed (dx,dy,dz).
|
||||
* Unit is meters and meters/s
|
||||
*/
|
||||
StaticSpeedMobilityModel (const Position &position,
|
||||
const Speed &speed);
|
||||
virtual ~StaticSpeedMobilityModel ();
|
||||
|
||||
/**
|
||||
* \param speed the new speed to set.
|
||||
*
|
||||
* Set the current speed now to (dx,dy,dz)
|
||||
* Unit is meters/s
|
||||
*/
|
||||
void SetSpeed (const Speed speed);
|
||||
private:
|
||||
virtual Position DoGet (void) const;
|
||||
virtual void DoSet (const Position &position);
|
||||
virtual Speed DoGetSpeed (void) const;
|
||||
void Update (void) const;
|
||||
StaticSpeedHelper m_helper;
|
||||
};
|
||||
|
||||
}; // namespace ns3
|
||||
|
||||
#endif /* STATIC_SPEED_POSITION */
|
||||
40
src/mobility/wscript
Normal file
40
src/mobility/wscript
Normal file
@@ -0,0 +1,40 @@
|
||||
## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
|
||||
|
||||
def build(bld):
|
||||
mobility = bld.create_obj('cpp', 'shlib')
|
||||
mobility.name = 'ns3-mobility'
|
||||
mobility.target = mobility.name
|
||||
mobility.uselib_local = ['ns3-core', 'ns3-simulator']
|
||||
mobility.source = [
|
||||
'grid-topology.cc',
|
||||
'hierarchical-mobility-model.cc',
|
||||
'mobility-model.cc',
|
||||
'mobility-model-notifier.cc',
|
||||
'position.cc',
|
||||
'random-position.cc',
|
||||
'random-topology.cc',
|
||||
'rectangle.cc',
|
||||
'rectangle-default-value.cc',
|
||||
'speed.cc',
|
||||
'static-mobility-model.cc',
|
||||
'static-speed-helper.cc',
|
||||
'static-speed-mobility-model.cc',
|
||||
]
|
||||
mobility.includes = '.'
|
||||
|
||||
headers = bld.create_obj('ns3header')
|
||||
headers.source = [
|
||||
'grid-topology.h',
|
||||
'hierarchical-mobility-model.h',
|
||||
'mobility-model.h',
|
||||
'mobility-model-notifier.h',
|
||||
'position.h',
|
||||
'random-position.h',
|
||||
'random-topology.h',
|
||||
'rectangle.h',
|
||||
'rectangle-default-value.h',
|
||||
'speed.h',
|
||||
'static-mobility-model.h',
|
||||
'static-speed-helper.h',
|
||||
'static-speed-mobility-model.h',
|
||||
]
|
||||
@@ -17,6 +17,7 @@ all_modules = [
|
||||
'internet-node',
|
||||
'devices/p2p',
|
||||
'applications',
|
||||
'mobility',
|
||||
]
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user