agrobot_base/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoRightViewModel.cs

348 lines
13 KiB
C#

using AgroBase.Models.Operacoes;
using OperationControl.Helpers;
using OperationControl.Models;
using OperationControl.Models.Operacao;
using System.Collections.ObjectModel;
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
{
public class OperacaoRightViewModel : INotifyPropertyChanged
{
private bool _isCollapsed;
private RoverCardModel _roverSelecionado;
public ResumoOperacionalModel Resumo { get; } = new ResumoOperacionalModel();
public OperacaoParametrosModel Parametros { get; } = new OperacaoParametrosModel();
public OperacaoRightViewModel()
{
Rovers = new ObservableCollection<RoverCardModel>();
ToggleCollapseCommand = new RelayCommand(_ => ToggleCollapse());
SelecionarRoverCommand = new RelayCommand(p => SelecionarRover(p as RoverCardModel));
SelecionarSecaoCommand = new RelayCommand(p =>
{
if (p is SecaoRightBar secao)
SelecionarSecao(secao);
else if (p != null && Enum.TryParse<SecaoRightBar>(p.ToString(), out var secaoParseada))
SelecionarSecao(secaoParseada);
});
AcaoBotaoTopoCommand = new RelayCommand(_ => ExecutarAcaoBotaoTopo());
LerParametrosCommand = new RelayCommand(_ => LerParametrosSolicitado?.Invoke());
SalvarParametrosCommand = new RelayCommand(_ => SalvarParametrosSolicitado?.Invoke(Parametros));
}
public event PropertyChangedEventHandler PropertyChanged;
public event Action<SecaoRightBar> SecaoSelecionadaChanged;
public event Action<RoverCardModel> RoverSelecionadoChanged;
public event Action? LerParametrosSolicitado;
public event Action<OperacaoParametrosModel>? SalvarParametrosSolicitado;
public ObservableCollection<RoverCardModel> Rovers { get; }
public ICommand ToggleCollapseCommand { get; }
public ICommand SelecionarRoverCommand { get; }
public ICommand SelecionarSecaoCommand { get; }
public ICommand AcaoBotaoTopoCommand { get; }
public ICommand LerParametrosCommand { get; }
public ICommand SalvarParametrosCommand { get; }
public bool IsCollapsed
{
get => _isCollapsed;
set
{
if (_isCollapsed != value)
{
_isCollapsed = value;
OnPropertyChanged(nameof(IsCollapsed));
}
}
}
public RoverCardModel RoverSelecionado
{
get => _roverSelecionado;
set
{
if (_roverSelecionado != value)
{
_roverSelecionado = value;
OnPropertyChanged(nameof(RoverSelecionado));
OnPropertyChanged(nameof(SemRoverSelecionado));
OnPropertyChanged(nameof(ComRoverSelecionado));
CommandManager.InvalidateRequerySuggested();
}
}
}
public bool SemRoverSelecionado => RoverSelecionado == null;
public bool ComRoverSelecionado => RoverSelecionado != null;
public string QuantidadeRoversTexto => $"{Rovers.Count} rover(s) encontrado(s)";
private SecaoRightBar _secaoAtual = SecaoRightBar.Menu;
public SecaoRightBar SecaoAtual
{
get => _secaoAtual;
set
{
if (_secaoAtual != value)
{
_secaoAtual = value;
OnPropertyChanged(nameof(SecaoAtual));
OnPropertyChanged(nameof(EmMenu));
OnPropertyChanged(nameof(EmResumo));
OnPropertyChanged(nameof(EmParametrizacao));
OnPropertyChanged(nameof(EmControle));
OnPropertyChanged(nameof(BotaoTopoEhVoltar));
OnPropertyChanged(nameof(TextoBotaoTopo));
}
}
}
public bool EmMenu => SecaoAtual == SecaoRightBar.Menu || SecaoAtual == SecaoRightBar.Diagnostico;
public bool EmResumo => SecaoAtual == SecaoRightBar.Resumo;
public bool EmParametrizacao => SecaoAtual == SecaoRightBar.Parametrizacao;
public bool EmControle => SecaoAtual == SecaoRightBar.Controle;
public bool BotaoTopoEhVoltar => EmResumo || EmControle || EmParametrizacao;
public string TextoBotaoTopo => BotaoTopoEhVoltar ? "◀ Voltar" : "Trocar Rover";
private void ExecutarAcaoBotaoTopo()
{
if (BotaoTopoEhVoltar)
{
SelecionarSecao(SecaoRightBar.Menu);
}
else
{
SelecionarRover(null);
}
}
public void ToggleCollapse()
{
IsCollapsed = !IsCollapsed;
}
public void SelecionarRover(RoverCardModel rover)
{
RoverSelecionado = rover;
if (RoverSelecionado != null)
{
VariaveisControleOperacao.RequisitarParametrosOperacao();
SelecionarSecao(SecaoRightBar.Menu);
}
else
{
SelecionarSecao(SecaoRightBar.SemRoverSelecionado);
}
RoverSelecionadoChanged?.Invoke(rover);
}
public void SelecionarSecao(SecaoRightBar secao)
{
switch (secao)
{
case SecaoRightBar.Parametrizacao:
AtualizarParametros(VariaveisControleOperacao.RoverEmFoco);
break;
}
SecaoAtual = secao;
SecaoSelecionadaChanged?.Invoke(secao);
}
public void DestacarRoverNoMapa(string? roverId)
{
foreach (var rover in Rovers)
rover.IsDestacadoNoMapa = !string.IsNullOrEmpty(roverId) && rover.NumeroSerie == roverId;
}
public void AtualizarListaRovers(params RoverCardModel[] rovers)
{
var origem = (rovers ?? Array.Empty<RoverCardModel>()).ToList();
// Remove os que não existem mais
for (int i = Rovers.Count - 1; i >= 0; i--)
{
var atual = Rovers[i];
bool aindaExiste = origem.Any(x => x.NumeroSerie == atual.NumeroSerie);
if (!aindaExiste)
Rovers.RemoveAt(i);
}
// Adiciona ou atualiza os existentes
foreach (var roverNovo in origem)
{
var roverExistente = Rovers.FirstOrDefault(x => x.NumeroSerie == roverNovo.NumeroSerie);
if (roverExistente == null)
{
Rovers.Add(roverNovo);
}
else
{
roverExistente.EquipamentoId = roverNovo.EquipamentoId;
roverExistente.Status = roverNovo.Status;
// se quiser refletir mudança de texto também:
// roverExistente.NumeroSerie = roverNovo.NumeroSerie; // normalmente não precisa se NS é a chave
// dispara props derivadas se necessário
// no caso de EquipamentoId, como é auto-property hoje, melhor virar property notificável se isso puder mudar
}
}
OnPropertyChanged(nameof(QuantidadeRoversTexto));
OnPropertyChanged(nameof(SemRoverSelecionado));
OnPropertyChanged(nameof(ComRoverSelecionado));
}
public void AtualizarResumo(Action<ResumoOperacionalModel> 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.Modo = origem.Modo;
Parametros.Descricao = origem.Descricao;
Parametros.QtdBicos = origem.QtdBicos;
Parametros.QtdCamerasSolo = origem.QtdCamerasSolo;
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;
controle_p.MovimentoAutomatico = controle_o.MovimentoAutomatico;
controle_p.DirecionalAutomatico = controle_o.DirecionalAutomatico;
controle_p.PulverizadorAutomatico = controle_o.PulverizadorAutomatico;
controle_p.SonarAtivado = controle_o.SonarAtivado;
controle_p.OakParadaPorObstaculo = controle_o.OakParadaPorObstaculo;
controle_p.ImuParadaPorInclinacao = controle_o.ImuParadaPorInclinacao;
controle_p.FrenagemAutomaticaAoParar = controle_o.FrenagemAutomaticaAoParar;
controle_p.RegistrarDadosPosProcessamento = controle_o.RegistrarDadosPosProcessamento;
controle_p.MovVelocidadeSErvasPercent = controle_o.MovVelocidadeSErvasPercent;
controle_p.MovVelocidadeCErvasPercent = controle_o.MovVelocidadeCErvasPercent;
controle_p.DirAnguloMaximo = controle_o.DirAnguloMaximo;
controle_p.DirVelocidadeMovimento = controle_o.DirVelocidadeMovimento;
controle_p.DirTipoMovimento = controle_o.DirTipoMovimento;
controle_p.AtuPressaoLinha = controle_o.AtuPressaoLinha;
controle_p.AtuDuracaoAtuacao = controle_o.AtuDuracaoAtuacao;
controle_p.AtuPercentualInicioPulverizacao = controle_o.AtuPercentualInicioPulverizacao;
controle_p.AtuAlturaAreaPulverizacao = controle_o.AtuAlturaAreaPulverizacao;
controle_p.AtuPercentualErvasBicoOn = controle_o.AtuPercentualErvasBicoOn;
controle_p.AtuPercentualErvasBicoOff = controle_o.AtuPercentualErvasBicoOff;
controle_p.MpcMatrizCusto = controle_o.MpcMatrizCusto;
controle_p.MpcHorizonte = controle_o.MpcHorizonte;
OnPropertyChanged(nameof(Parametros));
}
private void OnPropertyChanged(string nome)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nome));
}
}
public class RoverCardModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler? PropertyChanged;
public string EquipamentoId { get; set; }
public string NumeroSerie { get; set; }
private StatusModulo _status;
public StatusModulo Status
{
get => _status;
set
{
if (_status != value)
{
_status = value;
OnPropertyChanged(nameof(Status));
OnPropertyChanged(nameof(StatusBrush));
OnPropertyChanged(nameof(StatusTexto));
}
}
}
private bool _isDestacadoNoMapa;
public bool IsDestacadoNoMapa
{
get => _isDestacadoNoMapa;
set
{
if (_isDestacadoNoMapa != value)
{
_isDestacadoNoMapa = value;
OnPropertyChanged(nameof(IsDestacadoNoMapa));
OnPropertyChanged(nameof(BordaCardBrush));
OnPropertyChanged(nameof(BordaCardThickness));
OnPropertyChanged(nameof(CardBackground));
}
}
}
public Brush StatusBrush =>
Status == StatusModulo.Operante ? Brushes.Green :
Status == StatusModulo.Desconectado ? Brushes.Gray :
Status == StatusModulo.Falha ? Brushes.Red :
Status == StatusModulo.Alerta ? Brushes.Yellow :
Status == StatusModulo.Conectado ? Brushes.Blue :
Brushes.Black;
public System.Windows.Media.Brush CardBackground => IsDestacadoNoMapa ? new System.Windows.Media.SolidColorBrush(System.Windows.Media.Color.FromRgb(58, 42, 18)) : new System.Windows.Media.SolidColorBrush(System.Windows.Media.Color.FromRgb(38, 38, 38));
public Brush BordaCardBrush => IsDestacadoNoMapa ? Brushes.Orange : StatusBrush;
public Thickness BordaCardThickness => IsDestacadoNoMapa ? new Thickness(3) : new Thickness(2);
public string EquipamentoTexto => $"Equipamento: {EquipamentoId}";
public string NumeroSerieTexto => $"NS: {NumeroSerie}";
public string StatusTexto => $"Status: {Status}";
private void OnPropertyChanged(string nome)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nome));
}
}
public enum SecaoRightBar
{
SemRoverSelecionado = 0,
Menu = 1,
Resumo = 2,
Diagnostico = 3,
Parametrizacao = 4,
Controle = 5
}
}