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 */