350 lines
13 KiB
C#
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));
|
|
}
|
|
}
|
|
}
|