809 lines
32 KiB
C#
809 lines
32 KiB
C#
using System.ComponentModel;
|
|
using System.Windows.Input;
|
|
using OperationControl.Views;
|
|
using OperationControl.Helpers;
|
|
using System.Windows;
|
|
using OperationControl.Models;
|
|
using OperationControl.Views.Operacao;
|
|
using AgroBase.Models.Operacoes;
|
|
using Newtonsoft.Json.Linq;
|
|
using OperationControl.ViewModels.Views.Operacao;
|
|
using OperationControl.Controls;
|
|
|
|
namespace OperationControl.ViewModels
|
|
{
|
|
public class DockWindowViewModel : INotifyPropertyChanged
|
|
{
|
|
private readonly ConfigConexaoView _viewConfig;
|
|
|
|
private readonly PreparacaoMapaView _viewPreparacaoMapa;
|
|
public readonly PreparacaoMapaTopView _viewPreparacaoMapaTop;
|
|
private readonly PreparacaoMapaBottomView _viewPreparacaoMapaBottom;
|
|
|
|
private readonly OperacaoTopView _viewOperacaoTop;
|
|
private readonly OperacaoCenterView _viewOperacaoCenter;
|
|
public readonly OperacaoLeftView _viewOperacaoLeft;
|
|
public readonly OperacaoRightView _viewOperacaoRight;
|
|
public readonly OperacaoBottomView _viewOperacaoBottom;
|
|
|
|
public OperacaoBottomViewModel BottomVM => _viewOperacaoBottom?._vm;
|
|
|
|
private DockStep _currentStep;
|
|
|
|
public DockWindowViewModel()
|
|
{
|
|
// Views
|
|
_viewConfig = new ConfigConexaoView();
|
|
_viewConfig._vm.TudoOkChanged += OnTudoOkChanged;
|
|
|
|
_viewPreparacaoMapa = new PreparacaoMapaView();
|
|
|
|
_viewPreparacaoMapaTop = new PreparacaoMapaTopView();
|
|
|
|
_viewPreparacaoMapaBottom = new PreparacaoMapaBottomView();
|
|
_viewPreparacaoMapaBottom._vm.CarregarMapaSolicitado += OnCarregarMapaSolicitado;
|
|
_viewPreparacaoMapaBottom._vm.FixarBaseSolicitado += OnFixarBaseSolicitado;
|
|
|
|
_viewOperacaoTop = new OperacaoTopView();
|
|
|
|
_viewOperacaoCenter = new OperacaoCenterView();
|
|
_viewOperacaoCenter._vm.RoverSelecionadoChanged += OnRoverSelecionadoChanged;
|
|
|
|
_viewOperacaoLeft = new OperacaoLeftView();
|
|
|
|
_viewOperacaoRight = new OperacaoRightView();
|
|
_viewOperacaoRight._vm.PropertyChanged += OperacaoRightVm_PropertyChanged;
|
|
_viewOperacaoRight._vm.RoverSelecionadoChanged += OnRoverSelecionadoChanged;
|
|
_viewOperacaoRight._vm.SecaoSelecionadaChanged += OnSecaoSelecionadaChanged;
|
|
_viewOperacaoRight._vm.LerParametrosSolicitado += OnLerParametrosSolicitado;
|
|
_viewOperacaoRight._vm.SalvarParametrosSolicitado += OnSalvarParametrosSolicitado;
|
|
|
|
_viewOperacaoBottom = new OperacaoBottomView();
|
|
_viewOperacaoBottom._vm.SolicitarAbrirDiagnostico += AbrirDiagnosticoPeloAlerta;
|
|
|
|
// Commands
|
|
BackCommand = new RelayCommand(_ => GoBack(), _ => CanGoBack);
|
|
NextCommand = new RelayCommand(_ => GoNext(), _ => CanGoNext);
|
|
|
|
// Estado inicial
|
|
ConfigConexaoOk = _viewConfig._vm.TudoOk;
|
|
CurrentStep = DockStep.ConfigConexao;
|
|
}
|
|
|
|
private void OnTudoOkChanged(bool ok)
|
|
{
|
|
ConfigConexaoOk = ok;
|
|
|
|
OnPropertyChanged(nameof(CanGoNext));
|
|
CommandManager.InvalidateRequerySuggested();
|
|
}
|
|
|
|
// ====== ETAPA ATUAL ======
|
|
public ModoOperacao ModoOperacaoAtual => _viewConfig._vm.TipoOperacaoSelecionado;
|
|
|
|
public DockStep CurrentStep
|
|
{
|
|
get => _currentStep;
|
|
set
|
|
{
|
|
if (_currentStep != value)
|
|
{
|
|
_currentStep = value;
|
|
OnPropertyChanged(nameof(CurrentStep));
|
|
OnPropertyChanged(nameof(CanGoBack));
|
|
OnPropertyChanged(nameof(CanGoNext));
|
|
OnPropertyChanged(nameof(MostrarPainelEsquerdo));
|
|
OnPropertyChanged(nameof(MostrarBotaoVoltarEsquerda));
|
|
OnPropertyChanged(nameof(RightPanelWidth));
|
|
OnPropertyChanged(nameof(LeftPanelWidth));
|
|
|
|
AtualizarConteudo();
|
|
CommandManager.InvalidateRequerySuggested();
|
|
}
|
|
}
|
|
}
|
|
|
|
// ====== ESTADO ======
|
|
private bool _configConexaoOk;
|
|
public bool ConfigConexaoOk
|
|
{
|
|
get => _configConexaoOk;
|
|
set
|
|
{
|
|
if (_configConexaoOk != value)
|
|
{
|
|
_configConexaoOk = value;
|
|
OnPropertyChanged(nameof(ConfigConexaoOk));
|
|
OnPropertyChanged(nameof(CanGoNext));
|
|
CommandManager.InvalidateRequerySuggested();
|
|
}
|
|
}
|
|
}
|
|
|
|
private bool _mapaCarregado;
|
|
public bool MapaCarregado
|
|
{
|
|
get => _mapaCarregado;
|
|
set
|
|
{
|
|
if (_mapaCarregado != value)
|
|
{
|
|
_mapaCarregado = value;
|
|
OnPropertyChanged(nameof(MapaCarregado));
|
|
OnPropertyChanged(nameof(CanGoNext));
|
|
CommandManager.InvalidateRequerySuggested();
|
|
}
|
|
}
|
|
}
|
|
|
|
private bool _baseFixada = AppShell.Mock;
|
|
public bool BaseFixada
|
|
{
|
|
get => _baseFixada;
|
|
set
|
|
{
|
|
if (_baseFixada != value)
|
|
{
|
|
_baseFixada = value;
|
|
OnPropertyChanged(nameof(BaseFixada));
|
|
OnPropertyChanged(nameof(CanGoNext));
|
|
CommandManager.InvalidateRequerySuggested();
|
|
}
|
|
}
|
|
}
|
|
|
|
public bool CanGoBack => CurrentStep != DockStep.ConfigConexao;
|
|
|
|
public bool CanGoNext
|
|
{
|
|
get
|
|
{
|
|
return CurrentStep switch
|
|
{
|
|
DockStep.ConfigConexao => PodeAvancarConfigConexao(),
|
|
DockStep.PreparacaoMapa => MapaCarregado && BaseFixada,
|
|
_ => false
|
|
};
|
|
}
|
|
}
|
|
private bool PodeAvancarConfigConexao()
|
|
{
|
|
return ModoOperacaoAtual switch
|
|
{
|
|
ModoOperacao.Automatico => _viewConfig._vm.RedeOk && _viewConfig._vm.GnssOk,
|
|
ModoOperacao.Manual => _viewConfig._vm.RedeOk,
|
|
_ => false
|
|
};
|
|
}
|
|
|
|
|
|
public bool MostrarPainelEsquerdo => CurrentStep == DockStep.ParametrizacaoRover;
|
|
public bool MostrarBotaoVoltarEsquerda => CurrentStep != DockStep.ParametrizacaoRover;
|
|
|
|
public GridLength LeftPanelWidth
|
|
{
|
|
get
|
|
{
|
|
return CurrentStep switch
|
|
{
|
|
DockStep.ParametrizacaoRover => new GridLength(280),
|
|
_ => new GridLength(60)
|
|
};
|
|
}
|
|
}
|
|
public GridLength RightPanelWidth
|
|
{
|
|
get
|
|
{
|
|
return CurrentStep switch
|
|
{
|
|
DockStep.ParametrizacaoRover => (_viewOperacaoRight?.DataContext as OperacaoRightViewModel)?.IsCollapsed == true
|
|
? new GridLength(44)
|
|
: new GridLength(320),
|
|
|
|
_ => new GridLength(60)
|
|
};
|
|
}
|
|
}
|
|
private void OperacaoRightVm_PropertyChanged(object sender, PropertyChangedEventArgs e)
|
|
{
|
|
if (e.PropertyName == nameof(OperacaoRightViewModel.IsCollapsed))
|
|
{
|
|
OnPropertyChanged(nameof(RightPanelWidth));
|
|
}
|
|
}
|
|
|
|
// ====== CONTEÚDOS ======
|
|
private object _centerContent;
|
|
public object CenterContent
|
|
{
|
|
get => _centerContent;
|
|
set
|
|
{
|
|
_centerContent = value;
|
|
OnPropertyChanged(nameof(CenterContent));
|
|
}
|
|
}
|
|
|
|
private object _topContent;
|
|
public object TopContent
|
|
{
|
|
get => _topContent;
|
|
set
|
|
{
|
|
_topContent = value;
|
|
OnPropertyChanged(nameof(TopContent));
|
|
}
|
|
}
|
|
|
|
private object _bottomContent;
|
|
public object BottomContent
|
|
{
|
|
get => _bottomContent;
|
|
set
|
|
{
|
|
_bottomContent = value;
|
|
OnPropertyChanged(nameof(BottomContent));
|
|
}
|
|
}
|
|
private object _leftContent;
|
|
public object LeftContent
|
|
{
|
|
get => _leftContent;
|
|
set
|
|
{
|
|
_leftContent = value;
|
|
OnPropertyChanged(nameof(LeftContent));
|
|
}
|
|
}
|
|
private object _rightContent;
|
|
public object RightContent
|
|
{
|
|
get => _rightContent;
|
|
set
|
|
{
|
|
_rightContent = value;
|
|
OnPropertyChanged(nameof(RightContent));
|
|
}
|
|
}
|
|
|
|
// ====== COMMANDS ======
|
|
public ICommand BackCommand { get; }
|
|
public ICommand NextCommand { get; }
|
|
|
|
private void GoBack()
|
|
{
|
|
switch (CurrentStep)
|
|
{
|
|
case DockStep.PreparacaoMapa:
|
|
CurrentStep = DockStep.ConfigConexao;
|
|
break;
|
|
}
|
|
}
|
|
|
|
private void GoNext()
|
|
{
|
|
if (!CanGoNext) return;
|
|
|
|
switch (CurrentStep)
|
|
{
|
|
case DockStep.ConfigConexao:
|
|
if (ModoOperacaoAtual == ModoOperacao.Manual)
|
|
CurrentStep = DockStep.ParametrizacaoRover;
|
|
else
|
|
CurrentStep = DockStep.PreparacaoMapa;
|
|
break;
|
|
|
|
case DockStep.PreparacaoMapa:
|
|
CurrentStep = DockStep.ParametrizacaoRover;
|
|
break;
|
|
}
|
|
}
|
|
|
|
private FrameworkElement CriarBotaoNextSimples()
|
|
{
|
|
return new System.Windows.Controls.Button
|
|
{
|
|
Content = "⮞",
|
|
FontSize = 24,
|
|
Width = 40,
|
|
Height = 40,
|
|
HorizontalAlignment = System.Windows.HorizontalAlignment.Center,
|
|
VerticalAlignment = VerticalAlignment.Center,
|
|
Command = NextCommand
|
|
};
|
|
}
|
|
|
|
private void AtualizarConteudo()
|
|
{
|
|
TopContent = null;
|
|
BottomContent = null;
|
|
LeftContent = null;
|
|
RightContent = null;
|
|
CenterContent = null;
|
|
|
|
switch (CurrentStep)
|
|
{
|
|
case DockStep.ConfigConexao:
|
|
CenterContent = _viewConfig;
|
|
RightContent = CriarBotaoNextSimples();
|
|
break;
|
|
|
|
case DockStep.PreparacaoMapa:
|
|
TopContent = _viewPreparacaoMapaTop;
|
|
CenterContent = _viewPreparacaoMapa;
|
|
BottomContent = _viewPreparacaoMapaBottom;
|
|
RightContent = CriarBotaoNextSimples();
|
|
CriarMarcadorBase(_viewPreparacaoMapa?.MapaPreparacao);
|
|
break;
|
|
|
|
case DockStep.ParametrizacaoRover:
|
|
TopContent = _viewOperacaoTop;
|
|
LeftContent = _viewOperacaoLeft;
|
|
CenterContent = _viewOperacaoCenter;
|
|
RightContent = _viewOperacaoRight;
|
|
BottomContent = _viewOperacaoBottom;
|
|
CriarMarcadorBase(_viewOperacaoCenter?.Mapa);
|
|
AtualizarDadosMapa(null);
|
|
break;
|
|
}
|
|
|
|
OnPropertyChanged(nameof(MostrarPainelEsquerdo));
|
|
OnPropertyChanged(nameof(MostrarBotaoVoltarEsquerda));
|
|
}
|
|
|
|
// ====== INotifyPropertyChanged ======
|
|
public event PropertyChangedEventHandler PropertyChanged;
|
|
|
|
private void OnPropertyChanged(string nome)
|
|
{
|
|
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nome));
|
|
}
|
|
|
|
|
|
public void AtualizarDadosGnss(AgroBase.Models.GPSModel dados)
|
|
{
|
|
var bf = Variaveis.GpsService.BaseFix;
|
|
if (bf.CorrecaoEmAndamento)
|
|
{
|
|
AtualizarProgressoFixacaoBase(bf.Progresso, bf.ProgressoStr);
|
|
if (bf.Progresso >= 100) FinalizarFixacaoBase(true, bf.ProgressoStr);
|
|
}
|
|
MapViewControl? Mapa = CurrentStep == DockStep.PreparacaoMapa ? _viewPreparacaoMapa?.MapaPreparacao : CurrentStep == DockStep.ParametrizacaoRover ? _viewOperacaoCenter?.Mapa : null;
|
|
if (CurrentStep == DockStep.PreparacaoMapa)
|
|
{
|
|
_viewPreparacaoMapaTop?._vm?.AtualizarDados(dados);
|
|
}
|
|
Mapa?.markers?.UpdateMarkerPosition(VariaveisControleOperacao.BaseMarkerID, lat: dados?.Latitude, lon: dados?.Longitude, heading: dados?.OrientacaoReal);
|
|
}
|
|
|
|
public void AtualizarDadosMapa(OperacaoParametrosModel? dados)
|
|
{
|
|
_viewOperacaoCenter?.Mapa?.LoadMapFile(_ultimoMapaCarregado);
|
|
_viewOperacaoCenter?.Mapa?.CarregarDadosMapa(dados?.Mapa, dados?.RuasPercorrer);
|
|
}
|
|
|
|
#region TELA 2
|
|
|
|
private string? _ultimoMapaCarregado;
|
|
|
|
private void CriarMarcadorBase(MapViewControl Mapa)
|
|
{
|
|
string markerId = VariaveisControleOperacao.BaseMarkerID;
|
|
if (!Mapa?.markers?.Added(markerId) ?? false)
|
|
{
|
|
Mapa?.markers?.AddMarker(
|
|
markerId,
|
|
true,
|
|
lat: Variaveis.GpsService?.UltimaLeitura?.Latitude,
|
|
lon: Variaveis.GpsService?.UltimaLeitura?.Longitude,
|
|
heading: Variaveis.GpsService?.UltimaLeitura?.OrientacaoReal,
|
|
label: "Base"
|
|
);
|
|
}
|
|
}
|
|
|
|
private void OnCarregarMapaSolicitado(string caminhoArquivo)
|
|
{
|
|
try
|
|
{
|
|
_ultimoMapaCarregado = caminhoArquivo;
|
|
_viewPreparacaoMapa?.MapaPreparacao?.LoadMapFile(caminhoArquivo);
|
|
MapaCarregado = true;
|
|
_viewPreparacaoMapaBottom?._vm.AtualizarProgresso(0, $"Mapa carregado: {System.IO.Path.GetFileName(caminhoArquivo)}");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MapaCarregado = false;
|
|
_viewPreparacaoMapaBottom?._vm.AtualizarProgresso(0, $"Erro ao carregar mapa: {ex.Message}");
|
|
}
|
|
}
|
|
|
|
private async void OnFixarBaseSolicitado()
|
|
{
|
|
try
|
|
{
|
|
if (!Variaveis.GpsService.BaseFix.FixLiberado)
|
|
{
|
|
bool fixar = false;
|
|
|
|
if (Variaveis.GpsService.BaseFix.PosicaoBaseFixada)
|
|
{
|
|
var res = System.Windows.MessageBox.Show(
|
|
"Mudar posição da base?",
|
|
"Tem certeza que deseja fixar a posição da base novamente?",
|
|
MessageBoxButton.YesNo,
|
|
MessageBoxImage.Question);
|
|
|
|
if (res == MessageBoxResult.Yes)
|
|
fixar = true;
|
|
}
|
|
else
|
|
{
|
|
fixar = true;
|
|
}
|
|
|
|
if (fixar)
|
|
{
|
|
_viewPreparacaoMapaBottom?._vm.IniciarFixacao();
|
|
await Task.Run(async () => await Variaveis.GpsService.ConfigurarModulo(true));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Variaveis.GpsService.BaseFix.ReiniciarFix();
|
|
BaseFixada = false;
|
|
_viewPreparacaoMapaBottom?._vm.CancelarFixacao("Fixação da base interrompida pelo operador.");
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_viewPreparacaoMapaBottom?._vm.FinalizarFixacao(false, $"Erro na fixação da base: {ex.Message}");
|
|
}
|
|
}
|
|
|
|
public void AtualizarProgressoFixacaoBase(double progresso, string status)
|
|
{
|
|
System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() =>
|
|
{
|
|
_viewPreparacaoMapaBottom?._vm.AtualizarProgresso(progresso, status);
|
|
}));
|
|
}
|
|
|
|
public void FinalizarFixacaoBase(bool sucesso, string mensagem)
|
|
{
|
|
System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() =>
|
|
{
|
|
BaseFixada = sucesso;
|
|
_viewPreparacaoMapaBottom?._vm.FinalizarFixacao(sucesso, mensagem);
|
|
}));
|
|
}
|
|
|
|
public void CancelarFixacaoBase(string mensagem)
|
|
{
|
|
System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() =>
|
|
{
|
|
BaseFixada = false;
|
|
_viewPreparacaoMapaBottom?._vm.CancelarFixacao(mensagem);
|
|
}));
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region TELA 3
|
|
public void AtualizarListaRovers(List<OperacaoParametrosModel> rovers_atual)
|
|
{
|
|
var cards = rovers_atual.Select(x => new RoverCardModel()
|
|
{
|
|
EquipamentoId = x.IP,
|
|
NumeroSerie = x.RoverId,
|
|
Status = x.DadosLeitura?.StatusRover ?? AgroBase.Models.Enums.StatusModulo.Desconectado
|
|
}).ToArray();
|
|
|
|
_viewOperacaoRight?._vm?.AtualizarListaRovers(cards);
|
|
|
|
foreach (var rover in cards)
|
|
{
|
|
if (!_viewOperacaoCenter?.Mapa?.markers?.Added(rover.NumeroSerie) ?? false)
|
|
{
|
|
var roverDados = VariaveisControleOperacao.RoversNaRede.FirstOrDefault(x => x.RoverId == rover.NumeroSerie);
|
|
if (roverDados != null)
|
|
{
|
|
_viewOperacaoCenter?.Mapa?.markers?.AddMarker(
|
|
rover.NumeroSerie,
|
|
false,
|
|
lat: roverDados.DadosLeitura?.Gnss?.Latitude ?? 0,
|
|
lon: roverDados.DadosLeitura?.Gnss?.Longitude ?? 0,
|
|
heading: roverDados.DadosLeitura?.Gnss?.OrientacaoReal ?? 0
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void AtualizarDadosTela(OperacaoParametrosModel rover)
|
|
{
|
|
if (rover == null) return;
|
|
var obj = rover.DadosLeitura;
|
|
if (obj == null) return;
|
|
|
|
// MAPA
|
|
var simulacao = obj.Controle?.SimulacaoMPC?.Select(x => new double[] { x.longitude, x.latitude })?.ToList();
|
|
_viewOperacaoCenter?.Mapa?.markers.UpdateMarkerPosition(rover.RoverId, lat: obj.Gnss?.Latitude, lon: obj.Gnss?.Longitude, heading: obj.Gnss?.OrientacaoReal, predict: simulacao);
|
|
_viewOperacaoCenter?.Mapa?.markers.UpdateMarkerInfo(rover.RoverId, status: obj.Operacao?.Status ?? AgroBase.Models.Enums.StatusOperacao.NaoIniciado);
|
|
|
|
// ALERTAS
|
|
_viewOperacaoBottom?._vm?.AtualizarListaAlertasTodosRovers();
|
|
|
|
if (rover.RoverId != VariaveisControleOperacao.SelectedRoverId) return;
|
|
|
|
// ESQUERDA
|
|
var conexao = obj.ModulosSaude?.FirstOrDefault(x => x.modulo == AgroBase.Models.Enums.T_Code.Ipb);
|
|
double c = conexao?.saude ?? 0;
|
|
double conexao_latencia = conexao?.detalhes?["avg_rtt"]?.Value<double>() ?? 0.0;
|
|
double conexao_perda = conexao?.detalhes?["loss_pct"]?.Value<double>() ?? 0.0;
|
|
double bwTot = conexao?.detalhes?["bw_total_mbps"]?.Value<double>() ?? 0;
|
|
string comunicacao = $"{conexao_latencia:0.00} ms {bwTot:0.00} Mbps";
|
|
string comunicacao_extended = $"{conexao_latencia:0.00} ms {conexao_perda:F2}% {bwTot:0.00} Mbps";
|
|
|
|
_viewOperacaoLeft?._vm?.AtualizarRover(
|
|
rover?.Descricao ?? "",
|
|
obj.Controle?.PercentualVelocidadeSPKmh ?? 0,
|
|
obj.Controle?.Angulo ?? 0,
|
|
obj.Controle?.TipoMovimento ?? AgroBase.Models.Enums.TipoMovimentoDirecional.Diagnostico,
|
|
obj.Refrigeracao?.Temperatura ?? 0,
|
|
obj.Bateria?.PercentualBateria ?? 0,
|
|
obj.Atuador?.PercentualReservatorio ?? 0,
|
|
$"{c}%",
|
|
$"{obj.Gnss?.QualidadeFix ?? AgroBase.Models.Enums.TiposCorrecaoGPS.SemCorrecao} {obj.Gnss?.PrecisaoCm:F2} cm"
|
|
);
|
|
|
|
// DIREITA (RESUMO)
|
|
_viewOperacaoRight?._vm?.AtualizarResumo(r =>
|
|
{
|
|
r.Operacao = (obj.Operacao?.Liberada ?? false) ? "🔓 Liberada" : "🔒 Bloqueada";
|
|
r.Modo = obj.Operacao == null ? "-" : obj.Operacao.Modo.ToString();
|
|
r.Status = obj.Operacao == null ? "-" : $"{obj.Operacao.Status}" + (obj.Operacao.Status == AgroBase.Models.Enums.StatusOperacao.Aguardando ? $" ({obj.Operacao.TempoAguardandoSegs:0}s)" : "");
|
|
r.Carro = obj.Trajetoria == null ? "-" : obj.Trajetoria.StatusCarro.ToString();
|
|
r.Temperatura = $"{(obj.PerformanceNcp?.CPU_temp ?? 0):0.00} °C";
|
|
r.RuaAtual = obj.Trajetoria == null ? "-" : $"{obj.Trajetoria.CorredorAtualDistanciaPercorrida:0.00} m / " + $"{obj.Trajetoria.CorredorAtualDistanciaTotal:0.00} m " + $"({obj.Trajetoria.CorredorAtualIdx + 1})";
|
|
r.AreaTotal = obj.Trajetoria == null ? "-" : $"{obj.Trajetoria.DistanciaPercorrida:0.00} m / " + $"{obj.Trajetoria.DistanciaTotal:0.00} m";
|
|
r.Bateria = obj.Bateria == null ? "-" : $"{obj.Bateria.TensaoInstantanea:0.00} V " + $"({TimeSpan.FromMinutes(obj.Bateria.TempoEstimadoRestanteMinutos):dd\\.hh\\:mm\\:ss} " + $"{obj.Bateria.DistanciaEstimadaRestanteMetros:0.00} m)";
|
|
r.Herbicida = obj.Atuador == null ? "-" : $"{obj.Atuador.VolumeReservatorioL:0.00} L " + $"({TimeSpan.FromMinutes(obj.Atuador.TempoEstimadoRestanteMinutos):hh\\:mm\\:ss} " + $"{obj.Atuador.DistanciaEstimadaRestanteMetros:0.00} m)";
|
|
r.Infestacao = obj.Atuador == null ? "-" : $"{obj.Atuador.HerbicidaPorAtuacaoMl:0.00} mL/atuação";
|
|
r.Conexao = comunicacao == null ? "-" : $"{comunicacao}";
|
|
r.Duracao = obj.Operacao == null ? "00:00:00 / 00:00:00" : $"{TimeSpan.FromSeconds(obj.Operacao.TempoDecorridoSegs):hh\\:mm\\:ss} / " + $"{(string.IsNullOrWhiteSpace(obj.Trajetoria?.TempoEstimadoOperacao) ? "00:00:00" : obj.Trajetoria.TempoEstimadoOperacao)}";
|
|
|
|
// Opcionais para progress bars, caso queira evoluir o resumo
|
|
r.RuaAtualPercentual = obj.Trajetoria?.PercentualRuaAtual ?? 0;
|
|
r.AreaTotalPercentual = obj.Trajetoria?.PercentualOperacao ?? 0;
|
|
r.BateriaPercentual = obj.Bateria?.PercentualBateria ?? 0;
|
|
r.HerbicidaPercentual = obj.Atuador?.PercentualReservatorio ?? 0;
|
|
r.InfestacaoPercentual = obj.Atuador?.PercentualErvasTerreno ?? 0;
|
|
});
|
|
|
|
// DIAGNOSTICO
|
|
_viewOperacaoCenter?.Diagnostico?._vm?.AtualizarDados(rover);
|
|
_viewOperacaoCenter?.Diagnostico?.AtualizarGraficos();
|
|
|
|
// PULVERIZADOR
|
|
var bomba = obj.Atuador?.Bombas?.FirstOrDefault();
|
|
var ATU = _viewOperacaoCenter.Monitoramento.Pulverizador;
|
|
ATU.ComprimentoBarraCm = AgroBase.Models.VariaveisEquipamento.ComprimentoBarraPulverizadoraCm;
|
|
ATU.DistanciaEntreBicosCm = AgroBase.Models.VariaveisEquipamento.DistanciaEntreBicosCm;
|
|
//ATU.AlturaBarra = obj?.Controle?.AlturaBarra ?? AgroBase.Models.VariaveisEquipamento.AlturaBarraPulverizadoraCm;
|
|
ATU.IsBombaOn = bomba?.LeituraEstado ?? false;
|
|
ATU.PressaoLinha = obj?.Atuador?.PressaoLinhaPsi ?? 0;
|
|
ATU.VazaoInstantanea = obj?.Atuador?.VazaoInstantaneaMLs ?? 0;
|
|
ATU.TempoAtuado = (bomba?.TempoAtuado ?? 0) / 1000.0;
|
|
|
|
double erroLateral = ((obj?.Trajetoria?.DistanciaEsquerda ?? 0) - (obj?.Trajetoria?.DistanciaDireita ?? 0)) / 2.0 * 100.0;
|
|
ATU.LarguraRuaCm = 100.0;
|
|
ATU.ErroLateralCm = erroLateral;
|
|
|
|
if (ATU.QtdBicos != obj?.Atuador?.Bicos?.Count)
|
|
{
|
|
ATU.QtdBicos = obj?.Atuador?.Bicos?.Count ?? AgroBase.Models.VariaveisEquipamento.QuantidadeBicosPulverizadores;
|
|
}
|
|
|
|
foreach (var bico in ATU.Bicos)
|
|
{
|
|
var _bc = obj?.Atuador?.Bicos?.FirstOrDefault(x => (x.Posicao - 1) == bico.Index);
|
|
if (_bc == null) continue;
|
|
|
|
bico.OpeningAngle = _bc.AnguloAbertura;
|
|
bico.AnguloControle = _bc.ComandoAngulo;
|
|
bico.IsCommandOn = _bc.ComandoEstado;
|
|
bico.IsSpraying = _bc.LeituraEstado;
|
|
bico.Vazao = _bc.VazaoInstantaneaMLs;
|
|
bico.Atuacoes = _bc.QtdAtuacoes;
|
|
bico.TempoAtuado = _bc.TempoAtuado / 1000.0;
|
|
}
|
|
|
|
// CAMERAS
|
|
var camera_snr = obj?.Cameras?.FirstOrDefault(x => x.dispositivo == AgroBase.Models.Enums.T_Code.Snr);
|
|
var camera_cam = obj?.Cameras?.FirstOrDefault(x => x.dispositivo == AgroBase.Models.Enums.T_Code.Cam);
|
|
_viewOperacaoCenter?.Monitoramento?._vm?.AtualizarDadosCameras(camera_snr?.fps, camera_snr?.stream_kbps, camera_cam?.fps, camera_cam?.stream_kbps, obj?.OperadorVisual?.StatusCarro, obj?.Atuador?.PercentualErvasNoRadar);
|
|
}
|
|
|
|
|
|
public void AtualizarTopOperacaoBase()
|
|
{
|
|
System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() =>
|
|
{
|
|
_viewOperacaoTop?._vm.DefinirStatusNormal("BASE", "Base selecionada. Sistema pronto.");
|
|
}));
|
|
}
|
|
|
|
public void AtualizarTopOperacaoRover(string nomeRover, bool modoManual)
|
|
{
|
|
System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() =>
|
|
{
|
|
if (modoManual)
|
|
_viewOperacaoTop?._vm.DefinirStatusManual($"{nomeRover}", "Rover em modo manual. Comandos locais liberados.");
|
|
else
|
|
_viewOperacaoTop?._vm.DefinirStatusNormal($"{nomeRover}", "Rover selecionado. Operação pronta.");
|
|
}));
|
|
}
|
|
|
|
public void AtualizarTopOperacaoAlerta(string contexto, string mensagem)
|
|
{
|
|
System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() =>
|
|
{
|
|
_viewOperacaoTop?._vm.DefinirStatusAtencao(contexto, mensagem);
|
|
}));
|
|
}
|
|
|
|
public void AtualizarTopOperacaoCritico(string contexto, string mensagem)
|
|
{
|
|
System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() =>
|
|
{
|
|
_viewOperacaoTop?._vm.DefinirStatusCritico(contexto, mensagem);
|
|
}));
|
|
}
|
|
|
|
|
|
private void AbrirDiagnosticoPeloAlerta(AlertaModel alerta)
|
|
{
|
|
if (alerta == null)
|
|
return;
|
|
|
|
_viewOperacaoRight?._vm?.SelecionarRover(alerta.Rover_ID);
|
|
_viewOperacaoRight?._vm?.SelecionarSecao(SecaoRightBar.Diagnostico);
|
|
_viewOperacaoCenter?.Diagnostico?._vm?.AbrirModuloPorAlerta(alerta.Modulo, alerta.Mod_ID);
|
|
}
|
|
|
|
public void AdicionarAlerta(string roverId, AgroBase.Models.Enums.T_Code modulo, SeveridadeAlerta severidade, string mensagem, string modId = null)
|
|
{
|
|
_viewOperacaoBottom?._vm?.AdicionarAlerta(roverId, modulo, severidade, mensagem, modId);
|
|
}
|
|
|
|
public void RemoverAlerta(string roverId, AgroBase.Models.Enums.T_Code modulo, SeveridadeAlerta? severidade = null, string modId = null)
|
|
{
|
|
_viewOperacaoBottom?._vm?.RemoverAlerta(roverId, modulo, severidade, modId);
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OnRoverSelecionadoChanged(string roverId)
|
|
{
|
|
_viewOperacaoRight?._vm?.DestacarRoverNoMapa(roverId);
|
|
}
|
|
private void OnRoverSelecionadoChanged(RoverCardModel rover)
|
|
{
|
|
bool dados_base = rover == null;
|
|
if (dados_base)
|
|
{
|
|
if (!VariaveisControleOperacao.BaseEmFoco)
|
|
{
|
|
_viewOperacaoCenter?.Monitoramento?.PararStreamCameraFrontal();
|
|
_viewOperacaoCenter?.Monitoramento?.PararStreamCameraErvas();
|
|
VariaveisControleOperacao.EnviarComandoIniciarUDP(VariaveisControleOperacao.RoverEmFoco?.IP, false);
|
|
}
|
|
VariaveisControleOperacao.RoverEmFoco?.RuasPercorrer?.Clear();
|
|
AtualizarDadosMapa(VariaveisControleOperacao.RoverEmFoco);
|
|
VariaveisControleOperacao.SelectedRoverId = VariaveisControleOperacao.BaseMarkerID;
|
|
_viewOperacaoCenter?.Mapa?.markers?.SetMarkerFocused(VariaveisControleOperacao.SelectedRoverId, true);
|
|
|
|
_viewOperacaoCenter?._vm?.SelecionarRoverLista(rover);
|
|
|
|
AtualizarTopOperacaoRover(VariaveisControleOperacao.SelectedRoverId, true);
|
|
_viewOperacaoLeft?._vm?.DefinirSemRover();
|
|
}
|
|
else
|
|
{
|
|
VariaveisControleOperacao.SelectedRoverId = rover.NumeroSerie.ToString();
|
|
_viewOperacaoCenter?.Mapa?.markers?.SetMarkerFocused(VariaveisControleOperacao.SelectedRoverId, true);
|
|
AtualizarDadosTela(VariaveisControleOperacao.RoverEmFoco);
|
|
|
|
VariaveisControleOperacao.RequisitarParametrosOperacao();
|
|
_viewOperacaoCenter?.Monitoramento?.IniciarStreamCameraFrontal();
|
|
_viewOperacaoCenter?.Monitoramento?.IniciarStreamCameraErvas();
|
|
VariaveisControleOperacao.EnviarComandoIniciarUDP(VariaveisControleOperacao.RoverEmFoco?.IP, true);
|
|
|
|
_viewOperacaoCenter?._vm?.SelecionarRoverLista(rover);
|
|
|
|
AtualizarDadosMapa(VariaveisControleOperacao.RoverEmFoco);
|
|
|
|
AtualizarTopOperacaoRover(VariaveisControleOperacao.SelectedRoverId, ModoOperacaoAtual == ModoOperacao.Manual);
|
|
}
|
|
}
|
|
private void OnSecaoSelecionadaChanged(SecaoRightBar secao)
|
|
{
|
|
_viewOperacaoCenter?._vm?.DefinirSecao(secao);
|
|
AtualizarDadosMapa(VariaveisControleOperacao.RoverEmFoco);
|
|
}
|
|
|
|
private void OnLerParametrosSolicitado()
|
|
{
|
|
if (VariaveisControleOperacao.RoverEmFoco == null)
|
|
return;
|
|
|
|
VariaveisControleOperacao.RequisitarParametrosOperacao();
|
|
|
|
_viewOperacaoRight?._vm?.AtualizarParametros(VariaveisControleOperacao.RoverEmFoco);
|
|
}
|
|
private void OnSalvarParametrosSolicitado(OperacaoParametrosModel parametros)
|
|
{
|
|
if (VariaveisControleOperacao.RoverEmFoco == null)
|
|
return;
|
|
|
|
var rover = VariaveisControleOperacao.RoverEmFoco;
|
|
|
|
var novosParametros = new OperacaoParametrosModel()
|
|
{
|
|
Modo = parametros.Modo ?? AgroBase.Models.Enums.ModoOperacao.NaoDefinido,
|
|
Descricao = parametros.Descricao,
|
|
QtdCamerasSolo = parametros.QtdCamerasSolo,
|
|
QtdBicos = parametros.QtdBicos,
|
|
CapacidadeReservatorio = parametros.CapacidadeReservatorio,
|
|
|
|
Controle = parametros.Controle,
|
|
|
|
ModulosMandatorios = rover?.ModulosMandatorios,
|
|
ParametrosMandatorios = rover?.ParametrosMandatorios,
|
|
|
|
RuasPercorrer = _viewOperacaoCenter?.Mapa?.RuasMapaCarregado?.Where(x => x.Selected)?.Select(x => x.Id)?.ToList(),
|
|
Mapa = _viewOperacaoCenter?.Mapa?.CriarDadosMapa()
|
|
};
|
|
|
|
VariaveisControleOperacao.EnviarParametrosOperacao(novosParametros);
|
|
|
|
VariaveisControleOperacao.RoverEmFoco.Modo = novosParametros.Modo;
|
|
VariaveisControleOperacao.RoverEmFoco.Descricao = novosParametros.Descricao;
|
|
VariaveisControleOperacao.RoverEmFoco.QtdCamerasSolo = novosParametros.QtdCamerasSolo;
|
|
VariaveisControleOperacao.RoverEmFoco.QtdBicos = novosParametros.QtdBicos;
|
|
VariaveisControleOperacao.RoverEmFoco.CapacidadeReservatorio = novosParametros.CapacidadeReservatorio;
|
|
VariaveisControleOperacao.RoverEmFoco.Controle = novosParametros.Controle;
|
|
VariaveisControleOperacao.RoverEmFoco.RuasPercorrer = novosParametros.RuasPercorrer;
|
|
VariaveisControleOperacao.RoverEmFoco.Mapa = novosParametros.Mapa;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
public enum ModoOperacao
|
|
{
|
|
Automatico = 1,
|
|
Manual = 2
|
|
}
|
|
|
|
public enum DockStep
|
|
{
|
|
ConfigConexao = 1,
|
|
PreparacaoMapa = 2,
|
|
ParametrizacaoRover = 3
|
|
}
|
|
|
|
} |