{"id":15561340,"url":"https://github.com/fitnesskit/tcxdataprotocol","last_synced_at":"2025-04-23T22:41:31.972Z","repository":{"id":33165455,"uuid":"147219927","full_name":"FitnessKit/TcxDataProtocol","owner":"FitnessKit","description":"Training Center XML Format","archived":false,"fork":false,"pushed_at":"2022-03-11T13:46:59.000Z","size":1153,"stargazers_count":13,"open_issues_count":1,"forks_count":7,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-23T17:49:51.122Z","etag":null,"topics":["fitness","spm","swift","swift-package-manager","swift4","tcx","xml"],"latest_commit_sha":null,"homepage":"https://fitnesskit.github.io/TcxDataProtocol/","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/FitnessKit.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-09-03T15:00:01.000Z","updated_at":"2024-07-07T15:11:32.000Z","dependencies_parsed_at":"2022-08-07T20:01:54.353Z","dependency_job_id":null,"html_url":"https://github.com/FitnessKit/TcxDataProtocol","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FitnessKit%2FTcxDataProtocol","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FitnessKit%2FTcxDataProtocol/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FitnessKit%2FTcxDataProtocol/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FitnessKit%2FTcxDataProtocol/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/FitnessKit","download_url":"https://codeload.github.com/FitnessKit/TcxDataProtocol/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250528683,"owners_count":21445511,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["fitness","spm","swift","swift-package-manager","swift4","tcx","xml"],"created_at":"2024-10-02T16:07:31.256Z","updated_at":"2025-04-23T22:41:31.949Z","avatar_url":"https://github.com/FitnessKit.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# TcxDataProtocol\n\n[![Swift5](https://img.shields.io/badge/swift5.0-compatible-4BC51D.svg?style=flat)](https://developer.apple.com/swift)\n[![Version](https://img.shields.io/cocoapods/v/TcxDataProtocol.svg?style=flat)](http://cocoapods.org/pods/TcxDataProtocol)\n[![License](https://img.shields.io/cocoapods/l/TcxDataProtocol.svg?style=flat)](http://cocoapods.org/pods/TcxDataProtocol)\n[![Platform](https://img.shields.io/cocoapods/p/TcxDataProtocol.svg?style=flat)](http://cocoapods.org/pods/TcxDataProtocol)\n[![Readme Score](http://readme-score-api.herokuapp.com/score.svg?url=https://github.com/fitnesskit/tcxdataprotocol)](http://clayallsopp.github.io/readme-score?url=https://github.com/fitnesskit/tcxdataprotocol)\n\nProvides a Swift version of the TCX XML format.\n\n\n## Installation\n\nTcxDataProtocol is available through [CocoaPods](http://cocoapods.org). To install it, simply add the following line to your Podfile:\n\n```ruby\npod 'TcxDataProtocol'\n```\n\nSwift Package Manager:\n```swift\ndependencies: [\n    .package(url: \"https://github.com/FitnessKit/TcxDataProtocol\", from: \"1.0.2\")\n]\n```\n## How to Use\n\n### Decode\n\n```swift\nlet tcxUrl = URL(fileURLWithPath: \"TestFile\" + \".tcx\")\nlet tcxData = try? Data(contentsOf: tcxUrl)\n\nif let tcxData = tcxData {\n    let tcxFile = try? TcxFile.decode(from: tcxData)\n}\n```\n\n### Encode\n\nEach Trackpoint time has to be unique. Below example shows a per second increment from the previous. \n\n```swift\nlet workoutStartDateTime = Date()\nlet build = Build(version: Version(major: 0, minor: 1, buildMajor: 0, buildMinor: 0), time: nil, builder: nil, type: .alpha)\nlet author = Author(name: \"TcxDataProtocol\", build: build, language: nil, partNumber: \"11-22-33\")\nlet track = [Track(trackPoint: [\n                    Trackpoint(time: workoutStartDateTime.addingTimeInterval(Double(1)), position: nil, altitude: nil, distance: 1.11, heartRate: HeartRateInBeatsPerMinute(heartRate: 100), cadence: 100, sensorState: SensorState.present, extensions: [Extension(activityTrackpointExtension: ActivityTrackpointExtension.init(speed: 11.2, runCadence: nil, watts: 111, cadenceSensor: CadenceSensorType(rawValue: \"bike\")), activityLapExtension: nil, activityGoals: nil)]),\n                    Trackpoint(time: workoutStartDateTime.addingTimeInterval(Double(2)), position: nil, altitude: nil, distance: 1.11, heartRate: HeartRateInBeatsPerMinute(heartRate: 101), cadence: 101, sensorState: SensorState.present, extensions: [Extension(activityTrackpointExtension: ActivityTrackpointExtension.init(speed: 11.3, runCadence: nil, watts: 222, cadenceSensor: CadenceSensorType(rawValue: \"bike\")), activityLapExtension: nil, activityGoals: nil)])\n                    ])]\n\nlet lap = ActivityLap(startTime: workoutStartDateTime, totalTime: 45.0, distance: 12.0, maximumSpeed: nil, calories: 120, averageHeartRate: nil, maximumHeartRate: nil, intensity: .active, cadence: nil, triggerMethod: .manual, track: track, notes: nil, extensions: nil)\n\nlet activity = Activity(sport: .biking, identification: workoutStartDateTime, lap: [lap], notes: nil, training: nil, creator: nil)\n\nlet activities = ActivityList(activities: [activity], multiSportSession: nil)\n\nlet database = TrainingCenterDatabase(activities: activities, courses: nil, author: author)\n\nlet TCXFile = TcxFile(database: database)\n\nlet encodedData = try? TCXFile.encode(prettyPrinted: true)\n\nif let encodedData = encodedData {\n    let xml = String(bytes: encodedData, encoding: .utf8)\n    print(xml!)\n}\n\n```\n\n### Supported Elements\n\n* `ActivityList`\n* `Activity`\n* `ActivityLap`\n* `ActivityReference`\n* `Application`\n* `Author`\n* `Build`\n* `BuildType`\n* `Course`\n* `CourseLap`\n* `CourseList`\n* `CoursePoint`\n* `CoursePointType`\n* `Creator`\n* `Gender`\n* `HeartRateInBeatsPerMinute`\n* `HeartRateInBeatsPercentMax`\n* `Intensity`\n* `MultiSportSession`\n* `NextSport`\n* `Plan`\n* `Position`\n* `QuickWorkoutResults`\n* `SensorState`\n* `Sport`\n* `Track`\n* `Trackpoint`\n* `Training`\n* `TrainingType`\n* `TriggerMethod`\n* `Version`\n\n### Supported Extensions\n\n* ActivityExtension\n    * `CadenceSensorType`\n    * `ActivityTrackpointExtension`\n    * `ActivityLapExtension`\n\n* ActivityGoals\n    * `Measure`\n    * `RecurrenceCode`\n    * `Period`\n    * `ActivityGoal`\n    * `ActivityGoals`\n\n\n## Author\n\nThis package is developed and maintained by Kevin A. Hoogheem\n\n## License\n\nTcxDataProtocol is available under the [MIT license](http://opensource.org/licenses/MIT)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffitnesskit%2Ftcxdataprotocol","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffitnesskit%2Ftcxdataprotocol","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffitnesskit%2Ftcxdataprotocol/lists"}