Initial commit: FieldLogger MAUI app with Maglink BLE support

Added Maglink RTK GNSS receiver integration with correct BLE UUIDs and device name filtering (ML-* prefix).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
brentperteet
2026-07-06 13:46:50 -05:00
commit b602b762c9
79 changed files with 5807 additions and 0 deletions

View File

@@ -0,0 +1,51 @@
namespace FieldLogger.Models;
/// <summary>
/// Info string the UM receiver sends the first time push-button data logging is enabled.
/// </summary>
public sealed class UmDeviceInfo
{
public string Manufacturer { get; init; } = "";
public string ModelName { get; init; } = "";
public string SerialNumber { get; init; } = "";
public string BootloaderVersion { get; init; } = "";
public string SoftwareVersion { get; init; } = "";
public string ManufactureDate { get; init; } = "";
public string CalibrationDate { get; init; } = "";
public double HourCount { get; init; }
public int PbdlSchema { get; init; }
public string RawText { get; init; } = "";
/// <summary>
/// Parses the 10-field info string (9 parameters followed by "OK").
/// Returns null if the line does not match.
/// </summary>
public static UmDeviceInfo? TryParse(string line)
{
var fields = line.Trim().Split(',');
if (fields.Length < 10 || !fields[^1].Trim().Equals("OK", StringComparison.OrdinalIgnoreCase))
return null;
// Serial number is 9 digits; use it to distinguish from other OK-terminated responses.
if (fields[2].Trim().Length < 6)
return null;
double.TryParse(fields[7], System.Globalization.NumberStyles.Float,
System.Globalization.CultureInfo.InvariantCulture, out var hours);
int.TryParse(fields[8], out var schema);
return new UmDeviceInfo
{
Manufacturer = fields[0].Trim(),
ModelName = fields[1].Trim(),
SerialNumber = fields[2].Trim(),
BootloaderVersion = fields[3].Trim(),
SoftwareVersion = fields[4].Trim(),
ManufactureDate = fields[5].Trim(),
CalibrationDate = fields[6].Trim(),
HourCount = hours,
PbdlSchema = schema,
RawText = line.Trim(),
};
}
}