]> git.llucax.com Git - z.facultad/75.42/plaqui.git/commitdiff
* Se agrega un nuevo mensaje para intercambio de colores que anda muy bien
authorRicardo Markiewicz <gazer.arg@gmail.com>
Sun, 30 Nov 2003 18:09:32 +0000 (18:09 +0000)
committerRicardo Markiewicz <gazer.arg@gmail.com>
Sun, 30 Nov 2003 18:09:32 +0000 (18:09 +0000)
   (por lo menos comparado con el anterior :-)
 * Se ajustan detalles en el modelo para que simule bien algunos casos
   particulares

13 files changed:
Client/src/principal.cpp
Model/include/plantitem.h
Model/include/union.h
Model/src/conduct.cpp
Model/src/drainage.cpp
Model/src/exclusa.cpp
Model/src/main.cpp
Model/src/plantitem.cpp
Model/src/pump.cpp
Model/src/simulator.cpp
Model/src/splitter.cpp
Model/src/tank.cpp
Model/src/union.cpp

index f9cb07fc7761a03aee0d281e329635e68e5a6f7f..845de818211325b867fd2eee0897d16dc0babf04 100644 (file)
@@ -846,7 +846,6 @@ bool Principal::get_bool_from_xml(xmlNodePtr nodo)
                }
                nodo = nodo->next;
        }
-       std::cout << "AAACCCCAA : " << tmp << std::endl;
        return tmp == "true";
 }
 
index 29fd05416447681537c28a191f41c1526c524292..a85f62dbe98f678f45a46c841aa7aba1e976d53d 100644 (file)
@@ -35,6 +35,10 @@ public:
         *  sí para determinar cual es el flujo que manejan en una iteración.
         */
        virtual void update(int dir=OUT) = 0;
+       
+       /** Actualiza el color de fluido */
+       virtual void update_color();
+       
        /** Hace la simulación de esta iteración
         *
         *  Por simulacion se entiende que el modelo debe avisar a las vistas
@@ -58,6 +62,8 @@ public:
                MSG_QUERY_MAX_FLOW_OUT = IConector::MSG_LAST, ///< flujo maximo a la salida
                MSG_QUERY_MAX_FLOW_IN, ///< flujo maximo a la entrada
                MSG_RESPONSE_MAX_FLOW, ///< responde al mensage QUERY_MAX_FLOW. data == float
+               MSG_QUERY_COLOR,
+               MSG_RESPONSE_COLOR,
                MSG_LAST
        };
 
@@ -77,7 +83,7 @@ protected:
        RGB fluid_color;
        // es de solo lectura
        std::string name;
-       bool updated;
+       bool updated, color_updated;
        float actual_flow;
 private:
        // Hago que no se puedan copiar objetos ElementosPlanta
index 0f494a207d7d776d4966f34e3044bde5edeb4fef..5069c80f956cc6d6a2b36bc423257d9031b6fcca 100644 (file)
@@ -28,6 +28,9 @@ public:
 protected:
        int in_on_zero; 
        int in_ready;
+       int in_colors;
+       RGB color1, color2;
+       float flow1, flow2;
 private:
        Union(const Union &):Transport("null") {}
        Union &operator = (const Union &) { return *this; }
index e4a89d07381236a2a3f92f1231af37ea1b02a4c6..08098d4f3486e40effd38cc7e345ae48a0d8074b 100644 (file)
@@ -54,15 +54,9 @@ void Conduct::update(int dir)
 {
        // Si ya me actualice, no lo tengo que hacer de nuevo
        if (updated) {
-               std::list<IConector *>::iterator i = in_list.begin();
-               if (i != in_list.end()) {
-                       PlantItem *o = (PlantItem *)(*i);
-                       set_color( o->get_color() );
-               }
                return;
        }
        // Seteo mi actualizar en true para evitar entrar de nuevo
-       actual_flow = 99999;
        updated = true;
        actual_flow = max_flow;
        send_msg(OUT, MSG_QUERY_MAX_FLOW_OUT, (void *)&actual_flow);
@@ -81,6 +75,7 @@ void Conduct::simulate()
        std::cout << name << "::Flujo actual = " << actual_flow << " de " << max_flow << std::endl;
 #endif
        updated = false;
+       color_updated = false;
 }
 
 
index bc83db6a42e2359fedffd56fe42bf0928b81cce7..6d7953483a88a825361b12137c5f637a785685be 100644 (file)
@@ -27,15 +27,11 @@ void Drainage::update(int dir)
 
 void Drainage::simulate()
 {
-       std::list<IConector *>::iterator i = in_list.begin();
-       if (i != in_list.end()) {
-               PlantItem *o = (PlantItem *)(*i);
-               set_color( o->get_color() );
-       }
 #ifdef DEBUG
        std::cout << name << "::Flujo recibido = " << actual_flow << std::endl;
 #endif
        updated = false;
+       color_updated = false;
        actual_flow = 0;
 }
 
index 8e56006d26ba2fbce6dde04ce258978084876455..f293208047a2ea1503d3a9ac93651852ec20b9b0 100644 (file)
@@ -23,11 +23,6 @@ Exclusa::~Exclusa()
 
 void Exclusa::update(int dir)
 {
-       std::list<IConector *>::iterator i = in_list.begin();
-       if (i != in_list.end()) {
-               PlantItem *o = (PlantItem *)(*i);
-               set_color( o->get_color() );
-       }
        // Primero me fijo si la entrada esta operando, es decir
        // si hay alguien conectado para automatizar.
        if (input->is_operational()) {
@@ -42,6 +37,9 @@ void Exclusa::simulate()
 #ifdef DEBUG
        std::cout << name << ": " << ((is_open)?"Abierta":"Cerrada") << std::endl;
 #endif
+
+       updated = false;
+       color_updated = false;
 }
 
 void Exclusa::recieve_msg(int msg, IConector *who, void *data)
index 8671daa9780011119fd8efbcc3d5ba9a3c68b54e..7c7f1e327f6eb700614cb34f325c2613a0819c9e 100644 (file)
@@ -26,7 +26,7 @@ int main(int argc, char *argv[])
                }
                i++;
                sim->simulate();
-               std::cout << sim->get_state_as_xml() << std::endl << std::endl;
+               //std::cout << sim->get_state_as_xml() << std::endl << std::endl;
        }
 
        delete sim;
index 9405a945455e2191f23b9df591bcd5fd32e69482..50d8e9884c34571e9a786acf194828a6b7936fda 100644 (file)
@@ -1,6 +1,6 @@
 
-
 #include "plantitem.h"
+#include <iostream>
 
 using namespace PlaQui::Model;
 
@@ -9,6 +9,7 @@ PlantItem::PlantItem(const std::string &_name):IConector(0, 0)
        name = _name;
        updated = false;
        fluid_color = RGB(255,255,255);
+       color_updated = false;
 }
 
 PlantItem::PlantItem(unsigned ins, unsigned outs):IConector(ins, outs)
@@ -27,11 +28,32 @@ void PlantItem::recieve_msg(int msg, IConector *who, void *data)
                        // TODO
                        return;
                break;
+               case MSG_QUERY_COLOR:
+                       if (color_updated) {
+                               who->recieve_msg(MSG_RESPONSE_COLOR, this, &fluid_color);
+                       }
+                       update_color();
+                       who->recieve_msg(MSG_RESPONSE_COLOR, this, &fluid_color);
+               break;
+               case MSG_RESPONSE_COLOR:
+               {
+                       RGB *c = ((RGB *)data);
+                       set_color(*c);
+               }
+               break;
                default:
                        IConector::recieve_msg(msg, who, data);
        }
 }
 
+void PlantItem::update_color()
+{
+       if (color_updated) return;
+
+       send_msg(IConector::IN, MSG_QUERY_COLOR);
+       color_updated = true;
+}
+
 void PlantItem::get_state_as_xml(std::stringstream &out)
 {
        out << "\t<float name=\"" << name << "\">" << std::endl;
index 93b8b72060643f95ec9f2bce3e12dfe8917105df..7332c91e1d4d8186ddc15c8a0b325e7805bedf57 100644 (file)
@@ -14,6 +14,8 @@ Pump::Pump(const std::string &_name):Source(_name),Control(_name)
        input = new ByPass();
        output = new ByPass();
        ((ByPass *)output)->set_control(this);
+       /* El color de la bomba siempre esta actualizado */
+       color_updated = true;
 }
 
 Pump::~Pump()
@@ -27,7 +29,6 @@ void Pump::update(int dir)
        if (updated) return;
        // Me fijo si me tengo que apagar automaticamente
        open = input->get_output();
-       std::cout << name << " open = " << (open?"true":"false") << std::endl;
        if (active && open)
                actual_flow = max_flow;
        else
@@ -43,6 +44,7 @@ void Pump::simulate()
        std::cout << ((active && open)?" (funcionando)":" (apagada)") << std::endl;
 #endif
        updated = false;
+       color_updated = true;
 }
 
 bool Pump::get_output()
@@ -63,6 +65,10 @@ void Pump::recieve_msg(int msg, IConector *who, void *data)
                        if (tmp < actual_flow) actual_flow = tmp;
                }
                break;
+               case MSG_RESPONSE_COLOR:
+                       /* Por las dudas, la bomba no debe cambiar de color */
+                       ;
+               break;
                default:
                        Source::recieve_msg(msg, who, data);
        }
index 9e84e8a257559f093b83e56fbd43000bcd2ae77f..981b546feb2f4fa32dfe18cac5a3fb609525473c 100644 (file)
@@ -158,8 +158,10 @@ void Simulator::simulate()
                (*i1)->update();
 
        std::list<PlantItem *>::iterator i2;
-       for(i2=items.begin(); i2!=items.end(); i2++) 
+       for(i2=items.begin(); i2!=items.end(); i2++) {
                (*i2)->update();
+               (*i2)->update_color();
+       }
        
        for(i2=items.begin(); i2!=items.end(); i2++) 
                (*i2)->simulate();
@@ -512,15 +514,11 @@ void Simulator::do_connections(xmlNodePtr nodo)
                                // bien, es a la entrada!, obtengo el item al cual lo tengo que conectar
                                to_connect = find((char *)XML_GET_CONTENT(conector3->children));
                                // y lo conecto
-                               if (!current_item->connect(to_connect, IConector::IN)) {
-                                       std::cout << s << " Error al conectar " << std::endl;
-                               }
+                               current_item->connect(to_connect, IConector::IN);
                        } else if (xmlStrcmp(conector3->name, BAD_CAST"salida") == 0) {
                                // Era a salida, es casi lo mismo que arriba 
                                to_connect = find((char *)XML_GET_CONTENT(conector3->children));
-                               if (!current_item->connect(to_connect, IConector::OUT)) {
-                                       std::cout << s << " Error al conectar " << std::endl;
-                               }
+                               current_item->connect(to_connect, IConector::OUT);
                        }
                }
                nodo = nodo->next;
index c3ce1b4dc9664772f82f3522d6ef21bff28950c8..140bf7e58b9b9d3f52e6462cab1227c97a80df60 100644 (file)
@@ -89,14 +89,10 @@ void Splitter::simulate()
                return;
        }
 
-       std::list<IConector *>::iterator i = in_list.begin();
-       if (i != in_list.end()) {
-               PlantItem *o = (PlantItem *)(*i);
-               set_color( o->get_color() );
-       }
 #ifdef DEBUG
        std::cout << name << "::Flujo actual = " << actual_flow << std::endl;
 #endif
        updated = false;
+       color_updated = false;
 }
 
index 4abbc6b82eeeef32cd3cc80cf504c50a930bfd01..e526716a69c1be84fd1a66b190fbead931076d7d 100644 (file)
@@ -33,28 +33,10 @@ void Tank::update(int dir)
 void Tank::simulate()
 {
        if (!updated) return;
-       RGB in_color;
-
-       std::list<IConector *>::iterator i = in_list.begin();
-       if (i != in_list.end()) {
-               PlantItem *o = (PlantItem *)(*i);
-               in_color = o->get_color();
-       }
 
        // le sumo lo que recibo
        litros += actual_in_flow;
        // calculo el nuevo color
-       int r, g, b;
-       float l = litros;
-
-       r = (int)(fluid_color.r()*litros/l + in_color.r()*actual_in_flow/l);
-       g = (int)(fluid_color.g()*litros/l + in_color.g()*actual_in_flow/l);
-       b = (int)(fluid_color.b()*litros/l + in_color.b()*actual_in_flow/l);
-
-       if (r>255) r = 255;
-       if (g>255) g = 255;
-       if (b>255) b = 255;
-       fluid_color = RGB(r,g,b);
 
        // le resto lo que entrego
        litros -= actual_out_flow;
@@ -64,6 +46,7 @@ void Tank::simulate()
        std::cout << "  Litros : " << litros << std::endl;
 #endif
        updated = false;
+       color_updated = false;
 }
 
 void Tank::recieve_msg(int msg, IConector *who, void *data)
@@ -95,6 +78,20 @@ void Tank::recieve_msg(int msg, IConector *who, void *data)
                                if (*((float *)data) < actual_out_flow)
                                        actual_out_flow = *((float *)data);
                        }
+               break;
+               case MSG_RESPONSE_COLOR:
+                       RGB c = *((RGB *)data);
+                       PlantItem *ic = static_cast<PlantItem *>(*(in_list.begin()));
+                       int r,g,b;
+                       float total = litros + ic->get_actual_flow();
+                       
+                       r = (int)(get_color().r()*litros/total + c.r()*ic->get_actual_flow()/total);
+                       g = (int)(get_color().g()*litros/total + c.g()*ic->get_actual_flow()/total);
+                       b = (int)(get_color().b()*litros/total + c.b()*ic->get_actual_flow()/total);
+                       r %= 256;
+                       g %= 256;
+                       b %= 256;
+                       set_color(RGB(r,g,b));
        }
 }
 
index f581a67033e1211f2bc2dedec8973623f6cebfea..7fe666b6930726011701c6dc9cf2cf4a55cfdd4d 100644 (file)
@@ -36,7 +36,8 @@ void Union::recieve_msg(int msg, IConector *who, void *data)
                        float tmp;
 
                        if (updated) {
-                               who->recieve_msg(MSG_RESPONSE_MAX_FLOW, this, &actual_flow);
+                               float tmp = actual_flow/2.0f;
+                               who->recieve_msg(MSG_RESPONSE_MAX_FLOW, this, &tmp);
                                break;
                        }
                        updated = true;
@@ -87,6 +88,35 @@ void Union::recieve_msg(int msg, IConector *who, void *data)
                        }
                }
                break;
+               case MSG_RESPONSE_COLOR:
+                       if (in_colors == 0) {
+                               color1 = *((RGB *)data);
+                               flow1 = static_cast<PlantItem *>(who)->get_actual_flow();
+                               in_colors++;
+                       } else {
+                               color2  = *((RGB *)data);
+                               flow2 = static_cast<PlantItem *>(who)->get_actual_flow();
+
+                               /* Ya tengo mis 2 colores, los sumo */
+                               int r,g,b;
+                               int n=2;
+                               if (flow1 == 0) n--;
+                               if (flow2 == 0) n--;
+                               float suma = flow1+flow2;
+                               if (n != 0) {
+                                       r = (int)(color1.r()*flow1/suma + color2.r()*flow2/suma)/n;
+                                       g = (int)(color1.g()*flow1/suma + color2.g()*flow2/suma)/n;
+                                       b = (int)(color1.b()*flow1/suma + color2.b()*flow2/suma)/n;
+                                       r %= 256;
+                                       g %= 256;
+                                       b %= 256;
+                                       set_color(RGB(r,g,b));
+                               } else {
+                                       set_color(RGB(0,0,0));
+                               }
+                               color_updated = true;
+                       }
+               break;
                default:
                        Transport::recieve_msg(msg, who, data);
        }
@@ -95,41 +125,8 @@ void Union::recieve_msg(int msg, IConector *who, void *data)
 void Union::update(int dir)
 {
        // Si ya me actualice, no lo tengo que hacer de nuevo
-       RGB c_in1, c_in2;
-       unsigned r=0,g=0,b=0;
-       float c_f1, c_f2; // para ver los flujos de cada uno
-
-       if (updated) {
-               std::list<IConector *>::iterator i = in_list.begin();
-               if (i != in_list.end()) {
-                       PlantItem *o = (PlantItem *)(*i);
-                       c_in1 = o->get_color();
-                       c_f1 = o->get_actual_flow();
-                       i++;
-                       o = (PlantItem *)(*i);
-                       c_in2 = o->get_color();
-                       c_f2 = o->get_actual_flow();
-               }
-
-               set_color( RGB(r,g,b) );
-               if ((c_f1 != 0) && (c_f2 != 0)) {
-                       // Si ambas entradas traen flujo, sumo sus colores
-                       int total = c_f1+c_f2;
-                       r = ((int)((c_in1.r()*c_f1/total+c_in2.r()*c_f2/total)))%256;
-                       g = ((int)((c_in1.g()*c_f1/total+c_in2.g()*c_f2/total)))%256;
-                       b = ((int)((c_in1.b()*c_f1/total+c_in2.b()*c_f2/total)))%256;
-                       set_color(RGB(r,g,b));
-               } else {
-                       // Veo que entrada trae color
-                       if (c_f1 != 0) {
-                               set_color( c_in1 );
-                       }
-                       if (c_f2 != 0) {
-                               set_color( c_in2 );
-                       }
-               }
-               return;
-       }
+       if (updated) return;
+       
        // Seteo mi actualizar en true para evitar entrar de nuevo
        // FIXME : 99999 == INFINITO!!
        actual_flow = 99999;
@@ -151,7 +148,10 @@ void Union::simulate()
        std::cout << name << "::Flujo actual = " << actual_flow << std::endl;
 #endif
        updated = false;
+       color_updated = false;
        in_on_zero = 0;
        in_ready = 0;
+       color_updated = false;
+       in_colors = 0;
 }