]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blob - Model/src/tank.cpp
* Se arregla un bug en el constructor al verificar conexiones
[z.facultad/75.42/plaqui.git] / Model / src / tank.cpp
1
2 #include "tank.h"
3 #include <iostream>
4
5 using namespace PlaQui::Model;
6
7 Tank::Tank(const std::string &_name):Source(_name),Drain(_name),Control(_name)
8 {
9         litros = 0.0f;
10 }
11
12 Tank::~Tank()
13 {
14 }
15
16 bool Tank::get_output()
17 {
18         return litros > 0;
19 }
20
21 void Tank::update(int dir)
22 {
23         updated = true;
24 }
25
26 void Tank::simulate()
27 {
28         if (!updated) return;
29         RGB in_color;
30
31         std::list<IConector *>::iterator i = in_list.begin();
32         if (i != in_list.end()) {
33                 PlantItem *o = (PlantItem *)(*i);
34                 in_color = o->get_color();
35         }
36
37         // le sumo lo que recibo
38         litros += actual_in_flow;
39         // calculo el nuevo color
40         int r, g, b;
41         float l = litros;
42
43         r = (int)(fluid_color.r()*litros/l + in_color.r()*actual_in_flow/l);
44         g = (int)(fluid_color.g()*litros/l + in_color.g()*actual_in_flow/l);
45         b = (int)(fluid_color.b()*litros/l + in_color.b()*actual_in_flow/l);
46
47         if (r>255) r = 255;
48         if (g>255) g = 255;
49         if (b>255) b = 255;
50         fluid_color = RGB(r,g,b);
51
52         // le resto lo que entrego
53         litros -= actual_out_flow;
54
55 #ifdef DEBUG
56         std::cout << name << "Capacidad: " << capacity;
57         std::cout << "  Litros : " << litros << std::endl;
58 #endif
59         updated = false;
60 }
61
62 void Tank::recieve_msg(int msg, IConector *who, void *data)
63 {
64         int pos = OUT;
65
66         // Verifico si esta conectado a mi entrada
67         std::list<IConector *>::iterator i;
68         for(i=in_list.begin(); i!=in_list.end(); i++) {
69                 if ((*i) == who) pos = IN;
70         }
71         
72         switch (msg) {
73                 case MSG_QUERY_MAX_FLOW_OUT:
74                         if (updated) {
75                                 who->recieve_msg(MSG_RESPONSE_MAX_FLOW, this, &actual_in_flow);
76                         }
77                         actual_in_flow = capacity - litros;
78                         if (*((float *)data) < actual_in_flow)
79                                 actual_in_flow = *((float *)data);
80                         actual_out_flow = litros;
81                         send_msg(OUT, MSG_QUERY_MAX_FLOW_OUT, &actual_out_flow);
82
83                         who->recieve_msg(MSG_RESPONSE_MAX_FLOW, this, &actual_in_flow);
84                         updated = true;
85                 break;
86                 case MSG_RESPONSE_MAX_FLOW:
87                         if (pos == OUT) {
88                                 if (*((float *)data) < actual_out_flow)
89                                         actual_out_flow = *((float *)data);
90                         }
91         }
92 }
93
94 void Tank::get_state_as_xml(std::stringstream &out)
95 {
96         PlantItem::get_state_as_xml(out);
97                                 
98         out << "\t<tank name=\"" << name << "\">" << std::endl;
99         out << "\t\t<capacity>" << capacity << "</capacity>" << std::endl;
100         out << "\t\t<litros>" << litros << "</litros>" << std::endl;
101         out << "\t</tank>" << std::endl;
102 }