]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blob - Model/src/conduct.cpp
hay pequenias modificaciones en el workplace, se cuelga por eso pero en un rato lo...
[z.facultad/75.42/plaqui.git] / Model / src / conduct.cpp
1
2 #include "conduct.h"
3
4 using namespace PlaQui::Model;
5
6 Conduct::Conduct(const std::string &_name):Transport(_name)
7 {
8         max_flow = actual_flow = 0.0f;
9
10         // Inicio los parametros de conectores
11         in_slots = 1;
12         out_slots = 1;
13         actual_flow = 9999;
14 }
15
16 Conduct::~Conduct()
17 {
18 }
19
20 void Conduct::recieve_msg(int msg, IConector *who, void *data)
21 {
22         switch (msg) {
23                 case MSG_QUERY_MAX_FLOW_OUT: {
24                         // Me preguntan por el flujo máximo.
25                         // Primero me actualizo, y luego respondo
26                         float tmp = *((float *)data);
27         //              update();
28                         actual_flow = (actual_flow>max_flow)?max_flow:actual_flow;
29                         actual_flow = (actual_flow<tmp)?actual_flow:tmp;
30
31                         send_msg(OUT, MSG_QUERY_MAX_FLOW_OUT, &actual_flow);
32                         // FIXME : no tiene que ir
33                         if (out_list.size() == 0) tmp = max_flow;
34                         who->recieve_msg(MSG_RESPONSE_MAX_FLOW, this, &actual_flow);
35                         updated = true;
36                 }
37                 break;
38                 case MSG_RESPONSE_MAX_FLOW: {
39                         float max = *((float *)data);
40                         // Actualizo mi flujo en base a la respuesta
41                         if (max < actual_flow) {
42                                 actual_flow = max;
43                         }
44                 }
45                 break;
46                 default:
47                         Transport::recieve_msg(msg, who, data);
48         }
49 }
50
51 void Conduct::update(int dir)
52 {
53         // Si ya me actualice, no lo tengo que hacer de nuevo
54         if (updated) return;
55         // Seteo mi actualizar en true para evitar entrar de nuevo
56         actual_flow = 99999;
57         updated = true;
58         switch (dir) {
59                 case IN:
60                         send_msg(IN, MSG_QUERY_MAX_FLOW_IN, (void *)&max_flow);
61                 break;
62                 case OUT:
63                         send_msg(OUT, MSG_QUERY_MAX_FLOW_OUT, (void *)&max_flow);
64         }
65 }
66
67 void Conduct::simulate()
68 {
69         if (!updated) {
70                 std::cout << name << "::sin actualizar!" << std::endl;
71                 return;
72         }
73
74         std::cout << name << "::Flujo actual = " << actual_flow << std::endl;
75         updated = false;
76 }
77
78 void Conduct::get_state_as_xml(std::stringstream &out)
79 {
80         out << "\t<conduct name=\"" << name << "\">" << std::endl;
81         out << "\t\t<actual_flow>" << actual_flow << "</actual_flow>" << std::endl;
82         out << "\t</conduct>" << std::endl;
83 }
84