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

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- 
  2.  *
  3.  * Copyright (c) 1997, 2000 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/mobile/energy-model.h,v 1.13 2005/06/14 19:43:48 haldar Exp $
  35.  */
  36. // Contributed by Satish Kumar (kkumar@isi.edu)
  37. #ifndef ns_energy_model_h_
  38. #define ns_energy_model_h_
  39. #include <cstdlib>
  40. #include <stdlib.h>
  41. #include <stdio.h>
  42. #include <assert.h>
  43. #include "config.h"
  44. #include "trace.h"
  45. #include "rng.h"
  46. const int CHECKFREQ = 1;
  47. const int MAX_WAITING_TIME = 11;
  48. class EnergyModel;
  49. class AdaptiveFidelityEntity : public Handler {
  50. public:  
  51. AdaptiveFidelityEntity(EnergyModel *nid) : nid_(nid) {} 
  52. virtual void start();
  53. virtual void handle(Event *e);
  54. virtual void adapt_it();
  55. inline void set_sleeptime(float t) {sleep_time_ = t;}
  56. inline void set_sleepseed(float t) {sleep_seed_ = t;}
  57. protected:
  58.         EnergyModel *nid_;
  59. Event intr;
  60. float  sleep_time_;
  61. float sleep_seed_;
  62. float  idle_time_;
  63. };
  64. class SoftNeighborHandler : public Handler {
  65. public:
  66. SoftNeighborHandler(EnergyModel *nid) {
  67. nid_ = nid;
  68. }
  69. virtual void start();
  70. virtual void handle(Event *e); 
  71. protected:
  72. EnergyModel *nid_;
  73. Event  intr;
  74. };
  75. class MobileNode;
  76. class EnergyModel : public TclObject {
  77. public:
  78. EnergyModel(MobileNode* n, double energy, double l1, double l2) :
  79. energy_(energy), er_(0), et_(0),ei_(0), es_(0), 
  80. initialenergy_(energy), 
  81. level1_(l1), level2_(l2), node_(n), 
  82. sleep_mode_(0), total_sleeptime_(0), total_rcvtime_(0), 
  83. total_sndtime_(0), powersavingflag_(0), 
  84. last_time_gosleep(0), max_inroute_time_(300), maxttl_(5), 
  85. adaptivefidelity_(1),  node_on_(true)
  86. {
  87. neighbor_list.neighbor_cnt_ = 0;
  88. neighbor_list.head = NULL;
  89. }
  90. inline double energy() const { return energy_; }
  91. //
  92. inline double et() const { return et_; }
  93. inline double er() const { return er_; }
  94. inline double ei() const { return ei_; }
  95. inline double es() const { return es_; }
  96. //
  97. inline double initialenergy() const { return initialenergy_; }
  98. inline double level1() const { return level1_; }
  99. inline double level2() const { return level2_; }
  100. inline void setenergy(double e) { energy_ = e; }
  101.    
  102. virtual void DecrTxEnergy(double txtime, double P_tx);
  103. virtual void DecrRcvEnergy(double rcvtime, double P_rcv);
  104. virtual void DecrIdleEnergy(double idletime, double P_idle);
  105. //
  106. virtual void DecrSleepEnergy(double sleeptime, double P_sleep);
  107. virtual void DecrTransitionEnergy(double transitiontime, double P_transition);
  108. //
  109. inline virtual double MaxTxtime(double P_tx) {
  110. return(energy_/P_tx);
  111. }
  112. inline virtual double MaxRcvtime(double P_rcv) {
  113. return(energy_/P_rcv);
  114. }
  115. inline virtual double MaxIdletime(double P_idle) {
  116. return(energy_/P_idle);
  117. }
  118. void add_neighbor(u_int32_t);      // for adaptive fidelity
  119. void scan_neighbor();
  120. inline int getneighbors() { return neighbor_list.neighbor_cnt_; }
  121. double level1() { return level1_; }
  122. double level2() { return level2_; }
  123. inline int sleep() { return sleep_mode_; }
  124. inline int state() { return state_; }
  125. inline float state_start_time() { return state_start_time_; }
  126. inline float& max_inroute_time() { return max_inroute_time_; }
  127. inline int& adaptivefidelity() { return adaptivefidelity_; }
  128. inline int& powersavingflag() { return powersavingflag_; }
  129. inline bool& node_on() { return node_on_; }
  130. inline float& total_sndtime() { return total_sndtime_; }
  131. inline float& total_rcvtime() { return total_rcvtime_; }
  132. inline float& total_sleeptime() { return total_sleeptime_; }
  133. //
  134. inline float& total_idletime() { return total_idletime_;}
  135. //
  136. inline AdaptiveFidelityEntity* afe() { return afe_; }
  137. inline int& maxttl() { return maxttl_; }
  138. virtual void set_node_sleep(int);
  139. virtual void set_node_state(int);
  140. virtual void add_rcvtime(float t) {total_rcvtime_ += t;}
  141. virtual void add_sndtime(float t) {total_sndtime_ += t;}
  142. //
  143. virtual void add_sleeptime(float t) {total_sleeptime_ += t;};
  144. //
  145. void start_powersaving();
  146. // Sleeping state
  147. enum SleepState { WAITING = 0, POWERSAVING = 1, INROUTE = 2 };
  148. protected:
  149. double energy_;
  150. //
  151. double er_; // Total energy consumption in RECV
  152. double et_; // Total energy consumption in transmission
  153. double ei_; // Total energy consumption in IDLE mode
  154. double es_; // Total energy consumption in SLEEP mode
  155. //
  156. double initialenergy_;
  157. double level1_;
  158. double level2_;
  159. MobileNode *node_;
  160. // XXX this structure below can be implemented by ns's LIST
  161. struct neighbor_list_item {
  162. u_int32_t id;         // node id
  163. int       ttl;     // time-to-live
  164. neighbor_list_item *next;  // pointer to next item
  165. };
  166. struct {
  167. int neighbor_cnt_;   // how many neighbors in this list
  168. neighbor_list_item *head; 
  169. } neighbor_list;
  170. SoftNeighborHandler *snh_;
  171.        int sleep_mode_;  // = 1: radio is turned off
  172. float total_sleeptime_;  // total time of radio in off mode
  173.         float total_rcvtime_;  // total time in receiving data
  174. float total_sndtime_;  // total time in sending data
  175. //
  176. float total_idletime_; // total time in idle mode
  177. //
  178. int powersavingflag_;    // Is BECA activated ?
  179. float last_time_gosleep; // time when radio is turned off
  180. float max_inroute_time_; // maximum time that a node can remaining
  181.  // active 
  182. int maxttl_;  // how long a node can keep its neighbor
  183.  // list. For AFECA only.
  184. int state_;  // used for AFECA state 
  185. float state_start_time_; // starting time of one AFECA state
  186. int adaptivefidelity_;   // Is AFECA activated ?
  187.         AdaptiveFidelityEntity *afe_;
  188. bool node_on_;     // on-off status of this node -- Chalermek
  189. };
  190. #endif // ns_energy_model_h