From ab0d5966b2ca2f8a937ad5601ce07c076cbec800 Mon Sep 17 00:00:00 2001 From: Diego Freitas Date: Fri, 26 Jun 2026 17:00:49 -0300 Subject: [PATCH] ajustado novo contrato de dados para logs e parametros runtime, ainda em teste --- .../AgroBase/Forms/Atuador/frmAtuCamera.cs | 226 +- AgroBase/AgroBase/Forms/IHM/frmAjustes.cs | 8 +- .../AgroBase/Forms/IHM/frmDiagnosticos.cs | 16 +- AgroBase/AgroBase/Forms/IHM/frmDialogoMapa.cs | 114 +- AgroBase/AgroBase/Forms/IHM/frmIHM.cs | 16 +- .../AgroBase/Forms/IHM/frmInicioOperacao.cs | 10 +- .../Forms/Movimentacao/frmMovCamera.cs | 19 +- .../Forms/Operacoes/frmOperacaoManual.cs | 16 +- .../Forms/Operacoes/frmOperacaoMapaGPS.cs | 14 +- .../Forms/Operacoes/frmResultadosOperacao.cs | 1187 ++--- .../Forms/Sensoriamento/frmSenCamera.cs | 43 +- .../Forms/Sensoriamento/frmSenConfig.cs | 2 +- .../Forms/Simuladores/frmSimulacaoMapaGPS.cs | 29 +- .../Forms/Simuladores/frmTreinamentoIA.cs | 12 +- AgroBase/AgroBase/Forms/frmAcompanhamento.cs | 2 +- AgroBase/AgroBase/Forms/frmDiagnosticos.cs | 3 +- AgroBase/AgroBase/Forms/frmGPS.cs | 6 +- AgroBase/AgroBase/Forms/frmLoraConfig.cs | 20 +- AgroBase/AgroBase/Forms/frmPinout.cs | 10 +- AgroBase/AgroBase/Forms/frmPrincipal.cs | 20 +- AgroBase/AgroBase/Models/AlarmeModel.cs | 7 +- .../AgroBase/Models/CameraCaminhoModel.cs | 294 -- AgroBase/AgroBase/Models/CameraModel.cs | 3 +- AgroBase/AgroBase/Models/CameraSoloModel.cs | 70 - AgroBase/AgroBase/Models/DalyBMSModel.cs | 3 +- AgroBase/AgroBase/Models/DispositivosModel.cs | 12 +- AgroBase/AgroBase/Models/GPSModel.cs | 1 - AgroBase/AgroBase/Models/GeneralJoystick.cs | 277 +- .../AgroBase/Models/GraficoInterativoModel.cs | 2 +- AgroBase/AgroBase/Models/MPCController.cs | 8 +- .../Models/MPCControllerAprimorado.cs | 22 +- AgroBase/AgroBase/Models/MapaDinamicoModel.cs | 4 +- AgroBase/AgroBase/Models/MapasModel.cs | 7 +- .../AgroBase/Models/Modules/AtuadorModel.cs | 577 +-- .../Models/Modules/DirecionalModel.cs | 14 +- .../AgroBase/Models/Modules/ModuloIMUModel.cs | 2 + .../Models/Modules/MovimentacaoModel.cs | 25 +- .../Modules/MovimentacaoUnificadoModel.cs | 85 +- .../Models/Modules/SensoriamentoModel.cs | 357 +- .../Models/Operacoes/OperacaoModel.cs | 3845 +++++++++++------ .../Operacoes/OperacaoParametrosModel.cs | 333 +- .../Models/Operadores/HealthWorkerModel.cs | 6 + .../Models/Operadores/ManagerWorkerModel.cs | 2 - .../Models/Operadores/VisualWorkerModel.cs | 34 +- .../Models/Operadores/WeedWorkerModel.cs | 174 +- AgroBase/AgroBase/Models/PerformanceModel.cs | 1 - AgroBase/AgroBase/Models/SonarModel.cs | 4 +- .../Models/TrajetoriaMapaOperacaoModel.cs | 138 +- AgroBase/AgroBase/Models/Variaveis.cs | 52 +- .../AgroBase/Services/AudioAlertaService.cs | 4 +- .../AgroBase/Services/CANServiceSerial.cs | 2 +- .../AgroBase/Services/CANServiceWaveshare.cs | 2 +- AgroBase/AgroBase/Services/CameraService.cs | 115 - .../AgroBase/Services/CanServiceEthernet.cs | 2 +- .../Services/CoulombCounterService.cs | 2 +- AgroBase/AgroBase/Services/DalyBMSService.cs | 232 +- AgroBase/AgroBase/Services/GPSService.cs | 340 +- .../Services/HerbicideCounterService.cs | 18 +- AgroBase/AgroBase/Services/KinectService.cs | 4 +- AgroBase/AgroBase/Services/LoRaEspService.cs | 16 +- AgroBase/AgroBase/Services/LoRaSerializer.cs | 12 +- .../AgroBase/Services/MKS057DCanService.cs | 21 +- AgroBase/AgroBase/Services/OIDCanService.cs | 52 +- .../Operadores/CameraWorkerService.cs | 103 +- .../Operadores/HealthWorkerService.cs | 125 +- .../Operadores/ManagerWorkerService.cs | 24 +- .../Services/Operadores/OperadoresService.cs | 16 +- .../Operadores/VisualWorkerService.cs | 70 +- .../Services/Operadores/WeedWorkerService.cs | 88 +- AgroBase/AgroBase/Services/RedisService.cs | 9 +- AgroBase/AgroBase/Services/SerialService.cs | 212 +- AgroBase/AgroBase/Services/SonarService.cs | 2 +- AgroBase/AgroBase/Services/SyncDataService.cs | 2 +- .../AgroBase/Services/VersionamentoService.cs | 3 +- .../Scripts/workers/health_worker/main.py | 4 +- 75 files changed, 4507 insertions(+), 5105 deletions(-) delete mode 100644 AgroBase/AgroBase/Models/CameraCaminhoModel.cs delete mode 100644 AgroBase/AgroBase/Models/CameraSoloModel.cs delete mode 100644 AgroBase/AgroBase/Services/CameraService.cs diff --git a/AgroBase/AgroBase/Forms/Atuador/frmAtuCamera.cs b/AgroBase/AgroBase/Forms/Atuador/frmAtuCamera.cs index 2dde03e43..819569ae9 100644 --- a/AgroBase/AgroBase/Forms/Atuador/frmAtuCamera.cs +++ b/AgroBase/AgroBase/Forms/Atuador/frmAtuCamera.cs @@ -15,7 +15,7 @@ namespace AgroBase.Forms { public partial class frmAtuCamera : Form { - private CameraSoloModel cameraSolo = new CameraSoloModel(); + //private CameraSoloModel cameraSolo = new CameraSoloModel(); private AsyncTaskTimerModel tmrLeitura; public frmAtuCamera() @@ -25,21 +25,21 @@ namespace AgroBase.Forms private void frmCamera_Load(object sender, EventArgs e) { - cameraSolo = new CameraSoloModel() - { - Nome = "T", - Posicao = CameraWorkerService.CamerasSolo.Count(), - ArquivoLeitura = "ervas_T.json", - browser = null, - camera = new CameraService(), - DeviceID = "", - combo = cmbCameras, - MaxLeituras = 10, - VideoPorta = "", //(VariaveisPortas.CameraSolo + Variaveis.OperacaoEmAndamento.DispSen.Dados.CamerasSolo.Count()).ToString(), - VideoUrl = "green_objects_T", - MqttTopico = "green_objects_T", - panel = pnlCamera, - }; + //cameraSolo = new CameraSoloModel() + //{ + // Nome = "T", + // Posicao = CameraWorkerService.CamerasSolo.Count(), + // ArquivoLeitura = "ervas_T.json", + // browser = null, + // camera = new CameraService(), + // DeviceID = "", + // combo = cmbCameras, + // MaxLeituras = 10, + // VideoPorta = "", //(VariaveisPortas.CameraSolo + Variaveis.OperacaoEmAndamento.DispSen.Dados.CamerasSolo.Count()).ToString(), + // VideoUrl = "green_objects_T", + // MqttTopico = "green_objects_T", + // panel = pnlCamera, + //}; AtualizaListaCameras(); } @@ -47,8 +47,8 @@ namespace AgroBase.Forms { try { - cameraSolo.camera.pythonProcess?.Kill(); - Variaveis.MqttServiceLocal.UnsubscribeAsync(cameraSolo.camera._mqttTopico).ConfigureAwait(false); + //cameraSolo.camera.pythonProcess?.Kill(); + //Variaveis.MqttServiceLocal.UnsubscribeAsync(cameraSolo.camera._mqttTopico).ConfigureAwait(false); } catch (Exception ex) { @@ -77,7 +77,7 @@ namespace AgroBase.Forms else { btnSalvar.Text = "Editar"; - cameraSolo.camera.cameraIndex = cmbCameras.SelectedIndex; + //cameraSolo.camera.cameraIndex = cmbCameras.SelectedIndex; } btnIniciar.Enabled = btnSalvar.Text == "Editar" && cmbCameras.SelectedIndex > 0; cmbCameras.Enabled = btnSalvar.Text == "Salvar"; @@ -88,94 +88,94 @@ namespace AgroBase.Forms VersaoArquivoModel ArquivoVersao = VersionamentoService.ArquivoModeloWeedDetector; string CamNome = "Cam_Solo_0"; - CameraSoloModel CameraSolo = new CameraSoloModel() - { - ID = "S0", - Nome = CamNome, - Posicao = 0, - ArquivoLeitura = "ervas_" + CamNome + ".json", - browser = null, - camera = new CameraService(), - DeviceID = "123", - combo = new ComboBox(), - MaxLeituras = 1, - VideoPorta = "", // (VariaveisPortas.CameraSolo + 0).ToString(), - VideoUrl = "green_objects_" + CamNome, - MqttTopico = "green_objects_" + CamNome, - }; - CameraSolo.panel = pnlCamera; - CameraSolo.camera.cameraIndex = 1; - IniciarCameraSolo(CameraSolo); + //CameraSoloModel CameraSolo = new CameraSoloModel() + //{ + // ID = "S0", + // Nome = CamNome, + // Posicao = 0, + // ArquivoLeitura = "ervas_" + CamNome + ".json", + // browser = null, + // camera = new CameraService(), + // DeviceID = "123", + // combo = new ComboBox(), + // MaxLeituras = 1, + // VideoPorta = "", // (VariaveisPortas.CameraSolo + 0).ToString(), + // VideoUrl = "green_objects_" + CamNome, + // MqttTopico = "green_objects_" + CamNome, + //}; + //CameraSolo.panel = pnlCamera; + //CameraSolo.camera.cameraIndex = 1; + //IniciarCameraSolo(CameraSolo); tmrLeitura = new AsyncTaskTimerModel("tmrLeitura", tmrLeitura_Tick, 200); tmrLeitura.Start(); } - public void IniciarCameraSolo(CameraSoloModel CameraSolo) - { - CameraSolo.DesligarCamera(); - - if (CameraSolo.camera.cameraIndex > 0) - { - VersaoArquivoModel ArquivoVersao = VersionamentoService.ArquivoModeloWeedDetector; - - //CameraSolo.IniciarRotinaProcesso(); - - CameraSolo.camera.IniciarCamera( - "", //Variaveis.OperacaoEmAndamento.DispAtu.Dados.ScriptDeteccaoErvas, - new string[] { - CameraSolo.MaxLeituras.ToString(), - CameraSolo.VideoPorta, - CameraSolo.VideoUrl, - CameraSolo.ArquivoLeitura, - "0", - CameraSolo.MqttTopico, - ArquivoVersao.Diretorio, - ArquivoVersao.Versao, - }, - CameraSolo.VideoPorta, - new List() { CameraSolo.VideoUrl }, - CameraSolo.MqttTopico, - async (Mensagem) => - { - if (Mensagem.Momento > CameraSolo.camera.IniciadoEm && Mensagem.Mensagem == "OK") - { - CameraSolo.camera.ProntoEm = Mensagem.Momento; - - if (CameraSolo.browser == null) - { - CameraSolo.Iniciada = true; - CameraSolo.browser = new WebView2(); - CameraSolo.browser.Source = new Uri(CameraSolo.camera.URLcamera[0]); - CameraSolo.browser.Dock = DockStyle.Fill; - - CameraSolo.panel.Invoke(new Action(() => - { - CameraSolo.panel.Controls.Add(CameraSolo.browser); - CameraSolo.panel.Refresh(); - })); - } - } - } - ); - } - else - { - Console.Write("Camera " + CameraSolo.Nome + " não foi configurada!"); - } - } + //public void IniciarCameraSolo(CameraSoloModel CameraSolo) + //{ + // CameraSolo.DesligarCamera(); + // + // if (CameraSolo.camera.cameraIndex > 0) + // { + // VersaoArquivoModel ArquivoVersao = VersionamentoService.ArquivoModeloWeedDetector; + // + // //CameraSolo.IniciarRotinaProcesso(); + // + // CameraSolo.camera.IniciarCamera( + // "", //Variaveis.OperacaoEmAndamento.DispAtu.Dados.ScriptDeteccaoErvas, + // new string[] { + // CameraSolo.MaxLeituras.ToString(), + // CameraSolo.VideoPorta, + // CameraSolo.VideoUrl, + // CameraSolo.ArquivoLeitura, + // "0", + // CameraSolo.MqttTopico, + // ArquivoVersao.Diretorio, + // ArquivoVersao.Versao, + // }, + // CameraSolo.VideoPorta, + // new List() { CameraSolo.VideoUrl }, + // CameraSolo.MqttTopico, + // async (Mensagem) => + // { + // if (Mensagem.Momento > CameraSolo.camera.IniciadoEm && Mensagem.Mensagem == "OK") + // { + // CameraSolo.camera.ProntoEm = Mensagem.Momento; + // + // if (CameraSolo.browser == null) + // { + // CameraSolo.Iniciada = true; + // CameraSolo.browser = new WebView2(); + // CameraSolo.browser.Source = new Uri(CameraSolo.camera.URLcamera[0]); + // CameraSolo.browser.Dock = DockStyle.Fill; + // + // CameraSolo.panel.Invoke(new Action(() => + // { + // CameraSolo.panel.Controls.Add(CameraSolo.browser); + // CameraSolo.panel.Refresh(); + // })); + // } + // } + // } + // ); + // } + // else + // { + // Console.Write("Camera " + CameraSolo.Nome + " não foi configurada!"); + // } + //} private void AtualizaListaCameras() { - cameraSolo.camera.cameraIndex = cmbCameras.SelectedIndex > 0 ? cmbCameras.SelectedIndex : 0; + //cameraSolo.camera.cameraIndex = cmbCameras.SelectedIndex > 0 ? cmbCameras.SelectedIndex : 0; cmbCameras.Items.Clear(); - cmbCameras.Items.AddRange(CameraService.ObterListaCameras().Keys.ToArray()); + cmbCameras.Items.AddRange(CameraWorkerService.ListaCameras.Select(x => x.mx_id).ToArray()); if (cmbCameras.Items.Count == 1) { - cameraSolo.camera.cameraIndex = 0; + //cameraSolo.camera.cameraIndex = 0; } - cmbCameras.SelectedIndex = cameraSolo.camera.cameraIndex; + //cmbCameras.SelectedIndex = cameraSolo.camera.cameraIndex; } private void ListarObjetosDetectados() @@ -184,27 +184,27 @@ namespace AgroBase.Forms int i = 0; //var coordenadas = cameraService.AferirDadosCamera(); - var MqttTopico = Variaveis.MqttServiceLocal.Topicos.FirstOrDefault(x => x.Topico == cameraSolo.MqttTopico); - - if (MqttTopico == null) - { - return; - } + //var MqttTopico = Variaveis.MqttServiceLocal.Topicos.FirstOrDefault(x => x.Topico == cameraSolo.MqttTopico); + // + //if (MqttTopico == null) + //{ + // return; + //} CameraCoordenadasFrameModel leitura = null; - List msgs = new List(MqttTopico.Mensagens); - var Mensagem = msgs.LastOrDefault(x => x.Momento > cameraSolo.camera.IniciadoEm); - if (msgs.Count() > 1 && Mensagem != null) - { - try - { - leitura = JsonConvert.DeserializeObject(Mensagem.Mensagem); - } - catch - { - - } - } + //List msgs = new List(MqttTopico.Mensagens); + //var Mensagem = msgs.LastOrDefault(x => x.Momento > cameraSolo.camera.IniciadoEm); + //if (msgs.Count() > 1 && Mensagem != null) + //{ + // try + // { + // leitura = JsonConvert.DeserializeObject(Mensagem.Mensagem); + // } + // catch + // { + // + // } + //} if (leitura != null) { diff --git a/AgroBase/AgroBase/Forms/IHM/frmAjustes.cs b/AgroBase/AgroBase/Forms/IHM/frmAjustes.cs index efa95e96d..9dd2b6b96 100644 --- a/AgroBase/AgroBase/Forms/IHM/frmAjustes.cs +++ b/AgroBase/AgroBase/Forms/IHM/frmAjustes.cs @@ -246,10 +246,10 @@ namespace AgroBase.Forms.IHM private async void cmbComunicacao_SelectedIndexChanged(object sender, EventArgs e) { - if (Variaveis.LoraService.Iniciado) - { - await AtualizarParametrosLoRa(); - } + //if (Variaveis.LoraService.Iniciado) + //{ + // await AtualizarParametrosLoRa(); + //} } #endregion diff --git a/AgroBase/AgroBase/Forms/IHM/frmDiagnosticos.cs b/AgroBase/AgroBase/Forms/IHM/frmDiagnosticos.cs index 23a5c1422..0a8e53713 100644 --- a/AgroBase/AgroBase/Forms/IHM/frmDiagnosticos.cs +++ b/AgroBase/AgroBase/Forms/IHM/frmDiagnosticos.cs @@ -236,7 +236,7 @@ namespace AgroBase.Forms.IHM PreencherDadosDiagnosticoSinaleiros(Diagnosticos.FirstOrDefault(x => x.Modulo == T_Code.Sen)); PreencherDadosDiagnosticoReles(Diagnosticos.FirstOrDefault(x => x.Modulo == T_Code.Mks)); PreencherDadosTabelaResultado(dgResultados); - OperacaoModel.PopularTreeView(tvwFalhas, HealthWorkerService.ModulosSaude); + OperacaoModel.PopularTreeView(tvwFalhas, Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorSaude.ModulosSaude); } private async Task IniciarDiagnostico(int idx) @@ -245,7 +245,7 @@ namespace AgroBase.Forms.IHM if (idx == 9) { - OperacaoModel.PopularTreeView(tvwFalhas, HealthWorkerService.ModulosSaude); + OperacaoModel.PopularTreeView(tvwFalhas, Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorSaude.ModulosSaude); return true; } @@ -1388,24 +1388,24 @@ namespace AgroBase.Forms.IHM bool Conectado = SerialService.DispositivosMapeados.Any(x => x.Dispositivo == T_Code.Lra); idx = PreencheDadosLinha(grid, Testes, idx, Conectado ? 1 : 0); - bool Inicializado = Variaveis.LoraService.Iniciado; + bool Inicializado = false; // Variaveis.LoraService.Iniciado; idx = PreencheDadosLinha(grid, Testes, idx, Inicializado ? 1 : 0); bool sucesso = false; if (Inicializado) { - (bool _sucesso, LoRaParametrosModel parametros) = await Variaveis.LoraService.RequisitarParametrosModulo(); - sucesso = _sucesso; + //(bool _sucesso, LoRaParametrosModel parametros) = await Variaveis.LoraService.RequisitarParametrosModulo(); + //sucesso = _sucesso; } - bool Parametrizado = Inicializado && sucesso && Variaveis.LoraService.ParametrosGet != null; + bool Parametrizado = false; // Inicializado && sucesso && Variaveis.LoraService.ParametrosGet != null; idx = PreencheDadosLinha(grid, Testes, idx, Parametrizado ? 1 : 0); bool MensagemEnviada = false; if (Inicializado) { //int msgEnviadasAnterior = LoRaBaseService.MensagensEnviadas; - Variaveis.LoraService.EnviarDadosParaBase(); + //Variaveis.LoraService.EnviarDadosParaBase(); await Task.Delay(2000); MensagemEnviada = true; //LoRaBaseService.MensagensEnviadas > msgEnviadasAnterior; } @@ -1506,7 +1506,7 @@ namespace AgroBase.Forms.IHM var grid = Diagnostico.grid; var Testes = Diagnostico.Testes; - List CamerasIDs = CameraService.ObterListaCameras().Values.ToList(); + List CamerasIDs = CameraWorkerService.ListaCameras.Select(x => x.mx_id).ToList(); string IDcamRua = CameraWorkerService.CameraCaminho.Id;//.Replace("\\", "#").ToLower(); diff --git a/AgroBase/AgroBase/Forms/IHM/frmDialogoMapa.cs b/AgroBase/AgroBase/Forms/IHM/frmDialogoMapa.cs index 089a20cc8..3c7a1384e 100644 --- a/AgroBase/AgroBase/Forms/IHM/frmDialogoMapa.cs +++ b/AgroBase/AgroBase/Forms/IHM/frmDialogoMapa.cs @@ -61,7 +61,8 @@ namespace AgroBase.Forms.IHM FuncoesGlobais.DefinirEventosPicBtn(picFechar, "", async () => { - if (Variaveis.OperacaoEmAndamento.Iniciado && !Variaveis.OperacaoEmAndamento.Finalizando) + var op = Variaveis.OperacaoEmAndamento; + if (op.Sensoriamento.Operacao.OperacaoIniciada && !op.Sensoriamento.Operacao.Finalizando) { var res = CustomDialog.ShowDialog( "Interromper Operação", @@ -75,8 +76,8 @@ namespace AgroBase.Forms.IHM ); if (res == DialogResult.Yes) { - Task.Run(async () => await Variaveis.OperacaoEmAndamento.FinalizarOperacao()); - if (Variaveis.OperacaoEmAndamento.Parametros?.Modo == Enums.ModoOperacao.Manual) + Task.Run(async () => await op.FinalizarOperacao()); + if (op.Parametros?.Modo == ModoOperacao.Manual) { this.Close(); } @@ -84,7 +85,7 @@ namespace AgroBase.Forms.IHM } else { - if (Variaveis.OperacaoEmAndamento.StatusAtual == Enums.StatusOperacao.Parametrizando) + if (op.Sensoriamento.Operacao.StatusOperacaoAtual == StatusOperacao.Parametrizando) { this.Hide(); } @@ -98,18 +99,19 @@ namespace AgroBase.Forms.IHM private void frmDialogoMapa_Load(object sender, EventArgs e) { + var op = Variaveis.OperacaoEmAndamento; tmrLeitura?.Dispose(); tmrLeitura = new AsyncTaskTimerModel("tmrLeitura", tmrLeitura_Tick, 500, this); tmrLeitura.Start(); - if (Variaveis.OperacaoEmAndamento.Mapa.pnlMapa == null) + if (op.Mapa.pnlMapa == null) { - Variaveis.OperacaoEmAndamento.Mapa = new MapasModel() + op.Mapa = new MapasModel() { pnlMapa = pnlMapa, lblMapa = lblMapaCarregado }; - Variaveis.OperacaoEmAndamento.Mapa.CarregarMapaGPS(); + op.Mapa.CarregarMapaGPS(); } } @@ -136,8 +138,9 @@ namespace AgroBase.Forms.IHM public void AtualizarMapaDinamico() { - var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento; - var _Trajetoria = Variaveis.OperacaoEmAndamento.Trajetoria; + var op = Variaveis.OperacaoEmAndamento; + var _Sensoriamento = op.Sensoriamento; + var _Trajetoria = op.Trajetoria; if (_Trajetoria != null && _Trajetoria.CorredorAtual != null) { @@ -148,9 +151,9 @@ namespace AgroBase.Forms.IHM _Sensoriamento.Gps, _Trajetoria._TrajetoriaDinamica, _Trajetoria.CorredorAtual.Pontos, - Variaveis.OperacaoEmAndamento.GPSTrajetoria, + op.GPSTrajetoria, _Trajetoria.RuasPlantacao, - _Sensoriamento.Controle.SimulacaoMPC + op.Controle.SimulacaoMPC ); } } @@ -160,25 +163,26 @@ namespace AgroBase.Forms.IHM pnlOrientacao.Invalidate(); pnlInclinacao.Invalidate(); - var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento; + var op = Variaveis.OperacaoEmAndamento; + var _Sensoriamento = op.Sensoriamento; lblUltimaLeituraSolo.Text = "Última Leitura Solo: " + _Sensoriamento.OperadorErvas.UltimaMensagem.ToString("HH:mm:ss.fff"); lblUltimaLeituraCaminho.Text = "Última Leitura Caminho: " + _Sensoriamento.OperadorVisual.UltimaMensagem.ToString("HH:mm:ss.fff"); lblPerformance.Text = _Sensoriamento.DadosPerformance.PerformanceStr; - lblMapaCarregado.Text = "Operação: " + Variaveis.OperacaoEmAndamento.Descricao; + lblMapaCarregado.Text = "Operação: " + op.Descricao; - txtModoOperacao.Text = (Variaveis.OperacaoEmAndamento.Parametros?.Modo ?? ModoOperacao.NaoDefinido).ToString(); - bool opLiberada = _Sensoriamento.OperacaoLiberada; + txtModoOperacao.Text = (op.Parametros?.Modo ?? ModoOperacao.NaoDefinido).ToString(); + bool opLiberada = _Sensoriamento.Operacao.OperacaoLiberada; txtOperacaoLiberada.Text = opLiberada ? "Sim" : "Não"; txtOperacaoLiberada.ForeColor = opLiberada ? Color.Black : Color.Red; btnCodFalha.Text = CodigoFalha.ToString("0.000"); - txtStatusAtual.Text = _Sensoriamento.StatusOperacao.ToString(); - txtIniciadoEm.Text = _Sensoriamento.DataInicio == DateTime.MinValue ? "Aguardando" : _Sensoriamento.DataInicio.ToString("dd/MM HH:mm:ss"); - txtConcluidoEm.Text = _Sensoriamento.DataFim == DateTime.MinValue ? "-" : _Sensoriamento.DataFim.ToString("dd/MM HH:mm:ss"); + txtStatusAtual.Text = _Sensoriamento.Operacao.StatusOperacaoAtual.ToString(); + txtIniciadoEm.Text = _Sensoriamento.Operacao.DataInicio == DateTime.MinValue ? "Aguardando" : _Sensoriamento.Operacao.DataInicio.ToString("dd/MM HH:mm:ss"); + txtConcluidoEm.Text = _Sensoriamento.Operacao.DataFim == DateTime.MinValue ? "-" : _Sensoriamento.Operacao.DataFim.ToString("dd/MM HH:mm:ss"); txtDistanciaPercorrida.Text = _Sensoriamento.Trajetoria.DistanciaPercorrida.ToString("0.00") + " m"; - txtTempoOperacao.Text = _Sensoriamento.TempoDecorrido.ToString("HH:mm:ss"); - txtLatenciaControle.Text = _Sensoriamento.Controle.Latencia.ToString(); + txtTempoOperacao.Text = _Sensoriamento.Operacao.TempoDecorrido.ToString("HH:mm:ss"); + txtLatenciaControle.Text = op.Controle.Latencia.ToString(); txtHerbicidaAplicado.Text = _Sensoriamento.Atuador.HerbicidaConsumido.ToString("0.000") + " L"; txtBateriaConsumida.Text = _Sensoriamento.Bateria.PercentualBateriaConsumida.ToString("0.00") + " %"; @@ -197,38 +201,38 @@ namespace AgroBase.Forms.IHM lblCorrecaoGPS.Text = (_Sensoriamento.Gps.Ntrip_ativado ? "N " : "B ") + _Sensoriamento.Gps.IdadeCorrecao + ": " + _Sensoriamento.Gps.QualidadeFix.ToString(); lblPrecisaoGPS.Text = $"Precisão: {_Sensoriamento.Gps.PrecisaoCm.ToString("0.00")} cm"; - bool automatico = Variaveis.OperacaoEmAndamento.Parametros?.ControleAutomatico ?? false; + bool automatico = op.Parametros?.ControleAutomatico ?? false; cmbModoControle.Enabled = !automatico; tkbVelocidade.Enabled = !automatico; tkbAnguloDirecional.Enabled = !automatico; pnlFreio.Enabled = !automatico; if (automatico) { - cmbModoControle.SelectedIndex = (int)_Sensoriamento.Controle.TipoMovimento; + cmbModoControle.SelectedIndex = (int)op.Controle.TipoMovimento; - tkbVelocidade.Value = Convert.ToInt32(_Sensoriamento.Controle.PercentualVelocidadeSP); + tkbVelocidade.Value = Convert.ToInt32(op.Controle.PercentualVelocidadeSP); tkbAnguloDirecional.Minimum = 0; - tkbAnguloDirecional.Maximum = Convert.ToInt32(Variaveis.OperacaoEmAndamento.Parametros.Controle.DirAnguloMaximo); - tkbAnguloDirecional.Value = Math.Abs(Convert.ToInt32(_Sensoriamento.Controle.Angulo)); + tkbAnguloDirecional.Maximum = Convert.ToInt32(op.Parametros.Controle.DirAnguloMaximo); + tkbAnguloDirecional.Value = Math.Abs(Convert.ToInt32(op.Controle.Angulo)); } - txtDistanciasEsqDir.Text = _Sensoriamento.Trajetoria.DistanciaEsquerda.ToString("0.00") + " / " + _Sensoriamento.Trajetoria.DistanciaDireita.ToString("0.00") + " (" + _Sensoriamento.Controle.ErroLateral.ToString("0.00" + ")"); + txtDistanciasEsqDir.Text = _Sensoriamento.Trajetoria.DistanciaEsquerda.ToString("0.00") + " / " + _Sensoriamento.Trajetoria.DistanciaDireita.ToString("0.00") + " (" + op.Controle.ErroLateral.ToString("0.00" + ")"); txtDentroCorredor.Text = _Sensoriamento.Trajetoria.CorredorAtual.Dentro ? "Sim" : "Não"; txtMargemCorredor.Text = _Sensoriamento.Trajetoria.NaMargemDoCorredor ? "Sim" : "Não"; txtStatusCarro.Text = _Sensoriamento.Trajetoria.StatusCarro.ToString(); txtInclinacao.Text = _Sensoriamento.IMU.RollSeguro.ToString("0.00") + "/" + _Sensoriamento.IMU.PitchSeguro.ToString("0.00"); - var ModET = Variaveis.OperacaoEmAndamento.DispMvd.Dados.Modulos.FirstOrDefault(x => x.Modulo_ID == "ET"); + var ModET = op.DispMvd.Dados.Modulos.FirstOrDefault(x => x.Modulo_ID == "ET"); txtET.Text = (ModET?.MovMotor?.Corrente_Motor ?? 0).ToString("0.00"); lblET.ForeColor = (ModET?.Conectado ?? false) ? Color.Green : Color.Red; - var ModDT = Variaveis.OperacaoEmAndamento.DispMvd.Dados.Modulos.FirstOrDefault(x => x.Modulo_ID == "DT"); + var ModDT = op.DispMvd.Dados.Modulos.FirstOrDefault(x => x.Modulo_ID == "DT"); txtDT.Text = (ModDT?.MovMotor?.Corrente_Motor ?? 0).ToString("0.00"); lblDT.ForeColor = (ModDT?.Conectado ?? false) ? Color.Green : Color.Red; - var ModEF = Variaveis.OperacaoEmAndamento.DispMvd.Dados.Modulos.FirstOrDefault(x => x.Modulo_ID == "EF"); + var ModEF = op.DispMvd.Dados.Modulos.FirstOrDefault(x => x.Modulo_ID == "EF"); txtEF.Text = (ModEF?.MovMotor?.Corrente_Motor ?? 0).ToString("0.00"); lblEF.ForeColor = (ModEF?.Conectado ?? false) ? Color.Green : Color.Red; - var ModDF = Variaveis.OperacaoEmAndamento.DispMvd.Dados.Modulos.FirstOrDefault(x => x.Modulo_ID == "DF"); + var ModDF = op.DispMvd.Dados.Modulos.FirstOrDefault(x => x.Modulo_ID == "DF"); txtDF.Text = (ModDF?.MovMotor?.Corrente_Motor ?? 0).ToString("0.00"); lblDF.ForeColor = (ModDF?.Conectado ?? false) ? Color.Green : Color.Red; @@ -291,19 +295,21 @@ namespace AgroBase.Forms.IHM private void pnlOrientacao_Paint(object sender, PaintEventArgs e) { + var op = Variaveis.OperacaoEmAndamento; try { - double angulo = Variaveis.OperacaoEmAndamento.Sensoriamento?.Gps?.AnguloCarroDefinido ?? 0; - FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)angulo, 90, (float)(Variaveis.OperacaoEmAndamento.Sensoriamento?.Trajetoria?.AnguloCaminho ?? 0)); + double angulo = op.Sensoriamento?.Gps?.AnguloCarroDefinido ?? 0; + FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)angulo, 90, (float)(op.Sensoriamento?.Trajetoria?.AnguloCaminho ?? 0)); } catch { } } private void pnlInclinacao_Paint(object sender, PaintEventArgs e) { + var op = Variaveis.OperacaoEmAndamento; try { - FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)(Variaveis.OperacaoEmAndamento.Controle.Angulo), 90); + FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)(op.Controle.Angulo), 90); } catch { } } @@ -326,14 +332,16 @@ namespace AgroBase.Forms.IHM private void AtualizarElementosModoManual() { + var op = Variaveis.OperacaoEmAndamento; + cmbModoControle.Enabled = false; tkbAnguloDirecional.Enabled = false; tkbVelocidade.Enabled = false; pnlJoystick.Visible = false; tabControl1.TabPages.Remove(tabControle); - var pControle = Variaveis.OperacaoEmAndamento.Parametros.Controle; - var _Controle = Variaveis.OperacaoEmAndamento.Controle; + var pControle = op.Parametros.Controle; + var _Controle = op.Controle; cmbModoControle.SelectedIndex = (int)_Controle.TipoMovimento; chbFrenagemAutomatica.Checked = pControle.FrenagemAutomaticaAoParar; nudVelSemErvas.Value = (int)pControle.MovVelocidadeSErvasPercent; @@ -473,6 +481,8 @@ namespace AgroBase.Forms.IHM private void SendMovementCommand(int deltaX, int deltaY) { + var op = Variaveis.OperacaoEmAndamento; + Keys MovKey = Keys.Escape; if (deltaY < -10) MovKey = Keys.Up; else if (deltaY > 10) MovKey = Keys.Down; @@ -488,7 +498,7 @@ namespace AgroBase.Forms.IHM Console.WriteLine($"Movimento: MovKey={MovKey}"); //GeneralJoystick.EnviaComandoMotor(MovKey, Enums.T_Code.Mov); var comando = GeneralJoystick.DeParaComandos.FirstOrDefault(x => x.key == MovKey); - GeneralJoystick.ProcessarDadosControle(comando.botaoJoy, false, valorDesejado: Variaveis.OperacaoEmAndamento.Parametros.Controle.MovVelocidadeCErvasPercent); + GeneralJoystick.ProcessarDadosControle(comando.botaoJoy, false, valorDesejado: op.Parametros.Controle.MovVelocidadeCErvasPercent); prevMovKey = MovKey; // Atualiza o estado anterior } @@ -499,7 +509,7 @@ namespace AgroBase.Forms.IHM Console.WriteLine($"Direção: DirKey={DirKey}"); //GeneralJoystick.EnviaComandoMotor(DirKey, Enums.T_Code.Dir); var comando = GeneralJoystick.DeParaComandos.FirstOrDefault(x => x.key == DirKey); - GeneralJoystick.ProcessarDadosControle(comando.botaoJoy, false, valorDesejado: Variaveis.OperacaoEmAndamento.Parametros.Controle.DirAnguloMaximo); + GeneralJoystick.ProcessarDadosControle(comando.botaoJoy, false, valorDesejado: op.Parametros.Controle.DirAnguloMaximo); prevDirKey = DirKey; // Atualiza o estado anterior } } @@ -526,7 +536,8 @@ namespace AgroBase.Forms.IHM // Iniciar o arraste private void BrakePanel_MouseDown(object sender, MouseEventArgs e) { - if (Variaveis.OperacaoEmAndamento.Parametros?.Modo != Enums.ModoOperacao.Manual) + var op = Variaveis.OperacaoEmAndamento; + if (op.Parametros?.Modo != Enums.ModoOperacao.Manual) { return; } @@ -540,7 +551,8 @@ namespace AgroBase.Forms.IHM // Movimentar o botão de freio private void BrakePanel_MouseMove(object sender, MouseEventArgs e) { - if (Variaveis.OperacaoEmAndamento.Parametros?.Modo != Enums.ModoOperacao.Manual) + var op = Variaveis.OperacaoEmAndamento; + if (op.Parametros?.Modo != Enums.ModoOperacao.Manual) { return; } @@ -582,7 +594,8 @@ namespace AgroBase.Forms.IHM // Soltar o botão de freio private void BrakePanel_MouseUp(object sender, MouseEventArgs e) { - if (Variaveis.OperacaoEmAndamento.Parametros?.Modo != Enums.ModoOperacao.Manual) + var op = Variaveis.OperacaoEmAndamento; + if (op.Parametros?.Modo != Enums.ModoOperacao.Manual) { return; } @@ -634,7 +647,7 @@ namespace AgroBase.Forms.IHM private void btnCodFalha_Click(object sender, EventArgs e) { - string DescricaoFalha = Variaveis.OperacaoEmAndamento.ErroOperacaoLiberada; + string DescricaoFalha = Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.ErroOperacaoLiberada; CustomDialog.ShowDialog( "Código de Falha", $"{DescricaoFalha}", @@ -670,14 +683,16 @@ namespace AgroBase.Forms.IHM private void AtualizarListaModulos(bool forceRebuild = false) { + var op = Variaveis.OperacaoEmAndamento; + if (_inRefresh) return; _inRefresh = true; try { // 1) Pega o estado atual do seu sistema - var src = Variaveis.OperacaoEmAndamento.Parametros.ModulosMandatorios; - var saude = HealthWorkerService.ModulosSaude; + var src = op.Parametros.ModulosMandatorios; + var saude = op.Sensoriamento.OperadorSaude.ModulosSaude; // 2) Constrói snapshot var novos = new List(src.Count); @@ -795,6 +810,7 @@ namespace AgroBase.Forms.IHM private void clbModulos_ItemCheck(object sender, ItemCheckEventArgs e) { + var op = Variaveis.OperacaoEmAndamento; if (_inRefresh) return; // evita loop quando sincronizamos via código var idx = e.Index; @@ -808,7 +824,7 @@ namespace AgroBase.Forms.IHM // escreve de volta na fonte oficial var disp = _modulosUI[idx].Disp; - var alvo = Variaveis.OperacaoEmAndamento.Parametros.ModulosMandatorios.FirstOrDefault(m => m.Dispositivo.Equals(disp)); + var alvo = op.Parametros.ModulosMandatorios.FirstOrDefault(m => m.Dispositivo.Equals(disp)); if (alvo != null) { if (alvo.Utilizar && alvo.Mandatorio && !novoUtilizar) @@ -843,14 +859,15 @@ namespace AgroBase.Forms.IHM private void btnPausarOperacao_Click(object sender, EventArgs e) { - if (!Variaveis.OperacaoEmAndamento.Pausa) + var op = Variaveis.OperacaoEmAndamento; + if (!op.Sensoriamento.Operacao.Pausa) { - Variaveis.OperacaoEmAndamento.Pausa = true; + op.Sensoriamento.Operacao.Pausa = true; btnPausarOperacao.Text = "Retomar"; } else { - Variaveis.OperacaoEmAndamento.Pausa = false; + op.Sensoriamento.Operacao.Pausa = false; btnPausarOperacao.Text = "Pausar"; } } @@ -862,6 +879,7 @@ namespace AgroBase.Forms.IHM private void btnSalvarParametros_Click(object sender, EventArgs e) { + var op = Variaveis.OperacaoEmAndamento; var res = CustomDialog.ShowDialog( "Salvar parâmetros da operação", "Deseja aplicar os novos parâmetros para operação atual?", @@ -872,7 +890,7 @@ namespace AgroBase.Forms.IHM { ("Não", DialogResult.No), () => { } }, } ); - var pControle = Variaveis.OperacaoEmAndamento.Parametros.Controle; + var pControle = op.Parametros.Controle; if (res == DialogResult.Yes) { pControle.FrenagemAutomaticaAoParar = chbFrenagemAutomatica.Checked; diff --git a/AgroBase/AgroBase/Forms/IHM/frmIHM.cs b/AgroBase/AgroBase/Forms/IHM/frmIHM.cs index 5aa33493a..ec5c092b6 100644 --- a/AgroBase/AgroBase/Forms/IHM/frmIHM.cs +++ b/AgroBase/AgroBase/Forms/IHM/frmIHM.cs @@ -45,7 +45,7 @@ namespace AgroBase.Forms.IHM FuncoesGlobais.DefinirEventosPicBtn(picManual, "Erro ao carregar modo de controle manual!", async () => { OperacaoModel.CarregarParametrosOperacaoPadrao(ModoOperacao.Manual, true); - if (Variaveis.OperacaoEmAndamento.OperacaoLiberada) + if (Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.OperacaoLiberada) { frmDialogoMapa frm = new frmDialogoMapa(); frm.Show(); @@ -55,7 +55,7 @@ namespace AgroBase.Forms.IHM { CustomDialog.ShowDialog( "Iniciar Operação Manual", - $"{Variaveis.OperacaoEmAndamento.ErroOperacaoLiberada ?? ""}", + $"{Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.ErroOperacaoLiberada ?? ""}", MessageBoxIcon.Error, new Dictionary<(string, dynamic), Action>() { @@ -194,7 +194,7 @@ namespace AgroBase.Forms.IHM { var Modulo = SerialService.DispositivosMapeados.FirstOrDefault(x => x.Dispositivo == T_Code.Snr); bool modDesconectado = Modulo == null || Modulo.Status == StatusModulo.Desconectado; - var saudeImu = HealthWorkerService.ModulosSaude.FirstOrDefault(x => x.modulo == Dispositivo); + var saudeImu = Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorSaude.ModulosSaude.FirstOrDefault(x => x.modulo == Dispositivo); var CameraCaminho = CameraWorkerService.CameraCaminho; lbl.ForeColor = modDesconectado || saudeImu == null ? Color.Black @@ -208,8 +208,8 @@ namespace AgroBase.Forms.IHM { var Modulo = SerialService.DispositivosMapeados.FirstOrDefault(x => x.Dispositivo == T_Code.Snr); bool modDesconectado = Modulo == null || Modulo.Status == StatusModulo.Desconectado; - var saudeLra = HealthWorkerService.ModulosSaude.FirstOrDefault(x => x.modulo == Dispositivo); - var lora = Variaveis.LoraService; + var saudeLra = Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorSaude.ModulosSaude.FirstOrDefault(x => x.modulo == Dispositivo); + dynamic lora = null; // Variaveis.LoraService; lbl.ForeColor = lora == null || !(Variaveis.OperacaoEmAndamento.DispSen?.Dados?.Conectado ?? false) ? Color.Black @@ -309,7 +309,7 @@ namespace AgroBase.Forms.IHM lblIA.Text = "IA: " + (VariaveisOperacao.Operadores.Conectado ? "Conectado" : "Desconectado"); lblIA.ForeColor = VariaveisOperacao.Operadores.Conectado ? Color.Green : Color.Red; - bool opLiberada = Variaveis.OperacaoEmAndamento.OperacaoLiberada; + bool opLiberada = Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.OperacaoLiberada; lblOperacaoLiberada.Text = "Operação Liberada: " + (opLiberada ? "Sim" : "Não"); lblOperacaoLiberada.ForeColor = opLiberada ? Color.Green : Color.Red; @@ -320,7 +320,7 @@ namespace AgroBase.Forms.IHM private void LblCodigoFalha_Click(object sender, EventArgs e) { - string DescricaoFalha = Variaveis.OperacaoEmAndamento.ErroOperacaoLiberada; + string DescricaoFalha = Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.ErroOperacaoLiberada; CustomDialog.ShowDialog( "Código de Falha", $"{DescricaoFalha}", @@ -340,7 +340,7 @@ namespace AgroBase.Forms.IHM var Modulo = SerialService.DispositivosMapeados.FirstOrDefault(x => x.Dispositivo == Dispositivo && (x.Mod_ID == Mod_ID || x.Mod_ID == null)); - var saudeGeral = HealthWorkerService.ModulosSaude.FirstOrDefault(x => x.modulo == Dispositivo); + var saudeGeral = Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorSaude.ModulosSaude.FirstOrDefault(x => x.modulo == Dispositivo); ManagerWorkerMessageResponseModulosPendentesSaudeModel saudeIndividual = null; switch (Dispositivo) { diff --git a/AgroBase/AgroBase/Forms/IHM/frmInicioOperacao.cs b/AgroBase/AgroBase/Forms/IHM/frmInicioOperacao.cs index f0ac375c5..6283ba995 100644 --- a/AgroBase/AgroBase/Forms/IHM/frmInicioOperacao.cs +++ b/AgroBase/AgroBase/Forms/IHM/frmInicioOperacao.cs @@ -48,7 +48,7 @@ namespace AgroBase.Forms.Operacoes }); FuncoesGlobais.DefinirEventosPicBtn(picIniciar, "Erro ao iniciar operação!", async () => { - if (Variaveis.OperacaoEmAndamento.OperacaoLiberada) + if (Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.OperacaoLiberada) { var res = CustomDialog.ShowDialog( "Iniciar Operação", @@ -71,7 +71,7 @@ namespace AgroBase.Forms.Operacoes { CustomDialog.ShowDialog( "Conexão de módulos pendentes", - $"{Variaveis.OperacaoEmAndamento.ErroOperacaoLiberada}", + $"{Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.ErroOperacaoLiberada}", MessageBoxIcon.Warning, new Dictionary<(string, dynamic), Action>() { @@ -350,7 +350,7 @@ namespace AgroBase.Forms.Operacoes AtualizarOpLiberada(); CustomDialog.ShowDialog( "Status", - Variaveis.OperacaoEmAndamento.ErroOperacaoLiberada, + Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.ErroOperacaoLiberada, MessageBoxIcon.Information, new Dictionary<(string, dynamic), Action>() { @@ -361,8 +361,8 @@ namespace AgroBase.Forms.Operacoes private void AtualizarOpLiberada() { - lblStatusOperacao.Text = "LIBERADO: " + (Variaveis.OperacaoEmAndamento.OperacaoLiberada ? "SIM" : "NÃO"); - lblStatusOperacao.ForeColor = Variaveis.OperacaoEmAndamento.OperacaoLiberada ? Color.DarkGreen : Color.DarkRed; + lblStatusOperacao.Text = "LIBERADO: " + (Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.OperacaoLiberada ? "SIM" : "NÃO"); + lblStatusOperacao.ForeColor = Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.OperacaoLiberada ? Color.DarkGreen : Color.DarkRed; } } diff --git a/AgroBase/AgroBase/Forms/Movimentacao/frmMovCamera.cs b/AgroBase/AgroBase/Forms/Movimentacao/frmMovCamera.cs index e4719d6a4..c2deabd4d 100644 --- a/AgroBase/AgroBase/Forms/Movimentacao/frmMovCamera.cs +++ b/AgroBase/AgroBase/Forms/Movimentacao/frmMovCamera.cs @@ -1,5 +1,6 @@ using AgroBase.Models; using AgroBase.Services; +using AgroBase.Services.Operadores; using Microsoft.Web.WebView2.WinForms; using Newtonsoft.Json; using System; @@ -27,7 +28,7 @@ namespace AgroBase.Forms.Movimentacao }; - private CameraService cameraService = new CameraService(); + //private CameraService cameraService = new CameraService(); private WebView2 browser = null; private Timer tmrLeitura; @@ -65,8 +66,8 @@ namespace AgroBase.Forms.Movimentacao try { tmrLeitura.Stop(); - Variaveis.MqttServiceLocal.UnsubscribeAsync(cameraService._mqttTopico).GetAwaiter().GetResult(); - cameraService.pythonProcess.Kill(); + //Variaveis.MqttServiceLocal.UnsubscribeAsync(cameraService._mqttTopico).GetAwaiter().GetResult(); + //cameraService.pythonProcess.Kill(); } catch (Exception ex) { @@ -238,7 +239,7 @@ namespace AgroBase.Forms.Movimentacao if (browser == null) { browser = new WebView2(); - browser.Source = new Uri(cameraService.URLcamera[0]); + //browser.Source = new Uri(cameraService.URLcamera[0]); this.pnlCamera.Controls.Add(browser); browser.Dock = DockStyle.Fill; } @@ -273,7 +274,7 @@ namespace AgroBase.Forms.Movimentacao else { btnSalvar.Text = "Editar"; - cameraService.cameraIndex = cmbCameras.SelectedIndex; + //cameraService.cameraIndex = cmbCameras.SelectedIndex; } btnIniciar.Enabled = btnSalvar.Text == "Editar" && cmbCameras.SelectedIndex > 0; cmbCameras.Enabled = btnSalvar.Text == "Salvar"; @@ -306,14 +307,14 @@ namespace AgroBase.Forms.Movimentacao private void AtualizaListaCameras() { - cameraService.cameraIndex = cmbCameras.SelectedIndex > 0 ? cmbCameras.SelectedIndex : 0; + //cameraService.cameraIndex = cmbCameras.SelectedIndex > 0 ? cmbCameras.SelectedIndex : 0; cmbCameras.Items.Clear(); - cmbCameras.Items.AddRange(CameraService.ObterListaCameras().Keys.ToArray()); + cmbCameras.Items.AddRange(CameraWorkerService.ListaCameras.Select(x => x.mx_id).ToArray()); if (cmbCameras.Items.Count == 1) { - cameraService.cameraIndex = 0; + //cameraService.cameraIndex = 0; } - cmbCameras.SelectedIndex = cameraService.cameraIndex; + //cmbCameras.SelectedIndex = cameraService.cameraIndex; } diff --git a/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.cs b/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.cs index abd84c8d9..9cdcf7cea 100644 --- a/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.cs +++ b/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.cs @@ -132,7 +132,7 @@ namespace AgroBase.Forms.Operacoes }); // Verifica se a operação está liberada - if (Variaveis.OperacaoEmAndamento.OperacaoLiberada) + if (Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.OperacaoLiberada) { // Inicia a operação de forma assíncrona Task.Run(async () => await Variaveis.OperacaoEmAndamento.IniciarOperacao()); @@ -149,7 +149,7 @@ namespace AgroBase.Forms.Operacoes // Mostra a mensagem de erro na thread principal btnIniciarOperacao.Invoke((MethodInvoker)delegate { - MessageBox.Show(Variaveis.OperacaoEmAndamento.ErroOperacaoLiberada, "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show(Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.ErroOperacaoLiberada, "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Error); btnIniciarOperacao.Text = "Iniciar Operação"; btnIniciarOperacao.Enabled = true; }); @@ -186,8 +186,8 @@ namespace AgroBase.Forms.Operacoes lblTensao.Text = _Sensoriamento.Bateria.TensaoInstantanea.ToString("0.00") + " v"; lblCorrente.Text = _Sensoriamento.Bateria.CorrenteInstantanea.ToString("0.00") + " A"; - lblRPM.Text = _Sensoriamento.Movimentacao.RPMMedio.ToString("0") + " rpm"; - lblVelocidade.Text = (_Sensoriamento.Movimentacao.VelocidadeMedia * 3.6).ToString("0.00"); + lblRPM.Text = _Sensoriamento.Movimentacao.RPMRodaMedio.ToString("0") + " rpm"; + lblVelocidade.Text = (_Sensoriamento.Movimentacao.VelocidadeMediaMs * 3.6).ToString("0.00"); lblPressao.Text = $"{(_Sensoriamento.Atuador.PressaoLinha):F0} psi"; lblPressaoBomba.Text = $"{(_Sensoriamento.Atuador.PressaoAtualBomba):F0} psi"; lblVazaoInstantanea.Text = $"{(_Sensoriamento.Atuador.VazaoFluxoMLpSInstantaneaCorrigida):F0} ml/s"; @@ -557,9 +557,9 @@ namespace AgroBase.Forms.Operacoes var _Atuador = _Sensoriamento?.Atuador; var _IMU = _Sensoriamento?.IMU; - gridDados.Rows[0].Cells[1].Value = _Sensoriamento.TempoDecorrido.ToString("HH:mm:ss"); - gridDados.Rows[1].Cells[1].Value = (_Movimentacao?.TempoMovimento ?? DateTime.Now).ToString("HH:mm:ss"); - gridDados.Rows[2].Cells[1].Value = (_Movimentacao?.VelocidadeMedia ?? 0 * 3.6).ToString("0.00"); + gridDados.Rows[0].Cells[1].Value = _Sensoriamento.Operacao.TempoDecorrido.ToString("HH:mm:ss"); + gridDados.Rows[1].Cells[1].Value = (FuncoesGlobais.TimestampToDate(_Movimentacao?.TempoMovimentoSegs ?? 0)); + gridDados.Rows[2].Cells[1].Value = (_Movimentacao?.VelocidadeMediaMs ?? 0 * 3.6).ToString("0.00"); gridDados.Rows[3].Cells[1].Value = (_Sensoriamento.Trajetoria?.DistanciaPercorrida ?? 0).ToString("0.00"); gridDados.Rows[4].Cells[1].Value = ((_Bateria?.PercentualBateria ?? 0).ToString("0.00")); gridDados.Rows[5].Cells[1].Value = ((_Bateria?.TensaoInstantanea ?? 0).ToString("0.00")); @@ -735,7 +735,7 @@ namespace AgroBase.Forms.Operacoes AtuadorFuncoesGerais.DesenharAtuadores( pnlAtuadores, e, - Atuador.BicosPulverizadores.Select(x => new AtuBicoSensoriamentoLogModel() + Atuador.BicosPulverizadores.Select(x => new AtuadorBicoLogModel() { ID = x.ID, Atuacoes = x.Atuacoes, diff --git a/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoMapaGPS.cs b/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoMapaGPS.cs index 87ee53d94..57e5f5ca3 100644 --- a/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoMapaGPS.cs +++ b/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoMapaGPS.cs @@ -78,7 +78,7 @@ namespace AgroBase.Forms.Operacoes lblUltimaLeituraRua.Text = "Ultima Leitura Rua: " + FuncoesGlobais.TimestampToDate(Variaveis.OperacaoEmAndamento.CameraCaminho.Leitura.timestamp);*/ - btnCarregarMapa.Enabled = !Variaveis.OperacaoEmAndamento.Iniciado; + btnCarregarMapa.Enabled = !Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.OperacaoIniciada; this.Text = Variaveis.OperacaoEmAndamento.TextoFormOperacao("Mapa GPS"); @@ -86,8 +86,8 @@ namespace AgroBase.Forms.Operacoes //lblDistanciaDireita.Text = "Distancia da Direita: " + Variaveis.OperacaoEmAndamento.Sensoriamento.DistanciaDireita.ToString("0.00") + " cm"; lblDistanciaPercorrida.Text = "Distancia Percorrida: " + _Sensoriamento.Trajetoria.DistanciaPercorrida.ToString("0.00") + " m"; - lblTempoOperacao.Text = "Tempo de Operação: " + _Sensoriamento.TempoDecorrido.ToString("HH:mm:ss"); - lblVelocidadeMedia.Text = "Velocidade Média: " + _Sensoriamento.Movimentacao.VelocidadeMedia.ToString("0.00") + " km/h"; + lblTempoOperacao.Text = "Tempo de Operação: " + _Sensoriamento.Operacao.TempoDecorrido.ToString("HH:mm:ss"); + lblVelocidadeMedia.Text = "Velocidade Média: " + _Sensoriamento.Movimentacao.VelocidadeMediaMs.ToString("0.00") + " km/h"; //lblErvasIdentificadas.Text = "Ervas Identificadas: " + _Sensoriamento.Atuador.QtdErvasIdentificadas.ToString("000"); lblHerbicidaAplicado.Text = "Herbicida Aplicado: " + _Sensoriamento.Atuador.HerbicidaConsumido.ToString("0.000") + " L"; lblHerbicidaPorErva.Text = "Herbicida por Erva: " + _Sensoriamento.Atuador.HerbicidaPorErva.ToString("0.000") + " mL"; @@ -107,7 +107,7 @@ namespace AgroBase.Forms.Operacoes lblPerformance.Text = _Sensoriamento.DadosPerformance.PerformanceStr; - if (!Variaveis.OperacaoEmAndamento.Iniciado && btnIniciarOperacao.Text == "Finalizar Operação") + if (!Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.OperacaoIniciada && btnIniciarOperacao.Text == "Finalizar Operação") { AtualizaComponentesOperacao(); } @@ -143,7 +143,7 @@ namespace AgroBase.Forms.Operacoes } else { - if (Variaveis.OperacaoEmAndamento.OperacaoLiberada && Variaveis.OperacaoEmAndamento.Trajetoria.DistanciaTotal > 0 && Variaveis.OperacaoEmAndamento.Mapa.RuasPercorrer.Any()) + if (Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.OperacaoLiberada && Variaveis.OperacaoEmAndamento.Trajetoria.DistanciaTotal > 0 && Variaveis.OperacaoEmAndamento.Mapa.RuasPercorrer.Any()) { //Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombaPressurizadora.PressaoSP = Convert.ToDouble(nudPressaoSP.Value); await Variaveis.OperacaoEmAndamento.IniciarOperacao(); @@ -159,7 +159,7 @@ namespace AgroBase.Forms.Operacoes private void AtualizaComponentesOperacao() { - btnIniciarOperacao.Text = !Variaveis.OperacaoEmAndamento.Iniciado ? "Iniciar Operação" : "Finalizar Operação"; + btnIniciarOperacao.Text = !Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.OperacaoIniciada ? "Iniciar Operação" : "Finalizar Operação"; } #endregion @@ -169,7 +169,7 @@ namespace AgroBase.Forms.Operacoes private void pnlAtuadores_Paint(object sender, PaintEventArgs e) { var Atuador = Variaveis.OperacaoEmAndamento.DispAtu.Dados; - AtuadorFuncoesGerais.DesenharAtuadores(pnlAtuadores, e, Atuador.BicosPulverizadores.Select(x => new AtuBicoSensoriamentoLogModel() + AtuadorFuncoesGerais.DesenharAtuadores(pnlAtuadores, e, Atuador.BicosPulverizadores.Select(x => new AtuadorBicoLogModel() { ID = x.ID, Atuacoes = x.Atuacoes, diff --git a/AgroBase/AgroBase/Forms/Operacoes/frmResultadosOperacao.cs b/AgroBase/AgroBase/Forms/Operacoes/frmResultadosOperacao.cs index 9cba8f8c3..9b27d7a41 100644 --- a/AgroBase/AgroBase/Forms/Operacoes/frmResultadosOperacao.cs +++ b/AgroBase/AgroBase/Forms/Operacoes/frmResultadosOperacao.cs @@ -20,18 +20,31 @@ 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 LogsControle = new List(); + List LogsDirecional = new List(); + List LogsMovimentacao = new List(); + List LogsAtuador = new List(); + List LogsSensoriamento = new List(); + List LogsCam_Caminho = new List(); List> LogsCam_Solo = new List>(); List LogsVisualWorker = new List(); List LogsWeedWorker = new List(); + List LogsHealthWorker = new List(); + List LogsIMU = new List(); + List LogsGPS = new List(); + List LogsBase = new List(); + List LogsLivox = new List(); + List LogsBateria = new List(); + List LogsTrajetoria = new List(); + List LogsPerformance = new List(); + List> LogsErros = new List>(); + List LogsCooler = 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(); private readonly TopDownBboxView view_top_down = new TopDownBboxView(); private readonly FrontalBboxView view_frontal = new FrontalBboxView(); @@ -140,6 +153,8 @@ namespace AgroBase.Forms.Operacoes private async void btnCarregarOperacao_Click(object sender, EventArgs e) { + var op = Variaveis.OperacaoEmAndamento; + OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "Arquivos de Operação|*.lgop"; ofd.InitialDirectory = Application.StartupPath + "\\" + Variaveis.CaminhoOperacoes; @@ -148,23 +163,36 @@ namespace AgroBase.Forms.Operacoes OperacaoDadosModel data = JsonConvert.DeserializeObject(File.ReadAllText(ofd.FileName)); LogsOperacao = JsonConvert.DeserializeObject(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, data.operacao)).ToList(); + LogsGPS = JsonConvert.DeserializeObject(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, Enums.T_Code.Gps.ToString())).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; + GPSService.UltimaLeitura = LogsGPS.FirstOrDefault(); + (bool sucesso, List ruas) = op.CarregarParametrizacaoOperacao(null, null, ofd.FileName.Replace("data.lgop", "operacao.opr")); + bool condicaoOperacaoCarregada() => op.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 + "\\"); + LogsControle = JsonConvert.DeserializeObject(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, "controle")).ToList(); + LogsCooler = JsonConvert.DeserializeObject(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, "cooler")).ToList(); + LogsBase = JsonConvert.DeserializeObject(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, "base")).ToList(); + + 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(); + + LogsIMU = JsonConvert.DeserializeObject(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, Enums.T_Code.Imu.ToString())).ToList(); + LogsLivox = JsonConvert.DeserializeObject(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, Enums.T_Code.Lvx.ToString())).ToList(); + LogsBateria = JsonConvert.DeserializeObject(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, Enums.T_Code.Bat.ToString())).ToList(); + LogsTrajetoria = JsonConvert.DeserializeObject(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, Enums.T_Code.Trj.ToString())).ToList(); + LogsPerformance = JsonConvert.DeserializeObject(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, Enums.T_Code.Npc.ToString())).ToList(); + LogsCam_Caminho = JsonConvert.DeserializeObject>(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, data.cam_caminho ?? Enums.T_Code.Snr.ToString())).ToList(); LogsVisualWorker = JsonConvert.DeserializeObject>(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, "VisualWorker")).ToList(); LogsWeedWorker = JsonConvert.DeserializeObject>(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, "WeedWorker")).ToList(); - + LogsHealthWorker = JsonConvert.DeserializeObject>(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, "HealthWorker")).ToList(); + + pathImagensCaminho = ofd.FileName.Replace("data.lgop", data.cam_caminho + "\\"); pathImagensSolo = new List(); picsCamSolo = new List(); picsCamSoloSeg = new List(); @@ -209,7 +237,7 @@ namespace AgroBase.Forms.Operacoes { pnlMapa = pnlMapa }; - MapasService.CriarArquivoMapa(new List>() { LogsOperacao.Select(x => x.Gps).ToList() }, 1517, data.id); + MapasService.CriarArquivoMapa(new List>() { LogsGPS.ToList() }, 1517, data.id); Mapa.btnCarregar_Click(sender, e, Variaveis.CaminhoSistema + "/" + Variaveis.CaminhoMapasConvertidos + data.id + ".json"); trbMomento.Maximum = LogsOperacao.Count - 1; @@ -237,343 +265,276 @@ namespace AgroBase.Forms.Operacoes { var Momentos = LogsOperacao.Select(x => x.Momento.ToString("mm:ss:fff")).ToList(); - graficoMovGeral = new GraficoInterativoModel(chartMovGeral, Momentos, new List() + + // Movimentacao + List SerieMovModulo(List logs, string moduloId, Func seletor, double valorPadrao = 0) + { + return (logs ?? new List()) + .Select(log => + { + var modulo = log?.Modulos?.FirstOrDefault(m => m.Modulo_ID == moduloId); + + if (modulo == null) + return valorPadrao; + + return seletor(modulo); + }) + .ToList(); + } + + GraficoInterativoSerieModel CriarSerieMov(string titulo, List logs, string moduloId, Func seletor, bool visivel = false, bool mostrarValor = true) + { + return new GraficoInterativoSerieModel() + { + Titulo = titulo, + Valores = SerieMovModulo(logs, moduloId, seletor), + Visivel = visivel, + MostrarValor = mostrarValor + }; + } + + var seriesMovGeral = 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(), + Titulo = "RPM SP", + Valores = LogsControle.Select(x => (double)x.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(), + Titulo = "Vel. Média m/s", + Valores = LogsMovimentacao.Select(x => x.VelocidadeMediaMs).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(), + Titulo = "RPM Roda Médio", + Valores = LogsMovimentacao.Select(x => x.RPMRodaMedio).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(), + Titulo = "RPM Motor Médio", + Valores = LogsMovimentacao.Select(x => x.RPMMotorMedio).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 - }, - }); + string[] modulosMov = { "EF", "ET", "DT", "DF" }; - graficoMovTemperatura = new GraficoInterativoModel(chartMovTemperatura, Momentos, new List() + foreach (var id in modulosMov) + { + seriesMovGeral.Add(CriarSerieMov( + $"{id} SP", + LogsMovimentacao, + id, + x => x.RPM_SP, + visivel: false + )); + + seriesMovGeral.Add(CriarSerieMov( + $"{id} SP Roda Est.", + LogsMovimentacao, + id, + x => x.RPM_SP_RodaEstimado, + visivel: false + )); + + seriesMovGeral.Add(CriarSerieMov( + $"{id} Roda", + LogsMovimentacao, + id, + x => x.RPM_Roda, + visivel: true + )); + + seriesMovGeral.Add(CriarSerieMov( + $"{id} Motor", + LogsMovimentacao, + id, + x => x.RPM_Motor, + visivel: false + )); + + seriesMovGeral.Add(CriarSerieMov( + $"{id} m/s", + LogsMovimentacao, + id, + x => x.VelocidadeInstantaneaMs, + visivel: false + )); + + seriesMovGeral.Add(CriarSerieMov( + $"{id} km/h", + LogsMovimentacao, + id, + x => x.VelocidadeInstantaneaMs * 3.6, + visivel: false + )); + + seriesMovGeral.Add(CriarSerieMov( + $"{id} Potência", + LogsMovimentacao, + id, + x => x.Potencia, + visivel: false + )); + + seriesMovGeral.Add(CriarSerieMov( + $"{id} Corrente Motor", + LogsMovimentacao, + id, + x => x.CorrenteMotor, + visivel: false + )); + + seriesMovGeral.Add(CriarSerieMov( + $"{id} Temp Motor", + LogsMovimentacao, + id, + x => x.TemperaturaMotor, + visivel: false + )); + + seriesMovGeral.Add(CriarSerieMov( + $"{id} Temp Driver", + LogsMovimentacao, + id, + x => x.TemperaturaDriver, + visivel: false + )); + + seriesMovGeral.Add(CriarSerieMov( + $"{id} Fator Curva", + LogsMovimentacao, + id, + x => x.FatorCompensacaoCurva, + visivel: false + )); + } + + graficoMovGeral = new GraficoInterativoModel( + chartMovGeral, + Momentos, + seriesMovGeral + ); + + var seriesMovTemperatura = new List() { new GraficoInterativoSerieModel() { - Titulo = "EF Motor", - Valores = LogsMovimentacao.Where(x => x.Modulo_ID == "EF").Select(x => x.Temperatura).ToList(), + Titulo = "Motor Média", + Valores = LogsMovimentacao.Select(x => x.TemperaturaMotorMedia).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, + Titulo = "Driver Média", + Valores = LogsMovimentacao.Select(x => x.TemperaturaDriverMedia).ToList(), + Visivel = false, 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() + foreach (var id in modulosMov) { - 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 - }, + seriesMovTemperatura.Add(CriarSerieMov( + $"{id} Motor", + LogsMovimentacao, + id, + x => x.TemperaturaMotor, + visivel: 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 - }, + seriesMovTemperatura.Add(CriarSerieMov( + $"{id} Driver", + LogsMovimentacao, + id, + x => x.TemperaturaDriver, + visivel: false + )); + } - 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 - }, + graficoMovTemperatura = new GraficoInterativoModel( + chartMovTemperatura, + Momentos, + seriesMovTemperatura + ); - 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 - }, + var seriesMovAlimentacao = new List(); - 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 - }, - }); + foreach (var id in modulosMov) + { + seriesMovAlimentacao.Add(CriarSerieMov( + $"V {id}", + LogsMovimentacao, + id, + x => x.Tensao, + visivel: false + )); + } + foreach (var id in modulosMov) + { + seriesMovAlimentacao.Add(CriarSerieMov( + $"AM {id}", + LogsMovimentacao, + id, + x => x.CorrenteMotor, + visivel: false + )); + } + + foreach (var id in modulosMov) + { + seriesMovAlimentacao.Add(CriarSerieMov( + $"AB {id}", + LogsMovimentacao, + id, + x => x.CorrenteBarramento, + visivel: true + )); + } + + foreach (var id in modulosMov) + { + seriesMovAlimentacao.Add(CriarSerieMov( + $"W {id}", + LogsMovimentacao, + id, + x => x.Potencia, + visivel: true + )); + } + + foreach (var id in modulosMov) + { + seriesMovAlimentacao.Add(CriarSerieMov( + $"% {id}", + LogsMovimentacao, + id, + x => x.CicloTrabalho, + visivel: false + )); + } + + graficoMovAlimentacao = new GraficoInterativoModel( + chartMovTensao, + Momentos, + seriesMovAlimentacao + ); + + + // Atuador graficoAtu = new GraficoInterativoModel(chartAtuador, Momentos, new List() { new GraficoInterativoSerieModel() @@ -620,168 +581,259 @@ namespace AgroBase.Forms.Operacoes } }); - graficoSen = new GraficoInterativoModel(chartSensoriamento, Momentos, new List() + + // Sensoriamento + double ValorBarramento(OperacaoSensoriamentoLogBateriaModel log, string id, Func seletor, double valorPadrao = 0) { - new GraficoInterativoSerieModel() + var barramento = log?.Barramentos? + .FirstOrDefault(x => + string.Equals(x.ID, id, StringComparison.OrdinalIgnoreCase) || + x.ID?.Contains(id) == true + ); + + if (barramento == null) + return valorPadrao; + + return seletor(barramento); + } + + List SerieBarramento(List logs, string id, Func seletor, double valorPadrao = 0) + { + return (logs ?? new List()) + .Select(log => ValorBarramento(log, id, seletor, valorPadrao)) + .ToList(); + } + + GraficoInterativoSerieModel CriarSerieBarramento(string titulo, string id, Func seletor, bool visivel = false, bool mostrarValor = true) + { + return 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 19v", - Valores = LogsSensoriamento.Select(x => (double?)(x?.Sensores?.FirstOrDefault(y => y.ID.Contains("19V"))?.ValoresLeituras?.FirstOrDefault(z => z.funcao == FuncoesPinout.Tensao)?.atual?.valor) ?? 0).ToList(), - Visivel = true, - MostrarValor = true - }, - new GraficoInterativoSerieModel() - { - Titulo = "A 19v", - Valores = LogsSensoriamento.Select(x => (double?)(x?.Sensores?.FirstOrDefault(y => y.ID.Contains("19V"))?.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) * 1000.0).ToList(), - Visivel = true, - MostrarValor = true - }, + Titulo = titulo, + Valores = SerieBarramento(LogsBateria, id, seletor), + Visivel = visivel, + MostrarValor = mostrarValor + }; + } + + var seriesSen = new List(); + + var barramentos = new[] + { + new { Id = "AB3V", Nome = "3v3", Visivel = false }, + new { Id = "AB5V", Nome = "5v0", Visivel = false }, + new { Id = "AB7V2", Nome = "7v2", Visivel = false }, + new { Id = "AB12V", Nome = "12v", Visivel = true }, + new { Id = "AB19V", Nome = "19v", Visivel = true }, + new { Id = "AB24V", Nome = "24v", Visivel = true }, + new { Id = "AB36V", Nome = "36v", Visivel = true }, + }; + + foreach (var b in barramentos) + { + seriesSen.Add(CriarSerieBarramento( + $"V {b.Nome}", + b.Id, + x => x.Tensao, + visivel: b.Visivel + )); + + seriesSen.Add(CriarSerieBarramento( + $"A {b.Nome}", + b.Id, + x => x.Corrente, + visivel: b.Visivel + )); + } + + seriesSen.Add(new GraficoInterativoSerieModel() + { + Titulo = "V Bat", + Valores = LogsBateria.Select(x => (double?)(x?.TensaoInstantanea) ?? 0).ToList(), + Visivel = true, + MostrarValor = true }); - graficoCpu = new GraficoInterativoModel(chartCpu, Momentos, new List() + seriesSen.Add(new GraficoInterativoSerieModel() { - new GraficoInterativoSerieModel() - { - Titulo = "GPU Geral %", - Valores = LogsOperacao.Select(x => (double)(x?.DadosPerformance.GPU_load_percent ?? 0)).ToList(), - Visivel = true, - MostrarValor = true - }, - new GraficoInterativoSerieModel() - { - Titulo = "GPU Core %", - Valores = LogsOperacao.Select(x => (double)(x?.DadosPerformance.GPU_core_load_percent ?? 0)).ToList(), - Visivel = true, - MostrarValor = true - }, - new GraficoInterativoSerieModel() - { - Titulo = "GPU Memory %", - Valores = LogsOperacao.Select(x => (double)(x?.DadosPerformance.GPU_memory_load_percent ?? 0)).ToList(), - Visivel = true, - MostrarValor = true - }, - new GraficoInterativoSerieModel() - { - Titulo = "GPU Frame Buffer %", - Valores = LogsOperacao.Select(x => (double)(x?.DadosPerformance.GPU_frame_buffer_load_percent ?? 0)).ToList(), - Visivel = true, - MostrarValor = true - }, - new GraficoInterativoSerieModel() - { - Titulo = "GPU Video Engine %", - Valores = LogsOperacao.Select(x => (double)(x?.DadosPerformance.GPU_video_engine_load_percent ?? 0)).ToList(), - Visivel = false, - MostrarValor = true - }, - new GraficoInterativoSerieModel() - { - Titulo = "GPU Bus Interface %", - Valores = LogsOperacao.Select(x => (double)(x?.DadosPerformance.GPU_bus_interface_load_percent ?? 0)).ToList(), - Visivel = false, - MostrarValor = true - }, + Titulo = "A Bat", + Valores = LogsBateria.Select(x => (double?)(x?.CorrenteInstantanea) ?? 0).ToList(), + Visivel = true, + MostrarValor = true }); + graficoSen = new GraficoInterativoModel( + chartSensoriamento, + Momentos, + seriesSen + ); + + + // Performance + var MomentosPerformance = LogsPerformance.Select(x => x?.Timestamp.ToString("mm:ss:fff") ?? "").ToList(); + + List SeriePerformance(Func seletor) + { + return (LogsPerformance ?? new List()).Select(x => x == null ? 0 : seletor(x) ?? 0).ToList(); + } + + GraficoInterativoSerieModel CriarSeriePerformance(string titulo, Func seletor, bool visivel = false, bool mostrarValor = true) + { + return new GraficoInterativoSerieModel() + { + Titulo = titulo, + Valores = SeriePerformance(seletor), + Visivel = visivel, + MostrarValor = mostrarValor + }; + } + + graficoCpu = new GraficoInterativoModel(chartCpu, MomentosPerformance, new List() + { + // ----------------------------- + // Uso geral, bom para replay + // ----------------------------- + CriarSeriePerformance( + "CPU Geral %", + x => x.CPU_load_percent, + visivel: true + ), + + CriarSeriePerformance( + "RAM Uso %", + x => x.RAM_usage_percent, + visivel: true + ), + + CriarSeriePerformance( + "GPU Geral %", + x => x.GPU_load_percent, + visivel: true + ), + + CriarSeriePerformance( + "GPU Core %", + x => x.GPU_core_load_percent, + visivel: true + ), + + CriarSeriePerformance( + "VRAM Uso %", + x => x.GPU_vram_used_percent, + visivel: true + ), + + // ----------------------------- + // Temperaturas + // Mesmo gráfico porque fica na escala 0-100, + // mas é outra unidade. + // ----------------------------- + CriarSeriePerformance( + "CPU Temp °C", + x => x.CPU_temp_package_c, + visivel: true + ), + + CriarSeriePerformance( + "GPU Temp °C", + x => x.GPU_temp_core_c, + visivel: true + ), + + // ----------------------------- + // GPU detalhes + // Úteis para diagnóstico fino + // ----------------------------- + CriarSeriePerformance( + "GPU Memory %", + x => x.GPU_memory_load_percent, + visivel: false + ), + + CriarSeriePerformance( + "GPU Frame Buffer %", + x => x.GPU_frame_buffer_load_percent, + visivel: false + ), + + CriarSeriePerformance( + "GPU Video Engine %", + x => x.GPU_video_engine_load_percent, + visivel: false + ), + + CriarSeriePerformance( + "GPU Bus Interface %", + x => x.GPU_bus_interface_load_percent, + visivel: false + ), + + // ----------------------------- + // Potência + // Outra unidade, deixa escondido + // ----------------------------- + CriarSeriePerformance( + "CPU Power W", + x => x.CPU_power_package_w, + visivel: false + ), + + CriarSeriePerformance( + "GPU Power W", + x => x.GPU_power_w, + visivel: false + ), + + // ----------------------------- + // Memória/processo + // Bom para detectar vazamento + // ----------------------------- + CriarSeriePerformance( + "RAM Usada GB", + x => x.RAM_used_gb, + visivel: false + ), + + CriarSeriePerformance( + "Process Mem MB", + x => x.Process_working_set_mb, + visivel: false + ), + + CriarSeriePerformance( + "Private Mem MB", + x => x.Process_private_memory_mb, + visivel: false + ), + + CriarSeriePerformance( + "Threads", + x => x.Process_thread_count, + visivel: false + ), + + // ----------------------------- + // Sistema + // ----------------------------- + CriarSeriePerformance( + "Disco Usado %", + x => x.Disk_used_space_percent, + visivel: false + ), + + CriarSeriePerformance( + "ThreadPool Worker %", + x => x.ThreadPool_used_worker_percent, + visivel: false + ), + + CriarSeriePerformance( + "ThreadPool IO %", + x => x.ThreadPool_used_completion_port_percent, + visivel: false + ), + }); + + // Obtemos todos os tipos de ervas identificadas ao longo dos logs /*var todasErvas = LogsOperacao .SelectMany(log => log.Atuador.ErvasIdentificadas) @@ -1127,14 +1179,19 @@ namespace AgroBase.Forms.Operacoes private void AtualizarInformacoesOperacao() { var Log = LogsOperacao[idxMomentoAtual]; + var LogMov = LogsMovimentacao[idxMomentoAtual]; + var LogBat = LogsBateria[idxMomentoAtual]; var LogAtu = LogsAtuador[idxMomentoAtual]; + var LogTrj = LogsTrajetoria[idxMomentoAtual]; var LogWw = LogsWeedWorker[idxMomentoAtual]; + var LogHw = LogsHealthWorker[idxMomentoAtual]; + var LogCtrl = LogsControle[idxMomentoAtual]; - lblPercentualBateria.Text = $"Bateria {Log.Bateria.PercentualBateria.ToString("0.00")}%"; - FuncoesGlobais.PreencheValorProgressBar(pgbPercentualBateria, Log.Bateria.PercentualBateria); + lblPercentualBateria.Text = $"Bateria {LogBat.PercentualBateria.ToString("0.00")}%"; + FuncoesGlobais.PreencheValorProgressBar(pgbPercentualBateria, LogBat.PercentualBateria); - lblBateriaConsumida.Text = $"Consumido {Log.Bateria.PercentualBateriaConsumidaOperacao.ToString("0.00")}%"; - FuncoesGlobais.PreencheValorProgressBar(pgbBateriaConsumida, Log.Bateria.PercentualBateriaConsumidaOperacao); + lblBateriaConsumida.Text = $"Consumido {LogBat.PercentualBateriaConsumidaOperacao.ToString("0.00")}%"; + FuncoesGlobais.PreencheValorProgressBar(pgbBateriaConsumida, LogBat.PercentualBateriaConsumidaOperacao); lblPercentualReservatorio.Text = $"Reservatório {LogAtu.PercentualReservatorio.ToString("0.00")}%"; FuncoesGlobais.PreencheValorProgressBar(pgbPercentualReservatorio, LogAtu.PercentualReservatorio); @@ -1142,33 +1199,33 @@ namespace AgroBase.Forms.Operacoes lblHerbicidaConsumido.Text = $"Consumido {LogAtu.PercentualHerbicidaConsumidoOperacao:0.00}%"; FuncoesGlobais.PreencheValorProgressBar(pgbHerbicidaConsumido, LogAtu.PercentualHerbicidaConsumidoOperacao); - txtTempoMovimento.Text = FuncoesGlobais.ConverterSegundosParaHHmmss((int)Log.Movimentacao.TempoMovimentoSegs); - txtStatusOperacao.Text = Log.StatusOperacao.ToString(); - txtStatusCarro.Text = $"{Log.Trajetoria.StatusCarro}"; + txtTempoMovimento.Text = FuncoesGlobais.ConverterSegundosParaHHmmss((int)LogMov.TempoMovimentoSegs); + txtStatusOperacao.Text = Log.StatusOperacaoAtual.ToString(); + txtStatusCarro.Text = $"{LogTrj.StatusCarro}"; txtHerbicidaPorErva.Text = LogAtu.HerbicidaPorAtuacao.ToString("0.00") + " ml"; - txtDentroRua.Text = Log.Trajetoria.CorredorAtual.Dentro ? "Sim" : "Não"; - txtDirecaoCarro.Text = Log.Trajetoria.DirecaoCaminho.ToString() + " (" + Log.Trajetoria.CorredorAtual.Idx + " - " + Log.Trajetoria.ProximoPonto.idxPonto + " - " + Log.Trajetoria.ProximoPonto.idxPontoCorredor + ")"; + txtDentroRua.Text = LogTrj.CorredorAtual.Dentro ? "Sim" : "Não"; + txtDirecaoCarro.Text = LogTrj.DirecaoCaminho.ToString() + " (" + LogTrj.CorredorAtual.Idx + " - " + LogTrj.ProximoPonto.idxPonto + " - " + LogTrj.ProximoPonto.idxPontoCorredor + ")"; txtErvasNoRadar.Text = LogWw.Analise.ervas_no_radar + " (" + (LogWw.Analise.percentual_ervas_no_radar).ToString("0.00") + "%)"; - txtErvasTerreno.Text = Log.Atuador.PercentualErvasTerreno.ToString("0.00"); - txtTipoMovimento.Text = Log.Controle.TipoMovimento.ToString(); - txtVelocidade.Text = (Log.Movimentacao.VelocidadeMedia * 3.6).ToString("0.00") + " km/h (" + Log.Movimentacao.VelocidadeMedia.ToString("0.00") + " m/s)"; - txtDirecaoControle.Text = (Log.Controle?.TiposControle?.FirstOrDefault(x => x.Tipo == Enums.T_Code.Dir)?.DirecaoAtual ?? Enums.Direcao.Parado).ToString() + " (" + (Log.Controle?.Latencia ?? 0).ToString("0.00") + " s)"; - txtVelocidadeControle.Text = ((Log.Controle?.PercentualVelocidadeSP ?? 0) / VariaveisEquipamento.RPM_Max_Roda * 100).ToString() + " rpm"; - txtErvasIdentificadas.Text = $"{Log.Controle?.Bicos?.Sum(x => x.Atuacoes) ?? 0}"; + txtErvasTerreno.Text = LogAtu.PercentualErvasTerreno.ToString("0.00"); + txtTipoMovimento.Text = LogCtrl.TipoMovimento.ToString(); + txtVelocidade.Text = (LogMov.VelocidadeMediaMs * 3.6).ToString("0.00") + " km/h (" + LogMov.VelocidadeMediaMs.ToString("0.00") + " m/s)"; + txtDirecaoControle.Text = (LogCtrl?.TiposControle?.FirstOrDefault(x => x.Tipo == Enums.T_Code.Dir)?.DirecaoAtual ?? Enums.Direcao.Parado).ToString() + " (" + (LogCtrl?.Latencia ?? 0).ToString("0.00") + " s)"; + txtVelocidadeControle.Text = ((LogCtrl?.PercentualVelocidadeSP ?? 0) / VariaveisEquipamento.RPM_Max_Roda * 100).ToString() + " rpm"; + txtErvasIdentificadas.Text = $"{LogCtrl?.Bicos?.Sum(x => x.Atuacoes) ?? 0}"; - txtDistanciasLaterais.Text = (Log.Trajetoria.DistanciaEsquerda * 100.0).ToString("0.00") + " cm / " + (Log.Trajetoria.DistanciaDireita * 100.0).ToString("0.00") + " cm"; - txtErroLateral.Text = (Log.Controle.ErroLateral * 100.0).ToString("0.00") + " cm"; - txtNaMargem.Text = Log.Trajetoria.NaMargemDoCorredor ? "Sim" : "Não"; + txtDistanciasLaterais.Text = (LogTrj.DistanciaEsquerda * 100.0).ToString("0.00") + " cm / " + (LogTrj.DistanciaDireita * 100.0).ToString("0.00") + " cm"; + txtErroLateral.Text = (LogCtrl.ErroLateral * 100.0).ToString("0.00") + " cm"; + txtNaMargem.Text = LogTrj.NaMargemDoCorredor ? "Sim" : "Não"; - lblPercentualOperacao.Text = $"Operação {Log.Trajetoria.ProgressoTrajeto.ToString("0.00")}%"; - FuncoesGlobais.PreencheValorProgressBar(pgbPercentualOperacao, Log.Trajetoria.ProgressoTrajeto); + lblPercentualOperacao.Text = $"Operação {LogTrj.ProgressoTrajeto.ToString("0.00")}%"; + FuncoesGlobais.PreencheValorProgressBar(pgbPercentualOperacao, LogTrj.ProgressoTrajeto); bool comTrajetoria = new List() { Enums.ModoOperacao.MapaGPS, Enums.ModoOperacao.RetornoBase }.Contains(Log.Modo); - double distanciaAtual = comTrajetoria ? Log.Trajetoria.DistanciaPercorrida : Log.Movimentacao.DistanciaPercorridaTotal; - double distanciaTotal = comTrajetoria ? LogsOperacao[LogsOperacao.Count - 1].Trajetoria.DistanciaTotal : LogsOperacao[LogsOperacao.Count - 1].Movimentacao.DistanciaPercorridaTotal; + double distanciaAtual = comTrajetoria ? LogTrj.DistanciaPercorrida : LogMov.DistanciaPercorridaTotal; + double distanciaTotal = comTrajetoria ? LogsTrajetoria[LogsTrajetoria.Count - 1].DistanciaTotal : LogsMovimentacao[LogsMovimentacao.Count - 1].DistanciaPercorridaTotal; txtDistanciaPercorrida.Text = distanciaAtual.ToString("0.00") + " m / " + distanciaTotal.ToString("0.00") + " m"; - double percentualRua = Log.Trajetoria.CorredorAtual.Progresso; + double percentualRua = LogTrj.CorredorAtual.Progresso; lblPercentualRua.Text = $"Rua {percentualRua.ToString("0.00")}%"; FuncoesGlobais.PreencheValorProgressBar(pgbPercentualRua, percentualRua); @@ -1178,7 +1235,7 @@ namespace AgroBase.Forms.Operacoes pnlOrientacaoCaminho.Invalidate(); pnlOrientacaoDif.Invalidate(); - OperacaoModel.PopularTreeView(tvwFalhas, Log.ModulosSaude); + OperacaoModel.PopularTreeView(tvwFalhas, LogHw.ModulosSaude); tvwFalhas.ExpandAll(); rtbImpedimento.Text = $"Impedimento: {Log.ErroOperacaoLiberada}"; @@ -1189,12 +1246,12 @@ namespace AgroBase.Forms.Operacoes picCameraCaminho.Image = CarregarImagemCamera(pathImagensCaminho, "_rgb"); AtualizarInformacoesCameraCaminho(); - for (int i = 0; i < LogsOperacao[idxMomentoAtual].Atuador.QtdCamerasSolo; i++) + for (int i = 0; i < LogsAtuador[idxMomentoAtual].QtdCamerasSolo; i++) { Bitmap bitmapSolo = CarregarImagemCamera(pathImagensSolo[i], "_rgb"); if (chbDesenharErvas.Checked) { - var LogCamSolo = LogsOperacao[idxMomentoAtual].OperadorErvas; + var LogCamSolo = LogsWeedWorker[idxMomentoAtual]; if (LogCamSolo != null) { bitmapSolo = DesenharDeteccoesErvas(LogCamSolo.Analise, bitmapSolo); @@ -1228,7 +1285,7 @@ namespace AgroBase.Forms.Operacoes private void AtualizarInformacoesGPS() { - var Log = LogsOperacao.FirstOrDefault(x => x.Momento == MomentoAtual).Gps; + var Log = LogsGPS[idxMomentoAtual]; 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(); @@ -1238,39 +1295,41 @@ namespace AgroBase.Forms.Operacoes txtGPS_Satelites.Text = (Log?.NumeroSatelites ?? 0).ToString(); //txtGPS_DistanciaBase.Text = (Log?.Velocidade ?? 0).ToString("0.00") + " (" + ((Log?.Velocidade ?? 0) * GPSUtils.ConversaoNosKmh).ToString("0.00") + " km/h)"; - var LogLra = LogsOperacao.FirstOrDefault(x => x.Momento == MomentoAtual).DadosLoRa; + //var LogLra = LogsOperacao.FirstOrDefault(x => x.Momento == MomentoAtual).DadosLoRa; + var LogBase = LogsBase[idxMomentoAtual]; - txtGPS_DistanciaBase.Text = ((LogLra?.PosicaoBase?.Latitude != 0 && LogLra?.PosicaoBase?.Longitude != 0) ? GPSUtils.DistanciaEntrePontos(LogLra?.PosicaoBase ?? new GPSModel(), Log ?? new GPSModel()) : 0).ToString("0.00") + " m"; + txtGPS_DistanciaBase.Text = ((LogBase?.Latitude != 0 && LogBase?.Longitude != 0) ? GPSUtils.DistanciaEntrePontos(LogBase ?? new GPSModel(), Log ?? new GPSModel()) : 0).ToString("0.00") + " m"; - GPSService.EnviarCoordenadasParaMapa(Log?.Latitude ?? 0, Log?.Longitude ?? 0, Log?.AnguloCarroDefinido ?? 0, true, LogLra?.EnderecoCarro ?? 0x00); - GPSService.EnviarCoordenadasParaMapa(LogLra?.PosicaoBase?.Latitude ?? 0, LogLra?.PosicaoBase?.Longitude ?? 0, LogLra?.PosicaoBase?.AnguloCarroDefinido ?? 0, false, LogLra?.EnderecoBase ?? 0x01); + GPSService.EnviarCoordenadasParaMapa(Log?.Latitude ?? 0, Log?.Longitude ?? 0, Log?.AnguloCarroDefinido ?? 0, true, 0x02); + GPSService.EnviarCoordenadasParaMapa(LogBase?.Latitude ?? 0, LogBase?.Longitude ?? 0, LogBase?.AnguloCarroDefinido ?? 0, false, 0x01); lblGPS.ForeColor = !Log.Inicializado ? Color.Red : Color.Black; pnlOrientacaoGPS.Invalidate(); - var _trajaetoria = LogsOperacao.Select(x => new PontoTrajetoriaModel(Enums.TipoPontoRua.Indefinido) + var _trajaetoria = LogsGPS.Select(x => new PontoTrajetoriaModel(Enums.TipoPontoRua.Indefinido) { - Posicao = x.Gps + Posicao = x }) .ToList(); - var LogOpe = LogsOperacao.FirstOrDefault(x => x.Momento == MomentoAtual); - var LogSnr = LogOpe.OperadorVisual; - var LogsGPS = LogsOperacao.Select(x => x.Gps).ToList(); + var LogOpe = LogsOperacao[idxMomentoAtual]; + var LogSnr = LogsVisualWorker[idxMomentoAtual]; + var LogTrj = LogsTrajetoria[idxMomentoAtual]; + var LogCtrl = LogsControle[idxMomentoAtual]; MapaDinamico.AtualizarDados( //(LogSnr?.Iniciado ?? false) && LogSnr.Resumo.DirecaoDesvio != Enums.Direcao.Frente ? LogSnr.Resumo.ObstaculoCritico : null, null, - (float)LogOpe.Trajetoria.AnguloCaminho, - (float)LogOpe.Gps.AnguloCarroDefinido, + (float)LogTrj.AnguloCaminho, + (float)Log.AnguloCarroDefinido, Log, _trajaetoria, Variaveis.OperacaoEmAndamento.Trajetoria?._TrajetoriaFixa, new List(LogsGPS.Take(LogsGPS.IndexOf(Log) + 1)), Variaveis.OperacaoEmAndamento.Mapa.TrajetoriaMapa, - LogOpe.Controle.SimulacaoMPC + LogCtrl.SimulacaoMPC ); } @@ -1287,7 +1346,7 @@ namespace AgroBase.Forms.Operacoes private void AtualizarInformacoesMotorDirecional(string ID) { //var Log = LogsDirecional.Where(x => x.Mod_ID == ID).FirstOrDefault(x => x.Momento == MomentoAtual); - var Log = LogsDirecional.Where(x => x.Mod_ID == ID).FirstOrDefault(); + var Log = LogsDirecional[idxMomentoAtual].Modulos.FirstOrDefault(x => x.Modulo_ID == ID); var LogSen = LogsSensoriamento.FirstOrDefault(x => x.Momento == MomentoAtual); double Angulo = Log?.AnguloLeitura ?? 0; @@ -1308,7 +1367,7 @@ namespace AgroBase.Forms.Operacoes pic.Image = FuncoesGlobais.RotacionarImagem(img, Angulo * Multiplicador); Label lbl = FuncoesGlobais.FindControlRecursive