wireless-phymr.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.  *
  35.  * Ported from CMU/Monarch's code, nov'98 -Padma Haldar.
  36.  *
  37.  * Ported 2006 from ns-2.29/mac/wireless-phy.h
  38.  * by Federico Maguolo, Nicola Baldo and Simone Merlin 
  39.  * (SIGNET lab, University of Padova, Department of Information Engineering)
  40.  */
  41.  
  42. #ifndef _WIRELESSPHYMR_
  43. #define _WIRELESSPHYMR_
  44. #include "wireless-phy.h"
  45. #include "power_profile.h"
  46. #include "deipropagation.h"
  47. class PAFreeSpace;
  48. class PAWirelessPhy;
  49. class PASleep_Timer : public TimerHandler {
  50.  public:
  51. PASleep_Timer(PAWirelessPhy *a) : TimerHandler() { a_ = a; }
  52.  protected:
  53. virtual void expire(Event *e);
  54. PAWirelessPhy *a_;
  55. };
  56. struct PowerChangeEvent
  57. {
  58. double instant;
  59. double increasePower;
  60. PowerChangeEvent *next;
  61. };
  62. class PowerChangeTimer : public TimerHandler
  63. {
  64. public:
  65. PowerChangeTimer(PAWirelessPhy *phy);
  66. void addEvent(double instant, double increasePower);
  67. protected:
  68. virtual void expire(Event *e);
  69. PAWirelessPhy *phy_;
  70. PowerChangeEvent *eventList_;
  71. };
  72. class PAWirelessPhy : public Phy {
  73. public:
  74. PAWirelessPhy();
  75. void sendDown(Packet *p);
  76. int sendUp(Packet *p);
  77. inline double getL() const {return L_;}
  78. inline double getLambda() const {return lambda_;}
  79. inline Node* node(void) const { return node_; }
  80. inline double getPtconsume() { return Pt_consume_; }
  81. double getDist(double Pr, double Pt, double Gt, double Gr, double hr,
  82.        double ht, double L, double lambda);
  83.   
  84. virtual int command(int argc, const char*const* argv);
  85. virtual void dump(void) const;
  86. //void setnode (MobileNode *node) { node_ = node; }
  87. void node_on();
  88. void node_off();
  89.         /* -NEW- */
  90.         inline double getAntennaZ() { return ant_->getZ(); }
  91.         inline double getPt() { return Pt_; }
  92. //        inline double getRXThresh() { return RXThresh_; }
  93.         inline double getCSThresh() { return CSThresh_; }
  94.         inline double getFreq() { return freq_; }
  95.         /* End -NEW- */
  96. void node_sleep();
  97. void node_wakeup();
  98. inline bool& Is_node_on() { return node_on_; }
  99. inline bool Is_sleeping() { if (status_==SLEEP) return(1); else return(0); }
  100. protected:
  101. void increasePower(double power);
  102. PowerProfile *profile_;
  103. PowerChangeTimer powerTimer_;
  104. double Pt_; // transmitted signal power (W)
  105. double Pt_consume_; // power consumption for transmission (W)
  106. double Pr_consume_; // power consumption for reception (W)
  107. double P_idle_;         // idle power consumption (W)
  108. double P_sleep_; // sleep power consumption (W)
  109. double P_transition_; // power consumed when transiting from SLEEP mode to IDLE mode and vice versa.
  110. double T_transition_; // time period to transit from SLEEP mode to IDLE mode and vice versa.
  111. //
  112. double last_send_time_; // the last time the node sends somthing.
  113. double channel_idle_time_; // channel idle time.
  114. double update_energy_time_; // the last time we update energy.
  115. double freq_;           // frequency
  116. double lambda_; // wavelength (m)
  117. double L_; // system loss factor
  118.   
  119. // No more RX threshold since we use a SNIR-based packet error rate 
  120. // double RXThresh_; // receive power threshold (W)
  121. double CSThresh_; // carrier sense threshold (W)
  122. // No more capture threshold since we use an interference model 
  123. // and capture probability depends on SNIR (and in particular on the interference power)
  124. // double CPThresh_; // capture threshold (db)
  125.   
  126. Antenna *ant_;
  127. DeiPropagation *propagation_; // Propagation Model
  128. //[Nicola] modulation was removed since it was unused
  129. /*  Modulation *modulation_; // Modulation Schem */
  130. // Why phy has a node_ and this guy has it all over again??
  131. //   MobileNode* node_;          // Mobile Node to which interface is attached .
  132.   enum ChannelStatus { SLEEP, IDLE, RECV, SEND };
  133. bool node_on_; // on-off status of this node
  134. PASleep_Timer sleep_timer_;
  135. int status_;
  136. private:
  137. inline int initialized() {
  138. //return (node_ && uptarget_ && downtarget_ && propagation_);
  139. return (uptarget_ && downtarget_ && propagation_);
  140. }
  141. void UpdateIdleEnergy();
  142. void UpdateSleepEnergy();
  143. // Convenience method
  144. EnergyModel* em() { 
  145. if (node())
  146. return node()->energy_model();
  147. else 
  148. return (EnergyModel*) 0;
  149. }
  150. friend class PASleep_Timer;
  151. friend class PowerChangeTimer;
  152. };
  153. #endif