From 51c9f51f4f2c3fedfafe62b81d28dc9a89bbaadd Mon Sep 17 00:00:00 2001 From: Diego Freitas Date: Thu, 19 Mar 2026 23:03:07 -0300 Subject: [PATCH] =?UTF-8?q?Criado=20se=C3=A7=C3=A3o=20de=20hist=C3=B3rico?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Models/Modules/MovimentacaoModel.cs | 2 +- AgroBase/AgroBase/Services/EthernetService.cs | 131 +++++- .../Controls/MapViewControl.xaml | 2 +- .../Controls/MapViewControl.xaml.cs | 49 +++ .../OperationControl/Models/AlertaModel.cs | 3 +- AgroBase/OperationControl/Models/AppShell.cs | 4 +- AgroBase/OperationControl/Models/Variaveis.cs | 31 +- .../OperationControl.csproj.user | 6 + .../OperationControl/Services/GpsService.cs | 7 +- .../ConfigConexao/ConfigConexaoViewModel.cs | 20 +- .../Monitoramento/HistoricoViewModel.cs | 397 ++++++++++++++++++ .../Views/Operacao/OperacaoBottomViewModel.cs | 23 +- .../Views/Operacao/OperacaoCenterViewModel.cs | 6 +- .../Views/Operacao/OperacaoLeftViewModel.cs | 1 + .../Views/Operacao/OperacaoRightViewModel.cs | 5 +- .../Views/Operacao/OperacaoTopViewModel.cs | 156 +++++++ .../ViewModels/Windows/DockWindowViewModel.cs | 74 +++- .../Operacao/Monitoramento/HistoricoView.xaml | 382 +++++++++++++++++ .../Monitoramento/HistoricoView.xaml.cs | 20 + .../Views/Operacao/OperacaoCenterView.xaml | 5 + .../Views/Operacao/OperacaoCenterView.xaml.cs | 1 + .../Views/Operacao/OperacaoRightView.xaml | 2 + 22 files changed, 1275 insertions(+), 52 deletions(-) create mode 100644 AgroBase/OperationControl/ViewModels/Views/Operacao/Monitoramento/HistoricoViewModel.cs create mode 100644 AgroBase/OperationControl/Views/Operacao/Monitoramento/HistoricoView.xaml create mode 100644 AgroBase/OperationControl/Views/Operacao/Monitoramento/HistoricoView.xaml.cs diff --git a/AgroBase/AgroBase/Models/Modules/MovimentacaoModel.cs b/AgroBase/AgroBase/Models/Modules/MovimentacaoModel.cs index 483cf560f..f2e84f635 100644 --- a/AgroBase/AgroBase/Models/Modules/MovimentacaoModel.cs +++ b/AgroBase/AgroBase/Models/Modules/MovimentacaoModel.cs @@ -403,7 +403,7 @@ namespace AgroBase.Models.Modules RPM_SP = RpmCorrigido; FatorCompensacaoCurvasAnterior = FatorCompensacaoCurvas; - Variaveis.OperacaoEmAndamento.SimulacaoRpmControle = Variaveis.OperacaoEmAndamento.Controle.PercentualVelocidadeSP; + Variaveis.OperacaoEmAndamento.SimulacaoRpmControle = _Controle.PercentualVelocidadeSP; //Console.WriteLine($"RPM Atualizado para {Variaveis.OperacaoEmAndamento.SimulacaoRpmControle}"); switch (DirecaoAtual) diff --git a/AgroBase/AgroBase/Services/EthernetService.cs b/AgroBase/AgroBase/Services/EthernetService.cs index 9219c3df5..202d06eef 100644 --- a/AgroBase/AgroBase/Services/EthernetService.cs +++ b/AgroBase/AgroBase/Services/EthernetService.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; +using System.Net; using System.Net.NetworkInformation; using System.Net.Sockets; using System.Threading; @@ -613,6 +614,134 @@ public class EthernetService return sucesso; } - + + + + + public class StatusRedeInfo + { + public bool AdaptadorEncontrado { get; set; } + public bool AdaptadorOperacional { get; set; } + public bool CaboConectado { get; set; } + public bool IpValido { get; set; } + public bool GatewayValido { get; set; } + + public string NomeInterface { get; set; } = ""; + public string Ip { get; set; } = ""; + public string Mascara { get; set; } = ""; + public string Gateway { get; set; } = ""; + + public bool RedeOk { get; set; } + public string Detalhes { get; set; } = ""; + } + + public static StatusRedeInfo ObterStatusRede(string nomeInterface = null, bool exigirGateway = false) + { + var info = new StatusRedeInfo(); + + try + { + var interfaces = NetworkInterface.GetAllNetworkInterfaces() + .Where(ni => + ni.NetworkInterfaceType != NetworkInterfaceType.Loopback && + ni.NetworkInterfaceType != NetworkInterfaceType.Tunnel && + ni.Description.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) < 0 && + ni.Name.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) < 0) + .ToList(); + + NetworkInterface niSelecionada = null; + + if (!string.IsNullOrWhiteSpace(nomeInterface)) + { + niSelecionada = interfaces.FirstOrDefault(ni => + ni.Name.Equals(nomeInterface, StringComparison.OrdinalIgnoreCase) || + ni.Description.Equals(nomeInterface, StringComparison.OrdinalIgnoreCase) || + ni.Name.IndexOf(nomeInterface, StringComparison.OrdinalIgnoreCase) >= 0 || + ni.Description.IndexOf(nomeInterface, StringComparison.OrdinalIgnoreCase) >= 0); + } + else + { + niSelecionada = interfaces + .Where(ni => + ni.NetworkInterfaceType == NetworkInterfaceType.Ethernet || + ni.NetworkInterfaceType == NetworkInterfaceType.GigabitEthernet || + ni.Description.IndexOf("Ethernet", StringComparison.OrdinalIgnoreCase) >= 0 || + ni.Name.IndexOf("Ethernet", StringComparison.OrdinalIgnoreCase) >= 0) + .OrderByDescending(ni => ni.OperationalStatus == OperationalStatus.Up) + .FirstOrDefault(); + } + + if (niSelecionada == null) + { + info.Detalhes = "Nenhum adaptador de rede compatível encontrado."; + return info; + } + + info.AdaptadorEncontrado = true; + info.NomeInterface = niSelecionada.Name; + info.AdaptadorOperacional = niSelecionada.OperationalStatus == OperationalStatus.Up; + info.CaboConectado = info.AdaptadorOperacional; + + var props = niSelecionada.GetIPProperties(); + + var ipv4 = props.UnicastAddresses + .FirstOrDefault(a => a.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork); + + var gateway = props.GatewayAddresses + .FirstOrDefault(g => g.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork); + + if (ipv4 != null) + { + info.Ip = ipv4.Address.ToString(); + info.Mascara = ipv4.IPv4Mask?.ToString() ?? ""; + info.IpValido = IpEhValido(info.Ip); + } + + if (gateway != null) + { + info.Gateway = gateway.Address.ToString(); + info.GatewayValido = IpEhValido(info.Gateway); + } + + info.RedeOk = + info.AdaptadorEncontrado && + info.CaboConectado && + info.IpValido && + (!exigirGateway || info.GatewayValido); + + info.Detalhes = + $"{info.NomeInterface}\n" + + $"Cabo: {(info.CaboConectado ? "Conectado" : "Desconectado")}\n" + + $"IP: {(!string.IsNullOrWhiteSpace(info.Ip) ? info.Ip : "Não definido")}\n" + + $"Máscara: {(!string.IsNullOrWhiteSpace(info.Mascara) ? info.Mascara : "Não definida")}\n" + + $"Gateway: {(!string.IsNullOrWhiteSpace(info.Gateway) ? info.Gateway : "Não definido")}\n" + + $"Rede OK: {(info.RedeOk ? "Sim" : "Não")}"; + } + catch (Exception ex) + { + info.RedeOk = false; + info.Detalhes = "Erro ao obter status da rede: " + ex.Message; + } + + return info; + } + + private static bool IpEhValido(string ip) + { + if (string.IsNullOrWhiteSpace(ip)) + return false; + + if (!IPAddress.TryParse(ip, out var endereco)) + return false; + + if (IPAddress.Any.Equals(endereco)) + return false; + + // APIPA: geralmente indica ausência de DHCP/conectividade útil + if (ip.StartsWith("169.254.")) + return false; + + return true; + } } diff --git a/AgroBase/OperationControl/Controls/MapViewControl.xaml b/AgroBase/OperationControl/Controls/MapViewControl.xaml index 14e323179..c697c4882 100644 --- a/AgroBase/OperationControl/Controls/MapViewControl.xaml +++ b/AgroBase/OperationControl/Controls/MapViewControl.xaml @@ -16,7 +16,7 @@ -