public async Task <bool> SubscribeToTargetPositionEventsAsync(ITargetPositionObserver observer, TargetPositionObserverOptions options) { // TODO: Add thread safety if (TargetPositionObservers.ContainsKey(observer)) { TargetPositionObservers[observer] = options; return(true); } Task <bool>[] tasks = { StartGeolocatorAsync(), StartCompassAsync() }; bool[] results = await Task.WhenAll(tasks); if (!results.All(x => x)) { #pragma warning disable 4014 StopCompassIfUnusedAsync(); StopGeolocatorIfUnusedAsync(); #pragma warning restore 4014 return(false); } TargetPositionObservers.Add(observer, options); return(true); }
protected void NotifyTargetPositionObserver(ITargetPositionObserver observer, TargetPositionObserverOptions options) { IPosition targetPosition = options.TargetPosition; double distance = Location.CalculateDistance(new Location(CurrentPosition.Latitude, CurrentPosition.Longitude), new Location(targetPosition.Latitude, targetPosition.Longitude), DistanceUnits.Kilometers); double direction = (CurrentPosition.GetBearing(targetPosition) - CurrentHeading.Value + 360) % 360; observer.OnDistanceChanged(distance); observer.OnDirectionChanged(direction); }