#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 MontarMensagemCAN(CanMessagePosicaoDados posicao) = 0; template static void ProcessarComponentesCAN( const std::vector& listaComponentes, std::vector posicoes, bool todosIDs, int id_num, bool enviarStatus, bool todosDados, CanMessagePosicaoDados posicao, std::function&)> 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 static void ProcessarComponenteCAN( T& componente, const std::vector& posicoes, bool todosIDs, int id_num, bool enviarStatus, bool todosDados, CanMessagePosicaoDados posicao, std::function&)> 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)); } } } } } }; #endif