From c98972129c2f2dbb5e52dcd39ece7f137e4c7340 Mon Sep 17 00:00:00 2001 From: Diego Freitas Date: Thu, 2 Jul 2026 09:36:51 -0300 Subject: [PATCH] alguns guards e limpeza na operacao atual como instancia --- .../AgroBase/Forms/Direcional/frmDirConfig.cs | 6 +- .../AgroBase/Forms/IHM/frmDiagnosticos.cs | 8 +- AgroBase/AgroBase/Forms/IHM/frmDialogoMapa.cs | 2 +- .../AgroBase/Forms/IHM/frmInicioOperacao.cs | 4 +- .../Forms/Movimentacao/frmMovConfig.cs | 4 +- .../Forms/Operacoes/frmOperacaoManual.cs | 9 +- .../Forms/Operacoes/frmResultadosOperacao.cs | 4 +- AgroBase/AgroBase/Forms/frmInstancial.cs | 7 +- AgroBase/AgroBase/Forms/frmLoraConfig.cs | 8 +- AgroBase/AgroBase/Forms/frmPrincipal.cs | 2 +- AgroBase/AgroBase/Models/DispositivosModel.cs | 2 +- .../AgroBase/Models/Modules/AtuadorModel.cs | 2 + .../Models/Modules/MovimentacaoModel.cs | 6 +- .../Modules/MovimentacaoUnificadoModel.cs | 8 +- .../Models/Operacoes/OperacaoModel.cs | 564 +++++++++++------- .../Operacoes/OperacaoParametrosModel.cs | 8 +- AgroBase/AgroBase/Models/Variaveis.cs | 38 +- AgroBase/AgroBase/Services/BLD300RService.cs | 2 +- AgroBase/AgroBase/Services/EthernetService.cs | 2 +- AgroBase/AgroBase/Services/GPSService.cs | 208 ++----- AgroBase/AgroBase/Services/MKS057DService.cs | 2 +- AgroBase/AgroBase/Services/OIDService.cs | 2 +- .../Operadores/HealthWorkerService.cs | 12 +- .../Services/Operadores/OperadoresService.cs | 7 +- .../Operadores/VisualWorkerService.cs | 2 +- .../Services/Operadores/WeedWorkerService.cs | 2 +- AgroBase/AgroBase/Services/RedisService.cs | 11 +- AgroBase/AgroBase/Services/SerialService.cs | 85 +-- .../AgroBase/Services/VersionamentoService.cs | 13 +- AgroBase/AgroBase/Services/WifiService.cs | 12 +- .../Scripts/workers/weed_worker/config.py | 1 + .../workers/weed_worker/weed_detector.py | 3 - 32 files changed, 527 insertions(+), 519 deletions(-) diff --git a/AgroBase/AgroBase/Forms/Direcional/frmDirConfig.cs b/AgroBase/AgroBase/Forms/Direcional/frmDirConfig.cs index 61b5df943..f68e8ef3d 100644 --- a/AgroBase/AgroBase/Forms/Direcional/frmDirConfig.cs +++ b/AgroBase/AgroBase/Forms/Direcional/frmDirConfig.cs @@ -76,8 +76,6 @@ namespace AgroBase.Forms.Direcional chbUsar.Checked = Modulo.DirMotor.UsarAnguloSensor; } } - - txtIP.Text = Disp.Dados.IP_Dir; } private void frmDirConfig_FormClosing(object sender, FormClosingEventArgs e) @@ -126,14 +124,12 @@ namespace AgroBase.Forms.Direcional } } - Disp.Dados.IP_Dir = txtIP.Text; - Disp.SalvarParametros(Disp.Dados); } private void cmbTipoMovimento_SelectedIndexChanged(object sender, EventArgs e) { - Variaveis.OperacaoEmAndamento.Controle.TipoMovimento = (TipoMovimentoDirecional)cmbTipoMovimento.SelectedIndex; + Variaveis.OperacaoEmAndamento.DefinirTipoMovimentoControle((TipoMovimentoDirecional)cmbTipoMovimento.SelectedIndex); AtualizarConfiguracaoSentido(); } } diff --git a/AgroBase/AgroBase/Forms/IHM/frmDiagnosticos.cs b/AgroBase/AgroBase/Forms/IHM/frmDiagnosticos.cs index 0a8e53713..900799b4e 100644 --- a/AgroBase/AgroBase/Forms/IHM/frmDiagnosticos.cs +++ b/AgroBase/AgroBase/Forms/IHM/frmDiagnosticos.cs @@ -707,7 +707,7 @@ namespace AgroBase.Forms.IHM TipoMovimentoDirecional _oldTipoMovimento = Variaveis.OperacaoEmAndamento.Controle.TipoMovimento; double _oldPercentualVelocidade = Variaveis.OperacaoEmAndamento.Controle.PercentualVelocidadeSP; - Variaveis.OperacaoEmAndamento.Controle.TipoMovimento = TipoMovimentoDirecional.Diagnostico; + Variaveis.OperacaoEmAndamento.DefinirTipoMovimentoControle(TipoMovimentoDirecional.Diagnostico); Variaveis.OperacaoEmAndamento.Controle.PercentualVelocidadeSP = 20; DispositivosService Dispositivo = (DispositivosService)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == Enums.T_Code.Mvd); @@ -788,7 +788,7 @@ namespace AgroBase.Forms.IHM } - Variaveis.OperacaoEmAndamento.Controle.TipoMovimento = _oldTipoMovimento; + Variaveis.OperacaoEmAndamento.DefinirTipoMovimentoControle(_oldTipoMovimento); Variaveis.OperacaoEmAndamento.Controle.PercentualVelocidadeSP = _oldPercentualVelocidade; return true; @@ -952,7 +952,7 @@ namespace AgroBase.Forms.IHM return false; } - Variaveis.OperacaoEmAndamento.Controle.TipoMovimento = TipoMovimentoDirecional.Diagnostico; + Variaveis.OperacaoEmAndamento.DefinirTipoMovimentoControle(TipoMovimentoDirecional.Diagnostico); Variaveis.OperacaoEmAndamento.Controle.Angulo = 25; Variaveis.OperacaoEmAndamento.Parametros.Controle.DirVelocidadeMovimento = 30; @@ -1001,7 +1001,7 @@ namespace AgroBase.Forms.IHM } - Variaveis.OperacaoEmAndamento.Controle.TipoMovimento = _oldTipoMovimento; + Variaveis.OperacaoEmAndamento.DefinirTipoMovimentoControle(_oldTipoMovimento); Variaveis.OperacaoEmAndamento.Controle.Angulo = _oldAngulo; Variaveis.OperacaoEmAndamento.Parametros.Controle.DirVelocidadeMovimento = _oldVelocidadeMP; diff --git a/AgroBase/AgroBase/Forms/IHM/frmDialogoMapa.cs b/AgroBase/AgroBase/Forms/IHM/frmDialogoMapa.cs index 3c7a1384e..cf45d095e 100644 --- a/AgroBase/AgroBase/Forms/IHM/frmDialogoMapa.cs +++ b/AgroBase/AgroBase/Forms/IHM/frmDialogoMapa.cs @@ -624,7 +624,7 @@ namespace AgroBase.Forms.IHM private void CmbModoControle_SelectedIndexChanged(object sender, EventArgs e) { - Variaveis.OperacaoEmAndamento.Controle.TipoMovimento = (Enums.TipoMovimentoDirecional)cmbModoControle.SelectedIndex; + Variaveis.OperacaoEmAndamento.DefinirTipoMovimentoControle((Enums.TipoMovimentoDirecional)cmbModoControle.SelectedIndex); } private void tkbVelocidade_Scroll(object sender, EventArgs e) diff --git a/AgroBase/AgroBase/Forms/IHM/frmInicioOperacao.cs b/AgroBase/AgroBase/Forms/IHM/frmInicioOperacao.cs index 6283ba995..111450208 100644 --- a/AgroBase/AgroBase/Forms/IHM/frmInicioOperacao.cs +++ b/AgroBase/AgroBase/Forms/IHM/frmInicioOperacao.cs @@ -211,7 +211,7 @@ namespace AgroBase.Forms.Operacoes frmDialogo = new frmDialogoMapa(); frmDialogo.Show(); frmDialogo.Hide(); - (bool sucesso, List ruas) = Variaveis.OperacaoEmAndamento.CarregarParametrizacaoOperacao(frmDialogo.pnlMapa, frmDialogo.lblMapaCarregado, path); + bool sucesso = Variaveis.OperacaoEmAndamento.CarregarParametrizacaoOperacao(frmDialogo.pnlMapa, frmDialogo.lblMapaCarregado, path); bool condicaoOperacaoCarregada() => Variaveis.OperacaoEmAndamento.Trajetoria?.CorredorAtual != null; bool resultado = await FuncoesGlobais.AguardarCondicaoAsync(condicaoOperacaoCarregada, 15000, 200); @@ -221,7 +221,7 @@ namespace AgroBase.Forms.Operacoes throw new Exception("Erro ao carregar a trajetória do mapa!"); } - ruasSelecionadas = ruas; + ruasSelecionadas = new List(); foreach (var chb in fpnlInformacoes.Controls.OfType()) { diff --git a/AgroBase/AgroBase/Forms/Movimentacao/frmMovConfig.cs b/AgroBase/AgroBase/Forms/Movimentacao/frmMovConfig.cs index 9b14dc5e4..3e0078f2c 100644 --- a/AgroBase/AgroBase/Forms/Movimentacao/frmMovConfig.cs +++ b/AgroBase/AgroBase/Forms/Movimentacao/frmMovConfig.cs @@ -89,7 +89,6 @@ namespace AgroBase.Forms.Movimentacao nudRPMMax.Value = (int)Disp.Dados.RPM_Max_MotorBLDC; nudReducao.Value = (int)Disp.Dados.ReducaoMotorBLDC; nudDiametroRoda.Value = (int)(Disp.Dados.DiametroRoda * 1000); - txtIP.Text = Disp.Dados.IP_Mov; } private void frmMovConfig_FormClosing(object sender, FormClosingEventArgs e) @@ -153,14 +152,13 @@ namespace AgroBase.Forms.Movimentacao Disp.Dados.RPM_Max_MotorBLDC = Convert.ToInt32(nudRPMMax.Value); Disp.Dados.ReducaoMotorBLDC = Convert.ToInt32(nudReducao.Value); Disp.Dados.DiametroRoda = Convert.ToDouble(nudDiametroRoda.Value / 1000); - Disp.Dados.IP_Mov = txtIP.Text; Disp.SalvarParametros(Disp.Dados); } private void cmbTipoMovimento_SelectedIndexChanged(object sender, EventArgs e) { - Variaveis.OperacaoEmAndamento.Controle.TipoMovimento = (TipoMovimentoDirecional)cmbTipoMovimento.SelectedIndex; + Variaveis.OperacaoEmAndamento.DefinirTipoMovimentoControle((TipoMovimentoDirecional)cmbTipoMovimento.SelectedIndex); AtualizarConfiguracaoSentido(); } diff --git a/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.cs b/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.cs index 452c3d56a..bfc888be5 100644 --- a/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.cs +++ b/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.cs @@ -8,6 +8,7 @@ using AgroBase.Services; using AgroBase.Models.Modules; using System.Threading.Tasks; using AgroBase.Services.Operadores; +using System.Collections.Generic; namespace AgroBase.Forms.Operacoes { @@ -761,16 +762,18 @@ namespace AgroBase.Forms.Operacoes private void cmbTipoMovimento_SelectedIndexChanged(object sender, EventArgs e) { - op.Controle.TipoMovimento = (TipoMovimentoDirecional)cmbTipoMovimento.SelectedIndex; + op.DefinirTipoMovimentoControle((TipoMovimentoDirecional)cmbTipoMovimento.SelectedIndex); } private void chbPulverizador_CheckedChanged(object sender, EventArgs e) { op.Parametros.Controle.PulverizadorAutomatico = ((CheckBox)sender).Checked; - if (!op.Parametros.Controle.PulverizadorAutomatico && op.Controle.Bicos.Any(x => x.ComandoAtuar)) + var bicos = op.DispAtu?.Dados?.BicosPulverizadores ?? new List(); + + if (!op.Parametros.Controle.PulverizadorAutomatico && bicos.Any(x => x.ComandoAtuar)) { - op.Controle.Bicos.ForEach(b => b.ComandoAtuar = false); + bicos.ForEach(b => b.ComandoAtuar = false); } } diff --git a/AgroBase/AgroBase/Forms/Operacoes/frmResultadosOperacao.cs b/AgroBase/AgroBase/Forms/Operacoes/frmResultadosOperacao.cs index 8e26148a9..1c490c2be 100644 --- a/AgroBase/AgroBase/Forms/Operacoes/frmResultadosOperacao.cs +++ b/AgroBase/AgroBase/Forms/Operacoes/frmResultadosOperacao.cs @@ -167,7 +167,7 @@ namespace AgroBase.Forms.Operacoes GPSModel pos = GPSService.UltimaLeitura.Clone(); GPSService.UltimaLeitura = LogsGPS.FirstOrDefault(); - (bool sucesso, List ruas) = op.CarregarParametrizacaoOperacao(null, null, ofd.FileName.Replace("data.lgop", "operacao.opr")); + bool sucesso = op.CarregarParametrizacaoOperacao(null, null, ofd.FileName.Replace("data.lgop", "operacao.opr")); bool condicaoOperacaoCarregada() => op.Trajetoria?.CorredorAtual != null; bool resultado = await FuncoesGlobais.AguardarCondicaoAsync(condicaoOperacaoCarregada, 15000, 200); GPSService.UltimaLeitura = pos; @@ -1211,7 +1211,7 @@ namespace AgroBase.Forms.Operacoes txtVelocidade.Text = (LogMov.VelocidadeMediaMs * 3.6).ToString("0.00") + " km/h (" + LogMov.VelocidadeMediaMs.ToString("0.00") + " m/s)"; txtDirecaoControle.Text = (LogCtrl?.TiposControle?.FirstOrDefault(x => x.Tipo == Enums.T_Code.Dir)?.DirecaoAtual ?? Enums.Direcao.Parado).ToString() + " (" + (LogCtrl?.Latencia ?? 0).ToString("0.00") + " s)"; txtVelocidadeControle.Text = ((LogCtrl?.PercentualVelocidadeSP ?? 0) / VariaveisEquipamento.RPM_Max_Roda * 100).ToString() + " rpm"; - txtErvasIdentificadas.Text = $"{LogCtrl?.Bicos?.Sum(x => x.Atuacoes) ?? 0}"; + txtErvasIdentificadas.Text = $"{LogAtu?.Bicos?.Sum(x => x.Atuacoes) ?? 0}"; txtDistanciasLaterais.Text = (LogTrj.DistanciaEsquerda * 100.0).ToString("0.00") + " cm / " + (LogTrj.DistanciaDireita * 100.0).ToString("0.00") + " cm"; txtErroLateral.Text = (LogCtrl.ErroLateral * 100.0).ToString("0.00") + " cm"; diff --git a/AgroBase/AgroBase/Forms/frmInstancial.cs b/AgroBase/AgroBase/Forms/frmInstancial.cs index d309dca2c..5ccb02585 100644 --- a/AgroBase/AgroBase/Forms/frmInstancial.cs +++ b/AgroBase/AgroBase/Forms/frmInstancial.cs @@ -1,7 +1,6 @@ using AgroBase.Forms.IHM; using AgroBase.Models; using AgroBase.Services; -using AgroBase.Services.Operadores; using System; using System.Threading; using System.Threading.Tasks; @@ -11,8 +10,6 @@ namespace AgroBase.Forms { public partial class frmInstancial : Form { - public static readonly bool IniciarWorkers = true; - public static AsyncTaskTimerModel tmrVarreduraDispositivos; public static frmPrincipal frmPrincipal = new frmPrincipal(); @@ -105,6 +102,8 @@ namespace AgroBase.Forms if (_startupConcluido) return; + Variaveis.OperacaoEmAndamento = OperacaoModel.CarregarParametrosOperacaoPadrao(Enums.ModoOperacao.NaoDefinido, true); + _shutdownIniciado = false; Variaveis.Fechando = false; @@ -142,7 +141,7 @@ namespace AgroBase.Forms LivoxManagerProcess.Start(); - await VariaveisOperacao.Operadores.IniciarProcessamento(IniciarWorkers).ConfigureAwait(false); + await VariaveisOperacao.Operadores.IniciarProcessamento(Variaveis.IniciarWorkers).ConfigureAwait(false); AudioAlertaService.SelecionarVoz(VariaveisEquipamento.VozAlerta); diff --git a/AgroBase/AgroBase/Forms/frmLoraConfig.cs b/AgroBase/AgroBase/Forms/frmLoraConfig.cs index c9333c8c5..5f94cac9d 100644 --- a/AgroBase/AgroBase/Forms/frmLoraConfig.cs +++ b/AgroBase/AgroBase/Forms/frmLoraConfig.cs @@ -43,7 +43,7 @@ namespace AgroBase.Forms private async Task AtualizarParametros() { (bool sucesso, LoRaParametrosModel par) = (false, null); - if (Variaveis.IsAgroMonitor) + if (!Variaveis.IsAgroBase) { (sucesso, par) = await LoRaBaseService.RequisitarParametrosModuloAsync(); } @@ -86,7 +86,7 @@ namespace AgroBase.Forms private async Task tmrLeitura_Tick() { - if (Variaveis.IsAgroMonitor) + if (!Variaveis.IsAgroBase) { var MensagemDisponivel = LoRaBaseService.MensagemPendente; if (MensagemDisponivel != null) @@ -152,7 +152,7 @@ namespace AgroBase.Forms private async Task ConfigurarModulo() { (bool Sucesso, LoRaParametrosModel par) = (false, null); - if (Variaveis.IsAgroMonitor) + if (!Variaveis.IsAgroBase) { (Sucesso, par) = await LoRaBaseService.ConfigurarModuloAsync(Parametros); } @@ -202,7 +202,7 @@ namespace AgroBase.Forms } } - if (Variaveis.IsAgroMonitor) + if (!Variaveis.IsAgroBase) { LoRaBaseService.EnviarDadosLoRa(payload.ToArray(), destinatario); } diff --git a/AgroBase/AgroBase/Forms/frmPrincipal.cs b/AgroBase/AgroBase/Forms/frmPrincipal.cs index 833d67c2c..7bc11a4e4 100644 --- a/AgroBase/AgroBase/Forms/frmPrincipal.cs +++ b/AgroBase/AgroBase/Forms/frmPrincipal.cs @@ -34,7 +34,7 @@ namespace AgroBase cmbModoOperacao.Items.Clear(); cmbModoOperacao.Items.AddRange(Enum.GetNames(typeof(ModoOperacao))); - cmbModoOperacao.SelectedIndex = (int)(Variaveis.OperacaoEmAndamento.Parametros?.Modo ?? ModoOperacao.NaoDefinido); + cmbModoOperacao.SelectedIndex = (int)(Variaveis.OperacaoEmAndamento?.Parametros?.Modo ?? ModoOperacao.NaoDefinido); } private async void frmPrincipal_FormClosing(object sender, FormClosingEventArgs e) diff --git a/AgroBase/AgroBase/Models/DispositivosModel.cs b/AgroBase/AgroBase/Models/DispositivosModel.cs index 4eb260152..544ac8bc1 100644 --- a/AgroBase/AgroBase/Models/DispositivosModel.cs +++ b/AgroBase/AgroBase/Models/DispositivosModel.cs @@ -37,7 +37,7 @@ namespace AgroBase.Models public void AtualizarDados() { - var saude = Variaveis.OperacaoEmAndamento.Sensoriamento?.OperadorSaude?.ModulosSaude; + var saude = Variaveis.OperacaoEmAndamento?.Sensoriamento?.OperadorSaude?.ModulosSaude ?? new System.Collections.Generic.List(); Status = saude?.FirstOrDefault(x => x.modulo == Dispositivo)?.status ?? StatusModulo.Desconectado; Saude = saude?.FirstOrDefault(x => x.modulo == Dispositivo)?.saude ?? 0; diff --git a/AgroBase/AgroBase/Models/Modules/AtuadorModel.cs b/AgroBase/AgroBase/Models/Modules/AtuadorModel.cs index b783ea201..3d94fc466 100644 --- a/AgroBase/AgroBase/Models/Modules/AtuadorModel.cs +++ b/AgroBase/AgroBase/Models/Modules/AtuadorModel.cs @@ -1895,6 +1895,8 @@ namespace AgroBase.Models.Modules { var op = Variaveis.OperacaoEmAndamento; + if (!op.Sensoriamento.Operacao.ModsCalibragem.ContainsKey(T_Code.Atu)) + op.Sensoriamento.Operacao.ModsCalibragem.Add(T_Code.Atu, new Dictionary()); var calAtu = op.Sensoriamento.Operacao.ModsCalibragem[Dispositivo]; // Ligar bomba diff --git a/AgroBase/AgroBase/Models/Modules/MovimentacaoModel.cs b/AgroBase/AgroBase/Models/Modules/MovimentacaoModel.cs index e41c35558..86c0c644a 100644 --- a/AgroBase/AgroBase/Models/Modules/MovimentacaoModel.cs +++ b/AgroBase/AgroBase/Models/Modules/MovimentacaoModel.cs @@ -677,9 +677,9 @@ namespace AgroBase.Models.Modules { var op = Variaveis.OperacaoEmAndamento; - var ctrl = op.Controle; - var disp = op.DispMvd?.Dados?.Modulos; - if (op.Sensoriamento?.Operacao?.StatusOperacaoAtual != StatusOperacao.EmAndamento || ctrl == null || disp == null || !MovimentosCompensar.Contains(ctrl.TipoMovimento)) + var ctrl = op?.Controle; + var disp = op?.DispMvd?.Dados?.Modulos; + if (op?.Sensoriamento?.Operacao?.StatusOperacaoAtual != StatusOperacao.EmAndamento || ctrl == null || disp == null || !MovimentosCompensar.Contains(ctrl.TipoMovimento)) { compensacoes = (disp ?? Enumerable.Empty()).ToDictionary(x => x.Modulo_ID, x => 1.0); return; diff --git a/AgroBase/AgroBase/Models/Modules/MovimentacaoUnificadoModel.cs b/AgroBase/AgroBase/Models/Modules/MovimentacaoUnificadoModel.cs index fb1fcdf38..50de96ef7 100644 --- a/AgroBase/AgroBase/Models/Modules/MovimentacaoUnificadoModel.cs +++ b/AgroBase/AgroBase/Models/Modules/MovimentacaoUnificadoModel.cs @@ -36,8 +36,6 @@ namespace AgroBase.Models.Modules public double ReducaoMotorBLDC { get; set; } = 5; public double RPM_Max_MotorBLDC { get; set; } = 500; - public string IP_Mov { get; set; } = Variaveis.FaixaIPethernet + ".10"; - public string IP_Dir { get; set; } = Variaveis.FaixaIPethernet + ".11"; public DateTime UltimoTickRegistrador = DateTime.MinValue; public static int LogsManter { get; set; } = 60; @@ -506,7 +504,7 @@ namespace AgroBase.Models.Modules TipoMovimentoDirecional tipoControle = op.Controle.TipoMovimento; - op.Controle.TipoMovimento = TipoMovimentoDirecional.Diagnostico; + op.DefinirTipoMovimentoControle(TipoMovimentoDirecional.Diagnostico); var ModsRef = Modulos.Where(x => x.DirMotor.Comandar && x.DirMotor.Inicializado && (ModsReferenciar != null ? ModsReferenciar.Contains(x.DirMotor.Mod_ID) : true)).ToList(); foreach (var Modulo in ModsRef) { @@ -515,7 +513,7 @@ namespace AgroBase.Models.Modules bool ReferenciamentoConcluido() => !MKS057DCanService.Referenciando; await FuncoesGlobais.AguardarCondicaoAsync(ReferenciamentoConcluido, 2 * 1000 * 60, 1000); - op.Controle.TipoMovimento = tipoControle; + op.DefinirTipoMovimentoControle(tipoControle); } return Modulos.All(x => x.DirMotor.Referenciado); @@ -568,7 +566,7 @@ namespace AgroBase.Models.Modules if (DispMvd.Dados.Modulos.Any(x => x.DirMotor.Inicializado)) { - op.Controle.TipoMovimento = TipoMovimentoDirecional.Diagnostico; + op.DefinirTipoMovimentoControle(TipoMovimentoDirecional.Diagnostico); var ModsRef = Modulos.Where(x => x.DirMotor.Comandar).ToList(); // && x.DirMotor.Inicializado foreach (var Modulo in ModsRef) { diff --git a/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs b/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs index 3e0e1b348..0949299e2 100644 --- a/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs +++ b/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs @@ -25,6 +25,72 @@ namespace AgroBase.Models { public class OperacaoModel { + #region TIMERS + + public double tmrLeiturasInterval + { + get + { + return tmrLeituras?.Interval ?? 500; + } + set + { + tmrLeituras?.SetInterval((int)value); + } + } + private AsyncTaskTimerModel tmrLeituras; + private AsyncTaskTimerModel tmrComunicacao; + public void IniciarTimersSistema() + { + if (!Variaveis.IsAgroBase) + return; + + if (!ReferenceEquals(Variaveis.OperacaoEmAndamento, this)) + { + Variaveis.MostrarLog( + $"[OperacaoModel.IniciarTimersSistema] Ignorado: instância não é atual. " + + $"Hash={GetHashCode()}, AtualHash={Variaveis.OperacaoEmAndamento?.GetHashCode()}" + ); + return; + } + + tmrLeituras?.Stop(); + tmrLeituras?.Dispose(); + tmrLeituras = new AsyncTaskTimerModel($"tmrLeitura_{GetHashCode()}", tmrLeituras_Tick, 500); + tmrLeituras.Start(); + + tmrComunicacao?.Stop(); + tmrComunicacao?.Dispose(); + tmrComunicacao = new AsyncTaskTimerModel($"tmrComunicacao_{GetHashCode()}", tmrComunicacao_Tick, 1000); + tmrComunicacao.Start(); + + Variaveis.MostrarLog( + $"[OperacaoModel.IniciarTimersSistema] Timers iniciados. Hash={GetHashCode()}, Modo={Parametros?.Modo}" + ); + } + public void PararTimersSistema() + { + try + { + tmrLeituras?.Stop(); + tmrLeituras?.Dispose(); + tmrLeituras = null; + + tmrComunicacao?.Stop(); + tmrComunicacao?.Dispose(); + tmrComunicacao = null; + + Variaveis.MostrarLog( + $"[OperacaoModel.PararTimersSistema] Timers do sistema parados. Operacao={ID}, Hash={GetHashCode()}, idxLog={idxLog}" + ); + } + catch (Exception ex) + { + Variaveis.MostrarLog("[OperacaoModel.PararTimersSistema] Erro ao parar timers do sistema: " + ex.Message); + } + } + + public double tmrLogsInterval { get @@ -39,40 +105,35 @@ namespace AgroBase.Models private AsyncTaskTimerModel _tmrLogsOperacao; private int idxLog = 0; private readonly SemaphoreSlim _salvarLogsGate = new SemaphoreSlim(1, 1); - public double tmrLeiturasInterval + private void IniciarTimerLogsOperacao() { - get + if (!Variaveis.IsAgroBase) + return; + + _tmrLogsOperacao?.Stop(); + _tmrLogsOperacao?.Dispose(); + + _tmrLogsOperacao = new AsyncTaskTimerModel($"tmrLogs_{ID}", tmrLogs_Tick, 1000); + + _tmrLogsOperacao.Start(); + + Variaveis.MostrarLog($"[OperacaoModel.IniciarTimerLogsOperacao] Timer de logs iniciado. Operacao={ID}, Hash={GetHashCode()}"); + } + private void PararTimerLogsOperacao() + { + try { - return tmrLeituras.Interval; + _tmrLogsOperacao?.Stop(); + + Variaveis.MostrarLog($"[OperacaoModel.PararTimerLogsOperacao] Timer de logs parado. Operacao={ID}, Hash={GetHashCode()}, idxLog={idxLog}"); } - set + catch (Exception ex) { - tmrLeituras.SetInterval((int)value); + Variaveis.MostrarLog("[OperacaoModel.PararTimerLogsOperacao] Erro ao parar timer de logs: " + ex.Message); } } - private static AsyncTaskTimerModel tmrLeituras; - private static AsyncTaskTimerModel tmrComunicacao; - public OperacaoModel() - { - Variaveis.MostrarLog("[OperacaoModel.ctor] StackTrace: " + Environment.StackTrace); - - Variaveis.MostrarLog( - $"[OperacaoModel.ctor] Nova instância. Hash={GetHashCode()}, " + - $"OperacaoAtual={Variaveis.OperacaoEmAndamento?.ID}, " + - $"HashAtual={Variaveis.OperacaoEmAndamento?.GetHashCode()}" - ); - - tmrLeituras?.Dispose(); - tmrLeituras = new AsyncTaskTimerModel("tmrLeitura", tmrLeituras_Tick, 500); - tmrLeituras.Start(); - - tmrComunicacao?.Dispose(); - tmrComunicacao = new AsyncTaskTimerModel("tmrComunicacao", tmrComunicacao_Tick, 1000); - tmrComunicacao.Start(); - } - - + #endregion public StatusModulo Status { get; set; } public string Descricao { get; set; } @@ -105,8 +166,27 @@ namespace AgroBase.Models #region PARAMETRIZACAO - public (bool, List) CarregarParametrizacaoOperacao(Panel pnlMapa, Label lblMapa, string opPath = "") + private bool EhOperacaoAtual(string origem) { + if (ReferenceEquals(Variaveis.OperacaoEmAndamento, this)) + return true; + + Variaveis.MostrarLog( + $"[OperacaoModel.{origem}] Ignorado: instância não é atual. " + + $"Hash={GetHashCode()}, AtualHash={Variaveis.OperacaoEmAndamento?.GetHashCode()}, ID={ID}, AtualID={Variaveis.OperacaoEmAndamento?.ID}" + ); + + return false; + } + + public bool CarregarParametrizacaoOperacao(Panel pnlMapa, Label lblMapa, string opPath = "") + { + if (Variaveis.OperacaoEmAndamento?.Sensoriamento?.Operacao?.OperacaoIniciada == true) + { + Variaveis.MostrarLog("[OperacaoModel.CarregarParametrizacaoOperacao] Ignorado: tentativa de carregar operação com operação iniciada."); + return false; + } + string path = Variaveis.CaminhoSistema + Variaveis.CaminhoOperacoes + MapasVariaveisModel.NomeArquivoMapaInterativoSaida; OpenFileDialog openFileDialog = new OpenFileDialog(); @@ -118,54 +198,35 @@ namespace AgroBase.Models { string opr_path = !string.IsNullOrEmpty(opPath) ? opPath : openFileDialog.FileName; - if (!File.Exists(opr_path)) return (false, new List()); + if (!File.Exists(opr_path)) return false; string ParametrosJson = File.ReadAllText(opr_path, Encoding.UTF8); var Parametros = JsonConvert.DeserializeObject(ParametrosJson); - if (Parametros.Modo == null) return (false, new List()); + if (Parametros.Modo == null) return false; - Variaveis.OperacaoEmAndamento = CarregarParametrosOperacaoPadrao((ModoOperacao)Parametros.Modo, CarregarModulos: true); - var op = Variaveis.OperacaoEmAndamento; + var newOp = CarregarParametrosOperacaoPadrao((ModoOperacao)Parametros.Modo, CarregarModulos: true); - op.Parametros = Parametros; - op.DefinirComponentesEmUso(); + newOp.Parametros = Parametros; + newOp.DefinirComponentesEmUso(); - op.Descricao = Parametros.Descricao; - op.OprPath = opr_path; - if (op.DispSen == null) + newOp.Descricao = Parametros.Descricao; + newOp.OprPath = opr_path; + if (newOp.DispSen == null) { - op.DispSen = new DispositivosService(); + newOp.DispSen = new DispositivosService(); } - //Variaveis.OperacaoEmAndamento.DispSen.Dados.ConfiguracaoSensorUltrassom = Parametros.ConfiguracaoUltrassom; - - List ruasSelecionadas = new List(); - //if (Parametros.Mapa.mapaService.DadosMapa != null) - //{ - // ruasSelecionadas = Parametros.Mapa.RuasPercorrer.ToList(); - // string geoJson = JsonConvert.SerializeObject(Parametros.Mapa.mapaService.DadosMapa, Formatting.None); - // File.WriteAllText(path, geoJson, Encoding.UTF8); - // Variaveis.OperacaoEmAndamento.Mapa = Parametros.Mapa; - // - // /*Panel pnlMapa = FuncoesGlobais.FindControlRecursive(Variaveis.OperacaoEmAndamento.frmOperacao, "pnlMapa"); - // Label lblMapa = FuncoesGlobais.FindControlRecursive