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

350 lines
13 KiB
C#

using OperationControl.Helpers;
using OperationControl.Models;
using System.ComponentModel;
using System.Windows;
using System.Windows.Input;
using static AgroBase.Models.Enums;
namespace OperationControl.ViewModels.Views.Operacao
{
public class OperacaoLeftViewModel : INotifyPropertyChanged
{
public ICommand AlternarOperacaoCommand { get; }
public ICommand ParadaEmergenciaCommand { get; }
public ICommand CancelarOperacaoCommand { get; }
private bool _operacaoEmExecucao;
public bool OperacaoEmExecucao
{
get => _operacaoEmExecucao;
set
{
if (_operacaoEmExecucao != value)
{
_operacaoEmExecucao = value;
OnPropertyChanged(nameof(OperacaoEmExecucao));
OnPropertyChanged(nameof(TextoBotaoOperacao));
OnPropertyChanged(nameof(CorBotaoOperacao));
OnPropertyChanged(nameof(BordaBotaoOperacao));
}
}
}
public string TextoBotaoOperacao => OperacaoEmExecucao ? "⏸ Pausar Operação" : "▶ Iniciar Operação";
public System.Windows.Media.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));
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));
private bool _roverSelecionado;
public bool RoverSelecionado
{
get => _roverSelecionado;
set
{
if (_roverSelecionado != value)
{
_roverSelecionado = value;
OnPropertyChanged(nameof(RoverSelecionado));
OnPropertyChanged(nameof(NomeRover));
OnPropertyChanged(nameof(OpacityPainel));
}
}
}
private string _nomeRover = "Nenhum rover selecionado";
public string NomeRover
{
get => RoverSelecionado ? _nomeRover : "Nenhum rover selecionado";
set
{
if (_nomeRover != value)
{
_nomeRover = value;
OnPropertyChanged(nameof(NomeRover));
}
}
}
public double OpacityPainel => RoverSelecionado ? 1.0 : 0.45;
private string _velocidade = "--";
public string Velocidade
{
get => VelocidadeValor(_velocidade);
set
{
if (_velocidade != value)
{
_velocidade = value;
OnPropertyChanged(nameof(Velocidade));
}
}
}
private string _anguloDirecional = "--";
public string AnguloDirecional
{
get => RoverSelecionado ? $"{_anguloDirecional}°" : "--";
set
{
if (_anguloDirecional != value)
{
_anguloDirecional = value;
OnPropertyChanged(nameof(AnguloDirecional));
}
}
}
private TipoMovimentoDirecional _tipoMovimento = TipoMovimentoDirecional.Diagnostico;
public TipoMovimentoDirecional TipoMovimento
{
get => _tipoMovimento;
set
{
if (_tipoMovimento != value)
{
_tipoMovimento = value;
OnPropertyChanged(nameof(TipoMovimento));
}
}
}
private string _temperatura = "--";
public string Temperatura
{
get => TemperaturaValor(_temperatura);
set
{
if (_temperatura != value)
{
_temperatura = value;
OnPropertyChanged(nameof(Temperatura));
}
}
}
private string _bateria = "--";
public string Bateria
{
get => PercentualOuTracos(_bateria);
set
{
if (_bateria != value)
{
_bateria = value;
OnPropertyChanged(nameof(Bateria));
}
}
}
private string _reservatorio = "--";
public string Reservatorio
{
get => PercentualOuTracos(_reservatorio);
set
{
if (_reservatorio != value)
{
_reservatorio = value;
OnPropertyChanged(nameof(Reservatorio));
}
}
}
private string _saudeRede = "--";
public string SaudeRede
{
get => ValorOuTracos(_saudeRede);
set
{
if (_saudeRede != value)
{
_saudeRede = value;
OnPropertyChanged(nameof(SaudeRede));
}
}
}
private string _saudeGnss = "--";
public string SaudeGnss
{
get => ValorOuTracos(_saudeGnss);
set
{
if (_saudeGnss != value)
{
_saudeGnss = value;
OnPropertyChanged(nameof(SaudeGnss));
}
}
}
public Brush CorTemperatura =>
!RoverSelecionado ? Brushes.Gray :
_temperaturaNumerica >= 55 ? Brushes.OrangeRed :
_temperaturaNumerica >= 45 ? Brushes.Gold :
Brushes.LightGreen;
public Brush CorBateria =>
!RoverSelecionado ? Brushes.Gray :
_bateriaNumerica <= 20 ? Brushes.OrangeRed :
_bateriaNumerica <= 40 ? Brushes.Gold :
Brushes.LightGreen;
public Brush CorReservatorio =>
!RoverSelecionado ? Brushes.Gray :
_reservatorioNumerico <= 15 ? Brushes.OrangeRed :
_reservatorioNumerico <= 35 ? Brushes.Gold :
Brushes.LightGreen;
public Brush CorRede =>
!RoverSelecionado ? Brushes.Gray :
CorPorTexto(_saudeRede);
public Brush CorGnss =>
!RoverSelecionado ? Brushes.Gray :
CorPorTexto(_saudeGnss);
private double _temperaturaNumerica;
private double _bateriaNumerica;
private double _reservatorioNumerico;
public OperacaoLeftViewModel()
{
AlternarOperacaoCommand = new RelayCommand(_ => AlternarOperacao());
ParadaEmergenciaCommand = new RelayCommand(_ => ExecutarParadaEmergencia());
CancelarOperacaoCommand = new RelayCommand(_ => CancelarOperacao());
DefinirSemRover();
}
public void DefinirSemRover()
{
RoverSelecionado = false;
NomeRover = "Nenhum rover selecionado";
_temperaturaNumerica = 0;
_bateriaNumerica = 0;
_reservatorioNumerico = 0;
Velocidade = "--";
AnguloDirecional = "--";
TipoMovimento = TipoMovimentoDirecional.Diagnostico;
Temperatura = "--";
Bateria = "--";
Reservatorio = "--";
SaudeRede = "--";
SaudeGnss = "--";
OnPropertyChanged(nameof(CorTemperatura));
OnPropertyChanged(nameof(CorBateria));
OnPropertyChanged(nameof(CorReservatorio));
OnPropertyChanged(nameof(CorRede));
OnPropertyChanged(nameof(CorGnss));
}
public void AtualizarRover(string nomeRover, double velocidadeKmh, double anguloDirecionalGraus, TipoMovimentoDirecional tipoMovimento, double temperaturaC, double bateriaPct, double reservatorioPct, string saudeRede, string saudeGnss)
{
RoverSelecionado = true;
NomeRover = nomeRover;
_temperaturaNumerica = temperaturaC;
_bateriaNumerica = bateriaPct;
_reservatorioNumerico = reservatorioPct;
Velocidade = velocidadeKmh.ToString("0.0");
AnguloDirecional = anguloDirecionalGraus.ToString("0.0");
TipoMovimento = tipoMovimento;
Temperatura = temperaturaC.ToString("0.0");
Bateria = bateriaPct.ToString("0");
Reservatorio = reservatorioPct.ToString("0");
SaudeRede = saudeRede;
SaudeGnss = saudeGnss;
OnPropertyChanged(nameof(CorTemperatura));
OnPropertyChanged(nameof(CorBateria));
OnPropertyChanged(nameof(CorReservatorio));
OnPropertyChanged(nameof(CorRede));
OnPropertyChanged(nameof(CorGnss));
}
private void AlternarOperacao()
{
if (VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Operacao?.Iniciada ?? false)
{
bool PauseActivated = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Operacao?.Pausa ?? false;
PauseActivated = !PauseActivated;
VariaveisControleOperacao.EnviarComandoParada(pausa: PauseActivated);
}
else
{
if (!((VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Operacao?.Modo ?? AgroBase.Models.Enums.ModoOperacao.NaoDefinido) == AgroBase.Models.Enums.ModoOperacao.Manual) && !(VariaveisControleOperacao.RoverEmFoco?.RuasPercorrer?.Any() ?? false))
{
System.Windows.MessageBox.Show("Para iniciar a operação automática, é necessário carregar um mapa e selecionar as ruas onde o equipamento irá operar!", "Parametrização", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
if (System.Windows.MessageBox.Show("Deseja iniciar a operação com os parâmetros atuais?", "Iniciar Operação", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
{
bool simulador = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Gnss?.Iniciado != true;
VariaveisControleOperacao.EnviarComandoIniciarOperacao(true, simulador);
}
}
OperacaoEmExecucao = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Operacao?.Iniciada ?? false;
}
private void ExecutarParadaEmergencia()
{
bool EmergencyActivated = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Operacao?.Emergencia ?? false;
EmergencyActivated = !EmergencyActivated;
//VariaveisControleOperacao.EnviarComandoParada(emergencia: EmergencyActivated);
_ = VariaveisControleOperacao.EnviarComandoParadaUDP(emergencia: EmergencyActivated);
}
private void CancelarOperacao()
{
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;
}
}
private string ValorOuTracos(string valor) => RoverSelecionado ? valor : "--";
private string VelocidadeValor(string valor) => RoverSelecionado ? $"{valor} km/h" : "--";
private string TemperaturaValor(string valor) => RoverSelecionado ? $"{valor} °C" : "--";
private string PercentualOuTracos(string valor) => RoverSelecionado ? $"{valor}%" : "--";
private Brush CorPorTexto(string valor)
{
var txt = (valor ?? "").Trim().ToLower();
if (txt.Contains("excelente") || txt.Contains("ótima") || txt.Contains("otima") || txt.Contains("boa") || txt.Contains("rtk fixed"))
return Brushes.LightGreen;
if (txt.Contains("média") || txt.Contains("media") || txt.Contains("regular") || txt.Contains("float") || txt.Contains("3d"))
return Brushes.Gold;
if (txt.Contains("ruim") || txt.Contains("sem") || txt.Contains("offline") || txt.Contains("falha"))
return Brushes.OrangeRed;
return Brushes.LightGray;
}
public event PropertyChangedEventHandler? PropertyChanged;
private void OnPropertyChanged(string nome)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nome));
}
}
}