diff --git a/lib/connector/meshcore_connector.dart b/lib/connector/meshcore_connector.dart index 7b974f3..d2dedce 100644 --- a/lib/connector/meshcore_connector.dart +++ b/lib/connector/meshcore_connector.dart @@ -4913,6 +4913,17 @@ class MeshCoreConnector extends ChangeNotifier { ); } + bool hasValidLocation(double? latitude, double? longitude) { + const double epsilon = 1e-6; + final lat = latitude ?? 0.0; + final lon = longitude ?? 0.0; + return (lat.abs() > epsilon || lon.abs() > epsilon) && + lat >= -90.0 && + lat <= 90.0 && + lon >= -180.0 && + lon <= 180.0; + } + void _handlePayloadAdvertReceived( Uint8List rawPacket, Uint8List payload, @@ -4950,6 +4961,9 @@ class MeshCoreConnector extends ChangeNotifier { latitude = advert.readInt32LE() / 1e6; longitude = advert.readInt32LE() / 1e6; } + // Validate location values if present + hasLocation = hasValidLocation(latitude, longitude); + if (hasName && advert.remaining > 0) { name = advert.readString(); } @@ -5015,20 +5029,8 @@ class MeshCoreConnector extends ChangeNotifier { // CRITICAL: Preserve user's path override when contact is refreshed from device _contacts[existingIndex] = existing.copyWith( - latitude: - hasLocation && - latitude != null && - latitude.abs() <= 90 && - (latitude != 0 || longitude != 0) - ? latitude - : existing.latitude, - longitude: - hasLocation && - longitude != null && - longitude.abs() <= 180 && - (latitude != 0 || longitude != 0) - ? longitude - : existing.longitude, + latitude: hasLocation ? latitude : existing.latitude, + longitude: hasLocation ? longitude : existing.longitude, name: hasName ? name : existing.name, path: Uint8List.fromList(path.reversed.toList()), pathLength: path.length, diff --git a/lib/models/contact.dart b/lib/models/contact.dart index acd1da9..9a5c19c 100644 --- a/lib/models/contact.dart +++ b/lib/models/contact.dart @@ -181,12 +181,13 @@ class Contact { final lastMod = reader.readUInt32LE(); double? lat, lon; - final latRaw = reader.readInt32LE(); - final lonRaw = reader.readInt32LE(); - - if (latRaw != 0 || lonRaw != 0) { - lat = latRaw / 1e6; - lon = lonRaw / 1e6; + if (reader.remaining >= 8) { + final latRaw = reader.readInt32LE(); + final lonRaw = reader.readInt32LE(); + if (latRaw != 0 || lonRaw != 0) { + lat = latRaw / 1e6; + lon = lonRaw / 1e6; + } } return Contact(