]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blob - Model/src/tank.cpp
93c8564dd77231064f71735c78a698c365cb3eca
[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         std::cout << name << "Capacidad: " << capacity;
56         std::cout << "  Litros : " << litros << std::endl;
57         updated = false;
58 }
59
60 void Tank::recieve_msg(int msg, IConector *who, void *data)
61 {
62         int pos = OUT;
63
64         // Verifico si esta conectado a mi entrada
65         std::list<IConector *>::iterator i;
66         for(i=in_list.begin(); i!=in_list.end(); i++) {
67                 if ((*i) == who) pos = IN;
68         }
69         
70         switch (msg) {
71                 case MSG_QUERY_MAX_FLOW_OUT:
72                         actual_in_flow = capacity - litros;
73                         if (*((float *)data) < actual_in_flow)
74                                 actual_in_flow = *((float *)data);
75                         actual_out_flow = litros;
76                         send_msg(OUT, MSG_QUERY_MAX_FLOW_OUT, &actual_out_flow);
77
78                         who->recieve_msg(MSG_RESPONSE_MAX_FLOW, this, &actual_in_flow);
79                         updated = true;
80                 break;
81                 case MSG_RESPONSE_MAX_FLOW:
82                         if (pos == OUT) {
83                                 if (*((float *)data) < actual_out_flow)
84                                         actual_out_flow = *((float *)data);
85                         }
86         }
87 }
88
89 void Tank::get_state_as_xml(std::stringstream &out)
90 {
91         PlantItem::get_state_as_xml(out);
92                                 
93         out << "\t<tank name=\"" << name << "\">" << std::endl;
94         out << "\t\t<capacity>" << capacity << "</capacity>" << std::endl;
95         out << "\t\t<litros>" << litros << "</litros>" << std::endl;
96         out << "\t</tank>" << std::endl;
97 }