]> git.llucax.com Git - z.facultad/75.42/plaqui.git/commitdiff
* Se agrega un Tanque al ejemplo, y ANDA!!!!
authorRicardo Markiewicz <gazer.arg@gmail.com>
Thu, 13 Nov 2003 05:32:39 +0000 (05:32 +0000)
committerRicardo Markiewicz <gazer.arg@gmail.com>
Thu, 13 Nov 2003 05:32:39 +0000 (05:32 +0000)
 * Se agrega un metodo (temporal) para apagar bombas (utiliza RTTI!)
 * Los headers estan un poco mas comentados

Model/include/and.h
Model/include/bypass.h
Model/include/control.h
Model/include/iconector.h
Model/include/logiccontrol.h
Model/include/or.h
Model/include/simulador.h
Model/include/tank.h
Model/src/main.cpp
Model/src/simulador.cpp

index be71958e4e5a4f96b761dae551d8b640bd0b9edf..7bd1a89deb7ae9dbf13bdde2d9102494d39f80d8 100644 (file)
@@ -9,6 +9,7 @@
 namespace PlaQui {
 namespace Model {
 
+/** Función AND Lógica */
 class And:LogicControl {
 public:
        And():LogicControl(MAX_INT,1) {}
index 4282752e4f8593b6956ae8bd0236e0b45a04017b..689a049f724e81c36b89fcd1799f93529a430f22 100644 (file)
 namespace PlaQui {
 namespace Model {
 
+/** Paso directo de dato
+ *
+ *  Este elemento tiene la funcionalidad para trabajar como entrada
+ *  o salida de un elemento conectado.
+ *  Si el elemento es utilizado como entrada, a este se le conecta
+ *  lógica de control a su entrada. Cuando el elemento al que sirve
+ *  requiere saber su estado, llama al método get_output de este objeto
+ *  y este le responde segun corresponda.
+ *  Si este objeto es utilizado como salida, se le debe asignar un
+ *  elemento a quién controlar. Cuando la lógica de control llama
+ *  al get_output de éste objeto, éste le consulta al objeto a quién
+ *  controla para pasar el dato al circuito lógico.
+ *  \see Pump
+ *  \see Exclusa
+ */
 class ByPass:public LogicControl {
 public:
        ByPass():LogicControl(1,1) { control = NULL; }
@@ -18,12 +33,11 @@ public:
        virtual bool get_output() {
                LogicControl *mi_entrada;
                bool mi_salida = false;
-               // Si tengo conectado algo a mi salida, es porque
+               // Si tengo asignado un objeto a quien controlar, es porque
                // le tengo que consultar a el.
-               // Si no tengo nadia a mi salida, es porque tengo 
-               // que consultar a mis entradas
+               // Si no, es porque tengo que consultar a mis entradas
                if (control == NULL) {
-                       // No tengo nadie a mi salida!, pregunto a mis entradas, si es
+                       // No tcontrolo a nadie!, pregunto a mi entradas, si es
                        // que tengo!!
                        if (in_list.begin() != in_list.end()) {
                                mi_entrada = (LogicControl *)(*in_list.begin());
@@ -57,5 +71,5 @@ protected:
 }
 }
 
-#endif // _OR_H_
+#endif // _BYPASS_H_
 
index 35d55c2627461bb336ff5879cec15bbef46b1957..a9e8bb5cd5983c8c0b84d28890896caac0fd3330 100644 (file)
@@ -9,7 +9,13 @@ namespace PlaQui {
 
 namespace Model {
 
-/** Elementos que pueden ser automatizados */
+/** Elementos que pueden ser automatizados
+ *
+ *  Estos elementos tienen entradas y salidas lógicas para que dan la
+ *  posibilidad de conectar elementos \e Control entre ellos y así
+ *  poder crear circuitos "inteligentes".
+ *  \see LogicControl
+ * */
 class Control:public PlantItem {
 public:
        /// Constructor
@@ -17,7 +23,7 @@ public:
        /// Destructor
        virtual ~Control();
 
-       /// Retorna un estado booleano dependiendo de su estado actual
+       /// Retorna un booleano dependiendo de su estado actual
        virtual bool get_output() = 0;
 
        /** Conecta una lógica de control a mi entrada */
index f3f67601cfd8a30ba5b923d132053bca99fea0d5..d4e2465dfb9dfeb44b4366033e42c6501ddb8659 100644 (file)
@@ -32,6 +32,7 @@ public:
         *  a la salida.
         *  \param where Donde enviar el mensage, IConector::IN o IConector::OUT
         *  \param msg Mensage a enviar
+        *  \param data dato opcional a mandar, según el mensage que se envíe
         */
        void send_msg(int where, int msg, void *data=NULL);
        
index d4434f4bcdcd770436be2cf43eccac1e8c8a1b46..76f71742808c0493114720c5a06e9de54fd7dcf2 100644 (file)
@@ -32,7 +32,8 @@ public:
        /** 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.
+        *  se deduce si tiene alguien conectado a sus entradas (o sea, si
+        *  tiene alguien a quien consultar por un estado logico).
         *  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.
index 502fe416fcbaea19fe4a8bafc5200101ea7c402d..0bbc22cb6fe7a9a625b530b814f2e48a703c4512 100644 (file)
@@ -9,6 +9,7 @@
 namespace PlaQui {
 namespace Model {
 
+/** Función O Lógica */
 class Or:LogicControl {
 public:
        Or():LogicControl(MAX_INT,1) {}
index 0082a545c04cc475dc588dcf020c1b88a34de13f..8f5713c62da4e12ccdb55f512c66b8e6cf32452f 100644 (file)
@@ -44,6 +44,8 @@ public:
 
        /// Tipos de elementos
        enum {PUMP, UNION, SPLITTER, CONDUCT, EXCLUSA, TANK, DRAINAGE};
+
+       bool pump_deactivate(const std::string &name);
 protected:
        // Los mantengo en listas separadas para ahorrar
        // CPU y no tener que usar dinamic_cast
index a87f50f55ddc25a566ccb5d76188c661fa0527eb..edbe0a13c50cfd29ebb1dfc5c00c17f98b478800 100644 (file)
@@ -30,6 +30,8 @@ public:
        virtual void recieve_msg(int msg, IConector *who, void *data);
        virtual void update(int dir=OUT);
        virtual void simulate();
+
+       void set_litros(float l) { litros = l; }
 protected:
        float litros;   ///< cantidad de líquido actual
        float actual_in_flow; ///< flujo máximo a la entrada
index 3efdf8e10d70c2a7d79d50067b215018037e5dc9..ab4f7f648407301aa4fa424a93f35fa5074102c3 100644 (file)
@@ -8,6 +8,7 @@
 #include "drainage.h"
 #include "exclusa.h"
 #include <unistd.h>
+#include <iostream>
 #include "simulador.h"
 
 using namespace std;
@@ -19,14 +20,23 @@ int main(int argc, char *argv[])
 
        sim->add_pump("bomba1");
        sim->add_conduct("c");
+       sim->add_conduct("c1");
        sim->add_drainage("d");
+       sim->add_tank("tanque");
 
        sim->connect("bomba1", "c", IConector::OUT);
-       sim->connect("c", "d", IConector::OUT);
+       sim->connect("c", "tanque", IConector::OUT);
+       sim->connect("tanque", "c1", IConector::OUT);
+       sim->connect("c1", "d", IConector::OUT);
 
        int i=0;
        while (i<10) {
                sim->simulate();
+               if (i == 4) {
+                       if (!sim->pump_deactivate("bomba1")) {
+                               std::cout << "c no es pump :-)" << std::endl;
+                       }
+               }
                i++;
        }
 
index 23fe950b97c40258bd847eb44c0088d8e471ee55..b3a93b1391f1bac799a403211041e48c05c3ebb1 100644 (file)
@@ -59,6 +59,9 @@ void Simulador::add_exclusa(const std::string &name)
 void Simulador::add_tank(const std::string &name)
 {
        Tank *p = new Tank(name);
+       p->set_capacity(100);
+       p->set_max_flow(10);
+       p->set_litros(50);
        tank_lst.push_back(p);
        items.push_back(p);
 }
@@ -117,3 +120,16 @@ IConector *Simulador::find(const std::string &name)
        return NULL;
 }
 
+bool Simulador::pump_deactivate(const std::string &name)
+{
+       // Busco el elemento, usando RTTI :-(
+       Pump *pump = dynamic_cast<Pump *>(find(name));
+
+       if (!pump) {
+               // Ups!, "name" no era un Pump!!!
+               return false;
+       }
+       pump->deactivate();
+       return true;
+}
+