Esempio n. 1
0
        void loadActivity()
        {
            zedActivityChart.GraphPane.Legend.IsVisible = true;
            zedActivityChart.GraphPane.Title.Text       = "Activity Chart";
            zedActivityChart.GraphPane.XAxis.Title.Text = "Duration from Activity Start";
            zedActivityChart.GraphPane.YAxis.Title.Text = "";

            SetStatusProgressThreadSafe(statusBar, "Value", 0);
            SetStatusProgressThreadSafe(statusBar, "Maximum", 6);
            SetStatusTextThreadSafe(statusBar, "Loading selected activity...");

            if (listViewSelectedCountItems(lstActivities) > 0)
            {
                int wId = Convert.ToInt32(GetListViewSelectedItemValue(lstActivities, 0, 0));
                RideWithGpsActivitySummary summary = _rwgps.retrieveWorkoutData(wId, ref zedActivityChart);

                // apply the ride summary information
                SetControlPropertyThreadSafe(lblAvgSpeed, "Text", summary.avgSpeed);
                SetControlPropertyThreadSafe(lblAvgCadence, "Text", summary.avgCadence);
                SetControlPropertyThreadSafe(lblAvgHeartRate, "Text", summary.avgHeartRate);
                SetControlPropertyThreadSafe(lblActivityDateTime, "Text", summary.name);
                SetControlPropertyThreadSafe(lblTotalAscent, "Text", summary.elevationGain);
                SetControlPropertyThreadSafe(lblDuration, "Text", summary.durationTotal);
                SetControlPropertyThreadSafe(lblMovingTime, "Text", summary.durationMoving);
                SetControlPropertyThreadSafe(lblDistance, "Text", summary.distance);
                SetControlPropertyThreadSafe(txtNotes, "Text", summary.notes);

                ClearListView(lstSplits);
                for (int s = 0; s < summary.mileSplits.Count; s++)
                {
                    string[] row =
                    {
                        summary.mileSplits[s].label,
                        summary.mileSplits[s].speed,
                        summary.mileSplits[s].pace
                    };
                    AddListViewItem(lstSplits, new ListViewItem(row));
                }

                // finalise
                SetControlPropertyThreadSafe(lstActivities, "Enabled", true);

                // set active tab, and tell the MAP browser component to reload the route map
                setTab(tabChart, "tabSummary");
                NavigateWebControl(webBrowser1, Application.StartupPath + "\\rwgps_route.html");
            }
            SetStatusTextThreadSafe(statusBar, "Done.");
        }
Esempio n. 2
0
        public RideWithGpsActivitySummary retrieveWorkoutData(int wId, ref ZedGraph.ZedGraphControl zedActivityChart)
        {
            RideWithGpsActivitySummary summary = new RideWithGpsActivitySummary();

            string         wUrl           = string.Format("http://ridewithgps.com/trips/{0}.json", wId);
            HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(wUrl);

            httpWebRequest.Proxy           = null;
            httpWebRequest.Credentials     = CredentialCache.DefaultCredentials;
            httpWebRequest.CookieContainer = this._cookies;

            // get response
            HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();

            System.IO.Stream responseStream = httpWebResponse.GetResponseStream();
            if (responseStream != null)
            {
                System.IO.StreamReader streamReader = new System.IO.StreamReader(responseStream);
                string  text       = streamReader.ReadToEnd();
                dynamic jsonResult = JsonValue.Parse(text);

                PointPairList graphListHeart    = new PointPairList();
                PointPairList graphListAltitude = new PointPairList();
                PointPairList graphListSpeed    = new PointPairList();
                PointPairList graphListCadence  = new PointPairList();
                zedActivityChart.GraphPane.CurveList.Clear();
                zedActivityChart.GraphPane.GraphObjList.Clear();
                zedActivityChart.GraphPane.YAxisList.Clear();

                zedActivityChart.GraphPane.AddYAxis("Heart (bpm)");
                zedActivityChart.GraphPane.AddYAxis("Cadence");
                zedActivityChart.GraphPane.AddYAxis("Speed");
                zedActivityChart.GraphPane.AddYAxis("Altitude (ft)");
                zedActivityChart.GraphPane.Y2Axis.Scale.FontSpec.Size = 8;
                // set custom formatting for X-Axis in charts
                zedActivityChart.GraphPane.XAxis.ScaleFormatEvent += new Axis.ScaleFormatHandler(Axis_ScaleFormatEvent);

                // set the ride summary details
                summary.avgSpeed       = "- mph";
                summary.avgCadence     = " - rpm";
                summary.avgHeartRate   = "- bpm";
                summary.distance       = "- miles";
                summary.elevationGain  = "- ft";
                summary.durationTotal  = "-";
                summary.durationMoving = "-";

                if (jsonResult.metrics.ContainsKey("speed"))
                {
                    summary.avgSpeed = string.Format("{0:0.00} mph", (double)jsonResult.metrics.speed.avg * 0.621371);
                }
                if (jsonResult.metrics.ContainsKey("cad"))
                {
                    summary.avgCadence = string.Format("{0:0} rpm", (double)jsonResult.metrics.cad.avg);
                }
                if (jsonResult.metrics.ContainsKey("hr"))
                {
                    summary.avgHeartRate = string.Format("{0:0} bpm", (double)jsonResult.metrics.hr.avg);
                }
                if (jsonResult.metrics.ContainsKey("distance"))
                {
                    summary.distance = string.Format("{0:0.00} miles", ((double)jsonResult.distance / 1000) * 0.621371);
                }
                if (jsonResult.metrics.ContainsKey("elevation_gain"))
                {
                    summary.elevationGain = string.Format("{0:0.00} ft", (double)jsonResult.elevation_gain * 3.2808399);
                }
                summary.name = (string)jsonResult.name;

                if (jsonResult.metrics.ContainsKey("duration"))
                {
                    TimeSpan tDuration = TimeSpan.FromSeconds((double)jsonResult.metrics.duration);
                    summary.durationTotal = string.Format("{0:D2} h {1:D2} m {2:D2} s", tDuration.Hours, tDuration.Minutes, tDuration.Seconds);
                }
                if (jsonResult.metrics.ContainsKey("movingTime"))
                {
                    TimeSpan tMoving = TimeSpan.FromSeconds((double)jsonResult.metrics.movingTime);
                    summary.durationMoving = string.Format("{0:D2} h {1:D2} m {2:D2} s", tMoving.Hours, tMoving.Minutes, tMoving.Seconds);
                }
                summary.notes      = (string)jsonResult.description;
                summary.mileSplits = new List <RideWithGpsMileSplit>();

                double firstTimestamp = (double)jsonResult.track_points[0].t;
                double distance       = 0;
                double duration       = 0;
                double speed          = 0;

                int    currentMileSearch   = 1;
                double runningMileDistance = 0;
                double runningDuration     = 0;
                // google map strings
                double lat_min         = -1;
                double lat_max         = -1;
                double lng_min         = -1;
                double lng_max         = -1;
                double lat             = 0;
                double lng             = 0;
                double start_lat       = 0;
                double start_lng       = 0;
                double finish_lat      = 0;
                double finish_lng      = 0;
                string js_coords       = "";
                string js_mile_markers = "";
                string js_bounds       = "";
                //string js_centre = "";

                for (int tp = 0; tp < jsonResult.track_points.Count; tp++)
                {
                    if (tp == 0)
                    {
                        start_lat = (double)jsonResult.track_points[tp].y;
                        start_lng = (double)jsonResult.track_points[tp].x;
                    }
                    // update the last point coordinates
                    finish_lat = (double)jsonResult.track_points[tp].y;
                    finish_lng = (double)jsonResult.track_points[tp].x;
                    if (tp > 0)
                    {
                        js_coords += ",";
                        duration   = (double)jsonResult.track_points[tp].t - (double)jsonResult.track_points[tp - 1].t;
                        distance   = GeoMath.Distance(
                            (double)jsonResult.track_points[tp].y,
                            (double)jsonResult.track_points[tp].x,
                            (double)jsonResult.track_points[tp - 1].y,
                            (double)jsonResult.track_points[tp - 1].x,
                            GeoMath.MeasureUnits.Miles
                            );
                        speed = distance / (duration / 3600);

                        // increment the running totals
                        runningDuration     += duration;
                        runningMileDistance += distance;

                        // check if we've reached threshold for current search miles
                        if (runningMileDistance > currentMileSearch)
                        {
                            TimeSpan             tsPace    = TimeSpan.FromSeconds(runningDuration);
                            RideWithGpsMileSplit mileSplit = new RideWithGpsMileSplit();
                            mileSplit.label = string.Format("Mile {0}", currentMileSearch);
                            mileSplit.speed = string.Format("{0:0.00} mph", (1 / (runningDuration / 3600)));
                            mileSplit.pace  = string.Format("{0:D2} h {1:D2} m {2:D2} s", tsPace.Hours, tsPace.Minutes, tsPace.Seconds);

                            summary.mileSplits.Add(mileSplit);



                            TimeSpan tmp_ts          = TimeSpan.FromSeconds((double)jsonResult.track_points[tp].t);
                            string   mile_marker_tag = "Time since start of ride: " + string.Format("{0:D2} h {1:D2} m {2:D2} s",
                                                                                                    tmp_ts.Hours,
                                                                                                    tmp_ts.Minutes,
                                                                                                    tmp_ts.Seconds
                                                                                                    );
                            js_mile_markers += "\r\nnew google.maps.Marker({icon:'https://chart.googleapis.com/chart?chst=d_map_pin_letter&chld=" + (currentMileSearch) + "|95E978|004400',position: new google.maps.LatLng(" + (string)jsonResult.track_points[tp].y + "," + (string)jsonResult.track_points[tp].x + "),map: map,title: 'Mile " + (currentMileSearch) + "\\r\\n" + mile_marker_tag + "'});";

                            // reset the running duration
                            // and increment the mile search counter for the next mile
                            runningDuration = 0;
                            currentMileSearch++;
                        }
                    }

                    // update the max / min longitude / latitude
                    lat = (double)jsonResult.track_points[tp].y;
                    lng = (double)jsonResult.track_points[tp].x;
                    if (lat_min == -1)
                    {
                        lat_min = lat;
                    }
                    if (lat_max == -1)
                    {
                        lat_max = lat;
                    }
                    if (lng_min == -1)
                    {
                        lng_min = lng;
                    }
                    if (lng_max == -1)
                    {
                        lng_max = lng;
                    }

                    if (lat < lat_min)
                    {
                        lat_min = lat;
                    }
                    if (lat > lat_max)
                    {
                        lat_max = lat;
                    }
                    if (lng < lng_min)
                    {
                        lng_min = lng;
                    }
                    if (lng > lng_max)
                    {
                        lng_max = lng;
                    }
                    js_coords += "\r\nnew google.maps.LatLng(" + (string)jsonResult.track_points[tp].y + "," + (string)jsonResult.track_points[tp].x + ")";

                    TimeSpan ts         = TimeSpan.FromSeconds((double)jsonResult.track_points[tp].t - firstTimestamp);
                    string   tagCadence = "";

                    string tagHR = "Duration : " + string.Format("{0:D2} h {1:D2} m {2:D2} s",
                                                                 ts.Hours,
                                                                 ts.Minutes,
                                                                 ts.Seconds
                                                                 ) + "\r\nHR: " + (string)jsonResult.track_points[tp].h + " bpm";
                    string tagAltitude = "Duration : " + string.Format("{0:D2} h {1:D2} m {2:D2} s",
                                                                       ts.Hours,
                                                                       ts.Minutes,
                                                                       ts.Seconds
                                                                       ) + "\r\n" + string.Format("Altitude: {0:0.00} ft", (double)jsonResult.track_points[tp].e * 3.2808399);
                    if (jsonResult.track_points[tp].ContainsKey("c"))
                    {
                        tagCadence = "Duration : " + string.Format("{0:D2} h {1:D2} m {2:D2} s",
                                                                   ts.Hours,
                                                                   ts.Minutes,
                                                                   ts.Seconds
                                                                   ) + "\r\n" + string.Format("Cadence: {0:0.00} rpm", (double)jsonResult.track_points[tp].c);
                    }
                    string tagSpeed = "Duration : " + string.Format("{0:D2} h {1:D2} m {2:D2} s",
                                                                    ts.Hours,
                                                                    ts.Minutes,
                                                                    ts.Seconds
                                                                    ) + "\r\n" + string.Format("Speed: {0:0.00} mph", speed);

                    if (jsonResult.track_points[tp].ContainsKey("h") && jsonResult.track_points[tp].ContainsKey("t"))
                    {
                        graphListHeart.Add(
                            (double)jsonResult.track_points[tp].t - firstTimestamp,
                            (double)jsonResult.track_points[tp].h,
                            tagHR
                            );
                    }
                    if (jsonResult.track_points[tp].ContainsKey("e") && jsonResult.track_points[tp].ContainsKey("t"))
                    {
                        graphListAltitude.Add(
                            (double)jsonResult.track_points[tp].t - firstTimestamp,
                            (double)jsonResult.track_points[tp].e * 3.2808399,
                            tagAltitude
                            );
                    }
                    if (jsonResult.track_points[tp].ContainsKey("c") && jsonResult.track_points[tp].ContainsKey("t"))
                    {
                        graphListCadence.Add(
                            (double)jsonResult.track_points[tp].t - firstTimestamp,
                            (double)jsonResult.track_points[tp].c,
                            tagCadence
                            );
                    }
                    graphListSpeed.Add(
                        (double)jsonResult.track_points[tp].t - firstTimestamp,
                        speed,
                        tagSpeed
                        );
                }
                LineItem ln_heart_heart = zedActivityChart.GraphPane.AddCurve("Heart Rate", graphListHeart, Color.Red, SymbolType.None);
                ln_heart_heart.Line.Width = 1;
                ln_heart_heart.YAxisIndex = 0;

                LineItem ln_cadence = zedActivityChart.GraphPane.AddCurve("Cadence", graphListCadence, Color.Magenta, SymbolType.None);
                ln_cadence.Line.Width = 1;
                ln_cadence.YAxisIndex = 1;
                LineItem ln_speed = zedActivityChart.GraphPane.AddCurve("Speed", graphListSpeed, Color.Blue, SymbolType.None);
                ln_speed.Line.Width = 1;
                ln_speed.YAxisIndex = 2;

                LineItem ln_altitude = zedActivityChart.GraphPane.AddCurve("Altitude", graphListAltitude, Color.Green, SymbolType.None);
                ln_altitude.Line.Fill  = new Fill(Color.LightGreen);
                ln_altitude.YAxisIndex = 3;

                zedActivityChart.AxisChange();

                if (jsonResult.track_points.Count != 0)
                {
                    zedActivityChart.GraphPane.XAxis.Scale.Max = (double)jsonResult.track_points[(int)jsonResult.track_points.Count - 1].t - firstTimestamp;
                }

                zedActivityChart.GraphPane.XAxis.MajorGrid.IsVisible = true;
                zedActivityChart.GraphPane.YAxis.MajorGrid.IsVisible = true;
                zedActivityChart.AxisChange();

                js_mile_markers = "\r\nnew google.maps.Marker({icon:'https://chart.googleapis.com/chart?chst=d_map_pin_letter&chld=S|000088|FFFFFF',position: new google.maps.LatLng(" + start_lat + "," + start_lng + "),map: map,title: 'Start'});" +
                                  "\r\nnew google.maps.Marker({icon:'https://chart.googleapis.com/chart?chst=d_map_pin_letter&chld=F|000088|FFFFFF',position: new google.maps.LatLng(" + finish_lat + "," + finish_lng + "),map: map,title: 'Finish'});" +
                                  js_mile_markers;

                // create a bounding box for the map - so it can auto-zoom to the best level of detail
                js_bounds = @" 
					var latlngbounds = new google.maps.LatLngBounds();
					latlngbounds.extend(new google.maps.LatLng("                     + lat_min + @"," + lng_min + @"));
					latlngbounds.extend(new google.maps.LatLng("                     + lat_max + @"," + lng_max + @"));
					map.fitBounds(latlngbounds);
				"                ;


                // build the route html
                string routeHTML = @"
					<html>
					  <head>
					    <meta name=""viewport"" content=""initial-scale=1.0, user-scalable=no"">
					    <meta charset=""utf-8"">
					    <title>Cycle Route</title>
					    <style>
					      #map_canvas{
					        width:100%;
					        height:100%;
					      }
					    </style>
					    <script src=""https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false""></script>
					    <script type=""text/javascript"" language=""javascript"">
							var map;
					      function initialize() {
					        var mapOptions = {
					          mapTypeId: google.maps.MapTypeId.TERRAIN
					        };
					
					        map = new google.maps.Map(document.getElementById('map_canvas'), mapOptions);
					
					        var cycleRouteCoords = [
					          "                     + js_coords + @"
					        ];
					        var cycleRoute = new google.maps.Polyline({
					          path: cycleRouteCoords,
					          strokeColor: '#FF0000',
					          strokeOpacity: 1.0,
					          strokeWeight: 2
					        });
					
					        cycleRoute.setMap(map);
					        
					        "                     + js_mile_markers + @"
					        "                     + js_bounds + @"
					      }
					      
					      window.onresize = pageresize;
					      
					      function pageresize()
					      {
					       google.maps.event.trigger(map, 'resize');
					       "                     + js_bounds + @"					       
					      }
					    </script>
					  </head>
					  <body onload=""initialize()"" >
					    <div id=""map_canvas""></div>
					  </body>
					</html>				
				"                ;

                try{
                    if (System.IO.File.Exists(Application.StartupPath + "\\rwgps_route.html"))
                    {
                        System.IO.File.Delete(Application.StartupPath + "\\rwgps_route.html");
                    }
                    FileStream   fs     = System.IO.File.OpenWrite(Application.StartupPath + "\\rwgps_route.html");
                    StreamWriter writer = new StreamWriter(fs);
                    writer.Write(routeHTML);
                    writer.Close();
                    writer.Dispose();
                    fs.Dispose();
                    //tabMap.Enabled = true;
                }
                catch {
                    MessageBox.Show("Map Update Failed. Try re-selecting the activity.", "Error loading map", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
                finally{
                    //tabMap.Enabled = true;
                }
            }
            return(summary);
        }