421 lines
16 KiB
C#
421 lines
16 KiB
C#
using OperationControl.Helpers;
|
|
using OperationControl.Models;
|
|
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;
|
|
using SolidColorBrush = System.Windows.Media.SolidColorBrush;
|
|
using Color = System.Windows.Media.Color;
|
|
using AgroBase.Models.Operacoes;
|
|
|
|
namespace OperationControl.ViewModels.Views.Operacao
|
|
{
|
|
public class OperacaoLeftViewModel : INotifyPropertyChanged
|
|
{
|
|
public ICommand AlternarOperacaoCommand { get; }
|
|
public ICommand ParadaEmergenciaCommand { get; }
|
|
public ICommand CancelarOperacaoCommand { get; }
|
|
public ICommand ReconfigurarGnssCommand { get; }
|
|
private bool _operacaoPausada => (VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Operacao?.Pausa ?? false);
|
|
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 => _operacaoPausada ? "▶ Retomar Operação" : OperacaoEmExecucao ? "⏸ Pausar Operação" : "▶ Iniciar Operação";
|
|
|
|
public Brush CorBotaoOperacao =>
|
|
OperacaoEmExecucao && !_operacaoPausada
|
|
? new SolidColorBrush(Color.FromRgb(120, 88, 20))
|
|
: new SolidColorBrush(Color.FromRgb(30, 90, 58));
|
|
|
|
public Brush BordaBotaoOperacao =>
|
|
OperacaoEmExecucao && !_operacaoPausada
|
|
? new SolidColorBrush(Color.FromRgb(170, 130, 40))
|
|
: new SolidColorBrush(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));
|
|
OnPropertyChanged(nameof(RoverNaoSelecionado));
|
|
OnPropertyChanged(nameof(VisibilidadeAcoesRover));
|
|
OnPropertyChanged(nameof(VisibilidadeConfiguracaoGnss));
|
|
}
|
|
}
|
|
}
|
|
|
|
public bool RoverNaoSelecionado => !RoverSelecionado;
|
|
|
|
public Visibility VisibilidadeAcoesRover => RoverSelecionado ? Visibility.Visible : Visibility.Collapsed;
|
|
|
|
public Visibility VisibilidadeConfiguracaoGnss => !RoverSelecionado ? Visibility.Visible : Visibility.Collapsed;
|
|
|
|
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));
|
|
}
|
|
}
|
|
}
|
|
|
|
private string _distanciaBase = "--";
|
|
public string DistanciaBase
|
|
{
|
|
get => DistanciaOuTracos(_distanciaBase);
|
|
set
|
|
{
|
|
if (_distanciaBase != value)
|
|
{
|
|
_distanciaBase = value;
|
|
OnPropertyChanged(nameof(DistanciaBase));
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
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);
|
|
|
|
public Brush CorDistBase =>
|
|
!RoverSelecionado ? Brushes.Gray :
|
|
_distanciaBaseNumerico <= 50 ? Brushes.LimeGreen :
|
|
_distanciaBaseNumerico <= 150 ? Brushes.Green :
|
|
_distanciaBaseNumerico <= 400 ? Brushes.YellowGreen :
|
|
_distanciaBaseNumerico <= 800 ? Brushes.Gold :
|
|
_distanciaBaseNumerico <= 1200 ? Brushes.OrangeRed :
|
|
Brushes.DarkRed;
|
|
|
|
private double _temperaturaNumerica;
|
|
private double _bateriaNumerica;
|
|
private double _reservatorioNumerico;
|
|
private double _distanciaBaseNumerico;
|
|
|
|
public OperacaoLeftViewModel()
|
|
{
|
|
AlternarOperacaoCommand = new RelayCommand(_ => AlternarOperacao());
|
|
ParadaEmergenciaCommand = new RelayCommand(_ => ExecutarParadaEmergencia());
|
|
CancelarOperacaoCommand = new RelayCommand(_ => CancelarOperacao());
|
|
ReconfigurarGnssCommand = new RelayCommand(_ => ReconfigurarGnss());
|
|
|
|
DefinirSemRover();
|
|
}
|
|
|
|
public void DefinirSemRover()
|
|
{
|
|
RoverSelecionado = false;
|
|
NomeRover = "Nenhum rover selecionado";
|
|
_temperaturaNumerica = 0;
|
|
_bateriaNumerica = 0;
|
|
_reservatorioNumerico = 0;
|
|
_distanciaBaseNumerico = 0;
|
|
|
|
Velocidade = "--";
|
|
AnguloDirecional = "--";
|
|
TipoMovimento = TipoMovimentoDirecional.Diagnostico;
|
|
Temperatura = "--";
|
|
Bateria = "--";
|
|
Reservatorio = "--";
|
|
SaudeRede = "--";
|
|
SaudeGnss = "--";
|
|
DistanciaBase = "--";
|
|
|
|
OnPropertyChanged(nameof(CorTemperatura));
|
|
OnPropertyChanged(nameof(CorBateria));
|
|
OnPropertyChanged(nameof(CorReservatorio));
|
|
OnPropertyChanged(nameof(CorRede));
|
|
OnPropertyChanged(nameof(CorGnss));
|
|
OnPropertyChanged(nameof(CorDistBase));
|
|
}
|
|
|
|
public void AtualizarRover(string descricao, OperacaoParametrosDadosControleModel? controle, double temperaturaC, double bateriaPct, double reservatorioPct, string saudeRede, string saudeGnss, double distanciaBase, bool op_iniciada)
|
|
{
|
|
RoverSelecionado = true;
|
|
NomeRover = descricao;
|
|
|
|
_temperaturaNumerica = temperaturaC;
|
|
_bateriaNumerica = bateriaPct;
|
|
_reservatorioNumerico = reservatorioPct;
|
|
_distanciaBaseNumerico = distanciaBase;
|
|
|
|
Velocidade = $"{controle?.PercentualVelocidadeSPKmh ?? 0:F2}";
|
|
AnguloDirecional = $"{controle?.Angulo ?? 0:F1}";
|
|
TipoMovimento = controle?.TipoMovimento ?? TipoMovimentoDirecional.RodasDianteiras;
|
|
Temperatura = temperaturaC.ToString("0.0");
|
|
Bateria = bateriaPct.ToString("0");
|
|
Reservatorio = reservatorioPct.ToString("0");
|
|
SaudeRede = saudeRede;
|
|
SaudeGnss = saudeGnss;
|
|
DistanciaBase = $"{distanciaBase:F2}";
|
|
|
|
OperacaoEmExecucao = op_iniciada;
|
|
|
|
OnPropertyChanged(nameof(CorTemperatura));
|
|
OnPropertyChanged(nameof(CorBateria));
|
|
OnPropertyChanged(nameof(CorReservatorio));
|
|
OnPropertyChanged(nameof(CorRede));
|
|
OnPropertyChanged(nameof(CorGnss));
|
|
OnPropertyChanged(nameof(CorDistBase));
|
|
OnPropertyChanged(nameof(OperacaoEmExecucao));
|
|
OnPropertyChanged(nameof(TextoBotaoOperacao));
|
|
OnPropertyChanged(nameof(CorBotaoOperacao));
|
|
OnPropertyChanged(nameof(BordaBotaoOperacao));
|
|
}
|
|
|
|
private void AlternarOperacao()
|
|
{
|
|
var dadosRover = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura;
|
|
if (dadosRover?.Operacao?.Iniciada ?? false)
|
|
{
|
|
bool PauseActivated = dadosRover?.Operacao?.Pausa ?? false;
|
|
PauseActivated = !PauseActivated;
|
|
VariaveisControleOperacao.EnviarComandoParada(pausa: PauseActivated);
|
|
}
|
|
else
|
|
{
|
|
if (((dadosRover?.Operacao?.Modo ?? AgroBase.Models.Enums.ModoOperacao.NaoDefinido) == AgroBase.Models.Enums.ModoOperacao.MapaGPS) && !(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)
|
|
{
|
|
Task.Run(async () =>
|
|
{
|
|
Variaveis.Dock?._vm?._viewOperacaoCenter?.Mapa?.LimparRastrosRover(VariaveisControleOperacao.RoverEmFoco?.RoverId);
|
|
if ((dadosRover?.Operacao?.Status ?? StatusOperacao.NaoIniciado) == StatusOperacao.Concluido)
|
|
{
|
|
VariaveisControleOperacao.EnviarComandoIniciarOperacao(false, false);
|
|
await Task.Delay(2000);
|
|
}
|
|
bool simulador = AppShell.Mock || AppShell.AddRover; // || VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Gnss?.Iniciado != true;
|
|
VariaveisControleOperacao.EnviarComandoIniciarOperacao(true, simulador);
|
|
await Task.Delay(1000);
|
|
if (!(dadosRover?.Operacao?.Liberada ?? false))
|
|
{
|
|
System.Windows.MessageBox.Show($"{VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Operacao?.ImpedimentoErro}", "Operação iniciada com impedimento!", MessageBoxButton.OK, MessageBoxImage.Warning);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|
|
|
|
private void ReconfigurarGnss()
|
|
{
|
|
Variaveis.Dock._vm.CurrentStep = DockStep.PreparacaoMapa;
|
|
}
|
|
|
|
|
|
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 string DistanciaOuTracos(string valor) => RoverSelecionado ? $"{valor} m" : "--";
|
|
|
|
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));
|
|
}
|
|
}
|
|
}
|