using AgroBase.Models; using AgroBase.Models.Modules; using AgroBase.Models.Operadores; 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.Globalization; using System.IO; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; namespace AgroBase.Forms.Operacoes { public partial class frmResultadosOperacao : Form { List LogsOperacao = new List(); List LogsDirecional = new List(); List LogsMovimentacao = new List(); List LogsAtuador = new List(); List LogsSensoriamento = new List(); List> LogsCam_Solo = new List>(); List pathImagensSolo = new List(); List picsCamSolo = new List(); List picsCamSoloSeg = new List(); List picsCamSoloOverlay = new List(); List LogsCam_Caminho = new List(); OperacaoModel operacaoSelecionada = new OperacaoModel(Enums.ModoOperacao.NaoDefinido); private readonly TopDownBboxView view_top_down = new TopDownBboxView(); private readonly FrontalBboxView view_frontal = new FrontalBboxView(); private readonly Bbox3DViewer view_3d = new Bbox3DViewer(); string pathImagensCaminho = ""; 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 idxValoresFiltro = new List(); 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); view_top_down.Dock = DockStyle.Fill; view_top_down.PixelsPerMeter = 120f; // ajuste fino da escala view_top_down.RangeForwardMeters = 12f; // alcance pra frente view_top_down.RangeSideMeters = 4f; // alcance lateral view_top_down.RangeBackwardMeters = 1.5f; // alcance pra trás tabTopDown.Controls.Add(view_top_down); view_frontal.Dock = DockStyle.Fill; view_frontal.PixelsPerMeter = 120f; view_frontal.RangeSideMeters = 4f; view_frontal.RangeUpMeters = 3f; view_frontal.RangeDownMeters = 0.5f; view_frontal.DepthFade = true; // esmaecer por distância X tabFrontal.Controls.Add(view_frontal); view_3d.Initialize(pnlTridimensional); } 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 async 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(File.ReadAllText(ofd.FileName)); LogsOperacao = JsonConvert.DeserializeObject(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, data.operacao)).ToList(); GPSModel pos = GPSService.UltimaLeitura.Clone(); GPSService.UltimaLeitura = LogsOperacao.FirstOrDefault().Gps; (bool sucesso, List ruas) = Variaveis.OperacaoEmAndamento.CarregarParametrizacaoOperacao(null, null, ofd.FileName.Replace("data.lgop", "operacao.opr")); bool condicaoOperacaoCarregada() => Variaveis.OperacaoEmAndamento.Trajetoria?.CorredorAtual != null; bool resultado = await FuncoesGlobais.AguardarCondicaoAsync(condicaoOperacaoCarregada, 15000, 200); GPSService.UltimaLeitura = pos; LogsDirecional = JsonConvert.DeserializeObject(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, data.dir ?? Enums.T_Code.Dir.ToString())).ToList(); LogsMovimentacao = JsonConvert.DeserializeObject(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, data.mov ?? Enums.T_Code.Mov.ToString())).ToList(); LogsAtuador = JsonConvert.DeserializeObject(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, data.atu ?? Enums.T_Code.Atu.ToString())).ToList(); LogsSensoriamento = JsonConvert.DeserializeObject(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, data.sen ?? Enums.T_Code.Sen.ToString())).ToList(); pathImagensCaminho = ofd.FileName.Replace("data.lgop", data.cam_caminho + "\\"); LogsCam_Caminho = JsonConvert.DeserializeObject>(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, data.cam_caminho ?? Enums.T_Code.Snr.ToString())).ToList(); pathImagensSolo = new List(); picsCamSolo = new List(); picsCamSoloSeg = new List(); picsCamSoloOverlay = new List(); flwCameras.Controls.Clear(); LogsCam_Solo = new List>(); foreach (string cam in data.cam_solo) { var log = JsonConvert.DeserializeObject>(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, cam)).ToList(); LogsCam_Solo.Add(log); pathImagensSolo.Add(ofd.FileName.Replace("data.lgop", cam + "\\")); PictureBox pic = new PictureBox() { Name = "picCamSolo_" + cam, Width = 250, Height = 166, SizeMode = PictureBoxSizeMode.Zoom }; PictureBox picSeg = new PictureBox() { Name = "picCamSoloSeg_" + cam, Width = 250, Height = 166, SizeMode = PictureBoxSizeMode.Zoom }; PictureBox picOverlay = new PictureBox() { Name = "picCamSoloOverlay_" + cam, Width = 250, Height = 166, SizeMode = PictureBoxSizeMode.Zoom }; flwCameras.Controls.Add(pic); flwCameras.Controls.Add(picSeg); flwCameras.Controls.Add(picOverlay); picsCamSolo.Add(pic); picsCamSoloSeg.Add(picSeg); picsCamSoloOverlay.Add(picOverlay); } Mapa = new MapasModel() { pnlMapa = pnlMapa }; MapasService.CriarArquivoMapa(new List>() { LogsOperacao.Select(x => x.Gps).ToList() }, 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(); InicializarGridsComandos(); AtualizarDadosMomento(); //double distanciaOperacao = GPSUtils.DistanciaDoTrecho(LogsOperacao.Select(x => x.Gps).ToList()); //Console.WriteLine($"Distancia Percorrida: {distanciaOperacao.ToString("0.00")} m"); } } private void InicializarGraficos() { var Momentos = LogsOperacao.Select(x => x.Momento.ToString("mm:ss:fff")).ToList(); graficoMovGeral = new GraficoInterativoModel(chartMovGeral, Momentos, new List() { 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() { 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() { 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() { 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() { new GraficoInterativoSerieModel() { Titulo = "V 3v3", Valores = LogsSensoriamento.Select(x => (double?)(x?.Sensores?.FirstOrDefault(y => y.ID.Contains("3V"))?.ValoresLeituras?.FirstOrDefault(z => z.funcao == FuncoesPinout.Tensao)?.atual?.valor) ?? 0).ToList(), Visivel = false, MostrarValor = true }, new GraficoInterativoSerieModel() { Titulo = "A 3v3", Valores = LogsSensoriamento.Select(x => (double?)(x?.Sensores?.FirstOrDefault(y => y.ID.Contains("3V"))?.ValoresLeituras?.FirstOrDefault(z => z.funcao == FuncoesPinout.Corrente)?.atual?.valor) ?? 0).ToList(), Visivel = false, MostrarValor = true }, new GraficoInterativoSerieModel() { Titulo = "V 5v0", Valores = LogsSensoriamento.Select(x => (double?)(x?.Sensores?.FirstOrDefault(y => y.ID.Contains("5V"))?.ValoresLeituras?.FirstOrDefault(z => z.funcao == FuncoesPinout.Tensao)?.atual?.valor) ?? 0).ToList(), Visivel = false, MostrarValor = true }, new GraficoInterativoSerieModel() { Titulo = "A 5v0", Valores = LogsSensoriamento.Select(x => (double?)(x?.Sensores?.FirstOrDefault(y => y.ID.Contains("5V"))?.ValoresLeituras?.FirstOrDefault(z => z.funcao == FuncoesPinout.Corrente)?.atual?.valor) ?? 0).ToList(), Visivel = false, MostrarValor = true }, new GraficoInterativoSerieModel() { Titulo = "V 7v2", Valores = LogsSensoriamento.Select(x => (double?)(x?.Sensores?.FirstOrDefault(y => y.ID.Contains("7V2"))?.ValoresLeituras?.FirstOrDefault(z => z.funcao == FuncoesPinout.Tensao)?.atual?.valor) ?? 0).ToList(), Visivel = false, MostrarValor = true }, new GraficoInterativoSerieModel() { Titulo = "A 7v2", Valores = LogsSensoriamento.Select(x => (double?)(x?.Sensores?.FirstOrDefault(y => y.ID.Contains("7V2"))?.ValoresLeituras?.FirstOrDefault(z => z.funcao == FuncoesPinout.Corrente)?.atual?.valor) ?? 0).ToList(), Visivel = false, MostrarValor = true }, new GraficoInterativoSerieModel() { Titulo = "V 12v", Valores = LogsSensoriamento.Select(x => (double?)(x?.Sensores?.FirstOrDefault(y => y.ID.Contains("12V"))?.ValoresLeituras?.FirstOrDefault(z => z.funcao == FuncoesPinout.Tensao)?.atual?.valor) ?? 0).ToList(), Visivel = true, MostrarValor = true }, new GraficoInterativoSerieModel() { Titulo = "A 12v", Valores = LogsSensoriamento.Select(x => (double?)(x?.Sensores?.FirstOrDefault(y => y.ID.Contains("12V"))?.ValoresLeituras?.FirstOrDefault(z => z.funcao == FuncoesPinout.Corrente)?.atual?.valor) ?? 0).ToList(), Visivel = true, MostrarValor = true }, new GraficoInterativoSerieModel() { Titulo = "V 24v", Valores = LogsSensoriamento.Select(x => (double?)(x?.Sensores?.FirstOrDefault(y => y.ID.Contains("24V"))?.ValoresLeituras?.FirstOrDefault(z => z.funcao == FuncoesPinout.Tensao)?.atual?.valor) ?? 0).ToList(), Visivel = true, MostrarValor = true }, new GraficoInterativoSerieModel() { Titulo = "A 24v", Valores = LogsSensoriamento.Select(x => (double?)(x?.Sensores?.FirstOrDefault(y => y.ID.Contains("24V"))?.ValoresLeituras?.FirstOrDefault(z => z.funcao == FuncoesPinout.Corrente)?.atual?.valor) ?? 0).ToList(), Visivel = true, MostrarValor = true }, new GraficoInterativoSerieModel() { Titulo = "V 36v", Valores = LogsSensoriamento.Select(x => (double?)(x?.Sensores?.FirstOrDefault(y => y.ID.Contains("36V"))?.ValoresLeituras?.FirstOrDefault(z => z.funcao == FuncoesPinout.Tensao)?.atual?.valor) ?? 0).ToList(), Visivel = true, MostrarValor = true }, new GraficoInterativoSerieModel() { Titulo = "A 36v", Valores = LogsSensoriamento.Select(x => (double?)(x?.Sensores?.FirstOrDefault(y => y.ID.Contains("36V"))?.ValoresLeituras?.FirstOrDefault(z => z.funcao == FuncoesPinout.Corrente)?.atual?.valor) ?? 0).ToList(), Visivel = true, MostrarValor = true }, new GraficoInterativoSerieModel() { Titulo = "V Bat", Valores = LogsOperacao.Select(x => (double?)(x?.Bateria?.TensaoInstantanea) ?? 0).ToList(), Visivel = true, MostrarValor = true }, new GraficoInterativoSerieModel() { Titulo = "A Bat", Valores = LogsOperacao.Select(x => (double?)(x?.Bateria?.CorrenteInstantanea) ?? 0).ToList(), Visivel = true, MostrarValor = true }, }); graficoCpu = new GraficoInterativoModel(chartCpu, Momentos, new List() { 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> agrupamento = new Dictionary>(); foreach (var log in LogsOperacao) { if (!agrupamento.Any(x => x.Key == log.Momento)) { agrupamento.Add(log.Momento, new Dictionary()); } 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( 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 seriesCamerasSolo = new List(); foreach (var camSolo in LogsCam_Solo) { string camNome = "Solo " + (LogsCam_Solo.IndexOf(camSolo) + 1); seriesCamerasSolo.AddRange(new List() { new GraficoInterativoSerieModel() { Titulo = $"{camNome} RAM %", Valores = camSolo.Select(x => (double)(x?.performance?.memoria_usada ?? 0)).ToList(), Visivel = true, MostrarValor = true }, new GraficoInterativoSerieModel() { Titulo = $"{camNome} CPU Temp", Valores = camSolo.Select(x => (double)(x?.performance?.temperatura ?? 0)).ToList(), Visivel = true, MostrarValor = true }, }); } if (LogsCam_Caminho.Any(x => x.performance != null)) { var camCaminho = LogsCam_Caminho; string camNome = "Caminho"; seriesCamerasSolo.AddRange(new List() { new GraficoInterativoSerieModel() { Titulo = $"{camNome} RAM %", Valores = camCaminho.Select(x => (double)(x?.performance?.memoria_usada ?? 0)).ToList(), Visivel = true, MostrarValor = true }, new GraficoInterativoSerieModel() { Titulo = $"{camNome} CPU Temp", Valores = camCaminho.Select(x => (double)(x?.performance?.temperatura ?? 0)).ToList(), Visivel = true, MostrarValor = true }, }); } graficoCameras = new GraficoInterativoModel(chartCameras, Momentos, seriesCamerasSolo); } private void InicializarGridsComandos() { dtComandosMov.Columns.Clear(); dtComandosMov.Columns.Add("clDirecao", "Direção"); dtComandosMov.Columns.Add("clRPMSP", "RPM SP"); dtComandosDir.Columns.Clear(); dtComandosDir.Columns.Add("clDirecao", "Direção"); dtComandosDir.Columns.Add("clAnguloSP", "Angulo SP"); dtComandosDir.Columns.Add("clTipoMovimento", "Tipo Movimento"); dtComandosAtu.Columns.Clear(); dtComandosAtu.Columns.Add("clB0", "B0"); dtComandosAtu.Columns.Add("clB1", "B1"); dtComandosAtu.Columns.Add("clB2", "B2"); dtComandosAtu.Columns.Add("clB3", "B3"); } 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().FirstOrDefault(x => x.Name.Contains("Filtro")); cmbFiltro.Items.Clear(); cmbFiltro.Items.AddRange(cmbItemsBuscaPor); ComboBox cmbComponente = gpb.Controls.OfType().FirstOrDefault(x => x.Name.Contains("Componente")); cmbComponente.Items.Clear(); cmbComponente.Items.AddRange(Componentes); cmbComponente.SelectedIndexChanged += cmbComponente_SelectedIndexChanged; Button btnRedefinir = gpb.Controls.OfType