]> git.llucax.com Git - z.facultad/75.42/plaqui.git/commitdiff
- El modelo comienza a cobrar vida y a ganar funcionalidad.
authorRicardo Markiewicz <gazer.arg@gmail.com>
Tue, 21 Oct 2003 05:07:29 +0000 (05:07 +0000)
committerRicardo Markiewicz <gazer.arg@gmail.com>
Tue, 21 Oct 2003 05:07:29 +0000 (05:07 +0000)
 - Se hace un cambio radical en el sistema de mensages.

Model/include/conducto.h [new file with mode: 0644]
Model/include/elementoplanta.h
Model/include/iconector.h
Model/include/transporte.h [new file with mode: 0644]
Model/src/conducto.cpp [new file with mode: 0644]
Model/src/elementoplanta.cpp
Model/src/iconector.cpp
Model/src/transporte.cpp [new file with mode: 0644]

diff --git a/Model/include/conducto.h b/Model/include/conducto.h
new file mode 100644 (file)
index 0000000..95d67f5
--- /dev/null
@@ -0,0 +1,29 @@
+
+
+#ifndef _CONDUCTO_H_
+#define _CONDUCTO_H_
+
+#include "transporte.h"
+
+namespace PlaQui {
+
+class Conducto:public Transporte {
+public:
+       Conducto(const std::string &_name);
+       virtual ~Conducto();
+
+       virtual void recieve_msg(int msg, IConector *who, void *data);
+       /// Hace que los elementos de la plata actualicen su flujo en esta etapa
+       virtual void update();
+       /// Hace la simulación de esta iteración
+       virtual void simulate();
+
+protected:
+private:
+       Conducto():Transporte("null") {}
+       Conducto &operator = (const Conducto &) { return (*this); }
+};
+
+}
+#endif // _CONDUCTO_H_
+
index 82a3031173e0e1dd4493246a63d1c9e00378f9ff..f4a293542614c630cdda702c4a35bfce38004eb8 100644 (file)
@@ -30,16 +30,20 @@ public:
        /// Retorna el actual color del fluido
        const RGB &getColor() { return fluid_color; }
 
        /// Retorna el actual color del fluido
        const RGB &getColor() { return fluid_color; }
 
-       /// Recibe un mensage
-       virtual void recieve_msg(int msg, IConector *who);
+       virtual void recieve_msg(int msg, IConector *who, void *data);
 
        /// Mensages manejados por los elementos de la planta
        enum {
                MSG_QUERY_MAX_FLOW = IConector::MSG_LAST, ///< pregunta por el maximo flujo
 
        /// Mensages manejados por los elementos de la planta
        enum {
                MSG_QUERY_MAX_FLOW = IConector::MSG_LAST, ///< pregunta por el maximo flujo
+               MSG_RESPONSE_MAX_FLOW, ///< responde al mensage QUERY_MAX_FLOW. data == float
                MSG_LAST
        };
                MSG_LAST
        };
+
+       /// Devuelve el nombre de la instancia
+       std::string get_name() const { return name; }
 protected:
        RGB fluid_color;
 protected:
        RGB fluid_color;
+       // es de solo lectura
        std::string name;
 
 private:
        std::string name;
 
 private:
index 3ca3f2b394e9bbb5e4ce1e481203940dc609af4d..44e1e32295ab00cbaa23851803d6658e273c4b61 100644 (file)
@@ -22,12 +22,25 @@ public:
         *  a la salida.
         *  \param where Donde enviar el mensage, IConector::IN o IConector::OUT
         *  \param msg Mensage a enviar
         *  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);
+       void send_msg(int where, int msg);
        
        
-       /// Recive un mensage
-       virtual void recieve_msg(int msg, IConector *who);
+       /** Recibe un mensage
+        *
+        *  Este procedimiento atiende los mensages enviados por otros objetos.
+        *  El mensage \e msg es enviado por \e who, quien puede enviar opcionalmente
+        *  un dato en \e data. El campo \e data debe ser interpretado en forma
+        *  correcta dependiendo del mensage enviado.
+        *  El objeto que recibe un mensage puede, de ser necesario, responder al
+        *  objeto que lo envió llamando directamente al método recieve_msg del objeto
+        *  \e who. No se recomienda enviar un mensage mediante send_msg ya que puede
+        *  ocacionar que objetos que no esten esperando una respuesta se comporte de
+        *  manera indeterminada.
+        *  \param msg ID del mensage enviado.
+        *  \param who Objeto que envía el mensage.
+        *  \param data Dato opcional a enviar.
+        */
+       virtual void recieve_msg(int msg, IConector *who, void *data);
 
        /** Conecta un objeto con otro
         *
 
        /** Conecta un objeto con otro
         *
diff --git a/Model/include/transporte.h b/Model/include/transporte.h
new file mode 100644 (file)
index 0000000..04057b9
--- /dev/null
@@ -0,0 +1,29 @@
+
+
+#ifndef _TRANSPORTE_H_
+#define _TRANSPORTE_H_
+
+#include "elementoplanta.h"
+
+namespace PlaQui {
+
+class Transporte:public ElementoPlanta {
+public:
+       Transporte(const std::string &_name);
+       virtual ~Transporte();
+
+       float get_actual_flow() { return actual_flow; }
+       float get_max_flow() { return max_flow; }
+       void  set_max_flow(float _f) { max_flow = _f; }
+protected:
+       // Es de solo lectura, no hay set
+       float actual_flow;
+       float max_flow;
+private:
+       Transporte():ElementoPlanta("null") {}
+       Transporte &operator = (const Transporte &) { return (*this); }
+};
+
+}
+#endif // _TRANSPORTE_H_
+
diff --git a/Model/src/conducto.cpp b/Model/src/conducto.cpp
new file mode 100644 (file)
index 0000000..0b5e9a2
--- /dev/null
@@ -0,0 +1,40 @@
+
+#include "conducto.h"
+
+using namespace PlaQui;
+
+Conducto::Conducto(const std::string &_name):Transporte(_name)
+{
+       max_flow = actual_flow = 0.0f;
+
+       // Inicio los parametros de conectores
+       in_slots = 1;
+       out_slots = 1;
+}
+
+Conducto::~Conducto()
+{
+}
+
+void Conducto::recieve_msg(int msg, IConector *who, void *data)
+{
+       switch (msg) {
+               case MSG_QUERY_MAX_FLOW: {
+                       // Me preguntan por el flujo máximo. Le respondo
+                       float tmp = actual_flow;
+                       who->recieve_msg(MSG_RESPONSE_MAX_FLOW, this, &tmp);
+               }
+               break;
+               case MSG_RESPONSE_MAX_FLOW: {
+                       float max = *((float *)data);
+                       // Actualizo mi flujo en base a la respuesta
+                       if (max < actual_flow) {
+                               actual_flow = max;
+                       }
+               }
+               break;
+               default:
+                       Transporte::recieve_msg(msg, who, data);
+       }
+}
+
index 46fe70331470d1b33b5eaed42ac1a35c2ff43230..833c757f48b63f2db05cd086b8fb1af91501add5 100644 (file)
@@ -17,7 +17,7 @@ ElementoPlanta::~ElementoPlanta()
 {
 }
        
 {
 }
        
-void ElementoPlanta::recieve_msg(int msg, IConector *who)
+void ElementoPlanta::recieve_msg(int msg, IConector *who, void *data)
 {
        switch (msg) {
                case MSG_QUERY_MAX_FLOW:
 {
        switch (msg) {
                case MSG_QUERY_MAX_FLOW:
@@ -25,7 +25,7 @@ void ElementoPlanta::recieve_msg(int msg, IConector *who)
                        return;
                break;
                default:
                        return;
                break;
                default:
-                       IConector::recieve_msg(msg, who);
+                       IConector::recieve_msg(msg, who, data);
        }
 }
 
        }
 }
 
index c4db5d3c157dcbe34acf8a9eb67964ba84f3c86f..4a27a9c2b758afbf635facf3a377b1efe1fab305 100644 (file)
@@ -17,7 +17,7 @@ IConector::~IConector()
        out_list.clear();
 }
 
        out_list.clear();
 }
 
-int IConector::send_msg(int where, int msg)
+void IConector::send_msg(int where, int msg)
 {
        // Recorro toda la lista y envío el mensage a cada
        // elemento conectado en "where"
 {
        // Recorro toda la lista y envío el mensage a cada
        // elemento conectado en "where"
@@ -25,18 +25,15 @@ int IConector::send_msg(int where, int msg)
        switch (where) {
                case IN:
                        for(it=in_list.begin(); it!=in_list.end(); it++)
        switch (where) {
                case IN:
                        for(it=in_list.begin(); it!=in_list.end(); it++)
-                               (*it)->recieve_msg(msg, this);
+                               (*it)->recieve_msg(msg, this, NULL);
                        break;
                case OUT:
                        for(it=out_list.begin(); it!=out_list.end(); it++)
                        break;
                case OUT:
                        for(it=out_list.begin(); it!=out_list.end(); it++)
-                               (*it)->recieve_msg(msg, this);
+                               (*it)->recieve_msg(msg, this, NULL);
        }
        }
-
-       // TODO : ver el tema de los valores de retorno!!
-       return 0;
 }
 
 }
 
-void IConector::recieve_msg(int msg, IConector *who)
+void IConector::recieve_msg(int msg, IConector *who, void *data)
 {
        // Manejo los mensages que yo conozco
        switch (msg) {
 {
        // Manejo los mensages que yo conozco
        switch (msg) {
diff --git a/Model/src/transporte.cpp b/Model/src/transporte.cpp
new file mode 100644 (file)
index 0000000..2bb2190
--- /dev/null
@@ -0,0 +1,14 @@
+
+#include "transporte.h"
+
+using namespace PlaQui;
+
+Transporte::Transporte(const std::string &_name):ElementoPlanta(_name)
+{
+       max_flow = actual_flow = 0.0f;
+}
+
+Transporte::~Transporte()
+{
+}
+