]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blob - Model/src/tank.cpp
Se agrega XML para otros items (no todos ya implementados en el cliente).
[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
30         // le resto lo que entrego
31         litros -= actual_out_flow;
32         // le sumo lo que recibo
33         litros += actual_in_flow;
34
35         std::cout << name << "Capacidad: " << capacity;
36         std::cout << "  Litros : " << litros << std::endl;
37         updated = false;
38 }
39
40 void Tank::recieve_msg(int msg, IConector *who, void *data)
41 {
42         int pos = OUT;
43
44         // Verifico si esta conectado a mi entrada
45         std::list<IConector *>::iterator i;
46         for(i=in_list.begin(); i!=in_list.end(); i++) {
47                 if ((*i) == who) pos = IN;
48         }
49         
50         switch (msg) {
51                 case MSG_QUERY_MAX_FLOW_OUT:
52                         actual_in_flow = capacity - litros;
53                         if (*((float *)data) < actual_in_flow)
54                                 actual_in_flow = *((float *)data);
55                         actual_out_flow = litros;
56                         send_msg(OUT, MSG_QUERY_MAX_FLOW_OUT, &actual_out_flow);
57
58                         who->recieve_msg(MSG_RESPONSE_MAX_FLOW, this, &actual_in_flow);
59                         updated = true;
60                 break;
61                 case MSG_RESPONSE_MAX_FLOW:
62                         if (pos == OUT) {
63                                 if (*((float *)data) < actual_out_flow)
64                                         actual_out_flow = *((float *)data);
65                         }
66         }
67 }
68
69 void Tank::get_state_as_xml(std::stringstream &out)
70 {
71         // El tanque no emite flujo actual!
72         out << "\t<tank name=\"" << name << "\">" << std::endl;
73         out << "\t\t<capacity>" << capacity << "</capacity>" << std::endl;
74         out << "\t\t<litros>" << litros << "</litros>" << std::endl;
75         out << "\t</tank>" << std::endl;
76 }