00001 #ifndef D__PktPair
00002 #define D__PktPair
00003
00004 #include <awds/UCastMetric.h>
00005
00006 #include <string>
00007 #include <sstream>
00008
00009
00010 namespace awds {
00011
00014 class PktPair : public UCastMetric {
00015 protected:
00016
00017 virtual RTopology::link_quality_t my_get_quality(NodeDescr &ndescr);
00018 virtual uint32_t my_calculate(RTopology::link_quality_t forward,RTopology::link_quality_t backward);
00019
00020 struct s_node_data {
00021 bool active;
00022 gea::AbsTime lastsend;
00023 gea::Duration time;
00024 int capacity;
00025 std::vector<gea::Duration> times;
00026 int position;
00027 s_node_data(int c=0):active(true),lastsend( GEA.lastEventTime),time(0,1),capacity(c),position(0) {
00028 if (capacity) {
00029
00030 times.resize(capacity);
00031 for (int i=0; i<capacity; ++i) {
00032 times[i].setSeconds(1);
00033 }
00034 }
00035 }
00036 void setTime(gea::Duration t,double alpha) {
00037 if (times.size()) {
00038 times[position++] = t;
00039 position %= capacity;
00040 } else {
00041 time.setSeconds(alpha * t.getSecondsD() +(1-alpha) * time.getSecondsD());
00042 }
00043 }
00044 gea::Duration getTime() {
00045 if (times.size()) {
00046 time = times[0];
00047 for (int i(1);i<capacity;++i) {
00048 time = std::min(time,times[i]);
00049 }
00050 }
00051 return time;
00052 }
00053 };
00054 typedef std::map<NodeId,s_node_data> Nodes;
00055 Nodes nodes;
00056 typedef std::map<NodeId,gea::AbsTime> FirstPackets;
00057 FirstPackets firstPackets;
00058
00059 gea::Blocker blocker;
00060 public:
00061 gea::Duration interval;
00062 bool debug;
00063 double alpha;
00064 int packetSize;
00065 int bufferSize;
00066 PktPair(Routing *r);
00067 virtual ~PktPair();
00068 virtual void on_recv(BasePacket *p);
00069 virtual void on_wait(gea::Handle *h,gea::AbsTime t);
00070 virtual void addNode(NodeId &nodeId);
00071 virtual void begin_update();
00072 virtual void end_update();
00073 void start();
00074 virtual std::string get_values();
00075 };
00076 }
00077
00078
00079
00080
00081 #endif // D__PktPair
00082
00083
00084
00085
00086
00087