read-tcx
Version:
Read tcx files (supported files exported from Garmin Connect, Polar Flow, Tapiriik) and convert it to Activity Json Oblect
254 lines (223 loc) • 8.11 kB
text/typescript
// // import { Lap, Track, TrackPointClass } from "../classes/index";
// /**
// * Γενικό Interface για τα αποτελέσματα που διαβάζει o TCX αναγνώστης.
// * <br>Είναι το πατρικό αντικείμενο που από κει και πέρα όλα τα υπόλοιπα ακολουθούν
// * @desc
// * το αντικείμενο που επιστρέφει ο αναγνώστης έχει την παρακάτω μορφή
// * <pre>
// * {
// * "result":
// * {
// * "TrainingCenterDatabase": {
// * "$": [{}],
// * "Activities": [{iActivity},..,{iActivity}]
// * "Author": [{iAuthor},..,{iAuthor}]
// * }
// * }
// * }
// * </pre>
// */
// export interface iResult {
// result: iTrainingCenterDatabase;
// }
// export interface iTrainingCenterDatabase {
// TrainingCenterDatabase: {
// $: {};
// Activities: Array<iActivity>;
// Author: Array<iAuthor>;
// };
// }
// export interface iAuthor {
// $: {
// xsi_type: string;
// };
// Name: Array<string>;
// Build: Array<{}>;
// LangID: Array<string>;
// PartNumber: Array<string>;
// }
// export interface iBuildVersion {
// Version: Array<{}>;
// }
// export interface iLap {
// $: {
// StartTime: string;
// };
// TotalTimeSeconds: Array<number>;
// DistanceMeters: Array<number>;
// MaximumSpeed: Array<number>;
// Calories: Array<number>;
// AverageHeartRateBpm: Array<iHeartRate>;
// MaximumHeartRateBpm: Array<iHeartRate>;
// Cadence: Array<number>;
// Track: Array<iTrackPoints>;
// Extensions: Array<{}>;
// //Extensions: Array<iExtensionsLX>;
// }
// export interface iTrackPoints {
// Trackpoint: Array<iPoint>;
// }
export interface iGeoPoint {
LatitudeDegrees: number
LongitudeDegrees: number
AltitudeMeters: number
}
export interface iPoint {
Time: Array<number>;
Position: Array<{
LatitudeDegrees: Array<number>;
LongitudeDegrees: Array<number>;
}>;
AltitudeMeters: Array<number>;
DistanceMeters: Array<number>;
HeartRateBpm: Array<{
$: {
xsi_type: string;
};
Value: Array<number>;
}>;
Cadence: Array<number>;
Extensions: Array<{
TPX: Array<{
$: {
xmlns: string;
};
Speed: Array<number>;
}>;
}>;
}
// interface iExtensionsLX {
// LX: Array<{
// $: string;
// AvgSpeed: Array<number>;
// }>;
// }
// interface iHeartRate {
// Value: Array<number>;
// }
// export interface iActivity {
// Activity: Array<{
// $: {
// Sport: string;
// };
// Id: Array<string>;
// Lap: Array<iLap>;
// }>;
// }
// /**
// * Συμπληρώνει το αντικείμενο iResult από το αντικείμενο που διάβασε ο αναγνώστης TCX
// * @param {iResult} data το αντικείμενο όπως το διάβασε ο αναγνώστης TCX
// * @returns iResult το αντικείμενο σε μορφή που μπορώ να το διαχειριστώ καλύτερα
// */
// export const getResult = (data: iResult | any): iResult => {
// return data;
// };
// /**
// * Συμπληρώνει ένα πίνακα με αντικείμενα iAcitivity από το πηγαίο αντικείμενο iResult
// * @param {iResult} data το αντικείμενο που επέστρεψε ο αναγνώστης TCX
// * @returns Array<iActivity> πίνακας με τις δραστηριότητες iActivity
// */
// export const getActivities = (data: iResult): Array<iActivity> => {
// return data.result.TrainingCenterDatabase.Activities;
// };
// /**
// * Συμπληρώνει τη δομή iAuthor
// * @param {iResult} data το αντικείμενο που επέστρεψε ο αναγνώστης TCX
// * @returns Array<iAuthor> πίνακας με τα αντικείμενα iAuthor (μπορεί να είναι περισσότερα)
// */
// export const getAuthor = (data: iResult): Array<iAuthor> => {
// return data.result.TrainingCenterDatabase.Author;
// };
// /**
// * Συμπληρώνει τους γύρους που έχει καταγεγγραμένο το αρχείο
// * @param {iActivity} data η δραστηριότητα
// * @returns Array<iLap> πίνακας με τα ανιτκείμενα iLap
// */
// export const getLaps = (data: iActivity): Array<iLap> => {
// return data.Activity[0].Lap;
// };
// /**
// * Συμπληρώνει τα σημεία GPS που έχει ο συγκεκριμένος γύρος (tcxLap)
// * @param {iLap} tcxLap ο γύρος (lap) από το πρωτότυπο αρχείο tcx
// * @returns Array<iPoint> πίνακας με τα ανιτκείμενα iPoint
// * */
// export const getTrack = (tcxLap: iLap): Array<iPoint> => {
// return tcxLap.Track[0].Trackpoint;
// };
// export const fillLap = (tcxLap: iLap): Lap => {
// let lap = new Lap();
// lap.StartTime = new Date(tcxLap.$.StartTime);
// lap.TotalTimeSeconds = Number(tcxLap.TotalTimeSeconds[0]);
// lap.DistanceMeters = Number(tcxLap.DistanceMeters[0]);
// lap.Calories = Number(tcxLap.Calories[0]);
// ; (tcxLap.Extensions as Array<{}>).forEach(element => {
// for (let el in element) {
// switch (el) {
// case "LX":
// lap.AvgSpeed = Number(element["LX"]["0"]["AvgSpeed"]["0"]);
// break;
// case "ns3:LX":
// lap.AvgSpeed = Number(element["ns3:LX"]["0"]["ns3:AvgSpeed"]["0"]);
// if (element["ns3:LX"]["0"]["ns3:AvgRunCadence"] !== undefined) {
// lap.Cadence = Number(element["ns3:LX"]["0"]["ns3:AvgRunCadence"]["0"])
// } else {
// if (element["ns3:LX"]["0"]["ns3:MaxBikeCadence"] !== undefined) {
// lap.Cadence = Number(element["ns3:LX"]["0"]["ns3:MaxBikeCadence"]["0"])
// } else {
// lap.Cadence = -1
// }
// }
// break;
// default:
// lap.AvgSpeed = -1
// break;
// }
// }
// })
// if (tcxLap.Cadence !== undefined) {
// lap.Cadence = Number(tcxLap.Cadence[0]);
// }
// lap.AverageHeartRateBpm = Number(tcxLap.AverageHeartRateBpm[0].Value[0]);
// lap.MaximumHeartRateBpm = Number(tcxLap.MaximumHeartRateBpm[0].Value[0]);
// lap.MaximumSpeed = Number(tcxLap.MaximumSpeed[0]);
// return lap;
// }
// export const fillPoint = (point: iPoint): Track => {
// let trackPoint = new Track();
// let trackPosition = new TrackPointClass();
// trackPosition.Time = new Date(point.Time[0]);
// if(point.Position){
// trackPosition.LongitudeDegrees = Number(point.Position[0].LongitudeDegrees[0]);
// trackPosition.LatitudeDegrees = Number(point.Position[0].LatitudeDegrees[0]);
// } else {
// trackPosition.LongitudeDegrees = trackPosition.LatitudeDegrees = 0
// }
// trackPosition.AltitudeMeters = Number(point.AltitudeMeters[0]);
// trackPoint.DistanceMeters = Number(point.DistanceMeters[0]);
// //Στις περιπτώσεις που για οποιοδήποτε λόγο δεν κράτησε καρδιακό παλμό δώσε τιμή -1
// if (point.HeartRateBpm === undefined) {
// trackPoint.HeartRateBpm = -1
// } else {
// trackPoint.HeartRateBpm = Number(point.HeartRateBpm[0].Value[0]);
// }
// ; (point.Extensions as Array<{}>).forEach(element => {
// for (let el in element) {
// switch (el) {
// case "TPX":
// trackPoint.Speed = Number(element["TPX"]["0"]["Speed"]["0"]);
// if (point.Cadence !== undefined) {
// trackPoint.RunCadence = Number(point.Cadence[0]);
// trackPoint.BikeCadence = Number(point.Cadence[0]);
// }
// break;
// case "ns3:TPX":
// trackPoint.Speed = Number(element["ns3:TPX"]["0"]["ns3:Speed"]["0"]);
// break;
// default:
// break;
// }
// }
// })
// trackPoint.Position = trackPosition;
// return trackPoint;
// }