From 59c1326d0a69d70a93468a9c2ceb569054b4528a Mon Sep 17 00:00:00 2001 From: Diego Freitas Date: Wed, 11 Mar 2026 17:11:17 -0300 Subject: [PATCH] Separado componentes Monitoramento e Diagnostico --- .../OperationControl.csproj.user | 12 + .../ConfigConexao/ConfigConexaoViewModel.cs | 2 + .../Diagnostico/DiagnosticoOpcoesViewModel.cs | 192 ++-- .../Diagnostico/DiagnosticoViewModel.cs | 39 +- .../Monitoramento/MonitoramentoViewModel.cs | 13 + .../Views/Operacao/OperacaoBottomViewModel.cs | 205 ++--- .../Views/Operacao/OperacaoCenterViewModel.cs | 3 - .../Views/Operacao/OperacaoRightViewModel.cs | 5 +- .../ViewModels/Windows/DockWindowViewModel.cs | 55 +- .../Views/Operacao/DiagnosticoView.xaml | 678 ++++++++++++++ .../Views/Operacao/DiagnosticoView.xaml.cs | 66 ++ .../Views/Operacao/MonitoramentoView.xaml | 219 +++++ .../Views/Operacao/MonitoramentoView.xaml.cs | 99 ++ .../Views/Operacao/OperacaoBottomView.xaml | 65 -- .../Views/Operacao/OperacaoBottomView.xaml.cs | 34 +- .../Views/Operacao/OperacaoCenterView.xaml | 861 +----------------- .../Views/Operacao/OperacaoCenterView.xaml.cs | 82 +- .../PreparacaoMapa/PreparacaoMapaView.xaml.cs | 2 - .../OperationControl/Windows/DockWindow.xaml | 193 ++-- .../Windows/DockWindow.xaml.cs | 16 +- 20 files changed, 1475 insertions(+), 1366 deletions(-) create mode 100644 AgroBase/OperationControl/ViewModels/Views/Operacao/Monitoramento/MonitoramentoViewModel.cs create mode 100644 AgroBase/OperationControl/Views/Operacao/DiagnosticoView.xaml create mode 100644 AgroBase/OperationControl/Views/Operacao/DiagnosticoView.xaml.cs create mode 100644 AgroBase/OperationControl/Views/Operacao/MonitoramentoView.xaml create mode 100644 AgroBase/OperationControl/Views/Operacao/MonitoramentoView.xaml.cs diff --git a/AgroBase/OperationControl/OperationControl.csproj.user b/AgroBase/OperationControl/OperationControl.csproj.user index a493baac4..2323a885a 100644 --- a/AgroBase/OperationControl/OperationControl.csproj.user +++ b/AgroBase/OperationControl/OperationControl.csproj.user @@ -46,6 +46,12 @@ Code + + Code + + + Code + Code @@ -117,6 +123,12 @@ Designer + + Designer + + + Designer + Designer diff --git a/AgroBase/OperationControl/ViewModels/Views/ConfigConexao/ConfigConexaoViewModel.cs b/AgroBase/OperationControl/ViewModels/Views/ConfigConexao/ConfigConexaoViewModel.cs index 871e855fa..465e4dcb8 100644 --- a/AgroBase/OperationControl/ViewModels/Views/ConfigConexao/ConfigConexaoViewModel.cs +++ b/AgroBase/OperationControl/ViewModels/Views/ConfigConexao/ConfigConexaoViewModel.cs @@ -5,6 +5,8 @@ using System.Windows.Input; using System.Windows.Threading; using OperationControl.Helpers; using OperationControl.Models; +using Brush = System.Windows.Media.Brush; +using Brushes = System.Windows.Media.Brushes; namespace OperationControl.ViewModels { diff --git a/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoOpcoesViewModel.cs b/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoOpcoesViewModel.cs index fd7a9396f..cab6222c9 100644 --- a/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoOpcoesViewModel.cs +++ b/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoOpcoesViewModel.cs @@ -80,8 +80,8 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico private string _bicoAnguloTexto = "00°"; public string BicoAnguloTexto { get => _bicoAnguloTexto; set => SetProperty(ref _bicoAnguloTexto, value); } - private string _bicoAnguloAbertura = "0"; - public string BicoAnguloAbertura { get => _bicoAnguloAbertura; set => SetProperty(ref _bicoAnguloAbertura, value); } + private double _bicoAnguloAbertura = 0; + public double BicoAnguloAbertura { get => _bicoAnguloAbertura; set => SetProperty(ref _bicoAnguloAbertura, value); } private string _txtBicoComando = "—"; public string TxtBicoComando { get => _txtBicoComando; set => SetProperty(ref _txtBicoComando, value); } @@ -138,14 +138,14 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico #region DIRECIONAL - public ObservableCollection DirMovimentosDisponiveis { get; } = new(); - public ObservableCollection DirDirecoesDisponiveis { get; } = new(); + public ObservableCollection DirMovimentosDisponiveis { get; } = new(); + public ObservableCollection DirDirecoesDisponiveis { get; } = new(); - private string _dirMovimentoSelecionado; - public string DirMovimentoSelecionado { get => _dirMovimentoSelecionado; set => SetProperty(ref _dirMovimentoSelecionado, value); } + private TipoMovimentoDirecional _dirMovimentoSelecionado; + public TipoMovimentoDirecional DirMovimentoSelecionado { get => _dirMovimentoSelecionado; set => SetProperty(ref _dirMovimentoSelecionado, value); } - private string _dirDirecaoSelecionada; - public string DirDirecaoSelecionada { get => _dirDirecaoSelecionada; set => SetProperty(ref _dirDirecaoSelecionada, value); } + private Direcao _dirDirecaoSelecionada; + public Direcao DirDirecaoSelecionada { get => _dirDirecaoSelecionada; set => SetProperty(ref _dirDirecaoSelecionada, value); } private double _dirAngulo; public double DirAngulo @@ -359,11 +359,11 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico private bool _npcCoolerSaida; public bool NpcCoolerSaida { get => _npcCoolerSaida; set => SetProperty(ref _npcCoolerSaida, value); } - private string _npcCoolerTempOn = "0"; - public string NpcCoolerTempOn { get => _npcCoolerTempOn; set => SetProperty(ref _npcCoolerTempOn, value); } + private double _npcCoolerTempOn = 0; + public double NpcCoolerTempOn { get => _npcCoolerTempOn; set => SetProperty(ref _npcCoolerTempOn, value); } - private string _npcCoolerTempTurbo = "0"; - public string NpcCoolerTempTurbo { get => _npcCoolerTempTurbo; set => SetProperty(ref _npcCoolerTempTurbo, value); } + private double _npcCoolerTempTurbo = 0; + public double NpcCoolerTempTurbo { get => _npcCoolerTempTurbo; set => SetProperty(ref _npcCoolerTempTurbo, value); } private string _txtNpcCoolerModo = "—"; public string TxtNpcCoolerModo { get => _txtNpcCoolerModo; set => SetProperty(ref _txtNpcCoolerModo, value); } @@ -409,11 +409,10 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico public DiagnosticoOpcoesViewModel() { - foreach (var nome in Enum.GetNames(typeof(TipoMovimentoDirecional))) - DirMovimentosDisponiveis.Add(nome); + DirDirecoesDisponiveis = new ObservableCollection() { Direcao.Parado, Direcao.Esquerda, Direcao.Direita }; - foreach (var nome in Enum.GetNames(typeof(Direcao))) - DirDirecoesDisponiveis.Add(nome); + foreach (var modo in Enum.GetValues()) + DirMovimentosDisponiveis.Add(modo); foreach (var modo in Enum.GetValues()) NpcCoolerModosDisponiveis.Add(modo); @@ -443,13 +442,16 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico NpcCoolerEnviarCommand = new RelayCommand(_ => NpcCoolerEnviar()); } - public void Atualizar(DiagnosticoModuloItemViewModel item, OperacaoParametrosModel dados) + public void Atualizar(DiagnosticoModuloItemViewModel item, OperacaoParametrosModel dados, bool clicado) { _itemAtual = item; _dadosAtual = dados; - ResetarVisibilidades(); - ResetarCampos(); + if (clicado) + { + ResetarVisibilidades(); + ResetarCampos(); + } if (_itemAtual == null || _dadosAtual?.DadosLeitura == null) { @@ -466,22 +468,25 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico { case S_Code.sMOD: MostrarOpcoesAtuador = true; - BarraAltura = rover.Controle?.AlturaBarra ?? 0; + if (clicado) + { + BarraAltura = rover.Controle?.AlturaBarra ?? 0; + } break; case S_Code.sBIC: MostrarOpcoesBico = true; - PreencherBico(rover); + PreencherBico(rover, clicado); break; case S_Code.sBMB: MostrarOpcoesBomba = true; - PreencherBomba(rover); + PreencherBomba(rover, clicado); break; case S_Code.sSRV: MostrarOpcoesServo = true; - PreencherServoAtuador(rover); + PreencherServoAtuador(rover, clicado); break; default: @@ -499,12 +504,12 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico case S_Code.sRLE: MostrarOpcoesRele = true; - PreencherRele(rover); + PreencherRele(rover, clicado); break; case S_Code.sSRV: MostrarOpcoesServo = true; - PreencherServoSensoriamento(rover); + PreencherServoSensoriamento(rover, clicado); break; default: @@ -515,22 +520,22 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico case T_Code.Dir: MostrarOpcoesDirecional = true; - PreencherDirecional(rover); + PreencherDirecional(rover, clicado); break; case T_Code.Gps: MostrarOpcoesGps = true; - PreencherGps(rover); + PreencherGps(rover, clicado); break; case T_Code.Trj: MostrarOpcoesTrajetoria = true; - PreencherTrajetoria(rover); + PreencherTrajetoria(rover, clicado); break; case T_Code.Npc: MostrarOpcoesNpc = true; - PreencherNpc(rover); + PreencherNpc(rover, clicado); break; default: @@ -541,7 +546,7 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico #region PREENCHIMENTO - private void PreencherBico(OperacaoParametrosDadosModel rover) + private void PreencherBico(OperacaoParametrosDadosModel rover, bool clicado) { var bico = rover?.Atuador?.Bicos?.FirstOrDefault(x => x.ID == _itemAtual.LabelModulo); BicoTitulo = $"Bico {_itemAtual.LabelModulo} - Testes"; @@ -551,11 +556,14 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico TxtBicoVazao = $"{bico?.VazaoInstantaneaMLs ?? 0:0.##} mL/s"; TxtBicoPressao = $"{rover?.Atuador?.PressaoLinhaPsi ?? 0:0.##} psi"; TxtBicoAtuacoes = $"{bico?.QtdAtuacoes ?? 0}"; - BicoAngulo = bico?.ComandoAngulo ?? 0; - BicoAnguloAbertura = (bico?.AnguloAbertura ?? 0).ToString(); + if (clicado) + { + BicoAngulo = bico?.ComandoAngulo ?? 0; + BicoAnguloAbertura = bico?.AnguloAbertura ?? 0; + } } - private void PreencherBomba(OperacaoParametrosDadosModel rover) + private void PreencherBomba(OperacaoParametrosDadosModel rover, bool clicado) { var bomba = rover?.Atuador?.Bombas?.FirstOrDefault(x => x.ID == _itemAtual.LabelModulo); BombaTitulo = $"Bomba {_itemAtual.LabelModulo} - Testes"; @@ -563,10 +571,13 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico TxtBombaStatusReal = (bomba?.LeituraEstado ?? false) ? "Ligado" : "Desligado"; TxtBombaPressaoLinha = $"{rover?.Atuador?.PressaoLinhaPsi ?? 0:0.##} psi"; TxtBombaPotencia = $"{bomba?.Potencia ?? 0:0.#} %"; - BombaPressaoAlvo = bomba?.Potencia ?? 0; + if (clicado) + { + BombaPressaoAlvo = bomba?.Potencia ?? 0; + } } - private void PreencherDirecional(OperacaoParametrosDadosModel rover) + private void PreencherDirecional(OperacaoParametrosDadosModel rover, bool clicado) { var mod = rover?.Direcional?.Modulos?.FirstOrDefault(x => x.Mod_ID == _itemAtual.LabelModulo); DirTitulo = $"Direcional {_itemAtual.LabelModulo} - Testes"; @@ -574,23 +585,29 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico TxtDirSentido = $"{mod?.SentidoReal ?? Sentido.Parado}"; TxtDirAnguloSP = $"{mod?.Angulo_SP ?? 0:0.00}°"; TxtDirAngulo = $"{mod?.AnguloDriver ?? 0:0.00}°"; - DirAngulo = mod?.Angulo_SP ?? 0; + if (clicado) + { + DirAngulo = mod?.Angulo_SP ?? 0; + } } - private void PreencherGps(OperacaoParametrosDadosModel rover) + private void PreencherGps(OperacaoParametrosDadosModel rover, bool clicado) { var dados = rover?.Gnss; - GpsLeverArmLateral = (dados?.LeverArmLateral ?? 0) / 10.0; - GpsLeverArmFrontal = (dados?.LeverArmFrontal ?? 0) / 10.0; TxtGpsCorrecao = $"{dados?.QualidadeFix ?? TiposCorrecaoGPS.SemCorrecao}"; TxtGpsIdade = $"{dados?.IdadeCorrecao ?? -1}"; TxtGpsPrecisao = $"{dados?.PrecisaoCm ?? -1}"; TxtGpsNSatelites = $"{dados?.NumeroSatelites ?? 0}"; TxtGpsDistBase = "0"; TxtGpsOrientacao = $"{dados?.OrientacaoReal ?? 0}"; + if (clicado) + { + GpsLeverArmLateral = (dados?.LeverArmLateral ?? 0) / 10.0; + GpsLeverArmFrontal = (dados?.LeverArmFrontal ?? 0) / 10.0; + } } - private void PreencherTrajetoria(OperacaoParametrosDadosModel rover) + private void PreencherTrajetoria(OperacaoParametrosDadosModel rover, bool clicado) { var dados = rover?.Trajetoria?.AutonomiaCorredor; TxtTrajetoriaDistCorredor = $"{dados?.DistanciaCorredor_m ?? 0:0.00} m"; @@ -600,11 +617,14 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico TxtTrajetoriaBatOk = (dados?.BateriaSuficiente ?? false) ? "Sim" : "Não"; TxtTrajetoriaHerbOk = (dados?.HerbicidaSuficiente ?? false) ? "Sim" : "Não"; TrajetoriaPodeConfirmar = !(dados?.Liberado ?? false); - TrajetoriaBatLiberada = true; // dados?.BateriaSuficiente ?? false; - TrajetoriaHerbLiberado = true; // dados?.HerbicidaSuficiente ?? false; + if (clicado) + { + TrajetoriaBatLiberada = dados?.BateriaSuficiente ?? false; + TrajetoriaHerbLiberado = dados?.HerbicidaSuficiente ?? false; + } } - private void PreencherRele(OperacaoParametrosDadosModel rover) + private void PreencherRele(OperacaoParametrosDadosModel rover, bool clicado) { var rele = rover?.Sensoriamento?.Reles?.FirstOrDefault(x => x.ID == _itemAtual.LabelModulo); ReleTitulo = $"Relé {_itemAtual.LabelModulo} - Testes"; @@ -612,37 +632,45 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico TxtReleStatusReal = (rele?.LeituraEstado ?? false) ? "Ligado" : "Desligado"; } - private void PreencherServoSensoriamento(OperacaoParametrosDadosModel rover) + private void PreencherServoSensoriamento(OperacaoParametrosDadosModel rover, bool clicado) { var servo = rover?.Sensoriamento?.Servos?.FirstOrDefault(x => x.ID == _itemAtual.LabelModulo); TxtServoComando = $"{servo?.ComandoAngulo ?? 0}°"; TxtServoLeitura = $"{servo?.LeituraAngulo ?? 0}°"; TxtServoIncremental = (servo?.Incremental ?? false) ? "Incremental" : "Decremental"; - ServoAngulo = servo?.ComandoAngulo ?? 0; + if (clicado) + { + ServoAngulo = servo?.ComandoAngulo ?? 0; + } } - private void PreencherServoAtuador(OperacaoParametrosDadosModel rover) + private void PreencherServoAtuador(OperacaoParametrosDadosModel rover, bool clicado) { var servo = rover?.Atuador?.Servos?.FirstOrDefault(x => x.ID == _itemAtual.LabelModulo); TxtServoComando = $"{servo?.ComandoAngulo ?? 0}°"; TxtServoLeitura = $"{servo?.LeituraAngulo ?? 0}°"; TxtServoIncremental = (servo?.Incremental ?? false) ? "Incremental" : "Decremental"; - ServoAngulo = servo?.ComandoAngulo ?? 0; + if (clicado) + { + ServoAngulo = servo?.ComandoAngulo ?? 0; + } } - private void PreencherNpc(OperacaoParametrosDadosModel rover) + private void PreencherNpc(OperacaoParametrosDadosModel rover, bool clicado) { var dados = rover?.Refrigeracao; TxtNpcCoolerModo = $"{dados?.Modo}"; TxtNpcCoolerTemperatura = $"{dados?.Temperatura ?? 0:0.00} °C"; TxtNpcCoolerEntrada = $"{dados?.EstadoEntrada} ({dados?.LeituraEntrada})"; TxtNpcCoolerSaida = $"{dados?.EstadoSaida} ({dados?.LeituraSaida})"; - - NpcCoolerModoSelecionado = dados?.Modo ?? CoolerMode.Off; - NpcCoolerEntrada = (dados?.EstadoEntrada ?? Estado.Desligado) == Estado.Ligado; - NpcCoolerSaida = (dados?.EstadoSaida ?? Estado.Desligado) == Estado.Ligado; - NpcCoolerTempOn = $"{dados?.TemperaturaLigar ?? 0}"; - NpcCoolerTempTurbo = $"{dados?.TemperaturaTurbo ?? 0}"; + if (clicado) + { + NpcCoolerModoSelecionado = dados?.Modo ?? CoolerMode.Off; + NpcCoolerEntrada = (dados?.EstadoEntrada ?? Estado.Desligado) == Estado.Ligado; + NpcCoolerSaida = (dados?.EstadoSaida ?? Estado.Desligado) == Estado.Ligado; + NpcCoolerTempOn = dados?.TemperaturaLigar ?? 0; + NpcCoolerTempTurbo = dados?.TemperaturaTurbo ?? 0; + } } #endregion @@ -668,7 +696,7 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico { BarraAltura = 0; BicoAngulo = 0; - BicoAnguloAbertura = "0"; + BicoAnguloAbertura = 0; BombaPressaoAlvo = 0; DirAngulo = 0; GpsLeverArmLateral = 0; @@ -678,8 +706,8 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico ServoAngulo = 0; NpcCoolerEntrada = false; NpcCoolerSaida = false; - NpcCoolerTempOn = "0"; - NpcCoolerTempTurbo = "0"; + NpcCoolerTempOn = 0; + NpcCoolerTempTurbo = 0; } #endregion @@ -689,13 +717,19 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico private void SensoriamentoReiniciar() { if (_itemAtual?.Modulo != T_Code.Sen) return; - VariaveisControleOperacao.EnviarComandoSensoriamento(_itemAtual.LabelModulo, true); + if (MessageBox.Show("Tem certeza que deseja reiniciar o módulo Sensoriamento?", "Reiniciar Módulo", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + VariaveisControleOperacao.EnviarComandoSensoriamento(_itemAtual.LabelModulo, true); + } } private void AtuadorReiniciar() { if (_itemAtual?.Modulo != T_Code.Atu) return; - VariaveisControleOperacao.EnviarComandoAtuador(_itemAtual.LabelModulo, true); + if (MessageBox.Show("Tem certeza que deseja reiniciar o módulo Atuador?", "Reiniciar Módulo", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + VariaveisControleOperacao.EnviarComandoAtuador(_itemAtual.LabelModulo, true); + } } private void BarraMover() @@ -725,8 +759,7 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico private void BicoSalvarAnguloAbertura() { if (_itemAtual?.Modulo != T_Code.Atu || _itemAtual.SCode != S_Code.sBIC) return; - if (!int.TryParse(BicoAnguloAbertura, out int ang)) return; - VariaveisControleOperacao.EnviarComandoAtuador(_itemAtual.LabelModulo, angulo_abertura: ang); + VariaveisControleOperacao.EnviarComandoAtuador(_itemAtual.LabelModulo, angulo_abertura: BicoAnguloAbertura); } private void BombaLigar() @@ -744,36 +777,35 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico private void DirReferenciar() { if (_itemAtual?.Modulo != T_Code.Dir) return; - VariaveisControleOperacao.EnviarComandoReferenciamento(mod_id: _itemAtual.LabelModulo); + if (MessageBox.Show("Tem certeza que deseja realizar o referenciamento?", "Referenciar", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + VariaveisControleOperacao.EnviarComandoReferenciamento(mod_id: _itemAtual.LabelModulo); + } } private void DirMovimentar() { if (_itemAtual?.Modulo != T_Code.Dir) return; - if (string.IsNullOrWhiteSpace(DirMovimentoSelecionado) || string.IsNullOrWhiteSpace(DirDirecaoSelecionada)) return; - - var tipo = (TipoMovimentoDirecional)Enum.Parse(typeof(TipoMovimentoDirecional), DirMovimentoSelecionado); - var direcao = (Direcao)Enum.Parse(typeof(Direcao), DirDirecaoSelecionada); - VariaveisControleOperacao.EnviarComandoDirecional(direcao, Convert.ToInt32(DirAngulo), tipo, mod_id: _itemAtual.LabelModulo); + VariaveisControleOperacao.EnviarComandoDirecional(DirDirecaoSelecionada, DirAngulo, DirMovimentoSelecionado, mod_id: _itemAtual.LabelModulo); } private void GpsSalvar() { - VariaveisControleOperacao.EnviarComandoLeverArm( - lateral: GpsLeverArmLateral * 10.0, - frontal: GpsLeverArmFrontal * 10.0); + if (MessageBox.Show("Tem certeza que deseja redefinir o lever arm do GNSS?", "Lever Arm", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + VariaveisControleOperacao.EnviarComandoLeverArm(lateral: GpsLeverArmLateral * 10.0, frontal: GpsLeverArmFrontal * 10.0); + } } private void TrajetoriaConfirmar() { if (_itemAtual?.Modulo != T_Code.Trj) return; - var trj = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Trajetoria; int idxCorredor = trj?.PontoAtualIdxCorredor ?? 0; - VariaveisControleOperacao.EnviarConfirmacaoHumanaTrajetoria( - idxCorredor, - TrajetoriaBatLiberada, - TrajetoriaHerbLiberado); + if (MessageBox.Show($"Tem certeza que deseja liberar a operação no corredor {idxCorredor + 1}?", "Liberação", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + VariaveisControleOperacao.EnviarConfirmacaoHumanaTrajetoria(idxCorredor, TrajetoriaBatLiberada, TrajetoriaHerbLiberado); + } } private void ReleLigar() @@ -816,15 +848,7 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico var entrada = NpcCoolerEntrada ? Estado.Ligado : Estado.Desligado; var saida = NpcCoolerSaida ? Estado.Ligado : Estado.Desligado; - double.TryParse(NpcCoolerTempOn, out double tempOn); - double.TryParse(NpcCoolerTempTurbo, out double tempTurbo); - - VariaveisControleOperacao.EnviarComandoCoolerControl( - modo, - entrada: entrada, - saida: saida, - temp_on: tempOn, - temp_turbo: tempTurbo); + VariaveisControleOperacao.EnviarComandoCoolerControl(modo, entrada: entrada, saida: saida, temp_on: NpcCoolerTempOn, temp_turbo: NpcCoolerTempTurbo); } #endregion diff --git a/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoViewModel.cs b/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoViewModel.cs index fdce23d12..f5ddadc35 100644 --- a/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoViewModel.cs +++ b/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoViewModel.cs @@ -36,7 +36,7 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico _moduloSelecionado.Selecionado = true; OnPropertyChanged(); - AtualizarResumoModuloSelecionado(); + AtualizarResumoModuloSelecionado(true); } } @@ -173,8 +173,22 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico ModuloSelecionado = item; } - #region RESUMO + public void AbrirModuloPorAlerta(T_Code modulo, string? modId) + { + ModuloSelecionado = DiagnosticoModulos.FirstOrDefault(x => x.Modulo == modulo && x.LabelModulo == modId); + if (ModuloSelecionado == null) + ModuloSelecionado = DiagnosticoModulos.FirstOrDefault(x => x.Modulo == modulo && x.SCode == S_Code.sMOD); + if (ModuloSelecionado == null) + ModuloSelecionado = DiagnosticoModulos.FirstOrDefault(x => x.Modulo == modulo); + } + #region RESUMO + private string _impedimentoOperacaoTexto = "Impedimento: Nenhum"; + public string ImpedimentoOperacaoTexto + { + get => _impedimentoOperacaoTexto; + set => SetProperty(ref _impedimentoOperacaoTexto, value); + } private string _tituloModuloSelecionado = "Nenhum módulo selecionado"; public string TituloModuloSelecionado { @@ -292,11 +306,17 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico set => SetProperty(ref _infoIdVisual, value); } - private void AtualizarResumoModuloSelecionado() + private void AtualizarResumoModuloSelecionado(bool clicado) { CondicoesOperacionais.Clear(); LogsModuloSelecionado.Clear(); + var impedimento = _dadosOperacaoAtual?.DadosLeitura?.Operacao?.ImpedimentoErro; + if (string.IsNullOrWhiteSpace(impedimento)) + ImpedimentoOperacaoTexto = "Impedimento: Nenhum"; + else + ImpedimentoOperacaoTexto = $"Impedimento: " + impedimento.Replace("\r\n", "\n").Replace("\n\n", "; ").Replace("\n", "; ").Trim(); + if (ModuloSelecionado == null || _dadosOperacaoAtual == null) { TituloModuloSelecionado = "Nenhum módulo selecionado"; @@ -360,8 +380,11 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico InfoLatencia = $"Latência: {dispositivo?.Latencia ?? 0} ms"; ImpedimentoModuloSelecionado = $"Impedimento: {(string.IsNullOrWhiteSpace(motivos) ? "Nenhum" : motivos)}"; - MandatorioSelecionado = item.Mandatorio; - EmUsoSelecionado = item.EmUso; + if (clicado) + { + MandatorioSelecionado = item.Mandatorio; + EmUsoSelecionado = item.EmUso; + } if (saudeModulo?.condicoes_operacionais != null) { @@ -381,7 +404,7 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico LogsModuloSelecionado.Add($"{log.Momento:HH:mm:ss.fff} - {log.Mensagem}"); } - OpcoesVM?.Atualizar(ModuloSelecionado, _dadosOperacaoAtual); + OpcoesVM?.Atualizar(ModuloSelecionado, _dadosOperacaoAtual, clicado); AtualizarGraficoModuloSelecionado(); } @@ -400,7 +423,7 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico item.Iniciado = ObterIniciado(item, dados); } - AtualizarResumoModuloSelecionado(); + AtualizarResumoModuloSelecionado(false); } private StatusModulo ObterStatusModulo(DiagnosticoModuloItemViewModel item, OperacaoParametrosModel dados) @@ -581,7 +604,7 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico ModuloSelecionado.Mandatorio = MandatorioSelecionado; ModuloSelecionado.EmUso = EmUsoSelecionado; - AtualizarResumoModuloSelecionado(); + AtualizarResumoModuloSelecionado(true); } diff --git a/AgroBase/OperationControl/ViewModels/Views/Operacao/Monitoramento/MonitoramentoViewModel.cs b/AgroBase/OperationControl/ViewModels/Views/Operacao/Monitoramento/MonitoramentoViewModel.cs new file mode 100644 index 000000000..eab81d75f --- /dev/null +++ b/AgroBase/OperationControl/ViewModels/Views/Operacao/Monitoramento/MonitoramentoViewModel.cs @@ -0,0 +1,13 @@ +using OperationControl.ViewModels.Base; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace OperationControl.ViewModels.Views.Operacao.Monitoramento +{ + public class MonitoramentoViewModel : NotifyBase + { + } +} diff --git a/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoBottomViewModel.cs b/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoBottomViewModel.cs index 09a87d13c..1eb05c803 100644 --- a/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoBottomViewModel.cs +++ b/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoBottomViewModel.cs @@ -3,23 +3,38 @@ using System.Collections.ObjectModel; using System.ComponentModel; using System.Windows.Threading; using static AgroBase.Models.Enums; -using Application = System.Windows.Application; namespace OperationControl.ViewModels.Views.Operacao { public class OperacaoBottomViewModel : INotifyPropertyChanged { + public ObservableCollection AlertasAtivos { get; } = new(); + private AlertaModel _toastAlerta; - private AlertaModel _alertaSelecionado; + public AlertaModel ToastAlerta + { + get => _toastAlerta; + set + { + if (_toastAlerta == value) return; + _toastAlerta = value; + OnPropertyChanged(nameof(ToastAlerta)); + } + } + private readonly DispatcherTimer _toastTimer; + public event PropertyChangedEventHandler PropertyChanged; + protected void OnPropertyChanged(string name) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); + + // EVENTO PARA O PAI TRATAR A NAVEGAÇÃO + public event Action SolicitarAbrirDiagnostico; + public OperacaoBottomViewModel() { - AlertasAtivos = new ObservableCollection(); - _toastTimer = new DispatcherTimer { - Interval = TimeSpan.FromSeconds(5) + Interval = TimeSpan.FromSeconds(6) }; _toastTimer.Tick += (s, e) => @@ -29,115 +44,17 @@ namespace OperationControl.ViewModels.Views.Operacao }; } - public ObservableCollection AlertasAtivos { get; } - - public AlertaModel ToastAlerta - { - get => _toastAlerta; - set - { - if (_toastAlerta != value) - { - _toastAlerta = value; - OnPropertyChanged(nameof(ToastAlerta)); - } - } - } - - public AlertaModel AlertaSelecionado - { - get => _alertaSelecionado; - set - { - if (_alertaSelecionado != value) - { - _alertaSelecionado = value; - OnPropertyChanged(nameof(AlertaSelecionado)); - } - } - } - - public event PropertyChangedEventHandler PropertyChanged; - public event Action AlertaSelecionadoChanged; - public void SelecionarAlerta(AlertaModel alerta) { if (alerta == null) return; - AlertaSelecionado = alerta; - AlertaSelecionadoChanged?.Invoke(alerta); + SolicitarAbrirDiagnostico?.Invoke(alerta); } - public void AdicionarAlerta(string roverId, T_Code modulo, SeveridadeAlerta severidade, string mensagem, string modId = null) + public void LimparToast() { - if (!Application.Current.Dispatcher.CheckAccess()) - { - Application.Current.Dispatcher.BeginInvoke(new Action(() => - AdicionarAlerta(roverId, modulo, severidade, mensagem, modId))); - return; - } - - var existente = AlertasAtivos.FirstOrDefault(x => - x.Rover_ID == roverId && - x.Modulo == modulo && - x.Mod_ID == modId); - - if (existente == null) - { - var alerta = new AlertaModel - { - Rover_ID = roverId, - Modulo = modulo, - Mod_ID = modId, - Severidade = severidade, - Mensagem = mensagem, - Timestamp = DateTime.Now - }; - - AlertasAtivos.Insert(0, alerta); - MostrarToast(alerta); - } - else - { - existente.Mensagem = mensagem; - existente.Severidade = severidade; - existente.Timestamp = DateTime.Now; - - // caso o model nao implemente INotifyPropertyChanged, - // forçamos um refresh simples: - RecarregarAlerta(existente); - } - - OnPropertyChanged(nameof(AlertasAtivos)); - } - - public void RemoverAlerta(string roverId, T_Code modulo, SeveridadeAlerta? severidade = null, string modId = null) - { - if (!Application.Current.Dispatcher.CheckAccess()) - { - Application.Current.Dispatcher.BeginInvoke(new Action(() => - RemoverAlerta(roverId, modulo, severidade, modId))); - return; - } - - var alerta = AlertasAtivos.FirstOrDefault(x => - x.Rover_ID == roverId && - x.Modulo == modulo && - x.Mod_ID == modId && - (severidade != null ? x.Severidade == severidade : true)); - - if (alerta != null) - { - AlertasAtivos.Remove(alerta); - - if (ReferenceEquals(ToastAlerta, alerta)) - ToastAlerta = null; - - if (ReferenceEquals(AlertaSelecionado, alerta)) - AlertaSelecionado = null; - } - - OnPropertyChanged(nameof(AlertasAtivos)); + _toastTimer.Stop(); + ToastAlerta = null; } public void MostrarToast(AlertaModel alerta) @@ -147,47 +64,67 @@ namespace OperationControl.ViewModels.Views.Operacao _toastTimer.Start(); } - public void LimparToast() + public void AdicionarAlerta(string roverId, AgroBase.Models.Enums.T_Code modulo, SeveridadeAlerta severidade, string mensagem, string? modId = null) { - _toastTimer.Stop(); - ToastAlerta = null; - } - - public void DefinirAlertas(params AlertaModel[] alertas) - { - if (!Application.Current.Dispatcher.CheckAccess()) + App.Current.Dispatcher.BeginInvoke(new Action(() => { - Application.Current.Dispatcher.BeginInvoke(new Action(() => DefinirAlertas(alertas))); - return; - } + var existente = AlertasAtivos.FirstOrDefault(x => + x.Rover_ID == roverId && + x.Modulo == modulo && + x.Mod_ID == modId); - AlertasAtivos.Clear(); + if (existente == null) + { + var alerta = new AlertaModel + { + Rover_ID = roverId, + Modulo = modulo, + Mod_ID = modId, + Severidade = severidade, + Mensagem = mensagem, + Timestamp = DateTime.Now + }; - if (alertas != null) - { - foreach (var alerta in alertas) AlertasAtivos.Add(alerta); - } - - OnPropertyChanged(nameof(AlertasAtivos)); + MostrarToast(alerta); + } + else + { + existente.Mensagem = mensagem; + existente.Severidade = severidade; + } + })); } - private void RecarregarAlerta(AlertaModel alerta) + public void RemoverAlerta(string roverId, AgroBase.Models.Enums.T_Code modulo, SeveridadeAlerta? severidade = null, string? modId = null) { - var idx = AlertasAtivos.IndexOf(alerta); - if (idx >= 0) + App.Current.Dispatcher.BeginInvoke(new Action(() => { - AlertasAtivos.RemoveAt(idx); - AlertasAtivos.Insert(idx, alerta); - } + var alerta = AlertasAtivos.FirstOrDefault(x => + x.Rover_ID == roverId && + x.Modulo == modulo && + x.Mod_ID == modId && + (severidade != null ? x.Severidade == severidade : true)); + + if (alerta != null) + AlertasAtivos.Remove(alerta); + })); } - private void OnPropertyChanged(string nome) + public void ClicarNoAlerta(AlertaModel alerta) { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nome)); + if (alerta == null) return; + SelecionarAlerta(alerta); } + public void ClicarNoToast() + { + var alerta = ToastAlerta; + if (alerta == null) return; + LimparToast(); + SelecionarAlerta(alerta); + } public void AtualizarListaAlertasRoverSelecionado(string rover_id) { @@ -244,6 +181,6 @@ namespace OperationControl.ViewModels.Views.Operacao } } } - + } } \ No newline at end of file diff --git a/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoCenterViewModel.cs b/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoCenterViewModel.cs index 86ec9ef23..7401a090d 100644 --- a/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoCenterViewModel.cs +++ b/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoCenterViewModel.cs @@ -1,14 +1,11 @@ using OperationControl.Controls; using OperationControl.Models; -using OperationControl.ViewModels.Views.Operacao.Diagnostico; using System.ComponentModel; namespace OperationControl.ViewModels.Views.Operacao { public class OperacaoCenterViewModel : INotifyPropertyChanged { - public DiagnosticoViewModel DiagnosticoVM { get; set; } = new DiagnosticoViewModel(); - public OperacaoCenterViewModel() { diff --git a/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoRightViewModel.cs b/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoRightViewModel.cs index f6bd4577a..0d4b1ff76 100644 --- a/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoRightViewModel.cs +++ b/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoRightViewModel.cs @@ -24,7 +24,7 @@ namespace OperationControl.ViewModels.Views.Operacao Rovers = new ObservableCollection(); ToggleCollapseCommand = new RelayCommand(_ => ToggleCollapse()); - SelecionarRoverCommand = new RelayCommand(p => SelecionarRover(p as RoverCardModel)); + SelecionarRoverCommand = new RelayCommand(p => SelecionarRover((p as RoverCardModel).NumeroSerie)); SelecionarSecaoCommand = new RelayCommand(p => { if (p is SecaoRightBar secao) @@ -133,8 +133,9 @@ namespace OperationControl.ViewModels.Views.Operacao IsCollapsed = !IsCollapsed; } - public void SelecionarRover(RoverCardModel rover) + public void SelecionarRover(string roverId) { + var rover = Rovers.FirstOrDefault(x => x.NumeroSerie == roverId); RoverSelecionado = rover; if (RoverSelecionado != null) diff --git a/AgroBase/OperationControl/ViewModels/Windows/DockWindowViewModel.cs b/AgroBase/OperationControl/ViewModels/Windows/DockWindowViewModel.cs index 619405aee..375a18fd0 100644 --- a/AgroBase/OperationControl/ViewModels/Windows/DockWindowViewModel.cs +++ b/AgroBase/OperationControl/ViewModels/Windows/DockWindowViewModel.cs @@ -8,6 +8,7 @@ using OperationControl.Views.Operacao; using AgroBase.Models.Operacoes; using Newtonsoft.Json.Linq; using OperationControl.ViewModels.Views.Operacao; +using OperationControl.Controls; namespace OperationControl.ViewModels { @@ -25,6 +26,8 @@ namespace OperationControl.ViewModels public readonly OperacaoRightView _viewOperacaoRight; public readonly OperacaoBottomView _viewOperacaoBottom; + public OperacaoBottomViewModel BottomVM => _viewOperacaoBottom?._vm; + private DockStep _currentStep; public DockWindowViewModel() @@ -56,7 +59,7 @@ namespace OperationControl.ViewModels _viewOperacaoRight._vm.SalvarParametrosSolicitado += OnSalvarParametrosSolicitado; _viewOperacaoBottom = new OperacaoBottomView(); - _viewOperacaoBottom._vm.AlertaSelecionadoChanged += OnAlertaSelecionadoChanged; + _viewOperacaoBottom._vm.SolicitarAbrirDiagnostico += AbrirDiagnosticoPeloAlerta; // Commands BackCommand = new RelayCommand(_ => GoBack(), _ => CanGoBack); @@ -331,6 +334,7 @@ namespace OperationControl.ViewModels CenterContent = _viewPreparacaoMapa; BottomContent = _viewPreparacaoMapaBottom; RightContent = CriarBotaoNextSimples(); + CriarMarcadorBase(_viewPreparacaoMapa?.MapaPreparacao); break; case DockStep.ParametrizacaoRover: @@ -339,6 +343,7 @@ namespace OperationControl.ViewModels CenterContent = _viewOperacaoCenter; RightContent = _viewOperacaoRight; BottomContent = _viewOperacaoBottom; + CriarMarcadorBase(_viewOperacaoCenter?.MapaOperacao); if (!string.IsNullOrWhiteSpace(_ultimoMapaCarregado)) _viewOperacaoCenter?.MapaOperacao?.LoadMapFile(_ultimoMapaCarregado); @@ -391,12 +396,28 @@ namespace OperationControl.ViewModels private string? _ultimoMapaCarregado; + private void CriarMarcadorBase(MapViewControl Mapa) + { + string markerId = VariaveisControleOperacao.BaseMarkerID; + if (!Mapa?.markers?.Added(markerId) ?? false) + { + Mapa?.markers?.AddMarker( + markerId, + true, + lat: Variaveis.GpsService?.UltimaLeitura?.Latitude, + lon: Variaveis.GpsService?.UltimaLeitura?.Longitude, + heading: Variaveis.GpsService?.UltimaLeitura?.OrientacaoReal, + label: "Base" + ); + } + } + private void OnCarregarMapaSolicitado(string caminhoArquivo) { try { _ultimoMapaCarregado = caminhoArquivo; - _viewPreparacaoMapa?.MapControl?.LoadMapFile(caminhoArquivo); + _viewPreparacaoMapa?.MapaPreparacao?.LoadMapFile(caminhoArquivo); MapaCarregado = true; _viewPreparacaoMapaBottom?._vm.AtualizarProgresso(0, $"Mapa carregado: {System.IO.Path.GetFileName(caminhoArquivo)}"); } @@ -516,26 +537,24 @@ namespace OperationControl.ViewModels } - private void OnAlertaSelecionadoChanged(AlertaModel alerta) + private void AbrirDiagnosticoPeloAlerta(AlertaModel alerta) { - if (alerta == null) return; + if (alerta == null) + return; - AtualizarTopOperacaoAlerta( - $"ALERTA {alerta.Rover_ID}", - $"{alerta.Titulo}: {alerta.Mensagem}" - ); - - // depois você pode navegar para diagnostico, abrir popup, focar modulo, etc + _viewOperacaoRight?._vm?.SelecionarRover(alerta.Rover_ID); + _viewOperacaoRight?._vm?.SelecionarSecao(SecaoRightBar.Diagnostico); + _viewOperacaoCenter?.Diagnostico?._vm?.AbrirModuloPorAlerta(alerta.Modulo, alerta.Mod_ID); } public void AdicionarAlerta(string roverId, AgroBase.Models.Enums.T_Code modulo, SeveridadeAlerta severidade, string mensagem, string modId = null) { - (_viewOperacaoBottom.DataContext as OperacaoBottomViewModel)?.AdicionarAlerta(roverId, modulo, severidade, mensagem, modId); + _viewOperacaoBottom?._vm?.AdicionarAlerta(roverId, modulo, severidade, mensagem, modId); } public void RemoverAlerta(string roverId, AgroBase.Models.Enums.T_Code modulo, SeveridadeAlerta? severidade = null, string modId = null) { - (_viewOperacaoBottom.DataContext as OperacaoBottomViewModel)?.RemoverAlerta(roverId, modulo, severidade, modId); + _viewOperacaoBottom?._vm?.RemoverAlerta(roverId, modulo, severidade, modId); } @@ -640,8 +659,8 @@ namespace OperationControl.ViewModels r.InfestacaoPercentual = obj.Atuador?.PercentualErvasTerreno ?? 0; }); - _viewOperacaoCenter?._vm?.DiagnosticoVM?.AtualizarDados(rover); - _viewOperacaoCenter?.AtualizarGraficoDiagnostico(_viewOperacaoCenter?._vm?.DiagnosticoVM); + _viewOperacaoCenter?.Diagnostico?._vm?.AtualizarDados(rover); + _viewOperacaoCenter?.Diagnostico?.AtualizarGraficos(); } } @@ -657,8 +676,8 @@ namespace OperationControl.ViewModels { if (!VariaveisControleOperacao.BaseEmFoco) { - _viewOperacaoCenter?.PararStreamCameraFrontal(); - _viewOperacaoCenter?.PararStreamCameraErvas(); + _viewOperacaoCenter?.Monitoramento?.PararStreamCameraFrontal(); + _viewOperacaoCenter?.Monitoramento?.PararStreamCameraErvas(); VariaveisControleOperacao.EnviarComandoIniciarUDP(VariaveisControleOperacao.RoverEmFoco?.IP, false); } VariaveisControleOperacao.RoverEmFoco?.RuasPercorrer?.Clear(); @@ -678,8 +697,8 @@ namespace OperationControl.ViewModels AtualizarDadosTela(VariaveisControleOperacao.RoverEmFoco); VariaveisControleOperacao.RequisitarParametrosOperacao(); - _viewOperacaoCenter?.IniciarStreamCameraFrontal(); - _viewOperacaoCenter?.IniciarStreamCameraErvas(); + _viewOperacaoCenter?.Monitoramento?.IniciarStreamCameraFrontal(); + _viewOperacaoCenter?.Monitoramento?.IniciarStreamCameraErvas(); VariaveisControleOperacao.EnviarComandoIniciarUDP(VariaveisControleOperacao.RoverEmFoco?.IP, true); _viewOperacaoCenter?._vm?.SelecionarRoverLista(rover); diff --git a/AgroBase/OperationControl/Views/Operacao/DiagnosticoView.xaml b/AgroBase/OperationControl/Views/Operacao/DiagnosticoView.xaml new file mode 100644 index 000000000..8a3be1c80 --- /dev/null +++ b/AgroBase/OperationControl/Views/Operacao/DiagnosticoView.xaml @@ -0,0 +1,678 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +