示例#1
0
        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);
        }
示例#2
0
        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);
        }