diff --git a/AgroBase/AgroBase/AgroBase.csproj b/AgroBase/AgroBase/AgroBase.csproj index 0a1ccf8c7..3bc617048 100644 --- a/AgroBase/AgroBase/AgroBase.csproj +++ b/AgroBase/AgroBase/AgroBase.csproj @@ -652,96 +652,6 @@ - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - PreserveNewest @@ -933,69 +843,6 @@ - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - PreserveNewest @@ -1024,7 +871,7 @@ - + diff --git a/AgroBase/AgroBase/Forms/Atuador/frmAtuCalibragem.cs b/AgroBase/AgroBase/Forms/Atuador/frmAtuCalibragem.cs index 3b1ed80e9..20de49d14 100644 --- a/AgroBase/AgroBase/Forms/Atuador/frmAtuCalibragem.cs +++ b/AgroBase/AgroBase/Forms/Atuador/frmAtuCalibragem.cs @@ -27,7 +27,7 @@ namespace AgroBase.Forms.Atuador { PopularBicos(); - nudPressaoSP.Value = Convert.ToInt32(Variaveis.OperacaoEmAndamento.Controle.PressaoLinha); + nudPressaoSP.Value = Convert.ToInt32(Variaveis.OperacaoEmAndamento.Parametros.Controle.AtuPressaoLinha); txtMMassaRef.Text = DispAtu.Dados._MassaRef.ToString(); txtMLeituraRef.Text = DispAtu.Dados._MassaLeituraRef.ToString(); txtPressaoVmin.Text = DispAtu.Dados._PressaoVmin.ToString(); @@ -63,7 +63,7 @@ namespace AgroBase.Forms.Atuador private void PopularBicos() { - for (int i = 0; i < DispAtu.Dados.QuantidadeBicos; i++) + for (int i = 0; i < Variaveis.OperacaoEmAndamento.Parametros.QtdBicos; i++) { string ID = DispAtu.Dados.BicosPulverizadores[i].ID; Label lblBico = new Label() @@ -153,7 +153,7 @@ namespace AgroBase.Forms.Atuador private void nudPressaoSP_ValueChanged(object sender, EventArgs e) { var Bomba = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombasPressurizadoras.FirstOrDefault(); - Variaveis.OperacaoEmAndamento.Controle.PressaoLinha = Convert.ToInt32(((NumericUpDown)sender).Value); + Variaveis.OperacaoEmAndamento.Parametros.Controle.AtuPressaoLinha = Convert.ToInt32(((NumericUpDown)sender).Value); GeneralJoystick.EnviarComandoAtuador(S_Code.sBMB, Bomba.ComandoAtuar, Bomba.ID); } @@ -206,7 +206,7 @@ namespace AgroBase.Forms.Atuador private void btnSalvar_Click(object sender, EventArgs e) { - Variaveis.OperacaoEmAndamento.Controle.PressaoLinha = Convert.ToDouble(nudPressaoSP.Value); + Variaveis.OperacaoEmAndamento.Parametros.Controle.AtuPressaoLinha = Convert.ToDouble(nudPressaoSP.Value); DispAtu.Dados._MassaRef = Convert.ToDouble(txtMMassaRef.Text); DispAtu.Dados._MassaLeituraRef = Convert.ToDouble(txtMLeituraRef.Text); DispAtu.Dados._PressaoVmin = Convert.ToDouble(txtPressaoVmin.Text); diff --git a/AgroBase/AgroBase/Forms/Atuador/frmAtuConfig.cs b/AgroBase/AgroBase/Forms/Atuador/frmAtuConfig.cs index de28a78f9..e7ab89bd0 100644 --- a/AgroBase/AgroBase/Forms/Atuador/frmAtuConfig.cs +++ b/AgroBase/AgroBase/Forms/Atuador/frmAtuConfig.cs @@ -27,9 +27,9 @@ namespace AgroBase.Forms.Atuador } chbBicosAtuacao.Checked = Disp.Dados.BicosPulverizadores.Any(x => x.AtuacaoNivelAlto); - nudBicosQtd.Value = Disp.Dados.QuantidadeBicos; + nudBicosQtd.Value = Variaveis.OperacaoEmAndamento.Parametros.QtdBicos; txtDensidade.Text = Disp.Dados.DensidadeHerbicida.ToString("0.00"); - nudCapMax.Value = Convert.ToInt32(Variaveis.OperacaoEmAndamento.CapacidadeReservatorio); + nudCapMax.Value = Convert.ToInt32(Variaveis.OperacaoEmAndamento.Parametros.QtdCamerasSolo); } private void frmAtuConfig_FormClosing(object sender, FormClosingEventArgs e) @@ -41,9 +41,9 @@ namespace AgroBase.Forms.Atuador private void btnSalvar_Click(object sender, EventArgs e) { Disp.Dados.BicosPulverizadores.ForEach(x => x.AtuacaoNivelAlto = chbBicosAtuacao.Checked); - Disp.Dados.QuantidadeBicos = Convert.ToInt32(nudBicosQtd.Value); + Variaveis.OperacaoEmAndamento.Parametros.QtdBicos = Convert.ToInt32(nudBicosQtd.Value); Disp.Dados.DensidadeHerbicida = Convert.ToDouble(txtDensidade.Text.Replace(".", ",")); - Variaveis.OperacaoEmAndamento.CapacidadeReservatorio = Convert.ToDouble(nudCapMax.Value); + Variaveis.OperacaoEmAndamento.Parametros.CapacidadeReservatorio = Convert.ToDouble(nudCapMax.Value); Disp.SalvarParametros(Disp.Dados); } diff --git a/AgroBase/AgroBase/Forms/IHM/frmAjustes.cs b/AgroBase/AgroBase/Forms/IHM/frmAjustes.cs index 0cdce0dcd..3c181d7fc 100644 --- a/AgroBase/AgroBase/Forms/IHM/frmAjustes.cs +++ b/AgroBase/AgroBase/Forms/IHM/frmAjustes.cs @@ -123,7 +123,7 @@ namespace AgroBase.Forms.IHM chbSonarAtivado.Enabled = KinectService.Iniciado; if (KinectService.Iniciado) { - chbSonarAtivado.Checked = Variaveis.OperacaoEmAndamento.Controle.SonarAtivado; + chbSonarAtivado.Checked = Variaveis.OperacaoEmAndamento.Parametros.Controle.SonarAtivado; } } @@ -259,7 +259,7 @@ namespace AgroBase.Forms.IHM CameraCaminho = Variaveis.OperacaoEmAndamento.DispSen.Dados.CameraCaminho.Clone(); CamerasSolo = new List(Variaveis.OperacaoEmAndamento.DispSen.Dados.CamerasSolo); - for (int i = 0; i < Variaveis.OperacaoEmAndamento.QuantidadeCamerasSolo; i++) + for (int i = 0; i < Variaveis.OperacaoEmAndamento.Parametros.QtdCamerasSolo; i++) { GerarCameraSolo(i); } diff --git a/AgroBase/AgroBase/Forms/IHM/frmDiagnosticos.cs b/AgroBase/AgroBase/Forms/IHM/frmDiagnosticos.cs index e1d892515..2e5653952 100644 --- a/AgroBase/AgroBase/Forms/IHM/frmDiagnosticos.cs +++ b/AgroBase/AgroBase/Forms/IHM/frmDiagnosticos.cs @@ -526,7 +526,7 @@ namespace AgroBase.Forms.IHM private async Task EnviarComandoBomba(bool Ligar, double Pressao, int Timeout, AtuadorModel disp = null) { var Bomba = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombasPressurizadoras.FirstOrDefault(); - Variaveis.OperacaoEmAndamento.Controle.PressaoLinha = Pressao + 10; + Variaveis.OperacaoEmAndamento.Parametros.Controle.AtuPressaoLinha = Pressao + 10; GeneralJoystick.EnviarComandoAtuador(S_Code.sBMB, Ligar, Bomba.ID); DateTime inicio = DateTime.Now; @@ -941,7 +941,7 @@ namespace AgroBase.Forms.IHM TipoMovimentoDirecional _oldTipoMovimento = Variaveis.OperacaoEmAndamento.Controle.TipoMovimento; double _oldAngulo = Variaveis.OperacaoEmAndamento.Controle.Angulo; - double _oldVelocidadeMP = Variaveis.OperacaoEmAndamento.Controle.VelocidadeMP; + double _oldVelocidadeMP = Variaveis.OperacaoEmAndamento.Parametros.Controle.DirVelocidadeMovimento; DispositivosService Dispositivo = (DispositivosService)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == Enums.T_Code.Mvd); @@ -952,7 +952,7 @@ namespace AgroBase.Forms.IHM Variaveis.OperacaoEmAndamento.Controle.TipoMovimento = TipoMovimentoDirecional.Diagnostico; Variaveis.OperacaoEmAndamento.Controle.Angulo = 25; - Variaveis.OperacaoEmAndamento.Controle.VelocidadeMP = 30; + Variaveis.OperacaoEmAndamento.Parametros.Controle.DirVelocidadeMovimento = 30; bool SenConectado = SerialService.DispositivosMapeados.Any(x => x.Dispositivo == T_Code.Sen); idx = PreencheDadosLinha(grid, Testes, idx, SenConectado ? 1 : 0); @@ -1001,7 +1001,7 @@ namespace AgroBase.Forms.IHM Variaveis.OperacaoEmAndamento.Controle.TipoMovimento = _oldTipoMovimento; Variaveis.OperacaoEmAndamento.Controle.Angulo = _oldAngulo; - Variaveis.OperacaoEmAndamento.Controle.VelocidadeMP = _oldVelocidadeMP; + Variaveis.OperacaoEmAndamento.Parametros.Controle.DirVelocidadeMovimento = _oldVelocidadeMP; return true; } @@ -1227,7 +1227,7 @@ namespace AgroBase.Forms.IHM bool PzmConectado = SerialService.DispositivosMapeados.Any(x => x.Dispositivo == Enums.T_Code.Pzm); idx = PreencheDadosLinha(grid, Testes, idx, PzmConectado ? 1 : 0); - var S36V = Variaveis.OperacaoEmAndamento.Sensoriamento.Bateria; + var S36V = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Bateria; bool S36VInicializado = S36V.Iniciado; idx = PreencheDadosLinha(grid, Testes, idx, S36VInicializado ? 1 : 0); @@ -1264,7 +1264,7 @@ namespace AgroBase.Forms.IHM double Corrente12V = S12V.ValoresLeituras.FirstOrDefault(x => x.funcao == FuncoesPinout.Corrente).atual.valor; idx = PreencheDadosLinha(grid, Testes, idx, Corrente12V); - var SImu = Variaveis.OperacaoEmAndamento.Sensoriamento.IMU; + var SImu = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.IMU; double Orientacao = SImu.Iniciado ? SImu.Rotacao : -1; idx = PreencheDadosLinha(grid, Testes, idx, Orientacao); @@ -1274,13 +1274,13 @@ namespace AgroBase.Forms.IHM bool GpsInicializado = GPSService.Iniciado; idx = PreencheDadosLinha(grid, Testes, idx, GpsInicializado ? 1 : 0); - double Precisao = GpsInicializado ? (int)Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.QualidadeFix : -1; + double Precisao = GpsInicializado ? (int)Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps.QualidadeFix : -1; idx = PreencheDadosLinha(grid, Testes, idx, Precisao); - double Satelites = GpsInicializado ? Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.NumeroSatelites : -1; + double Satelites = GpsInicializado ? Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps.NumeroSatelites : -1; idx = PreencheDadosLinha(grid, Testes, idx, Satelites); - double OrientacaoGPS = GpsInicializado ? Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.OrientacaoReal : -1; + double OrientacaoGPS = GpsInicializado ? Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps.OrientacaoReal : -1; idx = PreencheDadosLinha(grid, Testes, idx, OrientacaoGPS); bool A05Conectado = SerialService.DispositivosMapeados.Any(x => x.Dispositivo == Enums.T_Code.A05); diff --git a/AgroBase/AgroBase/Forms/IHM/frmDialogoMapa.cs b/AgroBase/AgroBase/Forms/IHM/frmDialogoMapa.cs index 516164116..9c0be1c03 100644 --- a/AgroBase/AgroBase/Forms/IHM/frmDialogoMapa.cs +++ b/AgroBase/AgroBase/Forms/IHM/frmDialogoMapa.cs @@ -136,7 +136,7 @@ namespace AgroBase.Forms.IHM public void AtualizarMapaDinamico() { - var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento; + var _Sensoriamento = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura; var _Trajetoria = Variaveis.OperacaoEmAndamento.Trajetoria; if (_Trajetoria != null && _Trajetoria.CorredorAtual != null) @@ -160,10 +160,10 @@ namespace AgroBase.Forms.IHM pnlOrientacao.Invalidate(); pnlInclinacao.Invalidate(); - var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento; + var _Sensoriamento = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura; - lblUltimaLeituraSolo.Text = "Última Leitura Solo: " + Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorErvas.UltimaMensagem.ToString("HH:mm:ss.fff"); - lblUltimaLeituraCaminho.Text = "Última Leitura Caminho: " + Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorVisual.UltimaMensagem.ToString("HH:mm:ss.fff"); + lblUltimaLeituraSolo.Text = "Última Leitura Solo: " + _Sensoriamento.OperadorErvas.UltimaMensagem.ToString("HH:mm:ss.fff"); + lblUltimaLeituraCaminho.Text = "Última Leitura Caminho: " + _Sensoriamento.OperadorVisual.UltimaMensagem.ToString("HH:mm:ss.fff"); lblPerformance.Text = _Sensoriamento.DadosPerformance.PerformanceStr; lblMapaCarregado.Text = "Operação: " + Variaveis.OperacaoEmAndamento.Descricao; @@ -210,7 +210,7 @@ namespace AgroBase.Forms.IHM tkbVelocidade.Value = Convert.ToInt32(_Sensoriamento.Controle.PercentualVelocidadeSP); tkbAnguloDirecional.Minimum = 0; - tkbAnguloDirecional.Maximum = Convert.ToInt32(_Sensoriamento.Controle.Angulo_Max); + tkbAnguloDirecional.Maximum = Convert.ToInt32(Variaveis.OperacaoEmAndamento.Parametros.Controle.DirAnguloMaximo); tkbAnguloDirecional.Value = Math.Abs(Convert.ToInt32(_Sensoriamento.Controle.Angulo)); } @@ -294,8 +294,8 @@ namespace AgroBase.Forms.IHM { try { - double angulo = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.AnguloCarroDefinido; - FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)angulo, 90, (float)Variaveis.OperacaoEmAndamento.Sensoriamento.Trajetoria.AnguloCaminho); + double angulo = Variaveis.OperacaoEmAndamento.Parametros?.DadosLeitura?.Gps?.AnguloCarroDefinido ?? 0; + FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)angulo, 90, (float)(Variaveis.OperacaoEmAndamento.Parametros?.DadosLeitura?.Trajetoria?.AnguloCaminho ?? 0)); } catch { } } @@ -333,15 +333,16 @@ namespace AgroBase.Forms.IHM pnlJoystick.Visible = false; tabControl1.TabPages.Remove(tabControle); + var pControle = Variaveis.OperacaoEmAndamento.Parametros.Controle; var _Controle = Variaveis.OperacaoEmAndamento.Controle; cmbModoControle.SelectedIndex = (int)_Controle.TipoMovimento; - chbSonarAtivado.Checked = _Controle.SonarAtivado; - chbFrenagemAutomatica.Checked = _Controle.FrenagemAutomatica; - nudVelSemErvas.Value = (int)_Controle.PercentualVelocidadeMax; - nudVelComErvas.Value = (int)_Controle.PercentualVelocidadeMin; - chbPulverizadorAutomatico.Checked = _Controle.PulverizadorAutomatico; - nudPercentualAtuacaoBico.Value = (int)(_Controle.PercentualInicioPulverizacao * 100.0); - nudPressaoLinha.Value = (int)_Controle.PressaoLinha; + chbSonarAtivado.Checked = pControle.SonarAtivado; + chbFrenagemAutomatica.Checked = pControle.FrenagemAutomatica; + nudVelSemErvas.Value = (int)pControle.MovVelocidadeSErvasPercent; + nudVelComErvas.Value = (int)pControle.MovVelocidadeCErvasPercent; + chbPulverizadorAutomatico.Checked = pControle.PulverizadorAutomatico; + nudPercentualAtuacaoBico.Value = (int)pControle.AtuPercentualInicioPulverizacao; + nudPressaoLinha.Value = (int)pControle.AtuPressaoLinha; FuncoesGlobais.PreencheValorTrackBar(tkbAnguloDirecional, _Controle.Angulo); FuncoesGlobais.PreencheValorTrackBar(tkbVelocidade, _Controle.PercentualVelocidadeSP); @@ -670,7 +671,7 @@ namespace AgroBase.Forms.IHM try { // 1) Pega o estado atual do seu sistema - var src = Variaveis.OperacaoEmAndamento.ModulosMandatorios; + var src = Variaveis.OperacaoEmAndamento.Parametros.ModulosMandatorios; var saude = HealthWorkerService.ModulosSaude; // 2) Constrói snapshot @@ -802,7 +803,7 @@ namespace AgroBase.Forms.IHM // escreve de volta na fonte oficial var disp = _modulosUI[idx].Disp; - var alvo = Variaveis.OperacaoEmAndamento.ModulosMandatorios.FirstOrDefault(m => m.Dispositivo.Equals(disp)); + var alvo = Variaveis.OperacaoEmAndamento.Parametros.ModulosMandatorios.FirstOrDefault(m => m.Dispositivo.Equals(disp)); if (alvo != null) { if (alvo.Utilizar && alvo.Mandatorio && !novoUtilizar) @@ -866,16 +867,16 @@ namespace AgroBase.Forms.IHM { ("Não", DialogResult.No), () => { } }, } ); - var _Controle = Variaveis.OperacaoEmAndamento.Controle; + var pControle = Variaveis.OperacaoEmAndamento.Parametros.Controle; if (res == DialogResult.Yes) { - _Controle.SonarAtivado = chbSonarAtivado.Checked; - _Controle.FrenagemAutomatica = chbFrenagemAutomatica.Checked; - _Controle.RPM_Max = (int)FuncoesMatematicas.CalculaRPMVelocidade(FuncoesMatematicas.CalculaVelocidadeMsPercentual((int)nudVelSemErvas.Value)); - _Controle.RPM_Min = (int)FuncoesMatematicas.CalculaRPMVelocidade(FuncoesMatematicas.CalculaVelocidadeMsPercentual((int)nudVelComErvas.Value)); - _Controle.PulverizadorAutomatico = chbPulverizadorAutomatico.Checked; - _Controle.PercentualInicioPulverizacao = ((double)nudPercentualAtuacaoBico.Value / 100.0); - _Controle.PressaoLinha = (double)nudPressaoLinha.Value; + pControle.SonarAtivado = chbSonarAtivado.Checked; + pControle.FrenagemAutomatica = chbFrenagemAutomatica.Checked; + pControle.MovVelocidadeSErvasPercent = (int)FuncoesMatematicas.CalculaRPMVelocidade(FuncoesMatematicas.CalculaVelocidadeMsPercentual((int)nudVelSemErvas.Value)); + pControle.MovVelocidadeCErvasPercent = (int)FuncoesMatematicas.CalculaRPMVelocidade(FuncoesMatematicas.CalculaVelocidadeMsPercentual((int)nudVelComErvas.Value)); + pControle.PulverizadorAutomatico = chbPulverizadorAutomatico.Checked; + pControle.AtuPercentualInicioPulverizacao = ((double)nudPercentualAtuacaoBico.Value / 100.0); + pControle.AtuPressaoLinha = (double)nudPressaoLinha.Value; RedisService.AtualizarCampos( CtxKey.DadosPesosMPC, @@ -893,13 +894,13 @@ namespace AgroBase.Forms.IHM } else { - chbSonarAtivado.Checked = _Controle.SonarAtivado; - chbFrenagemAutomatica.Checked = _Controle.FrenagemAutomatica; - nudVelSemErvas.Value = (int)_Controle.PercentualVelocidadeMax; - nudVelComErvas.Value = (int)_Controle.PercentualVelocidadeMin; - chbPulverizadorAutomatico.Checked = _Controle.PulverizadorAutomatico; - nudPercentualAtuacaoBico.Value = (int)(_Controle.PercentualInicioPulverizacao * 100.0); - nudPressaoLinha.Value = (int)_Controle.PressaoLinha; + chbSonarAtivado.Checked = pControle.SonarAtivado; + chbFrenagemAutomatica.Checked = pControle.FrenagemAutomatica; + nudVelSemErvas.Value = (int)pControle.MovVelocidadeSErvasPercent; + nudVelComErvas.Value = (int)pControle.MovVelocidadeCErvasPercent; + chbPulverizadorAutomatico.Checked = pControle.PulverizadorAutomatico; + nudPercentualAtuacaoBico.Value = (int)pControle.AtuPercentualInicioPulverizacao; + nudPressaoLinha.Value = (int)pControle.AtuPressaoLinha; string pesosMpcStr = RedisService.Get(CtxKey.DadosPesosMPC); var pesos = JsonConvert.DeserializeObject(pesosMpcStr); txtPesoPosicao.Text = pesos.posicao.ToString(); diff --git a/AgroBase/AgroBase/Forms/IHM/frmInicioOperacao.cs b/AgroBase/AgroBase/Forms/IHM/frmInicioOperacao.cs index 6fe2ec104..f1c201a15 100644 --- a/AgroBase/AgroBase/Forms/IHM/frmInicioOperacao.cs +++ b/AgroBase/AgroBase/Forms/IHM/frmInicioOperacao.cs @@ -227,7 +227,7 @@ namespace AgroBase.Forms.Operacoes { string disp = chb.Name.Replace("chb", ""); T_Code Dispositivo = (T_Code)Enum.Parse(typeof(T_Code), disp); - chb.Checked = Variaveis.OperacaoEmAndamento.ModulosMandatorios.Any(x => x.Dispositivo == Dispositivo && x.Mandatorio); + chb.Checked = Variaveis.OperacaoEmAndamento.Parametros.ModulosMandatorios.Any(x => x.Dispositivo == Dispositivo && x.Mandatorio); } txtModoOperacao.Text = Variaveis.OperacaoEmAndamento.Modo.ToString(); diff --git a/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.cs b/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.cs index 0e79ae965..36d91e1a4 100644 --- a/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.cs +++ b/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.cs @@ -60,8 +60,8 @@ namespace AgroBase.Forms.Operacoes flwCamerasSolo.Controls.Add(pnlCam); } - chbPulverizador.Checked = Variaveis.OperacaoEmAndamento.Controle.PulverizadorAutomatico; - chbSonarAtivado.Checked = Variaveis.OperacaoEmAndamento.Controle.SonarAtivado; + chbPulverizador.Checked = Variaveis.OperacaoEmAndamento.Parametros.Controle.PulverizadorAutomatico; + chbSonarAtivado.Checked = Variaveis.OperacaoEmAndamento.Parametros.Controle.SonarAtivado; InicializarComandosDirecional(); PopularInformacoesGerais(); @@ -151,7 +151,7 @@ namespace AgroBase.Forms.Operacoes AtualizarInformacoesGerais(); - var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento; + var _Sensoriamento = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura; lblDistanciaEsquerda.Text = "Distancia Esq: " + _Sensoriamento.Trajetoria.DistanciaEsquerda.ToString("0.00") + " cm"; lblDistanciaDireita.Text = "Distancia Dir: " + _Sensoriamento.Trajetoria.DistanciaDireita.ToString("0.00") + " cm"; @@ -173,7 +173,7 @@ namespace AgroBase.Forms.Operacoes chbPulverizador.Checked = false; } - bool sonarAtivado = Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorVisual.Status == StatusModulo.Operante; + bool sonarAtivado = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.OperadorVisual.Status == StatusModulo.Operante; chbSonarAtivado.Enabled = sonarAtivado; if (!sonarAtivado) { @@ -424,8 +424,8 @@ namespace AgroBase.Forms.Operacoes { try { - double angulo = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.OrientacaoReal; - double angulo2 = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.AnguloCarroDefinido; + double angulo = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps.OrientacaoReal; + double angulo2 = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps.AnguloCarroDefinido; FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)angulo, -90, (float)angulo2); } catch { } @@ -433,7 +433,7 @@ namespace AgroBase.Forms.Operacoes private void pnlAnguloMagnetometro_Paint(object sender, PaintEventArgs e) { - var imu = Variaveis.OperacaoEmAndamento.Sensoriamento.IMU; + var imu = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.IMU; try { double angulo = imu.Rotacao; @@ -512,7 +512,7 @@ namespace AgroBase.Forms.Operacoes var AB12V = _SensoresCorrente.FirstOrDefault(x => x.ID == "AB12V"); var AB19V = _SensoresCorrente.FirstOrDefault(x => x.ID == "AB19V"); var AB24V = _SensoresCorrente.FirstOrDefault(x => x.ID == "AB24V"); - var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento; + var _Sensoriamento = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura; gridDados.Rows[0].Cells[1].Value = _Sensoriamento.TempoDecorrido.ToString("HH:mm:ss"); gridDados.Rows[1].Cells[1].Value = _Sensoriamento.Movimentacao.TempoMovimento.ToString("HH:mm:ss"); @@ -570,15 +570,15 @@ namespace AgroBase.Forms.Operacoes private void PopularBicos() { var Atuador = Variaveis.OperacaoEmAndamento.DispAtu; - nudPressaoSP.Value = Convert.ToInt32(Variaveis.OperacaoEmAndamento.Controle.PressaoLinha); + nudPressaoSP.Value = Convert.ToInt32(Variaveis.OperacaoEmAndamento.Parametros.Controle.AtuPressaoLinha); int panelWidth = pnlAtuadores.Width; int circleDiameter = 40; // Diâmetro dos círculos grandes - int spaceBetweenCircles = (panelWidth - (circleDiameter * Atuador.Dados.QuantidadeBicos)) / (Atuador.Dados.QuantidadeBicos + 1); + int spaceBetweenCircles = (panelWidth - (circleDiameter * Variaveis.OperacaoEmAndamento.Parametros.QtdBicos)) / (Variaveis.OperacaoEmAndamento.Parametros.QtdBicos + 1); int yPosition = (pnlAtuadores.Height - circleDiameter) / 3; // Centralizado verticalmente - for (int i = 0; i < Atuador.Dados.QuantidadeBicos; i++) + for (int i = 0; i < Variaveis.OperacaoEmAndamento.Parametros.QtdBicos; i++) { // Calcula a posição x do círculo int xPosition = spaceBetweenCircles + (i * (circleDiameter + spaceBetweenCircles)); @@ -637,7 +637,7 @@ namespace AgroBase.Forms.Operacoes private void nudPressaoSP_ValueChanged(object sender, EventArgs e) { var Bomba = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombasPressurizadoras.FirstOrDefault(); - Variaveis.OperacaoEmAndamento.Controle.PressaoLinha = Convert.ToInt32(((NumericUpDown)sender).Value); + Variaveis.OperacaoEmAndamento.Parametros.Controle.AtuPressaoLinha = Convert.ToInt32(((NumericUpDown)sender).Value); GeneralJoystick.EnviarComandoAtuador(S_Code.sBMB, Bomba.ComandoAtuar, Bomba.ID); } @@ -678,12 +678,12 @@ namespace AgroBase.Forms.Operacoes private void chbPulverizador_CheckedChanged(object sender, EventArgs e) { - Variaveis.OperacaoEmAndamento.Controle.PulverizadorAutomatico = ((CheckBox)sender).Checked; + Variaveis.OperacaoEmAndamento.Parametros.Controle.PulverizadorAutomatico = ((CheckBox)sender).Checked; } private void chbSonarAtivado_CheckedChanged(object sender, EventArgs e) { - Variaveis.OperacaoEmAndamento.Controle.SonarAtivado = ((CheckBox)sender).Checked; + Variaveis.OperacaoEmAndamento.Parametros.Controle.SonarAtivado = ((CheckBox)sender).Checked; } private void chbSonarDesvioAutomatico_CheckedChanged(object sender, EventArgs e) diff --git a/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoMapaGPS.cs b/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoMapaGPS.cs index 5a7a268da..664bd1488 100644 --- a/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoMapaGPS.cs +++ b/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoMapaGPS.cs @@ -68,7 +68,7 @@ namespace AgroBase.Forms.Operacoes pnlCaminho.Invalidate(); pnlAnguloCamera.Invalidate(); - var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento; + var _Sensoriamento = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura; /*var ultimaLeitura = Variaveis.OperacaoEmAndamento.CamerasSolo.OrderByDescending(x => x.Leitura.timestamp).FirstOrDefault(); if (ultimaLeitura != null) @@ -282,7 +282,7 @@ namespace AgroBase.Forms.Operacoes { try { - double angulo = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.AnguloCarroDefinido; + double angulo = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps.AnguloCarroDefinido; FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)angulo, -90); } catch { } diff --git a/AgroBase/AgroBase/Forms/Operacoes/frmParametrizacaoOperacao.cs b/AgroBase/AgroBase/Forms/Operacoes/frmParametrizacaoOperacao.cs index 9f8f87fe3..1e3a8ee4b 100644 --- a/AgroBase/AgroBase/Forms/Operacoes/frmParametrizacaoOperacao.cs +++ b/AgroBase/AgroBase/Forms/Operacoes/frmParametrizacaoOperacao.cs @@ -27,7 +27,8 @@ namespace AgroBase.Forms.Operacoes void CarregarParametros() { - ModulosMandatorios = Variaveis.OperacaoEmAndamento.ModulosMandatorios.ToList(); + var _Parametros = Variaveis.OperacaoEmAndamento.Parametros; + ModulosMandatorios = _Parametros.ModulosMandatorios.ToList(); cmbOperacao.Items.Clear(); cmbOperacao.Items.AddRange(Enum.GetNames(typeof(ModoOperacao))); @@ -52,24 +53,24 @@ namespace AgroBase.Forms.Operacoes }); nudVelocidadeComErvas.Minimum = 0; - nudVelocidadeComErvas.Maximum = Convert.ToInt32(VariaveisEquipamento.RPM_Max_Roda); - nudVelocidadeComErvas.Value = Convert.ToInt32(Variaveis.OperacaoEmAndamento.Controle.RPM_Min); + nudVelocidadeComErvas.Maximum = 100; + nudVelocidadeComErvas.Value = Convert.ToInt32(_Parametros.Controle.MovVelocidadeCErvasPercent); nudVelocidadeSemErvas.Minimum = 0; - nudVelocidadeSemErvas.Maximum = Convert.ToInt32(VariaveisEquipamento.RPM_Max_Roda); - nudVelocidadeSemErvas.Value = Convert.ToInt32(Variaveis.OperacaoEmAndamento.Controle.RPM_Max); + nudVelocidadeSemErvas.Maximum = 100; + nudVelocidadeSemErvas.Value = Convert.ToInt32(_Parametros.Controle.MovVelocidadeSErvasPercent); - lblKmhCErvas.Text = FuncoesMatematicas.CalculaVelocidadeRPM(Variaveis.OperacaoEmAndamento.Controle.RPM_Min).ToString("0.00") + " Km/h"; - lblKmhSErvas.Text = FuncoesMatematicas.CalculaVelocidadeRPM(Variaveis.OperacaoEmAndamento.Controle.RPM_Max).ToString("0.00") + " Km/h"; - nudAnguloMaximo.Value = Convert.ToInt32(Variaveis.OperacaoEmAndamento.Controle.Angulo_Max); - nudAnguloMinimo.Value = Convert.ToInt32(Variaveis.OperacaoEmAndamento.Controle.Angulo_Min); - nudVelocidadeMP.Value = Convert.ToInt32(Variaveis.OperacaoEmAndamento.Controle.VelocidadeMP); + lblKmhCErvas.Text = FuncoesMatematicas.ConverteMsParaKmh(FuncoesMatematicas.CalculaVelocidadeMsPercentual(_Parametros.Controle.MovVelocidadeCErvasPercent)).ToString("0.00") + " Km/h"; + lblKmhSErvas.Text = FuncoesMatematicas.ConverteMsParaKmh(FuncoesMatematicas.CalculaVelocidadeMsPercentual(_Parametros.Controle.MovVelocidadeSErvasPercent)).ToString("0.00") + " Km/h"; + nudAnguloMaximo.Value = Convert.ToInt32(_Parametros.Controle.DirAnguloMaximo); + nudAnguloMinimo.Value = Convert.ToInt32(-_Parametros.Controle.DirAnguloMaximo); + nudVelocidadeMP.Value = Convert.ToInt32(_Parametros.Controle.DirVelocidadeMovimento); nudTemposalvarlog.Value = (decimal)Variaveis.OperacaoEmAndamento.tmrLogsInterval / 1000; - nudQtdBicos.Value = Variaveis.OperacaoEmAndamento.DispAtu.Dados.QuantidadeBicos; - nudQtdCameras.Value = Variaveis.OperacaoEmAndamento.QuantidadeCamerasSolo; - nudCapacidadereservatorio.Value = Convert.ToInt32(Variaveis.OperacaoEmAndamento.CapacidadeReservatorio); + nudQtdBicos.Value = _Parametros.QtdBicos; + nudQtdCameras.Value = _Parametros.QtdCamerasSolo; + nudCapacidadereservatorio.Value = Convert.ToInt32(_Parametros.CapacidadeReservatorio); txtDensidadeherbicida.Text = Variaveis.OperacaoEmAndamento.DispAtu.Dados.DensidadeHerbicida.ToString("0.00"); - nudAtuarem.Value = Convert.ToInt32(Variaveis.OperacaoEmAndamento.Controle.PercentualInicioPulverizacao * 100); + nudAtuarem.Value = Convert.ToInt32(_Parametros.Controle.AtuPercentualInicioPulverizacao); cmbScriptErvas.SelectedIndex = cmbScriptErvas.Items.IndexOf(Variaveis.OperacaoEmAndamento.DispAtu.Dados.ScriptDeteccaoErvas.Replace(".py", "")); } @@ -125,19 +126,18 @@ namespace AgroBase.Forms.Operacoes void SalvarOperacao() { - Variaveis.OperacaoEmAndamento.ModulosMandatorios = ModulosMandatorios.Where(x => x.Utilizar).ToList(); - Variaveis.OperacaoEmAndamento.Controle.RPM_Max = (int)(nudVelocidadeSemErvas.Value); - Variaveis.OperacaoEmAndamento.Controle.RPM_Min = (int)(nudVelocidadeComErvas.Value); - Variaveis.OperacaoEmAndamento.Controle.Angulo_Max = (int)(nudAnguloMaximo.Value); - Variaveis.OperacaoEmAndamento.Controle.Angulo_Min = (int)(nudAnguloMinimo.Value); - Variaveis.OperacaoEmAndamento.Controle.VelocidadeMP = (int)(nudVelocidadeMP.Value); + Variaveis.OperacaoEmAndamento.Parametros.ModulosMandatorios = ModulosMandatorios.Where(x => x.Utilizar).ToList(); + Variaveis.OperacaoEmAndamento.Parametros.Controle.MovVelocidadeSErvasPercent = (int)(nudVelocidadeSemErvas.Value); + Variaveis.OperacaoEmAndamento.Parametros.Controle.MovVelocidadeCErvasPercent = (int)(nudVelocidadeComErvas.Value); + Variaveis.OperacaoEmAndamento.Parametros.Controle.DirAnguloMaximo = (int)(nudAnguloMaximo.Value); + Variaveis.OperacaoEmAndamento.Parametros.Controle.DirVelocidadeMovimento = (int)(nudVelocidadeMP.Value); Variaveis.OperacaoEmAndamento.tmrLogsInterval = (double)(nudTemposalvarlog.Value * 1000); - Variaveis.OperacaoEmAndamento.DispAtu.Dados.QuantidadeBicos = (int)nudQtdBicos.Value; - Variaveis.OperacaoEmAndamento.QuantidadeCamerasSolo = (int)nudQtdCameras.Value; - Variaveis.OperacaoEmAndamento.CapacidadeReservatorio = (double)nudCapacidadereservatorio.Value; + Variaveis.OperacaoEmAndamento.Parametros.QtdBicos = (int)nudQtdBicos.Value; + Variaveis.OperacaoEmAndamento.Parametros.QtdCamerasSolo = (int)nudQtdCameras.Value; + Variaveis.OperacaoEmAndamento.Parametros.CapacidadeReservatorio = (double)nudCapacidadereservatorio.Value; Variaveis.OperacaoEmAndamento.DispAtu.Dados.DensidadeHerbicida = Convert.ToDouble(txtDensidadeherbicida.Text.Replace(".", ",")); - Variaveis.OperacaoEmAndamento.Controle.PercentualInicioPulverizacao = (double)(nudAtuarem.Value / 100); - Variaveis.OperacaoEmAndamento.DispAtu.Dados.ScriptDeteccaoErvas = cmbScriptErvas.Text + ".py"; + Variaveis.OperacaoEmAndamento.Parametros.Controle.AtuPercentualInicioPulverizacao = (double)(nudAtuarem.Value / 100); + //Variaveis.OperacaoEmAndamento.Parametros.DispAtu.Dados.ScriptDeteccaoErvas = cmbScriptErvas.Text + ".py"; if (chbSalvar.Checked) { diff --git a/AgroBase/AgroBase/Forms/Simuladores/frmSimulacaoMapaGPS.cs b/AgroBase/AgroBase/Forms/Simuladores/frmSimulacaoMapaGPS.cs index ed429b1c6..59074a3ee 100644 --- a/AgroBase/AgroBase/Forms/Simuladores/frmSimulacaoMapaGPS.cs +++ b/AgroBase/AgroBase/Forms/Simuladores/frmSimulacaoMapaGPS.cs @@ -49,7 +49,7 @@ namespace AgroBase.Forms { cmbTipoControleDirecional.Items.Clear(); cmbTipoControleDirecional.Items.AddRange(Enum.GetNames(typeof(Enums.TiposControladorDirecional))); - cmbTipoControleDirecional.SelectedIndex = (int)Variaveis.OperacaoEmAndamento.Controle.TipoControleDirecional; + cmbTipoControleDirecional.SelectedIndex = (int)Variaveis.OperacaoEmAndamento.Parametros.Controle.DirTipoMovimento; cmbStatusCorredor.Items.Clear(); cmbStatusCorredor.Items.AddRange(Enum.GetNames(typeof(Enums.StatusCarroMapa))); @@ -116,9 +116,15 @@ namespace AgroBase.Forms return; AtualizandoTela = true; - var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento; + var _Sensoriamento = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura; var _Trajetoria = Variaveis.OperacaoEmAndamento.Trajetoria; + if (_Trajetoria == null) + { + AtualizandoTela = false; + return; + } + lblStatusOperacao.Text = "Operação: " + Enum.GetName(typeof(StatusOperacao), _Sensoriamento.StatusOperacao); lblTipoMovimento.Text = _Sensoriamento.Controle.TipoMovimento.ToString(); @@ -257,12 +263,12 @@ namespace AgroBase.Forms // Obtém os parâmetros double anguloAtual = double.Parse(txtAnguloGPS.Text); - var _Gps = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps; + var _Gps = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps; double anguloControle = 0.0; TipoMovimentoDirecional tipoMovimento = Variaveis.OperacaoEmAndamento.Controle.TipoMovimento; - var tipoControle = Variaveis.OperacaoEmAndamento.Controle.TipoControleDirecional; + var tipoControle = Variaveis.OperacaoEmAndamento.Parametros.Controle.DirTipoMovimento; if (passosOperacao.Count > 0 && Variaveis.OperacaoEmAndamento.Simulando) { @@ -319,7 +325,7 @@ namespace AgroBase.Forms AtualizarPosicaoGPS(); - Variaveis.OperacaoEmAndamento.Sensoriamento.AtualizarDados(); + Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.AtualizarDados(); if (!chbAutomatico.Checked) { @@ -434,8 +440,8 @@ namespace AgroBase.Forms { //double angulo = Variaveis.OperacaoEmAndamento.Trajetoria.AnguloCaminho; //double anguloCorredor = Variaveis.OperacaoEmAndamento.Trajetoria.AnguloMedioCorredor; - double angulo = Variaveis.OperacaoEmAndamento.Trajetoria.ProximoPonto?.Orientacao ?? 0; - double anguloCorredor = Variaveis.OperacaoEmAndamento.Trajetoria.AnguloCaminho; + double angulo = Variaveis.OperacaoEmAndamento.Trajetoria?.ProximoPonto?.Orientacao ?? 0; + double anguloCorredor = Variaveis.OperacaoEmAndamento.Trajetoria?.AnguloCaminho ?? 0; FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)angulo, 90, (float)anguloCorredor); } catch { } @@ -445,7 +451,7 @@ namespace AgroBase.Forms { try { - double angulo = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps?.AnguloCarroDefinido ?? 0; + double angulo = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura?.Gps?.AnguloCarroDefinido ?? 0; FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)angulo, 90); } catch { } @@ -456,7 +462,7 @@ namespace AgroBase.Forms try { double angulo = Variaveis.OperacaoEmAndamento.SimulacaoAnguloControle; - double dif = Variaveis.OperacaoEmAndamento.Sensoriamento.Trajetoria?.ErroOrientacaoAngularProximoPonto ?? 0; + double dif = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura?.Trajetoria?.ErroOrientacaoAngularProximoPonto ?? 0; FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)angulo, 90, (float)dif); } catch { } @@ -500,7 +506,7 @@ namespace AgroBase.Forms private void cmbTipoControleDirecional_SelectedIndexChanged(object sender, EventArgs e) { - Variaveis.OperacaoEmAndamento.Controle.TipoControleDirecional = (TiposControladorDirecional)cmbTipoControleDirecional.SelectedIndex; + Variaveis.OperacaoEmAndamento.Parametros.Controle.DirTipoMovimento = (TiposControladorDirecional)cmbTipoControleDirecional.SelectedIndex; RedisService.AtualizarCampos(CtxKey.DadosOperacao, ("configurado", false)); } diff --git a/AgroBase/AgroBase/Forms/Simuladores/frmSimulacaoMapeamentoVisual.cs b/AgroBase/AgroBase/Forms/Simuladores/frmSimulacaoMapeamentoVisual.cs index e4390b433..e7770b5ae 100644 --- a/AgroBase/AgroBase/Forms/Simuladores/frmSimulacaoMapeamentoVisual.cs +++ b/AgroBase/AgroBase/Forms/Simuladores/frmSimulacaoMapeamentoVisual.cs @@ -69,7 +69,7 @@ namespace AgroBase.Forms.Simuladores Task.Run(async () => { OAKCameraFrameModel frame = await VisualWorkerService.GetCameraFrame(CameraFrameType.Segmentacao); - var dadosSeg = Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorVisual.Analises.segmentacao; + var dadosSeg = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.OperadorVisual.Analises.segmentacao; DesenharCorredor(frame?.image(), dadosSeg.centros_corredor, dadosSeg.width, dadosSeg.height, 80); this.Invoke((MethodInvoker)(() => diff --git a/AgroBase/AgroBase/Forms/Simuladores/frmTreinamentoIA.cs b/AgroBase/AgroBase/Forms/Simuladores/frmTreinamentoIA.cs index 52c28326d..ce109edca 100644 --- a/AgroBase/AgroBase/Forms/Simuladores/frmTreinamentoIA.cs +++ b/AgroBase/AgroBase/Forms/Simuladores/frmTreinamentoIA.cs @@ -214,7 +214,7 @@ namespace AgroBase.Forms { try { - double angulo = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.AnguloCarroDefinido; + double angulo = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps.AnguloCarroDefinido; FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)angulo, 90); } catch { } @@ -476,7 +476,7 @@ namespace AgroBase.Forms { Latitude = GPSService.UltimaLeitura.Latitude, Longitude = GPSService.UltimaLeitura.Longitude, - Orientation = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.AnguloCarroDefinido + Orientation = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps.AnguloCarroDefinido }); _robotState.UpdateCurrentRobotState(); diff --git a/AgroBase/AgroBase/Forms/frmAcompanhamento.cs b/AgroBase/AgroBase/Forms/frmAcompanhamento.cs index 81324aa3f..146a3cb07 100644 --- a/AgroBase/AgroBase/Forms/frmAcompanhamento.cs +++ b/AgroBase/AgroBase/Forms/frmAcompanhamento.cs @@ -69,9 +69,9 @@ namespace AgroBase.Forms AtualizarDadosSensorCorrente("AB36V", lblB36V); } - lblMagnetometro.ForeColor = Variaveis.OperacaoEmAndamento.Sensoriamento.IMU.Iniciado ? Color.Green : Color.Red; + lblMagnetometro.ForeColor = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.IMU.Iniciado ? Color.Green : Color.Red; - var Gps = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps; + var Gps = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps; lblGPS.ForeColor = Gps.Inicializado ? Color.Green : Color.Red; if (Gps.Inicializado) { @@ -395,7 +395,7 @@ namespace AgroBase.Forms private void pnlOrientacaoGPS_Paint(object sender, PaintEventArgs e) { - var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento; + var _Sensoriamento = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura; double Angulo = _Sensoriamento.Gps.OrientacaoReal; double AnguloMovimento = _Sensoriamento.Gps.OrientacaoMovimento; FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)Angulo, -90, (float)AnguloMovimento); @@ -403,7 +403,7 @@ namespace AgroBase.Forms private void pnlOrientacaoMagnetometro_Paint(object sender, PaintEventArgs e) { - var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento; + var _Sensoriamento = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura; double Angulo = _Sensoriamento.IMU.Rotacao; double AnguloCorrigido = _Sensoriamento.IMU.RotacaoCorrigida; FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)Angulo, -90, (float)AnguloCorrigido); diff --git a/AgroBase/AgroBase/Forms/frmGPS.cs b/AgroBase/AgroBase/Forms/frmGPS.cs index e0e76cac4..97d74b74f 100644 --- a/AgroBase/AgroBase/Forms/frmGPS.cs +++ b/AgroBase/AgroBase/Forms/frmGPS.cs @@ -41,7 +41,7 @@ namespace AgroBase.Forms private async Task tmrLeitura_Tick() { - var Gps = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps; + var Gps = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps; lblAltitude.Text = "Altitude: " + Gps.Altitude.ToString("0.0") + " m"; lblDatahora.Text = "Ultima Leitura: " + Gps.DataHora.ToString("HH:mm:ss"); diff --git a/AgroBase/AgroBase/Forms/frmMapa.cs b/AgroBase/AgroBase/Forms/frmMapa.cs index 355fd639d..3083b6d51 100644 --- a/AgroBase/AgroBase/Forms/frmMapa.cs +++ b/AgroBase/AgroBase/Forms/frmMapa.cs @@ -62,7 +62,7 @@ namespace AgroBase.Forms private void btnRegistrarPontos_Click(object sender, EventArgs e) { - GPSModel P1 = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.Clone(); + GPSModel P1 = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps.Clone(); if (Pontos[idxRua].Count == 0) { @@ -127,8 +127,8 @@ namespace AgroBase.Forms { try { - double angulo = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.AnguloCarroDefinido; - double anguloCorredor = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.OrientacaoMovimento; + double angulo = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps.AnguloCarroDefinido; + double anguloCorredor = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps.OrientacaoMovimento; FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)angulo, 90, (float)anguloCorredor); } catch { } @@ -180,7 +180,7 @@ namespace AgroBase.Forms ultimoPonto = Pontos[Pontos.Count - 2][Pontos[Pontos.Count - 2].Count - 1]; } - var Gps = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps; + var Gps = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps; pnlOrientacaoGps.Invalidate(); lblStatusGPS.Text = $"GPS - Precisão: {Gps.PrecisaoCm} cm, " + diff --git a/AgroBase/AgroBase/Forms/frmPrincipal.cs b/AgroBase/AgroBase/Forms/frmPrincipal.cs index a2f83e6bc..75f154f8d 100644 --- a/AgroBase/AgroBase/Forms/frmPrincipal.cs +++ b/AgroBase/AgroBase/Forms/frmPrincipal.cs @@ -172,7 +172,7 @@ namespace AgroBase tkbVelocidade.Minimum = 0; tkbVelocidade.Maximum = 100; - FuncoesGlobais.PreencheValorTrackBar(tkbVelocidade, Variaveis.OperacaoEmAndamento.Controle.VelocidadeMP); + FuncoesGlobais.PreencheValorTrackBar(tkbVelocidade, Variaveis.OperacaoEmAndamento.Parametros.Controle.DirVelocidadeMovimento); tkbAngulo.Minimum = 0; tkbAngulo.Maximum = 90; @@ -181,7 +181,7 @@ namespace AgroBase trkKmh.Minimum = 0; trkKmh.Maximum = 100; - trkRPM.Minimum = Variaveis.OperacaoEmAndamento.Controle.RPM_Min; + trkRPM.Minimum = Variaveis.OperacaoEmAndamento.Parametros.Controle.MovVelocidadeCErvasPercent; trkRPM.Maximum = VariaveisEquipamento.RPM_Max_Roda; AtualizaRPM((int)Variaveis.OperacaoEmAndamento.Controle.PercentualVelocidadeSP); @@ -267,8 +267,8 @@ namespace AgroBase private void tkbVelocidadeMP_ValueChanged(object sender, EventArgs e) { - Variaveis.OperacaoEmAndamento.Controle.VelocidadeMP = tkbVelocidade.Value; - lblVelocidade.Text = "Velocidade: " + Variaveis.OperacaoEmAndamento.Controle.VelocidadeMP + "%"; + Variaveis.OperacaoEmAndamento.Parametros.Controle.DirVelocidadeMovimento = tkbVelocidade.Value; + lblVelocidade.Text = "Velocidade: " + Variaveis.OperacaoEmAndamento.Parametros.Controle.DirVelocidadeMovimento + "%"; } private void tkbAngulo_ValueChanged(object sender, EventArgs e) diff --git a/AgroBase/AgroBase/Forms/frmWT901C.cs b/AgroBase/AgroBase/Forms/frmWT901C.cs index dccddbd39..7317d0b35 100644 --- a/AgroBase/AgroBase/Forms/frmWT901C.cs +++ b/AgroBase/AgroBase/Forms/frmWT901C.cs @@ -59,7 +59,7 @@ namespace AgroBase.Forms private async Task tmrLeitura_Tick() { - var Imu = Variaveis.OperacaoEmAndamento.Sensoriamento.IMU; + var Imu = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.IMU; AnguloX = Imu.InclinacaoFrontal; AnguloY = Imu.InclinacaoLateral; AnguloZ = Imu.Rotacao; diff --git a/AgroBase/AgroBase/Models/Enums.cs b/AgroBase/AgroBase/Models/Enums.cs index bc27403b0..02fe27cd9 100644 --- a/AgroBase/AgroBase/Models/Enums.cs +++ b/AgroBase/AgroBase/Models/Enums.cs @@ -181,7 +181,8 @@ Aguardando = 3, EmAndamento = 4, Parado = 5, - Concluido = 6 + Concluido = 6, + Erro = 7 } public enum StatusCarroMapa diff --git a/AgroBase/AgroBase/Models/GPSModel.cs b/AgroBase/AgroBase/Models/GPSModel.cs index 366e5878a..2bba6f853 100644 --- a/AgroBase/AgroBase/Models/GPSModel.cs +++ b/AgroBase/AgroBase/Models/GPSModel.cs @@ -66,6 +66,8 @@ namespace AgroBase.Models public DateTime UltimoComandoRespondido { get; set; } public double AnguloCarroDefinido { get; set; } public int Heartbeat { get; set; } = 0; + public double LeverArmLateral { get; set; } = 0; + public double LeverArmFrontal { get; set; } = 0; public GPSModel Clone() { @@ -105,6 +107,10 @@ namespace AgroBase.Models PDOP = PDOP, VDOP = VDOP, BaseID = BaseID, + LeverArmFrontal = LeverArmFrontal, + LeverArmLateral = LeverArmLateral, + X = X, + Y = Y }; } } diff --git a/AgroBase/AgroBase/Models/GeneralJoystick.cs b/AgroBase/AgroBase/Models/GeneralJoystick.cs index dd7523a42..dc7d34e81 100644 --- a/AgroBase/AgroBase/Models/GeneralJoystick.cs +++ b/AgroBase/AgroBase/Models/GeneralJoystick.cs @@ -826,7 +826,7 @@ namespace AgroBase private static bool VerificaComandoValidoSonar(Keys Comando) { List ComandosImpedidos = new List(); - var Sonar = Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorVisual; + var Sonar = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.OperadorVisual; Sonar?.Resumo?.AtualizarStatusBloqueio(false); var DeveParar = Sonar?.Resumo?.DeveParar ?? false; if (DeveParar) diff --git a/AgroBase/AgroBase/Models/MPCController.cs b/AgroBase/AgroBase/Models/MPCController.cs index b46500d79..e716771fe 100644 --- a/AgroBase/AgroBase/Models/MPCController.cs +++ b/AgroBase/AgroBase/Models/MPCController.cs @@ -64,7 +64,7 @@ public class MPCController public async Task EnviarDadosTrajetoria(List _trajetoria) { - var _Controle = Variaveis.OperacaoEmAndamento.Controle; + var pControle = Variaveis.OperacaoEmAndamento.Parametros.Controle; var trajetoria = new { @@ -78,10 +78,10 @@ public class MPCController }) .ToList(), horizonte = Horizonte, - angulo_max_graus = _Controle.Angulo_Max, + angulo_max_graus = pControle.DirAnguloMaximo, distancia_entre_eixos = (VariaveisEquipamento.DistanciaEntreEixos / 100.0), - velocidade_min = FuncoesMatematicas.CalculaVelocidadeMsPercentual(_Controle.PercentualVelocidadeMin), - velocidade_max = FuncoesMatematicas.CalculaVelocidadeMsPercentual(_Controle.PercentualVelocidadeMax) + velocidade_min = FuncoesMatematicas.CalculaVelocidadeMsPercentual(pControle.MovVelocidadeCErvasPercent), + velocidade_max = FuncoesMatematicas.CalculaVelocidadeMsPercentual(pControle.MovVelocidadeSErvasPercent) }; await Variaveis.MqttServiceLocal.PublishAsync( @@ -101,7 +101,7 @@ public class MPCController _dt = (EnviadoEm - _ultimaAtualizacao).TotalSeconds; double dtCalc = Math.Max(tempoMinimo, Math.Min(tempoMaximo, _dt)); - var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento; + var _Sensoriamento = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura; var dadosEnvio = new { diff --git a/AgroBase/AgroBase/Models/MPCControllerAprimorado.cs b/AgroBase/AgroBase/Models/MPCControllerAprimorado.cs index c8da527d6..f4be5fcea 100644 --- a/AgroBase/AgroBase/Models/MPCControllerAprimorado.cs +++ b/AgroBase/AgroBase/Models/MPCControllerAprimorado.cs @@ -24,10 +24,10 @@ public class MPCControllerAprimorado public MPCControllerAprimorado() { - this.maxAnguloDirecao = Variaveis.OperacaoEmAndamento?.Controle?.Angulo_Max ?? 30.0; + this.maxAnguloDirecao = Variaveis.OperacaoEmAndamento.Parametros?.Controle?.DirAnguloMaximo ?? 30.0; this.maxAngulo4Rodas = this.maxAnguloDirecao * 0.8; - this.velocidadeMin = Variaveis.OperacaoEmAndamento?.Controle?.PercentualVelocidadeMin ?? 20.0; - this.velocidadeMax = Variaveis.OperacaoEmAndamento?.Controle?.PercentualVelocidadeMax ?? 100.0; + this.velocidadeMin = Variaveis.OperacaoEmAndamento.Parametros?.Controle?.MovVelocidadeCErvasPercent ?? 20.0; + this.velocidadeMax = Variaveis.OperacaoEmAndamento.Parametros?.Controle?.MovVelocidadeSErvasPercent ?? 100.0; } public (double anguloControle, Enums.TipoMovimentoDirecional modo) CalcularControle(GPSModel posicalAtual, double velocidadeAtual, List proximaTrajetoria, Enums.TipoMovimentoDirecional[] modosPermitidos) diff --git a/AgroBase/AgroBase/Models/MPCControllerSimple.cs b/AgroBase/AgroBase/Models/MPCControllerSimple.cs index 1db001cff..dd7c26600 100644 --- a/AgroBase/AgroBase/Models/MPCControllerSimple.cs +++ b/AgroBase/AgroBase/Models/MPCControllerSimple.cs @@ -28,10 +28,10 @@ public class MPCControllerSimple { // Definições baseadas em variáveis globais this.horizon = Convert.ToInt32(distancePredict / TrajetoriaMapaOperacaoModel.DistanciaEntrePontos); - this.maxSteeringAngle = Variaveis.OperacaoEmAndamento?.Controle?.Angulo_Max ?? 30.0; + this.maxSteeringAngle = Variaveis.OperacaoEmAndamento.Parametros.Controle?.DirAnguloMaximo ?? 30.0; this.maxSteeringAngleFourWheels = this.maxSteeringAngle * 1.0; - this.minVelocity = Variaveis.OperacaoEmAndamento?.Controle?.PercentualVelocidadeMin ?? 20.0; - this.maxVelocity = Variaveis.OperacaoEmAndamento?.Controle?.PercentualVelocidadeMax ?? 100.0; + this.minVelocity = Variaveis.OperacaoEmAndamento.Parametros.Controle?.MovVelocidadeCErvasPercent ?? 20.0; + this.maxVelocity = Variaveis.OperacaoEmAndamento.Parametros.Controle?.MovVelocidadeSErvasPercent ?? 100.0; this.accelerationLimit = 1.5; // Limita aceleração a valores realistas } @@ -52,7 +52,7 @@ public class MPCControllerSimple List<(double steering, Enums.TipoMovimentoDirecional mode)> candidates = GenerateControlCandidates(); double bestCost = double.MaxValue; (double steeringAngle, Enums.TipoMovimentoDirecional mode) bestControl = (0, Enums.TipoMovimentoDirecional.RodasDianteiras); - bool insideStreet = Variaveis.OperacaoEmAndamento.Sensoriamento.Trajetoria.CorredorAtual.Dentro; + bool insideStreet = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Trajetoria.CorredorAtual.Dentro; double velocity = FuncoesMatematicas.CalculaVelocidadeMsPercentual(currentVelocity); double distanciaPasso = dt * velocity; diff --git a/AgroBase/AgroBase/Models/MapaDinamicoModel.cs b/AgroBase/AgroBase/Models/MapaDinamicoModel.cs index 0d2941126..2142ae907 100644 --- a/AgroBase/AgroBase/Models/MapaDinamicoModel.cs +++ b/AgroBase/AgroBase/Models/MapaDinamicoModel.cs @@ -666,7 +666,7 @@ namespace AgroBase.Models private void DrawObstacle(Graphics g, float xRobot, float yRobot, Color pointColor, Color borderColor, float angle, Obstaculo obstaculo, float PxToCm) { - GPSModel posicaoRobo = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps; + GPSModel posicaoRobo = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps; GPSModel posicaoObstaculo = GPSUtils.GerarPontoDeslocado(posicaoRobo, angle, obstaculo.DistanciaMedia_mm / 1000); float x = xRobot + (float)((posicaoObstaculo.Longitude - posicaoRobo.Longitude) * _zoom); diff --git a/AgroBase/AgroBase/Models/MapasModel.cs b/AgroBase/AgroBase/Models/MapasModel.cs index 2b6a7b589..77c6fff94 100644 --- a/AgroBase/AgroBase/Models/MapasModel.cs +++ b/AgroBase/AgroBase/Models/MapasModel.cs @@ -157,66 +157,66 @@ namespace AgroBase.Models } } - public void PopularTrajetoriaMapa() + public void PopularTrajetoriaMapa(MapaFeatureCollectionModel dados = null) { - if (mapaService.DadosMapa != null) + if (dados != null) mapaService.DadosMapa = dados; + if (mapaService.DadosMapa == null) return; + + double OrientacaoRuas = -999; + //DistanciaTotal = 0; + /*if (!RuasPercorrer.Any()) { - double OrientacaoRuas = -999; - //DistanciaTotal = 0; - /*if (!RuasPercorrer.Any()) - { - RuasPercorrer = mapaService.DadosMapa.features.Select(x => x.geometry.id).ToList(); - }*/ - TrajetoriaMapa = new List>(); + RuasPercorrer = mapaService.DadosMapa.features.Select(x => x.geometry.id).ToList(); + }*/ + TrajetoriaMapa = new List>(); - foreach (var ID in RuasPercorrer) + foreach (var ID in RuasPercorrer) + { + var rua = mapaService.DadosMapa.features.FirstOrDefault(x => ID == x.geometry.id); + if (rua != null) { - var rua = mapaService.DadosMapa.features.FirstOrDefault(x => ID == x.geometry.id); - if (rua != null) + TrajetoriaMapa.Add(new List()); + foreach (var ponto in rua.geometry.coordinates) { - TrajetoriaMapa.Add(new List()); - foreach (var ponto in rua.geometry.coordinates) + /*if (rua.geometry.coordinates.IndexOf(ponto) == 0 || rua.geometry.coordinates.IndexOf(ponto) == rua.geometry.coordinates.Count - 1) { - /*if (rua.geometry.coordinates.IndexOf(ponto) == 0 || rua.geometry.coordinates.IndexOf(ponto) == rua.geometry.coordinates.Count - 1) - { - continue; - }*/ + continue; + }*/ - GPSModel item = new GPSModel() - { - Longitude = ponto[0], - Latitude = ponto[1], - }; - TrajetoriaMapa[TrajetoriaMapa.Count - 1].Add(item); - /*if (Trajetoria[Trajetoria.Count - 1].Count > 1) - { - DistanciaTotal += GPSService.DistanciaEntrePontos(Trajetoria[Trajetoria.Count - 1][Trajetoria[Trajetoria.Count - 1].Count - 2], item); - }*/ - } + GPSModel item = new GPSModel() + { + Longitude = ponto[0], + Latitude = ponto[1], + }; + TrajetoriaMapa[TrajetoriaMapa.Count - 1].Add(item); + /*if (Trajetoria[Trajetoria.Count - 1].Count > 1) + { + DistanciaTotal += GPSService.DistanciaEntrePontos(Trajetoria[Trajetoria.Count - 1][Trajetoria[Trajetoria.Count - 1].Count - 2], item); + }*/ + } - var Rua = TrajetoriaMapa[TrajetoriaMapa.Count - 1]; - if (OrientacaoRuas == -999) + var Rua = TrajetoriaMapa[TrajetoriaMapa.Count - 1]; + if (OrientacaoRuas == -999) + { + OrientacaoRuas = GPSUtils.CalcularOrientacao(Rua[Rua.Count - 1], Rua[Rua.Count - 2]); + } + else + { + double MargemErroAngulo = 45; + double orientacaoRua = GPSUtils.CalcularOrientacao(Rua[Rua.Count - 1], Rua[Rua.Count - 2]); + double anguloOposto = (orientacaoRua + 180) % 360; + if ((anguloOposto + MargemErroAngulo) >= OrientacaoRuas && (anguloOposto - MargemErroAngulo) <= OrientacaoRuas) { - OrientacaoRuas = GPSUtils.CalcularOrientacao(Rua[Rua.Count - 1], Rua[Rua.Count - 2]); - } - else - { - double MargemErroAngulo = 45; - double orientacaoRua = GPSUtils.CalcularOrientacao(Rua[Rua.Count - 1], Rua[Rua.Count - 2]); - double anguloOposto = (orientacaoRua + 180) % 360; - if ((anguloOposto + MargemErroAngulo) >= OrientacaoRuas && (anguloOposto - MargemErroAngulo) <= OrientacaoRuas) - { - Rua.Reverse(); - } + Rua.Reverse(); } } } + } - if (TrajetoriaMapa.Any()) - { - Variaveis.OperacaoEmAndamento.Trajetoria = new TrajetoriaMapaOperacaoModel(TrajetoriaMapa); - Variaveis.OperacaoEmAndamento.Trajetoria.ProjetarTrajetoriaFixa(); - } + if (TrajetoriaMapa.Any()) + { + Variaveis.OperacaoEmAndamento.Trajetoria = new TrajetoriaMapaOperacaoModel(TrajetoriaMapa); + Variaveis.OperacaoEmAndamento.Trajetoria.ProjetarTrajetoriaFixa(); } } diff --git a/AgroBase/AgroBase/Models/Modules/AtuadorModel.cs b/AgroBase/AgroBase/Models/Modules/AtuadorModel.cs index e543e64d8..7f62f0be4 100644 --- a/AgroBase/AgroBase/Models/Modules/AtuadorModel.cs +++ b/AgroBase/AgroBase/Models/Modules/AtuadorModel.cs @@ -55,7 +55,7 @@ namespace AgroBase.Models.Modules FuncoesPinout.SDA, FuncoesPinout.SCL, }; - public int QuantidadeBicos { get; set; } = 4; + //public int QuantidadeBicos { get; set; } = 4; public double DensidadeHerbicida { get; set; } = 1.0; public List BicosPulverizadores { get; set; } = new List(); public List BombasPressurizadoras { get; set; } = new List(); @@ -90,7 +90,7 @@ namespace AgroBase.Models.Modules { get { - return VolumeReservatorio / Variaveis.OperacaoEmAndamento.CapacidadeReservatorio * 100.0; + return VolumeReservatorio / Variaveis.OperacaoEmAndamento.Parametros.CapacidadeReservatorio * 100.0; } } #endregion @@ -140,7 +140,7 @@ namespace AgroBase.Models.Modules } public void AtualizaPercentualErvas() { - double tempoTotalOperacao = Variaveis.OperacaoEmAndamento.Sensoriamento.TempoDecorridoSeg * 1000.0; + double tempoTotalOperacao = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.TempoDecorridoSeg * 1000.0; if (tempoTotalOperacao > 0) { @@ -225,7 +225,6 @@ namespace AgroBase.Models.Modules _EnderecoCAN_Rx = 0x12, _TaxaAmostragem = 1000, RequisitarDados = true, - QuantidadeBicos = 4, BicosPulverizadores = new List(), BombasPressurizadoras = new List() { @@ -422,7 +421,7 @@ namespace AgroBase.Models.Modules }, }, }; - for (int i = 0; i < Atuador.QuantidadeBicos; i++) + for (int i = 0; i < Variaveis.OperacaoEmAndamento.Parametros.QtdBicos; i++) { int posicao = (i + 1); Atuador.BicosPulverizadores.Add(new AtuadorBicoModel() @@ -779,7 +778,7 @@ namespace AgroBase.Models.Modules bomba.ComandoAtuar = false; } // Religa a bomba caso esteja desligada, o nivel de herbicida esta estavel e o pulverizador automatico esta ligado - else if (PercentualReservatorio >= VariaveisEquipamento.PercentualReservatorioMin && leituraEstado == false && Variaveis.OperacaoEmAndamento.Controle.PulverizadorAutomatico) + else if (PercentualReservatorio >= VariaveisEquipamento.PercentualReservatorioMin && leituraEstado == false && Variaveis.OperacaoEmAndamento.Parametros.Controle.PulverizadorAutomatico) { bomba.ComandoAtuar = true; } @@ -1077,7 +1076,7 @@ namespace AgroBase.Models.Modules { (byte)Componente, (byte)(conectar ? 1 : 0), - (byte)Variaveis.OperacaoEmAndamento.Controle.PressaoLinha, + (byte)Variaveis.OperacaoEmAndamento.Parametros.Controle.AtuPressaoLinha, (byte)(pinout.Pinos.FirstOrDefault(x => x.ComponenteID == ID && x.Funcao == FuncoesPinout.ENA)?.Pino ?? PinoutUtils.PINO_INVALIDO), (byte)(pinout.Pinos.FirstOrDefault(x => x.Funcao == FuncoesPinout.CS)?.Pino ?? PinoutUtils.PINO_INVALIDO), }; @@ -1105,12 +1104,12 @@ namespace AgroBase.Models.Modules new byte[] { (byte)(ComandoAtuar ? Estado.Ligado : Estado.Desligado), - (byte)(Variaveis.OperacaoEmAndamento.Controle.PressaoLinha) + (byte)(Variaveis.OperacaoEmAndamento.Parametros.Controle.AtuPressaoLinha) } ); } - public bool AtingiuPressao() => Variaveis.OperacaoEmAndamento.DispAtu.Dados.PressaoLinha >= Variaveis.OperacaoEmAndamento.Controle.PressaoLinha; + public bool AtingiuPressao() => Variaveis.OperacaoEmAndamento.DispAtu.Dados.PressaoLinha >= Variaveis.OperacaoEmAndamento.Parametros.Controle.AtuPressaoLinha; } diff --git a/AgroBase/AgroBase/Models/Modules/DirecionalModel.cs b/AgroBase/AgroBase/Models/Modules/DirecionalModel.cs index 6f11bff91..dbc3e715e 100644 --- a/AgroBase/AgroBase/Models/Modules/DirecionalModel.cs +++ b/AgroBase/AgroBase/Models/Modules/DirecionalModel.cs @@ -29,7 +29,7 @@ namespace AgroBase.Models.Modules { get { - return Convert.ToInt32(((Variaveis.OperacaoEmAndamento.Controle?.VelocidadeMP ?? 0) / 100.0) * Velocidade_Max); + return Convert.ToInt32(((Variaveis.OperacaoEmAndamento.Parametros?.Controle?.DirVelocidadeMovimento ?? 0) / 100.0) * Velocidade_Max); } } diff --git a/AgroBase/AgroBase/Models/Modules/MovimentacaoModel.cs b/AgroBase/AgroBase/Models/Modules/MovimentacaoModel.cs index b6b5a8e0a..35b070fb3 100644 --- a/AgroBase/AgroBase/Models/Modules/MovimentacaoModel.cs +++ b/AgroBase/AgroBase/Models/Modules/MovimentacaoModel.cs @@ -489,7 +489,7 @@ namespace AgroBase.Models.Modules } private double VelocidadeAtual => - FuncoesMatematicas.CalculaVelocidadePercentualMs(Variaveis.OperacaoEmAndamento.Sensoriamento.Movimentacao?.VelocidadeMedia ?? 0); + FuncoesMatematicas.CalculaVelocidadePercentualMs(Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura?.Movimentacao?.VelocidadeMedia ?? 0); private bool StatusControleEmFreio => (Variaveis.OperacaoEmAndamento.Controle?.TiposControle? diff --git a/AgroBase/AgroBase/Models/Modules/SensoriamentoModel.cs b/AgroBase/AgroBase/Models/Modules/SensoriamentoModel.cs index 6e566e3ab..08c7a4641 100644 --- a/AgroBase/AgroBase/Models/Modules/SensoriamentoModel.cs +++ b/AgroBase/AgroBase/Models/Modules/SensoriamentoModel.cs @@ -7,7 +7,6 @@ using static AgroBase.Models.Enums; using System.Globalization; using System.Data; using static AgroBase.Services.LoRaEspService; -using System.Windows.Forms; using AgroBase.Services.Operadores; using AgroBase.Models.Operadores; using System.Diagnostics; @@ -1689,7 +1688,7 @@ namespace AgroBase.Models.Modules }, }; - for (int i = 0; i < Variaveis.OperacaoEmAndamento.QuantidadeCamerasSolo; i++) + for (int i = 0; i < Variaveis.OperacaoEmAndamento.Parametros.QtdCamerasSolo; i++) { obj.CamerasSolo.Add(new OAKCameraModel()); } @@ -2025,7 +2024,7 @@ namespace AgroBase.Models.Modules GeneralJoystick.EnviarComandoSensoriamento(S_Code.sLED, ledOP.ID, comportamento); } - var statusLedAt = Variaveis.OperacaoEmAndamento.Controle.MovimentoAutomatico ? StatusLED.Aceso : StatusLED.Apagado; + var statusLedAt = Variaveis.OperacaoEmAndamento.Parametros.Controle.MovimentoAutomatico ? StatusLED.Aceso : StatusLED.Apagado; var valAt = (int?)(ledAT?.ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.StatusLEDComando)?.atual?.valor) ?? 0; if (ledAT != null && (!ledAT.Comportamento.statusLED.Equals(statusLedAt) || (valAt != (int)statusLedAt))) { @@ -2931,7 +2930,7 @@ namespace AgroBase.Models.Modules { case DadosLoRaParse.ComandoControle: { - Keys tecla = (Keys)data[2]; + BotoesJoystick tecla = (BotoesJoystick)data[2]; int percentualVelocidadeSp = data[3]; TipoMovimentoDirecional tipoMovimentoDirecional = (TipoMovimentoDirecional)data[4]; int anguloMp = data[5]; @@ -2939,15 +2938,17 @@ namespace AgroBase.Models.Modules T_Code dispositivo = (T_Code)data[6]; bool emergencia = data[7] == 1; - OperacaoControleBaseModel Controle = new OperacaoControleBaseModel() + OperacaoComandoBaseModel Controle = new OperacaoComandoBaseModel() { Momento = DateTime.Now, Tecla = tecla, - AnguloMP = anguloMp, + Controle = new OperacaoComandoBaseControleModel() + { + AnguloSP = anguloMp, + PercentualVelocidadeSP = percentualVelocidadeSp, + TipoMovimentoDirecional = tipoMovimentoDirecional, + }, Emergencia = emergencia, - PercentualVelocidadeSP = percentualVelocidadeSp, - TipoMovimento = tipoMovimentoDirecional, - //VelocidadeMP = velocidadeMp, Dispositivo = dispositivo }; Variaveis.OperacaoEmAndamento.ExecutaComandoDaBase(Controle); diff --git a/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs b/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs index ebb7a16b4..5c3eae07a 100644 --- a/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs +++ b/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs @@ -55,7 +55,8 @@ namespace AgroBase.Models public MapasModel Mapa { get; set; } = new MapasModel(); public TrajetoriaMapaOperacaoModel Trajetoria { get; set; } public List GPSTrajetoria { get; set; } = new List(); - public OperacaoSensoriamentoLogModel Sensoriamento { get; set; } = new OperacaoSensoriamentoLogModel(); + public OperacaoParametrosModel Parametros { get; set; } = new OperacaoParametrosModel(); + //public OperacaoSensoriamentoLogModel Sensoriamento { get; set; } = new OperacaoSensoriamentoLogModel(); public PerformanceModel DadosPerformance { get; set; } = new PerformanceModel(); public Form frmOperacao { get; set; } @@ -116,10 +117,8 @@ namespace AgroBase.Models public Dictionary> ModsCalibragem { get; set; } = new Dictionary>(); - public List ModulosMandatorios { get; set; } = new List(); - public List ParametrosMandatorios { get; set; } = new List(); - public double CapacidadeReservatorio { get; set; } = 30; - public int QuantidadeCamerasSolo { get; set; } = 1; + //public List ModulosMandatorios { get; set; } = new List(); + //public List ParametrosMandatorios { get; set; } = new List(); public int TempoIniciarOperacao { get; set; } = 30; public string ID { get; set; } public double tmrLogsInterval @@ -176,7 +175,7 @@ namespace AgroBase.Models return false; } - if (Variaveis.OperacaoEmAndamento.ParametrosMandatorios.Any(x => x.Parametro == ParametrosOperacao.Mapa && x.Mandatorio) && string.IsNullOrEmpty(Variaveis.OperacaoEmAndamento.Mapa?.mapaService?.CaminhoMapa) && !(Variaveis.OperacaoEmAndamento.Mapa?.RuasPercorrer ?? new List()).Any()) + 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; @@ -186,26 +185,32 @@ namespace AgroBase.Models { Modo = Variaveis.OperacaoEmAndamento.Modo, Descricao = descricao, - AtuCapacidadeReservatorio = capacidadeReservatorio, - AtuDuracaoAtuacao = duracaoAtuacao, - AtuPercentualDeteccaoVertical = percentualAtuacao, - AtuPressaoLinha = pressaoLinha, - DirAnguloMaximo = anguloMaximo, - DirVelocidadeMovimento = velocidadeMovimento, - DirTipoMovimento = tipoControleDirecional, - MovVelocidadeCErvasPercent = velocidadeCervasPercent, - MovVelocidadeSErvasPercent = velocidadeServasPercent, - ModulosMandatorios = new List(Variaveis.OperacaoEmAndamento.ModulosMandatorios), - ParametrosMandatorios = new List(Variaveis.OperacaoEmAndamento.ParametrosMandatorios), - Mapa = Variaveis.OperacaoEmAndamento.Mapa, - ConfiguracaoUltrassom = ConfigUltrassom, - SonarAtivado = sonarAtivado, + CapacidadeReservatorio = capacidadeReservatorio, + Controle = new OperacaoParametrosControleModel() + { + SonarAtivado = sonarAtivado, + MovimentoAutomatico = movimentoAutomatico, + PulverizadorAutomatico = pulverizadorAutomatico, + FrenagemAutomatica = 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, - MovimentoAutomatico = movimentoAutomatico, - PulverizadorAutomatico = pulverizadorAutomatico, - FrenagemAtuomatica = frenagemAutomatica + }; - Parametros.Mapa.LimparDados(true); + //Parametros.Mapa.LimparDados(true); string ParametrosJson = JsonConvert.SerializeObject(Parametros, Formatting.None); SaveFileDialog saveFileDialog = new SaveFileDialog(); @@ -247,63 +252,34 @@ namespace AgroBase.Models CarregarParametrosOperacaoPadrao(Parametros.Modo); - OperacaoControleModel controle = new OperacaoControleModel() - { - RPM_Max = (int)(VariaveisEquipamento.RPM_Max_Roda * (Parametros.MovVelocidadeSErvasPercent / 100.0)), - RPM_Min = (int)(VariaveisEquipamento.RPM_Max_Roda * (Parametros.MovVelocidadeCErvasPercent / 100.0)), - Angulo_Max = Parametros.DirAnguloMaximo, - Angulo_Min = Parametros.DirAnguloMaximo * -1, - VelocidadeMP = Parametros.DirVelocidadeMovimento, - TempoAtuacao = Parametros.AtuDuracaoAtuacao, - PercentualInicioPulverizacao = Parametros.AtuPercentualDeteccaoVertical / 100.0, - PressaoLinha = Parametros.AtuPressaoLinha, - Angulo = 0, - Direcao = Direcao.Parado, - PercentualVelocidadeSP = 0, - TiposControle = new List(Variaveis.OperacaoEmAndamento.Controle.TiposControle), - SonarAtivado = Parametros.SonarAtivado, - TipoControleDirecional = Parametros.DirTipoMovimento, - PulverizadorAutomatico = Parametros.PulverizadorAutomatico, - MovimentoAutomatico = Parametros.MovimentoAutomatico, - FrenagemAutomatica = Parametros.FrenagemAtuomatica, - TipoMovimento = Variaveis.OperacaoEmAndamento.Controle.TipoMovimento, - heartbeat = 0, - SimulacaoMPC = new List(), - BicosAtuados = Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.BicosPulverizadores?.Select(x => x.Clone())?.ToList() ?? new List(), - ticks_sem_resposta = DateTime.MinValue, - }; + Variaveis.OperacaoEmAndamento.Parametros = Parametros; Variaveis.OperacaoEmAndamento.Descricao = Parametros.Descricao; Variaveis.OperacaoEmAndamento.OprPath = opr_path; - Variaveis.OperacaoEmAndamento.QuantidadeCamerasSolo = Parametros.QtdCamerasSolo; - Variaveis.OperacaoEmAndamento.ModulosMandatorios = new List(Parametros.ModulosMandatorios ?? new List()); - Variaveis.OperacaoEmAndamento.ParametrosMandatorios = new List(Parametros.ParametrosMandatorios ?? new List()); - Variaveis.OperacaoEmAndamento.CapacidadeReservatorio = Parametros.AtuCapacidadeReservatorio; - Variaveis.OperacaoEmAndamento.Controle = controle; if (Variaveis.OperacaoEmAndamento.DispSen == null) { Variaveis.OperacaoEmAndamento.DispSen = new DispositivosService(); } - Variaveis.OperacaoEmAndamento.DispSen.Dados.ConfiguracaoSensorUltrassom = Parametros.ConfiguracaoUltrassom; + //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(Variaveis.OperacaoEmAndamento.frmOperacao, "lblMapaCarregado");*/ - Variaveis.OperacaoEmAndamento.Mapa.pnlMapa = pnlMapa; - Variaveis.OperacaoEmAndamento.Mapa.lblMapa = lblMapa; - - Variaveis.OperacaoEmAndamento.Mapa.btnCarregar_Click(new object(), new EventArgs(), path); - - //bool condicaoMapaCarregado() => Variaveis.OperacaoEmAndamento.Mapa.mapaService.Carregado; - //bool resultado = await FuncoesGlobais.AguardarCondicaoAsync(condicaoMapaCarregado, 5000, 200); - } + //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(Variaveis.OperacaoEmAndamento.frmOperacao, "lblMapaCarregado");*/ + // Variaveis.OperacaoEmAndamento.Mapa.pnlMapa = pnlMapa; + // Variaveis.OperacaoEmAndamento.Mapa.lblMapa = lblMapa; + // + // Variaveis.OperacaoEmAndamento.Mapa.btnCarregar_Click(new object(), new EventArgs(), path); + // + // //bool condicaoMapaCarregado() => Variaveis.OperacaoEmAndamento.Mapa.mapaService.Carregado; + // //bool resultado = await FuncoesGlobais.AguardarCondicaoAsync(condicaoMapaCarregado, 5000, 200); + //} RedisService.AtualizarCampos(CtxKey.DadosOperacao, ("configurado", false)); @@ -332,25 +308,87 @@ namespace AgroBase.Models DispAtu = AtuConectado, DispSen = SenConectado, DispMvd = MvdConectado, - Sensoriamento = new OperacaoSensoriamentoLogModel(), - QuantidadeCamerasSolo = 1, }; switch (Modo) { case ModoOperacao.Manual: + Variaveis.OperacaoEmAndamento.Parametros = new OperacaoParametrosModel() + { + Modo = Modo, + DadosLeitura = new OperacaoSensoriamentoLogModel(), + QtdCamerasSolo = VariaveisEquipamento.QuantidadeCamerasSolo, + QtdBicos = VariaveisEquipamento.QuantidadeBicosPulverizadores, + CapacidadeReservatorio = VariaveisEquipamento.CapacidadeReservatorio, + RoverId = VariaveisEquipamento.Parametros.serial_number, + RuasPercorrer = null, + Mapa = null, + Controle = new OperacaoParametrosControleModel() + { + MovimentoAutomatico = false, + PulverizadorAutomatico = false, + FrenagemAutomatica = true, + MovVelocidadeSErvasPercent = 100, + MovVelocidadeCErvasPercent = 15, + DirAnguloMaximo = 25, + DirVelocidadeMovimento = 40, + SonarAtivado = false, + DirTipoMovimento = TiposControladorDirecional.Manual, + + AtuAlturaAreaPulverizacao = 10, + AtuDuracaoAtuacao = 200, + AtuPercentualErvasBicoOff = 2, + AtuPercentualErvasBicoOn = 1, + AtuPercentualInicioPulverizacao = 70, + AtuPressaoLinha = 85, + }, + ModulosMandatorios = new List() + { + new OperacaoModulosMandatoriosModel() + { + Dispositivo = T_Code.Mov, + Mandatorio = false, + Utilizar = true, + }, + new OperacaoModulosMandatoriosModel() + { + Dispositivo = T_Code.Dir, + Mandatorio = false, + Utilizar = true, + }, + new OperacaoModulosMandatoriosModel() + { + Dispositivo = T_Code.Atu, + Mandatorio = false, + Utilizar = true, + } + }, + ParametrosMandatorios = new List() + { + new OperacaoParametrosMandatoriosModel() + { + Parametro = ParametrosOperacao.Joystick, + Mandatorio = false, + Utilizar = true, + }, + new OperacaoParametrosMandatoriosModel() + { + Parametro = ParametrosOperacao.LoRa, + Mandatorio = false, + Utilizar = true, + }, + } + }; Variaveis.OperacaoEmAndamento.frmOperacao = new frmOperacaoManual(); Variaveis.OperacaoEmAndamento.ControleAnterior = new OperacaoControleModel(); Variaveis.OperacaoEmAndamento.Controle = new OperacaoControleModel() { - MovimentoAutomatico = false, - PulverizadorAutomatico = false, - FrenagemAutomatica = true, - RPM_Max = 100, - RPM_Min = 15, - Angulo_Max = 25, - Angulo_Min = -25, - VelocidadeMP = 40, + TipoMovimento = TipoMovimentoDirecional.RodasDianteiras, + Angulo = 25, + BicosAtuados = new List(), + Direcao = Direcao.Parado, + EmFreio = false, + PercentualVelocidadeSP = 20, TiposControle = new List() { new OperacaoControleTipoModel() @@ -381,60 +419,109 @@ namespace AgroBase.Models UltimoComando = DateTime.Now }, }, - SonarAtivado = false, - TipoMovimento = TipoMovimentoDirecional.RodasDianteiras, - TipoControleDirecional = TiposControladorDirecional.Manual - }; - Variaveis.OperacaoEmAndamento.ModulosMandatorios = new List() - { - new OperacaoModulosMandatoriosModel() - { - Dispositivo = T_Code.Mov, - Mandatorio = false, - Utilizar = true, - }, - new OperacaoModulosMandatoriosModel() - { - Dispositivo = T_Code.Dir, - Mandatorio = false, - Utilizar = true, - }, - new OperacaoModulosMandatoriosModel() - { - Dispositivo = T_Code.Atu, - Mandatorio = false, - Utilizar = true, - } - }; - Variaveis.OperacaoEmAndamento.ParametrosMandatorios = new List() - { - new OperacaoParametrosMandatoriosModel() - { - Parametro = ParametrosOperacao.Joystick, - Mandatorio = false, - Utilizar = true, - }, - new OperacaoParametrosMandatoriosModel() - { - Parametro = ParametrosOperacao.LoRa, - Mandatorio = false, - Utilizar = true, - }, }; break; case ModoOperacao.MapaGPS: + Variaveis.OperacaoEmAndamento.Parametros = new OperacaoParametrosModel() + { + Modo = Modo, + DadosLeitura = new OperacaoSensoriamentoLogModel(), + QtdCamerasSolo = VariaveisEquipamento.QuantidadeCamerasSolo, + QtdBicos = VariaveisEquipamento.QuantidadeBicosPulverizadores, + CapacidadeReservatorio = VariaveisEquipamento.CapacidadeReservatorio, + RoverId = VariaveisEquipamento.Parametros.serial_number, + RuasPercorrer = null, + Mapa = null, + Controle = new OperacaoParametrosControleModel() + { + MovimentoAutomatico = true, + PulverizadorAutomatico = true, + FrenagemAutomatica = true, + MovVelocidadeSErvasPercent = 50, + MovVelocidadeCErvasPercent = 20, + DirAnguloMaximo = 30, + DirVelocidadeMovimento = 50, + SonarAtivado = true, + DirTipoMovimento = TiposControladorDirecional.MPC, + + AtuAlturaAreaPulverizacao = 10, + AtuDuracaoAtuacao = 200, + AtuPercentualErvasBicoOff = 2, + AtuPercentualErvasBicoOn = 1, + AtuPercentualInicioPulverizacao = 70, + AtuPressaoLinha = 85, + }, + ModulosMandatorios = new List() + { + new OperacaoModulosMandatoriosModel() + { + Dispositivo = T_Code.Mov, + Mandatorio = true, + Utilizar = true, + }, + new OperacaoModulosMandatoriosModel() + { + Dispositivo = T_Code.Dir, + Mandatorio = true, + Utilizar = true, + }, + new OperacaoModulosMandatoriosModel() + { + Dispositivo = T_Code.Sen, + Mandatorio = true, + Utilizar = true, + }, + new OperacaoModulosMandatoriosModel() + { + Dispositivo = T_Code.Atu, + Mandatorio = true, + Utilizar = true, + }, + new OperacaoModulosMandatoriosModel() + { + Dispositivo = T_Code.Gps, + Mandatorio = true, + Utilizar = true, + } + }, + ParametrosMandatorios = new List() + { + new OperacaoParametrosMandatoriosModel() + { + Parametro = ParametrosOperacao.CameraSolo, + Mandatorio = true, + Utilizar = true, + }, + new OperacaoParametrosMandatoriosModel() + { + Parametro = ParametrosOperacao.Sonar, + Mandatorio = false, + Utilizar = true, + }, + new OperacaoParametrosMandatoriosModel() + { + Parametro = ParametrosOperacao.Mapa, + Mandatorio = true, + Utilizar = true, + }, + new OperacaoParametrosMandatoriosModel() + { + Parametro = ParametrosOperacao.LoRa, + Mandatorio = true, + Utilizar = true, + } + } + }; Variaveis.OperacaoEmAndamento.frmOperacao = new frmOperacaoMapaGPS(); Variaveis.OperacaoEmAndamento.ControleAnterior = new OperacaoControleModel(); Variaveis.OperacaoEmAndamento.Controle = new OperacaoControleModel() { - MovimentoAutomatico = true, - PulverizadorAutomatico = true, - FrenagemAutomatica = true, - RPM_Max = 50, - RPM_Min = 20, - Angulo_Max = 30, - Angulo_Min = -30, - VelocidadeMP = 50, + TipoMovimento = TipoMovimentoDirecional.RodasDianteiras, + Angulo = 0, + BicosAtuados = new List(), + Direcao = Direcao.Parado, + EmFreio = false, + PercentualVelocidadeSP = 0, TiposControle = new List() { new OperacaoControleTipoModel() @@ -465,83 +552,109 @@ namespace AgroBase.Models UltimoComando = DateTime.Now }, }, - SonarAtivado = true, - TipoMovimento = TipoMovimentoDirecional.RodasDianteiras, - TipoControleDirecional = TiposControladorDirecional.MPC, - }; - Variaveis.OperacaoEmAndamento.ModulosMandatorios = new List() - { - new OperacaoModulosMandatoriosModel() - { - Dispositivo = T_Code.Mov, - Mandatorio = true, - Utilizar = true, - }, - new OperacaoModulosMandatoriosModel() - { - Dispositivo = T_Code.Dir, - Mandatorio = true, - Utilizar = true, - }, - new OperacaoModulosMandatoriosModel() - { - Dispositivo = T_Code.Sen, - Mandatorio = true, - Utilizar = true, - }, - new OperacaoModulosMandatoriosModel() - { - Dispositivo = T_Code.Atu, - Mandatorio = true, - Utilizar = true, - }, - new OperacaoModulosMandatoriosModel() - { - Dispositivo = T_Code.Gps, - Mandatorio = true, - Utilizar = true, - } - }; - Variaveis.OperacaoEmAndamento.ParametrosMandatorios = new List() - { - new OperacaoParametrosMandatoriosModel() - { - Parametro = ParametrosOperacao.CameraSolo, - Mandatorio = true, - Utilizar = true, - }, - new OperacaoParametrosMandatoriosModel() - { - Parametro = ParametrosOperacao.Sonar, - Mandatorio = false, - Utilizar = true, - }, - new OperacaoParametrosMandatoriosModel() - { - Parametro = ParametrosOperacao.Mapa, - Mandatorio = true, - Utilizar = true, - }, - new OperacaoParametrosMandatoriosModel() - { - Parametro = ParametrosOperacao.LoRa, - Mandatorio = true, - Utilizar = true, - } }; break; case ModoOperacao.TreinamentoIA: + Variaveis.OperacaoEmAndamento.Parametros = new OperacaoParametrosModel() + { + Modo = Modo, + DadosLeitura = new OperacaoSensoriamentoLogModel(), + QtdCamerasSolo = VariaveisEquipamento.QuantidadeCamerasSolo, + QtdBicos = VariaveisEquipamento.QuantidadeBicosPulverizadores, + CapacidadeReservatorio = VariaveisEquipamento.CapacidadeReservatorio, + RoverId = VariaveisEquipamento.Parametros.serial_number, + RuasPercorrer = null, + Mapa = null, + Controle = new OperacaoParametrosControleModel() + { + MovimentoAutomatico = true, + PulverizadorAutomatico = false, + FrenagemAutomatica = false, + MovVelocidadeSErvasPercent = 50, + MovVelocidadeCErvasPercent = 20, + DirAnguloMaximo = 30, + DirVelocidadeMovimento = 50, + SonarAtivado = false, + DirTipoMovimento = TiposControladorDirecional.IA, + + AtuAlturaAreaPulverizacao = 10, + AtuDuracaoAtuacao = 200, + AtuPercentualErvasBicoOff = 2, + AtuPercentualErvasBicoOn = 1, + AtuPercentualInicioPulverizacao = 70, + AtuPressaoLinha = 85, + }, + ModulosMandatorios = new List() + { + new OperacaoModulosMandatoriosModel() + { + Dispositivo = T_Code.Mov, + Mandatorio = true, + }, + new OperacaoModulosMandatoriosModel() + { + Dispositivo = T_Code.Dir, + Mandatorio = true, + }, + new OperacaoModulosMandatoriosModel() + { + Dispositivo = T_Code.Atu, + Mandatorio = true, + }, + new OperacaoModulosMandatoriosModel() + { + Dispositivo = T_Code.Gps, + Mandatorio = true, + }, + new OperacaoModulosMandatoriosModel() + { + Dispositivo = T_Code.Sen, + Mandatorio = false, + }, + new OperacaoModulosMandatoriosModel() + { + Dispositivo = T_Code.Wit, + Mandatorio = true, + }, + new OperacaoModulosMandatoriosModel() + { + Dispositivo = T_Code.Pzm, + Mandatorio = true, + }, + new OperacaoModulosMandatoriosModel() + { + Dispositivo = T_Code.Lra, + Mandatorio = true, + } + }, + ParametrosMandatorios = new List() + { + new OperacaoParametrosMandatoriosModel() + { + Parametro = ParametrosOperacao.CameraSolo, + Mandatorio = true, + }, + new OperacaoParametrosMandatoriosModel() + { + Parametro = ParametrosOperacao.Sonar, + Mandatorio = true, + }, + new OperacaoParametrosMandatoriosModel() + { + Parametro = ParametrosOperacao.Mapa, + Mandatorio = true, + } + } + }; Variaveis.OperacaoEmAndamento.ControleAnterior = new OperacaoControleModel(); Variaveis.OperacaoEmAndamento.Controle = new OperacaoControleModel() { - MovimentoAutomatico = true, - PulverizadorAutomatico = false, - FrenagemAutomatica = false, - RPM_Max = 100, - RPM_Min = 20, - Angulo_Max = 30, - Angulo_Min = -30, - VelocidadeMP = 50, + TipoMovimento = TipoMovimentoDirecional.RodasDianteiras, + Angulo = 0, + BicosAtuados = new List(), + Direcao = Direcao.Parado, + EmFreio = false, + PercentualVelocidadeSP = 0, TiposControle = new List() { new OperacaoControleTipoModel() @@ -572,85 +685,72 @@ namespace AgroBase.Models UltimoComando = DateTime.Now }, }, - SonarAtivado = false, - TipoMovimento = TipoMovimentoDirecional.RodasDianteiras, - TipoControleDirecional = TiposControladorDirecional.IA, - }; - Variaveis.OperacaoEmAndamento.ModulosMandatorios = new List() - { - new OperacaoModulosMandatoriosModel() - { - Dispositivo = T_Code.Mov, - Mandatorio = true, - }, - new OperacaoModulosMandatoriosModel() - { - Dispositivo = T_Code.Dir, - Mandatorio = true, - }, - new OperacaoModulosMandatoriosModel() - { - Dispositivo = T_Code.Atu, - Mandatorio = true, - }, - new OperacaoModulosMandatoriosModel() - { - Dispositivo = T_Code.Gps, - Mandatorio = true, - }, - new OperacaoModulosMandatoriosModel() - { - Dispositivo = T_Code.Sen, - Mandatorio = false, - }, - new OperacaoModulosMandatoriosModel() - { - Dispositivo = T_Code.Wit, - Mandatorio = true, - }, - new OperacaoModulosMandatoriosModel() - { - Dispositivo = T_Code.Pzm, - Mandatorio = true, - }, - new OperacaoModulosMandatoriosModel() - { - Dispositivo = T_Code.Lra, - Mandatorio = true, - } - }; - Variaveis.OperacaoEmAndamento.ParametrosMandatorios = new List() - { - new OperacaoParametrosMandatoriosModel() - { - Parametro = ParametrosOperacao.CameraSolo, - Mandatorio = true, - }, - new OperacaoParametrosMandatoriosModel() - { - Parametro = ParametrosOperacao.Sonar, - Mandatorio = true, - }, - new OperacaoParametrosMandatoriosModel() - { - Parametro = ParametrosOperacao.Mapa, - Mandatorio = true, - } }; break; case ModoOperacao.MapeamentoVisual: - //Variaveis.OperacaoEmAndamento.frmOperacao = new frmOperacaoMapaGPS(); + Variaveis.OperacaoEmAndamento.Parametros = new OperacaoParametrosModel() + { + Modo = Modo, + DadosLeitura = new OperacaoSensoriamentoLogModel(), + QtdCamerasSolo = VariaveisEquipamento.QuantidadeCamerasSolo, + QtdBicos = VariaveisEquipamento.QuantidadeBicosPulverizadores, + CapacidadeReservatorio = VariaveisEquipamento.CapacidadeReservatorio, + RoverId = VariaveisEquipamento.Parametros.serial_number, + RuasPercorrer = null, + Mapa = null, + Controle = new OperacaoParametrosControleModel() + { + MovimentoAutomatico = true, + PulverizadorAutomatico = false, + FrenagemAutomatica = true, + MovVelocidadeSErvasPercent = 40, + MovVelocidadeCErvasPercent = 20, + DirAnguloMaximo = 30, + DirVelocidadeMovimento = 50, + SonarAtivado = true, + DirTipoMovimento = TiposControladorDirecional.PID, + + AtuAlturaAreaPulverizacao = 10, + AtuDuracaoAtuacao = 200, + AtuPercentualErvasBicoOff = 2, + AtuPercentualErvasBicoOn = 1, + AtuPercentualInicioPulverizacao = 70, + AtuPressaoLinha = 85, + }, + ModulosMandatorios = new List() + { + new OperacaoModulosMandatoriosModel() + { + Dispositivo = T_Code.Mov, + Mandatorio = true, + Utilizar = true, + }, + new OperacaoModulosMandatoriosModel() + { + Dispositivo = T_Code.Dir, + Mandatorio = true, + Utilizar = true, + } + }, + ParametrosMandatorios = new List() + { + new OperacaoParametrosMandatoriosModel() + { + Parametro = ParametrosOperacao.Sonar, + Mandatorio = true, + Utilizar = true, + } + } + }; Variaveis.OperacaoEmAndamento.ControleAnterior = new OperacaoControleModel(); Variaveis.OperacaoEmAndamento.Controle = new OperacaoControleModel() { - MovimentoAutomatico = true, - PulverizadorAutomatico = false, - FrenagemAutomatica = true, - RPM_Max = 40, - RPM_Min = 20, - Angulo_Max = 30, - Angulo_Min = -30, - VelocidadeMP = 50, + TipoMovimento = TipoMovimentoDirecional.RodasDianteiras, + Angulo = 0, + BicosAtuados = new List(), + Direcao = Direcao.Parado, + EmFreio = false, + PercentualVelocidadeSP = 0, TiposControle = new List() { new OperacaoControleTipoModel() @@ -672,33 +772,6 @@ namespace AgroBase.Models UltimoComando = DateTime.Now } }, - SonarAtivado = true, - TipoMovimento = TipoMovimentoDirecional.RodasDianteiras, - TipoControleDirecional = TiposControladorDirecional.PID, - }; - Variaveis.OperacaoEmAndamento.ModulosMandatorios = new List() - { - new OperacaoModulosMandatoriosModel() - { - Dispositivo = T_Code.Mov, - Mandatorio = true, - Utilizar = true, - }, - new OperacaoModulosMandatoriosModel() - { - Dispositivo = T_Code.Dir, - Mandatorio = true, - Utilizar = true, - } - }; - Variaveis.OperacaoEmAndamento.ParametrosMandatorios = new List() - { - new OperacaoParametrosMandatoriosModel() - { - Parametro = ParametrosOperacao.Sonar, - Mandatorio = true, - Utilizar = true, - } }; break; } @@ -727,11 +800,30 @@ namespace AgroBase.Models RedisService.AtualizarCampos(CtxKey.DadosOperacao, ("configurado", false)); - Variaveis.OperacaoEmAndamento.Sensoriamento.AtualizarDados(); + Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.AtualizarDados(); } + public (bool, List) CarregarParamerosOperacaoBase(OperacaoParametrosModel Parametros) + { + CarregarParametrosOperacaoPadrao(Parametros.Modo); + Variaveis.OperacaoEmAndamento.Parametros = Parametros; + + Variaveis.OperacaoEmAndamento.Descricao = Parametros.Descricao; + Variaveis.OperacaoEmAndamento.OprPath = $"Base ({VariaveisEquipamento.Parametros.base_ip})"; + + List ruasSelecionadas = Parametros.RuasPercorrer ?? new List(); + if (Parametros.Mapa != null) + { + Variaveis.OperacaoEmAndamento.Mapa = new MapasModel() { RuasPercorrer = ruasSelecionadas }; + Variaveis.OperacaoEmAndamento.Mapa.PopularTrajetoriaMapa(Parametros.Mapa); + } + + RedisService.AtualizarCampos(CtxKey.DadosOperacao, ("configurado", false)); + + return (true, ruasSelecionadas); + } public async Task IniciarOperacao() @@ -752,7 +844,7 @@ namespace AgroBase.Models SalvarOperacao(); - Sensoriamento.AtualizarDados(); + Parametros.DadosLeitura.AtualizarDados(); DispMvd?.Dados?.ReiniciarLeituras(DispMvd?.Dados); DispAtu?.Dados?.ReiniciarLeituras(DispAtu?.Dados); @@ -769,15 +861,15 @@ namespace AgroBase.Models WeedWorkerService.ReiniciarLeituraAnalise(); VisualWorkerService.ReiniciarLeituraAnalise(); - if (Controle.MovimentoAutomatico) + if (Parametros.Controle.MovimentoAutomatico) { Controle.Angulo = 0; Controle.PercentualVelocidadeSP = 0; } else { - Controle.Angulo = Controle.Angulo_Max; - Controle.PercentualVelocidadeSP = Controle.PercentualVelocidadeMin; + Controle.Angulo = Parametros.Controle.DirAnguloMaximo; + Controle.PercentualVelocidadeSP = Parametros.Controle.MovVelocidadeCErvasPercent; } ControleAnterior.Angulo = 0; ControleAnterior.PercentualVelocidadeSP = 0; @@ -828,8 +920,10 @@ namespace AgroBase.Models var DispMvd = Variaveis.OperacaoEmAndamento.DispMvd; List sv = new List() { StatusModulo.Operante, StatusModulo.Alerta }; var s = HealthWorkerService.ModulosSaude; + var pControle = Variaveis.OperacaoEmAndamento.Parametros.Controle; + var _Controle = Variaveis.OperacaoEmAndamento.Controle; - bool calibragemAtuNecessaria = Variaveis.OperacaoEmAndamento.Controle.PulverizadorAutomatico && (DispAtu?.Dados != null && sv.Contains(s.FirstOrDefault(x => x.modulo == T_Code.Atu)?.status ?? StatusModulo.Desconectado) && (forcar || Variaveis.OperacaoEmAndamento.ModsCalibragem[T_Code.Atu].Any(x => !x.Value) || !Variaveis.OperacaoEmAndamento.ModsCalibragem[T_Code.Atu].Any())); + bool calibragemAtuNecessaria = pControle.PulverizadorAutomatico && (DispAtu?.Dados != null && sv.Contains(s.FirstOrDefault(x => x.modulo == T_Code.Atu)?.status ?? StatusModulo.Desconectado) && (forcar || Variaveis.OperacaoEmAndamento.ModsCalibragem[T_Code.Atu].Any(x => !x.Value) || !Variaveis.OperacaoEmAndamento.ModsCalibragem[T_Code.Atu].Any())); bool calibragemDirNecessaria = (DispMvd?.Dados != null && sv.Contains(s.FirstOrDefault(x => x.modulo == T_Code.Dir)?.status ?? StatusModulo.Desconectado) && (forcar || Variaveis.OperacaoEmAndamento.ModsCalibragem[T_Code.Dir].Any(x => !x.Value) || !Variaveis.OperacaoEmAndamento.ModsCalibragem[T_Code.Dir].Any())); bool calibragemMovNecessaria = (DispMvd?.Dados != null && sv.Contains(s.FirstOrDefault(x => x.modulo == T_Code.Mov)?.status ?? StatusModulo.Desconectado) && (forcar || Variaveis.OperacaoEmAndamento.ModsCalibragem[T_Code.Mov].Any(x => !x.Value) || !Variaveis.OperacaoEmAndamento.ModsCalibragem[T_Code.Mov].Any())); @@ -843,7 +937,7 @@ namespace AgroBase.Models Variaveis.OperacaoEmAndamento.Calibrando = true; RedisService.AtualizarCampos(CtxKey.DadosOperacao, ("calibrando", Variaveis.OperacaoEmAndamento.Calibrando)); - TipoMovimentoDirecional tipoControle = Variaveis.OperacaoEmAndamento.Controle.TipoMovimento; + TipoMovimentoDirecional tipoControle = _Controle.TipoMovimento; var tasks = new List(); @@ -854,7 +948,7 @@ namespace AgroBase.Models if (tasks.Count == 0) { Console.WriteLine("Nenhuma calibragem foi iniciada."); - Variaveis.OperacaoEmAndamento.Controle.TipoMovimento = tipoControle; + _Controle.TipoMovimento = tipoControle; Variaveis.OperacaoEmAndamento.Calibrando = false; return; } @@ -877,7 +971,7 @@ namespace AgroBase.Models { Console.WriteLine($"Erro durante calibragem: {ex.Message}"); } - Variaveis.OperacaoEmAndamento.Controle.TipoMovimento = tipoControle; + _Controle.TipoMovimento = tipoControle; Variaveis.OperacaoEmAndamento.Calibrando = false; Variaveis.OperacaoEmAndamento.Pausa = false; RedisService.AtualizarCampos(CtxKey.DadosOperacao, ("calibrando", Variaveis.OperacaoEmAndamento.Calibrando)); @@ -894,7 +988,7 @@ namespace AgroBase.Models ID = ""; - Sensoriamento.AtualizarDados(); + Parametros.DadosLeitura.AtualizarDados(); DispMvd?.Dados?.ReiniciarLeituras(DispMvd.Dados); DispAtu?.Dados?.ReiniciarLeituras(DispAtu.Dados); @@ -1004,11 +1098,12 @@ namespace AgroBase.Models public void AtualizaInformacoesControleOperacao() { - if (Variaveis.OperacaoEmAndamento.Controle.MovimentoAutomatico) + var pControle = Variaveis.OperacaoEmAndamento.Parametros.Controle; + if (pControle.MovimentoAutomatico) { Variaveis.OperacaoEmAndamento.AtualizarDadosControle(false, new List() { T_Code.Mov, T_Code.Dir }); } - if (Variaveis.OperacaoEmAndamento.Controle.PulverizadorAutomatico) + if (pControle.PulverizadorAutomatico) { Variaveis.OperacaoEmAndamento.AtualizarDadosControle(false, new List() { T_Code.Atu }); } @@ -1018,15 +1113,16 @@ namespace AgroBase.Models { DateTime Agora = DateTime.Now; + var pControle = Variaveis.OperacaoEmAndamento.Parametros.Controle; var _Controle = Variaveis.OperacaoEmAndamento.Controle; foreach (var Ctrl in _Controle.TiposControle.Where(x => Dispositivos.Contains(x.Tipo))) { if (!ForcarEnvio) { - if (!_Controle.PulverizadorAutomatico && Ctrl.Tipo == T_Code.Atu) + if (!pControle.PulverizadorAutomatico && Ctrl.Tipo == T_Code.Atu) continue; - else if (!_Controle.MovimentoAutomatico && (Ctrl.Tipo == T_Code.Mov || Ctrl.Tipo == T_Code.Dir)) + else if (!pControle.MovimentoAutomatico && (Ctrl.Tipo == T_Code.Mov || Ctrl.Tipo == T_Code.Dir)) continue; } @@ -1050,6 +1146,7 @@ namespace AgroBase.Models List Protocolos = new List(); + var pControle = Variaveis.OperacaoEmAndamento.Parametros.Controle; var _Controle = Variaveis.OperacaoEmAndamento.Controle; var _ControleAnterior = Variaveis.OperacaoEmAndamento.ControleAnterior; @@ -1057,7 +1154,7 @@ namespace AgroBase.Models { case T_Code.Mov: { - if (_Controle.FrenagemAutomatica && _Controle.EmFreio) + if (pControle.FrenagemAutomatica && _Controle.EmFreio) { _Controle.Direcao = Direcao.EmFreio; } @@ -1191,7 +1288,7 @@ namespace AgroBase.Models return; } - Variaveis.OperacaoEmAndamento.Sensoriamento.AtualizarDados(); + Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.AtualizarDados(); //Variaveis.LoraService?.EnviarDadosParaBase(); if (!Variaveis.OperacaoEmAndamento.Iniciado) @@ -1201,7 +1298,7 @@ namespace AgroBase.Models if (Variaveis.OperacaoEmAndamento.Modo == ModoOperacao.Manual) { - var Sonar = Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorVisual; + var Sonar = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.OperadorVisual; Sonar?.Resumo?.AtualizarStatusBloqueio(true); if (Sonar?.Resumo?.EnviarComandoParada ?? false) { @@ -1214,15 +1311,85 @@ namespace AgroBase.Models } } - public void ExecutaComandoDaBase(OperacaoControleBaseModel controleBase) + public void ExecutaComandoDaBase(OperacaoComandoBaseModel controleBase) { + if (controleBase.Dispositivo == T_Code.Mod) + { + Task.Run(async () => + { + if (controleBase.Tecla == BotoesJoystick.PS) + { + if (!Variaveis.OperacaoEmAndamento.Iniciado) + await Variaveis.OperacaoEmAndamento.IniciarOperacao(); + } + else if (controleBase.Tecla == BotoesJoystick.Share) + { + if (!Variaveis.OperacaoEmAndamento.Iniciado) + await Variaveis.OperacaoEmAndamento.IniciarSimulacao(); + } + else + { + if (Variaveis.OperacaoEmAndamento.Iniciado) + await Variaveis.OperacaoEmAndamento.FinalizarOperacao(); + } + }); + return; + } + Variaveis.OperacaoEmAndamento.Emergencia = controleBase.Emergencia; if (Variaveis.OperacaoEmAndamento.Emergencia) return; + if (controleBase.Dispositivo == T_Code.Gps) + { + VariaveisEquipamento.LeverArmFrontal = controleBase.LeverArmFrontal; + VariaveisEquipamento.LeverArmLateral = controleBase.LeverArmLateral; + GPSService.LeverArm = new GeoLeverArm(VariaveisEquipamento.LeverArmFrontal, VariaveisEquipamento.LeverArmLateral); + return; + } + + if (controleBase.Dispositivo == T_Code.Snr) + { + RedisService.AtualizarCampos( + RedisService.CamKey(Variaveis.OperacaoEmAndamento.DispSen.Dados.CameraCaminho.Id), + ("streaming", controleBase.Tecla == BotoesJoystick.L1) + ); + return; + } + + if (controleBase.Dispositivo == T_Code.Cam) + { + RedisService.AtualizarCampos( + RedisService.CamKey(Variaveis.OperacaoEmAndamento.DispSen.Dados.CamerasSolo.FirstOrDefault().Id), + ("streaming", controleBase.Tecla == BotoesJoystick.L1) + ); + return; + } + + var _Parametros = controleBase.Parametros; + if (_Parametros != null) + { + if (controleBase.Tecla == BotoesJoystick.Options) // Parametrizando, carrega operacao completa + { + Variaveis.OperacaoEmAndamento.CarregarParamerosOperacaoBase(_Parametros); + } + else if (controleBase.Tecla == BotoesJoystick.Share) // Requisita dados da operacao + { + var topico = Variaveis.MqttServiceBase.Topicos.FirstOrDefault(x => x.Topico == VariaveisEquipamento.TopicoMqttParametros.Replace("", VariaveisEquipamento.Parametros.serial_number)); + var msg = JsonConvert.SerializeObject(Variaveis.OperacaoEmAndamento.Parametros); + Task.Run(async () => await Variaveis.MqttServiceBase.PublishAsync(topico, msg)); + } + else if (_Parametros.Controle != null) // Operacao em andamento, envia apenas dados de controle + { + Variaveis.OperacaoEmAndamento.Parametros.Controle = _Parametros.Controle; + } + HealthWorkerService.AtualizarDadosOperacao(); + return; + } + Variaveis.OperacaoEmAndamento.Pausa = controleBase.Pausa; if (Variaveis.OperacaoEmAndamento.Pausa) return; - if (Variaveis.OperacaoEmAndamento.Controle.MovimentoAutomatico) return; + if (Variaveis.OperacaoEmAndamento.Parametros.Controle.MovimentoAutomatico) return; var _Controle = Variaveis.OperacaoEmAndamento.Controle; @@ -1233,13 +1400,13 @@ namespace AgroBase.Models //TipoMovimentoDirecional oldTipoMovimento = _Controle.TipoMovimento; // Atualizar estado atual com os valores do controleBase - _Controle.PercentualVelocidadeSP = controleBase.PercentualVelocidadeSP; - _Controle.Angulo = controleBase.AnguloMP; - _Controle.VelocidadeMP = controleBase.VelocidadeMP; - _Controle.TipoMovimento = controleBase.TipoMovimento; + _Controle.PercentualVelocidadeSP = controleBase.Controle.PercentualVelocidadeSP; + _Controle.Angulo = controleBase.Controle.AnguloSP; + _Controle.TipoMovimento = controleBase.Controle.TipoMovimentoDirecional; // Enviar comando - GeneralJoystick.EnviaComandoMotor(controleBase.Tecla, controleBase.Dispositivo, ForcarComando: true); + Keys tecla = GeneralJoystick.DeParaComandos.FirstOrDefault(x => x.botaoJoy == controleBase.Tecla)?.key ?? Keys.Escape; + GeneralJoystick.EnviaComandoMotor(tecla, controleBase.Dispositivo, ForcarComando: true); // Restaurar estado anterior //_Controle.PercentualVelocidadeSP = oldPercentualVelocidade; @@ -1250,7 +1417,9 @@ namespace AgroBase.Models private async Task tmrComunicacao_Tick() { - bool base_encontrada = (DateTime.Now - VariaveisOperacao.PosicaoBase.Momento).TotalSeconds < 10; + if (Variaveis.MqttServiceBase == null) return; + + bool base_encontrada = (DateTime.Now - VariaveisOperacao.PosicaoBase.UltimoComandoRespondido).TotalSeconds < 10; MqttService.MqttTopicosModel topico = null; string msg = string.Empty; if (!base_encontrada) @@ -1261,7 +1430,7 @@ namespace AgroBase.Models else { topico = Variaveis.MqttServiceBase.Topicos.FirstOrDefault(x => x.Topico == VariaveisEquipamento.TopicoMqttTelemetria.Replace("", VariaveisEquipamento.Parametros.serial_number)); - msg = JsonConvert.SerializeObject(Variaveis.OperacaoEmAndamento.Sensoriamento); + msg = JsonConvert.SerializeObject(Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura); } if (topico != null && !string.IsNullOrEmpty(msg)) { @@ -1301,7 +1470,7 @@ namespace AgroBase.Models { DateTime Agora = DateTime.Now; - OperacaoSensoriamentoLogModel logGeral = Variaveis.OperacaoEmAndamento.Sensoriamento.Clone(); + OperacaoSensoriamentoLogModel logGeral = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Clone(); logGeral.Momento = Agora; SalvarLog("operacao", logGeral, Fim); Variaveis.OperacaoEmAndamento.Controle.TiposControle.ForEach(x => x.Comandos.Clear()); @@ -1362,14 +1531,14 @@ namespace AgroBase.Models MassaReservatorio = Variaveis.OperacaoEmAndamento.DispAtu.Dados.MassaReservatorio, PercentualReservatorio = Variaveis.OperacaoEmAndamento.DispAtu.Dados.PercentualReservatorio, VolumeReservatorio = Variaveis.OperacaoEmAndamento.DispAtu.Dados.VolumeReservatorio, - PressaoLinha_SP = Variaveis.OperacaoEmAndamento.Controle.PressaoLinha, + PressaoLinha_SP = Variaveis.OperacaoEmAndamento.Parametros.Controle.AtuPressaoLinha, PressaoLinha = Variaveis.OperacaoEmAndamento.DispAtu.Dados.PressaoLinha, PotenciaBomba = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombasPressurizadoras.FirstOrDefault()?.ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.Potencia)?.atual?.valor ?? 0, BombaLigada = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombasPressurizadoras.FirstOrDefault().ComandoAtuar, VazaoFluxoMLpSInstantanea = Variaveis.OperacaoEmAndamento.DispAtu.Dados.VazaoFluxoMLpSInstantanea, VazaoFluxoMLpSMedia = Variaveis.OperacaoEmAndamento.DispAtu.Dados.VazaoFluxoMLpSMedia, VolumeVazaoML = Variaveis.OperacaoEmAndamento.DispAtu.Dados.VolumeVazaoML, - QuantidadeBicos = Variaveis.OperacaoEmAndamento.DispAtu.Dados.QuantidadeBicos, + QuantidadeBicos = Variaveis.OperacaoEmAndamento.Parametros.QtdBicos, TempoPulverizadorAtuado = Variaveis.OperacaoEmAndamento.DispAtu.Dados.TempoAtuado, Bicos = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BicosPulverizadores.Select(Bico => new AtuBicoSensoriamentoLogModel() { @@ -1636,11 +1805,11 @@ namespace AgroBase.Models public class OperacaoControleModel { - public int RPM_Max { get; set; } = 100; - public int RPM_Min { get; set; } = 20; - public double Angulo_Max { get; set; } = 30; - public double Angulo_Min { get; set; } = -30; - public double VelocidadeMP { get; set; } = 50; + //public int RPM_Max { get; set; } = 100; + //public int RPM_Min { get; set; } = 20; + //public double Angulo_Max { get; set; } = 30; + //public double Angulo_Min { get; set; } = -30; + //public double VelocidadeMP { get; set; } = 50; public double Angulo { get; set; } public int heartbeat { get; set; } = 1; public DateTime ticks_sem_resposta { get; set; } = DateTime.MinValue; @@ -1659,20 +1828,27 @@ namespace AgroBase.Models } } public double PercentualVelocidadeSP { get; set; } - public double PercentualVelocidadeMin + public double PercentualVelocidadeSPKmh { get { - return FuncoesMatematicas.Map(RPM_Min, 0, VariaveisEquipamento.RPM_Max_Roda, 0, 100); - } - } - public double PercentualVelocidadeMax - { - get - { - return FuncoesMatematicas.Map(RPM_Max, 0, VariaveisEquipamento.RPM_Max_Roda, 0, 100); + return FuncoesMatematicas.ConverteMsParaKmh(FuncoesMatematicas.CalculaVelocidadeMsPercentual(PercentualVelocidadeSP)); } } + //public double PercentualVelocidadeMin + //{ + // get + // { + // return FuncoesMatematicas.Map(RPM_Min, 0, VariaveisEquipamento.RPM_Max_Roda, 0, 100); + // } + //} + //public double PercentualVelocidadeMax + //{ + // get + // { + // return FuncoesMatematicas.Map(RPM_Max, 0, VariaveisEquipamento.RPM_Max_Roda, 0, 100); + // } + //} public bool EmFreio { get; set; } = false; public Direcao Direcao { get; set; } = Direcao.Parado; private TipoMovimentoDirecional _tipoMovimento = TipoMovimentoDirecional.Diagnostico; @@ -1723,33 +1899,36 @@ namespace AgroBase.Models } } - public double PercentualInicioPulverizacao { get; set; } = 0.3; + //public double PercentualInicioPulverizacao { get; set; } = 0.7; + //public double AlturaAreaPulverizacao { get; set; } = 0.1; + //public double PercentualErvasBicoOn { get; set; } = 0.02; + //public double PercentualErvasBicoOff { get; set; } = 0.01; public List BicosAtuados { get; set; } = new List(); - public int TempoAtuacao { get; set; } = 200; - public double PressaoLinha { get; set; } = 85; + //public int TempoAtuacao { get; set; } = 200; + //public double PressaoLinha { get; set; } = 85; public List TiposControle { get; set; } = new List(); - public bool SonarAtivado { get; set; } = true; - private bool _pulverizadorAutomatico; - public bool PulverizadorAutomatico - { - get - { - return _pulverizadorAutomatico; - } - set - { - if (value != _pulverizadorAutomatico && !value) - { - Variaveis.OperacaoEmAndamento.Controle.BicosAtuados.ForEach(bico => bico.ComandoAtuar = false); - Variaveis.OperacaoEmAndamento.AtualizarDadosControle(true, new List() { T_Code.Atu }); - } - _pulverizadorAutomatico = value; - } - } - public bool MovimentoAutomatico { get; set; } - public bool FrenagemAutomatica { get; set; } - public TiposControladorDirecional TipoControleDirecional { get; set; } = TiposControladorDirecional.PID; + //public bool SonarAtivado { get; set; } = true; + //private bool _pulverizadorAutomatico; + //public bool PulverizadorAutomatico + //{ + // get + // { + // return _pulverizadorAutomatico; + // } + // set + // { + // if (value != _pulverizadorAutomatico && !value) + // { + // Variaveis.OperacaoEmAndamento.Controle.BicosAtuados.ForEach(bico => bico.ComandoAtuar = false); + // Variaveis.OperacaoEmAndamento.AtualizarDadosControle(true, new List() { T_Code.Atu }); + // } + // _pulverizadorAutomatico = value; + // } + //} + //public bool MovimentoAutomatico { get; set; } + //public bool FrenagemAutomatica { get; set; } + //public TiposControladorDirecional TipoControleDirecional { get; set; } = TiposControladorDirecional.PID; public List SimulacaoMPC { get; set; } = new List(); public double Latencia { get; set; } @@ -1761,26 +1940,29 @@ namespace AgroBase.Models return new OperacaoControleModel() { Angulo = Angulo, - Angulo_Max = Angulo_Max, - Angulo_Min = Angulo_Min, + //Angulo_Max = Angulo_Max, + //Angulo_Min = Angulo_Min, BicosAtuados = BicosAtuados.Select(x => x.Clone()).ToList(), Direcao = Direcao, - PercentualInicioPulverizacao = PercentualInicioPulverizacao, + //PercentualInicioPulverizacao = PercentualInicioPulverizacao, + //AlturaAreaPulverizacao = AlturaAreaPulverizacao, + //PercentualErvasBicoOn = PercentualErvasBicoOn, + //PercentualErvasBicoOff = PercentualErvasBicoOff, PercentualVelocidadeSP = PercentualVelocidadeSP, _tipoMovimento = _tipoMovimento, - PressaoLinha = PressaoLinha, - RPM_Max = RPM_Max, - RPM_Min = RPM_Min, - SonarAtivado = SonarAtivado, - TempoAtuacao = TempoAtuacao, - TipoControleDirecional = TipoControleDirecional, + //PressaoLinha = PressaoLinha, + //RPM_Max = RPM_Max, + //RPM_Min = RPM_Min, + //SonarAtivado = SonarAtivado, + //TempoAtuacao = TempoAtuacao, + //TipoControleDirecional = TipoControleDirecional, TipoMovimento = TipoMovimento, TiposControle = new List(TiposControle), - VelocidadeMP = VelocidadeMP, + //VelocidadeMP = VelocidadeMP, SimulacaoMPC = new List(SimulacaoMPC), - PulverizadorAutomatico = PulverizadorAutomatico, - MovimentoAutomatico = MovimentoAutomatico, - FrenagemAutomatica = FrenagemAutomatica, + //PulverizadorAutomatico = PulverizadorAutomatico, + //MovimentoAutomatico = MovimentoAutomatico, + //FrenagemAutomatica = FrenagemAutomatica, heartbeat = heartbeat, ticks_sem_resposta = ticks_sem_resposta, Latencia = Latencia, @@ -1817,17 +1999,25 @@ namespace AgroBase.Models public bool Utilizar { get; set; } } - public class OperacaoControleBaseModel + public class OperacaoComandoBaseModel { public DateTime Momento { get; set; } - public Keys Tecla { get; set; } + public BotoesJoystick Tecla { get; set; } public T_Code Dispositivo { get; set; } - public double PercentualVelocidadeSP { get; set; } - public double AnguloMP { get; set; } - public double VelocidadeMP { get; set; } - public TipoMovimentoDirecional TipoMovimento { get; set; } public bool Emergencia { get; set; } public bool Pausa { get; set; } + public double LeverArmFrontal { get; set; } + public double LeverArmLateral { get; set; } + public OperacaoParametrosModel Parametros { get; set; } + public OperacaoComandoBaseControleModel Controle { get; set; } + } + + public class OperacaoComandoBaseControleModel + { + public double PercentualVelocidadeSP { get; set; } + public double AnguloSP { get; set; } + public double VelocidadeMP { get; set; } + public TipoMovimentoDirecional TipoMovimentoDirecional { get; set; } } @@ -1849,9 +2039,13 @@ namespace AgroBase.Models public ModoOperacao Modo { get; set; } public ulong CodigoFalha { get; set; } public bool OperacaoLiberada { get; set; } + public bool OperacaoIniciada { get; set; } + public bool Emergencia { get; set; } + public bool Pausa { get; set; } public StatusOperacao StatusOperacao { get; set; } = StatusOperacao.Parado; public DateTime DataInicio { get; set; } public DateTime DataFim { get; set; } + public double TempoAguardandoSeg { get; set; } public double TempoDecorridoSeg { get; set; } public DateTime TempoDecorrido { @@ -1872,6 +2066,8 @@ namespace AgroBase.Models public VisualWorkerModel OperadorVisual { get; set; } public WeedWorkerModel OperadorErvas { get; set; } public LivoxModel LivoxLidar { get; set; } + public List ModulosMandatorios { get; set; } + public List ParametrosMandatorios { get; set; } public List ModulosSaude { get; set; } public Dictionary> ModsCalibragem { get; set; } public bool CanSerialAtivado { get; set; } @@ -1918,6 +2114,7 @@ namespace AgroBase.Models var dadosAtuador = _DispAtu != null ? new OperacaoSensoriamentoLogAtuModel() { QtdCamerasSolo = _DispSen.Dados.CamerasSolo.Count, + CapacidadeReservatorio = VariaveisEquipamento.CapacidadeReservatorio, HerbicidaConsumido = _DispAtu.Dados.VolumeVazaoML, PercentualErvasTerreno = _DispAtu.Dados.PercentualErvasTerreno, HerbicidaPorErva = HerbicidaPorErva, @@ -1934,6 +2131,7 @@ namespace AgroBase.Models var dadosMovimentacao = _DispMvd != null ? new OperacaoSensoriamentoLogMvdModel() { + AnguloMedio = _DispMvd.Dados.Modulos.Where(x => x.DirMotor.Inicializado && x.DirMotor.Comandar).Average(x => Math.Abs(x.DirMotor.Angulo)), VelocidadeMedia = _DispMvd.Dados.VelocidadeMedia, RPMMedio = _DispMvd.Dados.Modulos.Where(x => x.MovMotor.Inicializado).DefaultIfEmpty()?.Average(x => x?.MovMotor?.RPM_Roda ?? 0) ?? 0, TemperaturaMedia = _DispMvd.Dados.Modulos.Where(x => x.MovMotor.Inicializado).DefaultIfEmpty()?.Average(x => x?.MovMotor?.Temperatura ?? 0) ?? 0, @@ -2017,9 +2215,13 @@ namespace AgroBase.Models Momento = DateTime.Now, Modo = Variaveis.OperacaoEmAndamento.Modo, OperacaoLiberada = Variaveis.OperacaoEmAndamento.OperacaoLiberada, + OperacaoIniciada = Variaveis.OperacaoEmAndamento.Iniciado, + Emergencia = Variaveis.OperacaoEmAndamento.Emergencia, + Pausa = Variaveis.OperacaoEmAndamento.Pausa, StatusOperacao = Variaveis.OperacaoEmAndamento.StatusAtual, DataInicio = Variaveis.OperacaoEmAndamento.DataInicio, DataFim = Variaveis.OperacaoEmAndamento.DataFim, + TempoAguardandoSeg = Variaveis.OperacaoEmAndamento.TempoAguardandoSegs, TempoDecorridoSeg = Variaveis.OperacaoEmAndamento.TempoDecorridoSegs, CanSerialAtivado = CanManager.UseCanSerial, IMU = dadosIMU, @@ -2034,11 +2236,13 @@ namespace AgroBase.Models DadosPerformance = dadosPerformance, DadosLoRa = dadosLora, LivoxLidar = dadosLivox, + ModulosMandatorios = new List(Variaveis.OperacaoEmAndamento.Parametros.ModulosMandatorios), + ParametrosMandatorios = new List(Variaveis.OperacaoEmAndamento.Parametros.ParametrosMandatorios), ModulosSaude = HealthWorkerService.ModulosSaude.ToList(), ModsCalibragem = new Dictionary>(Variaveis.OperacaoEmAndamento.ModsCalibragem), }; - Variaveis.OperacaoEmAndamento.Sensoriamento = dadosAtualizados; + Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura = dadosAtualizados; Variaveis.OperacaoEmAndamento.DispSen?.Dados?.ContadorCarga?.AtualizarConsumo(); } @@ -2054,9 +2258,13 @@ namespace AgroBase.Models Momento = Momento, CodigoFalha = CodigoFalha, OperacaoLiberada = OperacaoLiberada, + OperacaoIniciada = OperacaoIniciada, + Emergencia = Emergencia, + Pausa = Pausa, StatusOperacao = StatusOperacao, DataInicio = DataInicio, DataFim = DataFim, + TempoAguardandoSeg = TempoAguardandoSeg, TempoDecorridoSeg = TempoDecorridoSeg, CanSerialAtivado = CanSerialAtivado, Atuador = Atuador?.Clone(), @@ -2071,6 +2279,8 @@ namespace AgroBase.Models IMU = IMU?.Clone(), DadosLoRa = DadosLoRa?.Clone(), LivoxLidar = LivoxLidar?.Clone(), + ModulosMandatorios = new List(ModulosMandatorios), + ParametrosMandatorios = new List(ParametrosMandatorios), ModulosSaude = new List(ModulosSaude), ModsCalibragem = new Dictionary>(ModsCalibragem), }; @@ -2108,6 +2318,7 @@ namespace AgroBase.Models public class OperacaoSensoriamentoLogAtuModel { public int QtdCamerasSolo { get; set; } + public double CapacidadeReservatorio { get; set; } public double HerbicidaConsumido { get; set; } public double PercentualErvasTerreno { get; set; } public double HerbicidaPorErva { get; set; } @@ -2126,6 +2337,7 @@ namespace AgroBase.Models return new OperacaoSensoriamentoLogAtuModel() { QtdCamerasSolo = QtdCamerasSolo, + CapacidadeReservatorio = CapacidadeReservatorio, ErvasNoRadar = ErvasNoRadar, PercentualErvasNoRadar = PercentualErvasNoRadar, HerbicidaConsumido = HerbicidaConsumido, @@ -2144,6 +2356,7 @@ namespace AgroBase.Models public class OperacaoSensoriamentoLogMvdModel { + public double AnguloMedio { get; set; } public double VelocidadeMedia { get; set; } public double RPMMedio { get; set; } public double TempoMovimentoSegs { get; set; } @@ -2165,6 +2378,7 @@ namespace AgroBase.Models { return new OperacaoSensoriamentoLogMvdModel() { + AnguloMedio = AnguloMedio, VelocidadeMedia = VelocidadeMedia, RPMMedio = RPMMedio, TempoMovimentoSegs = TempoMovimentoSegs, diff --git a/AgroBase/AgroBase/Models/Operacoes/OperacaoParametrosModel.cs b/AgroBase/AgroBase/Models/Operacoes/OperacaoParametrosModel.cs index 16ea6ee89..acefc83f6 100644 --- a/AgroBase/AgroBase/Models/Operacoes/OperacaoParametrosModel.cs +++ b/AgroBase/AgroBase/Models/Operacoes/OperacaoParametrosModel.cs @@ -5,25 +5,55 @@ namespace AgroBase.Models.Operacoes { public class OperacaoParametrosModel { + public string RoverId { get; set; } + public bool Alive { get; set; } + public bool Configurado { get; set; } public ModoOperacao Modo { get; set; } public string Descricao { get; set; } + public int QtdCamerasSolo { get; set; } + public int QtdBicos { get; set; } + public double CapacidadeReservatorio { get; set; } public List ModulosMandatorios { get; set; } public List ParametrosMandatorios { get; set; } - public int MovVelocidadeSErvasPercent { get; set; } - public int MovVelocidadeCErvasPercent { get; set; } - public int DirAnguloMaximo { get; set; } - public int DirVelocidadeMovimento { get; set; } - public TiposControladorDirecional DirTipoMovimento { get; set; } - public int AtuPercentualDeteccaoVertical { get; set; } - public double AtuCapacidadeReservatorio { get; set; } - public double AtuPressaoLinha { get; set; } - public int AtuDuracaoAtuacao { get; set; } - public MapasModel Mapa { get; set; } - public UltrasonicA05Configuracoes ConfiguracaoUltrassom { get; set; } + public OperacaoParametrosControleModel Controle { get; set; } + + public MapaFeatureCollectionModel Mapa { get; set; } + public List RuasPercorrer { get; set; } + + public OperacaoSensoriamentoLogModel DadosLeitura { get; set; } + } + + public class OperacaoParametrosControleModel + { public bool SonarAtivado { get; set; } - public int QtdCamerasSolo { get; set; } public bool MovimentoAutomatico { get; set; } public bool PulverizadorAutomatico { get; set; } - public bool FrenagemAtuomatica { get; set; } + public bool FrenagemAutomatica { get; set; } + + public int MovVelocidadeSErvasPercent { get; set; } + public int MovRpmMax + { + get + { + return System.Convert.ToInt32(VariaveisEquipamento.RPM_Max_Roda * (MovVelocidadeSErvasPercent / 100.0)); + } + } + public int MovVelocidadeCErvasPercent { get; set; } + public int MovRpmMin + { + get + { + return System.Convert.ToInt32(VariaveisEquipamento.RPM_Max_Roda * (MovVelocidadeCErvasPercent / 100.0)); + } + } + public int DirAnguloMaximo { get; set; } + public double DirVelocidadeMovimento { get; set; } + public TiposControladorDirecional DirTipoMovimento { get; set; } + public double AtuPressaoLinha { get; set; } + public int AtuDuracaoAtuacao { get; set; } + public double AtuPercentualInicioPulverizacao { get; set; } + public double AtuAlturaAreaPulverizacao { get; set; } + public double AtuPercentualErvasBicoOn { get; set; } + public double AtuPercentualErvasBicoOff { get; set; } } } diff --git a/AgroBase/AgroBase/Models/Operadores/VisualWorkerModel.cs b/AgroBase/AgroBase/Models/Operadores/VisualWorkerModel.cs index 34a4ca679..861d7d043 100644 --- a/AgroBase/AgroBase/Models/Operadores/VisualWorkerModel.cs +++ b/AgroBase/AgroBase/Models/Operadores/VisualWorkerModel.cs @@ -61,10 +61,10 @@ namespace AgroBase.Models.Operadores public void AtualizarStatusBloqueio(bool consideraEmMovimento) { - var Sonar = Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorVisual; + var Sonar = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.OperadorVisual; ObstaculoDetectado = (Sonar.Analises?.matriz_confianca?.block?.decision?.parar ?? false); - if (!Variaveis.OperacaoEmAndamento.Controle.SonarAtivado) + if (!Variaveis.OperacaoEmAndamento.Parametros.Controle.SonarAtivado) { _comandoParadaEnviado = false; DeveParar = false; diff --git a/AgroBase/AgroBase/Models/SonarCamModel.cs b/AgroBase/AgroBase/Models/SonarCamModel.cs index 9b5404025..2ae8a4100 100644 --- a/AgroBase/AgroBase/Models/SonarCamModel.cs +++ b/AgroBase/AgroBase/Models/SonarCamModel.cs @@ -176,7 +176,7 @@ namespace AgroBase.Models public void DetectarObstaculos(OAKDLiteSubdivisoesModel modelo) { Subdivisoes = service.ConverterSubdivisoes(modelo); - Obstaculos = service.IdentificarObstaculos(Subdivisoes, Variaveis.OperacaoEmAndamento.Controle.SonarAtivado); + Obstaculos = service.IdentificarObstaculos(Subdivisoes, Variaveis.OperacaoEmAndamento.Parametros.Controle.SonarAtivado); AtualizarDadosObstaculos(modelo?.x_max ?? 640, modelo?.y_max ?? 480); } diff --git a/AgroBase/AgroBase/Models/SonarModel.cs b/AgroBase/AgroBase/Models/SonarModel.cs index 2a8a03c76..088fc03a6 100644 --- a/AgroBase/AgroBase/Models/SonarModel.cs +++ b/AgroBase/AgroBase/Models/SonarModel.cs @@ -601,7 +601,7 @@ namespace AgroBase.Models { get { - return DistanciaMedia / FuncoesMatematicas.ConverteKmhParaMs(Variaveis.OperacaoEmAndamento.Sensoriamento.Movimentacao.VelocidadeMedia); + return DistanciaMedia / FuncoesMatematicas.ConverteKmhParaMs(Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Movimentacao.VelocidadeMedia); } } public double DeslocamentoNecessarioDesvio @@ -769,18 +769,18 @@ namespace AgroBase.Models { get { - double anguloAbsolutoObstaculo = (Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.AnguloCarroDefinido + AnguloInicial + AnguloFinal) / 2.0; + double anguloAbsolutoObstaculo = (Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps.AnguloCarroDefinido + AnguloInicial + AnguloFinal) / 2.0; double anguloRad = anguloAbsolutoObstaculo * (Math.PI / 180.0); // Supondo que a distância seja em metros e utilizando uma aproximação simples da Terra como esfera // para converter distância e ângulo em mudança de latitude/longitude. double deltaLatitude = (DistanciaMedia * Math.Cos(anguloRad)) / 111111; // Dividindo por 111111 para converter metros em graus - double deltaLongitude = (DistanciaMedia * Math.Sin(anguloRad)) / (111111 * Math.Cos(Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.Latitude * (Math.PI / 180.0))); + double deltaLongitude = (DistanciaMedia * Math.Sin(anguloRad)) / (111111 * Math.Cos(Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps.Latitude * (Math.PI / 180.0))); return new GPSModel { - Latitude = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.Latitude + deltaLatitude, - Longitude = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.Longitude + deltaLongitude + Latitude = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps.Latitude + deltaLatitude, + Longitude = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps.Longitude + deltaLongitude }; } } diff --git a/AgroBase/AgroBase/Models/TrajetoriaMapaOperacaoModel.cs b/AgroBase/AgroBase/Models/TrajetoriaMapaOperacaoModel.cs index c66fec539..62dcf7c94 100644 --- a/AgroBase/AgroBase/Models/TrajetoriaMapaOperacaoModel.cs +++ b/AgroBase/AgroBase/Models/TrajetoriaMapaOperacaoModel.cs @@ -36,9 +36,9 @@ namespace AgroBase.Models public double TempoEntreLeituras { get; private set; } private void AtualizarTempoEntreLeituras() { - double dt = Math.Min((1.0 / GPSService.TaxaAmostragemHz), (UltimaAtualizacaoDados - Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.Momento).TotalSeconds); + double dt = Math.Min((1.0 / GPSService.TaxaAmostragemHz), (UltimaAtualizacaoDados - Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps.Momento).TotalSeconds); TempoEntreLeituras = dt; - UltimaAtualizacaoDados = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.Momento; + UltimaAtualizacaoDados = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps.Momento; } public List> RuasPlantacao { get; set; } @@ -81,8 +81,8 @@ namespace AgroBase.Models { get { - double distPP = GPSUtils.DistanciaEntrePontos(Variaveis.OperacaoEmAndamento.Sensoriamento.Gps, PrimeiroPontoRuaMapa); - double distUP = GPSUtils.DistanciaEntrePontos(Variaveis.OperacaoEmAndamento.Sensoriamento.Gps, UltimoPontoRuaMapa); + double distPP = GPSUtils.DistanciaEntrePontos(Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps, PrimeiroPontoRuaMapa); + double distUP = GPSUtils.DistanciaEntrePontos(Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps, UltimoPontoRuaMapa); // 0 para mais próximo do primeiro ponto da rua (ENTRANDO) // 1 para mais próximo do último ponto da rua (SAINDO) @@ -122,7 +122,7 @@ namespace AgroBase.Models { new PontoTrajetoriaModel(TipoPontoRua.PosicaoRobo) { - Posicao = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps, + Posicao = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps, LarguraCorredor = 1.0, idxCorredor = CorredorAtual?.Idx ?? 0, Visitado = true @@ -215,7 +215,7 @@ namespace AgroBase.Models private void AtualizarAnguloCaminho() { PontoTrajetoriaModel pontoComparar = PontoAtual.Aproximando ? PontoAtual : ProximoPonto != null ? ProximoPonto : PontoAtual; - AnguloCaminho = GPSUtils.CalcularOrientacao(Variaveis.OperacaoEmAndamento.Sensoriamento.Gps, pontoComparar.Posicao); + AnguloCaminho = GPSUtils.CalcularOrientacao(Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps, pontoComparar.Posicao); } [JsonProperty] public double DistanciaEsquerda { get; private set; } @@ -223,8 +223,8 @@ namespace AgroBase.Models public double DistanciaDireita { get; private set; } private void AtualizarDistanciasLaterais() { - DistanciaEsquerda = CalcularDistanciaLateral(true, Variaveis.OperacaoEmAndamento.Sensoriamento.Gps, CorredorAtual?.idxRuaEsquerda ?? 0, PontoAtual?.Direcao ?? DirecaoCarroRua.Ida); - DistanciaDireita = CalcularDistanciaLateral(false, Variaveis.OperacaoEmAndamento.Sensoriamento.Gps, CorredorAtual?.idxRuaDireita ?? 0, PontoAtual?.Direcao ?? DirecaoCarroRua.Ida); + DistanciaEsquerda = CalcularDistanciaLateral(true, Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps, CorredorAtual?.idxRuaEsquerda ?? 0, PontoAtual?.Direcao ?? DirecaoCarroRua.Ida); + DistanciaDireita = CalcularDistanciaLateral(false, Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps, CorredorAtual?.idxRuaDireita ?? 0, PontoAtual?.Direcao ?? DirecaoCarroRua.Ida); } public double CalcularDistanciaLateral(bool ladoEsquerdo, GPSModel posicaoAtual, int idxRua, DirecaoCarroRua direcaoAtual) @@ -472,11 +472,11 @@ namespace AgroBase.Models { if (!velocidadeSemErvasMs.HasValue) { - velocidadeSemErvasMs = FuncoesMatematicas.CalculaVelocidadeMsPercentual(Variaveis.OperacaoEmAndamento.Controle.PercentualVelocidadeMax) * 0.8; + velocidadeSemErvasMs = FuncoesMatematicas.CalculaVelocidadeMsPercentual(Variaveis.OperacaoEmAndamento.Parametros.Controle.MovVelocidadeSErvasPercent) * 0.8; } if (!velocidadeComErvasMs.HasValue) { - velocidadeComErvasMs = FuncoesMatematicas.CalculaVelocidadeMsPercentual(Variaveis.OperacaoEmAndamento.Controle.PercentualVelocidadeMin); + velocidadeComErvasMs = FuncoesMatematicas.CalculaVelocidadeMsPercentual(Variaveis.OperacaoEmAndamento.Parametros.Controle.MovVelocidadeCErvasPercent); } // Supondo que metade do percurso tem ervas e a outra metade não tem @@ -527,12 +527,12 @@ namespace AgroBase.Models if (CorredorAtual.Idx > 0) return; if (!CorredorAtual.Dentro) return; - GPSModel posicaoAtual = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.Clone(); + GPSModel posicaoAtual = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps.Clone(); if (PrimeiroPontoDentroMapa == null) PrimeiroPontoDentroMapa = posicaoAtual; - var OpVisual = Variaveis.OperacaoEmAndamento.Sensoriamento?.OperadorVisual ?? new VisualWorkerModel(); - StatusModulo OpVisualStatus = Variaveis.OperacaoEmAndamento.Sensoriamento.ModulosSaude.FirstOrDefault(x => x.modulo == T_Code.Snr)?.status ?? StatusModulo.Desconectado; + var OpVisual = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura?.OperadorVisual ?? new VisualWorkerModel(); + StatusModulo OpVisualStatus = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.ModulosSaude.FirstOrDefault(x => x.modulo == T_Code.Snr)?.status ?? StatusModulo.Desconectado; if (OpVisualStatus != StatusModulo.Operante) return; @@ -558,7 +558,7 @@ namespace AgroBase.Models private void AtualizarErroCombinado() { - var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento; + var _Sensoriamento = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura; //double anguloCamera = _Sensoriamento.OperadorVisual.Leitura.obj?.segmentacao?.angulo_rua ?? 0; double anguloCorredor = AnguloMedioCorredor; @@ -575,7 +575,7 @@ namespace AgroBase.Models double curvaDaRua = GPSUtils.CalcularDiferencaAngulo(anguloProximoPonto, anguloCorredor); // Peso do desalinhamento atual (prioriza alinhar o robô ao corredor) - double pesoAlinhamento = Math.Min(Math.Abs(desalinhamentoComRua) / Variaveis.OperacaoEmAndamento.Controle.Angulo_Max, 1.0); // Normaliza até 30° + double pesoAlinhamento = Math.Min(Math.Abs(desalinhamentoComRua) / Variaveis.OperacaoEmAndamento.Parametros.Controle.DirAnguloMaximo, 1.0); // Normaliza até 30° // Peso do centro (prioriza ir pro ponto central do corredor) double pesoCentro = 1.0 - pesoAlinhamento; @@ -736,9 +736,9 @@ namespace AgroBase.Models double limiarDistanciaMargem = DistanciaErroMapaPlantacao > -1 ? DistanciaErroMapaPlantacao : 5.0; double distanciaCorredor = CorredorAtual.DistanciaTotal; double distanciaRestanteCorredor = CorredorAtual.DistanciaRestante; - double distanciaUltimoPontoCorredor = GPSUtils.DistanciaEntrePontos(Variaveis.OperacaoEmAndamento.Sensoriamento.Gps, CorredorAtual.Pontos.LastOrDefault().Posicao); - var OpVisual = Variaveis.OperacaoEmAndamento.Sensoriamento?.OperadorVisual ?? new VisualWorkerModel(); - StatusModulo OpVisualStatus = Variaveis.OperacaoEmAndamento.Sensoriamento.ModulosSaude.FirstOrDefault(x => x.modulo == T_Code.Snr)?.status ?? StatusModulo.Desconectado; + double distanciaUltimoPontoCorredor = GPSUtils.DistanciaEntrePontos(Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps, CorredorAtual.Pontos.LastOrDefault().Posicao); + var OpVisual = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura?.OperadorVisual ?? new VisualWorkerModel(); + StatusModulo OpVisualStatus = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.ModulosSaude.FirstOrDefault(x => x.modulo == T_Code.Snr)?.status ?? StatusModulo.Desconectado; var DadosSegmentacao = OpVisual.Analises?.segmentacao ?? new VisualWorkerMessageSegmentacaoSemanticaModel(); if (OpVisualStatus == StatusModulo.Operante || Variaveis.OperacaoEmAndamento.Simulando) //OpVisual.Iniciado && @@ -782,7 +782,7 @@ namespace AgroBase.Models double anguloControle = Variaveis.OperacaoEmAndamento.Controle.Angulo; if (abrirCurva && !CorredorAtual.Ultimo) { - anguloControle = CorredorAtual.idxRuaDireita > CorredorAtual.idxRuaEsquerda ? Variaveis.OperacaoEmAndamento.Controle.Angulo_Min : Variaveis.OperacaoEmAndamento.Controle.Angulo_Max; + anguloControle = CorredorAtual.idxRuaDireita > CorredorAtual.idxRuaEsquerda ? -Variaveis.OperacaoEmAndamento.Parametros.Controle.DirAnguloMaximo : Variaveis.OperacaoEmAndamento.Parametros.Controle.DirAnguloMaximo; } int pontosMarcar = 0; @@ -812,7 +812,7 @@ namespace AgroBase.Models { Console.WriteLine($"Angulo de controle definido de {Variaveis.OperacaoEmAndamento.Controle.Angulo} para {anguloControle}"); Variaveis.OperacaoEmAndamento.Controle.Angulo = anguloControle; - Variaveis.OperacaoEmAndamento.Controle.PercentualVelocidadeSP = Variaveis.OperacaoEmAndamento.Controle.PercentualVelocidadeMin; + Variaveis.OperacaoEmAndamento.Controle.PercentualVelocidadeSP = Variaveis.OperacaoEmAndamento.Parametros.Controle.MovVelocidadeCErvasPercent; Variaveis.OperacaoEmAndamento.Controle.TipoMovimento = TipoMovimentoDirecional.MovimentoArco; Variaveis.OperacaoEmAndamento.Controle.TiposControle.FirstOrDefault(x => x.Tipo == T_Code.Dir).DelayEnvioComandoExtra = 1500; Variaveis.OperacaoEmAndamento.Controle.TiposControle.FirstOrDefault(x => x.Tipo == T_Code.Mov).DelayEnvioComandoExtra = 2000; @@ -933,7 +933,7 @@ namespace AgroBase.Models Console.WriteLine("Muito tempo sem receber novo comando do Manager Worker! Reduzindo Velocidade!"); RedisService.AtualizarCampos( CtxKey.DadosControle, - ("velocidade_sp", _Controle.PercentualVelocidadeMin) + ("velocidade_sp", Variaveis.OperacaoEmAndamento.Parametros.Controle.MovVelocidadeCErvasPercent) ); } } @@ -1179,7 +1179,7 @@ namespace AgroBase.Models idxCorredor = 0, idxPonto = 0, idxPontoCorredor = 0, - Posicao = posicaoRobo ?? Variaveis.OperacaoEmAndamento.Sensoriamento.Gps, + Posicao = posicaoRobo ?? Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps, Orientacao = 0, Direcao = direcaoAtual, Visitado = true, @@ -1478,7 +1478,7 @@ namespace AgroBase.Models public void AjustarTrajetoriaParaDesvio(Obstaculo obstaculo) { - GPSModel posicaoAtual = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps; + GPSModel posicaoAtual = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps; double distanciaObstaculo = ((double)obstaculo.DistanciaMedia_mm / 1000); double larguraObstaculo = ((double)obstaculo.Largura_mm / 1000); @@ -1726,7 +1726,7 @@ namespace AgroBase.Models private void AtualizarOrientacaoAtual() { - OrientacaoAtual = GPSUtils.CalcularOrientacao(Variaveis.OperacaoEmAndamento.Sensoriamento.Gps, Posicao); + OrientacaoAtual = GPSUtils.CalcularOrientacao(Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps, Posicao); } private void AtualizarOrientacaoAnterior() @@ -1780,7 +1780,7 @@ namespace AgroBase.Models private void AtualizarDistanciaAtual() { - DistanciaAtual = GPSUtils.DistanciaEntrePontos(Variaveis.OperacaoEmAndamento.Sensoriamento.Gps, Posicao); + DistanciaAtual = GPSUtils.DistanciaEntrePontos(Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps, Posicao); } private void AtualizarDistanciaAnterior() diff --git a/AgroBase/AgroBase/Models/Variaveis.cs b/AgroBase/AgroBase/Models/Variaveis.cs index 59fcf8178..07292b1f6 100644 --- a/AgroBase/AgroBase/Models/Variaveis.cs +++ b/AgroBase/AgroBase/Models/Variaveis.cs @@ -55,7 +55,7 @@ namespace AgroBase.Models public static string CaminhoParametros { get; } = "Parametros/"; public static string CaminhoModelos { get; } = "C:\\AgroBaseModels\\"; public static List DispositivosConectados { get; set; } = new List(); - public static OperacaoModel OperacaoEmAndamento { get; set; } = new OperacaoModel(ModoOperacao.Manual); + public static OperacaoModel OperacaoEmAndamento { get; set; } = new OperacaoModel(ModoOperacao.MapaGPS); public static MqttService MqttServiceLocal { get; set; } public static MqttService MqttServiceBase { get; set; } public static LoRaEspService LoraService @@ -109,7 +109,7 @@ namespace AgroBase.Models MqttServiceBase.Topicos.Clear(); } - MqttServiceLocal = new MqttService("localhost", 1883, IsAgroMonitor ? "base" : VariaveisEquipamento.Parametros.serial_number, true, msg => Console.WriteLine($"[MQTT localhost:{1883}] - {msg}")); + MqttServiceLocal = new MqttService("localhost", 1883, VariaveisEquipamento.Parametros.serial_number, true, msg => Console.WriteLine($"[MQTT localhost:{1883}] - {msg}")); await MqttServiceLocal.AdicionarNovoTopico(MapasVariaveisModel.TopicoCoordenadasGPS); await MqttServiceLocal.AdicionarNovoTopico(MapasVariaveisModel.TopicoTrajetoriaDinamica); await MqttServiceLocal.AdicionarNovoTopico(MapasVariaveisModel.TopicoSelecaoRuasMapa, true, 1, async (message) => @@ -120,14 +120,19 @@ namespace AgroBase.Models MqttServiceBase = new MqttService(VariaveisEquipamento.Parametros.base_ip, 1883, VariaveisEquipamento.Parametros.serial_number, false, msg => Console.WriteLine($"[MQTT {VariaveisEquipamento.Parametros.base_ip}:{1883}] - {msg}")); await MqttServiceBase.AdicionarNovoTopico(VariaveisMonitoramento.TopicoMqttDispositivos); await MqttServiceBase.AdicionarNovoTopico(VariaveisEquipamento.TopicoMqttTelemetria.Replace("", VariaveisEquipamento.Parametros.serial_number)); + await MqttServiceBase.AdicionarNovoTopico(VariaveisEquipamento.TopicoMqttParametros.Replace("", VariaveisEquipamento.Parametros.serial_number)); + await MqttServiceBase.AdicionarNovoTopico(VariaveisEquipamento.TopicoMqttHeartbeat.Replace("", VariaveisEquipamento.Parametros.serial_number), true, 1, async (message) => + { + if (string.IsNullOrEmpty(message.Mensagem)) return; + VariaveisOperacao.PosicaoBase.UltimoComandoRespondido = DateTime.Now; + }); await MqttServiceBase.AdicionarNovoTopico(VariaveisEquipamento.TopicoMqttComandos.Replace("", VariaveisEquipamento.Parametros.serial_number), true, 1, async (message) => { - if (string.IsNullOrEmpty(message.Mensagem)) - return; + if (string.IsNullOrEmpty(message.Mensagem)) return; try { string json = message.Mensagem; - var cmd = JsonConvert.DeserializeObject(json); + var cmd = JsonConvert.DeserializeObject(json); OperacaoEmAndamento.ExecutaComandoDaBase(cmd); } catch (Exception ex) @@ -160,6 +165,7 @@ namespace AgroBase.Models { string json = message.Mensagem; var posicao = JsonConvert.DeserializeObject(json); + posicao.Momento = DateTime.Now; VariaveisOperacao.PosicaoBase = posicao; } catch (Exception ex) @@ -197,15 +203,17 @@ namespace AgroBase.Models _parametros = value; } } + public static string TopicoMqttHeartbeat { get; } = $"agrobot/v1/rover//heartbeat"; public static string TopicoMqttComandos { get; } = $"agrobot/v1/rover//cmd"; public static string TopicoMqttTelemetria { get; } = $"agrobot/v1/rover//telemetry"; + public static string TopicoMqttParametros { get; } = $"agrobot/v1/rover//parameters"; public static double LarguraEsquerda { get; } = 44.0; // 62 public static double LarguraDireita { get; } = 44.0; // 22 public static double ComprimentoFrente { get; } = 7.0; // 7 public static double ComprimentoTras { get; } = 107.0; // 107 - public static double LeverArmFrontal { get; } = 1.0; - public static double LeverArmLateral { get; } = 0.0; public static double DistanciaEntreEixos { get; } = 92.0; + public static double LeverArmFrontal { get; set; } = 100.0; // cm + public static double LeverArmLateral { get; set; } = 0.0; // cm public static double LarguraEquipamentoMm { get @@ -219,6 +227,9 @@ namespace AgroBase.Models public static double PercentualTensaoBateriaMin { get; set; } = 25.0; public static double PercentualReservatorioMin { get; set; } = 8.0; public static double PercentualToleranciaPressaoLinha { get; set; } = 0.15; + public static int QuantidadeCamerasSolo { get; set; } = 1; + public static int QuantidadeBicosPulverizadores { get; set; } = 4; + public static double CapacidadeReservatorio { get; set; } = 30; public static double ReducaoDirecional { get; set; } = 20.0; public static int RPM_Min_Roda { get; set; } = 15; public static int RPM_Max_Roda @@ -554,6 +565,8 @@ namespace AgroBase.Models public bool Carregado { get; set; } public string serial_number { get; set; } public string base_ip { get; set; } + public int base_porta_caminho { get; set; } + public int base_porta_ervas { get; set; } public void AtualizarParametros() { @@ -568,6 +581,8 @@ namespace AgroBase.Models serial_number = par.serial_number; base_ip = par.base_ip; + base_porta_caminho = par.base_porta_caminho; + base_porta_ervas = par.base_porta_ervas; Carregado = true; } @@ -590,7 +605,7 @@ namespace AgroBase.Models { if (!Variaveis.IsAgroMonitor && Variaveis.OperacaoEmAndamento.DispAtu != null) { - return Variaveis.OperacaoEmAndamento.Sensoriamento.Atuador.PercentualErvasTerreno / 100.0; + return Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Atuador.PercentualErvasTerreno / 100.0; } return 0.3; } @@ -601,7 +616,7 @@ namespace AgroBase.Models { if (!Variaveis.IsAgroMonitor && Variaveis.OperacaoEmAndamento.DispAtu != null) { - return (100.0 - Variaveis.OperacaoEmAndamento.Sensoriamento.Atuador.PercentualErvasTerreno) / 100.0; + return (100.0 - Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Atuador.PercentualErvasTerreno) / 100.0; } return 0.7; } diff --git a/AgroBase/AgroBase/Models/VariaveisMonitoramento.cs b/AgroBase/AgroBase/Models/VariaveisMonitoramento.cs index 417015c63..1720b2c14 100644 --- a/AgroBase/AgroBase/Models/VariaveisMonitoramento.cs +++ b/AgroBase/AgroBase/Models/VariaveisMonitoramento.cs @@ -217,7 +217,7 @@ namespace AgroMonitor idxTick++; } - public static async void EnviarDadosControle(string rover_id, OperacaoControleBaseModel controle) + public static async void EnviarDadosControle(string rover_id, OperacaoComandoBaseModel controle) { var topico = Variaveis.MqttServiceLocal.Topicos.FirstOrDefault(x => x.Topico == VariaveisEquipamento.TopicoMqttComandos.Replace("", rover_id)); if (topico != null) diff --git a/AgroBase/AgroBase/Services/CoulombCounterService.cs b/AgroBase/AgroBase/Services/CoulombCounterService.cs index ed923ce84..8e434d881 100644 --- a/AgroBase/AgroBase/Services/CoulombCounterService.cs +++ b/AgroBase/AgroBase/Services/CoulombCounterService.cs @@ -66,7 +66,7 @@ namespace AgroBase.Services public void AtualizarConsumo() { - var Bateria = Variaveis.OperacaoEmAndamento.Sensoriamento.Bateria; + var Bateria = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Bateria; if (!Bateria.Iniciado) { diff --git a/AgroBase/AgroBase/Services/GPSService.cs b/AgroBase/AgroBase/Services/GPSService.cs index ed9cd4437..b06181120 100644 --- a/AgroBase/AgroBase/Services/GPSService.cs +++ b/AgroBase/AgroBase/Services/GPSService.cs @@ -943,9 +943,13 @@ namespace AgroBase.Services { PenultimaLeitura.Ntrip_ativado = UltimaLeitura.Ntrip_ativado; PenultimaLeitura.Heartbeat = UltimaLeitura.Heartbeat; + PenultimaLeitura.LeverArmFrontal = UltimaLeitura.LeverArmFrontal; + PenultimaLeitura.LeverArmLateral = UltimaLeitura.LeverArmLateral; UltimaLeitura.Ntrip_ativado = CorrecaoRTK_Ntrip; UltimaLeitura.Heartbeat = (UltimaLeitura.Heartbeat + 1) % 10; + UltimaLeitura.LeverArmFrontal = VariaveisEquipamento.LeverArmFrontal; + UltimaLeitura.LeverArmLateral = VariaveisEquipamento.LeverArmLateral; if (Variaveis.IsAgroMonitor) { @@ -1142,7 +1146,7 @@ namespace AgroBase.Services { double anguloFinal = 0.0; - bool imuIniciado = Variaveis.OperacaoEmAndamento.Sensoriamento.IMU?.Iniciado ?? false; + bool imuIniciado = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura?.IMU?.Iniciado ?? false; bool gpsIniciado = Iniciado; if (imuIniciado) @@ -1162,7 +1166,7 @@ namespace AgroBase.Services double heading = UltimaLeitura.OrientacaoReal; double angMov = UltimaLeitura.OrientacaoMovimento; double distJan = UltimaLeitura.Distancia; - double velPercent = Variaveis.OperacaoEmAndamento.Simulando ? Variaveis.OperacaoEmAndamento.Controle.RPM_SP : Variaveis.OperacaoEmAndamento.Sensoriamento.Movimentacao?.RPMMedio ?? 0; + double velPercent = Variaveis.OperacaoEmAndamento.Simulando ? Variaveis.OperacaoEmAndamento.Controle.RPM_SP : Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura?.Movimentacao?.RPMMedio ?? 0; bool rtkFix = UltimaLeitura.QualidadeFix == TiposCorrecaoGPS.RTKFixo; double angAnterior = UltimaLeitura.AnguloCarroDefinido; @@ -1173,7 +1177,7 @@ namespace AgroBase.Services else if (imuIniciado) { // Apenas o WT901C está disponível - anguloFinal = Variaveis.OperacaoEmAndamento.Sensoriamento.IMU.RotacaoCorrigida; + anguloFinal = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.IMU.RotacaoCorrigida; } else { @@ -1330,10 +1334,10 @@ namespace AgroBase.Services public class GeoLeverArm { - public GeoLeverArm(double _xb = 0, double _yb = 0, bool _invH = false, bool _mirrL = false) + public GeoLeverArm(double _xbCm = 0, double _ybCm = 0, bool _invH = false, bool _mirrL = false) { - xB = _xb; - yB = _yb; + xB = _xbCm / 100.0; + yB = _ybCm / 100.0; invertHeading = _invH; mirrorLateral = _mirrL; } diff --git a/AgroBase/AgroBase/Services/KinectService.cs b/AgroBase/AgroBase/Services/KinectService.cs index 5b9916a1f..5b158d3d9 100644 --- a/AgroBase/AgroBase/Services/KinectService.cs +++ b/AgroBase/AgroBase/Services/KinectService.cs @@ -624,7 +624,7 @@ namespace AgroBase.Services public static Bitmap ExibirObstaculos(Bitmap bitmap, List subdivisoes, List obstaculos, bool ExibirTexto = false) { - if (bitmap == null || (!Variaveis.OperacaoEmAndamento.Controle.SonarAtivado && Variaveis.OperacaoEmAndamento.Iniciado)) + if (bitmap == null || (!Variaveis.OperacaoEmAndamento.Parametros.Controle.SonarAtivado && Variaveis.OperacaoEmAndamento.Iniciado)) { return bitmap; } @@ -968,7 +968,7 @@ namespace AgroBase.Services private static List IdentificarObstaculos() { - if (!Variaveis.OperacaoEmAndamento.Controle.SonarAtivado || Parametros.Subdivisoes == null) + if (!Variaveis.OperacaoEmAndamento.Parametros.Controle.SonarAtivado || Parametros.Subdivisoes == null) { return new List(); } diff --git a/AgroBase/AgroBase/Services/LoRaBaseService.cs b/AgroBase/AgroBase/Services/LoRaBaseService.cs index 44ef981fa..fd9a0282e 100644 --- a/AgroBase/AgroBase/Services/LoRaBaseService.cs +++ b/AgroBase/AgroBase/Services/LoRaBaseService.cs @@ -682,7 +682,7 @@ namespace AgroBase.Services } } - public static void EnviarDadosComandoControle(OperacaoControleBaseModel Controle, byte EnderecoDestinatario) + public static void EnviarDadosComandoControle(OperacaoComandoBaseModel Controle, byte EnderecoDestinatario) { if (Iniciado) { diff --git a/AgroBase/AgroBase/Services/LoRaEspService.cs b/AgroBase/AgroBase/Services/LoRaEspService.cs index dab1d0513..d95e3e061 100644 --- a/AgroBase/AgroBase/Services/LoRaEspService.cs +++ b/AgroBase/AgroBase/Services/LoRaEspService.cs @@ -137,7 +137,7 @@ namespace AgroBase.Services if (ageRxMs > beaconPeriodoMs + 2000) return; // --- ENVIO (ideal: agregue em 1-2 frames) --- - var s = Variaveis.OperacaoEmAndamento.Sensoriamento; + var s = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura; foreach (var dado in LoRaSerializer.SerializeGPS(s.Gps)) Variaveis.LoraService?.EnviarDadosLoRaViaCAN(dado); diff --git a/AgroBase/AgroBase/Services/LoRaSerializer.cs b/AgroBase/AgroBase/Services/LoRaSerializer.cs index afa860ce5..8c41f2e16 100644 --- a/AgroBase/AgroBase/Services/LoRaSerializer.cs +++ b/AgroBase/AgroBase/Services/LoRaSerializer.cs @@ -160,7 +160,7 @@ namespace AgroBase.Services return (Endereco, model); } - public static byte[] SerializeControleModel(OperacaoControleBaseModel model) + public static byte[] SerializeControleModel(OperacaoComandoBaseModel model) { List bytes = new List(); @@ -174,26 +174,26 @@ namespace AgroBase.Services bytes.AddRange(BitConverter.GetBytes((int)model.Dispositivo)); // Serializar RPM - bytes.AddRange(BitConverter.GetBytes(model.PercentualVelocidadeSP)); + bytes.AddRange(BitConverter.GetBytes(model.Controle.PercentualVelocidadeSP)); // Serializar AnguloMP - bytes.AddRange(BitConverter.GetBytes(model.AnguloMP)); + bytes.AddRange(BitConverter.GetBytes(model.Controle.AnguloSP)); // Serializar VelocidadeMP - bytes.AddRange(BitConverter.GetBytes(model.VelocidadeMP)); + bytes.AddRange(BitConverter.GetBytes(model.Controle.VelocidadeMP)); // Serializar Emergencia bytes.AddRange(BitConverter.GetBytes(model.Emergencia)); // Serializar TipoMovimento (int) - bytes.AddRange(BitConverter.GetBytes((int)model.TipoMovimento)); + bytes.AddRange(BitConverter.GetBytes((int)model.Controle.TipoMovimentoDirecional)); return bytes.ToArray(); } - public static OperacaoControleBaseModel DeserializeControleModel(byte[] bytes) + public static OperacaoComandoBaseModel DeserializeControleModel(byte[] bytes) { - OperacaoControleBaseModel model = new OperacaoControleBaseModel(); + OperacaoComandoBaseModel model = new OperacaoComandoBaseModel(); int index = 0; // Desserializar Momento (DateTime) @@ -201,7 +201,7 @@ namespace AgroBase.Services index += sizeof(long); // Desserializar Tecla (int) - model.Tecla = (Keys)BitConverter.ToInt32(bytes, index); + model.Tecla = (BotoesJoystick)BitConverter.ToInt32(bytes, index); index += sizeof(int); // Desserializar Dispositivo (int) @@ -209,15 +209,15 @@ namespace AgroBase.Services index += sizeof(int); // Desserializar RPM - model.PercentualVelocidadeSP = BitConverter.ToDouble(bytes, index); + model.Controle.PercentualVelocidadeSP = BitConverter.ToDouble(bytes, index); index += sizeof(double); // Desserializar AnguloMP - model.AnguloMP = BitConverter.ToDouble(bytes, index); + model.Controle.AnguloSP = BitConverter.ToDouble(bytes, index); index += sizeof(double); // Desserializar VelocidadeMP - model.VelocidadeMP = BitConverter.ToDouble(bytes, index); + model.Controle.VelocidadeMP = BitConverter.ToDouble(bytes, index); index += sizeof(double); // Desserializar Emergencia @@ -225,7 +225,7 @@ namespace AgroBase.Services index += sizeof(bool); // Desserializar TipoMovimento (int) - model.TipoMovimento = (TipoMovimentoDirecional)BitConverter.ToInt32(bytes, index); + model.Controle.TipoMovimentoDirecional = (TipoMovimentoDirecional)BitConverter.ToInt32(bytes, index); index += sizeof(int); return model; @@ -274,14 +274,14 @@ namespace AgroBase.Services }; } - public static byte[] SerializeComandoControle(OperacaoControleBaseModel Controle) + public static byte[] SerializeComandoControle(OperacaoComandoBaseModel Controle) { List dados = new List(); dados.AddRange(CanPrefix(DadosLoRaParse.ComandoControle)); dados.Add((byte)Controle.Tecla); // 1 byte - dados.Add((byte)Controle.PercentualVelocidadeSP); // 1 byte - dados.Add((byte)Controle.TipoMovimento); // 1 byte - dados.Add((byte)Controle.AnguloMP); // 1 byte + dados.Add((byte)Controle.Controle.PercentualVelocidadeSP); // 1 byte + dados.Add((byte)Controle.Controle.TipoMovimentoDirecional); // 1 byte + dados.Add((byte)Controle.Controle.AnguloSP); // 1 byte //dados.Add((byte)Controle.VelocidadeMP); // 1 byte dados.Add((byte)Controle.Dispositivo); // 1 byte dados.Add((byte)(Controle.Emergencia ? 1 : 0)); // 1 byte @@ -296,7 +296,8 @@ namespace AgroBase.Services dados.Add((byte)Controle.PercentualVelocidadeSP); // 1 byte dados.Add((byte)Controle.TipoMovimento); // 1 byte dados.Add((byte)Controle.Angulo); // 1 byte - dados.Add((byte)Controle.VelocidadeMP); // 1 byte + //dados.Add((byte)Controle.VelocidadeMP); // 1 byte + dados.Add((byte)0); // 1 byte return dados.ToArray(); } diff --git a/AgroBase/AgroBase/Services/Operadores/HealthWorkerService.cs b/AgroBase/AgroBase/Services/Operadores/HealthWorkerService.cs index 798b07f52..bc0ffcfea 100644 --- a/AgroBase/AgroBase/Services/Operadores/HealthWorkerService.cs +++ b/AgroBase/AgroBase/Services/Operadores/HealthWorkerService.cs @@ -108,7 +108,7 @@ namespace AgroBase.Services.Operadores AtualizarDadosModulos(); AtualizarDadosControleOperacao(); - var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento; + var _Sensoriamento = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura; if (_Sensoriamento == null) { @@ -165,6 +165,9 @@ namespace AgroBase.Services.Operadores { RedisService.AtualizarCampos( CtxKey.DadosEquipamento, + ("base_ip", VariaveisEquipamento.Parametros.base_ip), + ("base_porta_caminho", VariaveisEquipamento.Parametros.base_porta_caminho), + ("base_porta_ervas", VariaveisEquipamento.Parametros.base_porta_ervas), ("largura", VariaveisEquipamento.LarguraEquipamentoMm / 1000.0), ("distancia_entre_eixos", VariaveisEquipamento.DistanciaEntreEixos / 100.0), ("percentual_reservatorio_min", VariaveisEquipamento.PercentualReservatorioMin), @@ -195,6 +198,8 @@ namespace AgroBase.Services.Operadores return; } + var _Parametros = Variaveis.OperacaoEmAndamento.Parametros; + var pControle = _Parametros.Controle; var _Controle = Variaveis.OperacaoEmAndamento.Controle; RedisService.AtualizarCampos( @@ -202,20 +207,20 @@ namespace AgroBase.Services.Operadores ("configurado", true), ("modo", Variaveis.OperacaoEmAndamento.Modo), ("tempo_aguardar_inicio_operacao", Variaveis.OperacaoEmAndamento.TempoIniciarOperacao), - ("modulos_mandatorios", Variaveis.OperacaoEmAndamento.ModulosMandatorios.Where(x => x.Mandatorio && x.Utilizar).Select(x => (int)x.Dispositivo).ToArray()), - ("modulos_opcionais", Variaveis.OperacaoEmAndamento.ModulosMandatorios.Where(x => !x.Mandatorio && x.Utilizar).Select(x => (int)x.Dispositivo).ToArray()), - ("parametros_mandatorios", Variaveis.OperacaoEmAndamento.ParametrosMandatorios.Where(x => x.Mandatorio && x.Utilizar).Select(x => (int)x.Parametro).ToArray()), + ("modulos_mandatorios", _Parametros.ModulosMandatorios.Where(x => x.Mandatorio && x.Utilizar).Select(x => (int)x.Dispositivo).ToArray()), + ("modulos_opcionais", _Parametros.ModulosMandatorios.Where(x => !x.Mandatorio && x.Utilizar).Select(x => (int)x.Dispositivo).ToArray()), + ("parametros_mandatorios", _Parametros.ParametrosMandatorios.Where(x => x.Mandatorio && x.Utilizar).Select(x => (int)x.Parametro).ToArray()), ("Mov", new { - percent_vel_max = _Controle.PercentualVelocidadeMax, - percent_vel_min = _Controle.PercentualVelocidadeMin, + percent_vel_max = pControle.MovVelocidadeSErvasPercent, + percent_vel_min = pControle.MovVelocidadeCErvasPercent, } ), ("Dir", new { - angulo_max = _Controle.Angulo_Max, - vel_movimento = _Controle.VelocidadeMP, - tipo_controle = (int)_Controle.TipoControleDirecional, + angulo_max = pControle.DirAnguloMaximo, + vel_movimento = pControle.DirVelocidadeMovimento, + tipo_controle = (int)pControle.DirTipoMovimento, mpc = new { pontos = Variaveis.OperacaoEmAndamento.Trajetoria?._TrajetoriaFixa? @@ -228,9 +233,9 @@ namespace AgroBase.Services.Operadores }) .ToList(), horizonte = 2.5, - angulo_max_graus = _Controle.Angulo_Max, - velocidade_min = FuncoesMatematicas.CalculaVelocidadeMsPercentual(_Controle.PercentualVelocidadeMin), - velocidade_max = FuncoesMatematicas.CalculaVelocidadeMsPercentual(_Controle.PercentualVelocidadeMax), + angulo_max_graus = pControle.DirAnguloMaximo, + velocidade_min = FuncoesMatematicas.CalculaVelocidadeMsPercentual(pControle.MovVelocidadeCErvasPercent), + velocidade_max = FuncoesMatematicas.CalculaVelocidadeMsPercentual(pControle.MovVelocidadeSErvasPercent), tempo_entre_comandos = (Variaveis.OperacaoEmAndamento.Controle.TiposControle.FirstOrDefault(x => x.Tipo == Enums.T_Code.Dir)?.DelayEnvioComando ?? 500) / 1000.0, passos_atraso = 1 } @@ -238,11 +243,14 @@ namespace AgroBase.Services.Operadores ), ("Atu", new { - qtd_bicos = Variaveis.OperacaoEmAndamento.DispAtu.Dados.QuantidadeBicos, - tempo_atuacao = _Controle.TempoAtuacao, - capacidade_reservatorio = Variaveis.OperacaoEmAndamento.CapacidadeReservatorio, - pressao_linha = _Controle.PressaoLinha, - percent_vertical_deteccao = _Controle.PercentualInicioPulverizacao, + qtd_bicos = _Parametros.QtdBicos, + tempo_atuacao = pControle.AtuDuracaoAtuacao, + capacidade_reservatorio = _Parametros.CapacidadeReservatorio, + pressao_linha = pControle.AtuPressaoLinha, + percent_vertical_deteccao = pControle.AtuPercentualInicioPulverizacao, + height_area_deteccao = pControle.AtuAlturaAreaPulverizacao, + pct_erva_bico_on = pControle.AtuPercentualErvasBicoOn, + pct_erva_bico_off = pControle.AtuPercentualErvasBicoOff } ), ("Snr", new @@ -268,12 +276,13 @@ namespace AgroBase.Services.Operadores public static void AtualizarDadosControleOperacao() { + var pControle = Variaveis.OperacaoEmAndamento.Parametros.Controle; RedisService.AtualizarCampos( CtxKey.DadosControle, - ("pulverizador_automatico", Variaveis.OperacaoEmAndamento.Controle.PulverizadorAutomatico), - ("movimento_automatico", Variaveis.OperacaoEmAndamento.Controle.MovimentoAutomatico), - ("frenagem_automatica", Variaveis.OperacaoEmAndamento.Controle.FrenagemAutomatica), - ("sonar_ativado", Variaveis.OperacaoEmAndamento.Controle.SonarAtivado) + ("pulverizador_automatico", pControle.PulverizadorAutomatico), + ("movimento_automatico", pControle.MovimentoAutomatico), + ("frenagem_automatica", pControle.FrenagemAutomatica), + ("sonar_ativado", pControle.SonarAtivado) ); } @@ -281,7 +290,7 @@ namespace AgroBase.Services.Operadores { if (Variaveis.OperacaoEmAndamento.DispMvd == null) return; - var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento; + var _Sensoriamento = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura; var agora = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); //Console.WriteLine(RedisService.Get(RedisService.ModKey(Enums.T_Code.Gps))); diff --git a/AgroBase/AgroBase/Services/Operadores/ManagerWorkerService.cs b/AgroBase/AgroBase/Services/Operadores/ManagerWorkerService.cs index 17d0d4af5..f31bda7a0 100644 --- a/AgroBase/AgroBase/Services/Operadores/ManagerWorkerService.cs +++ b/AgroBase/AgroBase/Services/Operadores/ManagerWorkerService.cs @@ -104,7 +104,7 @@ namespace AgroBase.Services.Operadores break; case ManagerWorkerCommandType.EnviarDadosControle: - if (Variaveis.OperacaoEmAndamento.Controle.MovimentoAutomatico) + if (Variaveis.OperacaoEmAndamento.Parametros.Controle.MovimentoAutomatico) { AtualizarControle(comando.@params); } diff --git a/AgroBase/AgroBase/Services/Operadores/OperadoresService.cs b/AgroBase/AgroBase/Services/Operadores/OperadoresService.cs index 7bd14cf2f..5ab426185 100644 --- a/AgroBase/AgroBase/Services/Operadores/OperadoresService.cs +++ b/AgroBase/AgroBase/Services/Operadores/OperadoresService.cs @@ -79,7 +79,7 @@ namespace AgroBase.Services.Operadores if (!Conectado) { TempoDesconectado++; - if (Variaveis.OperacaoEmAndamento.Iniciado && Variaveis.OperacaoEmAndamento.Controle.MovimentoAutomatico) + if (Variaveis.OperacaoEmAndamento.Iniciado && Variaveis.OperacaoEmAndamento.Parametros.Controle.MovimentoAutomatico) { RedisService.AtualizarCampos( CtxKey.DadosOperacao, diff --git a/AgroBase/AgroBase/Services/Operadores/WeedWorkerService.cs b/AgroBase/AgroBase/Services/Operadores/WeedWorkerService.cs index 1b97bd520..fc195b4c1 100644 --- a/AgroBase/AgroBase/Services/Operadores/WeedWorkerService.cs +++ b/AgroBase/AgroBase/Services/Operadores/WeedWorkerService.cs @@ -101,7 +101,7 @@ namespace AgroBase.Services.Operadores break; case WeedWorkerCommandType.EnviarDadosControle: - if (Variaveis.OperacaoEmAndamento.Controle.PulverizadorAutomatico) + if (Variaveis.OperacaoEmAndamento.Parametros.Controle.PulverizadorAutomatico) { AtualizarControle(comando.@params); } diff --git a/AgroBase/AgroBase/Services/SerialService.cs b/AgroBase/AgroBase/Services/SerialService.cs index 8e8f19411..f27024758 100644 --- a/AgroBase/AgroBase/Services/SerialService.cs +++ b/AgroBase/AgroBase/Services/SerialService.cs @@ -371,7 +371,7 @@ namespace AgroBase.Services }); if (PrimeiraExecucao) { - OperacaoModel.CarregarParametrosOperacaoPadrao(ModoOperacao.Manual); + OperacaoModel.CarregarParametrosOperacaoPadrao(ModoOperacao.MapaGPS); } } diff --git a/AgroBase/AgroBase/Services/SonarService.cs b/AgroBase/AgroBase/Services/SonarService.cs index dc86858eb..8f8113d94 100644 --- a/AgroBase/AgroBase/Services/SonarService.cs +++ b/AgroBase/AgroBase/Services/SonarService.cs @@ -164,7 +164,7 @@ namespace AgroBase.Services public static Bitmap ExibirObstaculos(Bitmap bitmap, SonarCamModel leitura, bool ExibirTexto = false) { - if (bitmap == null || (!Variaveis.OperacaoEmAndamento.Controle.SonarAtivado && Variaveis.OperacaoEmAndamento.Iniciado)) + if (bitmap == null || (!Variaveis.OperacaoEmAndamento.Parametros.Controle.SonarAtivado && Variaveis.OperacaoEmAndamento.Iniciado)) { return bitmap; } diff --git a/AgroBase/AgroBase/bin/x64/Debug/Parametros/parametersAtu-1_1.par b/AgroBase/AgroBase/bin/x64/Debug/Parametros/parametersAtu-1_1.par index 4a322bc4d..18dbdaa81 100644 --- a/AgroBase/AgroBase/bin/x64/Debug/Parametros/parametersAtu-1_1.par +++ b/AgroBase/AgroBase/bin/x64/Debug/Parametros/parametersAtu-1_1.par @@ -1 +1 @@ -{"tmrRegistrador":{"_uiControl":null,"State":2,"IsRunning":false,"IsStopped":true,"IsCreated":false,"IsDisposed":false,"Interval":1000,"IntervalHz":1.0,"StackTrace":"AtuadorModel.IniciarRegistrador","Id":"tmrRegistrador_Atu","TimeTick":"00:00:00"},"_AtuHandler":{"Dispositivo":103},"Dispositivo":103,"Modulo_ID":"Atu","_EnderecoCAN_Tx":18,"_EnderecoCAN_Rx":18,"_TaxaAmostragem":1000,"FrequenciaBase":1.0,"RequisitarDados":true,"Conectado":false,"ConexaoAtiva":false,"AtuPronto":false,"QuantidadeBicos":4,"DensidadeHerbicida":1.0,"BicosPulverizadores":[{"ID":"B01","ID_Num":71,"Posicao":1,"Componente":11,"AtuacaoNivelAlto":true,"ComandoAtuar":false,"Comandar":true,"Mandatorio":true,"Liberado":false,"Funcoes":[21],"MediaNivelFluxo":0.0,"Inicializado":false,"UltimaLeitura":"0001-01-01T00:00:00","ValoresLeituras":[{"funcao":60,"posicao":0,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":66,"posicao":2,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null}],"Atuacoes":0,"InicioAtuacao":"0001-01-01T00:00:00","TempoAtuado":0.0},{"ID":"B02","ID_Num":72,"Posicao":2,"Componente":11,"AtuacaoNivelAlto":true,"ComandoAtuar":false,"Comandar":true,"Mandatorio":true,"Liberado":false,"Funcoes":[21],"MediaNivelFluxo":0.0,"Inicializado":false,"UltimaLeitura":"0001-01-01T00:00:00","ValoresLeituras":[{"funcao":60,"posicao":0,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":66,"posicao":2,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null}],"Atuacoes":0,"InicioAtuacao":"0001-01-01T00:00:00","TempoAtuado":0.0},{"ID":"B03","ID_Num":73,"Posicao":3,"Componente":11,"AtuacaoNivelAlto":true,"ComandoAtuar":false,"Comandar":true,"Mandatorio":true,"Liberado":false,"Funcoes":[21],"MediaNivelFluxo":0.0,"Inicializado":false,"UltimaLeitura":"0001-01-01T00:00:00","ValoresLeituras":[{"funcao":60,"posicao":0,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":66,"posicao":2,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null}],"Atuacoes":0,"InicioAtuacao":"0001-01-01T00:00:00","TempoAtuado":0.0},{"ID":"B04","ID_Num":74,"Posicao":4,"Componente":11,"AtuacaoNivelAlto":true,"ComandoAtuar":false,"Comandar":true,"Mandatorio":true,"Liberado":false,"Funcoes":[21],"MediaNivelFluxo":0.0,"Inicializado":false,"UltimaLeitura":"0001-01-01T00:00:00","ValoresLeituras":[{"funcao":60,"posicao":0,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":66,"posicao":2,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null}],"Atuacoes":0,"InicioAtuacao":"0001-01-01T00:00:00","TempoAtuado":0.0}],"BombasPressurizadoras":[{"ID":"BOMBA","ID_Num":51,"ComandoAtuar":false,"Componente":14,"Comandar":true,"Mandatorio":true,"Liberado":false,"Funcoes":[14,35,36,37,5],"Inicializado":false,"UltimaLeitura":"0001-01-01T00:00:00","ValoresLeituras":[{"funcao":60,"posicao":0,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":66,"posicao":2,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":53,"posicao":2,"indice":1,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":68,"posicao":2,"indice":2,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":24,"posicao":2,"indice":3,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null}]}],"Sensores":[{"ID":"FLXLN","ID_Num":61,"Descricao":"Fluxo na linha principal","Componente":8,"Aferir":true,"Mandatorio":true,"Liberado":false,"Inicializado":false,"UltimaLeitura":"0001-01-01T00:00:00","Funcoes":[25],"Parametros":[],"ValoresLeituras":[{"funcao":60,"posicao":0,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":25,"posicao":2,"indice":0,"minimo":0.0,"maximo":20.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":"mL/s"}]},{"ID":"MASRS","ID_Num":62,"Descricao":"Massa do reservatório de herbicida","Componente":10,"Aferir":true,"Mandatorio":true,"Liberado":false,"Inicializado":false,"UltimaLeitura":"0001-01-01T00:00:00","Funcoes":[22,23],"Parametros":[{"Descricao":"Offset","Valor":"-2.5","QtdBytes":2,"Escalar":true,"Enviar":true}],"ValoresLeituras":[{"funcao":60,"posicao":0,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":32,"posicao":2,"indice":0,"minimo":0.0,"maximo":35.0,"nominal":30.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":"Kg"}]},{"ID":"PRSLN","ID_Num":63,"Descricao":"Pressão na linha principal","Componente":12,"Aferir":true,"Mandatorio":true,"Liberado":false,"Inicializado":false,"UltimaLeitura":"0001-01-01T00:00:00","Funcoes":[24],"Parametros":[{"Descricao":"Vmin","Valor":"0","QtdBytes":1,"Escalar":false,"Enviar":false},{"Descricao":"Vmax","Valor":"4.5","QtdBytes":1,"Escalar":true,"Enviar":false},{"Descricao":"Pmax","Valor":"174","QtdBytes":1,"Escalar":false,"Enviar":false}],"ValoresLeituras":[{"funcao":60,"posicao":0,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":24,"posicao":2,"indice":0,"minimo":0.0,"maximo":120.0,"nominal":85.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":"PSI"}]}],"ScriptDeteccaoErvas":"weed_detector_oak-1_0.py","DadosLeitura":{"Momento":"0001-01-01T00:00:00","Conectado":false,"Dispositivo":0,"Versao":0,"Mod_ID":null,"QualidadeWifi":0,"LatenciaLoop":0,"BicosPulverizadores":[],"BombasPressurizadoras":[],"Sensores":[],"UltimoComandoRespondido":"0001-01-01T00:00:00"},"_MassaRef":0.8,"_MassaLeituraRef":40876.37,"_MassaLeituraExtra":1895800.0,"MassaReservatorio":0.0,"VolumeReservatorio":0.0,"PercentualReservatorio":0.0,"VolumeVazaoAferido":0.0,"_FluxoMlRef":600.0,"_FluxoPulsoRef":538.0,"VazaoFluxoMLpSInstantanea":0.0,"VazaoFluxoMLpSMedia":0.0,"VolumeVazaoML":0.0,"InicioAtuacao":"0001-01-01T00:00:00","TempoAtuado":0.0,"_PressaoVmin":0.0,"_PressaoVmax":4.5,"_PressaoMax":174.045,"PressaoLinha":0.0,"PressaoLinhaCalc":0.0,"PercentualErvasTerreno":0.0} \ No newline at end of file +{"tmrRegistrador":{"_uiControl":null,"State":2,"IsRunning":false,"IsStopped":true,"IsCreated":false,"IsDisposed":false,"Interval":1000,"IntervalHz":1.0,"StackTrace":"AtuadorModel.IniciarRegistrador","Id":"tmrRegistrador_Atu","TimeTick":"00:00:00"},"_AtuHandler":{"Dispositivo":103},"Dispositivo":103,"Modulo_ID":"Atu","_EnderecoCAN_Tx":18,"_EnderecoCAN_Rx":18,"_TaxaAmostragem":1000,"FrequenciaBase":1.0,"RequisitarDados":true,"Conectado":false,"ConexaoAtiva":false,"AtuPronto":false,"DensidadeHerbicida":1.0,"BicosPulverizadores":[{"ID":"B01","ID_Num":71,"Posicao":1,"Componente":11,"AtuacaoNivelAlto":true,"ComandoAtuar":false,"Comandar":true,"Mandatorio":true,"Liberado":false,"Funcoes":[21],"MediaNivelFluxo":0.0,"Inicializado":false,"UltimaLeitura":"0001-01-01T00:00:00","ValoresLeituras":[{"funcao":60,"posicao":0,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":66,"posicao":2,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null}],"Atuacoes":0,"InicioAtuacao":"0001-01-01T00:00:00","TempoAtuado":0.0},{"ID":"B02","ID_Num":72,"Posicao":2,"Componente":11,"AtuacaoNivelAlto":true,"ComandoAtuar":false,"Comandar":true,"Mandatorio":true,"Liberado":false,"Funcoes":[21],"MediaNivelFluxo":0.0,"Inicializado":false,"UltimaLeitura":"0001-01-01T00:00:00","ValoresLeituras":[{"funcao":60,"posicao":0,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":66,"posicao":2,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null}],"Atuacoes":0,"InicioAtuacao":"0001-01-01T00:00:00","TempoAtuado":0.0},{"ID":"B03","ID_Num":73,"Posicao":3,"Componente":11,"AtuacaoNivelAlto":true,"ComandoAtuar":false,"Comandar":true,"Mandatorio":true,"Liberado":false,"Funcoes":[21],"MediaNivelFluxo":0.0,"Inicializado":false,"UltimaLeitura":"0001-01-01T00:00:00","ValoresLeituras":[{"funcao":60,"posicao":0,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":66,"posicao":2,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null}],"Atuacoes":0,"InicioAtuacao":"0001-01-01T00:00:00","TempoAtuado":0.0},{"ID":"B04","ID_Num":74,"Posicao":4,"Componente":11,"AtuacaoNivelAlto":true,"ComandoAtuar":false,"Comandar":true,"Mandatorio":true,"Liberado":false,"Funcoes":[21],"MediaNivelFluxo":0.0,"Inicializado":false,"UltimaLeitura":"0001-01-01T00:00:00","ValoresLeituras":[{"funcao":60,"posicao":0,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":66,"posicao":2,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null}],"Atuacoes":0,"InicioAtuacao":"0001-01-01T00:00:00","TempoAtuado":0.0}],"BombasPressurizadoras":[{"ID":"BOMBA","ID_Num":51,"ComandoAtuar":false,"Componente":14,"Comandar":true,"Mandatorio":true,"Liberado":false,"Funcoes":[14,35,36,37,5],"Inicializado":false,"UltimaLeitura":"0001-01-01T00:00:00","ValoresLeituras":[{"funcao":60,"posicao":0,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":66,"posicao":2,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":53,"posicao":2,"indice":1,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":68,"posicao":2,"indice":2,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":24,"posicao":2,"indice":3,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null}]}],"Sensores":[{"ID":"FLXLN","ID_Num":61,"Descricao":"Fluxo na linha principal","Componente":8,"Aferir":true,"Mandatorio":true,"Liberado":false,"Inicializado":false,"UltimaLeitura":"0001-01-01T00:00:00","Funcoes":[25],"Parametros":[],"ValoresLeituras":[{"funcao":60,"posicao":0,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":25,"posicao":2,"indice":0,"minimo":0.0,"maximo":20.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":"mL/s"}]},{"ID":"MASRS","ID_Num":62,"Descricao":"Massa do reservatório de herbicida","Componente":10,"Aferir":true,"Mandatorio":true,"Liberado":false,"Inicializado":false,"UltimaLeitura":"0001-01-01T00:00:00","Funcoes":[22,23],"Parametros":[{"Descricao":"Offset","Valor":"-2.5","QtdBytes":2,"Escalar":true,"Enviar":true}],"ValoresLeituras":[{"funcao":60,"posicao":0,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":32,"posicao":2,"indice":0,"minimo":0.0,"maximo":35.0,"nominal":30.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":"Kg"}]},{"ID":"PRSLN","ID_Num":63,"Descricao":"Pressão na linha principal","Componente":12,"Aferir":true,"Mandatorio":true,"Liberado":false,"Inicializado":false,"UltimaLeitura":"0001-01-01T00:00:00","Funcoes":[24],"Parametros":[{"Descricao":"Vmin","Valor":"0","QtdBytes":1,"Escalar":false,"Enviar":false},{"Descricao":"Vmax","Valor":"4.5","QtdBytes":1,"Escalar":true,"Enviar":false},{"Descricao":"Pmax","Valor":"174","QtdBytes":1,"Escalar":false,"Enviar":false}],"ValoresLeituras":[{"funcao":60,"posicao":0,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":24,"posicao":2,"indice":0,"minimo":0.0,"maximo":120.0,"nominal":85.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":"PSI"}]}],"ScriptDeteccaoErvas":"weed_detector_oak-1_0.py","DadosLeitura":{"Momento":"0001-01-01T00:00:00","Conectado":false,"Dispositivo":0,"Versao":0,"Mod_ID":null,"QualidadeWifi":0,"LatenciaLoop":0,"BicosPulverizadores":[],"BombasPressurizadoras":[],"Sensores":[],"UltimoComandoRespondido":"0001-01-01T00:00:00"},"_MassaRef":0.8,"_MassaLeituraRef":40876.37,"_MassaLeituraExtra":1895800.0,"MassaReservatorio":0.0,"VolumeReservatorio":0.0,"PercentualReservatorio":0.0,"VolumeVazaoAferido":0.0,"_FluxoMlRef":600.0,"_FluxoPulsoRef":538.0,"VazaoFluxoMLpSInstantanea":0.0,"VazaoFluxoMLpSMedia":0.0,"VolumeVazaoML":0.0,"InicioAtuacao":"0001-01-01T00:00:00","TempoAtuado":0.0,"_PressaoVmin":0.0,"_PressaoVmax":4.5,"_PressaoMax":174.045,"PressaoLinha":0.0,"PressaoLinhaCalc":0.0,"PercentualErvasTerreno":0.0} \ No newline at end of file diff --git a/AgroBase/AgroBase/bin/x64/Debug/Parametros/parametersMvd-2_0.par b/AgroBase/AgroBase/bin/x64/Debug/Parametros/parametersMvd-2_0.par index fafec55a1..06464c362 100644 --- a/AgroBase/AgroBase/bin/x64/Debug/Parametros/parametersMvd-2_0.par +++ b/AgroBase/AgroBase/bin/x64/Debug/Parametros/parametersMvd-2_0.par @@ -1 +1 @@ -{"tmrRegistrador":{"_uiControl":null,"State":2,"IsRunning":false,"IsStopped":true,"IsCreated":false,"IsDisposed":false,"Interval":1000,"IntervalHz":1.0,"StackTrace":"MovimentacaoUnificadaModel.IniciarRegistrador","Id":"tmrRegistrador_Mvd","TimeTick":"00:00:00"},"tmrRegistradorMOV":{"_uiControl":null,"State":2,"IsRunning":false,"IsStopped":true,"IsCreated":false,"IsDisposed":false,"Interval":1000,"IntervalHz":1.0,"StackTrace":"MovimentacaoUnificadaModel.IniciarRegistrador","Id":"tmrRegistrador_Mov","TimeTick":"00:00:00"},"tmrRegistradorDIR":{"_uiControl":null,"State":2,"IsRunning":false,"IsStopped":true,"IsCreated":false,"IsDisposed":false,"Interval":1000,"IntervalHz":1.0,"StackTrace":"MovimentacaoUnificadaModel.IniciarRegistrador","Id":"tmrRegistrador_Dir","TimeTick":"00:00:00"},"Dispositivo":109,"_EnderecoCAN_Tx":0,"_EnderecoCAN_Rx":0,"ConexaoAtiva":false,"DirPronto":false,"MovPronto":false,"_TaxaAmostragem":1000,"DistanciaPercorridaOperacao":0.0,"TempoEmAtividade":0.0,"DistanciaPercorridaTotal":0.0,"DistanciaPercorridaParcial":0.0,"VelocidadeMedia":0.0,"DiametroRoda":0.355,"ReducaoMotorBLDC":5.0,"RPM_Max_MotorBLDC":500.0,"IP_Mov":"192.168.105.10","IP_Dir":"192.168.105.11","Modulos":[{"Modulo_ID":"ET","Disponivel":false,"RequisitarDados":false,"Conectado":false,"MovMotor":{"ID":"Mov","_EnderecoCAN_Tx":5,"_EnderecoCAN_Rx":5,"heartBeatValue":1,"Mod_ID":"ET","LeituraLigado":true,"LeituraRPM":0.0,"ComandoLigado":false,"CodigoAlarme":0,"AlarmeMotor":false,"RPM_SP":0,"RPM_SP_Controle":0,"RPM_SP_Leitura":0,"Sentido_SP":1,"NumeroPolos":10,"Rampa":0,"CorrenteTorqueMaximo":40,"OffsetLeitura":1.0,"AlarmeComando":false,"RPM_Roda":0.0,"Sentido":0,"Temperatura":0.0,"TemperaturaDriver":0.0,"Tensao":0.0,"Corrente_Barramento":0.0,"Corrente_Motor":0.0,"Potencia":0.0,"CicloTrabalho":0.0,"RPM_Motor":0.0,"VelocidadeInstantanea":0.0,"Comandar":true,"AlarmeSensores":false,"Inicializado":false,"Leitura":null,"CompensacaoNecessaria":false,"NovoRPMNecessario":false,"ConfigSentidos":{"RodasDianteiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoArco":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RotacionarNoEixo":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoLateral":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"Diagnostico":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0}},"Funcoes":[12,14,9,5,10],"LogGrafico":[],"Alarmes":[],"ConfigFreio":{"Mod_ID":"ET","Incremental":true,"AnguloInicial":10,"Leitura":false,"AnguloControle":0,"UltimoEnvio":"2025-10-09T11:26:38.443353-03:00","DelayEnvio":500,"Servo":{"ID":"FRO_ET","ID_Num":41,"Descricao":"Freio Motor ET","Componente":22,"Funcoes":[45],"Incremental":true,"Controlar":true,"Mandatorio":false,"Liberado":true,"_AnguloControle":0,"Inicializado":false,"UltimaLeitura":"0001-01-01T00:00:00","ValoresLeituras":[{"funcao":60,"posicao":0,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":64,"posicao":2,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":null},{"funcao":65,"posicao":2,"indice":1,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":null}]},"EnviarComando":false}},"DirMotor":{"ID":"Dir","_EnderecoCAN_Tx":1,"_EnderecoCAN_Rx":1,"Mod_ID":"ET","Sentido_SP":0,"Angulo_SP":0.0,"FolgaMecanica":5.6286948256707312,"Velocidade_Max":600.0,"Velocidade":240,"Sentido":0,"SentidoReal":1,"Angulo":0.0,"RPM":0.0,"IN1_Atuado":true,"IN2_Atuado":true,"Referenciando":false,"UltimoReferenciamento":"0001-01-01T00:00:00","Referenciado":false,"Comandar":false,"Inicializado":false,"Leitura":null,"UltimaDirecao":3,"UltimoComandoEnviado":"2025-10-21T15:58:33.6439852-03:00","RetornandoAzero":false,"EmMovimento":false,"AtingiuAnguloSP":true,"ConfigSentidos":{"RodasDianteiras":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"RodasTraseiras":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"MovimentoDiagonal":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"MovimentoArco":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"RotacionarNoEixo":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":1,"Parado":0},"MovimentoLateral":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"Diagnostico":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0}},"Funcoes":[13,9,14,41]}},{"Modulo_ID":"EF","Disponivel":false,"RequisitarDados":false,"Conectado":false,"MovMotor":{"ID":"Mov","_EnderecoCAN_Tx":7,"_EnderecoCAN_Rx":7,"heartBeatValue":1,"Mod_ID":"EF","LeituraLigado":true,"LeituraRPM":0.0,"ComandoLigado":false,"CodigoAlarme":0,"AlarmeMotor":false,"RPM_SP":0,"RPM_SP_Controle":0,"RPM_SP_Leitura":0,"Sentido_SP":1,"NumeroPolos":10,"Rampa":0,"CorrenteTorqueMaximo":40,"OffsetLeitura":1.0,"AlarmeComando":false,"RPM_Roda":0.0,"Sentido":0,"Temperatura":0.0,"TemperaturaDriver":0.0,"Tensao":0.0,"Corrente_Barramento":0.0,"Corrente_Motor":0.0,"Potencia":0.0,"CicloTrabalho":0.0,"RPM_Motor":0.0,"VelocidadeInstantanea":0.0,"Comandar":true,"AlarmeSensores":false,"Inicializado":false,"Leitura":null,"CompensacaoNecessaria":false,"NovoRPMNecessario":false,"ConfigSentidos":{"RodasDianteiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoArco":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RotacionarNoEixo":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoLateral":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"Diagnostico":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0}},"Funcoes":[12,14,9,5,10],"LogGrafico":[],"Alarmes":[],"ConfigFreio":{"Mod_ID":"EF","Incremental":true,"AnguloInicial":10,"Leitura":false,"AnguloControle":-1,"UltimoEnvio":"0001-01-01T00:00:00","DelayEnvio":500,"Servo":{"ID":"FRO_EF","ID_Num":42,"Descricao":"Freio Motor EF","Componente":22,"Funcoes":[45],"Incremental":true,"Controlar":false,"Mandatorio":false,"Liberado":true,"_AnguloControle":0,"Inicializado":false,"UltimaLeitura":"0001-01-01T00:00:00","ValoresLeituras":[{"funcao":60,"posicao":0,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":64,"posicao":2,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":null},{"funcao":65,"posicao":2,"indice":1,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":null}]},"EnviarComando":false}},"DirMotor":{"ID":"Dir","_EnderecoCAN_Tx":3,"_EnderecoCAN_Rx":3,"Mod_ID":"EF","Sentido_SP":0,"Angulo_SP":0.0,"FolgaMecanica":11.012214583087854,"Velocidade_Max":600.0,"Velocidade":240,"Sentido":0,"SentidoReal":2,"Angulo":0.0,"RPM":0.0,"IN1_Atuado":true,"IN2_Atuado":true,"Referenciando":false,"UltimoReferenciamento":"0001-01-01T00:00:00","Referenciado":false,"Comandar":true,"Inicializado":false,"Leitura":null,"UltimaDirecao":3,"UltimoComandoEnviado":"2025-10-10T10:10:32.5058011-03:00","RetornandoAzero":false,"EmMovimento":false,"AtingiuAnguloSP":true,"ConfigSentidos":{"RodasDianteiras":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"RodasTraseiras":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"MovimentoDiagonal":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"MovimentoArco":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"RotacionarNoEixo":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":1,"Parado":0},"MovimentoLateral":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"Diagnostico":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0}},"Funcoes":[13,9,14,41]}},{"Modulo_ID":"DT","Disponivel":false,"RequisitarDados":false,"Conectado":false,"MovMotor":{"ID":"Mov","_EnderecoCAN_Tx":6,"_EnderecoCAN_Rx":6,"heartBeatValue":0,"Mod_ID":"DT","LeituraLigado":true,"LeituraRPM":0.0,"ComandoLigado":false,"CodigoAlarme":0,"AlarmeMotor":false,"RPM_SP":0,"RPM_SP_Controle":0,"RPM_SP_Leitura":0,"Sentido_SP":1,"NumeroPolos":10,"Rampa":0,"CorrenteTorqueMaximo":40,"OffsetLeitura":1.0,"AlarmeComando":false,"RPM_Roda":0.0,"Sentido":0,"Temperatura":0.0,"TemperaturaDriver":0.0,"Tensao":0.0,"Corrente_Barramento":0.0,"Corrente_Motor":0.0,"Potencia":0.0,"CicloTrabalho":0.0,"RPM_Motor":0.0,"VelocidadeInstantanea":0.0,"Comandar":true,"AlarmeSensores":false,"Inicializado":false,"Leitura":null,"CompensacaoNecessaria":false,"NovoRPMNecessario":false,"ConfigSentidos":{"RodasDianteiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoArco":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RotacionarNoEixo":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoLateral":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"Diagnostico":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0}},"Funcoes":[12,14,9,5,10],"LogGrafico":[],"Alarmes":[],"ConfigFreio":{"Mod_ID":"DT","Incremental":false,"AnguloInicial":170,"Leitura":false,"AnguloControle":180,"UltimoEnvio":"2025-11-07T10:03:02.7499995-03:00","DelayEnvio":500,"Servo":{"ID":"FRO_DT","ID_Num":43,"Descricao":"Freio Motor DT","Componente":22,"Funcoes":[45],"Incremental":false,"Controlar":true,"Mandatorio":false,"Liberado":true,"_AnguloControle":180,"Inicializado":false,"UltimaLeitura":"0001-01-01T00:00:00","ValoresLeituras":[{"funcao":60,"posicao":0,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":64,"posicao":2,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":null},{"funcao":65,"posicao":2,"indice":1,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":null}]},"EnviarComando":true}},"DirMotor":{"ID":"Dir","_EnderecoCAN_Tx":2,"_EnderecoCAN_Rx":2,"Mod_ID":"DT","Sentido_SP":0,"Angulo_SP":0.0,"FolgaMecanica":9.1828330687484687,"Velocidade_Max":600.0,"Velocidade":240,"Sentido":0,"SentidoReal":2,"Angulo":0.0,"RPM":0.0,"IN1_Atuado":true,"IN2_Atuado":true,"Referenciando":false,"UltimoReferenciamento":"0001-01-01T00:00:00","Referenciado":false,"Comandar":false,"Inicializado":false,"Leitura":null,"UltimaDirecao":3,"UltimoComandoEnviado":"2025-10-10T09:49:32.0157391-03:00","RetornandoAzero":false,"EmMovimento":false,"AtingiuAnguloSP":true,"ConfigSentidos":{"RodasDianteiras":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"RodasTraseiras":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"MovimentoDiagonal":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"MovimentoArco":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"RotacionarNoEixo":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":1,"Parado":0},"MovimentoLateral":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"Diagnostico":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0}},"Funcoes":[13,9,14,41]}},{"Modulo_ID":"DF","Disponivel":false,"RequisitarDados":false,"Conectado":false,"MovMotor":{"ID":"Mov","_EnderecoCAN_Tx":8,"_EnderecoCAN_Rx":8,"heartBeatValue":0,"Mod_ID":"DF","LeituraLigado":true,"LeituraRPM":0.0,"ComandoLigado":false,"CodigoAlarme":0,"AlarmeMotor":false,"RPM_SP":0,"RPM_SP_Controle":0,"RPM_SP_Leitura":0,"Sentido_SP":1,"NumeroPolos":10,"Rampa":0,"CorrenteTorqueMaximo":40,"OffsetLeitura":1.0,"AlarmeComando":false,"RPM_Roda":0.0,"Sentido":0,"Temperatura":0.0,"TemperaturaDriver":0.0,"Tensao":0.0,"Corrente_Barramento":0.0,"Corrente_Motor":0.0,"Potencia":0.0,"CicloTrabalho":0.0,"RPM_Motor":0.0,"VelocidadeInstantanea":0.0,"Comandar":true,"AlarmeSensores":false,"Inicializado":false,"Leitura":null,"CompensacaoNecessaria":false,"NovoRPMNecessario":false,"ConfigSentidos":{"RodasDianteiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoArco":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RotacionarNoEixo":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoLateral":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"Diagnostico":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0}},"Funcoes":[12,14,9,5,10],"LogGrafico":[],"Alarmes":[],"ConfigFreio":{"Mod_ID":"DF","Incremental":false,"AnguloInicial":170,"Leitura":false,"AnguloControle":-1,"UltimoEnvio":"0001-01-01T00:00:00","DelayEnvio":500,"Servo":{"ID":"FRO_DF","ID_Num":44,"Descricao":"Freio Motor DF","Componente":22,"Funcoes":[45],"Incremental":false,"Controlar":false,"Mandatorio":false,"Liberado":true,"_AnguloControle":180,"Inicializado":false,"UltimaLeitura":"0001-01-01T00:00:00","ValoresLeituras":[{"funcao":60,"posicao":0,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":64,"posicao":2,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":null},{"funcao":65,"posicao":2,"indice":1,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":null}]},"EnviarComando":false}},"DirMotor":{"ID":"Dir","_EnderecoCAN_Tx":4,"_EnderecoCAN_Rx":4,"Mod_ID":"DF","Sentido_SP":0,"Angulo_SP":0.0,"FolgaMecanica":9.8235962958449576,"Velocidade_Max":600.0,"Velocidade":240,"Sentido":0,"SentidoReal":1,"Angulo":0.0,"RPM":0.0,"IN1_Atuado":true,"IN2_Atuado":true,"Referenciando":false,"UltimoReferenciamento":"0001-01-01T00:00:00","Referenciado":false,"Comandar":true,"Inicializado":false,"Leitura":null,"UltimaDirecao":3,"UltimoComandoEnviado":"2025-10-10T10:10:32.5058011-03:00","RetornandoAzero":false,"EmMovimento":false,"AtingiuAnguloSP":true,"ConfigSentidos":{"RodasDianteiras":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"RodasTraseiras":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"MovimentoDiagonal":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"MovimentoArco":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"RotacionarNoEixo":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":1,"Parado":0},"MovimentoLateral":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"Diagnostico":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0}},"Funcoes":[13,9,14,41]}}]} \ No newline at end of file +{"tmrRegistrador":{"_uiControl":null,"State":2,"IsRunning":false,"IsStopped":true,"IsCreated":false,"IsDisposed":false,"Interval":1000,"IntervalHz":1.0,"StackTrace":"MovimentacaoUnificadaModel.IniciarRegistrador","Id":"tmrRegistrador_Mvd","TimeTick":"00:00:00"},"tmrRegistradorMOV":{"_uiControl":null,"State":2,"IsRunning":false,"IsStopped":true,"IsCreated":false,"IsDisposed":false,"Interval":1000,"IntervalHz":1.0,"StackTrace":"MovimentacaoUnificadaModel.IniciarRegistrador","Id":"tmrRegistrador_Mov","TimeTick":"00:00:00"},"tmrRegistradorDIR":{"_uiControl":null,"State":2,"IsRunning":false,"IsStopped":true,"IsCreated":false,"IsDisposed":false,"Interval":1000,"IntervalHz":1.0,"StackTrace":"MovimentacaoUnificadaModel.IniciarRegistrador","Id":"tmrRegistrador_Dir","TimeTick":"00:00:00"},"Dispositivo":109,"_EnderecoCAN_Tx":0,"_EnderecoCAN_Rx":0,"ConexaoAtiva":false,"DirPronto":false,"MovPronto":false,"_TaxaAmostragem":1000,"DistanciaPercorridaOperacao":0.0,"TempoEmAtividade":0.0,"DistanciaPercorridaTotal":0.0,"DistanciaPercorridaParcial":0.0,"VelocidadeMedia":0.0,"DiametroRoda":0.355,"ReducaoMotorBLDC":5.0,"RPM_Max_MotorBLDC":500.0,"IP_Mov":"192.168.105.10","IP_Dir":"192.168.105.11","Modulos":[{"Modulo_ID":"ET","Disponivel":false,"RequisitarDados":false,"Conectado":false,"MovMotor":{"ID":"Mov","_EnderecoCAN_Tx":5,"_EnderecoCAN_Rx":5,"heartBeatValue":1,"Mod_ID":"ET","LeituraLigado":true,"LeituraRPM":0.0,"ComandoLigado":false,"CodigoAlarme":0,"AlarmeMotor":false,"RPM_SP":0,"RPM_SP_Controle":0,"RPM_SP_Leitura":0,"Sentido_SP":1,"NumeroPolos":10,"Rampa":0,"CorrenteTorqueMaximo":40,"OffsetLeitura":1.0,"AlarmeComando":false,"RPM_Roda":0.0,"Sentido":0,"Temperatura":0.0,"TemperaturaDriver":0.0,"Tensao":0.0,"Corrente_Barramento":0.0,"Corrente_Motor":0.0,"Potencia":0.0,"CicloTrabalho":0.0,"RPM_Motor":0.0,"VelocidadeInstantanea":0.0,"Comandar":true,"AlarmeSensores":false,"Inicializado":false,"Leitura":null,"CompensacaoNecessaria":false,"NovoRPMNecessario":false,"ConfigSentidos":{"RodasDianteiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoArco":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RotacionarNoEixo":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoLateral":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"Diagnostico":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0}},"Funcoes":[12,14,9,5,10],"LogGrafico":[],"Alarmes":[],"ConfigFreio":{"Mod_ID":"ET","Incremental":true,"AnguloInicial":10,"Leitura":false,"AnguloControle":0,"UltimoEnvio":"2025-10-09T11:26:38.443353-03:00","DelayEnvio":500,"Servo":{"ID":"FRO_ET","ID_Num":41,"Descricao":"Freio Motor ET","Componente":22,"Funcoes":[45],"Incremental":true,"Controlar":true,"Mandatorio":false,"Liberado":true,"_AnguloControle":0,"Inicializado":false,"UltimaLeitura":"0001-01-01T00:00:00","ValoresLeituras":[{"funcao":60,"posicao":0,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":64,"posicao":2,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":null},{"funcao":65,"posicao":2,"indice":1,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":null}]},"EnviarComando":false}},"DirMotor":{"ID":"Dir","_EnderecoCAN_Tx":1,"_EnderecoCAN_Rx":1,"Mod_ID":"ET","Sentido_SP":0,"Angulo_SP":0.0,"FolgaMecanica":5.6286948256707312,"Velocidade_Max":600.0,"Velocidade":300,"Sentido":0,"SentidoReal":1,"Angulo":0.0,"RPM":0.0,"IN1_Atuado":true,"IN2_Atuado":true,"Referenciando":false,"UltimoReferenciamento":"0001-01-01T00:00:00","Referenciado":false,"Comandar":false,"Inicializado":false,"Leitura":null,"UltimaDirecao":3,"UltimoComandoEnviado":"2025-10-21T15:58:33.6439852-03:00","RetornandoAzero":false,"EmMovimento":false,"AtingiuAnguloSP":true,"ConfigSentidos":{"RodasDianteiras":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"RodasTraseiras":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"MovimentoDiagonal":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"MovimentoArco":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"RotacionarNoEixo":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":1,"Parado":0},"MovimentoLateral":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"Diagnostico":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0}},"Funcoes":[13,9,14,41]}},{"Modulo_ID":"EF","Disponivel":false,"RequisitarDados":false,"Conectado":false,"MovMotor":{"ID":"Mov","_EnderecoCAN_Tx":7,"_EnderecoCAN_Rx":7,"heartBeatValue":1,"Mod_ID":"EF","LeituraLigado":true,"LeituraRPM":0.0,"ComandoLigado":false,"CodigoAlarme":0,"AlarmeMotor":false,"RPM_SP":0,"RPM_SP_Controle":0,"RPM_SP_Leitura":0,"Sentido_SP":1,"NumeroPolos":10,"Rampa":0,"CorrenteTorqueMaximo":40,"OffsetLeitura":1.0,"AlarmeComando":false,"RPM_Roda":0.0,"Sentido":0,"Temperatura":0.0,"TemperaturaDriver":0.0,"Tensao":0.0,"Corrente_Barramento":0.0,"Corrente_Motor":0.0,"Potencia":0.0,"CicloTrabalho":0.0,"RPM_Motor":0.0,"VelocidadeInstantanea":0.0,"Comandar":true,"AlarmeSensores":false,"Inicializado":false,"Leitura":null,"CompensacaoNecessaria":false,"NovoRPMNecessario":false,"ConfigSentidos":{"RodasDianteiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoArco":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RotacionarNoEixo":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoLateral":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"Diagnostico":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0}},"Funcoes":[12,14,9,5,10],"LogGrafico":[],"Alarmes":[],"ConfigFreio":{"Mod_ID":"EF","Incremental":true,"AnguloInicial":10,"Leitura":false,"AnguloControle":-1,"UltimoEnvio":"0001-01-01T00:00:00","DelayEnvio":500,"Servo":{"ID":"FRO_EF","ID_Num":42,"Descricao":"Freio Motor EF","Componente":22,"Funcoes":[45],"Incremental":true,"Controlar":false,"Mandatorio":false,"Liberado":true,"_AnguloControle":0,"Inicializado":false,"UltimaLeitura":"0001-01-01T00:00:00","ValoresLeituras":[{"funcao":60,"posicao":0,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":64,"posicao":2,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":null},{"funcao":65,"posicao":2,"indice":1,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":null}]},"EnviarComando":false}},"DirMotor":{"ID":"Dir","_EnderecoCAN_Tx":3,"_EnderecoCAN_Rx":3,"Mod_ID":"EF","Sentido_SP":0,"Angulo_SP":0.0,"FolgaMecanica":11.012214583087854,"Velocidade_Max":600.0,"Velocidade":300,"Sentido":0,"SentidoReal":2,"Angulo":0.0,"RPM":0.0,"IN1_Atuado":true,"IN2_Atuado":true,"Referenciando":false,"UltimoReferenciamento":"0001-01-01T00:00:00","Referenciado":false,"Comandar":true,"Inicializado":false,"Leitura":null,"UltimaDirecao":3,"UltimoComandoEnviado":"2025-10-10T10:10:32.5058011-03:00","RetornandoAzero":false,"EmMovimento":false,"AtingiuAnguloSP":true,"ConfigSentidos":{"RodasDianteiras":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"RodasTraseiras":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"MovimentoDiagonal":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"MovimentoArco":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"RotacionarNoEixo":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":1,"Parado":0},"MovimentoLateral":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"Diagnostico":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0}},"Funcoes":[13,9,14,41]}},{"Modulo_ID":"DT","Disponivel":false,"RequisitarDados":false,"Conectado":false,"MovMotor":{"ID":"Mov","_EnderecoCAN_Tx":6,"_EnderecoCAN_Rx":6,"heartBeatValue":0,"Mod_ID":"DT","LeituraLigado":true,"LeituraRPM":0.0,"ComandoLigado":false,"CodigoAlarme":0,"AlarmeMotor":false,"RPM_SP":0,"RPM_SP_Controle":0,"RPM_SP_Leitura":0,"Sentido_SP":1,"NumeroPolos":10,"Rampa":0,"CorrenteTorqueMaximo":40,"OffsetLeitura":1.0,"AlarmeComando":false,"RPM_Roda":0.0,"Sentido":0,"Temperatura":0.0,"TemperaturaDriver":0.0,"Tensao":0.0,"Corrente_Barramento":0.0,"Corrente_Motor":0.0,"Potencia":0.0,"CicloTrabalho":0.0,"RPM_Motor":0.0,"VelocidadeInstantanea":0.0,"Comandar":true,"AlarmeSensores":false,"Inicializado":false,"Leitura":null,"CompensacaoNecessaria":false,"NovoRPMNecessario":false,"ConfigSentidos":{"RodasDianteiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoArco":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RotacionarNoEixo":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoLateral":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"Diagnostico":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0}},"Funcoes":[12,14,9,5,10],"LogGrafico":[],"Alarmes":[],"ConfigFreio":{"Mod_ID":"DT","Incremental":false,"AnguloInicial":170,"Leitura":false,"AnguloControle":180,"UltimoEnvio":"2025-11-24T13:02:21.2156898-03:00","DelayEnvio":500,"Servo":{"ID":"FRO_DT","ID_Num":43,"Descricao":"Freio Motor DT","Componente":22,"Funcoes":[45],"Incremental":false,"Controlar":true,"Mandatorio":false,"Liberado":true,"_AnguloControle":180,"Inicializado":false,"UltimaLeitura":"0001-01-01T00:00:00","ValoresLeituras":[{"funcao":60,"posicao":0,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":64,"posicao":2,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":null},{"funcao":65,"posicao":2,"indice":1,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":null}]},"EnviarComando":true}},"DirMotor":{"ID":"Dir","_EnderecoCAN_Tx":2,"_EnderecoCAN_Rx":2,"Mod_ID":"DT","Sentido_SP":0,"Angulo_SP":0.0,"FolgaMecanica":9.1828330687484687,"Velocidade_Max":600.0,"Velocidade":300,"Sentido":0,"SentidoReal":2,"Angulo":0.0,"RPM":0.0,"IN1_Atuado":true,"IN2_Atuado":true,"Referenciando":false,"UltimoReferenciamento":"0001-01-01T00:00:00","Referenciado":false,"Comandar":false,"Inicializado":false,"Leitura":null,"UltimaDirecao":3,"UltimoComandoEnviado":"2025-10-10T09:49:32.0157391-03:00","RetornandoAzero":false,"EmMovimento":false,"AtingiuAnguloSP":true,"ConfigSentidos":{"RodasDianteiras":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"RodasTraseiras":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"MovimentoDiagonal":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"MovimentoArco":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"RotacionarNoEixo":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":1,"Parado":0},"MovimentoLateral":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"Diagnostico":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0}},"Funcoes":[13,9,14,41]}},{"Modulo_ID":"DF","Disponivel":false,"RequisitarDados":false,"Conectado":false,"MovMotor":{"ID":"Mov","_EnderecoCAN_Tx":8,"_EnderecoCAN_Rx":8,"heartBeatValue":0,"Mod_ID":"DF","LeituraLigado":true,"LeituraRPM":0.0,"ComandoLigado":false,"CodigoAlarme":0,"AlarmeMotor":false,"RPM_SP":0,"RPM_SP_Controle":0,"RPM_SP_Leitura":0,"Sentido_SP":1,"NumeroPolos":10,"Rampa":0,"CorrenteTorqueMaximo":40,"OffsetLeitura":1.0,"AlarmeComando":false,"RPM_Roda":0.0,"Sentido":0,"Temperatura":0.0,"TemperaturaDriver":0.0,"Tensao":0.0,"Corrente_Barramento":0.0,"Corrente_Motor":0.0,"Potencia":0.0,"CicloTrabalho":0.0,"RPM_Motor":0.0,"VelocidadeInstantanea":0.0,"Comandar":true,"AlarmeSensores":false,"Inicializado":false,"Leitura":null,"CompensacaoNecessaria":false,"NovoRPMNecessario":false,"ConfigSentidos":{"RodasDianteiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoArco":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RotacionarNoEixo":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoLateral":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"Diagnostico":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0}},"Funcoes":[12,14,9,5,10],"LogGrafico":[],"Alarmes":[],"ConfigFreio":{"Mod_ID":"DF","Incremental":false,"AnguloInicial":170,"Leitura":false,"AnguloControle":-1,"UltimoEnvio":"0001-01-01T00:00:00","DelayEnvio":500,"Servo":{"ID":"FRO_DF","ID_Num":44,"Descricao":"Freio Motor DF","Componente":22,"Funcoes":[45],"Incremental":false,"Controlar":false,"Mandatorio":false,"Liberado":true,"_AnguloControle":180,"Inicializado":false,"UltimaLeitura":"0001-01-01T00:00:00","ValoresLeituras":[{"funcao":60,"posicao":0,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":false,"unidade_medida":null},{"funcao":64,"posicao":2,"indice":0,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":null},{"funcao":65,"posicao":2,"indice":1,"minimo":0.0,"maximo":0.0,"nominal":0.0,"offset":0.0,"atual":{"valor":null,"lidoEm":"0001-01-01T00:00:00","frequencia":0.0,"dt":0.0,"ValorMaximo":-1.7976931348623157E+308,"ValorMinimo":1.7976931348623157E+308},"analise_health":true,"unidade_medida":null}]},"EnviarComando":false}},"DirMotor":{"ID":"Dir","_EnderecoCAN_Tx":4,"_EnderecoCAN_Rx":4,"Mod_ID":"DF","Sentido_SP":0,"Angulo_SP":0.0,"FolgaMecanica":9.8235962958449576,"Velocidade_Max":600.0,"Velocidade":300,"Sentido":0,"SentidoReal":1,"Angulo":0.0,"RPM":0.0,"IN1_Atuado":true,"IN2_Atuado":true,"Referenciando":false,"UltimoReferenciamento":"0001-01-01T00:00:00","Referenciado":false,"Comandar":true,"Inicializado":false,"Leitura":null,"UltimaDirecao":3,"UltimoComandoEnviado":"2025-10-10T10:10:32.5058011-03:00","RetornandoAzero":false,"EmMovimento":false,"AtingiuAnguloSP":true,"ConfigSentidos":{"RodasDianteiras":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"RodasTraseiras":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"MovimentoDiagonal":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"MovimentoArco":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"RotacionarNoEixo":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":1,"Parado":0},"MovimentoLateral":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"Diagnostico":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0}},"Funcoes":[13,9,14,41]}}]} \ No newline at end of file diff --git a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/camera_worker/camera_oak.py b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/camera_worker/camera_oak.py index 557fd67fd..5d217d4cc 100644 --- a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/camera_worker/camera_oak.py +++ b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/camera_worker/camera_oak.py @@ -6,12 +6,23 @@ from health_worker.modulos.imu import IMUCamera from shared.enums import StatusModulo, T_Code from shared.contexto_global_redis import ContextoGlobalRedis, CtxKey +import subprocess +import cv2 +GST_LAUNCH = r"C:\Program Files\gstreamer\1.0\msvc_x86_64\bin\gst-launch-1.0.exe" + class CameraOak: def __init__(self, mostrar_log, mx_id, modelo_ia_seg=None, modelo_ia_det=None): self.mostrar_log = mostrar_log self.modelo_ia_seg = modelo_ia_seg self.modelo_ia_det = modelo_ia_det + self.gst_proc = None + self.gst_WIDTH = 640 + self.gst_HEIGHT = 360 + self.gst_FPS = 10 + self.gst_BIT_RATE = 500 + self._ultimo_envio_gst = 0.0 + self.dispositivo = T_Code.Vzo self.modelo = "Desconhecido" self.ultima_saude = {} @@ -72,6 +83,39 @@ class CameraOak: _camera["tem_depht"] = self.tem_depth _camera["tem_imu"] = self.tem_imu + # Criar processo para transmissao de video + try: + _cfg = ContextoGlobalRedis.get_equipamento() or {} + _ip = _cfg.get("base_ip") + _porta = _cfg.get("base_porta_caminho") if self.dispositivo == T_Code.Snr else _cfg.get("base_porta_ervas") + if _ip is not None and _porta is not None: + self.mostrar_log(f"Iniciando GStreamer para {_ip}:{_porta}...") + gst_cmd = [ + GST_LAUNCH, + "fdsrc", "fd=0", + "!", "videoparse", + f"width={self.gst_WIDTH}", f"height={self.gst_HEIGHT}", + "format=bgr", + f"framerate={self.gst_FPS}/1", + "!", "videoconvert", + "!", "videoscale", + "!", f"video/x-raw,width={self.gst_WIDTH},height={self.gst_HEIGHT}", + "!", "x264enc", "tune=zerolatency", "speed-preset=ultrafast", + f"bitrate={self.gst_BIT_RATE}", "key-int-max=20", + "!", "rtph264pay", "config-interval=-1", "pt=96", + #"!", "h264parse", "!", "mpegtsmux", + "!", "udpsink", + f"host={_ip}", f"port={_porta}", + "sync=false", "async=false", + ] + self.gst_proc = subprocess.Popen( + gst_cmd, + stdin=subprocess.PIPE, + ) + except Exception as e: + self.gst_proc = None + self.mostrar_log(f"Erro ao criar script de transmissao de video: {e}") + # Fase 2: criar pipeline e instanciar normalmente try: self.pipeline = self._criar_pipeline() @@ -350,6 +394,32 @@ class CameraOak: #self.timestamp_ultimo_frame_rgb = time.time() dur = time.time() - start + _stream_on = (ContextoGlobalRedis.get_camera(self.mx_id) or {}).get("streaming", False) + if self.gst_proc is not None and _stream_on: + # --- CONTROLE DE FPS PARA STREAMING --- + enviar_para_gst = True + if getattr(self, "gst_FPS", None) and self.gst_FPS > 0: + intervalo_min = 1.0 / float(self.gst_FPS) + agora = time.time() + if (agora - self._ultimo_envio_gst) < intervalo_min: + enviar_para_gst = False + else: + self._ultimo_envio_gst = agora + if frame is not None and frame.size > 0 and enviar_para_gst: + # --- RESIZE SÓ PARA O STREAM --- + if frame.shape[1] != self.gst_WIDTH or frame.shape[0] != self.gst_HEIGHT: + frame_stream = cv2.resize( + frame, + (self.gst_WIDTH, self.gst_HEIGHT), + interpolation=cv2.INTER_AREA + ) + else: + frame_stream = frame + try: + self.gst_proc.stdin.write(frame_stream.tobytes()) + except BrokenPipeError: + self.mostrar_log("GStreamer fechou o pipe. Encerrando.") + resultado = { "erro": None, "duracao": dur, diff --git a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/weed_worker/config.py b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/weed_worker/config.py index eb1c0abab..d096e8692 100644 --- a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/weed_worker/config.py +++ b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/weed_worker/config.py @@ -58,7 +58,6 @@ def load_seg_config(force_reload=False): # "frames_histerese": 2, # "min_area_px": 400, # "max_area_frac": 0.2, - # "area_atuacao_bicos": 0.1, # "ia_roi_begin": 0.0, # "ia_roi_size": 1.0, # "ia_resolution": [512,288], @@ -79,7 +78,6 @@ def load_seg_config(force_reload=False): "frames_histerese": 2, "min_area_px": 400, "max_area_frac": 0.2, - "area_atuacao_bicos": 0.1, "ia_roi_begin": 0.0, "ia_roi_size": 1.0, "ia_resolution": [512,288], @@ -97,8 +95,6 @@ def load_seg_config(force_reload=False): "det_every_n": 0, "usar_radar_global_gate": True, - "min_frac_erva_por_bico_on": 0.02, - "min_frac_erva_por_bico_off": 0.01, "max_frac_cana_por_bico": 0.009, "ema_frac_bico": 0.35, "on_frames_required": 3, @@ -115,7 +111,10 @@ def load_seg_config(force_reload=False): _CONFIG_CACHE["ia_model_path"] = ContextoGlobalRedis.get_equipamento().get("path_ia_model_ervas", "C:/AgroBaseModels/Ervas/model-2_1.blob") _CONFIG_CACHE["ia_labelmap_path"] = ContextoGlobalRedis.get_equipamento().get("path_ia_labelmap_ervas", "C:/AgroBaseModels/Ervas/model-2_1.txt") - _CONFIG_CACHE["faixa_atuacao_bicos"] = dadosAtu.get("percent_vertical_deteccao", 0.3) + _CONFIG_CACHE["faixa_atuacao_bicos"] = dadosAtu.get("percent_vertical_deteccao", 0.7) + _CONFIG_CACHE["area_atuacao_bicos"] = dadosAtu.get("height_area_deteccao", 0.1) + _CONFIG_CACHE["min_frac_erva_por_bico_on"] = dadosAtu.get("pct_erva_bico_on", 0.02) + _CONFIG_CACHE["min_frac_erva_por_bico_off"] = dadosAtu.get("pct_erva_bico_off", 0.01) return _CONFIG_CACHE def reload_seg_config(): diff --git a/AgroBase/AgroMonitor/Forms/frmMonitoramento.cs b/AgroBase/AgroMonitor/Forms/frmMonitoramento.cs index 9d179e96e..ced126c22 100644 --- a/AgroBase/AgroMonitor/Forms/frmMonitoramento.cs +++ b/AgroBase/AgroMonitor/Forms/frmMonitoramento.cs @@ -269,7 +269,7 @@ namespace AgroMonitor.Forms Keys[] TeclasDir = { Keys.A, Keys.D }; Keys[] TeclasMov = { Keys.W, Keys.S, Keys.Space }; - OperacaoControleBaseModel Controle = new OperacaoControleBaseModel() + OperacaoComandoBaseModel Controle = new OperacaoComandoBaseModel() { Momento = DateTime.Now, Tecla = DeParaTeclas[Tecla], diff --git a/AgroBase/OperationControl/App.xaml.cs b/AgroBase/OperationControl/App.xaml.cs index 376e4f668..ac632c791 100644 --- a/AgroBase/OperationControl/App.xaml.cs +++ b/AgroBase/OperationControl/App.xaml.cs @@ -1,5 +1,6 @@ using OperationControl.Models; using System.Windows; +using Application = System.Windows.Application; namespace OperationControl { diff --git a/AgroBase/OperationControl/Controls/AttitudeIndicator.xaml b/AgroBase/OperationControl/Controls/AttitudeIndicator.xaml index 7ac91e0cd..7828c1b38 100644 --- a/AgroBase/OperationControl/Controls/AttitudeIndicator.xaml +++ b/AgroBase/OperationControl/Controls/AttitudeIndicator.xaml @@ -19,6 +19,7 @@ + @@ -30,6 +31,13 @@ BorderBrush="#2ECC71"> + + + + + + + @@ -101,6 +109,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AgroBase/OperationControl/Controls/AttitudeIndicator.xaml.cs b/AgroBase/OperationControl/Controls/AttitudeIndicator.xaml.cs index 18fe533e5..871680e98 100644 --- a/AgroBase/OperationControl/Controls/AttitudeIndicator.xaml.cs +++ b/AgroBase/OperationControl/Controls/AttitudeIndicator.xaml.cs @@ -1,7 +1,10 @@ using System.ComponentModel; using System.Windows; -using System.Windows.Controls; using System.Windows.Media; +using UserControl = System.Windows.Controls.UserControl; +using Color = System.Windows.Media.Color; +using System.Globalization; +using System.Windows.Data; namespace OperationControl.Controls { @@ -81,6 +84,54 @@ namespace OperationControl.Controls set => SetValue(CriticalLimitProperty, value); } + + // === LATERAL ERROR === + public static readonly DependencyProperty LateralErrorProperty = + DependencyProperty.Register( + nameof(LateralError), + typeof(double), + typeof(AttitudeIndicator), + new PropertyMetadata(0.0, OnLateralChanged)); + + public static readonly DependencyProperty LateralMaxAbsProperty = + DependencyProperty.Register( + nameof(LateralMaxAbs), + typeof(double), + typeof(AttitudeIndicator), + new PropertyMetadata(50.0, OnLateralChanged)); // 0,5 m por padrão + + private static readonly DependencyPropertyKey LateralNormalizedPropertyKey = + DependencyProperty.RegisterReadOnly( + nameof(LateralNormalized), + typeof(double), + typeof(AttitudeIndicator), + new PropertyMetadata(0.0)); + + public static readonly DependencyProperty LateralNormalizedProperty = + LateralNormalizedPropertyKey.DependencyProperty; + + public double LateralError + { + get => (double)GetValue(LateralErrorProperty); + set => SetValue(LateralErrorProperty, value); + } + + public double LateralMaxAbs + { + get => (double)GetValue(LateralMaxAbsProperty); + set => SetValue(LateralMaxAbsProperty, value); + } + + /// + /// Erro lateral normalizado em [-1, 1] + /// -1 = limite à esquerda, 0 = centro, +1 = limite à direita + /// + public double LateralNormalized + { + get => (double)GetValue(LateralNormalizedProperty); + private set => SetValue(LateralNormalizedPropertyKey, value); + } + // Derivados public double MaxAbsAngle => Math.Max(Math.Abs(RollDeg), Math.Abs(PitchDeg)); @@ -108,5 +159,29 @@ namespace OperationControl.Controls else Chrome.BorderBrush = new SolidColorBrush(Color.FromRgb(0x2E, 0xCC, 0x71)); // verde } + + static void OnLateralChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + var c = (AttitudeIndicator)d; + c.UpdateLateral(); + c.Raise(nameof(LateralNormalized)); + } + + void UpdateLateral() + { + var max = Math.Max(0.0001, LateralMaxAbs); + + // normaliza para [-1, 1] e faz clamp + var n = LateralError / max; + if (n > 1) n = 1; + if (n < -1) n = -1; + + LateralNormalized = n; + } + + + } + + } diff --git a/AgroBase/OperationControl/Controls/Bbox3DViewer.xaml.cs b/AgroBase/OperationControl/Controls/Bbox3DViewer.xaml.cs index 092d6f97d..ac1188279 100644 --- a/AgroBase/OperationControl/Controls/Bbox3DViewer.xaml.cs +++ b/AgroBase/OperationControl/Controls/Bbox3DViewer.xaml.cs @@ -1,7 +1,7 @@ using OpenTK.Wpf; using OpenTK.Graphics.OpenGL; -using System.Windows.Controls; using System.Windows.Input; +using UserControl = System.Windows.Controls.UserControl; namespace OperationControl.Controls { @@ -244,7 +244,7 @@ namespace OperationControl.Controls if (e.ChangedButton == MouseButton.Middle) dragMid = false; if (!dragLeft && !dragMid) Mouse.Capture(null); } - void OnMouseMove(object s, MouseEventArgs e) + void OnMouseMove(object s, System.Windows.Input.MouseEventArgs e) { var p = e.GetPosition(GLHost); if (dragLeft) diff --git a/AgroBase/OperationControl/Controls/GstVideoView.xaml b/AgroBase/OperationControl/Controls/GstVideoView.xaml new file mode 100644 index 000000000..b235a92d4 --- /dev/null +++ b/AgroBase/OperationControl/Controls/GstVideoView.xaml @@ -0,0 +1,15 @@ + + + + + diff --git a/AgroBase/OperationControl/Controls/GstVideoView.xaml.cs b/AgroBase/OperationControl/Controls/GstVideoView.xaml.cs new file mode 100644 index 000000000..9ca4cbe20 --- /dev/null +++ b/AgroBase/OperationControl/Controls/GstVideoView.xaml.cs @@ -0,0 +1,226 @@ +using System.Windows; +using Gst; +using GstVideo; +using Unosquare.FFME; +using Task = System.Threading.Tasks.Task; +using UserControl = System.Windows.Controls.UserControl; + +namespace OperationControl.Controls +{ + /// + /// Interaction logic for GstVideoView.xaml + /// + public partial class GstVideoView : UserControl + { + private Pipeline? _pipeline; + private Element? _videoSink; + private Bus? _bus; + + #region DP: Host e Port + + public string Host + { + get => (string)GetValue(HostProperty); + set => SetValue(HostProperty, value); + } + + public static readonly DependencyProperty HostProperty = + DependencyProperty.Register( + nameof(Host), + typeof(string), + typeof(GstVideoView), + new PropertyMetadata("0.0.0.0", OnEndpointChanged)); + + public int Port + { + get => (int)GetValue(PortProperty); + set => SetValue(PortProperty, value); + } + + public static readonly DependencyProperty PortProperty = + DependencyProperty.Register( + nameof(Port), + typeof(int), + typeof(GstVideoView), + new PropertyMetadata(5000, OnEndpointChanged)); + + private static void OnEndpointChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + var view = (GstVideoView)d; + // Se já estiver carregado, reinicia o pipeline com IP/porta novos + if (view.IsLoaded) + { + //view.RestartPipeline(); + } + } + + #endregion + + + public string SourceUrl { get; set; } = "udp://0.0.0.0:5000"; + + public GstVideoView() + { + InitializeComponent(); + + InitGStreamer(); + + Loaded += (_, _) => + { + //if (VideoPanel.IsHandleCreated == false) + // VideoPanel.CreateControl(); + }; + Unloaded += (_, _) => Stop(); + } + + private void InitGStreamer() + { + //Gst.Application.Init(); + } + + public void StartPipeline() + { + if (_pipeline != null) + return; + + // pipeline simples só pra testar: videotestsrc → videoconvert → autovideosink + _pipeline = new Pipeline(); + + var src = ElementFactory.Make("videotestsrc", "src"); + var conv = ElementFactory.Make("videoconvert", "conv"); + var sink = ElementFactory.Make("autovideosink", "sink"); + + if (src is null || conv is null || sink is null) + throw new Exception("Falha ao criar algum elemento do pipeline."); + + _pipeline.Add(src); + _pipeline.Add(conv); + _pipeline.Add(sink); + + if (!src.Link(conv) || !conv.Link(sink)) + throw new Exception("Falha ao linkar o pipeline."); + + // >>> AQUI entra a correção do Bus (ver seção 2) <<< + + _pipeline.SetState(State.Playing); + } + + public void Start2() + { + if (_pipeline != null) + return; + + //if (!VideoPanel.IsHandleCreated) + // VideoPanel.CreateControl(); + + // Monta o pipeline de recepção (ajuste caps se precisar) + string pipeDesc = + $"udpsrc port={Port} " + + "caps = application/x-rtp, media=video, encoding-name=H264, payload=96 " + + "! rtph264depay ! h264parse ! avdec_h264 ! videoconvert " + + "! d3d11videosink name=vsink sync=false"; + + // Cria pipeline a partir da string + _pipeline = new Pipeline(new Gst.Internal.PipelineHandle(1, false)); + + if (_pipeline is null) + throw new InvalidOperationException("Falha ao criar pipeline GStreamer."); + + // Pega o sink pelo nome + _videoSink = _pipeline.GetChildByName("vsink") as Element; + + if (_videoSink is null) + throw new InvalidOperationException("Não foi possível encontrar o elemento 'vsink' no pipeline."); + + // Faz o cast para VideoOverlay + var overlay = _videoSink as VideoOverlay; + + if (overlay is null) + throw new InvalidOperationException("O sink não implementa VideoOverlay."); + + // Passa o handle da janela do Panel para o sink + //var hwnd = VideoPanel.Handle; + //overlay.SetWindowHandle((nuint)hwnd); + + // (Opcional) configurar bus para logar erros + _bus = _pipeline.GetBus(); + _bus.AddSignalWatch(); + _bus.OnMessage += OnBusMessage; + + // Play! + _pipeline.SetState(State.Playing); + } + + public void Stop2() + { + if (_pipeline == null) + return; + + _pipeline.SetState(State.Null); + + if (_bus != null) + { + _bus.OnMessage -= OnBusMessage; + _bus.Dispose(); + _bus = null; + } + + _pipeline.Dispose(); + _pipeline = null; + _videoSink = null; + } + + private void OnBusMessage(object? sender, Bus.MessageSignalArgs e) + { + switch (e.Message.Type) + { + case MessageType.Error: + //e.Message.ParseError(out var err, out var debug); + //Console.WriteLine($"[GST ERROR] {err}: {debug}"); + Console.WriteLine($"[GST ERROR] {e.Message}"); + break; + + case MessageType.Eos: + Console.WriteLine("[GST] End of stream"); + // Se quiser, reinicia ou dá Stop(); + break; + } + } + + + public async Task Start() + { + try + { + if (Media.IsOpen) + return; + + // Abre o stream (udp, rtsp, http…) + await Media.Open(new System.Uri(SourceUrl)); + + await Media.Play(); + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine($"[FFME] Erro ao iniciar vídeo: {ex}"); + } + } + + public async void Stop() + { + try + { + if (Media.IsOpen) + { + await Media.Stop(); + await Media.Close(); + } + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine($"[FFME] Erro ao parar vídeo: {ex}"); + } + } + + } +} diff --git a/AgroBase/OperationControl/Controls/HeadingIndicator.xaml.cs b/AgroBase/OperationControl/Controls/HeadingIndicator.xaml.cs index 9d3750e35..50cadb3d4 100644 --- a/AgroBase/OperationControl/Controls/HeadingIndicator.xaml.cs +++ b/AgroBase/OperationControl/Controls/HeadingIndicator.xaml.cs @@ -1,7 +1,8 @@ using System.Windows; -using System.Windows.Controls; using System.ComponentModel; using System.Windows.Media; +using UserControl = System.Windows.Controls.UserControl; +using Color = System.Windows.Media.Color; namespace OperationControl.Controls { @@ -101,7 +102,7 @@ namespace OperationControl.Controls if (Chrome == null) return; bool no_course = double.IsNaN(CourseHeading); - var a = no_course ? 0 : DifHeading; + var a = no_course ? 0 : Math.Abs(DifHeading); var cor = new SolidColorBrush(Color.FromRgb(0x2E, 0xCC, 0x71)); // verde if (a >= 10) cor = new SolidColorBrush(Color.FromRgb(0xE7, 0x4C, 0x3C)); // vermelho diff --git a/AgroBase/OperationControl/Controls/LabeledBar.xaml.cs b/AgroBase/OperationControl/Controls/LabeledBar.xaml.cs index 3ad45ec7c..8ceb95f2d 100644 --- a/AgroBase/OperationControl/Controls/LabeledBar.xaml.cs +++ b/AgroBase/OperationControl/Controls/LabeledBar.xaml.cs @@ -1,6 +1,9 @@ using System.Windows; -using System.Windows.Controls; using System.Windows.Media; +using UserControl = System.Windows.Controls.UserControl; +using Brush = System.Windows.Media.Brush; +using Brushes = System.Windows.Media.Brushes; +using Color = System.Windows.Media.Color; namespace OperationControl.Controls { diff --git a/AgroBase/OperationControl/Controls/ManualControlPad.xaml b/AgroBase/OperationControl/Controls/ManualControlPad.xaml index 9cd5b6441..b274fe341 100644 --- a/AgroBase/OperationControl/Controls/ManualControlPad.xaml +++ b/AgroBase/OperationControl/Controls/ManualControlPad.xaml @@ -1,6 +1,7 @@ @@ -49,24 +50,72 @@ - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + " opendialog="window_stream_config"> + + + + + + + + + +