]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blob - Model/src/splitter.cpp
Se ponen mas simples algunos SigC::bind() :)
[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                         std::cout << name << ":Split " << max << std::endl;
50                         if (pos == OUT) {
51                                 if (max < actual_flow)  actual_flow = max;
52                                 if (max_flow < actual_flow) actual_flow = max_flow;
53                         } else {
54                                         if (((2*max) < actual_flow) && (max != 0))
55                                                 actual_flow = 2*max;
56                         }
57                 }
58                 break;
59                 default:
60                         Transport::recieve_msg(msg, who, data);
61         }
62 }
63
64 void Splitter::update(int dir)
65 {
66         // Si ya me actualice, no lo tengo que hacer de nuevo
67         if (updated) return;
68         // Seteo mi actualizar en true para evitar entrar de nuevo
69         actual_flow = 99999;
70         updated = true;
71         switch (dir) {
72                 case IN:
73                         send_msg(IN, MSG_QUERY_MAX_FLOW_IN, (void *)&max_flow);
74                 break;
75                 case OUT:
76                         send_msg(OUT, MSG_QUERY_MAX_FLOW_OUT, (void *)&max_flow);
77         }
78 }
79
80 void Splitter::simulate()
81 {
82         if (!updated) {
83                 return;
84         }
85
86         std::list<IConector *>::iterator i = in_list.begin();
87         if (i != in_list.end()) {
88                 PlantItem *o = (PlantItem *)(*i);
89                 set_color( o->get_color() );
90         }
91         std::cout << name << "::Flujo actual = " << actual_flow << std::endl;
92         updated = false;
93 }
94