clarificados aun.
- Sigo actualizando el diagrama de clases
--- /dev/null
+
+
+#ifndef _ELEMENTO_PLANTA_H_
+#define _ELEMENTO_PLANTA_H_
+
+#include "iconector.h"
+#include "rgb.h"
+
+namespace PlaQui {
+
+class ElementoPlanta:public IConector {
+public:
+ /// Constructor
+ ElementoPlanta();
+ virtual ~ElementoPlanta();
+
+ // FIXME: ver que parametros seran necesarios
+ virtual void send_fluid() {}
+ virtual void receive_fluid() {}
+
+ /// Hace que los elementos de la plata actualicen su flujo en esta etapa
+ virtual void update() = 0;
+ /// Hace la simulación de esta iteración
+ virtual void simulate() = 0;
+
+ /// Setea el nuevo color del fluido
+ void setColor(const RGB &c) { fluid_color = c; }
+ /// Retorna el actual color del fluido
+ const RGB &getColor() { return fluid_color; }
+
+ /// Recibe un mensage
+ virtual void recieve_msg(int msg, IConector *who);
+
+ /// Mensages manejados por los elementos de la planta
+ enum {
+ MSG_QUERY_MAX_FLOW = IConector::MSG_LAST, ///< pregunta por el maximo flujo
+ MSG_LAST
+ };
+protected:
+ RGB fluid_color;
+};
+
+}
+
+#endif
+
--- /dev/null
+
+
+#ifndef _I_CONECTOR_H_
+#define _I_CONECTOR_H_
+
+#include <list>
+
+namespace PlaQui {
+
+/** Conector genérico de elementos
+ */
+class IConector {
+public:
+ /// Constructor
+ IConector();
+ /// Destructor
+ virtual ~IConector();
+
+ /** Envía un mensage a los elementos conectados
+ *
+ * Esvía un mensage a los elementos conectados a la entrada o
+ * a la salida.
+ * \param where Donde enviar el mensage, IConector::IN o IConector::OUT
+ * \param msg Mensage a enviar
+ * \return Respuesta al mensage. Se interpreta dependiendo del mensage
+ */
+ int send_msg(int where, int msg);
+
+ /// Recive un mensage
+ virtual void recieve_msg(int msg, IConector *who);
+
+ /** Conecta un objeto con otro
+ *
+ * \param place IConector::IN o IConecor::OUT para conectar a la entrada o salida.
+ * \param obj Objeto a conectar
+ * \return true si se pudo conectar
+ */
+ bool connect(IConector *obj, int place);
+
+ /// Constantes de posición donde conectar
+ enum {
+ IN, ///< conectar a la entrada
+ OUT ///< conectar a la salida
+ };
+
+ /** Mensages a este nivel
+ *
+ * Las clases descendientes que quieran definir sus mensajes deben utilizar
+ * el valor de IConector::MSG_LAST como valor para el primer msg, a fin
+ * de evitar solapamiento de mensajes.
+ * Por ejemplo, si tenemos una clase B con un mensaje TEST se declararía
+ * como :
+ * \verbatim
+ * class B:public IConector {
+ * enum {
+ * MSG_TEST=IConector::MSG_LAST,
+ * MSG_LAST
+ * };
+ * \endverbatim
+ */
+ enum {
+ MSG_DISCONECT=0, ///< Desconectar el objeto que envía el mensaje
+ MSG_LAST
+ };
+protected:
+ std::list<IConector *> entradas;
+ std::list<IConector *> salidas;
+ unsigned int cant_entradas;
+ unsigned int cant_salidas;
+};
+
+}
+
+#endif // _I_CONECTOR_H_
--- /dev/null
+
+
+#ifndef _RGB_H_
+#define _RGB_H_
+
+typedef unsigned char color;
+
+/** Representación de un color en codificación RGB */
+class RGB {
+public:
+ RGB() { my_r=my_g=my_b=0; }
+ RGB(color _r, color _g, color _b) {
+ my_r = _r;
+ my_g = _g;
+ my_b = _b;
+ }
+
+ RGB &operator = (const RGB &c) {
+ if (this == &c) return (*this);
+ my_r = c.r();
+ my_g = c.g();
+ my_b = c.b();
+ return (*this);
+ }
+
+ color r() const { return my_r; }
+ color g() const { return my_g; }
+ color b() const { return my_b; }
+
+private:
+ color my_r, my_g, my_b;
+};
+
+#endif // _RGB_H_
+
--- /dev/null
+
+
+#include "elementoplanta.h"
+
+using namespace PlaQui;
+
+ElementoPlanta::ElementoPlanta()
+{
+}
+
+ElementoPlanta::~ElementoPlanta()
+{
+}
+
+void ElementoPlanta::recieve_msg(int msg, IConector *who)
+{
+ switch (msg) {
+ case MSG_QUERY_MAX_FLOW:
+ /// TODO
+ return;
+ break;
+ default:
+ IConector::recieve_msg(msg, who);
+ }
+}
+
--- /dev/null
+
+
+#include "iconector.h"
+
+using namespace PlaQui;
+
+IConector::IConector()
+{
+ cant_entradas = cant_salidas = 0;
+}
+
+IConector::~IConector()
+{
+ // Limpio las listas. Los objetos no se destruyen!!
+ entradas.clear();
+ salidas.clear();
+}
+
+int IConector::send_msg(int where, int msg)
+{
+ // Recorro toda la lista y envío el mensage a cada
+ // elemento conectado
+ std::list<IConector *>::iterator it;
+ switch (where) {
+ case IN:
+ for(it=entradas.begin(); it!=entradas.end(); it++)
+ (*it)->recieve_msg(msg, this);
+ break;
+ case OUT:
+ for(it=salidas.begin(); it!=salidas.end(); it++)
+ (*it)->recieve_msg(msg, this);
+ }
+
+ // TODO : ver el tema de los valores de retorno!!
+ return 0;
+}
+
+void IConector::recieve_msg(int msg, IConector *who)
+{
+ // Manejo los mensages que yo conozco
+ switch (msg) {
+ case MSG_DISCONECT:
+ // FIXME: sacar el elemento who de la lista!
+ return;
+ }
+}
+
+bool IConector::connect(IConector *obj, int place)
+{
+ switch (place) {
+ case IN:
+ if (entradas.size() <= cant_entradas) {
+ entradas.push_back(obj);
+ cant_entradas++;
+ } else {
+ return false; // no se pudo conectar!
+ }
+ case OUT:
+ if (salidas.size() <= cant_salidas) {
+ salidas.push_back(obj);
+ cant_salidas++;
+ } else {
+ return false; // no se pudo conectar!
+ }
+}
+
+ // se pudo conectar sin problemas
+ return true;
+}
+