using GeoVLog.Core.Models; using System; using System.Globalization; using System.Text; namespace GeoVLog.Core.Parsers; /// /// Parser for Geometrics G-823A magnetometer ASCII frames /// of the form "$ 30614.050,1521". Validates basic structure /// and extracts the magnetic field and ADC value. /// internal static class MagParser { public static bool TryParse(ReadOnlySpan msg, DateTime arrivalUtc, out MagReading parsed) { parsed = default!; var line = Encoding.ASCII.GetString(msg).Trim(); if (line.Length == 0 || line[0] != '$') return false; var body = line.Substring(1).TrimStart(); int comma = body.IndexOf(','); if (comma <= 0 || comma >= body.Length - 1) return false; string fieldPart = body.Substring(0, comma); string adcPart = body.Substring(comma + 1); if (!double.TryParse(fieldPart, NumberStyles.Float, CultureInfo.InvariantCulture, out double field)) return false; if (!int.TryParse(adcPart, NumberStyles.Integer, CultureInfo.InvariantCulture, out int adc)) return false; parsed = new MagReading { TimestampUtc = arrivalUtc, RawLine = line, MagneticFieldNT = field, SignalLevel = adc, Channel = 0 // default; caller can override }; return true; } }