diff --git a/AgroBase/AgroBase/Services/GPSService.cs b/AgroBase/AgroBase/Services/GPSService.cs index a3b6a720b..109f6475f 100644 --- a/AgroBase/AgroBase/Services/GPSService.cs +++ b/AgroBase/AgroBase/Services/GPSService.cs @@ -336,6 +336,8 @@ namespace AgroBase.Services PenultimaLeitura.TimestampPos = UltimaLeitura.TimestampPos.Clone(); PenultimaLeitura.Latitude = UltimaLeitura.Latitude; PenultimaLeitura.Longitude = UltimaLeitura.Longitude; + PenultimaLeitura.LatitudeAnt = UltimaLeitura.LatitudeAnt; + PenultimaLeitura.LongitudeAnt = UltimaLeitura.LongitudeAnt; PenultimaLeitura.Altitude = UltimaLeitura.Altitude; PenultimaLeitura.PrecisaoHorizontal = UltimaLeitura.PrecisaoHorizontal; PenultimaLeitura.DataHora = UltimaLeitura.DataHora; @@ -343,13 +345,22 @@ namespace AgroBase.Services UltimaLeitura.TimestampPos.valor = Stopwatch.GetTimestamp() / (double)Stopwatch.Frequency; UltimaLeitura.Momento = DateTime.Now; + + double? lat = null; + double? lon = null; if (parts[2] != "" && parts[3] != "") { - UltimaLeitura.Latitude = GPSUtils.ConvertToDecimalDegrees(parts[2], parts[3], 2); + lat = GPSUtils.ConvertToDecimalDegrees(parts[2], parts[3], 2); } if (parts[4] != "" && parts[5] != "") { - UltimaLeitura.Longitude = GPSUtils.ConvertToDecimalDegrees(parts[4], parts[5], 3); + lon = GPSUtils.ConvertToDecimalDegrees(parts[4], parts[5], 3); + } + if (lat != null && lon != null) + { + UltimaLeitura.LatitudeAnt = lat.Value; + UltimaLeitura.LongitudeAnt = lon.Value; + AplicarPosicaoCorrigida(); } UltimaLeitura.NumeroSatelites = int.TryParse(parts[7], out int numSat) ? numSat : 0; UltimaLeitura.PrecisaoHorizontal = double.TryParse(parts[8], NumberStyles.Float, CultureInfo.InvariantCulture, out double hdop) ? hdop : 0; @@ -422,10 +433,10 @@ namespace AgroBase.Services PenultimaLeitura.TimestampPos = UltimaLeitura.TimestampPos.Clone(); PenultimaLeitura.Momento = UltimaLeitura.Momento; - PenultimaLeitura.LatitudeAnt = UltimaLeitura.LatitudeAnt; PenultimaLeitura.Latitude = UltimaLeitura.Latitude; - PenultimaLeitura.LongitudeAnt = UltimaLeitura.LongitudeAnt; PenultimaLeitura.Longitude = UltimaLeitura.Longitude; + PenultimaLeitura.LatitudeAnt = UltimaLeitura.LatitudeAnt; + PenultimaLeitura.LongitudeAnt = UltimaLeitura.LongitudeAnt; PenultimaLeitura.Altitude = UltimaLeitura.Altitude; PenultimaLeitura.AltitudeElipsoidal = UltimaLeitura.AltitudeElipsoidal; PenultimaLeitura.PrecisaoHorizontal = UltimaLeitura.PrecisaoHorizontal; @@ -439,9 +450,7 @@ namespace AgroBase.Services UltimaLeitura.TimestampPos.valor = Stopwatch.GetTimestamp() / (double)Stopwatch.Frequency; UltimaLeitura.Momento = DateTime.Now; UltimaLeitura.LatitudeAnt = latitude; - UltimaLeitura.Latitude = latitude; UltimaLeitura.LongitudeAnt = longitude; - UltimaLeitura.Longitude = longitude; UltimaLeitura.Altitude = altMSL; UltimaLeitura.AltitudeElipsoidal = altElipsoidal; UltimaLeitura.PrecisaoHorizontal = hdopVal; @@ -450,6 +459,8 @@ namespace AgroBase.Services UltimaLeitura.IdadeCorrecao = idadeCorrecao; UltimaLeitura.BaseID = base_id; + AplicarPosicaoCorrigida(); + // Hora UTC no formato HHmmss.ss (fração opcional) if (!string.IsNullOrEmpty(horaUTC) && horaUTC.Length >= 6) { @@ -471,14 +482,6 @@ namespace AgroBase.Services UltimaLeitura.EnuOriginSet = true; } - // 2) se já temos origem e um heading válido, aplica lever arm - if (UltimaLeitura.EnuOriginSet) - { - (double latCor, double lonCorr) = LeverArm.FixLeverArmLatLon_Fast(latitude, longitude, UltimaLeitura.OrientacaoReal); - UltimaLeitura.Latitude = latCor; - UltimaLeitura.Longitude = lonCorr; - } - } private static void ProcessarGNRMC(string sentenca) @@ -638,6 +641,8 @@ namespace AgroBase.Services UltimaLeitura.OrientacaoReal = InverterHeading ? GPSUtils.NormalizarAngulo(headingTrue - 180.0) : headingTrue; UltimaLeitura.TipoOrientacao = status; + AplicarPosicaoCorrigida(); + // ✅ Atualiza o ângulo unificado no GPSService DefinirAnguloCarro(); } @@ -676,9 +681,13 @@ namespace AgroBase.Services // mantém histórico PenultimaLeitura.Latitude = UltimaLeitura.Latitude; PenultimaLeitura.Longitude = UltimaLeitura.Longitude; + PenultimaLeitura.LatitudeAnt = UltimaLeitura.LatitudeAnt; + PenultimaLeitura.LongitudeAnt = UltimaLeitura.LongitudeAnt; - UltimaLeitura.Latitude = lat; - UltimaLeitura.Longitude = lon; + UltimaLeitura.LatitudeAnt = lat; + UltimaLeitura.LongitudeAnt = lon; + + AplicarPosicaoCorrigida(); } } @@ -796,8 +805,13 @@ namespace AgroBase.Services PenultimaLeitura.Latitude = UltimaLeitura.Latitude; PenultimaLeitura.Longitude = UltimaLeitura.Longitude; - UltimaLeitura.Latitude = lat; - UltimaLeitura.Longitude = lon; + PenultimaLeitura.LatitudeAnt = UltimaLeitura.LatitudeAnt; + PenultimaLeitura.LongitudeAnt = UltimaLeitura.LongitudeAnt; + + UltimaLeitura.LatitudeAnt = lat; + UltimaLeitura.LongitudeAnt = lon; + + AplicarPosicaoCorrigida(); } } } @@ -960,6 +974,13 @@ namespace AgroBase.Services } + private static void AplicarPosicaoCorrigida() + { + (double latCor, double lonCorr) = LeverArm.FixLeverArmLatLon_Fast(UltimaLeitura.LatitudeAnt, UltimaLeitura.LongitudeAnt, UltimaLeitura.OrientacaoReal, UltimaLeitura.TimestampOri.frequencia); + UltimaLeitura.Latitude = latCor; + UltimaLeitura.Longitude = lonCorr; + } + public static void AtualizarCoordenadasGPS() { PenultimaLeitura.Ntrip_ativado = UltimaLeitura.Ntrip_ativado; @@ -1407,8 +1428,10 @@ namespace AgroBase.Services /// - frontal positivo desloca a posição corrigida para trás do robô /// - lateral positivo desloca a posição corrigida para a esquerda do robô /// - public (double lat, double lon) FixLeverArmLatLon_Fast(double latAnt_deg, double lonAnt_deg, double headingDeg) + public (double lat, double lon) FixLeverArmLatLon_Fast(double latAnt_deg, double lonAnt_deg, double headingDeg, double headingFreq) { + if (headingFreq < 1) return (latAnt_deg, lonAnt_deg); + double xTotal = xFisico + xCampo; double yTotal = yFisico + yCampo;