Giter VIP home page Giter VIP logo

Comments (10)

karaul avatar karaul commented on August 16, 2024

Hi

If needed I can provide the relevant part of my fit file

Yes, please send the *.fit file. I am travelling till the Russian New Year (Jan 14) being now in Russia, but since I have an access to the gmale and Git, I can think how to fix it.

Happy New Year!

from fitplotter.

rucksman avatar rucksman commented on August 16, 2024

I invested some time today to understand the functionality, but I did not find the exact point where to insert the new values. I see that I have to create a new array in "chartdata" (function getDataFromFitForCanvasJS). From what I see in the code the array comes from the options in ylist. But I did not clearly see where the list is filled from. This is probably due to the fact that I already modified the code a little bit to fit my needs (I have 2 arrays in chartdata: heart rate and speed).

This is how my fit file looks like after parsing. Shortened and redacted it due to privacy reasons, but it should be enough to see how the values look like:

{
  "activity": {
    "sessions": [
      {
        "laps": [
          {
            "records": [
              {
                "timestamp": "2023-12-29T10:36:05.000Z",
                "elapsed_time": 0,
                "timer_time": 0,
                "position_lat": ...,
                "position_long": ...,
                "distance": 0.00027,
                "altitude": 0.04660000000000002,
                "speed": 0,
                "heart_rate": 159,
                "temperature": -257.15
              },
              ...
            ],
            "lengths": []
          }
        ]
      }
    ],
    "events": [
      {
        "timestamp": "2023-12-29T10:36:05.000Z",
        "data": 0,
        "event": "timer",
        "event_type": "start",
        "event_group": 0
      },
      {
        "timestamp": "2023-12-29T10:36:05.000Z",
        "data": 671159047,
        "event": "rear_gear_change",
        "event_type": "marker"
      },
      ...
    ],
    "hrv": [],
    "device_infos": [
    ],
    "developer_data_ids": [],
    "field_descriptions": [],
    "sports": [
      { "name": "GRAVEL", "sport": "cycling", "sub_sport": "gravel_cycling" }
    ]
  }
}

The vaule most interesting is in "events" and has the event type "rear_gear_change". I have to check in the official Garmin SDK what kind of data this is because of course this should be an integer between 1 and 12.

So it would be very nice if you could give me a hint how to add these values as a new array in chartdata. I want to upgrade my bike also with a powermeter, so it would be useful for me to understand how the chartdata object is created in order to be able to add power data on my own without having to bother you again.

from fitplotter.

karaul avatar karaul commented on August 16, 2024

If your metric is the averaged one between events, then the x-axis must be laps.

Select in x-axis droplisr lap-number, and then check metrics in the y-axis droplet.

To say more definitely, I need your fit file.

from fitplotter.

karaul avatar karaul commented on August 16, 2024

but I did not find the exact point where to insert the new values

The metrics are collected automatically by scanning the fit file, function prepareFitData, line 645

from fitplotter.

karaul avatar karaul commented on August 16, 2024

Probably, you can add into the function prepareFitData a cycle like
for (let k in data.events) { ...}
to fill the needed metric from events section

from fitplotter.

rucksman avatar rucksman commented on August 16, 2024

If your metric is the averaged one between events, then the x-axis must be laps.

Select in x-axis droplisr lap-number, and then check metrics in the y-axis droplet.

This does not work. If I change to lap_number, I have the options "event" and "event_type" in the dropdown. Both options show no data in the plot. I do not know what you mean by "metric is the averaged one between events". Obviously the "rear_gear_change" is an event that occurs when I change gears on the bike. So the timestamp does not match with the timestamps in records (only by a mere coincedence). So in the example from my post above, I did change gears here:

{
        "timestamp": "2023-12-29T10:36:05.000Z",
        "data": 671159047,
        "event": "rear_gear_change",
        "event_type": "marker"
},

data is uint8z according to the FitSDK. Will try to add a for loop, only the x field worries me. I have to check how you calculate this out of distance.

from fitplotter.

karaul avatar karaul commented on August 16, 2024

what you mean by "metric is the averaged one between events"

It was my mistake. The section events is not checked in prepareFitData.

from fitplotter.

rucksman avatar rucksman commented on August 16, 2024

Having a hard time to figure out how it could work ...

Added the following right after the loop for data.laps (around line 683):

for (let k in data.events) {
  if (data.events[k].event == 'rear_gear_change') {
    let event = data.events[k];
    D = new Date(event.timestamp);
    data.records[k].timestamp = D.getHours() + D.getMinutes() / 60 - timeoffset;
    data.records[k].gear = event.data;
  }
}

Now I have gear data in data.records. Problem now is that this data is not correctly shown in the chart. In my already modified view I only show speed and heart_rate on the y-axis (now gear as well) and distance on the x-axis. While speed and heart_rate appear in the chart at the right place related to distance, gear values are shown more or less one after the other right from the beginning until the amount of gear changes is reached (~50). So gear values are not properly displayed in relation to distance. So data.records[k].timestamp is wrong which is quite obvious as the counters (k) for records and events do not match . How and where do I have to make modifications to get the correct x-value (meaning pushing the gear change events to the correct place in the records array)? Second question: is there already a helper function somewhere in the project for converting uint8z values to correct values?

from fitplotter.

karaul avatar karaul commented on August 16, 2024

Explore my function getDataFromFitForCanvasJS, line 216., it is called from line 396.
You see there a check for x-axis, e.g. line 218. Introduce a flag variable for the gear, e.g.
if (fieldx === "timestamp_gear"){ here is the code to put data for the chart, put here gear's timestamps, as in line 221}

The second question

data is uint8z according to the FitSDK. Will try to add a for loop, only the x field worries me. I have to check how you calculate this out of distance

Do you mean out of the track (if not give me more explanations what do you want)? You have in the *.fit file
{
"timestamp": "2023-12-29T10:36:05.000Z",
"data": 0,
"event": "timer",
"event_type": "start",
"event_group": 0
},
the event_type": "start", and the corresponding timestamp. Check other timestamps with the "start" timestamp, to recognize whether the gear change before or after "start" event.

from fitplotter.

rucksman avatar rucksman commented on August 16, 2024

More confused than before. What is the difference between the code I entered around line 683 and the code you proposed in 218? I tried some variations, but no luck.

Just use one of your own .fit files. I had a look to the one in this repo (2021-01-26T17_13_43+00_00_6171809523.fit). There are 8 elements in the events array. My array looks like this:
image
So if you use for example the "undefined" events in your array as an equivalent to my "rear_gear_change" event, you can try to incorporate those values. This would be really of great help as I am stuck somehow at the moment.

from fitplotter.

Related Issues (5)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.