X-Git-Url: https://git.llucax.com/z.facultad/75.42/plaqui.git/blobdiff_plain/5de53f103d295086898889bfa39bb49335914470..6dd05bd84faebf6d7e9e36a0f1dd040ef9fb24a3:/Model/src/splitter.cpp diff --git a/Model/src/splitter.cpp b/Model/src/splitter.cpp index 360c004..cf8804a 100644 --- a/Model/src/splitter.cpp +++ b/Model/src/splitter.cpp @@ -9,6 +9,8 @@ Splitter::Splitter(const std::string &_name):Transport(_name) in_slots = 1; out_slots = 2; max_flow = actual_flow = 0.0f; + updated = true; + out_on_zero = out_ready = 0; } Splitter::~Splitter() @@ -27,14 +29,23 @@ void Splitter::recieve_msg(int msg, IConector *who, void *data) switch (msg) { case MSG_QUERY_MAX_FLOW_OUT: { + if (updated) { + who->recieve_msg(MSG_RESPONSE_MAX_FLOW, this, &actual_flow); + } // Me preguntan por el flujo máximo. // Primero me actualizo, y luego respondo - actual_flow = *((float *)data); + float tmp = *((float *)data); + + if (tmp < actual_flow) actual_flow = tmp; if (max_flow < actual_flow) actual_flow = max_flow; - actual_flow /= 2.0f; + if (out_on_zero == 0) + actual_flow /= 2.0f; + if (actual_flow == 0) { + out_ready = 2; + } send_msg(OUT, MSG_QUERY_MAX_FLOW_OUT, &actual_flow); // Listo, mi flujo ahora es el doble de lo que me pueden @@ -46,9 +57,27 @@ void Splitter::recieve_msg(int msg, IConector *who, void *data) break; case MSG_RESPONSE_MAX_FLOW: { float max = *((float *)data); + if (out_ready == 2) break; +#ifdef DEBUG + std::cout << name << ":Split " << max << std::endl; +#endif if (pos == OUT) { - if (max < actual_flow) actual_flow = max; - if (max_flow < actual_flow) actual_flow = max_flow; + if (max == 0) { + out_on_zero++; + switch (out_on_zero) { + case 1: + if (out_ready == 0) { + actual_flow = max_flow; + } + break; + case 2: + actual_flow = 0.0; + } + } else { + if (max < actual_flow) actual_flow = max; + if (max_flow < actual_flow) actual_flow = max_flow; + } + out_ready++; } else { if (((2*max) < actual_flow) && (max != 0)) actual_flow = 2*max; @@ -65,7 +94,7 @@ void Splitter::update(int dir) // 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; + actual_flow = INFINITO; updated = true; switch (dir) { case IN: @@ -82,7 +111,11 @@ void Splitter::simulate() return; } +#ifdef DEBUG std::cout << name << "::Flujo actual = " << actual_flow << std::endl; +#endif updated = false; + color_updated = false; + out_on_zero = out_ready = 0; }