#include "SerialService.h" #include "Pinout.h" #include "Utils.h" #ifndef SinaleiroModel #define SinaleiroModel class Sinaleiro { public: Sinaleiro(String _modID, String _id, int _taxaAmostragem = 2000) { Mod_ID = _modID; _ID = _id; } String Mod_ID; String _ID; PinoModel _pino; bool Iniciado = false; StatusLED _Status = Apagado; StatusLED _StatusLeitura = Apagado; int _Qtd = 0; int _TempoMs = 0; int _PausaMs = 0; void Inicializar() { if (Iniciado) { //EnviarDadosSerial(_ID + " ja inicializado"); EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0")); return; } _pino.Conectar(false); xTaskCreatePinnedToCore(&Sinaleiro::LEDTaskWrapper, "LEDTask", 5000, this, 6, &LEDTaskHandle, tskNO_AFFINITY); //EnviarDadosSerial(_ID + " Iniciado"); Iniciado = true; EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0")); } void Desligar() { if (!Iniciado) { //EnviarDadosSerial(_ID + " nao esta inicializado"); EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0")); return; } // Parar a execução das tarefas vTaskDelete(LEDTaskHandle); // Redefinir as configurações para os valores iniciais _pino.Desconectar(); //EnviarDadosSerial(_ID + " Desligado"); Iniciado = false; EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0")); } void AtualizarLeitura() { _StatusLeitura = (StatusLED)_pino.get(); } void RequisitarDados() { AtualizarLeitura(); EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sLED, _ID, MontarDadosProtocoloLED(Iniciado, _StatusLeitura))); } private: TaskHandle_t LEDTaskHandle = NULL; static void LEDTaskWrapper(void *pvParameters) { Sinaleiro *led = static_cast(pvParameters); led->LEDTask(); } void LEDTask() { unsigned long lastMillis = millis(); bool ledState = false; int piscadasAtual = 0; bool emPausa = false; while (1) { unsigned long currentMillis = millis(); if (_Status != Piscando) { _pino.set(_Status == Aceso); _StatusLeitura = (StatusLED)_pino.get(); } else if (_Status == Piscando && piscadasAtual < _Qtd) { if (!emPausa && (currentMillis - lastMillis >= _TempoMs)) { ledState = !ledState; _pino.set(ledState); lastMillis = currentMillis; if (!ledState) { // Se o LED acabou de ser desligado, incrementa o contador de piscadas piscadasAtual++; } } else if (emPausa && (currentMillis - lastMillis >= _PausaMs)) { emPausa = false; lastMillis = currentMillis; } } else if (piscadasAtual >= _Qtd) { // Se alcançou a quantidade desejada de piscadas, entra em pausa if (!emPausa) { ledState = false; _pino.set(false); // Garante que o LED está desligado emPausa = true; piscadasAtual = 0; // Reseta o contador de piscadas lastMillis = currentMillis; } } vTaskDelay(1); // Pequena pausa para liberar o CPU } } }; #endif