]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blob - Model/src/exclusa.cpp
se mejora la conexion entre compuertas, se salvan en el XML, hay un par de cosas...
[z.facultad/75.42/plaqui.git] / Model / src / exclusa.cpp
1
2 #include "exclusa.h"
3 #include <iostream>
4
5 using namespace PlaQui::Model;
6
7 Exclusa::Exclusa(const std::string &_name):Control(_name)
8 {
9         is_open = true;
10         in_slots = out_slots = 1;
11         // Genero mi logica de control
12         input = new ByPass();
13         output = new ByPass();
14         ((ByPass *)output)->set_control(this);
15         updated = false;
16 }
17
18 Exclusa::~Exclusa()
19 {
20         delete input;
21         delete output;
22 }
23
24 void Exclusa::update(int dir)
25 {
26         std::list<IConector *>::iterator i = in_list.begin();
27         if (i != in_list.end()) {
28                 PlantItem *o = (PlantItem *)(*i);
29                 set_color( o->get_color() );
30         }
31         // Primero me fijo si la entrada esta operando, es decir
32         // si hay alguien conectado para automatizar.
33         if (input->is_operational()) {
34                 // como si lo hay, entonces pregunto cual debe ser
35                 // mi estado
36                 is_open = input->get_output();
37         }
38 }
39
40 void Exclusa::simulate()
41 {
42 #ifdef DEBUG
43         std::cout << name << ": " << ((is_open)?"Abierta":"Cerrada") << std::endl;
44 #endif
45 }
46
47 void Exclusa::recieve_msg(int msg, IConector *who, void *data)
48 {
49         switch (msg) {
50                 case MSG_QUERY_MAX_FLOW_OUT:
51                         if (updated) {
52                                 who->recieve_msg(MSG_RESPONSE_MAX_FLOW, this, &temp);
53                         }
54                         temp = *((float *)data);
55                         if (!is_open) temp = 0;
56                         send_msg(OUT, MSG_QUERY_MAX_FLOW_OUT, &temp);
57                         who->recieve_msg(MSG_RESPONSE_MAX_FLOW, this, &temp);
58                 break;
59                 case MSG_RESPONSE_MAX_FLOW:
60                         if (is_open)
61                                 temp = *((float *)data);
62                 break;
63                 default:
64                         Control::recieve_msg(msg, who, data);
65         }
66 }
67         
68 void Exclusa::get_state_as_xml(std::stringstream &out)
69 {
70         // Datos comunes
71         // hack to avoid output problems :-)
72         actual_flow = temp;
73         PlantItem::get_state_as_xml(out);
74         out << "\t<exclusa name=\"" << name << "\">" << std::endl;
75         out << "\t\t<active>" << ((is_open)?"true":"false") << "</active>" << std::endl;
76         out << "\t</exclusa>" << std::endl;
77 }
78