/// 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;
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; }
* 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()); }
};
}
{
}
+void Control::connect_input_logic(LogicControl *c)
+{
+ input->connect(c, IConector::IN);
+}
+
+void Control::connect_output_logic(LogicControl *c)
+{
+ c->connect(output, IConector::IN);
+}
+
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;
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();
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);
#include "union.h"
#include "splitter.h"
#include "drainage.h"
+#include "exclusa.h"
#include <unistd.h>
using namespace std;
int main(int argc, char *argv[])
{
Pump *bomba1;
+ Exclusa *exclusa1;
Conduct *salida1;
Conduct *salida2;
Conduct *entrada;
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);
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);
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();
dren2->update();
bomba1->simulate();
+ exclusa1->simulate();
salida1->simulate();
salida2->simulate();
entrada->simulate();
sleep(1);
if (i == 5) {
- bomba1->deactivate();
+ //bomba1->deactivate();
+ // Ahora cierro la exclusa!, la bomba deberia apagarse!!!
+ exclusa1->close();
}
i++;
}