--- /dev/null
+
+#ifndef _AND_H_
+#define _AND_H_
+
+#include "logiccontrol.h"
+#include <iostream>
+#include <limits.g>
+
+namespace PlaQui {
+namespace Model {
+
+class And:LogicControl {
+public:
+ And():LogicControl(MAX_INT,1) {}
+ virtual ~And() {}
+
+ virtual bool get_output() {
+ LogicControl *mi_entrada;
+ bool mi_salida = true;
+ /* Si tengo alguien conectado */
+ std::list<IConector *>::iterator it;
+ for(it = in_list.begin(); it != in_list.end(); it++) {
+ mi_entrada = *it;
+ mi_salida &&= mi_entrada->get_output();
+ }
+ return mi_salida;
+ }
+};
+
+}
+}
+
+#endif // _And_H_
+
--- /dev/null
+
+#ifndef _BYPASS_H_
+#define _BYPASS_H_
+
+#include "logiccontrol.h"
+#include <iostream>
+#include <limits.h>
+#include "control.h"
+
+namespace PlaQui {
+namespace Model {
+
+class ByPass:public LogicControl {
+public:
+ ByPass():LogicControl(1,1) { control = NULL; }
+ virtual ~ByPass() {}
+
+ virtual bool get_output() {
+ LogicControl *mi_entrada;
+ bool mi_salida = false;
+ // Si tengo conectado algo a mi salida, es porque
+ // le tengo que consultar a el.
+ // Si no tengo nadia a mi salida, es porque tengo
+ // que consultar a mis entradas
+ if (control == NULL) {
+ // No tengo nadie a mi salida!, pregunto a mis entradas, si es
+ // que tengo!!
+ if (in_list.begin() != in_list.end()) {
+ mi_entrada = (LogicControl *)(*in_list.begin());
+ mi_salida = mi_entrada->get_output();
+ } else {
+ mi_salida = true; // Paso true por defecto
+ }
+ } else {
+ mi_salida = control->get_output();
+ }
+
+ return mi_salida;
+ }
+ /** Setea el objeto a controlar
+ *
+ * El ByPass puede ser utilizado para consultar el estado
+ * de un elemento Control (utilizado en el slot output de
+ * la lógica de control) o para que un elemento de Control
+ * le pregunte por que valor tiene que tener a su entrada.
+ * Si Control == NULL se asume que esta funcionando como entrada
+ * y en caso contrario como salida de un objeto Control.
+ * \param NULL No controla a nadie
+ * \param Objeto Controla al objeto pasado
+ */
+ void set_control(Control *c) { control = c; }
+protected:
+ /// Objeto a controlar
+ Control *control;
+};
+
+}
+}
+
+#endif // _OR_H_
+
#define _CONTROL_H_
#include "plantitem.h"
+#include "logiccontrol.h"
namespace PlaQui {
/// Retorna un estado booleano dependiendo de su estado actual
virtual bool get_output() = 0;
protected:
- /*
- LogicControl input;
- LogicControl output;
- */
+ LogicControl *input;
+ LogicControl *output;
private:
Control(const Control &):PlantItem("null") {}
Control &operator = (const Control &) { return (*this); }
#define _EXCLUSE_H_
#include "control.h"
+#include "bypass.h"
namespace PlaQui {
--- /dev/null
+
+#ifndef _LOGIC_CONTROL_H_
+#define _LOGIC_CONTROL_H_
+
+#include "iconector.h"
+
+namespace PlaQui {
+namespace Model {
+
+/** Modelo de control lógico para automatización
+ *
+ */
+class LogicControl:public IConector {
+public:
+ /** Constructor
+ *
+ * \param ins Cantidad de entradas
+ * \param outs Cantidad de salidas
+ */
+ LogicControl(int ins, int outs):IConector(ins, outs) {}
+ /// Destructor
+ virtual ~LogicControl() {}
+
+ /** Retorna el estado actual.
+ *
+ * Esta función retorna un valor booleano resultado
+ * de aplicar la operación lógica que cada hijo decida
+ * implementar.
+ */
+ virtual bool get_output() = 0;
+};
+
+}
+}
+#endif // _LOGIC_CONTROL_H_
+
--- /dev/null
+
+#ifndef _NOT_H_
+#define _NOT_H_
+
+#include "logiccontrol.h"
+#include <iostream>
+
+namespace PlaQui {
+namespace Model {
+
+class Not:LogicControl {
+ Not():LogicControl(1,1) {}
+ virtual ~Not() {}
+
+ virtual bool get_output() {
+ LogicControl *mi_entrada;
+ bool mi_salida;
+ /* Si tengo alguien conectado */
+ if (in_list.begin() != in_list.end()) {
+ mi_entrada = (LogicControl *)(*in_list.begin());
+ mi_salida = !(mi_entrada->get_output());
+ return mi_salida;
+ }
+ std::cout << "NOT NO CONECTADO" << std::endl;
+ return false;
+ }
+}
+
+}
+}
+
+#endif // _NOT_H_
+
--- /dev/null
+
+#ifndef _OR_H_
+#define _OR_H_
+
+#include "logiccontrol.h"
+#include <iostream>
+#include <limits.g>
+
+namespace PlaQui {
+namespace Model {
+
+class Or:LogicControl {
+public:
+ Or():LogicControl(MAX_INT,1) {}
+ virtual ~Or() {}
+
+ virtual bool get_output() {
+ LogicControl *mi_entrada;
+ bool mi_salida = false;
+ /* Si tengo alguien conectado */
+ std::list<IConector *>::iterator it;
+ for(it = in_list.begin(); it != in_list.end(); it++) {
+ mi_entrada = *it;
+ mi_salida ||= mi_entrada->get_output();
+ }
+ return mi_salida;
+ }
+};
+
+}
+}
+
+#endif // _OR_H_
+
#define _BOMB_H_
#include "source.h"
+#include "bypass.h"
namespace PlaQui {
{
open = true;
in_slots = out_slots = 1;
+ // Genero mi logica de control
+ input = new ByPass();
+ output = new ByPass();
+ ((ByPass *)output)->set_control(this);
}
Exclusa::~Exclusa()
void Exclusa::update(int dir)
{
- // no hace nada
+ // Mi entrada define mi estado
+ open = input->get_output();
}
void Exclusa::simulate()
active = true;
open = true;
max_flow = actual_flow = 0.0f;
+ input = new ByPass();
+ output = new ByPass();
+ ((ByPass *)output)->set_control(this);
}
Pump::~Pump()
void Pump::update(int dir)
{
if (updated) return;
+ // Me fijo si me tengo que apagar automaticamente
+ open = input->get_output();
if (active && open)
actual_flow = max_flow;
else