|
INET Framework for OMNeT++/OMNEST
|
Uses the <position_change> elements of the ANSim tool's trace file. See NED file for more info. More...
#include <ANSimMobility.h>
Protected Member Functions | |
| virtual void | initialize (int) |
| Initializes mobility model parameters. | |
| virtual void | setTargetPosition () |
| Overridden from LineSegmentsMobilityBase. | |
| virtual void | extractDataFrom (cXMLElement *node) |
| Utility: extract data from given <position_update> element. | |
| virtual void | fixIfHostGetsOutside () |
| Overridden from LineSegmentsMobilityBase. | |
Protected Attributes | |
| int | nodeId |
| we'll have to compare this to the <node_id> elements | |
| cXMLElement * | nextPosChange |
| points to the next <position_change> element | |
Uses the <position_change> elements of the ANSim tool's trace file. See NED file for more info.
| void ANSimMobility::extractDataFrom | ( | cXMLElement * | node | ) | [protected, virtual] |
Utility: extract data from given <position_update> element.
Referenced by setTargetPosition().
{
// extract data from <position_update> element
// FIXME start_time has to be taken into account too! as pause from prev element's end_time
const char *startTimeStr = firstChildWithTag(node, "start_time")->getNodeValue();
const char *endTimeStr = firstChildWithTag(node, "end_time")->getNodeValue();
cXMLElement *destElem = firstChildWithTag(node, "destination");
const char *xStr = firstChildWithTag(destElem, "xpos")->getNodeValue();
const char *yStr = firstChildWithTag(destElem, "ypos")->getNodeValue();
if (!endTimeStr || !xStr || !yStr)
error("no content in <end_time>, <destination>/<xpos> or <ypos> element at %s", node->getSourceLocation());
targetTime = atof(endTimeStr);
targetPos.x = atof(xStr);
targetPos.y = atof(yStr);
}
| void ANSimMobility::fixIfHostGetsOutside | ( | ) | [protected, virtual] |
Overridden from LineSegmentsMobilityBase.
Implements LineSegmentsMobilityBase.
{
raiseErrorIfOutside();
}
| void ANSimMobility::initialize | ( | int | stage | ) | [protected, virtual] |
Initializes mobility model parameters.
Reimplemented from LineSegmentsMobilityBase.
{
LineSegmentsMobilityBase::initialize(stage);
EV << "initializing ANSimMobility stage " << stage << endl;
if (stage == 1)
{
nodeId = par("nodeId");
if (nodeId == -1)
nodeId = getParentModule()->getIndex();
// get script: param should point to <simulation> element
cXMLElement *rootElem = par("ansimTrace");
if (strcmp(rootElem->getTagName(),"simulation")!=0)
error("ansimTrace: <simulation> is expected as root element not <%s> at %s",
rootElem->getTagName(), rootElem->getSourceLocation());
nextPosChange = rootElem->getElementByPath("mobility/position_change");
if (!nextPosChange)
error("element doesn't have <mobility> child or <position_change> grandchild at %s",
rootElem->getSourceLocation());
// set initial position;
setTargetPosition();
pos = targetPos;
updatePosition();
}
}
| void ANSimMobility::setTargetPosition | ( | ) | [protected, virtual] |
Overridden from LineSegmentsMobilityBase.
Implements LineSegmentsMobilityBase.
Referenced by initialize().
{
// find next <position_update> element with matching <node_id> tag (current one also OK)
while (nextPosChange)
{
const char *nodeIdStr = firstChildWithTag(nextPosChange, "node_id")->getNodeValue();
if (nodeIdStr && atoi(nodeIdStr)==nodeId)
break;
nextPosChange = nextPosChange->getNextSibling();
}
if (!nextPosChange)
{
stationary = true;
return;
}
// extract data from it
extractDataFrom(nextPosChange);
// skip this one
nextPosChange = nextPosChange->getNextSibling();
}
cXMLElement* ANSimMobility::nextPosChange [protected] |
points to the next <position_change> element
Referenced by initialize(), and setTargetPosition().
int ANSimMobility::nodeId [protected] |
we'll have to compare this to the <node_id> elements
Referenced by initialize(), and setTargetPosition().