otimizado procolo CAN, finalizado integracao
This commit is contained in:
parent
a0b879c877
commit
f11ebaf2fd
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -42,7 +42,7 @@
|
|||
|
||||
public enum T_Code
|
||||
{
|
||||
Vzo = 0,
|
||||
Vzo = -1,
|
||||
Mov = 100,
|
||||
Dir = 101,
|
||||
Sen = 102,
|
||||
|
|
@ -65,26 +65,26 @@
|
|||
|
||||
public enum F_Code
|
||||
{
|
||||
Nda = 0,
|
||||
ChkTx = 1,
|
||||
ChkRx = 2,
|
||||
CfgTx = 3,
|
||||
CfgRx = 4,
|
||||
TstTx = 5,
|
||||
TstRx = 6,
|
||||
CmdTx = 7,
|
||||
CmdRx = 8,
|
||||
ErrTx = 9,
|
||||
ErrRx = 10,
|
||||
MsgTx = 11,
|
||||
MsgRx = 12,
|
||||
ReqTx = 13,
|
||||
ReqRx = 14,
|
||||
Nda = -1,
|
||||
ChkTx = 201,
|
||||
ChkRx = 202,
|
||||
CfgTx = 203,
|
||||
CfgRx = 204,
|
||||
TstTx = 205,
|
||||
TstRx = 206,
|
||||
CmdTx = 207,
|
||||
CmdRx = 208,
|
||||
ErrTx = 209,
|
||||
ErrRx = 210,
|
||||
MsgTx = 211,
|
||||
MsgRx = 212,
|
||||
ReqTx = 213,
|
||||
ReqRx = 214,
|
||||
}
|
||||
|
||||
public enum S_Code
|
||||
{
|
||||
sVZO = 0,
|
||||
sVZO = -1,
|
||||
sRPM = 1,
|
||||
sTST = 2,
|
||||
sCFG = 3,
|
||||
|
|
@ -299,12 +299,6 @@
|
|||
Corredores = 3
|
||||
}
|
||||
|
||||
public enum INA219Corrente
|
||||
{
|
||||
C_3_2 = 1,
|
||||
C_50 = 2,
|
||||
C_100 = 3
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -197,7 +197,8 @@ namespace AgroBase.Models.Modules
|
|||
{
|
||||
get
|
||||
{
|
||||
double _LeituraPressao = ((FirmwareSensorPressao)Sensores.FirstOrDefault(x => x.Componente == S_Code.sPRS)?.Leitura)?.Leitura ?? 0;
|
||||
//double _LeituraPressao = ((FirmwareSensorPressao)Sensores.FirstOrDefault(x => x.Componente == S_Code.sPRS)?.Leitura)?.Leitura ?? 0;
|
||||
double _LeituraPressao = 0;
|
||||
double tensao = FuncoesMatematicas.Map(_LeituraPressao, 0, 4095, 0, 3300) / 1000.0;
|
||||
|
||||
double pressao = FuncoesMatematicas.Map(tensao, _PressaoVmin, _PressaoVmax, 0, _PressaoMax);
|
||||
|
|
@ -458,16 +459,18 @@ namespace AgroBase.Models.Modules
|
|||
|
||||
private byte[] ModConfig(bool Conectar)
|
||||
{
|
||||
var pinos = PinoutModel.PinoProtocolo(Pinout, Funcoes, false);
|
||||
//var pinos = PinoutModel.PinoProtocolo(Pinout, Funcoes, false);
|
||||
|
||||
var config = new List<byte>
|
||||
{
|
||||
(byte)S_Code.sMOD,
|
||||
Variaveis.ID_Num_sMOD,
|
||||
(byte)CanMessagePosicaoDados.Config1,
|
||||
(byte)S_Code.sMOD,
|
||||
(byte)(Conectar ? 1 : 0),
|
||||
(byte)(_TaxaAmostragem / 10),
|
||||
(byte)(RequisitarDados ? 1 : 0),
|
||||
};
|
||||
config.AddRange(pinos);
|
||||
//config.AddRange(pinos);
|
||||
|
||||
return config.ToArray();
|
||||
}
|
||||
|
|
@ -748,8 +751,9 @@ namespace AgroBase.Models.Modules
|
|||
|
||||
return new byte[]
|
||||
{
|
||||
(byte)Componente,
|
||||
(byte)ID_Num,
|
||||
(byte)CanMessagePosicaoDados.Config1,
|
||||
(byte)Componente,
|
||||
(byte)(conectar ? 1 : 0),
|
||||
(byte)(AtuacaoNivelAlto ? 1 : 0),
|
||||
(byte)(pino?.Barramento ?? TiposBarramentos.CONTROLADOR),
|
||||
|
|
@ -763,8 +767,8 @@ namespace AgroBase.Models.Modules
|
|||
F_Code.CmdTx,
|
||||
new byte[]
|
||||
{
|
||||
(byte)Componente,
|
||||
(byte)ID_Num,
|
||||
(byte)CanMessagePosicaoDados.Command1,
|
||||
(byte)(ComandoAtuar ? Estado.Ligado : Estado.Desligado)
|
||||
}
|
||||
);
|
||||
|
|
@ -902,8 +906,9 @@ namespace AgroBase.Models.Modules
|
|||
|
||||
List<byte> config = new List<byte>()
|
||||
{
|
||||
(byte)Componente,
|
||||
(byte)ID_Num,
|
||||
(byte)CanMessagePosicaoDados.Config1,
|
||||
(byte)Componente,
|
||||
(byte)(conectar ? 1 : 0),
|
||||
pressaoMax,
|
||||
};
|
||||
|
|
@ -921,8 +926,8 @@ namespace AgroBase.Models.Modules
|
|||
F_Code.CmdTx,
|
||||
new byte[]
|
||||
{
|
||||
(byte)S_Code.sBMB,
|
||||
(byte)ID_Num,
|
||||
(byte)CanMessagePosicaoDados.Command1,
|
||||
(byte)(ComandoAtuar ? Estado.Ligado : Estado.Desligado),
|
||||
(byte)(Variaveis.OperacaoEmAndamento.Controle.PressaoLinha)
|
||||
}
|
||||
|
|
@ -1181,172 +1186,216 @@ namespace AgroBase.Models.Modules
|
|||
return _value;
|
||||
}
|
||||
|
||||
private S_Code DetectarComponenteDoID_Num(int ID_Num)
|
||||
{
|
||||
if (ID_Num == Variaveis.ID_Num_sMOD) return S_Code.sMOD;
|
||||
|
||||
var Disp = Variaveis.OperacaoEmAndamento.DispAtu.Dados;
|
||||
var sensor = Disp.Sensores.FirstOrDefault(x => x.ID_Num == ID_Num);
|
||||
var bico = Disp.BicosPulverizadores.FirstOrDefault(x => x.ID_Num == ID_Num);
|
||||
var bomba = Disp.BombasPressurizadoras.FirstOrDefault(x => x.ID_Num == ID_Num);
|
||||
|
||||
return sensor?.Componente ?? bico?.Componente ?? bomba?.Componente ?? S_Code.sVZO;
|
||||
}
|
||||
|
||||
private void DefinirOuCriar(int CompID_Num, S_Code componente, bool Iniciado, List<dynamic> Parametros)
|
||||
{
|
||||
var Disp = Variaveis.OperacaoEmAndamento.DispAtu;
|
||||
var item = Disp.Dados.DadosLeitura;
|
||||
|
||||
switch (componente)
|
||||
{
|
||||
case S_Code.sFLX:
|
||||
{
|
||||
var sensor = Disp.Dados.Sensores.FirstOrDefault(x => x.ID_Num == CompID_Num);
|
||||
var _sensor = item.SensoresFluxo.FirstOrDefault(x => x.ID == sensor.ID);
|
||||
if (_sensor == null)
|
||||
{
|
||||
_sensor = new FirmwareSensorFluxo()
|
||||
{
|
||||
ID = sensor.ID,
|
||||
Iniciado = Iniciado,
|
||||
Vazao = -1,
|
||||
};
|
||||
item.SensoresFluxo.Add(_sensor);
|
||||
}
|
||||
if (_sensor != null)
|
||||
{
|
||||
_sensor.Iniciado = Iniciado;
|
||||
_sensor.Vazao = Parametros.Count > 0 ? Parametros[0] : -1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case S_Code.sPRS:
|
||||
{
|
||||
var sensor = Disp.Dados.Sensores.FirstOrDefault(x => x.ID_Num == CompID_Num);
|
||||
var _sensor = item.SensoresPressao.FirstOrDefault(x => x.ID == sensor.ID);
|
||||
if (_sensor == null)
|
||||
{
|
||||
_sensor = new FirmwareSensorPressao()
|
||||
{
|
||||
ID = sensor.ID,
|
||||
Iniciado = Iniciado,
|
||||
Pressao = -1,
|
||||
};
|
||||
item.SensoresPressao.Add(_sensor);
|
||||
}
|
||||
if (_sensor != null)
|
||||
{
|
||||
_sensor.Iniciado = Iniciado;
|
||||
_sensor.Pressao = Parametros.Count > 0 ? Parametros[0] : -1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case S_Code.sMAS:
|
||||
{
|
||||
var sensor = Disp.Dados.Sensores.FirstOrDefault(x => x.ID_Num == CompID_Num);
|
||||
var _sensor = item.SensoresMassa.FirstOrDefault(x => x.ID == sensor.ID);
|
||||
if (_sensor == null)
|
||||
{
|
||||
_sensor = new FirmwareSensorMassa()
|
||||
{
|
||||
ID = sensor.ID,
|
||||
Iniciado = Iniciado,
|
||||
Massa = -1,
|
||||
};
|
||||
item.SensoresMassa.Add(_sensor);
|
||||
}
|
||||
if (_sensor != null)
|
||||
{
|
||||
_sensor.Iniciado = Iniciado;
|
||||
_sensor.Massa = Parametros.Count > 0 ? Parametros[0] : -1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case S_Code.sBIC:
|
||||
{
|
||||
var sensor = Disp.Dados.BicosPulverizadores.FirstOrDefault(x => x.ID_Num == CompID_Num);
|
||||
var _sensor = item.BicosPulverizadores.FirstOrDefault(x => x.ID == sensor.ID);
|
||||
if (_sensor == null)
|
||||
{
|
||||
_sensor = new FirmwareRele()
|
||||
{
|
||||
ID = sensor.ID,
|
||||
Iniciado = Iniciado,
|
||||
Leitura = Estado.Desligado,
|
||||
};
|
||||
item.BicosPulverizadores.Add(_sensor);
|
||||
}
|
||||
if (_sensor != null)
|
||||
{
|
||||
_sensor.Iniciado = Iniciado;
|
||||
_sensor.Leitura = Parametros.Count > 0 ? Parametros[0] : Estado.Desligado;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case S_Code.sBMB:
|
||||
{
|
||||
var sensor = Disp.Dados.BombasPressurizadoras.FirstOrDefault(x => x.ID_Num == CompID_Num);
|
||||
var _sensor = item.BombasPressurizadoras.FirstOrDefault(x => x.ID == sensor.ID);
|
||||
if (_sensor == null)
|
||||
{
|
||||
_sensor = new FirmwareBombaPressurizadora()
|
||||
{
|
||||
ID = sensor.ID,
|
||||
Iniciado = Iniciado,
|
||||
Estado = Estado.Desligado,
|
||||
Potencia = -1,
|
||||
Pressao = -1,
|
||||
PressaoSP = -1,
|
||||
};
|
||||
item.BombasPressurizadoras.Add(_sensor);
|
||||
}
|
||||
if (_sensor != null)
|
||||
{
|
||||
_sensor.Iniciado = Iniciado;
|
||||
_sensor.Estado = Parametros.Count > 0 ? Parametros[0] : Estado.Desligado;
|
||||
_sensor.Potencia = Parametros.Count > 1 ? Parametros[1] : -1;
|
||||
_sensor.PressaoSP = Parametros.Count > 2 ? Parametros[2] : -1;
|
||||
_sensor.Pressao = Parametros.Count > 3 ? Parametros[3] : -1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void ProcessarMensagem(CanMessage mensagem)
|
||||
{
|
||||
F_Code func = (F_Code)mensagem.DataRx[0];
|
||||
byte ID_Num = mensagem.DataRx[0];
|
||||
CanMessagePosicaoDados posicao = (CanMessagePosicaoDados)mensagem.DataRx[1];
|
||||
byte id = mensagem.Id;
|
||||
var data = mensagem.DataRx;
|
||||
|
||||
var item = Variaveis.OperacaoEmAndamento.DispAtu.Dados.DadosLeitura;
|
||||
|
||||
switch (func)
|
||||
S_Code componente = DetectarComponenteDoID_Num(ID_Num);
|
||||
|
||||
Console.WriteLine($"[ATU] Componente={componente.ToString()}, ID_Num={ID_Num}, Data={FuncoesGlobais.ConverterComandoBytesParaTexto(data)}");
|
||||
|
||||
switch (posicao)
|
||||
{
|
||||
case F_Code.ChkRx:
|
||||
if (data != null && data.Length >= 4)
|
||||
case CanMessagePosicaoDados.Status:
|
||||
{
|
||||
T_Code tipoModulo = (T_Code)data[1];
|
||||
bool conectado = data[2] == 1;
|
||||
int versao = data[3];
|
||||
if (componente == S_Code.sMOD)
|
||||
{
|
||||
T_Code tipoModulo = (T_Code)data[2];
|
||||
bool conectado = data[3] == 1;
|
||||
int versao = data[4];
|
||||
|
||||
Console.WriteLine($"[ATU] Resposta CHK recebida. Tipo={tipoModulo}, Conectado={conectado}, Versão={versao}");
|
||||
Console.WriteLine($"[ATU] Resposta {ID_Num} recebida. Tipo={tipoModulo}, Conectado={conectado}, Versão={versao}");
|
||||
|
||||
item.Conectado = conectado;
|
||||
item.Dispositivo = tipoModulo;
|
||||
item.Versao = versao;
|
||||
item.Conectado = conectado;
|
||||
item.Dispositivo = tipoModulo;
|
||||
item.Versao = versao;
|
||||
}
|
||||
else
|
||||
{
|
||||
bool Iniciado = data[2] == 1;
|
||||
DefinirOuCriar(ID_Num, componente, Iniciado, new List<dynamic>());
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
case CanMessagePosicaoDados.Dados1:
|
||||
{
|
||||
S_Code componente = (S_Code)data[0];
|
||||
int CompID_Num = data[1];
|
||||
bool Iniciado = data[2] == 1;
|
||||
|
||||
//Console.WriteLine($"[ATU] Componente={componente.ToString()}, ID_Num={CompID_Num}, Iniciado={Iniciado}, Data={FuncoesGlobais.ConverterComandoBytesParaTexto(data)}");
|
||||
|
||||
switch (componente)
|
||||
{
|
||||
case S_Code.sBIC:
|
||||
{
|
||||
var bico = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BicosPulverizadores.FirstOrDefault(x => x.ID_Num == CompID_Num);
|
||||
var _bico = item.BicosPulverizadores.FirstOrDefault(x => x.ID == bico.ID);
|
||||
if (_bico == null)
|
||||
{
|
||||
_bico = new FirmwareRele()
|
||||
{
|
||||
ID = bico.ID,
|
||||
Iniciado = Iniciado,
|
||||
Leitura = Estado.Desligado
|
||||
};
|
||||
item.BicosPulverizadores.Add(_bico);
|
||||
}
|
||||
|
||||
Estado estado = (Estado)data[3];
|
||||
|
||||
if (_bico != null)
|
||||
{
|
||||
_bico.Iniciado = Iniciado;
|
||||
_bico.Leitura = estado;
|
||||
}
|
||||
Estado estado = (Estado)data[2];
|
||||
DefinirOuCriar(ID_Num, componente, true, new List<dynamic>() { estado });
|
||||
break;
|
||||
}
|
||||
case S_Code.sFLX:
|
||||
{
|
||||
var sensor = Variaveis.OperacaoEmAndamento.DispAtu.Dados.Sensores.FirstOrDefault(x => x.ID_Num == CompID_Num);
|
||||
var _sensor = item.SensoresFluxo.FirstOrDefault(x => x.ID == sensor.ID);
|
||||
if (_sensor == null)
|
||||
{
|
||||
_sensor = new FirmwareSensorFluxo()
|
||||
{
|
||||
ID = sensor.ID,
|
||||
Iniciado = Iniciado,
|
||||
Vazao = -1,
|
||||
};
|
||||
item.SensoresFluxo.Add(_sensor);
|
||||
}
|
||||
double vazao = ConverterByteParaDouble(data, 3);
|
||||
|
||||
if (_sensor != null)
|
||||
{
|
||||
_sensor.Iniciado = Iniciado;
|
||||
_sensor.Vazao = vazao;
|
||||
}
|
||||
double vazao = ConverterByteParaDouble(data, 2);
|
||||
DefinirOuCriar(ID_Num, componente, true, new List<dynamic>() { vazao });
|
||||
break;
|
||||
}
|
||||
case S_Code.sMAS:
|
||||
{
|
||||
var sensor = Variaveis.OperacaoEmAndamento.DispAtu.Dados.Sensores.FirstOrDefault(x => x.ID_Num == CompID_Num);
|
||||
var _sensor = item.SensoresMassa.FirstOrDefault(x => x.ID == sensor.ID);
|
||||
if (_sensor == null)
|
||||
{
|
||||
_sensor = new FirmwareSensorMassa()
|
||||
{
|
||||
ID = sensor.ID,
|
||||
Iniciado = Iniciado,
|
||||
Massa = -1,
|
||||
};
|
||||
item.SensoresMassa.Add(_sensor);
|
||||
}
|
||||
double massa = ConverterByteParaDouble(data, 3);
|
||||
|
||||
if (_sensor != null)
|
||||
{
|
||||
_sensor.Iniciado = Iniciado;
|
||||
_sensor.Massa = massa;
|
||||
}
|
||||
double massa = ConverterByteParaDouble(data, 2);
|
||||
DefinirOuCriar(ID_Num, componente, true, new List<dynamic>() { massa });
|
||||
break;
|
||||
}
|
||||
case S_Code.sPRS:
|
||||
{
|
||||
var sensor = Variaveis.OperacaoEmAndamento.DispAtu.Dados.Sensores.FirstOrDefault(x => x.ID_Num == CompID_Num);
|
||||
var _sensor = item.SensoresPressao.FirstOrDefault(x => x.ID == sensor.ID);
|
||||
if (_sensor == null)
|
||||
{
|
||||
_sensor = new FirmwareSensorPressao()
|
||||
{
|
||||
ID = sensor.ID,
|
||||
Iniciado = Iniciado,
|
||||
Pressao = -1,
|
||||
};
|
||||
item.SensoresPressao.Add(_sensor);
|
||||
}
|
||||
double pressao = ConverterByteParaDouble(data, 3);
|
||||
|
||||
if (_sensor != null)
|
||||
{
|
||||
_sensor.Iniciado = Iniciado;
|
||||
_sensor.Pressao = pressao;
|
||||
}
|
||||
double pressao = ConverterByteParaDouble(data, 2);
|
||||
DefinirOuCriar(ID_Num, componente, true, new List<dynamic>() { pressao });
|
||||
break;
|
||||
}
|
||||
case S_Code.sBMB:
|
||||
{
|
||||
var bomba = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombasPressurizadoras.FirstOrDefault(x => x.ID_Num == CompID_Num);
|
||||
var _bomba = item.BombasPressurizadoras.FirstOrDefault(x => x.ID == bomba.ID);
|
||||
if (_bomba == null)
|
||||
{
|
||||
_bomba = new FirmwareBombaPressurizadora()
|
||||
{
|
||||
ID = bomba.ID,
|
||||
Iniciado = Iniciado,
|
||||
Estado = Estado.Desligado,
|
||||
Potencia = 0,
|
||||
Pressao = -1,
|
||||
PressaoSP = -1,
|
||||
};
|
||||
item.BombasPressurizadoras.Add(_bomba);
|
||||
}
|
||||
|
||||
Estado estado = (Estado)data[3];
|
||||
int percentualPotencia = data[4];
|
||||
int pressaoSp = data[5];
|
||||
int pressaoAtual = data[6];
|
||||
|
||||
if (_bomba != null)
|
||||
{
|
||||
_bomba.Iniciado = Iniciado;
|
||||
_bomba.Estado = estado;
|
||||
_bomba.Potencia = percentualPotencia;
|
||||
_bomba.PressaoSP = pressaoSp;
|
||||
_bomba.Pressao = pressaoAtual;
|
||||
}
|
||||
Estado estado = (Estado)data[2];
|
||||
int percentualPotencia = data[3];
|
||||
int pressaoSp = data[4];
|
||||
int pressaoAtual = data[5];
|
||||
DefinirOuCriar(ID_Num, componente, true, new List<dynamic>() { estado, percentualPotencia, pressaoSp, pressaoAtual });
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
default:
|
||||
{
|
||||
Console.WriteLine($"[ATU] Resposta {func.ToString()} recebida. Parametros nao mapeados: {FuncoesGlobais.ConverterComandoBytesParaTexto(data)}");
|
||||
Console.WriteLine($"[ATU] Resposta do {ID_Num} recebida. Parametros nao mapeados: {FuncoesGlobais.ConverterComandoBytesParaTexto(data)}");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -261,9 +261,9 @@ namespace AgroBase.Models.Modules
|
|||
new SensorParametroModel()
|
||||
{
|
||||
Descricao = "Corrente Máx",
|
||||
Valor = ((int)INA219Corrente.C_3_2).ToString(),
|
||||
Valor = (3.2).ToString(),
|
||||
QtdBytes = 1,
|
||||
Escalar = false,
|
||||
Escalar = true,
|
||||
Enviar = true
|
||||
},
|
||||
}
|
||||
|
|
@ -293,7 +293,7 @@ namespace AgroBase.Models.Modules
|
|||
new SensorParametroModel()
|
||||
{
|
||||
Descricao = "Corrente Máx",
|
||||
Valor = ((int)INA219Corrente.C_3_2).ToString(),
|
||||
Valor = (3.2).ToString(),
|
||||
QtdBytes = 1,
|
||||
Escalar = false,
|
||||
Enviar = true
|
||||
|
|
@ -325,7 +325,7 @@ namespace AgroBase.Models.Modules
|
|||
new SensorParametroModel()
|
||||
{
|
||||
Descricao = "Corrente Máx",
|
||||
Valor = ((int)INA219Corrente.C_50).ToString(),
|
||||
Valor = (50).ToString(),
|
||||
QtdBytes = 1,
|
||||
Escalar = false,
|
||||
Enviar = true
|
||||
|
|
@ -357,7 +357,7 @@ namespace AgroBase.Models.Modules
|
|||
new SensorParametroModel()
|
||||
{
|
||||
Descricao = "Corrente Máx",
|
||||
Valor = ((int)INA219Corrente.C_100).ToString(),
|
||||
Valor = (100).ToString(),
|
||||
QtdBytes = 1,
|
||||
Escalar = false,
|
||||
Enviar = true
|
||||
|
|
@ -628,7 +628,7 @@ namespace AgroBase.Models.Modules
|
|||
{
|
||||
// Adicionar configuração do ProtocoloMOD
|
||||
var protocoloMOD = ModConfig(Conectar);
|
||||
config.Add(protocoloMOD);
|
||||
config.AddRange(protocoloMOD);
|
||||
}
|
||||
|
||||
// Adicionar configurações dos Sinaleiros
|
||||
|
|
@ -650,20 +650,28 @@ namespace AgroBase.Models.Modules
|
|||
return config;
|
||||
}
|
||||
|
||||
private byte[] ModConfig(bool Conectar)
|
||||
private List<byte[]> ModConfig(bool Conectar)
|
||||
{
|
||||
var pinos = PinoutModel.PinoProtocolo(Pinout, Funcoes, false);
|
||||
|
||||
var config = new List<byte>
|
||||
var config1 = new List<byte>
|
||||
{
|
||||
Variaveis.ID_Num_sMOD,
|
||||
(byte)CanMessagePosicaoDados.Config1,
|
||||
(byte)S_Code.sMOD,
|
||||
(byte)(Conectar ? 1 : 0),
|
||||
(byte)(_TaxaAmostragem / 10),
|
||||
(byte)(RequisitarDados ? 1 : 0),
|
||||
};
|
||||
config.AddRange(pinos);
|
||||
var config2 = new List<byte>
|
||||
{
|
||||
Variaveis.ID_Num_sMOD,
|
||||
(byte)CanMessagePosicaoDados.Config2,
|
||||
(byte)S_Code.sMOD,
|
||||
};
|
||||
config2.AddRange(pinos);
|
||||
|
||||
return config.ToArray();
|
||||
return new List<byte[]> { config1.ToArray(), config2.ToArray() };
|
||||
}
|
||||
|
||||
public List<byte[]> SensoresConfig(bool Conectar)
|
||||
|
|
@ -979,8 +987,9 @@ namespace AgroBase.Models.Modules
|
|||
{
|
||||
List<byte> config = new List<byte>
|
||||
{
|
||||
(byte)Componente,
|
||||
(byte)ID_Num,
|
||||
(byte)CanMessagePosicaoDados.Config1,
|
||||
(byte)Componente,
|
||||
(byte)(conectar ? 1 : 0),
|
||||
};
|
||||
|
||||
|
|
@ -1070,8 +1079,9 @@ namespace AgroBase.Models.Modules
|
|||
var pino = pinout.Pinos.FirstOrDefault(p => p.ComponenteID == ID);
|
||||
List<byte> config = new List<byte>
|
||||
{
|
||||
(byte)Componente,
|
||||
(byte)ID_Num,
|
||||
(byte)CanMessagePosicaoDados.Config1,
|
||||
(byte)Componente,
|
||||
(byte)(conectar ? 1 : 0),
|
||||
(byte)(pino?.Barramento ?? TiposBarramentos.CONTROLADOR),
|
||||
(byte)(pino?.Pino ?? PinoutUtils.PINO_INVALIDO)
|
||||
|
|
@ -1084,8 +1094,8 @@ namespace AgroBase.Models.Modules
|
|||
{
|
||||
List<byte> frame = new List<byte>
|
||||
{
|
||||
(byte)Componente,
|
||||
(byte)ID_Num,
|
||||
(byte)CanMessagePosicaoDados.Command1,
|
||||
(byte)Comportamento.statusLED,
|
||||
(byte)Comportamento.QtdPiscadas,
|
||||
(byte)(Comportamento.TempoMs / 10),
|
||||
|
|
@ -1146,8 +1156,9 @@ namespace AgroBase.Models.Modules
|
|||
var pino = pinout.Pinos.FirstOrDefault(p => p.ComponenteID == ID);
|
||||
List<byte> config = new List<byte>
|
||||
{
|
||||
(byte)Componente,
|
||||
(byte)ID_Num,
|
||||
(byte)CanMessagePosicaoDados.Config1,
|
||||
(byte)Componente,
|
||||
(byte)(conectar ? 1 : 0),
|
||||
(byte)(AtuacaoNivelAlto ? 1 : 0),
|
||||
(byte)(pino?.Barramento ?? TiposBarramentos.CONTROLADOR),
|
||||
|
|
@ -1163,8 +1174,8 @@ namespace AgroBase.Models.Modules
|
|||
F_Code.CmdTx,
|
||||
new byte[]
|
||||
{
|
||||
(byte)Componente,
|
||||
(byte)ID_Num,
|
||||
(byte)CanMessagePosicaoDados.Command1,
|
||||
(byte)StatusControle
|
||||
}
|
||||
);
|
||||
|
|
@ -1224,8 +1235,9 @@ namespace AgroBase.Models.Modules
|
|||
|
||||
List<byte> config = new List<byte>
|
||||
{
|
||||
(byte)Componente,
|
||||
(byte)ID_Num,
|
||||
(byte)CanMessagePosicaoDados.Config1,
|
||||
(byte)Componente,
|
||||
(byte)(conectar ? 1 : 0),
|
||||
(byte)(incremental ? 1 : 0),
|
||||
(byte)(pino?.Barramento ?? TiposBarramentos.CONTROLADOR),
|
||||
|
|
@ -1241,8 +1253,8 @@ namespace AgroBase.Models.Modules
|
|||
F_Code.CmdTx,
|
||||
new byte[]
|
||||
{
|
||||
(byte)Componente,
|
||||
(byte)ID_Num,
|
||||
(byte)CanMessagePosicaoDados.Command1,
|
||||
(byte)_AnguloControle
|
||||
}
|
||||
);
|
||||
|
|
@ -1615,7 +1627,6 @@ namespace AgroBase.Models.Modules
|
|||
{
|
||||
public string ID { get; set; }
|
||||
public bool Iniciado { get; set; }
|
||||
public double Leitura { get; set; }
|
||||
public double Pressao { get; set; }
|
||||
}
|
||||
|
||||
|
|
@ -1725,171 +1736,222 @@ namespace AgroBase.Models.Modules
|
|||
return _value;
|
||||
}
|
||||
|
||||
private S_Code DetectarComponenteDoID_Num(int ID_Num)
|
||||
{
|
||||
if (ID_Num == Variaveis.ID_Num_sMOD) return S_Code.sMOD;
|
||||
|
||||
var Disp = Variaveis.OperacaoEmAndamento.DispSen.Dados;
|
||||
var sensor = Disp.Sensores.FirstOrDefault(x => x.ID_Num == ID_Num);
|
||||
var rele = Disp.Reles.FirstOrDefault(x => x.ID_Num == ID_Num);
|
||||
var sinaleiro = Disp.Sinaleiros.FirstOrDefault(x => x.ID_Num == ID_Num);
|
||||
var servo = Disp.Servos.FirstOrDefault(x => x.ID_Num == ID_Num);
|
||||
|
||||
return sensor?.Componente ?? rele?.Componente ?? sinaleiro?.Componente ?? servo?.Componente ?? S_Code.sVZO;
|
||||
}
|
||||
|
||||
private void DefinirOuCriar(int CompID_Num, S_Code componente, bool Iniciado, List<dynamic> Parametros)
|
||||
{
|
||||
var Disp = Variaveis.OperacaoEmAndamento.DispSen;
|
||||
var item = Disp.Dados.DadosLeitura;
|
||||
|
||||
switch (componente)
|
||||
{
|
||||
case S_Code.sTMP:
|
||||
{
|
||||
var sensor = Disp.Dados.Sensores.FirstOrDefault(x => x.ID_Num == CompID_Num);
|
||||
var _sensor = item.SensoresTemperatura.FirstOrDefault(x => x.ID == sensor.ID);
|
||||
if (_sensor == null)
|
||||
{
|
||||
_sensor = new FirmwareSensorTemperatura()
|
||||
{
|
||||
ID = sensor.ID,
|
||||
Iniciado = Iniciado,
|
||||
Temperatura = -1,
|
||||
};
|
||||
item.SensoresTemperatura.Add(_sensor);
|
||||
}
|
||||
if (_sensor != null)
|
||||
{
|
||||
_sensor.Iniciado = Iniciado;
|
||||
_sensor.Temperatura = Parametros.Count > 0 ? Parametros[0] : -1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case S_Code.sCOR:
|
||||
{
|
||||
var sensor = Disp.Dados.Sensores.FirstOrDefault(x => x.ID_Num == CompID_Num);
|
||||
var _sensor = item.SensoresCorrente.FirstOrDefault(x => x.ID == sensor.ID);
|
||||
if (_sensor == null)
|
||||
{
|
||||
_sensor = new FirmwareSensorCorrente()
|
||||
{
|
||||
ID = sensor.ID,
|
||||
Iniciado = Iniciado,
|
||||
BusVoltage = -1,
|
||||
Current = -1,
|
||||
Power = -1,
|
||||
ShuntVoltage = -1,
|
||||
};
|
||||
item.SensoresCorrente.Add(_sensor);
|
||||
}
|
||||
if (_sensor != null)
|
||||
{
|
||||
_sensor.Iniciado = Iniciado;
|
||||
_sensor.BusVoltage = Parametros.Count > 0 ? Parametros[0] : -1;
|
||||
_sensor.Current = Parametros.Count > 1 ? Parametros[1] : -1;
|
||||
_sensor.Power = Parametros.Count > 2 ? Parametros[2] : -1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case S_Code.sLED:
|
||||
{
|
||||
var sensor = Disp.Dados.Sinaleiros.FirstOrDefault(x => x.ID_Num == CompID_Num);
|
||||
var _sensor = item.Sinaleiros.FirstOrDefault(x => x.ID == sensor.ID);
|
||||
if (_sensor == null)
|
||||
{
|
||||
_sensor = new FirmwareSinaleiro()
|
||||
{
|
||||
ID = sensor.ID,
|
||||
Iniciado = Iniciado,
|
||||
Comando = StatusLED.Apagado,
|
||||
Leitura = StatusLED.Apagado,
|
||||
};
|
||||
item.Sinaleiros.Add(_sensor);
|
||||
}
|
||||
if (_sensor != null)
|
||||
{
|
||||
_sensor.Iniciado = Iniciado;
|
||||
_sensor.Leitura = Parametros.Count > 0 ? Parametros[0] : StatusLED.Apagado;
|
||||
_sensor.Comando = Parametros.Count > 1 ? Parametros[1] : StatusLED.Apagado;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case S_Code.sRLE:
|
||||
{
|
||||
var sensor = Disp.Dados.Reles.FirstOrDefault(x => x.ID_Num == CompID_Num);
|
||||
var _sensor = item.Reles.FirstOrDefault(x => x.ID == sensor.ID);
|
||||
if (_sensor == null)
|
||||
{
|
||||
_sensor = new FirmwareRele()
|
||||
{
|
||||
ID = sensor.ID,
|
||||
Iniciado = Iniciado,
|
||||
Leitura = Estado.Desligado,
|
||||
};
|
||||
item.Reles.Add(_sensor);
|
||||
}
|
||||
if (_sensor != null)
|
||||
{
|
||||
_sensor.Iniciado = Iniciado;
|
||||
_sensor.Leitura = Parametros.Count > 0 ? Parametros[0] : Estado.Desligado;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case S_Code.sFRO:
|
||||
{
|
||||
var sensor = Disp.Dados.Servos.FirstOrDefault(x => x.ID_Num == CompID_Num);
|
||||
var _sensor = item.ServoFreios.FirstOrDefault(x => x.ID == sensor.ID);
|
||||
if (_sensor == null)
|
||||
{
|
||||
_sensor = new FirmwareServoFreio()
|
||||
{
|
||||
ID = sensor.ID,
|
||||
Iniciado = Iniciado,
|
||||
Angulo = -1,
|
||||
};
|
||||
item.ServoFreios.Add(_sensor);
|
||||
}
|
||||
if (_sensor != null)
|
||||
{
|
||||
_sensor.Iniciado = Iniciado;
|
||||
_sensor.Angulo = Parametros.Count > 0 ? Parametros[0] : -1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void ProcessarMensagem(CanMessage mensagem)
|
||||
{
|
||||
F_Code func = (F_Code)mensagem.DataRx[0];
|
||||
byte ID_Num = mensagem.DataRx[0];
|
||||
CanMessagePosicaoDados posicao = (CanMessagePosicaoDados)mensagem.DataRx[1];
|
||||
byte id = mensagem.Id;
|
||||
var data = mensagem.DataRx;
|
||||
|
||||
var item = Variaveis.OperacaoEmAndamento.DispSen.Dados.DadosLeitura;
|
||||
|
||||
switch (func)
|
||||
S_Code componente = DetectarComponenteDoID_Num(ID_Num);
|
||||
|
||||
//Console.WriteLine($"[SEN] Componente={componente.ToString()}, ID_Num={CompID_Num}, Data={FuncoesGlobais.ConverterComandoBytesParaTexto(data)}");
|
||||
|
||||
switch (posicao)
|
||||
{
|
||||
case F_Code.ChkRx:
|
||||
if (data != null && data.Length >= 4)
|
||||
case CanMessagePosicaoDados.Status:
|
||||
{
|
||||
T_Code tipoModulo = (T_Code)data[1];
|
||||
bool conectado = data[2] == 1;
|
||||
int versao = data[3];
|
||||
if (componente == S_Code.sMOD)
|
||||
{
|
||||
T_Code tipoModulo = (T_Code)data[2];
|
||||
bool conectado = data[3] == 1;
|
||||
int versao = data[4];
|
||||
|
||||
Console.WriteLine($"[SEN] Resposta {func.ToString()} recebida. Tipo={tipoModulo}, Conectado={conectado}, Versão={versao}");
|
||||
Console.WriteLine($"[SEN] Resposta {ID_Num} recebida. Tipo={tipoModulo}, Conectado={conectado}, Versão={versao}");
|
||||
|
||||
item.Conectado = conectado;
|
||||
item.Dispositivo = tipoModulo;
|
||||
item.Versao = versao;
|
||||
item.Conectado = conectado;
|
||||
item.Dispositivo = tipoModulo;
|
||||
item.Versao = versao;
|
||||
}
|
||||
else
|
||||
{
|
||||
bool Iniciado = data[2] == 1;
|
||||
DefinirOuCriar(ID_Num, componente, Iniciado, new List<dynamic>());
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
case CanMessagePosicaoDados.Dados1:
|
||||
{
|
||||
S_Code componente = (S_Code)data[0];
|
||||
int CompID_Num = data[1];
|
||||
bool Iniciado = data[2] == 1;
|
||||
|
||||
//Console.WriteLine($"[SEN] Componente={componente.ToString()}, ID_Num={CompID_Num}, Iniciado={Iniciado}");
|
||||
|
||||
switch (componente)
|
||||
{
|
||||
case S_Code.sTMP:
|
||||
{
|
||||
var sensor = Variaveis.OperacaoEmAndamento.DispSen.Dados.Sensores.FirstOrDefault(x => x.ID_Num == CompID_Num);
|
||||
var _sensor = item.SensoresTemperatura.FirstOrDefault(x => x.ID == sensor.ID);
|
||||
if (_sensor == null)
|
||||
{
|
||||
_sensor = new FirmwareSensorTemperatura()
|
||||
{
|
||||
ID = sensor.ID,
|
||||
Iniciado = Iniciado,
|
||||
Temperatura = -1,
|
||||
};
|
||||
item.SensoresTemperatura.Add(_sensor);
|
||||
}
|
||||
double temperatura = ConverterByteParaDouble(data, 3);
|
||||
|
||||
if (_sensor != null)
|
||||
{
|
||||
_sensor.Temperatura = temperatura;
|
||||
}
|
||||
double temperatura = ConverterByteParaDouble(data, 2);
|
||||
DefinirOuCriar(ID_Num, componente, true, new List<dynamic>() { temperatura });
|
||||
break;
|
||||
}
|
||||
case S_Code.sCOR:
|
||||
{
|
||||
var sensor = Variaveis.OperacaoEmAndamento.DispSen.Dados.Sensores.FirstOrDefault(x => x.ID_Num == CompID_Num);
|
||||
var _sensor = item.SensoresCorrente.FirstOrDefault(x => x.ID == sensor.ID);
|
||||
if (_sensor == null)
|
||||
{
|
||||
_sensor = new FirmwareSensorCorrente()
|
||||
{
|
||||
ID = sensor.ID,
|
||||
Iniciado = Iniciado,
|
||||
BusVoltage = -1,
|
||||
Current = -1,
|
||||
Power = -1,
|
||||
ShuntVoltage = -1,
|
||||
};
|
||||
item.SensoresCorrente.Add(_sensor);
|
||||
}
|
||||
|
||||
double busVoltage = ConverterByteParaDouble(data, 3);
|
||||
double current = ConverterByteParaDouble(data, 5);
|
||||
//double power = ConverterByteParaDouble(data, 7);
|
||||
|
||||
if (_sensor != null)
|
||||
{
|
||||
_sensor.BusVoltage = busVoltage;
|
||||
_sensor.Current = current;
|
||||
}
|
||||
double busVoltage = ConverterByteParaDouble(data, 2);
|
||||
double current = ConverterByteParaDouble(data, 4);
|
||||
double power = ConverterByteParaDouble(data, 6);
|
||||
DefinirOuCriar(ID_Num, componente, true, new List<dynamic>() { busVoltage, current, power });
|
||||
break;
|
||||
}
|
||||
case S_Code.sLED:
|
||||
{
|
||||
var sinaleiro = Variaveis.OperacaoEmAndamento.DispSen.Dados.Sinaleiros.FirstOrDefault(x => x.ID_Num == CompID_Num);
|
||||
var _sensor = item.Sinaleiros.FirstOrDefault(x => x.ID == sinaleiro.ID);
|
||||
if (_sensor == null)
|
||||
{
|
||||
_sensor = new FirmwareSinaleiro()
|
||||
{
|
||||
ID = sinaleiro.ID,
|
||||
Iniciado = Iniciado,
|
||||
Leitura = StatusLED.Apagado,
|
||||
Comando = StatusLED.Apagado
|
||||
};
|
||||
item.Sinaleiros.Add(_sensor);
|
||||
}
|
||||
|
||||
StatusLED statusLeitura = (StatusLED)data[3];
|
||||
StatusLED status = (StatusLED)data[4];
|
||||
|
||||
if (_sensor != null)
|
||||
{
|
||||
_sensor.Leitura = statusLeitura;
|
||||
_sensor.Comando = status;
|
||||
}
|
||||
StatusLED statusLeitura = (StatusLED)data[2];
|
||||
StatusLED statusComando = (StatusLED)data[3];
|
||||
DefinirOuCriar(ID_Num, componente, true, new List<dynamic>() { statusLeitura, statusComando });
|
||||
break;
|
||||
}
|
||||
case S_Code.sRLE:
|
||||
{
|
||||
var rele = Variaveis.OperacaoEmAndamento.DispSen.Dados.Reles.FirstOrDefault(x => x.ID_Num == CompID_Num);
|
||||
var _sensor = item.Reles.FirstOrDefault(x => x.ID == rele.ID);
|
||||
if (_sensor == null)
|
||||
{
|
||||
_sensor = new FirmwareRele()
|
||||
{
|
||||
ID = rele.ID,
|
||||
Iniciado = Iniciado,
|
||||
Leitura = Estado.Desligado
|
||||
};
|
||||
item.Reles.Add(_sensor);
|
||||
}
|
||||
|
||||
Estado estado = (Estado)data[3];
|
||||
|
||||
if (_sensor != null)
|
||||
{
|
||||
_sensor.Leitura = estado;
|
||||
}
|
||||
Estado estado = (Estado)data[2];
|
||||
DefinirOuCriar(ID_Num, componente, true, new List<dynamic>() { estado });
|
||||
break;
|
||||
}
|
||||
case S_Code.sFRO:
|
||||
{
|
||||
var servo = Variaveis.OperacaoEmAndamento.DispSen.Dados.Servos.FirstOrDefault(x => x.ID_Num == CompID_Num);
|
||||
var _sensor = item.ServoFreios.FirstOrDefault(x => x.ID == servo.ID);
|
||||
if (_sensor == null)
|
||||
{
|
||||
_sensor = new FirmwareServoFreio()
|
||||
{
|
||||
ID = servo.ID,
|
||||
Iniciado = Iniciado,
|
||||
Angulo = -1,
|
||||
};
|
||||
item.ServoFreios.Add(_sensor);
|
||||
}
|
||||
|
||||
int angulo = data[3];
|
||||
|
||||
if (_sensor != null)
|
||||
{
|
||||
_sensor.Angulo = angulo;
|
||||
}
|
||||
int angulo = data[2];
|
||||
DefinirOuCriar(ID_Num, componente, true, new List<dynamic>() { angulo });
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
Console.WriteLine($"[SEN] Resposta {func.ToString()} recebida. Parametros nao mapeados: {FuncoesGlobais.ConverterComandoBytesParaTexto(data)}");
|
||||
break;
|
||||
}
|
||||
{
|
||||
Console.WriteLine($"[SEN] Resposta de {ID_Num} recebida. Parametros nao mapeados: {FuncoesGlobais.ConverterComandoBytesParaTexto(data)}");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -67,6 +67,8 @@ namespace AgroBase.Models
|
|||
return CaminhoSistema.Contains("AgroMonitor");
|
||||
}
|
||||
}
|
||||
|
||||
public static byte ID_Num_sMOD { get; } = 0x00;
|
||||
}
|
||||
|
||||
public static class VariaveisPortas
|
||||
|
|
|
|||
|
|
@ -27,6 +27,26 @@ namespace AgroBase.Services
|
|||
public DateTime RespondidoEm { get; set; }
|
||||
}
|
||||
|
||||
public enum CanMessagePosicaoDados
|
||||
{
|
||||
Status = 0,
|
||||
Dados1 = 1,
|
||||
Dados2 = 2,
|
||||
Dados3 = 3,
|
||||
Dados4 = 4,
|
||||
Dados5 = 5,
|
||||
Config1 = 51,
|
||||
Config2 = 52,
|
||||
Config3 = 53,
|
||||
Config4 = 54,
|
||||
Config5 = 55,
|
||||
Command1 = 101,
|
||||
Command2 = 102,
|
||||
Command3 = 103,
|
||||
Command4 = 104,
|
||||
Command5 = 105,
|
||||
}
|
||||
|
||||
public interface ICanMessageHandler
|
||||
{
|
||||
void ProcessarMensagem(CanMessage mensagem);
|
||||
|
|
@ -146,19 +166,12 @@ namespace AgroBase.Services
|
|||
data[i] = Convert.ToByte(frame.Substring(5 + i * 2, 2), 16);
|
||||
}
|
||||
|
||||
byte funcCode = data[0];
|
||||
byte funcCodeRx = data[0];
|
||||
var mensagem = new CanMessage();
|
||||
|
||||
List<CanMessage> mensagensPorID = new List<CanMessage>();
|
||||
lock (Mensagens)
|
||||
{
|
||||
mensagensPorID = Mensagens.Where(x => x.Id == id).ToList();
|
||||
}
|
||||
|
||||
mensagem = mensagensPorID.OrderBy(x => x.EnviadoEm).FirstOrDefault(x => x.Id == id && x.funcCodeRx == funcCode && x.Enviado && !x.Respondido);
|
||||
if (mensagem == null)
|
||||
{
|
||||
mensagem = mensagensPorID.OrderBy(x => x.EnviadoEm).FirstOrDefault(x => x.Id == id && x.Enviado && !x.Respondido);
|
||||
mensagem = Mensagens.Where(x => x.Id == id).OrderBy(x => x.EnviadoEm).FirstOrDefault(x => x.Enviado && !x.Respondido && x.funcCodeRx == funcCodeRx);
|
||||
}
|
||||
|
||||
if (mensagem == null)
|
||||
|
|
@ -176,7 +189,7 @@ namespace AgroBase.Services
|
|||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine($"[CAN] FuncCode não tratado: 0x{funcCode:X2}");
|
||||
Console.WriteLine($"[CAN] ID_Num não tratado: 0x{funcCodeRx:X2}");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
|
@ -185,25 +198,28 @@ namespace AgroBase.Services
|
|||
}
|
||||
}
|
||||
|
||||
public static void AdicionarMensagemNaFila(T_Code Dispositivo, byte id, byte funcCodeTx, byte funcCodeRx, byte[] payload = null, bool get = true)
|
||||
public static void AdicionarMensagemNaFila(T_Code Dispositivo, byte id, byte funcCode, byte[] payload = null, bool get = true, byte ID_Num = 0x00)
|
||||
{
|
||||
if (_PortaCAN?.IsOpen != true) return;
|
||||
|
||||
// Monta o payload com funcCode + dados + CRC
|
||||
var dados = new List<byte> { funcCodeTx };
|
||||
var dados = new List<byte> { funcCode };
|
||||
if (payload != null)
|
||||
dados.AddRange(payload);
|
||||
|
||||
byte crc = CalcularChecksum(id, dados.ToArray());
|
||||
dados.Add(crc);
|
||||
if (Dispositivo == T_Code.Mks)
|
||||
{
|
||||
byte crc = CalcularChecksum(id, dados.ToArray());
|
||||
dados.Add(crc);
|
||||
}
|
||||
|
||||
var novaMensagem = new CanMessage
|
||||
{
|
||||
Momento = DateTime.Now,
|
||||
Dispositivo = Dispositivo,
|
||||
funcCodeTx = funcCode,
|
||||
Id = id,
|
||||
funcCodeTx = funcCodeTx,
|
||||
funcCodeRx = funcCodeRx,
|
||||
funcCodeRx = ID_Num,
|
||||
DataTx = dados.ToArray(),
|
||||
ComResposta = get
|
||||
};
|
||||
|
|
@ -215,7 +231,8 @@ namespace AgroBase.Services
|
|||
|
||||
var existente = Mensagens.FirstOrDefault(x =>
|
||||
x.Id == novaMensagem.Id &&
|
||||
x.funcCodeTx == novaMensagem.funcCodeTx &&
|
||||
x.funcCodeTx == novaMensagem.funcCodeTx &&
|
||||
x.funcCodeRx == novaMensagem.funcCodeRx &&
|
||||
x.ComResposta == novaMensagem.ComResposta &&
|
||||
x.DataTx.SequenceEqual(novaMensagem.DataTx) &&
|
||||
(!x.Enviado || (x.ComResposta && !x.Respondido)) // Está pendente
|
||||
|
|
@ -316,7 +333,7 @@ namespace AgroBase.Services
|
|||
{
|
||||
_PortaCAN.Write(comando);
|
||||
|
||||
//Console.WriteLine($"[CAN] Frame enviado: {comando}");
|
||||
Console.WriteLine($"[CAN] Frame enviado: {comando}");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -71,16 +71,11 @@ namespace AgroBase.Comum
|
|||
VariaveisOperacao.RegistrarLogDispositivo(Logs, Dispositivo, ".json", 100);
|
||||
}
|
||||
|
||||
public void AdicionarMensagemFila(F_Code funcao, byte[] dados = null, bool get = true, F_Code funcaoRx = F_Code.Nda)
|
||||
public void AdicionarMensagemFila(F_Code funcao, byte[] dados = null, bool get = true, byte ID_Num = 0x00)
|
||||
{
|
||||
if ((int)funcao % 2 == 1)
|
||||
{
|
||||
byte funcCodeRx = (byte)(((int)funcao) + 1);
|
||||
if (funcaoRx != F_Code.Nda)
|
||||
{
|
||||
funcCodeRx = (byte)funcaoRx;
|
||||
}
|
||||
CanService.AdicionarMensagemNaFila(Dispositivo, _EnderecoCAN, (byte)funcao, funcCodeRx, dados, get);
|
||||
CanService.AdicionarMensagemNaFila(Dispositivo, _EnderecoCAN, (byte)funcao, dados, get, ID_Num);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -405,12 +400,7 @@ namespace AgroBase.Comum
|
|||
var Config = Dados.ProtocoloConfiguracao(Conectar);
|
||||
foreach (var data in Config)
|
||||
{
|
||||
F_Code funcCodeRx = F_Code.Nda;
|
||||
if ((S_Code)data[0] == S_Code.sMOD)
|
||||
{
|
||||
funcCodeRx = F_Code.ChkRx;
|
||||
}
|
||||
AdicionarMensagemFila(F_Code.CfgTx, data, false, funcCodeRx);
|
||||
AdicionarMensagemFila(F_Code.CfgTx, data, false);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ namespace AgroBase.Services
|
|||
Control InstanciarDispositivo(int index);
|
||||
void AtualizaIndex(int index);
|
||||
void SalvarParametros(DispositivoBaseModel dados);
|
||||
void AdicionarMensagemFila(F_Code funcao, byte[] dados, bool get, F_Code funcaoRx);
|
||||
void AdicionarMensagemFila(F_Code funcao, byte[] dados, bool get, byte ID_Num);
|
||||
void EnviarProtocolosConfiguracao(bool Conectar = true);
|
||||
void CarregarParametrosModulos();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -40,12 +40,6 @@ namespace AgroBase.Services
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
public MKS057DCanService()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public static async Task<bool> VerificaPortaMKS(SerialPort porta)
|
||||
{
|
||||
if (!CanService.IsConnected)
|
||||
|
|
@ -157,7 +151,7 @@ namespace AgroBase.Services
|
|||
|
||||
private static void EnviarComando(T_Code Dispositivo, byte id, byte funcCode, byte[] payload = null, bool get = true)
|
||||
{
|
||||
CanService.AdicionarMensagemNaFila(Dispositivo, id, funcCode, funcCode, payload, get);
|
||||
CanService.AdicionarMensagemNaFila(Dispositivo, id, funcCode, payload, get, funcCode);
|
||||
}
|
||||
|
||||
public static void SetModoOperacao(byte id, byte modo)
|
||||
|
|
|
|||
|
|
@ -672,36 +672,47 @@ namespace AgroBase.Services
|
|||
AtualizarConsole("Dispositivo LRA encontrado");
|
||||
return true;
|
||||
}
|
||||
porta.Close();
|
||||
return false;
|
||||
}
|
||||
|
||||
private static async Task<bool> ProcurarDispositivoGPS(SerialPort Porta)
|
||||
{
|
||||
Porta.Open();
|
||||
await Task.Delay(100);
|
||||
AtualizarConsole($"{Porta.PortName} - Procurando dispositivo GPS");
|
||||
await Task.Delay(1000);
|
||||
|
||||
string Recebido = "";
|
||||
|
||||
if (string.IsNullOrEmpty(Recebido))
|
||||
try
|
||||
{
|
||||
//Recebido = Porta.ReadLine();
|
||||
byte[] buffer = LerDadosDaPortaSerial(Porta, 15);
|
||||
Recebido = Encoding.ASCII.GetString(buffer);
|
||||
}
|
||||
Porta.Open();
|
||||
await Task.Delay(100);
|
||||
AtualizarConsole($"{Porta.PortName} - Procurando dispositivo GPS");
|
||||
await Task.Delay(1000);
|
||||
|
||||
if (
|
||||
(Recebido.Contains("$GPTXT") || Recebido.Contains("$GPRMC") || Recebido.Contains("$GPGGA") || Recebido.Contains("$GPGLL")) ||
|
||||
(Recebido.Contains("$GNGGA") || Recebido.Contains("$GPVTG") || Recebido.Contains("$GPGSV") || Recebido.Contains("$GNTHS"))
|
||||
)
|
||||
string Recebido = "";
|
||||
|
||||
if (string.IsNullOrEmpty(Recebido))
|
||||
{
|
||||
//Recebido = Porta.ReadLine();
|
||||
byte[] buffer = LerDadosDaPortaSerial(Porta, 15);
|
||||
Recebido = Encoding.ASCII.GetString(buffer);
|
||||
}
|
||||
|
||||
if (
|
||||
(Recebido.Contains("$GPTXT") || Recebido.Contains("$GPRMC") || Recebido.Contains("$GPGGA") || Recebido.Contains("$GPGLL")) ||
|
||||
(Recebido.Contains("$GNGGA") || Recebido.Contains("$GPVTG") || Recebido.Contains("$GPGSV") || Recebido.Contains("$GNTHS"))
|
||||
)
|
||||
{
|
||||
GPSService.AtualizarPortaCOM(Porta);
|
||||
AtualizarConsole("Dispositivo GPS encontrado");
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
GPSService.AtualizarPortaCOM(Porta);
|
||||
AtualizarConsole("Dispositivo GPS encontrado");
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
finally
|
||||
{
|
||||
Porta.Close();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public static byte[] VerificarRespostaPortasDesconhecidas(SerialPort Porta)
|
||||
|
|
|
|||
Binary file not shown.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -25,7 +25,7 @@
|
|||
<meta name="viewport" content="width=device-width,
|
||||
initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
|
||||
<style>
|
||||
#map_3347a224b4ed0e03a73bf2bfbd634524 {
|
||||
#map_fc3c5e9d08f8e0552860db1a030344cd {
|
||||
position: relative;
|
||||
width: 100.0%;
|
||||
height: 100.0%;
|
||||
|
|
@ -39,14 +39,14 @@
|
|||
<body>
|
||||
|
||||
|
||||
<div class="folium-map" id="map_3347a224b4ed0e03a73bf2bfbd634524" ></div>
|
||||
<div class="folium-map" id="map_fc3c5e9d08f8e0552860db1a030344cd" ></div>
|
||||
|
||||
</body>
|
||||
<script>
|
||||
|
||||
|
||||
var map_3347a224b4ed0e03a73bf2bfbd634524 = L.map(
|
||||
"map_3347a224b4ed0e03a73bf2bfbd634524",
|
||||
var map_fc3c5e9d08f8e0552860db1a030344cd = L.map(
|
||||
"map_fc3c5e9d08f8e0552860db1a030344cd",
|
||||
{
|
||||
center: [0.0, 0.0],
|
||||
crs: L.CRS.EPSG3857,
|
||||
|
|
@ -60,13 +60,13 @@
|
|||
|
||||
|
||||
|
||||
var tile_layer_8a418b9c4d12515117f5026207c11e69 = L.tileLayer(
|
||||
var tile_layer_56b500d899d8e5984e4f9dd0156836f0 = L.tileLayer(
|
||||
"https://tile.openstreetmap.org/{z}/{x}/{y}.png",
|
||||
{"attribution": "\u0026copy; \u003ca href=\"https://www.openstreetmap.org/copyright\"\u003eOpenStreetMap\u003c/a\u003e contributors", "detectRetina": false, "maxNativeZoom": 19, "maxZoom": 19, "minZoom": 0, "noWrap": false, "opacity": 1, "subdomains": "abc", "tms": false}
|
||||
);
|
||||
|
||||
|
||||
tile_layer_8a418b9c4d12515117f5026207c11e69.addTo(map_3347a224b4ed0e03a73bf2bfbd634524);
|
||||
tile_layer_56b500d899d8e5984e4f9dd0156836f0.addTo(map_fc3c5e9d08f8e0552860db1a030344cd);
|
||||
|
||||
</script>
|
||||
|
||||
|
|
@ -87,7 +87,7 @@
|
|||
}
|
||||
trajeto_json_add({"features": []});
|
||||
|
||||
trajeto_json.addTo(map_3347a224b4ed0e03a73bf2bfbd634524);
|
||||
trajeto_json.addTo(map_fc3c5e9d08f8e0552860db1a030344cd);
|
||||
|
||||
function adicionarGeometria(novaGeometria) {
|
||||
trajeto_json.addData(novaGeometria);
|
||||
|
|
@ -145,7 +145,7 @@
|
|||
|
||||
var marcadorDinamico = L.marker([0, 0], {
|
||||
icon: customIcon
|
||||
}).addTo(map_3347a224b4ed0e03a73bf2bfbd634524);
|
||||
}).addTo(map_fc3c5e9d08f8e0552860db1a030344cd);
|
||||
|
||||
// Conectar ao broker MQTT
|
||||
const client = mqtt.connect('ws://localhost:9001'); // Use wss para conexão segura
|
||||
|
|
@ -183,7 +183,7 @@
|
|||
marcadorDinamico.setRotationAngle(angulo);
|
||||
|
||||
adicionarCoordenada("Tj", [novaLongitude, novaLatitude]);
|
||||
map_3347a224b4ed0e03a73bf2bfbd634524.setView(novaPosicao, map_3347a224b4ed0e03a73bf2bfbd634524.getZoom());
|
||||
map_fc3c5e9d08f8e0552860db1a030344cd.setView(novaPosicao, map_fc3c5e9d08f8e0552860db1a030344cd.getZoom());
|
||||
});
|
||||
|
||||
function calcularOrientacao(P1latitude, P1longitude, P2latitude, P2longitude) {
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -99,7 +99,7 @@ void enviarDadosSensores() {
|
|||
for (auto* bico : listaBicos) {
|
||||
if (bico != nullptr) {
|
||||
bico->RequisitarDados();
|
||||
EnviarDadosCAN(static_cast<uint8_t>(S_Code::sBIC), bico->MontarMensagemCAN());
|
||||
EnviarDadosCAN(bico->MontarMensagemCAN(CanMessagePosicaoDados::Dados1));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -107,7 +107,7 @@ void enviarDadosSensores() {
|
|||
for (auto* sensor : listaSensoresFluxo) {
|
||||
if (sensor != nullptr) {
|
||||
sensor->RequisitarDados();
|
||||
EnviarDadosCAN(static_cast<uint8_t>(S_Code::sFLX), sensor->MontarMensagemCAN());
|
||||
EnviarDadosCAN(sensor->MontarMensagemCAN(CanMessagePosicaoDados::Dados1));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -115,7 +115,7 @@ void enviarDadosSensores() {
|
|||
for (auto* sensor : listaSensoresMassa) {
|
||||
if (sensor != nullptr) {
|
||||
sensor->RequisitarDados();
|
||||
EnviarDadosCAN(static_cast<uint8_t>(S_Code::sMAS), sensor->MontarMensagemCAN());
|
||||
EnviarDadosCAN(sensor->MontarMensagemCAN(CanMessagePosicaoDados::Dados1));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -123,7 +123,7 @@ void enviarDadosSensores() {
|
|||
for (auto* sensor : listaSensoresPressao) {
|
||||
if (sensor != nullptr) {
|
||||
sensor->RequisitarDados();
|
||||
EnviarDadosCAN(static_cast<uint8_t>(S_Code::sPRS), sensor->MontarMensagemCAN());
|
||||
EnviarDadosCAN(sensor->MontarMensagemCAN(CanMessagePosicaoDados::Dados1));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -131,15 +131,15 @@ void enviarDadosSensores() {
|
|||
for (auto* bomba : listaBombas) {
|
||||
if (bomba != nullptr) {
|
||||
bomba->RequisitarDados();
|
||||
EnviarDadosCAN(static_cast<uint8_t>(S_Code::sBMB), bomba->MontarMensagemCAN());
|
||||
EnviarDadosCAN(bomba->MontarMensagemCAN(CanMessagePosicaoDados::Dados1));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void EnviarDadosCAN(uint8_t f_code, std::vector<uint8_t> data) {
|
||||
canService.enviarMensagem(f_code, data);
|
||||
void EnviarDadosCAN(std::vector<uint8_t> data) {
|
||||
canService.enviarMensagem(data);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -159,7 +159,7 @@ void ProcessarFrameCAN(std::vector<uint8_t> data) {
|
|||
void ProcessarChk() {
|
||||
Verificando = true;
|
||||
std::vector<uint8_t> data = canService.MontarFrameChk(D_Code, Conectado, VERSION);
|
||||
EnviarDadosCAN(static_cast<uint8_t>(F_Code::ChkRx), data);
|
||||
EnviarDadosCAN(data);
|
||||
Verificando = false;
|
||||
}
|
||||
|
||||
|
|
@ -168,246 +168,68 @@ void ProcessarReq() {
|
|||
}
|
||||
|
||||
void ProcessarCfg(std::vector<uint8_t> data) {
|
||||
S_Code sensorTipo = (S_Code)data[1];
|
||||
|
||||
switch (sensorTipo) {
|
||||
if (data.size() < 4) return;
|
||||
uint8_t id = data[1];
|
||||
CanMessagePosicaoDados posicao = (CanMessagePosicaoDados)data[2];
|
||||
S_Code componente = (S_Code)data[3];
|
||||
switch (componente) {
|
||||
case sMOD: {
|
||||
if (data.size() < 7) return;
|
||||
bool conectar = data[2] == 1;
|
||||
int taxa = data[3] * 10;
|
||||
bool requisitar = data[4] == 1;
|
||||
int pinoSDA = data[5];
|
||||
int pinoSCL = data[6];
|
||||
|
||||
if (pinoSDA != PINO_INVALIDO && pinoSCL != PINO_INVALIDO) {
|
||||
//_pinoSDA = PinoModel(pinoSDA, CONTROLADOR, _INPUT);
|
||||
//_pinoSCL = PinoModel(pinoSCL, CONTROLADOR, _INPUT);
|
||||
|
||||
//Wire.end();
|
||||
//Wire.begin(_pinoSDA.num, _pinoSCL.num);
|
||||
|
||||
//PrintTela("I2C inicializado nos pinos SDA=" + String(pinoSDA) + " e SCL=" + String(pinoSCL));
|
||||
switch (posicao) {
|
||||
case CanMessagePosicaoDados::Config1: {
|
||||
if (data.size() < 7) return;
|
||||
bool conectar = data[4] == 1;
|
||||
int taxa = data[5] * 10;
|
||||
bool requisitar = data[6] == 1;
|
||||
vTaskDelay(pdMS_TO_TICKS(100));
|
||||
_TaxaAmostragem = taxa;
|
||||
RequisitarDados = requisitar;
|
||||
Verificando = false;
|
||||
Conectado = conectar;
|
||||
ProcessarChk();
|
||||
LimparListasComponentes();
|
||||
PrintTela("Configuracao do modulo concluida");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
vTaskDelay(pdMS_TO_TICKS(100));
|
||||
_TaxaAmostragem = taxa;
|
||||
RequisitarDados = requisitar;
|
||||
Verificando = false;
|
||||
Conectado = conectar;
|
||||
|
||||
ProcessarChk();
|
||||
|
||||
LimparListasComponentes();
|
||||
|
||||
PrintTela("Configuracao do modulo concluida");
|
||||
|
||||
break;
|
||||
}
|
||||
case sBIC: {
|
||||
if (data.size() < 7) return;
|
||||
uint8_t idNum = data[2];
|
||||
bool conectar = data[3] == 1;
|
||||
bool atuacaoNivelAlto = data[4] == 1;
|
||||
TiposBarramentos tipoBarramento = (TiposBarramentos)data[5];
|
||||
int pino = data[6];
|
||||
auto it = std::find_if(listaBicos.begin(), listaBicos.end(),
|
||||
[idNum](Rele* s) { return s->ID_Num == idNum; });
|
||||
if (conectar) {
|
||||
if (it == listaBicos.end()) {
|
||||
Rele* sensor = new Rele(Mod_ID, "sBIC_" + String(idNum));
|
||||
sensor->ID_Num = idNum;
|
||||
sensor->_pino = PinoModel(pino, tipoBarramento, _OUTPUT);
|
||||
sensor->AtuacaoNivelAlto = atuacaoNivelAlto;
|
||||
sensor->Inicializar();
|
||||
listaBicos.push_back(sensor);
|
||||
PrintTela("Rele adicionado via CAN: sBIC_" + String(idNum));
|
||||
}
|
||||
} else {
|
||||
if (it != listaBicos.end()) {
|
||||
Rele* sensor = *it;
|
||||
sensor->Desligar();
|
||||
delete sensor;
|
||||
listaBicos.erase(it);
|
||||
PrintTela("Bico removido via CAN: sBIC_" + String(idNum));
|
||||
}
|
||||
}
|
||||
Rele::ConfigurarRele(listaBicos, data, Mod_ID);
|
||||
break;
|
||||
}
|
||||
case sFLX: {
|
||||
if (data.size() < 6) return;
|
||||
uint8_t idNum = data[2];
|
||||
bool conectar = data[3] == 1;
|
||||
TiposBarramentos tipoBarramento = (TiposBarramentos)data[4];
|
||||
int pino = data[5];
|
||||
auto it = std::find_if(listaSensoresFluxo.begin(), listaSensoresFluxo.end(),
|
||||
[idNum](SensorFluxo* s) { return s->ID_Num == idNum; });
|
||||
if (conectar) {
|
||||
if (it == listaSensoresFluxo.end()) {
|
||||
SensorFluxo* sensor = new SensorFluxo(Mod_ID, "sFLX_" + String(idNum));
|
||||
sensor->ID_Num = idNum;
|
||||
sensor->_pino = PinoModel(pino, tipoBarramento, _INPUT, DIGITAL);
|
||||
sensor->Inicializar();
|
||||
listaSensoresFluxo.push_back(sensor);
|
||||
PrintTela("Sensor de Fluxo adicionado via CAN: sFLX_" + String(idNum));
|
||||
}
|
||||
} else {
|
||||
if (it != listaSensoresFluxo.end()) {
|
||||
SensorFluxo* sensor = *it;
|
||||
sensor->Desligar();
|
||||
delete sensor;
|
||||
listaSensoresFluxo.erase(it);
|
||||
PrintTela("Sensor de Fluxo removido via CAN: sFLX_" + String(idNum));
|
||||
}
|
||||
}
|
||||
SensorFluxo::ConfigurarSensor(listaSensoresFluxo, data, Mod_ID);
|
||||
break;
|
||||
}
|
||||
case sPRS: {
|
||||
if (data.size() < 6) return;
|
||||
uint8_t idNum = data[2];
|
||||
bool conectar = data[3] == 1;
|
||||
TiposBarramentos tipoBarramento = (TiposBarramentos)data[4];
|
||||
int pino = data[5];
|
||||
auto it = std::find_if(listaSensoresPressao.begin(), listaSensoresPressao.end(),
|
||||
[idNum](SensorPressao* s) { return s->ID_Num == idNum; });
|
||||
if (conectar) {
|
||||
if (it == listaSensoresPressao.end()) {
|
||||
SensorPressao* sensor = new SensorPressao(Mod_ID, "sPRS_" + String(idNum));
|
||||
sensor->ID_Num = idNum;
|
||||
sensor->_pino = PinoModel(pino, tipoBarramento, _INPUT, ANALOGICO);
|
||||
sensor->Inicializar();
|
||||
listaSensoresPressao.push_back(sensor);
|
||||
PrintTela("Sensor de Pressao adicionado via CAN: sPRS_" + String(idNum));
|
||||
}
|
||||
} else {
|
||||
if (it != listaSensoresPressao.end()) {
|
||||
SensorPressao* sensor = *it;
|
||||
sensor->Desligar();
|
||||
delete sensor;
|
||||
listaSensoresPressao.erase(it);
|
||||
PrintTela("Sensor de Pressao removido via CAN: sPRS_" + String(idNum));
|
||||
}
|
||||
}
|
||||
SensorPressao::ConfigurarSensor(listaSensoresPressao, data, Mod_ID);
|
||||
break;
|
||||
}
|
||||
case sMAS: {
|
||||
if (data.size() < 6) return;
|
||||
uint8_t idNum = data[2];
|
||||
bool conectar = data[3] == 1;
|
||||
int pinoDt = data[4];
|
||||
int pinoSck = data[5];
|
||||
//uint16_t offsetInt = ((uint16_t)data[6] << 8) | data[7];
|
||||
//float offset = offsetInt / 100.0;
|
||||
|
||||
auto it = std::find_if(listaSensoresMassa.begin(), listaSensoresMassa.end(),
|
||||
[idNum](SensorMassa* s) { return s->ID_Num == idNum; });
|
||||
if (conectar) {
|
||||
if (it == listaSensoresMassa.end()) {
|
||||
SensorMassa* sensor = new SensorMassa(Mod_ID, "sMAS_" + String(idNum));
|
||||
sensor->ID_Num = idNum;
|
||||
sensor->_pinoDT = PinoModel(pinoDt, CONTROLADOR, _INPUT, DIGITAL);
|
||||
sensor->_pinoSCK = PinoModel(pinoSck, CONTROLADOR, _OUTPUT);
|
||||
//sensor->_Offset = offset;
|
||||
sensor->Inicializar();
|
||||
listaSensoresMassa.push_back(sensor);
|
||||
PrintTela("Sensor de Massa adicionado via CAN: sMAS_" + String(idNum));
|
||||
}
|
||||
} else {
|
||||
if (it != listaSensoresMassa.end()) {
|
||||
SensorMassa* sensor = *it;
|
||||
sensor->Desligar();
|
||||
delete sensor;
|
||||
listaSensoresMassa.erase(it);
|
||||
PrintTela("Sensor de Massa removido via CAN: sMAS_" + String(idNum));
|
||||
}
|
||||
}
|
||||
SensorMassa::ConfigurarSensor(listaSensoresMassa, data, Mod_ID);
|
||||
break;
|
||||
}
|
||||
case sBMB: {
|
||||
if (data.size() < 7) return;
|
||||
uint8_t idNum = data[2];
|
||||
bool conectar = data[3] == 1;
|
||||
int pressaoSp = (int)data[4];
|
||||
int pinoEn = data[5];
|
||||
int pinoPwm = data[6];
|
||||
|
||||
auto it = std::find_if(listaBombas.begin(), listaBombas.end(),
|
||||
[idNum](BombaPressurizadora* s) { return s->ID_Num == idNum; });
|
||||
if (conectar) {
|
||||
if (it == listaBombas.end()) {
|
||||
BombaPressurizadora* bomba = new BombaPressurizadora(Mod_ID, "sBMB_" + String(idNum));
|
||||
|
||||
if (listaSensoresPressao.size() > 0) {
|
||||
if (listaSensoresPressao[0]->Iniciado) {
|
||||
bomba->sensorPressao = listaSensoresPressao[0];
|
||||
}
|
||||
}
|
||||
if (bomba->sensorPressao == nullptr) {
|
||||
PrintTela("Nenhum sensor de pressão disponível para associar à bomba.");
|
||||
delete bomba;
|
||||
return;
|
||||
}
|
||||
|
||||
bomba->ID_Num = idNum;
|
||||
bomba->_pinoEN = PinoModel(pinoEn, CONTROLADOR, _OUTPUT);
|
||||
bomba->_pinoPWM = PinoModel(pinoPwm, CONTROLADOR, _PWM);
|
||||
bomba->_PressaoSP = (double)pressaoSp;
|
||||
|
||||
bomba->Inicializar();
|
||||
listaBombas.push_back(bomba);
|
||||
PrintTela("Bomba Pressurizadora adicionado via CAN: sBMB_" + String(idNum));
|
||||
}
|
||||
} else {
|
||||
if (it != listaBombas.end()) {
|
||||
BombaPressurizadora* bomba = *it;
|
||||
bomba->Desligar();
|
||||
delete bomba;
|
||||
listaBombas.erase(it);
|
||||
PrintTela("Bomba Pressurizadora removido via CAN: sBMB_" + String(idNum));
|
||||
}
|
||||
}
|
||||
BombaPressurizadora::ConfigurarBomba(listaBombas, data, Mod_ID, listaSensoresPressao);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
void ProcessarCmd(std::vector<uint8_t> data) {
|
||||
if (data.size() < 3) return;
|
||||
|
||||
S_Code componente = (S_Code)data[1];
|
||||
uint8_t id = data[2];
|
||||
|
||||
if (data.size() < 4) return;
|
||||
uint8_t id = data[1];
|
||||
CanMessagePosicaoDados posicao = (CanMessagePosicaoDados)data[2];
|
||||
S_Code componente = DetectarComponente(id);
|
||||
switch (componente) {
|
||||
case sBIC: {
|
||||
if (data.size() < 4) return;
|
||||
for (auto* _rele : listaBicos) {
|
||||
if (_rele != nullptr) {
|
||||
if (_rele->ID_Num == id) {
|
||||
_rele->AtualizarStatus((Estado)data[3]);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
Rele::ComandarRele(listaBicos, data, id);
|
||||
break;
|
||||
}
|
||||
case sBMB: {
|
||||
if (data.size() < 6) return;
|
||||
|
||||
Estado novoEstado = (Estado)data[3];
|
||||
int pressao = (int)data[4];
|
||||
|
||||
for (auto* _bomba : listaBombas) {
|
||||
if (_bomba && _bomba->ID_Num == id) {
|
||||
_bomba->_EstadoControle = novoEstado;
|
||||
_bomba->_PressaoSP = (double)pressao;
|
||||
_bomba->AlterarStatusBomba();
|
||||
}
|
||||
}
|
||||
|
||||
BombaPressurizadora::ComandarBomba(listaBombas, data, id);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
@ -449,3 +271,23 @@ void LimparListasComponentes() {
|
|||
}
|
||||
listaSensoresPressao.clear();
|
||||
}
|
||||
|
||||
S_Code DetectarComponente(uint8_t idNum) {
|
||||
if (idNum == canService.ID_Num_sMOD) return S_Code::sMOD;
|
||||
for (auto* s : listaBicos) {
|
||||
if (s->ID_Num == idNum) return S_Code::sBIC;
|
||||
}
|
||||
for (auto* s : listaBombas) {
|
||||
if (s->ID_Num == idNum) return S_Code::sBMB;
|
||||
}
|
||||
for (auto* s : listaSensoresFluxo) {
|
||||
if (s->ID_Num == idNum) return S_Code::sFLX;
|
||||
}
|
||||
for (auto* s : listaSensoresMassa) {
|
||||
if (s->ID_Num == idNum) return S_Code::sMAS;
|
||||
}
|
||||
for (auto* s : listaSensoresPressao) {
|
||||
if (s->ID_Num == idNum) return S_Code::sPRS;
|
||||
}
|
||||
return S_Code::sVZO;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,7 +10,8 @@
|
|||
class BombaPressurizadora {
|
||||
public:
|
||||
|
||||
static void InicializarLista(std::vector<BombaPressurizadora*>& lista, const String& parametros, const String& Mod_ID, std::vector<SensorPressao*>& sensoresPressao);
|
||||
static void ConfigurarBomba(std::vector<BombaPressurizadora*>& lista, std::vector<uint8_t>& data, const String& Mod_ID, std::vector<SensorPressao*>& sensoresPressao);
|
||||
static void ComandarBomba(std::vector<BombaPressurizadora*>& lista, std::vector<uint8_t>& data, uint8_t& id);
|
||||
|
||||
BombaPressurizadora(String _modID, String _id) {
|
||||
Mod_ID = _modID;
|
||||
|
|
@ -154,17 +155,23 @@ class BombaPressurizadora {
|
|||
|
||||
}
|
||||
|
||||
std::vector<uint8_t> MontarMensagemCAN() {
|
||||
std::vector<uint8_t> MontarMensagemCAN(CanMessagePosicaoDados posicao) {
|
||||
std::vector<uint8_t> data;
|
||||
|
||||
data.push_back(ID_Num); // Byte 0 - ID do sensor
|
||||
data.push_back(Iniciado ? 1 : 0); // Byte 1 - Status
|
||||
|
||||
data.push_back(EstadoLeitura);
|
||||
data.push_back(PercentualPotenciaLeitura);
|
||||
data.push_back((int)_PressaoSP);
|
||||
data.push_back((int)sensorPressao->Pressao);
|
||||
|
||||
data.push_back(ID_Num);
|
||||
data.push_back(static_cast<uint8_t>(posicao));
|
||||
switch (posicao) {
|
||||
case CanMessagePosicaoDados::Status: {
|
||||
data.push_back(Iniciado ? 1 : 0);
|
||||
break;
|
||||
}
|
||||
case CanMessagePosicaoDados::Dados1: {
|
||||
data.push_back(EstadoLeitura);
|
||||
data.push_back(PercentualPotenciaLeitura);
|
||||
data.push_back((int)_PressaoSP);
|
||||
data.push_back((int)sensorPressao->Pressao);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
|
|
@ -182,73 +189,63 @@ class BombaPressurizadora {
|
|||
};
|
||||
|
||||
|
||||
// Função para inicializar as bombas pressurizadoras com IDs e pinos específicos
|
||||
void BombaPressurizadora::InicializarLista(std::vector<BombaPressurizadora*>& lista, const String& parametros, const String& Mod_ID, std::vector<SensorPressao*>& sensoresPressao) {
|
||||
// Verifica se há sensores já na lista
|
||||
if (!lista.empty()) {
|
||||
PrintTela("Limpando lista de bombas pressurizadoras existente...");
|
||||
|
||||
for (auto* sensor : lista) {
|
||||
sensor->Desligar(); // Desliga cada sensor antes de remover
|
||||
PrintTela("Bomba Pressurizadora " + sensor->_ID + " desligada.");
|
||||
delete sensor;
|
||||
}
|
||||
|
||||
lista.clear(); // Limpa a lista após desligar todos os itens
|
||||
}
|
||||
|
||||
int idx = 0;
|
||||
if (parametros.length() > 0) {
|
||||
|
||||
if (idx < sensoresPressao.size()) {
|
||||
std::vector<String> _config = SplitString(parametros, SplitConfig); // Divide a configuração por *
|
||||
|
||||
for (const String& config : _config) {
|
||||
std::vector<String> partes = SplitString(config, SplitSubParams); // Divide cada configuração pelo '~'
|
||||
|
||||
if (partes.size() == 13) {
|
||||
String id = partes[0];
|
||||
bool conectar = partes[1] == "1";
|
||||
double pressaoSP = partes[2].toDouble();
|
||||
TiposBarramentos enB = (TiposBarramentos)partes[3].toInt();
|
||||
int pinoEN = partes[4].toInt();
|
||||
TiposBarramentos csB = (TiposBarramentos)partes[5].toInt();
|
||||
int pinoCS = partes[6].toInt();
|
||||
TiposBarramentos inaB = (TiposBarramentos)partes[7].toInt();
|
||||
int pinoINA = partes[8].toInt();
|
||||
TiposBarramentos inbB = (TiposBarramentos)partes[9].toInt();
|
||||
int pinoINB = partes[10].toInt();
|
||||
TiposBarramentos pwmB = (TiposBarramentos)partes[11].toInt();
|
||||
int pinoPWM = partes[12].toInt();
|
||||
|
||||
if (conectar) {
|
||||
BombaPressurizadora* bomba = new BombaPressurizadora(Mod_ID, id);
|
||||
bomba->_PressaoSP = pressaoSP;
|
||||
bomba->_pinoEN = PinoModel(pinoEN, enB, _OUTPUT);
|
||||
bomba->_pinoCS = PinoModel(pinoCS, csB, _INPUT, DIGITAL);
|
||||
bomba->_pinoINA = PinoModel(pinoINA, inaB, _OUTPUT);
|
||||
bomba->_pinoINB = PinoModel(pinoINB, inbB, _OUTPUT);
|
||||
bomba->_pinoPWM = PinoModel(pinoPWM, pwmB, _PWM);
|
||||
|
||||
bomba->sensorPressao = sensoresPressao[idx];
|
||||
|
||||
bomba->Inicializar();
|
||||
lista.push_back(bomba);
|
||||
PrintTela("Bomba " + id + " inicializado com pressao SP " + String(pressaoSP) + " e sensor de pressao " + sensoresPressao[idx]->_ID);
|
||||
void BombaPressurizadora::ConfigurarBomba(std::vector<BombaPressurizadora*>& lista, std::vector<uint8_t>& data, const String& Mod_ID, std::vector<SensorPressao*>& sensoresPressao) {
|
||||
if (data.size() < 8) return;
|
||||
uint8_t idNum = data[1];
|
||||
CanMessagePosicaoDados posicao = (CanMessagePosicaoDados)data[2];
|
||||
switch (posicao) {
|
||||
case CanMessagePosicaoDados::Config1: {
|
||||
bool conectar = data[4] == 1;
|
||||
int pressaoSp = (int)data[5];
|
||||
int pinoEn = data[6];
|
||||
int pinoPwm = data[7];
|
||||
auto it = std::find_if(lista.begin(), lista.end(), [idNum](BombaPressurizadora* s) { return s->ID_Num == idNum; });
|
||||
if (conectar) {
|
||||
if (it == lista.end()) {
|
||||
BombaPressurizadora* bomba = new BombaPressurizadora(Mod_ID, "sBMB_" + String(idNum));
|
||||
if (sensoresPressao.size() > 0) {
|
||||
if (sensoresPressao[0]->Iniciado) {
|
||||
bomba->sensorPressao = sensoresPressao[0];
|
||||
}
|
||||
}
|
||||
} else {
|
||||
PrintTela("Configuração inválida para bomba pressurizadora: " + config);
|
||||
if (bomba->sensorPressao == nullptr) {
|
||||
PrintTela("Nenhum sensor de pressão disponível para associar à bomba.");
|
||||
delete bomba;
|
||||
return;
|
||||
}
|
||||
bomba->ID_Num = idNum;
|
||||
bomba->_pinoEN = PinoModel(pinoEn, CONTROLADOR, _OUTPUT);
|
||||
bomba->_pinoPWM = PinoModel(pinoPwm, CONTROLADOR, _PWM);
|
||||
bomba->_PressaoSP = (double)pressaoSp;
|
||||
bomba->Inicializar();
|
||||
lista.push_back(bomba);
|
||||
PrintTela("Bomba Pressurizadora adicionado via CAN: sBMB_" + String(idNum));
|
||||
}
|
||||
} else {
|
||||
if (it != lista.end()) {
|
||||
BombaPressurizadora* bomba = *it;
|
||||
bomba->Desligar();
|
||||
delete bomba;
|
||||
lista.erase(it);
|
||||
PrintTela("Bomba Pressurizadora removido via CAN: sBMB_" + String(idNum));
|
||||
}
|
||||
|
||||
idx++;
|
||||
}
|
||||
} else {
|
||||
PrintTela("Impossivel inicializar Bomba sem um sensor de pressao inicializado.");
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
PrintTela("Configuração de bomba pressurizadora não encontrada.");
|
||||
}
|
||||
}
|
||||
|
||||
void BombaPressurizadora::ComandarBomba(std::vector<BombaPressurizadora*>& lista, std::vector<uint8_t>& data, uint8_t& id) {
|
||||
if (data.size() < 6) return;
|
||||
Estado novoEstado = (Estado)data[3];
|
||||
int pressao = (int)data[4];
|
||||
for (auto* _bomba : lista) {
|
||||
if (_bomba && _bomba->ID_Num == id) {
|
||||
_bomba->_EstadoControle = novoEstado;
|
||||
_bomba->_PressaoSP = (double)pressao;
|
||||
_bomba->AlterarStatusBomba();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -91,6 +91,7 @@ CanService* CanService::instance = nullptr;
|
|||
|
||||
class CanService {
|
||||
public:
|
||||
uint8_t ID_Num_sMOD = 0;
|
||||
typedef void (*OnReceiveCallback)(int packetSize, int senderId, byte funcCode, byte* data, int dataLength);
|
||||
|
||||
CanService(uint8_t nodeId, uint32_t baudRate = 500000) {
|
||||
|
|
@ -167,6 +168,23 @@ class CanService {
|
|||
_callback = cb;
|
||||
}
|
||||
|
||||
bool enviarMensagem(const std::vector<uint8_t>& payload) {
|
||||
if (payload.size() > 8) return false;
|
||||
|
||||
twai_message_t msg;
|
||||
msg.identifier = _nodeId;
|
||||
msg.extd = 0;
|
||||
msg.rtr = 0;
|
||||
msg.ss = 1;
|
||||
msg.data_length_code = payload.size();
|
||||
|
||||
for (uint8_t i = 0; i < payload.size(); ++i) {
|
||||
msg.data[i] = payload[i]; // 👈 Preenche os dados corretamente
|
||||
}
|
||||
|
||||
return twai_transmit(&msg, pdMS_TO_TICKS(10)) == ESP_OK;
|
||||
}
|
||||
|
||||
bool enviarMensagem(byte funcCode, const std::vector<uint8_t>& payload) {
|
||||
if (payload.size() > 7) return false;
|
||||
|
||||
|
|
@ -186,11 +204,13 @@ class CanService {
|
|||
}
|
||||
|
||||
std::vector<uint8_t> MontarFrameChk(T_Code D_Code, bool Conectado, int Versao) {
|
||||
std::vector<uint8_t> resposta;
|
||||
resposta.push_back(static_cast<uint8_t>(D_Code));
|
||||
resposta.push_back(Conectado ? 1 : 0);
|
||||
resposta.push_back(Versao);
|
||||
return resposta;
|
||||
std::vector<uint8_t> data;
|
||||
data.push_back(ID_Num_sMOD);
|
||||
data.push_back(static_cast<uint8_t>(CanMessagePosicaoDados::Status));
|
||||
data.push_back(static_cast<uint8_t>(D_Code));
|
||||
data.push_back(Conectado ? 1 : 0);
|
||||
data.push_back(Versao);
|
||||
return data;
|
||||
}
|
||||
|
||||
private:
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
#define AgroboticsEnuns
|
||||
|
||||
enum T_Code {
|
||||
Vzo = 200,
|
||||
Vzo = -1,
|
||||
Mov = 100,
|
||||
Dir = 101,
|
||||
Sen = 102,
|
||||
|
|
@ -22,25 +22,25 @@ enum T_Code {
|
|||
};
|
||||
|
||||
enum F_Code {
|
||||
Nda = 0,
|
||||
ChkTx = 1,
|
||||
ChkRx = 2,
|
||||
CfgTx = 3,
|
||||
CfgRx = 4,
|
||||
TstTx = 5,
|
||||
TstRx = 6,
|
||||
CmdTx = 7,
|
||||
CmdRx = 8,
|
||||
ErrTx = 9,
|
||||
ErrRx = 10,
|
||||
MsgTx = 11,
|
||||
MsgRx = 12,
|
||||
ReqTx = 13,
|
||||
ReqRx = 14,
|
||||
Nda = -1,
|
||||
ChkTx = 201,
|
||||
ChkRx = 202,
|
||||
CfgTx = 203,
|
||||
CfgRx = 204,
|
||||
TstTx = 205,
|
||||
TstRx = 206,
|
||||
CmdTx = 207,
|
||||
CmdRx = 208,
|
||||
ErrTx = 209,
|
||||
ErrRx = 210,
|
||||
MsgTx = 211,
|
||||
MsgRx = 212,
|
||||
ReqTx = 213,
|
||||
ReqRx = 214,
|
||||
};
|
||||
|
||||
enum S_Code {
|
||||
sVZO = 0,
|
||||
sVZO = -1,
|
||||
sRPM = 1,
|
||||
sTST = 2,
|
||||
sCFG = 3,
|
||||
|
|
@ -116,4 +116,24 @@ enum TiposLeituras {
|
|||
ANALOGICO = 1,
|
||||
};
|
||||
|
||||
enum CanMessagePosicaoDados
|
||||
{
|
||||
Status = 0,
|
||||
Dados1 = 1,
|
||||
Dados2 = 2,
|
||||
Dados3 = 3,
|
||||
Dados4 = 4,
|
||||
Dados5 = 5,
|
||||
Config1 = 51,
|
||||
Config2 = 52,
|
||||
Config3 = 53,
|
||||
Config4 = 54,
|
||||
Config5 = 55,
|
||||
Command1 = 101,
|
||||
Command2 = 102,
|
||||
Command3 = 103,
|
||||
Command4 = 104,
|
||||
Command5 = 105,
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
@ -8,7 +8,8 @@
|
|||
class Rele {
|
||||
public:
|
||||
|
||||
static void InicializarLista(std::vector<Rele*>& lista, const String& parametros, const String& Mod_ID);
|
||||
static void ConfigurarRele(std::vector<Rele*>& lista, std::vector<uint8_t>& data, const String& Mod_ID);
|
||||
static void ComandarRele(std::vector<Rele*>& lista, std::vector<uint8_t>& data, uint8_t& id);
|
||||
|
||||
Rele(String _modID, String _id) {
|
||||
Mod_ID = _modID;
|
||||
|
|
@ -85,59 +86,68 @@ class Rele {
|
|||
AtualizarLeitura();
|
||||
}
|
||||
|
||||
std::vector<uint8_t> MontarMensagemCAN() {
|
||||
std::vector<uint8_t> MontarMensagemCAN(CanMessagePosicaoDados posicao) {
|
||||
std::vector<uint8_t> data;
|
||||
data.push_back(ID_Num);
|
||||
data.push_back(Iniciado ? 1 : 0);
|
||||
data.push_back(_Status);
|
||||
data.push_back(static_cast<uint8_t>(posicao));
|
||||
switch (posicao) {
|
||||
case CanMessagePosicaoDados::Status: {
|
||||
data.push_back(Iniciado ? 1 : 0);
|
||||
break;
|
||||
}
|
||||
case CanMessagePosicaoDados::Dados1: {
|
||||
data.push_back(_Status);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
// Função para inicializar os reles com IDs e pinos específicos
|
||||
void Rele::InicializarLista(std::vector<Rele*>& lista, const String& parametros, const String& Mod_ID) {
|
||||
// Verifica se há sensores já na lista
|
||||
if (!lista.empty()) {
|
||||
PrintTela("Limpando lista de reles existente...");
|
||||
|
||||
for (auto* sensor : lista) {
|
||||
sensor->Desligar(); // Desliga cada sensor antes de remover
|
||||
PrintTela("Rele " + sensor->_ID + " desligado.");
|
||||
delete sensor;
|
||||
}
|
||||
|
||||
lista.clear(); // Limpa a lista após desligar todos os itens
|
||||
}
|
||||
|
||||
if (parametros.length() > 0) {
|
||||
std::vector<String> _config = SplitString(parametros, SplitConfig); // Divide a configuração por vírgulas
|
||||
|
||||
for (const String& config : _config) {
|
||||
std::vector<String> partes = SplitString(config, SplitSubParams); // Divide cada configuração pelo '-'
|
||||
|
||||
if (partes.size() == 5) {
|
||||
String id = partes[0];
|
||||
bool conectar = partes[1] == "1";
|
||||
bool atuacaoAlto = partes[2] == "1";
|
||||
TiposBarramentos pinoB = (TiposBarramentos)partes[3].toInt();
|
||||
int pino = partes[4].toInt();
|
||||
|
||||
if (conectar) {
|
||||
Rele* sensor = new Rele(Mod_ID, id);
|
||||
sensor->ID_Num = lista.size();
|
||||
sensor->_pino = PinoModel(pino, pinoB, _OUTPUT);
|
||||
sensor->AtuacaoNivelAlto = atuacaoAlto;
|
||||
void Rele::ConfigurarRele(std::vector<Rele*>& lista, std::vector<uint8_t>& data, const String& Mod_ID) {
|
||||
if (data.size() < 8) return;
|
||||
uint8_t idNum = data[1];
|
||||
CanMessagePosicaoDados posicao = (CanMessagePosicaoDados)data[2];
|
||||
switch (posicao) {
|
||||
case CanMessagePosicaoDados::Config1: {
|
||||
bool conectar = data[4] == 1;
|
||||
bool atuacaoNivelAlto = data[5] == 1;
|
||||
TiposBarramentos tipoBarramento = (TiposBarramentos)data[6];
|
||||
int pino = data[7];
|
||||
auto it = std::find_if(lista.begin(), lista.end(), [idNum](Rele* s) { return s->ID_Num == idNum; });
|
||||
if (conectar) {
|
||||
if (it == lista.end()) {
|
||||
Rele* sensor = new Rele(Mod_ID, "sRLE_" + String(idNum));
|
||||
sensor->ID_Num = idNum;
|
||||
sensor->_pino = PinoModel(pino, tipoBarramento, _OUTPUT);
|
||||
sensor->AtuacaoNivelAlto = atuacaoNivelAlto;
|
||||
sensor->Inicializar();
|
||||
lista.push_back(sensor);
|
||||
PrintTela("Rele " + id + " inicializado no pino " + String(pino));
|
||||
PrintTela("Rele adicionado via CAN: sRLE_" + String(idNum));
|
||||
}
|
||||
} else {
|
||||
PrintTela("Configuração inválida para rele: " + config);
|
||||
if (it != lista.end()) {
|
||||
Rele* sensor = *it;
|
||||
sensor->Desligar();
|
||||
delete sensor;
|
||||
lista.erase(it);
|
||||
PrintTela("Rele removido via CAN: sRLE_" + String(idNum));
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Rele::ComandarRele(std::vector<Rele*>& lista, std::vector<uint8_t>& data, uint8_t& id) {
|
||||
if (data.size() < 4) return;
|
||||
for (auto* _rele : lista) {
|
||||
if (_rele->ID_Num == id) {
|
||||
_rele->AtualizarStatus((Estado)data[3]);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
PrintTela("Configuração de rele não encontrada.");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@
|
|||
class SensorCorrente {
|
||||
public:
|
||||
|
||||
static void InicializarLista(std::vector<SensorCorrente*>& lista, const String& parametros, const String& Mod_ID);
|
||||
static void ConfigurarSensor(std::vector<SensorCorrente*>& lista, std::vector<uint8_t>& data, const String& Mod_ID);
|
||||
|
||||
SensorCorrente(String _modID, String _id) {
|
||||
Mod_ID = _modID;
|
||||
|
|
@ -37,7 +37,7 @@ class SensorCorrente {
|
|||
PrintTela(_ID + " ja inicializado");
|
||||
return;
|
||||
}
|
||||
PrintTela("Tentando iniciar o sensor de corrente no endereco " + String(_Endereco));
|
||||
|
||||
if (_Endereco > 0x00) {
|
||||
Wire.beginTransmission(_Endereco);
|
||||
byte error = Wire.endTransmission();
|
||||
|
|
@ -81,87 +81,84 @@ class SensorCorrente {
|
|||
Iniciado = false;
|
||||
}
|
||||
|
||||
void AferirCorrente() {
|
||||
if (Iniciado) {
|
||||
busVoltage = sINA219.getBusVoltage_V();
|
||||
shuntVoltage = sINA219.getShuntVoltage_mV();
|
||||
current = sINA219.getCurrent_mA();
|
||||
power = sINA219.getPower_mW();
|
||||
}
|
||||
}
|
||||
|
||||
void RequisitarDados() {
|
||||
AferirCorrente();
|
||||
}
|
||||
|
||||
std::vector<uint8_t> MontarMensagemCAN() {
|
||||
std::vector<uint8_t> MontarMensagemCAN(CanMessagePosicaoDados posicao) {
|
||||
std::vector<uint8_t> data;
|
||||
data.push_back(ID_Num);
|
||||
data.push_back(Iniciado ? 1 : 0);
|
||||
|
||||
// BusVoltage com 2 bytes, precisão x100
|
||||
uint16_t busVoltsInt = (uint16_t)(busVoltage * 100);
|
||||
data.push_back((uint8_t)(busVoltsInt >> 8));
|
||||
data.push_back((uint8_t)(busVoltsInt & 0xFF));
|
||||
|
||||
// Corrente com 2 bytes (em mA)
|
||||
uint16_t correnteInt = (uint16_t)(current);
|
||||
data.push_back((uint8_t)(correnteInt >> 8));
|
||||
data.push_back((uint8_t)(correnteInt & 0xFF));
|
||||
|
||||
// Potência com 2 bytes
|
||||
/*uint16_t potenciaInt = (uint16_t)(power);
|
||||
data.push_back((uint8_t)(potenciaInt >> 8));
|
||||
data.push_back((uint8_t)(potenciaInt & 0xFF));*/
|
||||
|
||||
data.push_back(static_cast<uint8_t>(posicao));
|
||||
switch (posicao) {
|
||||
case CanMessagePosicaoDados::Status: {
|
||||
data.push_back(Iniciado ? 1 : 0);
|
||||
break;
|
||||
}
|
||||
case CanMessagePosicaoDados::Dados1: {
|
||||
// BusVoltage com 2 bytes, precisão x100
|
||||
uint16_t busVoltsInt = (uint16_t)(busVoltage * 100);
|
||||
data.push_back((uint8_t)(busVoltsInt >> 8));
|
||||
data.push_back((uint8_t)(busVoltsInt & 0xFF));
|
||||
// Corrente com 2 bytes (em mA)
|
||||
uint16_t correnteInt = (uint16_t)(current);
|
||||
data.push_back((uint8_t)(correnteInt >> 8));
|
||||
data.push_back((uint8_t)(correnteInt & 0xFF));
|
||||
// Potência com 2 bytes
|
||||
uint16_t potenciaInt = (uint16_t)(power);
|
||||
data.push_back((uint8_t)(potenciaInt >> 8));
|
||||
data.push_back((uint8_t)(potenciaInt & 0xFF));
|
||||
break;
|
||||
}
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
void AferirCorrente() {
|
||||
if (!Iniciado) return;
|
||||
|
||||
busVoltage = sINA219.getBusVoltage_V();
|
||||
//shuntVoltage = sINA219.getShuntVoltage_mV();
|
||||
current = sINA219.getCurrent_mA();
|
||||
power = sINA219.getPower_mW();
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
||||
// Função para inicializar os sensores de corrente com IDs e pinos específicos
|
||||
void SensorCorrente::InicializarLista(std::vector<SensorCorrente*>& lista, const String& parametros, const String& Mod_ID) {
|
||||
// Verifica se há sensores já na lista
|
||||
if (!lista.empty()) {
|
||||
PrintTela("Limpando lista de sensores de corrente existente...");
|
||||
|
||||
for (auto* sensor : lista) {
|
||||
sensor->Desligar(); // Desliga cada sensor antes de remover
|
||||
PrintTela("Sensor de Corrente " + sensor->_ID + " desligado.");
|
||||
delete sensor;
|
||||
}
|
||||
|
||||
lista.clear(); // Limpa a lista após desligar todos os itens
|
||||
}
|
||||
|
||||
if (parametros.length() > 0) {
|
||||
std::vector<String> _config = SplitString(parametros, SplitConfig); // Divide a configuração por vírgulas
|
||||
|
||||
for (const String& config : _config) {
|
||||
std::vector<String> partes = SplitString(config, SplitSubParams); // Divide cada configuração pelo '-'
|
||||
|
||||
if (partes.size() >= 6) {
|
||||
String id = partes[0];
|
||||
bool conectar = partes[1] == "1";
|
||||
String _endereco = partes[4];
|
||||
int _a_max = partes[5].toDouble();
|
||||
|
||||
if (conectar) {
|
||||
SensorCorrente* sensor = new SensorCorrente(Mod_ID, id);
|
||||
sensor->ID_Num = lista.size();
|
||||
sensor->_Endereco = stringToByte(_endereco);
|
||||
sensor->_A_Shunt = _a_max;
|
||||
void SensorCorrente::ConfigurarSensor(std::vector<SensorCorrente*>& lista, std::vector<uint8_t>& data, const String& Mod_ID) {
|
||||
if (data.size() < 8) return;
|
||||
uint8_t idNum = data[1];
|
||||
CanMessagePosicaoDados posicao = (CanMessagePosicaoDados)data[2];
|
||||
switch (posicao) {
|
||||
case CanMessagePosicaoDados::Config1: {
|
||||
bool conectar = data[4] == 1;
|
||||
uint8_t endereco = data[5];
|
||||
// _a_max vem como float*100 => uint16_t
|
||||
uint16_t aMaxInt = ((uint16_t)data[6] << 8) | data[7];
|
||||
float aMax = aMaxInt / 100.0;
|
||||
auto it = std::find_if(lista.begin(), lista.end(), [idNum](SensorCorrente* s) { return s->ID_Num == idNum; });
|
||||
if (conectar) {
|
||||
if (it == lista.end()) {
|
||||
SensorCorrente* sensor = new SensorCorrente(Mod_ID, "sCOR_" + String(idNum));
|
||||
sensor->ID_Num = idNum;
|
||||
sensor->_Endereco = endereco;
|
||||
sensor->_A_Shunt = aMax;
|
||||
sensor->Inicializar();
|
||||
lista.push_back(sensor);
|
||||
PrintTela("Sensor de corrente " + id + " inicializado no endereco " + _endereco);
|
||||
PrintTela("Sensor de corrente adicionado via CAN: sCOR_" + String(idNum));
|
||||
}
|
||||
} else {
|
||||
PrintTela("Configuração inválida para sensor de corrente: " + config);
|
||||
if (it != lista.end()) {
|
||||
SensorCorrente* sensor = *it;
|
||||
sensor->Desligar();
|
||||
delete sensor;
|
||||
lista.erase(it);
|
||||
PrintTela("Sensor de corrente removido via CAN: sCOR_" + String(idNum));
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
PrintTela("Configuração de sensor de corrente não encontrada.");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
class SensorFluxo {
|
||||
public:
|
||||
|
||||
static void InicializarLista(std::vector<SensorFluxo*>& lista, const String& parametros, const String& Mod_ID);
|
||||
static void ConfigurarSensor(std::vector<SensorFluxo*>& lista, std::vector<uint8_t>& data, const String& Mod_ID);
|
||||
|
||||
SensorFluxo(String _modID, String _id) {
|
||||
Mod_ID = _modID;
|
||||
|
|
@ -91,16 +91,22 @@ class SensorFluxo {
|
|||
}
|
||||
|
||||
|
||||
std::vector<uint8_t> MontarMensagemCAN() {
|
||||
std::vector<uint8_t> MontarMensagemCAN(CanMessagePosicaoDados posicao) {
|
||||
std::vector<uint8_t> data;
|
||||
|
||||
data.push_back(ID_Num); // Byte 0 - ID do sensor
|
||||
data.push_back(Iniciado ? 1 : 0); // Byte 1 - Status
|
||||
|
||||
uint16_t vazaoEscalada = (uint16_t)(_Vazao * 100);
|
||||
data.push_back(vazaoEscalada >> 8);
|
||||
data.push_back(vazaoEscalada & 0xFF);
|
||||
|
||||
data.push_back(ID_Num);
|
||||
data.push_back(static_cast<uint8_t>(posicao));
|
||||
switch (posicao) {
|
||||
case CanMessagePosicaoDados::Status: {
|
||||
data.push_back(Iniciado ? 1 : 0);
|
||||
break;
|
||||
}
|
||||
case CanMessagePosicaoDados::Dados1: {
|
||||
uint16_t vazaoEscalada = (uint16_t)(_Vazao * 100);
|
||||
data.push_back(vazaoEscalada >> 8);
|
||||
data.push_back(vazaoEscalada & 0xFF);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
|
|
@ -148,48 +154,36 @@ class SensorFluxo {
|
|||
|
||||
};
|
||||
|
||||
|
||||
// Função para inicializar os sensores de fluxo com IDs e pinos específicos
|
||||
void SensorFluxo::InicializarLista(std::vector<SensorFluxo*>& lista, const String& parametros, const String& Mod_ID) {
|
||||
// Verifica se há sensores já na lista
|
||||
if (!lista.empty()) {
|
||||
PrintTela("Limpando lista de sensores de fluxo existente...");
|
||||
|
||||
for (auto* sensor : lista) {
|
||||
sensor->Desligar(); // Desliga cada sensor antes de remover
|
||||
PrintTela("Sensor de Fluxo " + sensor->_ID + " desligado.");
|
||||
delete sensor;
|
||||
}
|
||||
|
||||
lista.clear(); // Limpa a lista após desligar todos os itens
|
||||
}
|
||||
|
||||
if (parametros.length() > 0) {
|
||||
std::vector<String> _config = SplitString(parametros, SplitConfig); // Divide a configuração por vírgulas
|
||||
|
||||
for (const String& config : _config) {
|
||||
std::vector<String> partes = SplitString(config, SplitSubParams); // Divide cada configuração pelo '-'
|
||||
|
||||
if (partes.size() == 4) {
|
||||
String id = partes[0];
|
||||
bool conectar = partes[1] == "1";
|
||||
TiposBarramentos pinoB = (TiposBarramentos)partes[2].toInt();
|
||||
int pino = partes[3].toInt();
|
||||
|
||||
if (conectar) {
|
||||
SensorFluxo* sensor = new SensorFluxo(Mod_ID, id);
|
||||
sensor->_pino = PinoModel(pino, pinoB, _INPUT, DIGITAL);
|
||||
void SensorFluxo::ConfigurarSensor(std::vector<SensorFluxo*>& lista, std::vector<uint8_t>& data, const String& Mod_ID) {
|
||||
if (data.size() < 7) return;
|
||||
uint8_t idNum = data[1];
|
||||
CanMessagePosicaoDados posicao = (CanMessagePosicaoDados)data[2];
|
||||
switch (posicao) {
|
||||
case CanMessagePosicaoDados::Config1: {
|
||||
bool conectar = data[4] == 1;
|
||||
TiposBarramentos tipoBarramento = (TiposBarramentos)data[5];
|
||||
int pino = data[6];
|
||||
auto it = std::find_if(lista.begin(), lista.end(), [idNum](SensorFluxo* s) { return s->ID_Num == idNum; });
|
||||
if (conectar) {
|
||||
if (it == lista.end()) {
|
||||
SensorFluxo* sensor = new SensorFluxo(Mod_ID, "sFLX_" + String(idNum));
|
||||
sensor->ID_Num = idNum;
|
||||
sensor->_pino = PinoModel(pino, tipoBarramento, _INPUT, DIGITAL);
|
||||
sensor->Inicializar();
|
||||
|
||||
lista.push_back(sensor);
|
||||
PrintTela("Sensor de fluxo " + id + " inicializado no pino " + String(pino));
|
||||
}
|
||||
PrintTela("Sensor de Fluxo adicionado via CAN: sFLX_" + String(idNum));
|
||||
}
|
||||
} else {
|
||||
PrintTela("Configuração inválida para sensor de fluxo: " + config);
|
||||
if (it != lista.end()) {
|
||||
SensorFluxo* sensor = *it;
|
||||
sensor->Desligar();
|
||||
delete sensor;
|
||||
lista.erase(it);
|
||||
PrintTela("Sensor de Fluxo removido via CAN: sFLX_" + String(idNum));
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
PrintTela("Configuração de sensor de fluxo não encontrada.");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,136 @@
|
|||
#ifndef SensorIMUModel
|
||||
#define SensorIMUModel
|
||||
|
||||
#include <MPU9250_WE.h>
|
||||
#include <Adafruit_BMP280.h>
|
||||
#include <Wire.h>
|
||||
#include "SerialService.h"
|
||||
#include "Pinout.h"
|
||||
|
||||
class SensorIMU {
|
||||
public:
|
||||
String Mod_ID;
|
||||
String _ID;
|
||||
int ID_Num;
|
||||
bool Iniciado = false;
|
||||
|
||||
// Endereços I2C
|
||||
#define MPU_ADDR 0x68
|
||||
#define BMP_ADDR 0x76
|
||||
|
||||
// MPU9250 (IMU 9 eixos)
|
||||
MPU9250_WE mpu = MPU9250_WE(MPU_ADDR);
|
||||
|
||||
// BMP280 (Temperatura, Pressão, Altitude)
|
||||
Adafruit_BMP280 bmp;
|
||||
|
||||
// Leituras principais
|
||||
float AccX = 0, AccY = 0, AccZ = 0;
|
||||
float GyroX = 0, GyroY = 0, GyroZ = 0;
|
||||
float MagX = 0, MagY = 0, MagZ = 0;
|
||||
float Temp = 0;
|
||||
float Pressao = 0;
|
||||
float Altitude = 0;
|
||||
|
||||
SensorIMU(String _modID, String _id) {
|
||||
Mod_ID = _modID;
|
||||
_ID = _id;
|
||||
}
|
||||
|
||||
void Inicializar() {
|
||||
if (Iniciado) {
|
||||
PrintTela(_ID + " ja inicializado");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!mpu.init()) {
|
||||
PrintTela("MPU9250 nao encontrado no endereco " + String(MPU_ADDR));
|
||||
Iniciado = false;
|
||||
return;
|
||||
}
|
||||
|
||||
mpu.autoOffsets();
|
||||
mpu.setSampleRateDivider(5);
|
||||
mpu.setAccRange(MPU9250_ACC_RANGE_2G);
|
||||
mpu.enableAccDLPF(true);
|
||||
mpu.setAccDLPF(MPU9250_DLPF_6);
|
||||
|
||||
if (!bmp.begin(BMP_ADDR)) {
|
||||
PrintTela("BMP280 nao encontrado no endereco " + String(BMP_ADDR));
|
||||
Iniciado = false;
|
||||
return;
|
||||
}
|
||||
|
||||
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,
|
||||
Adafruit_BMP280::SAMPLING_X2,
|
||||
Adafruit_BMP280::SAMPLING_X16,
|
||||
Adafruit_BMP280::FILTER_X16,
|
||||
Adafruit_BMP280::STANDBY_MS_500);
|
||||
|
||||
Iniciado = true;
|
||||
PrintTela(_ID + " iniciado");
|
||||
}
|
||||
|
||||
void Desligar() {
|
||||
if (!Iniciado) {
|
||||
PrintTela(_ID + " nao esta inicializado");
|
||||
return;
|
||||
}
|
||||
|
||||
PrintTela(_ID + " Desligado");
|
||||
|
||||
Iniciado = false;
|
||||
}
|
||||
|
||||
void RequisitarDados() {
|
||||
AferirDados();
|
||||
}
|
||||
|
||||
std::vector<uint8_t> MontarMensagemCAN() {
|
||||
std::vector<uint8_t> data;
|
||||
data.push_back(ID_Num); // Byte 0 - ID
|
||||
data.push_back(Iniciado ? 1 : 0); // Byte 1 - Status
|
||||
|
||||
// Exemplo com AccX, AccY, Temp, Pressao, Altitude
|
||||
int16_t accX_int = static_cast<int16_t>(AccX * 100);
|
||||
int16_t accY_int = static_cast<int16_t>(AccY * 100);
|
||||
int16_t temp_int = static_cast<int16_t>(Temp * 100);
|
||||
uint16_t pressao_int = static_cast<uint16_t>(Pressao / 10);
|
||||
int16_t alt_int = static_cast<int16_t>(Altitude * 10);
|
||||
|
||||
data.push_back(accX_int >> 8); data.push_back(accX_int & 0xFF);
|
||||
data.push_back(accY_int >> 8); data.push_back(accY_int & 0xFF);
|
||||
data.push_back(temp_int >> 8); data.push_back(temp_int & 0xFF);
|
||||
data.push_back(pressao_int >> 8); data.push_back(pressao_int & 0xFF);
|
||||
data.push_back(alt_int >> 8); data.push_back(alt_int & 0xFF);
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
private:
|
||||
void AferirDados() {
|
||||
if (!Iniciado) return;
|
||||
|
||||
xyzFloat acc = mpu.getGValues();
|
||||
xyzFloat gyr = mpu.getGyrValues();
|
||||
xyzFloat mag = mpu.getMagValues();
|
||||
|
||||
AccX = acc.x;
|
||||
AccY = acc.y;
|
||||
AccZ = acc.z;
|
||||
|
||||
GyroX = gyr.x;
|
||||
GyroY = gyr.y;
|
||||
GyroZ = gyr.z;
|
||||
|
||||
MagX = mag.x;
|
||||
MagY = mag.y;
|
||||
MagZ = mag.z;
|
||||
|
||||
Temp = bmp.readTemperature();
|
||||
Pressao = bmp.readPressure();
|
||||
Altitude = bmp.readAltitude();
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
@ -10,7 +10,7 @@
|
|||
class SensorMassa {
|
||||
public:
|
||||
|
||||
static void InicializarLista(std::vector<SensorMassa*>& lista, const String& parametros, const String& Mod_ID);
|
||||
static void ConfigurarSensor(std::vector<SensorMassa*>& lista, std::vector<uint8_t>& data, const String& Mod_ID);
|
||||
|
||||
SensorMassa(String _modID, String _id) {
|
||||
Mod_ID = _modID;
|
||||
|
|
@ -74,16 +74,22 @@ class SensorMassa {
|
|||
AferirMassa();
|
||||
}
|
||||
|
||||
std::vector<uint8_t> MontarMensagemCAN() {
|
||||
std::vector<uint8_t> MontarMensagemCAN(CanMessagePosicaoDados posicao) {
|
||||
std::vector<uint8_t> data;
|
||||
|
||||
data.push_back(ID_Num); // Byte 0 - ID do sensor
|
||||
data.push_back(Iniciado ? 1 : 0); // Byte 1 - Status
|
||||
|
||||
uint16_t massaEscalada = (uint16_t)(Massa * 100);
|
||||
data.push_back(massaEscalada >> 8);
|
||||
data.push_back(massaEscalada & 0xFF);
|
||||
|
||||
data.push_back(ID_Num);
|
||||
data.push_back(static_cast<uint8_t>(posicao));
|
||||
switch (posicao) {
|
||||
case CanMessagePosicaoDados::Status: {
|
||||
data.push_back(Iniciado ? 1 : 0);
|
||||
break;
|
||||
}
|
||||
case CanMessagePosicaoDados::Dados1: {
|
||||
uint16_t massaEscalada = (uint16_t)(Massa * 100);
|
||||
data.push_back(massaEscalada >> 8);
|
||||
data.push_back(massaEscalada & 0xFF);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
|
|
@ -111,50 +117,40 @@ class SensorMassa {
|
|||
};
|
||||
|
||||
|
||||
// Função para inicializar os sensores de massa com IDs e pinos específicos
|
||||
void SensorMassa::InicializarLista(std::vector<SensorMassa*>& lista, const String& parametros, const String& Mod_ID) {
|
||||
// Verifica se há sensores já na lista
|
||||
if (!lista.empty()) {
|
||||
PrintTela("Limpando lista de sensores de massa existente...");
|
||||
|
||||
for (auto* sensor : lista) {
|
||||
sensor->Desligar(); // Desliga cada sensor antes de remover
|
||||
PrintTela("Sensor de Massa " + sensor->_ID + " desligado.");
|
||||
delete sensor;
|
||||
}
|
||||
|
||||
lista.clear(); // Limpa a lista após desligar todos os itens
|
||||
}
|
||||
|
||||
if (parametros.length() > 0) {
|
||||
std::vector<String> _config = SplitString(parametros, SplitConfig); // Divide a configuração por vírgulas
|
||||
|
||||
for (const String& config : _config) {
|
||||
std::vector<String> partes = SplitString(config, SplitSubParams); // Divide cada configuração pelo '-'
|
||||
|
||||
if (partes.size() == 6) {
|
||||
String id = partes[0];
|
||||
bool conectar = partes[1] == "1";
|
||||
TiposBarramentos pinoDtB = (TiposBarramentos)partes[2].toInt();
|
||||
int pinoDt = partes[3].toInt();
|
||||
TiposBarramentos pinoSckB = (TiposBarramentos)partes[4].toInt();
|
||||
int pinoSck = partes[5].toInt();
|
||||
|
||||
if (conectar) {
|
||||
SensorMassa* sensor = new SensorMassa(Mod_ID, id);
|
||||
sensor->_pinoDT = PinoModel(pinoDt, pinoDtB, _INPUT, DIGITAL);
|
||||
sensor->_pinoSCK = PinoModel(pinoSck, pinoSckB, _OUTPUT);
|
||||
void SensorMassa::ConfigurarSensor(std::vector<SensorMassa*>& lista, std::vector<uint8_t>& data, const String& Mod_ID) {
|
||||
if (data.size() < 7) return;
|
||||
uint8_t idNum = data[1];
|
||||
CanMessagePosicaoDados posicao = (CanMessagePosicaoDados)data[2];
|
||||
switch (posicao) {
|
||||
case CanMessagePosicaoDados::Config1: {
|
||||
bool conectar = data[4] == 1;
|
||||
int pinoDt = data[5];
|
||||
int pinoSck = data[5];
|
||||
//uint16_t offsetInt = ((uint16_t)data[6] << 8) | data[7];
|
||||
//float offset = offsetInt / 100.0;
|
||||
auto it = std::find_if(lista.begin(), lista.end(), [idNum](SensorMassa* s) { return s->ID_Num == idNum; });
|
||||
if (conectar) {
|
||||
if (it == lista.end()) {
|
||||
SensorMassa* sensor = new SensorMassa(Mod_ID, "sMAS_" + String(idNum));
|
||||
sensor->ID_Num = idNum;
|
||||
sensor->_pinoDT = PinoModel(pinoDt, CONTROLADOR, _INPUT, DIGITAL);
|
||||
sensor->_pinoSCK = PinoModel(pinoSck, CONTROLADOR, _OUTPUT);
|
||||
//sensor->_Offset = offset;
|
||||
sensor->Inicializar();
|
||||
|
||||
lista.push_back(sensor);
|
||||
PrintTela("Sensor de massa " + id + " inicializado nos pinos " + String(pinoDt) + " e " + String(pinoSck));
|
||||
}
|
||||
PrintTela("Sensor de Massa adicionado via CAN: sMAS_" + String(idNum));
|
||||
}
|
||||
} else {
|
||||
PrintTela("Configuração inválida para sensor de massa: " + config);
|
||||
if (it != lista.end()) {
|
||||
SensorMassa* sensor = *it;
|
||||
sensor->Desligar();
|
||||
delete sensor;
|
||||
lista.erase(it);
|
||||
PrintTela("Sensor de Massa removido via CAN: sMAS_" + String(idNum));
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
PrintTela("Configuração de sensor de massa não encontrada.");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@
|
|||
class SensorPressao {
|
||||
public:
|
||||
|
||||
static void InicializarLista(std::vector<SensorPressao*>& lista, const String& parametros, const String& Mod_ID);
|
||||
static void ConfigurarSensor(std::vector<SensorPressao*>& lista, std::vector<uint8_t>& data, const String& Mod_ID);
|
||||
|
||||
SensorPressao(String _modID, String _id) {
|
||||
Mod_ID = _modID;
|
||||
|
|
@ -70,16 +70,22 @@ class SensorPressao {
|
|||
AferirPressao();
|
||||
}
|
||||
|
||||
std::vector<uint8_t> MontarMensagemCAN() {
|
||||
std::vector<uint8_t> MontarMensagemCAN(CanMessagePosicaoDados posicao) {
|
||||
std::vector<uint8_t> data;
|
||||
|
||||
data.push_back(ID_Num); // Byte 0 - ID do sensor
|
||||
data.push_back(Iniciado ? 1 : 0); // Byte 1 - Status
|
||||
|
||||
uint16_t pressaoEscalada = (uint16_t)(Pressao * 100);
|
||||
data.push_back(pressaoEscalada >> 8);
|
||||
data.push_back(pressaoEscalada & 0xFF);
|
||||
|
||||
data.push_back(ID_Num);
|
||||
data.push_back(static_cast<uint8_t>(posicao));
|
||||
switch (posicao) {
|
||||
case CanMessagePosicaoDados::Status: {
|
||||
data.push_back(Iniciado ? 1 : 0);
|
||||
break;
|
||||
}
|
||||
case CanMessagePosicaoDados::Dados1: {
|
||||
uint16_t pressaoEscalada = (uint16_t)(Pressao * 100);
|
||||
data.push_back(pressaoEscalada >> 8);
|
||||
data.push_back(pressaoEscalada & 0xFF);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
|
|
@ -99,53 +105,36 @@ class SensorPressao {
|
|||
};
|
||||
|
||||
|
||||
// Função para inicializar os sensores de pressao com IDs e pinos específicos
|
||||
void SensorPressao::InicializarLista(std::vector<SensorPressao*>& lista, const String& parametros, const String& Mod_ID) {
|
||||
// Verifica se há sensores já na lista
|
||||
if (!lista.empty()) {
|
||||
PrintTela("Limpando lista de sensores de pressao existente...");
|
||||
|
||||
for (auto* sensor : lista) {
|
||||
sensor->Desligar(); // Desliga cada sensor antes de remover
|
||||
PrintTela("Sensor de Pressao " + sensor->_ID + " desligado.");
|
||||
delete sensor;
|
||||
}
|
||||
|
||||
lista.clear(); // Limpa a lista após desligar todos os itens
|
||||
}
|
||||
|
||||
if (parametros.length() > 0) {
|
||||
std::vector<String> _config = SplitString(parametros, SplitConfig); // Divide a configuração por vírgulas
|
||||
|
||||
for (const String& config : _config) {
|
||||
std::vector<String> partes = SplitString(config, SplitSubParams); // Divide cada configuração pelo '-'
|
||||
|
||||
if (partes.size() == 7) {
|
||||
String id = partes[0];
|
||||
bool conectar = partes[1] == "1";
|
||||
TiposBarramentos pinoB = (TiposBarramentos)partes[2].toInt();
|
||||
int pino = partes[3].toInt();
|
||||
double Vmin = partes[4].toDouble();
|
||||
double Vmax = partes[5].toDouble();
|
||||
double Pmax = partes[6].toDouble();
|
||||
|
||||
if (conectar) {
|
||||
SensorPressao* sensor = new SensorPressao(Mod_ID, id);
|
||||
sensor->_Vmin = Vmin;
|
||||
sensor->_Vmax = Vmax;
|
||||
sensor->_Pmax = Pmax;
|
||||
sensor->_pino = PinoModel(pino, pinoB, _INPUT, ANALOGICO);
|
||||
void SensorPressao::ConfigurarSensor(std::vector<SensorPressao*>& lista, std::vector<uint8_t>& data, const String& Mod_ID) {
|
||||
if (data.size() < 7) return;
|
||||
uint8_t idNum = data[1];
|
||||
CanMessagePosicaoDados posicao = (CanMessagePosicaoDados)data[2];
|
||||
switch (posicao) {
|
||||
case CanMessagePosicaoDados::Config1: {
|
||||
bool conectar = data[4] == 1;
|
||||
TiposBarramentos tipoBarramento = (TiposBarramentos)data[5];
|
||||
int pino = data[6];
|
||||
auto it = std::find_if(lista.begin(), lista.end(), [idNum](SensorPressao* s) { return s->ID_Num == idNum; });
|
||||
if (conectar) {
|
||||
if (it == lista.end()) {
|
||||
SensorPressao* sensor = new SensorPressao(Mod_ID, "sPRS_" + String(idNum));
|
||||
sensor->ID_Num = idNum;
|
||||
sensor->_pino = PinoModel(pino, tipoBarramento, _INPUT, ANALOGICO);
|
||||
sensor->Inicializar();
|
||||
|
||||
lista.push_back(sensor);
|
||||
PrintTela("Sensor de pressao " + id + " inicializado no pino " + String(pino));
|
||||
}
|
||||
PrintTela("Sensor de Pressao adicionado via CAN: sPRS_" + String(idNum));
|
||||
}
|
||||
} else {
|
||||
PrintTela("Configuração inválida para sensor de pressao: " + config);
|
||||
if (it != lista.end()) {
|
||||
SensorPressao* sensor = *it;
|
||||
sensor->Desligar();
|
||||
delete sensor;
|
||||
lista.erase(it);
|
||||
PrintTela("Sensor de Pressao removido via CAN: sPRS_" + String(idNum));
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
PrintTela("Configuração de sensor de pressao não encontrada.");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@
|
|||
class SensorTemperatura {
|
||||
public:
|
||||
|
||||
static void InicializarLista(std::vector<SensorTemperatura*>& lista, const String& parametros, const String& Mod_ID);
|
||||
static void ConfigurarSensor(std::vector<SensorTemperatura*>& lista, std::vector<uint8_t>& data, const String& Mod_ID);
|
||||
|
||||
SensorTemperatura(String _modID, String _id) {
|
||||
Mod_ID = _modID;
|
||||
|
|
@ -75,17 +75,22 @@ class SensorTemperatura {
|
|||
AferirTemperatura();
|
||||
}
|
||||
|
||||
std::vector<uint8_t> MontarMensagemCAN() {
|
||||
std::vector<uint8_t> MontarMensagemCAN(CanMessagePosicaoDados posicao) {
|
||||
std::vector<uint8_t> data;
|
||||
|
||||
data.push_back(ID_Num); // Byte 0 - ID do sensor
|
||||
data.push_back(Iniciado ? 1 : 0); // Byte 1 - Status
|
||||
|
||||
int16_t leituraInt = static_cast<int16_t>(round(temperatura * 100.0f)); // duas casas, com sinal
|
||||
|
||||
data.push_back((uint8_t)(leituraInt >> 8)); // Byte 2 - parte alta
|
||||
data.push_back((uint8_t)(leituraInt & 0xFF)); // Byte 3 - parte baixa
|
||||
|
||||
data.push_back(ID_Num);
|
||||
data.push_back(static_cast<uint8_t>(posicao));
|
||||
switch (posicao) {
|
||||
case CanMessagePosicaoDados::Status: {
|
||||
data.push_back(Iniciado ? 1 : 0);
|
||||
break;
|
||||
}
|
||||
case CanMessagePosicaoDados::Dados1: {
|
||||
int16_t leituraInt = static_cast<int16_t>(round(temperatura * 100.0f));
|
||||
data.push_back((uint8_t)(leituraInt >> 8));
|
||||
data.push_back((uint8_t)(leituraInt & 0xFF));
|
||||
break;
|
||||
}
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
|
|
@ -115,47 +120,38 @@ class SensorTemperatura {
|
|||
}
|
||||
};
|
||||
|
||||
// Função para inicializar os sensores de temperatura com IDs e pinos específicos
|
||||
void SensorTemperatura::InicializarLista(std::vector<SensorTemperatura*>& lista, const String& parametros, const String& Mod_ID) {
|
||||
// Verifica se há sensores já na lista
|
||||
if (!lista.empty()) {
|
||||
PrintTela("Limpando lista de sensores de temperatura existente...");
|
||||
|
||||
for (auto* sensor : lista) {
|
||||
sensor->Desligar(); // Desliga cada sensor antes de remover
|
||||
PrintTela("Sensor de Temperatura " + sensor->_ID + " desligado.");
|
||||
delete sensor;
|
||||
}
|
||||
|
||||
lista.clear(); // Limpa a lista após desligar todos os itens
|
||||
}
|
||||
|
||||
if (parametros.length() > 0) {
|
||||
std::vector<String> _config = SplitString(parametros, SplitConfig); // Divide a configuração por vírgulas
|
||||
|
||||
for (const String& config : _config) {
|
||||
std::vector<String> partes = SplitString(config, SplitSubParams); // Divide cada configuração pelo '-'
|
||||
|
||||
if (partes.size() >= 4) {
|
||||
String id = partes[0];
|
||||
bool conectar = partes[1] == "1";
|
||||
TiposBarramentos pinoB = (TiposBarramentos)partes[2].toInt();
|
||||
int pino = partes[3].toInt();
|
||||
|
||||
if (conectar) {
|
||||
SensorTemperatura* sensor = new SensorTemperatura(Mod_ID, id);
|
||||
sensor->ID_Num = lista.size();
|
||||
sensor->_pino = PinoModel(pino, pinoB, _INPUT, ANALOGICO);
|
||||
void SensorTemperatura::ConfigurarSensor(std::vector<SensorTemperatura*>& lista, std::vector<uint8_t>& data, const String& Mod_ID) {
|
||||
if (data.size() < 7) return;
|
||||
uint8_t idNum = data[1];
|
||||
CanMessagePosicaoDados posicao = (CanMessagePosicaoDados)data[2];
|
||||
switch (posicao) {
|
||||
case CanMessagePosicaoDados::Config1: {
|
||||
bool conectar = data[4] == 1;
|
||||
TiposBarramentos tipoBarramento = (TiposBarramentos)data[5];
|
||||
int pino = data[6];
|
||||
// Verifica se sensor já existe
|
||||
auto it = std::find_if(lista.begin(), lista.end(), [idNum](SensorTemperatura* s) { return s->ID_Num == idNum; });
|
||||
if (conectar) {
|
||||
if (it == lista.end()) {
|
||||
SensorTemperatura* sensor = new SensorTemperatura(Mod_ID, "sTMP_" + String(idNum));
|
||||
sensor->ID_Num = idNum;
|
||||
sensor->_pino = PinoModel(pino, tipoBarramento, _INPUT, ANALOGICO);
|
||||
sensor->Inicializar();
|
||||
lista.push_back(sensor);
|
||||
PrintTela("Sensor de temperatura " + id + " inicializado no pino " + String(pino));
|
||||
PrintTela("Sensor de temperatura adicionado via CAN: sTMP_" + String(idNum));
|
||||
}
|
||||
} else {
|
||||
PrintTela("Configuração inválida para sensor de temperatura: " + config);
|
||||
// Desconectar sensor
|
||||
if (it != lista.end()) {
|
||||
SensorTemperatura* sensor = *it;
|
||||
sensor->Desligar();
|
||||
delete sensor;
|
||||
lista.erase(it);
|
||||
PrintTela("Sensor de temperatura removido via CAN: sTMP_" + String(idNum));
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
PrintTela("Configuração de sensor de temperatura não encontrada.");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -9,7 +9,8 @@
|
|||
class ServoFreio {
|
||||
public:
|
||||
|
||||
static void InicializarLista(std::vector<ServoFreio*>& lista, const String& parametros, const String& Mod_ID);
|
||||
static void ConfigurarServo(std::vector<ServoFreio*>& lista, std::vector<uint8_t>& data, const String& Mod_ID);
|
||||
static void ComandarServo(std::vector<ServoFreio*>& lista, std::vector<uint8_t>& data, uint8_t& id);
|
||||
|
||||
ServoFreio(String _modID, String _id) {
|
||||
Mod_ID = _modID;
|
||||
|
|
@ -76,60 +77,68 @@ class ServoFreio {
|
|||
|
||||
}
|
||||
|
||||
std::vector<uint8_t> MontarMensagemCAN() {
|
||||
std::vector<uint8_t> MontarMensagemCAN(CanMessagePosicaoDados posicao) {
|
||||
std::vector<uint8_t> data;
|
||||
data.push_back(ID_Num);
|
||||
data.push_back(Iniciado ? 1 : 0);
|
||||
data.push_back((uint8_t)(_Angulo & 0xFF)); // 0 a 180
|
||||
data.push_back(static_cast<uint8_t>(posicao));
|
||||
switch (posicao) {
|
||||
case CanMessagePosicaoDados::Status: {
|
||||
data.push_back(Iniciado ? 1 : 0);
|
||||
break;
|
||||
}
|
||||
case CanMessagePosicaoDados::Dados1: {
|
||||
data.push_back((uint8_t)(_Angulo & 0xFF)); // 0 a 180
|
||||
break;
|
||||
}
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// Função para inicializar os servo freios com IDs e pinos específicos
|
||||
void ServoFreio::InicializarLista(std::vector<ServoFreio*>& lista, const String& parametros, const String& Mod_ID) {
|
||||
// Verifica se há sensores já na lista
|
||||
if (!lista.empty()) {
|
||||
PrintTela("Limpando lista de servo freios existente...");
|
||||
|
||||
for (auto* sensor : lista) {
|
||||
sensor->Desligar(); // Desliga cada sensor antes de remover
|
||||
PrintTela("Servo Freio " + sensor->_ID + " desligado.");
|
||||
delete sensor;
|
||||
}
|
||||
|
||||
lista.clear(); // Limpa a lista após desligar todos os itens
|
||||
}
|
||||
|
||||
if (parametros.length() > 0) {
|
||||
std::vector<String> _config = SplitString(parametros, SplitConfig); // Divide a configuração por vírgulas
|
||||
|
||||
for (const String& config : _config) {
|
||||
std::vector<String> partes = SplitString(config, SplitSubParams); // Divide cada configuração pelo '-'
|
||||
|
||||
if (partes.size() == 5) {
|
||||
String id = partes[0];
|
||||
bool conectar = partes[1] == "1";
|
||||
bool inc = partes[2] == "1";
|
||||
TiposBarramentos pinoB = (TiposBarramentos)partes[3].toInt();
|
||||
int pino = partes[4].toInt();
|
||||
|
||||
if (conectar) {
|
||||
ServoFreio* sensor = new ServoFreio(Mod_ID, id);
|
||||
sensor->ID_Num = lista.size();
|
||||
sensor->Incremental = inc;
|
||||
sensor->_pino = PinoModel(pino, pinoB, _OUTPUT);
|
||||
void ServoFreio::ConfigurarServo(std::vector<ServoFreio*>& lista, std::vector<uint8_t>& data, const String& Mod_ID) {
|
||||
if (data.size() < 8) return;
|
||||
uint8_t idNum = data[1];
|
||||
CanMessagePosicaoDados posicao = (CanMessagePosicaoDados)data[2];
|
||||
switch (posicao) {
|
||||
case CanMessagePosicaoDados::Config1: {
|
||||
bool conectar = data[4] == 1;
|
||||
bool incremental = data[5] == 1;
|
||||
TiposBarramentos tipoBarramento = (TiposBarramentos)data[6];
|
||||
int pino = data[7];
|
||||
auto it = std::find_if(lista.begin(), lista.end(), [idNum](ServoFreio* s) { return s->ID_Num == idNum; });
|
||||
if (conectar) {
|
||||
if (it == lista.end()) {
|
||||
ServoFreio* sensor = new ServoFreio(Mod_ID, "sFRO_" + String(idNum));
|
||||
sensor->ID_Num = idNum;
|
||||
sensor->Incremental = incremental;
|
||||
sensor->_pino = PinoModel(pino, tipoBarramento, _OUTPUT);
|
||||
sensor->Inicializar();
|
||||
lista.push_back(sensor);
|
||||
PrintTela("Servo Freio " + id + " inicializado no pino " + String(pino));
|
||||
PrintTela("Servo Freio adicionado via CAN: sFRO_" + String(idNum));
|
||||
}
|
||||
} else {
|
||||
PrintTela("Configuração inválida para servo freio: " + config);
|
||||
if (it != lista.end()) {
|
||||
ServoFreio* sensor = *it;
|
||||
sensor->Desligar();
|
||||
delete sensor;
|
||||
lista.erase(it);
|
||||
PrintTela("Servo Freio removido via CAN: sFRO_" + String(idNum));
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ServoFreio::ComandarServo(std::vector<ServoFreio*>& lista, std::vector<uint8_t>& data, uint8_t& id) {
|
||||
if (data.size() < 4) return;
|
||||
for (auto* _freio : lista) {
|
||||
if (_freio->ID_Num == id) {
|
||||
_freio->AtualizarAngulo(data[3]);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
PrintTela("Configuração de servo freio não encontrada.");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -8,7 +8,8 @@
|
|||
class Sinaleiro {
|
||||
public:
|
||||
|
||||
static void InicializarLista(std::vector<Sinaleiro*>& lista, const String& parametros, const String& Mod_ID);
|
||||
static void ConfigurarSinaleiro(std::vector<Sinaleiro*>& lista, std::vector<uint8_t>& data, const String& Mod_ID);
|
||||
static void ComandarSinaleiro(std::vector<Sinaleiro*>& lista, std::vector<uint8_t>& data, uint8_t& id);
|
||||
|
||||
Sinaleiro(String _modID, String _id, int _taxaAmostragem = 2000) {
|
||||
Mod_ID = _modID;
|
||||
|
|
@ -74,12 +75,21 @@ class Sinaleiro {
|
|||
AtualizarLeitura();
|
||||
}
|
||||
|
||||
std::vector<uint8_t> MontarMensagemCAN() {
|
||||
std::vector<uint8_t> MontarMensagemCAN(CanMessagePosicaoDados posicao) {
|
||||
std::vector<uint8_t> data;
|
||||
data.push_back(ID_Num);
|
||||
data.push_back(Iniciado ? 1 : 0);
|
||||
data.push_back(_StatusLeitura);
|
||||
data.push_back(_Status);
|
||||
data.push_back(static_cast<uint8_t>(posicao));
|
||||
switch (posicao) {
|
||||
case CanMessagePosicaoDados::Status: {
|
||||
data.push_back(Iniciado ? 1 : 0);
|
||||
break;
|
||||
}
|
||||
case CanMessagePosicaoDados::Dados1: {
|
||||
data.push_back(_StatusLeitura);
|
||||
data.push_back(_Status);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
|
|
@ -133,47 +143,49 @@ class Sinaleiro {
|
|||
};
|
||||
|
||||
|
||||
// Função para inicializar os sinaleiros com IDs e pinos específicos
|
||||
void Sinaleiro::InicializarLista(std::vector<Sinaleiro*>& lista, const String& parametros, const String& Mod_ID) {
|
||||
// Verifica se há sensores já na lista
|
||||
if (!lista.empty()) {
|
||||
PrintTela("Limpando lista de sinaleiros existente...");
|
||||
|
||||
for (auto* sensor : lista) {
|
||||
sensor->Desligar(); // Desliga cada sensor antes de remover
|
||||
PrintTela("Sinaleiro " + sensor->_ID + " desligado.");
|
||||
delete sensor;
|
||||
}
|
||||
|
||||
lista.clear(); // Limpa a lista após desligar todos os itens
|
||||
}
|
||||
|
||||
if (parametros.length() > 0) {
|
||||
std::vector<String> _config = SplitString(parametros, SplitConfig); // Divide a configuração por vírgulas
|
||||
|
||||
for (const String& config : _config) {
|
||||
std::vector<String> partes = SplitString(config, SplitSubParams); // Divide cada configuração pelo '-'
|
||||
|
||||
if (partes.size() == 4) {
|
||||
String id = partes[0];
|
||||
bool conectar = partes[1] == "1";
|
||||
TiposBarramentos pinoB = (TiposBarramentos)partes[2].toInt();
|
||||
int pino = partes[3].toInt();
|
||||
|
||||
if (conectar) {
|
||||
Sinaleiro* sensor = new Sinaleiro(Mod_ID, id);
|
||||
sensor->ID_Num = lista.size();
|
||||
sensor->_pino = PinoModel(pino, pinoB, _OUTPUT);
|
||||
void Sinaleiro::ConfigurarSinaleiro(std::vector<Sinaleiro*>& lista, std::vector<uint8_t>& data, const String& Mod_ID) {
|
||||
if (data.size() < 7) return;
|
||||
uint8_t idNum = data[1];
|
||||
CanMessagePosicaoDados posicao = (CanMessagePosicaoDados)data[2];
|
||||
switch (posicao) {
|
||||
case CanMessagePosicaoDados::Config1: {
|
||||
bool conectar = data[4] == 1;
|
||||
TiposBarramentos tipoBarramento = (TiposBarramentos)data[5];
|
||||
int pino = data[6];
|
||||
auto it = std::find_if(lista.begin(), lista.end(), [idNum](Sinaleiro* s) { return s->ID_Num == idNum; });
|
||||
if (conectar) {
|
||||
if (it == lista.end()) {
|
||||
Sinaleiro* sensor = new Sinaleiro(Mod_ID, "sLED_" + String(idNum));
|
||||
sensor->ID_Num = idNum;
|
||||
sensor->_pino = PinoModel(pino, tipoBarramento, _OUTPUT);
|
||||
sensor->Inicializar();
|
||||
lista.push_back(sensor);
|
||||
PrintTela("Sinaleiro " + id + " inicializado no pino " + String(pino));
|
||||
PrintTela("Sinaleiro adicionado via CAN: sLED_" + String(idNum));
|
||||
}
|
||||
} else {
|
||||
PrintTela("Configuração inválida para sinaleiro: " + config);
|
||||
if (it != lista.end()) {
|
||||
Sinaleiro* sensor = *it;
|
||||
sensor->Desligar();
|
||||
delete sensor;
|
||||
lista.erase(it);
|
||||
PrintTela("Sinaleiro removido via CAN: sLED_" + String(idNum));
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Sinaleiro::ComandarSinaleiro(std::vector<Sinaleiro*>& lista, std::vector<uint8_t>& data, uint8_t& id) {
|
||||
if (data.size() < 7) return;
|
||||
for (auto* _led : lista) {
|
||||
if (_led->ID_Num == id) {
|
||||
_led->_Status = (StatusLED)data[3];
|
||||
_led->_Qtd = data[4];
|
||||
_led->_TempoMs = (uint16_t)data[5] * 10;
|
||||
_led->_PausaMs = (uint16_t)data[6] * 10;
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
PrintTela("Configuração de sinaleiro não encontrada.");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -42,7 +42,6 @@ std::vector<SensorCorrente*> listaSensoresCorrente;
|
|||
std::vector<Sinaleiro*> listaSinaleiros;
|
||||
std::vector<Rele*> listaReles;
|
||||
std::vector<ServoFreio*> listaServoFreios;
|
||||
std::vector<SensorPotenciometro*> listaSensoresPotenciometros;
|
||||
|
||||
|
||||
void setup() {
|
||||
|
|
@ -99,50 +98,44 @@ void enviarDadosSensores() {
|
|||
for (auto* sensor : listaSensoresTemperatura) {
|
||||
if (sensor != nullptr) {
|
||||
sensor->RequisitarDados();
|
||||
EnviarDadosCAN(static_cast<uint8_t>(S_Code::sTMP), sensor->MontarMensagemCAN());
|
||||
EnviarDadosCAN(sensor->MontarMensagemCAN(CanMessagePosicaoDados::Dados1));
|
||||
}
|
||||
}
|
||||
|
||||
for (auto* sensor : listaSensoresCorrente) {
|
||||
if (sensor != nullptr) {
|
||||
sensor->RequisitarDados();
|
||||
EnviarDadosCAN(static_cast<uint8_t>(S_Code::sCOR), sensor->MontarMensagemCAN());
|
||||
EnviarDadosCAN(sensor->MontarMensagemCAN(CanMessagePosicaoDados::Dados1));
|
||||
}
|
||||
}
|
||||
|
||||
for (auto* sensor : listaSinaleiros) {
|
||||
if (sensor != nullptr) {
|
||||
sensor->RequisitarDados();
|
||||
EnviarDadosCAN(static_cast<uint8_t>(S_Code::sLED), sensor->MontarMensagemCAN());
|
||||
EnviarDadosCAN(sensor->MontarMensagemCAN(CanMessagePosicaoDados::Dados1));
|
||||
}
|
||||
}
|
||||
|
||||
for (auto* sensor : listaReles) {
|
||||
if (sensor != nullptr) {
|
||||
sensor->RequisitarDados();
|
||||
EnviarDadosCAN(static_cast<uint8_t>(S_Code::sRLE), sensor->MontarMensagemCAN());
|
||||
EnviarDadosCAN(sensor->MontarMensagemCAN(CanMessagePosicaoDados::Dados1));
|
||||
}
|
||||
}
|
||||
|
||||
for (auto* sensor : listaServoFreios) {
|
||||
if (sensor != nullptr) {
|
||||
sensor->RequisitarDados();
|
||||
EnviarDadosCAN(static_cast<uint8_t>(S_Code::sFRO), sensor->MontarMensagemCAN());
|
||||
EnviarDadosCAN(sensor->MontarMensagemCAN(CanMessagePosicaoDados::Dados1));
|
||||
}
|
||||
}
|
||||
|
||||
for (auto* sensor : listaSensoresPotenciometros) {
|
||||
if (sensor != nullptr) {
|
||||
sensor->AferirAngulo();
|
||||
EnviarDadosCAN(static_cast<uint8_t>(S_Code::sPOT), sensor->MontarMensagemCAN());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void EnviarDadosCAN(uint8_t f_code, std::vector<uint8_t> data) {
|
||||
canService.enviarMensagem(f_code, data);
|
||||
void EnviarDadosCAN(std::vector<uint8_t> data) {
|
||||
canService.enviarMensagem(data);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -162,7 +155,7 @@ void ProcessarFrameCAN(std::vector<uint8_t> data) {
|
|||
void ProcessarChk() {
|
||||
Verificando = true;
|
||||
std::vector<uint8_t> data = canService.MontarFrameChk(D_Code, Conectado, VERSION);
|
||||
EnviarDadosCAN(static_cast<uint8_t>(F_Code::ChkRx), data);
|
||||
EnviarDadosCAN(data);
|
||||
Verificando = false;
|
||||
}
|
||||
|
||||
|
|
@ -171,236 +164,85 @@ void ProcessarReq() {
|
|||
}
|
||||
|
||||
void ProcessarCfg(std::vector<uint8_t> data) {
|
||||
S_Code sensorTipo = (S_Code)data[1];
|
||||
|
||||
switch (sensorTipo) {
|
||||
if (data.size() < 4) return;
|
||||
uint8_t id = data[1];
|
||||
CanMessagePosicaoDados posicao = (CanMessagePosicaoDados)data[2];
|
||||
S_Code componente = (S_Code)data[3];
|
||||
switch (componente) {
|
||||
case sMOD: {
|
||||
if (data.size() < 7) return;
|
||||
bool conectar = data[2] == 1;
|
||||
int taxa = data[3] * 10;
|
||||
bool requisitar = data[4] == 1;
|
||||
int pinoSDA = data[5];
|
||||
int pinoSCL = data[6];
|
||||
|
||||
if (pinoSDA != PINO_INVALIDO && pinoSCL != PINO_INVALIDO) {
|
||||
_pinoSDA = PinoModel(pinoSDA, CONTROLADOR, _INPUT);
|
||||
_pinoSCL = PinoModel(pinoSCL, CONTROLADOR, _INPUT);
|
||||
|
||||
Wire.end();
|
||||
Wire.begin(_pinoSDA.num, _pinoSCL.num);
|
||||
|
||||
PrintTela("I2C inicializado nos pinos SDA=" + String(pinoSDA) + " e SCL=" + String(pinoSCL));
|
||||
switch (posicao) {
|
||||
case CanMessagePosicaoDados::Config1: {
|
||||
if (data.size() < 7) return;
|
||||
bool conectar = data[4] == 1;
|
||||
int taxa = data[5] * 10;
|
||||
bool requisitar = data[6] == 1;
|
||||
_TaxaAmostragem = taxa;
|
||||
RequisitarDados = requisitar;
|
||||
Conectado = conectar;
|
||||
break;
|
||||
}
|
||||
case CanMessagePosicaoDados::Config2: {
|
||||
if (data.size() < 6) return;
|
||||
int pinoSDA = data[4];
|
||||
int pinoSCL = data[5];
|
||||
if (pinoSDA != PINO_INVALIDO && pinoSCL != PINO_INVALIDO) {
|
||||
_pinoSDA = PinoModel(pinoSDA, CONTROLADOR, _INPUT);
|
||||
_pinoSCL = PinoModel(pinoSCL, CONTROLADOR, _INPUT);
|
||||
Wire.end();
|
||||
Wire.begin(_pinoSDA.num, _pinoSCL.num);
|
||||
PrintTela("I2C inicializado nos pinos SDA=" + String(pinoSDA) + " e SCL=" + String(pinoSCL));
|
||||
}
|
||||
vTaskDelay(pdMS_TO_TICKS(100));
|
||||
Verificando = false;
|
||||
ProcessarChk();
|
||||
LimparListasComponentes();
|
||||
PrintTela("Configuracao do modulo concluida");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
vTaskDelay(pdMS_TO_TICKS(100));
|
||||
_TaxaAmostragem = taxa;
|
||||
RequisitarDados = requisitar;
|
||||
Verificando = false;
|
||||
Conectado = conectar;
|
||||
|
||||
ProcessarChk();
|
||||
|
||||
LimparListasComponentes();
|
||||
|
||||
PrintTela("Configuracao do modulo concluida");
|
||||
|
||||
break;
|
||||
}
|
||||
case sTMP: {
|
||||
if (data.size() < 6) return;
|
||||
uint8_t idNum = data[2];
|
||||
bool conectar = data[3] == 1;
|
||||
TiposBarramentos tipoBarramento = (TiposBarramentos)data[4];
|
||||
int pino = data[5];
|
||||
// Verifica se sensor já existe
|
||||
auto it = std::find_if(listaSensoresTemperatura.begin(), listaSensoresTemperatura.end(),
|
||||
[idNum](SensorTemperatura* s) { return s->ID_Num == idNum; });
|
||||
if (conectar) {
|
||||
if (it == listaSensoresTemperatura.end()) {
|
||||
SensorTemperatura* sensor = new SensorTemperatura(Mod_ID, "sTMP_" + String(idNum));
|
||||
sensor->ID_Num = idNum;
|
||||
sensor->_pino = PinoModel(pino, tipoBarramento, _INPUT, ANALOGICO);
|
||||
sensor->Inicializar();
|
||||
listaSensoresTemperatura.push_back(sensor);
|
||||
PrintTela("Sensor de temperatura adicionado via CAN: sTMP_" + String(idNum));
|
||||
}
|
||||
} else {
|
||||
// Desconectar sensor
|
||||
if (it != listaSensoresTemperatura.end()) {
|
||||
SensorTemperatura* sensor = *it;
|
||||
sensor->Desligar();
|
||||
delete sensor;
|
||||
listaSensoresTemperatura.erase(it);
|
||||
PrintTela("Sensor de temperatura removido via CAN: sTMP_" + String(idNum));
|
||||
}
|
||||
}
|
||||
SensorTemperatura::ConfigurarSensor(listaSensoresTemperatura, data, Mod_ID);
|
||||
break;
|
||||
}
|
||||
case sCOR: {
|
||||
if (data.size() < 7) return;
|
||||
uint8_t idNum = data[2];
|
||||
bool conectar = data[3] == 1;
|
||||
uint8_t endereco = data[4];
|
||||
// _a_max vem como float*100 => uint16_t
|
||||
uint16_t aMaxInt = ((uint16_t)data[5] << 8) | data[6];
|
||||
float aMax = aMaxInt / 100.0;
|
||||
auto it = std::find_if(listaSensoresCorrente.begin(), listaSensoresCorrente.end(),
|
||||
[idNum](SensorCorrente* s) { return s->ID_Num == idNum; });
|
||||
if (conectar) {
|
||||
if (it == listaSensoresCorrente.end()) {
|
||||
SensorCorrente* sensor = new SensorCorrente(Mod_ID, "sCOR_" + String(idNum));
|
||||
sensor->ID_Num = idNum;
|
||||
sensor->_Endereco = endereco;
|
||||
sensor->_A_Shunt = aMax;
|
||||
sensor->Inicializar();
|
||||
listaSensoresCorrente.push_back(sensor);
|
||||
PrintTela("Sensor de corrente adicionado via CAN: sCOR_" + String(idNum));
|
||||
}
|
||||
} else {
|
||||
if (it != listaSensoresCorrente.end()) {
|
||||
SensorCorrente* sensor = *it;
|
||||
sensor->Desligar();
|
||||
delete sensor;
|
||||
listaSensoresCorrente.erase(it);
|
||||
PrintTela("Sensor de corrente removido via CAN: sCOR_" + String(idNum));
|
||||
}
|
||||
}
|
||||
SensorCorrente::ConfigurarSensor(listaSensoresCorrente, data, Mod_ID);
|
||||
break;
|
||||
}
|
||||
case sLED: {
|
||||
if (data.size() < 6) return;
|
||||
uint8_t idNum = data[2];
|
||||
bool conectar = data[3] == 1;
|
||||
TiposBarramentos tipoBarramento = (TiposBarramentos)data[4];
|
||||
int pino = data[5];
|
||||
auto it = std::find_if(listaSinaleiros.begin(), listaSinaleiros.end(),
|
||||
[idNum](Sinaleiro* s) { return s->ID_Num == idNum; });
|
||||
if (conectar) {
|
||||
if (it == listaSinaleiros.end()) {
|
||||
Sinaleiro* sensor = new Sinaleiro(Mod_ID, "sLED_" + String(idNum));
|
||||
sensor->ID_Num = idNum;
|
||||
sensor->_pino = PinoModel(pino, tipoBarramento, _OUTPUT);
|
||||
sensor->Inicializar();
|
||||
listaSinaleiros.push_back(sensor);
|
||||
PrintTela("Sinaleiro adicionado via CAN: sLED_" + String(idNum));
|
||||
}
|
||||
} else {
|
||||
if (it != listaSinaleiros.end()) {
|
||||
Sinaleiro* sensor = *it;
|
||||
sensor->Desligar();
|
||||
delete sensor;
|
||||
listaSinaleiros.erase(it);
|
||||
PrintTela("Sinaleiro removido via CAN: sLED_" + String(idNum));
|
||||
}
|
||||
}
|
||||
Sinaleiro::ConfigurarSinaleiro(listaSinaleiros, data, Mod_ID);
|
||||
break;
|
||||
}
|
||||
case sRLE: {
|
||||
if (data.size() < 7) return;
|
||||
uint8_t idNum = data[2];
|
||||
bool conectar = data[3] == 1;
|
||||
bool atuacaoNivelAlto = data[4] == 1;
|
||||
TiposBarramentos tipoBarramento = (TiposBarramentos)data[5];
|
||||
int pino = data[6];
|
||||
auto it = std::find_if(listaReles.begin(), listaReles.end(),
|
||||
[idNum](Rele* s) { return s->ID_Num == idNum; });
|
||||
if (conectar) {
|
||||
if (it == listaReles.end()) {
|
||||
Rele* sensor = new Rele(Mod_ID, "sRLE_" + String(idNum));
|
||||
sensor->ID_Num = idNum;
|
||||
sensor->_pino = PinoModel(pino, tipoBarramento, _OUTPUT);
|
||||
sensor->AtuacaoNivelAlto = atuacaoNivelAlto;
|
||||
sensor->Inicializar();
|
||||
listaReles.push_back(sensor);
|
||||
PrintTela("Rele adicionado via CAN: sRLE_" + String(idNum));
|
||||
}
|
||||
} else {
|
||||
if (it != listaReles.end()) {
|
||||
Rele* sensor = *it;
|
||||
sensor->Desligar();
|
||||
delete sensor;
|
||||
listaReles.erase(it);
|
||||
PrintTela("Rele removido via CAN: sRLE_" + String(idNum));
|
||||
}
|
||||
}
|
||||
Rele::ConfigurarRele(listaReles, data, Mod_ID);
|
||||
break;
|
||||
}
|
||||
case sFRO: {
|
||||
if (data.size() < 7) return;
|
||||
uint8_t idNum = data[2];
|
||||
bool conectar = data[3] == 1;
|
||||
bool incremental = data[4] == 1;
|
||||
TiposBarramentos tipoBarramento = (TiposBarramentos)data[5];
|
||||
int pino = data[6];
|
||||
auto it = std::find_if(listaServoFreios.begin(), listaServoFreios.end(),
|
||||
[idNum](ServoFreio* s) { return s->ID_Num == idNum; });
|
||||
if (conectar) {
|
||||
if (it == listaServoFreios.end()) {
|
||||
ServoFreio* sensor = new ServoFreio(Mod_ID, "sFRO_" + String(idNum));
|
||||
sensor->ID_Num = idNum;
|
||||
sensor->Incremental = incremental;
|
||||
sensor->_pino = PinoModel(pino, tipoBarramento, _OUTPUT);
|
||||
sensor->Inicializar();
|
||||
listaServoFreios.push_back(sensor);
|
||||
PrintTela("Servo Freio adicionado via CAN: sFRO_" + String(idNum));
|
||||
}
|
||||
} else {
|
||||
if (it != listaServoFreios.end()) {
|
||||
ServoFreio* sensor = *it;
|
||||
sensor->Desligar();
|
||||
delete sensor;
|
||||
listaServoFreios.erase(it);
|
||||
PrintTela("Servo Freio removido via CAN: sFRO_" + String(idNum));
|
||||
}
|
||||
}
|
||||
ServoFreio::ConfigurarServo(listaServoFreios, data, Mod_ID);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ProcessarCmd(std::vector<uint8_t> data) {
|
||||
if (data.size() < 3) return;
|
||||
|
||||
S_Code componente = (S_Code)data[1];
|
||||
uint8_t id = data[2];
|
||||
|
||||
if (data.size() < 4) return;
|
||||
uint8_t id = data[1];
|
||||
CanMessagePosicaoDados posicao = (CanMessagePosicaoDados)data[2];
|
||||
S_Code componente = DetectarComponente(id);
|
||||
switch (componente) {
|
||||
case sLED: {
|
||||
if (data.size() < 7) return;
|
||||
for (auto* _led : listaSinaleiros) {
|
||||
if (_led->ID_Num == id) {
|
||||
_led->_Status = (StatusLED)data[3];
|
||||
_led->_Qtd = data[4];
|
||||
_led->_TempoMs = (uint16_t)data[5] * 10;
|
||||
_led->_PausaMs = (uint16_t)data[6] * 10;
|
||||
return;
|
||||
}
|
||||
}
|
||||
Sinaleiro::ComandarSinaleiro(listaSinaleiros, data, id);
|
||||
break;
|
||||
}
|
||||
|
||||
case sRLE: {
|
||||
if (data.size() < 4) return;
|
||||
for (auto* _rele : listaReles) {
|
||||
if (_rele->ID_Num == id) {
|
||||
_rele->AtualizarStatus((Estado)data[3]);
|
||||
return;
|
||||
}
|
||||
}
|
||||
Rele::ComandarRele(listaReles, data, id);
|
||||
break;
|
||||
}
|
||||
|
||||
case sFRO: {
|
||||
if (data.size() < 4) return;
|
||||
for (auto* _freio : listaServoFreios) {
|
||||
if (_freio->ID_Num == id) {
|
||||
_freio->AtualizarAngulo(data[3]);
|
||||
return;
|
||||
}
|
||||
}
|
||||
ServoFreio::ComandarServo(listaServoFreios, data, id);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
@ -441,11 +283,24 @@ void LimparListasComponentes() {
|
|||
delete sensor;
|
||||
}
|
||||
listaSensoresTemperatura.clear();
|
||||
|
||||
for (auto* sensor : listaSensoresPotenciometros) {
|
||||
sensor->Desligar();
|
||||
PrintTela("Sensor Potenciometro " + sensor->_ID + " desligado.");
|
||||
delete sensor;
|
||||
}
|
||||
listaSensoresPotenciometros.clear();
|
||||
}
|
||||
|
||||
S_Code DetectarComponente(uint8_t idNum) {
|
||||
if (idNum == canService.ID_Num_sMOD) return S_Code::sMOD;
|
||||
for (auto* s : listaSensoresTemperatura) {
|
||||
if (s->ID_Num == idNum) return S_Code::sTMP;
|
||||
}
|
||||
for (auto* s : listaSensoresCorrente) {
|
||||
if (s->ID_Num == idNum) return S_Code::sCOR;
|
||||
}
|
||||
for (auto* s : listaSinaleiros) {
|
||||
if (s->ID_Num == idNum) return S_Code::sLED;
|
||||
}
|
||||
for (auto* s : listaReles) {
|
||||
if (s->ID_Num == idNum) return S_Code::sRLE;
|
||||
}
|
||||
for (auto* s : listaServoFreios) {
|
||||
if (s->ID_Num == idNum) return S_Code::sFRO;
|
||||
}
|
||||
return S_Code::sVZO;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue