mardi 13 août 2019

Javascript TypeError 'undefined' is not a function' while creating tcx file

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