#include "SerialService.h" #include "Pinout.h" #include "Utils.h" #ifndef ReleModel #define ReleModel class Rele { public: static std::vector ConfigurarRele(std::vector& lista, std::vector& data, const String& Mod_ID); static void ComandarRele(std::vector& lista, std::vector& data, uint8_t& id); Rele(String _modID, String _id) { Mod_ID = _modID; _ID = _id; } String Mod_ID; String _ID; int ID_Num; PinoModel _pino; bool Iniciado = false; bool AtuacaoNivelAlto = true; Estado _Status = Desligado; void Inicializar() { if (Iniciado) { PrintTela(_ID + " ja inicializado"); return; } _pino.Conectar(!AtuacaoNivelAlto); Iniciado = _pino.Definido(); if (Iniciado) { PrintTela(_ID + " iniciado"); } else { PrintTela(_ID + " nao iniciado"); } } void Desligar() { if (!Iniciado) { PrintTela(_ID + " nao esta inicializado"); return; } // Redefinir as configurações para os valores iniciais _pino.Desconectar(); PrintTela(_ID + " Desligado"); Iniciado = false; } void AtualizarStatus(Estado novoEstado) { if (Iniciado) { bool status = novoEstado == Ligado; if (!AtuacaoNivelAlto) { status = !status; } PrintTela("Atualizando status do rele de ", false); PrintTela(String(_Status), false); PrintTela(" para ", false); PrintTela(String(novoEstado)); _pino.set(status); _Status = (Estado)_pino.get(); } } void AtualizarLeitura() { if (Iniciado) { _Status = (Estado)_pino.get(); } } void RequisitarDados() { AtualizarLeitura(); } std::vector MontarMensagemCAN(CanMessagePosicaoDados posicao) { std::vector data; data.push_back(ID_Num); data.push_back(static_cast(posicao)); switch (posicao) { case CanMessagePosicaoDados::Status: { data.push_back(Iniciado ? 1 : 0); break; } case CanMessagePosicaoDados::Dados1: { data.push_back(static_cast(_Status)); break; } } return data; } }; std::vector Rele::ConfigurarRele(std::vector& lista, std::vector& data, const String& Mod_ID) { std::vector status; if (data.size() < 3) return status; uint8_t idNum = data[1]; CanMessagePosicaoDados posicao = (CanMessagePosicaoDados)data[2]; auto it = std::find_if(lista.begin(), lista.end(), [idNum](Rele* s) { return s->ID_Num == idNum; }); bool jaExiste = it != lista.end(); Rele* sensor; switch (posicao) { case CanMessagePosicaoDados::Config1: { if (data.size() < 8) return status; bool conectar = data[4] == 1; bool atuacaoNivelAlto = data[5] == 1; TiposBarramentos tipoBarramento = (TiposBarramentos)data[6]; int pino = data[7]; if (conectar) { if (!jaExiste) { sensor = new Rele(Mod_ID, "sRLE_" + String(idNum)); } else { sensor = *it; } if (!sensor->Iniciado) { sensor->ID_Num = idNum; sensor->_pino = PinoModel(pino, tipoBarramento, _OUTPUT); sensor->AtuacaoNivelAlto = atuacaoNivelAlto; sensor->Inicializar(); if (!jaExiste) { lista.push_back(sensor); PrintTela("Rele adicionado via CAN: sRLE_" + String(idNum)); } } status = sensor->MontarMensagemCAN(CanMessagePosicaoDados::Status); } else { if (jaExiste) { sensor = *it; sensor->Desligar(); status = sensor->MontarMensagemCAN(CanMessagePosicaoDados::Status); delete sensor; lista.erase(it); PrintTela("Rele removido via CAN: sRLE_" + String(idNum)); } } break; } } return status; } void Rele::ComandarRele(std::vector& lista, std::vector& data, uint8_t& id) { if (data.size() < 4) return; for (auto* _rele : lista) { if (_rele->ID_Num == id) { _rele->AtualizarStatus((Estado)data[3]); return; } } } #endif