?? wireless-phy.cc
字號:
/* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- * * Copyright (c) 1996 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the Computer Systems * Engineering Group at Lawrence Berkeley Laboratory and the Daedalus * research group at UC Berkeley. * 4. Neither the name of the University nor of the Laboratory may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $Header: /nfs/jade/vint/CVSROOT/ns-2/mac/wireless-phy.cc,v 1.20 2003/11/19 00:41:44 haldar Exp $ * * Ported from CMU/Monarch's code, nov'98 -Padma Haldar. * wireless-phy.cc */#include <math.h>#include <packet.h>#include <mobilenode.h>#include <phy.h>#include <propagation.h>#include <modulation.h>#include <omni-antenna.h>#include <wireless-phy.h>#include <packet.h>#include <ip.h>#include <agent.h>#include <trace.h>#include "diffusion/diff_header.h"#define max(a,b) (((a)<(b))?(b):(a))void Idle_Timer::expire(Event *) { a_->UpdateIdleEnergy();}/* ====================================================================== WirelessPhy Interface ====================================================================== */static class WirelessPhyClass: public TclClass {public: WirelessPhyClass() : TclClass("Phy/WirelessPhy") {} TclObject* create(int, const char*const*) { return (new WirelessPhy); }} class_WirelessPhy;WirelessPhy::WirelessPhy() : Phy(), idle_timer_(this), status_(IDLE){ /* * It sounds like 10db should be the capture threshold. * * If a node is presently receiving a packet a a power level * Pa, and a packet at power level Pb arrives, the following * comparion must be made to determine whether or not capture * occurs: * * 10 * log(Pa) - 10 * log(Pb) > 10db * * OR equivalently * * Pa/Pb > 10. * */#ifdef MIT_uAMPS alive_ = 1; // 0 = dead, 1 = alive bandwidth_ = 1000000; // 100 Mbps Efriss_amp_ = 100 * 1e-12; // Friss amp energy (J/bit/m^2) Etwo_ray_amp_ = 0.013 * 1e-12; // Two-ray amp energy (J/bit/m^4) EXcvr_ = 50 * 1e-9; // Xcvr energy (J/bit) // Use this base threshold to get a "hearing radius" of ~ 1 m Pfriss_amp_ = Efriss_amp_ * bandwidth_; // Friss power (W/m^2) Ptwo_ray_amp_ = Etwo_ray_amp_ * bandwidth_; // Two-ray power (W/m^4) PXcvr_ = EXcvr_ * bandwidth_; // Xcvr power (W) sleep_ = 0; // 0 = awake, 1 = asleep ss_ = 1; // amount of spreading time_finish_rcv_ = 0; dist_ = 0; // approx. distance to transmitter energy_ = 0; #else bandwidth_ = 2*1e6; // 2 Mb Pt_ = pow(10, 2.45) * 1e-3; // 24.5 dbm, ~ 281.8mw#endif #ifdef MIT_uAMPS /* * Set CSThresh_ for receiver sensitivity and RXThresh_ for required SNR. */ CSThresh_ = 1e-10; RXThresh_ = 6e-9;#else CSThresh_ = 1.559e-11; RXThresh_ = 3.652e-10;#endif bind("CPThresh_", &CPThresh_); bind("CSThresh_", &CSThresh_); bind("RXThresh_", &RXThresh_); //bind("bandwidth_", &bandwidth_); bind("Pt_", &Pt_); bind("freq_", &freq_); bind("L_", &L_);#ifdef MIT_uAMPS bind("alive_",&alive_); bind("bandwidth_",&bandwidth_); bind("Efriss_amp_", &Efriss_amp_); bind("Etwo_ray_amp_", &Etwo_ray_amp_); bind("EXcvr_", &EXcvr_); bind("sleep_",&sleep_); bind("ss_",&ss_); bind("dist_",&dist_);#endif lambda_ = SPEED_OF_LIGHT / freq_; node_ = 0; ant_ = 0; propagation_ = 0; modulation_ = 0; // Assume AT&T's Wavelan PCMCIA card -- Chalermek // Pt_ = 8.5872e-4; // For 40m transmission range. // Pt_ = 7.214e-3; // For 100m transmission range. // Pt_ = 0.2818; // For 250m transmission range. // Pt_ = pow(10, 2.45) * 1e-3; // 24.5 dbm, ~ 281.8mw Pt_consume_ = 0.660; // 1.6 W drained power for transmission Pr_consume_ = 0.395; // 1.2 W drained power for reception // P_idle_ = 0.035; // 1.15 W drained power for idle P_idle_ = 0.0; channel_idle_time_ = NOW; update_energy_time_ = NOW; last_send_time_ = NOW; idle_timer_.resched(1.0);}intWirelessPhy::command(int argc, const char*const* argv){ TclObject *obj; if (argc==2) { if (strcasecmp(argv[1], "NodeOn") == 0) { if (em() == NULL) return TCL_OK; if (NOW > update_energy_time_) { update_energy_time_ = NOW; } return TCL_OK; } else if (strcasecmp(argv[1], "NodeOff") == 0) { if (em() == NULL) return TCL_OK; if (NOW > update_energy_time_) { em()->DecrIdleEnergy(NOW-update_energy_time_, P_idle_); update_energy_time_ = NOW; } return TCL_OK; } } else if(argc == 3) { if (strcasecmp(argv[1], "setTxPower") == 0) { Pt_consume_ = atof(argv[2]); return TCL_OK; } else if (strcasecmp(argv[1], "setRxPower") == 0) { Pr_consume_ = atof(argv[2]); return TCL_OK; } else if (strcasecmp(argv[1], "setIdlePower") == 0) { P_idle_ = atof(argv[2]); return TCL_OK; } else if( (obj = TclObject::lookup(argv[2])) == 0) { fprintf(stderr,"WirelessPhy: %s lookup of %s failed\n", argv[1], argv[2]); return TCL_ERROR; } else if (strcmp(argv[1], "propagation") == 0) { assert(propagation_ == 0); propagation_ = (Propagation*) obj; return TCL_OK; } else if (strcasecmp(argv[1], "antenna") == 0) { ant_ = (Antenna*) obj; return TCL_OK; } else if (strcasecmp(argv[1], "node") == 0) { assert(node_ == 0); node_ = (MobileNode *)obj; return TCL_OK; }#ifdef MIT_uAMPS else if (strcasecmp(argv[1], "attach-energy") == 0) { energy_ = (EnergyResource*) obj; return TCL_OK; }#endif } return Phy::command(argc,argv);} void WirelessPhy::sendDown(Packet *p){ /* * Sanity Check */ assert(initialized());#ifdef MIT_uAMPS /* * The power for transmission depends on the distance between * the transmitter and the receiver. If this distance is * less than the crossover distance: * (c_d)^2 = 16 * PI^2 * L * hr^2 * ht^2 * --------------------------------- * lambda^2 * the power falls off using the Friss equation. Otherwise, the * power falls off using the two-ray ground reflection model. * Therefore, the power for transmission of a bit is: * Pt = Pfriss_amp_*d^2 if d < c_d * Pt = Ptwo_ray_amp_*d^4 if d >= c_d. * The total power dissipated per bit is PXcvr_ + Pt. */ hdr_cmn *ch = HDR_CMN(p); hdr_rca *rca_hdr = HDR_RCA(p); double d = rca_hdr->get_dist(); double hr, ht; // height of recv and xmit antennas double tX, tY, tZ; // transmitter location node_->getLoc(&tX, &tY, &tZ); ht = tZ + ant_->getZ(); hr = ht; // assume receiving node and antenna at same height double crossover_dist = sqrt((16 * PI * PI * L_ * ht * ht * hr * hr) / (lambda_ * lambda_)); if (d < crossover_dist) if (d > 1) Pt_ = Efriss_amp_ * bandwidth_ * d * d; else // Pfriss_amp_ is the minimum transmit amplifier power. Pt_ = Efriss_amp_ * bandwidth_; else Pt_ = Etwo_ray_amp_ * bandwidth_ * d * d * d * d; PXcvr_ = EXcvr_ * bandwidth_; if (energy_) { if (energy_->remove(pktEnergy(Pt_, PXcvr_, ch->size())) != 0) alive_ = 0; }#endif if (em()) if ((em()->node_on() != true) || (em()->sleep())) { Packet::free(p); return; } /* * Decrease node's energy */ if(em()) { if (em()->energy() > 0) { //double txtime = (8.*hdr_cmn::access(p)->size())/bandwidth_; double txtime = hdr_cmn::access(p)->txtime(); double start_time = max(channel_idle_time_, NOW); double end_time = max(channel_idle_time_, NOW+txtime); double actual_txtime = end_time-start_time; if (start_time > update_energy_time_) { em()->DecrIdleEnergy(start_time - update_energy_time_, P_idle_); update_energy_time_ = start_time; } /* It turns out that MAC sends packet even though, it's receiving some packets. if (txtime-actual_txtime > 0.000001) { fprintf(stderr,"Something may be wrong at MAC\n");
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -