diff --git a/AgroBase/OperationControl/OperationControl.csproj.user b/AgroBase/OperationControl/OperationControl.csproj.user
index a493baac4..2323a885a 100644
--- a/AgroBase/OperationControl/OperationControl.csproj.user
+++ b/AgroBase/OperationControl/OperationControl.csproj.user
@@ -46,6 +46,12 @@
Code
+
+ Code
+
+
+ Code
+
Code
@@ -117,6 +123,12 @@
Designer
+
+ Designer
+
+
+ Designer
+
Designer
diff --git a/AgroBase/OperationControl/ViewModels/Views/ConfigConexao/ConfigConexaoViewModel.cs b/AgroBase/OperationControl/ViewModels/Views/ConfigConexao/ConfigConexaoViewModel.cs
index 871e855fa..465e4dcb8 100644
--- a/AgroBase/OperationControl/ViewModels/Views/ConfigConexao/ConfigConexaoViewModel.cs
+++ b/AgroBase/OperationControl/ViewModels/Views/ConfigConexao/ConfigConexaoViewModel.cs
@@ -5,6 +5,8 @@ using System.Windows.Input;
using System.Windows.Threading;
using OperationControl.Helpers;
using OperationControl.Models;
+using Brush = System.Windows.Media.Brush;
+using Brushes = System.Windows.Media.Brushes;
namespace OperationControl.ViewModels
{
diff --git a/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoOpcoesViewModel.cs b/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoOpcoesViewModel.cs
index fd7a9396f..cab6222c9 100644
--- a/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoOpcoesViewModel.cs
+++ b/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoOpcoesViewModel.cs
@@ -80,8 +80,8 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico
private string _bicoAnguloTexto = "00°";
public string BicoAnguloTexto { get => _bicoAnguloTexto; set => SetProperty(ref _bicoAnguloTexto, value); }
- private string _bicoAnguloAbertura = "0";
- public string BicoAnguloAbertura { get => _bicoAnguloAbertura; set => SetProperty(ref _bicoAnguloAbertura, value); }
+ private double _bicoAnguloAbertura = 0;
+ public double BicoAnguloAbertura { get => _bicoAnguloAbertura; set => SetProperty(ref _bicoAnguloAbertura, value); }
private string _txtBicoComando = "—";
public string TxtBicoComando { get => _txtBicoComando; set => SetProperty(ref _txtBicoComando, value); }
@@ -138,14 +138,14 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico
#region DIRECIONAL
- public ObservableCollection DirMovimentosDisponiveis { get; } = new();
- public ObservableCollection DirDirecoesDisponiveis { get; } = new();
+ public ObservableCollection DirMovimentosDisponiveis { get; } = new();
+ public ObservableCollection DirDirecoesDisponiveis { get; } = new();
- private string _dirMovimentoSelecionado;
- public string DirMovimentoSelecionado { get => _dirMovimentoSelecionado; set => SetProperty(ref _dirMovimentoSelecionado, value); }
+ private TipoMovimentoDirecional _dirMovimentoSelecionado;
+ public TipoMovimentoDirecional DirMovimentoSelecionado { get => _dirMovimentoSelecionado; set => SetProperty(ref _dirMovimentoSelecionado, value); }
- private string _dirDirecaoSelecionada;
- public string DirDirecaoSelecionada { get => _dirDirecaoSelecionada; set => SetProperty(ref _dirDirecaoSelecionada, value); }
+ private Direcao _dirDirecaoSelecionada;
+ public Direcao DirDirecaoSelecionada { get => _dirDirecaoSelecionada; set => SetProperty(ref _dirDirecaoSelecionada, value); }
private double _dirAngulo;
public double DirAngulo
@@ -359,11 +359,11 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico
private bool _npcCoolerSaida;
public bool NpcCoolerSaida { get => _npcCoolerSaida; set => SetProperty(ref _npcCoolerSaida, value); }
- private string _npcCoolerTempOn = "0";
- public string NpcCoolerTempOn { get => _npcCoolerTempOn; set => SetProperty(ref _npcCoolerTempOn, value); }
+ private double _npcCoolerTempOn = 0;
+ public double NpcCoolerTempOn { get => _npcCoolerTempOn; set => SetProperty(ref _npcCoolerTempOn, value); }
- private string _npcCoolerTempTurbo = "0";
- public string NpcCoolerTempTurbo { get => _npcCoolerTempTurbo; set => SetProperty(ref _npcCoolerTempTurbo, value); }
+ private double _npcCoolerTempTurbo = 0;
+ public double NpcCoolerTempTurbo { get => _npcCoolerTempTurbo; set => SetProperty(ref _npcCoolerTempTurbo, value); }
private string _txtNpcCoolerModo = "—";
public string TxtNpcCoolerModo { get => _txtNpcCoolerModo; set => SetProperty(ref _txtNpcCoolerModo, value); }
@@ -409,11 +409,10 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico
public DiagnosticoOpcoesViewModel()
{
- foreach (var nome in Enum.GetNames(typeof(TipoMovimentoDirecional)))
- DirMovimentosDisponiveis.Add(nome);
+ DirDirecoesDisponiveis = new ObservableCollection() { Direcao.Parado, Direcao.Esquerda, Direcao.Direita };
- foreach (var nome in Enum.GetNames(typeof(Direcao)))
- DirDirecoesDisponiveis.Add(nome);
+ foreach (var modo in Enum.GetValues())
+ DirMovimentosDisponiveis.Add(modo);
foreach (var modo in Enum.GetValues())
NpcCoolerModosDisponiveis.Add(modo);
@@ -443,13 +442,16 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico
NpcCoolerEnviarCommand = new RelayCommand(_ => NpcCoolerEnviar());
}
- public void Atualizar(DiagnosticoModuloItemViewModel item, OperacaoParametrosModel dados)
+ public void Atualizar(DiagnosticoModuloItemViewModel item, OperacaoParametrosModel dados, bool clicado)
{
_itemAtual = item;
_dadosAtual = dados;
- ResetarVisibilidades();
- ResetarCampos();
+ if (clicado)
+ {
+ ResetarVisibilidades();
+ ResetarCampos();
+ }
if (_itemAtual == null || _dadosAtual?.DadosLeitura == null)
{
@@ -466,22 +468,25 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico
{
case S_Code.sMOD:
MostrarOpcoesAtuador = true;
- BarraAltura = rover.Controle?.AlturaBarra ?? 0;
+ if (clicado)
+ {
+ BarraAltura = rover.Controle?.AlturaBarra ?? 0;
+ }
break;
case S_Code.sBIC:
MostrarOpcoesBico = true;
- PreencherBico(rover);
+ PreencherBico(rover, clicado);
break;
case S_Code.sBMB:
MostrarOpcoesBomba = true;
- PreencherBomba(rover);
+ PreencherBomba(rover, clicado);
break;
case S_Code.sSRV:
MostrarOpcoesServo = true;
- PreencherServoAtuador(rover);
+ PreencherServoAtuador(rover, clicado);
break;
default:
@@ -499,12 +504,12 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico
case S_Code.sRLE:
MostrarOpcoesRele = true;
- PreencherRele(rover);
+ PreencherRele(rover, clicado);
break;
case S_Code.sSRV:
MostrarOpcoesServo = true;
- PreencherServoSensoriamento(rover);
+ PreencherServoSensoriamento(rover, clicado);
break;
default:
@@ -515,22 +520,22 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico
case T_Code.Dir:
MostrarOpcoesDirecional = true;
- PreencherDirecional(rover);
+ PreencherDirecional(rover, clicado);
break;
case T_Code.Gps:
MostrarOpcoesGps = true;
- PreencherGps(rover);
+ PreencherGps(rover, clicado);
break;
case T_Code.Trj:
MostrarOpcoesTrajetoria = true;
- PreencherTrajetoria(rover);
+ PreencherTrajetoria(rover, clicado);
break;
case T_Code.Npc:
MostrarOpcoesNpc = true;
- PreencherNpc(rover);
+ PreencherNpc(rover, clicado);
break;
default:
@@ -541,7 +546,7 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico
#region PREENCHIMENTO
- private void PreencherBico(OperacaoParametrosDadosModel rover)
+ private void PreencherBico(OperacaoParametrosDadosModel rover, bool clicado)
{
var bico = rover?.Atuador?.Bicos?.FirstOrDefault(x => x.ID == _itemAtual.LabelModulo);
BicoTitulo = $"Bico {_itemAtual.LabelModulo} - Testes";
@@ -551,11 +556,14 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico
TxtBicoVazao = $"{bico?.VazaoInstantaneaMLs ?? 0:0.##} mL/s";
TxtBicoPressao = $"{rover?.Atuador?.PressaoLinhaPsi ?? 0:0.##} psi";
TxtBicoAtuacoes = $"{bico?.QtdAtuacoes ?? 0}";
- BicoAngulo = bico?.ComandoAngulo ?? 0;
- BicoAnguloAbertura = (bico?.AnguloAbertura ?? 0).ToString();
+ if (clicado)
+ {
+ BicoAngulo = bico?.ComandoAngulo ?? 0;
+ BicoAnguloAbertura = bico?.AnguloAbertura ?? 0;
+ }
}
- private void PreencherBomba(OperacaoParametrosDadosModel rover)
+ private void PreencherBomba(OperacaoParametrosDadosModel rover, bool clicado)
{
var bomba = rover?.Atuador?.Bombas?.FirstOrDefault(x => x.ID == _itemAtual.LabelModulo);
BombaTitulo = $"Bomba {_itemAtual.LabelModulo} - Testes";
@@ -563,10 +571,13 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico
TxtBombaStatusReal = (bomba?.LeituraEstado ?? false) ? "Ligado" : "Desligado";
TxtBombaPressaoLinha = $"{rover?.Atuador?.PressaoLinhaPsi ?? 0:0.##} psi";
TxtBombaPotencia = $"{bomba?.Potencia ?? 0:0.#} %";
- BombaPressaoAlvo = bomba?.Potencia ?? 0;
+ if (clicado)
+ {
+ BombaPressaoAlvo = bomba?.Potencia ?? 0;
+ }
}
- private void PreencherDirecional(OperacaoParametrosDadosModel rover)
+ private void PreencherDirecional(OperacaoParametrosDadosModel rover, bool clicado)
{
var mod = rover?.Direcional?.Modulos?.FirstOrDefault(x => x.Mod_ID == _itemAtual.LabelModulo);
DirTitulo = $"Direcional {_itemAtual.LabelModulo} - Testes";
@@ -574,23 +585,29 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico
TxtDirSentido = $"{mod?.SentidoReal ?? Sentido.Parado}";
TxtDirAnguloSP = $"{mod?.Angulo_SP ?? 0:0.00}°";
TxtDirAngulo = $"{mod?.AnguloDriver ?? 0:0.00}°";
- DirAngulo = mod?.Angulo_SP ?? 0;
+ if (clicado)
+ {
+ DirAngulo = mod?.Angulo_SP ?? 0;
+ }
}
- private void PreencherGps(OperacaoParametrosDadosModel rover)
+ private void PreencherGps(OperacaoParametrosDadosModel rover, bool clicado)
{
var dados = rover?.Gnss;
- GpsLeverArmLateral = (dados?.LeverArmLateral ?? 0) / 10.0;
- GpsLeverArmFrontal = (dados?.LeverArmFrontal ?? 0) / 10.0;
TxtGpsCorrecao = $"{dados?.QualidadeFix ?? TiposCorrecaoGPS.SemCorrecao}";
TxtGpsIdade = $"{dados?.IdadeCorrecao ?? -1}";
TxtGpsPrecisao = $"{dados?.PrecisaoCm ?? -1}";
TxtGpsNSatelites = $"{dados?.NumeroSatelites ?? 0}";
TxtGpsDistBase = "0";
TxtGpsOrientacao = $"{dados?.OrientacaoReal ?? 0}";
+ if (clicado)
+ {
+ GpsLeverArmLateral = (dados?.LeverArmLateral ?? 0) / 10.0;
+ GpsLeverArmFrontal = (dados?.LeverArmFrontal ?? 0) / 10.0;
+ }
}
- private void PreencherTrajetoria(OperacaoParametrosDadosModel rover)
+ private void PreencherTrajetoria(OperacaoParametrosDadosModel rover, bool clicado)
{
var dados = rover?.Trajetoria?.AutonomiaCorredor;
TxtTrajetoriaDistCorredor = $"{dados?.DistanciaCorredor_m ?? 0:0.00} m";
@@ -600,11 +617,14 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico
TxtTrajetoriaBatOk = (dados?.BateriaSuficiente ?? false) ? "Sim" : "Não";
TxtTrajetoriaHerbOk = (dados?.HerbicidaSuficiente ?? false) ? "Sim" : "Não";
TrajetoriaPodeConfirmar = !(dados?.Liberado ?? false);
- TrajetoriaBatLiberada = true; // dados?.BateriaSuficiente ?? false;
- TrajetoriaHerbLiberado = true; // dados?.HerbicidaSuficiente ?? false;
+ if (clicado)
+ {
+ TrajetoriaBatLiberada = dados?.BateriaSuficiente ?? false;
+ TrajetoriaHerbLiberado = dados?.HerbicidaSuficiente ?? false;
+ }
}
- private void PreencherRele(OperacaoParametrosDadosModel rover)
+ private void PreencherRele(OperacaoParametrosDadosModel rover, bool clicado)
{
var rele = rover?.Sensoriamento?.Reles?.FirstOrDefault(x => x.ID == _itemAtual.LabelModulo);
ReleTitulo = $"Relé {_itemAtual.LabelModulo} - Testes";
@@ -612,37 +632,45 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico
TxtReleStatusReal = (rele?.LeituraEstado ?? false) ? "Ligado" : "Desligado";
}
- private void PreencherServoSensoriamento(OperacaoParametrosDadosModel rover)
+ private void PreencherServoSensoriamento(OperacaoParametrosDadosModel rover, bool clicado)
{
var servo = rover?.Sensoriamento?.Servos?.FirstOrDefault(x => x.ID == _itemAtual.LabelModulo);
TxtServoComando = $"{servo?.ComandoAngulo ?? 0}°";
TxtServoLeitura = $"{servo?.LeituraAngulo ?? 0}°";
TxtServoIncremental = (servo?.Incremental ?? false) ? "Incremental" : "Decremental";
- ServoAngulo = servo?.ComandoAngulo ?? 0;
+ if (clicado)
+ {
+ ServoAngulo = servo?.ComandoAngulo ?? 0;
+ }
}
- private void PreencherServoAtuador(OperacaoParametrosDadosModel rover)
+ private void PreencherServoAtuador(OperacaoParametrosDadosModel rover, bool clicado)
{
var servo = rover?.Atuador?.Servos?.FirstOrDefault(x => x.ID == _itemAtual.LabelModulo);
TxtServoComando = $"{servo?.ComandoAngulo ?? 0}°";
TxtServoLeitura = $"{servo?.LeituraAngulo ?? 0}°";
TxtServoIncremental = (servo?.Incremental ?? false) ? "Incremental" : "Decremental";
- ServoAngulo = servo?.ComandoAngulo ?? 0;
+ if (clicado)
+ {
+ ServoAngulo = servo?.ComandoAngulo ?? 0;
+ }
}
- private void PreencherNpc(OperacaoParametrosDadosModel rover)
+ private void PreencherNpc(OperacaoParametrosDadosModel rover, bool clicado)
{
var dados = rover?.Refrigeracao;
TxtNpcCoolerModo = $"{dados?.Modo}";
TxtNpcCoolerTemperatura = $"{dados?.Temperatura ?? 0:0.00} °C";
TxtNpcCoolerEntrada = $"{dados?.EstadoEntrada} ({dados?.LeituraEntrada})";
TxtNpcCoolerSaida = $"{dados?.EstadoSaida} ({dados?.LeituraSaida})";
-
- NpcCoolerModoSelecionado = dados?.Modo ?? CoolerMode.Off;
- NpcCoolerEntrada = (dados?.EstadoEntrada ?? Estado.Desligado) == Estado.Ligado;
- NpcCoolerSaida = (dados?.EstadoSaida ?? Estado.Desligado) == Estado.Ligado;
- NpcCoolerTempOn = $"{dados?.TemperaturaLigar ?? 0}";
- NpcCoolerTempTurbo = $"{dados?.TemperaturaTurbo ?? 0}";
+ if (clicado)
+ {
+ NpcCoolerModoSelecionado = dados?.Modo ?? CoolerMode.Off;
+ NpcCoolerEntrada = (dados?.EstadoEntrada ?? Estado.Desligado) == Estado.Ligado;
+ NpcCoolerSaida = (dados?.EstadoSaida ?? Estado.Desligado) == Estado.Ligado;
+ NpcCoolerTempOn = dados?.TemperaturaLigar ?? 0;
+ NpcCoolerTempTurbo = dados?.TemperaturaTurbo ?? 0;
+ }
}
#endregion
@@ -668,7 +696,7 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico
{
BarraAltura = 0;
BicoAngulo = 0;
- BicoAnguloAbertura = "0";
+ BicoAnguloAbertura = 0;
BombaPressaoAlvo = 0;
DirAngulo = 0;
GpsLeverArmLateral = 0;
@@ -678,8 +706,8 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico
ServoAngulo = 0;
NpcCoolerEntrada = false;
NpcCoolerSaida = false;
- NpcCoolerTempOn = "0";
- NpcCoolerTempTurbo = "0";
+ NpcCoolerTempOn = 0;
+ NpcCoolerTempTurbo = 0;
}
#endregion
@@ -689,13 +717,19 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico
private void SensoriamentoReiniciar()
{
if (_itemAtual?.Modulo != T_Code.Sen) return;
- VariaveisControleOperacao.EnviarComandoSensoriamento(_itemAtual.LabelModulo, true);
+ if (MessageBox.Show("Tem certeza que deseja reiniciar o módulo Sensoriamento?", "Reiniciar Módulo", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
+ {
+ VariaveisControleOperacao.EnviarComandoSensoriamento(_itemAtual.LabelModulo, true);
+ }
}
private void AtuadorReiniciar()
{
if (_itemAtual?.Modulo != T_Code.Atu) return;
- VariaveisControleOperacao.EnviarComandoAtuador(_itemAtual.LabelModulo, true);
+ if (MessageBox.Show("Tem certeza que deseja reiniciar o módulo Atuador?", "Reiniciar Módulo", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
+ {
+ VariaveisControleOperacao.EnviarComandoAtuador(_itemAtual.LabelModulo, true);
+ }
}
private void BarraMover()
@@ -725,8 +759,7 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico
private void BicoSalvarAnguloAbertura()
{
if (_itemAtual?.Modulo != T_Code.Atu || _itemAtual.SCode != S_Code.sBIC) return;
- if (!int.TryParse(BicoAnguloAbertura, out int ang)) return;
- VariaveisControleOperacao.EnviarComandoAtuador(_itemAtual.LabelModulo, angulo_abertura: ang);
+ VariaveisControleOperacao.EnviarComandoAtuador(_itemAtual.LabelModulo, angulo_abertura: BicoAnguloAbertura);
}
private void BombaLigar()
@@ -744,36 +777,35 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico
private void DirReferenciar()
{
if (_itemAtual?.Modulo != T_Code.Dir) return;
- VariaveisControleOperacao.EnviarComandoReferenciamento(mod_id: _itemAtual.LabelModulo);
+ if (MessageBox.Show("Tem certeza que deseja realizar o referenciamento?", "Referenciar", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
+ {
+ VariaveisControleOperacao.EnviarComandoReferenciamento(mod_id: _itemAtual.LabelModulo);
+ }
}
private void DirMovimentar()
{
if (_itemAtual?.Modulo != T_Code.Dir) return;
- if (string.IsNullOrWhiteSpace(DirMovimentoSelecionado) || string.IsNullOrWhiteSpace(DirDirecaoSelecionada)) return;
-
- var tipo = (TipoMovimentoDirecional)Enum.Parse(typeof(TipoMovimentoDirecional), DirMovimentoSelecionado);
- var direcao = (Direcao)Enum.Parse(typeof(Direcao), DirDirecaoSelecionada);
- VariaveisControleOperacao.EnviarComandoDirecional(direcao, Convert.ToInt32(DirAngulo), tipo, mod_id: _itemAtual.LabelModulo);
+ VariaveisControleOperacao.EnviarComandoDirecional(DirDirecaoSelecionada, DirAngulo, DirMovimentoSelecionado, mod_id: _itemAtual.LabelModulo);
}
private void GpsSalvar()
{
- VariaveisControleOperacao.EnviarComandoLeverArm(
- lateral: GpsLeverArmLateral * 10.0,
- frontal: GpsLeverArmFrontal * 10.0);
+ if (MessageBox.Show("Tem certeza que deseja redefinir o lever arm do GNSS?", "Lever Arm", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
+ {
+ VariaveisControleOperacao.EnviarComandoLeverArm(lateral: GpsLeverArmLateral * 10.0, frontal: GpsLeverArmFrontal * 10.0);
+ }
}
private void TrajetoriaConfirmar()
{
if (_itemAtual?.Modulo != T_Code.Trj) return;
-
var trj = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Trajetoria;
int idxCorredor = trj?.PontoAtualIdxCorredor ?? 0;
- VariaveisControleOperacao.EnviarConfirmacaoHumanaTrajetoria(
- idxCorredor,
- TrajetoriaBatLiberada,
- TrajetoriaHerbLiberado);
+ if (MessageBox.Show($"Tem certeza que deseja liberar a operação no corredor {idxCorredor + 1}?", "Liberação", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
+ {
+ VariaveisControleOperacao.EnviarConfirmacaoHumanaTrajetoria(idxCorredor, TrajetoriaBatLiberada, TrajetoriaHerbLiberado);
+ }
}
private void ReleLigar()
@@ -816,15 +848,7 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico
var entrada = NpcCoolerEntrada ? Estado.Ligado : Estado.Desligado;
var saida = NpcCoolerSaida ? Estado.Ligado : Estado.Desligado;
- double.TryParse(NpcCoolerTempOn, out double tempOn);
- double.TryParse(NpcCoolerTempTurbo, out double tempTurbo);
-
- VariaveisControleOperacao.EnviarComandoCoolerControl(
- modo,
- entrada: entrada,
- saida: saida,
- temp_on: tempOn,
- temp_turbo: tempTurbo);
+ VariaveisControleOperacao.EnviarComandoCoolerControl(modo, entrada: entrada, saida: saida, temp_on: NpcCoolerTempOn, temp_turbo: NpcCoolerTempTurbo);
}
#endregion
diff --git a/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoViewModel.cs b/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoViewModel.cs
index fdce23d12..f5ddadc35 100644
--- a/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoViewModel.cs
+++ b/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoViewModel.cs
@@ -36,7 +36,7 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico
_moduloSelecionado.Selecionado = true;
OnPropertyChanged();
- AtualizarResumoModuloSelecionado();
+ AtualizarResumoModuloSelecionado(true);
}
}
@@ -173,8 +173,22 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico
ModuloSelecionado = item;
}
- #region RESUMO
+ public void AbrirModuloPorAlerta(T_Code modulo, string? modId)
+ {
+ ModuloSelecionado = DiagnosticoModulos.FirstOrDefault(x => x.Modulo == modulo && x.LabelModulo == modId);
+ if (ModuloSelecionado == null)
+ ModuloSelecionado = DiagnosticoModulos.FirstOrDefault(x => x.Modulo == modulo && x.SCode == S_Code.sMOD);
+ if (ModuloSelecionado == null)
+ ModuloSelecionado = DiagnosticoModulos.FirstOrDefault(x => x.Modulo == modulo);
+ }
+ #region RESUMO
+ private string _impedimentoOperacaoTexto = "Impedimento: Nenhum";
+ public string ImpedimentoOperacaoTexto
+ {
+ get => _impedimentoOperacaoTexto;
+ set => SetProperty(ref _impedimentoOperacaoTexto, value);
+ }
private string _tituloModuloSelecionado = "Nenhum módulo selecionado";
public string TituloModuloSelecionado
{
@@ -292,11 +306,17 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico
set => SetProperty(ref _infoIdVisual, value);
}
- private void AtualizarResumoModuloSelecionado()
+ private void AtualizarResumoModuloSelecionado(bool clicado)
{
CondicoesOperacionais.Clear();
LogsModuloSelecionado.Clear();
+ var impedimento = _dadosOperacaoAtual?.DadosLeitura?.Operacao?.ImpedimentoErro;
+ if (string.IsNullOrWhiteSpace(impedimento))
+ ImpedimentoOperacaoTexto = "Impedimento: Nenhum";
+ else
+ ImpedimentoOperacaoTexto = $"Impedimento: " + impedimento.Replace("\r\n", "\n").Replace("\n\n", "; ").Replace("\n", "; ").Trim();
+
if (ModuloSelecionado == null || _dadosOperacaoAtual == null)
{
TituloModuloSelecionado = "Nenhum módulo selecionado";
@@ -360,8 +380,11 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico
InfoLatencia = $"Latência: {dispositivo?.Latencia ?? 0} ms";
ImpedimentoModuloSelecionado = $"Impedimento: {(string.IsNullOrWhiteSpace(motivos) ? "Nenhum" : motivos)}";
- MandatorioSelecionado = item.Mandatorio;
- EmUsoSelecionado = item.EmUso;
+ if (clicado)
+ {
+ MandatorioSelecionado = item.Mandatorio;
+ EmUsoSelecionado = item.EmUso;
+ }
if (saudeModulo?.condicoes_operacionais != null)
{
@@ -381,7 +404,7 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico
LogsModuloSelecionado.Add($"{log.Momento:HH:mm:ss.fff} - {log.Mensagem}");
}
- OpcoesVM?.Atualizar(ModuloSelecionado, _dadosOperacaoAtual);
+ OpcoesVM?.Atualizar(ModuloSelecionado, _dadosOperacaoAtual, clicado);
AtualizarGraficoModuloSelecionado();
}
@@ -400,7 +423,7 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico
item.Iniciado = ObterIniciado(item, dados);
}
- AtualizarResumoModuloSelecionado();
+ AtualizarResumoModuloSelecionado(false);
}
private StatusModulo ObterStatusModulo(DiagnosticoModuloItemViewModel item, OperacaoParametrosModel dados)
@@ -581,7 +604,7 @@ namespace OperationControl.ViewModels.Views.Operacao.Diagnostico
ModuloSelecionado.Mandatorio = MandatorioSelecionado;
ModuloSelecionado.EmUso = EmUsoSelecionado;
- AtualizarResumoModuloSelecionado();
+ AtualizarResumoModuloSelecionado(true);
}
diff --git a/AgroBase/OperationControl/ViewModels/Views/Operacao/Monitoramento/MonitoramentoViewModel.cs b/AgroBase/OperationControl/ViewModels/Views/Operacao/Monitoramento/MonitoramentoViewModel.cs
new file mode 100644
index 000000000..eab81d75f
--- /dev/null
+++ b/AgroBase/OperationControl/ViewModels/Views/Operacao/Monitoramento/MonitoramentoViewModel.cs
@@ -0,0 +1,13 @@
+using OperationControl.ViewModels.Base;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OperationControl.ViewModels.Views.Operacao.Monitoramento
+{
+ public class MonitoramentoViewModel : NotifyBase
+ {
+ }
+}
diff --git a/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoBottomViewModel.cs b/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoBottomViewModel.cs
index 09a87d13c..1eb05c803 100644
--- a/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoBottomViewModel.cs
+++ b/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoBottomViewModel.cs
@@ -3,23 +3,38 @@ using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows.Threading;
using static AgroBase.Models.Enums;
-using Application = System.Windows.Application;
namespace OperationControl.ViewModels.Views.Operacao
{
public class OperacaoBottomViewModel : INotifyPropertyChanged
{
+ public ObservableCollection AlertasAtivos { get; } = new();
+
private AlertaModel _toastAlerta;
- private AlertaModel _alertaSelecionado;
+ public AlertaModel ToastAlerta
+ {
+ get => _toastAlerta;
+ set
+ {
+ if (_toastAlerta == value) return;
+ _toastAlerta = value;
+ OnPropertyChanged(nameof(ToastAlerta));
+ }
+ }
+
private readonly DispatcherTimer _toastTimer;
+ public event PropertyChangedEventHandler PropertyChanged;
+ protected void OnPropertyChanged(string name) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
+
+ // EVENTO PARA O PAI TRATAR A NAVEGAÇÃO
+ public event Action SolicitarAbrirDiagnostico;
+
public OperacaoBottomViewModel()
{
- AlertasAtivos = new ObservableCollection();
-
_toastTimer = new DispatcherTimer
{
- Interval = TimeSpan.FromSeconds(5)
+ Interval = TimeSpan.FromSeconds(6)
};
_toastTimer.Tick += (s, e) =>
@@ -29,115 +44,17 @@ namespace OperationControl.ViewModels.Views.Operacao
};
}
- public ObservableCollection AlertasAtivos { get; }
-
- public AlertaModel ToastAlerta
- {
- get => _toastAlerta;
- set
- {
- if (_toastAlerta != value)
- {
- _toastAlerta = value;
- OnPropertyChanged(nameof(ToastAlerta));
- }
- }
- }
-
- public AlertaModel AlertaSelecionado
- {
- get => _alertaSelecionado;
- set
- {
- if (_alertaSelecionado != value)
- {
- _alertaSelecionado = value;
- OnPropertyChanged(nameof(AlertaSelecionado));
- }
- }
- }
-
- public event PropertyChangedEventHandler PropertyChanged;
- public event Action AlertaSelecionadoChanged;
-
public void SelecionarAlerta(AlertaModel alerta)
{
if (alerta == null) return;
- AlertaSelecionado = alerta;
- AlertaSelecionadoChanged?.Invoke(alerta);
+ SolicitarAbrirDiagnostico?.Invoke(alerta);
}
- public void AdicionarAlerta(string roverId, T_Code modulo, SeveridadeAlerta severidade, string mensagem, string modId = null)
+ public void LimparToast()
{
- if (!Application.Current.Dispatcher.CheckAccess())
- {
- Application.Current.Dispatcher.BeginInvoke(new Action(() =>
- AdicionarAlerta(roverId, modulo, severidade, mensagem, modId)));
- return;
- }
-
- var existente = AlertasAtivos.FirstOrDefault(x =>
- x.Rover_ID == roverId &&
- x.Modulo == modulo &&
- x.Mod_ID == modId);
-
- if (existente == null)
- {
- var alerta = new AlertaModel
- {
- Rover_ID = roverId,
- Modulo = modulo,
- Mod_ID = modId,
- Severidade = severidade,
- Mensagem = mensagem,
- Timestamp = DateTime.Now
- };
-
- AlertasAtivos.Insert(0, alerta);
- MostrarToast(alerta);
- }
- else
- {
- existente.Mensagem = mensagem;
- existente.Severidade = severidade;
- existente.Timestamp = DateTime.Now;
-
- // caso o model nao implemente INotifyPropertyChanged,
- // forçamos um refresh simples:
- RecarregarAlerta(existente);
- }
-
- OnPropertyChanged(nameof(AlertasAtivos));
- }
-
- public void RemoverAlerta(string roverId, T_Code modulo, SeveridadeAlerta? severidade = null, string modId = null)
- {
- if (!Application.Current.Dispatcher.CheckAccess())
- {
- Application.Current.Dispatcher.BeginInvoke(new Action(() =>
- RemoverAlerta(roverId, modulo, severidade, modId)));
- return;
- }
-
- var alerta = AlertasAtivos.FirstOrDefault(x =>
- x.Rover_ID == roverId &&
- x.Modulo == modulo &&
- x.Mod_ID == modId &&
- (severidade != null ? x.Severidade == severidade : true));
-
- if (alerta != null)
- {
- AlertasAtivos.Remove(alerta);
-
- if (ReferenceEquals(ToastAlerta, alerta))
- ToastAlerta = null;
-
- if (ReferenceEquals(AlertaSelecionado, alerta))
- AlertaSelecionado = null;
- }
-
- OnPropertyChanged(nameof(AlertasAtivos));
+ _toastTimer.Stop();
+ ToastAlerta = null;
}
public void MostrarToast(AlertaModel alerta)
@@ -147,47 +64,67 @@ namespace OperationControl.ViewModels.Views.Operacao
_toastTimer.Start();
}
- public void LimparToast()
+ public void AdicionarAlerta(string roverId, AgroBase.Models.Enums.T_Code modulo, SeveridadeAlerta severidade, string mensagem, string? modId = null)
{
- _toastTimer.Stop();
- ToastAlerta = null;
- }
-
- public void DefinirAlertas(params AlertaModel[] alertas)
- {
- if (!Application.Current.Dispatcher.CheckAccess())
+ App.Current.Dispatcher.BeginInvoke(new Action(() =>
{
- Application.Current.Dispatcher.BeginInvoke(new Action(() => DefinirAlertas(alertas)));
- return;
- }
+ var existente = AlertasAtivos.FirstOrDefault(x =>
+ x.Rover_ID == roverId &&
+ x.Modulo == modulo &&
+ x.Mod_ID == modId);
- AlertasAtivos.Clear();
+ if (existente == null)
+ {
+ var alerta = new AlertaModel
+ {
+ Rover_ID = roverId,
+ Modulo = modulo,
+ Mod_ID = modId,
+ Severidade = severidade,
+ Mensagem = mensagem,
+ Timestamp = DateTime.Now
+ };
- if (alertas != null)
- {
- foreach (var alerta in alertas)
AlertasAtivos.Add(alerta);
- }
-
- OnPropertyChanged(nameof(AlertasAtivos));
+ MostrarToast(alerta);
+ }
+ else
+ {
+ existente.Mensagem = mensagem;
+ existente.Severidade = severidade;
+ }
+ }));
}
- private void RecarregarAlerta(AlertaModel alerta)
+ public void RemoverAlerta(string roverId, AgroBase.Models.Enums.T_Code modulo, SeveridadeAlerta? severidade = null, string? modId = null)
{
- var idx = AlertasAtivos.IndexOf(alerta);
- if (idx >= 0)
+ App.Current.Dispatcher.BeginInvoke(new Action(() =>
{
- AlertasAtivos.RemoveAt(idx);
- AlertasAtivos.Insert(idx, alerta);
- }
+ var alerta = AlertasAtivos.FirstOrDefault(x =>
+ x.Rover_ID == roverId &&
+ x.Modulo == modulo &&
+ x.Mod_ID == modId &&
+ (severidade != null ? x.Severidade == severidade : true));
+
+ if (alerta != null)
+ AlertasAtivos.Remove(alerta);
+ }));
}
- private void OnPropertyChanged(string nome)
+ public void ClicarNoAlerta(AlertaModel alerta)
{
- PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nome));
+ if (alerta == null) return;
+ SelecionarAlerta(alerta);
}
+ public void ClicarNoToast()
+ {
+ var alerta = ToastAlerta;
+ if (alerta == null) return;
+ LimparToast();
+ SelecionarAlerta(alerta);
+ }
public void AtualizarListaAlertasRoverSelecionado(string rover_id)
{
@@ -244,6 +181,6 @@ namespace OperationControl.ViewModels.Views.Operacao
}
}
}
-
+
}
}
\ No newline at end of file
diff --git a/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoCenterViewModel.cs b/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoCenterViewModel.cs
index 86ec9ef23..7401a090d 100644
--- a/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoCenterViewModel.cs
+++ b/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoCenterViewModel.cs
@@ -1,14 +1,11 @@
using OperationControl.Controls;
using OperationControl.Models;
-using OperationControl.ViewModels.Views.Operacao.Diagnostico;
using System.ComponentModel;
namespace OperationControl.ViewModels.Views.Operacao
{
public class OperacaoCenterViewModel : INotifyPropertyChanged
{
- public DiagnosticoViewModel DiagnosticoVM { get; set; } = new DiagnosticoViewModel();
-
public OperacaoCenterViewModel()
{
diff --git a/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoRightViewModel.cs b/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoRightViewModel.cs
index f6bd4577a..0d4b1ff76 100644
--- a/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoRightViewModel.cs
+++ b/AgroBase/OperationControl/ViewModels/Views/Operacao/OperacaoRightViewModel.cs
@@ -24,7 +24,7 @@ namespace OperationControl.ViewModels.Views.Operacao
Rovers = new ObservableCollection();
ToggleCollapseCommand = new RelayCommand(_ => ToggleCollapse());
- SelecionarRoverCommand = new RelayCommand(p => SelecionarRover(p as RoverCardModel));
+ SelecionarRoverCommand = new RelayCommand(p => SelecionarRover((p as RoverCardModel).NumeroSerie));
SelecionarSecaoCommand = new RelayCommand(p =>
{
if (p is SecaoRightBar secao)
@@ -133,8 +133,9 @@ namespace OperationControl.ViewModels.Views.Operacao
IsCollapsed = !IsCollapsed;
}
- public void SelecionarRover(RoverCardModel rover)
+ public void SelecionarRover(string roverId)
{
+ var rover = Rovers.FirstOrDefault(x => x.NumeroSerie == roverId);
RoverSelecionado = rover;
if (RoverSelecionado != null)
diff --git a/AgroBase/OperationControl/ViewModels/Windows/DockWindowViewModel.cs b/AgroBase/OperationControl/ViewModels/Windows/DockWindowViewModel.cs
index 619405aee..375a18fd0 100644
--- a/AgroBase/OperationControl/ViewModels/Windows/DockWindowViewModel.cs
+++ b/AgroBase/OperationControl/ViewModels/Windows/DockWindowViewModel.cs
@@ -8,6 +8,7 @@ using OperationControl.Views.Operacao;
using AgroBase.Models.Operacoes;
using Newtonsoft.Json.Linq;
using OperationControl.ViewModels.Views.Operacao;
+using OperationControl.Controls;
namespace OperationControl.ViewModels
{
@@ -25,6 +26,8 @@ namespace OperationControl.ViewModels
public readonly OperacaoRightView _viewOperacaoRight;
public readonly OperacaoBottomView _viewOperacaoBottom;
+ public OperacaoBottomViewModel BottomVM => _viewOperacaoBottom?._vm;
+
private DockStep _currentStep;
public DockWindowViewModel()
@@ -56,7 +59,7 @@ namespace OperationControl.ViewModels
_viewOperacaoRight._vm.SalvarParametrosSolicitado += OnSalvarParametrosSolicitado;
_viewOperacaoBottom = new OperacaoBottomView();
- _viewOperacaoBottom._vm.AlertaSelecionadoChanged += OnAlertaSelecionadoChanged;
+ _viewOperacaoBottom._vm.SolicitarAbrirDiagnostico += AbrirDiagnosticoPeloAlerta;
// Commands
BackCommand = new RelayCommand(_ => GoBack(), _ => CanGoBack);
@@ -331,6 +334,7 @@ namespace OperationControl.ViewModels
CenterContent = _viewPreparacaoMapa;
BottomContent = _viewPreparacaoMapaBottom;
RightContent = CriarBotaoNextSimples();
+ CriarMarcadorBase(_viewPreparacaoMapa?.MapaPreparacao);
break;
case DockStep.ParametrizacaoRover:
@@ -339,6 +343,7 @@ namespace OperationControl.ViewModels
CenterContent = _viewOperacaoCenter;
RightContent = _viewOperacaoRight;
BottomContent = _viewOperacaoBottom;
+ CriarMarcadorBase(_viewOperacaoCenter?.MapaOperacao);
if (!string.IsNullOrWhiteSpace(_ultimoMapaCarregado))
_viewOperacaoCenter?.MapaOperacao?.LoadMapFile(_ultimoMapaCarregado);
@@ -391,12 +396,28 @@ namespace OperationControl.ViewModels
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?.MapControl?.LoadMapFile(caminhoArquivo);
+ _viewPreparacaoMapa?.MapaPreparacao?.LoadMapFile(caminhoArquivo);
MapaCarregado = true;
_viewPreparacaoMapaBottom?._vm.AtualizarProgresso(0, $"Mapa carregado: {System.IO.Path.GetFileName(caminhoArquivo)}");
}
@@ -516,26 +537,24 @@ namespace OperationControl.ViewModels
}
- private void OnAlertaSelecionadoChanged(AlertaModel alerta)
+ private void AbrirDiagnosticoPeloAlerta(AlertaModel alerta)
{
- if (alerta == null) return;
+ if (alerta == null)
+ return;
- AtualizarTopOperacaoAlerta(
- $"ALERTA {alerta.Rover_ID}",
- $"{alerta.Titulo}: {alerta.Mensagem}"
- );
-
- // depois você pode navegar para diagnostico, abrir popup, focar modulo, etc
+ _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.DataContext as OperacaoBottomViewModel)?.AdicionarAlerta(roverId, modulo, severidade, mensagem, modId);
+ _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.DataContext as OperacaoBottomViewModel)?.RemoverAlerta(roverId, modulo, severidade, modId);
+ _viewOperacaoBottom?._vm?.RemoverAlerta(roverId, modulo, severidade, modId);
}
@@ -640,8 +659,8 @@ namespace OperationControl.ViewModels
r.InfestacaoPercentual = obj.Atuador?.PercentualErvasTerreno ?? 0;
});
- _viewOperacaoCenter?._vm?.DiagnosticoVM?.AtualizarDados(rover);
- _viewOperacaoCenter?.AtualizarGraficoDiagnostico(_viewOperacaoCenter?._vm?.DiagnosticoVM);
+ _viewOperacaoCenter?.Diagnostico?._vm?.AtualizarDados(rover);
+ _viewOperacaoCenter?.Diagnostico?.AtualizarGraficos();
}
}
@@ -657,8 +676,8 @@ namespace OperationControl.ViewModels
{
if (!VariaveisControleOperacao.BaseEmFoco)
{
- _viewOperacaoCenter?.PararStreamCameraFrontal();
- _viewOperacaoCenter?.PararStreamCameraErvas();
+ _viewOperacaoCenter?.Monitoramento?.PararStreamCameraFrontal();
+ _viewOperacaoCenter?.Monitoramento?.PararStreamCameraErvas();
VariaveisControleOperacao.EnviarComandoIniciarUDP(VariaveisControleOperacao.RoverEmFoco?.IP, false);
}
VariaveisControleOperacao.RoverEmFoco?.RuasPercorrer?.Clear();
@@ -678,8 +697,8 @@ namespace OperationControl.ViewModels
AtualizarDadosTela(VariaveisControleOperacao.RoverEmFoco);
VariaveisControleOperacao.RequisitarParametrosOperacao();
- _viewOperacaoCenter?.IniciarStreamCameraFrontal();
- _viewOperacaoCenter?.IniciarStreamCameraErvas();
+ _viewOperacaoCenter?.Monitoramento?.IniciarStreamCameraFrontal();
+ _viewOperacaoCenter?.Monitoramento?.IniciarStreamCameraErvas();
VariaveisControleOperacao.EnviarComandoIniciarUDP(VariaveisControleOperacao.RoverEmFoco?.IP, true);
_viewOperacaoCenter?._vm?.SelecionarRoverLista(rover);
diff --git a/AgroBase/OperationControl/Views/Operacao/DiagnosticoView.xaml b/AgroBase/OperationControl/Views/Operacao/DiagnosticoView.xaml
new file mode 100644
index 000000000..8a3be1c80
--- /dev/null
+++ b/AgroBase/OperationControl/Views/Operacao/DiagnosticoView.xaml
@@ -0,0 +1,678 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/AgroBase/OperationControl/Views/Operacao/DiagnosticoView.xaml.cs b/AgroBase/OperationControl/Views/Operacao/DiagnosticoView.xaml.cs
new file mode 100644
index 000000000..d1418052e
--- /dev/null
+++ b/AgroBase/OperationControl/Views/Operacao/DiagnosticoView.xaml.cs
@@ -0,0 +1,66 @@
+using OperationControl.ViewModels.Views.Operacao.Diagnostico;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace OperationControl.Views.Operacao
+{
+ ///
+ /// Interaction logic for DiagnosticoView.xaml
+ ///
+ public partial class DiagnosticoView : System.Windows.Controls.UserControl
+ {
+ public DiagnosticoViewModel _vm;
+ public DiagnosticoView()
+ {
+ InitializeComponent();
+ _vm = new DiagnosticoViewModel();
+ DataContext = _vm;
+ }
+
+ public void AtualizarGraficos()
+ {
+ if (pltSaude_Acompanhamento == null)
+ return;
+
+ var plot = pltSaude_Acompanhamento.Plot;
+ plot.Clear();
+
+ bool temSeries = false;
+
+ foreach (var serie in _vm.SeriesGrafico)
+ {
+ if (serie.Valores.Count == 0)
+ continue;
+
+ double[] ys = serie.Valores.ToArray();
+ double[] xs = Enumerable.Range(0, ys.Length).Select(i => (double)i).ToArray();
+
+ var scatter = plot.Add.Scatter(xs, ys);
+ scatter.LegendText = string.IsNullOrWhiteSpace(serie.Unidade)
+ ? serie.Label
+ : $"{serie.Label} ({serie.Unidade})";
+
+ temSeries = true;
+ }
+
+ if (temSeries)
+ plot.ShowLegend(ScottPlot.Alignment.UpperLeft);
+
+ plot.Axes.AutoScale();
+ pltSaude_Acompanhamento.Refresh();
+ }
+
+ }
+}
diff --git a/AgroBase/OperationControl/Views/Operacao/MonitoramentoView.xaml b/AgroBase/OperationControl/Views/Operacao/MonitoramentoView.xaml
new file mode 100644
index 000000000..ebb10f6df
--- /dev/null
+++ b/AgroBase/OperationControl/Views/Operacao/MonitoramentoView.xaml
@@ -0,0 +1,219 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/AgroBase/OperationControl/Views/Operacao/MonitoramentoView.xaml.cs b/AgroBase/OperationControl/Views/Operacao/MonitoramentoView.xaml.cs
new file mode 100644
index 000000000..518cbd30c
--- /dev/null
+++ b/AgroBase/OperationControl/Views/Operacao/MonitoramentoView.xaml.cs
@@ -0,0 +1,99 @@
+using OperationControl.Controls;
+using OperationControl.Models;
+using OperationControl.ViewModels.Views.Operacao.Monitoramento;
+using System.Windows.Controls;
+
+namespace OperationControl.Views.Operacao
+{
+ ///
+ /// Interaction logic for MonitoramentoView.xaml
+ ///
+ public partial class MonitoramentoView : System.Windows.Controls.UserControl
+ {
+ public MonitoramentoViewModel _vm;
+
+ private TcpVideoReceiver videoFront;
+ private TcpVideoReceiver videoWeed;
+
+ public MonitoramentoView()
+ {
+ InitializeComponent();
+ _vm = new MonitoramentoViewModel();
+ DataContext = _vm;
+
+ videoFront = new TcpVideoReceiver(5000, imgVideoFront);
+ videoWeed = new TcpVideoReceiver(5002, imgVideoWeed);
+
+ cmbCameraFrontalFrameTipo.Items.Clear();
+ foreach (var m in Enum.GetNames(typeof(AgroBase.Models.Enums.TipoFrameCamera)))
+ cmbCameraFrontalFrameTipo.Items.Add(m);
+ cmbCameraFrontalFrameTipo.SelectedIndex = 0;
+
+ cmbCameraTraseiraFrameTipo.Items.Clear();
+ foreach (var m in Enum.GetNames(typeof(AgroBase.Models.Enums.TipoFrameCamera)))
+ cmbCameraTraseiraFrameTipo.Items.Add(m);
+ cmbCameraTraseiraFrameTipo.SelectedIndex = 0;
+ }
+
+ #region MAPA
+
+ private void MAP_MarkerClicked(object? sender, MapMarkerManager.MarkerClickedEventArgs e)
+ {
+
+ }
+
+ private void MAP_StreetMapClicked(object? sender, MapViewControl.StreetMapClickedEventArgs e)
+ {
+
+ }
+
+ #endregion
+
+ #region CAMERA FRONTAL
+
+ private void cmbCameraFrontalFrameTipo_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ if (VariaveisControleOperacao.SelectedRoverId == VariaveisControleOperacao.BaseMarkerID) return;
+ PararStreamCameraFrontal();
+ IniciarStreamCameraFrontal();
+ }
+
+ public void IniciarStreamCameraFrontal()
+ {
+ videoFront.Iniciar();
+ VariaveisControleOperacao.EnviarComandoTransmissaoVideo(AgroBase.Models.Enums.T_Code.Snr, true, ((AgroBase.Models.Enums.TipoFrameCamera)cmbCameraFrontalFrameTipo.SelectedIndex));
+ }
+
+ public void PararStreamCameraFrontal(bool finalizar = false)
+ {
+ videoFront.Parar();
+ VariaveisControleOperacao.EnviarComandoTransmissaoVideo(AgroBase.Models.Enums.T_Code.Snr, false, ((AgroBase.Models.Enums.TipoFrameCamera)cmbCameraFrontalFrameTipo.SelectedIndex));
+ }
+
+ #endregion
+
+ #region CAMERA ERVAS
+
+ private void cmbCameraTraseiraFrameTipo_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ if (VariaveisControleOperacao.SelectedRoverId == VariaveisControleOperacao.BaseMarkerID) return;
+ PararStreamCameraErvas();
+ IniciarStreamCameraErvas();
+ }
+
+ public void IniciarStreamCameraErvas()
+ {
+ videoWeed.Iniciar();
+ VariaveisControleOperacao.EnviarComandoTransmissaoVideo(AgroBase.Models.Enums.T_Code.Cam, true, ((AgroBase.Models.Enums.TipoFrameCamera)cmbCameraTraseiraFrameTipo.SelectedIndex));
+ }
+
+ public void PararStreamCameraErvas(bool finalizar = false)
+ {
+ videoWeed.Parar();
+ VariaveisControleOperacao.EnviarComandoTransmissaoVideo(AgroBase.Models.Enums.T_Code.Cam, false, ((AgroBase.Models.Enums.TipoFrameCamera)cmbCameraTraseiraFrameTipo.SelectedIndex));
+ }
+
+ #endregion
+
+ }
+}
diff --git a/AgroBase/OperationControl/Views/Operacao/OperacaoBottomView.xaml b/AgroBase/OperationControl/Views/Operacao/OperacaoBottomView.xaml
index d6afee3b7..a35bf5620 100644
--- a/AgroBase/OperationControl/Views/Operacao/OperacaoBottomView.xaml
+++ b/AgroBase/OperationControl/Views/Operacao/OperacaoBottomView.xaml
@@ -134,70 +134,5 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/AgroBase/OperationControl/Views/Operacao/OperacaoBottomView.xaml.cs b/AgroBase/OperationControl/Views/Operacao/OperacaoBottomView.xaml.cs
index e2f0362ec..94243b28d 100644
--- a/AgroBase/OperationControl/Views/Operacao/OperacaoBottomView.xaml.cs
+++ b/AgroBase/OperationControl/Views/Operacao/OperacaoBottomView.xaml.cs
@@ -1,6 +1,5 @@
using OperationControl.Models;
using OperationControl.ViewModels.Views.Operacao;
-using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
namespace OperationControl.Views.Operacao
@@ -30,39 +29,8 @@ namespace OperationControl.Views.Operacao
{
if (sender is Border border && border.DataContext is AlertaModel alerta)
{
- _vm?.SelecionarAlerta(alerta);
-
- System.Windows.MessageBox.Show(
- $"Rover: {alerta.Rover_ID}\n" +
- $"Módulo: {alerta.Modulo}\n" +
- $"Severidade: {alerta.Severidade}\n" +
- $"Mensagem: {alerta.Mensagem}\n\n" +
- $"Aqui depois podemos navegar para a ação correspondente.",
- "Alerta selecionado",
- MessageBoxButton.OK,
- MessageBoxImage.Information);
+ _vm?.ClicarNoAlerta(alerta);
}
}
-
- private void ToastAlerta_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
- {
- var alerta = _vm?.ToastAlerta;
- if (alerta == null)
- return;
-
- _vm.LimparToast();
- _vm.SelecionarAlerta(alerta);
-
- System.Windows.MessageBox.Show(
- $"Toast clicado\n\n" +
- $"Rover: {alerta.Rover_ID}\n" +
- $"Módulo: {alerta.Modulo}\n" +
- $"Severidade: {alerta.Severidade}\n" +
- $"Mensagem: {alerta.Mensagem}\n\n" +
- $"Aqui depois podemos disparar a navegação ou foco no diagnóstico.",
- "Toast de alerta",
- MessageBoxButton.OK,
- MessageBoxImage.Information);
- }
}
}
diff --git a/AgroBase/OperationControl/Views/Operacao/OperacaoCenterView.xaml b/AgroBase/OperationControl/Views/Operacao/OperacaoCenterView.xaml
index 15f9bbd3e..a2f148bca 100644
--- a/AgroBase/OperationControl/Views/Operacao/OperacaoCenterView.xaml
+++ b/AgroBase/OperationControl/Views/Operacao/OperacaoCenterView.xaml
@@ -5,6 +5,7 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:OperationControl.Views.Operacao"
xmlns:controls="clr-namespace:OperationControl.Controls"
+ xmlns:views="clr-namespace:OperationControl.Views.Operacao"
xmlns:scott="clr-namespace:ScottPlot.WPF;assembly=ScottPlot.WPF"
mc:Ignorable="d"
d:DesignHeight="450"
@@ -12,46 +13,6 @@
-
-
-
@@ -65,826 +26,12 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/AgroBase/OperationControl/Views/Operacao/OperacaoCenterView.xaml.cs b/AgroBase/OperationControl/Views/Operacao/OperacaoCenterView.xaml.cs
index 0ca591391..067774a0e 100644
--- a/AgroBase/OperationControl/Views/Operacao/OperacaoCenterView.xaml.cs
+++ b/AgroBase/OperationControl/Views/Operacao/OperacaoCenterView.xaml.cs
@@ -2,6 +2,7 @@
using OperationControl.Models;
using OperationControl.ViewModels.Views.Operacao;
using OperationControl.ViewModels.Views.Operacao.Diagnostico;
+using OperationControl.ViewModels.Views.Operacao.Monitoramento;
using System.Windows.Controls;
namespace OperationControl.Views.Operacao
@@ -12,70 +13,16 @@ namespace OperationControl.Views.Operacao
public partial class OperacaoCenterView : System.Windows.Controls.UserControl
{
public OperacaoCenterViewModel _vm;
+ public MonitoramentoView Monitoramento => areaMonitor;
+ public DiagnosticoView Diagnostico => areaDiagnostico;
public OperacaoCenterView()
{
InitializeComponent();
_vm = new OperacaoCenterViewModel();
DataContext = _vm;
-
- videoFront = new TcpVideoReceiver(5000, imgVideoFront);
- videoWeed = new TcpVideoReceiver(5002, imgVideoWeed);
}
-
-
- private TcpVideoReceiver videoFront;
- private TcpVideoReceiver videoWeed;
-
- #region CAMERA FRONTAL
-
- private void cmbCameraFrontalFrameTipo_SelectionChanged(object sender, SelectionChangedEventArgs e)
- {
- if (VariaveisControleOperacao.SelectedRoverId == VariaveisControleOperacao.BaseMarkerID) return;
- PararStreamCameraFrontal();
- IniciarStreamCameraFrontal();
- }
-
- public void IniciarStreamCameraFrontal()
- {
- videoFront.Iniciar();
- var t = ((AgroBase.Models.Enums.TipoFrameCamera)cmbCameraFrontalFrameTipo.SelectedIndex);
- VariaveisControleOperacao.EnviarComandoTransmissaoVideo(AgroBase.Models.Enums.T_Code.Snr, true, AgroBase.Models.Enums.TipoFrameCamera.Rgb);
- }
-
- public void PararStreamCameraFrontal(bool finalizar = false)
- {
- videoFront.Parar();
- VariaveisControleOperacao.EnviarComandoTransmissaoVideo(AgroBase.Models.Enums.T_Code.Snr, false, ((AgroBase.Models.Enums.TipoFrameCamera)cmbCameraFrontalFrameTipo.SelectedIndex));
- }
-
- #endregion
-
- #region CAMERA ERVAS
-
- private void cmbCameraTraseiraFrameTipo_SelectionChanged(object sender, SelectionChangedEventArgs e)
- {
- if (VariaveisControleOperacao.SelectedRoverId == VariaveisControleOperacao.BaseMarkerID) return;
- PararStreamCameraErvas();
- IniciarStreamCameraErvas();
- }
-
- public void IniciarStreamCameraErvas()
- {
- videoWeed.Iniciar();
- VariaveisControleOperacao.EnviarComandoTransmissaoVideo(AgroBase.Models.Enums.T_Code.Cam, true, ((AgroBase.Models.Enums.TipoFrameCamera)cmbCameraTraseiraFrameTipo.SelectedIndex));
- }
-
- public void PararStreamCameraErvas(bool finalizar = false)
- {
- videoWeed.Parar();
- VariaveisControleOperacao.EnviarComandoTransmissaoVideo(AgroBase.Models.Enums.T_Code.Cam, false, ((AgroBase.Models.Enums.TipoFrameCamera)cmbCameraTraseiraFrameTipo.SelectedIndex));
- }
-
- #endregion
-
-
private void MAP_MarkerClicked(object? sender, MapMarkerManager.MarkerClickedEventArgs e)
{
_vm.ProcessarMarkerClicked(e);
@@ -86,28 +33,5 @@ namespace OperationControl.Views.Operacao
_vm.ProcessarStreetMapClicked(e);
}
- public void AtualizarGraficoDiagnostico(DiagnosticoViewModel vm)
- {
- if (vm == null || pltSaude_Acompanhamento == null)
- return;
-
- var plot = pltSaude_Acompanhamento.Plot;
- plot.Clear();
-
- foreach (var serie in vm.SeriesGrafico)
- {
- if (serie.Valores.Count == 0)
- continue;
-
- double[] ys = serie.Valores.ToArray();
- double[] xs = Enumerable.Range(0, ys.Length).Select(i => (double)i).ToArray();
-
- plot.Add.Scatter(xs, ys);
- }
-
- plot.Axes.AutoScale();
- pltSaude_Acompanhamento.Refresh();
- }
-
}
}
diff --git a/AgroBase/OperationControl/Views/PreparacaoMapa/PreparacaoMapaView.xaml.cs b/AgroBase/OperationControl/Views/PreparacaoMapa/PreparacaoMapaView.xaml.cs
index 13fcc9ba5..a2e8effea 100644
--- a/AgroBase/OperationControl/Views/PreparacaoMapa/PreparacaoMapaView.xaml.cs
+++ b/AgroBase/OperationControl/Views/PreparacaoMapa/PreparacaoMapaView.xaml.cs
@@ -21,8 +21,6 @@ namespace OperationControl.Views
///
public partial class PreparacaoMapaView : System.Windows.Controls.UserControl
{
- public MapViewControl MapControl => MapaPreparacao;
-
public PreparacaoMapaView()
{
InitializeComponent();
diff --git a/AgroBase/OperationControl/Windows/DockWindow.xaml b/AgroBase/OperationControl/Windows/DockWindow.xaml
index 3f6246069..6e7d1f4ed 100644
--- a/AgroBase/OperationControl/Windows/DockWindow.xaml
+++ b/AgroBase/OperationControl/Windows/DockWindow.xaml
@@ -4,92 +4,145 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:OperationControl.Windows"
- xmlns:localHelpers="clr-namespace:OperationControl.Helpers"
+ xmlns:conv="clr-namespace:OperationControl.Converters"
mc:Ignorable="d"
Title="DockWindow" Height="1025" Width="1920" WindowStartupLocation="CenterScreen" WindowState="Maximized">
-
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+ Cursor="Hand"
+ Visibility="{Binding BottomVM.ToastAlerta, Converter={StaticResource NullToVisibilityConverter}}"
+ MouseLeftButtonUp="ToastAlerta_MouseLeftButtonUp">
-
-
-
-
+
+
-
-
-
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/AgroBase/OperationControl/Windows/DockWindow.xaml.cs b/AgroBase/OperationControl/Windows/DockWindow.xaml.cs
index 509cb5828..134dee079 100644
--- a/AgroBase/OperationControl/Windows/DockWindow.xaml.cs
+++ b/AgroBase/OperationControl/Windows/DockWindow.xaml.cs
@@ -1,17 +1,6 @@
using OperationControl.ViewModels;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
using System.Windows;
-using System.Windows.Controls;
-using System.Windows.Data;
-using System.Windows.Documents;
using System.Windows.Input;
-using System.Windows.Media;
-using System.Windows.Media.Imaging;
-using System.Windows.Shapes;
namespace OperationControl.Windows
{
@@ -27,5 +16,10 @@ namespace OperationControl.Windows
_vm = new DockWindowViewModel();
DataContext = _vm;
}
+
+ private void ToastAlerta_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
+ {
+ _vm.BottomVM?.ClicarNoToast();
+ }
}
}