agrobot_base/AgroBase/OperationControl/ViewModels/Views/Operacao/Diagnostico/DiagnosticoViewModel.cs

755 lines
38 KiB
C#

using OperationControl.ViewModels.Base;
using System.Collections.ObjectModel;
using System.Windows.Input;
using OperationControl.Helpers;
using static AgroBase.Models.Enums;
using AgroBase.Models.Operacoes;
using OperationControl.Models;
using Newtonsoft.Json.Linq;
namespace OperationControl.ViewModels.Views.Operacao.Diagnostico
{
public class DiagnosticoViewModel : NotifyBase
{
public ObservableCollection<DiagnosticoModuloItemViewModel> DiagnosticoModulos { get; set; } = new ObservableCollection<DiagnosticoModuloItemViewModel>();
public DiagnosticoOpcoesViewModel OpcoesVM { get; } = new DiagnosticoOpcoesViewModel();
public ObservableCollection<DiagnosticoGraficoSerieViewModel> SeriesGrafico { get; } = new ObservableCollection<DiagnosticoGraficoSerieViewModel>();
public ObservableCollection<string> LabelsGrafico { get; } = new ObservableCollection<string>();
private string _ultimoIdGrafico = "";
private DiagnosticoModuloItemViewModel _moduloSelecionado;
public DiagnosticoModuloItemViewModel ModuloSelecionado
{
get => _moduloSelecionado;
set
{
if (_moduloSelecionado == value)
return;
if (_moduloSelecionado != null)
_moduloSelecionado.Selecionado = false;
_moduloSelecionado = value;
if (_moduloSelecionado != null)
_moduloSelecionado.Selecionado = true;
OnPropertyChanged();
AtualizarResumoModuloSelecionado();
}
}
public ICommand SelecionarModuloCommand { get; }
public ICommand SalvarSaudeCommand { get; }
public DiagnosticoViewModel()
{
SelecionarModuloCommand = new RelayCommand(SelecionarModulo);
SalvarSaudeCommand = new RelayCommand(SalvarSaudeModulo);
InicializarModulos();
}
private void InicializarModulos()
{
DiagnosticoModulos.Clear();
// =============================
// BARRAMENTO DE TENSÕES
// =============================
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "BAT", Modulo = T_Code.Bat, LabelModulo = "", SCode = S_Code.sVZO, TextoBase = "BAT", Left = 70, Top = 70 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_AB3V", Modulo = T_Code.Sen, LabelModulo = "AB3V", SCode = S_Code.sCOR, TextoBase = "B3V3", Left = 145, Top = 70 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_AB5V", Modulo = T_Code.Sen, LabelModulo = "AB5V", SCode = S_Code.sCOR, TextoBase = "B5V0", Left = 220, Top = 70 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_AB7V2", Modulo = T_Code.Sen, LabelModulo = "AB7V2", SCode = S_Code.sCOR, TextoBase = "B7V2", Left = 295, Top = 70 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_AB12V", Modulo = T_Code.Sen, LabelModulo = "AB12V", SCode = S_Code.sCOR, TextoBase = "B12V", Left = 370, Top = 70 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_AB19V", Modulo = T_Code.Sen, LabelModulo = "AB19V", SCode = S_Code.sCOR, TextoBase = "B19V", Left = 445, Top = 70 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_AB24V", Modulo = T_Code.Sen, LabelModulo = "AB24V", SCode = S_Code.sCOR, TextoBase = "B24V", Left = 520, Top = 70 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_AB36V", Modulo = T_Code.Sen, LabelModulo = "AB36V", SCode = S_Code.sCOR, TextoBase = "B36V", Left = 595, Top = 70 });
// =============================
// FRENTE ESQUERDA
// =============================
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "DIR_EF", Modulo = T_Code.Dir, LabelModulo = "EF", SCode = S_Code.sVZO, TextoBase = "DIR", Left = 95, Top = 130 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "MOV_EF", Modulo = T_Code.Mov, LabelModulo = "EF", SCode = S_Code.sVZO, TextoBase = "MOV", Left = 95, Top = 170 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_FROEF", Modulo = T_Code.Sen, LabelModulo = "FROEF", SCode = S_Code.sSRV, TextoBase = "FRO", Left = 30, Top = 170 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_MAGEF", Modulo = T_Code.Sen, LabelModulo = "MAGEF", SCode = S_Code.sMAG, TextoBase = "MAG", Left = 30, Top = 210 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_TMVEF", Modulo = T_Code.Sen, LabelModulo = "TMVEF", SCode = S_Code.sNTC, TextoBase = "TMP", Left = 95, Top = 210 });
// =============================
// FRENTE DIREITA
// =============================
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "DIR_DF", Modulo = T_Code.Dir, LabelModulo = "DF", SCode = S_Code.sVZO, TextoBase = "DIR", Left = 540, Top = 130 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "MOV_DF", Modulo = T_Code.Mov, LabelModulo = "DF", SCode = S_Code.sVZO, TextoBase = "MOV", Left = 540, Top = 170 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_FRODF", Modulo = T_Code.Sen, LabelModulo = "FRODF", SCode = S_Code.sSRV, TextoBase = "FRO", Left = 605, Top = 170 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_MAGDF", Modulo = T_Code.Sen, LabelModulo = "MAGDF", SCode = S_Code.sMAG, TextoBase = "MAG", Left = 605, Top = 210 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_TMVDF", Modulo = T_Code.Sen, LabelModulo = "TMVDF", SCode = S_Code.sNTC, TextoBase = "TMP", Left = 540, Top = 210 });
// =============================
// CENTRO ROBÔ
// =============================
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SNR", Modulo = T_Code.Snr, LabelModulo = "", SCode = S_Code.sVZO, TextoBase = "SNR", Left = 315, Top = 130 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "LVX", Modulo = T_Code.Lvx, LabelModulo = "", SCode = S_Code.sVZO, TextoBase = "LDR", Left = 315, Top = 170 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "IMU", Modulo = T_Code.Imu, LabelModulo = "", SCode = S_Code.sVZO, TextoBase = "IMU", Left = 315, Top = 210 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "GPS", Modulo = T_Code.Gps, LabelModulo = "", SCode = S_Code.sVZO, TextoBase = "GPS", Left = 315, Top = 270 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN", Modulo = T_Code.Sen, LabelModulo = "", SCode = S_Code.sMOD, TextoBase = "SEN", Left = 315, Top = 310 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "NPC", Modulo = T_Code.Npc, LabelModulo = "", SCode = S_Code.sVZO, TextoBase = "NCP", Left = 315, Top = 350 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_RLCIN", Modulo = T_Code.Sen, LabelModulo = "RLCIN", SCode = S_Code.sRLE, TextoBase = "CLE", Left = 160, Top = 310 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_RLCOUT", Modulo = T_Code.Sen, LabelModulo = "RLCOUT", SCode = S_Code.sRLE, TextoBase = "CLS", Left = 470, Top = 310 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "CAN", Modulo = T_Code.Can, LabelModulo = "", SCode = S_Code.sVZO, TextoBase = "CAN", Left = 610, Top = 270 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "IPB", Modulo = T_Code.Ipb, LabelModulo = "", SCode = S_Code.sVZO, TextoBase = "LAN", Left = 610, Top = 310 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "TRJ", Modulo = T_Code.Trj, LabelModulo = "", SCode = S_Code.sVZO, TextoBase = "TRAJ", Left = 610, Top = 350 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_LEDOP", Modulo = T_Code.Sen, LabelModulo = "LEDOP", SCode = S_Code.sLED, TextoBase = "OP", Left = 20, Top = 270 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_LEDMN", Modulo = T_Code.Sen, LabelModulo = "LEDMN", SCode = S_Code.sLED, TextoBase = "MN", Left = 20, Top = 310 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_LEDAT", Modulo = T_Code.Sen, LabelModulo = "LEDAT", SCode = S_Code.sLED, TextoBase = "AT", Left = 20, Top = 350 });
// =============================
// TRASEIRA ESQUERDA
// =============================
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "DIR_ET", Modulo = T_Code.Dir, LabelModulo = "ET", SCode = S_Code.sVZO, TextoBase = "DIR", Left = 95, Top = 470 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "MOV_ET", Modulo = T_Code.Mov, LabelModulo = "ET", SCode = S_Code.sVZO, TextoBase = "MOV", Left = 95, Top = 510 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_FROET", Modulo = T_Code.Sen, LabelModulo = "FROET", SCode = S_Code.sSRV, TextoBase = "FRO", Left = 30, Top = 510 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_MAGET", Modulo = T_Code.Sen, LabelModulo = "MAGET", SCode = S_Code.sMAG, TextoBase = "MAG", Left = 30, Top = 550 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_TMVET", Modulo = T_Code.Sen, LabelModulo = "TMVET", SCode = S_Code.sNTC, TextoBase = "TMP", Left = 95, Top = 550 });
// =============================
// TRASEIRA DIREITA
// =============================
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "DIR_DT", Modulo = T_Code.Dir, LabelModulo = "DT", SCode = S_Code.sVZO, TextoBase = "DIR", Left = 540, Top = 470 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "MOV_DT", Modulo = T_Code.Mov, LabelModulo = "DT", SCode = S_Code.sVZO, TextoBase = "MOV", Left = 540, Top = 510 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_FRODT", Modulo = T_Code.Sen, LabelModulo = "FRODT", SCode = S_Code.sSRV, TextoBase = "FRO", Left = 605, Top = 510 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_MAGDT", Modulo = T_Code.Sen, LabelModulo = "MAGDT", SCode = S_Code.sMAG, TextoBase = "MAG", Left = 605, Top = 550 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "SEN_TMVDT", Modulo = T_Code.Sen, LabelModulo = "TMVDT", SCode = S_Code.sNTC, TextoBase = "TMP", Left = 540, Top = 550 });
// =============================
// ATUADOR / SISTEMA DE PULVERIZAÇÃO
// =============================
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "ATU_PRSLN", Modulo = T_Code.Atu, LabelModulo = "PRSLN", SCode = S_Code.sPRS, TextoBase = "PRS", Left = 230, Top = 610 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "ATU", Modulo = T_Code.Atu, LabelModulo = "", SCode = S_Code.sMOD, TextoBase = "ATU", Left = 315, Top = 610 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "ATU_FLXLN", Modulo = T_Code.Atu, LabelModulo = "FLXLN", SCode = S_Code.sFLX, TextoBase = "FLX", Left = 400, Top = 610 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "ATU_BOMBA", Modulo = T_Code.Atu, LabelModulo = "BOMBA", SCode = S_Code.sBMB, TextoBase = "BMB", Left = 230, Top = 650 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "ATU_MASRS", Modulo = T_Code.Atu, LabelModulo = "MASRS", SCode = S_Code.sMAS, TextoBase = "MAS", Left = 400, Top = 650 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "CAM", Modulo = T_Code.Cam, LabelModulo = "", SCode = S_Code.sVZO, TextoBase = "CAM", Left = 315, Top = 650 });
// =============================
// BICOS
// =============================
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "ATU_SRVB1", Modulo = T_Code.Atu, LabelModulo = "SRVB1", SCode = S_Code.sSRV, TextoBase = "SVB1", Left = 110, Top = 705 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "ATU_B01", Modulo = T_Code.Atu, LabelModulo = "B01", SCode = S_Code.sBIC, TextoBase = "B01", Left = 110, Top = 745 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "ATU_MAGESQ", Modulo = T_Code.Atu, LabelModulo = "MAGESQ", SCode = S_Code.sMAG, TextoBase = "MAG", Left = 215, Top = 730 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "ATU_MAGALT", Modulo = T_Code.Atu, LabelModulo = "MAGALT", SCode = S_Code.sMAG, TextoBase = "MAG", Left = 315, Top = 705 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "ATU_MAGDIR", Modulo = T_Code.Atu, LabelModulo = "MAGDIR", SCode = S_Code.sMAG, TextoBase = "MAG", Left = 415, Top = 730 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "ATU_B02", Modulo = T_Code.Atu, LabelModulo = "B02", SCode = S_Code.sBIC, TextoBase = "B02", Left = 315, Top = 745 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "ATU_SRVB3", Modulo = T_Code.Atu, LabelModulo = "SRVB3", SCode = S_Code.sSRV, TextoBase = "SVB3", Left = 520, Top = 705 });
DiagnosticoModulos.Add(new DiagnosticoModuloItemViewModel { IdVisual = "ATU_B03", Modulo = T_Code.Atu, LabelModulo = "B03", SCode = S_Code.sBIC, TextoBase = "B03", Left = 520, Top = 745 });
}
private void SelecionarModulo(object parameter)
{
if (parameter is DiagnosticoModuloItemViewModel item)
ModuloSelecionado = item;
}
#region RESUMO
private string _tituloModuloSelecionado = "Nenhum módulo selecionado";
public string TituloModuloSelecionado
{
get => _tituloModuloSelecionado;
set => SetProperty(ref _tituloModuloSelecionado, value);
}
private string _descricaoModuloSelecionado = "Selecione um módulo no mapa para visualizar os detalhes.";
public string DescricaoModuloSelecionado
{
get => _descricaoModuloSelecionado;
set => SetProperty(ref _descricaoModuloSelecionado, value);
}
private OperacaoParametrosModel _dadosOperacaoAtual;
private string _impedimentoModuloSelecionado = "Impedimento: Nenhum";
public string ImpedimentoModuloSelecionado
{
get => _impedimentoModuloSelecionado;
set => SetProperty(ref _impedimentoModuloSelecionado, value);
}
private string _infoSaude = "Saúde: -";
public string InfoSaude
{
get => _infoSaude;
set => SetProperty(ref _infoSaude, value);
}
private string _infoCan = "CAN: -";
public string InfoCan
{
get => _infoCan;
set => SetProperty(ref _infoCan, value);
}
private string _infoLatencia = "Latência: -";
public string InfoLatencia
{
get => _infoLatencia;
set => SetProperty(ref _infoLatencia, value);
}
private bool _mandatorioSelecionado;
public bool MandatorioSelecionado
{
get => _mandatorioSelecionado;
set => SetProperty(ref _mandatorioSelecionado, value);
}
private bool _emUsoSelecionado;
public bool EmUsoSelecionado
{
get => _emUsoSelecionado;
set => SetProperty(ref _emUsoSelecionado, value);
}
public ObservableCollection<string> CondicoesOperacionais { get; } = new();
public ObservableCollection<string> LogsModuloSelecionado { get; } = new();
private string _infoModulo = "Módulo: -";
public string InfoModulo
{
get => _infoModulo;
set => SetProperty(ref _infoModulo, value);
}
private string _infoLabel = "Label: -";
public string InfoLabel
{
get => _infoLabel;
set => SetProperty(ref _infoLabel, value);
}
private string _infoSCode = "SCode: -";
public string InfoSCode
{
get => _infoSCode;
set => SetProperty(ref _infoSCode, value);
}
private string _infoStatus = "Status: -";
public string InfoStatus
{
get => _infoStatus;
set => SetProperty(ref _infoStatus, value);
}
private string _infoIniciado = "Iniciado: -";
public string InfoIniciado
{
get => _infoIniciado;
set => SetProperty(ref _infoIniciado, value);
}
private string _infoMandatorio = "Mandatório: -";
public string InfoMandatorio
{
get => _infoMandatorio;
set => SetProperty(ref _infoMandatorio, value);
}
private string _infoEmUso = "Em uso: -";
public string InfoEmUso
{
get => _infoEmUso;
set => SetProperty(ref _infoEmUso, value);
}
private string _infoIdVisual = "ID visual: -";
public string InfoIdVisual
{
get => _infoIdVisual;
set => SetProperty(ref _infoIdVisual, value);
}
private void AtualizarResumoModuloSelecionado()
{
CondicoesOperacionais.Clear();
LogsModuloSelecionado.Clear();
if (ModuloSelecionado == null || _dadosOperacaoAtual == null)
{
TituloModuloSelecionado = "Nenhum módulo selecionado";
DescricaoModuloSelecionado = "Selecione um módulo no mapa para visualizar os detalhes.";
InfoModulo = "Módulo: -";
InfoLabel = "Label: -";
InfoSCode = "SCode: -";
InfoStatus = "Status: -";
InfoIniciado = "Iniciado: -";
InfoMandatorio = "Mandatório: -";
InfoEmUso = "Em uso: -";
InfoIdVisual = "ID visual: -";
InfoSaude = "Saúde: -";
InfoCan = "CAN: -";
InfoLatencia = "Latência: -";
ImpedimentoModuloSelecionado = "Impedimento: Nenhum";
MandatorioSelecionado = false;
EmUsoSelecionado = false;
return;
}
var rover = _dadosOperacaoAtual.DadosLeitura;
var item = ModuloSelecionado;
var saudeModulo = rover?.ModulosSaude?.FirstOrDefault(x => x.modulo == item.Modulo);
var individual = saudeModulo?.saude_individual?.FirstOrDefault(x => x.label == item.LabelModulo);
var dispositivo = rover?.DispositivosMapeados?.FirstOrDefault(x => x.Dispositivo == item.Modulo && x.Mod_ID == item.LabelModulo);
var status = individual?.status ?? saudeModulo?.status ?? StatusModulo.Desconectado;
var saude = individual?.saude ?? saudeModulo?.saude ?? 0;
var motivos = string.Join(", ", (individual?.motivos ?? saudeModulo?.motivos) ?? new List<string>());
DateTime ucr = DateTime.MinValue;
if (item.Modulo == T_Code.Sen)
ucr = rover?.Sensoriamento?.UltimoComandoRespondido ?? DateTime.MinValue;
else if (item.Modulo == T_Code.Atu)
ucr = rover?.Atuador?.UltimoComandoRespondido ?? DateTime.MinValue;
else if (item.Modulo == T_Code.Mov)
ucr = rover?.Movimentacao?.Modulos?.FirstOrDefault(x => x.Mod_ID == item.LabelModulo)?.UltimoComandoRespondido ?? DateTime.MinValue;
else if (item.Modulo == T_Code.Dir)
ucr = rover?.Direcional?.Modulos?.FirstOrDefault(x => x.Mod_ID == item.LabelModulo)?.UltimoComandoRespondido ?? DateTime.MinValue;
else
ucr = rover?.Momento ?? DateTime.MinValue;
DateTime momento = rover?.Momento ?? DateTime.MinValue;
double canLatencia = (ucr - momento).TotalMilliseconds;
TituloModuloSelecionado = $"Saúde do módulo {item.TextoBase}";
DescricaoModuloSelecionado = $"Detalhes reais do item selecionado no mapa de diagnóstico.";
InfoModulo = $"Módulo: {item.Modulo}";
InfoLabel = $"Label: {(string.IsNullOrWhiteSpace(item.LabelModulo) ? "-" : item.LabelModulo)}";
InfoSCode = $"SCode: {item.SCode}";
InfoStatus = $"Status: {status}";
InfoIniciado = $"Iniciado: {(item.Iniciado ? "Sim" : "Não")}";
InfoMandatorio = $"Mandatório: {(item.Mandatorio ? "Sim" : "Não")}";
InfoEmUso = $"Em uso: {(item.EmUso ? "Sim" : "Não")}";
InfoIdVisual = $"ID visual: {item.IdVisual}";
InfoSaude = $"Saúde: {saude:0}%";
InfoCan = $"CAN: {canLatencia:0} ms";
InfoLatencia = $"Latência: {dispositivo?.Latencia ?? 0} ms";
ImpedimentoModuloSelecionado = $"Impedimento: {(string.IsNullOrWhiteSpace(motivos) ? "Nenhum" : motivos)}";
MandatorioSelecionado = item.Mandatorio;
EmUsoSelecionado = item.EmUso;
if (saudeModulo?.condicoes_operacionais != null)
{
foreach (var cond in saudeModulo.condicoes_operacionais)
CondicoesOperacionais.Add($"{cond.descricao} (Valor: {cond.valor}, Severidade: {cond.severidade:0}%)");
}
var logs = rover?.Logs?.Where(x => x.Dispositivo == item.Modulo);
if (!string.IsNullOrWhiteSpace(item.LabelModulo))
logs = logs?.Where(x => x.ID == item.LabelModulo);
else
logs = logs?.Where(x => x.ID == null);
if (logs != null)
{
foreach (var log in logs)
LogsModuloSelecionado.Add($"{log.Momento:HH:mm:ss.fff} - {log.Mensagem}");
}
OpcoesVM?.Atualizar(ModuloSelecionado, _dadosOperacaoAtual);
AtualizarGraficoModuloSelecionado();
}
public void AtualizarDados(OperacaoParametrosModel dados)
{
_dadosOperacaoAtual = dados;
if (dados == null)
return;
foreach (var item in DiagnosticoModulos)
{
item.Status = ObterStatusModulo(item, dados);
item.Mandatorio = ObterMandatorio(item, dados);
item.EmUso = ObterEmUso(item, dados);
item.Iniciado = ObterIniciado(item, dados);
}
AtualizarResumoModuloSelecionado();
}
private StatusModulo ObterStatusModulo(DiagnosticoModuloItemViewModel item, OperacaoParametrosModel dados)
{
var saudeModulo = dados?.DadosLeitura?.ModulosSaude?.FirstOrDefault(x => x.modulo == item.Modulo);
if (saudeModulo == null)
return StatusModulo.Desconectado;
var individual = saudeModulo.saude_individual?.FirstOrDefault(x => x.label == item.LabelModulo);
return individual?.status ?? saudeModulo.status;
}
private bool ObterMandatorio(DiagnosticoModuloItemViewModel item, OperacaoParametrosModel dados)
{
if (dados == null)
return false;
if (!string.IsNullOrWhiteSpace(item.LabelModulo))
{
return dados.DadosLeitura?.Operacao?.ModulosMandatorios?
.FirstOrDefault(x => x.Dispositivo == item.Modulo)?
.ComponentesEmUso?
.Any(x => x.Key == item.LabelModulo && x.Value.Item1) ?? false;
}
return dados.ModulosMandatorios?.Any(x => x.Dispositivo == item.Modulo && x.Mandatorio) ?? false;
}
private bool ObterEmUso(DiagnosticoModuloItemViewModel item, OperacaoParametrosModel dados)
{
if (dados == null)
return false;
if (!string.IsNullOrWhiteSpace(item.LabelModulo))
{
return dados.DadosLeitura?.Operacao?.ModulosMandatorios?
.FirstOrDefault(x => x.Dispositivo == item.Modulo)?
.ComponentesEmUso?
.Any(x => x.Key == item.LabelModulo && x.Value.Item2) ?? false;
}
return dados.ModulosMandatorios?.Any(x => x.Dispositivo == item.Modulo && x.Utilizar) ?? false;
}
private bool ObterIniciado(DiagnosticoModuloItemViewModel item, OperacaoParametrosModel dados)
{
var rover = dados?.DadosLeitura;
if (rover == null)
return false;
switch (item.Modulo)
{
case T_Code.Mov:
return rover.Movimentacao?.Modulos?.FirstOrDefault(x => x.Mod_ID == item.LabelModulo)?.Iniciado ?? false;
case T_Code.Dir:
return rover.Direcional?.Modulos?.FirstOrDefault(x => x.Mod_ID == item.LabelModulo)?.Iniciado ?? false;
case T_Code.Atu:
if (string.IsNullOrWhiteSpace(item.LabelModulo))
return rover.Atuador?.Iniciado ?? false;
switch (item.SCode)
{
case S_Code.sBIC:
return rover.Atuador?.Bicos?.FirstOrDefault(x => x.ID == item.LabelModulo)?.Inicializado ?? false;
case S_Code.sBMB:
return rover.Atuador?.Bombas?.FirstOrDefault(x => x.ID == item.LabelModulo)?.Inicializado ?? false;
case S_Code.sSRV:
return rover.Atuador?.Servos?.FirstOrDefault(x => x.ID == item.LabelModulo)?.Inicializado ?? false;
default:
return rover.Atuador?.Sensores?.FirstOrDefault(x => x.ID == item.LabelModulo && x.Componente == item.SCode)?.Inicializado ?? false;
}
case T_Code.Sen:
if (string.IsNullOrWhiteSpace(item.LabelModulo))
return rover.Sensoriamento?.Iniciado ?? false;
switch (item.SCode)
{
case S_Code.sLED:
return rover.Sensoriamento?.Sinaleiros?.FirstOrDefault(x => x.ID == item.LabelModulo)?.Inicializado ?? false;
case S_Code.sRLE:
return rover.Sensoriamento?.Reles?.FirstOrDefault(x => x.ID == item.LabelModulo)?.Inicializado ?? false;
case S_Code.sSRV:
return rover.Sensoriamento?.Servos?.FirstOrDefault(x => x.ID == item.LabelModulo)?.Inicializado ?? false;
default:
return rover.Sensoriamento?.Sensores?.FirstOrDefault(x => x.ID == item.LabelModulo && x.Componente == item.SCode)?.Inicializado ?? false;
}
case T_Code.Imu:
return rover.Imu?.Iniciado ?? false;
case T_Code.Npc:
case T_Code.Ipb:
return dados.Alive;
case T_Code.Can:
return rover.DispositivosMapeados?.Any(x => x.Dispositivo == T_Code.Can) ?? false;
case T_Code.Cam:
case T_Code.Snr:
case T_Code.Lvx:
case T_Code.Gps:
return rover.DispositivosMapeados?.FirstOrDefault(x => x.Dispositivo == item.Modulo)?.Saude > 0;
case T_Code.Bat:
return rover.Bateria?.Iniciado ?? false;
case T_Code.Trj:
return rover.Trajetoria?.QtdPontos > 0;
default:
return false;
}
}
private void SalvarSaudeModulo(object parameter)
{
if (ModuloSelecionado == null)
return;
var modulo = ModuloSelecionado.Modulo;
var label = ModuloSelecionado.LabelModulo;
if (modulo == 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, bool)>()
};
if (rover.ModulosMandatorios == null)
rover.ModulosMandatorios = new List<AgroBase.Models.OperacaoModulosMandatoriosModel>();
rover.ModulosMandatorios.Add(mod);
}
if (string.IsNullOrWhiteSpace(label))
{
mod.Mandatorio = MandatorioSelecionado;
mod.Utilizar = EmUsoSelecionado;
}
else
{
if (mod.ComponentesEmUso == null)
mod.ComponentesEmUso = new Dictionary<string, (bool, bool)>();
mod.ComponentesEmUso[label] = (MandatorioSelecionado, EmUsoSelecionado);
}
VariaveisControleOperacao.EnviarParametrosOperacao(new AgroBase.Models.Operacoes.OperacaoParametrosModel()
{
ModulosMandatorios = rover.ModulosMandatorios,
});
// opcional: refletir imediatamente no item selecionado
ModuloSelecionado.Mandatorio = MandatorioSelecionado;
ModuloSelecionado.EmUso = EmUsoSelecionado;
AtualizarResumoModuloSelecionado();
}
private void AtualizarGraficoModuloSelecionado()
{
var idAtual = ModuloSelecionado?.IdVisual ?? "";
if (_ultimoIdGrafico != idAtual)
{
SeriesGrafico.Clear();
LabelsGrafico.Clear();
_ultimoIdGrafico = idAtual;
}
if (ModuloSelecionado == null || _dadosOperacaoAtual?.DadosLeitura == null)
return;
var rover = _dadosOperacaoAtual.DadosLeitura;
var item = ModuloSelecionado;
DateTime? momento = rover.Momento;
if (momento.HasValue)
{
LabelsGrafico.Add(momento.Value.ToString("HH:mm:ss"));
while (LabelsGrafico.Count > 60)
LabelsGrafico.RemoveAt(0);
}
void AddOrAppendSerie(string label, string unidade, double? valor)
{
if (!valor.HasValue)
return;
var serie = SeriesGrafico.FirstOrDefault(x => x.Label == label && x.Unidade == unidade);
if (serie == null)
{
serie = new DiagnosticoGraficoSerieViewModel
{
Label = label,
Unidade = unidade
};
SeriesGrafico.Add(serie);
}
serie.Valores.Add(valor.Value);
while (serie.Valores.Count > 60)
serie.Valores.RemoveAt(0);
}
switch (item.Modulo)
{
case T_Code.Sen:
switch (item.SCode)
{
case S_Code.sCOR:
var barramento = rover.Bateria?.Barramentos?.FirstOrDefault(x => x.ID == item.LabelModulo);
AddOrAppendSerie("Corrente", "mA", barramento?.Corrente);
AddOrAppendSerie("Tensão", "V", barramento?.Tensao);
AddOrAppendSerie("Potência", "mW", barramento?.Potencia);
AddOrAppendSerie("Energia", "J", barramento?.Energia);
AddOrAppendSerie("Temperatura", "°C", barramento?.Temperatura);
break;
case S_Code.sNTC:
var ntc = rover.Sensoriamento?.Sensores?
.FirstOrDefault(x => x.ID == item.LabelModulo && x.Componente == item.SCode)?
.Valores?[0];
AddOrAppendSerie("Temperatura", "°C", ntc);
break;
case S_Code.sRLE:
var rele = rover.Sensoriamento?.Reles?.FirstOrDefault(x => x.ID == item.LabelModulo);
AddOrAppendSerie("Comando", "", rele?.ComandoEstado == true ? 1 : 0);
AddOrAppendSerie("Leitura", "", rele?.LeituraEstado == true ? 1 : 0);
break;
case S_Code.sSRV:
var servoSen = rover.Sensoriamento?.Servos?.FirstOrDefault(x => x.ID == item.LabelModulo);
AddOrAppendSerie("Comando", "°", servoSen?.ComandoAngulo);
AddOrAppendSerie("Leitura", "°", servoSen?.LeituraAngulo);
break;
}
break;
case T_Code.Atu:
switch (item.SCode)
{
case S_Code.sBIC:
var bico = rover.Atuador?.Bicos?.FirstOrDefault(x => x.ID == item.LabelModulo);
AddOrAppendSerie("Cmd", "", (bico?.ComandoEstado ?? false) ? 100 : 0);
AddOrAppendSerie("Vazão", "mL/s", bico?.VazaoInstantaneaMLs);
break;
case S_Code.sBMB:
var bomba = rover.Atuador?.Bombas?.FirstOrDefault(x => x.ID == item.LabelModulo);
AddOrAppendSerie("Cmd", "", (bomba?.ComandoEstado ?? false) ? 100 : 0);
AddOrAppendSerie("Potência", "%", bomba?.Potencia);
AddOrAppendSerie("Pressão", "psi", rover.Atuador?.PressaoLinhaPsi);
break;
case S_Code.sPRS:
AddOrAppendSerie("Pressão", "psi", rover.Atuador?.PressaoLinhaPsi);
break;
case S_Code.sFLX:
AddOrAppendSerie("Fluxo", "mL/s", rover.Atuador?.VazaoInstantaneaMLs);
AddOrAppendSerie("Média", "mL/s", rover.Atuador?.VazaoMediaMLs);
break;
case S_Code.sMAS:
AddOrAppendSerie("Volume", "L", rover.Atuador?.VolumeReservatorioL);
AddOrAppendSerie("Massa", "Kg", rover.Atuador?.MassaReservatorioKg);
AddOrAppendSerie("Percentual", "%", rover.Atuador?.PercentualReservatorio);
break;
}
break;
case T_Code.Mov:
var mov = rover.Movimentacao?.Modulos?.FirstOrDefault(x => x.Mod_ID == item.LabelModulo);
AddOrAppendSerie("Tensão", "V", mov?.Tensao);
AddOrAppendSerie("Corrente M", "A", mov?.Corrente_Motor);
AddOrAppendSerie("Corrente B", "A", mov?.Corrente_Barramento);
AddOrAppendSerie("Ciclo", "%", mov?.CicloTrabalho);
AddOrAppendSerie("Temperatura", "°C", mov?.TemperaturaDriver);
AddOrAppendSerie("RPM", "", mov?.RPM_Roda);
break;
case T_Code.Npc:
var npc = rover.PerformanceNcp;
AddOrAppendSerie("GPU %", "%", npc?.GPU_load);
AddOrAppendSerie("GPU °C", "°C", npc?.GPU_temp);
AddOrAppendSerie("CPU %", "%", npc?.CPU_load);
AddOrAppendSerie("CPU °C", "°C", npc?.CPU_temp);
AddOrAppendSerie("RAM", "MB", npc?.RAM_usage);
break;
case T_Code.Ipb:
var conexao = rover.ModulosSaude?.FirstOrDefault(x => x.modulo == T_Code.Ipb);
AddOrAppendSerie("Latência", "ms", conexao?.detalhes?["avg_rtt"]?.Value<double>());
AddOrAppendSerie("Jitter", "ms", conexao?.detalhes?["jitter"]?.Value<double>());
AddOrAppendSerie("Timeout", "%", conexao?.detalhes?["tmout_pct"]?.Value<double>());
AddOrAppendSerie("Perda", "%", conexao?.detalhes?["loss_pct"]?.Value<double>());
AddOrAppendSerie("Banda", "Mbps", conexao?.detalhes?["bw_total_mbps"]?.Value<double>());
AddOrAppendSerie("Banda %", "%", conexao?.detalhes?["bw_util_pct"]?.Value<double>());
break;
case T_Code.Gps:
var gps = rover.Gnss;
AddOrAppendSerie("Precisão", "cm", gps?.PrecisaoCm);
AddOrAppendSerie("Altitude", "m", gps?.Altitude);
AddOrAppendSerie("Idade", "s", gps?.IdadeCorrecao);
AddOrAppendSerie("Satélites", "", gps?.NumeroSatelites);
break;
case T_Code.Bat:
var bat = rover.Bateria;
AddOrAppendSerie("Tensão", "V", bat?.TensaoInstantanea);
AddOrAppendSerie("Corrente", "A", bat?.CorrenteInstantanea);
AddOrAppendSerie("Temperatura", "°C", bat?.Temperatura);
break;
}
}
#endregion
}
}