agrobot_base/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoMapaGPS.cs

302 lines
15 KiB
C#

using AgroBase.Models;
using AgroBase.Models.Modules;
using AgroBase.Services;
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace AgroBase.Forms.Operacoes
{
public partial class frmOperacaoMapaGPS : Form
{
private AsyncTaskTimerModel tmrLeituras;
#region Eventos do formulário
public frmOperacaoMapaGPS()
{
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 });
pnlCaminho.GetType().GetMethod("SetStyle", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).Invoke(pnlCaminho, new object[] { ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true });
pnlInclinacao.GetType().GetMethod("SetStyle", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).Invoke(pnlInclinacao, new object[] { ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true });
pnlAnguloCamera.GetType().GetMethod("SetStyle", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).Invoke(pnlAnguloCamera, new object[] { ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true });
pnlOrientacao.GetType().GetMethod("SetStyle", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).Invoke(pnlOrientacao, new object[] { ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true });
}
private void frmOperacaoMapaGPS_Load(object sender, EventArgs e)
{
tmrLeituras = new AsyncTaskTimerModel("tmrLeitura", tmrLeituras_Tick, 200, this);
tmrLeituras.Start();
AtualizarDispositivos();
Variaveis.OperacaoEmAndamento.AtualizaListaCameras(new List<Panel>() { pnlCameraCaminho }, new List<Panel>() { pnlCameraSoloE, pnlCameraSoloD }, true);
}
private void frmOperacaoMapaGPS_FormClosing(object sender, FormClosingEventArgs e)
{
tmrLeituras.Dispose();
Task.Run(async () => await Variaveis.OperacaoEmAndamento.FinalizarOperacao());
Variaveis.OperacaoEmAndamento.DesligarCameras();
}
private void AtualizarDispositivos()
{
chbMOVativo.Checked = Variaveis.OperacaoEmAndamento.DispMvd?.Dados?.Modulos?.Any(x => x.MovMotor.Inicializado) ?? false;
chbDIRativo.Checked = Variaveis.OperacaoEmAndamento.DispMvd?.Dados?.Modulos?.Any(x => x.DirMotor.Inicializado) ?? false;
chbATUativo.Checked = Variaveis.OperacaoEmAndamento.DispAtu?.Dados.Conectado ?? false;
chbGPSativo.Checked = GPSService.PortaGPS?.IsOpen ?? false;
Variaveis.OperacaoEmAndamento.chartGraficos = chartGraficos;
}
#endregion
#region Rotinas e Atualizações de tela
private async Task tmrLeituras_Tick()
{
pnlOrientacao.Invalidate();
pnlInclinacao.Invalidate();
pnlAtuadores.Invalidate();
pnlCaminho.Invalidate();
pnlAnguloCamera.Invalidate();
var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento;
var ultimaLeitura = Variaveis.OperacaoEmAndamento.CamerasSolo.OrderByDescending(x => x.Leitura.timestamp).FirstOrDefault();
if (ultimaLeitura != null)
{
lblUltimaLeituraSolo.Text = "Ultima Leitura Solo: " + FuncoesGlobais.TimestampToDate(ultimaLeitura.Leitura.timestamp);
}
lblUltimaLeituraRua.Text = "Ultima Leitura Rua: " + FuncoesGlobais.TimestampToDate(Variaveis.OperacaoEmAndamento.CameraCaminho.Leitura.timestamp);
btnCarregarMapa.Enabled = !Variaveis.OperacaoEmAndamento.Iniciado;
this.Text = Variaveis.OperacaoEmAndamento.TextoFormOperacao("Mapa GPS");
//lblDistanciaEsquerda.Text = "Distancia da Esquerda: " + Variaveis.OperacaoEmAndamento.Sensoriamento.DistanciaEsquerda.ToString("0.00") + " cm";
//lblDistanciaDireita.Text = "Distancia da Direita: " + Variaveis.OperacaoEmAndamento.Sensoriamento.DistanciaDireita.ToString("0.00") + " cm";
lblDistanciaPercorrida.Text = "Distancia Percorrida: " + _Sensoriamento.Trajetoria.DistanciaPercorrida.ToString("0.00") + " m";
lblTempoOperacao.Text = "Tempo de Operação: " + _Sensoriamento.TempoDecorrido.ToString("HH:mm:ss");
lblVelocidadeMedia.Text = "Velocidade Média: " + _Sensoriamento.Movimentacao.VelocidadeMedia.ToString("0.00") + " km/h";
lblErvasIdentificadas.Text = "Ervas Identificadas: " + _Sensoriamento.Atuador.QtdErvasIdentificadas.ToString("000");
lblHerbicidaAplicado.Text = "Herbicida Aplicado: " + _Sensoriamento.Atuador.HerbicidaConsumido.ToString("0.000") + " L";
lblHerbicidaPorErva.Text = "Herbicida por Erva: " + _Sensoriamento.Atuador.HerbicidaPorErva.ToString("0.000") + " mL";
lblBateriaConsumida.Text = "Bateria Consumida: " + _Sensoriamento.Bateria.BateriaConsumida.ToString("0.00") + "%";
FuncoesGlobais.PreencheValorProgressBar(pgbReservatorio, _Sensoriamento.Atuador.PercentualReservatorio);
lblPorcentagemReservatorio.Text = _Sensoriamento.Atuador.VolumeReservatorio.ToString("0.000") + " L " + _Sensoriamento.Atuador.PercentualReservatorio.ToString("00.00") + "%";
FuncoesGlobais.PreencheValorProgressBar(pgbBateria, _Sensoriamento.Bateria.PorcentagemBateria);
lblPorcentagemBateria.Text = _Sensoriamento.Bateria.TensaoInstantanea.ToString("0.00") + "v " + _Sensoriamento.Bateria.CorrenteInstantanea.ToString("0.00") + "A " + _Sensoriamento.Bateria.PorcentagemBateria.ToString("00.00") + "%";
FuncoesGlobais.PreencheValorProgressBar(pgbProgresso, _Sensoriamento.Trajetoria.ProgressoTrajeto);
lblPorcentagemProgresso.Text = _Sensoriamento.Trajetoria.ProgressoTrajeto.ToString("00.00") + "%";
FuncoesGlobais.PreencheValorProgressBar(pgbProgressoRua, _Sensoriamento.Trajetoria.CorredorAtual.Progresso);
lblPorcentagemProgressoRua.Text = _Sensoriamento.Trajetoria.CorredorAtual.Progresso.ToString("00.00") + "%";
lblDistancia.Text = "Distância Operação: " + _Sensoriamento.Trajetoria.DistanciaTotal.ToString("00.00") + " m";
lblPerformance.Text = _Sensoriamento.DadosPerformance.PerformanceStr;
if (!Variaveis.OperacaoEmAndamento.Iniciado && btnIniciarOperacao.Text == "Finalizar Operação")
{
AtualizaComponentesOperacao();
}
}
#endregion
#region Botões
private void btnCarregarMapa_Click(object sender, EventArgs e)
{
Variaveis.OperacaoEmAndamento.Mapa = new MapasModel()
{
pnlMapa = pnlMapa,
lblMapa = lblMapaCarregado,
};
Variaveis.OperacaoEmAndamento.Mapa.btnCarregar_Click(sender, e);
}
private void btnIniciarOperacao_Click(object sender, EventArgs e)
{
Task.Run(async () =>
{
if (!Variaveis.OperacaoEmAndamento.Mapa.RuasPercorrer.Any())
{
MessageBox.Show("Selecione as ruas para realizar a operação!");
return;
}
if (btnIniciarOperacao.Text == "Finalizar Operação")
{
await Variaveis.OperacaoEmAndamento.FinalizarOperacao();
}
else
{
if (Variaveis.OperacaoEmAndamento.OperacaoLiberada && Variaveis.OperacaoEmAndamento.Trajetoria.DistanciaTotal > 0 && Variaveis.OperacaoEmAndamento.Mapa.RuasPercorrer.Any())
{
//Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombaPressurizadora.PressaoSP = Convert.ToDouble(nudPressaoSP.Value);
await Variaveis.OperacaoEmAndamento.IniciarOperacao();
}
else
{
MessageBox.Show("Finalize a parametrização corretamente para iniciar a operação!", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
AtualizaComponentesOperacao();
});
}
private void AtualizaComponentesOperacao()
{
btnIniciarOperacao.Text = !Variaveis.OperacaoEmAndamento.Iniciado ? "Iniciar Operação" : "Finalizar Operação";
}
#endregion
#region Atualizações dos panels
private void pnlAtuadores_Paint(object sender, PaintEventArgs e)
{
var Atuador = Variaveis.OperacaoEmAndamento.DispAtu.Dados;
AtuadorFuncoesGerais.DesenharAtuadores(pnlAtuadores, e, Atuador.BicosPulverizadores.Select(x => new AtuBicoSensoriamentoLogModel()
{
ID = x.ID,
Atuacoes = x.Atuacoes,
Atuado = x.ComandoAtuar,
Comandar = x.Comandar,
Inicializado = x.Inicializado,
MediaNivelFluxo = x.MediaNivelFluxo,
Posicao = x.Posicao,
StatusBico = x.LeituraStatusBico,
TempoAtuado = x.TempoAtuado,
}).ToList(), Atuador.BombaPressurizadora.ComandoAtuar, Atuador.PressaoLinha, Atuador.TempoAtuado);
}
private void pnlCaminho_Paint(object sender, PaintEventArgs e)
{
var cameraCaminho = Variaveis.OperacaoEmAndamento.CameraCaminho;
Panel pnlContornos = (Panel)sender;
if (cameraCaminho.Leitura == null) return;
Graphics graphics = e.Graphics;
graphics.Clear(pnlContornos.BackColor); // Limpa o fundo
// Determina as dimensões máximas dos contornos
float larguraMaxContornos = 512; // Substitua pelo valor real
float alturaMaxContornos = 512; // Substitua pelo valor real
// Proporção de escala baseada no tamanho do Panel e nas dimensões dos contornos
float proporcaoX = pnlContornos.Width / larguraMaxContornos;
float proporcaoY = pnlContornos.Height / alturaMaxContornos;
float escala = Math.Min(proporcaoX, proporcaoY); // Mantém a proporção sem distorcer
// Calcula o novo tamanho dos contornos após o redimensionamento
float novaLargura = larguraMaxContornos * escala;
float novaAltura = alturaMaxContornos * escala;
// Calcula o deslocamento para centralizar os contornos no Panel
float deslocamentoX = (pnlContornos.Width - novaLargura) / 2;
float deslocamentoY = (pnlContornos.Height - novaAltura) / 2;
List<Point> pontosCamera = new List<Point>();
var Classe = cameraCaminho.ClassMap.FirstOrDefault(x => x.Key == "rua");
foreach (var cameraClass in cameraCaminho.Leitura.Classes.Where(x => x.Classe == Classe.Key))
{
if (cameraClass.Contornos == null || cameraClass.Contornos.Length == 0) continue;
using (Pen pen = new Pen(Color.Blue, 2))
{
for (int i = 0; i < cameraClass.Contornos.Length - 1; i++)
{
Point contorno = new Point() { X = cameraClass.Contornos[i][0], Y = cameraClass.Contornos[i][1] };
Point contornoP = new Point() { X = cameraClass.Contornos[i + 1][0], Y = cameraClass.Contornos[i + 1][1] };
// Aplica a escala e o deslocamento às coordenadas
Point start = new Point((int)(contorno.X * escala + deslocamentoX), (int)(contorno.Y * escala + deslocamentoY));
Point end = new Point((int)(contornoP.X * escala + deslocamentoX), (int)(contornoP.Y * escala + deslocamentoY));
//graphics.DrawLine(pen, start, end);
pontosCamera.Add(contorno);
}
// Se necessário, fechar o contorno conectando o último ponto ao primeiro
if (cameraClass.Contornos.Length > 1 && false)
{
var primeiro = cameraClass.Contornos.First();
var ultimo = cameraClass.Contornos.Last();
Point start = new Point((int)(ultimo[0] * escala + deslocamentoX), (int)(ultimo[1] * escala + deslocamentoY));
Point end = new Point((int)(primeiro[0] * escala + deslocamentoX), (int)(primeiro[1] * escala + deslocamentoY));
graphics.DrawLine(pen, start, end);
}
}
}
using (Pen pen = new Pen(Classe.Value, 2))
{
cameraCaminho.PontosExtremos = CameraCaminhoModel.DefinirPontosExtremos(pontosCamera);
for (int i = 0; i < cameraCaminho.PontosExtremos.Count - 1; i++)
{
// Aplica a escala e o deslocamento às coordenadas
Point start = new Point((int)(cameraCaminho.PontosExtremos[i].X * escala + deslocamentoX), (int)(cameraCaminho.PontosExtremos[i].Y * escala + deslocamentoY));
Point end = new Point((int)(cameraCaminho.PontosExtremos[i + 1].X * escala + deslocamentoX), (int)(cameraCaminho.PontosExtremos[i + 1].Y * escala + deslocamentoY));
graphics.DrawLine(pen, start, end);
}
}
}
private void pnlInclinacao_Paint(object sender, PaintEventArgs e)
{
try
{
//DesenharInclinacao((Panel)sender, e, (float)cameraCaminho.Angulo);
FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)(Variaveis.OperacaoEmAndamento.Controle.Angulo), 90);
}
catch { }
}
private void pnlAnguloCamera_Paint(object sender, PaintEventArgs e)
{
try
{
//DesenharInclinacao((Panel)sender, e, (float)cameraCaminho.Angulo);
FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)(Variaveis.OperacaoEmAndamento.Sensoriamento.AnguloRuaCamera), 90);
}
catch { }
}
private void pnlOrientacao_Paint(object sender, PaintEventArgs e)
{
try
{
double angulo = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.AnguloCarroDefinido;
FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)angulo, -90);
}
catch { }
}
#endregion
}
}