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; namespace AgroBase.Forms.Operacoes { public partial class frmOperacaoManual : Form { Timer tmrLeitura; DateTime UltimoComandoDir = DateTime.Now; 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; Variaveis.OperacaoEmAndamento.AtualizaListaCameras(pnlCameraRua, new List() { pnlCameraSoloE, pnlCameraSoloD }, true); InicializarComandosDirecional(); PopularInformacoesGerais(); InicializarMapa(); PopularBicos(); Variaveis.OperacaoEmAndamento.chartGraficos = chartGraficos; tmrLeitura = new Timer() { Interval = 500 }; tmrLeitura.Tick += tmrLeitura_Tick; tmrLeitura.Start(); } private void frmOperacaoManual_FormClosing(object sender, FormClosingEventArgs e) { tmrLeitura.Stop(); tmrLeitura.Dispose(); Variaveis.OperacaoEmAndamento.FinalizarOperacao(); Variaveis.OperacaoEmAndamento.DesligarCameras(); } private async 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 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 await Variaveis.OperacaoEmAndamento.IniciarOperacao(null, false); // 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 void tmrLeitura_Tick(object sender, EventArgs e) { AtualizarDados(); } public void AtualizarDados() { 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(); lblDistanciaEsquerda.Text = "Distancia Esq: " + Variaveis.OperacaoEmAndamento.Sensoriamento.DistanciaEsquerda.ToString("0.00") + " cm"; lblDistanciaDireita.Text = "Distancia Dir: " + Variaveis.OperacaoEmAndamento.Sensoriamento.DistanciaDireita.ToString("0.00") + " cm"; lblGPSsatelites.Text = GPSService.UltimaLeitura.NumeroSatelites.ToString() + " satélites"; lblGPSprecisao.Text = "Precisão: " + GPSService.UltimaLeitura.PrecisaoHorizontal.ToString("0.00") + " m"; lblGPSvelocidade.Text = "Vel.: " + GPSService.UltimaLeitura.Velocidade.ToString("0.00") + " km/h"; lblGPSaltitude.Text = "Altitude: " + GPSService.UltimaLeitura.Altitude.ToString("0.0") + " m"; lblTensao.Text = PZEMService.UltimaLeitura.Tensao.ToString("0.00") + " v"; lblCorrente.Text = PZEMService.UltimaLeitura.Corrente.ToString("0.00") + " A"; lblRPM.Text = Variaveis.OperacaoEmAndamento.DispMvd.Dados.Modulos.Average(x => x.MovMotor.RPM_Motor).ToString("0") + " rpm"; lblVelocidade.Text = Variaveis.OperacaoEmAndamento.DispMvd.Dados.Modulos.Average(x => x.MovMotor.VelocidadeInstantanea).ToString("0.00"); chbSonar.Enabled = KinectService.Iniciado && KinectService.Parametros.SonarAtivado; if (!chbSonar.Enabled) { chbSonar.Checked = false; } var Sonar = Variaveis.OperacaoEmAndamento.Sensoriamento.SonarFrontal_Kinect; if (chbSonar.Checked && Sonar.DesvioNecessario && UltimoComandoDir.AddSeconds(1) < DateTime.Now) { Variaveis.OperacaoEmAndamento.Controle.Angulo = Sonar.AnguloDesvio; Variaveis.OperacaoEmAndamento.DispMvd.Dados.Modulos.ForEach(Modulo => { //Variaveis.OperacaoEmAndamento.DispMvd.AdicionarMensagemFila(Modulo.Modulo_ID, Modulo.DirMotor.ProtocoloComando(direcaoDesvio), true, false); GeneralJoystick.EnviaComandoMotor(Sonar.DirecaoDesvio == Direcao.Esquerda ? Keys.Left : Sonar.DirecaoDesvio == Direcao.Direita ? Keys.Right : Keys.Escape, T_Code.Dir); }); UltimoComandoDir = DateTime.Now; } } #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); Label lblAngulo = pnl.Controls.OfType