agrobot_base/Firmware/Modulos/SerialService.h

293 lines
7.4 KiB
C++

#include "Enuns.h"
#include <vector>
#ifndef SerialService
#define SerialService
const char BeginLine = '@';
const char EndLine = '$';
const char BeginSensor = '#';
const char* SplitMessage = ";";
const char* SplitParams = ",";
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 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)Msg + SplitParams +
(String)idMensagem + SplitParams +
EndLine;
return protocolo;
}
String MontarProtocoloVerificacao(T_Code D_Code, int versao) {
String Protocolo =
(String)D_Code + ";" +
(String)Chk + ";" +
(String)versao + ";" +
EndLine;
return Protocolo;
}
String MontarProtocoloErro(T_Code D_Code) {
String Protocolo =
(String)D_Code + ";" +
(String)Err + ";" +
EndLine;
return Protocolo;
}
String MontarProtocoloSensor(S_Code TipoSensor, String Componente, String Dados) {
String Protocolo =
BeginSensor +
(String)TipoSensor + ";" +
Componente + ";" +
Dados +
EndLine;
return Protocolo;
}
String MontarDadosProtocoloTeste(bool Testando, String Componente, String Resultado, String Comando, String Leitura) {
String Protocolo =
(Testando ? "1;" : "0;") +
Componente + ";" +
Resultado + ";" +
Comando + ";" +
Leitura +
EndLine;
return Protocolo;
}
String MontarDadosProtocoloRPM(float rpm, double potencia, StatusMotor aceleracao, Sentido sentido, bool revertendo, float rpm_offset) {
String Protocolo =
(String)rpm + ";" +
(String)potencia + ";" +
(String)aceleracao + ";" +
(String)sentido + ";" +
(revertendo ? "1" : "0") + ";" +
(String)rpm_offset;
return Protocolo;
}
String MontarDadosProtocoloDHT22(float temperatura, float umidade, float indiceCalor) {
String Protocolo =
(String)temperatura + ";" +
(String)umidade + ";" +
(String)indiceCalor;
return Protocolo;
}
String MontarDadosProtocoloEncoder(Sentido sentido, int angulo, bool ref0, bool ref90, bool ref270, bool referenciando, bool referenciado) {
String Protocolo =
(String)sentido + ";" +
(String)angulo + ";" +
(ref0 ? "1" : "0") + ";" +
(ref90 ? "1" : "0") + ";" +
(ref270 ? "1" : "0") + ";" +
(referenciando ? "1" : "0") + ";" +
(referenciado ? "1" : "0");
return Protocolo;
}
String MontarDadosProtocoloEncoderAbsoluto(Sentido sentido, int angulo) {
String Protocolo =
(String)sentido + ";" +
(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") + ";" +
String(percentualPotencia);
return Protocolo;
}
String MontarDadosProtocoloSensorGenerico(String dados1, String dados2 = "", String dados3 = "", String dados4 = "") {
String Protocolo =
dados1 + ";" +
dados2 + ";" +
dados3 + ";" +
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 + ";" +
(String)vPin + ";" +
(String)vReal;
return Protocolo;
}
String MontarDadosProtocoloCorrente(float leitura, float vPin, float corrente) {
String Protocolo =
(String)leitura + ";" +
(String)vPin + ";" +
(String)corrente;
return Protocolo;
}
String MontarDadosProtocoloINA226(float busVoltage, float shuntVoltage, float current, float power) {
String Protocolo =
(String)busVoltage + ";" +
(String)shuntVoltage + ";" +
(String)current + ";" +
(String)power;
return Protocolo;
}
String MontarDadosProtocoloUltrassom(float distancia, long duracao) {
String Protocolo =
(String)distancia + ";" +
(String)duracao;
return Protocolo;
}
String MontarDadosProtocoloFluxo(int pulsos, int tempo) {
String Protocolo =
(String)pulsos + ";" +
(String)tempo;
return Protocolo;
}
String MontarDadosProtocoloMassa(float massa) {
String Protocolo =
(String)massa;
return Protocolo;
}
String MontarDadosProtocoloPressao(float pressao, int leitura) {
String Protocolo =
(String)pressao + ";" +
(String)leitura;
return Protocolo;
}
String MontarDadosProtocoloMagnetometro(int x, int y, int z, float orientacao) {
String Protocolo =
(String)x + ";" +
(String)y + ";" +
(String)z + ";" +
(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 + ";" +
(String)angulo + ";" +
(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(float rpm, double temperatura, double tensao, double corrente_max, bool ligado, Sentido sentido, bool freio, int codigo_alarme, double temp_driver) {
String Protocolo =
(String)rpm + ";" +
(String)temperatura + ";" +
(String)tensao + ";" +
(String)corrente_max + ";" +
(ligado ? "1" : "0") + ";" +
(String)sentido + ";" +
(freio ? "1" : "0") + ";" +
(String)codigo_alarme + ";" +
(String)temp_driver;
return Protocolo;
}
#endif