6 using namespace PlaQui::Model;
8 Tank::Tank(const std::string &_name):Source(_name),Drain(_name),Control(_name)
12 /* Utilizo en input como el flotante de arriba y el output como el de abajo */
13 input = new Condition(Condition::GT, 0.9, this);
14 output = new Condition(Condition::LT, 0.1, this);
23 bool Tank::get_output()
28 void Tank::update(int dir)
38 std::list<IConector *>::iterator i = in_list.begin();
39 if (i != in_list.end()) {
40 PlantItem *o = (PlantItem *)(*i);
41 in_color = o->get_color();
44 // le sumo lo que recibo
45 litros += actual_in_flow;
46 // calculo el nuevo color
50 r = (int)(fluid_color.r()*litros/l + in_color.r()*actual_in_flow/l);
51 g = (int)(fluid_color.g()*litros/l + in_color.g()*actual_in_flow/l);
52 b = (int)(fluid_color.b()*litros/l + in_color.b()*actual_in_flow/l);
57 fluid_color = RGB(r,g,b);
59 // le resto lo que entrego
60 litros -= actual_out_flow;
63 std::cout << name << "Capacidad: " << capacity;
64 std::cout << " Litros : " << litros << std::endl;
69 void Tank::recieve_msg(int msg, IConector *who, void *data)
73 // Verifico si esta conectado a mi entrada
74 std::list<IConector *>::iterator i;
75 for(i=in_list.begin(); i!=in_list.end(); i++) {
76 if ((*i) == who) pos = IN;
80 case MSG_QUERY_MAX_FLOW_OUT:
82 who->recieve_msg(MSG_RESPONSE_MAX_FLOW, this, &actual_in_flow);
84 actual_in_flow = capacity - litros;
85 if (*((float *)data) < actual_in_flow)
86 actual_in_flow = *((float *)data);
87 actual_out_flow = litros;
88 send_msg(OUT, MSG_QUERY_MAX_FLOW_OUT, &actual_out_flow);
90 who->recieve_msg(MSG_RESPONSE_MAX_FLOW, this, &actual_in_flow);
93 case MSG_RESPONSE_MAX_FLOW:
95 if (*((float *)data) < actual_out_flow)
96 actual_out_flow = *((float *)data);
101 void Tank::get_state_as_xml(std::stringstream &out)
103 PlantItem::get_state_as_xml(out);
105 out << "\t<tank name=\"" << name << "\">" << std::endl;
106 out << "\t\t<capacity>" << capacity << "</capacity>" << std::endl;
107 out << "\t\t<litros>" << litros << "</litros>" << std::endl;
108 out << "\t</tank>" << std::endl;