From: Ricardo Markiewicz Date: Sat, 8 Nov 2003 20:26:09 +0000 (+0000) Subject: * Se agrega una exclusa al ejemplo a la salida de la bomba. X-Git-Tag: svn_import~328 X-Git-Url: https://git.llucax.com/z.facultad/75.42/plaqui.git/commitdiff_plain/0aacdcf95cf6d4f33a2201160d472ab84148d52b?ds=inline * Se agrega una exclusa al ejemplo a la salida de la bomba. * 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 :-) --- diff --git a/Model/include/control.h b/Model/include/control.h index 3763da9..35d55c2 100644 --- a/Model/include/control.h +++ b/Model/include/control.h @@ -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; diff --git a/Model/include/exclusa.h b/Model/include/exclusa.h index 75ab185..d0c1f22 100644 --- a/Model/include/exclusa.h +++ b/Model/include/exclusa.h @@ -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; } diff --git a/Model/include/logiccontrol.h b/Model/include/logiccontrol.h index 758f238..d4434f4 100644 --- a/Model/include/logiccontrol.h +++ b/Model/include/logiccontrol.h @@ -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()); } }; } diff --git a/Model/src/control.cpp b/Model/src/control.cpp index e297253..843aa6f 100644 --- a/Model/src/control.cpp +++ b/Model/src/control.cpp @@ -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); +} + diff --git a/Model/src/drainage.cpp b/Model/src/drainage.cpp index ac2868a..80dc010 100644 --- a/Model/src/drainage.cpp +++ b/Model/src/drainage.cpp @@ -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; diff --git a/Model/src/exclusa.cpp b/Model/src/exclusa.cpp index 326a7b9..34b2fab 100644 --- a/Model/src/exclusa.cpp +++ b/Model/src/exclusa.cpp @@ -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); diff --git a/Model/src/main.cpp b/Model/src/main.cpp index 3fa359e..5f9187e 100644 --- a/Model/src/main.cpp +++ b/Model/src/main.cpp @@ -6,6 +6,7 @@ #include "union.h" #include "splitter.h" #include "drainage.h" +#include "exclusa.h" #include 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++; } diff --git a/docs/clases.dia b/docs/clases.dia index 3ec9093..bfc8ef4 100644 Binary files a/docs/clases.dia and b/docs/clases.dia differ