From: Ricardo Markiewicz Date: Thu, 13 Nov 2003 05:32:39 +0000 (+0000) Subject: * Se agrega un Tanque al ejemplo, y ANDA!!!! X-Git-Tag: svn_import~302 X-Git-Url: https://git.llucax.com/z.facultad/75.42/plaqui.git/commitdiff_plain/f29a7129de56edca96ea8ef58576898c1e52ed6f * Se agrega un Tanque al ejemplo, y ANDA!!!! * Se agrega un metodo (temporal) para apagar bombas (utiliza RTTI!) * Los headers estan un poco mas comentados --- diff --git a/Model/include/and.h b/Model/include/and.h index be71958..7bd1a89 100644 --- a/Model/include/and.h +++ b/Model/include/and.h @@ -9,6 +9,7 @@ namespace PlaQui { namespace Model { +/** Función AND Lógica */ class And:LogicControl { public: And():LogicControl(MAX_INT,1) {} diff --git a/Model/include/bypass.h b/Model/include/bypass.h index 4282752..689a049 100644 --- a/Model/include/bypass.h +++ b/Model/include/bypass.h @@ -10,6 +10,21 @@ 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_ diff --git a/Model/include/control.h b/Model/include/control.h index 35d55c2..a9e8bb5 100644 --- a/Model/include/control.h +++ b/Model/include/control.h @@ -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 */ diff --git a/Model/include/iconector.h b/Model/include/iconector.h index f3f6760..d4e2465 100644 --- a/Model/include/iconector.h +++ b/Model/include/iconector.h @@ -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); diff --git a/Model/include/logiccontrol.h b/Model/include/logiccontrol.h index d4434f4..76f7174 100644 --- a/Model/include/logiccontrol.h +++ b/Model/include/logiccontrol.h @@ -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. diff --git a/Model/include/or.h b/Model/include/or.h index 502fe41..0bbc22c 100644 --- a/Model/include/or.h +++ b/Model/include/or.h @@ -9,6 +9,7 @@ namespace PlaQui { namespace Model { +/** Función O Lógica */ class Or:LogicControl { public: Or():LogicControl(MAX_INT,1) {} diff --git a/Model/include/simulador.h b/Model/include/simulador.h index 0082a54..8f5713c 100644 --- a/Model/include/simulador.h +++ b/Model/include/simulador.h @@ -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 diff --git a/Model/include/tank.h b/Model/include/tank.h index a87f50f..edbe0a1 100644 --- a/Model/include/tank.h +++ b/Model/include/tank.h @@ -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 diff --git a/Model/src/main.cpp b/Model/src/main.cpp index 3efdf8e..ab4f7f6 100644 --- a/Model/src/main.cpp +++ b/Model/src/main.cpp @@ -8,6 +8,7 @@ #include "drainage.h" #include "exclusa.h" #include +#include #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++; } diff --git a/Model/src/simulador.cpp b/Model/src/simulador.cpp index 23fe950..b3a93b1 100644 --- a/Model/src/simulador.cpp +++ b/Model/src/simulador.cpp @@ -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(find(name)); + + if (!pump) { + // Ups!, "name" no era un Pump!!! + return false; + } + pump->deactivate(); + return true; +} +