From 79db79f470291307d1f3aa7e61ef2ac6daef794b Mon Sep 17 00:00:00 2001 From: Juha Date: Sun, 20 Oct 2024 19:50:59 +0300 Subject: [PATCH] Changed average to median --- app/GNSSStatus/Parsing/GNSSData.cs | 127 +++++++++++++++++++---- app/GNSSStatus/Parsing/SentenceParser.cs | 11 +- 2 files changed, 118 insertions(+), 20 deletions(-) diff --git a/app/GNSSStatus/Parsing/GNSSData.cs b/app/GNSSStatus/Parsing/GNSSData.cs index 50fe015..92fbb3d 100644 --- a/app/GNSSStatus/Parsing/GNSSData.cs +++ b/app/GNSSStatus/Parsing/GNSSData.cs @@ -2,18 +2,32 @@ using System.Text; using GNSSStatus.Configuration; using GNSSStatus.Utils; +using YamlDotNet.Serialization; namespace GNSSStatus.Parsing; public class GNSSData { + public readonly List DeltaZCache = new(); public readonly List DeltaXCache = new(); public readonly List DeltaYCache = new(); - public readonly List DeltaZCache = new(); public readonly List RoverXCache = new(); public readonly List RoverYCache = new(); public readonly List RoverZCache = new(); - public readonly List FixTypesCache = new(); + public readonly List RoverUtcTimeCache = new(); + public readonly List RoverFixTypeCache = new(); + public readonly List RoverSatInUseCache = new(); + public readonly List RoverPDopCache = new(); + public readonly List RoverVDopCache = new(); + public readonly List RoverHDopCache = new(); + public readonly List RoverErrorLatitudeCache = new(); + public readonly List RoverErrorLongitudeCache = new(); + public readonly List RoverErrorAltitudeCache = new(); + public readonly List RoverBaselineCache = new(); + + //public readonly List RoverFixCache = new(); + //public readonly List RoverSatInUseCache = new(); + //public readonly List FixTypesCache = new(); public double IonoPercentage { get; set; } public GGAData GGA { get; set; } @@ -26,7 +40,7 @@ public class GNSSData public string GetPayloadJson() { JsonPayloadBuilder builder = new(); - + /* // Calculate averages and clear caches. double deltaXAverage = DeltaXCache.Count > 0 ? DeltaXCache.Average() : 0; double deltaYAverage = DeltaYCache.Count > 0 ? DeltaYCache.Average() : 0; @@ -35,13 +49,49 @@ public string GetPayloadJson() double roverXAverage = RoverXCache.Count > 0 ? RoverXCache.Average() : 0; double roverYAverage = RoverYCache.Count > 0 ? RoverYCache.Average() : 0; double roverZAverage = RoverZCache.Count > 0 ? RoverZCache.Average() : 0; + */ + + // Calculate median and clear caches. + int medianIndex = CalculateMedianIndex(RoverZCache).Item1; + int medianPdop = CalculateMedianIndex(RoverPDopCache).Item1; + int medianGstAltitudeError = CalculateMedianIndex(RoverErrorAltitudeCache).Item1; + int medianBaseline = CalculateMedianIndex(RoverBaselineCache).Item1; + double roverXMedian = RoverXCache[medianIndex]; + double roverYMedian = RoverYCache[medianIndex]; + double roverZMedian = RoverZCache[medianIndex]; + double deltaXMedian = DeltaXCache[medianIndex]; + double deltaYMedian = DeltaYCache[medianIndex]; + double deltaXy = Math.Sqrt(deltaXMedian * deltaXMedian + deltaYMedian * deltaYMedian); + string roverUtCTime = RoverUtcTimeCache[medianIndex]; + GGAData.FixType roverFixType = RoverFixTypeCache[medianIndex]; + int roverSatInUse = RoverSatInUseCache[medianIndex]; + double deltaZ = DeltaZCache[medianIndex]; + float pDop = RoverPDopCache[medianPdop]; + float hDop = RoverHDopCache[medianPdop]; + float vDop = RoverVDopCache[medianPdop]; + float errLat = RoverErrorLatitudeCache[medianGstAltitudeError]; + float errLon = RoverErrorLongitudeCache[medianGstAltitudeError]; + float errAlt = RoverErrorAltitudeCache[medianGstAltitudeError]; + double baseline = RoverBaselineCache[medianBaseline]; + DeltaXCache.Clear(); DeltaYCache.Clear(); DeltaZCache.Clear(); RoverXCache.Clear(); RoverYCache.Clear(); RoverZCache.Clear(); + RoverUtcTimeCache.Clear(); + RoverFixTypeCache.Clear(); + RoverSatInUseCache.Clear(); + RoverPDopCache.Clear(); + RoverHDopCache.Clear(); + RoverVDopCache.Clear(); + RoverErrorAltitudeCache.Clear(); + RoverErrorLatitudeCache.Clear(); + RoverErrorLongitudeCache.Clear(); + RoverBaselineCache.Clear(); + /* // Determine the worst fix type. GGAData.FixType worstFixType; if (FixTypesCache.Count > 0) @@ -52,50 +102,90 @@ public string GetPayloadJson() worstFixType = GGAData.FixType.RTKFloat; else worstFixType = GGAData.FixType.RTKFixed; + } else worstFixType = GGAData.FixType.NoFix; FixTypesCache.Clear(); + */ // Manually serialize relevant properties. builder.AddPayload(new { - TimeUtc = GGA.UtcTime, - FixType = worstFixType, - SatellitesInUse = GGA.TotalSatellitesInUse, - RoverX = roverXAverage, - RoverY = roverYAverage, - RoverZ = roverZAverage, + TimeUtc = roverUtCTime, + //FixType = worstFixType, + FixType = roverFixType, + //SatellitesInUse = GGA.TotalSatellitesInUse, + SatellitesInUse = roverSatInUse, + //RoverX = roverXAverage, + RoverX = roverXMedian, + //RoverY = roverYAverage, + RoverY = roverYMedian, + //RoverZ = roverZAverage, + RoverZ = roverZMedian, }); builder.AddPayload(new { - DeltaXY = deltaXYAverage, - DeltaZ = deltaZAverage, - PDop = GSA.PDop, - HDop = GSA.HDop, - VDop = GSA.VDop + //DeltaXY = deltaXYAverage, + DeltaXY = deltaXy, + //DeltaZ = deltaZAverage, + DeltaZ = deltaZ, + //PDop = GSA.PDop, + PDop = pDop, + //HDop = GSA.HDop, + HDop = hDop, + //VDop = GSA.VDop + VDop = vDop, }); builder.AddPayload(new { RoverId = ConfigManager.CurrentConfiguration.RoverIdentifier, - ErrorLatitude = GST.LatitudeError, - ErrorLongitude = GST.LongitudeError, - ErrorAltitude = GST.AltitudeError + //ErrorLatitude = GST.LatitudeError, + ErrorLatitude = errLat, + //ErrorLongitude = GST.LongitudeError, + ErrorLongitude = errLon, + //ErrorAltitude = GST.AltitudeError + ErrorAltitude = errAlt }); builder.AddPayload(new { DifferentialDataAge = GGA.AgeOfDifferentialData, ReferenceStationId = GGA.DifferentialReferenceStationID, - BaseRoverDistance = NTR.DistanceBetweenBaseAndRover, + //BaseRoverDistance = NTR.DistanceBetweenBaseAndRover, + BaseRoverDistance = baseline, IonoPercentage = IonoPercentage }); return builder.Build(true); } + public (int, int) CalculateMedianIndex(List list) + { + // Luo kopio alkuperäisestä listasta ja liitä siihen alkuperäiset indeksit + var indexedNumbers = list + .Select((value, index) => new { Value = value, Index = index }) + .OrderBy(x => x.Value) + .ToArray(); + + int count = indexedNumbers.Length; + + if (count % 2 == 0) + { + // Jos määrä on parillinen, laske kahden keskimmäisen luvun indeksit + int mid1Index = indexedNumbers[count / 2 - 1].Index; + int mid2Index = indexedNumbers[count / 2].Index; + return (mid1Index, mid2Index); + } + else + { + // Jos määrä on pariton, valitse keskimmäisen luvun indeksi + int medianIndex = indexedNumbers[count / 2].Index; + return (medianIndex, -1); // -1 tarkoittaa, että vain yksi mediaani löytyy + } + } /// /// NOTE: Should only be used for debugging purposes. @@ -112,7 +202,6 @@ public override string ToString() return sb.ToString(); } - private static void AppendPropertiesRecursive(StringBuilder sb, object? obj, int depth = 0) { if (obj == null) diff --git a/app/GNSSStatus/Parsing/SentenceParser.cs b/app/GNSSStatus/Parsing/SentenceParser.cs index a8637e0..7b597b4 100644 --- a/app/GNSSStatus/Parsing/SentenceParser.cs +++ b/app/GNSSStatus/Parsing/SentenceParser.cs @@ -30,7 +30,9 @@ public static void Parse(Nmea0183Sentence sentence) ParsedData.RoverXCache.Add(ParsedData.GGA.RoverX); ParsedData.RoverYCache.Add(ParsedData.GGA.RoverY); ParsedData.RoverZCache.Add(ParsedData.GGA.RoverZ); - ParsedData.FixTypesCache.Add(ParsedData.GGA.Quality); + ParsedData.RoverUtcTimeCache.Add(ParsedData.GGA.UtcTime); + ParsedData.RoverFixTypeCache.Add(ParsedData.GGA.Quality); + ParsedData.RoverSatInUseCache.Add(ParsedData.GGA.TotalSatellitesInUse); break; } case Nmea0183SentenceType.GSA: @@ -42,6 +44,9 @@ public static void Parse(Nmea0183Sentence sentence) } ParsedData.GSA = new GSAData(sentence); + ParsedData.RoverPDopCache.Add(ParsedData.GSA.PDop); + ParsedData.RoverVDopCache.Add(ParsedData.GSA.VDop); + ParsedData.RoverHDopCache.Add(ParsedData.GSA.HDop); break; } case Nmea0183SentenceType.GST: @@ -53,6 +58,9 @@ public static void Parse(Nmea0183Sentence sentence) } ParsedData.GST = new GSTData(sentence); + ParsedData.RoverErrorAltitudeCache.Add(ParsedData.GST.AltitudeError); + ParsedData.RoverErrorLongitudeCache.Add(ParsedData.GST.LongitudeError); + ParsedData.RoverErrorLatitudeCache.Add(ParsedData.GST.LatitudeError); break; } case Nmea0183SentenceType.GSV: @@ -75,6 +83,7 @@ public static void Parse(Nmea0183Sentence sentence) } ParsedData.NTR = new NTRData(sentence); + ParsedData.RoverBaselineCache.Add(ParsedData.NTR.DistanceBetweenBaseAndRover); break; } case Nmea0183SentenceType.GBS: