]> git.llucax.com Git - z.facultad/75.42/plaqui.git/commitdiff
* Se agrega una exclusa al ejemplo a la salida de la bomba.
authorRicardo Markiewicz <gazer.arg@gmail.com>
Sat, 8 Nov 2003 20:26:09 +0000 (20:26 +0000)
committerRicardo Markiewicz <gazer.arg@gmail.com>
Sat, 8 Nov 2003 20:26:09 +0000 (20:26 +0000)
 * Se conecta la logica de control de la exclusa con la bomba. Ahora en lugar
 de apagar la bomba, cierro la exclusa, lo que deriva en que la bomba se apague
 :-)

Model/include/control.h
Model/include/exclusa.h
Model/include/logiccontrol.h
Model/src/control.cpp
Model/src/drainage.cpp
Model/src/exclusa.cpp
Model/src/main.cpp
docs/clases.dia

index 3763da9f38de95061fe41e1035630bef3bc223f5..35d55c2627461bb336ff5879cec15bbef46b1957 100644 (file)
@@ -19,6 +19,14 @@ public:
 
        /// Retorna un estado booleano dependiendo de su estado actual
        virtual bool get_output() = 0;
+
+       /** Conecta una lógica de control a mi entrada */
+       void connect_input_logic(LogicControl *);
+       /** Conecta una lógica de control a mi salida */
+       void connect_output_logic(LogicControl *);
+
+       LogicControl *get_logic_output() { return output; }
+       LogicControl *get_logic_input() { return input; }
 protected:
        LogicControl *input;
        LogicControl *output;
index 75ab185c50897e3e4e05aac371e714841ec12ac5..d0c1f2250e5a0b7f27ab22b904d3a541821530fc 100644 (file)
@@ -20,9 +20,13 @@ public:
        virtual void simulate();
        virtual void recieve_msg(int msg, IConector *who, void *data);
        
-       virtual bool get_output() { return open; }
+       virtual bool get_output() { return is_open; }
+
+       void open() { is_open = true; }
+       void close() { is_open = false; }
 protected:
-       bool open;
+       bool is_open;
+       float temp;
 private:
        Exclusa():Control("null") {}
        Exclusa &operator = (const Exclusa &) { return *this; }
index 758f238c0262d02dd14eb93b049d5839fa5e097d..d4434f4bcdcd770436be2cf43eccac1e8c8a1b46 100644 (file)
@@ -28,6 +28,17 @@ public:
         *  implementar.
         */
        virtual bool get_output() = 0;
+
+       /** Dice si la logica esta o no en operacion
+        *
+        *  La logica de control puede no estar siendo utilizada, y eso
+        *  se deduce si tiene alguien conectado a sus entradas.
+        *  Si no hay nadie conectado, se contempla que no se esta utilizando
+        *  y se debe utilizar en los casos que sea necesario para no recibir
+        *  entradas falsas en los objetos controlados.
+        *  \see Exclusa::update
+        */
+       bool is_operational() { return (in_list.begin() != in_list.end()); }
 };
 
 }
index e29725333716e5ff5039307881ce841895e45f27..843aa6f8be23a60cdeeb6604a84714dc9515afc6 100644 (file)
@@ -11,3 +11,13 @@ Control::~Control()
 {
 }
 
+void Control::connect_input_logic(LogicControl *c)
+{
+       input->connect(c, IConector::IN);
+}
+
+void Control::connect_output_logic(LogicControl *c)
+{
+       c->connect(output, IConector::IN);
+}
+
index ac2868a5155a6f3b359eb3b026399a8864540f86..80dc0101ec1a4a170f2d9dbd11df44e145430a71 100644 (file)
@@ -39,7 +39,6 @@ void Drainage::recieve_msg(int msg, IConector *who, void *data)
                case MSG_QUERY_MAX_FLOW_OUT:
                        // FIXME Hacer INFINITO !!!
                        actual_flow = *((float *)data);
-                       std::cout << "DD" << std::endl;
                        tmp = 999999;
                        who->recieve_msg(MSG_RESPONSE_MAX_FLOW, this, &tmp);
                        updated = true;
index 326a7b9e04df00788edef54cb5610ec8803ef250..34b2fab6164207dc6255ceb03cdbccd1712a7da8 100644 (file)
@@ -6,7 +6,7 @@ using namespace PlaQui::Model;
 
 Exclusa::Exclusa(const std::string &_name):Control(_name)
 {
-       open = true;
+       is_open = true;
        in_slots = out_slots = 1;
        // Genero mi logica de control
        input = new ByPass();
@@ -20,22 +20,27 @@ Exclusa::~Exclusa()
 
 void Exclusa::update(int dir)
 {
-       // Mi entrada define mi estado
-       open = input->get_output();
+       // Primero me fijo si la entrada esta operando, es decir
+       // si hay alguien conectado para automatizar.
+       if (input->is_operational()) {
+               // como si lo hay, entonces pregunto cual debe ser
+               // mi estado
+               is_open = input->get_output();
+       }
 }
 
 void Exclusa::simulate()
 {
-       std::cout << name << ": " << ((open)?"Abierta":"Cerrada") << std::endl;
+       std::cout << name << ": " << ((is_open)?"Abierta":"Cerrada") << std::endl;
 }
 
 void Exclusa::recieve_msg(int msg, IConector *who, void *data)
 {
-       float temp;
        switch (msg) {
                case MSG_QUERY_MAX_FLOW_OUT:
                        temp = *((float *)data);
                        send_msg(OUT, MSG_QUERY_MAX_FLOW_OUT, &temp);
+                       who->recieve_msg(MSG_RESPONSE_MAX_FLOW, this, &temp);
                break;
                case MSG_RESPONSE_MAX_FLOW:
                        temp = *((float *)data);
index 3fa359ecf1004263eef690f8761fd7f7477e0adb..5f9187e4ac2450a84f72a1d445b856d2fbdc333b 100644 (file)
@@ -6,6 +6,7 @@
 #include "union.h"
 #include "splitter.h"
 #include "drainage.h"
+#include "exclusa.h"
 #include <unistd.h>
 
 using namespace std;
@@ -14,6 +15,7 @@ using namespace PlaQui::Model;
 int main(int argc, char *argv[])
 {
        Pump *bomba1;
+       Exclusa *exclusa1;
        Conduct *salida1;
        Conduct *salida2;
        Conduct *entrada;
@@ -27,6 +29,7 @@ int main(int argc, char *argv[])
        salida1->set_max_flow(2);
        salida2 = new Conduct("salida_2");
        salida2->set_max_flow(5);
+       exclusa1 = new Exclusa("exclusa1");
 
        split = new Splitter("splitter");
        split->set_max_flow(8);
@@ -36,8 +39,10 @@ int main(int argc, char *argv[])
        dren1 = new Drainage("drenaje1");
        dren2 = new Drainage("drenaje2");
 
-       bomba1->connect(entrada, IConector::OUT);
-       entrada->connect(bomba1, IConector::IN);
+       bomba1->connect(exclusa1, IConector::OUT);
+       exclusa1->connect(bomba1, IConector::IN);
+       exclusa1->connect(entrada, IConector::OUT);
+       entrada->connect(exclusa1, IConector::IN);
        entrada->connect(split, IConector::OUT);
        split->connect(entrada, IConector::IN);
        split->connect(salida1, IConector::OUT);
@@ -47,9 +52,14 @@ int main(int argc, char *argv[])
        salida1->connect(dren1, IConector::OUT);
        salida2->connect(dren2, IConector::OUT);
 
+       //// LOGICA DE CONTROL!!
+       // CONECTO LA SALIDA DE LA EXCLUSA A LA ENTRADA DE LA BOMBA
+       bomba1->connect_input_logic( exclusa1->get_logic_output() );
+
        int i = 0;
        while (i<10) {
                bomba1->update();
+               exclusa1->update();
                salida1->update();
                salida2->update();
                entrada->update();
@@ -58,6 +68,7 @@ int main(int argc, char *argv[])
                dren2->update();
 
                bomba1->simulate();
+               exclusa1->simulate();
                salida1->simulate();
                salida2->simulate();
                entrada->simulate();
@@ -67,7 +78,9 @@ int main(int argc, char *argv[])
                                        
                sleep(1);
                if (i == 5) {
-                       bomba1->deactivate();
+                       //bomba1->deactivate();
+                       // Ahora cierro la exclusa!, la bomba deberia apagarse!!!
+                       exclusa1->close();
                }
                i++;
        }
index 3ec90939ba0defec5d2b1659ec2b985ab5772823..bfc8ef4fc423b8f425f46443a8737ee16e4e72d5 100644 (file)
Binary files a/docs/clases.dia and b/docs/clases.dia differ