]> git.tdb.fi Git - netvis.git/blobdiff - source/port.cpp
Handle ICMP packets
[netvis.git] / source / port.cpp
index d4be82ce182b0c7d195557741d114cafbc8896f9..678be06e991bdfb4dce3bbd31f88c36732795cbd 100644 (file)
@@ -22,6 +22,7 @@ using namespace Msp;
 Port::Port(NetVis &v, unsigned n):
        netvis(v),
        number(n),
+       registered(false),
        mesh((GL::COLOR4_UBYTE, GL::VERTEX2))
 {
        char buf[128];
@@ -31,12 +32,19 @@ Port::Port(NetVis &v, unsigned n):
        addr.sin_addr.s_addr = 0;
        int err = getnameinfo(reinterpret_cast<sockaddr *>(&addr), sizeof(sockaddr_in), 0, 0, buf, sizeof(buf), 0);
        if(err==0)
+       {
                name = buf;
+               registered = !isdigit(name[0]);
+       }
        else
-               name = Msp::lexical_cast(number);
+               name = Msp::lexical_cast<string>(number);
 
+       const map<unsigned, Port *> &ports = netvis.get_ports();
+       unsigned tries = 100;
+       if(ports.size()>100 && !registered)
+               tries = 10000/ports.size()+1;
        float best_score = 0;
-       for(unsigned i=0; (i<100 && best_score<1); ++i)
+       for(unsigned i=0; (i<tries && best_score<1); ++i)
        {
                GL::Color c;
                c.r = rand()*1.0/RAND_MAX;
@@ -44,7 +52,7 @@ Port::Port(NetVis &v, unsigned n):
                c.b = rand()*1.0/RAND_MAX;
                float high = max(max(c.r, c.g), c.b);
                c = c*(1.0/high);
-               if(number<1024)
+               if(registered)
                {
                        float low = min(min(c.r, c.g), c.b);
                        c = (c+-low)*(1/(1-low));
@@ -53,9 +61,10 @@ Port::Port(NetVis &v, unsigned n):
                        c = c*0.6+0.4;
 
                float score = 2;
-               const map<unsigned, Port *> &ports = netvis.get_ports();
                for(map<unsigned, Port *>::const_iterator j=ports.begin(); j!=ports.end(); ++j)
                {
+                       if(registered && !j->second->is_registered())
+                               break;
                        const GL::Color &other = j->second->get_color();
                        float dr = c.r-other.r;
                        float dg = c.g-other.g;
@@ -83,13 +92,38 @@ Port::Port(NetVis &v, unsigned n):
        bld.end();
 }
 
+void Port::set_name(const string &n)
+{
+       name = n;
+}
+
+void Port::add_activity(unsigned bytes)
+{
+       activity.add_bytes(bytes);
+}
+
+void Port::tick(const Time::TimeDelta &dt)
+{
+       activity.tick(dt);
+}
+
 void Port::render() const
 {
-       GL::PushMatrix push_;
+       GL::MatrixStack::Push push_(GL::MatrixStack::modelview());
        mesh.draw();
-       GL::translate(16, 1, 0);
-       GL::scale_uniform(10);
-       GL::Immediate imm((GL::COLOR4_UBYTE, GL::TEXCOORD2, GL::VERTEX2));
-       netvis.get_font().draw_string(name, imm);
+       {
+               GL::Immediate imm((GL::COLOR4_UBYTE, GL::VERTEX2));
+               imm.begin(GL::QUADS);
+               imm.color(color.r, color.g, color.b, color.a);
+               unsigned x = static_cast<unsigned>(activity.get_average()/4096);
+               imm.vertex(14, 0);
+               imm.vertex(14+x, 0);
+               imm.vertex(14+x, 10);
+               imm.vertex(14, 10);
+               imm.end();
+       }
+       GL::MatrixStack::modelview() *= GL::Matrix::translation(16, 1, 0);
+       GL::MatrixStack::modelview() *= GL::Matrix::scaling(10);
+       netvis.get_font().draw_string(name);
        GL::Texture::unbind();
 }