agrobot_base/Firmware/Modulos/IComponenteCan.h

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