2211 lines
105 KiB
C#
2211 lines
105 KiB
C#
using System.Windows;
|
|
|
|
using OperationControl.Controls;
|
|
using OperationControl.Models;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Media;
|
|
using LibVLCSharp.Shared;
|
|
using System.Windows.Input;
|
|
using System.IO;
|
|
using MediaPlayer = LibVLCSharp.Shared.MediaPlayer;
|
|
using ComboBox = System.Windows.Controls.ComboBox;
|
|
using Application = System.Windows.Application;
|
|
using MessageBox = System.Windows.MessageBox;
|
|
using Brush = System.Windows.Media.Brush;
|
|
using Brushes = System.Windows.Media.Brushes;
|
|
using Label = System.Windows.Controls.Label;
|
|
using Newtonsoft.Json.Linq;
|
|
using AgroBase.Models.Operadores;
|
|
using System.Collections.ObjectModel;
|
|
using System.ComponentModel;
|
|
using System.Windows.Threading;
|
|
|
|
namespace OperationControl.Windows
|
|
{
|
|
/// <summary>
|
|
/// Interaction logic for MainWindow.xaml
|
|
/// </summary>
|
|
public partial class MainWindow : Window, INotifyPropertyChanged
|
|
{
|
|
private LibVLC _libVLC;
|
|
private MediaPlayer _playerFront;
|
|
private MediaPlayer _playerWeed;
|
|
private Media _mediaFront;
|
|
private Media _mediaWeed;
|
|
|
|
public MainWindow()
|
|
{
|
|
InitializeComponent();
|
|
|
|
cmbDir_Direcao.Items.Clear();
|
|
cmbDir_Direcao.Items.Add("Parado");
|
|
cmbDir_Direcao.Items.Add("Direita");
|
|
cmbDir_Direcao.Items.Add("Esquerda");
|
|
cmbDir_Direcao.SelectedIndex = 0;
|
|
|
|
cmbDir_Movimento.Items.Clear();
|
|
foreach (var m in Enum.GetNames(typeof(AgroBase.Models.Enums.TipoMovimentoDirecional)))
|
|
cmbDir_Movimento.Items.Add(m);
|
|
cmbDir_Movimento.SelectedIndex = 0;
|
|
|
|
cmbNpc_CoolerModo.Items.Clear();
|
|
cmbNpc_CoolerModo.Items.Add("Automático");
|
|
cmbNpc_CoolerModo.Items.Add("Manual");
|
|
cmbNpc_CoolerModo.SelectedIndex = 0;
|
|
|
|
AtualizarListaDispositivos(new List<string>() { VariaveisControleOperacao.SelectedRoverId });
|
|
|
|
|
|
graficoAcompanhamento = new GraficoModel(pltSaude_Acompanhamento);
|
|
|
|
DataContext = this;
|
|
|
|
|
|
//DataContext = this;
|
|
|
|
// atualizar as caixas
|
|
//BBoxes3D.SetBboxes(new[]
|
|
//{
|
|
// new AgroBase.Models.LivoxBboxModel{ cx=1.2, cy=0.5, cz=0.4, d=0.6, w=0.4, h=0.8 },
|
|
// new AgroBase.Models.LivoxBboxModel{ cx=3.0, cy=-0.7, cz=0.6, d=0.8, w=0.5, h=1.2 },
|
|
//});
|
|
|
|
|
|
// Opções focadas em baixa latência
|
|
_libVLC = new LibVLC(
|
|
"--network-caching=1000", // ms (ajusta depois)
|
|
"--clock-jitter=0",
|
|
"--clock-synchro=0"
|
|
);
|
|
|
|
// Player da câmera frontal
|
|
_playerFront = new MediaPlayer(_libVLC);
|
|
VideoFront.MediaPlayer = _playerFront;
|
|
_playerWeed = new MediaPlayer(_libVLC);
|
|
VideoWeed.MediaPlayer = _playerWeed;
|
|
|
|
|
|
Loaded += MainWindow_Loaded;
|
|
Closed += MainWindow_Closed;
|
|
|
|
|
|
_toastTimer = new DispatcherTimer
|
|
{
|
|
Interval = TimeSpan.FromSeconds(6) // tempo do toast na tela
|
|
};
|
|
_toastTimer.Tick += (s, e) =>
|
|
{
|
|
_toastTimer.Stop();
|
|
ToastAlerta = null;
|
|
};
|
|
}
|
|
|
|
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
|
|
{
|
|
|
|
}
|
|
|
|
private void MainWindow_Closed(object? sender, EventArgs e)
|
|
{
|
|
PararStreamCameraFrontal(true);
|
|
PararStreamCameraErvas(true);
|
|
_libVLC?.Dispose();
|
|
}
|
|
|
|
#region DISPOSITIVOS
|
|
|
|
public void AtualizarListaDispositivos(List<string> dispositivos)
|
|
{
|
|
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
|
|
{
|
|
try
|
|
{
|
|
cmbDispositivo.Items.Clear();
|
|
foreach (var d in dispositivos)
|
|
{
|
|
cmbDispositivo.Items.Add(d);
|
|
if (!MAP.markers.Added(d))
|
|
{
|
|
if (d == VariaveisControleOperacao.BaseMarkerID)
|
|
{
|
|
MAP.markers.AddMarker(
|
|
d,
|
|
true,
|
|
lat: Variaveis.GpsService?.UltimaLeitura?.Latitude ?? 0,
|
|
lon: Variaveis.GpsService?.UltimaLeitura?.Longitude ?? 0,
|
|
heading: Variaveis.GpsService?.UltimaLeitura?.OrientacaoReal ?? 0,
|
|
label: "Base"
|
|
);
|
|
}
|
|
else
|
|
{
|
|
var rover = VariaveisControleOperacao.RoversNaRede.FirstOrDefault(x => x.RoverId == d);
|
|
if (rover != null)
|
|
{
|
|
MAP.markers.AddMarker(
|
|
d,
|
|
false,
|
|
lat: rover.DadosLeitura?.Gnss?.Latitude ?? 0,
|
|
lon: rover.DadosLeitura?.Gnss?.Longitude ?? 0,
|
|
heading: rover.DadosLeitura?.Gnss?.OrientacaoReal ?? 0
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
int idx_selected = dispositivos.IndexOf(VariaveisControleOperacao.SelectedRoverId);
|
|
if (idx_selected > -1)
|
|
cmbDispositivo.SelectedIndex = idx_selected;
|
|
}
|
|
catch (Exception exUi)
|
|
{
|
|
Variaveis.MostrarLog($"Erro ao atualizar UI lista dispositivos: {exUi.Message}");
|
|
}
|
|
}));
|
|
}
|
|
|
|
private void cmbDispositivo_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
|
|
{
|
|
var selecionado = ((ComboBox)sender).SelectedItem;
|
|
if (selecionado == null) return;
|
|
bool dados_base = selecionado == VariaveisControleOperacao.BaseMarkerID;
|
|
if (dados_base && !VariaveisControleOperacao.BaseEmFoco)
|
|
{
|
|
PararStreamCameraFrontal();
|
|
PararStreamCameraErvas();
|
|
}
|
|
|
|
VariaveisControleOperacao.SelectedRoverId = selecionado.ToString();
|
|
MAP.markers.SetMarkerFocused(selecionado.ToString(), true);
|
|
AtualizarDadosTela_Telemetria(selecionado.ToString());
|
|
|
|
brdResumo.IsEnabled = !dados_base;
|
|
brdDiagnostico.IsEnabled = !dados_base;
|
|
brdStatusModulo.IsEnabled = !dados_base;
|
|
brdControle.IsEnabled = !dados_base;
|
|
brdAjustesOperacao.IsEnabled = !dados_base;
|
|
if (!dados_base)
|
|
{
|
|
btnParametros_Atualizar_Click(sender, e);
|
|
IniciarStreamCameraFrontal();
|
|
IniciarStreamCameraErvas();
|
|
}
|
|
}
|
|
|
|
public void LimparDadosTela_Telemetria(string rover_id)
|
|
{
|
|
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
|
|
{
|
|
try
|
|
{
|
|
if (!string.IsNullOrEmpty(rover_id))
|
|
{
|
|
//MAP.markers.RemoveMarker(rover_id);
|
|
//cmbDispositivo.Items.Remove(rover_id);
|
|
}
|
|
else
|
|
{
|
|
//cmbDispositivo.SelectedIndex = 0;
|
|
}
|
|
}
|
|
catch (Exception exUi)
|
|
{
|
|
Variaveis.MostrarLog($"Erro ao atualizar UI telemetria (clear): {exUi.Message}");
|
|
}
|
|
}));
|
|
}
|
|
|
|
public void AtualizarDadosTela_Telemetria(string rover_id)
|
|
{
|
|
bool dados_base = rover_id == VariaveisControleOperacao.BaseMarkerID;
|
|
var rover = VariaveisControleOperacao.RoversNaRede.FirstOrDefault(x => x.RoverId == rover_id);
|
|
var dados_leitura = rover?.DadosLeitura;
|
|
if (dados_base)
|
|
{
|
|
MAP.markers.UpdateMarkerPosition(rover_id, lat: Variaveis.GpsService?.UltimaLeitura?.Latitude, lon: Variaveis.GpsService?.UltimaLeitura?.Longitude, heading: Variaveis.GpsService?.UltimaLeitura?.OrientacaoReal);
|
|
}
|
|
else if (dados_leitura != null)
|
|
{
|
|
var simulacao = dados_leitura.Controle?.SimulacaoMPC?.Select(x => new double[] { x.longitude, x.latitude })?.ToList();
|
|
MAP.markers.UpdateMarkerPosition(rover_id, lat: dados_leitura.Gnss?.Latitude, lon: dados_leitura.Gnss?.Longitude, heading: dados_leitura.Gnss?.OrientacaoReal, predict: simulacao);
|
|
MAP.markers.UpdateMarkerInfo(rover_id, status: dados_leitura.Operacao.Status);
|
|
}
|
|
|
|
if (rover != null && dados_leitura?.ModulosSaude != null)
|
|
{
|
|
SeveridadeAlerta DeParaStatus(AgroBase.Models.Enums.StatusModulo status, bool mandatorio)
|
|
{
|
|
switch (status)
|
|
{
|
|
case AgroBase.Models.Enums.StatusModulo.Operante:
|
|
return SeveridadeAlerta.Info;
|
|
case AgroBase.Models.Enums.StatusModulo.Alerta:
|
|
return SeveridadeAlerta.Warning;
|
|
case AgroBase.Models.Enums.StatusModulo.Falha:
|
|
return (mandatorio) ? SeveridadeAlerta.Critical : SeveridadeAlerta.Error;
|
|
case AgroBase.Models.Enums.StatusModulo.Conectado:
|
|
return (mandatorio) ? SeveridadeAlerta.Warning : SeveridadeAlerta.Info;
|
|
case AgroBase.Models.Enums.StatusModulo.Desconectado:
|
|
return (mandatorio) ? SeveridadeAlerta.Critical : SeveridadeAlerta.Error;
|
|
default:
|
|
return SeveridadeAlerta.Info;
|
|
}
|
|
}
|
|
|
|
foreach (var mod in dados_leitura.ModulosSaude)
|
|
{
|
|
if (mod.saude_individual.Any())
|
|
{
|
|
foreach (var ind in mod.saude_individual)
|
|
{
|
|
if (ind.status != AgroBase.Models.Enums.StatusModulo.Operante)
|
|
{
|
|
AdicionarAlerta(rover.RoverId, mod.modulo, DeParaStatus(ind.status, ind.em_uso), string.Join(", ", ind.motivos), Mod_ID: ind.label);
|
|
}
|
|
else
|
|
{
|
|
RemoverAlerta(rover.RoverId, mod.modulo, Mod_ID: ind.label);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (mod.status != AgroBase.Models.Enums.StatusModulo.Operante)
|
|
{
|
|
AdicionarAlerta(rover.RoverId, mod.modulo, DeParaStatus(mod.status, rover.ModulosMandatorios?.Any(x => x.Dispositivo == mod.modulo && x.Mandatorio) ?? false), string.Join(", ", mod.motivos));
|
|
}
|
|
else
|
|
{
|
|
RemoverAlerta(rover.RoverId, mod.modulo);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (rover_id != VariaveisControleOperacao.SelectedRoverId) return;
|
|
|
|
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
|
|
{
|
|
try
|
|
{
|
|
if (rover_id == VariaveisControleOperacao.BaseMarkerID)
|
|
{
|
|
Variaveis.MostrarLog($"Atualizando dados da tela para a base");
|
|
|
|
lblDispositivos_Status.Content = VariaveisControleOperacao.StatusBase.ToString();
|
|
AplicarStatusModuloNaLabel(lblDispositivos_Status, VariaveisControleOperacao.StatusBase, true, false);
|
|
AtualizarDadosTela_GNSS(Variaveis.GpsService?.UltimaLeitura?.ToGnssModel() ?? new AgroBase.Models.Operacoes.OperacaoParametrosDadosGNSSModel(), marker_id: VariaveisControleOperacao.BaseMarkerID);
|
|
AtualizarDadosTela_Heading(Variaveis.GpsService?.UltimaLeitura?.AnguloCarroDefinido ?? 0);
|
|
}
|
|
else
|
|
{
|
|
if (dados_leitura == null) return;
|
|
|
|
Variaveis.MostrarLog($"Atualizando dados da tela para o dispositivo {rover_id}");
|
|
lblDispositivos_Status.Content = (rover?.DadosLeitura?.StatusRover ?? AgroBase.Models.Enums.StatusModulo.Desconectado).ToString();
|
|
AplicarStatusModuloNaLabel(lblDispositivos_Status, rover?.DadosLeitura?.StatusRover ?? AgroBase.Models.Enums.StatusModulo.Desconectado, true, false);
|
|
AtualizarDadosTela_Diagnosticos(rover);
|
|
AtualizarDadosTela_Resumo_Conexao(dados_leitura);
|
|
if (dados_leitura.Trajetoria != null)
|
|
AtualizarDadosTela_Resumo(dados_leitura);
|
|
if (dados_leitura.Gnss != null)
|
|
AtualizarDadosTela_GNSS(dados_leitura.Gnss, marker_id: rover_id);
|
|
if (dados_leitura.Controle != null)
|
|
AtualizarDadosTela_Controle(dados_leitura.Controle, dados_leitura.Direcional.AnguloMedio, dados_leitura.Movimentacao.VelocidadeMediaMs, dados_leitura.Operacao.Emergencia, !dados_leitura.Operacao.Iniciada, dados_leitura.Operacao.Status == AgroBase.Models.Enums.StatusOperacao.Calibrando);
|
|
//if (rover.Value.Controle != null)
|
|
// AtualizarDadosTela_ParametrosOperacao(rover.Value.Controle);
|
|
if (dados_leitura.Trajetoria != null)
|
|
AtualizarDadosTela_Mapa(dados_leitura.Trajetoria);
|
|
if (dados_leitura.Gnss != null)
|
|
AtualizarDadosTela_Heading(dados_leitura.Gnss.OrientacaoReal, dados_leitura.Operacao.Modo == AgroBase.Models.Enums.ModoOperacao.Manual ? double.NaN : dados_leitura.Trajetoria.AnguloCaminho);
|
|
if (dados_leitura.Imu != null)
|
|
AtualizarDadosTela_IMU(dados_leitura.Imu.InclinacaoLateral, dados_leitura.Imu.InclinacaoFrontal);
|
|
if (rover.Controle != null)
|
|
AtualizarDadosTela_Pulverizador(dados_leitura);
|
|
if (dados_leitura.LivoxLidar != null)
|
|
AtualizarDadostela_LIDAR(dados_leitura.LivoxLidar.bboxes);
|
|
|
|
}
|
|
}
|
|
catch (Exception exUi)
|
|
{
|
|
Variaveis.MostrarLog($"Erro ao atualizar UI telemetria (set): {exUi.Message}");
|
|
}
|
|
}));
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
#region RESUMO OPERACIONAL
|
|
|
|
public void AtualizarDadosTela_Resumo(AgroBase.Models.Operacoes.OperacaoParametrosDadosModel dados)
|
|
{
|
|
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
|
|
{
|
|
try
|
|
{
|
|
pgbResumo_RuaAtual.Value = dados.Trajetoria.PercentualRuaAtual;
|
|
lblResumo_RuaAtual.Content = $"{dados.Trajetoria.CorredorAtual.DistanciaPercorridaCorredor:0.00} m / {dados.Trajetoria.CorredorAtual.DistanciaTotal:0.00} m ({dados.Trajetoria.CorredorAtual.Idx + 1})";
|
|
pgbResumo_AreaTotal.Value = dados.Trajetoria.PercentualOperacao;
|
|
lblResumo_AreaTotal.Content = $"{dados.Trajetoria.DistanciaPercorrida:0.00} m / {dados.Trajetoria.DistanciaTotal:0.00} m";
|
|
pgbResumo_Bateria.Value = dados.Bateria.PercentualBateria;
|
|
lblResumo_Bateria.Content = $"{dados.Bateria.TensaoInstantanea:0.00} V ({TimeSpan.FromMinutes(dados.Bateria.TempoEstimadoRestanteMinutos).ToString(@"dd\.hh\:mm\:ss")} {dados.Bateria.DistanciaEstimadaRestanteMetros:0.00} m)";
|
|
pgbResumo_Herbicida.Value = dados.Atuador.PercentualReservatorio;
|
|
lblResumo_Herbicida.Content = $"{dados.Atuador.VolumeReservatorioL:0.00} L ({TimeSpan.FromMinutes(dados.Atuador.TempoEstimadoRestanteMinutos).ToString(@"hh\:mm\:ss")} {dados.Atuador.DistanciaEstimadaRestanteMetros:0.00} m)";
|
|
pgbResumo_Infestacao.Value = dados.Atuador.PercentualErvasTerreno;
|
|
lblResumo_Infestacao.Content = $"{dados.Atuador.HerbicidaPorAtuacaoMl:0.00} mL/atuação";
|
|
|
|
lblResumo_OperacaoLiberada.Content = $"Operação " + (dados.Operacao.Liberada ? "🔓 Liberada" : "🔒 Bloqueada");
|
|
lblResumo_OperacaoModo.Content = $"Modo {dados.Operacao.Modo}";
|
|
lblResumo_OperacaoStatus.Content = $"Status {dados.Operacao.Status}" + (dados.Operacao.Status == AgroBase.Models.Enums.StatusOperacao.Aguardando ? $" ({dados.Operacao.TempoAguardandoSegs:0})" : "");
|
|
lblResumo_StatusCarro.Content = $"Carro {dados.Trajetoria.StatusCarro}";
|
|
lblResumo_TemperaturaGeral.Content = $"Temperatura {(dados.PerformanceNcp.CPU_temp ?? 0):0.00} °C";
|
|
lblResumo_OperacaoDuracao.Content = $"Duração {TimeSpan.FromSeconds(dados.Operacao.TempoDecorridoSegs).ToString(@"hh\:mm\:ss")} / " + (string.IsNullOrEmpty(dados.Trajetoria.TempoEstimadoOperacao) ? "00:00:00" : dados.Trajetoria.TempoEstimadoOperacao);
|
|
}
|
|
catch (Exception exUi)
|
|
{
|
|
Variaveis.MostrarLog($"Erro ao atualizar UI Resumo: {exUi.Message}");
|
|
}
|
|
}));
|
|
}
|
|
|
|
public void AtualizarDadosTela_Resumo_Conexao(AgroBase.Models.Operacoes.OperacaoParametrosDadosModel dados)
|
|
{
|
|
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
|
|
{
|
|
try
|
|
{
|
|
var conexao = dados.ModulosSaude?.FirstOrDefault(x => x.modulo == AgroBase.Models.Enums.T_Code.Ipb);
|
|
double conexao_saude = 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;
|
|
pgbResumo_Conexao.Value = conexao_saude;
|
|
lblResumo_Conexao.Content = $"{conexao_latencia:0.00} ms {conexao_perda:0.00}% {bwTot:0.00} Mbps";
|
|
}
|
|
catch (Exception exUi)
|
|
{
|
|
Variaveis.MostrarLog($"Erro ao atualizar UI Resumo_Conexao: {exUi.Message}");
|
|
}
|
|
}));
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region DIAGNOSTICOS
|
|
|
|
private Label _labelModuloSelecionado;
|
|
private GraficoModel graficoAcompanhamento;
|
|
|
|
private void AtualizarDadosTela_Diagnosticos(AgroBase.Models.Operacoes.OperacaoParametrosModel dados)
|
|
{
|
|
lblDiagnosticos_Impedimento.Text = "Impedimento: " + (string.IsNullOrEmpty(dados.DadosLeitura.Operacao.ImpedimentoErro) ? "Nenhum" : dados.DadosLeitura.Operacao.ImpedimentoErro.Replace("\n\n", "; "));
|
|
|
|
// Canvas que está dentro do Border
|
|
var canvas = brdDiagnostico.Child as Canvas;
|
|
if (canvas == null)
|
|
return;
|
|
|
|
// Percorre apenas labels dentro do Canvas com o prefixo desejado
|
|
foreach (var lbl in canvas.Children.OfType<Label>().Where(x => x.Name.StartsWith("lblDiagnosticos_")))
|
|
{
|
|
(var modulo, var mod_label, var s_code, var iniciado) = GetModuleData(lbl);
|
|
if (modulo == AgroBase.Models.Enums.T_Code.Vzo)
|
|
continue;
|
|
|
|
// Procura a saúde desse módulo
|
|
var _saude = dados.DadosLeitura.ModulosSaude?.FirstOrDefault(x => x.modulo == modulo);
|
|
if (_saude == null && false)
|
|
continue;
|
|
|
|
var individual = _saude?.saude_individual?.FirstOrDefault(x => x.label == mod_label);
|
|
|
|
bool em_uso = mod_label != "" ? dados.DadosLeitura.Operacao.ModulosMandatorios?.FirstOrDefault(x => x.Dispositivo == modulo)?.ComponentesEmUso?.Any(x => x.Key == mod_label && x.Value) ?? false : dados.ModulosMandatorios?.Any(x => x.Dispositivo == modulo && x.Utilizar) ?? false;
|
|
|
|
// Aplica cor de acordo com o status
|
|
AplicarStatusModuloNaLabel(lbl, individual?.status ?? _saude?.status ?? AgroBase.Models.Enums.StatusModulo.Desconectado, em_uso);
|
|
|
|
if (lbl.Name == _labelModuloSelecionado?.Name)
|
|
{
|
|
PreencherAbaAcompanhamento(false);
|
|
PreencherAbaOpcoes(false);
|
|
|
|
var rover = VariaveisControleOperacao.RoverEmFoco;
|
|
var saude = rover?.DadosLeitura?.ModulosSaude?.FirstOrDefault(x => x.modulo == modulo);
|
|
PreencherAbaCondicoesOperacionais(saude?.condicoes_operacionais);
|
|
var logs = rover?.DadosLeitura?.Logs?.Where(x => x.Dispositivo == modulo);
|
|
if (!string.IsNullOrEmpty(mod_label))
|
|
logs = logs?.Where(x => x.ID == mod_label);
|
|
else
|
|
logs = logs?.Where(x => x.ID == null);
|
|
PreencherAbaLogs(logs);
|
|
}
|
|
}
|
|
|
|
/*(var modulo, var label, var s_code, var iniciado) = GetModuleData(_labelModuloSelecionado);
|
|
if (modulo == AgroBase.Models.Enums.T_Code.Vzo)
|
|
return;
|
|
|
|
var rover = VariaveisControleOperacao.RoverEmFoco;
|
|
var saude = rover?.DadosLeitura?.ModulosSaude?.FirstOrDefault(x => x.modulo == modulo);
|
|
PreencherAbaCondicoesOperacionais(saude?.condicoes_operacionais);
|
|
var logs = rover?.DadosLeitura?.Logs?.Where(x => x.Dispositivo == modulo);
|
|
if (!string.IsNullOrEmpty(label))
|
|
logs = logs?.Where(x => x.ID == label);
|
|
else
|
|
logs = logs?.Where(x => x.ID == null);
|
|
PreencherAbaLogs(logs);*/
|
|
}
|
|
|
|
private void AplicarStatusModuloNaLabel(Label lbl, AgroBase.Models.Enums.StatusModulo status, bool mandatorio, bool icone = true)
|
|
{
|
|
// você pode ajustar essas cores depois
|
|
Brush back;
|
|
Brush fore = Brushes.White;
|
|
|
|
switch (status)
|
|
{
|
|
case AgroBase.Models.Enums.StatusModulo.Desconectado:
|
|
back = mandatorio ? Brushes.Red : Brushes.Gray;
|
|
break;
|
|
|
|
case AgroBase.Models.Enums.StatusModulo.Conectado:
|
|
back = Brushes.SteelBlue;
|
|
break;
|
|
|
|
case AgroBase.Models.Enums.StatusModulo.Falha:
|
|
back = Brushes.Red;
|
|
break;
|
|
|
|
case AgroBase.Models.Enums.StatusModulo.Alerta:
|
|
back = Brushes.Orange;
|
|
break;
|
|
|
|
case AgroBase.Models.Enums.StatusModulo.Operante:
|
|
back = Brushes.Green;
|
|
break;
|
|
|
|
default:
|
|
back = Brushes.DarkGray;
|
|
break;
|
|
}
|
|
|
|
lbl.Background = back;
|
|
lbl.Foreground = fore;
|
|
|
|
if (icone)
|
|
{
|
|
string text = lbl.Content?.ToString() ?? "";
|
|
text = text.Remove(0, 2);
|
|
lbl.Content = (mandatorio ? "🔒" : "🔓") + text;
|
|
}
|
|
}
|
|
|
|
private (AgroBase.Models.Enums.T_Code, string, AgroBase.Models.Enums.S_Code, bool) GetModuleData(Label lbl)
|
|
{
|
|
bool iniciado = false;
|
|
if (lbl == null) return (AgroBase.Models.Enums.T_Code.Vzo, "", AgroBase.Models.Enums.S_Code.sVZO, iniciado);
|
|
|
|
string lbl_name = lbl.Name.Replace("lblDiagnosticos_", "");
|
|
string[] pts = lbl_name.Split('_');
|
|
string mod_name = pts[0];
|
|
string mod_label = pts.Length > 1 ? pts[1] : "";
|
|
|
|
if (!Enum.TryParse<AgroBase.Models.Enums.T_Code>(mod_name, ignoreCase: true, out var modulo))
|
|
return (AgroBase.Models.Enums.T_Code.Vzo, "", AgroBase.Models.Enums.S_Code.sVZO, iniciado);
|
|
|
|
string tag = (lbl.Tag ?? "sVZO").ToString();
|
|
Enum.TryParse<AgroBase.Models.Enums.S_Code>(tag, ignoreCase: true, out var s_code);
|
|
|
|
var rover = VariaveisControleOperacao.RoverEmFoco;
|
|
if (rover != null)
|
|
{
|
|
switch (modulo)
|
|
{
|
|
case AgroBase.Models.Enums.T_Code.Mov:
|
|
iniciado = rover.DadosLeitura?.Movimentacao?.Modulos?.FirstOrDefault(x => x.Mod_ID == mod_label)?.Iniciado ?? false;
|
|
break;
|
|
case AgroBase.Models.Enums.T_Code.Dir:
|
|
iniciado = rover.DadosLeitura?.Direcional?.Modulos?.FirstOrDefault(x => x.Mod_ID == mod_label)?.Iniciado ?? false;
|
|
break;
|
|
case AgroBase.Models.Enums.T_Code.Atu:
|
|
if (string.IsNullOrEmpty(mod_label))
|
|
iniciado = rover.DadosLeitura?.Atuador?.Iniciado ?? false;
|
|
else
|
|
switch (s_code)
|
|
{
|
|
case AgroBase.Models.Enums.S_Code.sBIC:
|
|
iniciado = rover.DadosLeitura?.Atuador?.Bicos?.FirstOrDefault(x => x.ID == mod_label)?.Inicializado ?? false;
|
|
break;
|
|
case AgroBase.Models.Enums.S_Code.sBMB:
|
|
iniciado = rover.DadosLeitura?.Atuador?.Bombas?.FirstOrDefault(x => x.ID == mod_label)?.Inicializado ?? false;
|
|
break;
|
|
case AgroBase.Models.Enums.S_Code.sSRV:
|
|
iniciado = rover.DadosLeitura?.Atuador?.Servos?.FirstOrDefault(x => x.ID == mod_label)?.Inicializado ?? false;
|
|
break;
|
|
default:
|
|
iniciado = rover.DadosLeitura?.Atuador?.Sensores?.FirstOrDefault(x => x.ID == mod_label && x.Componente == s_code)?.Inicializado ?? false;
|
|
break;
|
|
}
|
|
break;
|
|
case AgroBase.Models.Enums.T_Code.Sen:
|
|
if (string.IsNullOrEmpty(mod_label))
|
|
iniciado = rover.DadosLeitura?.Sensoriamento?.Iniciado ?? false;
|
|
else
|
|
switch (s_code)
|
|
{
|
|
case AgroBase.Models.Enums.S_Code.sLED:
|
|
iniciado = rover.DadosLeitura?.Sensoriamento?.Sinaleiros?.FirstOrDefault(x => x.ID == mod_label)?.Inicializado ?? false;
|
|
break;
|
|
case AgroBase.Models.Enums.S_Code.sRLE:
|
|
iniciado = rover.DadosLeitura?.Sensoriamento?.Reles?.FirstOrDefault(x => x.ID == mod_label)?.Inicializado ?? false;
|
|
break;
|
|
case AgroBase.Models.Enums.S_Code.sSRV:
|
|
iniciado = rover.DadosLeitura?.Sensoriamento?.Servos?.FirstOrDefault(x => x.ID == mod_label)?.Inicializado ?? false;
|
|
break;
|
|
default:
|
|
iniciado = rover.DadosLeitura?.Sensoriamento?.Sensores?.FirstOrDefault(x => x.ID == mod_label && x.Componente == s_code)?.Inicializado ?? false;
|
|
break;
|
|
}
|
|
break;
|
|
case AgroBase.Models.Enums.T_Code.Imu:
|
|
iniciado = rover.DadosLeitura?.Imu?.Iniciado ?? false;
|
|
break;
|
|
case AgroBase.Models.Enums.T_Code.Npc:
|
|
case AgroBase.Models.Enums.T_Code.Ipb:
|
|
iniciado = rover.Alive;
|
|
break;
|
|
case AgroBase.Models.Enums.T_Code.Can:
|
|
iniciado = rover.DadosLeitura.DispositivosMapeados?.Any(x => x.Dispositivo == AgroBase.Models.Enums.T_Code.Can) ?? false;
|
|
break;
|
|
case AgroBase.Models.Enums.T_Code.Lra:
|
|
//iniciado = rover.DadosLeitura?.DadosLoRa?.Conectado ?? false;
|
|
break;
|
|
case AgroBase.Models.Enums.T_Code.Cam:
|
|
case AgroBase.Models.Enums.T_Code.Snr:
|
|
case AgroBase.Models.Enums.T_Code.Lvx:
|
|
case AgroBase.Models.Enums.T_Code.Gps:
|
|
iniciado = rover.DadosLeitura?.DispositivosMapeados?.FirstOrDefault(x => x.Dispositivo == modulo)?.Saude > 0;
|
|
break;
|
|
case AgroBase.Models.Enums.T_Code.Bat:
|
|
iniciado = rover.DadosLeitura?.Bateria?.Iniciado ?? false;
|
|
//mod_label = "Bateria";
|
|
break;
|
|
case AgroBase.Models.Enums.T_Code.Trj:
|
|
iniciado = rover.DadosLeitura?.Trajetoria?.QtdPontos > 0;
|
|
//mod_label = "Trajetória";
|
|
break;
|
|
}
|
|
}
|
|
|
|
return (modulo, mod_label, s_code, iniciado);
|
|
}
|
|
|
|
private void DiagnosticoModulo_Click(object sender, MouseButtonEventArgs e)
|
|
{
|
|
if (sender is not Label lbl)
|
|
return;
|
|
|
|
// desfazer seleção antiga
|
|
if (_labelModuloSelecionado != null)
|
|
{
|
|
_labelModuloSelecionado.BorderBrush = Brushes.Transparent;
|
|
_labelModuloSelecionado.BorderThickness = new Thickness(1);
|
|
_labelModuloSelecionado.Effect = null;
|
|
}
|
|
|
|
// selecionar a nova
|
|
_labelModuloSelecionado = lbl;
|
|
_labelModuloSelecionado.BorderBrush = Brushes.Yellow;
|
|
_labelModuloSelecionado.BorderThickness = new Thickness(2);
|
|
|
|
// opcional — glow bonito
|
|
_labelModuloSelecionado.Effect = new System.Windows.Media.Effects.DropShadowEffect
|
|
{
|
|
Color = System.Windows.Media.Colors.Yellow,
|
|
BlurRadius = 8,
|
|
ShadowDepth = 0,
|
|
Opacity = 0.9
|
|
};
|
|
|
|
AtualizarDetalhesModulo();
|
|
}
|
|
|
|
private void AtualizarDetalhesModulo()
|
|
{
|
|
(var modulo, var label, var s_code, var iniciado) = GetModuleData(_labelModuloSelecionado);
|
|
if (modulo == AgroBase.Models.Enums.T_Code.Vzo)
|
|
return;
|
|
|
|
var rover = VariaveisControleOperacao.RoverEmFoco;
|
|
var saude = rover?.DadosLeitura?.ModulosSaude?.FirstOrDefault(x => x.modulo == modulo);
|
|
var dispositivo = rover?.DadosLeitura?.DispositivosMapeados?.FirstOrDefault(x => x.Dispositivo == modulo && x.Mod_ID == label);
|
|
|
|
if (dispositivo == null && saude == null && false)
|
|
{
|
|
MessageBox.Show($"Sem dados para o módulo {modulo} ({label})");
|
|
return;
|
|
}
|
|
|
|
var individual = saude?.saude_individual?.FirstOrDefault(x => x.label == label);
|
|
|
|
var status = individual?.status ?? saude?.status ?? AgroBase.Models.Enums.StatusModulo.Desconectado;
|
|
var motivos = string.Join(", ", (individual?.motivos ?? saude?.motivos) ?? new List<string>());
|
|
|
|
DateTime ucr = DateTime.MinValue;
|
|
if (modulo == AgroBase.Models.Enums.T_Code.Sen)
|
|
ucr = rover?.DadosLeitura?.Sensoriamento?.UltimoComandoRespondido ?? DateTime.MinValue;
|
|
else if (modulo == AgroBase.Models.Enums.T_Code.Atu)
|
|
ucr = rover?.DadosLeitura?.Atuador?.UltimoComandoRespondido ?? DateTime.MinValue;
|
|
else if (modulo == AgroBase.Models.Enums.T_Code.Mov)
|
|
ucr = rover?.DadosLeitura?.Movimentacao?.Modulos?.FirstOrDefault(x => x.Mod_ID == label)?.UltimoComandoRespondido ?? DateTime.MinValue;
|
|
else if (modulo == AgroBase.Models.Enums.T_Code.Dir)
|
|
ucr = rover?.DadosLeitura?.Direcional?.Modulos?.FirstOrDefault(x => x.Mod_ID == label)?.UltimoComandoRespondido ?? DateTime.MinValue;
|
|
else
|
|
ucr = rover.DadosLeitura?.Momento ?? DateTime.MinValue;
|
|
|
|
DateTime mom = rover.DadosLeitura?.Momento ?? DateTime.MinValue;
|
|
double can_latencia = (ucr - mom).TotalMilliseconds;
|
|
|
|
AgroBase.Models.Enums.StatusModulo _status = individual?.status ?? saude?.status ?? AgroBase.Models.Enums.StatusModulo.Desconectado;
|
|
double _saude = individual?.saude ?? saude?.saude ?? 0;
|
|
|
|
lblSaude_Descricao.Content = $"Módulo {modulo} {label}";
|
|
lblSaude_Iniciado.Content = (iniciado ? "Iniciado" : "Não Iniciado");
|
|
lblSaude_Iniciado.Foreground = new SolidColorBrush(iniciado ? System.Windows.Media.Colors.Green : System.Windows.Media.Colors.Red);
|
|
lblSaude_Status.Content = $"{_status} (Saúde {_saude}%)";
|
|
lblSaude_CAN.Content = $"CAN {can_latencia:0} ms";
|
|
lblSaude_Latencia.Content = $"Latência {dispositivo?.Latencia ?? 0} ms";
|
|
lblSaude_Impedimento.Text = $"Impedimento: {motivos ?? "Nenhum"}";
|
|
|
|
bool mandatorio = rover?.ModulosMandatorios?.Any(x => x.Dispositivo == modulo && x.Mandatorio) ?? false;
|
|
//var cu = rover?.ModulosMandatorios?.FirstOrDefault(x => x.Dispositivo == modulo)?.ComponentesEmUso.FirstOrDefault(x => x.Key == label);
|
|
//bool em_uso = individual?.em_uso ?? (cu?.Key != null ? cu?.Value : null) ?? rover?.ModulosMandatorios?.Any(x => x.Dispositivo == modulo && x.Utilizar) ?? false;
|
|
//bool em_uso = rover?.ModulosMandatorios?.FirstOrDefault(x => x.Dispositivo == modulo)?.ComponentesEmUso?.Any(x => x.Key == label) ?? false;
|
|
bool em_uso = label != "" ? rover?.ModulosMandatorios?.FirstOrDefault(x => x.Dispositivo == modulo)?.ComponentesEmUso?.Any(x => x.Key == label && x.Value) ?? false : rover?.ModulosMandatorios?.Any(x => x.Dispositivo == modulo && x.Utilizar) ?? false;
|
|
|
|
chbSaude_Mandatorio.IsChecked = mandatorio;
|
|
chbSaude_EmUso.IsChecked = em_uso;
|
|
|
|
PreencherAbaCondicoesOperacionais(saude?.condicoes_operacionais);
|
|
PreencherAbaAcompanhamento(true);
|
|
PreencherAbaOpcoes(true);
|
|
var logs = rover.DadosLeitura?.Logs?.Where(x => x.Dispositivo == modulo);
|
|
if (!string.IsNullOrEmpty(label))
|
|
logs = logs?.Where(x => x.ID == label);
|
|
else
|
|
logs = logs?.Where(x => x.ID == null);
|
|
PreencherAbaLogs(logs);
|
|
}
|
|
|
|
private void PreencherAbaCondicoesOperacionais(List<ManagerWorkerMessageResponseModulosPendentesSaudeCondicoesModel> condicoes)
|
|
{
|
|
lstSaude_CondicoesOperacionais.Items.Clear();
|
|
|
|
if (condicoes != null)
|
|
{
|
|
foreach (var cond in condicoes)
|
|
{
|
|
lstSaude_CondicoesOperacionais.Items.Add($"{cond.descricao} (Valor: {cond.valor}, Severidade: {cond.severidade:0}%)");
|
|
}
|
|
}
|
|
}
|
|
|
|
private void PreencherAbaAcompanhamento(bool inicial)
|
|
{
|
|
(var modulo, var label, var s_code, var iniciado) = GetModuleData(_labelModuloSelecionado);
|
|
if (modulo == AgroBase.Models.Enums.T_Code.Vzo)
|
|
return;
|
|
|
|
DateTime? momento = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Momento;
|
|
|
|
switch (modulo)
|
|
{
|
|
case AgroBase.Models.Enums.T_Code.Sen:
|
|
switch (s_code)
|
|
{
|
|
case AgroBase.Models.Enums.S_Code.sCOR:
|
|
var barramento = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Bateria?.Barramentos?.FirstOrDefault(x => x.ID == label);
|
|
graficoAcompanhamento.Atualizar(inicial, momento, new List<GraficoModel.GraficoParametrosModel>()
|
|
{
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Corrente",
|
|
Unidade = "mA",
|
|
Valor = barramento?.Corrente
|
|
},
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Tensão",
|
|
Unidade = "V",
|
|
Valor = barramento?.Tensao
|
|
},
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Potência",
|
|
Unidade = "mW",
|
|
Valor = barramento?.Potencia
|
|
},
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Energia",
|
|
Unidade = "J",
|
|
Valor = barramento?.Energia
|
|
},
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Temperatura",
|
|
Unidade = "°C",
|
|
Valor = barramento?.Temperatura
|
|
},
|
|
});
|
|
break;
|
|
case AgroBase.Models.Enums.S_Code.sNTC:
|
|
var ntc = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Sensoriamento?.Sensores?.FirstOrDefault(x => x.ID == label && x.Componente == s_code)?.Valores[0];
|
|
graficoAcompanhamento.Atualizar(inicial, momento, new List<GraficoModel.GraficoParametrosModel>()
|
|
{
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Temperatura",
|
|
Unidade = "°C",
|
|
Valor = ntc
|
|
},
|
|
});
|
|
break;
|
|
case AgroBase.Models.Enums.S_Code.sRLE:
|
|
//var (cmd, leitura) = ((JObject)controleBase._comp_value).ToObject<(double?, double?)>();
|
|
var rle = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Sensoriamento?.Reles?.FirstOrDefault(x => x.ID == label);
|
|
graficoAcompanhamento.Atualizar(inicial, momento, new List<GraficoModel.GraficoParametrosModel>()
|
|
{
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Comando",
|
|
Unidade = "",
|
|
Valor = rle?.ComandoEstado == true ? 1 : 0,
|
|
},
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Leitura",
|
|
Unidade = "",
|
|
Valor = rle?.LeituraEstado == true ? 1 : 0,
|
|
},
|
|
});
|
|
break;
|
|
case AgroBase.Models.Enums.S_Code.sFRO:
|
|
var fro = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Sensoriamento?.Servos?.FirstOrDefault(x => x.ID == label);
|
|
graficoAcompanhamento.Atualizar(inicial, momento, new List<GraficoModel.GraficoParametrosModel>()
|
|
{
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Comando",
|
|
Unidade = "°",
|
|
Valor = fro?.ComandoAngulo
|
|
},
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Leitura",
|
|
Unidade = "°",
|
|
Valor = fro?.LeituraAngulo
|
|
},
|
|
});
|
|
break;
|
|
}
|
|
break;
|
|
case AgroBase.Models.Enums.T_Code.Atu:
|
|
var atu = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Atuador;
|
|
switch (s_code)
|
|
{
|
|
case AgroBase.Models.Enums.S_Code.sBIC:
|
|
var b = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Atuador?.Bicos?.FirstOrDefault(x => x.ID == label);
|
|
graficoAcompanhamento.Atualizar(inicial, momento, new List<GraficoModel.GraficoParametrosModel>()
|
|
{
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Cmd",
|
|
Unidade = "",
|
|
Valor = (b?.ComandoEstado ?? false) ? 100 : 0
|
|
},
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Vazão",
|
|
Unidade = "mL/s",
|
|
Valor = b?.MediaVazaoMLs
|
|
},
|
|
});
|
|
break;
|
|
case AgroBase.Models.Enums.S_Code.sBMB:
|
|
var bb = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Atuador?.Bombas?.FirstOrDefault(x => x.ID == label);
|
|
graficoAcompanhamento.Atualizar(inicial, momento, new List<GraficoModel.GraficoParametrosModel>()
|
|
{
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Cmd",
|
|
Unidade = "",
|
|
Valor = (bb?.ComandoEstado ?? false) ? 100 : 0
|
|
},
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Potência",
|
|
Unidade = "%",
|
|
Valor = bb?.Potencia
|
|
},
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Pressão",
|
|
Unidade = "psi",
|
|
Valor = atu?.PressaoLinhaPsi
|
|
},
|
|
});
|
|
break;
|
|
case AgroBase.Models.Enums.S_Code.sPRS:
|
|
graficoAcompanhamento.Atualizar(inicial, momento, new List<GraficoModel.GraficoParametrosModel>()
|
|
{
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Pressão",
|
|
Unidade = "psi",
|
|
Valor = atu?.PressaoLinhaPsi
|
|
},
|
|
});
|
|
break;
|
|
case AgroBase.Models.Enums.S_Code.sFLX:
|
|
graficoAcompanhamento.Atualizar(inicial, momento, new List<GraficoModel.GraficoParametrosModel>()
|
|
{
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Fluxo",
|
|
Unidade = "mL/s",
|
|
Valor = atu?.VazaoInstantaneaMLs
|
|
},
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Media",
|
|
Unidade = "mL/s",
|
|
Valor = atu?.VazaoMediaMLs
|
|
},
|
|
});
|
|
break;
|
|
case AgroBase.Models.Enums.S_Code.sMAS:
|
|
graficoAcompanhamento.Atualizar(inicial, momento, new List<GraficoModel.GraficoParametrosModel>()
|
|
{
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Volume",
|
|
Unidade = "L",
|
|
Valor = atu?.VolumeReservatorioL
|
|
},
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Massa",
|
|
Unidade = "Kg",
|
|
Valor = atu?.MassaReservatorioKg
|
|
},
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Percentual",
|
|
Unidade = "%",
|
|
Valor = atu?.PercentualReservatorio
|
|
},
|
|
});
|
|
break;
|
|
}
|
|
break;
|
|
case AgroBase.Models.Enums.T_Code.Mov:
|
|
var mov = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Movimentacao?.Modulos?.FirstOrDefault(x => x.Mod_ID == label);
|
|
graficoAcompanhamento.Atualizar(inicial, momento, new List<GraficoModel.GraficoParametrosModel>()
|
|
{
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Tensão",
|
|
Unidade = "V",
|
|
Valor = mov?.Tensao
|
|
},
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Corrente M",
|
|
Unidade = "A",
|
|
Valor = mov?.Corrente_Motor
|
|
},
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Corrente B",
|
|
Unidade = "A",
|
|
Valor = mov ?.Corrente_Barramento
|
|
},
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Ciclo",
|
|
Unidade = "%",
|
|
Valor = mov?.CicloTrabalho
|
|
},
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Temperatura",
|
|
Unidade = "°C",
|
|
Valor = mov?.TemperaturaDriver
|
|
},
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "RPM",
|
|
Unidade = "",
|
|
Valor = mov?.RPM_Roda
|
|
},
|
|
});
|
|
break;
|
|
case AgroBase.Models.Enums.T_Code.Npc:
|
|
var npc = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.PerformanceNcp;
|
|
graficoAcompanhamento.Atualizar(inicial, momento, new List<GraficoModel.GraficoParametrosModel>()
|
|
{
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "GPU",
|
|
Unidade = "%",
|
|
Valor = npc?.GPU_load
|
|
},
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "GPU",
|
|
Unidade = "°C",
|
|
Valor = npc?.GPU_temp
|
|
},
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "CPU",
|
|
Unidade = "%",
|
|
Valor = npc?.CPU_load
|
|
},
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "CPU",
|
|
Unidade = "°C",
|
|
Valor = npc?.CPU_temp
|
|
},
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "RAM",
|
|
Unidade = "MB",
|
|
Valor = npc?.RAM_usage
|
|
},
|
|
});
|
|
break;
|
|
case AgroBase.Models.Enums.T_Code.Ipb:
|
|
var conexao = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.ModulosSaude?.FirstOrDefault(x => x.modulo == AgroBase.Models.Enums.T_Code.Ipb);
|
|
double saude = conexao?.saude ?? 0;
|
|
double latencia = conexao?.detalhes?["avg_rtt"]?.Value<double>() ?? 0.0;
|
|
double timeout = conexao?.detalhes?["tmout_pct"]?.Value<double>() ?? 0.0;
|
|
double perda = conexao?.detalhes?["loss_pct"]?.Value<double>() ?? 0.0;
|
|
double jitter = conexao?.detalhes?["jitter"]?.Value<double>() ?? 0.0;
|
|
double bwTotal = conexao?.detalhes?["bw_total_mbps"]?.Value<double>() ?? 0;
|
|
double errRate = conexao?.detalhes?["err_rate"]?.Value<double>() ?? 0;
|
|
graficoAcompanhamento.Atualizar(inicial, momento, new List<GraficoModel.GraficoParametrosModel>()
|
|
{
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Latência",
|
|
Unidade = "ms",
|
|
Valor = latencia
|
|
},
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Jitter",
|
|
Unidade = "ms",
|
|
Valor = jitter
|
|
},
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Timeout",
|
|
Unidade = "%",
|
|
Valor = timeout
|
|
},
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Perda",
|
|
Unidade = "%",
|
|
Valor = perda
|
|
},
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Erro",
|
|
Unidade = "%",
|
|
Valor = errRate
|
|
},
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Banda",
|
|
Unidade = "Mbps",
|
|
Valor = bwTotal
|
|
},
|
|
});
|
|
break;
|
|
case AgroBase.Models.Enums.T_Code.Gps:
|
|
var gps = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Gnss;
|
|
graficoAcompanhamento.Atualizar(inicial, momento, new List<GraficoModel.GraficoParametrosModel>()
|
|
{
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Precisão",
|
|
Unidade = "cm",
|
|
Valor = gps?.PrecisaoCm
|
|
},
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Altitude",
|
|
Unidade = "m",
|
|
Valor = gps?.Altitude
|
|
},
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Idade",
|
|
Unidade = "s",
|
|
Valor = gps?.IdadeCorrecao
|
|
},
|
|
new GraficoModel.GraficoParametrosModel()
|
|
{
|
|
Label = "Satelites",
|
|
Unidade = "%",
|
|
Valor = gps?.NumeroSatelites
|
|
},
|
|
});
|
|
break;
|
|
}
|
|
|
|
graficoAcompanhamento.Limpar(momento);
|
|
}
|
|
|
|
private void PreencherAbaOpcoes(bool inicial)
|
|
{
|
|
(var modulo, var label, var s_code, var iniciado) = GetModuleData(_labelModuloSelecionado);
|
|
if (modulo == AgroBase.Models.Enums.T_Code.Vzo)
|
|
return;
|
|
|
|
var rover = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura;
|
|
|
|
if (inicial)
|
|
{
|
|
txtOpcoes_SemDados.Visibility = Visibility.Collapsed;
|
|
panelOpcoes_Bico.Visibility = Visibility.Collapsed;
|
|
panelOpcoes_Atuador.Visibility = Visibility.Collapsed;
|
|
panelOpcoes_Bomba.Visibility = Visibility.Collapsed;
|
|
panelOpcoes_Direcional.Visibility = Visibility.Collapsed;
|
|
panelOpcoes_GPS.Visibility = Visibility.Collapsed;
|
|
panelOpcoes_Trajetoria.Visibility = Visibility.Collapsed;
|
|
panelOpcoes_Rele.Visibility = Visibility.Collapsed;
|
|
panelOpcoes_NPC.Visibility = Visibility.Collapsed;
|
|
panelOpcoes_Servo.Visibility = Visibility.Collapsed;
|
|
}
|
|
|
|
switch (modulo)
|
|
{
|
|
case AgroBase.Models.Enums.T_Code.Atu:
|
|
{
|
|
switch (s_code)
|
|
{
|
|
case AgroBase.Models.Enums.S_Code.sMOD:
|
|
panelOpcoes_Atuador.Visibility = Visibility.Visible;
|
|
|
|
if (inicial)
|
|
{
|
|
sldBarra_Altura.Value = (rover?.Controle?.AlturaBarra ?? 0);
|
|
}
|
|
lblBarra_Altura.Foreground = new SolidColorBrush(Math.Round(sldBarra_Altura.Value) == Math.Round(rover?.Controle?.AlturaBarra ?? 0, 0) ? System.Windows.Media.Colors.Black : System.Windows.Media.Colors.Red);
|
|
break;
|
|
case AgroBase.Models.Enums.S_Code.sBIC:
|
|
{
|
|
panelOpcoes_Bico.Visibility = Visibility.Visible;
|
|
|
|
var bico = rover?.Atuador?.Bicos?.FirstOrDefault(x => x.ID == label);
|
|
bool comando = bico?.ComandoEstado ?? false;
|
|
bool leitura = bico?.LeituraEstado ?? false;
|
|
txtBico_Titulo.Text = $"Bico {label} - Testes";
|
|
txtBico_Comando.Text = comando ? "Ligado" : "Desligado";
|
|
txtBico_StatusReal.Text = leitura ? "Ligado" : "Desligado";
|
|
txtBico_TempoLigado.Text = (bico?.TempoAtuado ?? 0).ToString("0.00") + " ms";
|
|
txtBico_Vazao.Text = (bico?.MediaVazaoMLs ?? 0).ToString("0.00") + " Ml/s";
|
|
txtBico_Pressao.Text = (rover?.Atuador?.PressaoLinhaPsi ?? 0).ToString("0.00") + " psi";
|
|
txtBico_Atuacoes.Text = (bico?.QtdAtuacoes ?? 0).ToString();
|
|
|
|
if (inicial)
|
|
{
|
|
txtBico_AnguloAbertura.Text = (bico?.AnguloAbertura ?? 0).ToString();
|
|
sldBico_Angular.Value = (bico?.ComandoAngulo ?? 0);
|
|
}
|
|
lblBico_Angulo.Foreground = new SolidColorBrush(Math.Round(sldBico_Angular.Value) == (bico?.ComandoAngulo ?? 0) ? System.Windows.Media.Colors.Black : System.Windows.Media.Colors.Red);
|
|
txtBico_AnguloAbertura.Foreground = new SolidColorBrush(Convert.ToInt32(txtBico_AnguloAbertura.Text) == Convert.ToInt32(bico?.AnguloAbertura ?? 0) ? System.Windows.Media.Colors.Black : System.Windows.Media.Colors.Red);
|
|
break;
|
|
}
|
|
case AgroBase.Models.Enums.S_Code.sBMB:
|
|
{
|
|
panelOpcoes_Bomba.Visibility = Visibility.Visible;
|
|
|
|
var bomba = rover?.Atuador?.Bombas?.FirstOrDefault(x => x.ID == label);
|
|
bool comando = bomba?.ComandoEstado ?? false;
|
|
bool leitura = bomba?.LeituraEstado ?? false;
|
|
var potencia = bomba?.Potencia ?? 0;
|
|
txtBomba_Comando.Text = comando ? "Ligado" : "Desligado";
|
|
txtBomba_StatusReal.Text = leitura ? "Ligado" : "Desligado";
|
|
txtBomba_PressaoLinha.Text = (rover?.Atuador?.PressaoLinhaPsi ?? 0).ToString("0.00") + " psi";
|
|
txtBomba_Potencia.Text = potencia.ToString("0") + " %";
|
|
break;
|
|
}
|
|
case AgroBase.Models.Enums.S_Code.sSRV:
|
|
{
|
|
panelOpcoes_Servo.Visibility = Visibility.Visible;
|
|
|
|
var servo = rover?.Sensoriamento?.Servos?.FirstOrDefault(x => x.ID == label);
|
|
int comando = servo?.ComandoAngulo ?? 0;
|
|
int leitura = servo?.LeituraAngulo ?? 0;
|
|
bool inc = servo?.Incremental ?? false;
|
|
txtServo_Comando.Text = $"{comando}°";
|
|
txtServo_Leitura.Text = $"{leitura}°";
|
|
txtServo_Incremental.Text = inc ? "Incremental" : "Decremental";
|
|
break;
|
|
}
|
|
default:
|
|
txtOpcoes_SemDados.Visibility = Visibility.Visible;
|
|
break;
|
|
}
|
|
|
|
break;
|
|
}
|
|
case AgroBase.Models.Enums.T_Code.Sen:
|
|
{
|
|
switch (s_code)
|
|
{
|
|
case AgroBase.Models.Enums.S_Code.sRLE:
|
|
{
|
|
panelOpcoes_Rele.Visibility = Visibility.Visible;
|
|
|
|
var rele = rover?.Sensoriamento?.Reles?.FirstOrDefault(x => x.ID == label);
|
|
bool comando = rele?.ComandoEstado ?? false;
|
|
bool leitura = rele?.LeituraEstado ?? false;
|
|
txtRele_Titulo.Text = $"Relé {label} - Testes";
|
|
txtRele_Comando.Text = comando ? "Ligado" : "Desligado";
|
|
txtRele_StatusReal.Text = leitura ? "Ligado" : "Desligado";
|
|
break;
|
|
}
|
|
case AgroBase.Models.Enums.S_Code.sSRV:
|
|
{
|
|
panelOpcoes_Servo.Visibility = Visibility.Visible;
|
|
|
|
var servo = rover?.Sensoriamento?.Servos?.FirstOrDefault(x => x.ID == label);
|
|
int comando = servo?.ComandoAngulo ?? 0;
|
|
int leitura = servo?.LeituraAngulo ?? 0;
|
|
bool inc = servo?.Incremental ?? false;
|
|
txtServo_Comando.Text = $"{comando}°";
|
|
txtServo_Leitura.Text = $"{leitura}°";
|
|
txtServo_Incremental.Text = inc ? "Incremental" : "Decremental";
|
|
break;
|
|
}
|
|
default:
|
|
txtOpcoes_SemDados.Visibility = Visibility.Visible;
|
|
break;
|
|
}
|
|
|
|
break;
|
|
}
|
|
case AgroBase.Models.Enums.T_Code.Dir:
|
|
{
|
|
panelOpcoes_Direcional.Visibility = Visibility.Visible;
|
|
|
|
var mod = rover?.Direcional?.Modulos?.FirstOrDefault(x => x.Mod_ID == label);
|
|
AgroBase.Models.Enums.Sentido sentido_sp = mod?.Sentido_SP ?? AgroBase.Models.Enums.Sentido.Parado;
|
|
AgroBase.Models.Enums.Sentido sentido = mod?.SentidoReal ?? AgroBase.Models.Enums.Sentido.Parado;
|
|
double angulo_sp = mod?.Angulo_SP ?? 0;
|
|
double angulo = mod?.AnguloDriver ?? 0;
|
|
txtDir_Titulo.Text = $"Direcional {label} - Testes";
|
|
txtDir_SentidoSP.Text = sentido_sp.ToString();
|
|
txtDir_Sentido.Text = sentido.ToString();
|
|
txtDir_AnguloSP.Text = $"{angulo_sp:0.00}°";
|
|
txtDir_Angulo.Text = $"{angulo:0.00}°";
|
|
break;
|
|
}
|
|
case AgroBase.Models.Enums.T_Code.Gps:
|
|
{
|
|
panelOpcoes_GPS.Visibility = Visibility.Visible;
|
|
|
|
var dados = rover?.Gnss;
|
|
if (inicial)
|
|
{
|
|
sldGps_LeverArmLateral.Value = (dados?.LeverArmLateral ?? 0) / 10.0;
|
|
sldGps_LeverArmFrontal.Value = (dados?.LeverArmFrontal ?? 0) / 10.0;
|
|
}
|
|
lblGps_LeverArmLateral.Content = $"{(sldGps_LeverArmLateral.Value * 10.0):00} cm";
|
|
lblGps_LeverArmLateral.Foreground = new SolidColorBrush(Math.Round(sldGps_LeverArmLateral.Value * 10.0, 0) == Math.Round(dados?.LeverArmLateral ?? 0, 0) ? System.Windows.Media.Colors.Black : System.Windows.Media.Colors.Red);
|
|
lblGps_LeverArmFrontal.Content = $"{(sldGps_LeverArmFrontal.Value * 10.0):00} cm";
|
|
lblGps_LeverArmFrontal.Foreground = new SolidColorBrush(Math.Round(sldGps_LeverArmFrontal.Value * 10.0, 0) == Math.Round(dados?.LeverArmFrontal ?? 0, 0) ? System.Windows.Media.Colors.Black : System.Windows.Media.Colors.Red);
|
|
txtGps_Correcao.Text = (dados?.QualidadeFix ?? AgroBase.Models.Enums.TiposCorrecaoGPS.SemCorrecao).ToString();
|
|
txtGps_Idade.Text = (dados?.IdadeCorrecao ?? -1).ToString();
|
|
txtGps_Precisao.Text = (dados?.PrecisaoCm ?? -1).ToString();
|
|
txtGps_NSatelites.Text = (dados?.NumeroSatelites ?? 0).ToString();
|
|
txtGps_DistBase.Text = (Variaveis.GpsService.IsConnected ? AgroBase.Models.GPSUtils.DistanciaEntrePontos(dados?.ToGpsModel() ?? new AgroBase.Models.GPSModel(), Variaveis.GpsService.UltimaLeitura) : 0).ToString();
|
|
txtGps_Orientacao.Text = (dados?.OrientacaoReal ?? 0).ToString();
|
|
|
|
break;
|
|
}
|
|
case AgroBase.Models.Enums.T_Code.Trj:
|
|
{
|
|
panelOpcoes_Trajetoria.Visibility = Visibility.Visible;
|
|
|
|
var dados = rover?.Trajetoria?.AutonomiaCooredor;
|
|
txtTrajetoria_DistCorredor.Text = $"{dados?.DistanciaCorredor_m ?? 0:0.00} m";
|
|
txtTrajetoria_DistBateria.Text = $"{dados?.DistanciaSeguraBateria_m ?? 0:0.00} m";
|
|
txtTrajetoria_DistPulverizador.Text = $"{dados?.DistanciaSeguraHerbicida_m ?? 0:0.00} m";
|
|
txtTrajetoria_Status.Text = $"{dados?.Status ?? AgroBase.Models.AutonomiaCorredorStatus.Desconhecido}";
|
|
txtTrajetoria_BatOk.Text = (dados?.BateriaSuficiente ?? false) ? "Sim" : "Não";
|
|
txtTrajetoria_HerbOk.Text = (dados?.HerbicidaSuficiente ?? false) ? "Sim" : "Não";
|
|
|
|
btnTrajetoria_Confirmar.IsEnabled = !(dados?.Liberado ?? false);
|
|
break;
|
|
}
|
|
case AgroBase.Models.Enums.T_Code.Npc:
|
|
{
|
|
panelOpcoes_NPC.Visibility = Visibility.Visible;
|
|
|
|
var dados = rover?.Refrigeracao;
|
|
|
|
var modo = dados?.Modo ?? AgroBase.Services.CoolerControlService.CoolerMode.Off;
|
|
double tmp = dados?.Temperatura ?? 0;
|
|
var c_entrada = dados?.EstadoEntrada ?? AgroBase.Models.Enums.Estado.Desligado;
|
|
var c_saida = dados?.EstadoSaida ?? AgroBase.Models.Enums.Estado.Desligado;
|
|
var l_entrada = dados?.LeituraEntrada ?? AgroBase.Models.Enums.Estado.Desligado;
|
|
var l_saida = dados?.LeituraSaida ?? AgroBase.Models.Enums.Estado.Desligado;
|
|
|
|
txtNpc_CoolerModo.Text = $"{modo}";
|
|
txtNpc_CoolerTemperatura.Text = $"{tmp:0.00} °C";
|
|
txtNpc_CoolerEntrada.Text = $"{c_entrada} ({l_entrada})";
|
|
txtNpc_CoolerSaida.Text = $"{c_saida} ({l_saida})";
|
|
|
|
if (inicial)
|
|
{
|
|
cmbNpc_CoolerModo.SelectedIndex = (int)modo;
|
|
chbNpc_CoolerEntrada.IsChecked = c_entrada == AgroBase.Models.Enums.Estado.Ligado;
|
|
chbNpc_CoolerSaida.IsChecked = c_saida == AgroBase.Models.Enums.Estado.Ligado;
|
|
txtNpc_CoolerTempOn.Text = (dados?.TemperaturaLigar ?? 0).ToString();
|
|
txtNpc_CoolerTempTurbo.Text = (dados?.TemperaturaTurbo ?? 0).ToString();
|
|
}
|
|
break;
|
|
}
|
|
default:
|
|
txtOpcoes_SemDados.Visibility = Visibility.Visible;
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
private void PreencherAbaLogs(IEnumerable<AgroBase.Models.OperacaoSensoriamentoLogErrosModel> logs)
|
|
{
|
|
lstSaude_Logs.Items.Clear();
|
|
|
|
if (logs != null)
|
|
{
|
|
foreach (var log in logs)
|
|
{
|
|
lstSaude_Logs.Items.Add(log.Momento.ToString("HH:mm:ss.fff") + " - " + log.Mensagem);
|
|
}
|
|
}
|
|
}
|
|
|
|
#region Atuador
|
|
|
|
private void sldBarra_Altura_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
|
|
{
|
|
if (lblBarra_Altura != null)
|
|
lblBarra_Altura.Content = $"{Convert.ToInt32(sldBarra_Altura.Value):00} cm";
|
|
}
|
|
|
|
private void btnBarra_Mover_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
(var modulo, var label, var s_code, var iniciado) = GetModuleData(_labelModuloSelecionado);
|
|
if (modulo != AgroBase.Models.Enums.T_Code.Atu && s_code != AgroBase.Models.Enums.S_Code.sMOD)
|
|
return;
|
|
|
|
VariaveisControleOperacao.EnviarComandoAtuador(label, altura: Convert.ToInt32(sldBarra_Altura.Value));
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Bico pulverizador
|
|
private void btnBico_Ligar_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
(var modulo, var label, var s_code, var iniciado) = GetModuleData(_labelModuloSelecionado);
|
|
if (modulo != AgroBase.Models.Enums.T_Code.Atu && s_code != AgroBase.Models.Enums.S_Code.sBIC)
|
|
return;
|
|
|
|
VariaveisControleOperacao.EnviarComandoAtuador(label, status: true);
|
|
}
|
|
|
|
private void btnBico_Desligar_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
(var modulo, var label, var s_code, var iniciado) = GetModuleData(_labelModuloSelecionado);
|
|
if (modulo != AgroBase.Models.Enums.T_Code.Atu && s_code != AgroBase.Models.Enums.S_Code.sBIC)
|
|
return;
|
|
|
|
VariaveisControleOperacao.EnviarComandoAtuador(label, status: false);
|
|
}
|
|
|
|
private void sldBico_Angular_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
|
|
{
|
|
lblBico_Angulo.Content = $"{Convert.ToInt32(sldBico_Angular.Value):00}°";
|
|
}
|
|
|
|
private void btnBico_Mover_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
(var modulo, var label, var s_code, var iniciado) = GetModuleData(_labelModuloSelecionado);
|
|
if (modulo != AgroBase.Models.Enums.T_Code.Atu && s_code != AgroBase.Models.Enums.S_Code.sBIC)
|
|
return;
|
|
|
|
VariaveisControleOperacao.EnviarComandoAtuador(label, angulo_controle: Convert.ToInt32(sldBico_Angular.Value));
|
|
}
|
|
|
|
private void btnBico_AnguloAberturaSalvar_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
(var modulo, var label, var s_code, var iniciado) = GetModuleData(_labelModuloSelecionado);
|
|
if (modulo != AgroBase.Models.Enums.T_Code.Atu && s_code != AgroBase.Models.Enums.S_Code.sBIC)
|
|
return;
|
|
|
|
VariaveisControleOperacao.EnviarComandoAtuador(label, angulo_abertura: int.Parse(txtBico_AnguloAbertura.Text));
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Bomba pressurizadora
|
|
private void btnBomba_Ligar_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
(var modulo, var label, var s_code, var iniciado) = GetModuleData(_labelModuloSelecionado);
|
|
if (modulo != AgroBase.Models.Enums.T_Code.Atu && s_code != AgroBase.Models.Enums.S_Code.sBMB)
|
|
return;
|
|
|
|
VariaveisControleOperacao.EnviarComandoAtuador(label, status: true);
|
|
}
|
|
|
|
private void btnBomba_Desligar_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
(var modulo, var label, var s_code, var iniciado) = GetModuleData(_labelModuloSelecionado);
|
|
if (modulo != AgroBase.Models.Enums.T_Code.Atu && s_code != AgroBase.Models.Enums.S_Code.sBMB)
|
|
return;
|
|
|
|
VariaveisControleOperacao.EnviarComandoAtuador(label, status: false);
|
|
}
|
|
|
|
private void sldBomba_PressaoAlvo_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
|
|
{
|
|
lblBomba_PressaoAlvo.Content = $"{e.NewValue:0} psi";
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Direcional
|
|
private void btnDir_Referenciar_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
(var modulo, var label, var s_code, var iniciado) = GetModuleData(_labelModuloSelecionado);
|
|
if (modulo != AgroBase.Models.Enums.T_Code.Dir)
|
|
return;
|
|
|
|
VariaveisControleOperacao.EnviarComandoReferenciamento(mod_id: label);
|
|
}
|
|
|
|
private void btnDir_Movimentar_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
(var modulo, var label, var s_code, var iniciado) = GetModuleData(_labelModuloSelecionado);
|
|
if (modulo != AgroBase.Models.Enums.T_Code.Dir)
|
|
return;
|
|
|
|
AgroBase.Models.Enums.TipoMovimentoDirecional tipo = (AgroBase.Models.Enums.TipoMovimentoDirecional)Enum.Parse(typeof(AgroBase.Models.Enums.TipoMovimentoDirecional), cmbDir_Movimento.Text);
|
|
AgroBase.Models.Enums.Direcao direcao = (AgroBase.Models.Enums.Direcao)Enum.Parse(typeof(AgroBase.Models.Enums.Direcao), cmbDir_Direcao.Text);
|
|
double angulo = Convert.ToInt32(sldDir_Angulo.Value);
|
|
|
|
VariaveisControleOperacao.EnviarComandoDirecional(direcao, angulo, tipo, mod_id: label);
|
|
}
|
|
|
|
private void sldDir_Angulo_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
|
|
{
|
|
lblDir_Angulo.Content = $"{Convert.ToInt32(sldDir_Angulo.Value)}°";
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Gnss
|
|
|
|
private void btnGps_Salvar_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
VariaveisControleOperacao.EnviarComandoLeverArm(lateral: sldGps_LeverArmLateral.Value * 10.0, frontal: sldGps_LeverArmFrontal.Value * 10.0);
|
|
}
|
|
|
|
private void sldGps_LeverArmLateral_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
|
|
{
|
|
lblGps_LeverArmLateral.Content = $"{(sldGps_LeverArmLateral.Value * 10.0):00} cm";
|
|
}
|
|
|
|
private void sldGps_LeverArmFrontal_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
|
|
{
|
|
lblGps_LeverArmFrontal.Content = $"{(sldGps_LeverArmFrontal.Value * 10.0):00} cm";
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Trajetoria
|
|
|
|
private void btnTrajetoria_Confirmar_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
(var modulo, var label, var s_code, var iniciado) = GetModuleData(_labelModuloSelecionado);
|
|
if (modulo != AgroBase.Models.Enums.T_Code.Trj)
|
|
return;
|
|
|
|
var _Trajetoria = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Trajetoria;
|
|
int idx_corredor = (_Trajetoria?.PontoAtual?.idxCorredor ?? 0);
|
|
bool bat_liberada = chbTrajetoria_BatLiberada.IsChecked ?? false;
|
|
bool herb_liberado = chbTrajetoria_HerbLiberado.IsChecked ?? false;
|
|
string motivo = _Trajetoria?.AutonomiaCooredor?.Motivo ?? "";
|
|
|
|
if ((bat_liberada || herb_liberado) && MessageBox.Show($"Tem certeza que deseja liberar a entrada do equipamento na próxima rua?\r\n{motivo}", "Confirmação", MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes)
|
|
return;
|
|
|
|
VariaveisControleOperacao.EnviarConfirmacaoHumanaTrajetoria(idx_corredor, bat_liberada, herb_liberado);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Rele
|
|
|
|
private void btnRele_Ligar_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
(var modulo, var label, var s_code, var iniciado) = GetModuleData(_labelModuloSelecionado);
|
|
if (modulo != AgroBase.Models.Enums.T_Code.Sen && s_code != AgroBase.Models.Enums.S_Code.sRLE)
|
|
return;
|
|
|
|
VariaveisControleOperacao.EnviarComandoSensoriamento(label, status: AgroBase.Models.Enums.Estado.Ligado);
|
|
}
|
|
|
|
private void btnRele_Desligar_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
(var modulo, var label, var s_code, var iniciado) = GetModuleData(_labelModuloSelecionado);
|
|
if (modulo != AgroBase.Models.Enums.T_Code.Sen && s_code != AgroBase.Models.Enums.S_Code.sRLE)
|
|
return;
|
|
|
|
VariaveisControleOperacao.EnviarComandoSensoriamento(label, status: AgroBase.Models.Enums.Estado.Desligado);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Servo
|
|
|
|
private void btnServo_Enviar_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
(var modulo, var label, var s_code, var iniciado) = GetModuleData(_labelModuloSelecionado);
|
|
if (s_code != AgroBase.Models.Enums.S_Code.sFRO)
|
|
return;
|
|
|
|
if (modulo == AgroBase.Models.Enums.T_Code.Sen)
|
|
{
|
|
var servo = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Sensoriamento?.Servos?.FirstOrDefault(x => x.ID == label);
|
|
double angulo = Convert.ToInt32(sldServo_Angulo.Value);
|
|
if (!(servo?.Incremental ?? false)) angulo = 180 - angulo;
|
|
|
|
VariaveisControleOperacao.EnviarComandoSensoriamento(label, status: angulo);
|
|
}
|
|
else if (modulo == AgroBase.Models.Enums.T_Code.Atu)
|
|
{
|
|
var servo = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Atuador?.Servos?.FirstOrDefault(x => x.ID == label);
|
|
double angulo = Convert.ToInt32(sldServo_Angulo.Value);
|
|
if (!(servo?.Incremental ?? false)) angulo = 180 - angulo;
|
|
|
|
VariaveisControleOperacao.EnviarComandoAtuador(label, angulo_controle: (int)angulo);
|
|
}
|
|
}
|
|
|
|
private void sldServo_Angulo_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
|
|
{
|
|
if (lblServo_Angulo != null)
|
|
lblServo_Angulo.Content = $"{Convert.ToInt32(sldServo_Angulo.Value):0}°";
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Cooler Control
|
|
|
|
private void btnNpc_CoolerEnviar_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
(var modulo, var label, var s_code, var iniciado) = GetModuleData(_labelModuloSelecionado);
|
|
if (modulo != AgroBase.Models.Enums.T_Code.Npc)
|
|
return;
|
|
|
|
AgroBase.Services.CoolerControlService.CoolerMode Modo = (AgroBase.Services.CoolerControlService.CoolerMode)cmbNpc_CoolerModo.SelectedIndex;
|
|
AgroBase.Models.Enums.Estado Entrada = chbNpc_CoolerEntrada.IsChecked == true ? AgroBase.Models.Enums.Estado.Ligado : AgroBase.Models.Enums.Estado.Desligado;
|
|
AgroBase.Models.Enums.Estado Saida = chbNpc_CoolerSaida.IsChecked == true ? AgroBase.Models.Enums.Estado.Ligado : AgroBase.Models.Enums.Estado.Desligado;
|
|
double TemperaturaLigar = double.Parse(txtNpc_CoolerTempOn.Text);
|
|
double TemperaturaTurbo = double.Parse(txtNpc_CoolerTempTurbo.Text);
|
|
VariaveisControleOperacao.EnviarComandoCoolerControl(Modo, entrada: Entrada, saida: Saida, temp_on: TemperaturaLigar, temp_turbo: TemperaturaTurbo);
|
|
}
|
|
|
|
private void cmbNpc_CoolerModo_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
|
{
|
|
var cmb = sender as ComboBox;
|
|
|
|
switch ((AgroBase.Services.CoolerControlService.CoolerMode)cmb.SelectedIndex)
|
|
{
|
|
case AgroBase.Services.CoolerControlService.CoolerMode.Off:
|
|
chbNpc_CoolerEntrada.IsEnabled = false;
|
|
chbNpc_CoolerSaida.IsEnabled = false;
|
|
chbNpc_CoolerEntrada.IsChecked = false;
|
|
chbNpc_CoolerSaida.IsChecked = false;
|
|
break;
|
|
case AgroBase.Services.CoolerControlService.CoolerMode.Manual:
|
|
chbNpc_CoolerEntrada.IsEnabled = true;
|
|
chbNpc_CoolerSaida.IsEnabled = true;
|
|
chbNpc_CoolerEntrada.IsChecked = false;
|
|
chbNpc_CoolerSaida.IsChecked = false;
|
|
break;
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
private void btnSaude_Salvar_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
(var modulo, var label, var s_code, var iniciado) = GetModuleData(_labelModuloSelecionado);
|
|
if (modulo == AgroBase.Models.Enums.T_Code.Vzo)
|
|
return;
|
|
|
|
var rover = VariaveisControleOperacao.RoverEmFoco;
|
|
|
|
if (rover == null)
|
|
{
|
|
MessageBox.Show($"Sem dados para o módulo {modulo} ({label})");
|
|
return;
|
|
}
|
|
|
|
var mod = rover.ModulosMandatorios.FirstOrDefault(x => x.Dispositivo == modulo);
|
|
if (mod == null)
|
|
{
|
|
mod = new AgroBase.Models.OperacaoModulosMandatoriosModel()
|
|
{
|
|
Dispositivo = modulo,
|
|
ComponentesEmUso = new Dictionary<string, bool>()
|
|
};
|
|
rover.ModulosMandatorios.Add(mod);
|
|
}
|
|
mod.Mandatorio = chbSaude_Mandatorio.IsChecked ?? false;
|
|
if (string.IsNullOrEmpty(label))
|
|
{
|
|
mod.Utilizar = chbSaude_EmUso.IsChecked ?? false;
|
|
}
|
|
else
|
|
{
|
|
mod.ComponentesEmUso[label] = chbSaude_EmUso.IsChecked ?? false;
|
|
}
|
|
|
|
VariaveisControleOperacao.EnviarParametrosOperacao(new AgroBase.Models.Operacoes.OperacaoParametrosModel()
|
|
{
|
|
ModulosMandatorios = rover.ModulosMandatorios,
|
|
});
|
|
}
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
#region POSICAO
|
|
|
|
public void AtualizarDadosTela_GNSS(AgroBase.Models.Operacoes.OperacaoParametrosDadosGNSSModel dados, string? marker_id = null, double progresso = double.NaN)
|
|
{
|
|
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
|
|
{
|
|
try
|
|
{
|
|
bool dados_base = marker_id == VariaveisControleOperacao.BaseMarkerID;
|
|
|
|
lblGNSS_Posicao.Foreground = new SolidColorBrush(dados.Iniciado ? System.Windows.Media.Colors.Green : System.Windows.Media.Colors.Red);
|
|
lblGNSS_Correcao.Content = $"Correção {dados.QualidadeFix} " +
|
|
(dados.QualidadeFix == AgroBase.Models.Enums.TiposCorrecaoGPS.BaseFix ?
|
|
(dados.OrientacaoReal.ToString("0.00") + "°") :
|
|
((dados.NtripAtivado ? "N" : "B") + $" {dados.IdadeCorrecao.ToString("0.0")} s"));
|
|
lblGNSS_Satelites.Content = $"Satélites {dados.NumeroSatelites} ({dados.PrecisaoCm.ToString("0.00")} cm)";
|
|
lblGNSS_Altitude.Content = $"Altitude {dados.Altitude.ToString("0.00")} m";
|
|
|
|
if (dados_base)
|
|
{
|
|
btnGNSS_FixarBase.Visibility = Visibility.Visible;
|
|
if (double.IsNaN(progresso))
|
|
{
|
|
lblGNSS_Progresso.Visibility = Visibility.Collapsed;
|
|
}
|
|
else
|
|
{
|
|
lblGNSS_Progresso.Visibility = Visibility.Visible;
|
|
lblGNSS_Progresso.Content = $"{progresso.ToString("0.00")}%";
|
|
}
|
|
|
|
bool gnss_fix_preciso = new List<AgroBase.Models.Enums.TiposCorrecaoGPS>() { AgroBase.Models.Enums.TiposCorrecaoGPS.RTKFixo, AgroBase.Models.Enums.TiposCorrecaoGPS.RTKFlutuante }.Contains(Variaveis.GpsService?.UltimaLeitura?.QualidadeFix ?? AgroBase.Models.Enums.TiposCorrecaoGPS.SemCorrecao);
|
|
bool gnss_fixado = Variaveis.GpsService?.BaseFix?.CorrecaoAbsoluta ?? false;
|
|
bool gnss_fixando = btnGNSS_FixarBase.Content.ToString() == "Parar";
|
|
|
|
btnGNSS_FixarBase.IsEnabled = (gnss_fix_preciso && !gnss_fixado) || gnss_fixando || gnss_fixado;
|
|
btnGNSS_FixarBase.Content = gnss_fixado || !gnss_fixando ? "Fixar" : "Parar";
|
|
}
|
|
else
|
|
{
|
|
btnGNSS_FixarBase.Visibility = Visibility.Collapsed;
|
|
lblGNSS_Progresso.Visibility = Visibility.Collapsed;
|
|
}
|
|
}
|
|
catch (Exception exUi)
|
|
{
|
|
Variaveis.MostrarLog($"Erro ao atualizar UI GNSS: {exUi.Message}");
|
|
}
|
|
}));
|
|
}
|
|
|
|
private void btnGNSS_FixarBase_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
if (!Variaveis.GpsService.BaseFix.FixLiberado)
|
|
{
|
|
if (Variaveis.GpsService.BaseFix.CorrecaoAbsoluta)
|
|
{
|
|
var res = 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)
|
|
{
|
|
btnGNSS_FixarBase.Content = "Parar";
|
|
Variaveis.GpsService.BaseFix.FixLiberado = true;
|
|
|
|
Task.Run(async () => await Variaveis.GpsService.ConfigurarModulo());
|
|
}
|
|
}
|
|
else
|
|
{
|
|
btnGNSS_FixarBase.Content = "Parar";
|
|
Variaveis.GpsService.BaseFix.FixLiberado = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
btnGNSS_FixarBase.Content = "Fixar";
|
|
Variaveis.GpsService.BaseFix.FixLiberado = false;
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region CONTROLE
|
|
|
|
public void AtualizarDadosTela_Controle(AgroBase.Models.OperacaoControleModel controle, double angulo, double velocidade, bool emergencia, bool pausa, bool refing)
|
|
{
|
|
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
|
|
{
|
|
try
|
|
{
|
|
CTRL.AtualizarDadosControle(
|
|
angSp: controle.Angulo,
|
|
angCur: angulo,
|
|
tipoMov: controle.TipoMovimento,
|
|
velSp: controle.PercentualVelocidadeSPKmh,
|
|
velKmh: velocidade,
|
|
emg: emergencia,
|
|
pause: pausa,
|
|
refing: refing
|
|
);
|
|
}
|
|
catch (Exception exUi)
|
|
{
|
|
Variaveis.MostrarLog($"Erro ao atualizar UI Controle: {exUi.Message}");
|
|
}
|
|
}));
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region PARAMETROS DA OPERACAO
|
|
|
|
public void AtualizarDadosTela_ParametrosOperacao(AgroBase.Models.Operacoes.OperacaoParametrosControleModel? controle)
|
|
{
|
|
if (controle == null) return;
|
|
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
|
|
{
|
|
try
|
|
{
|
|
txtParametros_VelCErvas.Text = controle.MovVelocidadeCErvasPercent.ToString();
|
|
txtParametros_VelSErvas.Text = controle.MovVelocidadeSErvasPercent.ToString();
|
|
txtParametros_AngMax.Text = controle.DirAnguloMaximo.ToString();
|
|
txtParametros_RoiAtuacao.Text = controle.AtuPercentualInicioPulverizacao.ToString();
|
|
txtParametros_AreaAtuacao.Text = controle.AtuAlturaAreaPulverizacao.ToString();
|
|
txtParametros_PressaoLiha.Text = controle.AtuPressaoLinha.ToString();
|
|
txtParametros_PctErvaOn.Text = controle.AtuPercentualErvasBicoOn.ToString();
|
|
txtParametros_PctErvaOff.Text = controle.AtuPercentualErvasBicoOff.ToString();
|
|
txtParametros_TempoOn.Text = controle.AtuDuracaoAtuacao.ToString();
|
|
chbParametros_Pulverizador.IsChecked = controle.PulverizadorAutomatico;
|
|
chbParametros_Frenagem.IsChecked = controle.FrenagemAutomatica;
|
|
chbParametros_Sonar.IsChecked = controle.SonarAtivado;
|
|
}
|
|
catch (Exception exUi)
|
|
{
|
|
Variaveis.MostrarLog($"Erro ao atualizar UI Parametros da Operacao: {exUi.Message}");
|
|
}
|
|
}));
|
|
}
|
|
|
|
private void btnParametros_Salvar_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
var modo = (CTRL.TgManual.IsChecked ?? false) ? AgroBase.Models.Enums.ModoOperacao.Manual : AgroBase.Models.Enums.ModoOperacao.MapaGPS;
|
|
|
|
var rover = VariaveisControleOperacao.RoverEmFoco;
|
|
|
|
VariaveisControleOperacao.EnviarParametrosOperacao(new AgroBase.Models.Operacoes.OperacaoParametrosModel()
|
|
{
|
|
Modo = modo,
|
|
Descricao = "Operacao da base",
|
|
QtdCamerasSolo = 1,
|
|
QtdBicos = 4,
|
|
CapacidadeReservatorio = 45,
|
|
|
|
Controle = new AgroBase.Models.Operacoes.OperacaoParametrosControleModel()
|
|
{
|
|
MovimentoAutomatico = modo != AgroBase.Models.Enums.ModoOperacao.Manual,
|
|
SonarAtivado = chbParametros_Sonar.IsChecked ?? false,
|
|
FrenagemAutomatica = chbParametros_Frenagem.IsChecked ?? false,
|
|
MovVelocidadeCErvasPercent = int.Parse(txtParametros_VelCErvas.Text),
|
|
MovVelocidadeSErvasPercent = int.Parse(txtParametros_VelSErvas.Text),
|
|
|
|
DirAnguloMaximo = int.Parse(txtParametros_AngMax.Text),
|
|
DirTipoMovimento = AgroBase.Models.Enums.TiposControladorDirecional.MPC,
|
|
DirVelocidadeMovimento = 50,
|
|
|
|
PulverizadorAutomatico = chbParametros_Pulverizador.IsChecked ?? false,
|
|
AtuPercentualErvasBicoOn = double.Parse(txtParametros_PctErvaOn.Text),
|
|
AtuPercentualErvasBicoOff = double.Parse(txtParametros_PctErvaOff.Text),
|
|
AtuDuracaoAtuacao = int.Parse(txtParametros_TempoOn.Text),
|
|
AtuAlturaAreaPulverizacao = double.Parse(txtParametros_AreaAtuacao.Text),
|
|
AtuPercentualInicioPulverizacao = double.Parse(txtParametros_RoiAtuacao.Text),
|
|
AtuPressaoLinha = double.Parse(txtParametros_PressaoLiha.Text),
|
|
},
|
|
|
|
ModulosMandatorios = rover?.ModulosMandatorios,
|
|
ParametrosMandatorios = rover?.ParametrosMandatorios,
|
|
|
|
RuasPercorrer = MAP.RuasMapaCarregado.Where(x => x.Selected).Select(x => x.Id).ToList(),
|
|
Mapa = MAP.CriarDadosMapa()
|
|
});
|
|
}
|
|
|
|
private void btnParametros_Atualizar_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
VariaveisControleOperacao.RequisitarParametrosOperacao();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region MAPA
|
|
|
|
private void MAP_MarkerClicked(object? sender, MapMarkerManager.MarkerClickedEventArgs e)
|
|
{
|
|
if (string.IsNullOrEmpty(e.MarkerId))
|
|
{
|
|
Variaveis.MostrarLog($"Sem rover em foco");
|
|
LimparDadosTela_Telemetria(e.MarkerId);
|
|
}
|
|
else
|
|
{
|
|
Variaveis.MostrarLog($"Rover em foco: {e.MarkerId}");
|
|
int idx = cmbDispositivo.Items.IndexOf(e.MarkerId);
|
|
cmbDispositivo.SelectedIndex = idx;
|
|
}
|
|
}
|
|
|
|
private void MAP_StreetMapClicked(object? sender, MapViewControl.StreetMapClickedEventArgs e)
|
|
{
|
|
Variaveis.MostrarLog($"Rua clicada: {e.StreetId}. Ruas selecionadas: {string.Join(",", e.SelectedStreetsIds)}");
|
|
}
|
|
|
|
private void AtualizarDadosTela_Mapa(AgroBase.Models.OperacaoSensoriamentoLogTrajetoriaModel Trajetoria)
|
|
{
|
|
lblMapaInfo_Debug.Content = $"" +
|
|
$"Status: {Trajetoria.AutonomiaCooredor?.Status ?? AgroBase.Models.AutonomiaCorredorStatus.Desconhecido} | " +
|
|
$"Próximo Ponto: {Trajetoria.ProximoPonto.idxPonto} | " +
|
|
(Trajetoria.ProximoPonto.Aproximando ? "Aproximando" : "Afastando") + " | " +
|
|
$"Distância próximo ponto: {Trajetoria.ProximoPonto.DistanciaAtual.ToString("0.00")} m | " +
|
|
$"Distância ponto anterior: {Trajetoria.PontoAtual.DistanciaAtual.ToString("0.00")} m | " +
|
|
$"Corredor: " + (Trajetoria.CorredorAtual.Dentro ? "Dentro" : "Fora") + " | " +
|
|
$"Margem: " + (Trajetoria.NaMargemDoCorredor ? "Sim" : "Não") + " | " +
|
|
$"Carro: {Trajetoria.StatusCarro}";
|
|
|
|
double erroLateral = (Trajetoria.DistanciaEsquerda - Trajetoria.DistanciaDireita) / 2.0 * 100.0;
|
|
AtualizarDadosTela_IMU(erro_lateral: erroLateral);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region HEADING
|
|
|
|
public void AtualizarDadosTela_Heading(double headingRover, double headingCourse = double.NaN)
|
|
{
|
|
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
|
|
{
|
|
try
|
|
{
|
|
HDG.Heading = headingRover;
|
|
HDG.CourseHeading = headingCourse;
|
|
}
|
|
catch (Exception exUi)
|
|
{
|
|
Variaveis.MostrarLog($"Erro ao atualizar UI Heading: {exUi.Message}");
|
|
}
|
|
}));
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region IMU
|
|
|
|
public void AtualizarDadosTela_IMU(double? roll = null, double? pitch = null, double? erro_lateral = null)
|
|
{
|
|
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
|
|
{
|
|
try
|
|
{
|
|
if (roll != null) IMU.RollDeg = (double)roll;
|
|
if (pitch != null) IMU.PitchDeg = (double)pitch;
|
|
if (erro_lateral != null) IMU.LateralError = (double)erro_lateral;
|
|
}
|
|
catch (Exception exUi)
|
|
{
|
|
Variaveis.MostrarLog($"Erro ao atualizar UI IMU: {exUi.Message}");
|
|
}
|
|
}));
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region CAMERA FRONTAL
|
|
|
|
private void IniciarStreamCameraFrontal()
|
|
{
|
|
var path = @"streams\camera_frontal.sdp";
|
|
|
|
if (!File.Exists(path))
|
|
{
|
|
string stream =
|
|
"v=0\r\n" +
|
|
"o=- 0 0 IN IP4 0.0.0.0\r\n" +
|
|
"s=OAK H264\r\n" +
|
|
"c=IN IP4 0.0.0.0\r\n" +
|
|
"t=0 0\r\n" +
|
|
"m=video 5000 RTP/AVP 96\r\n" +
|
|
"a=rtpmap:96 H264/90000\r\n" +
|
|
"a=fmtp:96 packetization-mode=1\r\n";
|
|
File.WriteAllText(path, stream);
|
|
}
|
|
|
|
_mediaFront?.Dispose(); // limpa antigo, se existir
|
|
_mediaFront = new Media(_libVLC, path, FromType.FromPath);
|
|
// _mediaFront.AddOption(":network-caching=150"); // se quiser por arquivo
|
|
|
|
_playerFront.Play(_mediaFront);
|
|
|
|
VariaveisControleOperacao.EnviarComandoTransmissaoVideo(AgroBase.Models.Enums.T_Code.Snr, true);
|
|
}
|
|
|
|
private void PararStreamCameraFrontal(bool finalizar = false)
|
|
{
|
|
_playerFront?.Stop();
|
|
|
|
if (finalizar)
|
|
{
|
|
_mediaFront?.Dispose();
|
|
_mediaFront = null;
|
|
_playerFront?.Dispose();
|
|
_playerFront = null;
|
|
}
|
|
|
|
VariaveisControleOperacao.EnviarComandoTransmissaoVideo(AgroBase.Models.Enums.T_Code.Snr, false);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region CAMERA ERVAS
|
|
|
|
private void IniciarStreamCameraErvas()
|
|
{
|
|
var path = @"streams\camera_ervas.sdp";
|
|
|
|
if (!File.Exists(path))
|
|
{
|
|
string stream =
|
|
"v=0\r\n" +
|
|
"o=- 0 0 IN IP4 0.0.0.0\r\n" +
|
|
"s=OAK H264\r\n" +
|
|
"c=IN IP4 0.0.0.0\r\n" +
|
|
"t=0 0\r\n" +
|
|
"m=video 5002 RTP/AVP 96\r\n" + // <- porta 5001
|
|
"a=rtpmap:96 H264/90000\r\n" +
|
|
"a=fmtp:96 packetization-mode=1\r\n";
|
|
File.WriteAllText(path, stream);
|
|
}
|
|
|
|
_mediaWeed?.Dispose();
|
|
_mediaWeed = new Media(_libVLC, path, FromType.FromPath);
|
|
// _mediaWeed.AddOption(":network-caching=150");
|
|
|
|
_playerWeed.Play(_mediaWeed);
|
|
|
|
VariaveisControleOperacao.EnviarComandoTransmissaoVideo(AgroBase.Models.Enums.T_Code.Cam, true);
|
|
}
|
|
|
|
private void PararStreamCameraErvas(bool finalizar = false)
|
|
{
|
|
_playerWeed?.Stop();
|
|
|
|
if (finalizar)
|
|
{
|
|
_mediaWeed?.Dispose();
|
|
_mediaWeed = null;
|
|
_playerWeed?.Dispose();
|
|
_playerWeed = null;
|
|
}
|
|
|
|
VariaveisControleOperacao.EnviarComandoTransmissaoVideo(AgroBase.Models.Enums.T_Code.Cam, false);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region PULVERIZADOR
|
|
|
|
private void AtualizarDadosTela_Pulverizador(AgroBase.Models.Operacoes.OperacaoParametrosDadosModel dados)
|
|
{
|
|
var bomba = dados.Atuador?.Bombas?.FirstOrDefault();
|
|
|
|
ATU.ComprimentoBarraCm = AgroBase.Models.VariaveisEquipamento.ComprimentoBarraPulverizadoraCm;
|
|
ATU.DistanciaEntreBicosCm = AgroBase.Models.VariaveisEquipamento.DistanciaEntreBicosCm;
|
|
ATU.AlturaBarra = dados?.Controle?.AlturaBarra ?? AgroBase.Models.VariaveisEquipamento.AlturaBarraPulverizadoraCm;
|
|
ATU.IsBombaOn = bomba?.LeituraEstado ?? false;
|
|
ATU.PressaoLinha = dados?.Atuador?.PressaoLinhaPsi ?? 0;
|
|
ATU.VazaoInstantanea = dados?.Atuador?.VazaoInstantaneaMLs ?? 0;
|
|
ATU.TempoAtuado = (bomba?.TempoAtuado ?? 0) / 1000.0;
|
|
|
|
double erroLateral = ((dados?.Trajetoria?.DistanciaEsquerda ?? 0) - (dados?.Trajetoria?.DistanciaDireita ?? 0)) / 2.0 * 100.0;
|
|
ATU.LarguraRuaCm = 100.0;
|
|
ATU.ErroLateralCm = erroLateral;
|
|
|
|
if (ATU.QtdBicos != dados?.Atuador?.Bicos?.Count)
|
|
{
|
|
ATU.QtdBicos = dados?.Atuador?.Bicos?.Count ?? AgroBase.Models.VariaveisEquipamento.QuantidadeBicosPulverizadores;
|
|
}
|
|
|
|
foreach (var bico in ATU.Bicos)
|
|
{
|
|
var _bc = dados?.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.MediaVazaoMLs;
|
|
bico.Atuacoes = _bc.QtdAtuacoes;
|
|
bico.TempoAtuado = _bc.TempoAtuado / 1000.0;
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region LIDAR
|
|
|
|
public void AtualizarDadostela_LIDAR(List<AgroBase.Models.LivoxBboxModel> bboxes)
|
|
{
|
|
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
|
|
{
|
|
try
|
|
{
|
|
BBoxes3D.SetBboxes(bboxes);
|
|
}
|
|
catch (Exception exUi)
|
|
{
|
|
Variaveis.MostrarLog($"Erro ao atualizar UI Lidar: {exUi.Message}");
|
|
}
|
|
}));
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
#region ALERTAS
|
|
|
|
public ObservableCollection<AlertaModel> AlertasAtivos { get; } = new();
|
|
|
|
private AlertaModel _toastAlerta;
|
|
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));
|
|
|
|
private System.Windows.Point _scrollDragStartPoint;
|
|
private double _scrollDragStartOffset;
|
|
private bool _isDraggingScroll;
|
|
|
|
private void svAlertas_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
|
|
{
|
|
if (sender is ScrollViewer sv)
|
|
{
|
|
_isDraggingScroll = true;
|
|
_scrollDragStartPoint = e.GetPosition(sv);
|
|
_scrollDragStartOffset = sv.HorizontalOffset;
|
|
sv.CaptureMouse();
|
|
}
|
|
}
|
|
|
|
private void svAlertas_PreviewMouseMove(object sender, System.Windows.Input.MouseEventArgs e)
|
|
{
|
|
if (_isDraggingScroll && sender is ScrollViewer sv && e.LeftButton == MouseButtonState.Pressed)
|
|
{
|
|
var currentPoint = e.GetPosition(sv);
|
|
var deltaX = currentPoint.X - _scrollDragStartPoint.X;
|
|
|
|
// Inverte o sinal pra "puxar" pro lado que arrasta
|
|
sv.ScrollToHorizontalOffset(_scrollDragStartOffset - deltaX);
|
|
}
|
|
}
|
|
|
|
private void svAlertas_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
|
|
{
|
|
if (sender is ScrollViewer sv)
|
|
{
|
|
_isDraggingScroll = false;
|
|
sv.ReleaseMouseCapture();
|
|
}
|
|
}
|
|
|
|
public void AdicionarAlerta(string Rover_ID, AgroBase.Models.Enums.T_Code Modulo, SeveridadeAlerta Severidade, string Mensagem, string? Mod_ID = null)
|
|
{
|
|
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
|
|
{
|
|
try
|
|
{
|
|
var existente = AlertasAtivos.FirstOrDefault(x => x.Rover_ID == Rover_ID && x.Modulo == Modulo && x.Mod_ID == Mod_ID);
|
|
if (existente == null)
|
|
{
|
|
var alerta = new AlertaModel
|
|
{
|
|
Rover_ID = Rover_ID,
|
|
Severidade = Severidade,
|
|
Modulo = Modulo,
|
|
Mod_ID = Mod_ID,
|
|
Mensagem = Mensagem,
|
|
Timestamp = DateTime.Now,
|
|
};
|
|
AlertasAtivos.Add(alerta);
|
|
|
|
// 🔔 dispara o toast para NOVO alerta
|
|
MostrarToast(alerta);
|
|
}
|
|
else
|
|
{
|
|
existente.Mensagem = Mensagem;
|
|
existente.Severidade = Severidade;
|
|
}
|
|
}
|
|
catch (Exception exUi)
|
|
{
|
|
Variaveis.MostrarLog($"Erro ao adicionar alerta: {exUi.Message}");
|
|
}
|
|
}));
|
|
}
|
|
|
|
public void RemoverAlerta(string Rover_ID, AgroBase.Models.Enums.T_Code Modulo, SeveridadeAlerta? Severidade = null, string? Mod_ID = null)
|
|
{
|
|
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
|
|
{
|
|
try
|
|
{
|
|
var alerta = AlertasAtivos.FirstOrDefault(x => x.Rover_ID == Rover_ID && x.Modulo == Modulo && x.Mod_ID == Mod_ID && (Severidade != null ? x.Severidade == Severidade : true));
|
|
if (alerta != null)
|
|
{
|
|
AlertasAtivos.Remove(alerta);
|
|
}
|
|
}
|
|
catch (Exception exUi)
|
|
{
|
|
Variaveis.MostrarLog($"Erro ao remover alerta: {exUi.Message}");
|
|
}
|
|
}));
|
|
}
|
|
|
|
private void Alerta_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
|
|
{
|
|
if (sender is Border border && border.DataContext is AlertaModel alerta)
|
|
{
|
|
var nome = $"lblDiagnosticos_{alerta.Modulo.ToString().ToUpper()}" + ((!string.IsNullOrEmpty(alerta.Mod_ID) && alerta.Mod_ID != AgroBase.Models.Enums.S_Code.sMOD.ToString()) ? $"_{alerta.Mod_ID}" : "");
|
|
var nome_mod = $"lblDiagnosticos_{alerta.Modulo.ToString().ToUpper()}";
|
|
var label = this.FindName(nome) as Label;
|
|
if (label == null) label = this.FindName(nome_mod) as Label;
|
|
if (label != null)
|
|
{
|
|
if (alerta.Rover_ID != VariaveisControleOperacao.SelectedRoverId)
|
|
{
|
|
int idx = cmbDispositivo.Items.IndexOf(alerta.Rover_ID);
|
|
cmbDispositivo.SelectedIndex = idx;
|
|
}
|
|
DiagnosticoModulo_Click(label, e);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void MostrarToast(AlertaModel alerta)
|
|
{
|
|
ToastAlerta = alerta;
|
|
_toastTimer.Stop();
|
|
_toastTimer.Start();
|
|
}
|
|
|
|
private void ToastAlerta_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
|
|
{
|
|
var alerta = ToastAlerta;
|
|
if (alerta == null)
|
|
return;
|
|
|
|
_toastTimer.Stop();
|
|
ToastAlerta = null;
|
|
|
|
var nome = $"lblDiagnosticos_{alerta.Modulo.ToString().ToUpper()}" + ((!string.IsNullOrEmpty(alerta.Mod_ID) && alerta.Mod_ID != AgroBase.Models.Enums.S_Code.sMOD.ToString()) ? $"_{alerta.Mod_ID}" : "");
|
|
var nome_mod = $"lblDiagnosticos_{alerta.Modulo.ToString().ToUpper()}";
|
|
var label = this.FindName(nome) as Label;
|
|
if (label == null) label = this.FindName(nome_mod) as Label;
|
|
if (label != null)
|
|
{
|
|
if (alerta.Rover_ID != VariaveisControleOperacao.SelectedRoverId)
|
|
{
|
|
int idx = cmbDispositivo.Items.IndexOf(alerta.Rover_ID);
|
|
cmbDispositivo.SelectedIndex = idx;
|
|
}
|
|
DiagnosticoModulo_Click(label, e);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
} |