- Se hace un cambio radical en el sistema de mensages.
--- /dev/null
+
+
+#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_
+
/// 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:
* 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
*
--- /dev/null
+
+
+#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_
+
--- /dev/null
+
+#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);
+ }
+}
+
{
}
-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:
return;
break;
default:
- IConector::recieve_msg(msg, who);
+ IConector::recieve_msg(msg, who, data);
}
}
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"
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) {
--- /dev/null
+
+#include "transporte.h"
+
+using namespace PlaQui;
+
+Transporte::Transporte(const std::string &_name):ElementoPlanta(_name)
+{
+ max_flow = actual_flow = 0.0f;
+}
+
+Transporte::~Transporte()
+{
+}
+