diff --git a/AgroBase/AgroBase/Forms/Atuador/frmAtuConfig.cs b/AgroBase/AgroBase/Forms/Atuador/frmAtuConfig.cs index e7ab89bd0..4bfbc5141 100644 --- a/AgroBase/AgroBase/Forms/Atuador/frmAtuConfig.cs +++ b/AgroBase/AgroBase/Forms/Atuador/frmAtuConfig.cs @@ -27,7 +27,7 @@ namespace AgroBase.Forms.Atuador } chbBicosAtuacao.Checked = Disp.Dados.BicosPulverizadores.Any(x => x.AtuacaoNivelAlto); - nudBicosQtd.Value = Variaveis.OperacaoEmAndamento.Parametros.QtdBicos; + nudBicosQtd.Value = Variaveis.OperacaoEmAndamento.Parametros.QtdBicos ?? VariaveisEquipamento.QuantidadeBicosPulverizadores; txtDensidade.Text = Disp.Dados.DensidadeHerbicida.ToString("0.00"); nudCapMax.Value = Convert.ToInt32(Variaveis.OperacaoEmAndamento.Parametros.QtdCamerasSolo); } diff --git a/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.cs b/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.cs index 36d91e1a4..718dd25b0 100644 --- a/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.cs +++ b/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.cs @@ -574,7 +574,7 @@ namespace AgroBase.Forms.Operacoes int panelWidth = pnlAtuadores.Width; int circleDiameter = 40; // Diâmetro dos círculos grandes - int spaceBetweenCircles = (panelWidth - (circleDiameter * Variaveis.OperacaoEmAndamento.Parametros.QtdBicos)) / (Variaveis.OperacaoEmAndamento.Parametros.QtdBicos + 1); + int spaceBetweenCircles = (panelWidth - (circleDiameter * (Variaveis.OperacaoEmAndamento.Parametros.QtdBicos ?? VariaveisEquipamento.QuantidadeBicosPulverizadores))) / ((Variaveis.OperacaoEmAndamento.Parametros.QtdBicos ?? VariaveisEquipamento.QuantidadeBicosPulverizadores) + 1); int yPosition = (pnlAtuadores.Height - circleDiameter) / 3; // Centralizado verticalmente diff --git a/AgroBase/AgroBase/Forms/Operacoes/frmParametrizacaoOperacao.cs b/AgroBase/AgroBase/Forms/Operacoes/frmParametrizacaoOperacao.cs index 1e3a8ee4b..1dfa0e24f 100644 --- a/AgroBase/AgroBase/Forms/Operacoes/frmParametrizacaoOperacao.cs +++ b/AgroBase/AgroBase/Forms/Operacoes/frmParametrizacaoOperacao.cs @@ -66,8 +66,8 @@ namespace AgroBase.Forms.Operacoes nudAnguloMinimo.Value = Convert.ToInt32(-_Parametros.Controle.DirAnguloMaximo); nudVelocidadeMP.Value = Convert.ToInt32(_Parametros.Controle.DirVelocidadeMovimento); nudTemposalvarlog.Value = (decimal)Variaveis.OperacaoEmAndamento.tmrLogsInterval / 1000; - nudQtdBicos.Value = _Parametros.QtdBicos; - nudQtdCameras.Value = _Parametros.QtdCamerasSolo; + nudQtdBicos.Value = _Parametros.QtdBicos ?? VariaveisEquipamento.QuantidadeBicosPulverizadores; + nudQtdCameras.Value = _Parametros.QtdCamerasSolo ?? VariaveisEquipamento.QuantidadeCamerasSolo; nudCapacidadereservatorio.Value = Convert.ToInt32(_Parametros.CapacidadeReservatorio); txtDensidadeherbicida.Text = Variaveis.OperacaoEmAndamento.DispAtu.Dados.DensidadeHerbicida.ToString("0.00"); nudAtuarem.Value = Convert.ToInt32(_Parametros.Controle.AtuPercentualInicioPulverizacao); diff --git a/AgroBase/AgroBase/Models/Modules/AtuadorModel.cs b/AgroBase/AgroBase/Models/Modules/AtuadorModel.cs index 7f62f0be4..65873eae7 100644 --- a/AgroBase/AgroBase/Models/Modules/AtuadorModel.cs +++ b/AgroBase/AgroBase/Models/Modules/AtuadorModel.cs @@ -90,7 +90,7 @@ namespace AgroBase.Models.Modules { get { - return VolumeReservatorio / Variaveis.OperacaoEmAndamento.Parametros.CapacidadeReservatorio * 100.0; + return VolumeReservatorio / (Variaveis.OperacaoEmAndamento.Parametros.CapacidadeReservatorio ?? VariaveisEquipamento.CapacidadeReservatorio) * 100.0; } } #endregion diff --git a/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs b/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs index d7bc58cd2..04420ff31 100644 --- a/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs +++ b/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs @@ -250,7 +250,9 @@ namespace AgroBase.Models var Parametros = JsonConvert.DeserializeObject(ParametrosJson); - CarregarParametrosOperacaoPadrao(Parametros.Modo); + if (Parametros.Modo == null) return (false, new List()); + + CarregarParametrosOperacaoPadrao((ModoOperacao)Parametros.Modo); Variaveis.OperacaoEmAndamento.Parametros = Parametros; @@ -806,7 +808,9 @@ namespace AgroBase.Models public (bool, List) CarregarParamerosOperacaoBase(OperacaoParametrosModel Parametros) { - CarregarParametrosOperacaoPadrao(Parametros.Modo); + if (Parametros.Modo == null) return (false, new List()); + + CarregarParametrosOperacaoPadrao((ModoOperacao)Parametros.Modo); Variaveis.OperacaoEmAndamento.Parametros = Parametros; @@ -1315,30 +1319,47 @@ namespace AgroBase.Models { if (controleBase.Dispositivo == T_Code.Mod) { - Task.Run(async () => + var _Parametros = controleBase.Parametros; + + switch (controleBase.Tecla) { - if (controleBase.Tecla == BotoesJoystick.PS) - { + case BotoesJoystick.Share: // Requisitar parametros da operacao + var topico = Variaveis.MqttServiceBase.Topicos.FirstOrDefault(x => x.Topico == VariaveisEquipamento.TopicoMqttParametros.Replace("", VariaveisEquipamento.Parametros.serial_number)); + var msg = JsonConvert.SerializeObject(Variaveis.OperacaoEmAndamento.Parametros); + Task.Run(async () => await Variaveis.MqttServiceBase.PublishAsync(topico, msg)); + break; + case BotoesJoystick.Options: // Operacao nao iniciada, carrega todos os parametros compeltos + Variaveis.OperacaoEmAndamento.CarregarParamerosOperacaoBase(_Parametros); + break; + case BotoesJoystick.Touchpad: // Operacao em andamento, atualiza apenas os dados de controle + if (_Parametros.Modo != null) Variaveis.OperacaoEmAndamento.Parametros.Modo = _Parametros.Modo; + if (_Parametros.QtdBicos != null) Variaveis.OperacaoEmAndamento.Parametros.QtdBicos = _Parametros.QtdBicos; + if (_Parametros.Descricao != null) Variaveis.OperacaoEmAndamento.Parametros.Descricao = _Parametros.Descricao; + if (_Parametros.QtdCamerasSolo != null) Variaveis.OperacaoEmAndamento.Parametros.QtdCamerasSolo = _Parametros.QtdCamerasSolo; + if (_Parametros.CapacidadeReservatorio != null) Variaveis.OperacaoEmAndamento.Parametros.CapacidadeReservatorio = _Parametros.CapacidadeReservatorio; + + if (_Parametros.Controle != null) Variaveis.OperacaoEmAndamento.Parametros.Controle = _Parametros.Controle; + if (_Parametros.ModulosMandatorios != null) Variaveis.OperacaoEmAndamento.Parametros.ModulosMandatorios = _Parametros.ModulosMandatorios; + if (_Parametros.ParametrosMandatorios != null) Variaveis.OperacaoEmAndamento.Parametros.ParametrosMandatorios = _Parametros.ParametrosMandatorios; + + HealthWorkerService.AtualizarDadosOperacao(); + break; + case BotoesJoystick.L1: // Inicia o modo simulador if (!Variaveis.OperacaoEmAndamento.Iniciado) - await Variaveis.OperacaoEmAndamento.IniciarOperacao(); - } - else if (controleBase.Tecla == BotoesJoystick.Share) - { + Task.Run(async () => await Variaveis.OperacaoEmAndamento.IniciarSimulacao()); + break; + case BotoesJoystick.L2: // Inicia a operacao if (!Variaveis.OperacaoEmAndamento.Iniciado) - await Variaveis.OperacaoEmAndamento.IniciarSimulacao(); - } - else - { + Task.Run(async () => await Variaveis.OperacaoEmAndamento.IniciarOperacao()); + break; + case BotoesJoystick.L3: // Finaliza a operacao if (Variaveis.OperacaoEmAndamento.Iniciado) - await Variaveis.OperacaoEmAndamento.FinalizarOperacao(); - } - }); + Task.Run(async () => await Variaveis.OperacaoEmAndamento.FinalizarOperacao()); + break; + } return; } - Variaveis.OperacaoEmAndamento.Emergencia = controleBase.Emergencia; - if (Variaveis.OperacaoEmAndamento.Emergencia) return; - if (controleBase.Dispositivo == T_Code.Gps) { VariaveisEquipamento.LeverArmFrontal = controleBase.LeverArmFrontal; @@ -1347,7 +1368,7 @@ namespace AgroBase.Models return; } - if (controleBase.Dispositivo == T_Code.Snr) + if (controleBase.Dispositivo == T_Code.Snr && Variaveis.OperacaoEmAndamento.DispSen?.Dados?.CameraCaminho?.Id != null) { RedisService.AtualizarCampos( RedisService.CamKey(Variaveis.OperacaoEmAndamento.DispSen.Dados.CameraCaminho.Id), @@ -1356,35 +1377,17 @@ namespace AgroBase.Models return; } - if (controleBase.Dispositivo == T_Code.Cam) + if (controleBase.Dispositivo == T_Code.Cam && (Variaveis.OperacaoEmAndamento.DispSen?.Dados?.CamerasSolo?.Any(x => !string.IsNullOrEmpty(x.Id)) ?? false)) { RedisService.AtualizarCampos( - RedisService.CamKey(Variaveis.OperacaoEmAndamento.DispSen.Dados.CamerasSolo.FirstOrDefault().Id), + RedisService.CamKey(Variaveis.OperacaoEmAndamento.DispSen.Dados.CamerasSolo.FirstOrDefault(x => !string.IsNullOrEmpty(x.Id)).Id), ("streaming", controleBase.Tecla == BotoesJoystick.L1) ); return; } - var _Parametros = controleBase.Parametros; - if (_Parametros != null) - { - if (controleBase.Tecla == BotoesJoystick.Options) // Parametrizando, carrega operacao completa - { - Variaveis.OperacaoEmAndamento.CarregarParamerosOperacaoBase(_Parametros); - } - else if (controleBase.Tecla == BotoesJoystick.Share) // Requisita dados da operacao - { - var topico = Variaveis.MqttServiceBase.Topicos.FirstOrDefault(x => x.Topico == VariaveisEquipamento.TopicoMqttParametros.Replace("", VariaveisEquipamento.Parametros.serial_number)); - var msg = JsonConvert.SerializeObject(Variaveis.OperacaoEmAndamento.Parametros); - Task.Run(async () => await Variaveis.MqttServiceBase.PublishAsync(topico, msg)); - } - else if (_Parametros.Controle != null) // Operacao em andamento, envia apenas dados de controle - { - Variaveis.OperacaoEmAndamento.Parametros.Controle = _Parametros.Controle; - } - HealthWorkerService.AtualizarDadosOperacao(); - return; - } + Variaveis.OperacaoEmAndamento.Emergencia = controleBase.Emergencia; + if (Variaveis.OperacaoEmAndamento.Emergencia) return; Variaveis.OperacaoEmAndamento.Pausa = controleBase.Pausa; if (Variaveis.OperacaoEmAndamento.Pausa) return; @@ -1393,26 +1396,12 @@ namespace AgroBase.Models var _Controle = Variaveis.OperacaoEmAndamento.Controle; - // Salvar estado anterior - //double oldPercentualVelocidade = _Controle.PercentualVelocidadeSP; - //double oldAngulo = _Controle.Angulo; - //double oldVelocidadeMP = _Controle.VelocidadeMP; - //TipoMovimentoDirecional oldTipoMovimento = _Controle.TipoMovimento; - - // Atualizar estado atual com os valores do controleBase _Controle.PercentualVelocidadeSP = controleBase.Controle.PercentualVelocidadeSP; _Controle.Angulo = controleBase.Controle.AnguloSP; _Controle.TipoMovimento = controleBase.Controle.TipoMovimentoDirecional; - // Enviar comando Keys tecla = GeneralJoystick.DeParaComandos.FirstOrDefault(x => x.botaoJoy == controleBase.Tecla)?.key ?? Keys.Escape; GeneralJoystick.EnviaComandoMotor(tecla, controleBase.Dispositivo, ForcarComando: true); - - // Restaurar estado anterior - //_Controle.PercentualVelocidadeSP = oldPercentualVelocidade; - //_Controle.Angulo = oldAngulo; - //_Controle.VelocidadeMP = oldVelocidadeMP; - //_Controle.TipoMovimento = oldTipoMovimento; } private async Task tmrComunicacao_Tick() @@ -1538,7 +1527,7 @@ namespace AgroBase.Models VazaoFluxoMLpSInstantanea = Variaveis.OperacaoEmAndamento.DispAtu.Dados.VazaoFluxoMLpSInstantanea, VazaoFluxoMLpSMedia = Variaveis.OperacaoEmAndamento.DispAtu.Dados.VazaoFluxoMLpSMedia, VolumeVazaoML = Variaveis.OperacaoEmAndamento.DispAtu.Dados.VolumeVazaoML, - QuantidadeBicos = Variaveis.OperacaoEmAndamento.Parametros.QtdBicos, + QuantidadeBicos = Variaveis.OperacaoEmAndamento.Parametros.QtdBicos ?? VariaveisEquipamento.QuantidadeBicosPulverizadores, TempoPulverizadorAtuado = Variaveis.OperacaoEmAndamento.DispAtu.Dados.TempoAtuado, Bicos = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BicosPulverizadores.Select(Bico => new AtuBicoSensoriamentoLogModel() { diff --git a/AgroBase/AgroBase/Models/Operacoes/OperacaoParametrosModel.cs b/AgroBase/AgroBase/Models/Operacoes/OperacaoParametrosModel.cs index acefc83f6..a18b65525 100644 --- a/AgroBase/AgroBase/Models/Operacoes/OperacaoParametrosModel.cs +++ b/AgroBase/AgroBase/Models/Operacoes/OperacaoParametrosModel.cs @@ -8,11 +8,11 @@ namespace AgroBase.Models.Operacoes public string RoverId { get; set; } public bool Alive { get; set; } public bool Configurado { get; set; } - public ModoOperacao Modo { get; set; } + public ModoOperacao? Modo { get; set; } public string Descricao { get; set; } - public int QtdCamerasSolo { get; set; } - public int QtdBicos { get; set; } - public double CapacidadeReservatorio { get; set; } + public int? QtdCamerasSolo { get; set; } + public int? QtdBicos { get; set; } + public double? CapacidadeReservatorio { get; set; } public List ModulosMandatorios { get; set; } public List ParametrosMandatorios { get; set; } public OperacaoParametrosControleModel Controle { get; set; } diff --git a/AgroBase/AgroBase/Services/MqttService.cs b/AgroBase/AgroBase/Services/MqttService.cs index f7a16c2fb..32a8f4f15 100644 --- a/AgroBase/AgroBase/Services/MqttService.cs +++ b/AgroBase/AgroBase/Services/MqttService.cs @@ -147,13 +147,20 @@ public class MqttService if (_client.IsConnected) { - var payload = Encoding.UTF8.GetBytes(message); - var mqttMessage = new MqttApplicationMessageBuilder() - .WithTopic(topic.Topico) - .WithPayload(payload) - .Build(); + try + { + var payload = Encoding.UTF8.GetBytes(message); + var mqttMessage = new MqttApplicationMessageBuilder() + .WithTopic(topic.Topico) + .WithPayload(payload) + .Build(); - await _client.PublishAsync(mqttMessage); + await _client.PublishAsync(mqttMessage); + } + catch (Exception ex) + { + _logDebug(ex.Message); + } } } @@ -166,12 +173,19 @@ public class MqttService if (_client.IsConnected) { - var mqttMessage = new MqttApplicationMessageBuilder() - .WithTopic(topic.Topico) - .WithPayload(payloadBytes) - .Build(); + try + { + var mqttMessage = new MqttApplicationMessageBuilder() + .WithTopic(topic.Topico) + .WithPayload(payloadBytes) + .Build(); - await _client.PublishAsync(mqttMessage); + await _client.PublishAsync(mqttMessage); + } + catch (Exception ex) + { + _logDebug(ex.Message); + } } } diff --git a/AgroBase/OperationControl/Models/Variaveis.cs b/AgroBase/OperationControl/Models/Variaveis.cs index 78447801c..9f973614e 100644 --- a/AgroBase/OperationControl/Models/Variaveis.cs +++ b/AgroBase/OperationControl/Models/Variaveis.cs @@ -144,7 +144,8 @@ namespace OperationControl.Models var rover = RoversNaRede.FirstOrDefault(x => x.RoverId == device_id); if (rover != null) { - rover = obj; + RoversNaRede.Remove(rover); + RoversNaRede.Add(obj); } } ((App)Application.Current).Shell.Main?.AtualizarDadosTela_ParametrosOperacao(obj.Controle); @@ -245,7 +246,7 @@ namespace OperationControl.Models { Momento = DateTime.Now, Dispositivo = AgroBase.Models.Enums.T_Code.Mod, - Tecla = simulador ? AgroBase.Models.Enums.BotoesJoystick.Share : iniciar ? AgroBase.Models.Enums.BotoesJoystick.PS : AgroBase.Models.Enums.BotoesJoystick.Vazio + Tecla = simulador ? AgroBase.Models.Enums.BotoesJoystick.L1 : iniciar ? AgroBase.Models.Enums.BotoesJoystick.L2 : AgroBase.Models.Enums.BotoesJoystick.L3 }); } @@ -292,8 +293,9 @@ namespace OperationControl.Models EnviarDadosControle(SelectedRoverId, new OperacaoComandoBaseModel() { Momento = DateTime.Now, + Dispositivo = AgroBase.Models.Enums.T_Code.Mod, Parametros = parametros, - Tecla = (!(RoverEmFoco.DadosLeitura?.OperacaoIniciada ?? false) ? AgroBase.Models.Enums.BotoesJoystick.Options : AgroBase.Models.Enums.BotoesJoystick.Vazio) + Tecla = (!(RoverEmFoco?.DadosLeitura?.OperacaoIniciada ?? false) ? AgroBase.Models.Enums.BotoesJoystick.Options : AgroBase.Models.Enums.BotoesJoystick.Touchpad) }); } @@ -302,6 +304,7 @@ namespace OperationControl.Models EnviarDadosControle(SelectedRoverId, new OperacaoComandoBaseModel() { Momento = DateTime.Now, + Dispositivo = AgroBase.Models.Enums.T_Code.Mod, Tecla = AgroBase.Models.Enums.BotoesJoystick.Share }); } diff --git a/AgroBase/OperationControl/Windows/MainWindow.xaml b/AgroBase/OperationControl/Windows/MainWindow.xaml index 4e4cbcafd..4bb0edcc1 100644 --- a/AgroBase/OperationControl/Windows/MainWindow.xaml +++ b/AgroBase/OperationControl/Windows/MainWindow.xaml @@ -119,9 +119,9 @@