#include "Enuns.h" #include #include #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; // IMPORTANTE: estes helpers apenas serializam o estado ja adquirido. // Aquisicao fisica nunca deve acontecer no caminho de requisicao CAN. template static void ProcessarComponentesCAN( const std::vector& listaComponentes, const 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)) { 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 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) { 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