diff --git a/AgroBase/OperationControl/Services/GpsService.cs b/AgroBase/OperationControl/Services/GpsService.cs index fd96037ac..0061560e0 100644 --- a/AgroBase/OperationControl/Services/GpsService.cs +++ b/AgroBase/OperationControl/Services/GpsService.cs @@ -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 FixarBaseViaNtripAsync(string portaUsb = "com3", string portaEntrada = "com2", string portaSaida = "com2", string baseId = "957", int segsFixEstavel = 120, int maxJanelaSegs = 600, double madK = 3.5, Func startNtrip = null, Func stopNtrip = null) + public async Task FixarBaseViaNtripAsync(string portaUsb = "com3", string portaEntrada = "com2", string portaSaida = "com2", string baseId = "957", double madK = 3.5, Func startNtrip = null, Func 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; } } diff --git a/AgroBase/OperationControl/ViewModels/Views/PreparacaoMapa/PreparacaoMapaBottomViewModel.cs b/AgroBase/OperationControl/ViewModels/Views/PreparacaoMapa/PreparacaoMapaBottomViewModel.cs index 2e8a8219f..84b2c2e6e 100644 --- a/AgroBase/OperationControl/ViewModels/Views/PreparacaoMapa/PreparacaoMapaBottomViewModel.cs +++ b/AgroBase/OperationControl/ViewModels/Views/PreparacaoMapa/PreparacaoMapaBottomViewModel.cs @@ -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;