]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blob - Model/src/tank.cpp
895b5eff04a010748319af99761d95db68442346
[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 resto lo que entrego
38         litros -= actual_out_flow;
39
40         // calculo el nuevo color
41         int r, g, b;
42         float l = litros+actual_in_flow;
43
44         r = (int)(fluid_color.r()*litros/l + in_color.r()*actual_in_flow/l);
45         g = (int)(fluid_color.g()*litros/l + in_color.g()*actual_in_flow/l);
46         b = (int)(fluid_color.b()*litros/l + in_color.b()*actual_in_flow/l);
47         
48         fluid_color = RGB(r,g,b);
49
50         // le sumo lo que recibo
51         litros = l;
52
53         std::cout << name << "Capacidad: " << capacity;
54         std::cout << "  Litros : " << litros << std::endl;
55         updated = false;
56 }
57
58 void Tank::recieve_msg(int msg, IConector *who, void *data)
59 {
60         int pos = OUT;
61
62         // Verifico si esta conectado a mi entrada
63         std::list<IConector *>::iterator i;
64         for(i=in_list.begin(); i!=in_list.end(); i++) {
65                 if ((*i) == who) pos = IN;
66         }
67         
68         switch (msg) {
69                 case MSG_QUERY_MAX_FLOW_OUT:
70                         actual_in_flow = capacity - litros;
71                         if (*((float *)data) < actual_in_flow)
72                                 actual_in_flow = *((float *)data);
73                         actual_out_flow = litros;
74                         send_msg(OUT, MSG_QUERY_MAX_FLOW_OUT, &actual_out_flow);
75
76                         who->recieve_msg(MSG_RESPONSE_MAX_FLOW, this, &actual_in_flow);
77                         updated = true;
78                 break;
79                 case MSG_RESPONSE_MAX_FLOW:
80                         if (pos == OUT) {
81                                 if (*((float *)data) < actual_out_flow)
82                                         actual_out_flow = *((float *)data);
83                         }
84         }
85 }
86
87 void Tank::get_state_as_xml(std::stringstream &out)
88 {
89         PlantItem::get_state_as_xml(out);
90                                 
91         out << "\t<tank name=\"" << name << "\">" << std::endl;
92         out << "\t\t<capacity>" << capacity << "</capacity>" << std::endl;
93         out << "\t\t<litros>" << litros << "</litros>" << std::endl;
94         out << "\t</tank>" << std::endl;
95 }