]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blob - Model/src/splitter.cpp
a2737894b6423758465aa960ca7c62b12bfe0864
[z.facultad/75.42/plaqui.git] / Model / src / splitter.cpp
1
2 #include "splitter.h"
3 #include <iostream>
4
5 using namespace PlaQui::Model;
6
7 Splitter::Splitter(const std::string &_name):Transport(_name)
8 {
9         in_slots = 1;
10         out_slots = 2;
11         max_flow = actual_flow = 0.0f;
12         updated = true;
13 }
14
15 Splitter::~Splitter()
16 {
17 }
18
19 void Splitter::recieve_msg(int msg, IConector *who, void *data)
20 {
21         int pos = OUT;
22
23         // Verifico si esta conectado a mi entrada
24         std::list<IConector *>::iterator i;
25         for(i=in_list.begin(); i!=in_list.end(); i++) {
26                 if ((*i) == who) pos = IN;
27         }
28         
29         switch (msg) {
30                 case MSG_QUERY_MAX_FLOW_OUT: {
31                         if (updated) {
32                                 who->recieve_msg(MSG_RESPONSE_MAX_FLOW, this, &actual_flow);
33                         }
34                         // Me preguntan por el flujo máximo.
35                         // Primero me actualizo, y luego respondo
36                         actual_flow =  *((float *)data);
37
38                         if (max_flow < actual_flow) actual_flow = max_flow;
39
40                         actual_flow /= 2.0f;
41
42                         send_msg(OUT, MSG_QUERY_MAX_FLOW_OUT, &actual_flow);
43
44                         // Listo, mi flujo ahora es el doble de lo que me pueden
45                         // dar las salidas
46                         actual_flow *= 2.0f;
47                         who->recieve_msg(MSG_RESPONSE_MAX_FLOW, this, &actual_flow);
48                         updated = true;
49                 }
50                 break;
51                 case MSG_RESPONSE_MAX_FLOW: {
52                         float max = *((float *)data);
53 #ifdef DEBUG
54                         std::cout << name << ":Split " << max << std::endl;
55 #endif
56                         if (pos == OUT) {
57                                 if (max == 0) {
58                                         actual_flow = max_flow;
59                                 } else {
60                                         if (max < actual_flow)  actual_flow = max;
61                                         if (max_flow < actual_flow) actual_flow = max_flow;
62                                 }
63                         } else {
64                                         if (((2*max) < actual_flow) && (max != 0))
65                                                 actual_flow = 2*max;
66                         }
67                 }
68                 break;
69                 default:
70                         Transport::recieve_msg(msg, who, data);
71         }
72 }
73
74 void Splitter::update(int dir)
75 {
76         // Si ya me actualice, no lo tengo que hacer de nuevo
77         if (updated) return;
78         // Seteo mi actualizar en true para evitar entrar de nuevo
79         actual_flow = INFINITO;
80         updated = true;
81         switch (dir) {
82                 case IN:
83                         send_msg(IN, MSG_QUERY_MAX_FLOW_IN, (void *)&max_flow);
84                 break;
85                 case OUT:
86                         send_msg(OUT, MSG_QUERY_MAX_FLOW_OUT, (void *)&max_flow);
87         }
88 }
89
90 void Splitter::simulate()
91 {
92         if (!updated) {
93                 return;
94         }
95
96 #ifdef DEBUG
97         std::cout << name << "::Flujo actual = " << actual_flow << std::endl;
98 #endif
99         updated = false;
100         color_updated = false;
101 }
102