Skip to content

Commit

Permalink
Code cleanup and commenting.
Browse files Browse the repository at this point in the history
  • Loading branch information
avi-c committed Apr 13, 2021
1 parent 7f3363b commit 7acf938
Show file tree
Hide file tree
Showing 4 changed files with 214 additions and 189 deletions.
8 changes: 8 additions & 0 deletions MapboxNavigation.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -397,6 +397,8 @@
DAFA92071F01735000A7FB09 /* DistanceFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 351BEC0B1E5BCC72006FE110 /* DistanceFormatter.swift */; };
F43EE329261F98DC0039D56F /* NavigationMapView+RoadAnnotations.swift in Sources */ = {isa = PBXBuildFile; fileRef = F43EE328261F98DC0039D56F /* NavigationMapView+RoadAnnotations.swift */; };
F43EE32A261F98DC0039D56F /* NavigationMapView+RoadAnnotations.swift in Sources */ = {isa = PBXBuildFile; fileRef = F43EE328261F98DC0039D56F /* NavigationMapView+RoadAnnotations.swift */; };
F488A0BE26261C4600A4CC8C /* NavigationMapView+IntersectionAnnotations.swift in Sources */ = {isa = PBXBuildFile; fileRef = F488A0BD26261C4600A4CC8C /* NavigationMapView+IntersectionAnnotations.swift */; };
F488A0C826261D8100A4CC8C /* ElectronicHorizon.swift in Sources */ = {isa = PBXBuildFile; fileRef = F488A0C726261D8100A4CC8C /* ElectronicHorizon.swift */; };
F4BF512E24EAD7A50066A49B /* FeedbackSubtypeCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4BF512D24EAD7A50066A49B /* FeedbackSubtypeCollectionViewCell.swift */; };
F4C5A26F24EF1D16004ED0DD /* FeedbackSubtypeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4C5A26E24EF1D16004ED0DD /* FeedbackSubtypeViewController.swift */; };
/* End PBXBuildFile section */
Expand Down Expand Up @@ -1024,6 +1026,8 @@
DAFEB36E2093A3E000A86A83 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Localizable.strings; sourceTree = "<group>"; };
DAFEB36F2093A3EF00A86A83 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = ko; path = Resources/ko.lproj/Localizable.stringsdict; sourceTree = "<group>"; };
F43EE328261F98DC0039D56F /* NavigationMapView+RoadAnnotations.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NavigationMapView+RoadAnnotations.swift"; sourceTree = "<group>"; };
F488A0BD26261C4600A4CC8C /* NavigationMapView+IntersectionAnnotations.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NavigationMapView+IntersectionAnnotations.swift"; sourceTree = "<group>"; };
F488A0C726261D8100A4CC8C /* ElectronicHorizon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ElectronicHorizon.swift; sourceTree = "<group>"; };
F4BF512D24EAD7A50066A49B /* FeedbackSubtypeCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbackSubtypeCollectionViewCell.swift; sourceTree = "<group>"; };
F4C5A26E24EF1D16004ED0DD /* FeedbackSubtypeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbackSubtypeViewController.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
Expand Down Expand Up @@ -1662,6 +1666,8 @@
8AE9081125FAA53300F37077 /* Collection.swift */,
8A8C3D97260175D20071D274 /* CLLocationDirection.swift */,
8A446644260A7B24008BA55E /* BoundingBox.swift */,
F488A0BD26261C4600A4CC8C /* NavigationMapView+IntersectionAnnotations.swift */,
F488A0C726261D8100A4CC8C /* ElectronicHorizon.swift */,
);
name = Extensions;
sourceTree = "<group>";
Expand Down Expand Up @@ -2559,6 +2565,7 @@
8DEDEF3421E3FBE80049E114 /* NavigationViewControllerDelegate.swift in Sources */,
8A446645260A7B24008BA55E /* BoundingBox.swift in Sources */,
8AD866F625CA1BF10019A638 /* NavigationCamera.swift in Sources */,
F488A0C826261D8100A4CC8C /* ElectronicHorizon.swift in Sources */,
8D5DFFF1207C04840093765A /* NSAttributedString.swift in Sources */,
35CF34B11F0A733200C2692E /* UIFont.swift in Sources */,
8AD866F925CA1BF10019A638 /* ViewportDataSource.swift in Sources */,
Expand All @@ -2583,6 +2590,7 @@
160D8279205996DA00D278D6 /* DataCache.swift in Sources */,
8AFF437125F847340053CBB1 /* CameraOptions.swift in Sources */,
351BEBF21E5BCC63006FE110 /* Style.swift in Sources */,
F488A0BE26261C4600A4CC8C /* NavigationMapView+IntersectionAnnotations.swift in Sources */,
43FB386923A202420064481E /* Route.swift in Sources */,
3EA937B1F4DF73EB004BA6BE /* InstructionPresenter.swift in Sources */,
5A1C075824BDEB44000A6330 /* PassiveLocationManager.swift in Sources */,
Expand Down
38 changes: 38 additions & 0 deletions Sources/MapboxNavigation/ElectronicHorizon.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import MapboxCoreNavigation

extension ElectronicHorizon.Edge {
var mpp: [ElectronicHorizon.Edge]? {

guard level == 0 else { return nil }

var mostProbablePath = [self]

for child in outletEdges {
if let childMPP = child.mpp {
mostProbablePath.append(contentsOf: childMPP)
}
}

return mostProbablePath
}

func edgeNames(roadGraph: RoadGraph) -> [String] {
guard let metadata = roadGraph.edgeMetadata(edgeIdentifier: identifier) else {
return []
}
let names = metadata.names.map { name -> String in
switch name {
case .name(let name):
return name
case .code(let code):
return "(\(code))"
}
}

// If the road is unnamed, fall back to the road class.
if names.isEmpty {
return ["\(metadata.mapboxStreetsRoadClass.rawValue)"]
}
return names
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
import CoreLocation
import UIKit
import MapboxDirections
import MapboxCoreNavigation
import Turf
import MapboxMaps

extension NavigationMapView {

struct EdgeIntersection {
var root: ElectronicHorizon.Edge
var branch: ElectronicHorizon.Edge
var rootMetadata: ElectronicHorizon.Edge.Metadata
var rootShape: LineString
var branchMetadata: ElectronicHorizon.Edge.Metadata
var branchShape: LineString

var coordinate: CLLocationCoordinate2D? {
rootShape.coordinates.first
}

var annotationPoint: CLLocationCoordinate2D? {
guard let length = branchShape.distance() else { return nil }
let targetDistance = min(length / 2, Double.random(in: 15...30))
guard let annotationPoint = branchShape.coordinateFromStart(distance: targetDistance) else { return nil }
return annotationPoint
}

var wayName: String? {
guard let roadName = rootMetadata.names.first else { return nil }

switch roadName {
case .name(let name):
return name
case .code(let code):
return "(\(code))"
}
}
var intersectingWayName: String? {
guard let roadName = branchMetadata.names.first else { return nil }

switch roadName {
case .name(let name):
return name
case .code(let code):
return "(\(code))"
}
}

var incidentAngle: CLLocationDegrees {
return (branchMetadata.heading - rootMetadata.heading).wrap(min: 0, max: 360)
}

var description: String {
return "EdgeIntersection: root: \(wayName ?? "") intersection: \(intersectingWayName ?? "") coordinate: \(String(describing: coordinate))"
}
}

enum AnnotationTailPosition: Int {
case left
case right
case center
}

class AnnotationCacheEntry: Equatable, Hashable {
var wayname: String
var coordinate: CLLocationCoordinate2D
var intersection: EdgeIntersection?
var feature: Feature
var lastAccessTime: Date

init(coordinate: CLLocationCoordinate2D, wayname: String, intersection: EdgeIntersection? = nil, feature: Feature) {
self.wayname = wayname
self.coordinate = coordinate
self.intersection = intersection
self.feature = feature
self.lastAccessTime = Date()
}

static func == (lhs: AnnotationCacheEntry, rhs: AnnotationCacheEntry) -> Bool {
return lhs.wayname == rhs.wayname
}

func hash(into hasher: inout Hasher) {
hasher.combine(wayname.hashValue)
}
}

class AnnotationCache {
private let maxEntryAge = TimeInterval(30)
var entries = Set<AnnotationCacheEntry>()
var cachePruningTimer: Timer?

init() {
// periodically prune the cache to remove entries that have been passed already
cachePruningTimer = Timer.scheduledTimer(withTimeInterval: 15, repeats: true, block: { [weak self] _ in
self?.prune()
})
}

deinit {
cachePruningTimer?.invalidate()
cachePruningTimer = nil
}

func setValue(feature: Feature, coordinate: CLLocationCoordinate2D, intersection: EdgeIntersection?, for wayname: String) {
entries.insert(AnnotationCacheEntry(coordinate: coordinate, wayname: wayname, intersection: intersection, feature: feature))
}

func value(for wayname: String) -> AnnotationCacheEntry? {
let matchingEntry = entries.first { entry -> Bool in
entry.wayname == wayname
}

if let matchingEntry = matchingEntry {
// update the timestamp used for pruning the cache
matchingEntry.lastAccessTime = Date()
}

return matchingEntry
}

private func prune() {
let now = Date()

entries.filter { now.timeIntervalSince($0.lastAccessTime) > maxEntryAge }.forEach { remove($0) }
}

public func remove(_ entry: AnnotationCacheEntry) {
entries.remove(entry)
}
}
}
Loading

0 comments on commit 7acf938

Please sign in to comment.