From 36ee6329885d3593c8f9e42c70701a98925606d8 Mon Sep 17 00:00:00 2001 From: Diego Freitas Date: Tue, 30 Jun 2026 10:13:23 -0300 Subject: [PATCH] ajustes para centralizar a operacao em andamento sem chamar instancias globais --- AgroBase/AgroBase/Forms/IHM/frmIHM.cs | 7 +- .../Operacoes/frmOperacaoManual.Designer.cs | 95 +- .../Forms/Operacoes/frmOperacaoManual.cs | 84 +- .../Forms/Operacoes/frmResultadosOperacao.cs | 2 +- AgroBase/AgroBase/Forms/frmInstancial.cs | 101 +-- AgroBase/AgroBase/Forms/frmPrincipal.cs | 2 +- AgroBase/AgroBase/Models/DispositivosModel.cs | 8 +- .../AgroBase/Models/Modules/AtuadorModel.cs | 3 + .../Modules/MovimentacaoUnificadoModel.cs | 14 +- .../Models/Modules/SensoriamentoModel.cs | 24 +- .../Models/Operacoes/OperacaoModel.cs | 843 ++++++++---------- .../Models/TrajetoriaMapaOperacaoModel.cs | 6 +- .../Operadores/HealthWorkerService.cs | 2 + .../Operadores/VisualWorkerService.cs | 2 +- AgroBase/AgroBase/Services/RedisService.cs | 8 +- .../AgroBase/Services/VersionamentoService.cs | 4 +- .../Monitoramento/ParametrizacaoViewModel.cs | 8 +- 17 files changed, 560 insertions(+), 653 deletions(-) diff --git a/AgroBase/AgroBase/Forms/IHM/frmIHM.cs b/AgroBase/AgroBase/Forms/IHM/frmIHM.cs index ec5c092b6..5a3fc9e2f 100644 --- a/AgroBase/AgroBase/Forms/IHM/frmIHM.cs +++ b/AgroBase/AgroBase/Forms/IHM/frmIHM.cs @@ -44,8 +44,9 @@ namespace AgroBase.Forms.IHM }); FuncoesGlobais.DefinirEventosPicBtn(picManual, "Erro ao carregar modo de controle manual!", async () => { - OperacaoModel.CarregarParametrosOperacaoPadrao(ModoOperacao.Manual, true); - if (Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.OperacaoLiberada) + Variaveis.OperacaoEmAndamento = OperacaoModel.CarregarParametrosOperacaoPadrao(ModoOperacao.Manual, CarregarModulos: true); + var op = Variaveis.OperacaoEmAndamento; + if (op.Sensoriamento.Operacao.OperacaoLiberada) { frmDialogoMapa frm = new frmDialogoMapa(); frm.Show(); @@ -55,7 +56,7 @@ namespace AgroBase.Forms.IHM { CustomDialog.ShowDialog( "Iniciar Operação Manual", - $"{Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.ErroOperacaoLiberada ?? ""}", + $"{op.Sensoriamento.Operacao.ErroOperacaoLiberada ?? ""}", MessageBoxIcon.Error, new Dictionary<(string, dynamic), Action>() { diff --git a/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.Designer.cs b/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.Designer.cs index 4851bd67f..7dcb27de8 100644 --- a/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.Designer.cs +++ b/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.Designer.cs @@ -65,6 +65,8 @@ this.lblPotenciaSP = new System.Windows.Forms.Label(); this.btnDeslsigarAgitador = new System.Windows.Forms.Button(); this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.lblVazaoInstantanea = new System.Windows.Forms.Label(); + this.lblPressaoBomba = new System.Windows.Forms.Label(); this.label7 = new System.Windows.Forms.Label(); this.nudPotenciaBombaMax = new System.Windows.Forms.NumericUpDown(); this.label6 = new System.Windows.Forms.Label(); @@ -104,8 +106,7 @@ this.chbSonarAtivado = new System.Windows.Forms.CheckBox(); this.lblPressao = new System.Windows.Forms.Label(); this.chbImuAtivado = new System.Windows.Forms.CheckBox(); - this.lblPressaoBomba = new System.Windows.Forms.Label(); - this.lblVazaoInstantanea = new System.Windows.Forms.Label(); + this.lblReservatorio = new System.Windows.Forms.Label(); ((System.ComponentModel.ISupportInitialize)(this.chartGraficos)).BeginInit(); this.tabControl1.SuspendLayout(); this.tabMapa.SuspendLayout(); @@ -527,6 +528,30 @@ this.groupBox2.TabStop = false; this.groupBox2.Text = "Bomba Pressurizadora"; // + // lblVazaoInstantanea + // + this.lblVazaoInstantanea.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.lblVazaoInstantanea.AutoSize = true; + this.lblVazaoInstantanea.Font = new System.Drawing.Font("Microsoft Sans Serif", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblVazaoInstantanea.Location = new System.Drawing.Point(305, 42); + this.lblVazaoInstantanea.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.lblVazaoInstantanea.Name = "lblVazaoInstantanea"; + this.lblVazaoInstantanea.Size = new System.Drawing.Size(108, 25); + this.lblVazaoInstantanea.TabIndex = 49; + this.lblVazaoInstantanea.Text = "0,00 ml/s"; + // + // lblPressaoBomba + // + this.lblPressaoBomba.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.lblPressaoBomba.AutoSize = true; + this.lblPressaoBomba.Font = new System.Drawing.Font("Microsoft Sans Serif", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblPressaoBomba.Location = new System.Drawing.Point(305, 17); + this.lblPressaoBomba.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.lblPressaoBomba.Name = "lblPressaoBomba"; + this.lblPressaoBomba.Size = new System.Drawing.Size(76, 25); + this.lblPressaoBomba.TabIndex = 48; + this.lblPressaoBomba.Text = "80 psi"; + // // label7 // this.label7.AutoSize = true; @@ -822,11 +847,11 @@ // this.lblTensao.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.lblTensao.AutoSize = true; - this.lblTensao.Font = new System.Drawing.Font("Microsoft Sans Serif", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lblTensao.Location = new System.Drawing.Point(1111, 351); + this.lblTensao.Font = new System.Drawing.Font("Microsoft Sans Serif", 21.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblTensao.Location = new System.Drawing.Point(1111, 320); this.lblTensao.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.lblTensao.Name = "lblTensao"; - this.lblTensao.Size = new System.Drawing.Size(136, 37); + this.lblTensao.Size = new System.Drawing.Size(121, 33); this.lblTensao.TabIndex = 29; this.lblTensao.Text = "42,00 V"; // @@ -834,11 +859,11 @@ // this.lblCorrente.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.lblCorrente.AutoSize = true; - this.lblCorrente.Font = new System.Drawing.Font("Microsoft Sans Serif", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lblCorrente.Location = new System.Drawing.Point(1111, 388); + this.lblCorrente.Font = new System.Drawing.Font("Microsoft Sans Serif", 21.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblCorrente.Location = new System.Drawing.Point(1111, 357); this.lblCorrente.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.lblCorrente.Name = "lblCorrente"; - this.lblCorrente.Size = new System.Drawing.Size(134, 37); + this.lblCorrente.Size = new System.Drawing.Size(121, 33); this.lblCorrente.TabIndex = 30; this.lblCorrente.Text = "10,00 A"; // @@ -846,11 +871,11 @@ // this.lblRPM.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.lblRPM.AutoSize = true; - this.lblRPM.Font = new System.Drawing.Font("Microsoft Sans Serif", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lblRPM.Location = new System.Drawing.Point(1111, 426); + this.lblRPM.Font = new System.Drawing.Font("Microsoft Sans Serif", 21.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblRPM.Location = new System.Drawing.Point(1111, 395); this.lblRPM.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.lblRPM.Name = "lblRPM"; - this.lblRPM.Size = new System.Drawing.Size(137, 37); + this.lblRPM.Size = new System.Drawing.Size(125, 33); this.lblRPM.TabIndex = 31; this.lblRPM.Text = "45 RPM"; // @@ -858,11 +883,11 @@ // this.lblVelocidade.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.lblVelocidade.AutoSize = true; - this.lblVelocidade.Font = new System.Drawing.Font("Microsoft Sans Serif", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lblVelocidade.Location = new System.Drawing.Point(1111, 463); + this.lblVelocidade.Font = new System.Drawing.Font("Microsoft Sans Serif", 21.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblVelocidade.Location = new System.Drawing.Point(1111, 432); this.lblVelocidade.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.lblVelocidade.Name = "lblVelocidade"; - this.lblVelocidade.Size = new System.Drawing.Size(101, 37); + this.lblVelocidade.Size = new System.Drawing.Size(92, 33); this.lblVelocidade.TabIndex = 32; this.lblVelocidade.Text = "10,00"; // @@ -870,7 +895,7 @@ // this.lblKmh.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.lblKmh.AutoSize = true; - this.lblKmh.Location = new System.Drawing.Point(1208, 480); + this.lblKmh.Location = new System.Drawing.Point(1207, 448); this.lblKmh.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.lblKmh.Name = "lblKmh"; this.lblKmh.Size = new System.Drawing.Size(32, 13); @@ -933,11 +958,11 @@ // this.lblPressao.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.lblPressao.AutoSize = true; - this.lblPressao.Font = new System.Drawing.Font("Microsoft Sans Serif", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lblPressao.Location = new System.Drawing.Point(1111, 500); + this.lblPressao.Font = new System.Drawing.Font("Microsoft Sans Serif", 21.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblPressao.Location = new System.Drawing.Point(1111, 469); this.lblPressao.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.lblPressao.Name = "lblPressao"; - this.lblPressao.Size = new System.Drawing.Size(109, 37); + this.lblPressao.Size = new System.Drawing.Size(99, 33); this.lblPressao.TabIndex = 38; this.lblPressao.Text = "80 psi"; // @@ -953,29 +978,17 @@ this.chbImuAtivado.UseVisualStyleBackColor = true; this.chbImuAtivado.CheckedChanged += new System.EventHandler(this.chbImuAtivado_CheckedChanged); // - // lblPressaoBomba + // lblReservatorio // - this.lblPressaoBomba.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.lblPressaoBomba.AutoSize = true; - this.lblPressaoBomba.Font = new System.Drawing.Font("Microsoft Sans Serif", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lblPressaoBomba.Location = new System.Drawing.Point(305, 17); - this.lblPressaoBomba.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); - this.lblPressaoBomba.Name = "lblPressaoBomba"; - this.lblPressaoBomba.Size = new System.Drawing.Size(76, 25); - this.lblPressaoBomba.TabIndex = 48; - this.lblPressaoBomba.Text = "80 psi"; - // - // lblVazaoInstantanea - // - this.lblVazaoInstantanea.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.lblVazaoInstantanea.AutoSize = true; - this.lblVazaoInstantanea.Font = new System.Drawing.Font("Microsoft Sans Serif", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lblVazaoInstantanea.Location = new System.Drawing.Point(305, 42); - this.lblVazaoInstantanea.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); - this.lblVazaoInstantanea.Name = "lblVazaoInstantanea"; - this.lblVazaoInstantanea.Size = new System.Drawing.Size(108, 25); - this.lblVazaoInstantanea.TabIndex = 49; - this.lblVazaoInstantanea.Text = "0,00 ml/s"; + this.lblReservatorio.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.lblReservatorio.AutoSize = true; + this.lblReservatorio.Font = new System.Drawing.Font("Microsoft Sans Serif", 21.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblReservatorio.Location = new System.Drawing.Point(1111, 502); + this.lblReservatorio.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.lblReservatorio.Name = "lblReservatorio"; + this.lblReservatorio.Size = new System.Drawing.Size(75, 33); + this.lblReservatorio.TabIndex = 40; + this.lblReservatorio.Text = "60 L"; // // frmOperacaoManual // @@ -983,6 +996,7 @@ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.BackColor = System.Drawing.Color.White; this.ClientSize = new System.Drawing.Size(1243, 649); + this.Controls.Add(this.lblReservatorio); this.Controls.Add(this.chbImuAtivado); this.Controls.Add(this.lblPressao); this.Controls.Add(this.chbSonarAtivado); @@ -1118,5 +1132,6 @@ private System.Windows.Forms.CheckBox chbImuAtivado; private System.Windows.Forms.Label lblPressaoBomba; private System.Windows.Forms.Label lblVazaoInstantanea; + private System.Windows.Forms.Label lblReservatorio; } } \ No newline at end of file diff --git a/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.cs b/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.cs index 9cdcf7cea..452c3d56a 100644 --- a/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.cs +++ b/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.cs @@ -16,6 +16,7 @@ namespace AgroBase.Forms.Operacoes AsyncTaskTimerModel tmrLeitura; bool ReqFrameCam = false; bool ReqFrameSnr = false; + OperacaoModel op => Variaveis.OperacaoEmAndamento; public frmOperacaoManual() { @@ -40,11 +41,11 @@ namespace AgroBase.Forms.Operacoes private void frmOperacaoManual_Load(object sender, EventArgs e) { - var pC = Variaveis.OperacaoEmAndamento.Parametros.Controle; + var pC = op.Parametros.Controle; cmbTipoMovimento.Items.Clear(); cmbTipoMovimento.Items.AddRange(Enum.GetNames(typeof(TipoMovimentoDirecional))); - cmbTipoMovimento.SelectedIndex = (int)Variaveis.OperacaoEmAndamento.Controle.TipoMovimento; + cmbTipoMovimento.SelectedIndex = (int)op.Controle.TipoMovimento; cmbModoBomba.Items.Clear(); cmbModoBomba.Items.AddRange(Enum.GetNames(typeof(ModoControleBomba))); @@ -54,7 +55,7 @@ namespace AgroBase.Forms.Operacoes cmbModoAgitador.Items.AddRange(Enum.GetNames(typeof(ModoAgitadorCalda))); cmbModoAgitador.SelectedIndex = (int)pC.AtuAgitadorModo; - var b = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombaPressurizadora; + var b = op.DispAtu.Dados.BombaPressurizadora; if (b != null) { txtKp.Text = b.Controle.Kp.ToString(); @@ -98,7 +99,7 @@ namespace AgroBase.Forms.Operacoes private void frmOperacaoManual_FormClosing(object sender, FormClosingEventArgs e) { tmrLeitura.Dispose(); - Task.Run(async () => await Variaveis.OperacaoEmAndamento.FinalizarOperacao()); + Task.Run(async () => await op.FinalizarOperacao()); } private void btnIniciarOperacao_Click(object sender, EventArgs e) @@ -113,7 +114,7 @@ namespace AgroBase.Forms.Operacoes }); // Executa a finalização da operação - Task.Run(async () => await Variaveis.OperacaoEmAndamento.FinalizarOperacao()); + Task.Run(async () => await op.FinalizarOperacao()); // Atualiza a UI novamente na thread principal btnIniciarOperacao.Invoke((MethodInvoker)delegate @@ -132,10 +133,10 @@ namespace AgroBase.Forms.Operacoes }); // Verifica se a operação está liberada - if (Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.OperacaoLiberada) + if (op.Sensoriamento.Operacao.OperacaoLiberada) { // Inicia a operação de forma assíncrona - Task.Run(async () => await Variaveis.OperacaoEmAndamento.IniciarOperacao()); + Task.Run(async () => await op.IniciarOperacao()); // Atualiza a UI após o início da operação btnIniciarOperacao.Invoke((MethodInvoker)delegate @@ -149,7 +150,7 @@ namespace AgroBase.Forms.Operacoes // Mostra a mensagem de erro na thread principal btnIniciarOperacao.Invoke((MethodInvoker)delegate { - MessageBox.Show(Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.ErroOperacaoLiberada, "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show(op.Sensoriamento.Operacao.ErroOperacaoLiberada, "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Error); btnIniciarOperacao.Text = "Iniciar Operação"; btnIniciarOperacao.Enabled = true; }); @@ -162,7 +163,7 @@ namespace AgroBase.Forms.Operacoes { try { - this.Text = Variaveis.OperacaoEmAndamento.TextoFormOperacao("Manual"); + this.Text = op.TextoFormOperacao("Manual"); pnlDir_DF.Invalidate(); pnlDir_DT.Invalidate(); @@ -174,7 +175,7 @@ namespace AgroBase.Forms.Operacoes AtualizarInformacoesGerais(); - var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento; + var _Sensoriamento = op.Sensoriamento; lblDistanciaEsquerda.Text = "Distancia Esq: " + _Sensoriamento.Trajetoria.DistanciaEsquerda.ToString("0.00") + " cm"; lblDistanciaDireita.Text = "Distancia Dir: " + _Sensoriamento.Trajetoria.DistanciaDireita.ToString("0.00") + " cm"; @@ -189,24 +190,25 @@ namespace AgroBase.Forms.Operacoes lblRPM.Text = _Sensoriamento.Movimentacao.RPMRodaMedio.ToString("0") + " rpm"; lblVelocidade.Text = (_Sensoriamento.Movimentacao.VelocidadeMediaMs * 3.6).ToString("0.00"); lblPressao.Text = $"{(_Sensoriamento.Atuador.PressaoLinha):F0} psi"; - lblPressaoBomba.Text = $"{(_Sensoriamento.Atuador.PressaoAtualBomba):F0} psi"; + lblReservatorio.Text = $"{(_Sensoriamento.Atuador.VolumeReservatorio):F1} L"; + lblPressaoBomba.Text = $"{(_Sensoriamento.Atuador.PressaoAtualBomba):F1} psi"; lblVazaoInstantanea.Text = $"{(_Sensoriamento.Atuador.VazaoFluxoMLpSInstantaneaCorrigida):F0} ml/s"; - bool atuadorAtivado = Variaveis.OperacaoEmAndamento.DispAtu.Dados.Conectado; + bool atuadorAtivado = op.DispAtu.Dados.Conectado; chbPulverizador.Enabled = atuadorAtivado; if (!atuadorAtivado) { chbPulverizador.Checked = false; } - bool sonarAtivado = Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorVisual.Status == StatusModulo.Operante; + bool sonarAtivado = op.Sensoriamento.OperadorVisual.Status == StatusModulo.Operante; chbSonarAtivado.Enabled = sonarAtivado; if (!sonarAtivado) { chbSonarAtivado.Checked = false; } - bool imuAtivado = Variaveis.OperacaoEmAndamento.Sensoriamento.IMU.saude.status == StatusModulo.Operante; + bool imuAtivado = op.Sensoriamento.IMU.saude.status == StatusModulo.Operante; chbImuAtivado.Enabled = imuAtivado; if (!imuAtivado) { @@ -252,7 +254,7 @@ namespace AgroBase.Forms.Operacoes //var frameSeg = await VisualWorkerService.GetCameraFrame(CameraFrameType.Segmentacao); //AtualizarImagemPainel(pnlDeteccoesRua, frameSeg?.image()); - var dadosSeg = Variaveis.OperacaoEmAndamento.Sensoriamento?.OperadorVisual?.Analises?.segmentacao; + var dadosSeg = op.Sensoriamento?.OperadorVisual?.Analises?.segmentacao; lblStatusCarroMapa.Text = $"Status: {dadosSeg?.status_corredor ?? StatusCarroMapa.Indefinido} | Conf: {dadosSeg?.status_corredor_debug?.status_modelo_conf ?? 0}"; } finally @@ -299,7 +301,7 @@ namespace AgroBase.Forms.Operacoes Panel pnl = (Panel)sender; string ID = pnl.Name.Replace("pnlDir_", ""); - var Modulo = Variaveis.OperacaoEmAndamento.DispMvd.Dados.Modulos.FirstOrDefault(m => m.Modulo_ID == ID); + var Modulo = op.DispMvd.Dados.Modulos.FirstOrDefault(m => m.Modulo_ID == ID); double Angulo = Modulo.DirMotor.AnguloDriver; double AnguloReal = Modulo.DirMotor.AnguloReal; @@ -461,8 +463,8 @@ namespace AgroBase.Forms.Operacoes { try { - double angulo = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps?.OrientacaoReal ?? 0; - double angulo2 = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps?.AnguloCarroDefinido ?? 0; + double angulo = op.Sensoriamento.Gps?.OrientacaoReal ?? 0; + double angulo2 = op.Sensoriamento.Gps?.AnguloCarroDefinido ?? 0; FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)angulo, -90, (float)angulo2); } catch { } @@ -470,7 +472,7 @@ namespace AgroBase.Forms.Operacoes private void pnlAnguloMagnetometro_Paint(object sender, PaintEventArgs e) { - var imu = Variaveis.OperacaoEmAndamento.Sensoriamento.IMU; + var imu = op.Sensoriamento.IMU; try { double angulo = imu?.yaw ?? 0; @@ -550,7 +552,7 @@ namespace AgroBase.Forms.Operacoes private void AtualizarInformacoesGerais() { - var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento; + var _Sensoriamento = op.Sensoriamento; var _Bateria = _Sensoriamento?.Bateria; var _Barramentos = _Bateria?.Barramentos; var _Movimentacao = _Sensoriamento?.Movimentacao; @@ -580,7 +582,7 @@ namespace AgroBase.Forms.Operacoes gridDados.Rows[20].Cells[1].Value = (_Barramentos.FirstOrDefault(x => x.ID == "AB24V")?.Corrente ?? 0).ToString("0.00"); gridDados.Rows[21].Cells[1].Value = ""; gridDados.Rows[22].Cells[1].Value = (_Atuador?.PercentualReservatorio ?? 0).ToString("0.00"); - gridDados.Rows[23].Cells[1].Value = $"{_Atuador?.MassaReservatorio ?? 0:0.000} ({Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.ContadorCarga?.MassaAtual_Kg_Calc ?? 0:0.000})"; + gridDados.Rows[23].Cells[1].Value = $"{_Atuador?.MassaReservatorio ?? 0:0.000} ({op.DispAtu?.Dados?.ContadorCarga?.MassaAtual_Kg_Calc ?? 0:0.000})"; gridDados.Rows[24].Cells[1].Value = $"{_Atuador?.VolumeReservatorio ?? 0:0.000}"; gridDados.Rows[25].Cells[1].Value = (_Atuador?.LPorMetro ?? 0).ToString("0.000"); gridDados.Rows[26].Cells[1].Value = (_Atuador?.LPorMinuto ?? 0).ToString("0.000"); @@ -594,7 +596,7 @@ namespace AgroBase.Forms.Operacoes gridDados.Rows[34].Cells[1].Value = (_Atuador?.VolumeVazaoML ?? 0).ToString("0.00"); gridDados.Rows[35].Cells[1].Value = (_Atuador?.AnguloBarraEsquerda ?? 0).ToString("0.00"); gridDados.Rows[36].Cells[1].Value = (_Atuador?.AnguloBarraDireita ?? 0).ToString("0.00"); - gridDados.Rows[37].Cells[1].Value = (Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.AgitadorDeCalda?._Potencia ?? 0).ToString("0.00"); + gridDados.Rows[37].Cells[1].Value = (op.DispAtu?.Dados?.AgitadorDeCalda?._Potencia ?? 0).ToString("0.00"); gridDados.Rows[38].Cells[1].Value = ""; gridDados.Rows[39].Cells[1].Value = (_IMU?.RollSeguro ?? 0).ToString("0.00"); gridDados.Rows[40].Cells[1].Value = (_IMU?.PitchSeguro ?? 0).ToString("0.00"); @@ -607,11 +609,11 @@ namespace AgroBase.Forms.Operacoes private void InicializarMapa() { - Variaveis.OperacaoEmAndamento.Mapa = new MapasModel() + op.Mapa = new MapasModel() { pnlMapa = pnlMapa, }; - Variaveis.OperacaoEmAndamento.Mapa.CarregarMapaGPS(); + op.Mapa.CarregarMapaGPS(); } #endregion @@ -620,15 +622,15 @@ namespace AgroBase.Forms.Operacoes private void PopularBicos() { - var Atuador = Variaveis.OperacaoEmAndamento.DispAtu; + var Atuador = op.DispAtu; int panelWidth = pnlAtuadores.Width; int circleDiameter = 40; // Diâmetro dos círculos grandes - int spaceBetweenCircles = (panelWidth - (circleDiameter * (Variaveis.OperacaoEmAndamento.Parametros.QtdBicos ?? VariaveisEquipamento.QuantidadeBicosPulverizadores))) / ((Variaveis.OperacaoEmAndamento.Parametros.QtdBicos ?? VariaveisEquipamento.QuantidadeBicosPulverizadores) + 1); + int spaceBetweenCircles = (panelWidth - (circleDiameter * (op.Parametros.QtdBicos ?? VariaveisEquipamento.QuantidadeBicosPulverizadores))) / ((op.Parametros.QtdBicos ?? VariaveisEquipamento.QuantidadeBicosPulverizadores) + 1); int yPosition = (pnlAtuadores.Height - circleDiameter) / 3; // Centralizado verticalmente - for (int i = 0; i < Variaveis.OperacaoEmAndamento.Parametros.QtdBicos; i++) + for (int i = 0; i < op.Parametros.QtdBicos; i++) { // Calcula a posição x do círculo int xPosition = spaceBetweenCircles + (i * (circleDiameter + spaceBetweenCircles)); @@ -662,7 +664,7 @@ namespace AgroBase.Forms.Operacoes { Button btn = (Button)sender; string ID = btn.Name.Replace("btn_", ""); - var Bico = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BicosPulverizadores.FirstOrDefault(x => x.ID == ID); + var Bico = op.DispAtu.Dados.BicosPulverizadores.FirstOrDefault(x => x.ID == ID); if (Bico != null) { bool comando = !Bico.ComandoAtuar; @@ -675,10 +677,10 @@ namespace AgroBase.Forms.Operacoes private void btnLigarBomba_Click(object sender, EventArgs e) { - var Bomba = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombaPressurizadora; + var Bomba = op.DispAtu.Dados.BombaPressurizadora; if (Bomba != null) { - Variaveis.OperacaoEmAndamento.Parametros.Controle.AtuModoControle = (ModoControleBomba)cmbModoBomba.SelectedIndex; + op.Parametros.Controle.AtuModoControle = (ModoControleBomba)cmbModoBomba.SelectedIndex; double pressao = Convert.ToInt32(nudPressaoSP.Value); double potMin = Convert.ToInt32(nudPotenciaBombaMin.Value); @@ -693,17 +695,17 @@ namespace AgroBase.Forms.Operacoes private void btnDesligarBomba_Click(object sender, EventArgs e) { - var Bomba = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombaPressurizadora; + var Bomba = op.DispAtu.Dados.BombaPressurizadora; if (Bomba != null) GeneralJoystick.EnviarComandoAtuador(Bomba.Componente, Bomba.ID, Status: false, Comando: CanMessagePosicaoDados.Command1, Forcar: true); } private void btnLigarAgitador_Click(object sender, EventArgs e) { - var Agitador = Variaveis.OperacaoEmAndamento.DispAtu.Dados.AgitadorDeCalda; + var Agitador = op.DispAtu.Dados.AgitadorDeCalda; if (Agitador != null) { - Variaveis.OperacaoEmAndamento.Parametros.Controle.AtuAgitadorModo = (ModoAgitadorCalda)cmbModoAgitador.SelectedIndex; + op.Parametros.Controle.AtuAgitadorModo = (ModoAgitadorCalda)cmbModoAgitador.SelectedIndex; double potencia = Convert.ToInt32(nudPotenciaAgitador.Value); GeneralJoystick.EnviarComandoAtuador(Agitador.Componente, Agitador.ID, Status: true, Valores: new System.Collections.Generic.List() { potencia }, Comando: CanMessagePosicaoDados.Command1, Forcar: true); @@ -712,7 +714,7 @@ namespace AgroBase.Forms.Operacoes private void btnDeslsigarAgitador_Click(object sender, EventArgs e) { - var Agitador = Variaveis.OperacaoEmAndamento.DispAtu.Dados.AgitadorDeCalda; + var Agitador = op.DispAtu.Dados.AgitadorDeCalda; if (Agitador != null) GeneralJoystick.EnviarComandoAtuador(Agitador.Componente, Agitador.ID, Status: false, Comando: CanMessagePosicaoDados.Command1, Forcar: true); } @@ -729,7 +731,7 @@ namespace AgroBase.Forms.Operacoes private void pnlAtuadores_Paint(object sender, PaintEventArgs e) { - var Atuador = Variaveis.OperacaoEmAndamento.DispAtu.Dados; + var Atuador = op.DispAtu.Dados; bool ligado = Atuador.BombaPressurizadora?._BombaLigada ?? false; AtuadorFuncoesGerais.DesenharAtuadores( @@ -759,29 +761,29 @@ namespace AgroBase.Forms.Operacoes private void cmbTipoMovimento_SelectedIndexChanged(object sender, EventArgs e) { - Variaveis.OperacaoEmAndamento.Controle.TipoMovimento = (TipoMovimentoDirecional)cmbTipoMovimento.SelectedIndex; + op.Controle.TipoMovimento = (TipoMovimentoDirecional)cmbTipoMovimento.SelectedIndex; } private void chbPulverizador_CheckedChanged(object sender, EventArgs e) { - Variaveis.OperacaoEmAndamento.Parametros.Controle.PulverizadorAutomatico = ((CheckBox)sender).Checked; + op.Parametros.Controle.PulverizadorAutomatico = ((CheckBox)sender).Checked; - if (!Variaveis.OperacaoEmAndamento.Parametros.Controle.PulverizadorAutomatico && Variaveis.OperacaoEmAndamento.Controle.Bicos.Any(x => x.ComandoAtuar)) + if (!op.Parametros.Controle.PulverizadorAutomatico && op.Controle.Bicos.Any(x => x.ComandoAtuar)) { - Variaveis.OperacaoEmAndamento.Controle.Bicos.ForEach(b => b.ComandoAtuar = false); + op.Controle.Bicos.ForEach(b => b.ComandoAtuar = false); } } private void chbSonarAtivado_CheckedChanged(object sender, EventArgs e) { - var pC = Variaveis.OperacaoEmAndamento.Parametros.Controle; + var pC = op.Parametros.Controle; pC.MovAuxilioSonar = ((CheckBox)sender).Checked; pC.DirAuxilioSonar = ((CheckBox)sender).Checked; } private void chbImuAtivado_CheckedChanged(object sender, EventArgs e) { - var pC = Variaveis.OperacaoEmAndamento.Parametros.Controle; + var pC = op.Parametros.Controle; pC.ImuAuxilioMovimento = ((CheckBox)sender).Checked; pC.ImuAuxilioDirecional = ((CheckBox)sender).Checked; pC.ImuDirecionalPreferirArco = ((CheckBox)sender).Checked; diff --git a/AgroBase/AgroBase/Forms/Operacoes/frmResultadosOperacao.cs b/AgroBase/AgroBase/Forms/Operacoes/frmResultadosOperacao.cs index 9b27d7a41..8e26148a9 100644 --- a/AgroBase/AgroBase/Forms/Operacoes/frmResultadosOperacao.cs +++ b/AgroBase/AgroBase/Forms/Operacoes/frmResultadosOperacao.cs @@ -1763,7 +1763,7 @@ namespace AgroBase.Forms.Operacoes } // agrupar por tipo - var porTipo = dict.GroupBy(kv => CandMpcKey.ParseKey(kv.Key).Tipo); + var porTipo = dict.Where(x => x.Key.Contains("_")).GroupBy(kv => CandMpcKey.ParseKey(kv.Key).Tipo); foreach (var g in porTipo.OrderBy(gr => gr.Key.ToString())) { var tipoNode = tv.Nodes.Add(g.Key.ToString()); diff --git a/AgroBase/AgroBase/Forms/frmInstancial.cs b/AgroBase/AgroBase/Forms/frmInstancial.cs index 557c4c654..31f1fadb8 100644 --- a/AgroBase/AgroBase/Forms/frmInstancial.cs +++ b/AgroBase/AgroBase/Forms/frmInstancial.cs @@ -240,11 +240,9 @@ namespace AgroBase.Forms return EncerrarProcessos(sairProcesso: false); } - public static async Task EncerrarProcessos( - bool sairProcesso) + public static async Task EncerrarProcessos(bool sairProcesso) { - await _shutdownGate.WaitAsync() - .ConfigureAwait(false); + await _shutdownGate.WaitAsync().ConfigureAwait(false); try { @@ -253,9 +251,7 @@ namespace AgroBase.Forms _shutdownIniciado = true; - await EncerrarProcessosInternoAsync( - sairProcesso - ).ConfigureAwait(false); + await EncerrarProcessosInternoAsync(sairProcesso).ConfigureAwait(false); } finally { @@ -263,8 +259,7 @@ namespace AgroBase.Forms } } - private static async Task EncerrarProcessosInternoAsync( - bool sairProcesso) + private static async Task EncerrarProcessosInternoAsync(bool sairProcesso) { Variaveis.Fechando = true; @@ -276,32 +271,22 @@ namespace AgroBase.Forms */ try { - await AsyncTaskTimerModel - .PararTimersAsync() - .ConfigureAwait(false); + await AsyncTaskTimerModel.PararTimersAsync().ConfigureAwait(false); } catch (Exception ex) { - Variaveis.MostrarLog( - "[frmInstancial.Encerrar] Erro ao parar timers: " + - ex.Message - ); + Variaveis.MostrarLog("[frmInstancial.Encerrar] Erro ao parar timers: " + ex.Message); } tmrVarreduraDispositivos = null; try { - await SerialService - .EncerrarAsync() - .ConfigureAwait(false); + await SerialService.EncerrarAsync().ConfigureAwait(false); } catch (Exception ex) { - Variaveis.MostrarLog( - "[frmInstancial.Encerrar] Erro ao encerrar SerialService: " + - ex.Message - ); + Variaveis.MostrarLog("[frmInstancial.Encerrar] Erro ao encerrar SerialService: " + ex.Message); } /* @@ -318,19 +303,13 @@ namespace AgroBase.Forms } catch (Exception ex) { - Variaveis.MostrarLog( - "[frmInstancial.Encerrar] Erro ao salvar " + - disp.Dispositivo + ": " + ex.Message - ); + Variaveis.MostrarLog("[frmInstancial.Encerrar] Erro ao salvar " + disp.Dispositivo + ": " + ex.Message); } } } catch (Exception ex) { - Variaveis.MostrarLog( - "[frmInstancial.Encerrar] Erro ao percorrer dispositivos: " + - ex.Message - ); + Variaveis.MostrarLog("[frmInstancial.Encerrar] Erro ao percorrer dispositivos: " + ex.Message); } /* @@ -342,19 +321,14 @@ namespace AgroBase.Forms { var timeout = DateTime.Now.AddSeconds(10); - while (!CanManager.CanService.FilaLiberada && - DateTime.Now < timeout) + while (!CanManager.CanService.FilaLiberada && DateTime.Now < timeout) { - await Task.Delay(200) - .ConfigureAwait(false); + await Task.Delay(200).ConfigureAwait(false); } } catch (Exception ex) { - Variaveis.MostrarLog( - "[frmInstancial.Encerrar] Erro aguardando fila CAN: " + - ex.Message - ); + Variaveis.MostrarLog("[frmInstancial.Encerrar] Erro aguardando fila CAN: " + ex.Message); } try @@ -363,10 +337,7 @@ namespace AgroBase.Forms } catch (Exception ex) { - Variaveis.MostrarLog( - "[frmInstancial.Encerrar] Erro ao encerrar Livox: " + - ex.Message - ); + Variaveis.MostrarLog("[frmInstancial.Encerrar] Erro ao encerrar Livox: " + ex.Message); } try @@ -375,10 +346,7 @@ namespace AgroBase.Forms } catch (Exception ex) { - Variaveis.MostrarLog( - "[frmInstancial.Encerrar] Erro ao encerrar Python: " + - ex.Message - ); + Variaveis.MostrarLog("[frmInstancial.Encerrar] Erro ao encerrar Python: " + ex.Message); } try @@ -387,38 +355,25 @@ namespace AgroBase.Forms } catch (Exception ex) { - Variaveis.MostrarLog( - "[frmInstancial.Encerrar] Erro ao encerrar UDP: " + - ex.Message - ); + Variaveis.MostrarLog("[frmInstancial.Encerrar] Erro ao encerrar UDP: " + ex.Message); } try { - await GPSService - .EncerrarAsync() - .ConfigureAwait(false); + await GPSService.EncerrarAsync().ConfigureAwait(false); } catch (Exception ex) { - Variaveis.MostrarLog( - "[frmInstancial.Encerrar] Erro ao encerrar GPS: " + - ex.Message - ); + Variaveis.MostrarLog("[frmInstancial.Encerrar] Erro ao encerrar GPS: " + ex.Message); } try { - await Variaveis - .EncerrarMqttAsync() - .ConfigureAwait(false); + await Variaveis.EncerrarMqttAsync().ConfigureAwait(false); } catch (Exception ex) { - Variaveis.MostrarLog( - "[frmInstancial.Encerrar] Erro ao encerrar MQTT: " + - ex.Message - ); + Variaveis.MostrarLog("[frmInstancial.Encerrar] Erro ao encerrar MQTT: " + ex.Message); } try @@ -440,9 +395,7 @@ namespace AgroBase.Forms } } - private async void frmPrincipal_FormClosing( - object sender, - FormClosingEventArgs e) + private async void frmPrincipal_FormClosing(object sender, FormClosingEventArgs e) { if (_allowClose) return; @@ -451,9 +404,7 @@ namespace AgroBase.Forms try { - await EncerrarProcessos( - sairProcesso: false - ); + await EncerrarProcessos(sairProcesso: false); _allowClose = true; @@ -470,9 +421,7 @@ namespace AgroBase.Forms } catch (Exception ex) { - Variaveis.MostrarLog( - "[frmInstancial.FormClosing] " + ex - ); + Variaveis.MostrarLog("[frmInstancial.FormClosing] " + ex); try { @@ -482,9 +431,7 @@ namespace AgroBase.Forms } } - private void FrmIHM_FormClosing( - object sender, - FormClosingEventArgs e) + private void FrmIHM_FormClosing(object sender, FormClosingEventArgs e) { /* * Em modo desenvolvimento, fechar a IHM apenas oculta a janela. diff --git a/AgroBase/AgroBase/Forms/frmPrincipal.cs b/AgroBase/AgroBase/Forms/frmPrincipal.cs index 0aa383c0e..833d67c2c 100644 --- a/AgroBase/AgroBase/Forms/frmPrincipal.cs +++ b/AgroBase/AgroBase/Forms/frmPrincipal.cs @@ -208,7 +208,7 @@ namespace AgroBase private void cmbModoOperacao_SelectedIndexChanged(object sender, EventArgs e) { - OperacaoModel.CarregarParametrosOperacaoPadrao((ModoOperacao)cmbModoOperacao.SelectedIndex, true); + Variaveis.OperacaoEmAndamento = OperacaoModel.CarregarParametrosOperacaoPadrao((ModoOperacao)cmbModoOperacao.SelectedIndex, CarregarModulos: true); } private void btnIniciarOperacao_Click(object sender, EventArgs e) diff --git a/AgroBase/AgroBase/Models/DispositivosModel.cs b/AgroBase/AgroBase/Models/DispositivosModel.cs index 7aeaa11d4..4eb260152 100644 --- a/AgroBase/AgroBase/Models/DispositivosModel.cs +++ b/AgroBase/AgroBase/Models/DispositivosModel.cs @@ -38,11 +38,11 @@ namespace AgroBase.Models public void AtualizarDados() { var saude = Variaveis.OperacaoEmAndamento.Sensoriamento?.OperadorSaude?.ModulosSaude; - Status = saude.FirstOrDefault(x => x.modulo == Dispositivo)?.status ?? StatusModulo.Desconectado; - Saude = saude.FirstOrDefault(x => x.modulo == Dispositivo)?.saude ?? 0; + Status = saude?.FirstOrDefault(x => x.modulo == Dispositivo)?.status ?? StatusModulo.Desconectado; + Saude = saude?.FirstOrDefault(x => x.modulo == Dispositivo)?.saude ?? 0; - var motivos = saude.FirstOrDefault(x => x.modulo == Dispositivo)?.motivos ?? new System.Collections.Generic.List(); - var cond_op = saude.FirstOrDefault(x => x.modulo == Dispositivo)?.condicoes_operacionais?.Select(x => x.descricao) ?? new System.Collections.Generic.List(); + var motivos = saude?.FirstOrDefault(x => x.modulo == Dispositivo)?.motivos ?? new System.Collections.Generic.List(); + var cond_op = saude?.FirstOrDefault(x => x.modulo == Dispositivo)?.condicoes_operacionais?.Select(x => x.descricao) ?? new System.Collections.Generic.List(); string motivos_str = string.Join(", ", motivos); string cond_op_str = string.Join(", ", cond_op); Erros = motivos_str + (motivos.Any() && cond_op.Any() ? ", " : "") + cond_op_str; diff --git a/AgroBase/AgroBase/Models/Modules/AtuadorModel.cs b/AgroBase/AgroBase/Models/Modules/AtuadorModel.cs index a7017a2de..d4c4569dd 100644 --- a/AgroBase/AgroBase/Models/Modules/AtuadorModel.cs +++ b/AgroBase/AgroBase/Models/Modules/AtuadorModel.cs @@ -60,10 +60,13 @@ namespace AgroBase.Models.Modules public List BombasPressurizadoras { get; set; } public List Sensores { get; set; } + [JsonIgnore] public AsyncTaskTimerModel tmrRegistrador; private int _TempoReconexaoComponentes = 5; private int _VezesLeituraReconexao = 0; public AtuadorMensagemJsonModel DadosLeitura { get; set; } = new AtuadorMensagemJsonModel(); + + [JsonIgnore] public AtuHandler _AtuHandler = new AtuHandler(); [JsonIgnore] diff --git a/AgroBase/AgroBase/Models/Modules/MovimentacaoUnificadoModel.cs b/AgroBase/AgroBase/Models/Modules/MovimentacaoUnificadoModel.cs index 293da5e0a..fb1fcdf38 100644 --- a/AgroBase/AgroBase/Models/Modules/MovimentacaoUnificadoModel.cs +++ b/AgroBase/AgroBase/Models/Modules/MovimentacaoUnificadoModel.cs @@ -1,4 +1,5 @@ using AgroBase.Services; +using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Data; @@ -40,8 +41,11 @@ namespace AgroBase.Models.Modules public DateTime UltimoTickRegistrador = DateTime.MinValue; public static int LogsManter { get; set; } = 60; + [JsonIgnore] public AsyncTaskTimerModel tmrRegistrador; + [JsonIgnore] public AsyncTaskTimerModel tmrRegistradorMOV; + [JsonIgnore] public AsyncTaskTimerModel tmrRegistradorDIR; @@ -525,7 +529,10 @@ namespace AgroBase.Models.Modules var DispMvd = op.DispMvd; if (DispMvd != null) { - var calMov = op.Sensoriamento.Operacao.ModsCalibragem[T_Code.Mov]; + var mc = op.Sensoriamento.Operacao.ModsCalibragem; + if (!mc.ContainsKey(T_Code.Mov)) + mc.Add(T_Code.Mov, new Dictionary()); + var calMov = mc[T_Code.Mov]; foreach (var mod in DispMvd.Dados.Modulos) { calMov.TryGetValue(mod.Modulo_ID, out var cal); @@ -546,7 +553,10 @@ namespace AgroBase.Models.Modules var DispMvd = op.DispMvd; if (DispMvd != null) { - var calDir = op.Sensoriamento.Operacao.ModsCalibragem[T_Code.Dir]; + var mc = op.Sensoriamento.Operacao.ModsCalibragem; + if (!mc.ContainsKey(T_Code.Dir)) + mc.Add(T_Code.Dir, new Dictionary()); + var calDir = mc[T_Code.Dir]; foreach (var mod in DispMvd.Dados.Modulos) { calDir.TryGetValue(mod.Modulo_ID, out var cal); diff --git a/AgroBase/AgroBase/Models/Modules/SensoriamentoModel.cs b/AgroBase/AgroBase/Models/Modules/SensoriamentoModel.cs index 9962a1318..67424fc7e 100644 --- a/AgroBase/AgroBase/Models/Modules/SensoriamentoModel.cs +++ b/AgroBase/AgroBase/Models/Modules/SensoriamentoModel.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using static AgroBase.Models.Enums; using System.Globalization; using System.Data; +using Newtonsoft.Json; namespace AgroBase.Models.Modules { @@ -53,9 +54,14 @@ namespace AgroBase.Models.Modules public List Reles { get; set; } public List Servos { get; set; } public UltrasonicA05Configuracoes ConfiguracaoSensorUltrassom { get; set; } + + [JsonIgnore] private SenHandler _SenHandler = new SenHandler(); + public CoulombCounterService ContadorCarga = new CoulombCounterService(VariaveisEquipamento.CorrenteMaximaBateria); public CoolerControlService CoolerControl = new CoolerControlService(); + + [JsonIgnore] public AsyncTaskTimerModel tmrRegistrador; private int _TempoReconexaoComponentes = 5; private int _VezesLeituraReconexao = 0; @@ -496,7 +502,7 @@ namespace AgroBase.Models.Modules indice = 1, analise_health = true, maximo = 500, - minimo = 50, + minimo = 30, nominal = 100, unidade_medida = "mA" }, @@ -596,9 +602,9 @@ namespace AgroBase.Models.Modules posicao = CanMessagePosicaoDados.Dados1, indice = 1, analise_health = true, - maximo = 1000, - minimo = 50, - nominal = 300, + maximo = 2200, + minimo = 1000, + nominal = 1700, unidade_medida = "mA" }, new SensorValoresLeituraModel() @@ -900,9 +906,9 @@ namespace AgroBase.Models.Modules posicao = CanMessagePosicaoDados.Dados1, indice = 1, analise_health = true, - maximo = 4000, - minimo = 500, - nominal = 1500, + maximo = 6000, + minimo = 1000, + nominal = 5000, unidade_medida = "mA" }, new SensorValoresLeituraModel() @@ -992,7 +998,7 @@ namespace AgroBase.Models.Modules indice = 0, analise_health = true, maximo = 24.3, - minimo = 23.8, + minimo = 23.5, nominal = 24.0, unidade_medida = "V" }, @@ -1106,7 +1112,7 @@ namespace AgroBase.Models.Modules analise_health = true, maximo = 75000, minimo = 200, - nominal = 2500, + nominal = 3500, unidade_medida = "mA" }, new SensorValoresLeituraModel() diff --git a/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs b/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs index 3e5424955..0e51f0686 100644 --- a/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs +++ b/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs @@ -26,22 +26,45 @@ namespace AgroBase.Models { public class OperacaoModel { + public double tmrLogsInterval + { + get + { + return tmrLogs.Interval; + } + set + { + tmrLogs.SetInterval((int)value); + } + } + private static AsyncTaskTimerModel tmrLogs; + private int idxLog = 0; + public double tmrLeiturasInterval + { + get + { + return tmrLeituras.Interval; + } + set + { + tmrLeituras.SetInterval((int)value); + } + } + private static AsyncTaskTimerModel tmrLeituras; + private static AsyncTaskTimerModel tmrComunicacao; public OperacaoModel() { - if (Variaveis.OperacaoEmAndamento != null) - { - tmrLogs?.Dispose(); - tmrLogs = new AsyncTaskTimerModel("tmrLogs", tmrLogs_Tick, 1000); + tmrLogs?.Dispose(); + tmrLogs = new AsyncTaskTimerModel("tmrLogs", tmrLogs_Tick, 1000); - tmrLeituras?.Dispose(); - tmrLeituras = new AsyncTaskTimerModel("tmrLeitura", tmrLeituras_Tick, 500); - tmrLeituras.Start(); + tmrLeituras?.Dispose(); + tmrLeituras = new AsyncTaskTimerModel("tmrLeitura", tmrLeituras_Tick, 500); + tmrLeituras.Start(); - tmrComunicacao?.Dispose(); - tmrComunicacao = new AsyncTaskTimerModel("tmrComunicacao", tmrComunicacao_Tick, 1000); - tmrComunicacao.Start(); - } + tmrComunicacao?.Dispose(); + tmrComunicacao = new AsyncTaskTimerModel("tmrComunicacao", tmrComunicacao_Tick, 1000); + tmrComunicacao.Start(); } @@ -58,7 +81,7 @@ namespace AgroBase.Models public TrajetoriaMapaOperacaoModel Trajetoria { get; set; } public List GPSTrajetoria { get; set; } = new List(); public OperacaoParametrosModel Parametros { get; set; } = new OperacaoParametrosModel(); - public OperacaoSensoriamentoConjuntoModel Sensoriamento { get; set; } = new OperacaoSensoriamentoConjuntoModel(); + public OperacaoSensoriamentoConjuntoModel Sensoriamento { get; set; } public Form frmOperacao { get; set; } public bool Treinando { get; set; } = false; @@ -68,31 +91,6 @@ namespace AgroBase.Models public int TempoIniciarOperacao { get; set; } = 10; public string ID { get; set; } - public double tmrLogsInterval - { - get - { - return tmrLogs.Interval; - } - set - { - tmrLogs.SetInterval((int)value); - } - } - private static AsyncTaskTimerModel tmrLogs; - public double tmrLeiturasInterval - { - get - { - return tmrLeituras.Interval; - } - set - { - tmrLeituras.SetInterval((int)value); - } - } - private static AsyncTaskTimerModel tmrLeituras; - private static AsyncTaskTimerModel tmrComunicacao; private static string _discoverySessionId = Guid.NewGuid().ToString("N"); private static long _telemetrySequence = 0; @@ -101,90 +99,8 @@ namespace AgroBase.Models #region PARAMETRIZACAO - public bool SalvarParametrizacaoOperacao( - string descricao, - double capacidadeReservatorio, - double pressaoLinha, - int duracaoAtuacao, - int percentualAtuacao, - int anguloMaximo, - int velocidadeMovimento, - int velocidadeServasPercent, - int velocidadeCervasPercent, - UltrasonicA05Configuracoes ConfigUltrassom, - bool sonarAtivado, - int qtdCamerasSolo, - TiposControladorDirecional tipoControleDirecional, - bool movimentoAutomatico, - bool direcionalAutomatico, - bool pulverizadorAutomatico, - bool frenagemAutomatica) - { - if (string.IsNullOrEmpty(descricao)) - { - MessageBox.Show("Preencha a descrição para identificação da operação!", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Warning); - return false; - } - - if (Variaveis.OperacaoEmAndamento.Parametros.ParametrosMandatorios.Any(x => x.Parametro == ParametrosOperacao.Mapa && x.Mandatorio) && string.IsNullOrEmpty(Variaveis.OperacaoEmAndamento.Mapa?.mapaService?.CaminhoMapa) && !(Variaveis.OperacaoEmAndamento.Mapa?.RuasPercorrer ?? new List()).Any()) - { - MessageBox.Show("Selecione o mapa da operação e selecione as ruas a serem percorridas!", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Warning); - return false; - } - - OperacaoParametrosModel Parametros = new OperacaoParametrosModel() - { - Descricao = descricao, - CapacidadeReservatorio = capacidadeReservatorio, - Controle = new OperacaoParametrosControleModel() - { - MovimentoAutomatico = movimentoAutomatico, - DirecionalAutomatico = direcionalAutomatico, - PulverizadorAutomatico = pulverizadorAutomatico, - FrenagemAutomaticaAoParar = frenagemAutomatica, - AtuDuracaoAtuacao = duracaoAtuacao, - AtuPercentualInicioPulverizacao = percentualAtuacao, - AtuPressaoLinha = pressaoLinha, - DirAnguloMaximo = anguloMaximo, - DirVelocidadeMovimento = velocidadeMovimento, - DirTipoMovimento = tipoControleDirecional, - MovVelocidadeCErvasPercent = velocidadeCervasPercent, - MovVelocidadeSErvasPercent = velocidadeServasPercent, - }, - - ModulosMandatorios = new List(Variaveis.OperacaoEmAndamento.Parametros.ModulosMandatorios), - ParametrosMandatorios = new List(Variaveis.OperacaoEmAndamento.Parametros.ParametrosMandatorios), - //Mapa = Variaveis.OperacaoEmAndamento.Mapa, - //ConfiguracaoUltrassom = ConfigUltrassom, - - QtdCamerasSolo = qtdCamerasSolo, - - }; - //Parametros.Mapa.LimparDados(true); - - string ParametrosJson = JsonConvert.SerializeObject(Parametros, Formatting.None); - SaveFileDialog saveFileDialog = new SaveFileDialog(); - saveFileDialog.Filter = "Arquivo de Operação (*.opr)|*.opr"; - saveFileDialog.DefaultExt = "opr"; - saveFileDialog.AddExtension = true; - saveFileDialog.InitialDirectory = Variaveis.CaminhoSistema + Variaveis.CaminhoOperacoes; - saveFileDialog.FileName = descricao; - if (saveFileDialog.ShowDialog() == DialogResult.OK) - { - string filePath = saveFileDialog.FileName; - - File.WriteAllText(filePath, ParametrosJson, Encoding.UTF8); - - MessageBox.Show("Operação salva com sucesso!", "Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Information); - } - - return true; - } - public (bool, List) CarregarParametrizacaoOperacao(Panel pnlMapa, Label lblMapa, string opPath = "") { - var op = Variaveis.OperacaoEmAndamento; - string path = Variaveis.CaminhoSistema + Variaveis.CaminhoOperacoes + MapasVariaveisModel.NomeArquivoMapaInterativoSaida; OpenFileDialog openFileDialog = new OpenFileDialog(); @@ -204,8 +120,8 @@ namespace AgroBase.Models if (Parametros.Modo == null) return (false, new List()); - CarregarParametrosOperacaoPadrao((ModoOperacao)Parametros.Modo, true); - op = Variaveis.OperacaoEmAndamento; + Variaveis.OperacaoEmAndamento = CarregarParametrosOperacaoPadrao((ModoOperacao)Parametros.Modo, CarregarModulos: true); + var op = Variaveis.OperacaoEmAndamento; op.Parametros = Parametros; op.DefinirComponentesEmUso(); @@ -247,60 +163,60 @@ namespace AgroBase.Models } } - - public static OperacaoParametrosModel CarregarParametrosOperacaoPadrao(ModoOperacao Modo, bool isagrobase) + public static OperacaoModel CarregarParametrosOperacaoPadrao(ModoOperacao Modo, bool CarregarModulos) { - OperacaoModel op = Variaveis.OperacaoEmAndamento; - - OperacaoParametrosModel p = new OperacaoParametrosModel() + OperacaoModel op = new OperacaoModel() { - Modo = Modo, - Descricao = $"{Modo} - Padrão", - QtdCamerasSolo = VariaveisEquipamento.QuantidadeCamerasSolo, - QtdBicos = VariaveisEquipamento.QuantidadeBicosPulverizadores, - CapacidadeReservatorio = VariaveisEquipamento.CapacidadeReservatorio, - RoverId = VariaveisEquipamento.Parametros.serial_number, - IP = VariaveisEquipamento.Parametros.rover_ip, - RuasPercorrer = null, - Mapa = null, - PontosRetorno = null, - DadosLeitura = new OperacaoParametrosDadosModel(), + Simulando = false, + GPSTrajetoria = new List(), + Mapa = new MapasModel(), + Trajetoria = new TrajetoriaMapaOperacaoModel(new List>()), + ControleAnterior = new OperacaoControleModel(), + Parametros = new OperacaoParametrosModel() + { + Modo = Modo, + Descricao = $"{Modo} - Padrão", + QtdCamerasSolo = VariaveisEquipamento.QuantidadeCamerasSolo, + QtdBicos = VariaveisEquipamento.QuantidadeBicosPulverizadores, + CapacidadeReservatorio = VariaveisEquipamento.CapacidadeReservatorio, + RoverId = VariaveisEquipamento.Parametros.serial_number, + IP = VariaveisEquipamento.Parametros.rover_ip, + RuasPercorrer = null, + Mapa = null, + PontosRetorno = null, + DadosLeitura = new OperacaoParametrosDadosModel(), + } + }; + op.Sensoriamento = new OperacaoSensoriamentoConjuntoModel(op) + { + Operacao = new OperacaoSensoriamentoLogModel() + { + OperacaoIniciada = false, + DataInicio = DateTime.MinValue, + DataFim = DateTime.MinValue + } }; - if (isagrobase) + if (CarregarModulos) { + tmrLogs?.Stop(); + var SenConectado = (DispositivosService)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Sen); var AtuConectado = (DispositivosService)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Atu); var MvdConectado = (DispositivosService)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Mvd); - tmrLogs?.Stop(); - op = new OperacaoModel() - { - DispAtu = AtuConectado, - DispSen = SenConectado, - DispMvd = MvdConectado, - Simulando = false, - Mapa = new MapasModel(), - GPSTrajetoria = new List(), - Trajetoria = new TrajetoriaMapaOperacaoModel(new List>()), - Sensoriamento = new OperacaoSensoriamentoConjuntoModel() - { - Operacao = new OperacaoSensoriamentoLogModel() - { - OperacaoIniciada = false, - DataInicio = DateTime.MinValue, - DataFim = DateTime.MinValue - } - }, - }; + + op.DispSen = SenConectado; + op.DispAtu = AtuConectado; + op.DispMvd = MvdConectado; } switch (Modo) { case ModoOperacao.NaoDefinido: - p.ModulosMandatorios = new List(); + op.Parametros.ModulosMandatorios = new List(); break; case ModoOperacao.Manual: - p.Controle = new OperacaoParametrosControleModel() + op.Parametros.Controle = new OperacaoParametrosControleModel() { RegistrarDadosPosProcessamento = false, @@ -335,7 +251,7 @@ namespace AgroBase.Models AtuAgitadorModo = ModoAgitadorCalda.SemAgitacao, AtuModoControle = ModoControleBomba.PID }; - p.ModulosMandatorios = new List() + op.Parametros.ModulosMandatorios = new List() { new OperacaoModulosMandatoriosModel() { @@ -356,7 +272,7 @@ namespace AgroBase.Models Utilizar = true, } }; - p.ParametrosMandatorios = new List() + op.Parametros.ParametrosMandatorios = new List() { new OperacaoParametrosMandatoriosModel() { @@ -365,56 +281,53 @@ namespace AgroBase.Models Utilizar = true, }, }; - if (isagrobase) + op.Controle = new OperacaoControleModel() { - op.frmOperacao = new frmOperacaoManual(); - op.ControleAnterior = new OperacaoControleModel(); - op.Controle = new OperacaoControleModel() + TipoMovimento = TipoMovimentoDirecional.RodasDianteiras, + Angulo = 0, + EmFreio = false, + PercentualVelocidadeSP = 0, + AlturaBarra = 50, + TiposControle = new List() { - TipoMovimento = TipoMovimentoDirecional.RodasDianteiras, - Angulo = 0, - EmFreio = false, - PercentualVelocidadeSP = 0, - AlturaBarra = 50, - TiposControle = new List() + new OperacaoControleTipoModel() { - new OperacaoControleTipoModel() - { - Tipo = T_Code.Mov, - DelayEnvioComandoBase = 10, - DelayEnvioComando = 250, - DelayEnvioComandoExtra = 0, - Comandos = new List(), - UltimoComando = DateTime.Now, - DirecaoAtual = Direcao.Parado, - UltimaDirecao = Direcao.Parado - }, - new OperacaoControleTipoModel() - { - Tipo = T_Code.Dir, - DelayEnvioComandoBase = 10, - DelayEnvioComando = 250, - DelayEnvioComandoExtra = 0, - Comandos = new List(), - UltimoComando = DateTime.Now, - DirecaoAtual = Direcao.Parado, - UltimaDirecao = Direcao.Parado - }, - new OperacaoControleTipoModel() - { - Tipo = T_Code.Atu, - DelayEnvioComandoBase = 10, - DelayEnvioComando = 10, - DelayEnvioComandoExtra = 0, - Comandos = new List(), - UltimoComando = DateTime.Now - }, + Tipo = T_Code.Mov, + DelayEnvioComandoBase = 10, + DelayEnvioComando = 250, + DelayEnvioComandoExtra = 0, + Comandos = new List(), + UltimoComando = DateTime.Now, + DirecaoAtual = Direcao.Parado, + UltimaDirecao = Direcao.Parado }, - }; - } + new OperacaoControleTipoModel() + { + Tipo = T_Code.Dir, + DelayEnvioComandoBase = 10, + DelayEnvioComando = 250, + DelayEnvioComandoExtra = 0, + Comandos = new List(), + UltimoComando = DateTime.Now, + DirecaoAtual = Direcao.Parado, + UltimaDirecao = Direcao.Parado + }, + new OperacaoControleTipoModel() + { + Tipo = T_Code.Atu, + DelayEnvioComandoBase = 10, + DelayEnvioComando = 10, + DelayEnvioComandoExtra = 0, + Comandos = new List(), + UltimoComando = DateTime.Now + }, + }, + }; + if (CarregarModulos) + op.frmOperacao = new frmOperacaoManual(); break; case ModoOperacao.MapaGPS: - p.Controle = new OperacaoParametrosControleModel() + op.Parametros.Controle = new OperacaoParametrosControleModel() { RegistrarDadosPosProcessamento = false, @@ -449,7 +362,7 @@ namespace AgroBase.Models AtuAgitadorModo = ModoAgitadorCalda.Continuo, AtuModoControle = ModoControleBomba.PID, }; - p.ModulosMandatorios = new List() + op.Parametros.ModulosMandatorios = new List() { new OperacaoModulosMandatoriosModel() { @@ -500,7 +413,7 @@ namespace AgroBase.Models Utilizar = true, }, }; - p.ParametrosMandatorios = new List() + op.Parametros.ParametrosMandatorios = new List() { new OperacaoParametrosMandatoriosModel() { @@ -509,56 +422,53 @@ namespace AgroBase.Models Utilizar = true, }, }; - if (isagrobase) + op.Controle = new OperacaoControleModel() { - op.frmOperacao = new frmOperacaoMapaGPS(); - op.ControleAnterior = new OperacaoControleModel(); - op.Controle = new OperacaoControleModel() + TipoMovimento = TipoMovimentoDirecional.RodasDianteiras, + Angulo = 0, + EmFreio = false, + PercentualVelocidadeSP = 0, + AlturaBarra = 50, + TiposControle = new List() { - TipoMovimento = TipoMovimentoDirecional.RodasDianteiras, - Angulo = 0, - EmFreio = false, - PercentualVelocidadeSP = 0, - AlturaBarra = 50, - TiposControle = new List() + new OperacaoControleTipoModel() { - new OperacaoControleTipoModel() - { - Tipo = T_Code.Mov, - DelayEnvioComandoBase = 500, - DelayEnvioComando = 500, - DelayEnvioComandoExtra = 0, - Comandos = new List(), - UltimoComando = DateTime.Now, - DirecaoAtual = Direcao.Parado, - UltimaDirecao = Direcao.Parado - }, - new OperacaoControleTipoModel() - { - Tipo = T_Code.Dir, - DelayEnvioComandoBase = 300, - DelayEnvioComando = 300, - DelayEnvioComandoExtra = 0, - Comandos = new List(), - UltimoComando = DateTime.Now, - DirecaoAtual = Direcao.Parado, - UltimaDirecao = Direcao.Parado - }, - new OperacaoControleTipoModel() - { - Tipo = T_Code.Atu, - DelayEnvioComandoBase = 200, - DelayEnvioComando = 200, - DelayEnvioComandoExtra = 0, - Comandos = new List(), - UltimoComando = DateTime.Now - }, + Tipo = T_Code.Mov, + DelayEnvioComandoBase = 500, + DelayEnvioComando = 500, + DelayEnvioComandoExtra = 0, + Comandos = new List(), + UltimoComando = DateTime.Now, + DirecaoAtual = Direcao.Parado, + UltimaDirecao = Direcao.Parado }, - }; - } + new OperacaoControleTipoModel() + { + Tipo = T_Code.Dir, + DelayEnvioComandoBase = 300, + DelayEnvioComando = 300, + DelayEnvioComandoExtra = 0, + Comandos = new List(), + UltimoComando = DateTime.Now, + DirecaoAtual = Direcao.Parado, + UltimaDirecao = Direcao.Parado + }, + new OperacaoControleTipoModel() + { + Tipo = T_Code.Atu, + DelayEnvioComandoBase = 200, + DelayEnvioComando = 200, + DelayEnvioComandoExtra = 0, + Comandos = new List(), + UltimoComando = DateTime.Now + }, + }, + }; + if (CarregarModulos) + op.frmOperacao = new frmOperacaoMapaGPS(); break; case ModoOperacao.TreinamentoIA: - p.Controle = new OperacaoParametrosControleModel() + op.Parametros.Controle = new OperacaoParametrosControleModel() { RegistrarDadosPosProcessamento = false, @@ -592,7 +502,7 @@ namespace AgroBase.Models AtuAgitadorModo = ModoAgitadorCalda.SemAgitacao, AtuModoControle = ModoControleBomba.PID, }; - p.ModulosMandatorios = new List() + op.Parametros.ModulosMandatorios = new List() { new OperacaoModulosMandatoriosModel() { @@ -635,7 +545,7 @@ namespace AgroBase.Models Mandatorio = true, } }; - p.ParametrosMandatorios = new List() + op.Parametros.ParametrosMandatorios = new List() { new OperacaoParametrosMandatoriosModel() { @@ -653,54 +563,50 @@ namespace AgroBase.Models Mandatorio = true, } }; - if (isagrobase) + op.Controle = new OperacaoControleModel() { - op.ControleAnterior = new OperacaoControleModel(); - op.Controle = new OperacaoControleModel() + TipoMovimento = TipoMovimentoDirecional.RodasDianteiras, + Angulo = 0, + EmFreio = false, + PercentualVelocidadeSP = 0, + TiposControle = new List() { - TipoMovimento = TipoMovimentoDirecional.RodasDianteiras, - Angulo = 0, - EmFreio = false, - PercentualVelocidadeSP = 0, - TiposControle = new List() + new OperacaoControleTipoModel() { - new OperacaoControleTipoModel() - { - Tipo = T_Code.Mov, - DelayEnvioComandoBase = 500, - DelayEnvioComando = 500, - DelayEnvioComandoExtra = 0, - Comandos = new List(), - UltimoComando = DateTime.Now, - DirecaoAtual = Direcao.Parado, - UltimaDirecao = Direcao.Parado - }, - new OperacaoControleTipoModel() - { - Tipo = T_Code.Dir, - DelayEnvioComandoBase = 1000, - DelayEnvioComando = 1000, - DelayEnvioComandoExtra = 0, - Comandos = new List(), - UltimoComando = DateTime.Now, - DirecaoAtual = Direcao.Parado, - UltimaDirecao = Direcao.Parado - }, - new OperacaoControleTipoModel() - { - Tipo = T_Code.Atu, - DelayEnvioComandoBase = 500, - DelayEnvioComando = 500, - DelayEnvioComandoExtra = 0, - Comandos = new List(), - UltimoComando = DateTime.Now - }, + Tipo = T_Code.Mov, + DelayEnvioComandoBase = 500, + DelayEnvioComando = 500, + DelayEnvioComandoExtra = 0, + Comandos = new List(), + UltimoComando = DateTime.Now, + DirecaoAtual = Direcao.Parado, + UltimaDirecao = Direcao.Parado }, - }; - } + new OperacaoControleTipoModel() + { + Tipo = T_Code.Dir, + DelayEnvioComandoBase = 1000, + DelayEnvioComando = 1000, + DelayEnvioComandoExtra = 0, + Comandos = new List(), + UltimoComando = DateTime.Now, + DirecaoAtual = Direcao.Parado, + UltimaDirecao = Direcao.Parado + }, + new OperacaoControleTipoModel() + { + Tipo = T_Code.Atu, + DelayEnvioComandoBase = 500, + DelayEnvioComando = 500, + DelayEnvioComandoExtra = 0, + Comandos = new List(), + UltimoComando = DateTime.Now + }, + }, + }; break; case ModoOperacao.MapeamentoVisual: - p.Controle = new OperacaoParametrosControleModel() + op.Parametros.Controle = new OperacaoParametrosControleModel() { RegistrarDadosPosProcessamento = false, @@ -735,7 +641,7 @@ namespace AgroBase.Models AtuAgitadorModo = ModoAgitadorCalda.SemAgitacao, AtuModoControle = ModoControleBomba.PID, }; - p.ModulosMandatorios = new List() + op.Parametros.ModulosMandatorios = new List() { new OperacaoModulosMandatoriosModel() { @@ -756,7 +662,7 @@ namespace AgroBase.Models Utilizar = true, } }; - p.ParametrosMandatorios = new List() + op.Parametros.ParametrosMandatorios = new List() { new OperacaoParametrosMandatoriosModel() { @@ -765,45 +671,41 @@ namespace AgroBase.Models Utilizar = true, } }; - if (isagrobase) + op.Controle = new OperacaoControleModel() { - op.ControleAnterior = new OperacaoControleModel(); - op.Controle = new OperacaoControleModel() + TipoMovimento = TipoMovimentoDirecional.RodasDianteiras, + Angulo = 0, + EmFreio = false, + PercentualVelocidadeSP = 0, + TiposControle = new List() { - TipoMovimento = TipoMovimentoDirecional.RodasDianteiras, - Angulo = 0, - EmFreio = false, - PercentualVelocidadeSP = 0, - TiposControle = new List() + new OperacaoControleTipoModel() { - new OperacaoControleTipoModel() - { - Tipo = T_Code.Mov, - DelayEnvioComandoBase = 500, - DelayEnvioComando = 500, - DelayEnvioComandoExtra = 0, - Comandos = new List(), - UltimoComando = DateTime.Now, - DirecaoAtual = Direcao.Parado, - UltimaDirecao = Direcao.Parado - }, - new OperacaoControleTipoModel() - { - Tipo = T_Code.Dir, - DelayEnvioComandoBase = 200, - DelayEnvioComando = 200, - DelayEnvioComandoExtra = 0, - Comandos = new List(), - UltimoComando = DateTime.Now, - DirecaoAtual = Direcao.Parado, - UltimaDirecao = Direcao.Parado - } + Tipo = T_Code.Mov, + DelayEnvioComandoBase = 500, + DelayEnvioComando = 500, + DelayEnvioComandoExtra = 0, + Comandos = new List(), + UltimoComando = DateTime.Now, + DirecaoAtual = Direcao.Parado, + UltimaDirecao = Direcao.Parado }, - }; - } + new OperacaoControleTipoModel() + { + Tipo = T_Code.Dir, + DelayEnvioComandoBase = 200, + DelayEnvioComando = 200, + DelayEnvioComandoExtra = 0, + Comandos = new List(), + UltimoComando = DateTime.Now, + DirecaoAtual = Direcao.Parado, + UltimaDirecao = Direcao.Parado + } + }, + }; break; case ModoOperacao.RetornoBase: - p.Controle = new OperacaoParametrosControleModel() + op.Parametros.Controle = new OperacaoParametrosControleModel() { RegistrarDadosPosProcessamento = false, @@ -838,7 +740,7 @@ namespace AgroBase.Models AtuAgitadorModo = ModoAgitadorCalda.SemAgitacao, AtuModoControle = ModoControleBomba.PID, }; - p.ModulosMandatorios = new List() + op.Parametros.ModulosMandatorios = new List() { new OperacaoModulosMandatoriosModel() { @@ -883,68 +785,57 @@ namespace AgroBase.Models Utilizar = true, }, }; - p.ParametrosMandatorios = new List(); - if (isagrobase) + op.Parametros.ParametrosMandatorios = new List(); + op.Controle = new OperacaoControleModel() { - op.frmOperacao = new frmOperacaoMapaGPS(); - op.ControleAnterior = new OperacaoControleModel(); - op.Controle = new OperacaoControleModel() + TipoMovimento = TipoMovimentoDirecional.RodasDianteiras, + Angulo = 0, + EmFreio = false, + PercentualVelocidadeSP = 0, + AlturaBarra = 50, + TiposControle = new List() { - TipoMovimento = TipoMovimentoDirecional.RodasDianteiras, - Angulo = 0, - EmFreio = false, - PercentualVelocidadeSP = 0, - AlturaBarra = 50, - TiposControle = new List() + new OperacaoControleTipoModel() { - new OperacaoControleTipoModel() - { - Tipo = T_Code.Mov, - DelayEnvioComandoBase = 500, - DelayEnvioComando = 500, - DelayEnvioComandoExtra = 0, - Comandos = new List(), - UltimoComando = DateTime.Now, - DirecaoAtual = Direcao.Parado, - UltimaDirecao = Direcao.Parado - }, - new OperacaoControleTipoModel() - { - Tipo = T_Code.Dir, - DelayEnvioComandoBase = 300, - DelayEnvioComando = 300, - DelayEnvioComandoExtra = 0, - Comandos = new List(), - UltimoComando = DateTime.Now, - DirecaoAtual = Direcao.Parado, - UltimaDirecao = Direcao.Parado - }, + Tipo = T_Code.Mov, + DelayEnvioComandoBase = 500, + DelayEnvioComando = 500, + DelayEnvioComandoExtra = 0, + Comandos = new List(), + UltimoComando = DateTime.Now, + DirecaoAtual = Direcao.Parado, + UltimaDirecao = Direcao.Parado }, - }; - } + new OperacaoControleTipoModel() + { + Tipo = T_Code.Dir, + DelayEnvioComandoBase = 300, + DelayEnvioComando = 300, + DelayEnvioComandoExtra = 0, + Comandos = new List(), + UltimoComando = DateTime.Now, + DirecaoAtual = Direcao.Parado, + UltimaDirecao = Direcao.Parado + }, + }, + }; break; } - p.ModulosMandatorios.Add(new OperacaoModulosMandatoriosModel() { Dispositivo = T_Code.Npc, Mandatorio = true, Utilizar = true }); - p.ModulosMandatorios.Add(new OperacaoModulosMandatoriosModel() { Dispositivo = T_Code.Can, Mandatorio = true, Utilizar = true }); - p.ModulosMandatorios.Add(new OperacaoModulosMandatoriosModel() { Dispositivo = T_Code.Bat, Mandatorio = true, Utilizar = true }); + op.Parametros.ModulosMandatorios.Add(new OperacaoModulosMandatoriosModel() { Dispositivo = T_Code.Npc, Mandatorio = true, Utilizar = true }); + op.Parametros.ModulosMandatorios.Add(new OperacaoModulosMandatoriosModel() { Dispositivo = T_Code.Can, Mandatorio = true, Utilizar = true }); + op.Parametros.ModulosMandatorios.Add(new OperacaoModulosMandatoriosModel() { Dispositivo = T_Code.Bat, Mandatorio = true, Utilizar = true }); - if (isagrobase) + op.Parametros.ModulosMandatorios.ForEach(m => m.ComponentesEmUso = op.PreencherComponentesEmUso(m.Dispositivo)); + if (CarregarModulos) { - op.Parametros = p; - Variaveis.OperacaoEmAndamento = op; - p.ModulosMandatorios.ForEach(m => m.ComponentesEmUso = op?.PreencherComponentesEmUso(m.Dispositivo)); op.DefinirComponentesEmUso(); RedisService.AtualizarCampos(CtxKey.DadosOperacao, ("configurado", false)); op.Sensoriamento.AtualizarDados(); } - else - { - p.ModulosMandatorios.ForEach(m => m.ComponentesEmUso = op?.PreencherComponentesEmUso(m.Dispositivo)); - } - return p; + return op; } private Dictionary PreencherComponentesEmUso(T_Code Modulo) @@ -956,11 +847,11 @@ namespace AgroBase.Models { case T_Code.Mov: if (op.DispMvd != null) - op.DispMvd?.Dados?.Modulos?.ForEach(m => d.Add(m.MovMotor.Mod_ID, (true, m.MovMotor.Comandar))); + op.DispMvd?.Dados?.Modulos?.ForEach(m => d.Add(m.Modulo_ID, (true, m.MovMotor.Comandar))); break; case T_Code.Dir: if (op.DispMvd != null) - op.DispMvd?.Dados?.Modulos?.ForEach(m => d.Add(m.DirMotor.Mod_ID, (true, m.DirMotor.Comandar))); + op.DispMvd?.Dados?.Modulos?.ForEach(m => d.Add(m.Modulo_ID, (true, m.DirMotor.Comandar))); break; case T_Code.Atu: if (op.DispAtu != null) @@ -995,7 +886,7 @@ namespace AgroBase.Models case T_Code.Mov: foreach (var c in comp) { - var d = op.DispMvd?.Dados?.Modulos?.FirstOrDefault(x => x?.MovMotor?.Mod_ID == c.Key)?.MovMotor; + var d = op.DispMvd?.Dados?.Modulos?.FirstOrDefault(x => x?.Modulo_ID == c.Key)?.MovMotor; if (d != null) d.Comandar = c.Value.Item2; } @@ -1003,7 +894,7 @@ namespace AgroBase.Models case T_Code.Dir: foreach (var c in comp) { - var d = op.DispMvd?.Dados?.Modulos?.FirstOrDefault(x => x?.DirMotor?.Mod_ID == c.Key)?.DirMotor; + var d = op.DispMvd?.Dados?.Modulos?.FirstOrDefault(x => x?.Modulo_ID == c.Key)?.DirMotor; if (d != null) d.Comandar = c.Value.Item2; } @@ -1077,7 +968,7 @@ namespace AgroBase.Models { if (Parametros.Modo == null) return (false, new List()); - CarregarParametrosOperacaoPadrao((ModoOperacao)Parametros.Modo, true); + Variaveis.OperacaoEmAndamento = CarregarParametrosOperacaoPadrao((ModoOperacao)Parametros.Modo, CarregarModulos: true); var op = Variaveis.OperacaoEmAndamento; op.Descricao = Parametros.Descricao; @@ -1113,20 +1004,19 @@ namespace AgroBase.Models public async Task IniciarOperacao() { - var op = Variaveis.OperacaoEmAndamento; + var op = this; + DateTime agora = DateTime.Now; var dispSen = op.DispSen; var dispAtu = op.DispAtu; var dispMvd = op.DispMvd; - op.Sensoriamento.UltimoRegistroLog = DateTime.Now; - tmrLogs?.Start(); - op.idxLog = 0; op.Simulando = false; op.Treinando = false; + op.Sensoriamento.Operacao.OperacaoIniciada = true; op.Sensoriamento.Operacao.Emergencia = false; op.Sensoriamento.Operacao.Pausa = false; - op.Sensoriamento.Operacao.DataInicio = DateTime.Now; + op.Sensoriamento.Operacao.DataInicio = agora; op.Sensoriamento.Operacao.DataFim = DateTime.MinValue; op.ID = op.Sensoriamento.Operacao.DataInicio.ToString("dd_MM_yyyy_HH_mm_ss") + "_" + (op.Parametros?.Modo ?? ModoOperacao.NaoDefinido).ToString(); @@ -1166,16 +1056,18 @@ namespace AgroBase.Models op.Trajetoria?.ProjetarTrajetoriaFixa(); op.Trajetoria.VerificacaoInicialMeioRuaConcluida = false; - op.Sensoriamento.Operacao.Pausa = true; + op.Sensoriamento.UltimoRegistroLog = agora; + op.idxLog = 0; + tmrLogs?.Start(); + await op.RealizarCalibragemInicialAsync(true); - op.Sensoriamento.Operacao.Pausa = false; RedisService.Publish(CmdKey.ManagerWorkerRx, JsonConvert.SerializeObject(new { cmd = ManagerWorkerCommandType.IniciarMPC } )); } public async Task FinalizarOperacao() { - var op = Variaveis.OperacaoEmAndamento; + var op = this; if (op.Sensoriamento.Operacao.Finalizando) return; @@ -1203,47 +1095,35 @@ namespace AgroBase.Models if (op.Parametros.Modo == ModoOperacao.RetornoBase) { - var p = CarregarParametrosOperacaoPadrao(ModoOperacao.MapaGPS, false); - op.Parametros = p; + var new_op = CarregarParametrosOperacaoPadrao(ModoOperacao.MapaGPS, CarregarModulos: false); + op.Parametros = new_op.Parametros; RedisService.AtualizarCampos(CtxKey.DadosOperacao, ("configurado", false)); } } public void ReiniciarOperacao(bool daBase) { + var op = this; + RedisService.AtualizarCampos( CtxKey.DadosOperacao, ("status", StatusOperacao.Parametrizando), ("iniciado", false) ); - CarregarParamerosOperacaoBase(Variaveis.OperacaoEmAndamento.Parametros); + CarregarParamerosOperacaoBase(op.Parametros); if (daBase) - Variaveis.OperacaoEmAndamento.EnviarParametorsOperacao(); + op.EnviarParametorsOperacao(); } public async Task RealizarCalibragemInicialAsync(bool forcar) { - var op = Variaveis.OperacaoEmAndamento; + var op = this; if (op.Sensoriamento.Operacao.Calibrando) return; var modsCalibragem = op.Sensoriamento.Operacao.ModsCalibragem; - if (modsCalibragem == null) - { - modsCalibragem = new Dictionary>(); - op.Sensoriamento.Operacao.ModsCalibragem = modsCalibragem; - } - - if (!modsCalibragem.ContainsKey(T_Code.Mov)) - modsCalibragem[T_Code.Mov] = new Dictionary(); - - if (!modsCalibragem.ContainsKey(T_Code.Dir)) - modsCalibragem[T_Code.Dir] = new Dictionary(); - - if (!modsCalibragem.ContainsKey(T_Code.Atu)) - modsCalibragem[T_Code.Atu] = new Dictionary(); bool modsCalibrados = modsCalibragem != null && @@ -1271,7 +1151,15 @@ namespace AgroBase.Models bool calibragemDirNecessaria = (DispMvd?.Dados != null && sv.Contains(s.FirstOrDefault(x => x.modulo == T_Code.Dir)?.status ?? StatusModulo.Desconectado) && (forcar || modsCalibragem[T_Code.Dir].Any(x => !x.Value) || !modsCalibragem[T_Code.Dir].Any())); bool calibragemMovNecessaria = (DispMvd?.Dados != null && sv.Contains(s.FirstOrDefault(x => x.modulo == T_Code.Mov)?.status ?? StatusModulo.Desconectado) && (forcar || modsCalibragem[T_Code.Mov].Any(x => !x.Value) || !modsCalibragem[T_Code.Mov].Any())); - if (!calibragemAtuNecessaria && !calibragemDirNecessaria && !calibragemMovNecessaria) return; + if (!calibragemAtuNecessaria && !calibragemDirNecessaria && !calibragemMovNecessaria) + { + if (forcar) + { + Variaveis.MostrarLog("[OperacaoModel] [RealizarCalibragemInicialAsync] Calibragem não necessária"); + op.Sensoriamento.InserirLog(T_Code.Mod, StatusModulo.Operante, 100, $"Calibragem não necessária"); + } + return; + } Variaveis.MostrarLog("[OperacaoModel] [RealizarCalibragemInicialAsync] Pausa para calibragem inicial"); op.Sensoriamento.InserirLog(T_Code.Mod, StatusModulo.Operante, 100, $"Pausa para calibragem inicial"); @@ -1331,7 +1219,7 @@ namespace AgroBase.Models public async Task IniciarSimulacao() { - var op = Variaveis.OperacaoEmAndamento; + var op = this; var dispSen = op.DispSen; var dispAtu = op.DispAtu; var dispMvd = op.DispMvd; @@ -1367,7 +1255,7 @@ namespace AgroBase.Models public void ReiniciarSimulacao() { - Variaveis.OperacaoEmAndamento.ReiniciarOperacao(false); + this.ReiniciarOperacao(false); var Topico = Variaveis.MqttServiceLocal.Topicos.FirstOrDefault(x => x.Topico == MapasVariaveisModel.TopicoSelecaoRuasMapa); Topico.Mensagens.Add(new MqttService.MqttTopicosMensagensModel() @@ -1380,7 +1268,7 @@ namespace AgroBase.Models public void IniciarTreinamento() { - var op = Variaveis.OperacaoEmAndamento; + var op = this; var dispSen = op.DispSen; var dispAtu = op.DispAtu; var dispMvd = op.DispMvd; @@ -1459,7 +1347,7 @@ namespace AgroBase.Models private void SalvarOperacao() { - var op = Variaveis.OperacaoEmAndamento; + var op = this; if (string.IsNullOrEmpty(op.OprPath)) return; @@ -1480,7 +1368,7 @@ namespace AgroBase.Models public void AtualizaInformacoesControleOperacao() { - var op = Variaveis.OperacaoEmAndamento; + var op = this; var pControle = op.Parametros.Controle; if (pControle.MovimentoAutomatico) @@ -1499,7 +1387,7 @@ namespace AgroBase.Models public void AtualizarDadosControle(bool ForcarEnvio, List Dispositivos) { - var op = Variaveis.OperacaoEmAndamento; + var op = this; DateTime Agora = DateTime.Now; @@ -1534,7 +1422,7 @@ namespace AgroBase.Models public List EnviarProtocoloComando(T_Code Tipo, bool ForcarEnvio) { - var op = Variaveis.OperacaoEmAndamento; + var op = this; if (!op.Sensoriamento.Operacao.OperacaoIniciada && !ForcarEnvio) return new List(); @@ -1637,7 +1525,7 @@ namespace AgroBase.Models if (Variaveis.IsAgroMonitor) return; - var op = Variaveis.OperacaoEmAndamento; + var op = this; op.Sensoriamento?.AtualizarDados(); //Variaveis.LoraService?.EnviarDadosParaBase(); @@ -1715,7 +1603,7 @@ namespace AgroBase.Models if (topico == null) return; - var op = Variaveis.OperacaoEmAndamento; + var op = this; var dados = op.Parametros.DadosLeitura; if (dados == null) @@ -1769,7 +1657,7 @@ namespace AgroBase.Models private void EnviarParametorsOperacao() { Forget( - Variaveis.OperacaoEmAndamento.EnviarParametrosOperacaoAsync(), + this.EnviarParametrosOperacaoAsync(), "Enviar parâmetros da operação" ); } @@ -1788,7 +1676,7 @@ namespace AgroBase.Models if (topico == null) return; - var op = Variaveis.OperacaoEmAndamento; + var op = this; var parametros = op?.Parametros; @@ -1820,14 +1708,14 @@ namespace AgroBase.Models public void ExecutaComandoDaBase(OperacaoComandoBaseModel controleBase) { Forget( - Variaveis.OperacaoEmAndamento.ExecutaComandoDaBaseAsync(controleBase), + this.ExecutaComandoDaBaseAsync(controleBase), "Executar comando da base" ); } public async Task ExecutaComandoDaBaseAsync(OperacaoComandoBaseModel controleBase) { - var op = Variaveis.OperacaoEmAndamento; + var op = this; if (controleBase == null) return; @@ -1868,7 +1756,7 @@ namespace AgroBase.Models private async Task ExecutaComandoDaBaseInternoAsync(OperacaoComandoBaseModel controleBase) { - var op = Variaveis.OperacaoEmAndamento; + var op = this; if (op == null) return; @@ -2620,11 +2508,9 @@ namespace AgroBase.Models #region REGISTRO DE LOGS - private int idxLog = 0; - private async Task tmrLogs_Tick() { - var op = Variaveis.OperacaoEmAndamento; + var op = this; if (op.Sensoriamento.Operacao.OperacaoIniciada) { @@ -2644,7 +2530,7 @@ namespace AgroBase.Models public void SalvarLogs(bool Fim) { - var op = Variaveis.OperacaoEmAndamento; + var op = this; if (op == null) return; @@ -2838,20 +2724,22 @@ namespace AgroBase.Models private void SalvarLogCameraSolo() { + var op = this; + var cameras = CameraWorkerService.CamerasSolo.ToList(); for (int i = 0; i < cameras.Count; i++) { var Camera = cameras[i]; string camera_name = $"{Camera.Dispositivo}{i}"; - string Caminho = Variaveis.CaminhoOperacoes + Variaveis.OperacaoEmAndamento.ID + "/" + camera_name; + string Caminho = Variaveis.CaminhoOperacoes + op.ID + "/" + camera_name; if (!Directory.Exists(Caminho)) { Directory.CreateDirectory(Caminho); } - string nome = Variaveis.OperacaoEmAndamento.idxLog.ToString(); + string nome = op.idxLog.ToString(); var frames_salvar = new List() { TipoFrameCamera.Rgb, TipoFrameCamera.Segmentacao }; - if (Variaveis.OperacaoEmAndamento.Parametros.Controle.RegistrarDadosPosProcessamento) frames_salvar.Add(TipoFrameCamera.PosProcessamento); + if (op.Parametros.Controle.RegistrarDadosPosProcessamento) frames_salvar.Add(TipoFrameCamera.PosProcessamento); Camera.SaveFrames(frames_salvar, nome, Caminho); var cameras_conectadas = JsonConvert.DeserializeObject>(RedisService.Get(CtxKey.DadosCameras)); @@ -2866,19 +2754,21 @@ namespace AgroBase.Models private void SalvarLogCameraCaminho() { + var op = this; + var Camera = CameraWorkerService.CameraCaminho; if (Camera == null) return; - string Caminho = Variaveis.CaminhoOperacoes + Variaveis.OperacaoEmAndamento.ID + "/" + Camera.Dispositivo; + string Caminho = Variaveis.CaminhoOperacoes + op.ID + "/" + Camera.Dispositivo; if (!Directory.Exists(Caminho)) { Directory.CreateDirectory(Caminho); } - string nome = Variaveis.OperacaoEmAndamento.idxLog.ToString(); + string nome = op.idxLog.ToString(); var frames_salvar = new List() { TipoFrameCamera.Rgb, TipoFrameCamera.Segmentacao }; - if (Variaveis.OperacaoEmAndamento.Parametros.Controle.RegistrarDadosPosProcessamento) frames_salvar.AddRange(new List() { TipoFrameCamera.PosProcessamento, TipoFrameCamera.Heatmap }); + if (op.Parametros.Controle.RegistrarDadosPosProcessamento) frames_salvar.AddRange(new List() { TipoFrameCamera.PosProcessamento, TipoFrameCamera.Heatmap }); Camera.SaveFrames(frames_salvar, nome, Caminho); var cameras_conectadas = JsonConvert.DeserializeObject>(RedisService.Get(CtxKey.DadosCameras)); @@ -2899,11 +2789,13 @@ namespace AgroBase.Models private void SalvarLogLine(string arquivo, T objeto) { + var op = this; + try { var pasta = Path.Combine( Variaveis.CaminhoOperacoes, - Variaveis.OperacaoEmAndamento.ID + op.ID ); if (!Directory.Exists(pasta)) @@ -2913,7 +2805,7 @@ namespace AgroBase.Models lock (_lockLog) { - string caminhoAtual = ObterOuCriarArquivoLogAtual(pasta, arquivo, json); + string caminhoAtual = op.ObterOuCriarArquivoLogAtual(pasta, arquivo, json); File.AppendAllText(caminhoAtual, json + Environment.NewLine); } @@ -2926,6 +2818,8 @@ namespace AgroBase.Models private string ObterOuCriarArquivoLogAtual(string pasta, string arquivoBase, string proximoJson) { + var op = this; + var arquivosExistentes = Directory .GetFiles(pasta, $"{arquivoBase}_*.jsonl") .OrderBy(x => x, StringComparer.OrdinalIgnoreCase) @@ -2934,7 +2828,7 @@ namespace AgroBase.Models string ultimoArquivo = arquivosExistentes.LastOrDefault(); if (string.IsNullOrWhiteSpace(ultimoArquivo)) - return CriarNovoArquivoLog(pasta, arquivoBase, 1); + return op.CriarNovoArquivoLog(pasta, arquivoBase, 1); var info = new FileInfo(ultimoArquivo); @@ -2945,8 +2839,8 @@ namespace AgroBase.Models if (tamanhoAposAppend > TAMANHO_MAX_LOG_BYTES) { - int proximoIdx = ExtrairIndiceArquivo(ultimoArquivo, arquivoBase) + 1; - return CriarNovoArquivoLog(pasta, arquivoBase, proximoIdx); + int proximoIdx = op.ExtrairIndiceArquivo(ultimoArquivo, arquivoBase) + 1; + return op.CriarNovoArquivoLog(pasta, arquivoBase, proximoIdx); } return ultimoArquivo; @@ -2998,7 +2892,7 @@ namespace AgroBase.Models public void AbrirForm() { - var op = Variaveis.OperacaoEmAndamento; + var op = this; if (op.Sensoriamento.Operacao.OperacaoLiberada) { frmOperacao = @@ -3016,7 +2910,7 @@ namespace AgroBase.Models public string TextoFormOperacao(string ModoNome) { - var op = Variaveis.OperacaoEmAndamento; + var op = this; var statusAtual = op.Sensoriamento.Operacao.StatusOperacaoAtual; if (statusAtual == StatusOperacao.Parametrizando) @@ -3350,13 +3244,20 @@ namespace AgroBase.Models public class OperacaoSensoriamentoConjuntoModel { + public OperacaoSensoriamentoConjuntoModel(OperacaoModel operaao) + { + op = operaao; + } + public OperacaoModel op { get; private set; } + public DateTime Momento { get; set; } // Operacao public OperacaoSensoriamentoLogModel Operacao { get; set; } = new OperacaoSensoriamentoLogModel(); public void AtualizarOperacao(DateTime agora) { - var op = Variaveis.OperacaoEmAndamento; + if (op == null) return; + op.Controle.Motivos = RedisService.GetField>(CtxKey.DadosControle, "motivos", new List()); double tempoDecorridoSeg = 0; @@ -3449,9 +3350,10 @@ namespace AgroBase.Models public AtuadorLogModel Atuador { get; set; } = new AtuadorLogModel(); public void AtualizarAtuador(DateTime agora) { - var op = Variaveis.OperacaoEmAndamento; - var dadosAtu = op?.DispAtu?.Dados; - var pControle = op?.Parametros?.Controle; + if (op == null) return; + + var dadosAtu = op.DispAtu?.Dados; + var pControle = op.Parametros?.Controle; var bombaLinha = dadosAtu?.BombaPressurizadora; var reservatorio = dadosAtu?.ContadorCarga; @@ -3476,7 +3378,7 @@ namespace AgroBase.Models UltimoComandoRespondido = dadosAtu.DadosLeitura?.UltimoComandoRespondido ?? dadosAtu.DadosLeitura?.Momento ?? DateTime.MinValue, QtdCamerasSolo = CameraWorkerService.CamerasSolo.Count, - QuantidadeBicos = op?.Parametros?.QtdBicos ?? VariaveisEquipamento.QuantidadeBicosPulverizadores, + QuantidadeBicos = op.Parametros?.QtdBicos ?? VariaveisEquipamento.QuantidadeBicosPulverizadores, CapacidadeReservatorio = VariaveisEquipamento.CapacidadeReservatorio, MassaReservatorio = dadosAtu.ContadorCarga?.MassaAtual_Kg ?? reservatorio?.MassaAtual_Kg ?? 0, @@ -3568,6 +3470,8 @@ namespace AgroBase.Models public SensoriamentoLogModel Sensoriamento { get; set; } = new SensoriamentoLogModel(); public void AtualizarSensoriamento(DateTime agora) { + if (op == null) return; + void AtualizarResumo(SensoriamentoLogModel destino) { destino.TotalSensores = destino.Sensores.Count; @@ -3914,8 +3818,7 @@ namespace AgroBase.Models return null; } - var op = Variaveis.OperacaoEmAndamento; - var dados = op?.DispSen?.Dados; + var dados = op.DispSen?.Dados; var leitura = dados?.DadosLeitura; var model = new SensoriamentoLogModel(); @@ -3984,6 +3887,8 @@ namespace AgroBase.Models public MovimentacaoLogModel Movimentacao { get; set; } = new MovimentacaoLogModel(); public void AtualizarMovimentacao(DateTime agora) { + if (op == null) return; + MovimentacaoModuloLogModel CriarModuloAtualizado(ModuloMvdModel modulo) { var mov = modulo?.MovMotor; @@ -4084,8 +3989,7 @@ namespace AgroBase.Models if (string.IsNullOrWhiteSpace(moduloId)) return 1.0; - if (MovimentacaoMovimentoCompensadoModel.compensacoes != null && - MovimentacaoMovimentoCompensadoModel.compensacoes.TryGetValue(moduloId, out var fator)) + if (MovimentacaoMovimentoCompensadoModel.compensacoes != null && MovimentacaoMovimentoCompensadoModel.compensacoes.TryGetValue(moduloId, out var fator)) { return fator; } @@ -4093,8 +3997,7 @@ namespace AgroBase.Models return 1.0; } - var op = Variaveis.OperacaoEmAndamento; - var dados = op?.DispMvd?.Dados; + var dados = op.DispMvd?.Dados; var modulos = dados?.Modulos? .Where(x => x?.MovMotor != null) @@ -4140,6 +4043,8 @@ namespace AgroBase.Models public DirecionalLogModel Direcional { get; set; } = new DirecionalLogModel(); public void AtualizarDirecional(DateTime agora) { + if (op == null) return; + DirecionalModuloLogModel CriarModuloAtualizado(ModuloMvdModel modulo) { var dir = modulo?.DirMotor; @@ -4256,9 +4161,8 @@ namespace AgroBase.Models return valores.Count == 0 ? 0 : valores.Average(); } - var op = Variaveis.OperacaoEmAndamento; - var dados = op?.DispMvd?.Dados; - var controle = op?.Controle; + var dados = op.DispMvd?.Dados; + var controle = op.Controle; var modulos = dados?.Modulos? .Where(x => x?.DirMotor != null) @@ -4307,6 +4211,8 @@ namespace AgroBase.Models public ModuloIMUModel IMU { get; set; } = new ModuloIMUModel(); public void AtualizarImu(DateTime agora) { + if (op == null) return; + try { string imu = RedisService.Get(RedisService.ModKey(T_Code.Imu)) ?? ""; @@ -4328,6 +4234,8 @@ namespace AgroBase.Models public GPSModel Gps { get; set; } = new GPSModel(); public void AtualizarGps(DateTime agora) { + if (op == null) return; + Gps = GPSService.GetSnapshot() ?? new GPSModel(); Gps.Momento = agora; @@ -4339,6 +4247,8 @@ namespace AgroBase.Models public LivoxModel LivoxLidar { get; set; } = new LivoxModel(); public void AtualizarLivox(DateTime agora) { + if (op == null) return; + LivoxLidar = LivoxManagerProcess.DadosLeitura?.Clone() ?? new LivoxModel(); LivoxLidar.Momento = agora; } @@ -4347,7 +4257,8 @@ namespace AgroBase.Models public OperacaoSensoriamentoLogBateriaModel Bateria { get; set; } = new OperacaoSensoriamentoLogBateriaModel(); public void AtualizarBateria(DateTime agora) { - var op = Variaveis.OperacaoEmAndamento; + if (op == null) return; + var _dispSen = op.DispSen?.Dados; var _Bateria = _dispSen?.ContadorCarga; @@ -4396,7 +4307,8 @@ namespace AgroBase.Models public OperacaoSensoriamentoLogTrajetoriaModel Trajetoria { get; set; } public void AtualizarTrajetoria(DateTime agora) { - var op = Variaveis.OperacaoEmAndamento; + if (op == null) return; + var _Trajetoria = op.Trajetoria; Trajetoria = new OperacaoSensoriamentoLogTrajetoriaModel() { @@ -4447,6 +4359,8 @@ namespace AgroBase.Models public WeedWorkerModel OperadorErvas { get; set; } = new WeedWorkerModel(); public void AtualizarOperadores(DateTime agora) { + if (op == null) return; + HealthWorkerService.DadosLeitura.ModulosSaude = RedisService.GetField(CtxKey.DadosOperacao, "status_modulos").ToList(); OperadorSaude = HealthWorkerService.DadosLeitura.Clone(); OperadorSaude.Momento = agora; @@ -4464,6 +4378,8 @@ namespace AgroBase.Models public void InserirLog(T_Code dispositivo, StatusModulo status, double saude, string mensagem, string id = null, string condicoes = null) { + if (op == null) return; + try { if (Logs == null) @@ -4488,7 +4404,8 @@ namespace AgroBase.Models public void AtualizarDados() { - var op = Variaveis.OperacaoEmAndamento; + if (op == null) return; + DateTime agora = DateTime.Now; // Contexto @@ -4560,7 +4477,7 @@ namespace AgroBase.Models var dadosCooler = _Cooler?.GetResumo(agora); op.Controle.Momento = agora; - OperacaoSensoriamentoConjuntoModel dadosAtualizados = new OperacaoSensoriamentoConjuntoModel() + OperacaoSensoriamentoConjuntoModel dadosAtualizados = new OperacaoSensoriamentoConjuntoModel(op) { Momento = agora, Operacao = dadosOperacao, @@ -4584,9 +4501,9 @@ namespace AgroBase.Models op.Sensoriamento = dadosAtualizados; } - public OperacaoSensoriamentoConjuntoModel Clone(bool comSonar = false) + public OperacaoSensoriamentoConjuntoModel Clone() { - return new OperacaoSensoriamentoConjuntoModel() + return new OperacaoSensoriamentoConjuntoModel(op) { Momento = Momento, Operacao = Operacao?.Clone(), diff --git a/AgroBase/AgroBase/Models/TrajetoriaMapaOperacaoModel.cs b/AgroBase/AgroBase/Models/TrajetoriaMapaOperacaoModel.cs index d5ba6b398..48ad2ac62 100644 --- a/AgroBase/AgroBase/Models/TrajetoriaMapaOperacaoModel.cs +++ b/AgroBase/AgroBase/Models/TrajetoriaMapaOperacaoModel.cs @@ -1585,7 +1585,7 @@ namespace AgroBase.Models RetornandoBase = false; - CorredorAtual = _Corredores[0]; + CorredorAtual = _Corredores.Count > 0 ? _Corredores[0] : null; AutonomiaCorredor.Iniciar(); @@ -1847,8 +1847,8 @@ namespace AgroBase.Models LoopAtualizaDados(); - var _p = OperacaoModel.CarregarParametrosOperacaoPadrao(ModoOperacao.RetornoBase, false); - op.Parametros = _p; + var new_op = OperacaoModel.CarregarParametrosOperacaoPadrao(ModoOperacao.RetornoBase, CarregarModulos: false); + op.Parametros = new_op.Parametros; if (!op.Sensoriamento.Operacao.OperacaoIniciada) { diff --git a/AgroBase/AgroBase/Services/Operadores/HealthWorkerService.cs b/AgroBase/AgroBase/Services/Operadores/HealthWorkerService.cs index 0c0d7935c..905eaba10 100644 --- a/AgroBase/AgroBase/Services/Operadores/HealthWorkerService.cs +++ b/AgroBase/AgroBase/Services/Operadores/HealthWorkerService.cs @@ -95,6 +95,8 @@ namespace AgroBase.Services.Operadores private static void AtualizarDadosContextoLocal() { var op = Variaveis.OperacaoEmAndamento; + if (op.Sensoriamento == null) return; + try { RedisService.AtualizarCampos( diff --git a/AgroBase/AgroBase/Services/Operadores/VisualWorkerService.cs b/AgroBase/AgroBase/Services/Operadores/VisualWorkerService.cs index 09b2367eb..73d755936 100644 --- a/AgroBase/AgroBase/Services/Operadores/VisualWorkerService.cs +++ b/AgroBase/AgroBase/Services/Operadores/VisualWorkerService.cs @@ -148,7 +148,7 @@ namespace AgroBase.Services.Operadores { AtualizarImu(); - DadosLeitura.Status = Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorSaude?.ModulosSaude?.FirstOrDefault(x => x.modulo == Enums.T_Code.Snr)?.status ?? Enums.StatusModulo.Desconectado; + DadosLeitura.Status = Variaveis.OperacaoEmAndamento.Sensoriamento?.OperadorSaude?.ModulosSaude?.FirstOrDefault(x => x.modulo == Enums.T_Code.Snr)?.status ?? Enums.StatusModulo.Desconectado; string json = RedisService.Get(CtxKey.DadosVisualWorker); diff --git a/AgroBase/AgroBase/Services/RedisService.cs b/AgroBase/AgroBase/Services/RedisService.cs index ddac3d1c1..50bb58896 100644 --- a/AgroBase/AgroBase/Services/RedisService.cs +++ b/AgroBase/AgroBase/Services/RedisService.cs @@ -38,12 +38,12 @@ namespace AgroBase.Services public static string Get(string chave) { - return _db.StringGet(chave); + return _db?.StringGet(chave); } private static void Set(string chave, string valor) { - _db.StringSet(chave, valor); + _db?.StringSet(chave, valor); } public static void SetObject(string chave, object valor) @@ -157,7 +157,9 @@ namespace AgroBase.Services public static void DefinirEquipamentoDesconectado() { - var saude = Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorSaude?.ModulosSaude; + if (!(Variaveis.OperacaoEmAndamento?.Sensoriamento?.OperadorSaude?.ModulosSaude?.Any() ?? false)) return; + + var saude = Variaveis.OperacaoEmAndamento.Sensoriamento?.OperadorSaude?.ModulosSaude; AtualizarCampos( CtxKey.DadosOperacao, ("motivo_nao_liberado", "Sem comunicação com o núcleo de processamento central"), diff --git a/AgroBase/AgroBase/Services/VersionamentoService.cs b/AgroBase/AgroBase/Services/VersionamentoService.cs index 8403a5e1e..1d2446483 100644 --- a/AgroBase/AgroBase/Services/VersionamentoService.cs +++ b/AgroBase/AgroBase/Services/VersionamentoService.cs @@ -375,9 +375,11 @@ namespace AgroBase.Services if (!_AtualizacaoGate.Wait(0)) return; + var op = Variaveis.OperacaoEmAndamento; + try { - if (Variaveis.OperacaoEmAndamento != null && Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.OperacaoIniciada) + if (op?.Sensoriamento?.Operacao?.OperacaoIniciada ?? false) { ResultadoAtualizacao = "Atualização ignorada: operação em andamento."; diff --git a/AgroBase/OperationControl/ViewModels/Views/Operacao/Monitoramento/ParametrizacaoViewModel.cs b/AgroBase/OperationControl/ViewModels/Views/Operacao/Monitoramento/ParametrizacaoViewModel.cs index e6d341c97..b19efed14 100644 --- a/AgroBase/OperationControl/ViewModels/Views/Operacao/Monitoramento/ParametrizacaoViewModel.cs +++ b/AgroBase/OperationControl/ViewModels/Views/Operacao/Monitoramento/ParametrizacaoViewModel.cs @@ -57,10 +57,10 @@ namespace OperationControl.ViewModels.Views.Operacao.Monitoramento private void CarregarParametrosPadrao(AgroBase.Models.Enums.ModoOperacao modo) { - var p = OperacaoModel.CarregarParametrosOperacaoPadrao(modo, false); - modoOperacaoAtual = p.Modo; - p.Descricao = $"{p.Modo} - Padrão"; - Parametros = p; + var new_op = OperacaoModel.CarregarParametrosOperacaoPadrao(modo, false); + modoOperacaoAtual = new_op.Parametros.Modo; + new_op.Parametros.Descricao = $"{new_op.Parametros.Modo} - Padrão"; + Parametros = new_op.Parametros; if (VariaveisControleOperacao.RoverEmFoco != null) VariaveisControleOperacao.RoverEmFoco.Modo = modo; }