Example #1
0
    private static DeviceFile FromTcxV2_Base(XmlDocument Doc)
    {
        var ns = new XmlNamespaceManager(Doc.NameTable);

        ns.AddNamespace("tcd", "http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2");
        ns.AddNamespace("ae", "http://www.garmin.com/xmlschemas/ActivityExtension/v2");
        XMLParserHelper.Manager = ns;
        //var Activities = Doc.SelectNodes("/tcd:TrainingCenterDatabase/tcd:Activities/tcd:Activity", ns);
        var            Activities = Doc.GetElementsByTagName("Activity");
        DeviceActivity CurrentActivity;
        DeviceLap      CurrentLap;
        DevicePoint    CurrentPoint;
        DeviceCreator  CurrentCreator;
        DeviceAuthor   CurrentAuthor;
        XmlNode        WorkNode;
        XmlAttribute   WorkAttr;
        DateTime       dtTryParse;
        DateTimeOffset dtoTryParse;

        DeviceFile File = new DeviceFile();

        CurrentAuthor = new DeviceAuthor();
        File.Author   = CurrentAuthor;

        string VMajor, VMinor, BMajor, BMinor;

        CurrentAuthor.Name       = XMLParserHelper.SelectSingleTextString(Doc, "/tcd:TrainingCenterDatabase/tcd:Author/tcd:Name");
        CurrentAuthor.Language   = XMLParserHelper.SelectSingleTextString(Doc, "/tcd:TrainingCenterDatabase/tcd:Author/tcd:LangID");
        CurrentAuthor.PartNumber = XMLParserHelper.SelectSingleTextString(Doc, "/tcd:TrainingCenterDatabase/tcd:Author/tcd:PartNumber");
        VMajor = XMLParserHelper.SelectSingleTextString(Doc, "/tcd:TrainingCenterDatabase/tcd:Author/tcd:Build/tcd:Version/tcd:VersionMajor", "0");
        VMinor = XMLParserHelper.SelectSingleTextString(Doc, "/tcd:TrainingCenterDatabase/tcd:Author/tcd:Build/tcd:Version/tcd:VersionMinor", "0");
        BMajor = XMLParserHelper.SelectSingleTextString(Doc, "/tcd:TrainingCenterDatabase/tcd:Author/tcd:Build/tcd:Version/tcd:BuildMajor", "0");
        BMinor = XMLParserHelper.SelectSingleTextString(Doc, "/tcd:TrainingCenterDatabase/tcd:Author/tcd:Build/tcd:Version/tcd:BuildMinor", "0");
        CurrentAuthor.Version = VMajor + "." + VMinor + "." + BMajor + "." + BMinor;

        foreach (XmlNode Activity in Activities)
        {
            CurrentActivity = new DeviceActivity();
            File.Activities.Add(CurrentActivity);
            CurrentActivity.Id = XMLParserHelper.SelectSingleTextString(Activity, "tcd:Id");
            if (CurrentActivity.Id != null && DateTimeOffset.TryParse(CurrentActivity.Id, out dtoTryParse))
            {
                //dtoTryParse = FSSecurity.Current.ToUserTime(dtoTryParse);
                dtTryParse = new DateTime(dtoTryParse.Year, dtoTryParse.Month, dtoTryParse.Day, dtoTryParse.Hour, dtoTryParse.Minute, dtoTryParse.Second);
                CurrentActivity.ActivityTime = dtTryParse;
            }
            CurrentActivity.Sport = XMLParserHelper.SelectSingleAttributeString(Activity, "Sport", "Unknown");

            CurrentCreator          = new DeviceCreator();
            CurrentActivity.Creator = CurrentCreator;

            CurrentCreator.Name      = XMLParserHelper.SelectSingleTextString(Activity, "tcd:Creator/tcd:Name");
            CurrentCreator.UnitID    = XMLParserHelper.SelectSingleTextString(Activity, "tcd:Creator/tcd:UnitId");
            CurrentCreator.ProductID = XMLParserHelper.SelectSingleTextString(Activity, "tcd:Creator/tcd:ProductID");
            VMajor = XMLParserHelper.SelectSingleTextString(Activity, "tcd:Creator/tcd:Version/tcd:VersionMajor", "0");
            VMinor = XMLParserHelper.SelectSingleTextString(Activity, "tcd:Creator/tcd:Version/tcd:VersionMinor", "0");
            BMajor = XMLParserHelper.SelectSingleTextString(Activity, "tcd:Creator/tcd:Version/tcd:BuildMajor", "0");
            BMinor = XMLParserHelper.SelectSingleTextString(Activity, "tcd:Creator/tcd:Version/tcd:BuildMinor", "0");
            CurrentCreator.Version = VMajor + "." + VMinor + "." + BMajor + "." + BMinor;
            var CreatorName = CurrentCreator.Name ?? "";
            var Laps        = Activity.SelectNodes("tcd:Lap", ns);
            var IsFirst     = true;
            foreach (XmlNode Lap in Laps)
            {
                var MyInt = XMLParserHelper.SelectSingleTextString(Lap, "tcd:Intensity", "");
                // This is for trailing resting tomtom laps that have zero distance and time
                if (MyInt.ToLower() == "resting" && CreatorName.ToLower().IndexOf("tomtom") >= 0)
                {
                    continue;
                }
                if (IsFirst)
                {
                    IsFirst = false;
                    var TestSeconds = XMLParserHelper.SelectSingleTextDecimal(Lap, "tcd:TotalTimeSeconds", null);
                    var TestDist    = XMLParserHelper.SelectSingleTextDecimal(Lap, "tcd:DistanceMeters", null);
                    if (TestSeconds == 0 && TestDist == 0)
                    {
                        continue;
                    }
                }
                CurrentLap = new DeviceLap();
                CurrentActivity.Laps.Add(CurrentLap);
                WorkAttr = Lap.Attributes["StartTime"];
                if (null != WorkAttr && null != CurrentActivity.ActivityTime && DateTimeOffset.TryParse(WorkAttr.Value, out dtoTryParse))
                {
                    //dtoTryParse = FSSecurity.Current.ToUserTime(dtoTryParse);
                    dtTryParse = new DateTime(dtoTryParse.Year, dtoTryParse.Month, dtoTryParse.Day, dtoTryParse.Hour, dtoTryParse.Minute, dtoTryParse.Second);
                    CurrentLap.StartSeconds = (dtTryParse - (CurrentActivity.ActivityTime ?? DateTime.Now)).TotalSeconds;
                }

                CurrentLap.Time         = XMLParserHelper.SelectSingleTextDecimal(Lap, "tcd:TotalTimeSeconds", null);
                CurrentLap.Distance     = XMLParserHelper.SelectSingleTextDecimal(Lap, "tcd:DistanceMeters", null);
                CurrentLap.SpeedAvg     = XMLParserHelper.SelectSingleTextDecimal(Lap, "tcd:Extensions/ae:LX/ae:AvgSpeed", null);
                CurrentLap.SpeedMax     = XMLParserHelper.SelectSingleTextDecimal(Lap, "tcd:MaximumSpeed", null);
                CurrentLap.Calories     = XMLParserHelper.SelectSingleTextInt(Lap, "tcd:Calories", null);
                CurrentLap.RPMAvg       = XMLParserHelper.SelectSingleTextInt(Lap, "tcd:Cadence", null);
                CurrentLap.RPMMax       = XMLParserHelper.SelectSingleTextInt(Lap, "tcd:Extensions/ae:LX/ae:MaxBikeCadence", null);
                CurrentLap.HeartRateAvg = XMLParserHelper.SelectSingleTextInt(Lap, "tcd:AverageHeartRateBpm/tcd:Value", null);
                CurrentLap.HeartRateMax = XMLParserHelper.SelectSingleTextInt(Lap, "tcd:MaximumHeartRateBpm/tcd:Value", null);
                CurrentLap.WattsAvg     = XMLParserHelper.SelectSingleTextInt(Lap, "tcd:Extensions/ae:LX/ae:AvgWatts", null);
                CurrentLap.WattsMax     = XMLParserHelper.SelectSingleTextInt(Lap, "tcd:Extensions/ae:LX/ae:MaxWatts", null);

                var         TrackPoints    = Lap.SelectNodes("tcd:Track/tcd:Trackpoint", ns);
                DevicePoint LastTrackPoint = null;
                foreach (XmlNode Point in TrackPoints)
                {
                    CurrentPoint = new DevicePoint();
                    CurrentLap.Track.Add(CurrentPoint);
                    WorkNode = Point.SelectSingleNode("tcd:Time", ns);
                    if (null != WorkNode && null != CurrentActivity.ActivityTime && DateTimeOffset.TryParse(WorkNode.InnerText, out dtoTryParse))
                    {
                        //dtoTryParse = FSSecurity.Current.ToUserTime(dtoTryParse);
                        dtTryParse = new DateTime(dtoTryParse.Year, dtoTryParse.Month, dtoTryParse.Day, dtoTryParse.Hour, dtoTryParse.Minute, dtoTryParse.Second);
                        CurrentPoint.StartSeconds = (dtTryParse - (CurrentActivity.ActivityTime ?? DateTime.Now)).TotalSeconds;
                    }

                    CurrentPoint.Latitude  = XMLParserHelper.SelectSingleTextDecimal(Point, "tcd:Position/tcd:LatitudeDegrees", null);
                    CurrentPoint.Longitude = XMLParserHelper.SelectSingleTextDecimal(Point, "tcd:Position/tcd:LongitudeDegrees", null);
                    CurrentPoint.Altitude  = XMLParserHelper.SelectSingleTextDecimal(Point, "tcd:AltitudeMeters", null);
                    CurrentPoint.Distance  = XMLParserHelper.SelectSingleTextDecimal(Point, "tcd:DistanceMeters", null);
                    CurrentPoint.HR        = XMLParserHelper.SelectSingleTextInt(Point, "tcd:HeartRateBpm/tcd:Value", null);
                    CurrentPoint.RPM       = XMLParserHelper.SelectSingleTextInt(Point, "tcd:Cadence", null);
                    CurrentPoint.CAD       = XMLParserHelper.SelectSingleTextInt(Point, "tcd:Extensions/ae:TPX/ae:RunCadence", null);
                    if (CurrentPoint.CAD != null)
                    {
                        CurrentPoint.CAD = CurrentPoint.CAD.Value * 2;
                    }
                    CurrentPoint.Speed = XMLParserHelper.SelectSingleTextDecimal(Point, "tcd:Extensions/ae:TPX/ae:Speed", null);
                    CurrentPoint.Watts = XMLParserHelper.SelectSingleTextInt(Point, "tcd:Extensions/ae:TPX/ae:Watts", null);
                    if (LastTrackPoint != null && CurrentPoint.Speed == null && (CurrentPoint.Distance != null && CurrentPoint.StartSeconds != null) && (LastTrackPoint.Distance != null && LastTrackPoint.StartSeconds != null))
                    {
                        // Last Distance and Time vs Current Distance and Time ->
                        var SecondDelta   = (decimal)(CurrentPoint.StartSeconds - LastTrackPoint.StartSeconds);
                        var DistanceDelta = CurrentPoint.Distance - LastTrackPoint.Distance;
                        if (SecondDelta == 0 || DistanceDelta == 0)
                        {
                            CurrentPoint.Speed = 0;
                        }
                        else
                        {
                            CurrentPoint.Speed = DistanceDelta / SecondDelta;
                        }
                    }
                    LastTrackPoint = CurrentPoint;
                }

                var CadencePoints = from x in CurrentLap.Track
                                    where x.CAD != null
                                    select x;
                if (CadencePoints.Any())
                {
                    var m = (from x in CadencePoints
                             select x.CAD).Max();
                    var a = (from x in CadencePoints
                             select x.CAD).Average();
                    CurrentLap.CADAvg = (int?)a;
                    CurrentLap.CADMax = (int?)m;
                }
            }
        }
        return(File);
    }