diff --git a/Meshtastic/Helpers/BLEManager.swift b/Meshtastic/Helpers/BLEManager.swift index 27b04646..76be7679 100644 --- a/Meshtastic/Helpers/BLEManager.swift +++ b/Meshtastic/Helpers/BLEManager.swift @@ -730,6 +730,10 @@ class BLEManager: NSObject, CBPeripheralDelegate, ObservableObject { public func sendWaypoint(waypoint: Waypoint) -> Bool { + if waypoint.latitudeI == 373346000 && waypoint.longitudeI == -1220090000 { + return false + } + var success = false let fromNodeNum = UInt32(connectedPeripheral.num) var waypointPacket = waypoint diff --git a/Meshtastic/Helpers/Extensions.swift b/Meshtastic/Helpers/Extensions.swift index 38094e03..39a2b6af 100644 --- a/Meshtastic/Helpers/Extensions.swift +++ b/Meshtastic/Helpers/Extensions.swift @@ -1,5 +1,6 @@ import Foundation import SwiftUI +import MapKit extension Character { var isEmoji: Bool { @@ -8,6 +9,17 @@ extension Character { } } +extension CLLocationCoordinate2D { + /// Returns distance from coordianate in meters. + /// - Parameter from: coordinate which will be used as end point. + /// - Returns: Returns distance in meters. + func distance(from: CLLocationCoordinate2D) -> CLLocationDistance { + let from = CLLocation(latitude: from.latitude, longitude: from.longitude) + let to = CLLocation(latitude: self.latitude, longitude: self.longitude) + return from.distance(from: to) + } +} + extension Data { var macAddressString: String { let mac: String = reduce("") {$0 + String(format: "%02x:", $1)} diff --git a/Meshtastic/Helpers/MeshPackets.swift b/Meshtastic/Helpers/MeshPackets.swift index d95c2126..efc248f4 100644 --- a/Meshtastic/Helpers/MeshPackets.swift +++ b/Meshtastic/Helpers/MeshPackets.swift @@ -734,9 +734,8 @@ func channelPacket (channel: Channel, fromNum: Int64, context: NSManagedObjectCo func deviceMetadataPacket (metadata: DeviceMetadata, fromNum: Int64, context: NSManagedObjectContext) { if metadata.isInitialized { - - let logString = String.localizedStringWithFormat(NSLocalizedString("mesh.log.device.metadata.received %@", comment: "Device Metadata received from: %@"), String(fromNum)) - MeshLogger.log("🎛️ \(logString)") + let logString = String.localizedStringWithFormat(NSLocalizedString("mesh.log.device.metadata.received %@", comment: "Device Metadata admin message received from: %@"), String(fromNum)) + MeshLogger.log("🏷️ \(logString)") let fetchedNodeRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") fetchedNodeRequest.predicate = NSPredicate(format: "num == %lld", fromNum) @@ -977,12 +976,8 @@ func nodeInfoAppPacket (packet: MeshPacket, context: NSManagedObjectContext) { func adminAppPacket (packet: MeshPacket, context: NSManagedObjectContext) { - MeshLogger.log("🕸️ MESH PACKET received for Admin App \(try! packet.decoded.jsonString())") - if let adminMessage = try? AdminMessage(serializedData: packet.decoded.payload) { - MeshLogger.log("🕸️ MESH PACKET received for Admin App \(adminMessage.getDeviceMetadataResponse)") - if adminMessage.payloadVariant == AdminMessage.OneOf_PayloadVariant.getCannedMessageModuleMessagesResponse(adminMessage.getCannedMessageModuleMessagesResponse) { if let cmmc = try? CannedMessageModuleConfig(serializedData: packet.decoded.payload) { @@ -1019,16 +1014,20 @@ func adminAppPacket (packet: MeshPacket, context: NSManagedObjectContext) { } } else if adminMessage.payloadVariant == AdminMessage.OneOf_PayloadVariant.getChannelResponse(adminMessage.getChannelResponse) { channelPacket(channel: adminMessage.getChannelResponse, fromNum: Int64(packet.from), context: context) + } else if adminMessage.payloadVariant == AdminMessage.OneOf_PayloadVariant.getDeviceMetadataResponse(adminMessage.getDeviceMetadataResponse) { deviceMetadataPacket(metadata: adminMessage.getDeviceMetadataResponse, fromNum: Int64(packet.from), context: context) - } else if adminMessage.payloadVariant == AdminMessage.OneOf_PayloadVariant.getConfigResponse(adminMessage.getConfigResponse) { + } else if adminMessage.payloadVariant == AdminMessage.OneOf_PayloadVariant.getConfigResponse(adminMessage.getConfigResponse) { if let config = try? Config(serializedData: packet.decoded.payload) { - - if config.payloadVariant == Config.OneOf_PayloadVariant.lora(config.lora) { + if config.payloadVariant == Config.OneOf_PayloadVariant.bluetooth(config.bluetooth) { + //upsertLoraConfigPacket(config: config, nodeNum: Int64(packet.from), context: context) + } else if config.payloadVariant == Config.OneOf_PayloadVariant.lora(config.lora) { upsertLoraConfigPacket(config: config, nodeNum: Int64(packet.from), context: context) } } + } else { + MeshLogger.log("🕸️ MESH PACKET received for Admin App \(try! packet.decoded.jsonString())") } } } diff --git a/Meshtastic/Persistence/UpdateCoreData.swift b/Meshtastic/Persistence/UpdateCoreData.swift index a97c70ce..53c05627 100644 --- a/Meshtastic/Persistence/UpdateCoreData.swift +++ b/Meshtastic/Persistence/UpdateCoreData.swift @@ -143,7 +143,6 @@ func upsertLoraConfigPacket(config: Config, nodeNum: Int64, context: NSManagedOb } do { try context.save() - context.refreshAllObjects() print("💾 Updated LoRa Config for node number: \(String(nodeNum))") } catch { context.rollback() diff --git a/Meshtastic/Views/Map/Custom/MapViewSwiftUI.swift b/Meshtastic/Views/Map/Custom/MapViewSwiftUI.swift index d4de2fb5..caa9f52e 100644 --- a/Meshtastic/Views/Map/Custom/MapViewSwiftUI.swift +++ b/Meshtastic/Views/Map/Custom/MapViewSwiftUI.swift @@ -98,9 +98,9 @@ struct MapViewSwiftUI: UIViewRepresentable { self.parent = parent super.init() self.longPressRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(longPressHandler)) - self.longPressRecognizer.minimumPressDuration = 0.4 + self.longPressRecognizer.minimumPressDuration = 0.5 //self.longPressRecognizer.numberOfTouchesRequired = 1 - //self.longPressRecognizer.cancelsTouchesInView = true + self.longPressRecognizer.cancelsTouchesInView = true self.longPressRecognizer.delegate = self self.parent.mapView.addGestureRecognizer(longPressRecognizer) self.overlays = [] @@ -113,6 +113,7 @@ struct MapViewSwiftUI: UIViewRepresentable { case _ as MKClusterAnnotation: let annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: "nodeGroup") as? MKMarkerAnnotationView ?? MKMarkerAnnotationView(annotation: annotation, reuseIdentifier: "nodeGroup") annotationView.markerTintColor = .brown//.systemRed + annotationView.displayPriority = .defaultLow annotationView.tag = -1 return annotationView case _ as PositionEntity: @@ -122,7 +123,7 @@ struct MapViewSwiftUI: UIViewRepresentable { annotationView.glyphText = "📟" annotationView.clusteringIdentifier = "nodeGroup" annotationView.markerTintColor = UIColor(.indigo) - annotationView.titleVisibility = .visible + annotationView.titleVisibility = .adaptive return annotationView case let waypointAnnotation as WaypointEntity: let annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: "waypoint") as? MKMarkerAnnotationView ?? MKMarkerAnnotationView(annotation: annotation, reuseIdentifier: "Waypoint") @@ -137,7 +138,7 @@ struct MapViewSwiftUI: UIViewRepresentable { annotationView.clusteringIdentifier = "waypointGroup" annotationView.markerTintColor = UIColor(.accentColor) annotationView.displayPriority = .required - annotationView.titleVisibility = .visible + annotationView.titleVisibility = .adaptive let leftIcon = UIImageView(image: annotationView.glyphText?.image()) leftIcon.backgroundColor = UIColor(.accentColor) annotationView.leftCalloutAccessoryView = leftIcon diff --git a/Meshtastic/Views/Map/WaypointFormView.swift b/Meshtastic/Views/Map/WaypointFormView.swift index bf8fdee5..201ba6d9 100644 --- a/Meshtastic/Views/Map/WaypointFormView.swift +++ b/Meshtastic/Views/Map/WaypointFormView.swift @@ -152,6 +152,8 @@ struct WaypointFormView: View { waypointId = 0 dismiss() } else { + waypointId = 0 + dismiss() print("Send waypoint failed") } } label: { @@ -221,6 +223,13 @@ struct WaypointFormView: View { latitude = coordinate.latitude longitude = coordinate.longitude } + + if coordinate.distance(from: LocationHelper.DefaultLocation) == 0.0 { + // Too close to apple park, bail out + waypointId = 0 + //dismiss() + //print(coordinate.distance(from: LocationHelper.DefaultLocation)) + } } } } diff --git a/Meshtastic/Views/Nodes/NodeMap.swift b/Meshtastic/Views/Nodes/NodeMap.swift index f6bb191a..99f21bca 100644 --- a/Meshtastic/Views/Nodes/NodeMap.swift +++ b/Meshtastic/Views/Nodes/NodeMap.swift @@ -40,7 +40,7 @@ struct NodeMap: View { private var waypoints: FetchedResults @State private var mapType: MKMapType = .standard - @State var waypointCoordinate: CLLocationCoordinate2D? + @State var waypointCoordinate: CLLocationCoordinate2D = LocationHelper.DefaultLocation @State var editingWaypoint: Int = 0 @State private var presentingWaypointForm = false @State private var customMapOverlay: MapViewSwiftUI.CustomMapOverlay? = MapViewSwiftUI.CustomMapOverlay( @@ -58,7 +58,11 @@ struct NodeMap: View { MapViewSwiftUI(onLongPress: { coord in waypointCoordinate = coord editingWaypoint = 0 - presentingWaypointForm = true + if waypointCoordinate.distance(from: LocationHelper.DefaultLocation) == 0.0 { + print("Apple Park") + } else { + presentingWaypointForm = true + } }, onWaypointEdit: { wpId in if wpId > 0 { editingWaypoint = wpId @@ -82,7 +86,7 @@ struct NodeMap: View { .ignoresSafeArea(.all, edges: [.top, .leading, .trailing]) .frame(maxHeight: .infinity) .sheet(isPresented: $presentingWaypointForm ) {//, onDismiss: didDismissSheet) { - WaypointFormView(coordinate: waypointCoordinate ?? LocationHelper.DefaultLocation, waypointId: editingWaypoint) + WaypointFormView(coordinate: waypointCoordinate, waypointId: editingWaypoint) .presentationDetents([.medium, .large]) .presentationDragIndicator(.automatic) diff --git a/en.lproj/Localizable.strings b/en.lproj/Localizable.strings index fd37f919..7f67069a 100644 --- a/en.lproj/Localizable.strings +++ b/en.lproj/Localizable.strings @@ -21,7 +21,7 @@ "battery.level.trend"="Battery Level Trend"; "ble.name"="BLE Name"; "ble.connection.timeout %d %@"="Connection failed after %d attempts to connect to %@. You may need to forget your device under Settings > Bluetooth."; -"ble.errorcode.6 %@"="%@ The app will automatically reconnect to the preferred radio if it come back in range."; +"ble.errorcode.6 %@"="%@ The app will automatically reconnect to the preferred radio if it comes back in range."; "ble.errorcode.14 %@"="%@ This error usually cannot be fixed without forgetting the device unders Settings > Bluetooth and re-connecting to the radio."; "ble.errorcode.pin %@"="%@ Please try connecting again and check the PIN carefully."; "bluetooth"="Bluetooth";