agrobot_base/Firmware/Modulos/IComponenteCan.h

79 lines
2.6 KiB
C
Raw Permalink Normal View History

2025-07-23 15:14:50 +00:00
#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));
}
}
}
}
}
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) {
componente.RequisitarDados();
if (enviarStatus) {
enviarDadosFunc(componente.MontarMensagemCAN(CanMessagePosicaoDados::Status));
}
if (componente.Iniciado) {
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));
}
}
}
}
}
2025-07-23 15:14:50 +00:00
};
#endif