-
Notifications
You must be signed in to change notification settings - Fork 0
/
datasetPorta.cpp
156 lines (125 loc) · 4.82 KB
/
datasetPorta.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#include "datasetPorta.h"
#include "excecoes.h"
#include "dumbApiDebug.h"
#include "chamadasPython.h"
#include <iomanip>
DatasetPorta::DatasetPorta() :
Dataset(), vetorDados(0) { consultarDados(); }
void DatasetPorta::consultarDados() {
// dadosRetornados: "0,36000,True;1,46015,False;2,57900,False;3,67523,True"
string dadosRetornados = queryDadosPorta();
// dados: ["0,36000,True" "1,46015,False" "2,57900,False" "3,67523,True"]
vector<string> dados = fatiarString(dadosRetornados, ";");
for(string dado : dados) {
// campos: ["0" "36000" "True"]
vector<string> campos = fatiarString(dado, ",");
unsigned id = (unsigned)stoul(campos[0],nullptr);
unsigned timestamp = (unsigned)stoul(campos[1],nullptr);
bool aberta = (campos[2] == "True" ? true : false);
horario_t horario(timestamp);
porta_t amostra;
amostra.id = id;
amostra.hora = horario;
amostra.aberta = aberta;
vetorDados.push_back(amostra);
}
}
void DatasetPorta::atualizarDados() {
vetorDados.clear();
consultarDados();
}
void DatasetPorta::publicarDados(string dado) {
insertDadosPorta(dado);
}
void DatasetPorta::exibirDados() {
cout << left << setw(9) << "ID"
<< left << setw(15) << "Horario"
<< left << setw(15) << "Estado" << endl;
for (porta_t amostra : vetorDados) {
string textoEstado = (amostra.aberta ? "Aberta" : "Fechada");
cout << left << setw(9) << amostra.id
<< left << setw(15) << amostra.hora
<< left << setw(15) << textoEstado << endl;
}
}
void DatasetPorta::exibirEstatisticas() {
horario_t tempoAberta = this->calcularTempoAberta();
horario_t intervalo = calcularIntervalo();
horario_t tempoFechada = intervalo - tempoAberta;
cout << left << setw(25) << "Estatistica" << "Valor" << endl;
cout << left << setw(25) << "Tempo aberta" << tempoAberta << endl;
cout << left << setw(25) << "Tempo fechada" << tempoFechada << endl;
cout << left << setw(25) << "Intervalo" << intervalo << endl;
}
void DatasetPorta::abrirFecharPorta() {
bool abertaNoMomento = (vetorDados.end()-1)->aberta;
unsigned ultimoId = (vetorDados.end()-1)->id;
horario_t ultimoHorario = (vetorDados.end()-1)->hora;
horario_t horarioAtual;
porta_t novoDado;
if(ultimoHorario > horarioAtual) {
cout << "O ultimo dado foi inserido em uma hora anterior.\n"
<< "Ajustando o horario do novo dado para manter ordem." << endl;
novoDado.hora = ultimoHorario;
} else
novoDado.hora = horarioAtual;
novoDado.id = ultimoId+1;
if(abertaNoMomento) {
novoDado.aberta = false;
cout << "Porta fechada" << endl;
} else {
novoDado.aberta = true;
cout << "Porta aberta" << endl;
}
vetorDados.push_back(novoDado);
string idString(to_string(novoDado.id));
string horaString(to_string(novoDado.hora.horarioToTimestamp()));
string boolString = novoDado.aberta ? "True" : "False";
string dado(idString + "," + horaString + "," + boolString);
publicarDados(dado);
cout << "Publicacao realizada com sucesso." << endl;
}
horario_t DatasetPorta::calcularTempoAberta() {
horario_t tempoInicial(0);
horario_t tempoFinal(0);
horario_t tempoAberta(0);
bool ultimoEstado = false;
for (porta_t amostra : vetorDados) {
// Viu que a porta foi aberta -> registra o tempo inicial
if (amostra.aberta == true && ultimoEstado == false) {
tempoInicial = amostra.hora;
ultimoEstado = true;
}
// Viu que a porta foi fechada -> registra o tempo inicial
else if (amostra.aberta == false && ultimoEstado == true) {
tempoFinal = amostra.hora;
horario_t tempoDecorrido(0);
tempoDecorrido = tempoFinal - tempoInicial;
tempoAberta = tempoAberta + tempoDecorrido;
ultimoEstado = false;
}
}
// Terminou aberta -> registra tempo final
if(ultimoEstado == true) {
horario_t tempoDecorrido(0);
tempoDecorrido = (vetorDados.end()-1)->hora - tempoInicial;
tempoAberta = tempoAberta + tempoDecorrido;
}
return tempoAberta;
}
horario_t DatasetPorta::calcularIntervalo() {
vector<porta_t>::iterator it_inicio = vetorDados.begin();
porta_t primeiraAmostra = *it_inicio;
horario_t tempoInicial = primeiraAmostra.hora;
vector<porta_t>::iterator it_fim = vetorDados.end()-1;
porta_t ultimaAmostra = *it_fim;
horario_t tempoFinal = ultimaAmostra.hora;
horario_t deltaT;
try {
deltaT = tempoFinal - tempoInicial;
}
catch (ExcecaoHorarioInconsistente& excecao) {
cerr << excecao.what() << "Alerta para problemas no sincronismo do BD (intervalo estranho)" << endl;
}
return deltaT;
}