diff --git a/AgroBase/AgroBase/Models/GeneralJoystick.cs b/AgroBase/AgroBase/Models/GeneralJoystick.cs index b7f7d47ad..1213843a8 100644 --- a/AgroBase/AgroBase/Models/GeneralJoystick.cs +++ b/AgroBase/AgroBase/Models/GeneralJoystick.cs @@ -697,7 +697,7 @@ namespace AgroBase cmd.CalcularValor(direcao == Direcao.Parado, valorJoy: valor); bool mudou = direcao != _ultimaDirecaoMovEnviada || double.IsNaN(_ultimoValorMovEnviado) || Math.Abs(cmd.ValorAplicar - _ultimoValorMovEnviado) >= VariacaoMinimaMov; bool combinado = MovimentosCombinados.Contains(Variaveis.OperacaoEmAndamento.Controle.TipoMovimento); - bool heartbeat = !combinado && (DateTime.Now - _ultimoEnvioDir).TotalMilliseconds >= HeartbeatComandoMs; + bool heartbeat = !combinado && (DateTime.Now - _ultimoEnvioMov).TotalMilliseconds >= HeartbeatComandoMs; if (!mudou && !heartbeat) return; EnviarComandoMotorAtualizado(cmd, ForcarComando: false); _ultimaDirecaoMovEnviada = direcao; _ultimoValorMovEnviado = cmd.ValorAplicar; _ultimoEnvioMov = DateTime.Now; @@ -718,7 +718,8 @@ namespace AgroBase if (cmd == null) return; cmd.CalcularValor(solto, valorJoy: valor); bool mudou = double.IsNaN(_ultimoAnguloDirEnviado) || Math.Abs(cmd.ValorAplicar - _ultimoAnguloDirEnviado) >= VariacaoMinimaDir; - bool heartbeat = (DateTime.Now - _ultimoEnvioDir).TotalMilliseconds >= HeartbeatComandoMs; + bool combinado = MovimentosCombinados.Contains(Variaveis.OperacaoEmAndamento.Controle.TipoMovimento); + bool heartbeat = !combinado && (DateTime.Now - _ultimoEnvioDir).TotalMilliseconds >= HeartbeatComandoMs; if (!mudou && !heartbeat) return; EnviarComandoMotorAtualizado(cmd, ForcarComando: false); _ultimoAnguloDirEnviado = cmd.ValorAplicar; _ultimoEnvioDir = DateTime.Now; diff --git a/AgroBase/AgroBase/Models/Modules/MovimentacaoUnificadoModel.cs b/AgroBase/AgroBase/Models/Modules/MovimentacaoUnificadoModel.cs index f94c2fb85..924243a70 100644 --- a/AgroBase/AgroBase/Models/Modules/MovimentacaoUnificadoModel.cs +++ b/AgroBase/AgroBase/Models/Modules/MovimentacaoUnificadoModel.cs @@ -531,20 +531,36 @@ namespace AgroBase.Models.Modules + private Direcao? _ultimaSolicitacaoMovimentoCombinado = null; + private readonly object _syncMovimentoCombinado = new object(); public async Task ExecutarMovimentoDirecionalCombinado(Direcao DirecaoAtual) { - _ctsMovimentoCombinado?.Cancel(); + CancellationTokenSource cts; - var cts = new CancellationTokenSource(); - _ctsMovimentoCombinado = cts; + lock (_syncMovimentoCombinado) + { + if (_ultimaSolicitacaoMovimentoCombinado == DirecaoAtual) + return; - await _gateMovimentoCombinado.WaitAsync(); + _ultimaSolicitacaoMovimentoCombinado = DirecaoAtual; + + _ctsMovimentoCombinado?.Cancel(); + + cts = new CancellationTokenSource(); + _ctsMovimentoCombinado = cts; + } try { - if (cts.IsCancellationRequested) - return; + await _gateMovimentoCombinado.WaitAsync(cts.Token); + } + catch (OperationCanceledException) + { + return; + } + try + { MovimentoDirecionalCombinadoEmExecucao = true; var op = Variaveis.OperacaoEmAndamento; @@ -564,9 +580,29 @@ namespace AgroBase.Models.Modules modulo.MovMotor.EnviarComandoControle(Direcao.Parado); } - bool parado() => op?.Sensoriamento?.Movimentacao?.RPMMotorMedio <= 5; - await FuncoesGlobais.AguardarCondicaoAsync(parado, 2500, 200); - + bool carroParado() + { + double rpm = op?.Sensoriamento?.Movimentacao?.RPMMotorMedio ?? double.MaxValue; + return Math.Abs(rpm) <= 5; + } + + bool finalizarEsperaParada() => cts.IsCancellationRequested || carroParado(); + await FuncoesGlobais.AguardarCondicaoAsync(finalizarEsperaParada, 2500, 200); + + if (cts.IsCancellationRequested) + return; + + if (!carroParado()) + { + Variaveis.MostrarLog( + $"[MVD] Movimento combinado abortado: " + + $"tração não confirmou parada | " + + $"RPM={op?.Sensoriamento?.Movimentacao?.RPMMotorMedio:F1}" + ); + + return; + } + switch (op.Controle.TipoMovimento) { case TipoMovimentoDirecional.RotacionarNoEixo: @@ -578,10 +614,15 @@ namespace AgroBase.Models.Modules } DateTime Agora = DateTime.Now; - bool atingiuSp() => Modulos.All(x => x.DirMotor.PosicaoTipoMovimentoConcluido(DirecaoAtual)); - await FuncoesGlobais.AguardarCondicaoAsync(atingiuSp, 5000, 200); - bool Sucesso = atingiuSp(); - + bool posicaoConcluida() => Modulos.All(x => x.DirMotor.PosicaoTipoMovimentoConcluido(DirecaoAtual)); + bool finalizarEsperaAngulo() => cts.IsCancellationRequested || posicaoConcluida(); + await FuncoesGlobais.AguardarCondicaoAsync(finalizarEsperaAngulo, 5000, 200); + + if (cts.IsCancellationRequested) + return; + + bool Sucesso = posicaoConcluida(); + if (Sucesso && DirecaoAtual != Direcao.Parado) { op.Controle.PercentualVelocidadeSP = 20; diff --git a/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs b/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs index 37425f1d3..8686b9426 100644 --- a/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs +++ b/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs @@ -1959,7 +1959,7 @@ namespace AgroBase.Models var dispMvd = DispMvd; if (dispMvd?.Dados?.Modulos != null) // && value != Controle.TipoMovimento - { + { Controle.DefinirTipoMovimento(value, dispMvd.Dados.Modulos); } }