ajustado movimento combinado

This commit is contained in:
Diego Freitas 2026-09-09 09:18:49 -03:00
parent e0259cc755
commit 8e8f06ebb2
3 changed files with 58 additions and 16 deletions

View File

@ -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;

View File

@ -531,20 +531,36 @@ namespace AgroBase.Models.Modules
private Direcao? _ultimaSolicitacaoMovimentoCombinado = null;
private readonly object _syncMovimentoCombinado = new object();
public async Task ExecutarMovimentoDirecionalCombinado(Direcao DirecaoAtual)
{
CancellationTokenSource cts;
lock (_syncMovimentoCombinado)
{
if (_ultimaSolicitacaoMovimentoCombinado == DirecaoAtual)
return;
_ultimaSolicitacaoMovimentoCombinado = DirecaoAtual;
_ctsMovimentoCombinado?.Cancel();
var cts = new CancellationTokenSource();
cts = new CancellationTokenSource();
_ctsMovimentoCombinado = cts;
await _gateMovimentoCombinado.WaitAsync();
}
try
{
if (cts.IsCancellationRequested)
await _gateMovimentoCombinado.WaitAsync(cts.Token);
}
catch (OperationCanceledException)
{
return;
}
try
{
MovimentoDirecionalCombinadoEmExecucao = true;
var op = Variaveis.OperacaoEmAndamento;
@ -564,8 +580,28 @@ 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)
{
@ -578,9 +614,14 @@ 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)
{