diff --git a/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs b/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs index 76d6ac67b..d84c6fb3a 100644 --- a/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs +++ b/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs @@ -977,6 +977,7 @@ namespace AgroBase.Models Variaveis.OperacaoEmAndamento.Parametros.RoverId = VariaveisEquipamento.Parametros.serial_number; Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura = new OperacaoParametrosDadosModel(); Variaveis.OperacaoEmAndamento.Sensoriamento.AtualizarDados(); + Variaveis.OperacaoEmAndamento.Parametros.ModulosMandatorios.ForEach(m => m.ComponentesEmUso = Variaveis.OperacaoEmAndamento.PreencherComponentesEmUso(m.Dispositivo)); Variaveis.OperacaoEmAndamento.DefinirComponentesEmUso(); Variaveis.OperacaoEmAndamento.Descricao = Parametros.Descricao; @@ -1109,6 +1110,7 @@ namespace AgroBase.Models Console.WriteLine("Nenhuma calibragem foi iniciada."); _Controle.TipoMovimento = tipoControle; Variaveis.OperacaoEmAndamento.Calibrando = false; + Variaveis.OperacaoEmAndamento.Pausa = false; return; } diff --git a/AgroBase/AgroBase/Models/Variaveis.cs b/AgroBase/AgroBase/Models/Variaveis.cs index 71ebe8b71..4f6b8e28a 100644 --- a/AgroBase/AgroBase/Models/Variaveis.cs +++ b/AgroBase/AgroBase/Models/Variaveis.cs @@ -290,6 +290,7 @@ namespace AgroBase.Models else if (disp == T_Code.Mov) { controle.Controle.PercentualVelocidadeSP = msg.P1 / 100.0; + controle.Controle.EmFreio = msg.P2 == 1; } } diff --git a/AgroBase/OperationControl/Controls/ManualControlPad.xaml.cs b/AgroBase/OperationControl/Controls/ManualControlPad.xaml.cs index b7f9f64c8..b4960a124 100644 --- a/AgroBase/OperationControl/Controls/ManualControlPad.xaml.cs +++ b/AgroBase/OperationControl/Controls/ManualControlPad.xaml.cs @@ -354,7 +354,7 @@ namespace OperationControl.Controls if (_lastMovKey != mov) { //VariaveisControleOperacao.EnviarComandoMovimentacao(mov, Convert.ToInt32(SpeedControl)); - VariaveisControleOperacao.EnviarComandoMovimentacaoUDP(mov, Convert.ToInt32(SpeedControl)); + VariaveisControleOperacao.EnviarComandoMovimentacaoUDP(mov, Convert.ToInt32(SpeedControl), false); _lastMovKey = mov; } } diff --git a/AgroBase/OperationControl/Models/AppShell.cs b/AgroBase/OperationControl/Models/AppShell.cs index c0b5f2448..4ec42cdbb 100644 --- a/AgroBase/OperationControl/Models/AppShell.cs +++ b/AgroBase/OperationControl/Models/AppShell.cs @@ -9,6 +9,7 @@ namespace OperationControl.Models public class AppShell { public static readonly bool Mock = true; + private static readonly bool AddRover = false; private readonly System.Timers.Timer tmrComunicacao = new(1000) { AutoReset = true }; private int tmrComunicacaoTicks = 0; @@ -36,18 +37,21 @@ namespace OperationControl.Models Dock = new DockWindow(); Dock.Show(); - if (Mock && false) + if (Mock && AddRover) { Task.Run(async () => { await Task.Delay(1000); VariaveisControleOperacao.AdicionarNovoRoverNaRede("01", "192.168.1.100"); - VariaveisControleOperacao.RoversNaRede.FirstOrDefault().DadosLeitura = new AgroBase.Models.Operacoes.OperacaoParametrosDadosModel() + var r = VariaveisControleOperacao.RoversNaRede.FirstOrDefault(); + r.Modo = AgroBase.Models.Enums.ModoOperacao.MapaGPS; + r.Descricao = "Operacao Mockada"; + r.DadosLeitura = new AgroBase.Models.Operacoes.OperacaoParametrosDadosModel() { StatusRover = StatusModulo.Operante, Operacao = new AgroBase.Models.Operacoes.OperacaoParametrosDadosOperacaoModel() { - Status = StatusOperacao.Parametrizando + Status = StatusOperacao.Parametrizando, }, Atuador = new AgroBase.Models.Operacoes.OperacaoParametrosDadosAtuadorModel() { @@ -80,7 +84,7 @@ namespace OperationControl.Models QtdAtuacoes = 5, TempoAtuado = 300, VazaoInstantaneaMLs = 15, - VazaoMediaMLs = 30, + VazaoMediaMLs = 30, VolumeVazadoML = 325 }, new AgroBase.Models.Operacoes.OperacaoParametrosDadosBicoModel() @@ -118,8 +122,39 @@ namespace OperationControl.Models VolumeVazadoML = 325 }, } + }, + Controle = new AgroBase.Models.Operacoes.OperacaoParametrosDadosControleModel() + { + AlturaBarra = 50, + Angulo = 0, + PercentualVelocidadeSPKmh = 0, + TipoMovimento = TipoMovimentoDirecional.RodasDianteiras } }; + r.Controle = new AgroBase.Models.Operacoes.OperacaoParametrosControleModel() + { + AtuAlturaAreaPulverizacao = 10, + AtuDuracaoAtuacao = 200, + AtuPercentualErvasBicoOff = 1, + AtuPercentualErvasBicoOn = 2, + AtuPercentualInicioPulverizacao = 70, + AtuPressaoLinha = 80, + DirAnguloMaximo = 30, + DirecionalAutomatico = true, + MovimentoAutomatico = true, + PulverizadorAutomatico = true, + DirTipoMovimento = TiposControladorDirecional.MPC, + DirVelocidadeMovimento = 40, + FrenagemAutomaticaAoParar = false, + ImuParadaPorInclinacao = false, + MovVelocidadeCErvasPercent = 20, + MovVelocidadeSErvasPercent = 50, + MpcHorizonte = 4, + MpcMatrizCusto = false, + OakParadaPorObstaculo = false, + RegistrarDadosPosProcessamento = false, + SonarAtivado = false + }; }); } } diff --git a/AgroBase/OperationControl/Models/Variaveis.cs b/AgroBase/OperationControl/Models/Variaveis.cs index ff886b15b..224b08748 100644 --- a/AgroBase/OperationControl/Models/Variaveis.cs +++ b/AgroBase/OperationControl/Models/Variaveis.cs @@ -5,7 +5,6 @@ using OperationControl.Services; using AgroMonitor; using Application = System.Windows.Application; using AgroBase.Models.Operacoes; -using OperationControl.ViewModels; namespace OperationControl.Models { @@ -494,7 +493,7 @@ namespace OperationControl.Models }); } - public static void EnviarComandoMovimentacaoUDP(AgroBase.Models.Enums.Direcao direcao, double velPct) + public static void EnviarComandoMovimentacaoUDP(AgroBase.Models.Enums.Direcao direcao, double velPct, bool emfreio) { var key = DeParaDirecaoTecla(direcao); @@ -504,7 +503,7 @@ namespace OperationControl.Models Flags = UdpCtrlFlags.HasKey | UdpCtrlFlags.HasPayload, Key = key, P1 = (short)Math.Max(short.MinValue, Math.Min(short.MaxValue, (int)Math.Round(velPct * 100.0))), - P2 = 0 + P2 = (short)(emfreio ? 1 : 0) }; //return Variaveis.UdpChannel.SendBurstAsync(0x01, msg.ToBytes(), count: 6, intervalMs: 25, requestAck: false); diff --git a/AgroBase/OperationControl/OperationControl.csproj.user b/AgroBase/OperationControl/OperationControl.csproj.user index 2323a885a..642fee9a8 100644 --- a/AgroBase/OperationControl/OperationControl.csproj.user +++ b/AgroBase/OperationControl/OperationControl.csproj.user @@ -46,10 +46,16 @@ Code - + Code - + + Code + + + Code + + Code @@ -67,6 +73,9 @@ Code + + Code + Code @@ -123,10 +132,16 @@ Designer - + Designer - + + Designer + + + Designer + + Designer @@ -144,6 +159,9 @@ Designer + + Designer + Designer diff --git a/AgroBase/OperationControl/ViewModels/Views/Operacao/Monitoramento/ControleManualViewModel.cs b/AgroBase/OperationControl/ViewModels/Views/Operacao/Monitoramento/ControleManualViewModel.cs new file mode 100644 index 000000000..a86372d8a --- /dev/null +++ b/AgroBase/OperationControl/ViewModels/Views/Operacao/Monitoramento/ControleManualViewModel.cs @@ -0,0 +1,361 @@ +using OperationControl.Models; +using System.ComponentModel; +using System.Windows.Media; +using static AgroBase.Models.Enums; +using Brush = System.Windows.Media.Brush; +using Color = System.Windows.Media.Color; +using Key = System.Windows.Input.Key; + +namespace OperationControl.ViewModels.Views.Operacao.Monitoramento +{ + public class ControleManualViewModel : INotifyPropertyChanged + { + private bool _habilitado; + private double _velocidadePercentual = 40; + private double _anguloDirecional = 10; + private TipoMovimentoDirecional _tipoMovimentoSelecionado = TipoMovimentoDirecional.RodasDianteiras; + + private bool _wPressionado; + private bool _aPressionado; + private bool _sPressionado; + private bool _dPressionado; + private bool _fPressionado; + + private readonly HashSet _pressedKeys = new(); + + private Direcao _lastMovKey = Direcao.Parado; + private Direcao _lastDirKey = Direcao.Parado; + private bool _lastFreio = false; + + public bool Habilitado + { + get => _habilitado; + set + { + if (_habilitado != value) + { + _habilitado = value; + OnPropertyChanged(nameof(StatusTexto)); + OnPropertyChanged(nameof(TextoAjuda)); + OnPropertyChanged(nameof(StatusBrush)); + + if (VariaveisControleOperacao.RoverEmFoco != null) + { + VariaveisControleOperacao.RoverEmFoco.Controle.MovimentoAutomatico = !value; + VariaveisControleOperacao.RoverEmFoco.Controle.DirecionalAutomatico = !value; + VariaveisControleOperacao.EnviarParametrosOperacao(new AgroBase.Models.Operacoes.OperacaoParametrosModel() + { + Controle = VariaveisControleOperacao.RoverEmFoco?.Controle + }); + } + + if (!value) + { + LimparTeclas(); + EnviarNeutros(); + } + } + } + } + + public double VelocidadePercentual + { + get => _velocidadePercentual; + set + { + if (_velocidadePercentual != value) + { + _velocidadePercentual = value; + OnPropertyChanged(nameof(VelocidadePercentualTexto)); + + if (Habilitado) + RecalcularComandos(); + } + } + } + + public string VelocidadePercentualTexto => $"{VelocidadePercentual:0}%"; + + public double AnguloDirecional + { + get => _anguloDirecional; + set + { + if (_anguloDirecional != value) + { + _anguloDirecional = value; + OnPropertyChanged(nameof(AnguloTexto)); + + if (Habilitado) + RecalcularComandos(); + } + } + } + + public string AnguloTexto => $"{AnguloDirecional:+0;-0;0}°"; + + public TipoMovimentoDirecional TipoMovimentoSelecionado + { + get => _tipoMovimentoSelecionado; + set + { + if (_tipoMovimentoSelecionado != value) + { + _tipoMovimentoSelecionado = value; + if (Habilitado) + RecalcularComandos(); + } + } + } + + public List TiposMovimento { get; } = + Enum.GetValues(typeof(TipoMovimentoDirecional)) + .Cast() + .ToList(); + + public bool WPressionado + { + get => _wPressionado; + private set + { + if (_wPressionado != value) + { + _wPressionado = value; + OnPropertyChanged(nameof(TeclaWBackground)); + OnPropertyChanged(nameof(TeclaWBorder)); + OnPropertyChanged(nameof(MovimentoAtualTexto)); + } + } + } + + public bool APressionado + { + get => _aPressionado; + private set + { + if (_aPressionado != value) + { + _aPressionado = value; + OnPropertyChanged(nameof(TeclaABackground)); + OnPropertyChanged(nameof(TeclaABorder)); + OnPropertyChanged(nameof(DirecaoAtualTexto)); + } + } + } + + public bool SPressionado + { + get => _sPressionado; + private set + { + if (_sPressionado != value) + { + _sPressionado = value; + OnPropertyChanged(nameof(TeclaSBackground)); + OnPropertyChanged(nameof(TeclaSBorder)); + OnPropertyChanged(nameof(MovimentoAtualTexto)); + } + } + } + + public bool DPressionado + { + get => _dPressionado; + private set + { + if (_dPressionado != value) + { + _dPressionado = value; + OnPropertyChanged(nameof(TeclaDBackground)); + OnPropertyChanged(nameof(TeclaDBorder)); + OnPropertyChanged(nameof(DirecaoAtualTexto)); + } + } + } + + public bool FPressionado + { + get => _fPressionado; + private set + { + if (_fPressionado != value) + { + _fPressionado = value; + OnPropertyChanged(nameof(TeclaFBackground)); + OnPropertyChanged(nameof(TeclaFBorder)); + OnPropertyChanged(nameof(FreioAtivoTexto)); + OnPropertyChanged(nameof(FreioCardBackground)); + OnPropertyChanged(nameof(FreioCardBorder)); + OnPropertyChanged(nameof(MovimentoAtualTexto)); + } + } + } + + public Brush TeclaWBackground => WPressionado ? BrushFrom("#1D4ED8") : BrushFrom("#2D2D2D"); + public Brush TeclaWBorder => WPressionado ? BrushFrom("#60A5FA") : BrushFrom("#555555"); + + public Brush TeclaABackground => APressionado ? BrushFrom("#1D4ED8") : BrushFrom("#2D2D2D"); + public Brush TeclaABorder => APressionado ? BrushFrom("#60A5FA") : BrushFrom("#555555"); + + public Brush TeclaSBackground => SPressionado ? BrushFrom("#B45309") : BrushFrom("#2D2D2D"); + public Brush TeclaSBorder => SPressionado ? BrushFrom("#F59E0B") : BrushFrom("#555555"); + + public Brush TeclaDBackground => DPressionado ? BrushFrom("#1D4ED8") : BrushFrom("#2D2D2D"); + public Brush TeclaDBorder => DPressionado ? BrushFrom("#60A5FA") : BrushFrom("#555555"); + + public Brush TeclaFBackground => FPressionado ? BrushFrom("#7A2323") : BrushFrom("#2D2D2D"); + public Brush TeclaFBorder => FPressionado ? BrushFrom("#D35B5B") : BrushFrom("#555555"); + + public Brush FreioCardBackground => FPressionado ? BrushFrom("#7A2323") : BrushFrom("#2B2B2B"); + public Brush FreioCardBorder => FPressionado ? BrushFrom("#D35B5B") : BrushFrom("#555555"); + + public string MovimentoAtualTexto + { + get + { + if (FPressionado) + return "Freado"; + + if (WPressionado && !SPressionado) return "Frente"; + if (SPressionado && !WPressionado) return "Ré"; + if (WPressionado && SPressionado) return "Conflito"; + return "Parado"; + } + } + + public string DirecaoAtualTexto + { + get + { + if (APressionado && !DPressionado) return "Esquerda"; + if (DPressionado && !APressionado) return "Direita"; + if (APressionado && DPressionado) return "Conflito"; + return "Centralizado"; + } + } + + public string FreioAtivoTexto => FPressionado ? "Freio Ativo" : "Freio Inativo"; + + public string StatusTexto => !Habilitado ? "INATIVO" : "PRONTO"; + + public string TextoAjuda => !Habilitado + ? "Habilite o controle por teclado para começar." + : "Clique na tela de operação e use W, A, S, D e F para controlar o rover."; + + public Brush StatusBrush => !Habilitado ? BrushFrom("#6B7280") : BrushFrom("#22C55E"); + + public void HandleKeyDown(Key key) + { + if (!Habilitado) + return; + + if (_pressedKeys.Contains(key)) + return; + + _pressedKeys.Add(key); + AtualizarEstadoTeclas(); + RecalcularComandos(); + } + + public void HandleKeyUp(Key key) + { + if (_pressedKeys.Remove(key)) + { + AtualizarEstadoTeclas(); + RecalcularComandos(); + } + } + + public void LimparTeclas() + { + _pressedKeys.Clear(); + AtualizarEstadoTeclas(); + } + + private void AtualizarEstadoTeclas() + { + WPressionado = _pressedKeys.Contains(Key.W) || _pressedKeys.Contains(Key.Up); + APressionado = _pressedKeys.Contains(Key.A) || _pressedKeys.Contains(Key.Left); + SPressionado = _pressedKeys.Contains(Key.S) || _pressedKeys.Contains(Key.Down); + DPressionado = _pressedKeys.Contains(Key.D) || _pressedKeys.Contains(Key.Right); + FPressionado = _pressedKeys.Contains(Key.F) || _pressedKeys.Contains(Key.Space); + } + + private void RecalcularComandos() + { + var dir = ObterDirecaoDirecional(); + var mov = ObterDirecaoMovimentacao(); + var freio = FPressionado; + + if (_lastDirKey != dir) + { + VariaveisControleOperacao.EnviarComandoDirecionalUDP(dir, Convert.ToInt32(AnguloDirecional), TipoMovimentoSelecionado); + + _lastDirKey = dir; + } + + if (_lastMovKey != mov || _lastFreio != freio) + { + VariaveisControleOperacao.EnviarComandoMovimentacaoUDP(mov, Convert.ToInt32(VelocidadePercentual), freio); + + _lastMovKey = mov; + _lastFreio = freio; + } + } + + private Direcao ObterDirecaoDirecional() + { + if (APressionado && !DPressionado) + return Direcao.Esquerda; + + if (DPressionado && !APressionado) + return Direcao.Direita; + + return Direcao.Parado; + } + + private Direcao ObterDirecaoMovimentacao() + { + if (FPressionado) + return Direcao.Parado; + + if (WPressionado && !SPressionado) + return Direcao.Cima; + + if (SPressionado && !WPressionado) + return Direcao.Baixo; + + return Direcao.Parado; + } + + private void EnviarNeutros() + { + if (_lastDirKey != Direcao.Parado) + { + VariaveisControleOperacao.EnviarComandoDirecionalUDP(Direcao.Parado, Convert.ToInt32(AnguloDirecional), TipoMovimentoSelecionado); + + _lastDirKey = Direcao.Parado; + } + + if (_lastMovKey != Direcao.Parado || _lastFreio) + { + VariaveisControleOperacao.EnviarComandoMovimentacaoUDP(Direcao.Parado, 0, false); + + _lastMovKey = Direcao.Parado; + _lastFreio = false; + } + } + + private Brush BrushFrom(string hex) + { + return new SolidColorBrush((Color)System.Windows.Media.ColorConverter.ConvertFromString(hex)); + } + + + public event PropertyChangedEventHandler PropertyChanged; + private void OnPropertyChanged(string nome) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nome)); + } + } +} \ No newline at end of file diff --git a/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoGraficoSerieViewModel.cs b/AgroBase/OperationControl/ViewModels/Views/Operacao/Monitoramento/Diagnostico/DiagnosticoGraficoSerieViewModel.cs similarity index 89% rename from AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoGraficoSerieViewModel.cs rename to AgroBase/OperationControl/ViewModels/Views/Operacao/Monitoramento/Diagnostico/DiagnosticoGraficoSerieViewModel.cs index 0bb12f821..0a2d351b2 100644 --- a/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoGraficoSerieViewModel.cs +++ b/AgroBase/OperationControl/ViewModels/Views/Operacao/Monitoramento/Diagnostico/DiagnosticoGraficoSerieViewModel.cs @@ -6,7 +6,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace OperationControl.ViewModels.Views.Operacao.Diagnostico +namespace OperationControl.ViewModels.Views.Operacao.Monitoramento.Diagnostico { public class DiagnosticoGraficoSerieViewModel : NotifyBase { diff --git a/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoModuloItemViewModel.cs b/AgroBase/OperationControl/ViewModels/Views/Operacao/Monitoramento/Diagnostico/DiagnosticoModuloItemViewModel.cs similarity index 97% rename from AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoModuloItemViewModel.cs rename to AgroBase/OperationControl/ViewModels/Views/Operacao/Monitoramento/Diagnostico/DiagnosticoModuloItemViewModel.cs index 53affd257..9c2517d23 100644 --- a/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoModuloItemViewModel.cs +++ b/AgroBase/OperationControl/ViewModels/Views/Operacao/Monitoramento/Diagnostico/DiagnosticoModuloItemViewModel.cs @@ -5,7 +5,7 @@ using static AgroBase.Models.Enums; using Brush = System.Windows.Media.Brush; using Brushes = System.Windows.Media.Brushes; -namespace OperationControl.ViewModels.Views.Operacao.Diagnostico +namespace OperationControl.ViewModels.Views.Operacao.Monitoramento.Diagnostico { public class DiagnosticoModuloItemViewModel : NotifyBase { diff --git a/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoOpcoesViewModel.cs b/AgroBase/OperationControl/ViewModels/Views/Operacao/Monitoramento/Diagnostico/DiagnosticoOpcoesViewModel.cs similarity index 97% rename from AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoOpcoesViewModel.cs rename to AgroBase/OperationControl/ViewModels/Views/Operacao/Monitoramento/Diagnostico/DiagnosticoOpcoesViewModel.cs index cab6222c9..66b7a65dc 100644 --- a/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoOpcoesViewModel.cs +++ b/AgroBase/OperationControl/ViewModels/Views/Operacao/Monitoramento/Diagnostico/DiagnosticoOpcoesViewModel.cs @@ -7,7 +7,7 @@ using System.Windows.Input; using OperationControl.Helpers; using static AgroBase.Services.CoolerControlService; -namespace OperationControl.ViewModels.Views.Operacao.Diagnostico +namespace OperationControl.ViewModels.Views.Operacao.Monitoramento.Diagnostico { public class DiagnosticoOpcoesViewModel : NotifyBase { @@ -187,7 +187,7 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico set { if (SetProperty(ref _gpsLeverArmLateral, value)) - GpsLeverArmLateralTexto = $"{(value * 10.0):00} cm"; + GpsLeverArmLateralTexto = $"{value * 10.0:00} cm"; } } @@ -201,7 +201,7 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico set { if (SetProperty(ref _gpsLeverArmFrontal, value)) - GpsLeverArmFrontalTexto = $"{(value * 10.0):00} cm"; + GpsLeverArmFrontalTexto = $"{value * 10.0:00} cm"; } } @@ -550,8 +550,8 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico { 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"; + 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"; @@ -567,8 +567,8 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico { 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"; + TxtBombaComando = bomba?.ComandoEstado ?? false ? "Ligado" : "Desligado"; + TxtBombaStatusReal = bomba?.LeituraEstado ?? false ? "Ligado" : "Desligado"; TxtBombaPressaoLinha = $"{rover?.Atuador?.PressaoLinhaPsi ?? 0:0.##} psi"; TxtBombaPotencia = $"{bomba?.Potencia ?? 0:0.#} %"; if (clicado) @@ -614,8 +614,8 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico 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"; + TxtTrajetoriaBatOk = dados?.BateriaSuficiente ?? false ? "Sim" : "Não"; + TxtTrajetoriaHerbOk = dados?.HerbicidaSuficiente ?? false ? "Sim" : "Não"; TrajetoriaPodeConfirmar = !(dados?.Liberado ?? false); if (clicado) { @@ -628,8 +628,8 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico { 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"; + TxtReleComando = rele?.ComandoEstado ?? false ? "Ligado" : "Desligado"; + TxtReleStatusReal = rele?.LeituraEstado ?? false ? "Ligado" : "Desligado"; } private void PreencherServoSensoriamento(OperacaoParametrosDadosModel rover, bool clicado) @@ -637,7 +637,7 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico 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"; + TxtServoIncremental = servo?.Incremental ?? false ? "Incremental" : "Decremental"; if (clicado) { ServoAngulo = servo?.ComandoAngulo ?? 0; @@ -649,7 +649,7 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico 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"; + TxtServoIncremental = servo?.Incremental ?? false ? "Incremental" : "Decremental"; if (clicado) { ServoAngulo = servo?.ComandoAngulo ?? 0; diff --git a/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoViewModel.cs b/AgroBase/OperationControl/ViewModels/Views/Operacao/Monitoramento/Diagnostico/DiagnosticoViewModel.cs similarity index 99% rename from AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoViewModel.cs rename to AgroBase/OperationControl/ViewModels/Views/Operacao/Monitoramento/Diagnostico/DiagnosticoViewModel.cs index f5ddadc35..898d0d39d 100644 --- a/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoViewModel.cs +++ b/AgroBase/OperationControl/ViewModels/Views/Operacao/Monitoramento/Diagnostico/DiagnosticoViewModel.cs @@ -7,7 +7,7 @@ using AgroBase.Models.Operacoes; using OperationControl.Models; using Newtonsoft.Json.Linq; -namespace OperationControl.ViewModels.Views.Operacao.Diagnostico +namespace OperationControl.ViewModels.Views.Operacao.Monitoramento.Diagnostico { public class DiagnosticoViewModel : NotifyBase { @@ -595,7 +595,7 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico mod.ComponentesEmUso[label] = (MandatorioSelecionado, EmUsoSelecionado); } - VariaveisControleOperacao.EnviarParametrosOperacao(new AgroBase.Models.Operacoes.OperacaoParametrosModel() + VariaveisControleOperacao.EnviarParametrosOperacao(new OperacaoParametrosModel() { ModulosMandatorios = rover.ModulosMandatorios, }); @@ -608,7 +608,7 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico } - + private void AtualizarGraficoModuloSelecionado() @@ -697,13 +697,13 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico { case S_Code.sBIC: var bico = rover.Atuador?.Bicos?.FirstOrDefault(x => x.ID == item.LabelModulo); - AddOrAppendSerie("Cmd", "", (bico?.ComandoEstado ?? false) ? 100 : 0); + 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("Cmd", "", bomba?.ComandoEstado ?? false ? 100 : 0); AddOrAppendSerie("Potência", "%", bomba?.Potencia); AddOrAppendSerie("Pressão", "psi", rover.Atuador?.PressaoLinhaPsi); break; @@ -770,7 +770,7 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico break; } } - + #endregion } diff --git a/AgroBase/OperationControl/ViewModels/Views/Operacao/Monitoramento/ParametrizacaoViewModel.cs b/AgroBase/OperationControl/ViewModels/Views/Operacao/Monitoramento/ParametrizacaoViewModel.cs new file mode 100644 index 000000000..0be7e039f --- /dev/null +++ b/AgroBase/OperationControl/ViewModels/Views/Operacao/Monitoramento/ParametrizacaoViewModel.cs @@ -0,0 +1,61 @@ +using AgroBase.Models; +using AgroBase.Models.Operacoes; +using OperationControl.Helpers; +using System.ComponentModel; +using System.Windows.Input; + +namespace OperationControl.ViewModels.Views.Operacao.Monitoramento +{ + public class ParametrizacaoViewModel : INotifyPropertyChanged + { + private OperacaoParametrosModel _parametros = new OperacaoParametrosModel(); + public OperacaoParametrosModel Parametros + { + get => _parametros; + set + { + if (_parametros != value) + { + _parametros = value; + OnPropertyChanged(nameof(Parametros)); + } + } + } + + public ParametrizacaoViewModel() + { + CarregarParametrosPadraoCommand = new RelayCommand(p => CarregarParametrosPadrao((AgroBase.Models.Enums.ModoOperacao)p)); + LerParametrosCommand = new RelayCommand(_ => LerParametrosSolicitado?.Invoke()); + SalvarParametrosCommand = new RelayCommand(_ => SalvarParametrosSolicitado?.Invoke(Parametros)); + } + + + public event Action? LerParametrosSolicitado; + public event Action? SalvarParametrosSolicitado; + public ICommand LerParametrosCommand { get; } + public ICommand SalvarParametrosCommand { get; } + public ICommand CarregarParametrosPadraoCommand { get; } + public Array ModosOperacaoDisponiveis { get; } = Enum.GetValues(typeof(AgroBase.Models.Enums.ModoOperacao)); + + + private void CarregarParametrosPadrao(AgroBase.Models.Enums.ModoOperacao modo) + { + var p = OperacaoModel.CarregarParametrosOperacaoPadrao(modo, false); + p.Descricao = $"{p.Modo} - Padrão"; + Parametros = p; + } + + public void AtualizarParametros(OperacaoParametrosModel origem) + { + if (origem == null) return; + Parametros = origem; + } + + + public event PropertyChangedEventHandler PropertyChanged; + private void OnPropertyChanged(string nome) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nome)); + } + } +} diff --git a/AgroBase/OperationControl/ViewModels/Views/Operacao/Monitoramento/ResumoViewModel.cs b/AgroBase/OperationControl/ViewModels/Views/Operacao/Monitoramento/ResumoViewModel.cs new file mode 100644 index 000000000..4f8de2500 --- /dev/null +++ b/AgroBase/OperationControl/ViewModels/Views/Operacao/Monitoramento/ResumoViewModel.cs @@ -0,0 +1,39 @@ +using OperationControl.Models.Operacao; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace OperationControl.ViewModels.Views.Operacao.Monitoramento +{ + public class ResumoViewModel : INotifyPropertyChanged + { + public ResumoOperacionalModel Resumo { get; } = new ResumoOperacionalModel(); + + public ResumoViewModel() + { + + } + + + public void AtualizarResumo(Action updateAction) + { + if (!System.Windows.Application.Current.Dispatcher.CheckAccess()) + { + System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() => updateAction?.Invoke(Resumo))); + return; + } + + updateAction?.Invoke(Resumo); + } + + + public event PropertyChangedEventHandler PropertyChanged; + private void OnPropertyChanged(string nome) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nome)); + } + } +} diff --git a/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoLeftViewModel.cs b/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoLeftViewModel.cs index e9552c912..c66ea5846 100644 --- a/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoLeftViewModel.cs +++ b/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoLeftViewModel.cs @@ -253,7 +253,7 @@ namespace OperationControl.ViewModels.Views.Operacao OnPropertyChanged(nameof(CorGnss)); } - public void AtualizarRover(string nomeRover, double velocidadeKmh, double anguloDirecionalGraus, TipoMovimentoDirecional tipoMovimento, double temperaturaC, double bateriaPct, double reservatorioPct, string saudeRede, string saudeGnss) + public void AtualizarRover(string nomeRover, double velocidadeKmh, double anguloDirecionalGraus, TipoMovimentoDirecional tipoMovimento, double temperaturaC, double bateriaPct, double reservatorioPct, string saudeRede, string saudeGnss, bool op_iniciada) { RoverSelecionado = true; NomeRover = nomeRover; @@ -271,11 +271,14 @@ namespace OperationControl.ViewModels.Views.Operacao SaudeRede = saudeRede; SaudeGnss = saudeGnss; + OperacaoEmExecucao = op_iniciada; + OnPropertyChanged(nameof(CorTemperatura)); OnPropertyChanged(nameof(CorBateria)); OnPropertyChanged(nameof(CorReservatorio)); OnPropertyChanged(nameof(CorRede)); OnPropertyChanged(nameof(CorGnss)); + OnPropertyChanged(nameof(OperacaoEmExecucao)); } private void AlternarOperacao() @@ -300,8 +303,6 @@ namespace OperationControl.ViewModels.Views.Operacao VariaveisControleOperacao.EnviarComandoIniciarOperacao(true, simulador); } } - - OperacaoEmExecucao = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Operacao?.Iniciada ?? false; } private void ExecutarParadaEmergencia() @@ -317,7 +318,6 @@ namespace OperationControl.ViewModels.Views.Operacao if (System.Windows.MessageBox.Show("Deseja finalizar a operação em andamento?", "Finalizar Operação", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes) { VariaveisControleOperacao.EnviarComandoIniciarOperacao(false); - OperacaoEmExecucao = false; } } diff --git a/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoRightViewModel.cs b/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoRightViewModel.cs index d079450aa..67fb4ff3a 100644 --- a/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoRightViewModel.cs +++ b/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoRightViewModel.cs @@ -17,22 +17,7 @@ namespace OperationControl.ViewModels.Views.Operacao { private bool _isCollapsed; private RoverCardModel _roverSelecionado; - public ResumoOperacionalModel Resumo { get; } = new ResumoOperacionalModel(); - private OperacaoParametrosModel _parametros = new OperacaoParametrosModel(); - public OperacaoParametrosModel Parametros - { - get => _parametros; - set - { - if (_parametros != value) - { - _parametros = value; - OnPropertyChanged(nameof(Parametros)); - } - } - } - public OperacaoRightViewModel() { Rovers = new ObservableCollection(); @@ -47,16 +32,11 @@ namespace OperationControl.ViewModels.Views.Operacao SelecionarSecao(secaoParseada); }); AcaoBotaoTopoCommand = new RelayCommand(_ => ExecutarAcaoBotaoTopo()); - CarregarParametrosPadraoCommand = new RelayCommand(p => CarregarParametrosPadrao((AgroBase.Models.Enums.ModoOperacao)p)); - LerParametrosCommand = new RelayCommand(_ => LerParametrosSolicitado?.Invoke()); - SalvarParametrosCommand = new RelayCommand(_ => SalvarParametrosSolicitado?.Invoke(Parametros)); } public event PropertyChangedEventHandler PropertyChanged; public event Action SecaoSelecionadaChanged; public event Action RoverSelecionadoChanged; - public event Action? LerParametrosSolicitado; - public event Action? SalvarParametrosSolicitado; public ObservableCollection Rovers { get; } @@ -64,9 +44,6 @@ namespace OperationControl.ViewModels.Views.Operacao public ICommand SelecionarRoverCommand { get; } public ICommand SelecionarSecaoCommand { get; } public ICommand AcaoBotaoTopoCommand { get; } - public ICommand LerParametrosCommand { get; } - public ICommand SalvarParametrosCommand { get; } - public ICommand CarregarParametrosPadraoCommand { get; } public bool IsCollapsed { @@ -131,8 +108,6 @@ namespace OperationControl.ViewModels.Views.Operacao public string TextoBotaoTopo => BotaoTopoEhVoltar ? "◀ Voltar" : "Trocar Rover"; - public Array ModosOperacaoDisponiveis { get; } = Enum.GetValues(typeof(AgroBase.Models.Enums.ModoOperacao)); - private void ExecutarAcaoBotaoTopo() { if (BotaoTopoEhVoltar) @@ -145,13 +120,7 @@ namespace OperationControl.ViewModels.Views.Operacao } } - private void CarregarParametrosPadrao(AgroBase.Models.Enums.ModoOperacao modo) - { - var p = OperacaoModel.CarregarParametrosOperacaoPadrao(modo, false); - p.Descricao = $"{p.Modo} - Padrão"; - Parametros = p; - } - + public void ToggleCollapse() { IsCollapsed = !IsCollapsed; @@ -176,13 +145,6 @@ namespace OperationControl.ViewModels.Views.Operacao public void SelecionarSecao(SecaoRightBar secao) { - switch (secao) - { - case SecaoRightBar.Parametrizacao: - AtualizarParametros(VariaveisControleOperacao.RoverEmFoco); - break; - } - SecaoAtual = secao; SecaoSelecionadaChanged?.Invoke(secao); @@ -235,23 +197,6 @@ namespace OperationControl.ViewModels.Views.Operacao OnPropertyChanged(nameof(ComRoverSelecionado)); } - public void AtualizarResumo(Action updateAction) - { - if (!System.Windows.Application.Current.Dispatcher.CheckAccess()) - { - System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() => updateAction?.Invoke(Resumo))); - return; - } - - updateAction?.Invoke(Resumo); - } - - - public void AtualizarParametros(OperacaoParametrosModel origem) - { - if (origem == null) return; - Parametros = origem; - } private void OnPropertyChanged(string nome) { diff --git a/AgroBase/OperationControl/ViewModels/Windows/DockWindowViewModel.cs b/AgroBase/OperationControl/ViewModels/Windows/DockWindowViewModel.cs index 8cad71d68..57c4974b9 100644 --- a/AgroBase/OperationControl/ViewModels/Windows/DockWindowViewModel.cs +++ b/AgroBase/OperationControl/ViewModels/Windows/DockWindowViewModel.cs @@ -56,8 +56,8 @@ namespace OperationControl.ViewModels _viewOperacaoRight._vm.PropertyChanged += OperacaoRightVm_PropertyChanged; _viewOperacaoRight._vm.RoverSelecionadoChanged += OnRoverSelecionadoChanged; _viewOperacaoRight._vm.SecaoSelecionadaChanged += OnSecaoSelecionadaChanged; - _viewOperacaoRight._vm.LerParametrosSolicitado += OnLerParametrosSolicitado; - _viewOperacaoRight._vm.SalvarParametrosSolicitado += OnSalvarParametrosSolicitado; + _viewOperacaoRight.areaParametrizacao._vm.LerParametrosSolicitado += OnLerParametrosSolicitado; + _viewOperacaoRight.areaParametrizacao._vm.SalvarParametrosSolicitado += OnSalvarParametrosSolicitado; _viewOperacaoBottom = new OperacaoBottomView(); _viewOperacaoBottom._vm.SolicitarAbrirDiagnostico += AbrirDiagnosticoPeloAlerta; @@ -198,7 +198,7 @@ namespace OperationControl.ViewModels { return CurrentStep switch { - DockStep.ParametrizacaoRover => (_viewOperacaoRight?.DataContext as OperacaoRightViewModel)?.IsCollapsed == true + DockStep.ParametrizacaoRover => _viewOperacaoRight?._vm?.IsCollapsed == true ? new GridLength(44) : new GridLength(320), @@ -616,7 +616,7 @@ namespace OperationControl.ViewModels public void AtualizarParametrosRover(OperacaoParametrosModel? rover) { - _viewOperacaoRight?._vm?.AtualizarParametros(rover); + _viewOperacaoRight?.areaParametrizacao?._vm?.AtualizarParametros(rover); AtualizarDadosMapa(rover); } @@ -800,11 +800,12 @@ namespace OperationControl.ViewModels obj.Bateria?.PercentualBateria ?? 0, obj.Atuador?.PercentualReservatorio ?? 0, $"{c}%", - $"{obj.Gnss?.QualidadeFix ?? TiposCorrecaoGPS.SemCorrecao} {obj.Gnss?.PrecisaoCm:F2} cm" + $"{obj.Gnss?.QualidadeFix ?? TiposCorrecaoGPS.SemCorrecao} {obj.Gnss?.PrecisaoCm:F2} cm", + obj.Operacao?.Iniciada ?? false ); // DIREITA (RESUMO) - _viewOperacaoRight?._vm?.AtualizarResumo(r => + _viewOperacaoRight?.areaResumo?._vm?.AtualizarResumo(r => { r.Operacao = (obj.Operacao?.Liberada ?? false) ? "🔓 Liberada" : "🔒 Bloqueada"; r.Modo = obj.Operacao == null ? "-" : obj.Operacao.Modo.ToString(); @@ -934,7 +935,7 @@ namespace OperationControl.ViewModels } else { - VariaveisControleOperacao.SelectedRoverId = rover.NumeroSerie.ToString(); + VariaveisControleOperacao.SelectedRoverId = (rover.NumeroSerie ?? "").ToString(); _viewOperacaoCenter?.Mapa?.markers?.SetMarkerFocused(VariaveisControleOperacao.SelectedRoverId, true); AtualizarDadosTela(VariaveisControleOperacao.RoverEmFoco); @@ -952,6 +953,8 @@ namespace OperationControl.ViewModels } private void OnSecaoSelecionadaChanged(SecaoRightBar secao) { + if (secao == SecaoRightBar.Parametrizacao) + _viewOperacaoRight?.areaParametrizacao?._vm?.AtualizarParametros(VariaveisControleOperacao.RoverEmFoco); _viewOperacaoCenter?._vm?.DefinirSecao(secao); AtualizarDadosMapa(VariaveisControleOperacao.RoverEmFoco); } diff --git a/AgroBase/OperationControl/Views/Operacao/Monitoramento/ControleManualView.xaml b/AgroBase/OperationControl/Views/Operacao/Monitoramento/ControleManualView.xaml new file mode 100644 index 000000000..2eadfecdb --- /dev/null +++ b/AgroBase/OperationControl/Views/Operacao/Monitoramento/ControleManualView.xaml @@ -0,0 +1,330 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AgroBase/OperationControl/Views/Operacao/Monitoramento/ControleManualView.xaml.cs b/AgroBase/OperationControl/Views/Operacao/Monitoramento/ControleManualView.xaml.cs new file mode 100644 index 000000000..df007f2a6 --- /dev/null +++ b/AgroBase/OperationControl/Views/Operacao/Monitoramento/ControleManualView.xaml.cs @@ -0,0 +1,39 @@ +using OperationControl.ViewModels.Views.Operacao.Monitoramento; + +namespace OperationControl.Views.Operacao.Monitoramento +{ + /// + /// Interação lógica para ControleManualView.xam + /// + public partial class ControleManualView : System.Windows.Controls.UserControl + { + public ControleManualViewModel _vm; + + public ControleManualView() + { + InitializeComponent(); + + _vm = new ControleManualViewModel(); + DataContext = _vm; + + Loaded += (_, __) => Focus(); + MouseDown += (_, __) => Focus(); + } + + protected override void OnPreviewKeyDown(System.Windows.Input.KeyEventArgs e) + { + base.OnPreviewKeyDown(e); + + _vm.HandleKeyDown(e.Key); + e.Handled = true; + } + + protected override void OnPreviewKeyUp(System.Windows.Input.KeyEventArgs e) + { + base.OnPreviewKeyUp(e); + + _vm.HandleKeyUp(e.Key); + e.Handled = true; + } + } +} diff --git a/AgroBase/OperationControl/Views/Operacao/DiagnosticoView.xaml b/AgroBase/OperationControl/Views/Operacao/Monitoramento/DiagnosticoView.xaml similarity index 99% rename from AgroBase/OperationControl/Views/Operacao/DiagnosticoView.xaml rename to AgroBase/OperationControl/Views/Operacao/Monitoramento/DiagnosticoView.xaml index 8a3be1c80..c335b14be 100644 --- a/AgroBase/OperationControl/Views/Operacao/DiagnosticoView.xaml +++ b/AgroBase/OperationControl/Views/Operacao/Monitoramento/DiagnosticoView.xaml @@ -1,4 +1,4 @@ - /// Interaction logic for DiagnosticoView.xaml diff --git a/AgroBase/OperationControl/Views/Operacao/MonitoramentoView.xaml b/AgroBase/OperationControl/Views/Operacao/Monitoramento/MonitoramentoView.xaml similarity index 99% rename from AgroBase/OperationControl/Views/Operacao/MonitoramentoView.xaml rename to AgroBase/OperationControl/Views/Operacao/Monitoramento/MonitoramentoView.xaml index d25110826..0fd2bf1f0 100644 --- a/AgroBase/OperationControl/Views/Operacao/MonitoramentoView.xaml +++ b/AgroBase/OperationControl/Views/Operacao/Monitoramento/MonitoramentoView.xaml @@ -1,4 +1,4 @@ - /// Interaction logic for MonitoramentoView.xaml diff --git a/AgroBase/OperationControl/Views/Operacao/Monitoramento/ParametrizacaoView.xaml b/AgroBase/OperationControl/Views/Operacao/Monitoramento/ParametrizacaoView.xaml new file mode 100644 index 000000000..6780cd970 --- /dev/null +++ b/AgroBase/OperationControl/Views/Operacao/Monitoramento/ParametrizacaoView.xaml @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +