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,15 @@
Any raw assets you want to be deployed with your application can be placed in
this directory (and child directories). Deployment of the asset to your application
is automatically handled by the following `MauiAsset` Build Action within your `.csproj`.
<MauiAsset Include="Resources\Raw\**" LogicalName="%(RecursiveDir)%(Filename)%(Extension)" />
These files will be deployed with your package and will be accessible using Essentials:
async Task LoadMauiAsset()
{
using var stream = await FileSystem.OpenAppPackageFileAsync("AboutAssets.txt");
using var reader = new StreamReader(stream);
var contents = reader.ReadToEnd();
}

View File

@@ -0,0 +1,64 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style>
html, body, #map { height: 100%; margin: 0; padding: 0; }
</style>
</head>
<body>
<div id="map"></div>
<script>
let map;
let markers = [];
let infoWindow;
function initMap() {
map = new google.maps.Map(document.getElementById('map'), {
center: { lat: 39.5, lng: -98.35 },
zoom: 4,
mapTypeId: 'hybrid'
});
infoWindow = new google.maps.InfoWindow();
}
// Called from the app with an array of point objects.
function setPoints(points) {
markers.forEach(m => m.setMap(null));
markers = [];
if (!map || !points || points.length === 0) return;
const bounds = new google.maps.LatLngBounds();
points.forEach(p => {
const pos = { lat: p.lat, lng: p.lng };
const marker = new google.maps.Marker({
position: pos,
map: map,
title: '#' + p.id + ' ' + p.utility
});
marker.addListener('click', () => {
infoWindow.setContent(
'<b>#' + p.id + ' &middot; ' + p.utility + '</b><br/>' +
'Depth: ' + p.depth + ' &middot; Current: ' + p.current + '<br/>' +
'Frequency: ' + p.frequency + ' Hz<br/>' +
'Fix: ' + p.fix + ' (&plusmn;' + p.hrms.toFixed(3) + ' m)<br/>' +
p.time);
infoWindow.open(map, marker);
});
markers.push(marker);
bounds.extend(pos);
});
if (points.length === 1) {
map.setCenter(bounds.getCenter());
map.setZoom(19);
} else {
map.fitBounds(bounds, 60);
}
}
</script>
<script async
src="https://maps.googleapis.com/maps/api/js?key=%%GOOGLE_MAPS_API_KEY%%&callback=initMap"></script>
</body>
</html>