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

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 1991,1993 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  *  This product includes software developed by the Computer Systems
  16.  *  Engineering Group at Lawrence Berkeley Laboratory.
  17.  * 4. Neither the name of the University nor of the Laboratory may be used
  18.  *    to endorse or promote products derived from this software without
  19.  *    specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  *
  33.  * @(#) $Header: /cvsroot/nsnam/nam-1/drop.cc,v 1.14 2005/01/24 19:55:14 haldar Exp $ (LBL)
  34.  */
  35. #ifdef WIN32
  36. #include <windows.h>
  37. #endif
  38. #include "netview.h"
  39. #include "drop.h"
  40. #include "monitor.h"
  41. //<zheng: +++>
  42. #include "parser.h"
  43. #include <math.h>
  44. //</zheng: +++>
  45. //----------------------------------------------------------------------
  46. //----------------------------------------------------------------------
  47. Drop::Drop(float cx, float cy, float b, float size, double now,
  48.            long offset, const PacketAttr& p) :
  49.   Animation(now, offset),
  50.   x_(cx),
  51.   y_(cy),
  52.   bottom_(b),
  53.   psize_(size),
  54.   start_(now), 
  55.   pkt_(p),
  56.   rotation_(0) {
  57.   curPos_ = CurPos(now);
  58. }
  59. //----------------------------------------------------------------------
  60. //----------------------------------------------------------------------
  61. Drop::~Drop() {
  62.   if (monitor_!=NULL) {
  63.     monitor_->delete_monitor_object(this);
  64.   }
  65. }
  66. //----------------------------------------------------------------------
  67. //----------------------------------------------------------------------
  68. void Drop::draw(View * c, double now) {
  69.   /* XXX nuke array */
  70.   //<zheng: +++>
  71.   float tx,ty,tx2,ty2,td;
  72.   //</zheng: +++>
  73.   float fx[4], fy[4];
  74.   double yy = CurPos(now);
  75.   if (rotation_ & 2) {
  76.     double d = (0.75 * 0.7071067812) * psize_;
  77.     //<zheng: +++>
  78.     //not too large
  79.     if (ParseTable::nam4wpan) {
  80.     tx = x_;
  81.     ty = yy;
  82.     c->imap(tx,ty);
  83.     tx2 = x_ + 1;
  84.     ty2 = yy;
  85.     c->imap(tx2,ty2);
  86.     td = (tx2 - tx) * (tx2 - tx) + (ty2 - ty) * (ty2 - ty);
  87.     td = pow(td, 0.5);
  88.     if (d > td)
  89.        d = td;
  90.     }
  91.     //</zheng: +++>
  92.     fx[0] = x_;
  93.     fy[0] = yy - d;
  94.     fx[1] = x_ - d;
  95.     fy[1] = yy;
  96.     fx[2] = x_;
  97.     fy[2] = yy + d;
  98.     fx[3] = x_ + d;
  99.     fy[3] = yy;
  100.   } else {
  101.     double d = (0.75 * 0.5) * psize_;
  102.     //<zheng: +++>
  103.     //not too large
  104.     if (ParseTable::nam4wpan) {
  105.     tx = x_;
  106.     ty = yy;
  107.     c->imap(tx,ty);
  108.     tx2 = x_ + 1;
  109.     ty2 = yy;
  110.     c->imap(tx2,ty2);
  111.     td = (tx2 - tx) * (tx2 - tx) + (ty2 - ty) * (ty2 - ty);
  112.     td = pow(td, 0.5);
  113.     if (d > td)
  114.        d = td;
  115.     }
  116.     //</zheng: +++>
  117.     fx[0] = x_ - d;
  118.     fy[0] = yy - d;
  119.     fx[1] = x_ - d;
  120.     fy[1] = yy + d;
  121.     fx[2] = x_ + d;
  122.     fy[2] = yy + d;
  123.     fx[3] = x_ + d;
  124.     fy[3] = yy - d;
  125.   }
  126.   // Draw a square
  127.   c->fill(fx, fy, 4, paint_);
  128.   if (monitor_) {
  129.     monitor_->draw(c, x_,yy);
  130.   }
  131. }
  132. //----------------------------------------------------------------------
  133. //----------------------------------------------------------------------
  134. void Drop::update(double now) {
  135.   ++rotation_;
  136.   if ((now < start_) ||
  137.       (CurPos(now) < bottom_)) {
  138.     delete this;
  139.   } else {
  140.     curPos_ = CurPos(now);
  141.     update_bb();
  142.   }
  143. }
  144. void Drop::update_bb()
  145. {
  146.   double d = (0.75 * 0.7071067812) * psize_;
  147.   bb_.xmin = x_ - d, bb_.xmax = x_ + d;
  148.   bb_.ymin = curPos_ - d, bb_.ymax = curPos_ + d;
  149. }
  150. void Drop::reset(double now)
  151. {
  152.   if (now < start_ || CurPos(now) < bottom_)
  153.     delete this;
  154.   else 
  155.     curPos_ = CurPos(now);
  156. }
  157. int Drop::inside(double now, float px, float py) const
  158. {
  159.   //float minx, maxx, miny, maxy;
  160.   double yy = CurPos(now);
  161.   double d = (0.75 * 0.7071067812) * psize_;
  162.   return (px >= x_ - d && px <= x_ + d && py >= yy - d && py <= yy + d);
  163. }
  164. //----------------------------------------------------------------------
  165. // double
  166. // Drop::CurPos(double now) const
  167. //  - Calculates the current position of the packet based upon the start
  168. //    time of the packet drop and the maximum drop time
  169. //----------------------------------------------------------------------
  170. double
  171. Drop::CurPos(double now) const {
  172.   // This calculation starts the drop at y_ and runs to bottom_ within the
  173.   // timeframe of MAX_DROP_TIME.  At start_ + MAX_DROP_TIME the packet 
  174.   // should be at bottom_.
  175.   double drop_distance = (now - start_)*(bottom_ - y_)/MAX_DROP_TIME + y_;
  176. //  if (bottom_ < -10) {
  177.    //quick hack for wireless model
  178. //   drop_distance = y_ - (now - start_) * (0 - bottom_);
  179. //   fprintf(stderr, "Using Wireless drop distance.n");
  180. //  }
  181.    return drop_distance;
  182. }
  183. const char* Drop::info() const
  184. {
  185.   static char text[128];
  186.   sprintf(text, "%s %d: %sn  dropped at %gn  %d bytes",
  187.     pkt_.type, pkt_.id, pkt_.convid, start_, pkt_.size);
  188.   return (text);
  189. }
  190. const char* Drop::getname() const
  191. {
  192.   static char text[128];
  193.   sprintf(text, "d");
  194.   return (text);
  195. }
  196. void Drop::monitor(Monitor *m, double /*now*/, char *result, int /*len*/)
  197. {
  198.   monitor_=m;
  199.   sprintf(result, "%s %d: %sn  dropped at %gn  %d bytes",
  200.                 pkt_.type, pkt_.id, pkt_.convid, start_, pkt_.size);
  201. }
  202. MonState *Drop::monitor_state()
  203. {
  204.   MonState *ms=new MonState;
  205.   ms->type=MON_PACKET;
  206.   ms->pkt.id=pkt_.id;
  207.   return ms;
  208. }