88 lines
2.7 KiB
C++
88 lines
2.7 KiB
C++
#include "Enuns.h"
|
|
#include <vector>
|
|
#include <functional>
|
|
|
|
#ifndef ICOMPONENTECAN_H
|
|
#define ICOMPONENTECAN_H
|
|
|
|
class ComponenteCAN {
|
|
public:
|
|
int ID_Num = 0;
|
|
bool Iniciado = false;
|
|
|
|
virtual void RequisitarDados() = 0;
|
|
virtual std::vector<uint8_t> MontarMensagemCAN(CanMessagePosicaoDados posicao) = 0;
|
|
|
|
// IMPORTANTE: estes helpers apenas serializam o estado ja adquirido.
|
|
// Aquisicao fisica nunca deve acontecer no caminho de requisicao CAN.
|
|
template<typename T>
|
|
static void ProcessarComponentesCAN(
|
|
const std::vector<T*>& listaComponentes,
|
|
const std::vector<CanMessagePosicaoDados>& posicoes,
|
|
bool todosIDs,
|
|
int id_num,
|
|
bool enviarStatus,
|
|
bool todosDados,
|
|
CanMessagePosicaoDados posicao,
|
|
std::function<void(const std::vector<uint8_t>&)> enviarDadosFunc
|
|
) {
|
|
for (auto* componente : listaComponentes) {
|
|
if (componente == nullptr || (!todosIDs && componente->ID_Num != id_num)) {
|
|
continue;
|
|
}
|
|
|
|
if (enviarStatus) {
|
|
enviarDadosFunc(componente->MontarMensagemCAN(CanMessagePosicaoDados::Status));
|
|
}
|
|
|
|
if (!componente->Iniciado) {
|
|
continue;
|
|
}
|
|
|
|
if (todosDados) {
|
|
for (auto p : posicoes) {
|
|
if (p == CanMessagePosicaoDados::Status) continue;
|
|
enviarDadosFunc(componente->MontarMensagemCAN(p));
|
|
}
|
|
} else if (posicao != CanMessagePosicaoDados::Status || !enviarStatus) {
|
|
enviarDadosFunc(componente->MontarMensagemCAN(posicao));
|
|
}
|
|
}
|
|
}
|
|
|
|
template<typename T>
|
|
static void ProcessarComponenteCAN(
|
|
T& componente,
|
|
const std::vector<CanMessagePosicaoDados>& posicoes,
|
|
bool todosIDs,
|
|
int id_num,
|
|
bool enviarStatus,
|
|
bool todosDados,
|
|
CanMessagePosicaoDados posicao,
|
|
std::function<void(const std::vector<uint8_t>&)> enviarDadosFunc
|
|
) {
|
|
if (!todosIDs && componente.ID_Num != id_num) {
|
|
return;
|
|
}
|
|
|
|
if (enviarStatus) {
|
|
enviarDadosFunc(componente.MontarMensagemCAN(CanMessagePosicaoDados::Status));
|
|
}
|
|
|
|
if (!componente.Iniciado) {
|
|
return;
|
|
}
|
|
|
|
if (todosDados) {
|
|
for (auto p : posicoes) {
|
|
if (p == CanMessagePosicaoDados::Status) continue;
|
|
enviarDadosFunc(componente.MontarMensagemCAN(p));
|
|
}
|
|
} else if (posicao != CanMessagePosicaoDados::Status || !enviarStatus) {
|
|
enviarDadosFunc(componente.MontarMensagemCAN(posicao));
|
|
}
|
|
}
|
|
};
|
|
|
|
#endif
|