public LogDetailPage(RunData runData)
        {
            InitializeComponent();

            foreach (var segment in runData.Segments.OrderBy(s => s.StartDate))
            {
                foreach (var loc in segment.Locations.OrderBy(l => l.Timestamp))
                {
                    RunMap.AddPosition(loc.GetPosition());
                }
            }

            var(minLat, minLng, maxLat, maxLng) = RunMap.RouteCoordinates.GetMinsAndMaxes();
            var distance = DependencyService.Get <ILocationService>().GetDistance(minLat.Value, minLng.Value, maxLat.Value, maxLng.Value);

            var useMiles          = true;
            var convertedDistance = useMiles ? (distance / 1609.344) : (distance / 1000);

            RunDistanceLabel.Text   = convertedDistance.ToString("N2");
            StatsDistanceLabel.Text = convertedDistance.ToString("N2");
            StatsPaceLabel.Text     = TimeSpan.FromMinutes(runData.Elapsed.TotalMinutes / convertedDistance).ToString("mm':'ss");
            StatsCaloriesLabel.Text = ((int)(convertedDistance * 190 * 1.036)).ToString();
            MapTimeLabel.Text       = runData.Elapsed.ToString(runData.Elapsed.Hours > 0 ? "hh':'mm':'ss" : "mm':'ss");
            StatsTimeLabel.Text     = MapTimeLabel.Text;

            RunMap.MoveToRegion(MapSpan.FromCenterAndRadius(new Position((minLat.Value + maxLat.Value) / 2, (minLng.Value + maxLng.Value) / 2), Distance.FromKilometers(distance / 800d)));
        }
 public Plugins(Plugins original)
 {
     foreach (var kv in original.OperatorMap)
     {
         OperatorMap.Add(kv.Key, kv.Value);
     }
     foreach (var kv in original.RunMap)
     {
         RunMap.Add(kv.Key, kv.Value);
     }
 }
 private void _locationService_LocationChanged(object sender, Models.Run.LocationData e)
 {
     if (_isTracking == true)
     {
         var newPos = new Position(e.Latitude, e.Longitude);
         if (_locations.Count() > 0 && _locations.Last() is LocationData lastLoc && lastLoc.IsTracked == true)
         {
             RunMap.AddPosition(newPos);
             RunMap.MoveToRegion(MapSpan.FromCenterAndRadius(newPos, Distance.FromKilometers(GetMaxDistance() / 1000d)));
             _minElevation = Math.Min(_minElevation ?? lastLoc.Altitude, lastLoc.Altitude);
             _maxElevation = Math.Max(_maxElevation ?? lastLoc.Altitude, lastLoc.Altitude);
             var useMiles = true; // should be a setting later
             var meters   = _locationService.GetDistance(lastLoc.GetPosition(), newPos);
             _totalDistance += useMiles ? (meters / 1609.344) : (meters / 1000);
             var pace = _totalDistance > 0d ? TimeSpan.FromMinutes((DateTime.UtcNow - (_startTime + _pauseOffset)).TotalMinutes / _totalDistance) : TimeSpan.FromMinutes(0);
             Device.BeginInvokeOnMainThread(() => {
                 ElevationLabel.Text     = (_maxElevation.Value - _minElevation.Value).ToString("N1");
                 RunDistanceLabel.Text   = _totalDistance.ToString("N2");
                 StatsDistanceLabel.Text = _totalDistance.ToString("N2");
                 if (_totalDistance > 0.1d)
                 {
                     StatsPaceLabel.Text = pace.ToString("mm':'ss");
                 }
                 else
                 {
                     StatsPaceLabel.Text = "∞";
                 }
                 //https://fitness.stackexchange.com/a/36045
                 //                                 distance * weight * constant // should be in metric
                 StatsCaloriesLabel.Text = ((int)(_totalDistance * 190 * 1.036)).ToString();
             });
         }
         if (_justUnpaused == true)
         {
             _justUnpaused = false;
             RunMap.AddPosition(newPos, false);
         }
     }
     e.IsTracked = _isTracking;
     _locations.Add(e);
 }
        public RunTabbedPage()
        {
            InitializeComponent();

            NavigationPage.SetHasNavigationBar(this, false);

            _locationService = DependencyService.Get <ILocationService>();
            _locationService.AddLocationChangedListener(_locationService_LocationChanged);

            RunStartRunButton.Clicked   += StartRunButton_Clicked;
            StatsStartRunButton.Clicked += StartRunButton_Clicked;

            RunPauseButton.Clicked   += PauseButton_Clicked;
            StatsPauseButton.Clicked += PauseButton_Clicked;

            RunCancelButton.Clicked   += RunCancelButton_Clicked;
            StatsCancelButton.Clicked += RunCancelButton_Clicked;

            RunResumeButton.Clicked   += PauseButton_Clicked;
            StatsResumeButton.Clicked += PauseButton_Clicked;

            RunFinishButton.Clicked   += FinishButton_Clicked;
            StatsFinishButton.Clicked += FinishButton_Clicked;

            _timer = new Timer()
            {
                Interval = 1000
            };
            _timer.Elapsed += _timer_Elapsed;
            _timer.Start();

            _locations = new List <LocationData>();

            if (_locationService.GetQuickLocation() is LocationData currentLoc)
            {
                RunMap.MoveToRegion(MapSpan.FromCenterAndRadius(currentLoc.GetPosition(), Distance.FromKilometers(0.1d)));
            }
        }
Exemple #5
0
        private void Current_PositionChanged(object sender, PositionEventArgs e)
        {
            var newPosition = new Xamarin.Forms.Maps.Position(e.Position.Latitude, e.Position.Longitude);

            var mapSpan = new MapSpan(newPosition, 0.1, 0.1);

            RunMap.MoveToRegion(mapSpan);

            var pin = new Pin();

            pin.Position = newPosition;
            pin.Type     = PinType.Generic;
            pin.Label    = "test";

            RunMap.Pins.Add(pin);

            Coordinate coordinate = new Coordinate(e.Position.Latitude, e.Position.Longitude);

            if (_lastPosition == null)
            {
                _lastPosition = coordinate;
                return;
            }
            distanceCalculator = new DistanceCalculator(_lastPosition);
            var distance = distanceCalculator.GetDistanceInKilometers(coordinate);

            DistanceInKilometers += distance;

            Distance      = Math.Round(DistanceInKilometers, 2);
            _lastPosition = coordinate;
            var      now    = DateTime.Now;
            TimeSpan result = now.Subtract(initialTime);

            Minutes = (int)result.TotalMinutes;
            Seconds = result.Seconds;
        }