From 0aacdcf95cf6d4f33a2201160d472ab84148d52b Mon Sep 17 00:00:00 2001 From: Ricardo Markiewicz Date: Sat, 8 Nov 2003 20:26:09 +0000 Subject: [PATCH] * 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 :-) --- Model/include/control.h | 8 ++++++++ Model/include/exclusa.h | 8 ++++++-- Model/include/logiccontrol.h | 11 +++++++++++ Model/src/control.cpp | 10 ++++++++++ Model/src/drainage.cpp | 1 - Model/src/exclusa.cpp | 15 ++++++++++----- Model/src/main.cpp | 19 ++++++++++++++++--- docs/clases.dia | Bin 4163 -> 4152 bytes 8 files changed, 61 insertions(+), 11 deletions(-) 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 3ec90939ba0defec5d2b1659ec2b985ab5772823..bfc8ef4fc423b8f425f46443a8737ee16e4e72d5 100644 GIT binary patch literal 4152 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 N;{Qzp?`7?40RUM50(k%c -- 2.43.0