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;
}
}