BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra

3 participants

Aller en bas

BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra Empty BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra

Message par BenThon Mar 6 Aoû 2024 - 10:36

Bonjour à tous,

Venant d’acquérir la toute dernière montre connectée de Samsung (Galaxy Watch 7 ultra), j’ai été surpris de voir que la trace obtenue lors d’une balade en vélo provoquait une erreur dans l’importation dans BaseCamp. Cependant la trace est importée sans problème dans IphiGéNie, mais cette application néglige les données de fréquence cardiaque.
[Vous devez être inscrit et connecté pour voir cette image]

Cette montre semble avoir une très bonne puce GPS (double fréquence) et, de plus, enregistre la fréquence cardiaque pour chaque point de trace.
BaseCamp ne reconnaît pas 2 extensions, ce qui provoque l’erreur. Voici le début et la fin du fichier GPX :

Code:
<?xml version="1.0"?>
<gpx xmlns="http://www.topografix.com/GPX/1/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1" version="1.1" creator="Samsung Health_0.2" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd">
        <metadate>2024-08-05T12:52:46Z</metadate>
        <trk>
                <name>20240805_145238.gpx</name>
                <trkseg>
                        <trkpt lat="49.8891936" lon="4.8053523">
                                <ele>153.964</ele>
                                <time>2024-08-05T12:52:46Z</time>
                                <extensions>
                                        <gpxtpx:TrackPointExtension>
                                                <gpxtpx:hr>77</gpxtpx:hr>
                                        </gpxtpx:TrackPointExtension>
                                </extensions>
                        </trkpt>
                        <trkpt lat="49.8891936" lon="4.8053523">
                                <ele>153.91</ele>
                                <time>2024-08-05T12:52:47Z</time>
                                <extensions>
                                        <gpxtpx:TrackPointExtension>
                                                <gpxtpx:hr>77</gpxtpx:hr>
                                        </gpxtpx:TrackPointExtension>
                                </extensions>
                        </trkpt>
                        <trkpt lat="49.8891936" lon="4.8053523">
                                <ele>153.9</ele>
                                <time>2024-08-05T12:52:48Z</time>
                                <extensions>
                                        <gpxtpx:TrackPointExtension>
                                                <gpxtpx:hr>78</gpxtpx:hr>
                                        </gpxtpx:TrackPointExtension>
                                </extensions>
                        </trkpt>
....................................
                </trkseg>
        </trk>
        <exerciseinfo>
                <exercisetype>11007</exercisetype>
                <distance>38170.312</distance>
                <elevationgain>165.339</elevationgain>
                <avggradient>2.419656286844634</avggradient>
                <duration>6192469</duration>
                <avgspeed>6.163989</avgspeed>
        </exerciseinfo>
</gpx>

En supprimant :

Code:
<metadate>le contenu</metadate>

Et en supprimant, à la fin, tout ce qui concerne « exerciseinfo » :

Code:
       <exerciseinfo>
                <exercisetype>11007</exercisetype>
                <distance>38170.312</distance>
                <elevationgain>165.339</elevationgain>
                <avggradient>2.419656286844634</avggradient>
                <duration>6192469</duration>
                <avgspeed>6.163989</avgspeed>
        </exerciseinfo>

Le fichier est parfaitement reconnu par BaseCamp et la fréquence cardiaque, au long du parcours, est bien visualisée.

Amicalement,
Benoît
BenThon
BenThon
4 sat
4 sat


Revenir en haut Aller en bas

BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra Empty Re: BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra

Message par Monique Mar 6 Aoû 2024 - 10:40

Bonjour Benoît,

Merci !  top
Je vais transmettre ta solution à mon petit-fils qui possède cette montre.
Monique
Monique
*
*


Revenir en haut Aller en bas

BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra Empty Re: BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra

Message par BenThon Mar 6 Aoû 2024 - 10:46

Bonjour Monique,

Il a de la chance d'avoir une grand-mère qui lui a offert une telle montre ! A un prix presque prohibitif ! Very Happy Very Happy

Mais il a surtout de la chance d'avoir une grand-mère à la pointe de la technique ! top

Amicalement,
Benoît
BenThon
BenThon
4 sat
4 sat


Revenir en haut Aller en bas

BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra Empty Re: BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra

Message par Monique Mar 6 Aoû 2024 - 10:55

Euh... No C'est gentil mais tu me surestimes. Ce petit-fils-là est bien plus à la pointe de la technique et de l'informatique que moi !
Quant à la montre, comme il vient d'avoir son bac, un tel cadeau (collectif) se justifiait. Wink
Monique
Monique
*
*


Revenir en haut Aller en bas

BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra Empty Re: BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra

Message par BenThon Mer 7 Aoû 2024 - 22:02

Bonsoir à vous,
J'ai écrit une petite application Web (avec la collaboration de mon fils) permettant de corriger les fichiers GPX produits par les Galaxy Watch pour qu'ils puissent être importés dans BaseCamp.
Voici le code :
Code:
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8" >
<title>Galaxy Watch vers Basecamp</title>
<meta name="author" content="BenThon & al">
<meta name="description" content="Application Web pour corriger les traces produites par les Galaxy Watch, pour permettre l'importation dans BaseCamp">
<meta name="revised" content="mercredi 7 août 2024">
<style>
#grid {
    display: grid;
    grid-template-columns: auto auto;
}
textarea {
    margin-left: 20px;
    margin-right: 20px;
    resize: none;
    vertical-align: top;
}
</style>
</head>
<body>
    <div id="grid">
        <div id="infile">
            <input id="inputfile" type="file" accept="application/gpx" autocomplete="off">
        </div>
        <div id="outfile">
            <button id="downloadlink">Sauve GPX corrigé</button>
            <input type="string" id="outputfile" value="fichier_en_sortie.gpx" autocomplete="off">
        </div>
        <div id="comments"></div>
    </div>
<script>
var inputfile = document.getElementById("inputfile");
var outputfile = document.getElementById("outputfile");
var downloadlink = document.getElementById("downloadlink");
var comments = document.getElementById("comments");
var modif_text;

inputfile.addEventListener("change", function() {
    if (inputfile.files.length) {
        handleFile(inputfile.files[0]);
    }
});
downloadlink.addEventListener("click",download,false);
function handleFile(file) {
    var outputfile = document.getElementById("outputfile");
    outputfile.value=file.name.replace(/\.gpx/,"_corrigé.gpx");
    file.text().then(postprocess).catch(catchAll);
}
function catchAll(val) {
    comments.innerHTML="error: "+val;
}
function postprocess(text) {
    comments.innerHTML="";
    modif_text = text.replace("<metadate>", "<metadata><time>")
                     .replace("</metadate>", "</time></metadata>")
                     .replace("<exerciseinfo>", "<!--<exerciseinfo>")
                     .replace("</exerciseinfo>", "</exerciseinfo>-->");
    if (modif_text.search("<metadata><time>")>=0) {
        comments.innerHTML+="Correction de \"metadate\" en balise Time<br/>";
    }
    if (modif_text.search("<!--<exerciseinfo>")>=0) {
        comments.innerHTML+="\"exerciseinfo\" mis en commentaire<br/>";
    }
}
function download() {
    var hiddenElement = document.createElement('a');
    hiddenElement.href = 'data:application/gpx;charset=utf-8,' + encodeURI(modif_text);
    hiddenElement.target = '_blank';
    hiddenElement.download = outputfile.value;
    hiddenElement.click();
}
</script>
</body>
</html>


Pour l'utiliser, il suffit de copier le code ci-dessus et de le coller dans un fichier texte que vous créez.
Ensuite, vous modifiez l'extension du fichier texte en html (".txt" en ".html").
Vous pouvez mettre comme nom ce que vous voulez (j'ai personnellement mis "galaxy_watch_vers_basecamp" ce qui donne donc pour le nom complet "galaxy_watch_vers_basecamp.html").

En double-cliquant sur ce fichier, la conversion en GPX, compatible BaseCamp, sera faite après avoir choisi le fichier original et avoir cliqué sur le bouton "Sauve GPX corrigé".

Je transmets à la maîtresse des lieux le fichier html pour ceux qui ne sauraient pas créer le fichier. Elle pourra le mettre à disposition.

Amicalement,
Benoît

[EDIT de Monique du 09/08/2024]
Fichier ".zip" ajouté en fichier-joint ci-dessous. Je cite Benoît :

Ce n'est pas un lien HTML, mais une page Web (en local) avec son head et son body et un petit script en javascript.
Dans le zip, il suffit de double-cliquer sur le fichier HTML pour l'exécuter.
Fichiers joints
BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra Attachment
galaxy_watch_vers_basecamp.zip Vous n'avez pas la permission de télécharger les fichiers joints.(2 Ko) Téléchargé 1 fois
BenThon
BenThon
4 sat
4 sat


Revenir en haut Aller en bas

BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra Empty Re: BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra

Message par BenThon Ven 9 Aoû 2024 - 18:31

Merci à la "maîtresse des lieux" !
Maintenant tu peux purger les messages en dessous pour clarifier le "fil".
Amicalement,
Benoît

[EDIT de Monique : C'est fait.]
BenThon
BenThon
4 sat
4 sat


Revenir en haut Aller en bas

BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra Empty Re: BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra

Message par BenThon Sam 10 Aoû 2024 - 10:53

À noter que cette application Web permet aussi l’importation dans BaseCamp (sans erreur) des GPX produits par les précédentes montres connectées Samsung Galaxy Watch.
Je viens de le vérifier notamment pour les modèles 5 et 6 que je possède encore.
BenThon
BenThon
4 sat
4 sat


Revenir en haut Aller en bas

BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra Empty BaseCamp - Montres connectées Samsung Watch - Corrections et valeurs pour importation

Message par BenThon Lun 12 Aoû 2024 - 10:51

Bonjour à tous,
J'ai un peu amélioré l'application Web pour l'importation des itinéraires en GPX  de l'application "Samsung Health" produits par les montres Samsung Watch (Modèle 7 et antérieurs).
Voici l'aspect dans l'application de Samsung pour une "Randonnée du Pain" effectuée dans les Ardennes le 4 août 2024.
[Vous devez être inscrit et connecté pour voir cette image]

Le GPX exporté par cette application contient des balises non reconnues par BaseCamp et MapSource :
[Vous devez être inscrit et connecté pour voir cette image]
Une des 2 balises non reconnues est "exerciseinfo" et voici ce que cela donne pour la randonnée :
[Vous devez être inscrit et connecté pour voir cette image]

Les modifications apportées par la nouvelle application Web explicitent les valeurs contenues dans cette balise :
[Vous devez être inscrit et connecté pour voir cette image]

Dans le fichier "galaxy_watch_vers_basecamp_Val.zip" que vous proposera "la maîtresse des lieux", vous trouverez :
- à la racine, la page "HTML" sur laquelle il faudra "double-cliquer" pour faire la correction des GPX (ce qui vous permettra de voir le contenu explicité dans la balise "exerciseinfo"
- un sous-dossier "Explications" où vous trouverez le fichier GPX produit par ma montre Galaxy Watch lors de cette "Randonnée du Pain", ainsi que la page "HTML" vue en mode texte pour comprendre l'action de l'application Web.

[Vous devez être inscrit et connecté pour voir cette image]

En espérant que cela peut être utile, cordialement,
Benoît

[EDIT de Monique : ajout du fichier ".zip" explicatif en fichier joint ci-dessous]
.
Fichiers joints
BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra Attachment
galaxy_watch_vers_basecamp_Val.zip Vous n'avez pas la permission de télécharger les fichiers joints.(149 Ko) Téléchargé 0 fois
BenThon
BenThon
4 sat
4 sat


Revenir en haut Aller en bas

BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra Empty Bonus du jour - Explicitation du type d'exercice

Message par BenThon Mer 14 Aoû 2024 - 13:11

Dans cette dernière version, explicitation de la balise , selon les données de Samsung Health qui affecte un code numérique aux activités pratiquées.

exercisetype = [ 0 , 1001 , 1002 , 2001 , 2002 , 2003 , 3001 , 3002 , 3003 , 4001 , 4002 , 4003 , 4004 , 4005 , 4006 , 5001 , 5002 , 6001 , 6002 , 6003 , 6004 , 6005 , 7002 , 7003 , 8001 , 8002 , 8003 , 9001 , 9002 , 10001 , 10002 , 10003 , 10004 , 10005 , 10006 , 10007 , 10008 , 10009 , 10010 , 10011 , 10012 , 10013 , 10014 , 10015 , 10016 , 10017 , 10018 , 10019 , 10020 , 10021 , 10022 , 10023 , 10024 , 10025 , 10026 , 10027 , 11001 , 11002 , 11003 , 11004 , 11005 , 11007 , 11008 , 11009 , 12001 , 13001 , 13002 , 13003 , 13004 , 13005 , 14001 , 14002 , 14003 , 14004 , 14005 , 14006 , 14007 , 14008 , 14009 , 14010 , 14011 , 14012 , 14013 , 15001 , 15002 , 15003 , 15004 , 15005 , 15006 , 16001 , 16002 , 16003 , 16004 , 16006 , 16007 , 16008 , 16009 ]

pour un rendu en clair :

valeur = ['Type personnalisé','Marche','Course','Baseball, général','Softball, général','Cricket','Golf, général','Billard','Bowling, piste','Hockey','Rugby, touch, non compétitif','Basket-ball, général','Football, général (Soccer)','Handball, général','Football américain, général, touch','Volley-ball, général, équipe de 6 à 9 membres, non compétitif','Beach-volley','Squash, général','Tennis, général','Badminton, compétitif','Tennis de table','Racquetball, général','Boxe, sur le ring','Arts martiaux, rythme modéré (Judo, Jujitsu, Karaté, Taekwondo)','Ballet, général, répétition ou cours','Danse, général (Fork, Irish step, Polka)','Danse de salon, rapide','Pilates','Yoga','Stretching','Corde à sauter, rythme modéré (100 à 120 sauts/min), saut à 2 pieds','Hula-hoop','Pompes (pompes)','Tractions (Chin-up)','Abdominaux','Circuit training, effort modéré','Alpinisme','Sauts avec écart','Burpee','Développé couché','Flexion sur jambes','Fentes','Presse à cuisses','Extensions de jambes','Flexions des jambes','Extensions du dos','Tirages latéraux','Soulevés de terre','Développé épaules','Élévations avant','Élévations latérales','Enroulement vertébral','Relevés de jambes','Planche','Flexions des bras','Extensions de bras','Patin à roues alignées, rythme modéré','Deltaplane','Tir au pistolet','Tir à l"arc, hors chasse','Équitation, général','Vélo','Disque volant, général, jeu','Patinage à roulettes','Aérobic, général','Randonnée','Escalade, difficulté faible à modérée','Randonnée pédestre','VTT, général','Course d"orientation','Natation, générale, tranquille, pas de longueurs','Aquagym','Canoë, en général, pour le plaisir','Voile, loisir, navigation hauturière','Plongée sous-marine, généralités','Plongée en apnée','Kayak, effort modéré','Kitesurf','Rafting','Rameur, général, pour le plaisir','Planche à voile, généralités','Yachting, loisirs','Ski nautique','Machine à pas','Appareil de musculation','Vélo d"appartement, effort modéré à vigoureux (90-100 watts)','Rameur','Tapis de course, combinaison de jogging et de marche','Vélo elliptique, effort modéré','Ski de fond, général, vitesse modérée (4,0~4,9 mph)','Ski, général, descente, effort modéré','Danse sur glace','Patinage sur glace, général','Hockey sur glace, général','Snowboard, général, effort modéré','Ski alpin, général, effort modéré','Randonnée en raquettes, effort modéré']

La dernière version ajoute, à la fin du fichier GPX, sous forme de commentaire, les données explicitées, par exemple :
[Vous devez être inscrit et connecté pour voir cette image]


et permet la sauvegarde dans le GPX corrigé.

Le code complet de la page HTML (faire comme indiqué au début de ce fil - premier post) :
Code:
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8" >
<title>Galaxy Watch vers Basecamp</title>
<meta name="author" content="BenThon & al">
<meta name="description" content="Application Web pour corriger les traces produites par les Galaxy Watch, pour permettre l"importation dans BaseCamp">
<meta name="revised" content="mercredi 14 août 2024">
<style>
#grid {
    display: grid;
    grid-template-columns: auto auto;
}
textarea {
    margin-left: 20px;
    margin-right: 20px;
    resize: none;
    vertical-align: top;
}
</style>
</head>
<body>
    <div id="grid">
        <div id="infile">
            <input id="inputfile" type="file" accept="application/gpx" autocomplete="off">
        </div>
        <div id="outfile">
            <button id="downloadlink">Sauve GPX corrigé</button>
            <input type="string" id="outputfile" value="fichier_en_sortie.gpx" autocomplete="off">
        </div>
        <div id="comments"></div>
    </div>
<script>
const exercisetypenb = [ 0 , 1001 , 1002 , 2001 , 2002 , 2003 , 3001 , 3002 , 3003 , 4001 , 4002 , 4003 , 4004 , 4005 , 4006 , 5001 , 5002 , 6001 , 6002 , 6003 , 6004 , 6005 , 7002 , 7003 , 8001 , 8002 , 8003 , 9001 , 9002 , 10001 , 10002 , 10003 , 10004 , 10005 , 10006 , 10007 , 10008 , 10009 , 10010 , 10011 , 10012 , 10013 , 10014 , 10015 , 10016 , 10017 , 10018 , 10019 , 10020 , 10021 , 10022 , 10023 , 10024 , 10025 , 10026 , 10027 , 11001 , 11002 , 11003 , 11004 , 11005 , 11007 , 11008 , 11009 , 12001 , 13001 , 13002 , 13003 , 13004 , 13005 , 14001 , 14002 , 14003 , 14004 , 14005 , 14006 , 14007 , 14008 , 14009 , 14010 , 14011 , 14012 , 14013 , 15001 , 15002 , 15003 , 15004 , 15005 , 15006 , 16001 , 16002 , 16003 , 16004 , 16006 , 16007 , 16008 , 16009 ]

const exercisetypeval =
['Type personnalisé','Marche','Course','Baseball, général','Softball, général','Cricket','Golf, général','Billard','Bowling, piste','Hockey','Rugby, touch, non compétitif','Basket-ball, général','Football, général (Soccer)','Handball, général','Football américain, général, touch','Volley-ball, général, équipe de 6 à 9 membres, non compétitif','Beach-volley','Squash, général','Tennis, général','Badminton, compétitif','Tennis de table','Racquetball, général','Boxe, sur le ring','Arts martiaux, rythme modéré (Judo, Jujitsu, Karaté, Taekwondo)','Ballet, général, répétition ou cours','Danse, général (Fork, Irish step, Polka)','Danse de salon, rapide','Pilates','Yoga','Stretching','Corde à sauter, rythme modéré (100 à 120 sauts/min), saut à 2 pieds','Hula-hoop','Pompes (pompes)','Tractions (Chin-up)','Abdominaux','Circuit training, effort modéré','Alpinisme','Sauts avec écart','Burpee','Développé couché','Flexion sur jambes','Fentes','Presse à cuisses','Extensions de jambes','Flexions des jambes','Extensions du dos','Tirages latéraux','Soulevés de terre','Développé épaules','Élévations avant','Élévations latérales','Enroulement vertébral','Relevés de jambes','Planche','Flexions des bras','Extensions de bras','Patin à roues alignées, rythme modéré','Deltaplane','Tir au pistolet','Tir à l"arc, hors chasse','Équitation, général','Vélo','Disque volant, général, jeu','Patinage à roulettes','Aérobic, général','Randonnée','Escalade, difficulté faible à modérée','Randonnée pédestre','VTT, général','Course d"orientation','Natation, générale, tranquille, pas de longueurs','Aquagym','Canoë, en général, pour le plaisir','Voile, loisir, navigation hauturière','Plongée sous-marine, généralités','Plongée en apnée','Kayak, effort modéré','Kitesurf','Rafting','Rameur, général, pour le plaisir','Planche à voile, généralités','Yachting, loisirs','Ski nautique','Machine à pas','Appareil de musculation','Vélo d"appartement, effort modéré à vigoureux (90-100 watts)','Rameur','Tapis de course, combinaison de jogging et de marche','Vélo elliptique, effort modéré','Ski de fond, général, vitesse modérée (4,0~4,9 mph)','Ski, général, descente, effort modéré','Danse sur glace','Patinage sur glace, général','Hockey sur glace, général','Snowboard, général, effort modéré','Ski alpin, général, effort modéré','Randonnée en raquettes, effort modéré']

var inputfile = document.getElementById("inputfile");
var outputfile = document.getElementById("outputfile");
var downloadlink = document.getElementById("downloadlink");
var comments = document.getElementById("comments");
var modif_text;
var val_decode;

inputfile.addEventListener("change", function() {
    if (inputfile.files.length) {
        handleFile(inputfile.files[0]);
    }
});
downloadlink.addEventListener("click",download,false);
function handleFile(file) {
    var outputfile = document.getElementById("outputfile");
    outputfile.value=file.name.replace(/\.gpx/,"_corrigé.gpx");
    file.text().then(postprocess).catch(catchAll);
}
function catchAll(val) {
    comments.innerHTML="error: "+val;
}

// Conversion du temps de l"entraînement qui est en secondes
function Conversion_Temps(num)
 {
  // Calcul du nombre de minutes
  var minutes = Math.floor(num / 60000);  

  // Calcul du nombre de secondes
  var secondes = Math.floor((num % 60000) / 1000);

  // Résultat dans le format "minutes:secondes"
  return minutes + """ + secondes + """;        
};

function postprocess(text) {
    comments.innerHTML="";
    modif_text = text.replace("<metadate>", "<metadata><time>")
                     .replace("</metadate>", "</time></metadata>")
                     .replace("<exerciseinfo>", "<!--<exerciseinfo>")
                     .replace("</exerciseinfo>", "</exerciseinfo>-->");
    if (modif_text.search("<metadata><time>")>=0) {
        comments.innerHTML+="<br/>Correction de <b>"metadate"</b> en balise Time<br/>";
    }
    if (modif_text.search("<!--<exerciseinfo>")>=0) {
        comments.innerHTML+="<b>"exerciseinfo"</b> mis en commentaire<br/><br/>";
        comments.innerHTML+="<b>Contenu de "exerciseinfo" :</b><br/><br/>";

        // Utiliser la fonction pour extraire les valeurs

        const parser = new DOMParser();
        const xmlDoc = parser.parseFromString(text, "application/xml");
        const exerciseType = xmlDoc.getElementsByTagName("exercisetype")[0].textContent;
        const distance = xmlDoc.getElementsByTagName("distance")[0].textContent;
        const elevationGain = xmlDoc.getElementsByTagName("elevationgain")[0].textContent;
        const avgGradient = xmlDoc.getElementsByTagName("avggradient")[0].textContent;
        const duration = xmlDoc.getElementsByTagName("duration")[0].textContent;
        const avgSpeed = xmlDoc.getElementsByTagName("avgspeed")[0].textContent;

  // Extraire les valeurs des balises

        const found = exercisetypenb.findIndex((element) => element == exerciseType);
        const exercice_txt = exercisetypeval[found];
        const distance_txt = (distance / 1000).toFixed(2) + " km";
        const deniv_txt = Math.floor(elevationGain) + " mètres";
        const pente_txt = Math.floor(avgGradient) + " %";
        const temps_txt = Conversion_Temps(duration);
        const vitesse_txt = (avgSpeed * 3.6).toFixed(2) + " km/h";

        val_decode = 'type d\'exercice = ' + exercice_txt + '\n' + 'distance = ' + distance_txt + '\n' +
                     'dénivelé = ' + deniv_txt + '\n' + 'pente moyenne = ' + pente_txt + '\n' + 'durée = ' +
                     temps_txt + '\n' + 'vitesse moyenne = ' + vitesse_txt + '\n';

        modif_text = modif_text.replace("</exerciseinfo>-->",  
                     "</exerciseinfo>\n\n******************************\n" +
                     val_decode + "******************************\n-->");

        comments.innerHTML+="<b>type d\'exercice = </b>" + exerciseType + ' (<b>' + exercice_txt + "</b>)<br/>";
        comments.innerHTML+="<b>distance = </b>" + distance_txt + "<br/>";
        comments.innerHTML+="<b>dénivelé = </b>" + deniv_txt + "<br/>";
        comments.innerHTML+="<b>pente moyenne = </b>" + pente_txt + "<br/>";
        comments.innerHTML+="<b>durée = </b>" + temps_txt + "<br/>";
        comments.innerHTML+="<b>vitesse moyenne = </b>" + vitesse_txt + "<br/>";

    }
}
function download() {
    var hiddenElement = document.createElement("a");
    hiddenElement.href = "data:application/gpx;charset=utf-8," + encodeURI(modif_text);
    hiddenElement.target = "_blank";
    hiddenElement.download = outputfile.value;
    hiddenElement.click();
}
</script>
</body>
</html>

[EDIT de Monique: fichier ".zip" correspondant ajouté en fichier-joint ci-dessous]
.
Fichiers joints
BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra Attachment
galaxy_watch_vers_basecamp_Type.zip Vous n'avez pas la permission de télécharger les fichiers joints.(4 Ko) Téléchargé 1 fois
BenThon
BenThon
4 sat
4 sat


Revenir en haut Aller en bas

BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra Empty Ajout de nouvelles fonctions pour l'appli Web - Suppression de balises (HR - TIME - ELE)

Message par BenThon Ven 16 Aoû 2024 - 8:19

Vous souhaitez partager les traces GPX produites par votre montre Galaxy Watch, mais sans partager des données très personnelles, comme notamment votre "Fréquence Cardiaque".

L'application Web a maintenant de nouvelles améliorations, outre toutes celles présentées dans ce "fil de discussion", dont la première fonctionnalité est de rendre les GPX produits compatibles avec MapSource et BaseCamp.

Des "cases à cocher" ont été ajoutées pour éventuellement supprimer du GPX, 3 balises :
- les extensions spécifiques de "Samsung Health", dont la balise "hr" (fréquence cardiaque)
- les données temporelles (balise "time")
- les données d'altitude (balise "ele")

[Vous devez être inscrit et connecté pour voir cette image]

Voici le code de la page "HTML" correspondant (voir début du fil de discussion) :
Code:
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8" >
<title>Galaxy Watch vers Basecamp</title>
<meta name="author" content="BenThon & al">
<meta name="description" content="Application Web pour corriger les traces produites par les Galaxy Watch, pour permettre l"importation dans BaseCamp">
<meta name="revised" content="vendredi 16 août 2024">
<style>
#grid {
    display: grid;
    grid-template-columns: auto auto;
}
textarea {
    margin-left: 20px;
    margin-right: 20px;
    resize: none;
    vertical-align: top;
}
</style>
</head>
<body>
    <div id="grid">
        <div id="infile">
            <input id="inputfile" type="file" accept="application/gpx" autocomplete="off">
        </div>
        <div id="outfile">
            <button id="downloadlink">Sauve GPX corrigé</button>
            <input type="string" id="outputfile" value="fichier_en_sortie.gpx" autocomplete="off"><br/>
            <input type="checkbox" id="extsup" name="extsup" />
            <label for="extsup">Supprimer les extensions (fréquence cardiaque - hr)</label><br/>
            <input type="checkbox" id="timesup" name="timesup" />
            <label for="timesup">Supprimer les données temporelles (time)</label><br/>
            <input type="checkbox" id="altsup" name="altsup" />
            <label for="altsup">Supprimer les données d'altitude (ele)</label><br/>
        </div>
        <div id="comments"></div>
    </div>
<script>
const exercisetypenb = [ 0 , 1001 , 1002 , 2001 , 2002 , 2003 , 3001 , 3002 , 3003 , 4001 , 4002 , 4003 , 4004 , 4005 , 4006 , 5001 , 5002 , 6001 , 6002 , 6003 , 6004 , 6005 , 7002 , 7003 , 8001 , 8002 , 8003 , 9001 , 9002 , 10001 , 10002 , 10003 , 10004 , 10005 , 10006 , 10007 , 10008 , 10009 , 10010 , 10011 , 10012 , 10013 , 10014 , 10015 , 10016 , 10017 , 10018 , 10019 , 10020 , 10021 , 10022 , 10023 , 10024 , 10025 , 10026 , 10027 , 11001 , 11002 , 11003 , 11004 , 11005 , 11007 , 11008 , 11009 , 12001 , 13001 , 13002 , 13003 , 13004 , 13005 , 14001 , 14002 , 14003 , 14004 , 14005 , 14006 , 14007 , 14008 , 14009 , 14010 , 14011 , 14012 , 14013 , 15001 , 15002 , 15003 , 15004 , 15005 , 15006 , 16001 , 16002 , 16003 , 16004 , 16006 , 16007 , 16008 , 16009 ]

const exercisetypeval =
['Type personnalisé','Marche','Course','Baseball, général','Softball, général','Cricket','Golf, général','Billard','Bowling, piste','Hockey','Rugby, touch, non compétitif','Basket-ball, général','Football, général (Soccer)','Handball, général','Football américain, général, touch','Volley-ball, général, équipe de 6 à 9 membres, non compétitif','Beach-volley','Squash, général','Tennis, général','Badminton, compétitif','Tennis de table','Racquetball, général','Boxe, sur le ring','Arts martiaux, rythme modéré (Judo, Jujitsu, Karaté, Taekwondo)','Ballet, général, répétition ou cours','Danse, général (Fork, Irish step, Polka)','Danse de salon, rapide','Pilates','Yoga','Stretching','Corde à sauter, rythme modéré (100 à 120 sauts/min), saut à 2 pieds','Hula-hoop','Pompes (pompes)','Tractions (Chin-up)','Abdominaux','Circuit training, effort modéré','Alpinisme','Sauts avec écart','Burpee','Développé couché','Flexion sur jambes','Fentes','Presse à cuisses','Extensions de jambes','Flexions des jambes','Extensions du dos','Tirages latéraux','Soulevés de terre','Développé épaules','Élévations avant','Élévations latérales','Enroulement vertébral','Relevés de jambes','Planche','Flexions des bras','Extensions de bras','Patin à roues alignées, rythme modéré','Deltaplane','Tir au pistolet','Tir à l"arc, hors chasse','Équitation, général','Vélo','Disque volant, général, jeu','Patinage à roulettes','Aérobic, général','Randonnée','Escalade, difficulté faible à modérée','Randonnée pédestre','VTT, général','Course d"orientation','Natation, générale, tranquille, pas de longueurs','Aquagym','Canoë, en général, pour le plaisir','Voile, loisir, navigation hauturière','Plongée sous-marine, généralités','Plongée en apnée','Kayak, effort modéré','Kitesurf','Rafting','Rameur, général, pour le plaisir','Planche à voile, généralités','Yachting, loisirs','Ski nautique','Machine à pas','Appareil de musculation','Vélo d"appartement, effort modéré à vigoureux (90-100 watts)','Rameur','Tapis de course, combinaison de jogging et de marche','Vélo elliptique, effort modéré','Ski de fond, général, vitesse modérée (4,0~4,9 mph)','Ski, général, descente, effort modéré','Danse sur glace','Patinage sur glace, général','Hockey sur glace, général','Snowboard, général, effort modéré','Ski alpin, général, effort modéré','Randonnée en raquettes, effort modéré']

var inputfile = document.getElementById("inputfile");
var outputfile = document.getElementById("outputfile");
var checksup = document.getElementById("extsup");
var checksuptime = document.getElementById("timesup");
var checksupalt = document.getElementById("altsup");
var downloadlink = document.getElementById("downloadlink");
var comments = document.getElementById("comments");
var modif_text;
var sauve_text;
var val_decode;

inputfile.addEventListener("change", function() {
    if (inputfile.files.length) {
        handleFile(inputfile.files[0]);
    }
});
downloadlink.addEventListener("click",download,false);
function handleFile(file) {
    var outputfile = document.getElementById("outputfile");
    outputfile.value=file.name.replace(/\.gpx/,"_corrigé.gpx");
    file.text().then(postprocess).catch(catchAll);
}
function catchAll(val) {
    comments.innerHTML="error: "+val;
}

// Conversion du temps de l"entraînement qui est en secondes
function Conversion_Temps(num)
 {
  // Calcul du nombre de minutes
  var minutes = Math.floor(num / 60000);  

  // Calcul du nombre de secondes
  var secondes = Math.floor((num % 60000) / 1000);

  // Résultat dans le format "minutes:secondes"
  return minutes + """ + secondes + """;        
};

function postprocess(text) {
    comments.innerHTML="";
    modif_text = text.replace("<metadate>", "<metadata><time>")
                     .replace("</metadate>", "</time></metadata>")
                     .replace("<exerciseinfo>", "<!--<exerciseinfo>")
                     .replace("</exerciseinfo>", "</exerciseinfo>-->");

    if (modif_text.search("<metadata><time>")>=0) {
        comments.innerHTML+="<br/>Correction de <b>"metadate"</b> en balise Time<br/>";
    }
    if (modif_text.search("<!--<exerciseinfo>")>=0) {
        comments.innerHTML+="<b>"exerciseinfo"</b> mis en commentaire<br/><br/>";
        comments.innerHTML+="<b>Contenu de "exerciseinfo" :</b><br/><br/>";

        // Utiliser la fonction pour extraire les valeurs

        const parser = new DOMParser();
        const xmlDoc = parser.parseFromString(text, "application/xml");
        const exerciseType = xmlDoc.getElementsByTagName("exercisetype")[0].textContent;
        const distance = xmlDoc.getElementsByTagName("distance")[0].textContent;
        const elevationGain = xmlDoc.getElementsByTagName("elevationgain")[0].textContent;
        const avgGradient = xmlDoc.getElementsByTagName("avggradient")[0].textContent;
        const duration = xmlDoc.getElementsByTagName("duration")[0].textContent;
        const avgSpeed = xmlDoc.getElementsByTagName("avgspeed")[0].textContent;

  // Extraire les valeurs des balises

        const found = exercisetypenb.findIndex((element) => element == exerciseType);
        const exercice_txt = exercisetypeval[found];
        const distance_txt = (distance / 1000).toFixed(2) + " km";
        const deniv_txt = Math.floor(elevationGain) + " mètres";
        const pente_txt = Math.floor(avgGradient) + " %";
        const temps_txt = Conversion_Temps(duration);
        const vitesse_txt = (avgSpeed * 3.6).toFixed(2) + " km/h";

        val_decode = 'type d\'exercice = ' + exercice_txt + '\n' + 'distance = ' + distance_txt + '\n' +
                     'dénivelé = ' + deniv_txt + '\n' + 'pente moyenne = ' + pente_txt + '\n' + 'durée = ' +
                     temps_txt + '\n' + 'vitesse moyenne = ' + vitesse_txt + '\n';

        modif_text = modif_text.replace("</exerciseinfo>-->",  
                     "</exerciseinfo>\n\n******************************\n" +
                     val_decode + "******************************\n-->");

        comments.innerHTML+="<b>type d\'exercice = </b>" + exerciseType + ' (<b>' + exercice_txt + "</b>)<br/>";
        comments.innerHTML+="<b>distance = </b>" + distance_txt + "<br/>";
        comments.innerHTML+="<b>dénivelé = </b>" + deniv_txt + "<br/>";
        comments.innerHTML+="<b>pente moyenne = </b>" + pente_txt + "<br/>";
        comments.innerHTML+="<b>durée = </b>" + temps_txt + "<br/>";
        comments.innerHTML+="<b>vitesse moyenne = </b>" + vitesse_txt + "<br/>";

    }
}
function download() {
    sauve_text = modif_text;
        // Supprimer les données de fréquence cardiaque et autres extensions spécifiques
        if (checksup.checked == true){
          sauve_text = sauve_text.replace(/<extensions>[\s\S]*?<\/extensions>\n/g, '');
        };
        // Supprimer les données temporelles
        if (checksuptime.checked == true){
          sauve_text = sauve_text.replace(/<metadata>[\s\S]*?<\/metadata>\n/g, '');
          sauve_text = sauve_text.replace(/<time>[\s\S]*?<\/time>\n/g, '');
        };
        // Supprimer les données d'altitude
        if (checksupalt.checked == true){
          sauve_text = sauve_text.replace(/<ele>[\s\S]*?<\/ele>\n/g, '');
        };

    var hiddenElement = document.createElement("a");
    hiddenElement.href = "data:application/gpx;charset=utf-8," + encodeURI(sauve_text);
    hiddenElement.target = "_blank";
    hiddenElement.download = outputfile.value;
    hiddenElement.click();
}
</script>
</body>
</html>

En espérant que cela puisse vous aider, cordialement

[EDIT de Monique : fichier ".zip" correspondant ajouté en fichier joint ci-dessous]
.
Fichiers joints
BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra Attachment
galaxy_watch_vers_basecamp_Type_choix_supp_hr_time_ele.zip Vous n'avez pas la permission de télécharger les fichiers joints.(4 Ko) Téléchargé 3 fois
BenThon
BenThon
4 sat
4 sat


Revenir en haut Aller en bas

BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra Empty Re: BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra

Message par BenThon Ven 16 Aoû 2024 - 8:48

Merci à la "Sorcière Bien Aimée" de relayer ma production qui pourra, peut-être un jour, aider quelques utilisateurs.  [Vous devez être inscrit et connecté pour voir cette image]
BenThon
BenThon
4 sat
4 sat


Revenir en haut Aller en bas

BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra Empty Re: BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra

Message par Hébé-coin Sam 17 Aoû 2024 - 16:10

Bonjour,
Testé avec un fichier GPX enregistré par un appareil TwoNav : fonctionnement parfait.
La suppression des données "fréquence cardiaque" et "time" permet l'édition du tracé dans BaseCamp.
Bravo et merci pour le partage top
Cordialement

Hébé-coin
3 sat
3 sat


Revenir en haut Aller en bas

BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra Empty Re: BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra

Message par BenThon Sam 17 Aoû 2024 - 21:30

Hébé-coin a écrit:La suppression des données "fréquence cardiaque" et "time" permet l'édition du tracé dans BaseCamp.
Euh... les données "fréquence cardiaque" et "time" sont compatibles avec BaseCamp.

Merci pour les encouragements.
BenThon
BenThon
4 sat
4 sat


Revenir en haut Aller en bas

BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra Empty Re: BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra

Message par Hébé-coin Dim 18 Aoû 2024 - 1:11

Bonsoir,
BenThon a écrit:Euh... les données "fréquence cardiaque" et "time" sont compatibles avec BaseCamp
Bien vu, la remarque !
Ton programme m'a permis de supprimer des codes générés par TwoNav et incompatibles avec BaseCamp.
Ces codes étant entre des balises "extensions" ou "metadata", c'est en cochant Supprimer les extensions (fréquence cardiaque - hr) + Supprimer les données temporelles (time) que j'ai obtenu un fichier compatible.
Suite à ta remarque, j'ai pu trouver précisément ce qui doit être supprimé pour obtenir le fichier compatible conservant les HR et les Time.
Si des utilisateurs sont intéressés, je pourrai volontiers participer à l'adaptation de ton programme pour les GPX issus de TwoNav.
Cordialement

Hébé-coin
3 sat
3 sat


Revenir en haut Aller en bas

BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra Empty Re: BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra

Message par Monique Dim 18 Aoû 2024 - 8:12

Bonjour Hébé-coin,

Pourrais-tu préciser quel modèle TwoNav tu utilises et l'ajouter dans la case GPS de ton profil ?
Monique
Monique
*
*


Revenir en haut Aller en bas

BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra Empty Quelques options supplémentaires à l'application Web

Message par BenThon Dim 18 Aoû 2024 - 8:52

Bonjour à tous,
Dans une nouvelle version de l'application Web, voici des options supplémentaires.
[Vous devez être inscrit et connecté pour voir cette image]

- possibilité de modifier la balise name du GPX
- possibilité d'ajouter une balise desc au GPX

Une fois un GPX choisi dans l'application, celle-ci montre dans le champ de la balise name le contenu trouvé. Mais vous pouvez éditer complètement ce champ.
De plus, vous pouvez ajouter un contenu au champ desc. Ce champ n'existe pas nativement dans le GPX produit par les montres Galaxy Watch.

Voici ce que cela donne pour le GPX (disponible dans ce fil) de "La Randonnée du Pain" du 4 août 2024 à Thillay.
[Vous devez être inscrit et connecté pour voir cette image]

Par défaut, dans la balise name, j'ai ajouté "Galaxy Watch" au contenu préexistant.

Amicalement,
Benoît

Voici le code de cette nouvelle version :
Code:
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8" >
<title>Galaxy Watch vers Basecamp</title>
<meta name="author" content="BenThon & al">
<meta name="description" content="Application Web pour corriger les traces produites par les Galaxy Watch, pour permettre l"importation dans BaseCamp">
<meta name="revised" content="samedi 17 août 2024">
<style>
#grid {
    display: grid;
    grid-template-columns: auto auto;
}
textarea {
    margin-left: 20px;
    margin-right: 20px;
    resize: none;
    vertical-align: top;
}
</style>
</head>
<body>
    <div id="grid">
        <div id="infile">
            <input id="inputfile" type="file" accept="application/gpx" autocomplete="off">
        </div>
        <div id="outfile">
            <button id="downloadlink">Sauve GPX corrigé</button>
            <input type="string" id="outputfile" value="fichier_en_sortie.gpx" autocomplete="off" size= 40><br/><br/>
            <input type="checkbox" id="extsup" name="extsup" />
            <label for="extsup">Supprimer les <i><b>extensions</b></i> (ex : <b>fréquence cardiaque</b> - <b>hr</b>)</label><br/>
            <input type="checkbox" id="timesup" name="timesup" />
            <label for="timesup">Supprimer les <i><b>données temporelles</b></i> (<b>time</b>)</label><br/>
            <input type="checkbox" id="altsup" name="altsup" />
            <label for="altsup">Supprimer les <i><b>données d'altitude</b></i> (<b>ele</b>)</label><br/><br/>
            <label for="nomgpx">Balise <<b>name</b>> éditable : </label>
            <input type="text" id="nomgpx" name="nomgpx" value="..." size= 40><br/><br/>
            <label for="descgpx">Balise <<b>desc</b>> ajouter : </label>
            <input type="text" id="descgpx" name="descgpx" placeholder="Mettre une description ici" size= 40>
        </div>
        <div id="comments"></div>
    </div>
<script>
const exercisetypenb = [ 0 , 1001 , 1002 , 2001 , 2002 , 2003 , 3001 , 3002 , 3003 , 4001 , 4002 , 4003 , 4004 , 4005 , 4006 , 5001 , 5002 , 6001 , 6002 , 6003 , 6004 , 6005 , 7002 , 7003 , 8001 , 8002 , 8003 , 9001 , 9002 , 10001 , 10002 , 10003 , 10004 , 10005 , 10006 , 10007 , 10008 , 10009 , 10010 , 10011 , 10012 , 10013 , 10014 , 10015 , 10016 , 10017 , 10018 , 10019 , 10020 , 10021 , 10022 , 10023 , 10024 , 10025 , 10026 , 10027 , 11001 , 11002 , 11003 , 11004 , 11005 , 11007 , 11008 , 11009 , 12001 , 13001 , 13002 , 13003 , 13004 , 13005 , 14001 , 14002 , 14003 , 14004 , 14005 , 14006 , 14007 , 14008 , 14009 , 14010 , 14011 , 14012 , 14013 , 15001 , 15002 , 15003 , 15004 , 15005 , 15006 , 16001 , 16002 , 16003 , 16004 , 16006 , 16007 , 16008 , 16009 ]

const exercisetypeval =
['Type personnalisé','Marche','Course','Baseball, général','Softball, général','Cricket','Golf, général','Billard','Bowling, piste','Hockey','Rugby, touch, non compétitif','Basket-ball, général','Football, général (Soccer)','Handball, général','Football américain, général, touch','Volley-ball, général, équipe de 6 à 9 membres, non compétitif','Beach-volley','Squash, général','Tennis, général','Badminton, compétitif','Tennis de table','Racquetball, général','Boxe, sur le ring','Arts martiaux, rythme modéré (Judo, Jujitsu, Karaté, Taekwondo)','Ballet, général, répétition ou cours','Danse, général (Fork, Irish step, Polka)','Danse de salon, rapide','Pilates','Yoga','Stretching','Corde à sauter, rythme modéré (100 à 120 sauts/min), saut à 2 pieds','Hula-hoop','Pompes (pompes)','Tractions (Chin-up)','Abdominaux','Circuit training, effort modéré','Alpinisme','Sauts avec écart','Burpee','Développé couché','Flexion sur jambes','Fentes','Presse à cuisses','Extensions de jambes','Flexions des jambes','Extensions du dos','Tirages latéraux','Soulevés de terre','Développé épaules','Élévations avant','Élévations latérales','Enroulement vertébral','Relevés de jambes','Planche','Flexions des bras','Extensions de bras','Patin à roues alignées, rythme modéré','Deltaplane','Tir au pistolet','Tir à l"arc, hors chasse','Équitation, général','Vélo','Disque volant, général, jeu','Patinage à roulettes','Aérobic, général','Randonnée','Escalade, difficulté faible à modérée','Randonnée pédestre','VTT, général','Course d"orientation','Natation, générale, tranquille, pas de longueurs','Aquagym','Canoë, en général, pour le plaisir','Voile, loisir, navigation hauturière','Plongée sous-marine, généralités','Plongée en apnée','Kayak, effort modéré','Kitesurf','Rafting','Rameur, général, pour le plaisir','Planche à voile, généralités','Yachting, loisirs','Ski nautique','Machine à pas','Appareil de musculation','Vélo d"appartement, effort modéré à vigoureux (90-100 watts)','Rameur','Tapis de course, combinaison de jogging et de marche','Vélo elliptique, effort modéré','Ski de fond, général, vitesse modérée (4,0~4,9 mph)','Ski, général, descente, effort modéré','Danse sur glace','Patinage sur glace, général','Hockey sur glace, général','Snowboard, général, effort modéré','Ski alpin, général, effort modéré','Randonnée en raquettes, effort modéré']

var inputfile = document.getElementById("inputfile");
var outputfile = document.getElementById("outputfile");
var checksup = document.getElementById("extsup");
var checksuptime = document.getElementById("timesup");
var checksupalt = document.getElementById("altsup");
var downloadlink = document.getElementById("downloadlink");
var comments = document.getElementById("comments");
var modif_text;
var sauve_text;
var val_decode;

inputfile.addEventListener("change", function() {
    if (inputfile.files.length) {
        handleFile(inputfile.files[0]);
    }
});
downloadlink.addEventListener("click",download,false);
function handleFile(file) {
    var outputfile = document.getElementById("outputfile");
    outputfile.value=file.name.replace(/\.gpx/,"_corrigé.gpx");
    file.text().then(postprocess).catch(catchAll);
}
function catchAll(val) {
    comments.innerHTML="error: "+val;
}

// Conversion du temps de l"entraînement qui est en secondes
function Conversion_Temps(num)
 {
  // Calcul du nombre de minutes
  var minutes = Math.floor(num / 60000);  

  // Calcul du nombre de secondes
  var secondes = Math.floor((num % 60000) / 1000);

  // Résultat dans le format "minutes:secondes"
  return minutes + """ + secondes + """;        
};

function postprocess(text) {
    comments.innerHTML="";
    modif_text = text.replace("<metadate>", "<metadata><time>")
                     .replace("</metadate>", "</time></metadata>")
                     .replace("<exerciseinfo>", "<!--<exerciseinfo>")
                     .replace("</exerciseinfo>", "</exerciseinfo>-->");

    if (modif_text.search("<metadata><time>")>=0) {
        comments.innerHTML+="<br/>Correction de <b>"metadate"</b> en balise Time<br/>";
    }
    if (modif_text.search("<!--<exerciseinfo>")>=0) {
        comments.innerHTML+="<b>"exerciseinfo"</b> mis en commentaire<br/><br/>";
        comments.innerHTML+="<b>Contenu de "exerciseinfo" :</b><br/><br/>";

        // Utiliser la fonction pour extraire les valeurs

        const parser = new DOMParser();
        const xmlDoc = parser.parseFromString(text, "application/xml");
        const exerciseType = xmlDoc.getElementsByTagName("exercisetype")[0].textContent;
        const distance = xmlDoc.getElementsByTagName("distance")[0].textContent;
        const elevationGain = xmlDoc.getElementsByTagName("elevationgain")[0].textContent;
        const avgGradient = xmlDoc.getElementsByTagName("avggradient")[0].textContent;
        const duration = xmlDoc.getElementsByTagName("duration")[0].textContent;
        const avgSpeed = xmlDoc.getElementsByTagName("avgspeed")[0].textContent;
        var GPXnom = xmlDoc.getElementsByTagName("name")[0].textContent;
        nomgpx.value = "Galaxy Watch " + GPXnom.replace(/\.gpx/,"");

    if (modif_text.search("<desc>")>=0) {
        descgpx.value = xmlDoc.getElementsByTagName("desc")[0].textContent;
    } else {
        descgpx.value = '';
    }

  // Extraire les valeurs des balises

        const found = exercisetypenb.findIndex((element) => element == exerciseType);
        const exercice_txt = exercisetypeval[found];
        const distance_txt = (distance / 1000).toFixed(2) + " km";
        const deniv_txt = Math.floor(elevationGain) + " mètres";
        const pente_txt = Math.floor(avgGradient) + " %";
        const temps_txt = Conversion_Temps(duration);
        const vitesse_txt = (avgSpeed * 3.6).toFixed(2) + " km/h";

        val_decode = 'type d\'exercice = ' + exercice_txt + '\n' + 'distance = ' + distance_txt + '\n' +
                     'dénivelé = ' + deniv_txt + '\n' + 'pente moyenne = ' + pente_txt + '\n' + 'durée = ' +
                     temps_txt + '\n' + 'vitesse moyenne = ' + vitesse_txt + '\n';

        modif_text = modif_text.replace("</exerciseinfo>-->",  
                     "</exerciseinfo>\n\n******************************\n" +
                     val_decode + "******************************\n-->");

        comments.innerHTML+="<b>type d\'exercice = </b>" + exerciseType + ' (<b>' + exercice_txt + "</b>)<br/>";
        comments.innerHTML+="<b>distance = </b>" + distance_txt + "<br/>";
        comments.innerHTML+="<b>dénivelé = </b>" + deniv_txt + "<br/>";
        comments.innerHTML+="<b>pente moyenne = </b>" + pente_txt + "<br/>";
        comments.innerHTML+="<b>durée = </b>" + temps_txt + "<br/>";
        comments.innerHTML+="<b>vitesse moyenne = </b>" + vitesse_txt + "<br/>";

    }
}
function download() {
    sauve_text = modif_text;
    sauve_text = sauve_text.replace(/<desc>[\s\S]*?<\/desc>\n/g, '');
    sauve_text = sauve_text.replace(/<name>[\s\S]*?<\/name>/g, '<name>' + nomgpx.value + '<\/name>\n<desc>' + descgpx.value + '</desc>');

        // Supprimer les données de fréquence cardiaque et autres extensions spécifiques
        if (checksup.checked == true){
          sauve_text = sauve_text.replace(/<extensions>[\s\S]*?<\/extensions>\n/g, '');
        };
        // Supprimer les données temporelles
        if (checksuptime.checked == true){
          sauve_text = sauve_text.replace(/<metadata>[\s\S]*?<\/metadata>\n/g, '');
          sauve_text = sauve_text.replace(/<time>[\s\S]*?<\/time>\n/g, '');
        };
        // Supprimer les données d'altitude
        if (checksupalt.checked == true){
          sauve_text = sauve_text.replace(/<ele>[\s\S]*?<\/ele>\n/g, '');
        };

    var hiddenElement = document.createElement("a");
    hiddenElement.href = "data:application/gpx;charset=utf-8," + encodeURI(sauve_text);
    hiddenElement.target = "_blank";
    hiddenElement.download = outputfile.value;
    hiddenElement.click();
}
</script>
</body>
</html>

[EDIT de Monique : fichier zip ajouté]
Fichiers joints
BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra Attachment
galaxy_watch_vers_basecamp_nom.zip Vous n'avez pas la permission de télécharger les fichiers joints.(4 Ko) Téléchargé 2 fois
BenThon
BenThon
4 sat
4 sat


Revenir en haut Aller en bas

BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra Empty Re: BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra

Message par BenThon Dim 18 Aoû 2024 - 8:58

Message privé envoyé à Hébé-Coin :

Bonjour,
Pourrais-tu m'envoyer un GPX tel que sorti du TwoNav et me dire ce qui n'est pas reconnu par BaseCamp ?
Effectivement, je pourrai adapter l'application pour cela.
Merci et bonne journée.
BenThon
BenThon
4 sat
4 sat


Revenir en haut Aller en bas

BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra Empty Ultime (??? ????) amélioration de l'appli web

Message par BenThon Lun 19 Aoû 2024 - 11:33

Une dernière amélioration de l'appli web :
- possibilité d'indenter le fichier de sortie (le GPX corrigé) d'un certain nombre d'espaces (de 1 à 6, à choisir). Valider la " case à cocher" et choisir le nombre d'espaces pour l'indentation.
[Vous devez être inscrit et connecté pour voir cette image]

Ceci permet une lecture plus aisée du fichier GPX, quand on le regarde en mode texte :
[Vous devez être inscrit et connecté pour voir cette image]

Le code de cette dernière version :
Code:
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8" >
<title>Galaxy Watch vers Basecamp</title>
<meta name="author" content="BenThon & al">
<meta name="description" content="Application Web pour corriger les traces produites par les Galaxy Watch, pour permettre l"importation dans BaseCamp">
<meta name="revised" content="lundi 19 août 2024">
<style>
#grid {
    display: grid;
    grid-template-columns: auto auto;
}
textarea {
    margin-left: 20px;
    margin-right: 20px;
    resize: none;
    vertical-align: top;
}
input[type=text] {
                padding: 6px 12px;
                font-size: 16px;
                font-weight: 400;
                line-height: 1.5;
                color: #212529;
                background-color: #fff;
                background-clip: padding-box;
                border: 1px solid #ced4da;
                appearance: none;
                border-radius: 4px;
                transition: border-color .15s ease-in-out,box-shadow .15s ease-in-out;
                :focus{
                    color: #212529;
                    background-color: #fff;
                    border-color: #86b7fe;
                    outline: 0;
                    box-shadow: 0 0 0 0.25rem rgb(13 110 253 / 25%);
                  }
                }
</style>
</head>
<body>
    <div id="grid">
        <div id="infile">
            <input id="inputfile" type="file" accept="application/gpx" autocomplete="off">
        </div>
        <div id="outfile">
            <button id="downloadlink">Sauve GPX corrigé</button>
            <input type="string" id="outputfile" value="fichier_en_sortie.gpx" autocomplete="off" size= 40><br/><br/>
            <input type="checkbox" id="extsup" name="extsup" />
            <label for="extsup">Supprimer les <i><b>extensions</b></i> (ex : <b>fréquence cardiaque</b> - <b>hr</b>)</label><br/>
            <input type="checkbox" id="timesup" name="timesup" />
            <label for="timesup">Supprimer les <i><b>données temporelles</b></i> (<b>time</b>)</label><br/>
            <input type="checkbox" id="altsup" name="altsup" />
            <label for="altsup">Supprimer les <i><b>données d'altitude</b></i> (<b>ele</b>)</label><br/><br/>
            <label for="nomgpx">Balise <<b>name</b>> éditable : </label>
            <input type="text" id="nomgpx" name="nomgpx" value="..." size= 40><br/><br/>
            <label for="descgpx">Balise <<b>desc</b>> ajouter : </label>
            <input type="text" id="descgpx" name="descgpx" placeholder="Mettre une description ici" size= 40><br/><br/>
            <input type="checkbox" id="indentgpx" name="indentgpx" />
            <label for="indentgpx"><i><b>Indenter</b></i> le fichier corrigé de </label>
            <select id="nb_espaces">
               <option value=1>1 espace</option>
               <option value=2>2 espaces</option>
               <option value=3>3 espaces</option>
               <option value=4 selected>4 espaces</option>
               <option value=5>5 espaces</option>
               <option value=6>6 espaces</option>
            </select><br/><br/>
        </div>
        <div id="comments"></div>
    </div>
<script>
const exercisetypenb = [ 0 , 1001 , 1002 , 2001 , 2002 , 2003 , 3001 , 3002 , 3003 , 4001 , 4002 , 4003 , 4004 , 4005 , 4006 , 5001 , 5002 , 6001 , 6002 , 6003 , 6004 , 6005 , 7002 , 7003 , 8001 , 8002 , 8003 , 9001 , 9002 , 10001 , 10002 , 10003 , 10004 , 10005 , 10006 , 10007 , 10008 , 10009 , 10010 , 10011 , 10012 , 10013 , 10014 , 10015 , 10016 , 10017 , 10018 , 10019 , 10020 , 10021 , 10022 , 10023 , 10024 , 10025 , 10026 , 10027 , 11001 , 11002 , 11003 , 11004 , 11005 , 11007 , 11008 , 11009 , 12001 , 13001 , 13002 , 13003 , 13004 , 13005 , 14001 , 14002 , 14003 , 14004 , 14005 , 14006 , 14007 , 14008 , 14009 , 14010 , 14011 , 14012 , 14013 , 15001 , 15002 , 15003 , 15004 , 15005 , 15006 , 16001 , 16002 , 16003 , 16004 , 16006 , 16007 , 16008 , 16009 ]

const exercisetypeval =
['Type personnalisé','Marche','Course','Baseball, général','Softball, général','Cricket','Golf, général','Billard','Bowling, piste','Hockey','Rugby, touch, non compétitif','Basket-ball, général','Football, général (Soccer)','Handball, général','Football américain, général, touch','Volley-ball, général, équipe de 6 à 9 membres, non compétitif','Beach-volley','Squash, général','Tennis, général','Badminton, compétitif','Tennis de table','Racquetball, général','Boxe, sur le ring','Arts martiaux, rythme modéré (Judo, Jujitsu, Karaté, Taekwondo)','Ballet, général, répétition ou cours','Danse, général (Fork, Irish step, Polka)','Danse de salon, rapide','Pilates','Yoga','Stretching','Corde à sauter, rythme modéré (100 à 120 sauts/min), saut à 2 pieds','Hula-hoop','Pompes (pompes)','Tractions (Chin-up)','Abdominaux','Circuit training, effort modéré','Alpinisme','Sauts avec écart','Burpee','Développé couché','Flexion sur jambes','Fentes','Presse à cuisses','Extensions de jambes','Flexions des jambes','Extensions du dos','Tirages latéraux','Soulevés de terre','Développé épaules','Élévations avant','Élévations latérales','Enroulement vertébral','Relevés de jambes','Planche','Flexions des bras','Extensions de bras','Patin à roues alignées, rythme modéré','Deltaplane','Tir au pistolet','Tir à l"arc, hors chasse','Équitation, général','Vélo','Disque volant, général, jeu','Patinage à roulettes','Aérobic, général','Randonnée','Escalade, difficulté faible à modérée','Randonnée pédestre','VTT, général','Course d"orientation','Natation, générale, tranquille, pas de longueurs','Aquagym','Canoë, en général, pour le plaisir','Voile, loisir, navigation hauturière','Plongée sous-marine, généralités','Plongée en apnée','Kayak, effort modéré','Kitesurf','Rafting','Rameur, général, pour le plaisir','Planche à voile, généralités','Yachting, loisirs','Ski nautique','Machine à pas','Appareil de musculation','Vélo d"appartement, effort modéré à vigoureux (90-100 watts)','Rameur','Tapis de course, combinaison de jogging et de marche','Vélo elliptique, effort modéré','Ski de fond, général, vitesse modérée (4,0~4,9 mph)','Ski, général, descente, effort modéré','Danse sur glace','Patinage sur glace, général','Hockey sur glace, général','Snowboard, général, effort modéré','Ski alpin, général, effort modéré','Randonnée en raquettes, effort modéré']

var inputfile = document.getElementById("inputfile");
var outputfile = document.getElementById("outputfile");
var checksup = document.getElementById("extsup");
var checksuptime = document.getElementById("timesup");
var checksupalt = document.getElementById("altsup");
var downloadlink = document.getElementById("downloadlink");
var comments = document.getElementById("comments");
var modif_text;
var sauve_text;
var val_decode;

inputfile.addEventListener("change", function() {
    if (inputfile.files.length) {
        handleFile(inputfile.files[0]);
    }
});
downloadlink.addEventListener("click",download,false);
function handleFile(file) {
    var outputfile = document.getElementById("outputfile");
    outputfile.value=file.name.replace(/\.gpx/,"_corrigé.gpx");
    file.text().then(postprocess).catch(catchAll);
}
function catchAll(val) {
    comments.innerHTML="error: "+val;
}

// Conversion du temps de l"entraînement qui est en secondes
function Conversion_Temps(num)
 {
  // Calcul du nombre de minutes
  var minutes = Math.floor(num / 60000);  

  // Calcul du nombre de secondes
  var secondes = Math.floor((num % 60000) / 1000);

  // Résultat dans le format "minutes:secondes"
  return minutes + """ + secondes + """;        
};

function postprocess(text) {
    comments.innerHTML="";
    modif_text = text.replace("<metadate>", "<metadata><time>")
                     .replace("</metadate>", "</time></metadata>")
                     .replace("<exerciseinfo>", "<!--<exerciseinfo>")
                     .replace("</exerciseinfo>", "</exerciseinfo>-->");

    if (modif_text.search("<metadata><time>")>=0) {
        comments.innerHTML+="<br/>Correction de <b>"metadate"</b> en balise Time<br/>";
    }
    if (modif_text.search("<!--<exerciseinfo>")>=0) {
        comments.innerHTML+="<b>"exerciseinfo"</b> mis en commentaire<br/><br/>";
        comments.innerHTML+="<b>Contenu de "exerciseinfo" :</b><br/><br/>";

        // Utiliser la fonction pour extraire les valeurs

        const parser = new DOMParser();
        const xmlDoc = parser.parseFromString(text, "application/xml");
        const exerciseType = xmlDoc.getElementsByTagName("exercisetype")[0].textContent;
        const distance = xmlDoc.getElementsByTagName("distance")[0].textContent;
        const elevationGain = xmlDoc.getElementsByTagName("elevationgain")[0].textContent;
        const avgGradient = xmlDoc.getElementsByTagName("avggradient")[0].textContent;
        const duration = xmlDoc.getElementsByTagName("duration")[0].textContent;
        const avgSpeed = xmlDoc.getElementsByTagName("avgspeed")[0].textContent;
        var GPXnom = xmlDoc.getElementsByTagName("name")[0].textContent;
        nomgpx.value = "Galaxy Watch " + GPXnom.replace(/\.gpx/,"");

    if (modif_text.search("<desc>")>=0) {
        descgpx.value = xmlDoc.getElementsByTagName("desc")[0].textContent;
    } else {
        descgpx.value = '';
    }

  // Extraire les valeurs des balises

        const found = exercisetypenb.findIndex((element) => element == exerciseType);
        const exercice_txt = exercisetypeval[found];
        const distance_txt = (distance / 1000).toFixed(2) + " km";
        const deniv_txt = Math.floor(elevationGain) + " mètres";
        const pente_txt = Math.floor(avgGradient) + " %";
        const temps_txt = Conversion_Temps(duration);
        const vitesse_txt = (avgSpeed * 3.6).toFixed(2) + " km/h";

        val_decode = 'type d\'exercice = ' + exercice_txt + '\n' + 'distance = ' + distance_txt + '\n' +
                     'dénivelé = ' + deniv_txt + '\n' + 'pente moyenne = ' + pente_txt + '\n' + 'durée = ' +
                     temps_txt + '\n' + 'vitesse moyenne = ' + vitesse_txt + '\n';

        modif_text = modif_text.replace("</exerciseinfo>-->",  
                     "</exerciseinfo>\n\n******************************\n" +
                     val_decode + "******************************\n-->");

        comments.innerHTML+="<b>type d\'exercice = </b>" + exerciseType + ' (<b>' + exercice_txt + "</b>)<br/>";
        comments.innerHTML+="<b>distance = </b>" + distance_txt + "<br/>";
        comments.innerHTML+="<b>dénivelé = </b>" + deniv_txt + "<br/>";
        comments.innerHTML+="<b>pente moyenne = </b>" + pente_txt + "<br/>";
        comments.innerHTML+="<b>durée = </b>" + temps_txt + "<br/>";
        comments.innerHTML+="<b>vitesse moyenne = </b>" + vitesse_txt + "<br/>";

    }
}

function formatXml(xml, rep) {
  const PADDING = ' '.repeat(rep); // taille d'indentation
  const reg = /(>)(<)(\/*)/g;
  let pad = 0;

    xml = xml.replace(/(\r\n|\n|\r)/gm, '\u0020').replace(/>\s+</g,'><');
    xml = xml.replace(/(>)(<)(\/*)/g, '$1\r\n$2$3');

  return xml.split('\r\n').map((node, index) => {
      let indent = 0;
      if (node.match(/.+<\/\w[^>]*>$/)) {
          indent = 0;
      } else if (node.match(/^<\/\w/) && pad > 0) {
          pad -= 1;
      } else if (node.match(/^<\w[^>]*[^\/]>.*$/)) {
          indent = 1;
      } else {
          indent = 0;
      }

      pad += indent;

      return PADDING.repeat(pad - indent) + node;
  }).join('\r\n');
}

function download() {
    sauve_text = modif_text;
    sauve_text = sauve_text.replace(/<desc>[\s\S]*?<\/desc>\n/g, '');
    sauve_text = sauve_text.replace(/<name>[\s\S]*?<\/name>/g, '<name>' + nomgpx.value + '<\/name>\n<desc>' + descgpx.value + '</desc>');

        // Supprimer les données de fréquence cardiaque et autres extensions spécifiques
        if (checksup.checked == true){
          sauve_text = sauve_text.replace(/<extensions>[\s\S]*?<\/extensions>\n/g, '');
        };
        // Supprimer les données temporelles
        if (checksuptime.checked == true){
          sauve_text = sauve_text.replace(/<metadata>[\s\S]*?<\/metadata>\n/g, '');
          sauve_text = sauve_text.replace(/<time>[\s\S]*?<\/time>\n/g, '');
        };
        // Supprimer les données d'altitude
        if (checksupalt.checked == true){
          sauve_text = sauve_text.replace(/<ele>[\s\S]*?<\/ele>\n/g, '');
        };

var el = document.getElementById("nb_espaces");
var val = el[el.selectedIndex].value;

        if (indentgpx.checked == true){
          sauve_text = formatXml(sauve_text, val);
        };

    var hiddenElement = document.createElement("a");
    hiddenElement.href = "data:application/gpx;charset=utf-8," + encodeURI(sauve_text);
    hiddenElement.target = "_blank";
    hiddenElement.download = outputfile.value;
    hiddenElement.click();
}
</script>
</body>
</html>

[EDIT de Monique : fichier ".zip" correspondant ajouté]
Fichiers joints
BaseCamp - Fréquence Cardiaque - Montre connectée Samsung Watch 7 Ultra Attachment
galaxy_watch_vers_basecamp_indent.zip Vous n'avez pas la permission de télécharger les fichiers joints.(5 Ko) Téléchargé 4 fois
BenThon
BenThon
4 sat
4 sat


Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum