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

通讯编程

开发平台:

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/edge.h,v 1.32 2003/10/11 22:56:49 xuanc Exp $ (LBL)
  34.  */
  35. #ifndef nam_edge_h
  36. #define nam_edge_h
  37. #include <math.h>
  38. #include <tclcl.h>
  39. #include "animation.h"
  40. #include "transform.h"
  41. class View;
  42. //class PSView;
  43. class Transform;
  44. class Node;
  45. class Packet;
  46. class Monitor;
  47. class LossModel;
  48. class QueueHandle;
  49. class Edge : public Animation, public TclObject {
  50. public:
  51. Edge(double ps, double bw, double delay, double length, double angle);
  52. Edge(Node* src, Node* dst, double ps,
  53. double bw, double _delay, double length, double angle);
  54. Edge(Node* src, Node* dst, double ps,
  55.      double bw, double _delay, double length, double angle, int ws);
  56. ~Edge();
  57. void attachNodes(Node * source, Node * destination);
  58. void addLossModel(LossModel * lossmodel);
  59. LossModel * getLossModel();
  60. void clearLossModel();
  61. void addQueueHandle(QueueHandle * q_handle);
  62. QueueHandle * getQueueHandle() {return queue_handle_;}
  63. virtual void draw(View*, double);
  64. virtual void reset(double);
  65. virtual int classid() const { return ClassEdgeID;}
  66. virtual float distance(float x, float y) const;
  67. inline double PacketHeight() const { return (psize_); }
  68. inline double size() const { return (psize_); }
  69. inline void size(double s) { psize_ = s; }
  70. inline int src() const { return (src_); }
  71. inline int dst() const { return (dst_); }
  72. Node * getSourceNode() {return start_;}
  73. Node * getDestinationNode() {return neighbor_;}
  74. inline int match(int s, int d) const { return (src_ == s && dst_ == d); }
  75. inline const Transform& transform() const { return (matrix_); }
  76. // bandwidth_ is converted to bits/sec for txtime calculation see tcl/netModel.tcl
  77. inline double txtime(int n) const {return (double(n << 3)/(bandwidth_*1000000.0));}
  78. inline double angle() const { return (angle_); }
  79. inline double realangle() const {
  80. return atan2(y1_-y0_, x1_-x0_);
  81. }
  82. inline void setAngle(double angle) { angle_ = angle; }
  83. double delay() const; // link delay is returned in seconds  
  84. inline double length() const { return (length_); }
  85. inline double x0() const { return (x0_); }
  86. inline double y0() const { return (y0_); }
  87. inline double x() const { return (x0_); }
  88. inline double y() const { return (y0_); }
  89. inline int anchor() const { return (anchor_); }
  90. inline void anchor(int v) { anchor_ = v; }
  91. inline int visible() const { return (visible_); }
  92. inline void visible(int v) { visible_ = v; }
  93. inline Node* neighbor() const { return (neighbor_); }
  94. inline Node* start() const { return (start_); }
  95. inline Packet* packets() const { return packets_;}
  96. inline double reallength() const { 
  97. return sqrt((x1_-x0_)*(x1_-x0_) + (y1_-y0_)*(y1_-y0_));
  98. }
  99. inline void setBW(double bw) { bandwidth_ = bw;}
  100. inline void setDelay(double dlay) { delay_ = dlay;}
  101. inline void setLength(double length) { length_ = length;}
  102. inline void inc_usage() { used_ = used_ + 1;}
  103. inline void dec_usage() { used_ = used_ - 1;}
  104. inline int used() const {return used_;}
  105. /*XXX for debugging only*/
  106. inline int no_of_packets() const {return no_of_packets_;}
  107. void init_color(const char *clr);
  108. void set_down(char *clr);
  109. void set_up();
  110. inline int isdown() const { return (state_==DOWN); }
  111. void place(double, double, double, double);
  112. virtual void update_bb() {} // Do nothing
  113. void AddPacket(Packet *);
  114. void DeletePacket(Packet *);
  115. void arrive_packet(Packet *, double atime);
  116. void dlabel(const char* name);
  117. void direction(const char* name);
  118. void dcolor(const char* name);
  119. virtual int inside(double, float, float) const;
  120. virtual int inside(float, float) const;
  121. const char* info() const;
  122. const char* property();
  123. const char* getname() const;
  124. void monitor(Monitor *m, double now, char *result, int len);
  125. inline int marked() const { return (marked_); }
  126. inline void mark() { marked_ = 1; }
  127. inline void unmark() { marked_ = 0; }
  128. int save(FILE *file);
  129. int saveAsEnam(FILE *file);
  130. int writeNsScript(FILE *file);
  131. Edge* next_;
  132. private:
  133. void setupDefaults();
  134. int src_, dst_;
  135. Node* start_;
  136. Node* neighbor_;
  137. double x0_, y0_;
  138. double x1_, y1_;
  139. double psize_; /* packet size */
  140. double angle_;
  141. double bandwidth_; // link bandwidth (Mbits/sec) 
  142. double delay_; // link delay in milliseconds
  143. double length_; /* link length if not related to delay */
  144. Transform matrix_; /* rotation matrix for packets */
  145. int state_;
  146. BBox eb_; /* own bounding box in its own coordinate */
  147. /* system */
  148. Packet* packets_;       /*newest packet to be added*/
  149. int no_of_packets_;
  150. Packet* last_packet_;   /*oldest packet - normally first to arrive*/
  151. int marked_;
  152. int visible_;
  153. char* dlabel_;          /* Label to be drawn beneath the link */
  154. char* dcolor_;          /* label color */
  155. int direction_;
  156. int wireless_;
  157. int anchor_;
  158. int used_ ;             /* is the edge currently being used */
  159. LossModel * lossmodel_;
  160. QueueHandle * queue_handle_;
  161. };
  162. #endif