345 lines
13 KiB
C#
345 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;
|
|
|
|
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 (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
|
|
}
|
|
|
|
}
|