ConstSpeedMobility.cc

00001 /***************************************************************************
00002  * file:        ConstSpeedMobility.cc
00003  *
00004  * author:      Steffen Sroka
00005  *
00006  * copyright:   (C) 2004 Telecommunication Networks Group (TKN) at
00007  *              Technische Universitaet Berlin, Germany.
00008  *
00009  *              This program is free software; you can redistribute it
00010  *              and/or modify it under the terms of the GNU General Public
00011  *              License as published by the Free Software Foundation; either
00012  *              version 2 of the License, or (at your option) any later
00013  *              version.
00014  *              For further information see file COPYING
00015  *              in the top level directory
00016  ***************************************************************************
00017  * part of:     framework implementation developed by tkn
00018  **************************************************************************/
00019 
00020 
00021 #include "ConstSpeedMobility.h"
00022 
00023 #include <FWMath.h>
00024 
00025 
00026 Define_Module(ConstSpeedMobility);
00027 
00028 
00035 void ConstSpeedMobility::initialize(int stage)
00036 {
00037     BaseMobility::initialize(stage);
00038 
00039     if (stage == 0) {
00040         move.setSpeed(par("speed").doubleValue());
00041 
00042         if(move.getSpeed() <= 0)
00043           move.setSpeed(0);
00044 
00045     numSteps = 0;
00046     step = -1;
00047     stepSize = Coord(0,0,0);
00048 
00049     debugEV << "Initialize: move speed: " << move.getSpeed() << " (" << par("speed").doubleValue() << ")"
00050            << " pos: " << move.info() << endl;
00051     }
00052     else if( stage == 1 ){
00053       stepTarget = move.getStartPos();
00054     }
00055 }
00056 
00057 
00062 void ConstSpeedMobility::setTargetPosition()
00063 {
00064   debugEV << "start setTargetPosistion: " << move.info() << endl;
00065 
00066     do{
00067   targetPos = getRandomPosition();
00068 
00069   double distance = move.getStartPos().distance(targetPos);
00070   simtime_t totalTime = distance / move.getSpeed();
00071   numSteps = FWMath::round(totalTime / updateInterval);
00072 
00073   debugEV << "new targetPos: " << targetPos.info() << " distance=" << distance
00074      << " totalTime=" << totalTime << " numSteps=" << numSteps << endl;
00075     }
00076     while( numSteps == 0 );
00077 
00078     stepSize = targetPos - move.getStartPos();
00079 
00080     stepSize = stepSize / numSteps;
00081 
00082     stepTarget = move.getStartPos() + stepSize;
00083 
00084     debugEV << "stepSize: " << stepSize.info() << " target: " << (stepSize*numSteps).info() << endl;
00085 
00086     step = 0;
00087     move.setDirectionByTarget(targetPos);
00088 
00089     debugEV << "end setTargetPosistion: " << move.info() << endl;
00090 }
00091 
00092 
00097 void ConstSpeedMobility::makeMove()
00098 {
00099     // increment number of steps
00100     step++;
00101 
00102     if( step == numSteps ){
00103     // last step
00104     //stepSize.x =
00105     // step forward
00106     move.setStart(stepTarget, simTime());
00107 
00108     debugEV << "stepping forward. step #=" << step
00109        << " startPos: " << move.getStartPos().info() << endl;
00110 
00111 
00112     // get new target position
00113     debugEV << "destination reached.\n"
00114        << move.info() << endl;
00115     setTargetPosition();
00116     }
00117     else if( step < numSteps ){
00118     // step forward
00119     move.setStart(stepTarget, simTime());
00120     stepTarget += stepSize;
00121 
00122     debugEV << "stepping forward. step #=" << step
00123        << " startPos: " << move.getStartPos().info() << endl;
00124 
00125     }
00126     else{
00127   error("step cannot be bigger than numSteps");
00128     }
00129 
00130     //    fixIfHostGetsOutside();
00131 }
00132 
00133 /*
00134 void ConstSpeedMobility::fixIfHostGetsOutside()
00135 {
00136     double dummy;
00137 
00138     handleIfOutside( PLACERANDOMLY, stepTarget, targetPos, stepSize, dummy );
00139 }
00140 */