agrobot_base/Firmware/Modulos/SinaleiroModel.h

124 lines
3.3 KiB
C++

#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<Sinaleiro*>(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