namespace PlaQui {
namespace Model {
+/** Función AND Lógica */
class And:LogicControl {
public:
And():LogicControl(MAX_INT,1) {}
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; }
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());
}
}
-#endif // _OR_H_
+#endif // _BYPASS_H_
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
/// 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 */
* 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);
/** 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.
namespace PlaQui {
namespace Model {
+/** Función O Lógica */
class Or:LogicControl {
public:
Or():LogicControl(MAX_INT,1) {}
/// 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
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
#include "drainage.h"
#include "exclusa.h"
#include <unistd.h>
+#include <iostream>
#include "simulador.h"
using namespace std;
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++;
}
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);
}
return NULL;
}
+bool Simulador::pump_deactivate(const std::string &name)
+{
+ // Busco el elemento, usando RTTI :-(
+ Pump *pump = dynamic_cast<Pump *>(find(name));
+
+ if (!pump) {
+ // Ups!, "name" no era un Pump!!!
+ return false;
+ }
+ pump->deactivate();
+ return true;
+}
+