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