using AgroBase.Models; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Windows.Forms; using static AgroBase.Models.Enums; using AgroBase.Services; using AgroBase.Models.Modules; using System.Threading.Tasks; namespace AgroBase.Forms.Operacoes { public partial class frmOperacaoManual : Form { AsyncTaskTimerModel tmrLeitura; public frmOperacaoManual() { InitializeComponent(); // Ativa o double buffering this.DoubleBuffered = true; this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); this.SetStyle(ControlStyles.UserPaint, true); this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); pnlAtuadores.GetType().GetMethod("SetStyle", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).Invoke(pnlAtuadores, new object[] { ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true }); pnlAnguloGPS.GetType().GetMethod("SetStyle", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).Invoke(pnlAnguloGPS, new object[] { ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true }); pnlAnguloMagnetometro.GetType().GetMethod("SetStyle", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).Invoke(pnlAnguloMagnetometro, new object[] { ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true }); pnlDir_DF.GetType().GetMethod("SetStyle", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).Invoke(pnlDir_DF, new object[] { ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true }); pnlDir_DT.GetType().GetMethod("SetStyle", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).Invoke(pnlDir_DT, new object[] { ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true }); pnlDir_EF.GetType().GetMethod("SetStyle", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).Invoke(pnlDir_EF, new object[] { ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true }); pnlDir_ET.GetType().GetMethod("SetStyle", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).Invoke(pnlDir_ET, new object[] { ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true }); } private void frmOperacaoManual_Load(object sender, EventArgs e) { cmbTipoMovimento.Items.Clear(); cmbTipoMovimento.Items.AddRange(Enum.GetNames(typeof(TipoMovimentoDirecional))); cmbTipoMovimento.SelectedIndex = (int)Variaveis.OperacaoEmAndamento.Controle.TipoMovimento; flwCamerasSolo.Controls.Clear(); for (int i = 0; i < Variaveis.OperacaoEmAndamento.CamerasSolo.Count(); i++) { Panel pnlCam = new Panel() { Name = "pnlCamSolo_" + Variaveis.OperacaoEmAndamento.CamerasSolo[i].Nome, Width = 290, Height = 166, BackgroundImageLayout = ImageLayout.Stretch, BackColor = Color.Black, }; flwCamerasSolo.Controls.Add(pnlCam); } Variaveis.OperacaoEmAndamento.AtualizaListaCameras(new List() { pnlCameraRua, pnlDeteccoesRua }, flwCamerasSolo.Controls.OfType().ToList(), true); chbPulverizador.Checked = Variaveis.OperacaoEmAndamento.Controle.PulverizadorAutomatico; chbMostrarGrade.Checked = KinectService.MostrarGrade; chbSonarAtivado.Checked = Variaveis.OperacaoEmAndamento.Controle.SonarAtivado; InicializarComandosDirecional(); PopularInformacoesGerais(); InicializarMapa(); PopularBicos(); Variaveis.OperacaoEmAndamento.chartGraficos = chartGraficos; tmrLeitura = new AsyncTaskTimerModel("tmrLeitura", tmrLeitura_Tick, 500, this); tmrLeitura.Start(); if (!Variaveis.OperacaoEmAndamento.Controle.SegmentacaoSemantica && KinectService.Iniciado) { PictureBox picRgb = new PictureBox(); picRgb.SizeMode = PictureBoxSizeMode.StretchImage; picRgb.Dock = DockStyle.Fill; KinectService.picRGB = picRgb; pnlCameraRua.Controls.Add(picRgb); } } private void frmOperacaoManual_FormClosing(object sender, FormClosingEventArgs e) { tmrLeitura.Dispose(); Task.Run(async () => await Variaveis.OperacaoEmAndamento.FinalizarOperacao()); Variaveis.OperacaoEmAndamento.DesligarCameras(); KinectService.picRGB = null; } private void btnIniciarOperacao_Click(object sender, EventArgs e) { if (btnIniciarOperacao.Text == "Finalizar Operação") { // Atualiza a UI na thread principal btnIniciarOperacao.Invoke((MethodInvoker)delegate { btnIniciarOperacao.Text = "Finalizando..."; btnIniciarOperacao.Enabled = false; }); // Executa a finalização da operação Task.Run(async () => await Variaveis.OperacaoEmAndamento.FinalizarOperacao()); // Atualiza a UI novamente na thread principal btnIniciarOperacao.Invoke((MethodInvoker)delegate { btnIniciarOperacao.Text = "Iniciar Operação"; btnIniciarOperacao.Enabled = true; }); } else { // Atualiza a UI na thread principal btnIniciarOperacao.Invoke((MethodInvoker)delegate { btnIniciarOperacao.Text = "Iniciando..."; btnIniciarOperacao.Enabled = false; }); // Verifica se a operação está liberada if (Variaveis.OperacaoEmAndamento.OperacaoLiberada) { // Inicia a operação de forma assíncrona Task.Run(async () => await Variaveis.OperacaoEmAndamento.IniciarOperacao()); // Atualiza a UI após o início da operação btnIniciarOperacao.Invoke((MethodInvoker)delegate { btnIniciarOperacao.Text = "Finalizar Operação"; btnIniciarOperacao.Enabled = true; }); } else { // Mostra a mensagem de erro na thread principal btnIniciarOperacao.Invoke((MethodInvoker)delegate { MessageBox.Show(Variaveis.OperacaoEmAndamento.ErroOperacaoLiberada, "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Error); btnIniciarOperacao.Text = "Iniciar Operação"; btnIniciarOperacao.Enabled = true; }); } } } private async Task tmrLeitura_Tick() { this.Text = Variaveis.OperacaoEmAndamento.TextoFormOperacao("Manual"); pnlDir_DF.Invalidate(); pnlDir_DT.Invalidate(); pnlDir_EF.Invalidate(); pnlDir_ET.Invalidate(); pnlAtuadores.Invalidate(); pnlAnguloGPS.Invalidate(); pnlAnguloMagnetometro.Invalidate(); AtualizarInformacoesGerais(); var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento; lblDistanciaEsquerda.Text = "Distancia Esq: " + _Sensoriamento.Trajetoria.DistanciaEsquerda.ToString("0.00") + " cm"; lblDistanciaDireita.Text = "Distancia Dir: " + _Sensoriamento.Trajetoria.DistanciaDireita.ToString("0.00") + " cm"; lblGPSsatelites.Text = _Sensoriamento.Gps.NumeroSatelites.ToString() + " satélites"; lblGPSFix.Text = _Sensoriamento.Gps.QualidadeFix.ToString(); lblGPSprecisao.Text = "Precisão: " + _Sensoriamento.Gps.PrecisaoCm.ToString("0.00") + " cm"; lblGPSvelocidade.Text = "Vel.: " + _Sensoriamento.Gps.Velocidade.ToString("0.00") + " km/h"; lblGPSaltitude.Text = "Altitude: " + _Sensoriamento.Gps.Altitude.ToString("0.0") + " m"; lblTensao.Text = _Sensoriamento.Bateria.TensaoInstantanea.ToString("0.00") + " v"; lblCorrente.Text = _Sensoriamento.Bateria.CorrenteInstantanea.ToString("0.00") + " A"; lblRPM.Text = _Sensoriamento.Movimentacao.RPMMedio.ToString("0") + " rpm"; lblVelocidade.Text = _Sensoriamento.Movimentacao.VelocidadeMedia.ToString("0.00"); var Sonar = _Sensoriamento.Sonar; bool sonarAtivado = Sonar.Iniciado && Variaveis.OperacaoEmAndamento.Controle.SonarAtivado; chbSonarDesvioAutomatico.Enabled = sonarAtivado; chbMostrarGrade.Enabled = sonarAtivado; if (!sonarAtivado) { chbSonarDesvioAutomatico.Checked = false; chbMostrarGrade.Checked = false; } bool atuadorAtivado = Variaveis.OperacaoEmAndamento.DispAtu.Dados.Conectado || true; chbPulverizador.Enabled = atuadorAtivado; if (!atuadorAtivado) { chbPulverizador.Checked = false; } } #region Direcionais private void InicializarComandosDirecional() { pnlDir_DF.Paint += pnlDir_Paint; pnlDir_DT.Paint += pnlDir_Paint; pnlDir_EF.Paint += pnlDir_Paint; pnlDir_ET.Paint += pnlDir_Paint; } private void pnlDir_Paint(object sender, PaintEventArgs e) { DesenharGraficos(sender, e); } private void DesenharGraficos(object sender, PaintEventArgs e) { Panel pnl = (Panel)sender; string ID = pnl.Name.Replace("pnlDir_", ""); var Modulo = Variaveis.OperacaoEmAndamento.DispMvd.Dados.Modulos.FirstOrDefault(m => m.Modulo_ID == ID); double Angulo = Modulo.DirMotor.Angulo; Label lblAngulo = pnl.Controls.OfType