/// <summary> /// Main loop for Activity tracking. /// Start and stops an activity. /// Persists to /// - SkyDrive /// - Azure /// - .gpx file viewer /// as determined by SettingsView.xaml /// </summary> public async void ToggleActivity() { if (Vm == null) Vm = SimpleIoc.Default.GetInstance<Wp8AppHubViewModel>(); if (isActive) { Vm.StatusMessages += "ToggleActivity Stop"; activityTimer.Stop(); isActive = false; _activity.Stop = DateTime.Now; activityEnd = _CurrentGeoCoordinate; TimeSpan ts = _activity.Stop - _activity.Start; var distance = (activityEnd).GetDistanceTo(activityBegin); _activity.Distance = distance; var distanceInFeet = distance * 3.281; var distanceInMiles = distanceInFeet / 5280; if (Geos.Count > 0) { string skyDriveFileName = "Walker"; skyDriveFileName += DateTime.Now.ToString("yyyy-MM-dd-hh-mm"); skyDriveFileName += ".gpx"; _logger.Log(this, skyDriveFileName); byte[] bytes = Encoding.UTF8.GetBytes(ToGpx()); MemoryStream gpxMemoryStream = new MemoryStream(bytes); try { if (_client == null) { // _client = new LiveConnectClient(e.Session); _client = App.LiveConnectClient; } _logger.Log(this, "_client.UploadAsync(MeDetails.TopLevelSkyDriveFolder, skyDriveFileName, gpxMemoryStream,"); var result = await _client.UploadAsync(MeDetails.TopLevelSkyDriveFolder, skyDriveFileName, gpxMemoryStream, OverwriteOption.Overwrite); _logger.Log(this, "Upload to skyDrive apparently worked!", result.ToString()); // var success = await Windows.System.Launcher.LaunchFileAsync(ms); // var success = await Windows.System.Launcher. LaunchFileAsync(ms); } catch (Exception ex) { _logger.Log(this, "Upload to skyDrive exception: ", ex.ToString()); } gpxMemoryStream.Dispose(); if (_walkerAppSettings.GpxEnabled) LaunchGpxFileAssociation(skyDriveFileName); PersistIt(skyDriveFileName); } Vm.StatusMessages = string.Empty; Vm.StatusMessages += String.Format("Walked: {0:0000.00} meters ({2:00.000} miles) in {1} seconds.\n", distance, ts.ToString(), distanceInMiles); Vm.StatusMessages += String.Format("(new calc) Walked: {0:0000.00} meters \n", _CurrentDistance); _CurrentDistance = 0; } else { Vm.StatusMessages += "ToggleActivity Start"; StartTimer(); isActive = true; _activity = new Walk(); _activity.Start = DateTime.Now; activityBegin = _CurrentGeoCoordinate; Geos = new List<GeoCoordinate>(); // clear Geos list as we're starting a new activity track. Geos.Add(_CurrentGeoCoordinate); // Begin activity with current location. } }
/// <summary> /// Update view model and counters to update current elapsed time and distance travled. /// </summary> /// <param name="sender"></param> /// <param name="args"></param> void OnTimerTick(Object sender, EventArgs args) { if (Vm == null) Vm = SimpleIoc.Default.GetInstance<Wp8AppHubViewModel>(); _ElapsedTime = DateTime.Now - _activity.Start; Vm.ElapsedTime = _ElapsedTime.ToString(@"hh\:mm\:ss"); Vm.DistanceMeters = _CurrentDistance.ToString("0\\,000"); Vm.DistanceMiles = ((_CurrentDistance * 3.281) / 5280).ToString("0\\,000"); //Messenger.Default.Send<AppHubViewModel>(Vm); }
/// <summary> /// update view model and bound .xaml with geo cordinates, elapsed time and distance traveled. /// </summary> /// <param name="sender"></param> /// <param name="args"></param> void geolocator_PositionChanged(Geolocator sender, PositionChangedEventArgs args) { // Unfortunately, the Location API works with Windows.Devices.Geolocation.Geocoordinate objeccts // and the Maps controls use System.Device.Location.GeoCoordinate objects so we have to do a // conversion before we do anything with it on the map GeoCoordinate geoCoordinate = new GeoCoordinate() { Altitude = args.Position.Coordinate.Altitude.HasValue ? args.Position.Coordinate.Altitude.Value : 0.0, Course = args.Position.Coordinate.Heading.HasValue ? args.Position.Coordinate.Heading.Value : 0.0, HorizontalAccuracy = args.Position.Coordinate.Accuracy, Latitude = args.Position.Coordinate.Latitude, Longitude = args.Position.Coordinate.Longitude, Speed = args.Position.Coordinate.Speed.HasValue ? args.Position.Coordinate.Speed.Value : 0.0, VerticalAccuracy = args.Position.Coordinate.AltitudeAccuracy.HasValue ? args.Position.Coordinate.AltitudeAccuracy.Value : 0.0 }; Geos.Add(geoCoordinate); // save these pups to create a .gpx file... _CurrentGeoCoordinate = geoCoordinate; if (isActive) { _CurrentDistance += _PreviousGeoCoordinate.GetDistanceTo(_CurrentGeoCoordinate); } else { _PreviousGeoCoordinate = _CurrentGeoCoordinate; } _PreviousGeoCoordinate = _CurrentGeoCoordinate; DispatcherHelper.CheckBeginInvokeOnUI(() => { //TestVm.Hi = testInt++.ToString(); //TestVm.GeoCoordinate = geoCoordinate; if (Vm == null) Vm = SimpleIoc.Default.GetInstance<Wp8AppHubViewModel>(); Vm.GeoCoordinate = geoCoordinate; Vm.DistanceMeters = _CurrentDistance.ToString("F2"); Vm.DistanceMiles = (999.99).ToString(); Vm.StatusMessages += string.Format("\nlat: {0} lon: {1}", geoCoordinate.Latitude.ToString(), geoCoordinate.Longitude.ToString()); }); // Dispatcher.BeginInvoke(() => DispatcherHelper.CheckBeginInvokeOnUI(() => { // Draw a pushpin DrawPushpin(geoCoordinate); AddBluePoint(geoCoordinate); // Show progress indicator while map resolves to new position pi.IsVisible = true; pi.IsIndeterminate = true; pi.Text = "Resolving location..."; // fix SystemTray.SetProgressIndicator(this, pi); }); }
/// <summary> /// Persist to Azure if enabled in settings. /// </summary> /// <param name="fileName"></param> /// <returns></returns> private async Task PersistIt(string fileName) { if (Vm == null) Vm = SimpleIoc.Default.GetInstance<Wp8AppHubViewModel>(); Vm.Activities.Add(_activity); if (_walkerAppSettings.AzureEnabled) { try { _activity.GpxFileName = fileName; await walkTable.InsertAsync(_activity); _logger.Log(this, "walkTable.InsertAsync(_activity); ", "apparently worked"); } catch (Exception e) { _logger.Log(this, "walkTable.InsertAsync(_activity); ", e.ToString()); } } }
private void HandleMessengerMessage(Wp8AppHubViewModel obj) { StatusMessages = obj.StatusMessages; }