2026-03-10 19:56:55 +00:00
using OperationControl.Helpers ;
using OperationControl.Models ;
using System.ComponentModel ;
using System.Windows ;
using System.Windows.Input ;
using static AgroBase . Models . Enums ;
2026-03-11 12:47:44 +00:00
using Brush = System . Windows . Media . Brush ;
using Brushes = System . Windows . Media . Brushes ;
using SolidColorBrush = System . Windows . Media . SolidColorBrush ;
using Color = System . Windows . Media . Color ;
2026-03-19 10:55:56 +00:00
using AgroBase.Models.Operacoes ;
2026-03-10 19:56:55 +00:00
namespace OperationControl.ViewModels.Views.Operacao
{
public class OperacaoLeftViewModel : INotifyPropertyChanged
{
public ICommand AlternarOperacaoCommand { get ; }
public ICommand ParadaEmergenciaCommand { get ; }
public ICommand CancelarOperacaoCommand { get ; }
2026-03-24 20:01:33 +00:00
public ICommand ReconfigurarGnssCommand { get ; }
2026-03-18 12:48:33 +00:00
private bool _operacaoPausada = > ( VariaveisControleOperacao . RoverEmFoco ? . DadosLeitura ? . Operacao ? . Pausa ? ? false ) ;
2026-03-10 19:56:55 +00:00
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 ) ) ;
}
}
}
2026-03-18 12:48:33 +00:00
public string TextoBotaoOperacao = > _operacaoPausada ? "▶ Retomar Operação" : OperacaoEmExecucao ? "⏸ Pausar Operação" : "▶ Iniciar Operação" ;
2026-03-10 19:56:55 +00:00
2026-03-11 12:47:44 +00:00
public Brush CorBotaoOperacao = >
2026-03-18 12:48:33 +00:00
OperacaoEmExecucao & & ! _operacaoPausada
2026-03-11 12:47:44 +00:00
? new SolidColorBrush ( Color . FromRgb ( 120 , 88 , 20 ) )
: new SolidColorBrush ( Color . FromRgb ( 30 , 90 , 58 ) ) ;
2026-03-10 19:56:55 +00:00
2026-03-24 20:01:33 +00:00
public Brush BordaBotaoOperacao = >
2026-03-18 12:48:33 +00:00
OperacaoEmExecucao & & ! _operacaoPausada
2026-03-24 20:01:33 +00:00
? new SolidColorBrush ( Color . FromRgb ( 170 , 130 , 40 ) )
: new SolidColorBrush ( Color . FromRgb ( 74 , 138 , 91 ) ) ;
2026-03-10 19:56:55 +00:00
private bool _roverSelecionado ;
public bool RoverSelecionado
{
get = > _roverSelecionado ;
set
{
if ( _roverSelecionado ! = value )
{
_roverSelecionado = value ;
OnPropertyChanged ( nameof ( RoverSelecionado ) ) ;
OnPropertyChanged ( nameof ( NomeRover ) ) ;
OnPropertyChanged ( nameof ( OpacityPainel ) ) ;
2026-03-24 20:01:33 +00:00
OnPropertyChanged ( nameof ( RoverNaoSelecionado ) ) ;
OnPropertyChanged ( nameof ( VisibilidadeAcoesRover ) ) ;
OnPropertyChanged ( nameof ( VisibilidadeConfiguracaoGnss ) ) ;
2026-03-10 19:56:55 +00:00
}
}
}
2026-03-24 20:01:33 +00:00
public bool RoverNaoSelecionado = > ! RoverSelecionado ;
public Visibility VisibilidadeAcoesRover = > RoverSelecionado ? Visibility . Visible : Visibility . Collapsed ;
public Visibility VisibilidadeConfiguracaoGnss = > ! RoverSelecionado ? Visibility . Visible : Visibility . Collapsed ;
2026-03-10 19:56:55 +00:00
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 ) ) ;
}
}
}
2026-03-19 10:55:56 +00:00
private string _distanciaBase = "--" ;
public string DistanciaBase
{
get = > DistanciaOuTracos ( _distanciaBase ) ;
set
{
if ( _distanciaBase ! = value )
{
_distanciaBase = value ;
OnPropertyChanged ( nameof ( DistanciaBase ) ) ;
}
}
}
2026-03-10 19:56:55 +00:00
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 ) ;
2026-03-19 10:55:56 +00:00
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 ;
2026-03-10 19:56:55 +00:00
private double _temperaturaNumerica ;
private double _bateriaNumerica ;
private double _reservatorioNumerico ;
2026-03-19 10:55:56 +00:00
private double _distanciaBaseNumerico ;
2026-03-10 19:56:55 +00:00
public OperacaoLeftViewModel ( )
{
AlternarOperacaoCommand = new RelayCommand ( _ = > AlternarOperacao ( ) ) ;
ParadaEmergenciaCommand = new RelayCommand ( _ = > ExecutarParadaEmergencia ( ) ) ;
CancelarOperacaoCommand = new RelayCommand ( _ = > CancelarOperacao ( ) ) ;
2026-03-24 20:01:33 +00:00
ReconfigurarGnssCommand = new RelayCommand ( _ = > ReconfigurarGnss ( ) ) ;
2026-03-10 19:56:55 +00:00
DefinirSemRover ( ) ;
}
public void DefinirSemRover ( )
{
RoverSelecionado = false ;
NomeRover = "Nenhum rover selecionado" ;
_temperaturaNumerica = 0 ;
_bateriaNumerica = 0 ;
_reservatorioNumerico = 0 ;
2026-03-19 10:55:56 +00:00
_distanciaBaseNumerico = 0 ;
2026-03-10 19:56:55 +00:00
Velocidade = "--" ;
AnguloDirecional = "--" ;
TipoMovimento = TipoMovimentoDirecional . Diagnostico ;
Temperatura = "--" ;
Bateria = "--" ;
Reservatorio = "--" ;
SaudeRede = "--" ;
SaudeGnss = "--" ;
2026-03-19 10:55:56 +00:00
DistanciaBase = "--" ;
2026-03-10 19:56:55 +00:00
OnPropertyChanged ( nameof ( CorTemperatura ) ) ;
OnPropertyChanged ( nameof ( CorBateria ) ) ;
OnPropertyChanged ( nameof ( CorReservatorio ) ) ;
OnPropertyChanged ( nameof ( CorRede ) ) ;
OnPropertyChanged ( nameof ( CorGnss ) ) ;
2026-03-19 10:55:56 +00:00
OnPropertyChanged ( nameof ( CorDistBase ) ) ;
2026-03-10 19:56:55 +00:00
}
2026-03-19 10:55:56 +00:00
public void AtualizarRover ( string descricao , OperacaoParametrosDadosControleModel ? controle , double temperaturaC , double bateriaPct , double reservatorioPct , string saudeRede , string saudeGnss , double distanciaBase , bool op_iniciada )
2026-03-10 19:56:55 +00:00
{
RoverSelecionado = true ;
2026-03-19 10:55:56 +00:00
NomeRover = descricao ;
2026-03-10 19:56:55 +00:00
_temperaturaNumerica = temperaturaC ;
_bateriaNumerica = bateriaPct ;
_reservatorioNumerico = reservatorioPct ;
2026-03-19 10:55:56 +00:00
_distanciaBaseNumerico = distanciaBase ;
2026-03-10 19:56:55 +00:00
2026-03-19 10:55:56 +00:00
Velocidade = $"{controle?.PercentualVelocidadeSPKmh ?? 0:F2}" ;
AnguloDirecional = $"{controle?.Angulo ?? 0:F1}" ;
TipoMovimento = controle ? . TipoMovimento ? ? TipoMovimentoDirecional . RodasDianteiras ;
2026-03-10 19:56:55 +00:00
Temperatura = temperaturaC . ToString ( "0.0" ) ;
Bateria = bateriaPct . ToString ( "0" ) ;
Reservatorio = reservatorioPct . ToString ( "0" ) ;
SaudeRede = saudeRede ;
SaudeGnss = saudeGnss ;
2026-03-19 10:55:56 +00:00
DistanciaBase = $"{distanciaBase:F2}" ;
2026-03-10 19:56:55 +00:00
2026-03-17 00:43:15 +00:00
OperacaoEmExecucao = op_iniciada ;
2026-03-10 19:56:55 +00:00
OnPropertyChanged ( nameof ( CorTemperatura ) ) ;
OnPropertyChanged ( nameof ( CorBateria ) ) ;
OnPropertyChanged ( nameof ( CorReservatorio ) ) ;
OnPropertyChanged ( nameof ( CorRede ) ) ;
OnPropertyChanged ( nameof ( CorGnss ) ) ;
2026-03-19 10:55:56 +00:00
OnPropertyChanged ( nameof ( CorDistBase ) ) ;
2026-03-17 00:43:15 +00:00
OnPropertyChanged ( nameof ( OperacaoEmExecucao ) ) ;
2026-03-18 12:48:33 +00:00
OnPropertyChanged ( nameof ( TextoBotaoOperacao ) ) ;
OnPropertyChanged ( nameof ( CorBotaoOperacao ) ) ;
OnPropertyChanged ( nameof ( BordaBotaoOperacao ) ) ;
2026-03-10 19:56:55 +00:00
}
private void AlternarOperacao ( )
{
2026-03-19 17:09:39 +00:00
var dadosRover = VariaveisControleOperacao . RoverEmFoco ? . DadosLeitura ;
if ( dadosRover ? . Operacao ? . Iniciada ? ? false )
2026-03-10 19:56:55 +00:00
{
2026-03-19 17:09:39 +00:00
bool PauseActivated = dadosRover ? . Operacao ? . Pausa ? ? false ;
2026-03-10 19:56:55 +00:00
PauseActivated = ! PauseActivated ;
VariaveisControleOperacao . EnviarComandoParada ( pausa : PauseActivated ) ;
}
else
{
2026-03-19 17:09:39 +00:00
if ( ( ( dadosRover ? . Operacao ? . Modo ? ? AgroBase . Models . Enums . ModoOperacao . NaoDefinido ) = = AgroBase . Models . Enums . ModoOperacao . MapaGPS ) & & ! ( VariaveisControleOperacao . RoverEmFoco ? . RuasPercorrer ? . Any ( ) ? ? false ) )
2026-03-10 19:56:55 +00:00
{
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 )
{
2026-03-19 11:34:09 +00:00
Task . Run ( async ( ) = >
{
2026-03-20 02:03:07 +00:00
Variaveis . Dock ? . _vm ? . _viewOperacaoCenter ? . Mapa ? . LimparRastrosRover ( VariaveisControleOperacao . RoverEmFoco ? . RoverId ) ;
2026-03-19 17:09:39 +00:00
if ( ( dadosRover ? . Operacao ? . Status ? ? StatusOperacao . NaoIniciado ) = = StatusOperacao . Concluido )
{
VariaveisControleOperacao . EnviarComandoIniciarOperacao ( false , false ) ;
2026-03-24 15:36:48 +00:00
await Task . Delay ( 2000 ) ;
2026-03-19 17:09:39 +00:00
}
2026-03-24 15:36:48 +00:00
bool simulador = AppShell . Mock | | AppShell . AddRover ; // || VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Gnss?.Iniciado != true;
2026-03-19 17:09:39 +00:00
VariaveisControleOperacao . EnviarComandoIniciarOperacao ( true , simulador ) ;
2026-03-19 11:34:09 +00:00
await Task . Delay ( 1000 ) ;
2026-03-19 17:09:39 +00:00
if ( ! ( dadosRover ? . Operacao ? . Liberada ? ? false ) )
2026-03-19 11:34:09 +00:00
{
System . Windows . MessageBox . Show ( $"{VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Operacao?.ImpedimentoErro}" , "Operação iniciada com impedimento!" , MessageBoxButton . OK , MessageBoxImage . Warning ) ;
}
} ) ;
2026-03-10 19:56:55 +00:00
}
}
}
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 ) ;
2026-03-27 01:42:40 +00:00
Models . Variaveis . Dock ? . _vm ? . _viewOperacaoCenter ? . Mapa ? . LimparPontosSelecionados ( ) ;
2026-03-10 19:56:55 +00:00
}
}
2026-03-24 20:01:33 +00:00
private void ReconfigurarGnss ( )
{
Variaveis . Dock . _vm . CurrentStep = DockStep . PreparacaoMapa ;
}
2026-03-10 19:56:55 +00:00
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}%" : "--" ;
2026-03-19 10:55:56 +00:00
private string DistanciaOuTracos ( string valor ) = > RoverSelecionado ? $"{valor} m" : "--" ;
2026-03-10 19:56:55 +00:00
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 ) ) ;
}
}
}