Hi I'm trying to create tcx file from xml object that I've created in javascript.
The code works great in any browser but when I try to create it for my Samsung GearS watch in tizen studio it gives me an error.
TypeError: 'undefined' is not a function (evaluating 'k.startsWith('@')') XmlHelper.js:10
This is my code
XmlHelper.js
function _node(name, value, deep) {
var node = '';
if (value instanceof Array) {
value.forEach(function (v, i) {
return node += '\n'.repeat(i > 0 ? 1 : 0) + _node(name, v, deep);
});
} else if (value instanceof Object) {
var attributes = Object.keys(value).filter(function (k) {
return k.startsWith('@');
});
var childs = Object.keys(value).filter(function (k) {
return !k.startsWith('@') && !!value[k];
});
var content = '';
node = '\t'.repeat(deep) + '<' + name;
attributes.forEach(function (k) {
return node += ' ' + k.substr(1) + '="' + value[k] + '"';
});
childs.forEach(function (k, i) {
return content += '\n' + _node(k, value[k], deep + 1) + '\n'.repeat(i + 1 == childs.length ? 1 : 0);
});
node += childs.length === 0 || content.replace(/\s|\n|\t/gm, '').length === 0 ? '/>' : '>' + content;
node += childs.length > 0 && content.replace(/\s|\n|\t/gm, '').length > 0 ? '\t'.repeat(deep) + '</' + name + '>' : '';
} else if (value !== null && value !== undefined) {
if (name.startsWith('#cdata#')) {
name = name.replace('#cdata#', '');
value = '<![CDATA[' + value + ']]>';
}
node += '\t'.repeat(deep) + '<' + name + '>' + value.toString() + '</' + name + '>';
}
return node;
}
function ConvertFromObj(jsonObj) {
var xml = '<?xml version="1.0" encoding="UTF-8" ?>\r\n';
Object.keys(jsonObj).forEach(function (k) {
return xml += _node(k, jsonObj[k], 0);
});
return xml;
}
tcx.js
function ConvertToTcx(res, calories, totalms) {
var data = res;
var result = {
TrainingCenterDatabase: {
'@xsi:schemaLocation': 'http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd',
'@xmlns:ns5': 'http://www.garmin.com/xmlschemas/ActivityGoals/v1',
//'@xmlns:ns4': 'http://www.garmin.com/xmlschemas/ProfileExtension/v1',
'@xmlns:ns3': 'http://www.garmin.com/xmlschemas/ActivityExtension/v2',
'@xmlns:ns2': 'http://www.garmin.com/xmlschemas/UserProfile/v2',
'@xmlns': 'http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2',
'@xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
Activities: {
Activity: {
'@Sport':'Running',
Id: new Date(data[0].timestamp).toISOString(),
Lap: {
'@StartTime': new Date(data[0].timestamp).toISOString(),
TotalTimeSeconds: (Math.floor(totalms / 1000.0)).toString(),
DistanceMeters: data[data.length-1].distance ? data[data.length-1].distance : null,
MaximumSpeed: data.map(function (s) { return s.speed; }).reduce(function (prev, next){ return Math.max(prev, next); }) * 0.277778, //km/h --> m/s
Calories: calories,
AverageHeartRateBpm: null,
MaximumHeartRateBpm: null,
Intensity: 'Active',
TriggerMethod: 'Manual',
Track: {
Trackpoint: []
}
}
}
},
}
};
var trackPoints = [];
if (data[0].hrm) {
result.TrainingCenterDatabase.Activities.Activity.Lap.AverageHeartRateBpm = { Value: Math.floor(data.reduce(function (prev, next) {
return {hrm:prev.hrm +next.hrm};
}).hrm/data.length) };
}
if (data[0].hrm) {
result.TrainingCenterDatabase.Activities.Activity.Lap.MaximumHeartRateBpm = { Value: data.map(function (h) {
return h.hrm;
}).reduce(function (prev, next) {
return Math.max(prev, next);
}) };
}
data.forEach(function (item) {
return trackPoints.push({
Time: item.timestamp,
Position: {
LatitudeDegrees: item.lat,
LongitudeDegrees: item.lng
},
AltitudeMeters: item.alt !==null && item.alt!==undefined ? item.alt.toFixed(1):0,
DistanceMeters:item.distance,
Extensions:{
TPX: {
'@xmlns': 'http://www.garmin.com/xmlschemas/ActivityExtension/v2',
Speed: item.speed > 0 ?(item.speed * 0.277778).toFixed(1):null //km/h --> m/s
}
},
HeartRateBpm:{ Value: item.hrm }
});
});
trackPoints.forEach(function (t) {
return t.Time = new Date(t.Time).toISOString();
});
result.TrainingCenterDatabase.Activities.Activity.Lap.Track.Trackpoint = trackPoints;
return ConvertFromObj(result);
}
Sample usage
function TcxCoords(position,hrm,time,speed,dist,cal) {
return {
lat: position.latitude,
lng: position.longitude,
alt: position.altitude,
hrm:hrm,
timestamp: time,
speed:speed,
distance:dist,
kcal:cal
};
}
var points = [{
lat: 0.0850000,
lng: 0.75000,
time: '2016-07-11T17:48:42.489Z',
tag: "A"
}, {
lat: 0.00000001,
lng: 0.01,
time: '2016-07-11T18:20:42.489Z',
tag: "B"
}, {
lat: 0.01,
lng: 0.0100001,
time: '2016-07-11T18:21:02.489Z',
tag: "C"
}, {
lat: 0.000001,
lng: 0.011,
time: '2016-07-11T18:21:22.489Z',
tag: "D"
}, {
lat: 0.002,
lng: 0.002,
time: '2016-07-11T18:21:42.489Z',
tag: "E"
}, {
lat: 0.0021,
lng: 0.0021,
time: '2016-07-11T18:22:02.489Z',
tag: "F"
}];
document.getElementById("start").addEventListener('click',function(){
var saveCoords = [];
for(var i=0; i<=points.length-1; i++){
var pos = {};
pos.latitude= points[i].lat;
pos.longitude = points[i].lng;
saveCoords.push(TcxCoords(pos, 80,points[i].time, 17, 4, 20));
}
var tcx = ConvertToTcx(saveCoords,"200",18000);
console.log(tcx);
});
If someone sees what Im doing wrong would be great, thank you
Aucun commentaire:
Enregistrer un commentaire