1727 lines
85 KiB
C#
1727 lines
85 KiB
C#
using AgroBase.Models;
|
|
using AgroBase.Models.Modules;
|
|
using AgroBase.Properties;
|
|
using AgroBase.Services;
|
|
using Newtonsoft.Json;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Data;
|
|
using System.Drawing;
|
|
using System.Drawing.Drawing2D;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
|
|
namespace AgroBase.Forms.Operacoes
|
|
{
|
|
public partial class frmResultadosOperacao : Form
|
|
{
|
|
List<OperacaoSensoriamentoLogModel> LogsOperacao = new List<OperacaoSensoriamentoLogModel>();
|
|
List<GPSModel> LogsGPS = new List<GPSModel>();
|
|
List<DirSensoriamentoLogModel> LogsDirecional = new List<DirSensoriamentoLogModel>();
|
|
List<MovSensoriamentoLogModel> LogsMovimentacao = new List<MovSensoriamentoLogModel>();
|
|
List<AtuSensoriamentoLogModel> LogsAtuador = new List<AtuSensoriamentoLogModel>();
|
|
List<SensoriamentoMensagemJsonModel> LogsSensoriamento = new List<SensoriamentoMensagemJsonModel>();
|
|
List<PzmSensoriamentoLogModel> LogsPzem = new List<PzmSensoriamentoLogModel>();
|
|
List<WitSensoriamentoLogModel> LogsWt901C = new List<WitSensoriamentoLogModel>();
|
|
List<UltrasonicA05Model> LogsA05 = new List<UltrasonicA05Model>();
|
|
List<SonarCamModel> LogsSonar = new List<SonarCamModel>();
|
|
List<List<CamSoloSensoriamentoLogModel>> LogsCam_Solo = new List<List<CamSoloSensoriamentoLogModel>>();
|
|
List<string> pathImagensSolo = new List<string>();
|
|
List<PictureBox> picsCamSolo = new List<PictureBox>();
|
|
List<CamCaminhoSensoriamentoLogModel> LogsCam_Caminho = new List<CamCaminhoSensoriamentoLogModel>();
|
|
string pathImagensCaminho = "";
|
|
string pathImagensMapaCalor = "";
|
|
|
|
DateTime MomentoAtual = DateTime.Now;
|
|
AsyncTaskTimerModel tmrPlay;
|
|
MapasModel Mapa = new MapasModel();
|
|
private Visualizador3DService visualizador3D;
|
|
private MapaDinamicoModel MapaDinamico;
|
|
private int idxMomentoAtual
|
|
{
|
|
get
|
|
{
|
|
return LogsOperacao.IndexOf(LogsOperacao.FirstOrDefault(x => x.Momento == MomentoAtual));
|
|
}
|
|
}
|
|
private int idxMomentoFiltro = 0;
|
|
private List<int> idxValoresFiltro = new List<int>();
|
|
|
|
private string[] cmbItemsBuscaPor = new string[] { "Pico Máximo", "Pico Mínimo" };
|
|
|
|
GraficoInterativoModel graficoMovGeral;
|
|
GraficoInterativoModel graficoMovTemperatura;
|
|
GraficoInterativoModel graficoMovAlimentacao;
|
|
GraficoInterativoModel graficoAtu;
|
|
GraficoInterativoModel graficoSen;
|
|
GraficoInterativoModel graficoCpu;
|
|
GraficoInterativoModel graficoCameras;
|
|
GraficoInterativoModel graficoErvas;
|
|
|
|
|
|
public frmResultadosOperacao()
|
|
{
|
|
// Ativa o double buffering
|
|
this.DoubleBuffered = true;
|
|
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
|
|
this.SetStyle(ControlStyles.UserPaint, true);
|
|
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
|
|
|
|
InitializeComponent();
|
|
|
|
InitializeGLControl();
|
|
}
|
|
|
|
private void InitializeGLControl()
|
|
{
|
|
VersaoArquivoModel arquivo = VersionamentoService.ArquivoModelo3D("obj");
|
|
|
|
visualizador3D = new Visualizador3DService();
|
|
visualizador3D.InitializeGLControl(pnl3D, arquivo.CaminhoCompleto);
|
|
}
|
|
|
|
|
|
private void frmResultadosOperacao_Load(object sender, EventArgs e)
|
|
{
|
|
tmrPlay = new AsyncTaskTimerModel("tmrPlay", tmrPlay_Tick, 1000, this);
|
|
|
|
picDIR_DF.Image = FuncoesGlobais.EspelharImagemHorizontalmente(Resources.roda_superior);
|
|
picDIR_DT.Image = FuncoesGlobais.EspelharImagemHorizontalmente(Resources.roda_superior);
|
|
|
|
MapaDinamico = new MapaDinamicoModel(this, pnlZoomMapa);
|
|
}
|
|
|
|
private async Task tmrPlay_Tick()
|
|
{
|
|
if (trbMomento.Value < trbMomento.Maximum)
|
|
{
|
|
trbMomento.Value++;
|
|
}
|
|
else
|
|
{
|
|
tmrPlay.Stop();
|
|
}
|
|
}
|
|
|
|
private void trbMomento_ValueChanged(object sender, EventArgs e)
|
|
{
|
|
MomentoAtual = LogsOperacao.Skip(trbMomento.Value).FirstOrDefault().Momento;
|
|
AtualizarDadosMomento();
|
|
}
|
|
|
|
private void btnPlay_Click(object sender, EventArgs e)
|
|
{
|
|
tmrPlay.Toogle();
|
|
btnPlay.Text = tmrPlay.IsRunning ? "Pause" : "Pay";
|
|
}
|
|
|
|
private void btnCarregarOperacao_Click(object sender, EventArgs e)
|
|
{
|
|
OpenFileDialog ofd = new OpenFileDialog();
|
|
ofd.Filter = "Arquivos de Operação|*.lgop";
|
|
ofd.InitialDirectory = Application.StartupPath + "\\" + Variaveis.CaminhoOperacoes;
|
|
if (ofd.ShowDialog() == DialogResult.OK)
|
|
{
|
|
OperacaoDadosModel data = JsonConvert.DeserializeObject<OperacaoDadosModel>(File.ReadAllText(ofd.FileName));
|
|
|
|
LogsOperacao = JsonConvert.DeserializeObject<OperacaoSensoriamentoLogModel[]>(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, data.operacao)).ToList();
|
|
LogsGPS = JsonConvert.DeserializeObject<GPSModel[]>(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, data.gps ?? Enums.T_Code.Gps.ToString())).ToList();
|
|
LogsDirecional = JsonConvert.DeserializeObject<DirSensoriamentoLogModel[]>(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, data.dir ?? Enums.T_Code.Dir.ToString())).ToList();
|
|
LogsMovimentacao = JsonConvert.DeserializeObject<MovSensoriamentoLogModel[]>(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, data.mov ?? Enums.T_Code.Mov.ToString())).ToList();
|
|
LogsAtuador = JsonConvert.DeserializeObject<AtuSensoriamentoLogModel[]>(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, data.atu ?? Enums.T_Code.Atu.ToString())).ToList();
|
|
LogsSensoriamento = JsonConvert.DeserializeObject<SensoriamentoMensagemJsonModel[]>(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, data.sen ?? Enums.T_Code.Sen.ToString())).ToList();
|
|
LogsPzem = JsonConvert.DeserializeObject<PzmSensoriamentoLogModel[]>(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, data.pzm ?? Enums.T_Code.Pzm.ToString())).ToList();
|
|
LogsWt901C = JsonConvert.DeserializeObject<WitSensoriamentoLogModel[]>(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, data.wit ?? Enums.T_Code.Wit.ToString())).ToList();
|
|
LogsA05 = JsonConvert.DeserializeObject<UltrasonicA05Model[]>(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, data.a05 ?? Enums.T_Code.A05.ToString())).ToList();
|
|
LogsSonar = JsonConvert.DeserializeObject<SonarCamModel[]>(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, data.snr ?? Enums.T_Code.Snr.ToString())).ToList();
|
|
LogsCam_Caminho = JsonConvert.DeserializeObject<CamCaminhoSensoriamentoLogModel[]>(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, data.cam_caminho)).ToList();
|
|
pathImagensMapaCalor = ofd.FileName.Replace("data.lgop", data.cam_caminho + "/");
|
|
pathImagensCaminho = ofd.FileName.Replace("data.lgop", data.cam_caminho + "/");
|
|
|
|
LogsCam_Solo = new List<List<CamSoloSensoriamentoLogModel>>();
|
|
pathImagensSolo = new List<string>();
|
|
picsCamSolo = new List<PictureBox>();
|
|
flwCameras.Controls.Clear();
|
|
foreach (string cam in data.cam_solo)
|
|
{
|
|
LogsCam_Solo.Add(JsonConvert.DeserializeObject<CamSoloSensoriamentoLogModel[]>(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, cam)).ToList());
|
|
pathImagensSolo.Add(ofd.FileName.Replace("data.lgop", cam + "/"));
|
|
PictureBox pic = new PictureBox()
|
|
{
|
|
Name = "picCamSolo_" + cam,
|
|
Width = 250,
|
|
Height = 166,
|
|
SizeMode = PictureBoxSizeMode.StretchImage
|
|
};
|
|
flwCameras.Controls.Add(pic);
|
|
picsCamSolo.Add(pic);
|
|
}
|
|
|
|
Mapa = new MapasModel()
|
|
{
|
|
pnlMapa = pnlMapa
|
|
};
|
|
MapasService.CriarArquivoMapa(new List<List<GPSModel>>() { LogsGPS }, 1517, data.id);
|
|
Mapa.btnCarregar_Click(sender, e, Variaveis.CaminhoSistema + "/" + Variaveis.CaminhoMapasConvertidos + data.id + ".json");
|
|
|
|
trbMomento.Maximum = LogsOperacao.Count - 1;
|
|
trbMomento.Minimum = 0;
|
|
trbMomento.Value = 0;
|
|
|
|
MomentoAtual = LogsOperacao[0].Momento;
|
|
|
|
this.Text = "Resultados da Operação " + LogsOperacao[0].Momento.ToString("dd/MM/yyyy");
|
|
|
|
|
|
InicializarGraficos();
|
|
InicializarCombosBusca();
|
|
|
|
|
|
AtualizarDadosMomento();
|
|
}
|
|
}
|
|
|
|
private void InicializarGraficos()
|
|
{
|
|
var Momentos = LogsOperacao.Select(x => x.Momento.ToString("mm:ss:fff")).ToList();
|
|
|
|
graficoMovGeral = new GraficoInterativoModel(chartMovGeral, Momentos, new List<GraficoInterativoSerieModel>()
|
|
{
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "RPM SP",
|
|
//Valores = LogsMovimentacao.GroupBy(x => new {ID = x.Modulo_ID, Momento = x.Momento}).Select(x => x.Average(y => y.RPM_SP)).ToList(),
|
|
Valores = LogsOperacao.Select(x => (double)x.Controle.RPM_SP).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "EF SP",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "EF").Select(x => x.RPM_SP).ToList(),
|
|
Visivel = false,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "EF Roda",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "EF").Select(x => x.RPM_Roda).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "EF Motor",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "EF").Select(x => x.RPM_Motor).ToList(),
|
|
Visivel = false,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "EF km/h",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "EF").Select(x => x.Velocidade).ToList(),
|
|
Visivel = false,
|
|
MostrarValor = true
|
|
},
|
|
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "ET SP",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "ET").Select(x => x.RPM_SP).ToList(),
|
|
Visivel = false,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "ET Roda",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "ET").Select(x => x.RPM_Roda).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "ET Motor",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "ET").Select(x => x.RPM_Motor).ToList(),
|
|
Visivel = false,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "ET km/h",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "ET").Select(x => x.Velocidade).ToList(),
|
|
Visivel = false,
|
|
MostrarValor = true
|
|
},
|
|
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "DT SP",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "DT").Select(x => x.RPM_SP).ToList(),
|
|
Visivel = false,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "DT Roda",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "DT").Select(x => x.RPM_Roda).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "DT Motor",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "DT").Select(x => x.RPM_Motor).ToList(),
|
|
Visivel = false,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "DT km/h",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "DT").Select(x => x.Velocidade).ToList(),
|
|
Visivel = false,
|
|
MostrarValor = true
|
|
},
|
|
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "DF SP",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "DF").Select(x => x.RPM_SP).ToList(),
|
|
Visivel = false,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "DF Roda",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "DF").Select(x => x.RPM_Roda).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "DF Motor",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "DF").Select(x => x.RPM_Motor).ToList(),
|
|
Visivel = false,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "DF km/h",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "DF").Select(x => x.Velocidade).ToList(),
|
|
Visivel = false,
|
|
MostrarValor = true
|
|
},
|
|
});
|
|
|
|
graficoMovTemperatura = new GraficoInterativoModel(chartMovTemperatura, Momentos, new List<GraficoInterativoSerieModel>()
|
|
{
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "EF Motor",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "EF").Select(x => x.Temperatura).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "ET Motor",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "ET").Select(x => x.Temperatura).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "DT Motor",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "DT").Select(x => x.Temperatura).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "DF Motor",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "DF").Select(x => x.Temperatura).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "EF Driver",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "EF").Select(x => x.TemperaturaDriver).ToList(),
|
|
Visivel = false,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "ET Driver",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "ET").Select(x => x.TemperaturaDriver).ToList(),
|
|
Visivel = false,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "DT Driver",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "DT").Select(x => x.TemperaturaDriver).ToList(),
|
|
Visivel = false,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "DF Driver",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "DF").Select(x => x.TemperaturaDriver).ToList(),
|
|
Visivel = false,
|
|
MostrarValor = true
|
|
},
|
|
});
|
|
|
|
graficoMovAlimentacao = new GraficoInterativoModel(chartMovTensao, Momentos, new List<GraficoInterativoSerieModel>()
|
|
{
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "V EF",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "EF").Select(x => x.Tensao).ToList(),
|
|
Visivel = false,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "V ET",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "ET").Select(x => x.Tensao).ToList(),
|
|
Visivel = false,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "V DT",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "DT").Select(x => x.Tensao).ToList(),
|
|
Visivel = false,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "V DF",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "DF").Select(x => x.Tensao).ToList(),
|
|
Visivel = false,
|
|
MostrarValor = true
|
|
},
|
|
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "AM EF",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "EF").Select(x => x.Corrente_Motor).ToList(),
|
|
Visivel = false,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "AM ET",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "ET").Select(x => x.Corrente_Motor).ToList(),
|
|
Visivel = false,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "AM DT",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "DT").Select(x => x.Corrente_Motor).ToList(),
|
|
Visivel = false,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "AM DF",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "DF").Select(x => x.Corrente_Motor).ToList(),
|
|
Visivel = false,
|
|
MostrarValor = true
|
|
},
|
|
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "AB EF",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "EF").Select(x => x.Corrente_Barramento).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "AB ET",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "ET").Select(x => x.Corrente_Barramento).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "AB DT",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "DT").Select(x => x.Corrente_Barramento).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "AB DF",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "DF").Select(x => x.Corrente_Barramento).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "W EF",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "EF").Select(x => x.Potencia).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "W ET",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "ET").Select(x => x.Potencia).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "W DT",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "DT").Select(x => x.Potencia).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "W DF",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "DF").Select(x => x.Potencia).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "% EF",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "EF").Select(x => x.CicloTrabalho).ToList(),
|
|
Visivel = false,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "% ET",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "ET").Select(x => x.CicloTrabalho).ToList(),
|
|
Visivel = false,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "% DT",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "DT").Select(x => x.CicloTrabalho).ToList(),
|
|
Visivel = false,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "% DF",
|
|
Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "DF").Select(x => x.CicloTrabalho).ToList(),
|
|
Visivel = false,
|
|
MostrarValor = true
|
|
},
|
|
});
|
|
|
|
graficoAtu = new GraficoInterativoModel(chartAtuador, Momentos, new List<GraficoInterativoSerieModel>()
|
|
{
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "Pressão SP",
|
|
Valores = LogsAtuador.Select(x => x?.PressaoLinha_SP ?? 0).ToList(),
|
|
Visivel = false,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "Pressão",
|
|
Valores = LogsAtuador.Select(x => x?.PressaoLinha ?? 0).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "Potência",
|
|
Valores = LogsAtuador.Select(x => x?.PotenciaBomba ?? 0).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "Volume",
|
|
Valores = LogsAtuador.Select(x => x?.VolumeReservatorio ?? 0).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "Reservatório",
|
|
Valores = LogsAtuador.Select(x => x?.PercentualReservatorio ?? 0).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "Vazão",
|
|
Valores = LogsAtuador.Select(x => x?.VazaoFluxoMLpSMedia ?? 0).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
}
|
|
});
|
|
|
|
graficoSen = new GraficoInterativoModel(chartSensoriamento, Momentos, new List<GraficoInterativoSerieModel>()
|
|
{
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "V 3v3",
|
|
Valores = LogsSensoriamento.Select(x => x?.SensoresCorrente?.FirstOrDefault(y => y.ID.Contains("3V"))?.BusVoltage ?? 0).ToList(),
|
|
Visivel = false,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "A 3v3",
|
|
Valores = LogsSensoriamento.Select(x => x?.SensoresCorrente?.FirstOrDefault(y => y.ID.Contains("3V"))?.Current ?? 0).ToList(),
|
|
Visivel = false,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "V 5v0",
|
|
Valores = LogsSensoriamento.Select(x => x?.SensoresCorrente?.FirstOrDefault(y => y.ID.Contains("5V"))?.BusVoltage ?? 0).ToList(),
|
|
Visivel = false,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "A 5v0",
|
|
Valores = LogsSensoriamento.Select(x => x?.SensoresCorrente?.FirstOrDefault(y => y.ID.Contains("5V"))?.Current ?? 0).ToList(),
|
|
Visivel = false,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "V 7v2",
|
|
Valores = LogsSensoriamento.Select(x => x?.SensoresCorrente?.FirstOrDefault(y => y.ID.Contains("7V2"))?.BusVoltage ?? 0).ToList(),
|
|
Visivel = false,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "A 7v2",
|
|
Valores = LogsSensoriamento.Select(x => x?.SensoresCorrente?.FirstOrDefault(y => y.ID.Contains("7V2"))?.Current ?? 0).ToList(),
|
|
Visivel = false,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "V 12v",
|
|
Valores = LogsSensoriamento.Select(x => x?.SensoresCorrente?.FirstOrDefault(y => y.ID.Contains("12V"))?.BusVoltage ?? 0).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "A 12v",
|
|
Valores = LogsSensoriamento.Select(x => x?.SensoresCorrente?.FirstOrDefault(y => y.ID.Contains("12V"))?.Current ?? 0).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "V Bat",
|
|
Valores = LogsPzem.Select(x => x?.Tensao ?? 0).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "A Bat",
|
|
Valores = LogsPzem.Select(x => x?.Corrente ?? 0).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
}
|
|
});
|
|
|
|
graficoCpu = new GraficoInterativoModel(chartCpu, Momentos, new List<GraficoInterativoSerieModel>()
|
|
{
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "CPU %",
|
|
Valores = LogsOperacao.Select(x => (double)(x?.DadosPerformance.CPU_load ?? 0)).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "GPU %",
|
|
Valores = LogsOperacao.Select(x => (double)(x?.DadosPerformance.GPU_load ?? 0)).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "HDD %",
|
|
Valores = LogsOperacao.Select(x => (double)(x?.DadosPerformance.HDD_load ?? 0)).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "RAM %",
|
|
Valores = LogsOperacao.Select(x => (double)(x?.DadosPerformance.RAM_usage ?? 0)).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "CPU Temp",
|
|
Valores = LogsOperacao.Select(x => (double)(x?.DadosPerformance.CPU_temp ?? 0)).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "GPU Temp",
|
|
Valores = LogsOperacao.Select(x => (double)(x?.DadosPerformance.GPU_temp ?? 0)).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "Threads Ativas",
|
|
Valores = LogsOperacao.Select(x => (double)(x?.DadosPerformance.ActiveThreads ?? 0)).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "Threads de Trabalho %",
|
|
Valores = LogsOperacao.Select(x => (double)((x?.DadosPerformance.MaxWorkerThreads ?? 1) - (x?.DadosPerformance.WorkerThreads ?? 0)) / (x?.DadosPerformance.MaxWorkerThreads ?? 1) * 100.0).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = "Threads de Portas %",
|
|
Valores = LogsOperacao.Select(x => (double)((x?.DadosPerformance.MaxCompletionPortThreads ?? 1) - (x?.DadosPerformance.CompletionPortThreads ?? 0)) / (x?.DadosPerformance.MaxCompletionPortThreads ?? 1) * 100.0).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
});
|
|
|
|
// Obtemos todos os tipos de ervas identificadas ao longo dos logs
|
|
var todasErvas = LogsOperacao
|
|
.SelectMany(log => log.Atuador.ErvasIdentificadas)
|
|
.SelectMany(bico => bico.Keys)
|
|
.Distinct()
|
|
.ToList();
|
|
|
|
Dictionary<DateTime, Dictionary<string, int>> agrupamento = new Dictionary<DateTime, Dictionary<string, int>>();
|
|
foreach (var log in LogsOperacao)
|
|
{
|
|
if (!agrupamento.Any(x => x.Key == log.Momento))
|
|
{
|
|
agrupamento.Add(log.Momento, new Dictionary<string, int>());
|
|
}
|
|
foreach (var bico in log.Atuador.ErvasIdentificadas)
|
|
{
|
|
if (bico.Any())
|
|
{
|
|
foreach (var erva in bico)
|
|
{
|
|
if (!agrupamento[log.Momento].ContainsKey(erva.Key))
|
|
{
|
|
agrupamento[log.Momento].Add(erva.Key, erva.Value);
|
|
}
|
|
else
|
|
{
|
|
agrupamento[log.Momento][erva.Key] += erva.Value;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
graficoErvas = new GraficoInterativoModel(chartErvas, Momentos, new List<GraficoInterativoSerieModel>(
|
|
todasErvas
|
|
.Select(erva => new GraficoInterativoSerieModel
|
|
{
|
|
Titulo = erva,
|
|
Valores = LogsOperacao
|
|
.Select(log =>
|
|
{
|
|
if (agrupamento.ContainsKey(log.Momento) && agrupamento[log.Momento].ContainsKey(erva))
|
|
return (double)agrupamento[log.Momento][erva];
|
|
else
|
|
return 0.0; // Adiciona zero se a erva não foi detectada neste momento
|
|
})
|
|
.ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true,
|
|
ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Pie
|
|
})
|
|
.ToList()
|
|
)
|
|
)
|
|
{
|
|
Titulo = "Ervas Identificadas"
|
|
};
|
|
|
|
List<GraficoInterativoSerieModel> seriesCamerasSolo = new List<GraficoInterativoSerieModel>();
|
|
foreach (var camSolo in LogsCam_Solo)
|
|
{
|
|
string camNome = "Solo " + (LogsCam_Solo.IndexOf(camSolo) + 1);
|
|
seriesCamerasSolo.AddRange(new List<GraficoInterativoSerieModel>()
|
|
{
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = $"{camNome} RAM %",
|
|
Valores = camSolo.Select(x => (double)(x?.Leitura?.device_data?.Memory_Usage?.Percent ?? 0)).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = $"{camNome} CPU Temp",
|
|
Valores = camSolo.Select(x => (double)(x?.Leitura?.device_data?.Temperature?.css ?? 0)).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = $"{camNome} RAM Temp",
|
|
Valores = camSolo.Select(x => (double)(x?.Leitura?.device_data?.Temperature?.mss ?? 0)).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = $"{camNome} VCC Temp",
|
|
Valores = camSolo.Select(x => (double)(x?.Leitura?.device_data?.Temperature?.upa ?? 0)).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
}
|
|
});
|
|
}
|
|
|
|
if (LogsCam_Caminho.Any(x => x.Leitura.device_data != null))
|
|
{
|
|
var camCaminho = LogsCam_Caminho;
|
|
string camNome = "Caminho";
|
|
seriesCamerasSolo.AddRange(new List<GraficoInterativoSerieModel>()
|
|
{
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = $"{camNome} RAM %",
|
|
Valores = camCaminho.Select(x => (double)(x?.Leitura?.device_data?.Memory_Usage?.Percent ?? 0)).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = $"{camNome} CPU Temp",
|
|
Valores = camCaminho.Select(x => (double)(x?.Leitura?.device_data?.Temperature?.css ?? 0)).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = $"{camNome} RAM Temp",
|
|
Valores = camCaminho.Select(x => (double)(x?.Leitura?.device_data?.Temperature?.mss ?? 0)).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
},
|
|
new GraficoInterativoSerieModel()
|
|
{
|
|
Titulo = $"{camNome} VCC Temp",
|
|
Valores = camCaminho.Select(x => (double)(x?.Leitura?.device_data?.Temperature?.upa ?? 0)).ToList(),
|
|
Visivel = true,
|
|
MostrarValor = true
|
|
}
|
|
});
|
|
}
|
|
|
|
graficoCameras = new GraficoInterativoModel(chartCameras, Momentos, seriesCamerasSolo);
|
|
|
|
}
|
|
|
|
private void InicializarCombosBusca()
|
|
{
|
|
CarregarInformacoesBusca(gpbMOV_Alimentacao_Filtro, graficoMovAlimentacao.Series.Select(x => x.Titulo).ToArray());
|
|
CarregarInformacoesBusca(gpbMOV_Temperatura_Filtro, graficoMovTemperatura.Series.Select(x => x.Titulo).ToArray());
|
|
CarregarInformacoesBusca(gpbMOV_Geral_Filtro, graficoMovGeral.Series.Select(x => x.Titulo).ToArray());
|
|
CarregarInformacoesBusca(gpbSEN_Filtro, graficoSen.Series.Select(x => x.Titulo).ToArray());
|
|
CarregarInformacoesBusca(gpbCpu_Filtro, graficoCpu.Series.Select(x => x.Titulo).ToArray());
|
|
CarregarInformacoesBusca(gpbCameras_Filtro, graficoCameras.Series.Select(x => x.Titulo).ToArray());
|
|
}
|
|
|
|
private void CarregarInformacoesBusca(GroupBox gpb, string[] Componentes)
|
|
{
|
|
ComboBox cmbFiltro = gpb.Controls.OfType<ComboBox>().FirstOrDefault(x => x.Name.Contains("Filtro"));
|
|
cmbFiltro.Items.Clear();
|
|
cmbFiltro.Items.AddRange(cmbItemsBuscaPor);
|
|
ComboBox cmbComponente = gpb.Controls.OfType<ComboBox>().FirstOrDefault(x => x.Name.Contains("Componente"));
|
|
cmbComponente.Items.Clear();
|
|
cmbComponente.Items.AddRange(Componentes);
|
|
cmbComponente.SelectedIndexChanged += cmbComponente_SelectedIndexChanged;
|
|
Button btnRedefinir = gpb.Controls.OfType<Button>().FirstOrDefault(x => x.Name.Contains("Redefinir"));
|
|
btnRedefinir.Click += btnRedefinirBusca_Click;
|
|
Button btnBuscar = gpb.Controls.OfType<Button>().FirstOrDefault(x => x.Name.Contains("Buscar"));
|
|
btnBuscar.Click += btnBuscarMomento_Click;
|
|
Button btnAnterior = gpb.Controls.OfType<Button>().FirstOrDefault(x => x.Name.Contains("Anterior"));
|
|
btnAnterior.Click += btnAnteriorFiltro_Click;
|
|
Button btnProximo = gpb.Controls.OfType<Button>().FirstOrDefault(x => x.Name.Contains("Proximo"));
|
|
btnProximo.Click += btnProximoFiltro_Click; ;
|
|
}
|
|
|
|
private void btnAnteriorFiltro_Click(object sender, EventArgs e)
|
|
{
|
|
if (idxValoresFiltro.Any() && idxMomentoFiltro > 0)
|
|
{
|
|
idxMomentoFiltro--;
|
|
trbMomento.Value = idxValoresFiltro[idxMomentoFiltro];
|
|
AtualizarDadosMomento();
|
|
}
|
|
}
|
|
|
|
private void btnProximoFiltro_Click(object sender, EventArgs e)
|
|
{
|
|
if (idxValoresFiltro.Any() && idxMomentoFiltro < idxValoresFiltro.Count() - 1)
|
|
{
|
|
idxMomentoFiltro++;
|
|
trbMomento.Value = idxValoresFiltro[idxMomentoFiltro];
|
|
AtualizarDadosMomento();
|
|
}
|
|
}
|
|
|
|
private void cmbComponente_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
AtualizarDadosMomento();
|
|
}
|
|
|
|
private void btnRedefinirBusca_Click(object sender, EventArgs e)
|
|
{
|
|
GroupBox gpb = (GroupBox)((Button)sender).Parent;
|
|
ComboBox cmbFiltro = gpb.Controls.OfType<ComboBox>().FirstOrDefault(x => x.Name.Contains("Filtro"));
|
|
cmbFiltro.SelectedIndex = -1;
|
|
ComboBox cmbComponente = gpb.Controls.OfType<ComboBox>().FirstOrDefault(x => x.Name.Contains("Componente"));
|
|
cmbComponente.SelectedIndex = -1;
|
|
idxMomentoFiltro = 0;
|
|
idxValoresFiltro = new List<int>();
|
|
|
|
AtualizarDadosMomento();
|
|
}
|
|
|
|
private void btnBuscarMomento_Click(object sender, EventArgs e)
|
|
{
|
|
GroupBox gpb = (GroupBox)((Button)sender).Parent;
|
|
ComboBox cmbFiltro = gpb.Controls.OfType<ComboBox>().FirstOrDefault(x => x.Name.Contains("Filtro"));
|
|
if (cmbFiltro.SelectedIndex < 0)
|
|
{
|
|
return;
|
|
}
|
|
ComboBox cmbComponente = gpb.Controls.OfType<ComboBox>().FirstOrDefault(x => x.Name.Contains("Componente"));
|
|
if (cmbComponente.SelectedIndex < 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
GraficoInterativoModel grafico = null;
|
|
|
|
if (gpb.Name.Contains("SEN"))
|
|
{
|
|
grafico = graficoSen;
|
|
}
|
|
else if (gpb.Name.Contains("MOV_Temperatura"))
|
|
{
|
|
grafico = graficoMovTemperatura;
|
|
}
|
|
else if (gpb.Name.Contains("MOV_Alimentacao"))
|
|
{
|
|
grafico = graficoMovAlimentacao;
|
|
}
|
|
else if (gpb.Name.Contains("MOV_Geral"))
|
|
{
|
|
grafico = graficoMovGeral;
|
|
}
|
|
else if (gpb.Name.Contains("Cpu"))
|
|
{
|
|
grafico = graficoCpu;
|
|
}
|
|
else if (gpb.Name.Contains("Cameras"))
|
|
{
|
|
grafico = graficoCameras;
|
|
}
|
|
if (grafico != null)
|
|
{
|
|
var Dados = grafico.Series.FirstOrDefault(x => x.Titulo == cmbComponente.Text).Valores.Select((x, i) => new { valor = x, idx = i }).ToList();
|
|
if (cmbFiltro.SelectedIndex == 0)
|
|
{
|
|
Dados = Dados.OrderByDescending(x => x.valor).ToList();
|
|
}
|
|
else if (cmbFiltro.SelectedIndex == 1)
|
|
{
|
|
Dados = Dados.OrderBy(x => x.valor).ToList();
|
|
}
|
|
|
|
idxValoresFiltro = Dados.Select(x => x.idx).ToList();
|
|
idxMomentoFiltro = 0;
|
|
|
|
trbMomento.Value = idxValoresFiltro[idxMomentoFiltro];
|
|
}
|
|
}
|
|
|
|
private Bitmap CarregarImagemCamera(string Caminho, string complemento = "")
|
|
{
|
|
string caminhoCompleto = Caminho + trbMomento.Value + ".jpg";
|
|
if (!string.IsNullOrEmpty(complemento))
|
|
{
|
|
caminhoCompleto = caminhoCompleto.Replace(".jpg", $"{complemento}.jpg");
|
|
}
|
|
Bitmap frame = new Bitmap(1, 1);
|
|
using (Graphics g = Graphics.FromImage(frame))
|
|
{
|
|
g.Clear(Color.Black);
|
|
}
|
|
Bitmap blackFrame = new Bitmap(frame);
|
|
|
|
if (File.Exists(caminhoCompleto))
|
|
{
|
|
try
|
|
{
|
|
return new Bitmap(Image.FromFile(caminhoCompleto));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
|
|
}
|
|
}
|
|
|
|
return blackFrame;
|
|
}
|
|
|
|
private Bitmap DesenharDeteccoesErvas(CameraCoordenadasFrameModel frame, Bitmap bitmapOriginal)
|
|
{
|
|
// Criar um novo bitmap com base no original para desenhar por cima
|
|
Bitmap bitmapComObjetos = new Bitmap(bitmapOriginal);
|
|
|
|
// Pegar o gráfico do bitmap que será retornado
|
|
using (Graphics g = Graphics.FromImage(bitmapComObjetos))
|
|
{
|
|
// Proporção de escala
|
|
double scaleX = (double)bitmapComObjetos.Width / frame.x_max;
|
|
double scaleY = (double)bitmapComObjetos.Height / frame.y_max;
|
|
|
|
// Iterar sobre os objetos detectados
|
|
foreach (var objeto in frame.objetos)
|
|
{
|
|
// Ajustar coordenadas e tamanho de acordo com a escala
|
|
int xAtual = (int)(objeto.x * scaleX);
|
|
int yAtual = (int)(objeto.y * scaleY);
|
|
int larguraAtual = (int)(objeto.largura * scaleX);
|
|
int alturaAtual = (int)(objeto.altura * scaleY);
|
|
|
|
// Desenhar o retângulo ao redor do objeto
|
|
g.DrawRectangle(new Pen(Color.Red, 2), xAtual, yAtual, larguraAtual, alturaAtual);
|
|
|
|
// Desenhar a descrição do objeto (id: descricao)
|
|
string descricao = $"{objeto.id}: {objeto.descricao}";
|
|
g.DrawString(descricao, new Font("Arial", 20), Brushes.White, new PointF(xAtual, yAtual - 15));
|
|
}
|
|
}
|
|
|
|
// Retornar o bitmap modificado
|
|
return bitmapComObjetos;
|
|
}
|
|
|
|
private void AtualizarDadosMomento()
|
|
{
|
|
if (!LogsOperacao.Any())
|
|
{
|
|
return;
|
|
}
|
|
|
|
txtMomento.Text = LogsOperacao.FirstOrDefault(x => x.Momento == MomentoAtual).Momento.ToString("HH:mm:ss");
|
|
|
|
AtualizarInformacoesOperacao();
|
|
|
|
AtualizarInformacoesCameras();
|
|
|
|
AtualizarInformacoesGPS();
|
|
|
|
AtualizarInformacoesDirecional();
|
|
|
|
AtualizarInformacoesMovimentacao();
|
|
|
|
AtualizarInformacoesAtuador();
|
|
|
|
AtualizarInformacoesSensoriamento();
|
|
|
|
AtualizarInformacoesSonar();
|
|
|
|
AtualizarInformacoesCPU();
|
|
}
|
|
|
|
private void AtualizarInformacoesOperacao()
|
|
{
|
|
var Log = LogsOperacao[idxMomentoAtual];
|
|
var LogAtu = LogsAtuador[idxMomentoAtual];
|
|
|
|
double herbicidaConsumido = Log.Atuador.HerbicidaConsumido != 0 ? Log.Atuador.HerbicidaConsumido : LogAtu.VolumeVazaoML;
|
|
double percentualHerbicidaConsumido = FuncoesMatematicas.Clamp(((herbicidaConsumido / 1000.0) / LogsAtuador.FirstOrDefault().VolumeReservatorio) * 100.0, 0, 100);
|
|
int totalAtuacoes = Log.Atuador.ErvasIdentificadas.Sum(dict => dict.Values.Sum());
|
|
double herbicidaPorErva = Log.Atuador.HerbicidaPorErva != 0 ? Log.Atuador.HerbicidaPorErva : (herbicidaConsumido / (totalAtuacoes > 0 ? totalAtuacoes : 1));
|
|
|
|
double distanciaPercorrida = Log.Trajetoria.DistanciaPercorrida;
|
|
|
|
lblPercentualBateria.Text = $"Bateria {Log.Bateria.PorcentagemBateria.ToString("0.00")}%";
|
|
FuncoesGlobais.PreencheValorProgressBar(pgbPercentualBateria, Log.Bateria.PorcentagemBateria);
|
|
lblBateriaConsumida.Text = $"Consumido {Log.Bateria.BateriaConsumida.ToString("0.00")}%";
|
|
FuncoesGlobais.PreencheValorProgressBar(pgbPercentualReservatorio, LogAtu.PercentualReservatorio);
|
|
lblPercentualReservatorio.Text = $"Reservatório {LogAtu.PercentualReservatorio.ToString("0.00")}%";
|
|
FuncoesGlobais.PreencheValorProgressBar(pgbHerbicidaConsumido, percentualHerbicidaConsumido);
|
|
lblHerbicidaConsumido.Text = $"Consumido {herbicidaConsumido.ToString("0.00")} ml";
|
|
FuncoesGlobais.PreencheValorProgressBar(pgbBateriaConsumida, Log.Bateria.BateriaConsumida);
|
|
txtTempoMovimento.Text = FuncoesGlobais.ConverterSegundosParaHHmmss((int)Log.Movimentacao.TempoMovimentoSegs);
|
|
txtStatusOperacao.Text = Log.StatusOperacao.ToString();
|
|
txtStatusCarro.Text = Log.Trajetoria.StatusCarro.ToString();
|
|
txtHerbicidaPorErva.Text = herbicidaPorErva.ToString("0.00") + " ml";
|
|
txtDentroRua.Text = Log.Trajetoria.CorredorAtual.Dentro ? "Sim" : "Não";
|
|
txtDirecaoCarro.Text = Log.Trajetoria.DirecaoCaminho.ToString();
|
|
txtErvasNoRadar.Text = Log.Atuador.ErvasNoRadar.ToString();
|
|
txtErvasTerreno.Text = Log.Atuador.PercentualErvasTerreno.ToString("0.00");
|
|
txtTipoMovimento.Text = Log.Controle.TipoMovimento.ToString();
|
|
txtVelocidade.Text = Log.Movimentacao.VelocidadeMedia.ToString("0.00") + " km/h (" + (Log.Movimentacao.VelocidadeMedia / 3.6).ToString("0.00") + " m/s)";
|
|
txtDirecaoControle.Text = (Log.Controle?.Direcao ?? Enums.Direcao.Parado).ToString();
|
|
txtVelocidadeControle.Text = ((Log.Controle?.PercentualVelocidadeSP ?? 0) / VariaveisEquipamento.RPM_Max_Roda * 100).ToString() + " rpm";
|
|
txtErvasIdentificadas.Text = $"{totalAtuacoes}";
|
|
|
|
txtDistanciaEsquerda.Text = Log.Trajetoria.DistanciaEsquerda.ToString("0.00");
|
|
txtDistanciaDireita.Text = Log.Trajetoria.DistanciaDireita.ToString("0.00");
|
|
txtNaMargem.Text = Log.Trajetoria.NaMargemDoCorredor ? "Sim" : "Não";
|
|
|
|
lblPercentualOperacao.Text = $"Operação {Log.Trajetoria.ProgressoTrajeto.ToString("0.00")}%";
|
|
FuncoesGlobais.PreencheValorProgressBar(pgbPercentualOperacao, Log.Trajetoria.ProgressoTrajeto);
|
|
txtDistanciaPercorrida.Text = distanciaPercorrida.ToString("0.00") + " m / " + Log.Trajetoria.DistanciaTotal.ToString("0.00") + " m";
|
|
|
|
double percentualRua = Log.Trajetoria.CorredorAtual.Progresso;
|
|
lblPercentualRua.Text = $"Rua {percentualRua.ToString("0.00")}%";
|
|
FuncoesGlobais.PreencheValorProgressBar(pgbPercentualRua, percentualRua);
|
|
|
|
DateTime dataFim = Log.DataFim.Year != Log.DataInicio.Year ? LogsOperacao[LogsOperacao.Count - 1].Momento : Log.DataFim;
|
|
txtDuracaoOperacao.Text = Log.TempoDecorrido.ToString("HH:mm:ss") + " / " + new DateTime().AddSeconds((dataFim - Log.DataInicio).TotalSeconds).ToString("HH:mm:ss");
|
|
|
|
pnlOrientacaoCaminho.Invalidate();
|
|
pnlOrientacaoDif.Invalidate();
|
|
|
|
OperacaoModel.PopularTreeView(tvwFalhas, Log.CodigoFalha);
|
|
|
|
TreeNode noModulos = new TreeNode("Status Módulos");
|
|
tvwFalhas.Nodes.Add(noModulos);
|
|
noModulos.Nodes.Add(AtualizarTextoStatusModulo(Enums.T_Code.Atu, LogsAtuador[idxMomentoAtual].Inicializado, LogsAtuador[idxMomentoAtual].UltimoComandoRespondido));
|
|
noModulos.Nodes.Add(AtualizarTextoStatusModulo(Enums.T_Code.Sen, LogsSensoriamento[idxMomentoAtual].Conectado, LogsSensoriamento[idxMomentoAtual].UltimoComandoRespondido));
|
|
noModulos.Nodes.Add(AtualizarTextoStatusModulo(Enums.T_Code.Mov, LogsMovimentacao[idxMomentoAtual].Inicializado, LogsMovimentacao[idxMomentoAtual].UltimoComandoRespondido));
|
|
noModulos.Nodes.Add(AtualizarTextoStatusModulo(Enums.T_Code.Dir, LogsDirecional[idxMomentoAtual].Inicializado, LogsDirecional[idxMomentoAtual].UltimoComandoRespondido));
|
|
noModulos.Nodes.Add(AtualizarTextoStatusModulo(Enums.T_Code.Pzm, LogsPzem[idxMomentoAtual].Inicializado, LogsPzem[idxMomentoAtual].UltimoComandoRespondido));
|
|
noModulos.Nodes.Add(AtualizarTextoStatusModulo(Enums.T_Code.Wit, LogsWt901C[idxMomentoAtual].Inicializado, LogsWt901C[idxMomentoAtual].UltimoComandoRespondido));
|
|
noModulos.Nodes.Add(AtualizarTextoStatusModulo(Enums.T_Code.A05, LogsA05[idxMomentoAtual].Conectado, LogsA05[idxMomentoAtual].UltimoComandoRespondido));
|
|
noModulos.Nodes.Add(AtualizarTextoStatusModulo(Enums.T_Code.Gps, LogsGPS[idxMomentoAtual].Inicializado, LogsGPS[idxMomentoAtual].UltimoComandoRespondido));
|
|
//noModulos.Nodes.Add(AtualizarTextoStatusModulo(Enums.T_Code.Knt, LogsCam_Caminho[idxMomentoAtual].Inicializado, LogsCam_Caminho[idxMomentoAtual].UltimaMensagemRecebida));
|
|
tvwFalhas.ExpandAll();
|
|
}
|
|
|
|
private void AtualizarInformacoesCameras()
|
|
{
|
|
picCameraCaminho.Image = CarregarImagemCamera(pathImagensCaminho);
|
|
AtualizarInformacoesCameraCaminho();
|
|
|
|
for (int i = 0; i < LogsCam_Solo.Count(); i++)
|
|
{
|
|
Bitmap bitmapSolo = CarregarImagemCamera(pathImagensSolo[i]);
|
|
if (chbDesenharErvas.Checked)
|
|
{
|
|
var LogCamSolo = LogsCam_Solo[i].FirstOrDefault(x => x.Momento == MomentoAtual);
|
|
if (LogCamSolo != null)
|
|
{
|
|
bitmapSolo = DesenharDeteccoesErvas(LogCamSolo.Leitura, bitmapSolo);
|
|
picsCamSolo[i].Image = bitmapSolo;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
picsCamSolo[i].Image = bitmapSolo;
|
|
}
|
|
}
|
|
|
|
|
|
graficoCameras.AtualizarDados(idxMomentoAtual);
|
|
|
|
if (cmbCameras_Componente.SelectedIndex > -1)
|
|
{
|
|
var Valores = graficoCameras.Series.FirstOrDefault(x => x.Titulo == cmbCameras_Componente.Text).Valores.Take(idxMomentoAtual + 1).ToList();
|
|
txtCameras_Atual.Text = Valores[idxMomentoAtual].ToString("0.00");
|
|
txtCameras_Media.Text = Valores.Average().ToString("0.00");
|
|
txtCameras_Mediana.Text = FuncoesMatematicas.CalcularMediana(Valores).ToString("0.00");
|
|
txtCameras_Moda.Text = FuncoesMatematicas.CalcularModa(Valores).ToString("0.00");
|
|
txtCameras_Minimo.Text = Valores.Min().ToString("0.00");
|
|
txtCameras_Maximo.Text = Valores.Max().ToString("0.00");
|
|
}
|
|
}
|
|
|
|
private void AtualizarInformacoesGPS()
|
|
{
|
|
var Log = LogsGPS.FirstOrDefault(x => x.Momento == MomentoAtual);
|
|
txtGPS_Altitude.Text = (Log?.Altitude ?? 0).ToString();
|
|
txtGPS_Data.Text = (Log?.DataHora ?? MomentoAtual).ToString("dd/MM HH:mm:ss");
|
|
txtGPS_Latitude.Text = (Log?.Latitude ?? 0).ToString();
|
|
txtGPS_Longitude.Text = (Log?.Longitude ?? 0).ToString();
|
|
txtGPS_Orientacao.Text = (Log?.QualidadeFix ?? Enums.TiposCorrecaoGPS.SemCorrecao).ToString();
|
|
txtGPS_Precisao.Text = (Log?.PrecisaoCm ?? 0).ToString("0.00") + " cm";
|
|
txtGPS_Satelites.Text = (Log?.NumeroSatelites ?? 0).ToString();
|
|
txtGPS_Velocidade.Text = (Log?.Velocidade ?? 0).ToString("0.00") + " (" + ((Log?.Velocidade ?? 0) * GPSUtils.ConversaoNosKmh).ToString("0.00") + " km/h)";
|
|
|
|
int ID = Convert.ToInt32(Variaveis.IsAgroMonitor ? Variaveis.OperacaoEmAndamento.DispSen.Dados.LoRaParametrosBase.address : Variaveis.ConexaoLoRa.parametros.address);
|
|
GPSService.EnviarCoordenadasParaMapa(Log?.Latitude ?? 0, Log?.Longitude ?? 0, Log?.AnguloCarroDefinido ?? 0, true, ID);
|
|
|
|
lblGPS.ForeColor = !Log.Inicializado ? Color.Red : Color.Black;
|
|
|
|
pnlOrientacaoGPS.Invalidate();
|
|
|
|
var _trajaetoria = LogsGPS.Select(x => new PontoTrajetoriaModel(Enums.TipoPontoRua.Indefinido)
|
|
{
|
|
Posicao = x
|
|
})
|
|
.ToList();
|
|
|
|
|
|
var LogSnr = LogsSonar.FirstOrDefault(x => x.Momento == MomentoAtual);
|
|
var LogOpe = LogsOperacao.FirstOrDefault(x => x.Momento == MomentoAtual);
|
|
|
|
MapaDinamico.AtualizarDados(
|
|
LogSnr.Iniciado && LogSnr.DirecaoDesvio != Enums.Direcao.Frente ? LogSnr.ObstaculoCritico : null,
|
|
(float)LogOpe.Trajetoria.AnguloCaminho,
|
|
(float)LogOpe.Gps.AnguloCarroDefinido,
|
|
Log,
|
|
_trajaetoria,
|
|
null, //Variaveis.OperacaoEmAndamento.Mapa.TrajetoriaProjetada.FirstOrDefault(),
|
|
new List<GPSModel>(LogsGPS.Take(LogsGPS.IndexOf(Log) + 1)),
|
|
new List<List<GPSModel>>()
|
|
);
|
|
}
|
|
|
|
private void AtualizarInformacoesDirecional()
|
|
{
|
|
AtualizarInformacoesMotorDirecional("DF");
|
|
AtualizarInformacoesMotorDirecional("DT");
|
|
AtualizarInformacoesMotorDirecional("EF");
|
|
AtualizarInformacoesMotorDirecional("ET");
|
|
|
|
pnlOrientacaoDirecional.Invalidate();
|
|
}
|
|
|
|
private void AtualizarInformacoesMotorDirecional(string ID)
|
|
{
|
|
var Log = LogsDirecional.Where(x => x.Modulo_ID == ID).FirstOrDefault(x => x.Momento == MomentoAtual);
|
|
var LogSen = LogsSensoriamento.FirstOrDefault(x => x.Momento == MomentoAtual);
|
|
|
|
double Angulo = Log?.Angulo ?? 0;
|
|
double Multiplicador = -1;
|
|
Image img = Resources.roda_superior;
|
|
if (ID.StartsWith("E"))
|
|
{
|
|
img = FuncoesGlobais.EspelharImagemHorizontalmente(img);
|
|
//Multiplicador = -1;
|
|
}
|
|
if (ID == "EF" || ID == "DT")
|
|
{
|
|
Multiplicador = 1;
|
|
}
|
|
//Multiplicador = (Log?.Sentido_SP ?? Enums.Sentido.Parado) == Enums.Sentido.Antihorario ? -1 : 1;
|
|
|
|
PictureBox pic = FuncoesGlobais.FindControlRecursive<PictureBox>(tabDirecional, "picDIR_" + ID);
|
|
pic.Image = FuncoesGlobais.RotacionarImagem(img, Angulo * Multiplicador);
|
|
|
|
Label lbl = FuncoesGlobais.FindControlRecursive<Label>(tabDirecional, "lblDIR_" + ID);
|
|
lbl.ForeColor = Log.Inicializado ? Color.Green : Color.Red;
|
|
|
|
TextBox txtAnguloSP = FuncoesGlobais.FindControlRecursive<TextBox>(tabDirecional, "txtDIR_AnguloSP_" + ID);
|
|
txtAnguloSP.Text = (Log?.Angulo_SP ?? 0).ToString();
|
|
TextBox txtAngulo = FuncoesGlobais.FindControlRecursive<TextBox>(tabDirecional, "txtDIR_Angulo_" + ID);
|
|
txtAngulo.Text = (Log?.Angulo ?? 0).ToString();
|
|
TextBox txtSentidoSP = FuncoesGlobais.FindControlRecursive<TextBox>(tabDirecional, "txtDIR_SentidoSP_" + ID);
|
|
txtSentidoSP.Text = (Log?.Sentido_SP ?? Enums.Sentido.Parado).ToString();
|
|
TextBox txtSentido = FuncoesGlobais.FindControlRecursive<TextBox>(tabDirecional, "txtDIR_Sentido_" + ID);
|
|
txtSentido.Text = (Log?.Sentido ?? Enums.Sentido.Parado).ToString();
|
|
TextBox txtVelocidade = FuncoesGlobais.FindControlRecursive<TextBox>(tabDirecional, "txtDIR_Velocidade_" + ID);
|
|
txtVelocidade.Text = (Log?.Velocidade ?? 0).ToString();
|
|
TextBox txtControlar = FuncoesGlobais.FindControlRecursive<TextBox>(tabDirecional, "txtDIR_Controlar_" + ID);
|
|
txtControlar.Text = (Log?.Controlar ?? false) ? "Sim" : "Não";
|
|
TextBox txtStatus = FuncoesGlobais.FindControlRecursive<TextBox>(tabDirecional, "txtDIR_Status_" + ID);
|
|
}
|
|
|
|
private void AtualizarInformacoesMovimentacao()
|
|
{
|
|
var Logs = LogsMovimentacao.Where(x => x.Momento == MomentoAtual).ToList();
|
|
|
|
graficoMovGeral.AtualizarDados(idxMomentoAtual);
|
|
graficoMovTemperatura.AtualizarDados(idxMomentoAtual);
|
|
graficoMovAlimentacao.AtualizarDados(idxMomentoAtual);
|
|
|
|
AtulizarDadosMotorMovimentacao("DF");
|
|
AtulizarDadosMotorMovimentacao("DT");
|
|
AtulizarDadosMotorMovimentacao("EF");
|
|
AtulizarDadosMotorMovimentacao("ET");
|
|
}
|
|
|
|
private void AtulizarDadosMotorMovimentacao(string ID)
|
|
{
|
|
var Log = LogsMovimentacao.FirstOrDefault(x => x.Momento == MomentoAtual && x.Modulo_ID == ID);
|
|
var Log_Sen = LogsSensoriamento.FirstOrDefault(x => x.Momento == MomentoAtual);
|
|
bool freio =
|
|
(ID.Contains("ET") && Log_Sen.ServoFreios?.FirstOrDefault(x => x.ID.Contains("ET"))?.Angulo > 0 && Log_Sen.ServoFreios?.FirstOrDefault(x => x.ID.Contains("ET"))?.Angulo < 180) ||
|
|
(ID.Contains("DT") && Log_Sen.ServoFreios?.FirstOrDefault(x => x.ID.Contains("DT"))?.Angulo > 0 && Log_Sen.ServoFreios?.FirstOrDefault(x => x.ID.Contains("DT"))?.Angulo < 180) ||
|
|
(ID.Contains("EF") && Log_Sen.ServoFreios?.FirstOrDefault(x => x.ID.Contains("EF"))?.Angulo > 0 && Log_Sen.ServoFreios?.FirstOrDefault(x => x.ID.Contains("EF"))?.Angulo < 180) ||
|
|
(ID.Contains("DF") && Log_Sen.ServoFreios?.FirstOrDefault(x => x.ID.Contains("DF"))?.Angulo > 0 && Log_Sen.ServoFreios?.FirstOrDefault(x => x.ID.Contains("DF"))?.Angulo < 180);
|
|
|
|
GroupBox gpbRpm = FuncoesGlobais.FindControlRecursive<GroupBox>(tabMovGreal, "gpbMOV_Geral_" + ID);
|
|
gpbRpm.ForeColor = !Log.Inicializado ? Color.Red : Color.Black;
|
|
CheckBox chbAlm = FuncoesGlobais.FindControlRecursive<CheckBox>(gpbRpm, "chbMOV_Alm_" + ID);
|
|
chbAlm.Checked = Log.CodAlarme > 0;
|
|
chbAlm.Text = $"Alarme ({Log.CodAlarme})";
|
|
CheckBox chbEn = FuncoesGlobais.FindControlRecursive<CheckBox>(gpbRpm, "chbMOV_En_" + ID);
|
|
chbEn.Checked = Log.Ativado;
|
|
CheckBox chbBrk = FuncoesGlobais.FindControlRecursive<CheckBox>(gpbRpm, "chbMOV_Brk_" + ID);
|
|
chbBrk.Checked = Log.EmFreio;
|
|
TextBox txtSentidoSP = FuncoesGlobais.FindControlRecursive<TextBox>(gpbRpm, "txtMOV_SentidoSP_" + ID);
|
|
txtSentidoSP.Text = freio ? Enums.Direcao.EmFreio.ToString() : Log.Sentido_SP.ToString();
|
|
TextBox txtSentido = FuncoesGlobais.FindControlRecursive<TextBox>(gpbRpm, "txtMOV_Sentido_" + ID);
|
|
txtSentido.Text = Log.EmFreio ? Enums.Direcao.EmFreio.ToString() : Log.Sentido.ToString();
|
|
|
|
if (cmbMOV_Temperatura_Componente.SelectedIndex > -1)
|
|
{
|
|
var Valores = graficoMovTemperatura.Series.FirstOrDefault(x => x.Titulo == (ID + " " + cmbMOV_Temperatura_Componente.Text.Split(' ')[1])).Valores.Take(idxMomentoAtual + 1).ToList();
|
|
|
|
GroupBox gpbTmp = FuncoesGlobais.FindControlRecursive<GroupBox>(tabMovTemperatura, "gpbMOV_Temperatura_" + ID);
|
|
TextBox txtTmpAtual = FuncoesGlobais.FindControlRecursive<TextBox>(gpbTmp, "txtMOV_TemperaturaAt_" + ID);
|
|
txtTmpAtual.Text = Valores[idxMomentoAtual].ToString("0.00");
|
|
TextBox txtTmpMinima = FuncoesGlobais.FindControlRecursive<TextBox>(gpbTmp, "txtMOV_TemperaturaMn_" + ID);
|
|
txtTmpMinima.Text = Valores.Min().ToString("0.00");
|
|
TextBox txtTmpMaxima = FuncoesGlobais.FindControlRecursive<TextBox>(gpbTmp, "txtMOV_TemperaturaMx_" + ID);
|
|
txtTmpMaxima.Text = Valores.Max().ToString("0.00");
|
|
|
|
int dado = (cmbMOV_Temperatura_Componente.SelectedIndex) / 4;
|
|
|
|
double RetornaDadoTemperatura(MovSensoriamentoLogModel x) => dado == 0 ? x?.Temperatura ?? 0 : x?.TemperaturaDriver ?? 0;
|
|
|
|
double valMin = 0;
|
|
|
|
txtMOV_Temperatura_Media.Text = LogsMovimentacao.Where(x => x.Momento <= MomentoAtual && RetornaDadoTemperatura(x) > valMin && (chbMOV_Temperatura_Media.Checked ? x.Modulo_ID == ID : true)).DefaultIfEmpty().Average(x => RetornaDadoTemperatura(x)).ToString("0.00");
|
|
txtMOV_Temperatura_Mediana.Text = FuncoesMatematicas.CalcularMediana(LogsMovimentacao.Where(x => x.Momento <= MomentoAtual && RetornaDadoTemperatura(x) > valMin && (chbMOV_Temperatura_Moda.Checked ? x.Modulo_ID == ID : true)).DefaultIfEmpty().Select(x => RetornaDadoTemperatura(x)).ToList()).ToString("0.00");
|
|
txtMOV_Temperatura_Moda.Text = FuncoesMatematicas.CalcularModa(LogsMovimentacao.Where(x => x.Momento <= MomentoAtual && RetornaDadoTemperatura(x) > valMin && (chbMOV_Temperatura_Mediana.Checked ? x.Modulo_ID == ID : true)).DefaultIfEmpty().Select(x => RetornaDadoTemperatura(x)).ToList()).ToString("0.00");
|
|
}
|
|
|
|
if (cmbMOV_AlImentacao_Componente.SelectedIndex > -1)
|
|
{
|
|
var Valores = graficoMovAlimentacao.Series.FirstOrDefault(x => x.Titulo == (cmbMOV_AlImentacao_Componente.Text.Split(' ')[0] + " " + ID)).Valores.Take(idxMomentoAtual + 1).ToList();
|
|
|
|
GroupBox gpbTns = FuncoesGlobais.FindControlRecursive<GroupBox>(tabMovAlimentacao, "gpbMOV_Alimentacao_" + ID);
|
|
TextBox txtTnsAtual = FuncoesGlobais.FindControlRecursive<TextBox>(gpbTns, "txtMOV_AlimentacaoAt_" + ID);
|
|
txtTnsAtual.Text = Valores[idxMomentoAtual].ToString("0.00");
|
|
TextBox txtTnsMinima = FuncoesGlobais.FindControlRecursive<TextBox>(gpbTns, "txtMOV_AlimentacaoMn_" + ID);
|
|
txtTnsMinima.Text = Valores.Min().ToString("0.00");
|
|
TextBox txtTnsMaxima = FuncoesGlobais.FindControlRecursive<TextBox>(gpbTns, "txtMOV_AlimentacaoMx_" + ID);
|
|
txtTnsMaxima.Text = Valores.Max().ToString("0.00");
|
|
|
|
int dado = (cmbMOV_AlImentacao_Componente.SelectedIndex) / 4;
|
|
|
|
double RetornaDadoAlimentacao(MovSensoriamentoLogModel x) => dado == 0 ? x?.Tensao ?? 0 : dado == 1 ? x?.Corrente_Motor ?? 0 : dado == 2 ? x?.Corrente_Barramento ?? 0 : dado == 3 ? x?.Potencia ?? 0 : x?.CicloTrabalho ?? 0;
|
|
|
|
double valMin = 0;
|
|
|
|
txtMOV_Alimentacao_Media.Text = LogsMovimentacao.Where(x => x.Momento <= MomentoAtual && RetornaDadoAlimentacao(x) > valMin && (chbMOV_Alimentacao_Media.Checked ? x.Modulo_ID == ID : true)).DefaultIfEmpty().Average(x => RetornaDadoAlimentacao(x)).ToString("0.00");
|
|
txtMOV_Alimentacao_Mediana.Text = FuncoesMatematicas.CalcularMediana(LogsMovimentacao.Where(x => x.Momento <= MomentoAtual && RetornaDadoAlimentacao(x) > valMin && (chbMOV_Alimentacao_Moda.Checked ? x.Modulo_ID == ID : true)).DefaultIfEmpty().Select(x => RetornaDadoAlimentacao(x)).ToList()).ToString("0.00");
|
|
txtMOV_Alimentacao_Moda.Text = FuncoesMatematicas.CalcularModa(LogsMovimentacao.Where(x => x.Momento <= MomentoAtual && RetornaDadoAlimentacao(x) > valMin && (chbMOV_Alimentacao_Mediana.Checked ? x.Modulo_ID == ID : true)).DefaultIfEmpty().Select(x => RetornaDadoAlimentacao(x)).ToList()).ToString("0.00");
|
|
}
|
|
}
|
|
|
|
private void AtualizarInformacoesAtuador()
|
|
{
|
|
graficoAtu.AtualizarDados(idxMomentoAtual);
|
|
graficoErvas.AtualizarDados(idxMomentoAtual);
|
|
|
|
pnlAtuadores.Invalidate();
|
|
|
|
var Log = LogsAtuador.FirstOrDefault(x => x.Momento == MomentoAtual);
|
|
if (Log == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
lblATU_QualidadeWifi.Text = $"Qualidade Wi-Fi: {Log.QualidadeWifi} dBm";
|
|
lblATU_LatenciaLoop.Text = $"Latencia de Loop: {Log.LatenciaLoop} ms";
|
|
}
|
|
|
|
private void AtualizarInformacoesSensoriamento()
|
|
{
|
|
graficoSen.AtualizarDados(idxMomentoAtual);
|
|
|
|
if (cmbSen_Componente.SelectedIndex > -1)
|
|
{
|
|
var Valores = graficoSen.Series.FirstOrDefault(x => x.Titulo == cmbSen_Componente.Text).Valores.Take(idxMomentoAtual + 1).ToList();
|
|
txtSen_Atual.Text = Valores[idxMomentoAtual].ToString("0.00");
|
|
txtSen_Media.Text = Valores.Average().ToString("0.00");
|
|
txtSen_Mediana.Text = FuncoesMatematicas.CalcularMediana(Valores).ToString("0.00");
|
|
txtSen_Moda.Text = FuncoesMatematicas.CalcularModa(Valores).ToString("0.00");
|
|
txtSen_Minimo.Text = Valores.Min().ToString("0.00");
|
|
txtSen_Maximo.Text = Valores.Max().ToString("0.00");
|
|
}
|
|
|
|
var LogWit = LogsWt901C.FirstOrDefault(x => x.Momento == MomentoAtual);
|
|
lblMagnetometro.ForeColor = !LogWit.Inicializado ? Color.Red : Color.Black;
|
|
pnlOrientacaoMagnetometro.Invalidate();
|
|
pnlInclinacao.Invalidate();
|
|
visualizador3D.AtualizarAngulos(-LogWit.AngleX, -LogWit.AngleY, LogWit.AngleZ);
|
|
txtTemperatura.Text = LogWit.Temperatura.ToString("0.00");
|
|
txtAltitude.Text = LogWit.Altitude.ToString("0.00");
|
|
txtPressao.Text = LogWit.Pressao + " Pa (" + (LogWit.Pressao / 101300.0).ToString("0.00") + " atm)";
|
|
|
|
var LogSen = LogsSensoriamento.FirstOrDefault(x => x.Momento == MomentoAtual);
|
|
pnlManual.BackColor = LogSen.Sinaleiros?.FirstOrDefault(x => x.ID.Contains("MN"))?.Leitura == Enums.StatusLED.Aceso ? Color.Yellow : Color.Gold;
|
|
pnlAutomatico.BackColor = LogSen.Sinaleiros?.FirstOrDefault(x => x.ID.Contains("AT"))?.Leitura == Enums.StatusLED.Aceso ? Color.Yellow : Color.Gold;
|
|
pnlOperacao.BackColor = LogSen.Sinaleiros?.FirstOrDefault(x => x.ID.Contains("OP"))?.Leitura == Enums.StatusLED.Aceso ? Color.Green : Color.DarkGreen;
|
|
lblSEN_QualidadeWifi.Text = $"Qualidade Wi-Fi: {LogSen.QualidadeWifi} dBm";
|
|
lblSEN_LatenciaLoop.Text = $"Latencia de Loop: {LogSen.LatenciaLoop} ms";
|
|
|
|
var LogA05 = LogsA05.FirstOrDefault(x => x.Momento == MomentoAtual);
|
|
|
|
foreach (var pnl in pnlUltrassom.Controls.OfType<Panel>().OrderBy(x => x.Name))
|
|
{
|
|
int id = int.Parse(pnl.Name.Replace("pnlP_", ""));
|
|
var _Sensor = LogA05.Configuracao.Sensores.FirstOrDefault(x => (int)x.Posicao == id);
|
|
|
|
pnl.Visible = _Sensor != null;
|
|
pnl.BackColor = LogA05.Conectado && _Sensor != null && _Sensor.SensorAtuado ? Color.Red : Color.Gray;
|
|
|
|
pnl.Tag = _Sensor != null ? $"{_Sensor.ID:00};{_Sensor.LeituraCm:F2}" : null; // Armazena o ID e a Leitura no Tag do Panel
|
|
|
|
pnl.Paint += (s, _e) =>
|
|
{
|
|
// Pega o ID e a leitura armazenados no Tag, se houver
|
|
string tag = pnl.Tag?.ToString();
|
|
if (!string.IsNullOrEmpty(tag))
|
|
{
|
|
var parts = tag.Split(';');
|
|
string sensorID = parts[0];
|
|
string leitura = parts.Length > 1 ? parts[1] : "";
|
|
|
|
Font font = new Font("Arial", 9, FontStyle.Bold);
|
|
// Calcula a posição para o ID do sensor (primeira linha)
|
|
SizeF idSize = _e.Graphics.MeasureString(sensorID, font);
|
|
float idX = (pnl.Width - idSize.Width) / 2;
|
|
float idY = (pnl.Height - idSize.Height) / 8; // Ajuste para centralizar no terço superior
|
|
_e.Graphics.DrawString(sensorID, font, Brushes.White, idX, idY);
|
|
|
|
// Calcula a posição para o valor de leitura (segunda linha)
|
|
Font fontLeitura = new Font("Arial", 7, FontStyle.Regular);
|
|
SizeF leituraSize = _e.Graphics.MeasureString(leitura, fontLeitura);
|
|
float leituraX = (pnl.Width - leituraSize.Width) / 2;
|
|
float leituraY = idY + idSize.Height + 1; // Posiciona logo abaixo do ID
|
|
_e.Graphics.DrawString(leitura, fontLeitura, Brushes.White, leituraX, leituraY);
|
|
}
|
|
};
|
|
|
|
pnl.Invalidate(); // Redesenha o Panel para aplicar as mudanças
|
|
}
|
|
|
|
}
|
|
|
|
private void AtualizarInformacoesSonar()
|
|
{
|
|
var Log = LogsSonar.FirstOrDefault(x => x.Momento == MomentoAtual);
|
|
txtEspacoLivreEsquerda.Text = Log.EspacoLivreEsquerda.ToString("0.00");
|
|
txtEspacoLivreDireita.Text = Log.EspacoLivreDireita.ToString("0.00");
|
|
txtDesvioNecessario.Text = Log.DesvioNecessario ? "Sim" : "Não";
|
|
txtDirecaoDesvio.Text = Log.DirecaoDesvio.ToString();
|
|
|
|
if (gridObstaculos.Columns.Count == 0)
|
|
{
|
|
gridObstaculos.Columns.Clear();
|
|
|
|
gridObstaculos.Columns.Add("clDistancia", "Distância");
|
|
gridObstaculos.Columns.Add("clLargura", "Largura");
|
|
gridObstaculos.Columns.Add("clAltura", "Altura");
|
|
gridObstaculos.Columns.Add("clEspacoEsquerda", "Espaço à Esquerdo");
|
|
gridObstaculos.Columns.Add("clEspacoDireita", "Espaço à Direita");
|
|
gridObstaculos.Columns.Add("clDesvioNecessario", "Desvio Necessário");
|
|
gridObstaculos.Columns.Add("clDirecaoDesvio", "Direção Desvio");
|
|
}
|
|
|
|
gridObstaculos.Rows.Clear();
|
|
|
|
foreach (var obstaculo in Log.Obstaculos.Where(x => x.DesvioNecessario).OrderBy(x => x.DistanciaMedia_mm))
|
|
{
|
|
gridObstaculos.Rows.Add
|
|
(
|
|
obstaculo.DistanciaMedia_mm.ToString("0.00"),
|
|
obstaculo.Largura_mm.ToString("0.00"),
|
|
obstaculo.Altura_mm.ToString("0.00"),
|
|
obstaculo.DistanciaLivreEsquerda.ToString("0.00"),
|
|
obstaculo.DistanciaLivreDireita.ToString("0.00"),
|
|
obstaculo.DesvioNecessario ? "Sim" : "Não",
|
|
obstaculo.DirecaoDesvio.ToString()
|
|
);
|
|
}
|
|
|
|
picMapaCalor.Image = CarregarImagemCamera(pathImagensMapaCalor, "_heat");
|
|
|
|
picSonarRGB.Image = CarregarImagemCamera(pathImagensCaminho);
|
|
|
|
if (chbGrade.Checked)
|
|
{
|
|
Bitmap bitmap = (Bitmap)picSonarRGB.Image.Clone();
|
|
bitmap = (Bitmap)SonarService.ExibirObstaculos(bitmap, Log).Clone();
|
|
picSonarRGB.Image = (Bitmap)bitmap.Clone();
|
|
}
|
|
}
|
|
|
|
private void AtualizarInformacoesCameraCaminho()
|
|
{
|
|
var Log = LogsCam_Caminho.FirstOrDefault(x => x.Momento == MomentoAtual);
|
|
|
|
if (Log != null)
|
|
{
|
|
txtCamCaminhoAngulo.Text = Log.Angulo.ToString("0.00");
|
|
txtCamCaminhoEsquerda.Text = Log.AnguloEsquerdo.ToString("0.00");
|
|
txtCamCaminhoDireita.Text = Log.AnguloDireito.ToString("0.00");
|
|
}
|
|
|
|
pnlCaminho.Invalidate();
|
|
}
|
|
|
|
private void AtualizarInformacoesCPU()
|
|
{
|
|
graficoCpu.AtualizarDados(idxMomentoAtual);
|
|
|
|
if (cmbCpu_Componente.SelectedIndex > -1)
|
|
{
|
|
var Valores = graficoCpu.Series.FirstOrDefault(x => x.Titulo == cmbCpu_Componente.Text).Valores.Take(idxMomentoAtual + 1).ToList();
|
|
txtCpu_Atual.Text = Valores[idxMomentoAtual].ToString("0.00");
|
|
txtCpu_Media.Text = Valores.Average().ToString("0.00");
|
|
txtCpu_Mediana.Text = FuncoesMatematicas.CalcularMediana(Valores).ToString("0.00");
|
|
txtCpu_Moda.Text = FuncoesMatematicas.CalcularModa(Valores).ToString("0.00");
|
|
txtCpu_Minimo.Text = Valores.Min().ToString("0.00");
|
|
txtCpu_Maximo.Text = Valores.Max().ToString("0.00");
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private void pnlOrientacaoDirecional_Paint(object sender, PaintEventArgs e)
|
|
{
|
|
var LogOp = LogsOperacao.FirstOrDefault(x => x.Momento == MomentoAtual);
|
|
double Angulo = LogOp?.Controle?.Angulo ?? 0;
|
|
Enums.Direcao direcaoControle = (LogOp?.Controle.TiposControle?.FirstOrDefault(x => x.Tipo == Enums.T_Code.Dir).UltimaDirecao ?? Enums.Direcao.Parado);
|
|
Angulo *=
|
|
direcaoControle == Enums.Direcao.Esquerda ? -1 :
|
|
direcaoControle == Enums.Direcao.Direita ? 1 :
|
|
0;
|
|
FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)Angulo, 90);
|
|
}
|
|
|
|
private void pnlOrientacaoGPS_Paint(object sender, PaintEventArgs e)
|
|
{
|
|
var Log = LogsGPS.FirstOrDefault(x => x.Momento == MomentoAtual);
|
|
|
|
double AnguloGps = Log?.OrientacaoReal ?? 0;
|
|
double AnguloMovimento = Log?.OrientacaoMovimento ?? 0;
|
|
FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)AnguloGps, 90, (float)AnguloMovimento);
|
|
}
|
|
|
|
private void pnlOrientacaoMagnetometro_Paint(object sender, PaintEventArgs e)
|
|
{
|
|
var Log = LogsOperacao.FirstOrDefault(x => x.Momento == MomentoAtual);
|
|
|
|
double AnguloWit = (Log?.WitMotion?.AngleZ ?? 0);
|
|
double AnguloWitCorrigido = (Log?.WitMotion.AnguloCorrigido ?? 0);
|
|
|
|
FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)AnguloWit, 90, (float)AnguloWitCorrigido);
|
|
}
|
|
|
|
private void pnlOrientacaoCaminho_Paint(object sender, PaintEventArgs e)
|
|
{
|
|
var Log = LogsOperacao.FirstOrDefault(x => x.Momento == MomentoAtual);
|
|
|
|
double Angulo = Log?.Trajetoria.ProximoPonto.Orientacao ?? 0;
|
|
double AnguloMedio = Log?.Trajetoria.AnguloCaminho ?? 0;
|
|
|
|
FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)Angulo, 90, (float)AnguloMedio);
|
|
}
|
|
|
|
private void pnlOrientacaoDif_Paint(object sender, PaintEventArgs e)
|
|
{
|
|
var Logs = LogsOperacao.Where(x => x.Momento == MomentoAtual).ToList();
|
|
double Angulo = Logs.Any() ? Logs.Average(x => x.Trajetoria.ErroOrientacaoAngularProximoPonto) : 0;
|
|
FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)Angulo, 90);
|
|
}
|
|
|
|
private void pnlAtuadores_Paint(object sender, PaintEventArgs e)
|
|
{
|
|
var Log = LogsAtuador.FirstOrDefault(x => x.Momento == MomentoAtual);
|
|
if (Log == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
AtuadorFuncoesGerais.DesenharAtuadores(pnlAtuadores, e, Log.Bicos, Log.BombaLigada, Log.PressaoLinha, Log.TempoPulverizadorAtuado);
|
|
}
|
|
|
|
private void pnlInclinacao_Paint(object sender, PaintEventArgs e)
|
|
{
|
|
var Log = LogsWt901C.FirstOrDefault(x => x.Momento == MomentoAtual);
|
|
|
|
Graphics g = e.Graphics;
|
|
int centerX = pnlInclinacao.Width / 2;
|
|
int centerY = pnlInclinacao.Height / 2;
|
|
int radius = 10;
|
|
|
|
// Desenhar fundo com bordas arredondadas
|
|
GraphicsPath path = new GraphicsPath();
|
|
int cornerRadius = 20;
|
|
path.AddArc(0, 0, cornerRadius, cornerRadius, 180, 90);
|
|
path.AddArc(pnlInclinacao.Width - cornerRadius, 0, cornerRadius, cornerRadius, 270, 90);
|
|
path.AddArc(pnlInclinacao.Width - cornerRadius, pnlInclinacao.Height - cornerRadius, cornerRadius, cornerRadius, 0, 90);
|
|
path.AddArc(0, pnlInclinacao.Height - cornerRadius, cornerRadius, cornerRadius, 90, 90);
|
|
path.CloseAllFigures();
|
|
|
|
g.SmoothingMode = SmoothingMode.AntiAlias;
|
|
g.FillPath(new SolidBrush(Color.LightBlue), path);
|
|
g.DrawPath(new Pen(Color.DarkBlue, 2), path);
|
|
|
|
// Desenhar linhas de referência
|
|
Pen pen = new Pen(Color.Gray, 1);
|
|
g.DrawLine(pen, centerX, 0, centerX, pnlInclinacao.Height);
|
|
g.DrawLine(pen, 0, centerY, pnlInclinacao.Width, centerY);
|
|
|
|
// Desenhar linhas adicionais para ângulos
|
|
for (int i = -90; i <= 90; i += 15)
|
|
{
|
|
int posX = centerX + (int)(i * (pnlInclinacao.Width / 2 - radius) / 90);
|
|
int posY = centerY - (int)(i * (pnlInclinacao.Height / 2 - radius) / 90);
|
|
g.DrawLine(pen, centerX, centerY, posX, centerY);
|
|
g.DrawLine(pen, centerX, centerY, centerX, posY);
|
|
}
|
|
|
|
// Desenhar régua na linha central
|
|
for (int i = -90; i <= 90; i += 15)
|
|
{
|
|
int posX = centerX + (int)(i * (pnlInclinacao.Width / 2 - radius) / 90);
|
|
int posY = centerY - (int)(i * (pnlInclinacao.Height / 2 - radius) / 90);
|
|
|
|
// Marcas horizontais
|
|
g.DrawLine(pen, posX, centerY - 5, posX, centerY + 5);
|
|
g.DrawString(i.ToString(), new Font("Arial", 8), Brushes.Black, posX - 10, centerY + 10);
|
|
|
|
// Marcas verticais
|
|
g.DrawLine(pen, centerX - 5, posY, centerX + 5, posY);
|
|
g.DrawString(i.ToString(), new Font("Arial", 8), Brushes.Black, centerX + 10, posY - 5);
|
|
}
|
|
|
|
// Calcular a posição do círculo com base nos ângulos
|
|
int circlePosX = centerX + (int)((Log?.AngleX ?? 0) * (pnlInclinacao.Width / 2 - radius) / 90);
|
|
int circlePosY = centerY - (int)((Log?.AngleY ?? 0) * (pnlInclinacao.Height / 2 - radius) / 90);
|
|
|
|
// Desenhar o círculo
|
|
Brush brush = new SolidBrush(Color.Red);
|
|
g.FillEllipse(brush, circlePosX - radius, circlePosY - radius, radius * 2, radius * 2);
|
|
}
|
|
|
|
private void pnlCaminho_Paint(object sender, PaintEventArgs e)
|
|
{
|
|
var Log = LogsCam_Caminho.FirstOrDefault(x => x.Momento == MomentoAtual);
|
|
if (Log == null || Log.Leitura == null) return;
|
|
|
|
Panel pnlContornos = (Panel)sender;
|
|
|
|
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 = Log.ClassMap.FirstOrDefault(x => x.Key == "rua");
|
|
foreach (var cameraClass in Log.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));
|
|
|
|
if (chbDesenharContornos.Checked)
|
|
{
|
|
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 && chbDesenharContornos.Checked)
|
|
{
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (chbDesenharExtremos.Checked)
|
|
{
|
|
using (Pen pen = new Pen(Classe.Value, 2))
|
|
{
|
|
var PontosExtremos = CameraCaminhoModel.DefinirPontosExtremos(pontosCamera);
|
|
for (int i = 0; i < PontosExtremos.Count - 1; i++)
|
|
{
|
|
// Aplica a escala e o deslocamento às coordenadas
|
|
Point start = new Point((int)(PontosExtremos[i].X * escala + deslocamentoX), (int)(PontosExtremos[i].Y * escala + deslocamentoY));
|
|
Point end = new Point((int)(PontosExtremos[i + 1].X * escala + deslocamentoX), (int)(PontosExtremos[i + 1].Y * escala + deslocamentoY));
|
|
|
|
graphics.DrawLine(pen, start, end);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private string AtualizarTextoStatusModulo(Enums.T_Code Disp, bool conectado, DateTime ultimoComando)
|
|
{
|
|
// Formata o texto com tabulação
|
|
return $"{Disp.ToString(), -5}\tConectado: {(conectado ? "Sim" : "Não"),-5}\tÚltimo comando: {ultimoComando:dd/MM/yyyy HH:mm:ss.fff}";
|
|
}
|
|
}
|
|
}
|