|
INET Framework for OMNeT++/OMNEST
|
Abstract base class for all mobility modules. More...
#include <BasicMobility.h>
Public Types | |
| enum | BorderPolicy { REFLECT, WRAP, PLACERANDOMLY, RAISEERROR } |
Protected Member Functions | |
| virtual void | handleMessage (cMessage *msg) |
| This modules should only receive self-messages. | |
| virtual void | initialize (int) |
| Initializes mobility model parameters. | |
| virtual void | finish () |
| Delete dynamically allocated objects. | |
| virtual void | handleSelfMsg (cMessage *msg)=0 |
| Called upon arrival of a self messages. | |
| virtual void | updatePosition () |
| Update the position information for this node. | |
| virtual double | getPlaygroundSizeX () const |
| Returns the width of the playground. | |
| virtual double | getPlaygroundSizeY () const |
| Returns the height of the playground. | |
| virtual Coord | getRandomPosition () |
| Get a new random position for the host. | |
| virtual void | reflectIfOutside (Coord &targetPos, Coord &step, double &angle) |
| Utility function to reflect the node if it goes outside the playground. | |
| virtual void | wrapIfOutside (Coord &targetPos) |
| Utility function to wrap the node to the opposite edge (torus) if it goes outside the playground. | |
| virtual void | placeRandomlyIfOutside (Coord &targetPos) |
| Utility function to place the node randomly if it goes outside the playground. | |
| virtual void | raiseErrorIfOutside () |
| Utility function to raise an error if the node gets outside the playground. | |
| virtual void | handleIfOutside (BorderPolicy policy, Coord &targetPos, Coord &step, double &angle) |
| Invokes one of reflectIfOutside(), wrapIfOutside() and placeRandomlyIfOutside(), depending on the given border policy. | |
Protected Attributes | |
| ChannelControl * | cc |
| Pointer to ChannelControl -- these two must know each other. | |
| ChannelControl::HostRef | myHostRef |
| Identifies this host in the ChannelControl module. | |
| cModule * | hostPtr |
| Pointer to host module, to speed up repeated access. | |
| Coord | pos |
| Stores the actual position of the host. | |
Abstract base class for all mobility modules.
Subclasses are expected to redefine handleSelfMsg() to update the position and schedule the time of the next position update, and initialize() to read parameters and schedule the first position update.
BasicMobility provides random placement of hosts and display updates as well as registering with the ChannelControl module. Change notifications about position changes are also posted to NotificationBoard.
Definition at line 49 of file BasicMobility.h.
Selects how a node should behave if it reaches the edge of the playground.
| REFLECT |
reflect off the wall |
| WRAP |
reappear at the opposite edge (torus) |
| PLACERANDOMLY |
placed at a randomly chosen position on the blackboard |
| RAISEERROR |
stop the simulation with error |
Definition at line 56 of file BasicMobility.h.
{
REFLECT,
WRAP,
PLACERANDOMLY,
RAISEERROR
};
| virtual void BasicMobility::finish | ( | ) | [inline, protected, virtual] |
| virtual double BasicMobility::getPlaygroundSizeX | ( | ) | const [inline, protected, virtual] |
Returns the width of the playground.
Definition at line 101 of file BasicMobility.h.
Referenced by TurtleMobility::getValue(), placeRandomlyIfOutside(), raiseErrorIfOutside(), reflectIfOutside(), and wrapIfOutside().
| virtual double BasicMobility::getPlaygroundSizeY | ( | ) | const [inline, protected, virtual] |
Returns the height of the playground.
Definition at line 104 of file BasicMobility.h.
Referenced by TurtleMobility::getValue(), placeRandomlyIfOutside(), raiseErrorIfOutside(), reflectIfOutside(), and wrapIfOutside().
| Coord BasicMobility::getRandomPosition | ( | ) | [protected, virtual] |
Get a new random position for the host.
You can redefine this function if you want to use another calculation
Definition at line 115 of file BasicMobility.cc.
Referenced by placeRandomlyIfOutside(), RandomWPMobility::setTargetPosition(), and ConstSpeedMobility::setTargetPosition().
| void BasicMobility::handleIfOutside | ( | BorderPolicy | policy, |
| Coord & | targetPos, | ||
| Coord & | step, | ||
| double & | angle | ||
| ) | [protected, virtual] |
Invokes one of reflectIfOutside(), wrapIfOutside() and placeRandomlyIfOutside(), depending on the given border policy.
Definition at line 198 of file BasicMobility.cc.
Referenced by TurtleMobility::fixIfHostGetsOutside(), LinearMobility::move(), and MassMobility::move().
{
switch (policy)
{
case REFLECT: reflectIfOutside(targetPos, step, angle); break;
case WRAP: wrapIfOutside(targetPos); break;
case PLACERANDOMLY: placeRandomlyIfOutside(targetPos); break;
case RAISEERROR: raiseErrorIfOutside(); break;
}
}
| void BasicMobility::handleMessage | ( | cMessage * | msg | ) | [protected, virtual] |
This modules should only receive self-messages.
Definition at line 87 of file BasicMobility.cc.
{
if (!msg->isSelfMessage())
error("mobility modules can only receive self messages");
handleSelfMsg(msg);
}
| virtual void BasicMobility::handleSelfMsg | ( | cMessage * | msg | ) | [protected, pure virtual] |
Called upon arrival of a self messages.
Implemented in ConstSpeedMobility, MassMobility, LineSegmentsMobilityBase, CircleMobility, RectangleMobility, LinearMobility, and NullMobility.
Referenced by handleMessage().
| void BasicMobility::initialize | ( | int | stage | ) | [protected, virtual] |
Initializes mobility model parameters.
Reimplemented from BasicModule.
Reimplemented in ConstSpeedMobility, MassMobility, LineSegmentsMobilityBase, CircleMobility, TurtleMobility, RectangleMobility, ANSimMobility, BonnMotionMobility, LinearMobility, and RandomWPMobility.
Definition at line 39 of file BasicMobility.cc.
{
BasicModule::initialize(stage);
EV << "initializing BasicMobility stage " << stage << endl;
if (stage == 0)
{
cc = ChannelControl::get();
// get a pointer to the host
hostPtr = findHost();
myHostRef = cc->registerHost(hostPtr, Coord());
}
else if (stage == 1)
{
// playground size gets set up by ChannelControl in stage==0 (Andras)
// read the playgroundsize from ChannelControl
Coord pgs = cc->getPgs();
// reading the coordinates from omnetpp.ini makes predefined scenarios a lot easier
// -1 indicates start at display string position, or random position if it's not present
pos.x = pos.y = -1;
if (hasPar("x")) // not all mobility models have an "x" parameter
pos.x = par("x");
if (pos.x == -1)
pos.x = parseInt(hostPtr->getDisplayString().getTagArg("p",0), -1);
if (pos.x == -1)
pos.x = uniform(0, pgs.x);
if (hasPar("y")) // not all mobility models have an "y" parameter
pos.y = par("y");
if (pos.y == -1)
pos.y = parseInt(hostPtr->getDisplayString().getTagArg("p",1), -1);
if (pos.y == -1)
pos.y = uniform(0, pgs.y);
// check validity of position
if (pos.x < 0 || pos.y < 0 || pos.x >= pgs.x || pos.y >= pgs.y)
error("node position (%d,%d) is outside the playground", pos.x, pos.y);
// adjusting the display string is no longer needed (Andras)
// print new host position on the screen and update bb info
updatePosition();
}
}
| void BasicMobility::placeRandomlyIfOutside | ( | Coord & | targetPos | ) | [protected, virtual] |
Utility function to place the node randomly if it goes outside the playground.
Decision is made on pos, but targetPos will also be updated. (Pass a dummy you don't have it).
Definition at line 179 of file BasicMobility.cc.
Referenced by handleIfOutside().
{
if (pos.x<0 || pos.x>=getPlaygroundSizeX() || pos.y<0 || pos.y>=getPlaygroundSizeY())
{
Coord newPos = getRandomPosition();
targetPos += newPos - pos;
pos = newPos;
}
}
| void BasicMobility::raiseErrorIfOutside | ( | ) | [protected, virtual] |
Utility function to raise an error if the node gets outside the playground.
Definition at line 189 of file BasicMobility.cc.
Referenced by RandomWPMobility::fixIfHostGetsOutside(), BonnMotionMobility::fixIfHostGetsOutside(), ANSimMobility::fixIfHostGetsOutside(), and handleIfOutside().
{
if (pos.x<0 || pos.x>=getPlaygroundSizeX() || pos.y<0 || pos.y>=getPlaygroundSizeY())
{
error("node moved outside the playground of size %gx%g (x=%g,y=%g)",
getPlaygroundSizeX(), getPlaygroundSizeY(), pos.x, pos.y);
}
}
| void BasicMobility::reflectIfOutside | ( | Coord & | targetPos, |
| Coord & | step, | ||
| double & | angle | ||
| ) | [protected, virtual] |
Utility function to reflect the node if it goes outside the playground.
Decision is made on pos, but the variables passed as args will also be updated. (Pass dummies you don't have some of them).
Definition at line 123 of file BasicMobility.cc.
Referenced by handleIfOutside().
{
if (pos.x < 0)
{
pos.x = -pos.x;
targetPos.x = -targetPos.x;
step.x = -step.x;
angle = 180 - angle;
}
else if (pos.x >= getPlaygroundSizeX())
{
pos.x = 2*getPlaygroundSizeX() - pos.x;
targetPos.x = 2*getPlaygroundSizeX() - targetPos.x;
step.x = -step.x;
angle = 180 - angle;
}
if (pos.y < 0)
{
pos.y = -pos.y;
targetPos.y = -targetPos.y;
step.y = -step.y;
angle = -angle;
}
else if (pos.y >= getPlaygroundSizeY())
{
pos.y = 2*getPlaygroundSizeY() - pos.y;
targetPos.y = 2*getPlaygroundSizeY() - targetPos.y;
step.y = -step.y;
angle = -angle;
}
}
| void BasicMobility::updatePosition | ( | ) | [protected, virtual] |
Update the position information for this node.
This function tells NotificationBoard that the position has changed, and it also moves the host's icon to the new position on the screen.
This function has to be called every time the position of the host changes!
Definition at line 96 of file BasicMobility.cc.
Referenced by LinearMobility::handleSelfMsg(), RectangleMobility::handleSelfMsg(), CircleMobility::handleSelfMsg(), LineSegmentsMobilityBase::handleSelfMsg(), MassMobility::handleSelfMsg(), ConstSpeedMobility::handleSelfMsg(), ANSimMobility::initialize(), BonnMotionMobility::initialize(), RectangleMobility::initialize(), CircleMobility::initialize(), TurtleMobility::initialize(), and initialize().
{
cc->updateHostPosition(myHostRef, pos);
if (ev.isGUI())
{
double r = cc->getCommunicationRange(myHostRef);
hostPtr->getDisplayString().setTagArg("p", 0, (long) pos.x);
hostPtr->getDisplayString().setTagArg("p", 1, (long) pos.y);
hostPtr->getDisplayString().setTagArg("r", 0, (long) r);
}
nb->fireChangeNotification(NF_HOSTPOSITION_UPDATED, &pos);
}
| void BasicMobility::wrapIfOutside | ( | Coord & | targetPos | ) | [protected, virtual] |
Utility function to wrap the node to the opposite edge (torus) if it goes outside the playground.
Decision is made on pos, but targetPos will also be updated. (Pass a dummy you don't have it).
Definition at line 155 of file BasicMobility.cc.
Referenced by handleIfOutside().
{
if (pos.x < 0)
{
pos.x += getPlaygroundSizeX();
targetPos.x += getPlaygroundSizeX();
}
else if (pos.x >= getPlaygroundSizeX())
{
pos.x -= getPlaygroundSizeX();
targetPos.x -= getPlaygroundSizeX();
}
if (pos.y < 0)
{
pos.y += getPlaygroundSizeY();
targetPos.y += getPlaygroundSizeY();
}
else if (pos.y >= getPlaygroundSizeY())
{
pos.y -= getPlaygroundSizeY();
targetPos.y -= getPlaygroundSizeY();
}
}
ChannelControl* BasicMobility::cc [protected] |
Pointer to ChannelControl -- these two must know each other.
Definition at line 65 of file BasicMobility.h.
Referenced by getRandomPosition(), initialize(), and updatePosition().
cModule* BasicMobility::hostPtr [protected] |
Pointer to host module, to speed up repeated access.
Definition at line 71 of file BasicMobility.h.
Referenced by initialize(), and updatePosition().
ChannelControl::HostRef BasicMobility::myHostRef [protected] |
Identifies this host in the ChannelControl module.
Definition at line 68 of file BasicMobility.h.
Referenced by initialize(), and updatePosition().
Coord BasicMobility::pos [protected] |
Stores the actual position of the host.
Definition at line 74 of file BasicMobility.h.
Referenced by LineSegmentsMobilityBase::beginNextMove(), RectangleMobility::calculateXY(), TurtleMobility::executeStatement(), TurtleMobility::getValue(), LineSegmentsMobilityBase::handleSelfMsg(), BonnMotionMobility::initialize(), ANSimMobility::initialize(), CircleMobility::initialize(), TurtleMobility::initialize(), LineSegmentsMobilityBase::initialize(), initialize(), LinearMobility::move(), RectangleMobility::move(), CircleMobility::move(), MassMobility::move(), ConstSpeedMobility::move(), placeRandomlyIfOutside(), raiseErrorIfOutside(), reflectIfOutside(), RandomWPMobility::setTargetPosition(), ConstSpeedMobility::setTargetPosition(), updatePosition(), and wrapIfOutside().