mobilenode.h
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:6k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- 
  2.  *
  3.  * Copyright (c) 1997 Regents of the University of California.
  4.  * All rights reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 1. Redistributions of source code must retain the above copyright
  10.  *    notice, this list of conditions and the following disclaimer.
  11.  * 2. Redistributions in binary form must reproduce the above copyright
  12.  *    notice, this list of conditions and the following disclaimer in the
  13.  *    documentation and/or other materials provided with the distribution.
  14.  * 3. All advertising materials mentioning features or use of this software
  15.  *    must display the following acknowledgement:
  16.  * This product includes software developed by the Computer Systems
  17.  * Engineering Group at Lawrence Berkeley Laboratory.
  18.  * 4. Neither the name of the University nor of the Laboratory may be used
  19.  *    to endorse or promote products derived from this software without
  20.  *    specific prior written permission.
  21.  *
  22.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  23.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  26.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32.  * SUCH DAMAGE.
  33.  *
  34.  * @(#) $Header: /cvsroot/nsnam/ns-2/common/mobilenode.h,v 1.22 2006/02/21 15:20:18 mahrenho Exp $
  35.  *
  36.  */
  37. /*
  38.  * XXX
  39.  * Eventually energe model and location stuff in this file will be cleaned
  40.  * up and moved to separate file to improve modularity. BUT before that is 
  41.  * finished, they should stay in this file rather than bothering the base 
  42.  * node.
  43.  */
  44. class MobileNode;
  45. #ifndef __ns_mobilenode_h__
  46. #define __ns_mobilenode_h__
  47. #define MN_POSITION_UPDATE_INTERVAL 30.0   // seconds
  48. #define MAX_SPEED 5.0    // meters per second (33.55 mph)
  49. #define MIN_SPEED 0.0
  50. #include "object.h"
  51. #include "trace.h"
  52. #include "lib/bsd-list.h"
  53. #include "phy.h"
  54. #include "topography.h"
  55. #include "arp.h"
  56. #include "node.h"
  57. #include "gridkeeper.h"
  58. #include "energy-model.h"
  59. #include "location.h"
  60. #if COMMENT_ONLY
  61.  -----------------------
  62. | |
  63. | Upper Layers |
  64. | |
  65.  -----------------------
  66.     |     |
  67.     |     |
  68.  -------  -------
  69. | | | |
  70. |  LL | |  LL |
  71. | | | |
  72.  -------  -------
  73.     |     |
  74.     |     |
  75.  -------  -------
  76. | | | |
  77. | Queue | | Queue |
  78. | | | |
  79.  -------  -------
  80.     |     |
  81.     |     |
  82.  -------  -------
  83. | | | |
  84. |  Mac | |  Mac |
  85. | | | |
  86.  -------  -------
  87.     |     |
  88.     |     |
  89.  -------  -------  -----------------------
  90. | | | | | |
  91. | Netif | <--- | Netif | <--- | Mobile Node |
  92. | | | | | |
  93.  -------  -------  -----------------------
  94.     |     |
  95.     |     |
  96.  -----------------------
  97. | |
  98. | Channel(s)  |
  99. | |
  100.  -----------------------
  101. #endif
  102. class MobileNode;
  103. class PositionHandler : public Handler {
  104. public:
  105. PositionHandler(MobileNode* n) : node(n) {}
  106. void handle(Event*);
  107. private:
  108. MobileNode *node;
  109. };
  110. class MobileNode : public Node 
  111. {
  112. friend class PositionHandler;
  113. public:
  114. MobileNode();
  115. virtual int command(int argc, const char*const* argv);
  116. double distance(MobileNode*);
  117. double propdelay(MobileNode*);
  118. void start(void);
  119.         inline void getLoc(double *x, double *y, double *z) {
  120. update_position();  *x = X_; *y = Y_; *z = Z_;
  121. }
  122.         inline void getVelo(double *dx, double *dy, double *dz) {
  123. *dx = dX_ * speed_; *dy = dY_ * speed_; *dz = 0.0;
  124. }
  125. inline MobileNode* nextnode() { return link_.le_next; }
  126. inline int base_stn() { return base_stn_;}
  127. inline void set_base_stn(int addr) { base_stn_ = addr; }
  128. void dump(void);
  129. inline MobileNode*& next() { return next_; }
  130. inline double X() { return X_; }
  131. inline double Y() { return Y_; }
  132. inline double Z() { return Z_; }
  133. inline double speed() { return speed_; }
  134. inline double dX() { return dX_; }
  135. inline double dY() { return dY_; }
  136. inline double dZ() { return dZ_; }
  137. inline double destX() { return destX_; }
  138. inline double destY() { return destY_; }
  139. inline double radius() { return radius_; }
  140. inline double getUpdateTime() { return position_update_time_; }
  141. //inline double last_routingtime() { return last_rt_time_;}
  142. void update_position();
  143. void log_energy(int);
  144. //void logrttime(double);
  145. virtual void idle_energy_patch(float, float);
  146. /* For list-keeper */
  147. MobileNode* nextX_;
  148. MobileNode* prevX_;
  149. protected:
  150. /*
  151.  * Last time the position of this node was updated.
  152.  */
  153. double position_update_time_;
  154.         double position_update_interval_;
  155. /*
  156.          *  The following indicate the (x,y,z) position of the node on
  157.          *  the "terrain" of the simulation.
  158.          */
  159. double X_;
  160. double Y_;
  161. double Z_;
  162. double speed_; // meters per second
  163. /*
  164.          *  The following is a unit vector that specifies the
  165.          *  direction of the mobile node.  It is used to update
  166.          *  position
  167.          */
  168. double dX_;
  169. double dY_;
  170. double dZ_;
  171.         /* where are we going? */
  172. double destX_;
  173. double destY_;
  174. /*
  175.  * for gridkeeper use only
  176.    */
  177. MobileNode* next_;
  178. double          radius_;
  179. // Used to generate position updates
  180. PositionHandler pos_handle_;
  181. Event pos_intr_;
  182. void log_movement();
  183. void random_direction();
  184. void random_speed();
  185.         void    random_destination();
  186.         int set_destination(double x, double y, double speed);
  187.   
  188. private:
  189. inline int initialized() {
  190. return (T_ && log_target_ &&
  191. X_ >= T_->lowerX() && X_ <= T_->upperX() &&
  192. Y_ >= T_->lowerY() && Y_ <= T_->upperY());
  193. }
  194. void random_position();
  195. void bound_position();
  196. int random_motion_; // is mobile
  197. /*
  198.  * A global list of mobile nodes
  199.  */
  200. LIST_ENTRY(MobileNode) link_;
  201. /*
  202.  * The topography over which the mobile node moves.
  203.  */
  204. Topography *T_;
  205. /*
  206.  * Trace Target
  207.  */
  208. Trace* log_target_;
  209.         /* 
  210.  * base_stn for mobilenodes communicating with wired nodes
  211.          */
  212. int base_stn_;
  213. //int last_rt_time_;
  214. };
  215. #endif // ns_mobilenode_h