From: Ricardo Markiewicz Date: Tue, 21 Oct 2003 05:07:29 +0000 (+0000) Subject: - El modelo comienza a cobrar vida y a ganar funcionalidad. X-Git-Tag: svn_import~390 X-Git-Url: https://git.llucax.com/z.facultad/75.42/plaqui.git/commitdiff_plain/96b13d7548daed110c71f62fc9f466bb6fc84071?ds=sidebyside - El modelo comienza a cobrar vida y a ganar funcionalidad. - Se hace un cambio radical en el sistema de mensages. --- diff --git a/Model/include/conducto.h b/Model/include/conducto.h new file mode 100644 index 0000000..95d67f5 --- /dev/null +++ b/Model/include/conducto.h @@ -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_ + diff --git a/Model/include/elementoplanta.h b/Model/include/elementoplanta.h index 82a3031..f4a2935 100644 --- a/Model/include/elementoplanta.h +++ b/Model/include/elementoplanta.h @@ -30,16 +30,20 @@ public: /// 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 + MSG_RESPONSE_MAX_FLOW, ///< responde al mensage QUERY_MAX_FLOW. data == float MSG_LAST }; + + /// Devuelve el nombre de la instancia + std::string get_name() const { return name; } protected: RGB fluid_color; + // es de solo lectura std::string name; private: diff --git a/Model/include/iconector.h b/Model/include/iconector.h index 3ca3f2b..44e1e32 100644 --- a/Model/include/iconector.h +++ b/Model/include/iconector.h @@ -22,12 +22,25 @@ public: * 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 * diff --git a/Model/include/transporte.h b/Model/include/transporte.h new file mode 100644 index 0000000..04057b9 --- /dev/null +++ b/Model/include/transporte.h @@ -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 index 0000000..0b5e9a2 --- /dev/null +++ b/Model/src/conducto.cpp @@ -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); + } +} + diff --git a/Model/src/elementoplanta.cpp b/Model/src/elementoplanta.cpp index 46fe703..833c757 100644 --- a/Model/src/elementoplanta.cpp +++ b/Model/src/elementoplanta.cpp @@ -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: @@ -25,7 +25,7 @@ void ElementoPlanta::recieve_msg(int msg, IConector *who) return; break; default: - IConector::recieve_msg(msg, who); + IConector::recieve_msg(msg, who, data); } } diff --git a/Model/src/iconector.cpp b/Model/src/iconector.cpp index c4db5d3..4a27a9c 100644 --- a/Model/src/iconector.cpp +++ b/Model/src/iconector.cpp @@ -17,7 +17,7 @@ IConector::~IConector() 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" @@ -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++) - (*it)->recieve_msg(msg, this); + (*it)->recieve_msg(msg, this, NULL); 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) { diff --git a/Model/src/transporte.cpp b/Model/src/transporte.cpp new file mode 100644 index 0000000..2bb2190 --- /dev/null +++ b/Model/src/transporte.cpp @@ -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() +{ +} +