]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blob - Model/src/splitter.cpp
cd3ccad169eb7d057e291ae15c9c763bf7b71df1
[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 < actual_flow)  actual_flow = max;
58                                 if (max_flow < actual_flow) actual_flow = max_flow;
59                         } else {
60                                         if (((2*max) < actual_flow) && (max != 0))
61                                                 actual_flow = 2*max;
62                         }
63                 }
64                 break;
65                 default:
66                         Transport::recieve_msg(msg, who, data);
67         }
68 }
69
70 void Splitter::update(int dir)
71 {
72         // Si ya me actualice, no lo tengo que hacer de nuevo
73         if (updated) return;
74         // Seteo mi actualizar en true para evitar entrar de nuevo
75         actual_flow = INFINITO;
76         updated = true;
77         switch (dir) {
78                 case IN:
79                         send_msg(IN, MSG_QUERY_MAX_FLOW_IN, (void *)&max_flow);
80                 break;
81                 case OUT:
82                         send_msg(OUT, MSG_QUERY_MAX_FLOW_OUT, (void *)&max_flow);
83         }
84 }
85
86 void Splitter::simulate()
87 {
88         if (!updated) {
89                 return;
90         }
91
92 #ifdef DEBUG
93         std::cout << name << "::Flujo actual = " << actual_flow << std::endl;
94 #endif
95         updated = false;
96         color_updated = false;
97 }
98