]> git.tdb.fi Git - netvis.git/blobdiff - source/host.cpp
Move activity tracking to a separate class
[netvis.git] / source / host.cpp
index be24f05360d05060455228e66b6492dbb2160397..c18f117ba11d3dc360328ad0eb539c3d4e8939ed 100644 (file)
@@ -1,3 +1,10 @@
+/* $Id$
+
+This file is part of NetVis
+Copyright @ 2008 Mikko Rasa, Mikkosoft Productions
+Distributed unter the GPL
+*/
+
 #include <cmath>
 #include <netinet/in.h>
 #include <arpa/inet.h>
@@ -14,82 +21,138 @@ using namespace Msp;
 
 Host::Host(NetVis &nv, unsigned a):
        netvis(nv),
-       addr(a)
+       addr(a),
+       local(false),
+       active(true),
+       throttle(0)
 {
        in_addr ina;
-       ina.s_addr=htonl(addr);
-       name=inet_ntoa(ina);
+       ina.s_addr = htonl(addr);
+       name = inet_ntoa(ina);
+       short_name = name;
+}
+
+void Host::set_name(const string &n)
+{
+       name = n;
+
+       if(local)
+       {
+               unsigned dot = name.find('.');
+               short_name = name.substr(0, dot);
+       }
+       else
+       {
+               unsigned dot = name.size();
+               for(unsigned i=0; (dot>0 && dot!=string::npos); ++i)
+               {
+                       unsigned prev = name.rfind('.', dot-1);
+                       if(prev+15<name.size() && i>1)
+                               break;
+                       dot = prev;
+               }
+
+               if(dot==string::npos)
+                       short_name = name;
+               else
+                       short_name = "..."+name.substr(dot+1);
+       }
+}
+
+void Host::set_local(bool l)
+{
+       local = l;
 }
 
 void Host::set_position(const Vector2 &p)
 {
-       pos=p;
+       pos = p;
+}
+
+void Host::set_active(bool a)
+{
+       active = a;
 }
 
-void Host::add_connection(Connection &)
+void Host::add_activity(unsigned bytes)
 {
+       activity.add_bytes(bytes);
 }
 
-Connection *Host::get_connection(Host &)
+float Host::send_packet()
 {
-       return 0;
+       float ret = throttle;
+       if(throttle<1)
+               throttle += 0.025;
+       return ret;
 }
 
 void Host::tick(const Msp::Time::TimeDelta &td)
 {
-       float dt=td/Msp::Time::sec;
+       float dt = td/Msp::Time::sec;
 
-       const map<unsigned, Host *> &hosts=netvis.get_hosts();
-       float fx=-pos.x*0.1;
-       float fy=-pos.y*0.1;
+       activity.tick(td);
+       throttle -= dt;
+       if(throttle<0)
+               throttle = 0;
+
+       if(!active)
+               return;
+
+       const map<unsigned, Host *> &hosts = netvis.get_hosts();
+       float fx = -pos.x*0.1;
+       float fy = -pos.y*0.1;
        for(map<unsigned, Host *>::const_iterator i=hosts.begin(); i!=hosts.end(); ++i)
        {
                if(i->second!=this)
                {
-                       const Vector2 &other_pos=i->second->get_position();
-                       float dx=other_pos.x-pos.x;
-                       float dy=other_pos.y-pos.y;
-                       float d2=dx*dx+dy*dy;
-                       float d=sqrt(d2);
-
-                       unsigned other_addr=i->second->get_address();
-                       unsigned matching_bits=0;
+                       const Vector2 &other_pos = i->second->get_position();
+                       float dx = other_pos.x-pos.x;
+                       float dy = other_pos.y-pos.y;
+                       float d2 = dx*dx+dy*dy;
+                       float d = sqrt(d2);
+
+                       unsigned other_addr = i->second->get_address();
+                       unsigned matching_bits = 0;
                        for(unsigned j=32; (j-- && !((addr^other_addr)>>j));)
                                ++matching_bits;
 
-                       float nearness=24-min(matching_bits, 24U);
-                       float f=10000.0*(1.0/(60+nearness*15)-1.0/d);
+                       float optimal_dist = 100+(24-min(matching_bits, 24U))*12;
+                       float f = 5000.0*(1.0/optimal_dist-1.0/d);
 
-                       fx+=dx/d*f;
-                       fy+=dy/d*f;
+                       fx += dx/d*f;
+                       fy += dy/d*f;
                }
        }
 
        if(fx<-4 || fx>4)
-               pos.x+=fx*dt;
+               pos.x += fx*dt;
        if(fy<-4 || fy>4)
-               pos.y+=fy*dt;
+               pos.y += fy*dt;
 }
 
 void Host::render() const
 {
-       GL::push_matrix();
+       if(!active)
+               return;
+
+       GL::PushMatrix push_;
        GL::translate(static_cast<int>(pos.x), static_cast<int>(pos.y), 0);
 
-       GL::Immediate imm((GL::COLOR4_UBYTE, GL::VERTEX2));
+       GL::Immediate imm((GL::COLOR4_UBYTE, GL::TEXCOORD2, GL::VERTEX2));
        imm.begin(GL::QUADS);
-       imm.color(1.0f, 1.0f, 1.0f, 1.0f);
+       imm.color(1.0f, 1.0f, 1.0f, max(min(static_cast<float>(activity.get_average()/10000), 1.0f), 0.2f));
        imm.vertex(-5, -5);
        imm.vertex(5, -5);
        imm.vertex(5, 5);
        imm.vertex(-5, 5);
        imm.end();
 
-       const GL::Font &font=netvis.get_font();
-       GL::translate(-static_cast<int>(font.get_string_width(name)*5), 6, 0);
+       const GL::Font &font = netvis.get_font();
+       GL::translate(-static_cast<int>(font.get_string_width(short_name)*5), 6, 0);
        GL::scale_uniform(10);
-       font.draw_string(name);
-       GL::Texture::unbind();
 
-       GL::pop_matrix();
+       imm.color(1.0f, 1.0f, 1.0f);
+       font.draw_string(short_name, imm);
+       GL::Texture::unbind();
 }