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