From c28d18257a4b2b4a75a7f73e78e12f0111bfb3f8 Mon Sep 17 00:00:00 2001 From: Diego Freitas Date: Wed, 11 Mar 2026 09:47:44 -0300 Subject: [PATCH] =?UTF-8?q?Novas=20fun=C3=A7=C3=B5es=20no=20novo=20operati?= =?UTF-8?q?on=20control?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Operacoes/OperacaoParametrosModel.cs | 5 +- .../ViewModels/Base/NotifyBase.cs | 30 + .../DiagnosticoGraficoSerieViewModel.cs | 29 + .../DiagnosticoModuloItemViewModel.cs | 136 +++ .../Diagnostico/DiagnosticoOpcoesViewModel.cs | 832 +++++++++++++++++ .../Diagnostico/DiagnosticoViewModel.cs | 754 ++++++++++++++++ .../Views/Operacao/OperacaoCenterViewModel.cs | 3 +- .../Views/Operacao/OperacaoLeftViewModel.cs | 14 +- .../Views/Operacao/OperacaoRightViewModel.cs | 3 + .../PreparacaoMapaTopViewModel.cs | 2 + .../ViewModels/Windows/DockWindowViewModel.cs | 6 +- .../Views/Operacao/OperacaoCenterView.xaml | 835 +++++++++++++++++- .../Views/Operacao/OperacaoCenterView.xaml.cs | 27 +- .../Windows/MainWindow.xaml.cs | 2 +- 14 files changed, 2659 insertions(+), 19 deletions(-) create mode 100644 AgroBase/OperationControl/ViewModels/Base/NotifyBase.cs create mode 100644 AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoGraficoSerieViewModel.cs create mode 100644 AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoModuloItemViewModel.cs create mode 100644 AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoOpcoesViewModel.cs create mode 100644 AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoViewModel.cs diff --git a/AgroBase/AgroBase/Models/Operacoes/OperacaoParametrosModel.cs b/AgroBase/AgroBase/Models/Operacoes/OperacaoParametrosModel.cs index 6b6511b83..5e0ba3414 100644 --- a/AgroBase/AgroBase/Models/Operacoes/OperacaoParametrosModel.cs +++ b/AgroBase/AgroBase/Models/Operacoes/OperacaoParametrosModel.cs @@ -547,6 +547,7 @@ namespace AgroBase.Models.Operacoes PercentualRuaAtual = t.PercentualRuaAtual, PontoAtualDistanciaAtual = t.PontoAtual.DistanciaAtual, PontoAtualIdx = t.PontoAtual.idxPonto, + PontoAtualIdxCorredor = t.PontoAtual.idxCorredor, ProximoPontoAproximando = t.ProximoPonto.Aproximando, ProximoPontoDistanciaAtual = t.ProximoPonto.DistanciaAtual, ProximoPontoIdx = t.ProximoPonto.idxPonto, @@ -825,6 +826,7 @@ namespace AgroBase.Models.Operacoes public bool ProximoPontoAproximando { get; set; } public double ProximoPontoDistanciaAtual { get; set; } public int PontoAtualIdx { get; set; } + public int PontoAtualIdxCorredor { get; set; } public double PontoAtualDistanciaAtual { get; set; } public double DistanciaEsquerda { get; set; } public double DistanciaDireita { get; set; } @@ -834,7 +836,7 @@ namespace AgroBase.Models.Operacoes public double DistanciaTotal { get; set; } public string TempoEstimadoOperacao { get; set; } public bool CorredorAtualDentro { get; set; } - public double CorredorAtualIdx { get; set; } + public int CorredorAtualIdx { get; set; } public double CorredorAtualDistanciaTotal { get; set; } public double CorredorAtualDistanciaPercorrida { get; set; } @@ -862,6 +864,7 @@ namespace AgroBase.Models.Operacoes PercentualRuaAtual = PercentualRuaAtual, PontoAtualDistanciaAtual = PontoAtualDistanciaAtual, PontoAtualIdx = PontoAtualIdx, + PontoAtualIdxCorredor = PontoAtualIdxCorredor, ProximoPontoAproximando = ProximoPontoAproximando, }; } diff --git a/AgroBase/OperationControl/ViewModels/Base/NotifyBase.cs b/AgroBase/OperationControl/ViewModels/Base/NotifyBase.cs new file mode 100644 index 000000000..dad98abb0 --- /dev/null +++ b/AgroBase/OperationControl/ViewModels/Base/NotifyBase.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; + +namespace OperationControl.ViewModels.Base +{ + public abstract class NotifyBase : INotifyPropertyChanged + { + public event PropertyChangedEventHandler PropertyChanged; + + protected void OnPropertyChanged([CallerMemberName] string propertyName = null) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + + protected bool SetProperty(ref T field, T value, [CallerMemberName] string propertyName = null) + { + if (EqualityComparer.Default.Equals(field, value)) + return false; + + field = value; + OnPropertyChanged(propertyName); + return true; + } + } +} diff --git a/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoGraficoSerieViewModel.cs b/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoGraficoSerieViewModel.cs new file mode 100644 index 000000000..0bb12f821 --- /dev/null +++ b/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoGraficoSerieViewModel.cs @@ -0,0 +1,29 @@ +using OperationControl.ViewModels.Base; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace OperationControl.ViewModels.Views.Operacao.Diagnostico +{ + public class DiagnosticoGraficoSerieViewModel : NotifyBase + { + private string _label; + public string Label + { + get => _label; + set => SetProperty(ref _label, value); + } + + private string _unidade; + public string Unidade + { + get => _unidade; + set => SetProperty(ref _unidade, value); + } + + public ObservableCollection Valores { get; } = new(); + } +} diff --git a/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoModuloItemViewModel.cs b/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoModuloItemViewModel.cs new file mode 100644 index 000000000..53affd257 --- /dev/null +++ b/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoModuloItemViewModel.cs @@ -0,0 +1,136 @@ +using OperationControl.ViewModels.Base; +using System.Windows; +using System.Windows.Media; +using static AgroBase.Models.Enums; +using Brush = System.Windows.Media.Brush; +using Brushes = System.Windows.Media.Brushes; + +namespace OperationControl.ViewModels.Views.Operacao.Diagnostico +{ + public class DiagnosticoModuloItemViewModel : NotifyBase + { + private StatusModulo _status = StatusModulo.Desconectado; + private bool _mandatorio; + private bool _emUso; + private bool _selecionado; + private bool _iniciado; + + private Brush _backgroundBrush = Brushes.Gray; + private Brush _foregroundBrush = Brushes.White; + private Brush _borderBrushColor = Brushes.Transparent; + private Thickness _borderThicknessValue = new Thickness(1); + + public string IdVisual { get; set; } = string.Empty; + public T_Code Modulo { get; set; } + public string LabelModulo { get; set; } = string.Empty; + public S_Code SCode { get; set; } + public string TextoBase { get; set; } = string.Empty; + public double Left { get; set; } + public double Top { get; set; } + + public DiagnosticoModuloItemViewModel() + { + AtualizarVisual(); + } + + public StatusModulo Status + { + get => _status; + set + { + if (SetProperty(ref _status, value)) + { + AtualizarVisual(); + OnPropertyChanged(nameof(TextoExibicao)); + } + } + } + + public bool Mandatorio + { + get => _mandatorio; + set + { + if (SetProperty(ref _mandatorio, value)) + { + AtualizarVisual(); + OnPropertyChanged(nameof(TextoExibicao)); + } + } + } + + public bool EmUso + { + get => _emUso; + set + { + if (SetProperty(ref _emUso, value)) + { + AtualizarVisual(); + } + } + } + + public bool Selecionado + { + get => _selecionado; + set + { + if (SetProperty(ref _selecionado, value)) + { + AtualizarVisual(); + } + } + } + + public bool Iniciado + { + get => _iniciado; + set => SetProperty(ref _iniciado, value); + } + + public Brush BackgroundBrush + { + get => _backgroundBrush; + set => SetProperty(ref _backgroundBrush, value); + } + + public Brush ForegroundBrush + { + get => _foregroundBrush; + set => SetProperty(ref _foregroundBrush, value); + } + + public Brush BorderBrushColor + { + get => _borderBrushColor; + set => SetProperty(ref _borderBrushColor, value); + } + + public Thickness BorderThicknessValue + { + get => _borderThicknessValue; + set => SetProperty(ref _borderThicknessValue, value); + } + + public string TextoExibicao => $"{(Mandatorio ? "🔒" : "🔓")} {TextoBase}"; + + public void AtualizarVisual() + { + ForegroundBrush = Brushes.White; + + BackgroundBrush = Status switch + { + StatusModulo.Desconectado => EmUso ? Brushes.Red : Brushes.Gray, + StatusModulo.Conectado => Brushes.SteelBlue, + StatusModulo.Falha => Brushes.Red, + StatusModulo.Alerta => Brushes.Orange, + StatusModulo.Operante => Brushes.Green, + _ => Brushes.DimGray + }; + + BorderBrushColor = Selecionado ? Brushes.Gold : Brushes.Transparent; + BorderThicknessValue = Selecionado ? new Thickness(2) : new Thickness(1); + } + } +} \ No newline at end of file diff --git a/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoOpcoesViewModel.cs b/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoOpcoesViewModel.cs new file mode 100644 index 000000000..fd7a9396f --- /dev/null +++ b/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoOpcoesViewModel.cs @@ -0,0 +1,832 @@ +using AgroBase.Models.Operacoes; +using OperationControl.Models; +using OperationControl.ViewModels.Base; +using System.Collections.ObjectModel; +using static AgroBase.Models.Enums; +using System.Windows.Input; +using OperationControl.Helpers; +using static AgroBase.Services.CoolerControlService; + +namespace OperationControl.ViewModels.Views.Operacao.Diagnostico +{ + public class DiagnosticoOpcoesViewModel : NotifyBase + { + private DiagnosticoModuloItemViewModel _itemAtual; + private OperacaoParametrosModel _dadosAtual; + + #region VISIBILIDADES + + private bool _mostrarOpcoesSemDados = true; + public bool MostrarOpcoesSemDados { get => _mostrarOpcoesSemDados; set => SetProperty(ref _mostrarOpcoesSemDados, value); } + + private bool _mostrarOpcoesSensoriamento; + public bool MostrarOpcoesSensoriamento { get => _mostrarOpcoesSensoriamento; set => SetProperty(ref _mostrarOpcoesSensoriamento, value); } + + private bool _mostrarOpcoesAtuador; + public bool MostrarOpcoesAtuador { get => _mostrarOpcoesAtuador; set => SetProperty(ref _mostrarOpcoesAtuador, value); } + + private bool _mostrarOpcoesBico; + public bool MostrarOpcoesBico { get => _mostrarOpcoesBico; set => SetProperty(ref _mostrarOpcoesBico, value); } + + private bool _mostrarOpcoesBomba; + public bool MostrarOpcoesBomba { get => _mostrarOpcoesBomba; set => SetProperty(ref _mostrarOpcoesBomba, value); } + + private bool _mostrarOpcoesDirecional; + public bool MostrarOpcoesDirecional { get => _mostrarOpcoesDirecional; set => SetProperty(ref _mostrarOpcoesDirecional, value); } + + private bool _mostrarOpcoesGps; + public bool MostrarOpcoesGps { get => _mostrarOpcoesGps; set => SetProperty(ref _mostrarOpcoesGps, value); } + + private bool _mostrarOpcoesTrajetoria; + public bool MostrarOpcoesTrajetoria { get => _mostrarOpcoesTrajetoria; set => SetProperty(ref _mostrarOpcoesTrajetoria, value); } + + private bool _mostrarOpcoesRele; + public bool MostrarOpcoesRele { get => _mostrarOpcoesRele; set => SetProperty(ref _mostrarOpcoesRele, value); } + + private bool _mostrarOpcoesServo; + public bool MostrarOpcoesServo { get => _mostrarOpcoesServo; set => SetProperty(ref _mostrarOpcoesServo, value); } + + private bool _mostrarOpcoesNpc; + public bool MostrarOpcoesNpc { get => _mostrarOpcoesNpc; set => SetProperty(ref _mostrarOpcoesNpc, value); } + + #endregion + + #region CAMPOS ATUADOR MOD + + private double _barraAltura; + public double BarraAltura { get => _barraAltura; set => SetProperty(ref _barraAltura, value); } + + private string _barraAlturaTexto = "0 cm"; + public string BarraAlturaTexto { get => _barraAlturaTexto; set => SetProperty(ref _barraAlturaTexto, value); } + + #endregion + + #region BICO + + private string _bicoTitulo = "Bico - Testes"; + public string BicoTitulo { get => _bicoTitulo; set => SetProperty(ref _bicoTitulo, value); } + + private double _bicoAngulo; + public double BicoAngulo + { + get => _bicoAngulo; + set + { + if (SetProperty(ref _bicoAngulo, value)) + BicoAnguloTexto = $"{Convert.ToInt32(value):00}°"; + } + } + + 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 string _txtBicoComando = "—"; + public string TxtBicoComando { get => _txtBicoComando; set => SetProperty(ref _txtBicoComando, value); } + + private string _txtBicoStatusReal = "—"; + public string TxtBicoStatusReal { get => _txtBicoStatusReal; set => SetProperty(ref _txtBicoStatusReal, value); } + + private string _txtBicoTempoLigado = "00:00:00"; + public string TxtBicoTempoLigado { get => _txtBicoTempoLigado; set => SetProperty(ref _txtBicoTempoLigado, value); } + + private string _txtBicoVazao = "0,0 mL/s"; + public string TxtBicoVazao { get => _txtBicoVazao; set => SetProperty(ref _txtBicoVazao, value); } + + private string _txtBicoPressao = "0,0 psi"; + public string TxtBicoPressao { get => _txtBicoPressao; set => SetProperty(ref _txtBicoPressao, value); } + + private string _txtBicoAtuacoes = "—"; + public string TxtBicoAtuacoes { get => _txtBicoAtuacoes; set => SetProperty(ref _txtBicoAtuacoes, value); } + + #endregion + + #region BOMBA + + private string _bombaTitulo = "Bomba - Testes"; + public string BombaTitulo { get => _bombaTitulo; set => SetProperty(ref _bombaTitulo, value); } + + private double _bombaPressaoAlvo; + public double BombaPressaoAlvo + { + get => _bombaPressaoAlvo; + set + { + if (SetProperty(ref _bombaPressaoAlvo, value)) + BombaPressaoAlvoTexto = $"{value:0} psi"; + } + } + + private string _bombaPressaoAlvoTexto = "0 psi"; + public string BombaPressaoAlvoTexto { get => _bombaPressaoAlvoTexto; set => SetProperty(ref _bombaPressaoAlvoTexto, value); } + + private string _txtBombaComando = "—"; + public string TxtBombaComando { get => _txtBombaComando; set => SetProperty(ref _txtBombaComando, value); } + + private string _txtBombaStatusReal = "—"; + public string TxtBombaStatusReal { get => _txtBombaStatusReal; set => SetProperty(ref _txtBombaStatusReal, value); } + + private string _txtBombaPressaoLinha = "0,0 psi"; + public string TxtBombaPressaoLinha { get => _txtBombaPressaoLinha; set => SetProperty(ref _txtBombaPressaoLinha, value); } + + private string _txtBombaPotencia = "0 %"; + public string TxtBombaPotencia { get => _txtBombaPotencia; set => SetProperty(ref _txtBombaPotencia, value); } + + #endregion + + #region DIRECIONAL + + public ObservableCollection DirMovimentosDisponiveis { get; } = new(); + public ObservableCollection DirDirecoesDisponiveis { get; } = new(); + + private string _dirMovimentoSelecionado; + public string DirMovimentoSelecionado { get => _dirMovimentoSelecionado; set => SetProperty(ref _dirMovimentoSelecionado, value); } + + private string _dirDirecaoSelecionada; + public string DirDirecaoSelecionada { get => _dirDirecaoSelecionada; set => SetProperty(ref _dirDirecaoSelecionada, value); } + + private double _dirAngulo; + public double DirAngulo + { + get => _dirAngulo; + set + { + if (SetProperty(ref _dirAngulo, value)) + DirAnguloTexto = $"{Convert.ToInt32(value)}°"; + } + } + + private string _dirAnguloTexto = "0°"; + public string DirAnguloTexto { get => _dirAnguloTexto; set => SetProperty(ref _dirAnguloTexto, value); } + + private string _dirTitulo = "Direcional - Testes"; + public string DirTitulo { get => _dirTitulo; set => SetProperty(ref _dirTitulo, value); } + + private string _txtDirSentidoSP = "—"; + public string TxtDirSentidoSP { get => _txtDirSentidoSP; set => SetProperty(ref _txtDirSentidoSP, value); } + + private string _txtDirSentido = "—"; + public string TxtDirSentido { get => _txtDirSentido; set => SetProperty(ref _txtDirSentido, value); } + + private string _txtDirAnguloSP = "0°"; + public string TxtDirAnguloSP { get => _txtDirAnguloSP; set => SetProperty(ref _txtDirAnguloSP, value); } + + private string _txtDirAngulo = "0°"; + public string TxtDirAngulo { get => _txtDirAngulo; set => SetProperty(ref _txtDirAngulo, value); } + + #endregion + + #region GPS + + private double _gpsLeverArmLateral; + public double GpsLeverArmLateral + { + get => _gpsLeverArmLateral; + set + { + if (SetProperty(ref _gpsLeverArmLateral, value)) + GpsLeverArmLateralTexto = $"{(value * 10.0):00} cm"; + } + } + + private string _gpsLeverArmLateralTexto = "00 cm"; + public string GpsLeverArmLateralTexto { get => _gpsLeverArmLateralTexto; set => SetProperty(ref _gpsLeverArmLateralTexto, value); } + + private double _gpsLeverArmFrontal; + public double GpsLeverArmFrontal + { + get => _gpsLeverArmFrontal; + set + { + if (SetProperty(ref _gpsLeverArmFrontal, value)) + GpsLeverArmFrontalTexto = $"{(value * 10.0):00} cm"; + } + } + + private string _gpsLeverArmFrontalTexto = "00 cm"; + public string GpsLeverArmFrontalTexto { get => _gpsLeverArmFrontalTexto; set => SetProperty(ref _gpsLeverArmFrontalTexto, value); } + + private string _txtGpsCorrecao = "SemCorreção"; + public string TxtGpsCorrecao { get => _txtGpsCorrecao; set => SetProperty(ref _txtGpsCorrecao, value); } + + private string _txtGpsIdade = "0"; + public string TxtGpsIdade { get => _txtGpsIdade; set => SetProperty(ref _txtGpsIdade, value); } + + private string _txtGpsPrecisao = "0"; + public string TxtGpsPrecisao { get => _txtGpsPrecisao; set => SetProperty(ref _txtGpsPrecisao, value); } + + private string _txtGpsNSatelites = "0"; + public string TxtGpsNSatelites { get => _txtGpsNSatelites; set => SetProperty(ref _txtGpsNSatelites, value); } + + private string _txtGpsDistBase = "0"; + public string TxtGpsDistBase { get => _txtGpsDistBase; set => SetProperty(ref _txtGpsDistBase, value); } + + private string _txtGpsOrientacao = "0"; + public string TxtGpsOrientacao { get => _txtGpsOrientacao; set => SetProperty(ref _txtGpsOrientacao, value); } + + #endregion + + #region TRAJETORIA + + private bool _trajetoriaBatLiberada; + public bool TrajetoriaBatLiberada { get => _trajetoriaBatLiberada; set => SetProperty(ref _trajetoriaBatLiberada, value); } + + private bool _trajetoriaHerbLiberado; + public bool TrajetoriaHerbLiberado { get => _trajetoriaHerbLiberado; set => SetProperty(ref _trajetoriaHerbLiberado, value); } + + private bool _trajetoriaPodeConfirmar = true; + public bool TrajetoriaPodeConfirmar { get => _trajetoriaPodeConfirmar; set => SetProperty(ref _trajetoriaPodeConfirmar, value); } + + private string _txtTrajetoriaDistCorredor = "0,00 m"; + public string TxtTrajetoriaDistCorredor { get => _txtTrajetoriaDistCorredor; set => SetProperty(ref _txtTrajetoriaDistCorredor, value); } + + private string _txtTrajetoriaDistBateria = "0,00 m"; + public string TxtTrajetoriaDistBateria { get => _txtTrajetoriaDistBateria; set => SetProperty(ref _txtTrajetoriaDistBateria, value); } + + private string _txtTrajetoriaDistPulverizador = "0,00 m"; + public string TxtTrajetoriaDistPulverizador { get => _txtTrajetoriaDistPulverizador; set => SetProperty(ref _txtTrajetoriaDistPulverizador, value); } + + private string _txtTrajetoriaStatus = "Desconhecido"; + public string TxtTrajetoriaStatus { get => _txtTrajetoriaStatus; set => SetProperty(ref _txtTrajetoriaStatus, value); } + + private string _txtTrajetoriaBatOk = "Não"; + public string TxtTrajetoriaBatOk { get => _txtTrajetoriaBatOk; set => SetProperty(ref _txtTrajetoriaBatOk, value); } + + private string _txtTrajetoriaHerbOk = "Não"; + public string TxtTrajetoriaHerbOk { get => _txtTrajetoriaHerbOk; set => SetProperty(ref _txtTrajetoriaHerbOk, value); } + + #endregion + + #region RELE + + private string _releTitulo = "Relé - Testes"; + public string ReleTitulo { get => _releTitulo; set => SetProperty(ref _releTitulo, value); } + + private string _txtReleComando = "—"; + public string TxtReleComando { get => _txtReleComando; set => SetProperty(ref _txtReleComando, value); } + + private string _txtReleStatusReal = "—"; + public string TxtReleStatusReal { get => _txtReleStatusReal; set => SetProperty(ref _txtReleStatusReal, value); } + + #endregion + + #region SERVO + + private double _servoAngulo; + public double ServoAngulo + { + get => _servoAngulo; + set + { + if (SetProperty(ref _servoAngulo, value)) + ServoAnguloTexto = $"{Convert.ToInt32(value):0}°"; + } + } + + private string _servoAnguloTexto = "0°"; + public string ServoAnguloTexto { get => _servoAnguloTexto; set => SetProperty(ref _servoAnguloTexto, value); } + + private string _txtServoComando = "—"; + public string TxtServoComando { get => _txtServoComando; set => SetProperty(ref _txtServoComando, value); } + + private string _txtServoLeitura = "—"; + public string TxtServoLeitura { get => _txtServoLeitura; set => SetProperty(ref _txtServoLeitura, value); } + + private string _txtServoIncremental = "—"; + public string TxtServoIncremental { get => _txtServoIncremental; set => SetProperty(ref _txtServoIncremental, value); } + + #endregion + + #region NPC + + public ObservableCollection NpcCoolerModosDisponiveis { get; } = new(); + private bool _npcCoolerEntradaHabilitado; + public bool NpcCoolerEntradaHabilitado + { + get => _npcCoolerEntradaHabilitado; + set => SetProperty(ref _npcCoolerEntradaHabilitado, value); + } + + private bool _npcCoolerSaidaHabilitado; + public bool NpcCoolerSaidaHabilitado + { + get => _npcCoolerSaidaHabilitado; + set => SetProperty(ref _npcCoolerSaidaHabilitado, value); + } + + private CoolerMode _npcCoolerModoSelecionado; + public CoolerMode NpcCoolerModoSelecionado + { + get => _npcCoolerModoSelecionado; + set + { + if (SetProperty(ref _npcCoolerModoSelecionado, value)) + { + AtualizarEstadoCoolerModo(); + } + } + } + private void AtualizarEstadoCoolerModo() + { + switch (NpcCoolerModoSelecionado) + { + case CoolerMode.Off: + NpcCoolerEntradaHabilitado = false; + NpcCoolerSaidaHabilitado = false; + NpcCoolerEntrada = false; + NpcCoolerSaida = false; + break; + + case CoolerMode.Manual: + NpcCoolerEntradaHabilitado = true; + NpcCoolerSaidaHabilitado = true; + NpcCoolerEntrada = false; + NpcCoolerSaida = false; + break; + + default: + NpcCoolerEntradaHabilitado = false; + NpcCoolerSaidaHabilitado = false; + break; + } + } + + private bool _npcCoolerEntrada; + public bool NpcCoolerEntrada { get => _npcCoolerEntrada; set => SetProperty(ref _npcCoolerEntrada, value); } + + 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 string _npcCoolerTempTurbo = "0"; + public string NpcCoolerTempTurbo { get => _npcCoolerTempTurbo; set => SetProperty(ref _npcCoolerTempTurbo, value); } + + private string _txtNpcCoolerModo = "—"; + public string TxtNpcCoolerModo { get => _txtNpcCoolerModo; set => SetProperty(ref _txtNpcCoolerModo, value); } + + private string _txtNpcCoolerTemperatura = "—"; + public string TxtNpcCoolerTemperatura { get => _txtNpcCoolerTemperatura; set => SetProperty(ref _txtNpcCoolerTemperatura, value); } + + private string _txtNpcCoolerEntrada = "—"; + public string TxtNpcCoolerEntrada { get => _txtNpcCoolerEntrada; set => SetProperty(ref _txtNpcCoolerEntrada, value); } + + private string _txtNpcCoolerSaida = "—"; + public string TxtNpcCoolerSaida { get => _txtNpcCoolerSaida; set => SetProperty(ref _txtNpcCoolerSaida, value); } + + #endregion + + #region COMMANDS + + public ICommand SensoriamentoReiniciarCommand { get; } + public ICommand AtuadorReiniciarCommand { get; } + public ICommand BarraMoverCommand { get; } + + public ICommand BicoLigarCommand { get; } + public ICommand BicoDesligarCommand { get; } + public ICommand BicoMoverCommand { get; } + public ICommand BicoSalvarAnguloAberturaCommand { get; } + + public ICommand BombaLigarCommand { get; } + public ICommand BombaDesligarCommand { get; } + + public ICommand DirReferenciarCommand { get; } + public ICommand DirMovimentarCommand { get; } + + public ICommand GpsSalvarCommand { get; } + public ICommand TrajetoriaConfirmarCommand { get; } + + public ICommand ReleLigarCommand { get; } + public ICommand ReleDesligarCommand { get; } + + public ICommand ServoEnviarCommand { get; } + public ICommand NpcCoolerEnviarCommand { get; } + + #endregion + + public DiagnosticoOpcoesViewModel() + { + foreach (var nome in Enum.GetNames(typeof(TipoMovimentoDirecional))) + DirMovimentosDisponiveis.Add(nome); + + foreach (var nome in Enum.GetNames(typeof(Direcao))) + DirDirecoesDisponiveis.Add(nome); + + foreach (var modo in Enum.GetValues()) + NpcCoolerModosDisponiveis.Add(modo); + + SensoriamentoReiniciarCommand = new RelayCommand(_ => SensoriamentoReiniciar()); + AtuadorReiniciarCommand = new RelayCommand(_ => AtuadorReiniciar()); + BarraMoverCommand = new RelayCommand(_ => BarraMover()); + + BicoLigarCommand = new RelayCommand(_ => BicoLigar()); + BicoDesligarCommand = new RelayCommand(_ => BicoDesligar()); + BicoMoverCommand = new RelayCommand(_ => BicoMover()); + BicoSalvarAnguloAberturaCommand = new RelayCommand(_ => BicoSalvarAnguloAbertura()); + + BombaLigarCommand = new RelayCommand(_ => BombaLigar()); + BombaDesligarCommand = new RelayCommand(_ => BombaDesligar()); + + DirReferenciarCommand = new RelayCommand(_ => DirReferenciar()); + DirMovimentarCommand = new RelayCommand(_ => DirMovimentar()); + + GpsSalvarCommand = new RelayCommand(_ => GpsSalvar()); + TrajetoriaConfirmarCommand = new RelayCommand(_ => TrajetoriaConfirmar()); + + ReleLigarCommand = new RelayCommand(_ => ReleLigar()); + ReleDesligarCommand = new RelayCommand(_ => ReleDesligar()); + + ServoEnviarCommand = new RelayCommand(_ => ServoEnviar()); + NpcCoolerEnviarCommand = new RelayCommand(_ => NpcCoolerEnviar()); + } + + public void Atualizar(DiagnosticoModuloItemViewModel item, OperacaoParametrosModel dados) + { + _itemAtual = item; + _dadosAtual = dados; + + ResetarVisibilidades(); + ResetarCampos(); + + if (_itemAtual == null || _dadosAtual?.DadosLeitura == null) + { + MostrarOpcoesSemDados = true; + return; + } + + var rover = _dadosAtual.DadosLeitura; + + switch (_itemAtual.Modulo) + { + case T_Code.Atu: + switch (_itemAtual.SCode) + { + case S_Code.sMOD: + MostrarOpcoesAtuador = true; + BarraAltura = rover.Controle?.AlturaBarra ?? 0; + break; + + case S_Code.sBIC: + MostrarOpcoesBico = true; + PreencherBico(rover); + break; + + case S_Code.sBMB: + MostrarOpcoesBomba = true; + PreencherBomba(rover); + break; + + case S_Code.sSRV: + MostrarOpcoesServo = true; + PreencherServoAtuador(rover); + break; + + default: + MostrarOpcoesSemDados = true; + break; + } + break; + + case T_Code.Sen: + switch (_itemAtual.SCode) + { + case S_Code.sMOD: + MostrarOpcoesSensoriamento = true; + break; + + case S_Code.sRLE: + MostrarOpcoesRele = true; + PreencherRele(rover); + break; + + case S_Code.sSRV: + MostrarOpcoesServo = true; + PreencherServoSensoriamento(rover); + break; + + default: + MostrarOpcoesSemDados = true; + break; + } + break; + + case T_Code.Dir: + MostrarOpcoesDirecional = true; + PreencherDirecional(rover); + break; + + case T_Code.Gps: + MostrarOpcoesGps = true; + PreencherGps(rover); + break; + + case T_Code.Trj: + MostrarOpcoesTrajetoria = true; + PreencherTrajetoria(rover); + break; + + case T_Code.Npc: + MostrarOpcoesNpc = true; + PreencherNpc(rover); + break; + + default: + MostrarOpcoesSemDados = true; + break; + } + } + + #region PREENCHIMENTO + + private void PreencherBico(OperacaoParametrosDadosModel rover) + { + var bico = rover?.Atuador?.Bicos?.FirstOrDefault(x => x.ID == _itemAtual.LabelModulo); + BicoTitulo = $"Bico {_itemAtual.LabelModulo} - Testes"; + TxtBicoComando = (bico?.ComandoEstado ?? false) ? "Ligado" : "Desligado"; + TxtBicoStatusReal = (bico?.LeituraEstado ?? false) ? "Ligado" : "Desligado"; + TxtBicoTempoLigado = $"{bico?.TempoAtuado ?? 0:0.##} ms"; + 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(); + } + + private void PreencherBomba(OperacaoParametrosDadosModel rover) + { + var bomba = rover?.Atuador?.Bombas?.FirstOrDefault(x => x.ID == _itemAtual.LabelModulo); + BombaTitulo = $"Bomba {_itemAtual.LabelModulo} - Testes"; + TxtBombaComando = (bomba?.ComandoEstado ?? false) ? "Ligado" : "Desligado"; + TxtBombaStatusReal = (bomba?.LeituraEstado ?? false) ? "Ligado" : "Desligado"; + TxtBombaPressaoLinha = $"{rover?.Atuador?.PressaoLinhaPsi ?? 0:0.##} psi"; + TxtBombaPotencia = $"{bomba?.Potencia ?? 0:0.#} %"; + BombaPressaoAlvo = bomba?.Potencia ?? 0; + } + + private void PreencherDirecional(OperacaoParametrosDadosModel rover) + { + var mod = rover?.Direcional?.Modulos?.FirstOrDefault(x => x.Mod_ID == _itemAtual.LabelModulo); + DirTitulo = $"Direcional {_itemAtual.LabelModulo} - Testes"; + TxtDirSentidoSP = $"{mod?.Sentido_SP ?? Sentido.Parado}"; + TxtDirSentido = $"{mod?.SentidoReal ?? Sentido.Parado}"; + TxtDirAnguloSP = $"{mod?.Angulo_SP ?? 0:0.00}°"; + TxtDirAngulo = $"{mod?.AnguloDriver ?? 0:0.00}°"; + DirAngulo = mod?.Angulo_SP ?? 0; + } + + private void PreencherGps(OperacaoParametrosDadosModel rover) + { + 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}"; + } + + private void PreencherTrajetoria(OperacaoParametrosDadosModel rover) + { + var dados = rover?.Trajetoria?.AutonomiaCorredor; + TxtTrajetoriaDistCorredor = $"{dados?.DistanciaCorredor_m ?? 0:0.00} m"; + TxtTrajetoriaDistBateria = $"{dados?.DistanciaSeguraBateria_m ?? 0:0.00} m"; + TxtTrajetoriaDistPulverizador = $"{dados?.DistanciaSeguraHerbicida_m ?? 0:0.00} m"; + TxtTrajetoriaStatus = $"{dados?.Status ?? AgroBase.Models.AutonomiaCorredorStatus.Desconhecido}"; + 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; + } + + private void PreencherRele(OperacaoParametrosDadosModel rover) + { + var rele = rover?.Sensoriamento?.Reles?.FirstOrDefault(x => x.ID == _itemAtual.LabelModulo); + ReleTitulo = $"Relé {_itemAtual.LabelModulo} - Testes"; + TxtReleComando = (rele?.ComandoEstado ?? false) ? "Ligado" : "Desligado"; + TxtReleStatusReal = (rele?.LeituraEstado ?? false) ? "Ligado" : "Desligado"; + } + + private void PreencherServoSensoriamento(OperacaoParametrosDadosModel rover) + { + 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; + } + + private void PreencherServoAtuador(OperacaoParametrosDadosModel rover) + { + 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; + } + + private void PreencherNpc(OperacaoParametrosDadosModel rover) + { + 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}"; + } + + #endregion + + #region RESET + + private void ResetarVisibilidades() + { + MostrarOpcoesSemDados = false; + MostrarOpcoesSensoriamento = false; + MostrarOpcoesAtuador = false; + MostrarOpcoesBico = false; + MostrarOpcoesBomba = false; + MostrarOpcoesDirecional = false; + MostrarOpcoesGps = false; + MostrarOpcoesTrajetoria = false; + MostrarOpcoesRele = false; + MostrarOpcoesServo = false; + MostrarOpcoesNpc = false; + } + + private void ResetarCampos() + { + BarraAltura = 0; + BicoAngulo = 0; + BicoAnguloAbertura = "0"; + BombaPressaoAlvo = 0; + DirAngulo = 0; + GpsLeverArmLateral = 0; + GpsLeverArmFrontal = 0; + TrajetoriaBatLiberada = false; + TrajetoriaHerbLiberado = false; + ServoAngulo = 0; + NpcCoolerEntrada = false; + NpcCoolerSaida = false; + NpcCoolerTempOn = "0"; + NpcCoolerTempTurbo = "0"; + } + + #endregion + + #region COMMAND ACTIONS + + private void SensoriamentoReiniciar() + { + if (_itemAtual?.Modulo != T_Code.Sen) return; + VariaveisControleOperacao.EnviarComandoSensoriamento(_itemAtual.LabelModulo, true); + } + + private void AtuadorReiniciar() + { + if (_itemAtual?.Modulo != T_Code.Atu) return; + VariaveisControleOperacao.EnviarComandoAtuador(_itemAtual.LabelModulo, true); + } + + private void BarraMover() + { + if (_itemAtual?.Modulo != T_Code.Atu) return; + VariaveisControleOperacao.EnviarComandoAtuador(_itemAtual.LabelModulo, altura: Convert.ToInt32(BarraAltura)); + } + + private void BicoLigar() + { + if (_itemAtual?.Modulo != T_Code.Atu || _itemAtual.SCode != S_Code.sBIC) return; + VariaveisControleOperacao.EnviarComandoAtuador(_itemAtual.LabelModulo, status: true); + } + + private void BicoDesligar() + { + if (_itemAtual?.Modulo != T_Code.Atu || _itemAtual.SCode != S_Code.sBIC) return; + VariaveisControleOperacao.EnviarComandoAtuador(_itemAtual.LabelModulo, status: false); + } + + private void BicoMover() + { + if (_itemAtual?.Modulo != T_Code.Atu || _itemAtual.SCode != S_Code.sBIC) return; + VariaveisControleOperacao.EnviarComandoAtuador(_itemAtual.LabelModulo, angulo_controle: Convert.ToInt32(BicoAngulo)); + } + + 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); + } + + private void BombaLigar() + { + if (_itemAtual?.Modulo != T_Code.Atu || _itemAtual.SCode != S_Code.sBMB) return; + VariaveisControleOperacao.EnviarComandoAtuador(_itemAtual.LabelModulo, status: true); + } + + private void BombaDesligar() + { + if (_itemAtual?.Modulo != T_Code.Atu || _itemAtual.SCode != S_Code.sBMB) return; + VariaveisControleOperacao.EnviarComandoAtuador(_itemAtual.LabelModulo, status: false); + } + + private void DirReferenciar() + { + if (_itemAtual?.Modulo != T_Code.Dir) return; + 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); + } + + private void GpsSalvar() + { + 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); + } + + private void ReleLigar() + { + if (_itemAtual?.Modulo != T_Code.Sen || _itemAtual.SCode != S_Code.sRLE) return; + VariaveisControleOperacao.EnviarComandoSensoriamento(_itemAtual.LabelModulo, status: Estado.Ligado); + } + + private void ReleDesligar() + { + if (_itemAtual?.Modulo != T_Code.Sen || _itemAtual.SCode != S_Code.sRLE) return; + VariaveisControleOperacao.EnviarComandoSensoriamento(_itemAtual.LabelModulo, status: Estado.Desligado); + } + + private void ServoEnviar() + { + if (_itemAtual == null || _itemAtual.SCode != S_Code.sSRV) return; + + double angulo = Convert.ToInt32(ServoAngulo); + + if (_itemAtual.Modulo == T_Code.Sen) + { + var servo = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Sensoriamento?.Servos?.FirstOrDefault(x => x.ID == _itemAtual.LabelModulo); + if (!(servo?.Incremental ?? false)) angulo = 180 - angulo; + VariaveisControleOperacao.EnviarComandoSensoriamento(_itemAtual.LabelModulo, status: angulo); + } + else if (_itemAtual.Modulo == T_Code.Atu) + { + var servo = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Atuador?.Servos?.FirstOrDefault(x => x.ID == _itemAtual.LabelModulo); + if (!(servo?.Incremental ?? false)) angulo = 180 - angulo; + VariaveisControleOperacao.EnviarComandoAtuador(_itemAtual.LabelModulo, angulo_controle: (int)angulo); + } + } + + private void NpcCoolerEnviar() + { + if (_itemAtual?.Modulo != T_Code.Npc) return; + + var modo = NpcCoolerModoSelecionado; + 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); + } + + #endregion + } +} diff --git a/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoViewModel.cs b/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoViewModel.cs new file mode 100644 index 000000000..fdce23d12 --- /dev/null +++ b/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoViewModel.cs @@ -0,0 +1,754 @@ +using OperationControl.ViewModels.Base; +using System.Collections.ObjectModel; +using System.Windows.Input; +using OperationControl.Helpers; +using static AgroBase.Models.Enums; +using AgroBase.Models.Operacoes; +using OperationControl.Models; +using Newtonsoft.Json.Linq; + +namespace OperationControl.ViewModels.Views.Operacao.Diagnostico +{ + public class DiagnosticoViewModel : NotifyBase + { + public ObservableCollection DiagnosticoModulos { get; set; } = new ObservableCollection(); + public DiagnosticoOpcoesViewModel OpcoesVM { get; } = new DiagnosticoOpcoesViewModel(); + public ObservableCollection SeriesGrafico { get; } = new ObservableCollection(); + public ObservableCollection LabelsGrafico { get; } = new ObservableCollection(); + private string _ultimoIdGrafico = ""; + + + private DiagnosticoModuloItemViewModel _moduloSelecionado; + public DiagnosticoModuloItemViewModel ModuloSelecionado + { + get => _moduloSelecionado; + set + { + if (_moduloSelecionado == value) + return; + + if (_moduloSelecionado != null) + _moduloSelecionado.Selecionado = false; + + _moduloSelecionado = value; + + if (_moduloSelecionado != null) + _moduloSelecionado.Selecionado = true; + + OnPropertyChanged(); + AtualizarResumoModuloSelecionado(); + } + } + + public ICommand SelecionarModuloCommand { get; } + public ICommand SalvarSaudeCommand { get; } + + + public DiagnosticoViewModel() + { + SelecionarModuloCommand = new RelayCommand(SelecionarModulo); + SalvarSaudeCommand = new RelayCommand(SalvarSaudeModulo); + InicializarModulos(); + } + + private void InicializarModulos() + { + DiagnosticoModulos.Clear(); + + // ============================= + // BARRAMENTO DE TENSÕES + // ============================= + + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "BAT", Modulo = T_Code.Bat, LabelModulo = "", SCode = S_Code.sVZO, TextoBase = "BAT", Left = 70, Top = 70 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_AB3V", Modulo = T_Code.Sen, LabelModulo = "AB3V", SCode = S_Code.sCOR, TextoBase = "B3V3", Left = 145, Top = 70 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_AB5V", Modulo = T_Code.Sen, LabelModulo = "AB5V", SCode = S_Code.sCOR, TextoBase = "B5V0", Left = 220, Top = 70 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_AB7V2", Modulo = T_Code.Sen, LabelModulo = "AB7V2", SCode = S_Code.sCOR, TextoBase = "B7V2", Left = 295, Top = 70 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_AB12V", Modulo = T_Code.Sen, LabelModulo = "AB12V", SCode = S_Code.sCOR, TextoBase = "B12V", Left = 370, Top = 70 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_AB19V", Modulo = T_Code.Sen, LabelModulo = "AB19V", SCode = S_Code.sCOR, TextoBase = "B19V", Left = 445, Top = 70 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_AB24V", Modulo = T_Code.Sen, LabelModulo = "AB24V", SCode = S_Code.sCOR, TextoBase = "B24V", Left = 520, Top = 70 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_AB36V", Modulo = T_Code.Sen, LabelModulo = "AB36V", SCode = S_Code.sCOR, TextoBase = "B36V", Left = 595, Top = 70 }); + + + // ============================= + // FRENTE ESQUERDA + // ============================= + + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "DIR_EF", Modulo = T_Code.Dir, LabelModulo = "EF", SCode = S_Code.sVZO, TextoBase = "DIR", Left = 95, Top = 130 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "MOV_EF", Modulo = T_Code.Mov, LabelModulo = "EF", SCode = S_Code.sVZO, TextoBase = "MOV", Left = 95, Top = 170 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_FROEF", Modulo = T_Code.Sen, LabelModulo = "FROEF", SCode = S_Code.sSRV, TextoBase = "FRO", Left = 30, Top = 170 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_MAGEF", Modulo = T_Code.Sen, LabelModulo = "MAGEF", SCode = S_Code.sMAG, TextoBase = "MAG", Left = 30, Top = 210 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_TMVEF", Modulo = T_Code.Sen, LabelModulo = "TMVEF", SCode = S_Code.sNTC, TextoBase = "TMP", Left = 95, Top = 210 }); + + + // ============================= + // FRENTE DIREITA + // ============================= + + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "DIR_DF", Modulo = T_Code.Dir, LabelModulo = "DF", SCode = S_Code.sVZO, TextoBase = "DIR", Left = 540, Top = 130 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "MOV_DF", Modulo = T_Code.Mov, LabelModulo = "DF", SCode = S_Code.sVZO, TextoBase = "MOV", Left = 540, Top = 170 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_FRODF", Modulo = T_Code.Sen, LabelModulo = "FRODF", SCode = S_Code.sSRV, TextoBase = "FRO", Left = 605, Top = 170 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_MAGDF", Modulo = T_Code.Sen, LabelModulo = "MAGDF", SCode = S_Code.sMAG, TextoBase = "MAG", Left = 605, Top = 210 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_TMVDF", Modulo = T_Code.Sen, LabelModulo = "TMVDF", SCode = S_Code.sNTC, TextoBase = "TMP", Left = 540, Top = 210 }); + + + // ============================= + // CENTRO ROBÔ + // ============================= + + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SNR", Modulo = T_Code.Snr, LabelModulo = "", SCode = S_Code.sVZO, TextoBase = "SNR", Left = 315, Top = 130 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "LVX", Modulo = T_Code.Lvx, LabelModulo = "", SCode = S_Code.sVZO, TextoBase = "LDR", Left = 315, Top = 170 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "IMU", Modulo = T_Code.Imu, LabelModulo = "", SCode = S_Code.sVZO, TextoBase = "IMU", Left = 315, Top = 210 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "GPS", Modulo = T_Code.Gps, LabelModulo = "", SCode = S_Code.sVZO, TextoBase = "GPS", Left = 315, Top = 270 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN", Modulo = T_Code.Sen, LabelModulo = "", SCode = S_Code.sMOD, TextoBase = "SEN", Left = 315, Top = 310 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "NPC", Modulo = T_Code.Npc, LabelModulo = "", SCode = S_Code.sVZO, TextoBase = "NCP", Left = 315, Top = 350 }); + + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_RLCIN", Modulo = T_Code.Sen, LabelModulo = "RLCIN", SCode = S_Code.sRLE, TextoBase = "CLE", Left = 160, Top = 310 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_RLCOUT", Modulo = T_Code.Sen, LabelModulo = "RLCOUT", SCode = S_Code.sRLE, TextoBase = "CLS", Left = 470, Top = 310 }); + + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "CAN", Modulo = T_Code.Can, LabelModulo = "", SCode = S_Code.sVZO, TextoBase = "CAN", Left = 610, Top = 270 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "IPB", Modulo = T_Code.Ipb, LabelModulo = "", SCode = S_Code.sVZO, TextoBase = "LAN", Left = 610, Top = 310 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "TRJ", Modulo = T_Code.Trj, LabelModulo = "", SCode = S_Code.sVZO, TextoBase = "TRAJ", Left = 610, Top = 350 }); + + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_LEDOP", Modulo = T_Code.Sen, LabelModulo = "LEDOP", SCode = S_Code.sLED, TextoBase = "OP", Left = 20, Top = 270 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_LEDMN", Modulo = T_Code.Sen, LabelModulo = "LEDMN", SCode = S_Code.sLED, TextoBase = "MN", Left = 20, Top = 310 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_LEDAT", Modulo = T_Code.Sen, LabelModulo = "LEDAT", SCode = S_Code.sLED, TextoBase = "AT", Left = 20, Top = 350 }); + + + // ============================= + // TRASEIRA ESQUERDA + // ============================= + + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "DIR_ET", Modulo = T_Code.Dir, LabelModulo = "ET", SCode = S_Code.sVZO, TextoBase = "DIR", Left = 95, Top = 470 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "MOV_ET", Modulo = T_Code.Mov, LabelModulo = "ET", SCode = S_Code.sVZO, TextoBase = "MOV", Left = 95, Top = 510 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_FROET", Modulo = T_Code.Sen, LabelModulo = "FROET", SCode = S_Code.sSRV, TextoBase = "FRO", Left = 30, Top = 510 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_MAGET", Modulo = T_Code.Sen, LabelModulo = "MAGET", SCode = S_Code.sMAG, TextoBase = "MAG", Left = 30, Top = 550 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_TMVET", Modulo = T_Code.Sen, LabelModulo = "TMVET", SCode = S_Code.sNTC, TextoBase = "TMP", Left = 95, Top = 550 }); + + + // ============================= + // TRASEIRA DIREITA + // ============================= + + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "DIR_DT", Modulo = T_Code.Dir, LabelModulo = "DT", SCode = S_Code.sVZO, TextoBase = "DIR", Left = 540, Top = 470 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "MOV_DT", Modulo = T_Code.Mov, LabelModulo = "DT", SCode = S_Code.sVZO, TextoBase = "MOV", Left = 540, Top = 510 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_FRODT", Modulo = T_Code.Sen, LabelModulo = "FRODT", SCode = S_Code.sSRV, TextoBase = "FRO", Left = 605, Top = 510 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_MAGDT", Modulo = T_Code.Sen, LabelModulo = "MAGDT", SCode = S_Code.sMAG, TextoBase = "MAG", Left = 605, Top = 550 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_TMVDT", Modulo = T_Code.Sen, LabelModulo = "TMVDT", SCode = S_Code.sNTC, TextoBase = "TMP", Left = 540, Top = 550 }); + + + // ============================= + // ATUADOR / SISTEMA DE PULVERIZAÇÃO + // ============================= + + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "ATU_PRSLN", Modulo = T_Code.Atu, LabelModulo = "PRSLN", SCode = S_Code.sPRS, TextoBase = "PRS", Left = 230, Top = 610 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "ATU", Modulo = T_Code.Atu, LabelModulo = "", SCode = S_Code.sMOD, TextoBase = "ATU", Left = 315, Top = 610 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "ATU_FLXLN", Modulo = T_Code.Atu, LabelModulo = "FLXLN", SCode = S_Code.sFLX, TextoBase = "FLX", Left = 400, Top = 610 }); + + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "ATU_BOMBA", Modulo = T_Code.Atu, LabelModulo = "BOMBA", SCode = S_Code.sBMB, TextoBase = "BMB", Left = 230, Top = 650 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "ATU_MASRS", Modulo = T_Code.Atu, LabelModulo = "MASRS", SCode = S_Code.sMAS, TextoBase = "MAS", Left = 400, Top = 650 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "CAM", Modulo = T_Code.Cam, LabelModulo = "", SCode = S_Code.sVZO, TextoBase = "CAM", Left = 315, Top = 650 }); + + + // ============================= + // BICOS + // ============================= + + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "ATU_SRVB1", Modulo = T_Code.Atu, LabelModulo = "SRVB1", SCode = S_Code.sSRV, TextoBase = "SVB1", Left = 110, Top = 705 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "ATU_B01", Modulo = T_Code.Atu, LabelModulo = "B01", SCode = S_Code.sBIC, TextoBase = "B01", Left = 110, Top = 745 }); + + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "ATU_MAGESQ", Modulo = T_Code.Atu, LabelModulo = "MAGESQ", SCode = S_Code.sMAG, TextoBase = "MAG", Left = 215, Top = 730 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "ATU_MAGALT", Modulo = T_Code.Atu, LabelModulo = "MAGALT", SCode = S_Code.sMAG, TextoBase = "MAG", Left = 315, Top = 705 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "ATU_MAGDIR", Modulo = T_Code.Atu, LabelModulo = "MAGDIR", SCode = S_Code.sMAG, TextoBase = "MAG", Left = 415, Top = 730 }); + + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "ATU_B02", Modulo = T_Code.Atu, LabelModulo = "B02", SCode = S_Code.sBIC, TextoBase = "B02", Left = 315, Top = 745 }); + + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "ATU_SRVB3", Modulo = T_Code.Atu, LabelModulo = "SRVB3", SCode = S_Code.sSRV, TextoBase = "SVB3", Left = 520, Top = 705 }); + DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "ATU_B03", Modulo = T_Code.Atu, LabelModulo = "B03", SCode = S_Code.sBIC, TextoBase = "B03", Left = 520, Top = 745 }); + } + + + private void SelecionarModulo(object parameter) + { + if (parameter is DiagnosticoModuloItemViewModel item) + ModuloSelecionado = item; + } + + #region RESUMO + + private string _tituloModuloSelecionado = "Nenhum módulo selecionado"; + public string TituloModuloSelecionado + { + get => _tituloModuloSelecionado; + set => SetProperty(ref _tituloModuloSelecionado, value); + } + + private string _descricaoModuloSelecionado = "Selecione um módulo no mapa para visualizar os detalhes."; + public string DescricaoModuloSelecionado + { + get => _descricaoModuloSelecionado; + set => SetProperty(ref _descricaoModuloSelecionado, value); + } + + private OperacaoParametrosModel _dadosOperacaoAtual; + + private string _impedimentoModuloSelecionado = "Impedimento: Nenhum"; + public string ImpedimentoModuloSelecionado + { + get => _impedimentoModuloSelecionado; + set => SetProperty(ref _impedimentoModuloSelecionado, value); + } + + private string _infoSaude = "Saúde: -"; + public string InfoSaude + { + get => _infoSaude; + set => SetProperty(ref _infoSaude, value); + } + + private string _infoCan = "CAN: -"; + public string InfoCan + { + get => _infoCan; + set => SetProperty(ref _infoCan, value); + } + + private string _infoLatencia = "Latência: -"; + public string InfoLatencia + { + get => _infoLatencia; + set => SetProperty(ref _infoLatencia, value); + } + + private bool _mandatorioSelecionado; + public bool MandatorioSelecionado + { + get => _mandatorioSelecionado; + set => SetProperty(ref _mandatorioSelecionado, value); + } + + private bool _emUsoSelecionado; + public bool EmUsoSelecionado + { + get => _emUsoSelecionado; + set => SetProperty(ref _emUsoSelecionado, value); + } + + public ObservableCollection CondicoesOperacionais { get; } = new(); + public ObservableCollection LogsModuloSelecionado { get; } = new(); + + private string _infoModulo = "Módulo: -"; + public string InfoModulo + { + get => _infoModulo; + set => SetProperty(ref _infoModulo, value); + } + + private string _infoLabel = "Label: -"; + public string InfoLabel + { + get => _infoLabel; + set => SetProperty(ref _infoLabel, value); + } + + private string _infoSCode = "SCode: -"; + public string InfoSCode + { + get => _infoSCode; + set => SetProperty(ref _infoSCode, value); + } + + private string _infoStatus = "Status: -"; + public string InfoStatus + { + get => _infoStatus; + set => SetProperty(ref _infoStatus, value); + } + + private string _infoIniciado = "Iniciado: -"; + public string InfoIniciado + { + get => _infoIniciado; + set => SetProperty(ref _infoIniciado, value); + } + + private string _infoMandatorio = "Mandatório: -"; + public string InfoMandatorio + { + get => _infoMandatorio; + set => SetProperty(ref _infoMandatorio, value); + } + + private string _infoEmUso = "Em uso: -"; + public string InfoEmUso + { + get => _infoEmUso; + set => SetProperty(ref _infoEmUso, value); + } + + private string _infoIdVisual = "ID visual: -"; + public string InfoIdVisual + { + get => _infoIdVisual; + set => SetProperty(ref _infoIdVisual, value); + } + + private void AtualizarResumoModuloSelecionado() + { + CondicoesOperacionais.Clear(); + LogsModuloSelecionado.Clear(); + + if (ModuloSelecionado == null || _dadosOperacaoAtual == null) + { + TituloModuloSelecionado = "Nenhum módulo selecionado"; + DescricaoModuloSelecionado = "Selecione um módulo no mapa para visualizar os detalhes."; + InfoModulo = "Módulo: -"; + InfoLabel = "Label: -"; + InfoSCode = "SCode: -"; + InfoStatus = "Status: -"; + InfoIniciado = "Iniciado: -"; + InfoMandatorio = "Mandatório: -"; + InfoEmUso = "Em uso: -"; + InfoIdVisual = "ID visual: -"; + InfoSaude = "Saúde: -"; + InfoCan = "CAN: -"; + InfoLatencia = "Latência: -"; + ImpedimentoModuloSelecionado = "Impedimento: Nenhum"; + MandatorioSelecionado = false; + EmUsoSelecionado = false; + return; + } + + var rover = _dadosOperacaoAtual.DadosLeitura; + var item = ModuloSelecionado; + + var saudeModulo = rover?.ModulosSaude?.FirstOrDefault(x => x.modulo == item.Modulo); + var individual = saudeModulo?.saude_individual?.FirstOrDefault(x => x.label == item.LabelModulo); + var dispositivo = rover?.DispositivosMapeados?.FirstOrDefault(x => x.Dispositivo == item.Modulo && x.Mod_ID == item.LabelModulo); + + var status = individual?.status ?? saudeModulo?.status ?? StatusModulo.Desconectado; + var saude = individual?.saude ?? saudeModulo?.saude ?? 0; + var motivos = string.Join(", ", (individual?.motivos ?? saudeModulo?.motivos) ?? new List()); + + DateTime ucr = DateTime.MinValue; + if (item.Modulo == T_Code.Sen) + ucr = rover?.Sensoriamento?.UltimoComandoRespondido ?? DateTime.MinValue; + else if (item.Modulo == T_Code.Atu) + ucr = rover?.Atuador?.UltimoComandoRespondido ?? DateTime.MinValue; + else if (item.Modulo == T_Code.Mov) + ucr = rover?.Movimentacao?.Modulos?.FirstOrDefault(x => x.Mod_ID == item.LabelModulo)?.UltimoComandoRespondido ?? DateTime.MinValue; + else if (item.Modulo == T_Code.Dir) + ucr = rover?.Direcional?.Modulos?.FirstOrDefault(x => x.Mod_ID == item.LabelModulo)?.UltimoComandoRespondido ?? DateTime.MinValue; + else + ucr = rover?.Momento ?? DateTime.MinValue; + + DateTime momento = rover?.Momento ?? DateTime.MinValue; + double canLatencia = (ucr - momento).TotalMilliseconds; + + TituloModuloSelecionado = $"Saúde do módulo {item.TextoBase}"; + DescricaoModuloSelecionado = $"Detalhes reais do item selecionado no mapa de diagnóstico."; + + InfoModulo = $"Módulo: {item.Modulo}"; + InfoLabel = $"Label: {(string.IsNullOrWhiteSpace(item.LabelModulo) ? "-" : item.LabelModulo)}"; + InfoSCode = $"SCode: {item.SCode}"; + InfoStatus = $"Status: {status}"; + InfoIniciado = $"Iniciado: {(item.Iniciado ? "Sim" : "Não")}"; + InfoMandatorio = $"Mandatório: {(item.Mandatorio ? "Sim" : "Não")}"; + InfoEmUso = $"Em uso: {(item.EmUso ? "Sim" : "Não")}"; + InfoIdVisual = $"ID visual: {item.IdVisual}"; + InfoSaude = $"Saúde: {saude:0}%"; + InfoCan = $"CAN: {canLatencia:0} ms"; + InfoLatencia = $"Latência: {dispositivo?.Latencia ?? 0} ms"; + ImpedimentoModuloSelecionado = $"Impedimento: {(string.IsNullOrWhiteSpace(motivos) ? "Nenhum" : motivos)}"; + + MandatorioSelecionado = item.Mandatorio; + EmUsoSelecionado = item.EmUso; + + if (saudeModulo?.condicoes_operacionais != null) + { + foreach (var cond in saudeModulo.condicoes_operacionais) + CondicoesOperacionais.Add($"{cond.descricao} (Valor: {cond.valor}, Severidade: {cond.severidade:0}%)"); + } + + var logs = rover?.Logs?.Where(x => x.Dispositivo == item.Modulo); + if (!string.IsNullOrWhiteSpace(item.LabelModulo)) + logs = logs?.Where(x => x.ID == item.LabelModulo); + else + logs = logs?.Where(x => x.ID == null); + + if (logs != null) + { + foreach (var log in logs) + LogsModuloSelecionado.Add($"{log.Momento:HH:mm:ss.fff} - {log.Mensagem}"); + } + + OpcoesVM?.Atualizar(ModuloSelecionado, _dadosOperacaoAtual); + AtualizarGraficoModuloSelecionado(); + } + + public void AtualizarDados(OperacaoParametrosModel dados) + { + _dadosOperacaoAtual = dados; + + if (dados == null) + return; + + foreach (var item in DiagnosticoModulos) + { + item.Status = ObterStatusModulo(item, dados); + item.Mandatorio = ObterMandatorio(item, dados); + item.EmUso = ObterEmUso(item, dados); + item.Iniciado = ObterIniciado(item, dados); + } + + AtualizarResumoModuloSelecionado(); + } + + private StatusModulo ObterStatusModulo(DiagnosticoModuloItemViewModel item, OperacaoParametrosModel dados) + { + var saudeModulo = dados?.DadosLeitura?.ModulosSaude?.FirstOrDefault(x => x.modulo == item.Modulo); + if (saudeModulo == null) + return StatusModulo.Desconectado; + + var individual = saudeModulo.saude_individual?.FirstOrDefault(x => x.label == item.LabelModulo); + + return individual?.status ?? saudeModulo.status; + } + + private bool ObterMandatorio(DiagnosticoModuloItemViewModel item, OperacaoParametrosModel dados) + { + if (dados == null) + return false; + + if (!string.IsNullOrWhiteSpace(item.LabelModulo)) + { + return dados.DadosLeitura?.Operacao?.ModulosMandatorios? + .FirstOrDefault(x => x.Dispositivo == item.Modulo)? + .ComponentesEmUso? + .Any(x => x.Key == item.LabelModulo && x.Value.Item1) ?? false; + } + + return dados.ModulosMandatorios?.Any(x => x.Dispositivo == item.Modulo && x.Mandatorio) ?? false; + } + + private bool ObterEmUso(DiagnosticoModuloItemViewModel item, OperacaoParametrosModel dados) + { + if (dados == null) + return false; + + if (!string.IsNullOrWhiteSpace(item.LabelModulo)) + { + return dados.DadosLeitura?.Operacao?.ModulosMandatorios? + .FirstOrDefault(x => x.Dispositivo == item.Modulo)? + .ComponentesEmUso? + .Any(x => x.Key == item.LabelModulo && x.Value.Item2) ?? false; + } + + return dados.ModulosMandatorios?.Any(x => x.Dispositivo == item.Modulo && x.Utilizar) ?? false; + } + + private bool ObterIniciado(DiagnosticoModuloItemViewModel item, OperacaoParametrosModel dados) + { + var rover = dados?.DadosLeitura; + if (rover == null) + return false; + + switch (item.Modulo) + { + case T_Code.Mov: + return rover.Movimentacao?.Modulos?.FirstOrDefault(x => x.Mod_ID == item.LabelModulo)?.Iniciado ?? false; + + case T_Code.Dir: + return rover.Direcional?.Modulos?.FirstOrDefault(x => x.Mod_ID == item.LabelModulo)?.Iniciado ?? false; + + case T_Code.Atu: + if (string.IsNullOrWhiteSpace(item.LabelModulo)) + return rover.Atuador?.Iniciado ?? false; + + switch (item.SCode) + { + case S_Code.sBIC: + return rover.Atuador?.Bicos?.FirstOrDefault(x => x.ID == item.LabelModulo)?.Inicializado ?? false; + + case S_Code.sBMB: + return rover.Atuador?.Bombas?.FirstOrDefault(x => x.ID == item.LabelModulo)?.Inicializado ?? false; + + case S_Code.sSRV: + return rover.Atuador?.Servos?.FirstOrDefault(x => x.ID == item.LabelModulo)?.Inicializado ?? false; + + default: + return rover.Atuador?.Sensores?.FirstOrDefault(x => x.ID == item.LabelModulo && x.Componente == item.SCode)?.Inicializado ?? false; + } + + case T_Code.Sen: + if (string.IsNullOrWhiteSpace(item.LabelModulo)) + return rover.Sensoriamento?.Iniciado ?? false; + + switch (item.SCode) + { + case S_Code.sLED: + return rover.Sensoriamento?.Sinaleiros?.FirstOrDefault(x => x.ID == item.LabelModulo)?.Inicializado ?? false; + + case S_Code.sRLE: + return rover.Sensoriamento?.Reles?.FirstOrDefault(x => x.ID == item.LabelModulo)?.Inicializado ?? false; + + case S_Code.sSRV: + return rover.Sensoriamento?.Servos?.FirstOrDefault(x => x.ID == item.LabelModulo)?.Inicializado ?? false; + + default: + return rover.Sensoriamento?.Sensores?.FirstOrDefault(x => x.ID == item.LabelModulo && x.Componente == item.SCode)?.Inicializado ?? false; + } + + case T_Code.Imu: + return rover.Imu?.Iniciado ?? false; + + case T_Code.Npc: + case T_Code.Ipb: + return dados.Alive; + + case T_Code.Can: + return rover.DispositivosMapeados?.Any(x => x.Dispositivo == T_Code.Can) ?? false; + + case T_Code.Cam: + case T_Code.Snr: + case T_Code.Lvx: + case T_Code.Gps: + return rover.DispositivosMapeados?.FirstOrDefault(x => x.Dispositivo == item.Modulo)?.Saude > 0; + + case T_Code.Bat: + return rover.Bateria?.Iniciado ?? false; + + case T_Code.Trj: + return rover.Trajetoria?.QtdPontos > 0; + + default: + return false; + } + } + + private void SalvarSaudeModulo(object parameter) + { + if (ModuloSelecionado == null) + return; + + var modulo = ModuloSelecionado.Modulo; + var label = ModuloSelecionado.LabelModulo; + + if (modulo == T_Code.Vzo) + return; + + var rover = VariaveisControleOperacao.RoverEmFoco; + + if (rover == null) + { + MessageBox.Show($"Sem dados para o módulo {modulo} ({label})"); + return; + } + + var mod = rover.ModulosMandatorios?.FirstOrDefault(x => x.Dispositivo == modulo); + if (mod == null) + { + mod = new AgroBase.Models.OperacaoModulosMandatoriosModel() + { + Dispositivo = modulo, + ComponentesEmUso = new Dictionary() + }; + + if (rover.ModulosMandatorios == null) + rover.ModulosMandatorios = new List(); + + rover.ModulosMandatorios.Add(mod); + } + + if (string.IsNullOrWhiteSpace(label)) + { + mod.Mandatorio = MandatorioSelecionado; + mod.Utilizar = EmUsoSelecionado; + } + else + { + if (mod.ComponentesEmUso == null) + mod.ComponentesEmUso = new Dictionary(); + + mod.ComponentesEmUso[label] = (MandatorioSelecionado, EmUsoSelecionado); + } + + VariaveisControleOperacao.EnviarParametrosOperacao(new AgroBase.Models.Operacoes.OperacaoParametrosModel() + { + ModulosMandatorios = rover.ModulosMandatorios, + }); + + // opcional: refletir imediatamente no item selecionado + ModuloSelecionado.Mandatorio = MandatorioSelecionado; + ModuloSelecionado.EmUso = EmUsoSelecionado; + + AtualizarResumoModuloSelecionado(); + } + + + + + + private void AtualizarGraficoModuloSelecionado() + { + var idAtual = ModuloSelecionado?.IdVisual ?? ""; + if (_ultimoIdGrafico != idAtual) + { + SeriesGrafico.Clear(); + LabelsGrafico.Clear(); + _ultimoIdGrafico = idAtual; + } + + if (ModuloSelecionado == null || _dadosOperacaoAtual?.DadosLeitura == null) + return; + + var rover = _dadosOperacaoAtual.DadosLeitura; + var item = ModuloSelecionado; + + DateTime? momento = rover.Momento; + if (momento.HasValue) + { + LabelsGrafico.Add(momento.Value.ToString("HH:mm:ss")); + while (LabelsGrafico.Count > 60) + LabelsGrafico.RemoveAt(0); + } + + void AddOrAppendSerie(string label, string unidade, double? valor) + { + if (!valor.HasValue) + return; + + var serie = SeriesGrafico.FirstOrDefault(x => x.Label == label && x.Unidade == unidade); + if (serie == null) + { + serie = new DiagnosticoGraficoSerieViewModel + { + Label = label, + Unidade = unidade + }; + SeriesGrafico.Add(serie); + } + + serie.Valores.Add(valor.Value); + + while (serie.Valores.Count > 60) + serie.Valores.RemoveAt(0); + } + + switch (item.Modulo) + { + case T_Code.Sen: + switch (item.SCode) + { + case S_Code.sCOR: + var barramento = rover.Bateria?.Barramentos?.FirstOrDefault(x => x.ID == item.LabelModulo); + AddOrAppendSerie("Corrente", "mA", barramento?.Corrente); + AddOrAppendSerie("Tensão", "V", barramento?.Tensao); + AddOrAppendSerie("Potência", "mW", barramento?.Potencia); + AddOrAppendSerie("Energia", "J", barramento?.Energia); + AddOrAppendSerie("Temperatura", "°C", barramento?.Temperatura); + break; + + case S_Code.sNTC: + var ntc = rover.Sensoriamento?.Sensores? + .FirstOrDefault(x => x.ID == item.LabelModulo && x.Componente == item.SCode)? + .Valores?[0]; + AddOrAppendSerie("Temperatura", "°C", ntc); + break; + + case S_Code.sRLE: + var rele = rover.Sensoriamento?.Reles?.FirstOrDefault(x => x.ID == item.LabelModulo); + AddOrAppendSerie("Comando", "", rele?.ComandoEstado == true ? 1 : 0); + AddOrAppendSerie("Leitura", "", rele?.LeituraEstado == true ? 1 : 0); + break; + + case S_Code.sSRV: + var servoSen = rover.Sensoriamento?.Servos?.FirstOrDefault(x => x.ID == item.LabelModulo); + AddOrAppendSerie("Comando", "°", servoSen?.ComandoAngulo); + AddOrAppendSerie("Leitura", "°", servoSen?.LeituraAngulo); + break; + } + break; + + case T_Code.Atu: + switch (item.SCode) + { + case S_Code.sBIC: + var bico = rover.Atuador?.Bicos?.FirstOrDefault(x => x.ID == item.LabelModulo); + AddOrAppendSerie("Cmd", "", (bico?.ComandoEstado ?? false) ? 100 : 0); + AddOrAppendSerie("Vazão", "mL/s", bico?.VazaoInstantaneaMLs); + break; + + case S_Code.sBMB: + var bomba = rover.Atuador?.Bombas?.FirstOrDefault(x => x.ID == item.LabelModulo); + AddOrAppendSerie("Cmd", "", (bomba?.ComandoEstado ?? false) ? 100 : 0); + AddOrAppendSerie("Potência", "%", bomba?.Potencia); + AddOrAppendSerie("Pressão", "psi", rover.Atuador?.PressaoLinhaPsi); + break; + + case S_Code.sPRS: + AddOrAppendSerie("Pressão", "psi", rover.Atuador?.PressaoLinhaPsi); + break; + + case S_Code.sFLX: + AddOrAppendSerie("Fluxo", "mL/s", rover.Atuador?.VazaoInstantaneaMLs); + AddOrAppendSerie("Média", "mL/s", rover.Atuador?.VazaoMediaMLs); + break; + + case S_Code.sMAS: + AddOrAppendSerie("Volume", "L", rover.Atuador?.VolumeReservatorioL); + AddOrAppendSerie("Massa", "Kg", rover.Atuador?.MassaReservatorioKg); + AddOrAppendSerie("Percentual", "%", rover.Atuador?.PercentualReservatorio); + break; + } + break; + + case T_Code.Mov: + var mov = rover.Movimentacao?.Modulos?.FirstOrDefault(x => x.Mod_ID == item.LabelModulo); + AddOrAppendSerie("Tensão", "V", mov?.Tensao); + AddOrAppendSerie("Corrente M", "A", mov?.Corrente_Motor); + AddOrAppendSerie("Corrente B", "A", mov?.Corrente_Barramento); + AddOrAppendSerie("Ciclo", "%", mov?.CicloTrabalho); + AddOrAppendSerie("Temperatura", "°C", mov?.TemperaturaDriver); + AddOrAppendSerie("RPM", "", mov?.RPM_Roda); + break; + + case T_Code.Npc: + var npc = rover.PerformanceNcp; + AddOrAppendSerie("GPU %", "%", npc?.GPU_load); + AddOrAppendSerie("GPU °C", "°C", npc?.GPU_temp); + AddOrAppendSerie("CPU %", "%", npc?.CPU_load); + AddOrAppendSerie("CPU °C", "°C", npc?.CPU_temp); + AddOrAppendSerie("RAM", "MB", npc?.RAM_usage); + break; + + case T_Code.Ipb: + var conexao = rover.ModulosSaude?.FirstOrDefault(x => x.modulo == T_Code.Ipb); + AddOrAppendSerie("Latência", "ms", conexao?.detalhes?["avg_rtt"]?.Value()); + AddOrAppendSerie("Jitter", "ms", conexao?.detalhes?["jitter"]?.Value()); + AddOrAppendSerie("Timeout", "%", conexao?.detalhes?["tmout_pct"]?.Value()); + AddOrAppendSerie("Perda", "%", conexao?.detalhes?["loss_pct"]?.Value()); + AddOrAppendSerie("Banda", "Mbps", conexao?.detalhes?["bw_total_mbps"]?.Value()); + AddOrAppendSerie("Banda %", "%", conexao?.detalhes?["bw_util_pct"]?.Value()); + break; + + case T_Code.Gps: + var gps = rover.Gnss; + AddOrAppendSerie("Precisão", "cm", gps?.PrecisaoCm); + AddOrAppendSerie("Altitude", "m", gps?.Altitude); + AddOrAppendSerie("Idade", "s", gps?.IdadeCorrecao); + AddOrAppendSerie("Satélites", "", gps?.NumeroSatelites); + break; + + case T_Code.Bat: + var bat = rover.Bateria; + AddOrAppendSerie("Tensão", "V", bat?.TensaoInstantanea); + AddOrAppendSerie("Corrente", "A", bat?.CorrenteInstantanea); + AddOrAppendSerie("Temperatura", "°C", bat?.Temperatura); + break; + } + } + + #endregion + + } +} diff --git a/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoCenterViewModel.cs b/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoCenterViewModel.cs index ea4b994e9..86ec9ef23 100644 --- a/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoCenterViewModel.cs +++ b/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoCenterViewModel.cs @@ -1,12 +1,13 @@ 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/OperacaoLeftViewModel.cs b/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoLeftViewModel.cs index 00ece4955..e9552c912 100644 --- a/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoLeftViewModel.cs +++ b/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoLeftViewModel.cs @@ -4,6 +4,10 @@ using System.ComponentModel; using System.Windows; using System.Windows.Input; using static AgroBase.Models.Enums; +using Brush = System.Windows.Media.Brush; +using Brushes = System.Windows.Media.Brushes; +using SolidColorBrush = System.Windows.Media.SolidColorBrush; +using Color = System.Windows.Media.Color; namespace OperationControl.ViewModels.Views.Operacao { @@ -31,15 +35,15 @@ namespace OperationControl.ViewModels.Views.Operacao public string TextoBotaoOperacao => OperacaoEmExecucao ? "⏸ Pausar Operação" : "▶ Iniciar Operação"; - public System.Windows.Media.Brush CorBotaoOperacao => + public Brush CorBotaoOperacao => OperacaoEmExecucao - ? new System.Windows.Media.SolidColorBrush(System.Windows.Media.Color.FromRgb(120, 88, 20)) - : new System.Windows.Media.SolidColorBrush(System.Windows.Media.Color.FromRgb(30, 90, 58)); + ? new SolidColorBrush(Color.FromRgb(120, 88, 20)) + : new SolidColorBrush(Color.FromRgb(30, 90, 58)); public System.Windows.Media.Brush BordaBotaoOperacao => OperacaoEmExecucao - ? new System.Windows.Media.SolidColorBrush(System.Windows.Media.Color.FromRgb(170, 130, 40)) - : new System.Windows.Media.SolidColorBrush(System.Windows.Media.Color.FromRgb(74, 138, 91)); + ? new SolidColorBrush(System.Windows.Media.Color.FromRgb(170, 130, 40)) + : new SolidColorBrush(System.Windows.Media.Color.FromRgb(74, 138, 91)); private bool _roverSelecionado; diff --git a/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoRightViewModel.cs b/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoRightViewModel.cs index 89824def3..f6bd4577a 100644 --- a/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoRightViewModel.cs +++ b/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoRightViewModel.cs @@ -7,6 +7,8 @@ using System.ComponentModel; using System.Windows; using System.Windows.Input; using static AgroBase.Models.Enums; +using Brush = System.Windows.Media.Brush; +using Brushes = System.Windows.Media.Brushes; namespace OperationControl.ViewModels.Views.Operacao { @@ -231,6 +233,7 @@ namespace OperationControl.ViewModels.Views.Operacao Parametros.CapacidadeReservatorio = origem.CapacidadeReservatorio; var controle_o = origem.Controle; + if (controle_o == null) return; if (Parametros.Controle == null) Parametros.Controle = new OperacaoParametrosControleModel(); var controle_p = Parametros.Controle; diff --git a/AgroBase/OperationControl/ViewModels/Views/PreparacaoMapa/PreparacaoMapaTopViewModel.cs b/AgroBase/OperationControl/ViewModels/Views/PreparacaoMapa/PreparacaoMapaTopViewModel.cs index e801743b2..20f10ce73 100644 --- a/AgroBase/OperationControl/ViewModels/Views/PreparacaoMapa/PreparacaoMapaTopViewModel.cs +++ b/AgroBase/OperationControl/ViewModels/Views/PreparacaoMapa/PreparacaoMapaTopViewModel.cs @@ -1,6 +1,8 @@ using AgroBase.Models; using System.ComponentModel; using static AgroBase.Models.Enums; +using Brush = System.Windows.Media.Brush; +using Brushes = System.Windows.Media.Brushes; namespace OperationControl.ViewModels { diff --git a/AgroBase/OperationControl/ViewModels/Windows/DockWindowViewModel.cs b/AgroBase/OperationControl/ViewModels/Windows/DockWindowViewModel.cs index d32d510f6..619405aee 100644 --- a/AgroBase/OperationControl/ViewModels/Windows/DockWindowViewModel.cs +++ b/AgroBase/OperationControl/ViewModels/Windows/DockWindowViewModel.cs @@ -133,7 +133,7 @@ namespace OperationControl.ViewModels } } - private bool _baseFixada = true; + private bool _baseFixada; public bool BaseFixada { get => _baseFixada; @@ -372,6 +372,7 @@ namespace OperationControl.ViewModels System.Windows.Application.Current.Dispatcher.Invoke(() => { _viewPreparacaoMapaTop?._vm?.AtualizarDados(dados); + _viewPreparacaoMapa?.MapaPreparacao?.markers?.UpdateMarkerPosition(VariaveisControleOperacao.BaseMarkerID, lat: dados?.Latitude, lon: dados?.Longitude, heading: dados?.OrientacaoReal); }); break; @@ -638,6 +639,9 @@ namespace OperationControl.ViewModels r.HerbicidaPercentual = obj.Atuador?.PercentualReservatorio ?? 0; r.InfestacaoPercentual = obj.Atuador?.PercentualErvasTerreno ?? 0; }); + + _viewOperacaoCenter?._vm?.DiagnosticoVM?.AtualizarDados(rover); + _viewOperacaoCenter?.AtualizarGraficoDiagnostico(_viewOperacaoCenter?._vm?.DiagnosticoVM); } } diff --git a/AgroBase/OperationControl/Views/Operacao/OperacaoCenterView.xaml b/AgroBase/OperationControl/Views/Operacao/OperacaoCenterView.xaml index d28f86842..15f9bbd3e 100644 --- a/AgroBase/OperationControl/Views/Operacao/OperacaoCenterView.xaml +++ b/AgroBase/OperationControl/Views/Operacao/OperacaoCenterView.xaml @@ -5,12 +5,53 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:OperationControl.Views.Operacao" xmlns:controls="clr-namespace:OperationControl.Controls" + xmlns:scott="clr-namespace:ScottPlot.WPF;assembly=ScottPlot.WPF" mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"> + + + @@ -24,16 +65,792 @@ - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +