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