ajustes para fixacao via survery in

This commit is contained in:
Diego Freitas 2026-03-25 09:24:05 -03:00
parent a8f9bf9817
commit 7a6707d0ef
2 changed files with 98 additions and 80 deletions

View File

@ -259,88 +259,105 @@ namespace OperationControl.Services
if (!fixar)
{
Models.Variaveis.MostrarLog("Configurando módulo como rover parado...");
await BaseFix.ConfigurarComoRoverParadoAsync(
portaUsb: portaUsb,
portaEntrada: portaEntrada);
await BaseFix.ConfigurarComoRoverParadoAsync(portaUsb: portaUsb, portaEntrada: portaEntrada);
return;
}
bool sucesso = false;
string mensagem = "";
BaseFix.fimProcesso = null;
BaseFix.inicioProcesso = DateTime.UtcNow;
BaseFix.inicioFix = DateTime.UtcNow;
Models.Variaveis.MostrarLog($"Aplicando posição fixa da base com o método {metodo}...");
switch (metodo)
try
{
case MetodoFixacaoBase.Ntrip:
sucesso = await BaseFix.FixarBaseViaNtripAsync(
portaUsb: portaUsb,
portaSaida: portaSaida,
portaEntrada: portaEntrada,
startNtrip: () =>
{
Models.Variaveis.MostrarLog("Iniciando correção NTRIP...");
CorrecaoRTK_Ntrip = true;
_ = Task.Run(async () => await AplicarCorrecaoRTK_Ntrip());
return Task.CompletedTask;
},
stopNtrip: () =>
{
Models.Variaveis.MostrarLog("Parando correção NTRIP...");
CorrecaoRTK_Ntrip = false;
return Task.CompletedTask;
},
segsFixEstavel: TempoSurveryIn
);
break;
BaseFix.fimProcesso = null;
BaseFix.inicioProcesso = DateTime.UtcNow;
BaseFix.inicioFix = DateTime.UtcNow;
BaseFix.CorrecaoEmAndamento = true;
case MetodoFixacaoBase.SurveyIn:
await ConfigurarModuloBase(tempo_fixacao: TempoSurveryIn, porta_usb: portaUsb, porta_saida: portaSaida);
while (UltimaLeitura.QualidadeFix != TiposCorrecaoGPS.BaseFix && BaseFix.inicioFix != null && (DateTime.UtcNow - BaseFix.inicioFix).Value.TotalSeconds < TempoSurveryIn)
await Task.Delay(1000);
break;
Models.Variaveis.MostrarLog($"Aplicando posição fixa da base com o método {metodo}...");
case MetodoFixacaoBase.Manual:
if (lat.HasValue && lon.HasValue && alt.HasValue)
await BaseFix.AplicarBaseFixAsync(portaUsb, portaSaida, baseId, lat.Value, lon.Value, alt.Value);
break;
}
// Aguarda 10 segundos para ver se o UM982 pegou o BaseFix
while (sucesso && UltimaLeitura.QualidadeFix != TiposCorrecaoGPS.BaseFix && BaseFix.inicioFix != null && (DateTime.UtcNow - BaseFix.inicioFix).Value.TotalSeconds < 10)
{
await Task.Delay(1000);
}
BaseFix.fimProcesso = DateTime.UtcNow;
BaseFix.FixLiberado = false;
sucesso = UltimaLeitura.QualidadeFix == TiposCorrecaoGPS.BaseFix;
mensagem = sucesso ? $"Posição da base aplicada com sucesso com o método {metodo}." : $"Falha ao aplicar posição da base com o método {metodo}.";
if (sucesso && !(offset ?? false))
{
BaseFix.LatitudeFix = UltimaLeitura.Latitude;
BaseFix.LongitudeFix = UltimaLeitura.Longitude;
BaseFix.AltitudeElpsoidalFix = UltimaLeitura.AltitudeElipsoidal;
BaseFix.OrientacaoFix = UltimaLeitura.OrientacaoReal;
if (AppShell.Mock)
switch (metodo)
{
UltimaLeitura.Latitude = lat.Value;
UltimaLeitura.Longitude = lon.Value;
UltimaLeitura.AltitudeElipsoidal = alt.Value;
AtualizarCoordenadasGPS();
case MetodoFixacaoBase.Ntrip:
BaseFix.DefinirTempos(segsFixEstavel: TempoSurveryIn, segsJanelaSegs: 600, metodo: metodo);
sucesso = await BaseFix.FixarBaseViaNtripAsync(
portaUsb: portaUsb,
portaSaida: portaSaida,
portaEntrada: portaEntrada,
startNtrip: () =>
{
Models.Variaveis.MostrarLog("Iniciando correção NTRIP...");
CorrecaoRTK_Ntrip = true;
_ = Task.Run(async () => await AplicarCorrecaoRTK_Ntrip());
return Task.CompletedTask;
},
stopNtrip: () =>
{
Models.Variaveis.MostrarLog("Parando correção NTRIP...");
CorrecaoRTK_Ntrip = false;
return Task.CompletedTask;
}
);
break;
case MetodoFixacaoBase.SurveyIn:
BaseFix.DefinirTempos(segsFixEstavel: TempoSurveryIn, segsJanelaSegs: TempoSurveryIn + 10, metodo: metodo);
await ConfigurarModuloBase(tempo_fixacao: TempoSurveryIn, porta_usb: portaUsb, porta_saida: portaSaida);
while (UltimaLeitura.QualidadeFix != TiposCorrecaoGPS.BaseFix && BaseFix.inicioFix != null && (DateTime.UtcNow - BaseFix.inicioFix).Value.TotalSeconds < TempoSurveryIn)
{
await Task.Delay(1000);
}
sucesso = true;
break;
case MetodoFixacaoBase.Manual:
if (lat.HasValue && lon.HasValue && alt.HasValue)
{
BaseFix.DefinirTempos(segsFixEstavel: 10, segsJanelaSegs: 10, metodo: metodo);
await BaseFix.AplicarBaseFixAsync(portaUsb, portaSaida, baseId, lat.Value, lon.Value, alt.Value);
sucesso = true;
}
break;
}
// Aguarda 10 segundos para ver se o UM982 pegou o BaseFix
DateTime fimFix = DateTime.UtcNow;
while (sucesso && UltimaLeitura.QualidadeFix != TiposCorrecaoGPS.BaseFix && BaseFix.inicioFix != null && (DateTime.UtcNow - fimFix).TotalSeconds < 10)
{
await Task.Delay(1000);
}
}
catch (Exception ex)
{
Models.Variaveis.MostrarLog($"Erro ao definir posicao da base: {ex.Message}");
}
finally
{
BaseFix.fimProcesso = DateTime.UtcNow;
BaseFix.FixLiberado = false;
BaseFix.CorrecaoEmAndamento = false;
Models.Variaveis.MostrarLog(mensagem);
Models.Variaveis.Dock?._vm?.FinalizarFixacaoBase(sucesso, mensagem);
sucesso = UltimaLeitura.QualidadeFix == TiposCorrecaoGPS.BaseFix;
mensagem = sucesso ? $"Posição da base aplicada com sucesso com o método {metodo}." : $"Falha ao aplicar posição da base com o método {metodo}.";
if (sucesso && !(offset ?? false))
{
BaseFix.LatitudeFix = UltimaLeitura.Latitude;
BaseFix.LongitudeFix = UltimaLeitura.Longitude;
BaseFix.AltitudeElpsoidalFix = UltimaLeitura.AltitudeElipsoidal;
BaseFix.OrientacaoFix = UltimaLeitura.OrientacaoReal;
if (AppShell.Mock && lat.HasValue && lon.HasValue && alt.HasValue)
{
UltimaLeitura.Latitude = lat.Value;
UltimaLeitura.Longitude = lon.Value;
UltimaLeitura.AltitudeElipsoidal = alt.Value;
AtualizarCoordenadasGPS();
}
}
Models.Variaveis.MostrarLog(mensagem);
Models.Variaveis.Dock?._vm?.FinalizarFixacaoBase(sucesso, mensagem);
}
}
private async Task ConfigurarModuloBase(string porta_usb = "com3", string porta_saida = "com2", int tempo_fixacao = 60)
@ -1226,6 +1243,7 @@ namespace OperationControl.Services
public DateTime? fimProcesso = null;
private int segundosFixEstavel = 120;
private int maxJanelaSegundos = 120;
private MetodoFixacaoBase metodo = MetodoFixacaoBase.Ntrip;
public double Progresso
{
get
@ -1253,7 +1271,7 @@ namespace OperationControl.Services
string progresso = "";
if (CorrecaoEmAndamento)
{
progresso = $"Recebendo correção RTK via Ntrip. Progresso geral: {ProgressoGeral:F2}%, Progresso correção: {Progresso:F2}%";
progresso = $"Recebendo correção RTK via {metodo}. Progresso geral: {ProgressoGeral:F2}%, Progresso correção: {Progresso:F2}%";
}
else if (PosicaoBaseFixada && CorrecaoAbsoluta && inicioProcesso.HasValue && fimProcesso.HasValue)
{
@ -1283,6 +1301,12 @@ namespace OperationControl.Services
public double AltitudeElpsoidalFix { get; set; }
public double OrientacaoFix { get; set; }
public void DefinirTempos(int segsFixEstavel, int segsJanelaSegs, MetodoFixacaoBase metodo)
{
segundosFixEstavel = segsFixEstavel;
maxJanelaSegundos = segsJanelaSegs;
}
public void ReiniciarFix()
{
CorrecaoEmAndamento = false;
@ -1293,16 +1317,11 @@ namespace OperationControl.Services
}
// ===== 1) Função principal =====
public async Task<bool> FixarBaseViaNtripAsync(string portaUsb = "com3", string portaEntrada = "com2", string portaSaida = "com2", string baseId = "957", int segsFixEstavel = 120, int maxJanelaSegs = 600, double madK = 3.5, Func<Task> startNtrip = null, Func<Task> stopNtrip = null)
public async Task<bool> FixarBaseViaNtripAsync(string portaUsb = "com3", string portaEntrada = "com2", string portaSaida = "com2", string baseId = "957", double madK = 3.5, Func<Task> startNtrip = null, Func<Task> stopNtrip = null)
{
if (CorrecaoEmAndamento || !APIService.HasInternet)
if (!APIService.HasInternet)
return false;
CorrecaoEmAndamento = true;
segundosFixEstavel = segsFixEstavel;
maxJanelaSegundos = maxJanelaSegs;
// 1.1 Config temporária como rover parado + NMEA
await ConfigurarComoRoverParadoAsync(portaUsb, portaEntrada);
@ -1342,7 +1361,6 @@ namespace OperationControl.Services
finally
{
if (stopNtrip != null) await stopNtrip();
CorrecaoEmAndamento = false;
}
}

View File

@ -253,7 +253,7 @@ namespace OperationControl.ViewModels
}
}
private double? _offsetFrontalBaseCm;
private double? _offsetFrontalBaseCm = 0;
public double? OffsetFrontalBaseCm
{
get => _offsetFrontalBaseCm;
@ -267,7 +267,7 @@ namespace OperationControl.ViewModels
}
}
private double? _offsetLateralBaseCm;
private double? _offsetLateralBaseCm = 0;
public double? OffsetLateralBaseCm
{
get => _offsetLateralBaseCm;