int main(int argc, char *argv[])
{
+/*
Pump *bomba1;
Exclusa *exclusa1;
Conduct *salida1;
delete salida2;
delete entrada;
delete split;
+*/
+
+
+ // TRATANDO DE HACER ANDAR AL UNION
+ Pump *p1, *p2;
+ Conduct *c1, *c2, *c3;
+ Drainage *d1;
+ Union *u1;
+
+ p1 = new Pump("Bomba 1");
+ p1->set_max_flow(100);
+ p2 = new Pump("Bomba 2");
+ p2->set_max_flow(100);
+ c1 = new Conduct("Para B1");
+ c1->set_max_flow(3);
+ c2 = new Conduct("Para B2");
+ c2->set_max_flow(4);
+ c3 = new Conduct("Salida");
+ c3->set_max_flow(6);
+ d1 = new Drainage("Drenaje");
+ u1 = new Union("Union");
+ u1->set_max_flow(5);
+
+ p1->connect(c1, IConector::OUT);
+ p2->connect(c2, IConector::OUT);
+ c1->connect(p1, IConector::IN);
+ c2->connect(p2, IConector::IN);
+
+ u1->connect(c1, IConector::IN);
+ u1->connect(c2, IConector::IN);
+ c1->connect(u1, IConector::OUT);
+ c2->connect(u1, IConector::OUT);
+
+ u1->connect(c3, IConector::OUT);
+ c3->connect(u1, IConector::IN);
+
+ c3->connect(d1, IConector::OUT);
+ d1->connect(c3, IConector::IN);
+
+ int i = 0;
+ while (i<8) {
+ p1->update();
+ p2->update();
+ c1->update();
+ c2->update();
+ c3->update();
+ d1->update();
+ u1->update();
+
+ p1->simulate();
+ p2->simulate();
+ c1->simulate();
+ c2->simulate();
+ c3->simulate();
+ d1->simulate();
+ u1->simulate();
+
+ sleep(1);
+ if (i == 3) {
+ p2->deactivate();
+ }
+ if (i == 6) {
+ p1->deactivate();
+ }
+ i++;
+ }
+
return 1;
}
{
int pos = OUT;
- // Verifico si esta conectado a mi entrada
+ // Verifico si esta conectado a mi entrada o a mi salida
std::list<IConector *>::iterator i;
for(i=in_list.begin(); i!=in_list.end(); i++) {
if ((*i) == who) pos = IN;
// Me preguntan por el flujo máximo.
// Primero me actualizo, y luego respondo
float m_data = *((float *)data)*2;
+ float tmp;
if (m_data == 0) {
in_on_zero++;
+ tmp = 0.0f;
+ who->recieve_msg(MSG_RESPONSE_MAX_FLOW, this, &tmp);
+ if (in_on_zero == 1) {
+ if (in_ready == 0)
+ tmp = max_flow;
+ else
+ tmp = max_flow/2.0f;
+ }
+ send_msg(OUT, MSG_QUERY_MAX_FLOW_OUT, &tmp);
+ } else {
+ switch (in_on_zero) {
+ case 0:
+ actual_flow = (m_data<actual_flow)?m_data:actual_flow;
+ actual_flow = (actual_flow<max_flow)?actual_flow:max_flow;
+ break;
+ case 1:
+ if (in_ready == 1)
+ actual_flow = actual_flow/2.0f;
+ else
+ actual_flow = max_flow/2.0f;
+ break;
+ case 2:
+ actual_flow = 0;
+ }
+ send_msg(OUT, MSG_QUERY_MAX_FLOW_OUT, &actual_flow);
+ std::cout << in_on_zero << " " << actual_flow << std::endl;
+ tmp = (in_on_zero==0)?actual_flow/2.0f:actual_flow;
+ who->recieve_msg(MSG_RESPONSE_MAX_FLOW, this, &tmp);
}
-
- float tmp;
- switch (in_on_zero) {
- case 0:
- actual_flow = (m_data<max_flow)?m_data:max_flow;
- break;
- case 1:
- actual_flow = max_flow/2.0f;
- break;
- case 2:
- actual_flow = 0;
- }
- send_msg(OUT, MSG_QUERY_MAX_FLOW_OUT, &actual_flow);
-
- // FIXME hay que resolver el problema de avisar a las
- // entradas el flujo correcto que deben enviar
- tmp = (in_on_zero==0)?actual_flow/2.0f:actual_flow;
- who->recieve_msg(MSG_RESPONSE_MAX_FLOW, this, &tmp);
updated = true;
+ if (pos == IN) in_ready++;
}
break;
case MSG_RESPONSE_MAX_FLOW: {
float max = *((float *)data);
if (pos == OUT) {
if (max < actual_flow) actual_flow = max;
+ if (in_on_zero == 2) actual_flow = 0;
} else {
if (((2*max) < actual_flow) && (max != 0))
actual_flow = 2*max;
// Si ya me actualice, no lo tengo que hacer de nuevo
if (updated) return;
// Seteo mi actualizar en true para evitar entrar de nuevo
-// actual_flow = 99999;
+ // FIXME : 99999 == INFINITO!!
+ actual_flow = 99999;
updated = true;
switch (dir) {
case IN: