356 lines
20 KiB
C#
356 lines
20 KiB
C#
using AgroBase.Models;
|
|
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 Timer tmrLeituras = new Timer() { Interval = 200 };
|
|
|
|
#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.Tick += TmrLeituras_Tick;
|
|
tmrLeituras.Start();
|
|
|
|
AtualizarDispositivos();
|
|
Variaveis.OperacaoEmAndamento.AtualizaListaCameras(pnlCameraCaminho, new List<Panel>() { pnlCameraSoloE, pnlCameraSoloD }, true);
|
|
}
|
|
|
|
private void frmOperacaoMapaGPS_FormClosing(object sender, FormClosingEventArgs e)
|
|
{
|
|
tmrLeituras.Stop();
|
|
Variaveis.OperacaoEmAndamento.FinalizarOperacao();
|
|
Variaveis.OperacaoEmAndamento.DesligarCameras();
|
|
}
|
|
|
|
private void AtualizarDispositivos()
|
|
{
|
|
chbMOVativo.Checked = Variaveis.OperacaoEmAndamento.DispMvd != null && Variaveis.OperacaoEmAndamento.DispMvd._Porta.IsOpen && Variaveis.OperacaoEmAndamento.DispMvd.Dados.Modulos.Any(x => x.MovMotor.Inicializado);
|
|
chbDIRativo.Checked = Variaveis.OperacaoEmAndamento.DispMvd != null && Variaveis.OperacaoEmAndamento.DispMvd._Porta.IsOpen && Variaveis.OperacaoEmAndamento.DispMvd.Dados.Modulos.Any(x => x.DirMotor.Inicializado);
|
|
chbATUativo.Checked = Variaveis.OperacaoEmAndamento.DispAtu != null && Variaveis.OperacaoEmAndamento.DispAtu._Porta.IsOpen;
|
|
chbGPSativo.Checked = GPSService.PortaGPS != null && GPSService.PortaGPS.IsOpen;
|
|
Variaveis.OperacaoEmAndamento.chartGraficos = chartGraficos;
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Rotinas e Atualizações de tela
|
|
|
|
private void TmrLeituras_Tick(object sender, EventArgs e)
|
|
{
|
|
pnlOrientacao.Invalidate();
|
|
pnlInclinacao.Invalidate();
|
|
pnlAtuadores.Invalidate();
|
|
pnlCaminho.Invalidate();
|
|
pnlAnguloCamera.Invalidate();
|
|
|
|
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.CameraCaminhoKinect.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: " + Variaveis.OperacaoEmAndamento.Sensoriamento.DistanciaPercorrida.Sum().ToString("0.00") + " m";
|
|
lblTempoOperacao.Text = "Tempo de Operação: " + Variaveis.OperacaoEmAndamento.Tempo.Hours.ToString("00") + ":" + Variaveis.OperacaoEmAndamento.Tempo.Minutes.ToString("00") + ":" + Variaveis.OperacaoEmAndamento.Tempo.Seconds.ToString("00");
|
|
lblVelocidadeMedia.Text = "Velocidade Média: " + Variaveis.OperacaoEmAndamento.Sensoriamento.VelocidadeMedia.ToString("0.00") + " km/h";
|
|
lblErvasIdentificadas.Text = "Ervas Identificadas: " + Variaveis.OperacaoEmAndamento.OpMapaGPS.Sensoriamento.ErvasIdentificadas.ToString("000");
|
|
lblHerbicidaAplicado.Text = "Herbicida Aplicado: " + Variaveis.OperacaoEmAndamento.OpMapaGPS.Sensoriamento.HerbicidaConsumido.ToString("0.000") + " L";
|
|
lblHerbicidaPorErva.Text = "Herbicida por Erva: " + Variaveis.OperacaoEmAndamento.OpMapaGPS.Sensoriamento.HerbicidaPorErva.ToString("0.000") + " mL";
|
|
lblBateriaConsumida.Text = "Bateria Consumida: " + Variaveis.OperacaoEmAndamento.Sensoriamento.BateriaConsumida.ToString("0.00") + "%";
|
|
|
|
lblPressao.Text = "P: " + Variaveis.OperacaoEmAndamento.DispAtu.Dados.PressaoLinha.ToString("0.00") + " psi";
|
|
|
|
FuncoesGlobais.PreencheValorProgressBar(pgbReservatorio, Variaveis.OperacaoEmAndamento.DispAtu.Dados.PercentualReservatorio);
|
|
lblPorcentagemReservatorio.Text = Variaveis.OperacaoEmAndamento.DispAtu.Dados.VolumeReservatorio.ToString("0.000") + " L " + (Variaveis.OperacaoEmAndamento.DispAtu.Dados.PercentualReservatorio < 0 ? 0 : Variaveis.OperacaoEmAndamento.DispAtu.Dados.PercentualReservatorio).ToString("00.00") + "%";
|
|
|
|
FuncoesGlobais.PreencheValorProgressBar(pgbBateria, Variaveis.OperacaoEmAndamento.Sensoriamento.PorcentagemBateria);
|
|
lblPorcentagemBateria.Text = (PZEMService.Iniciado && PZEMService.UltimaLeitura != null ? PZEMService.UltimaLeitura.Tensao.ToString("0.00") + "v " + PZEMService.UltimaLeitura.Corrente.ToString("0.00") + "A " : "") + (Variaveis.OperacaoEmAndamento.Sensoriamento.PorcentagemBateria < 0 ? 0 : Variaveis.OperacaoEmAndamento.Sensoriamento.PorcentagemBateria).ToString("00.00") + "%";
|
|
|
|
FuncoesGlobais.PreencheValorProgressBar(pgbProgresso, Variaveis.OperacaoEmAndamento.OpMapaGPS.Sensoriamento.ProgressoTrajeto);
|
|
lblPorcentagemProgresso.Text = (Variaveis.OperacaoEmAndamento.OpMapaGPS.Sensoriamento.ProgressoTrajeto < 0 ? 0 : Variaveis.OperacaoEmAndamento.OpMapaGPS.Sensoriamento.ProgressoTrajeto).ToString("00.00") + "%";
|
|
FuncoesGlobais.PreencheValorProgressBar(pgbProgressoRua, Variaveis.OperacaoEmAndamento.OpMapaGPS.Sensoriamento.ProgressoRua);
|
|
lblPorcentagemProgressoRua.Text = (Variaveis.OperacaoEmAndamento.OpMapaGPS.Sensoriamento.ProgressoRua < 0 ? 0 : Variaveis.OperacaoEmAndamento.OpMapaGPS.Sensoriamento.ProgressoRua).ToString("00.00") + "%";
|
|
lblDistancia.Text = "Distância Operação: " + (Variaveis.OperacaoEmAndamento.Mapa == null ? 0 : Variaveis.OperacaoEmAndamento.Mapa.DistanciaTotal).ToString("00.00") + " m";
|
|
|
|
lblPerformance.Text = Variaveis.OperacaoEmAndamento.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")
|
|
{
|
|
Variaveis.OperacaoEmAndamento.FinalizarOperacao();
|
|
}
|
|
else
|
|
{
|
|
if (Variaveis.OperacaoEmAndamento.OperacaoLiberada && Variaveis.OperacaoEmAndamento.Mapa.DistanciaTotal > 0 && Variaveis.OperacaoEmAndamento.Mapa.RuasPercorrer.Any())
|
|
{
|
|
//Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombaPressurizadora.PressaoSP = Convert.ToDouble(nudPressaoSP.Value);
|
|
await Variaveis.OperacaoEmAndamento.IniciarOperacao(null, false);
|
|
}
|
|
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;
|
|
|
|
Graphics g = e.Graphics;
|
|
Panel myPanel = (Panel)sender;
|
|
int panelWidth = myPanel.Width;
|
|
int circleDiameter = 40; // Diâmetro dos círculos grandes
|
|
int smallCircleDiameter = circleDiameter / 2; // Diâmetro dos círculos pequenos
|
|
int spaceBetweenCircles = (panelWidth - (circleDiameter * Atuador.Dados.QuantidadeBicos)) / (Atuador.Dados.QuantidadeBicos + 1);
|
|
int yPosition = (myPanel.Height - circleDiameter) / 3; // Centralizado verticalmente
|
|
|
|
|
|
for (int i = 0; i < Atuador.Dados.QuantidadeBicos; i++)
|
|
{
|
|
// Calcula a posição x do círculo
|
|
int xPosition = spaceBetweenCircles + (i * (circleDiameter + spaceBetweenCircles));
|
|
// Desenha o contorno do círculo
|
|
g.DrawEllipse(Pens.Red, xPosition, yPosition, circleDiameter, circleDiameter);
|
|
// Se o bico estiver aceso, preenche o círculo
|
|
if (Atuador.Dados.BicosPulverizadores[i].Atuado)
|
|
{
|
|
g.FillEllipse(Brushes.Red, xPosition, yPosition, circleDiameter, circleDiameter);
|
|
}
|
|
|
|
// Define a string que representa o número do bico
|
|
string bicoNumero = Atuador.Dados.BicosPulverizadores[i].ID;
|
|
// Define a fonte para o texto
|
|
Font font = new Font("Arial", 10, FontStyle.Bold);
|
|
// Mede o tamanho do texto
|
|
SizeF stringSize = g.MeasureString(bicoNumero, font);
|
|
// Calcula as posições x e y para centralizar o texto no círculo
|
|
float textXPosition = xPosition + (circleDiameter - stringSize.Width) / 2;
|
|
float textYPosition = yPosition + (circleDiameter - stringSize.Height) / 2;
|
|
// Desenha o número do bico
|
|
g.DrawString(bicoNumero, font, Brushes.Black, textXPosition, textYPosition);
|
|
|
|
|
|
// Define a string que representa a atuacao do bico
|
|
string bicoAtuacao = Variaveis.OperacaoEmAndamento.OpMapaGPS.Sensoriamento.AtuacoesPorBico[i].Sum(x => x.Value).ToString("000");
|
|
// Define a fonte para o texto
|
|
Font fontA = new Font("Arial", 8, FontStyle.Bold);
|
|
// Mede o tamanho do texto
|
|
SizeF stringSizeA = g.MeasureString(bicoAtuacao, fontA);
|
|
// Calcula as posições x e y para centralizar o texto no círculo
|
|
float textXPositionA = xPosition + (circleDiameter - stringSizeA.Width) / 2;
|
|
float textYPositionA = circleDiameter + yPosition + 5;
|
|
// Desenha as atuacoes do bico
|
|
g.DrawString(bicoAtuacao, fontA, Brushes.Black, textXPositionA, textYPositionA);
|
|
|
|
|
|
// Calcula a posição x e y do círculo pequeno
|
|
int smallCircleXPosition = Convert.ToInt32(xPosition + circleDiameter - smallCircleDiameter / 1.3);
|
|
int smallCircleYPosition = Convert.ToInt32(yPosition + circleDiameter - smallCircleDiameter / 1.3);
|
|
|
|
// Define a cor de contorno e preenchimento para o círculo pequeno
|
|
Pen smallCirclePen = Pens.Blue; // Cor do contorno
|
|
Brush smallCircleBrush = Brushes.Transparent; // Cor de preenchimento padrão
|
|
|
|
// Se o status do bico for true, altera a cor de preenchimento para azul
|
|
if (Atuador.Dados.BicosPulverizadores[i].StatusBico)
|
|
{
|
|
smallCircleBrush = Brushes.Blue;
|
|
}
|
|
|
|
// Desenha o contorno do círculo pequeno
|
|
g.DrawEllipse(smallCirclePen, smallCircleXPosition, smallCircleYPosition, smallCircleDiameter, smallCircleDiameter);
|
|
// Preenche o círculo pequeno se o status do bico for true
|
|
g.FillEllipse(smallCircleBrush, smallCircleXPosition, smallCircleYPosition, smallCircleDiameter, smallCircleDiameter);
|
|
}
|
|
}
|
|
|
|
private void pnlCaminho_Paint(object sender, PaintEventArgs e)
|
|
{
|
|
var cameraCaminho = Variaveis.OperacaoEmAndamento.CameraCaminhoKinect;
|
|
|
|
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.OpMapaGPS.Sensoriamento.AnguloRuaCamera), 90);
|
|
}
|
|
catch { }
|
|
}
|
|
|
|
private void pnlOrientacao_Paint(object sender, PaintEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
double angulo = Variaveis.OperacaoEmAndamento.Sensoriamento.AnguloCarro;
|
|
FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)angulo, -90);
|
|
}
|
|
catch { }
|
|
}
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
}
|
|
}
|