#define PLAQUI_PLANT_H
#include "plaqui/server/runnable.h"
+#include "plaqui/server/transmitter.h"
+#include "simulator.h"
#include <sigc++/signal.h>
namespace PlaQui {
/// Planta Química.
class Plant: public Runnable {
+ /////////////////////////////////////////////////////////////////////
+ // Constantes.
- // Tipos.
+ private:
- public:
+ /// Tiempo por defecto a esperar entre iteraciones de la simulación.
+ static const unsigned DEFAULT_WAIT_TIME = 300000u; // 0,3 segundos
+
+ /////////////////////////////////////////////////////////////////////
+ // Tipos.
- /// Tipo de señal para indicar que se actualizó la planta.
- typedef SigC::Signal0<void> SignalUpdated;
+ private:
+ /// Lista de conexiones de control.
+ typedef std::list<Transmitter*> TransmitterList;
+ /////////////////////////////////////////////////////////////////////
// Atributos.
private:
- /// Señal para indicar que se actualizó la planta.
- SignalUpdated updated;
+ /// Transmisiones del estado de las plantas.
+ TransmitterList transmissions;
+
+ /// Mutex para las transmisiones.
+ Glib::Mutex transmissions_mutex;
+
+ /// Simulador usado para calcular el estado de la planta.
+ Model::Simulator simulator;
+
+ /// Mutex para el simulador.
+ Glib::Mutex simulator_mutex;
+
+ /// Nombre del archivo donde esta el XML de la planta.
+ std::string filename;
+ /// Tiempo que espera entre cada iteración de la simulación.
+ unsigned wait_time;
+ /// Mutex para el tiempo de espera.
+ Glib::Mutex wait_time_mutex;
+
+ /// Indica si la planta está pausada o simulando.
+ bool paused;
+
+ /// Mutex para el indicador de pausa.
+ Glib::Mutex paused_mutex;
+
+ /////////////////////////////////////////////////////////////////////
// Métodos.
protected:
/**
* Corre la planta (la monitorea o la simula).
*/
- virtual void real_run(void);
+ virtual void real_run(void) throw();
public:
Plant(const std::string& filename);
/**
- * Obtiene la señal para indicar que se actualizó la planta.
+ * Comienza una transmisión del estado de la planta.
+ *
+ * \return true si comenzó la transmisión, false si hubo problemas.
+ */
+ bool transmission_start(string& host, Connection::Port& port);
+
+ /**
+ * Comienza una transmisión del estado de la planta.
+ *
+ * \return true si detuvo la transmisión, false si no existía.
+ */
+ bool transmission_stop(const string& host,
+ const Connection::Port& port);
+
+ /**
+ * Borra una transmisión de la lista de transmisiones al finalizar.
+ *
+ * \param transmission Transmisión a eliminar.
+ */
+ void on_transmission_finished(Transmitter* transmission);
+
+ /**
+ * Abre (o cierra) un elemento de la planta.
+ *
+ * Sólo la bomba y la exclusa pueden ser abiertos y cerrados.
+ *
+ * \param element Nombre del elemento a abrir o cerrar.
+ * \param open true si se quiere abrir el elemento, false si se
+ * lo quiere cerrar.
+ *
+ * \return true si se abrió o cerró el elemento, false si no existía
+ * o si no era una bomba o exclusa.
+ */
+ bool set_open(const std::string& element, bool open = true);
+
+ /**
+ * Setea la frecuencia de refresco de la simulación.
+ * Si se setea a cero, se usa el tiempo por omisión.
+ *
+ * \param hz Cantidad de veces por segundo que debe refrescarse la
+ * simulación.
+ */
+ void set_frequency(unsigned hz = 0u);
+
+ /**
+ * Pausa (o reanuda) la simulación.
+ *
+ * \param paused true si se la quiere pausar, false para reanudar.
+ */
+ void set_paused(bool paused = true);
+
+ /**
+ * Obtiene el XML de la planta.
*/
- SignalUpdated& signal_updated(void);
+ const std::string get_xml(void) const;
};