public TcxActivity(XmlNode activityNode, XmlNamespaceManager nsMgr, TcxDistanceOption distanceOption, double calcLapDist)
        {
            _laps = new List <TcxLap>();
            double lastLapEndDistance = 0;

            foreach (XmlNode lapNode in activityNode.SelectNodes("./tcx:Lap", nsMgr))
            {
                var lap = new TcxLap(lapNode, nsMgr, distanceOption, calcLapDist, lastLapEndDistance);
                lastLapEndDistance = lap.LastLapEndDistance;
                _laps.Add(lap);
            }
        }
        public TcxTrack(XmlNode trackNode, XmlNamespaceManager nsMgr, TcxDistanceOption distanceOption, double calcLapDist, double lastLapEndDistance)
        {
            _trackpoints = new List <TcxCalculatedLap>();

            bool     newLap             = true;
            DateTime startTime          = DateTime.MinValue;
            DateTime latestTime         = DateTime.MinValue;
            double   currDist           = 0;
            double   lastCalcLapDistEnd = 0;
            int      lapCount           = 1;

            foreach (XmlNode trackpointNode in trackNode.SelectNodes("./tcx:Trackpoint", nsMgr))
            {
                var trackpoint = new TcxTrackpoint(trackpointNode);
                EndDistance = trackpoint.DistanceMeters;
                if (newLap)
                {
                    startTime = trackpoint.Time;
                    currDist  = 0;
                    newLap    = false;
                }
                else
                {
                    latestTime = trackpoint.Time;
                    currDist   = distanceOption == TcxDistanceOption.Miles
                        ? CalculationHelpers.MetersToMiles((trackpoint.DistanceMeters - lastLapEndDistance) - lastCalcLapDistEnd)
                        : CalculationHelpers.MetersToKilometers((trackpoint.DistanceMeters - lastLapEndDistance) - lastCalcLapDistEnd);

                    if (currDist >= calcLapDist)
                    {
                        lastCalcLapDistEnd = trackpoint.DistanceMeters;
                        if (lastLapEndDistance > 0)
                        {
                            lastLapEndDistance = 0;
                        }
                        TimeSpan lapTime = latestTime - startTime;
                        _trackpoints.Add(new TcxCalculatedLap(string.Format("Lap {0}", lapCount++), currDist, lapTime));
                        newLap = true;
                    }
                }
            }

            if (!newLap && currDist > 0)
            {
                // we might have part of a calculated lap
                TimeSpan lapTime = latestTime - startTime;
                _trackpoints.Add(new TcxCalculatedLap(string.Format("Lap {0}", lapCount++), currDist, lapTime));
            }
        }
        public TcxModel(string filename, TcxDistanceOption distanceOption, double calcLapDist)
        {
            XmlDocument doc = new XmlDocument();

            doc.Load(filename);
            XmlNamespaceManager nsMgr = new XmlNamespaceManager(doc.NameTable);

            nsMgr.AddNamespace("tcx", "http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2");

            _activities = new List <TcxActivity>();
            // For right now, only single activity files are allowed
            foreach (XmlNode activityNode in doc.SelectNodes("//tcx:TrainingCenterDatabase/tcx:Activities/tcx:Activity", nsMgr))
            {
                _activities.Add(new TcxActivity(activityNode, nsMgr, distanceOption, calcLapDist));
            }
        }
        public TcxLap(XmlNode lapNode, XmlNamespaceManager nsMgr, TcxDistanceOption distanceOption, double calcLapDist, double lastLapEndDistance)
        {
            _distOption        = distanceOption;
            _tracks            = new List <TcxTrack>();
            LastLapEndDistance = lastLapEndDistance;
            foreach (XmlNode trackNode in lapNode.SelectNodes("./tcx:Track", nsMgr))
            {
                var track = new TcxTrack(trackNode, nsMgr, distanceOption, calcLapDist, LastLapEndDistance);
                LastLapEndDistance = track.EndDistance;
                _tracks.Add(track);
            }

            StartTime      = DateTime.ParseExact(lapNode.Attributes["StartTime"].Value, "yyyy-MM-ddTHH:mm:ss.FFFZ", CultureInfo.InvariantCulture);
            TotalSeconds   = double.Parse(lapNode["TotalTimeSeconds"].InnerText);
            DistanceMeters = double.Parse(lapNode["DistanceMeters"].InnerText);
            MaxSpeed       = double.Parse(lapNode["MaximumSpeed"].InnerText);
            CaloriesBurned = double.Parse(lapNode["Calories"].InnerText);
        }