diff --git a/AgroBase/AgroBase/Forms/frmInstancial.cs b/AgroBase/AgroBase/Forms/frmInstancial.cs index 16b3ec5cf..c5de4459a 100644 --- a/AgroBase/AgroBase/Forms/frmInstancial.cs +++ b/AgroBase/AgroBase/Forms/frmInstancial.cs @@ -29,7 +29,7 @@ namespace AgroBase.Forms Variaveis.IniciarMQTT(); - Variaveis.IniciarUDP(); + //Variaveis.IniciarUDP(); APIService.IniciarRotinas(); diff --git a/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs b/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs index a4d04552f..8d32aa788 100644 --- a/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs +++ b/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs @@ -1543,6 +1543,19 @@ namespace AgroBase.Models return; } + if (controleBase.Dispositivo == T_Code.Ipb) + { + if (controleBase._comp_value == true) + { + Variaveis.IniciarUDP(); + } + else + { + Variaveis.StopUdpChannel(); + } + return; + } + if (controleBase.Dispositivo == T_Code.Gps) { var (la_frontal, la_lateral) = ((JObject)controleBase._comp_value).ToObject<(double?, double?)>(); diff --git a/AgroBase/AgroBase/Models/Variaveis.cs b/AgroBase/AgroBase/Models/Variaveis.cs index 228a486f1..8a867b304 100644 --- a/AgroBase/AgroBase/Models/Variaveis.cs +++ b/AgroBase/AgroBase/Models/Variaveis.cs @@ -215,12 +215,7 @@ namespace AgroBase.Models private static void StartUdpChannel() { - try - { - UdpChannel?.Stop(); - UdpChannel?.Dispose(); - } - catch { } + StopUdpChannel(); UdpChannel = new UdpReliableChannel(); UdpChannel.Start(VariaveisPortas.Ethernet_UDP_RX); @@ -232,6 +227,16 @@ namespace AgroBase.Models Interlocked.Exchange(ref _lastPacketTicksUtc, DateTime.UtcNow.Ticks); } + public static void StopUdpChannel() + { + try + { + UdpChannel?.Stop(); + UdpChannel?.Dispose(); + } + catch { } + } + private static void OnUdpPacket(byte type, byte[] payload, IPEndPoint from) { // Qualquer pacote marca link vivo (inclusive heartbeat) @@ -384,6 +389,7 @@ namespace AgroBase.Models await Task.CompletedTask; } + } diff --git a/AgroBase/AgroBase/Services/UdpReliableChannel.cs b/AgroBase/AgroBase/Services/UdpReliableChannel.cs index fc6d2911b..1ac1b4763 100644 --- a/AgroBase/AgroBase/Services/UdpReliableChannel.cs +++ b/AgroBase/AgroBase/Services/UdpReliableChannel.cs @@ -44,11 +44,18 @@ public sealed class UdpReliableChannel : IDisposable public void SetRemote(string ip, int port) { - var addr = IPAddress.Parse(ip); - - if (Remote == null || !Remote.Address.Equals(addr) || Remote.Port != port) + if (string.IsNullOrEmpty(ip)) { - Remote = new IPEndPoint(addr, port); + Remote = null; + } + else + { + var addr = IPAddress.Parse(ip); + + if (Remote == null || !Remote.Address.Equals(addr) || Remote.Port != port) + { + Remote = new IPEndPoint(addr, port); + } } } diff --git a/AgroBase/OperationControl/Controls/ManualControlPad.xaml.cs b/AgroBase/OperationControl/Controls/ManualControlPad.xaml.cs index 2e81fb09a..357a20652 100644 --- a/AgroBase/OperationControl/Controls/ManualControlPad.xaml.cs +++ b/AgroBase/OperationControl/Controls/ManualControlPad.xaml.cs @@ -297,7 +297,7 @@ namespace OperationControl.Controls { EmergencyActivated = !EmergencyActivated; //VariaveisControleOperacao.EnviarComandoParada(emergencia: EmergencyActivated); - _ = VariaveisControleOperacao.EnviarComandoParadaUDP(ipRover: VariaveisControleOperacao.RoverEmFoco?.IP, emergencia: EmergencyActivated); + _ = VariaveisControleOperacao.EnviarComandoParadaUDP(emergencia: EmergencyActivated); } private void ManualControlPad_PauseClicked(object? sender, EventArgs e) @@ -342,7 +342,7 @@ namespace OperationControl.Controls if (_lastDirKey != dir) { //VariaveisControleOperacao.EnviarComandoDirecional(dir, Convert.ToInt32(AngleControl), MoveTypeControl); - VariaveisControleOperacao.EnviarComandoDirecionalUDP(ipRover: VariaveisControleOperacao.RoverEmFoco?.IP, dir, Convert.ToInt32(AngleControl), MoveTypeControl); + VariaveisControleOperacao.EnviarComandoDirecionalUDP(dir, Convert.ToInt32(AngleControl), MoveTypeControl); _lastDirKey = dir; } @@ -353,7 +353,7 @@ namespace OperationControl.Controls if (_lastMovKey != mov) { //VariaveisControleOperacao.EnviarComandoMovimentacao(mov, Convert.ToInt32(SpeedControl)); - VariaveisControleOperacao.EnviarComandoMovimentacaoUDP(ipRover: VariaveisControleOperacao.RoverEmFoco?.IP, mov, Convert.ToInt32(SpeedControl)); + VariaveisControleOperacao.EnviarComandoMovimentacaoUDP(mov, Convert.ToInt32(SpeedControl)); _lastMovKey = mov; } } diff --git a/AgroBase/OperationControl/Models/Variaveis.cs b/AgroBase/OperationControl/Models/Variaveis.cs index 5f21962bb..d7fd724c4 100644 --- a/AgroBase/OperationControl/Models/Variaveis.cs +++ b/AgroBase/OperationControl/Models/Variaveis.cs @@ -289,6 +289,21 @@ namespace OperationControl.Models #region Controle + public static void EnviarComandoIniciarUDP(string ipRover, bool iniciar) + { + if (iniciar) + Variaveis.UdpChannel.SetRemote(ipRover, VariaveisPortas.Ethernet_UDP_RX); + else + Variaveis.UdpChannel.SetRemote(null, VariaveisPortas.Ethernet_UDP_RX); + + EnviarDadosControle(SelectedRoverId, new OperacaoComandoBaseModel() + { + Momento = DateTime.Now, + Dispositivo = AgroBase.Models.Enums.T_Code.Ipb, + _comp_value = iniciar + }); + } + public static void EnviarComandoIniciarOperacao(bool iniciar, bool simulador = false) { EnviarDadosControle(SelectedRoverId, new OperacaoComandoBaseModel() @@ -319,11 +334,8 @@ namespace OperationControl.Models EnviarDadosControle(SelectedRoverId, cmd); } - public static Task EnviarComandoParadaUDP(string ipRover, bool emergencia = false, bool pausa = false) + public static Task EnviarComandoParadaUDP(bool emergencia = false, bool pausa = false) { - if (string.IsNullOrEmpty(ipRover)) return Task.CompletedTask; - Variaveis.UdpChannel.SetRemote(ipRover, VariaveisPortas.Ethernet_UDP_RX); - var msg = new UdpCtrlMessage { Device = (byte)AgroBase.Models.Enums.T_Code.Vzo, @@ -433,10 +445,8 @@ namespace OperationControl.Models }); } - public static void EnviarComandoDirecionalUDP(string ipRover, AgroBase.Models.Enums.Direcao direcao, double angulo, AgroBase.Models.Enums.TipoMovimentoDirecional tipoMov) + public static void EnviarComandoDirecionalUDP(AgroBase.Models.Enums.Direcao direcao, double angulo, AgroBase.Models.Enums.TipoMovimentoDirecional tipoMov) { - if (string.IsNullOrEmpty(ipRover)) return; - Variaveis.UdpChannel.SetRemote(ipRover, VariaveisPortas.Ethernet_UDP_RX); var key = DeParaDirecaoTecla(direcao); var msg = new UdpCtrlMessage @@ -466,10 +476,8 @@ namespace OperationControl.Models }); } - public static void EnviarComandoMovimentacaoUDP(string ipRover, AgroBase.Models.Enums.Direcao direcao, double velPct) + public static void EnviarComandoMovimentacaoUDP(AgroBase.Models.Enums.Direcao direcao, double velPct) { - if (string.IsNullOrEmpty(ipRover)) return; - Variaveis.UdpChannel.SetRemote(ipRover, VariaveisPortas.Ethernet_UDP_RX); var key = DeParaDirecaoTecla(direcao); var msg = new UdpCtrlMessage diff --git a/AgroBase/OperationControl/Windows/MainWindow.xaml.cs b/AgroBase/OperationControl/Windows/MainWindow.xaml.cs index 5e218ff47..636e235b1 100644 --- a/AgroBase/OperationControl/Windows/MainWindow.xaml.cs +++ b/AgroBase/OperationControl/Windows/MainWindow.xaml.cs @@ -188,6 +188,7 @@ namespace OperationControl.Windows { PararStreamCameraFrontal(); PararStreamCameraErvas(); + VariaveisControleOperacao.EnviarComandoIniciarUDP(VariaveisControleOperacao.RoverEmFoco?.IP, false); } VariaveisControleOperacao.SelectedRoverId = selecionado.ToString(); @@ -204,6 +205,7 @@ namespace OperationControl.Windows btnParametros_Atualizar_Click(sender, e); IniciarStreamCameraFrontal(); IniciarStreamCameraErvas(); + VariaveisControleOperacao.EnviarComandoIniciarUDP(VariaveisControleOperacao.RoverEmFoco?.IP, true); } }