ajustes de fluxo

This commit is contained in:
Diego Freitas 2026-03-06 08:50:42 -03:00
parent 23852cd6c4
commit bc9fc9a0b8
7 changed files with 81 additions and 53 deletions

View File

@ -1636,9 +1636,9 @@ namespace AgroBase.Forms.Operacoes
var logVent = LogsOperacao[idxMomentoAtual].CoolerControl; var logVent = LogsOperacao[idxMomentoAtual].CoolerControl;
lblVentilacaoModo.Text = $"Modo: {logVent?.Modo ?? CoolerControlService.CoolerMode.Off}"; lblVentilacaoModo.Text = $"Modo: {logVent?.Modo ?? CoolerControlService.CoolerMode.Off}";
lblVentilacaoModo.Text = $"Temperatura: {logVent?.Temperatura ?? 0:F2} ºC"; lblVentilacaoTemperatura.Text = $"Temperatura: {logVent?.Temperatura ?? 0:F2} ºC";
lblVentilacaoRLIN.Text = $"RLIN: {logVent?.EstadoEntrada ?? Enums.Estado.Desligado} ({logVent?.LeituraEntrada ?? Enums.Estado.Desligado})"; lblVentilacaoRLIN.Text = $"RLIN: {logVent?.EstadoEntrada ?? Enums.Estado.Desligado} ({logVent?.LeituraEntrada ?? Enums.Estado.Desligado})";
lblVentilacaoRLIN.Text = $"RLOUT: {logVent?.EstadoSaida ?? Enums.Estado.Desligado} ({logVent?.LeituraSaida ?? Enums.Estado.Desligado})"; lblVentilacaoRLOUT.Text = $"RLOUT: {logVent?.EstadoSaida ?? Enums.Estado.Desligado} ({logVent?.LeituraSaida ?? Enums.Estado.Desligado})";
} }
private void AtualizarInformacoesComandos() private void AtualizarInformacoesComandos()

View File

@ -740,14 +740,17 @@ namespace AgroBase
public static void EnviarComandoAtuador(S_Code Componente, string ID, bool? Status = null, double? Valor = null, bool Forcar = false) public static void EnviarComandoAtuador(S_Code Componente, string ID, bool? Status = null, double? Valor = null, bool Forcar = false)
{ {
var DispAtu = Variaveis.OperacaoEmAndamento.DispAtu;
if (!DispAtu.Dados.Conectado)
return;
if (!Forcar) if (!Forcar)
{ {
if (!Variaveis.OperacaoEmAndamento.Iniciado) return; if (!Variaveis.OperacaoEmAndamento.Iniciado) return;
bool componente_em_uso = Variaveis.OperacaoEmAndamento.Parametros.ModulosMandatorios.Any(x => x.Dispositivo == T_Code.Atu && x.ComponentesEmUso[ID].Item2); bool componente_em_uso = Variaveis.OperacaoEmAndamento.Parametros.ModulosMandatorios.Any(x => x.Dispositivo == T_Code.Atu && x.ComponentesEmUso != null && x.ComponentesEmUso[ID].Item2);
if (!componente_em_uso && (Status ?? false)) return; // Impede execucao de comandos que liguem componentes quando estiver marcado para nao utilizar if (!componente_em_uso && (Status ?? false)) return; // Impede execucao de comandos que liguem componentes quando estiver marcado para nao utilizar
} }
var DispAtu = Variaveis.OperacaoEmAndamento.DispAtu;
int id_num = -1; int id_num = -1;
CanMessagePosicaoDados posicao = CanMessagePosicaoDados.Command1; CanMessagePosicaoDados posicao = CanMessagePosicaoDados.Command1;
byte[] data = null; byte[] data = null;
@ -794,9 +797,13 @@ namespace AgroBase
public static void EnviarComandoSensoriamento(S_Code Componente, string ID, dynamic Status, bool Forcar = false) public static void EnviarComandoSensoriamento(S_Code Componente, string ID, dynamic Status, bool Forcar = false)
{ {
var DispSen = Variaveis.OperacaoEmAndamento.DispSen;
if (!DispSen.Dados.Conectado)
return;
if (!Forcar) if (!Forcar)
{ {
bool componente_em_uso = Variaveis.OperacaoEmAndamento.Parametros.ModulosMandatorios.Any(x => x.Dispositivo == T_Code.Sen && x.ComponentesEmUso[ID].Item2); bool componente_em_uso = Variaveis.OperacaoEmAndamento.Parametros.ModulosMandatorios.Any(x => x.Dispositivo == T_Code.Sen && x.ComponentesEmUso != null && x.ComponentesEmUso[ID].Item2);
if (!componente_em_uso) if (!componente_em_uso)
{ {
// Impede execucao de comandos que liguem componentes quando estiver marcado para nao utilizar // Impede execucao de comandos que liguem componentes quando estiver marcado para nao utilizar
@ -805,8 +812,6 @@ namespace AgroBase
} }
} }
var DispSen = Variaveis.OperacaoEmAndamento.DispSen;
int id_num = -1; int id_num = -1;
CanMessagePosicaoDados posicao = CanMessagePosicaoDados.Command1; CanMessagePosicaoDados posicao = CanMessagePosicaoDados.Command1;
byte[] data = null; byte[] data = null;

View File

@ -858,33 +858,33 @@ namespace AgroBase.Models
case T_Code.Mov: case T_Code.Mov:
if (Variaveis.OperacaoEmAndamento.DispMvd != null) if (Variaveis.OperacaoEmAndamento.DispMvd != null)
{ {
Variaveis.OperacaoEmAndamento.DispMvd.Dados.Modulos.ForEach(m => d.Add(m.MovMotor.Mod_ID, (true, m.MovMotor.Comandar))); Variaveis.OperacaoEmAndamento.DispMvd.Dados.Modulos?.ForEach(m => d.Add(m.MovMotor.Mod_ID, (true, m.MovMotor.Comandar)));
} }
break; break;
case T_Code.Dir: case T_Code.Dir:
if (Variaveis.OperacaoEmAndamento.DispMvd != null) if (Variaveis.OperacaoEmAndamento.DispMvd != null)
{ {
Variaveis.OperacaoEmAndamento.DispMvd.Dados.Modulos.ForEach(m => d.Add(m.DirMotor.Mod_ID, (true, m.DirMotor.Comandar))); Variaveis.OperacaoEmAndamento.DispMvd.Dados.Modulos?.ForEach(m => d.Add(m.DirMotor.Mod_ID, (true, m.DirMotor.Comandar)));
} }
break; break;
case T_Code.Atu: case T_Code.Atu:
if (Variaveis.OperacaoEmAndamento.DispAtu != null) if (Variaveis.OperacaoEmAndamento.DispAtu != null)
{ {
var da = Variaveis.OperacaoEmAndamento.DispAtu.Dados; var da = Variaveis.OperacaoEmAndamento.DispAtu.Dados;
da.Sensores.ForEach(s => d.Add(s.ID, (s.Mandatorio, s.Aferir))); da.Sensores?.ForEach(s => d.Add(s.ID, (s.Mandatorio, s.Aferir)));
da.BombasPressurizadoras.ForEach(b => d.Add(b.ID, (b.Mandatorio, b.Comandar))); da.BombasPressurizadoras?.ForEach(b => d.Add(b.ID, (b.Mandatorio, b.Comandar)));
da.BicosPulverizadores.ForEach(b => d.Add(b.ID, (b.Mandatorio, b.Comandar))); da.BicosPulverizadores?.ForEach(b => d.Add(b.ID, (b.Mandatorio, b.Comandar)));
da.Servos.ForEach(s => d.Add(s.ID, (s.Mandatorio, s.Controlar))); da.Servos?.ForEach(s => d.Add(s.ID, (s.Mandatorio, s.Controlar)));
} }
break; break;
case T_Code.Sen: case T_Code.Sen:
if (Variaveis.OperacaoEmAndamento.DispSen != null) if (Variaveis.OperacaoEmAndamento.DispSen != null)
{ {
var ds = Variaveis.OperacaoEmAndamento.DispSen.Dados; var ds = Variaveis.OperacaoEmAndamento.DispSen.Dados;
ds.Sensores.ForEach(s => d.Add(s.ID, (s.Mandatorio, s.Aferir))); ds.Sensores?.ForEach(s => d.Add(s.ID, (s.Mandatorio, s.Aferir)));
ds.Sinaleiros.ForEach(s => d.Add(s.ID, (s.Mandatorio, s.Controlar))); ds.Sinaleiros?.ForEach(s => d.Add(s.ID, (s.Mandatorio, s.Controlar)));
ds.Servos.ForEach(s => d.Add(s.ID, (s.Mandatorio, s.Controlar))); ds.Servos?.ForEach(s => d.Add(s.ID, (s.Mandatorio, s.Controlar)));
ds.Reles.ForEach(r => d.Add(r.ID, (r.Mandatorio, r.Controlar))); ds.Reles?.ForEach(r => d.Add(r.ID, (r.Mandatorio, r.Controlar)));
} }
break; break;
} }

View File

@ -24,10 +24,10 @@ namespace AgroBase.Services
// Estado interno // Estado interno
public CoolerMode ModoAtual { get; private set; } = CoolerMode.Off; public CoolerMode ModoAtual { get; private set; } = CoolerMode.Off;
public Estado CoolerEntradaEstado { get; private set; } = Estado.Desligado; public Estado CoolerEntradaEstado { get; private set; } = Estado.Desligado;
public Estado CoolerEntradaEstadoAnterior { get; private set; } = Estado.Desligado;
public Estado CoolerSaidaEstado { get; private set; } = Estado.Desligado; public Estado CoolerSaidaEstado { get; private set; } = Estado.Desligado;
public Estado CoolerEntradaLeitura => ReleCoolerEntrada?.ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.EstadoLeitura)?.atual?.valor ?? Estado.Desligado; public Estado CoolerSaidaEstadoAnterior { get; private set; } = Estado.Desligado;
public Estado CoolerSaidaLeitura => ReleCoolerSaida?.ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.EstadoLeitura)?.atual?.valor ?? Estado.Desligado;
public double? TemperaturaFiltrada { get; private set; } public double? TemperaturaFiltrada { get; private set; }
public DateTime UltimaMudancaModo { get; private set; } = DateTime.MinValue; public DateTime UltimaMudancaModo { get; private set; } = DateTime.MinValue;
@ -103,6 +103,19 @@ namespace AgroBase.Services
{ {
Variaveis.OperacaoEmAndamento.Sensoriamento?.InserirLog(T_Code.Npc, StatusModulo.Alerta, 50, "Temperatura limite excedida no NPC"); Variaveis.OperacaoEmAndamento.Sensoriamento?.InserirLog(T_Code.Npc, StatusModulo.Alerta, 50, "Temperatura limite excedida no NPC");
} }
else if (_alertaAnterior && !AlertaTemperaturaCritica)
{
Variaveis.OperacaoEmAndamento.Sensoriamento?.InserirLog(T_Code.Npc, StatusModulo.Alerta, 100, "Temperatura limite recuperada no NPC");
}
if (Variaveis.Fechando)
{
ModoAtual = CoolerMode.Off;
CoolerEntradaEstado = Estado.Desligado;
CoolerSaidaEstado = Estado.Desligado;
EnviarComando();
return;
}
if (ModoAtual == CoolerMode.Manual) if (ModoAtual == CoolerMode.Manual)
return; return;
@ -140,9 +153,6 @@ namespace AgroBase.Services
break; break;
} }
if (Variaveis.Fechando)
novoModo = CoolerMode.Off;
CoolerEntradaEstado = novoModo == CoolerMode.IntakeAndExhaust ? Estado.Ligado : Estado.Desligado; CoolerEntradaEstado = novoModo == CoolerMode.IntakeAndExhaust ? Estado.Ligado : Estado.Desligado;
CoolerSaidaEstado = novoModo == CoolerMode.ExhaustOnly || novoModo == CoolerMode.IntakeAndExhaust ? Estado.Ligado : Estado.Desligado; CoolerSaidaEstado = novoModo == CoolerMode.ExhaustOnly || novoModo == CoolerMode.IntakeAndExhaust ? Estado.Ligado : Estado.Desligado;
@ -157,10 +167,16 @@ namespace AgroBase.Services
private void EnviarComando() private void EnviarComando()
{ {
if (ReleCoolerEntrada != null && ReleCoolerEntrada._EstadoLeitura != CoolerEntradaEstado) if (ReleCoolerEntrada != null && CoolerEntradaEstadoAnterior != CoolerEntradaEstado)
{
GeneralJoystick.EnviarComandoSensoriamento(ReleCoolerEntrada.Componente, ReleCoolerEntrada.ID, CoolerEntradaEstado); GeneralJoystick.EnviarComandoSensoriamento(ReleCoolerEntrada.Componente, ReleCoolerEntrada.ID, CoolerEntradaEstado);
if (ReleCoolerSaida != null && ReleCoolerSaida._EstadoLeitura != CoolerSaidaEstado) CoolerEntradaEstadoAnterior = CoolerEntradaEstado;
}
if (ReleCoolerSaida != null && CoolerSaidaEstadoAnterior != CoolerSaidaEstado)
{
GeneralJoystick.EnviarComandoSensoriamento(ReleCoolerSaida.Componente, ReleCoolerSaida.ID, CoolerSaidaEstado); GeneralJoystick.EnviarComandoSensoriamento(ReleCoolerSaida.Componente, ReleCoolerSaida.ID, CoolerSaidaEstado);
CoolerSaidaEstadoAnterior = CoolerSaidaEstado;
}
} }
public CoolerControlDataModel GetResumo() public CoolerControlDataModel GetResumo()
@ -173,8 +189,8 @@ namespace AgroBase.Services
TemperaturaTurbo = TempTurbo, TemperaturaTurbo = TempTurbo,
EstadoEntrada = CoolerEntradaEstado, EstadoEntrada = CoolerEntradaEstado,
EstadoSaida = CoolerSaidaEstado, EstadoSaida = CoolerSaidaEstado,
LeituraEntrada = CoolerEntradaLeitura, LeituraEntrada = ReleCoolerEntrada?._EstadoLeitura ?? Estado.Desligado,
LeituraSaida = CoolerSaidaLeitura, LeituraSaida = ReleCoolerSaida?._EstadoLeitura ?? Estado.Desligado,
Temperatura = TemperaturaFiltrada ?? 0, Temperatura = TemperaturaFiltrada ?? 0,
Alerta = AlertaTemperaturaCritica Alerta = AlertaTemperaturaCritica
}; };

View File

@ -1297,28 +1297,35 @@ namespace AgroBase.Services
public static void AtualizaDadosRedis() public static void AtualizaDadosRedis()
{ {
GPSModel posicaoAtual = Variaveis.OperacaoEmAndamento.Simulando ? historicoPosicao.Peek() : UltimaLeitura; try
{
GPSModel posicaoAtual = Variaveis.OperacaoEmAndamento.Simulando ? historicoPosicao.Peek() : UltimaLeitura;
RedisService.AtualizarCampos( RedisService.AtualizarCampos(
RedisService.ModKey(T_Code.Gps), RedisService.ModKey(T_Code.Gps),
("conectado", Iniciado), ("conectado", Iniciado),
("freq_base", TaxaAmostragemHz), ("freq_base", TaxaAmostragemHz),
("lat", posicaoAtual.Latitude), ("lat", posicaoAtual.Latitude),
("lon", posicaoAtual.Longitude), ("lon", posicaoAtual.Longitude),
("theta", posicaoAtual.AnguloCarroDefinido), ("theta", posicaoAtual.AnguloCarroDefinido),
("fix", (int)posicaoAtual.QualidadeFix), ("fix", (int)posicaoAtual.QualidadeFix),
("rtk", posicaoAtual.IdadeCorrecao < rtk_timeout), ("rtk", posicaoAtual.IdadeCorrecao < rtk_timeout),
("hAcc", posicaoAtual.PrecisaoCm), ("hAcc", posicaoAtual.PrecisaoCm),
("nSatelites", posicaoAtual.NumeroSatelites), ("nSatelites", posicaoAtual.NumeroSatelites),
("freq.posicao", posicaoAtual.TimestampPos.frequencia), ("freq.posicao", posicaoAtual.TimestampPos.frequencia),
("freq.orientacao", posicaoAtual.TimestampOri.frequencia), ("freq.orientacao", posicaoAtual.TimestampOri.frequencia),
("latency.posicao", posicaoAtual.TimestampPos.dt), ("latency.posicao", posicaoAtual.TimestampPos.dt),
("latency.orientacao", posicaoAtual.TimestampOri.dt), ("latency.orientacao", posicaoAtual.TimestampOri.dt),
("timestamp.posicao", posicaoAtual.TimestampPos.valor), ("timestamp.posicao", posicaoAtual.TimestampPos.valor),
("timestamp.orientacao", posicaoAtual.TimestampOri.valor), ("timestamp.orientacao", posicaoAtual.TimestampOri.valor),
("age", posicaoAtual.IdadeCorrecao), ("age", posicaoAtual.IdadeCorrecao),
("heartbeat", posicaoAtual.Heartbeat) ("heartbeat", posicaoAtual.Heartbeat)
); );
}
catch (Exception e)
{
Console.WriteLine($"Erro ao salvar dados do GPS no Redis: {e.Message}");
}
} }
public static Queue<GPSModel> historicoPosicao = new Queue<GPSModel>(); public static Queue<GPSModel> historicoPosicao = new Queue<GPSModel>();

View File

@ -146,10 +146,10 @@ namespace AgroBase.Services.Operadores
dist_dir = _t.DistanciaDireita, dist_dir = _t.DistanciaDireita,
angulo = _t.AnguloMedioCorredor, angulo = _t.AnguloMedioCorredor,
pontos_restantes = _t.CorredorAtual.QtdPontos - pontoComparar.idxPontoCorredor, pontos_restantes = _t.CorredorAtual.QtdPontos - pontoComparar.idxPontoCorredor,
liberado = _t.AutonomiaCooredor?.Liberado ?? false, //liberado = _t.AutonomiaCooredor?.Liberado ?? false,
motivo = _t.AutonomiaCooredor?.Motivo ?? "", //motivo = _t.AutonomiaCooredor?.Motivo ?? "",
bateria_ok = _t.AutonomiaCooredor?.BateriaSuficiente ?? false, //bateria_ok = _t.AutonomiaCooredor?.BateriaSuficiente ?? false,
herbicida_ok = _t.AutonomiaCooredor?.HerbicidaSuficiente ?? false //herbicida_ok = _t.AutonomiaCooredor?.HerbicidaSuficiente ?? false
}, },
} : null } : null
), ),

File diff suppressed because one or more lines are too long