using GeoVLog.Core.Models; using System; using System.Globalization; using System.Text; namespace GeoVLog.Core.Parsers; /// /// Parser for the SBG Ellipse2-N proprietary $PRDID sentence carrying pitch, roll and heading. /// Only messages with a valid checksum are parsed. /// internal static class ImuParser { public static bool TryParse(ReadOnlySpan msg, DateTime arrivalUtc, out ImuReading parsed) { parsed = default!; var line = Encoding.ASCII.GetString(msg).Trim(); int star = line.IndexOf('*'); if (star <= 0 || star + 3 > line.Length) return false; byte cs = 0; for (int i = 1; i < star; i++) cs ^= (byte)line[i]; if (!byte.TryParse(line.AsSpan(star + 1, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out var given) || given != cs) return false; string[] parts = line[..star].Split(','); if (parts.Length < 4 || parts[0] != "$PRDID") return false; if (!double.TryParse(parts[1], NumberStyles.Float, CultureInfo.InvariantCulture, out double pitch)) return false; if (!double.TryParse(parts[2], NumberStyles.Float, CultureInfo.InvariantCulture, out double roll)) return false; if (!double.TryParse(parts[3], NumberStyles.Float, CultureInfo.InvariantCulture, out double heading)) return false; parsed = new ImuReading { TimestampUtc = arrivalUtc, RawLine = line, PitchDeg = pitch, RollDeg = roll, HeadingDeg = heading }; return true; } }