46 lines
1.5 KiB
C
46 lines
1.5 KiB
C
|
|
#include "Enuns.h"
|
||
|
|
|
||
|
|
#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;
|
||
|
|
|
||
|
|
template<typename T>
|
||
|
|
static void ProcessarComponentesCAN(
|
||
|
|
const std::vector<T*>& listaComponentes,
|
||
|
|
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)) {
|
||
|
|
componente->RequisitarDados();
|
||
|
|
if (enviarStatus) {
|
||
|
|
enviarDadosFunc(componente->MontarMensagemCAN(CanMessagePosicaoDados::Status));
|
||
|
|
}
|
||
|
|
if (componente->Iniciado) {
|
||
|
|
if (todosDados) {
|
||
|
|
for (auto p : posicoes) {
|
||
|
|
if (p == CanMessagePosicaoDados::Status) continue; // Evita enviar status duas vezes
|
||
|
|
enviarDadosFunc(componente->MontarMensagemCAN(p));
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
enviarDadosFunc(componente->MontarMensagemCAN(posicao));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
#endif
|