agrobot_base/Firmware/Modulos/SerialService.h

394 lines
11 KiB
C++

#include "Enuns.h"
#include <vector>
#include <optional>
#ifndef SerialService
#define SerialService
bool DebugMode = true;
const char BeginLine = '@';
const char EndLine = '$';
const char BeginSensor = '#';
const char* SplitMessage = ";";
const char* SplitParams = ",";
const char* SplitConfig = "*";
const char* SplitSubParams = "~";
const int MAX_PROTOCOLS = 20;
class ProtocoloSerial {
public:
F_Code funcao;
String Mod_ID;
String protocolo;
int idMensagem;
};
std::vector<String> SplitString(String message, const char *delimiter) {
std::vector<String> partes;
char messageArray[256];
message.toCharArray(messageArray, sizeof(messageArray));
char *token = strtok(messageArray, delimiter);
while (token != nullptr) {
partes.push_back(String(token));
token = strtok(nullptr, delimiter);
}
return partes;
}
std::vector<ProtocoloSerial> LerBufferSerialFila(String Mod_ID) {
std::vector<ProtocoloSerial> protocolos;
if (Serial.available() > 0) {
bool ProtocoloIniciado = false;
String protocoloAtual = "";
while (Serial.available()) {
char entrada = (char)Serial.read();
if (entrada == BeginLine) {
ProtocoloIniciado = true;
}
else if (entrada == EndLine) {
ProtocoloIniciado = false;
if (protocoloAtual.length() > 0) {
std::vector<String> partes = SplitString(protocoloAtual, SplitMessage);
if (partes.size() == 4) {
ProtocoloSerial objeto;
objeto.idMensagem = partes[0].toInt();
objeto.Mod_ID = partes[1];
objeto.funcao = (F_Code)(partes[2].toInt());
objeto.protocolo = partes[3];
if (Mod_ID == objeto.Mod_ID) {
protocolos.push_back(objeto);
}
}
break;
}
} else if (ProtocoloIniciado) {
protocoloAtual += entrada;
}
}
}
return protocolos;
}
void PrintTela(String msg, bool ln = true) {
if (!Serial) {
Serial.begin(115200);
}
if (Serial && DebugMode) {
if (ln) {
Serial.println(msg);
}
else {
Serial.print(msg);
}
}
}
void EnviarDadosSerial(String Mod_ID, String Mensagem) {
String ProtocoloEnvio = Mod_ID + SplitMessage + Mensagem;
Serial.println(ProtocoloEnvio);
Serial.flush();
vTaskDelay(pdMS_TO_TICKS(10));
}
String MontarProtocoloMensagemRecebida(int idMensagem) {
String protocolo =
(String)MsgRx + SplitMessage +
(String)idMensagem + SplitMessage +
EndLine;
return protocolo;
}
String MontarProtocoloVerificacao(T_Code D_Code, int versao, bool conectado) {
String Protocolo =
(String)ChkRx + SplitMessage +
(String)D_Code + SplitMessage +
(String)versao + SplitMessage +
(conectado ? "1" : "0") + SplitMessage +
EndLine;
return Protocolo;
}
String MontarProtocoloErro(T_Code D_Code) {
String Protocolo =
(String)D_Code + SplitMessage +
(String)ErrRx + SplitMessage +
EndLine;
return Protocolo;
}
String MontarProtocoloSensor(S_Code TipoSensor, String Componente, String Dados) {
String Protocolo =
BeginSensor +
(String)TipoSensor + SplitMessage +
Componente + SplitMessage +
Dados +
EndLine;
return Protocolo;
}
String MontarDadosProtocoloTeste(bool Testando, String Componente, String Resultado, String Comando, String Leitura) {
String Protocolo = (String)"" +
(Testando ? "1" : "0") + SplitMessage +
Componente + SplitMessage +
Resultado + SplitMessage +
Comando + SplitMessage +
Leitura +
EndLine;
return Protocolo;
}
String MontarDadosProtocoloRPM(float rpm, double potencia, StatusMotor aceleracao, Sentido sentido, bool revertendo, float rpm_offset) {
String Protocolo =
(String)rpm + SplitMessage +
(String)potencia + SplitMessage +
(String)aceleracao + SplitMessage +
(String)sentido + SplitMessage +
(revertendo ? "1" : "0") + SplitMessage +
(String)rpm_offset;
return Protocolo;
}
String MontarDadosProtocoloDHT22(float temperatura, float umidade, float indiceCalor) {
String Protocolo =
(String)temperatura + SplitMessage +
(String)umidade + SplitMessage +
(String)indiceCalor;
return Protocolo;
}
String MontarDadosProtocoloEncoder(Sentido sentido, int angulo, bool ref0, bool ref90, bool ref270, bool referenciando, bool referenciado) {
String Protocolo =
(String)sentido + SplitMessage +
(String)angulo + SplitMessage +
(ref0 ? "1" : "0") + SplitMessage +
(ref90 ? "1" : "0") + SplitMessage +
(ref270 ? "1" : "0") + SplitMessage +
(referenciando ? "1" : "0") + SplitMessage +
(referenciado ? "1" : "0");
return Protocolo;
}
String MontarDadosProtocoloEncoderAbsoluto(Sentido sentido, int angulo) {
String Protocolo =
(String)sentido + SplitMessage +
(String)angulo;
return Protocolo;
}
String MontarDadosProtocoloBicoPulverizador(bool statusBico) {
String Protocolo =
String(statusBico ? "1" : "0");
return Protocolo;
}
String MontarDadosProtocoloBombaPressurizadora(bool ligado, float percentualPotencia) {
String Protocolo =
String(ligado ? "1" : "0") + SplitMessage +
String(percentualPotencia);
return Protocolo;
}
String MontarDadosProtocoloSensorGenerico(String dados1, String dados2 = "", String dados3 = "", String dados4 = "") {
String Protocolo =
dados1 + SplitMessage +
dados2 + SplitMessage +
dados3 + SplitMessage +
dados4;
return Protocolo;
}
String MontarDadosProtocoloNTC10K(float temperatura) {
String Protocolo =
(String)temperatura;
return Protocolo;
}
String MontarDadosProtocoloTensao(float leitura, float vPin, float vReal) {
String Protocolo =
(String)leitura + SplitMessage +
(String)vPin + SplitMessage +
(String)vReal;
return Protocolo;
}
String MontarDadosProtocoloCorrente(float leitura, float vPin, float corrente) {
String Protocolo =
(String)leitura + SplitMessage +
(String)vPin + SplitMessage +
(String)corrente;
return Protocolo;
}
String MontarDadosProtocoloINA226(float busVoltage, float shuntVoltage, float current, float power) {
String Protocolo =
(String)busVoltage + SplitMessage +
(String)shuntVoltage + SplitMessage +
(String)current + SplitMessage +
(String)power;
return Protocolo;
}
String MontarDadosProtocoloUltrassom(float distancia, long duracao) {
String Protocolo =
(String)distancia + SplitMessage +
(String)duracao;
return Protocolo;
}
String MontarDadosProtocoloFluxo(int pulsos, int tempo) {
String Protocolo =
(String)pulsos + SplitMessage +
(String)tempo;
return Protocolo;
}
String MontarDadosProtocoloMassa(float massa) {
String Protocolo =
(String)massa;
return Protocolo;
}
String MontarDadosProtocoloPressao(float pressao, int leitura) {
String Protocolo =
(String)pressao + SplitMessage +
(String)leitura;
return Protocolo;
}
String MontarDadosProtocoloMagnetometro(int x, int y, int z, float orientacao) {
String Protocolo =
(String)x + SplitMessage +
(String)y + SplitMessage +
(String)z + SplitMessage +
(String)orientacao;
return Protocolo;
}
String MontarDadosProtocoloLeituraSensor(float leitura) {
String Protocolo =
(String)leitura;
return Protocolo;
}
String MontarDadosProtocoloSonar(long distancia, long angulo, int posicao) {
String Protocolo =
(String)distancia + SplitMessage +
(String)angulo + SplitMessage +
(String)posicao;
return Protocolo;
}
String MontarDadosProtocoloSonarM(int distancias[36], int angulos[36], int posicao) {
String Protocolo = (String)posicao + "_";
for (int i = 0; i < 36; i++) {
Protocolo += (String)distancias[i] + "," + (String)angulos[i] + "-";
}
return Protocolo;
}
String MontarDadosProtocoloBLD(bool iniciado, float rpm, double temperatura, double tensao, double corrente_max, bool ligado, Sentido sentido, bool freio, int codigo_alarme, double temp_driver) {
String Protocolo = (String)"" +
(iniciado ? "1" : "0") + SplitMessage +
(String)rpm + SplitMessage +
(String)temperatura + SplitMessage +
(String)tensao + SplitMessage +
(String)corrente_max + SplitMessage +
(ligado ? "1" : "0") + SplitMessage +
(String)sentido + SplitMessage +
(freio ? "1" : "0") + SplitMessage +
(String)codigo_alarme + SplitMessage +
(String)temp_driver;
return Protocolo;
}
String MontarDadosProtocoloMVD(bool movIniciado, float rpm, double temperatura, double tensao, double corrente_max, bool ligado, Sentido sentido, bool freio, int codigo_alarme, double temp_driver, bool dirIniciado, Sentido sentidoMp, double angulo) {
String Protocolo = (String)"" +
(movIniciado ? "1" : "0") + SplitMessage +
(String)rpm + SplitMessage +
(String)temperatura + SplitMessage +
(String)tensao + SplitMessage +
(String)corrente_max + SplitMessage +
(ligado ? "1" : "0") + SplitMessage +
(String)sentido + SplitMessage +
(freio ? "1" : "0") + SplitMessage +
(String)codigo_alarme + SplitMessage +
(String)temp_driver + SplitMessage +
(dirIniciado ? "1" : "0") + SplitMessage +
(String)sentidoMp + SplitMessage +
(String)angulo;
return Protocolo;
}
String MontarDadosProtocoloMVD(bool movIniciado, double temperatura, bool dirIniciado, Sentido sentido, int angulo) {
String Protocolo = (String)"" +
(movIniciado ? "1" : "0") + SplitMessage +
(String)temperatura + SplitMessage +
(dirIniciado ? "1" : "0") + SplitMessage +
(String)sentido + SplitMessage +
(String)angulo;
return Protocolo;
}
String MontarDadosProtocoloAtuador(bool b1Iniciado, bool b1, bool b2Iniciado, bool b2, bool b3Iniciado, bool b3, bool b4Iniciado, bool b4, bool bombaIniciada, bool bomba_ligado, double bomba_potencia, bool fluxoIniciado, int fluxo_pulsos, int fluxo_periodo, bool massaIniciado, double massa_leitura, bool pressaoIniciado, double pressao, double pressao_leitura) {
String Protocolo = (String)"" +
(b1Iniciado ? "1" : "0") + SplitMessage +
(b1 ? "1" : "0") + SplitMessage +
(b2Iniciado ? "1" : "0") + SplitMessage +
(b2 ? "1" : "0") + SplitMessage +
(b3Iniciado ? "1" : "0") + SplitMessage +
(b3 ? "1" : "0") + SplitMessage +
(b4Iniciado ? "1" : "0") + SplitMessage +
(b4 ? "1" : "0") + SplitMessage +
(bombaIniciada ? "1" : "0") + SplitMessage +
(bomba_ligado ? "1" : "0") + SplitMessage +
(String)bomba_potencia + SplitMessage +
(fluxoIniciado ? "1" : "0") + SplitMessage +
(String)fluxo_pulsos + SplitMessage +
(String)fluxo_periodo + SplitMessage +
(massaIniciado ? "1" : "0") + SplitMessage +
(String)massa_leitura + SplitMessage +
(pressaoIniciado ? "1" : "0") + SplitMessage +
(String)pressao + SplitMessage +
(String)pressao_leitura;
return Protocolo;
}
String MontarDadosProtocoloLED(bool Iniciado, StatusLED Status) {
String Protocolo = (String)"" +
(Iniciado ? "1" : "0") + SplitMessage +
(String)Status;
return Protocolo;
}
String MontarDadosProtocoloRele(bool Iniciado, Estado Status) {
String Protocolo = (String)"" +
(Iniciado ? "1" : "0") + SplitMessage +
(String)Status;
return Protocolo;
}
String MontarDadosProtocoloFreio(bool Iniciado, int Angulo) {
String Protocolo = (String)"" +
(Iniciado ? "1" : "0") + SplitMessage +
(String)Angulo;
return Protocolo;
}
String MontarDadosProtocoloTemperatura(bool Iniciado, float temperatura) {
String Protocolo = (String)"" +
(Iniciado ? "1" : "0") + SplitMessage +
(String)temperatura;
return Protocolo;
}
#endif