using AgroBase.Forms; using AgroBase.Models; using AgroBase.Services; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; using static AgroBase.Models.Enums; namespace AgroMonitor.Forms { public partial class frmAjustesOperacao : Form { AsyncTaskTimerModel tmrDadosMapa; string path = Variaveis.CaminhoSistema + Variaveis.CaminhoOperacoes + "\\" + MapasVariaveisModel.NomeArquivoMapaInterativoSaida; UltrasonicA05Configuracoes ConfigUltrassom = UltrasonicA05Helper.CarregarConfiguracaoPadrao(ConfiguracaoSensorUltrassonico.NaoUtilizado); bool carregarOpPadrao = true; bool carregandoOperacao = false; MapaDinamicoModel MapaDinamico; public frmAjustesOperacao() { InitializeComponent(); MapaDinamico = new MapaDinamicoModel(this, pnlZoomMapa); } private void frmAjustesOperacao_Load(object sender, EventArgs e) { cmbConfiguracaoUltrassom.Items.Clear(); cmbConfiguracaoUltrassom.Items.AddRange(Enum.GetNames(typeof(ConfiguracaoSensorUltrassonico))); cmbConfiguracaoUltrassom.SelectedIndex = 0; cmbTipoMovimentoDirecional.Items.Clear(); cmbTipoMovimentoDirecional.Items.AddRange(Enum.GetNames(typeof(TiposControladorDirecional))); cmbTipoMovimentoDirecional.SelectedIndex = 1; cmbModosOperacao.Items.Clear(); cmbModosOperacao.Items.AddRange(Enum.GetNames(typeof(ModoOperacao))); cmbModosOperacao.SelectedIndex = 0; } private void frmAjustesOperacao_FormClosing(object sender, FormClosingEventArgs e) { tmrDadosMapa?.Dispose(); } private void cmbModosOperacao_SelectedIndexChanged(object sender, EventArgs e) { AtualizarDadosOperacao(); } private void AtualizarDadosOperacao() { carregandoOperacao = true; if (carregarOpPadrao) { OperacaoModel.CarregarParametrosOperacaoPadrao((ModoOperacao)cmbModosOperacao.SelectedIndex); string nomeOpPadrao = "OP_" + DateTime.Now.ToString("dd_MM_yyyy_mm_ss"); Variaveis.OperacaoEmAndamento.Descricao = nomeOpPadrao; } foreach (var chb in pnlModulos.Controls.OfType().Where(x => !x.Name.Contains("_M"))) { string disp = chb.Name.Replace("chb", ""); T_Code Dispositivo = (T_Code)Enum.Parse(typeof(T_Code), disp); var P = Variaveis.OperacaoEmAndamento.ModulosMandatorios.FirstOrDefault(x => x.Dispositivo == Dispositivo); chb.Checked = P?.Utilizar ?? false; var chbMandatorio = FuncoesGlobais.FindControlRecursive(pnlModulos, chb.Name + "_M"); if (chb.Checked) { chbMandatorio.Enabled = chb.Checked; chbMandatorio.Checked = P?.Mandatorio ?? false; } } foreach (var chb in pnlParametrosMandatorios.Controls.OfType().Where(x => !x.Name.Contains("_M"))) { string parametro = chb.Name.Replace("chb", ""); ParametrosOperacao Parametro = (ParametrosOperacao)Enum.Parse(typeof(ParametrosOperacao), parametro); var P = Variaveis.OperacaoEmAndamento.ParametrosMandatorios.FirstOrDefault(x => x.Parametro == Parametro); chb.Checked = P?.Utilizar ?? false; var chbMandatorio = FuncoesGlobais.FindControlRecursive(pnlParametrosMandatorios, chb.Name + "_M"); if (chb.Checked) { chbMandatorio.Enabled = chb.Checked; chbMandatorio.Checked = P?.Mandatorio ?? false; } } var _Controle = Variaveis.OperacaoEmAndamento.Controle; double velMaxRoda = FuncoesMatematicas.CalculaVelocidadeRPM(VariaveisEquipamento.RPM_Max_Roda); double velocidadeMax = FuncoesMatematicas.CalculaVelocidadeRPM(_Controle.RPM_Max); int percentMax = (int)FuncoesMatematicas.Map(velocidadeMax, 0.0, velMaxRoda, 0, 100.0); double velocidadeMin = FuncoesMatematicas.CalculaVelocidadeRPM(_Controle.RPM_Min); int percentMin = (int)FuncoesMatematicas.Map(velocidadeMin, 0.0, velMaxRoda, 0, 100.0); txtDescricao.Text = Variaveis.OperacaoEmAndamento.Descricao; nudVelMax.Value = percentMax; nudVelMin.Value = percentMin; txtAnguloMaximo.Text = _Controle.Angulo_Max.ToString("0"); txtVelocidadeDirecional.Text = _Controle.VelocidadeMP.ToString("0"); txtPercentualAtuacao.Text = (_Controle.PercentualInicioPulverizacao * 100).ToString("0"); txtCapacidadeReservatorio.Text = Variaveis.OperacaoEmAndamento.CapacidadeReservatorio.ToString("0"); txtPressaoLinha.Text = _Controle.PressaoLinha.ToString("0"); txtDuracaoAtuacao.Text = _Controle.TempoAtuacao.ToString("0"); cmbTipoMovimentoDirecional.SelectedIndex = (int)_Controle.TipoControleDirecional; if (Variaveis.OperacaoEmAndamento.DispSen != null) { ConfigUltrassom = Variaveis.OperacaoEmAndamento.DispSen.Dados.ConfiguracaoSensorUltrassom; cmbConfiguracaoUltrassom.SelectedIndex = (int)ConfigUltrassom.Configuracao; } chbSonarAtivado.Checked = _Controle.SonarAtivado; chbFrenagemAutomatica.Checked = _Controle.FrenagemAutomatica; chbMovimentacaoAutomatica.Checked = _Controle.MovimentoAutomatico; chbPulverizadorAutomatico.Checked = _Controle.PulverizadorAutomatico; carregandoOperacao = false; } private void btnProximo_Click(object sender, EventArgs e) { tabControl1.SelectedIndex = 1; } private void btnCarregarMapa_Click(object sender, EventArgs e) { List ruasSelecionadas = new List(); Variaveis.OperacaoEmAndamento.Mapa = new MapasModel(); Variaveis.OperacaoEmAndamento.Mapa.pnlMapa = pnlMapa; Variaveis.OperacaoEmAndamento.Mapa.lblMapa = lblMapaCarregado; tabControl1.SelectedIndex = 1; Variaveis.OperacaoEmAndamento.Mapa.btnCarregar_Click(sender, e); if (tmrDadosMapa == null || !tmrDadosMapa.IsRunning) { tmrDadosMapa = new AsyncTaskTimerModel("tmrDadosMapa", tmrDadosMapa_Tick, 500, this); tmrDadosMapa.Start(); } } private async Task tmrDadosMapa_Tick() { if (Variaveis.OperacaoEmAndamento.Mapa.mapaService.DadosMapa == null) { return; } //GPSService.AtualizarRuasSelecionadas(new List() { "183", "182", "181" }); Variaveis.OperacaoEmAndamento.Mapa.AtualizarRuasSelecionadas(); lblDistanciaTotal.Text = $"Distância total: {Variaveis.OperacaoEmAndamento.Mapa.mapaService.DadosMapa.features.Sum(x => x.properties.Length).ToString("0.00")} m"; lblDistanciaOperacao.Text = $"Distância da operação: {(Variaveis.OperacaoEmAndamento.Trajetoria?.DistanciaTotal ?? 0).ToString("0.00")} m"; double.TryParse(txtVelocidadeSemErvas.Text, out double velocidadeSemErvas); double.TryParse(txtVelocidadeComErvas.Text, out double velocidadeComErvas); Variaveis.OperacaoEmAndamento.Trajetoria?.AtualizarTempoEstimado(FuncoesMatematicas.ConverteKmhParaMs(velocidadeSemErvas), FuncoesMatematicas.ConverteKmhParaMs(velocidadeComErvas)); string tempo = Variaveis.OperacaoEmAndamento.Trajetoria?.TempoEstimadoOperacao; lblTempoEstimado.Text = $"Tempo estimado: {tempo}"; if (chbMapaDinamico.Checked) { var _Trajetoria = Variaveis.OperacaoEmAndamento.Trajetoria; if (_Trajetoria == null) return; GPSModel posicao = _Trajetoria.RuasPlantacao.Any() ? _Trajetoria.RuasPlantacao[0][_Trajetoria.ExtremoMaisProximoMapa == 0 ? 0 : _Trajetoria.RuasPlantacao[0].Count - 1] : GPSService.UltimaLeitura; MapaDinamico.AtualizarDados( null, 0f, 0f, posicao, _Trajetoria._TrajetoriaDinamica, _Trajetoria.CorredorAtual.Pontos, Variaveis.OperacaoEmAndamento.GPSTrajetoria, _Trajetoria.RuasPlantacao ); } } private void btnSalvar_Click(object sender, EventArgs e) { int.TryParse(txtQtdCameras.Text, out int qtdCameras); double.TryParse(txtCapacidadeReservatorio.Text, out double capacidadeReservatorio); double.TryParse(txtPressaoLinha.Text, out double pressaoLinha); int.TryParse(txtDuracaoAtuacao.Text, out int duracaoAtuacao); int.TryParse(txtPercentualAtuacao.Text, out int percentualAtuacao); int.TryParse(txtAnguloMaximo.Text, out int anguloMaximo); int.TryParse(txtVelocidadeDirecional.Text, out int velocidadeMovimento); bool sucesso = Variaveis.OperacaoEmAndamento.SalvarParametrizacaoOperacao( txtDescricao.Text, capacidadeReservatorio, pressaoLinha, duracaoAtuacao, percentualAtuacao, anguloMaximo, velocidadeMovimento, (int)nudVelMax.Value, (int)nudVelMin.Value, ConfigUltrassom, chbSonarAtivado.Checked, qtdCameras, (TiposControladorDirecional)cmbTipoMovimentoDirecional.SelectedIndex, chbMovimentacaoAutomatica.Checked, chbPulverizadorAutomatico.Checked, chbFrenagemAutomatica.Checked ); if (!sucesso) { txtDescricao.Focus(); } } private async void btnCarregar_Click(object sender, EventArgs e) { await CarregarOperacao(); } private async Task CarregarOperacao() { (bool carregado, List ruasSelecionadas) = Variaveis.OperacaoEmAndamento.CarregarParametrizacaoOperacao(pnlMapa, lblMapaCarregado); bool condicaoOperacaoCarregada() => Variaveis.OperacaoEmAndamento.Trajetoria?.CorredorAtual != null; bool resultado = await FuncoesGlobais.AguardarCondicaoAsync(condicaoOperacaoCarregada, 10000, 200); if (!resultado) { MessageBox.Show($"Erro ao carregar operação!{Environment.NewLine}Erro ao carregar a trajetória do mapa!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (carregado && resultado) { tabControl1.SelectedIndex = 1; carregarOpPadrao = false; cmbModosOperacao.SelectedIndex = (int)Variaveis.OperacaoEmAndamento.Modo; cmbTipoMovimentoDirecional.SelectedIndex = (int)Variaveis.OperacaoEmAndamento.Controle.TipoControleDirecional; cmbConfiguracaoUltrassom.SelectedIndex = (int)Variaveis.OperacaoEmAndamento.DispSen.Dados.ConfiguracaoSensorUltrassom.Configuracao; chbMovimentacaoAutomatica.Checked = Variaveis.OperacaoEmAndamento.Controle.MovimentoAutomatico; chbPulverizadorAutomatico.Checked = Variaveis.OperacaoEmAndamento.Controle.PulverizadorAutomatico; chbFrenagemAutomatica.Checked = Variaveis.OperacaoEmAndamento.Controle.FrenagemAutomatica; MessageBox.Show("Operação carregada com sucesso!", "Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Information); tmrDadosMapa?.Dispose(); tmrDadosMapa = new AsyncTaskTimerModel("tmrDadosMapa", tmrDadosMapa_Tick, 500, this); tmrDadosMapa?.Start(); await Task.Delay(2000); if (ruasSelecionadas.Any()) { await Task.Delay(1000); GPSService.AtualizarRuasSelecionadas(ruasSelecionadas); File.Delete(path); } carregarOpPadrao = true; } } private void chbModulo_CheckedChanged(object sender, EventArgs e) { if (carregandoOperacao) return; CheckBox chb = (CheckBox)sender; string ModID = chb.Name.Replace("chb", ""); T_Code Dispositivo = (T_Code)Enum.Parse(typeof(T_Code), ModID); var d = Variaveis.OperacaoEmAndamento.ModulosMandatorios.FirstOrDefault(x => x.Dispositivo == Dispositivo); if (d != null) { d.Utilizar = chb.Checked; d.Mandatorio = false; } else { d = new OperacaoModulosMandatoriosModel() { Dispositivo = Dispositivo, Conectado = false, Utilizar = chb.Checked, Mandatorio = false }; Variaveis.OperacaoEmAndamento.ModulosMandatorios.Add(d); } CheckBox chbM = FuncoesGlobais.FindControlRecursive(pnlModulos, chb.Name + "_M"); chbM.Enabled = chb.Checked; chbM.Checked = false; } private void chbModuloMandatorio_CheckedChanged(object sender, EventArgs e) { if (carregandoOperacao) return; CheckBox chb = (CheckBox)sender; string ModID = chb.Name.Replace("chb", "").Replace("_M", ""); T_Code Dispositivo = (T_Code)Enum.Parse(typeof(T_Code), ModID); var d = Variaveis.OperacaoEmAndamento.ModulosMandatorios.FirstOrDefault(x => x.Dispositivo == Dispositivo); if (d != null) { d.Mandatorio = chb.Checked; } else { d = new OperacaoModulosMandatoriosModel() { Dispositivo = Dispositivo, Conectado = false, Utilizar = true, Mandatorio = chb.Checked, }; Variaveis.OperacaoEmAndamento.ModulosMandatorios.Add(d); } } private void chbParametro_CheckedChanged(object sender, EventArgs e) { if (carregandoOperacao) return; CheckBox chb = (CheckBox)sender; string parametro = chb.Name.Replace("chb", ""); ParametrosOperacao Parametro = (ParametrosOperacao)Enum.Parse(typeof(ParametrosOperacao), parametro); var p = Variaveis.OperacaoEmAndamento.ParametrosMandatorios.FirstOrDefault(x => x.Parametro == Parametro); if (p != null) { p.Utilizar = chb.Checked; p.Mandatorio = false; } else { p = new OperacaoParametrosMandatoriosModel() { Parametro = Parametro, Utilizar = chb.Checked, Mandatorio = false, }; Variaveis.OperacaoEmAndamento.ParametrosMandatorios.Add(p); } CheckBox chbM = FuncoesGlobais.FindControlRecursive(pnlParametrosMandatorios, chb.Name + "_M"); chbM.Enabled = chb.Checked; chbM.Checked = false; if (Parametro == ParametrosOperacao.Sonar) { gpbSensoriamento.Enabled = chb.Checked; } } private void chbParametroMandatorio_CheckedChanged(object sender, EventArgs e) { if (carregandoOperacao) return; CheckBox chb = (CheckBox)sender; string parametro = chb.Name.Replace("chb", "").Replace("_M", ""); ParametrosOperacao Parametro = (ParametrosOperacao)Enum.Parse(typeof(ParametrosOperacao), parametro); var p = Variaveis.OperacaoEmAndamento.ParametrosMandatorios.FirstOrDefault(x => x.Parametro == Parametro); if (p != null) { p.Mandatorio = chb.Checked; } else { p = new OperacaoParametrosMandatoriosModel() { Parametro = Parametro, Utilizar = true, Mandatorio = chb.Checked, }; Variaveis.OperacaoEmAndamento.ParametrosMandatorios.Add(p); } } private void btnConfigurar_Click(object sender, EventArgs e) { frmA05Config frm = new frmA05Config(ConfigUltrassom); frm.ShowDialog(); ConfigUltrassom = frm.ConfiguracaoSensores; } private void cmbConfiguracaoUltrassom_SelectedIndexChanged(object sender, EventArgs e) { ConfiguracaoSensorUltrassonico Config = (ConfiguracaoSensorUltrassonico)cmbConfiguracaoUltrassom.SelectedIndex; rtbDescricao.Text = UltrasonicA05Helper.DescricaoConfiguracoes[Config]; if (Config != ConfigUltrassom.Configuracao) { ConfigUltrassom = UltrasonicA05Helper.CarregarConfiguracaoPadrao(Config); } } private void nudVelMax_ValueChanged(object sender, EventArgs e) { int Percentual = (int)((NumericUpDown)sender).Value; double velocidadeMs = FuncoesMatematicas.CalculaVelocidadeMsPercentual(Percentual); double Velocidade = FuncoesMatematicas.ConverteMsParaKmh(velocidadeMs); txtVelocidadeSemErvas.Text = Velocidade.ToString("0.00"); } private void nudVelMin_ValueChanged(object sender, EventArgs e) { int Percentual = (int)((NumericUpDown)sender).Value; double velocidadeMs = FuncoesMatematicas.CalculaVelocidadeMsPercentual(Percentual); double Velocidade = FuncoesMatematicas.ConverteMsParaKmh(velocidadeMs); txtVelocidadeComErvas.Text = Velocidade.ToString("0.00"); } private void chbMapaDinamico_CheckedChanged(object sender, EventArgs e) { pnlZoomMapa.Visible = chbMapaDinamico.Checked; } private void chbSonarAtivado_CheckedChanged(object sender, EventArgs e) { chbFrenagemAutomatica.Enabled = chbSonarAtivado.Checked; if (!chbFrenagemAutomatica.Enabled) { chbFrenagemAutomatica.Checked = false; } } } }