<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://forums.garmin.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Discussion - Recent Threads</title><link>https://forums.garmin.com/developer/fit-sdk/f/discussion</link><description>Discussion about all things FIT SDK</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Fri, 02 Oct 2026 07:41:28 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://forums.garmin.com/developer/fit-sdk/f/discussion" /><item><title>JS SDK decoder crash in #setAccumulatedField when a component field precedes its accumulated target field</title><link>https://forums.garmin.com/thread/445331?ContentTypeID=0</link><pubDate>Fri, 02 Oct 2026 07:41:28 GMT</pubDate><guid isPermaLink="false">a9571b57-dd57-479e-8763-8f8a603e40aa:b32000b7-1b1e-4e8c-8036-1769a268426a</guid><dc:creator>ravel</dc:creator><slash:comments>4</slash:comments><comments>https://forums.garmin.com/thread/445331?ContentTypeID=0</comments><wfw:commentRss>https://forums.garmin.com/developer/fit-sdk/f/discussion/445331/js-sdk-decoder-crash-in-setaccumulatedfield-when-a-component-field-precedes-its-accumulated-target-field/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;I ran into a second crash in #setAccumulatedField in the JS SDK. It&amp;#39;s related to this thread but has a different cause. The .components fix from this thread is already in 21.217.0. This one still happens there, with the default read() options and without includeUnknownData.&lt;/p&gt;
&lt;p&gt;Affected version:&amp;nbsp; 21.217.0 (latest)&lt;/p&gt;
&lt;p&gt;Error: TypeError: Cannot read properties of undefined (reading &amp;#39;0&amp;#39;)&lt;/p&gt;
&lt;p&gt;Trigger: a message definition contains a field with components that target an accumulated field, and that accumulated field itself, in that order. Real-world example: a Forerunner 255 triathlon file whose swim records contain both cycles (field 18, component &amp;rarr; total_cycles) and total_cycles (field 19, accumulated).&lt;/p&gt;
&lt;p&gt;Cause: in src/decoder.js, #setAccumulatedField (around line 725 in 21.217.0):&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;value = (((value / field.scale) - field.offset) + containingField.offset[i]) * containingField.scale[i];&lt;br /&gt;containingField comes from Object.values(message), so it&amp;#39;s the decoded value entry { rawFieldValue, fieldDefinitionNumber }, not the profile field. It has no offset/scale arrays.&lt;/p&gt;
&lt;p&gt;Impact: read() aborts and every following message is lost. With files that write the summary first, the sessions are decoded but every record is lost.&lt;/p&gt;
&lt;p&gt;Minimal reproduction:&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;import { Decoder, Encoder, Profile, Stream } from &amp;quot;@garmin/fitsdk&amp;quot;;&lt;/p&gt;
&lt;p&gt;const encoder = new Encoder();&lt;br /&gt;encoder.onMesg(Profile.MesgNum.FILE_ID, {&lt;br /&gt; type: &amp;quot;activity&amp;quot;,&lt;br /&gt; manufacturer: &amp;quot;development&amp;quot;,&lt;br /&gt; product: 0,&lt;br /&gt; timeCreated: new Date(&amp;quot;2024-01-01T00:00:00Z&amp;quot;),&lt;br /&gt;});&lt;br /&gt;for (let i = 0; i &amp;lt; 3; i++) {&lt;br /&gt; encoder.onMesg(Profile.MesgNum.RECORD, {&lt;br /&gt; timestamp: new Date(Date.UTC(2024, 0, 1, 0, 0, i)),&lt;br /&gt; cycles: 10 + i,&lt;br /&gt; totalCycles: 10 + i,&lt;br /&gt; });&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;const { messages, errors } = new Decoder(Stream.fromByteArray(encoder.close())).read();&lt;br /&gt;console.log(messages.recordMesgs.length, errors.map(String));&lt;br /&gt;// 21.217.0: 0 [ "TypeError: Cannot read properties of undefined (reading '0')" ]&lt;br /&gt;Suggested fix: look up the profile field of the containing field:&lt;/p&gt;
&lt;p&gt;&lt;br /&gt; if (targetField?.num == field.num &amp;amp;&amp;amp; targetField?.isAccumulated) {&lt;br /&gt;- value = (((value / field.scale) - field.offset) + containingField.offset[i]) * containingField.scale[i];&lt;br /&gt;+ const containingProfileField = messageDefinition.fields[containingField.fieldDefinitionNumber];&lt;br /&gt;+ value = (((value / field.scale) - field.offset) + containingProfileField.offset[i]) * containingProfileField.scale[i];&lt;br /&gt; }&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;With this change the reproduction decodes all 3 records (cycles/totalCycles 10, 11, 12), and the triathlon file decodes completely (4043 records, no errors).&lt;/p&gt;
&lt;p&gt;Other affected field pairs: in the profile, the same crash can occur for:&lt;/p&gt;
&lt;p&gt;record: cycles &amp;rarr; total_cycles&lt;br /&gt;record: compressed_speed_distance &amp;rarr; distance&lt;br /&gt;record: compressed_accumulated_power &amp;rarr; accumulated_power&lt;br /&gt;hr: event_timestamp_12 &amp;rarr; event_timestamp&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Thanks!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Add LICENSE(.txt) file to garmin/fit-python-sdk</title><link>https://forums.garmin.com/thread/444928?ContentTypeID=0</link><pubDate>Sat, 26 Sep 2026 07:44:14 GMT</pubDate><guid isPermaLink="false">a9571b57-dd57-479e-8763-8f8a603e40aa:0f805220-2049-4a6f-9ecd-68530bb71e50</guid><dc:creator>Matěj H&amp;#225;jek</dc:creator><slash:comments>1</slash:comments><comments>https://forums.garmin.com/thread/444928?ContentTypeID=0</comments><wfw:commentRss>https://forums.garmin.com/developer/fit-sdk/f/discussion/444928/add-license-txt-file-to-garmin-fit-python-sdk/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Hello, all FIT SDK repositories have a LICENSE(.txt) (Flexible and Interoperable Data Transfer (FIT) Protocol License) file, but the fit-python-sdk does not.&lt;/p&gt;
&lt;p&gt;Yes, the licence is in the file headers, but the full licence text is nowhere to be found in the repo.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Adding LICENSE.txt (or without extension)&amp;nbsp;would also require checking and updating the pyproject.toml file so it points to the license file correctly.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I mention the .txt extension because all other FIT SDK repositories use it.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Bug report for https://github.com/garmin/fit-python-sdk</title><link>https://forums.garmin.com/thread/444478?ContentTypeID=0</link><pubDate>Sat, 19 Sep 2026 00:19:01 GMT</pubDate><guid isPermaLink="false">a9571b57-dd57-479e-8763-8f8a603e40aa:d42de63e-e195-40a2-9603-b82db8629504</guid><dc:creator>9678801</dc:creator><slash:comments>2</slash:comments><comments>https://forums.garmin.com/thread/444478?ContentTypeID=0</comments><wfw:commentRss>https://forums.garmin.com/developer/fit-sdk/f/discussion/444478/bug-report-for-https-github-com-garmin-fit-python-sdk/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;&lt;span style="font-family:monospace;"&gt;&lt;span style="background-color:#ffffff;color:#000000;font-weight:bold;"&gt;As there is no way on github to submit an bug report, please find it here:&lt;br /&gt;&lt;br /&gt;Subject:&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &amp;nbsp;&lt;span style="background-color:#ffffff;color:#b1b9f9;"&gt;Encoder&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;: &lt;/span&gt;&lt;span style="background-color:#ffffff;color:#b1b9f9;"&gt;_MesgDefinition.equals()&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; ignores field order, causing silent data corruption when the same field set is written in a different order &lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &amp;nbsp;&lt;span style="background-color:#ffffff;color:#000000;font-weight:bold;"&gt;Description:&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;br /&gt; &lt;br /&gt;When using &lt;span style="background-color:#ffffff;color:#b1b9f9;"&gt;garmin_fit_sdk.Encoder&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; to write two messages with the same &lt;/span&gt;&lt;span style="background-color:#ffffff;color:#b1b9f9;"&gt;mesg_num&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; and the same &lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;set&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; of field names, but inserted in a different order in the dict passed to &lt;/span&gt;&lt;span style="background-color:#ffffff;color:#b1b9f9;"&gt;write_mesg()&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;, the second &lt;/span&gt;message&amp;#39;s data gets silently corrupted on decode &amp;mdash; with zero errors raised anywhere in either the encode or decode path. &lt;br /&gt; &lt;br /&gt; &amp;nbsp;&lt;span style="background-color:#ffffff;color:#000000;font-weight:bold;"&gt;Root cause&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &amp;nbsp;&lt;span style="background-color:#ffffff;color:#b1b9f9;"&gt;_MesgDefinition.equals()&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; (&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#b1b9f9;"&gt;garmin_fit_sdk/mesg_definition.py&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;) compares two field-definition lists using an order-insensitive check: &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:monospace;"&gt;&lt;pre class="ui-code" data-mode="python"&gt; for lhs in self.field_definitions:
     found = any(
         lhs[&amp;#39;num&amp;#39;] == rhs[&amp;#39;num&amp;#39;]
         and lhs[&amp;#39;size&amp;#39;] == rhs[&amp;#39;size&amp;#39;]
         and lhs[&amp;#39;base_type&amp;#39;] == rhs[&amp;#39;base_type&amp;#39;]
         for rhs in other.field_definitions
     )
     if not found:
         return False&lt;/pre&gt;&lt;br /&gt; &lt;br /&gt;This only checks that the same fields are &lt;span style="background-color:#ffffff;color:#000000;"&gt;present&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;, never that they&amp;#39;re in the same &lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;position&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;. But the FIT wire format is strictly positional: a Definition Message declares field order once, and&amp;nbsp;&lt;/span&gt;every following Data Message for that local slot is raw bytes with no field names &amp;mdash; the decoder matches byte N to whatever field is in position N of the &lt;span style="background-color:#ffffff;color:#000000;"&gt;last&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; Definition Message it saw for that&amp;nbsp;&lt;/span&gt;slot. &lt;br /&gt; &lt;br /&gt;&lt;span style="background-color:#ffffff;color:#b1b9f9;"&gt;Encoder.on_mesg()&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; uses &lt;/span&gt;&lt;span style="background-color:#ffffff;color:#b1b9f9;"&gt;equals()&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; (via &lt;/span&gt;&lt;span style="background-color:#ffffff;color:#b1b9f9;"&gt;_lookup_local_mesg_num&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;) to decide whether it can skip writing a new Definition Message and reuse the currently-active one. Because &lt;/span&gt;&lt;span style="background-color:#ffffff;color:#b1b9f9;"&gt;equals()&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; ignores order, &lt;/span&gt;it answers &amp;quot;yes, same&amp;quot; for two messages whose fields are actually in a different order &amp;mdash; so the Encoder skips emitting a new Definition Message, while still writing the &lt;span style="background-color:#ffffff;color:#000000;"&gt;new&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; message&amp;#39;s data bytes &lt;/span&gt;in &lt;span style="background-color:#ffffff;color:#000000;"&gt;its own&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; (different) order. The decoder is left using the stale Definition Message&amp;#39;s field order to interpret data bytes that were actually written in a different order &amp;mdash; every field after &lt;/span&gt;the first divergence point gets misinterpreted. &lt;br /&gt; &lt;br /&gt; &amp;nbsp;&lt;span style="background-color:#ffffff;color:#000000;font-weight:bold;"&gt;Minimal reproduction:&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;pre class="ui-code" data-mode="python"&gt; from garmin_fit_sdk import Encoder, Decoder, Stream
 import datetime

 encoder = Encoder()
 encoder.write_mesg({
     &amp;#39;mesg_num&amp;#39;: 0, &amp;#39;type&amp;#39;: &amp;#39;workout&amp;#39;, &amp;#39;manufacturer&amp;#39;: &amp;#39;development&amp;#39;,
     &amp;#39;product&amp;#39;: 1, &amp;#39;product_name&amp;#39;: &amp;#39;x&amp;#39;, &amp;#39;serial_number&amp;#39;: 1,
     &amp;#39;time_created&amp;#39;: datetime.datetime.now(datetime.timezone.utc),
 })
 encoder.write_mesg({&amp;#39;mesg_num&amp;#39;: 26, &amp;#39;wkt_name&amp;#39;: &amp;#39;repro&amp;#39;, &amp;#39;sport&amp;#39;: &amp;#39;cycling&amp;#39;, &amp;#39;num_valid_steps&amp;#39;: 2})

 # Same 5 field NAMES as the second message below, different insertion order
 encoder.write_mesg({
     &amp;#39;mesg_num&amp;#39;: 27, &amp;#39;message_index&amp;#39;: 0,
     &amp;#39;intensity&amp;#39;: &amp;#39;active&amp;#39;, &amp;#39;duration_type&amp;#39;: &amp;#39;time&amp;#39;, &amp;#39;duration_value&amp;#39;: 300000,
     &amp;#39;target_type&amp;#39;: &amp;#39;power&amp;#39;, &amp;#39;target_value&amp;#39;: 2,
 })
 encoder.write_mesg({
     &amp;#39;mesg_num&amp;#39;: 27, &amp;#39;message_index&amp;#39;: 1,
     &amp;#39;duration_type&amp;#39;: &amp;#39;repeat_until_steps_cmplt&amp;#39;, &amp;#39;duration_value&amp;#39;: 1,
     &amp;#39;target_value&amp;#39;: 3, &amp;#39;intensity&amp;#39;: &amp;#39;active&amp;#39;, &amp;#39;target_type&amp;#39;: &amp;#39;open&amp;#39;,
 })

 data = encoder.close()
 messages, errors = Decoder(Stream.from_byte_array(data)).read()
 print(&amp;#39;errors:&amp;#39;, errors)  # []  &amp;lt;-- no error reported at all
 for step in messages[&amp;#39;workout_step_mesgs&amp;#39;]:
     print(step) &lt;/pre&gt;&lt;br /&gt; &lt;br /&gt; &amp;nbsp;&lt;span style="background-color:#ffffff;color:#000000;font-weight:bold;"&gt;Expected:&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; the second &lt;/span&gt;&lt;span style="background-color:#ffffff;color:#b1b9f9;"&gt;workout_step&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; message decodes with &lt;/span&gt;&lt;span style="background-color:#ffffff;color:#b1b9f9;"&gt;duration_type=&amp;#39;repeat_until_steps_cmplt&amp;#39;&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;, &lt;/span&gt;&lt;span style="background-color:#ffffff;color:#b1b9f9;"&gt;duration_value=1&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;, &lt;/span&gt;&lt;span style="background-color:#ffffff;color:#b1b9f9;"&gt;target_value=3&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;. &lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;br /&gt; &amp;nbsp;&lt;span style="background-color:#ffffff;color:#000000;font-weight:bold;"&gt;Actual:&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; it decodes as complete nonsense (e.g. &lt;/span&gt;&lt;span style="background-color:#ffffff;color:#b1b9f9;"&gt;duration_type=&amp;#39;distance&amp;#39;&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;, &lt;/span&gt;&lt;span style="background-color:#ffffff;color:#b1b9f9;"&gt;target_type=&amp;#39;speed&amp;#39;&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;, &lt;/span&gt;&lt;span style="background-color:#ffffff;color:#b1b9f9;"&gt;intensity=&amp;#39;other&amp;#39;&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;, with garbage large integer values) &amp;mdash; silently, with &lt;/span&gt;&lt;span style="background-color:#ffffff;color:#b1b9f9;"&gt;errors == []&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;. &lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &amp;nbsp;&lt;span style="background-color:#ffffff;color:#000000;font-weight:bold;"&gt;Suggested fix:&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &amp;nbsp;In &lt;span style="background-color:#ffffff;color:#b1b9f9;"&gt;_MesgDefinition.__init__&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;, sort &lt;/span&gt;&lt;span style="background-color:#ffffff;color:#b1b9f9;"&gt;field_definitions&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; into a canonical order (by FIT field number, which is already available on each entry as &lt;/span&gt;&lt;span style="background-color:#ffffff;color:#b1b9f9;"&gt;fp['num']&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;) right after they&amp;#39;re built, before the &lt;/span&gt;existing &lt;span style="background-color:#ffffff;color:#b1b9f9;"&gt;equals()&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; check ever runs: &lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &amp;nbsp;&lt;span style="background-color:#ffffff;color:#18b218;"&gt;# in _MesgDefinition.__init__, right after the &amp;quot;for field_name in mesg:&amp;quot; loop&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;br /&gt; &amp;nbsp;&lt;span style="background-color:#ffffff;color:#18b218;"&gt;# that builds self.field_definitions, before the developer-fields section:&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &amp;nbsp;self.field_definitions.sort(key=&lt;span style="background-color:#ffffff;color:#1818b2;"&gt;lambda&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; fd: fd[&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#b21818;"&gt;&amp;#39;num&amp;#39;&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;]) &lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;br /&gt;This makes the already-existing (order-insensitive) &lt;span style="background-color:#ffffff;color:#b1b9f9;"&gt;equals()&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; check safe: since every definition is now built in the same canonical order for a given field set, &amp;quot;same fields present&amp;quot; and &amp;quot;same &lt;/span&gt;order&amp;quot; become equivalent, so no divergence between what &lt;span style="background-color:#ffffff;color:#b1b9f9;"&gt;equals()&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; considers identical and what&amp;#39;s actually written to the wire is possible anymore. It also has a nice side benefit over the &lt;/span&gt;alternative fix (making &lt;span style="background-color:#ffffff;color:#b1b9f9;"&gt;equals()&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; order-sensitive instead): callers that produce the same field set via different code paths/insertion orders now correctly collapse into the same reused &lt;/span&gt;Definition Message, rather than each needing its own &amp;mdash; smaller output, not just correct output.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;span style="background-color:#ffffff;color:#000000;font-weight:bold;"&gt;Alternative fix&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&amp;nbsp;Instead of canonicalizing field order, &lt;span style="background-color:#ffffff;color:#b1b9f9;"&gt;equals()&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; could be made order-sensitive &amp;mdash; comparing fields positionally rather than via &lt;/span&gt;&lt;span style="background-color:#ffffff;color:#b1b9f9;"&gt;any(...)&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; membership: &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:monospace;"&gt;&lt;pre class="ui-code" data-mode="python"&gt;
 def equals(self, other):
     if (self.global_message_number != other.global_message_number
             or len(self.field_definitions) != len(other.field_definitions)
             or len(self.developer_field_definitions) != len(other.developer_field_definitions)):
         return False
  
     for lhs, rhs in zip(self.field_definitions, other.field_definitions):
         if lhs[&amp;#39;num&amp;#39;] != rhs[&amp;#39;num&amp;#39;] or lhs[&amp;#39;size&amp;#39;] != rhs[&amp;#39;size&amp;#39;] or lhs[&amp;#39;base_type&amp;#39;] != rhs[&amp;#39;base_type&amp;#39;]:
             return False

     # ... developer field comparison unchanged
     return True&lt;/pre&gt;&lt;br /&gt; &lt;br /&gt;This also fixes the corruption &amp;mdash; two definitions with the same fields in a different order would now correctly be treated as &lt;span style="background-color:#ffffff;color:#000000;"&gt;different&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;, so the Encoder would emit a fresh Definition Message &lt;/span&gt;before the differently-ordered data, and decoding would work correctly again either way. &lt;br /&gt; &lt;br /&gt;The trade-off versus the canonical-ordering fix: it&amp;#39;s correct but not optimal. Two calls to &lt;span style="background-color:#ffffff;color:#b1b9f9;"&gt;write_mesg()&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; that happen to produce the same field set via different insertion orders (exactly the &lt;/span&gt;case in the reproduction above) would now always be treated as distinct definitions, each needing its own Definition Message written to the stream &amp;mdash; larger output than necessary, since the data itself is equivalent either way. Canonicalizing field order fixes the same bug while also letting those calls collapse into one reused definition, producing smaller files as well as correct ones.&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>BOA TARDE. COMO CONSIGO TRAINING API DA GARMIN PARA UM APP PARTICULAR,TENHO PROVAS REAIS QUE O APP FUNCIONA</title><link>https://forums.garmin.com/thread/444331?ContentTypeID=0</link><pubDate>Wed, 16 Sep 2026 20:30:17 GMT</pubDate><guid isPermaLink="false">a9571b57-dd57-479e-8763-8f8a603e40aa:616242ca-40b9-4183-97e5-e675a6f771c2</guid><dc:creator>5166054</dc:creator><slash:comments>0</slash:comments><comments>https://forums.garmin.com/thread/444331?ContentTypeID=0</comments><wfw:commentRss>https://forums.garmin.com/developer/fit-sdk/f/discussion/444331/boa-tarde-como-consigo-training-api-da-garmin-para-um-app-particular-tenho-provas-reais-que-o-app-funciona/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;BOA TARDE. COMO CONSIGO TRAINING API DA GARMIN PARA UM APP PARTICULAR,TENHO PROVAS REAIS QUE O APP FUNCIONA&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>希望SDK增加字段“下一个闹铃启动时间”，便于表盘设计，实现用户能在表盘上直接看到下一个闹铃时间</title><link>https://forums.garmin.com/thread/443762?ContentTypeID=0</link><pubDate>Wed, 09 Sep 2026 10:07:36 GMT</pubDate><guid isPermaLink="false">a9571b57-dd57-479e-8763-8f8a603e40aa:9fafbb3a-1ae7-46ee-b6b8-08575e0aa63c</guid><dc:creator>3020145</dc:creator><slash:comments>0</slash:comments><comments>https://forums.garmin.com/thread/443762?ContentTypeID=0</comments><wfw:commentRss>https://forums.garmin.com/developer/fit-sdk/f/discussion/443762/sdk/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;&lt;img style="max-height:240px;max-width:320px;" src="https://forums.garmin.com/resized-image/__size/640x480/__key/communityserver-discussions-components-files/502/pastedimage1788948398693v1.png" alt=" " /&gt;用户可以在表盘直观地看到下一个闹铃时间。&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Why REM and AWAKE colors so similar?</title><link>https://forums.garmin.com/thread/443749?ContentTypeID=0</link><pubDate>Wed, 09 Sep 2026 07:23:02 GMT</pubDate><guid isPermaLink="false">a9571b57-dd57-479e-8763-8f8a603e40aa:23f4c578-16dd-4aa2-932a-420548943e3f</guid><dc:creator>1449457</dc:creator><slash:comments>0</slash:comments><comments>https://forums.garmin.com/thread/443749?ContentTypeID=0</comments><wfw:commentRss>https://forums.garmin.com/developer/fit-sdk/f/discussion/443749/why-rem-and-awake-colors-so-similar/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;If there are tiny awake moments vs REM you can&amp;#39;t tell. UI should be much simpler, especially for metrics that are so vastly different.&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>what are the GPS "mode change" event message codes?</title><link>https://forums.garmin.com/thread/443720?ContentTypeID=0</link><pubDate>Tue, 08 Sep 2026 19:46:13 GMT</pubDate><guid isPermaLink="false">a9571b57-dd57-479e-8763-8f8a603e40aa:e0a10866-d643-4fc2-abfd-d19c21ab9c00</guid><dc:creator>RinseRepeat</dc:creator><slash:comments>0</slash:comments><comments>https://forums.garmin.com/thread/443720?ContentTypeID=0</comments><wfw:commentRss>https://forums.garmin.com/developer/fit-sdk/f/discussion/443720/what-are-the-gps-mode-change-event-message-codes/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;DC Rainmaker documented this series of events for GPS mode changes in the FIT file?&lt;/p&gt;
&lt;p&gt;This is neat, I was not aware that was recorded? Apparently that was in a Fenix7 series so I assume it survived to F8 and F9?&lt;/p&gt;
&lt;p&gt;Is it recorded in the single-band models?&lt;/p&gt;
&lt;p&gt;Would definitely like to decode those, curious of BeiDou is being used in continental US (hope so)&lt;/p&gt;
&lt;p&gt;ps. any chance a CIQ datafield can watch for these events in realtime and show on the screen the GPS band status?&lt;/p&gt;
&lt;p&gt;&lt;img style="max-height:240px;max-width:320px;" alt=" " src="https://forums.garmin.com/resized-image/__size/640x480/__key/communityserver-discussions-components-files/502/mode_2D00_change.png" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Recomputing session/lap HR aggregates after structural FIT edits: sane approach? (+ looking for weird multi-session files to test against)</title><link>https://forums.garmin.com/thread/443469?ContentTypeID=0</link><pubDate>Sat, 05 Sep 2026 11:47:44 GMT</pubDate><guid isPermaLink="false">a9571b57-dd57-479e-8763-8f8a603e40aa:914dc778-e9d5-4e82-a328-fcc6e001f1c5</guid><dc:creator>instezz</dc:creator><slash:comments>0</slash:comments><comments>https://forums.garmin.com/thread/443469?ContentTypeID=0</comments><wfw:commentRss>https://forums.garmin.com/developer/fit-sdk/f/discussion/443469/recomputing-session-lap-hr-aggregates-after-structural-fit-edits-sane-approach-looking-for-weird-multi-session-files-to-test-against/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Hi,&lt;br /&gt;&lt;br /&gt;been building a browser tool on the JS SDK (&lt;span&gt;currently 21.178.0)&amp;nbsp;&lt;/span&gt;that does a few structural rewrites to FIT files: splicing in a second sensor&amp;#39;s HR stream record-by-record (nearest-timestamp match against a chest-strap export), moving the boundary between sessions in a multisport file, and cropping/splitting a recording.&lt;/p&gt;
&lt;p&gt;After any of these, the original session/lap HR (and speed/cadence/power) aggregates are obviously stale, so I recompute avg/max by re-scanning the record window rather than trusting the device-written values. &lt;br /&gt;&lt;br /&gt;Two things I&amp;#39;d like a sanity check on from people who&amp;#39;ve been deeper in the profile than I have:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Lap&amp;rarr;session linkage&lt;/strong&gt;: I&amp;#39;m matching a lap/length to its owning session purely by timestamp overlap against the session&amp;#39;s window, since there&amp;#39;s no explicit foreign key from lap/length to session in the profile as far as I can tell. Is that the right assumption, or is there an index-based chain (message_index/first_lap_index/num_laps) that&amp;#39;s meant to be authoritative instead, that I&amp;#39;d be wrong to ignore? I couln&amp;#39;t figure it out.&lt;br /&gt;&lt;br /&gt; &lt;strong&gt;2. Boundary rounding&lt;/strong&gt;: when I split a lap that straddles a moved session boundary, I&amp;#39;ve had to add a ~1s tolerance because start_time is 1-second resolution while total_elapsed_time (which I use to derive an end timestamp) is sub-second, so a lap&amp;#39;s recorded start and an adjacent session&amp;#39;s derived end can disagree by up to a second for what&amp;#39;s really the same instant. Is that a known quirk of the encoding, or something specific to how certain devices round on write?&lt;/p&gt;
&lt;p&gt;Separately:&lt;br /&gt;&lt;br /&gt;if anyone has a genuinely odd multi-session FIT lying around (COROS, Suunto, Wahoo, or a Garmin multisport structure that doesn&amp;#39;t follow the usual swim&amp;rarr;bike&amp;rarr;run shape), I&amp;#39;d genuinely like to try my tool against it and see where it breaks. Free QA for me, and I&amp;#39;ll tell you if I find anything wrong with the file too. Or if you want to do that yourself and let me know how it went you can find the tool in live beta at &lt;a id="" href="https://thesplit.fit"&gt;https://thesplit.fit&lt;/a&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Thanks in advance for your help&amp;nbsp;&lt;br /&gt;Stefano&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>could a developer make a tiny FIT file to toggle the auto-brightness setting despite missing menu option</title><link>https://forums.garmin.com/thread/443433?ContentTypeID=0</link><pubDate>Fri, 04 Sep 2026 18:21:16 GMT</pubDate><guid isPermaLink="false">a9571b57-dd57-479e-8763-8f8a603e40aa:07083180-2d8b-4e68-9e44-c42840269af0</guid><dc:creator>RinseRepeat</dc:creator><slash:comments>0</slash:comments><comments>https://forums.garmin.com/thread/443433?ContentTypeID=0</comments><wfw:commentRss>https://forums.garmin.com/developer/fit-sdk/f/discussion/443433/could-a-developer-make-a-tiny-fit-file-to-toggle-the-auto-brightness-setting-despite-missing-menu-option/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;please take a look at my idea over here to force auto-brightness to turn off despite no menu option to do so&lt;/p&gt;
&lt;p&gt;I found in the settings.fit file there is such an option and I remember from the early HRV days we had the same problem with no menu option&amp;nbsp;to turn on logging so garmin released a tiny FIT file to import and toggle the option directly&lt;/p&gt;
&lt;p&gt;I&amp;#39;d like to try setting it to zero to see if it disables adaptive brightness on AMOLED on FenixE/8 series&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="https://forums.garmin.com/beta-program/fenix-8-series/f/community-discussion/443109/23-30-screen-brightness-issue/2060207"&gt;RE: 23.27 Screen Brightness issue&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://forums.garmin.com/beta-program/fenix-8-series/f/community-discussion/443109/23-27-screen-brightness-issue/2060207"&gt;https://forums.garmin.com/beta-program/fenix-8-series/f/community-discussion/443109/23-27-screen-brightness-issue/2060207&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Upload.fit datei nicht möglich</title><link>https://forums.garmin.com/thread/443273?ContentTypeID=0</link><pubDate>Wed, 02 Sep 2026 19:41:47 GMT</pubDate><guid isPermaLink="false">a9571b57-dd57-479e-8763-8f8a603e40aa:e2adb81c-8b09-486b-805b-05e77ff107c8</guid><dc:creator>4653394</dc:creator><slash:comments>0</slash:comments><comments>https://forums.garmin.com/thread/443273?ContentTypeID=0</comments><wfw:commentRss>https://forums.garmin.com/developer/fit-sdk/f/discussion/443273/upload-fit-datei-nicht-moglich/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;ich w&amp;uuml;rde gerne eine .fit datei hochladen, erstens wird meine .fit datei nicht erkannt, d.h. wenn ich sie hochladen will muss ich sie &amp;uuml;ber drag&amp;amp;drop rein ziehen. Beim Hochladen kommt die fehlermeldung: &amp;bdquo;&lt;span&gt;Beim Hochladen der Daten ist ein Fehler aufgetreten. Versuche es erneut.&amp;ldquo;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;k&amp;ouml;nnen sie mir weiterhelfen&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Activity Profile Editor for Edge devices</title><link>https://forums.garmin.com/thread/443113?ContentTypeID=0</link><pubDate>Mon, 31 Aug 2026 16:49:23 GMT</pubDate><guid isPermaLink="false">a9571b57-dd57-479e-8763-8f8a603e40aa:d45382b1-5923-43e9-9d88-6c3cb05bc30f</guid><dc:creator>dscurtis</dc:creator><slash:comments>6</slash:comments><comments>https://forums.garmin.com/thread/443113?ContentTypeID=0</comments><wfw:commentRss>https://forums.garmin.com/developer/fit-sdk/f/discussion/443113/activity-profile-editor-for-edge-devices/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;&lt;span style="font-size:150%;"&gt;For anyone who is interested in editing their Edge Activity Profile screens and data fields on a computer vs the Edge itself, this project may have what you&amp;rsquo;re looking for.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:150%;"&gt;&lt;a href="https://github.com/fullcarbonbike/Activity-Profile-Editor"&gt;github.com/.../Activity-Profile-Editor&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:150%;"&gt;I only have my own Edge 530 to test this on, so the confirmed field IDs, screen types, and layouts are all specific to that model. The underlying screen/data-field mechanism looks like it should carry over to other Edge models (same 10-field-per-screen cap, same layout patterns from what I&amp;#39;ve seen in demo videos of newer touchscreen units), but that&amp;#39;s unconfirmed without real testing on other hardware &amp;mdash; collaboration from anyone with a different model would help a lot.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:150%;"&gt;You can use it in purely a &amp;ldquo;read&amp;rdquo; mode, if you just want to start by viewing existing Profiles. The deploy method pushes the changed Activity Profile .fit files through the NewFiles folder/restart mechanism to make the changes.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:150%;"&gt;Here are the features that are built into this toolkit and available in the GUI:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:150%;"&gt;- Cloning - copy an existing Activity Profile to a new name&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:150%;"&gt;- Backups - backup Activity Profiles to local disk&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:150%;"&gt;- Backup pruning - delete old backups&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:150%;"&gt;- Change Screens - Add/Delete/Reorder/Hide/Layout-A/B&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:150%;"&gt;- Data Fields - Add/Delete/reorder/Modify the data fields within a screen&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:150%;"&gt;- Startup.txt - Change the text and display timer value of the boot message file&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:150%;"&gt;- Restore - restore a deleted Activity Profile if it was previously backed up by the toolkit&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:150%;"&gt;- Import - import a Profile from another source or other backup method&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:150%;"&gt;- Favorite - save a favorite screen to reuse/transfer to another Activity Profile&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:150%;"&gt;The code is written in Python and uses the garmin-fit-sdk and wxPython for the GUI interface.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:150%;"&gt;There are also a set of CLI tools, in case you want to use individual aspects of the toolkit without the gui_app.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:150%;"&gt;The tools are compatible with MacOS (tested on MacOS 26) as well as Windows (tested on Win 11). It was also tested on Win 10 - 32-bit, but requires manual install of the Python version and the wxPython (see the README for those details).&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:150%;"&gt;Here&amp;rsquo;s a sample output of a couple of the cli tools:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;% python3 garmin_device.py detect&lt;br /&gt;Garmin device found at: /Volumes/GARMIN/Garmin&lt;br /&gt; Manufacturer: garmin&lt;br /&gt; Product: edge_530&lt;br /&gt; Serial: xxxxxxxxxxxx &amp;lt;-not showing my actual serial number&lt;br /&gt; Software version: 981&lt;/p&gt;
&lt;p&gt;% python3 fit_dump.py screens ./CyclingRoadClonebox.fit&lt;br /&gt;=== Screen order as viewed on-device (reorderable via --swap-order) ===&lt;br /&gt; POS SLOT CNT LAY FLAG TYPE FIELDS&lt;br /&gt; 1 [ 0] 6f B Screen 1 Timer, Distance, Power Graph, Heart Rate Graph, Speed, Cadence&lt;br /&gt; 2 [ 7] 7f Screen 4 Cadence Bars, Lap HR, Last Lap HR, EPOC, HR Zone Graph, Anaerobic TE, Aerobic Training Effect&lt;br /&gt; 3 [ 1] 2f Lap Summary Speed, Distance&lt;br /&gt; 4 [ 2] 0f Map &lt;br /&gt; 5 [ 3] 2f Elevation Percent Grade, Elevation (ft)&lt;br /&gt; 6 [ 8] 0f GroupTrack List &lt;br /&gt; 7 [13] 2f ClimbPro Percent Grade, Elevation (ft)&lt;br /&gt; 8 [ 4] 2f Cycling Dynamics Power Phase Left, Power Phase Right&lt;br /&gt; 9 [ 5] 2f Screen 2 Avg Speed, HR Zone Graph&lt;br /&gt; 10 [ 6] 7f Screen 3 Speed Bars, HR Bars, Power Bars, Lap HR, Last Lap HR, Lap %Max HR, Respiration&lt;br /&gt; 11 [ 9] 10f Screen 5 Lap Time, Odometer, Dest. Ahead, Lap Dist., Last Lap Speed, Total Descent, Lap Speed, Reps to Go, Lap Power, Target Power&lt;br /&gt; 12 [11] 10f Screen 6 Target, Step Time, Duration, Workout Comparison, Workout Step, Light Battery, Last Lap Power, Lap Time Standing, Lap Time Seated, Avg PCO&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:150%;"&gt;Also, here&amp;#39;s a few screen shots of the GUI&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:150%;"&gt;&lt;img style="max-height:240px;max-width:320px;" src="https://forums.garmin.com/resized-image/__size/640x480/__key/communityserver-discussions-components-files/502/Profile_2D00_Editor_2D00_ProfileList.jpg" alt=" " /&gt;&lt;img style="max-height:240px;max-width:320px;" src="https://forums.garmin.com/resized-image/__size/640x480/__key/communityserver-discussions-components-files/502/Profile_2D00_Editor_2D00_ScreenList.jpg" alt=" " /&gt;&lt;img style="max-height:240px;max-width:320px;" src="https://forums.garmin.com/resized-image/__size/640x480/__key/communityserver-discussions-components-files/502/Profile_2D00_Editor_2D00_ScreenEdit.jpg" alt=" " /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Types sheet in Profile.xlsx needs some explanation</title><link>https://forums.garmin.com/thread/442784?ContentTypeID=0</link><pubDate>Wed, 26 Aug 2026 20:29:13 GMT</pubDate><guid isPermaLink="false">a9571b57-dd57-479e-8763-8f8a603e40aa:2ffdc80c-c443-436f-899a-d41bb6001eeb</guid><dc:creator>BESSELING.FRANK</dc:creator><slash:comments>2</slash:comments><comments>https://forums.garmin.com/thread/442784?ContentTypeID=0</comments><wfw:commentRss>https://forums.garmin.com/developer/fit-sdk/f/discussion/442784/types-sheet-in-profile-xlsx-needs-some-explanation/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;I need some clarification regarding the Types sheet in Profile.xlsx. It may be documented somewhere, but I haven&amp;rsquo;t been able to find it. Two things are unclear to me.&lt;/p&gt;
&lt;p&gt;First, I noticed that of the roughly 200 documented Types, only about 140 are actually used in the Messages. For example, &amp;quot;language_bits_1&amp;quot; through &amp;quot;language_bits_4&amp;quot; do not appear in any Message. The same applies to &amp;quot;sport_bits_1&amp;quot; through &amp;quot;sport_bits_6&amp;quot;. What is the purpose of these unused Types?&lt;/p&gt;
&lt;p&gt;Second, the use of hexadecimal values in the Value column is not always explained. In some cases it&amp;rsquo;s clear, such as in the comments for &amp;quot;file.mfg_range_min&amp;quot; and &amp;quot;file.mfg_range_max&amp;quot;. But for the type &amp;quot;file_flags&amp;quot;, it could be interpreted that the bits can be used cumulatively. In that case, 0x0E would correspond to readable &amp;amp; writable &amp;amp; erasable. And maybe other uses of hexadecimal values are applicable elsewhere.&lt;/p&gt;
&lt;p&gt;Can someone clarify this, or provide a link to existing documentation?&lt;br /&gt;Many thanks!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Title: Garmin Connect Activity API access</title><link>https://forums.garmin.com/thread/442746?ContentTypeID=0</link><pubDate>Wed, 26 Aug 2026 13:40:06 GMT</pubDate><guid isPermaLink="false">a9571b57-dd57-479e-8763-8f8a603e40aa:28b7af42-e2af-4f0e-a2f9-5a79b230e775</guid><dc:creator>4019245</dc:creator><slash:comments>1</slash:comments><comments>https://forums.garmin.com/thread/442746?ContentTypeID=0</comments><wfw:commentRss>https://forums.garmin.com/developer/fit-sdk/f/discussion/442746/title-garmin-connect-activity-api-access/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p data-start="1388" data-end="1520"&gt;Hi,&lt;br data-start="1391" data-end="1394" /&gt; I&amp;rsquo;m interested in using the Garmin Connect Activity API to access activity data from Garmin devices with user authorization.&lt;/p&gt;
&lt;p data-start="1525" data-end="1624"&gt;I understand that new Garmin Connect Developer Program API access requests may currently be paused.&lt;/p&gt;
&lt;p data-start="1629" data-end="1751"&gt;Is there currently any way to request access to the Activity API, or any waitlist I can join for when applications reopen?&lt;/p&gt;
&lt;p data-start="1756" data-end="1832"&gt;I would also be interested in the Health API and Training API in the future.&lt;/p&gt;
&lt;p data-start="1837" data-end="1844"&gt;Thanks.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Multisport FIT file rejected as "invalid" by Garmin Connect (unknown_233 message type)</title><link>https://forums.garmin.com/thread/442501?ContentTypeID=0</link><pubDate>Sun, 23 Aug 2026 15:32:16 GMT</pubDate><guid isPermaLink="false">a9571b57-dd57-479e-8763-8f8a603e40aa:274c5de2-b80d-427f-9269-5098cc2581e5</guid><dc:creator>1337595</dc:creator><slash:comments>2</slash:comments><comments>https://forums.garmin.com/thread/442501?ContentTypeID=0</comments><wfw:commentRss>https://forums.garmin.com/developer/fit-sdk/f/discussion/442501/multisport-fit-file-rejected-as-invalid-by-garmin-connect-unknown_233-message-type/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Hi all,&lt;/p&gt;
&lt;p&gt;I recorded a multisport activity (run-bike-run duathlon) on my Forerunner &lt;br /&gt;965 on 2026-08-23. Garmin Connect rejects the file as &amp;quot;invalid&amp;quot; via all &lt;br /&gt;import paths (auto-sync, Garmin Express, manual web import).&lt;/p&gt;
&lt;p&gt;Inspecting the file with a third-party FIT tool shows it&amp;#39;s complete and &lt;br /&gt;readable (7,394 messages, 1,561 record entries, 11 laps, all sessions &lt;br /&gt;present). It contains an unofficial/undocumented message type &lt;br /&gt;(unknown_233, 2,632 occurrences) that isn&amp;#39;t in the official FIT SDK &lt;br /&gt;profile &amp;mdash; possibly what&amp;#39;s tripping Connect&amp;#39;s server-side validator.&lt;/p&gt;
&lt;p&gt;Has anyone seen this before, or is there someone here who could take a &lt;br /&gt;look with FFRT (Fit File Repair Tool)?&lt;/p&gt;
&lt;p&gt;Device: Forerunner 965&lt;a href="https://forums.garmin.com/cfs-file/__key/communityserver-discussions-components-files/502/rennen.zip"&gt;forums.garmin.com/.../rennen.zip&lt;/a&gt;&lt;br /&gt;File attached.&lt;/p&gt;
&lt;p&gt;Thanks!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Where can I find the name of the product  whose ID is 16338</title><link>https://forums.garmin.com/thread/442260?ContentTypeID=0</link><pubDate>Wed, 19 Aug 2026 15:33:57 GMT</pubDate><guid isPermaLink="false">a9571b57-dd57-479e-8763-8f8a603e40aa:ea66fd61-2681-4f37-9e18-0879f2fac543</guid><dc:creator>KenDuffill</dc:creator><slash:comments>0</slash:comments><comments>https://forums.garmin.com/thread/442260?ContentTypeID=0</comments><wfw:commentRss>https://forums.garmin.com/developer/fit-sdk/f/discussion/442260/where-can-i-find-the-name-of-the-product-whose-id-is-16338/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;When decoding the Device Info message from y Forerunner 45 watch I cannot find a description for product ID 16338&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Where can I find the name of the manufacturer whose ID is 36084</title><link>https://forums.garmin.com/thread/442259?ContentTypeID=0</link><pubDate>Wed, 19 Aug 2026 15:30:11 GMT</pubDate><guid isPermaLink="false">a9571b57-dd57-479e-8763-8f8a603e40aa:91b4cc01-6d76-45f3-814a-b87855938d48</guid><dc:creator>KenDuffill</dc:creator><slash:comments>0</slash:comments><comments>https://forums.garmin.com/thread/442259?ContentTypeID=0</comments><wfw:commentRss>https://forums.garmin.com/developer/fit-sdk/f/discussion/442259/where-can-i-find-the-name-of-the-manufacturer-whose-id-is-36084/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;When I decode Device Info Messages from my Forerunner 45 watch I find that manufacturer ID 36084 is&amp;nbsp;Unknown.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>JS SDK: decoder crash on unknown field before an accumulated field</title><link>https://forums.garmin.com/thread/442200?ContentTypeID=0</link><pubDate>Tue, 18 Aug 2026 19:45:14 GMT</pubDate><guid isPermaLink="false">a9571b57-dd57-479e-8763-8f8a603e40aa:ff6caf26-cadd-4038-8bc4-ccd1b2e3e8d5</guid><dc:creator>Ufie</dc:creator><slash:comments>2</slash:comments><comments>https://forums.garmin.com/thread/442200?ContentTypeID=0</comments><wfw:commentRss>https://forums.garmin.com/developer/fit-sdk/f/discussion/442200/js-sdk-decoder-crash-on-unknown-field-before-an-accumulated-field/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Decoding with&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code data-epitaxy-inline-code=""&gt;Decoder.read({ includeUnknownData: true })&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;fails with:&lt;/p&gt;
&lt;p&gt;&amp;quot;Cannot read properties of undefined (reading &amp;#39;components&amp;#39;)&amp;quot;&lt;/p&gt;
&lt;p&gt;Decoding stops at that point, so all remaining messages in the file are lost.&lt;/p&gt;
&lt;p&gt;Cause is in&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;code data-epitaxy-inline-code="" data-epitaxy-file-ref=""&gt;src/decoder.js&lt;/code&gt;&lt;/span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code data-epitaxy-inline-code=""&gt;#setAccumulatedField()&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(line 719 in 21.213.0):&lt;/p&gt;
&lt;p&gt;let components = messageDefinition.fields[containingField.fieldDefinitionNumber].components ?? []&lt;/p&gt;
&lt;p&gt;With&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code data-epitaxy-inline-code=""&gt;includeUnknownData: true&lt;/code&gt;, fields that have no Profile entry are present in&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code data-epitaxy-inline-code=""&gt;message&lt;/code&gt;, so this lookup returns undefined. It only triggers when the unknown field comes before an accumulated field (distance, total_cycles, accumulated_power) in the message definition &amp;mdash; the same fields in the opposite order decode fine.&lt;/p&gt;
&lt;p&gt;Fix is the optional chaining already used on the next lookup two lines down:&lt;/p&gt;
&lt;p&gt;let components = messageDefinition.fields[containingField.fieldDefinitionNumber]?.components ?? []&lt;/p&gt;
&lt;p&gt;Reproduced on 21.208.0 and 21.213.0, Node 22. Happy to post a minimal repro script if that helps.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>has anyone got a developer field to render in connect recently? mine decode fine and show up nowhere</title><link>https://forums.garmin.com/thread/441548?ContentTypeID=0</link><pubDate>Sat, 08 Aug 2026 20:31:36 GMT</pubDate><guid isPermaLink="false">a9571b57-dd57-479e-8763-8f8a603e40aa:685b4440-cc20-476a-95bf-89019e5d5cef</guid><dc:creator>jpcams</dc:creator><slash:comments>1</slash:comments><comments>https://forums.garmin.com/thread/441548?ContentTypeID=0</comments><wfw:commentRss>https://forums.garmin.com/developer/fit-sdk/f/discussion/441548/has-anyone-got-a-developer-field-to-render-in-connect-recently-mine-decode-fine-and-show-up-nowhere/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p dir="ltr"&gt;i&amp;#39;ve got a connect iq strength app that records sport 10 / sub sport 20. it writes seven developer fields through fitcontrib: reps, load and hold on&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code data-epitaxy-inline-code=""&gt;MESG_TYPE_LAP&lt;/code&gt;, then total reps, total sets, volume and avg rpe on&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code data-epitaxy-inline-code=""&gt;MESG_TYPE_SESSION&lt;/code&gt;.&lt;/p&gt;
&lt;p dir="ltr"&gt;i&amp;#39;ve already decoded it with the fit sdk (export original out of connect rather than pulled off the watch over usb, happy to redo it that way if that matters). everything is in there and looks correct to me. unique ids in developer index 0, base types matching the declared sizes, units present, each one bound through&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code data-epitaxy-inline-code=""&gt;native_mesg_num&lt;/code&gt;. values check out too: total sets 19 against 19 laps carrying reps, total reps 209 against 209, volume 4019.5 kg summing reps &amp;times; load. 44 laps, and&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;0 set messages&lt;/strong&gt;, which i understand is why the sets table is empty and is a ciq limitation rather than anything i can fix.&lt;/p&gt;
&lt;p dir="ltr"&gt;what i can&amp;#39;t work out is the developer fields. connect displays none of the seven, on web or in the phone app. no chart series offered beyond heart rate on either. the sdk docs for&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code data-epitaxy-inline-code=""&gt;createField&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;say a developer field can show up as a graph, as lap information or as workout summary information, and i&amp;#39;m getting none of the three.&lt;/p&gt;
&lt;p dir="ltr"&gt;so:&lt;/p&gt;
&lt;ol dir="ltr" start="1"&gt;
&lt;li&gt;&lt;strong&gt;has anyone actually seen a developer field render in connect recently, on any sport?&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;i&amp;#39;ve got no other ciq app in my history writing them, so i can&amp;#39;t tell if this is strength specific or general.&lt;/li&gt;
&lt;li&gt;does&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code data-epitaxy-inline-code=""&gt;native_field_num&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;matter here? mine is unset on all seven and i can&amp;#39;t tell from the docs whether connect keys the display off it.&lt;/li&gt;
&lt;li&gt;is the strength page fed purely by&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code data-epitaxy-inline-code=""&gt;set&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;messages, so laps and developer fields have nowhere to go on that activity type by design?&lt;/li&gt;
&lt;/ol&gt;
&lt;p dir="ltr"&gt;happy to post the full decode if it&amp;#39;s useful.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Can a commercial Android app bundle the FIT Java SDK (com.garmin:fit) for distribution?</title><link>https://forums.garmin.com/thread/441419?ContentTypeID=0</link><pubDate>Thu, 06 Aug 2026 12:47:21 GMT</pubDate><guid isPermaLink="false">a9571b57-dd57-479e-8763-8f8a603e40aa:7cf1acff-7070-446d-8d9c-dde9ba7f394e</guid><dc:creator>Sugoi</dc:creator><slash:comments>1</slash:comments><comments>https://forums.garmin.com/thread/441419?ContentTypeID=0</comments><wfw:commentRss>https://forums.garmin.com/developer/fit-sdk/f/discussion/441419/can-a-commercial-android-app-bundle-the-fit-java-sdk-com-garmin-fit-for-distribution/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Hi, I&amp;#39;m building an Android app (not yet published) that uses the official FIT Java SDK (com.garmin:fit, via Maven Central) to read FIT files recorded by Edge/VIRB devices, and I plan to distribute it commercially through Google Play.&lt;/p&gt;
&lt;p&gt;Section 1 of the SDK License Agreement permits using the FIT protocol &amp;quot;in any software created by Licensee&amp;quot;, but Section 2(c) separately restricts distributing the Licensed Technology to third parties. Since an Android APK bundles its compiled dependencies inside the package it distributes, I want to confirm: does shipping an app that includes the compiled FIT SDK count as &amp;quot;distributing the Licensed Technology&amp;quot; under 2(c), or is that covered as normal use under Section 1?&lt;/p&gt;
&lt;p&gt;Would appreciate any clarification - want to be compliant before launching. Thanks!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Battery life</title><link>https://forums.garmin.com/thread/441222?ContentTypeID=0</link><pubDate>Mon, 03 Aug 2026 11:33:56 GMT</pubDate><guid isPermaLink="false">a9571b57-dd57-479e-8763-8f8a603e40aa:dacb91f0-2b29-4e38-9235-c188fa8f486c</guid><dc:creator>2886759</dc:creator><slash:comments>1</slash:comments><comments>https://forums.garmin.com/thread/441222?ContentTypeID=0</comments><wfw:commentRss>https://forums.garmin.com/developer/fit-sdk/f/discussion/441222/battery-life/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;After the last update on the Fenix 8, the battery life is very bad. Fully charged on Saturday, and today it&amp;#39;s at 55%&lt;/p&gt;
&lt;p&gt;The always-on display is one, but it was on before the update,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Privacy and ability for offline mode</title><link>https://forums.garmin.com/thread/441189?ContentTypeID=0</link><pubDate>Sun, 02 Aug 2026 23:15:30 GMT</pubDate><guid isPermaLink="false">a9571b57-dd57-479e-8763-8f8a603e40aa:a52cf651-9831-4642-9816-9899392127e5</guid><dc:creator>6856588</dc:creator><slash:comments>2</slash:comments><comments>https://forums.garmin.com/thread/441189?ContentTypeID=0</comments><wfw:commentRss>https://forums.garmin.com/developer/fit-sdk/f/discussion/441189/privacy-and-ability-for-offline-mode/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;I&amp;rsquo;ve had 4 Forerunners in 10 years and I want to be able to have my watch sync with my phone, without syncing with the Cloud&amp;hellip;I&amp;rsquo;d like this setting for privacy as Garmin doesn&amp;rsquo;t have end-to-end encryption. This should be an easy add to benefit those who are in the wilderness or want additional digital privacy.&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Requesting a FIT manufacturer ID as an individual developer — process and timing?</title><link>https://forums.garmin.com/thread/441122?ContentTypeID=0</link><pubDate>Sat, 01 Aug 2026 14:45:20 GMT</pubDate><guid isPermaLink="false">a9571b57-dd57-479e-8763-8f8a603e40aa:5a5a2b32-4f10-45df-a939-407aabea15f3</guid><dc:creator>8531634</dc:creator><slash:comments>0</slash:comments><comments>https://forums.garmin.com/thread/441122?ContentTypeID=0</comments><wfw:commentRss>https://forums.garmin.com/developer/fit-sdk/f/discussion/441122/requesting-a-fit-manufacturer-id-as-an-individual-developer-process-and-timing/rss?ContentTypeId=0</wfw:commentRss><description>&lt;div data-line="1" data-line-type="context" data-line-index="0"&gt;&lt;span&gt;Hello,&lt;/span&gt;&lt;/div&gt;
&lt;div data-line="2" data-line-type="context" data-line-index="1"&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div data-line="3" data-line-type="context" data-line-index="2"&gt;&lt;span&gt;I am an individual developer in Japan, working on an Android cycling app that writes&lt;/span&gt;&lt;/div&gt;
&lt;div data-line="4" data-line-type="context" data-line-index="3"&gt;&lt;span&gt;FIT files. I would like to obtain a FIT manufacturer ID so that my files identify the&lt;/span&gt;&lt;/div&gt;
&lt;div data-line="5" data-line-type="context" data-line-index="4"&gt;&lt;span&gt;application correctly &amp;mdash; they currently use manufacturer = 255 (development).&lt;/span&gt;&lt;/div&gt;
&lt;div data-line="6" data-line-type="context" data-line-index="5"&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div data-line="7" data-line-type="context" data-line-index="6"&gt;&lt;span&gt;Following the guidance posted in this forum, I contacted Garmin business development&lt;/span&gt;&lt;/div&gt;
&lt;div data-line="8" data-line-type="context" data-line-index="7"&gt;&lt;span&gt;by email about a week ago. I have not heard back yet, and I understand these requests&lt;/span&gt;&lt;/div&gt;
&lt;div data-line="9" data-line-type="context" data-line-index="8"&gt;&lt;span&gt;may simply take time.&lt;/span&gt;&lt;/div&gt;
&lt;div data-line="10" data-line-type="context" data-line-index="9"&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div data-line="11" data-line-type="context" data-line-index="10"&gt;&lt;span&gt;Could anyone advise:&lt;/span&gt;&lt;/div&gt;
&lt;div data-line="12" data-line-type="context" data-line-index="11"&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div data-line="13" data-line-type="context" data-line-index="12"&gt;&lt;span&gt;1. Is contacting Garmin business development by email still the correct route for&lt;/span&gt;&lt;/div&gt;
&lt;div data-line="14" data-line-type="context" data-line-index="13"&gt;&lt;span&gt; manufacturer ID requests, now that the ANT+ Adopter request form is no longer&lt;/span&gt;&lt;/div&gt;
&lt;div data-line="15" data-line-type="context" data-line-index="14"&gt;&lt;span&gt; available to non-members?&lt;/span&gt;&lt;/div&gt;
&lt;div data-line="16" data-line-type="context" data-line-index="15"&gt;&lt;span&gt;2. What is the typical turnaround for such a request?&lt;/span&gt;&lt;/div&gt;
&lt;div data-line="17" data-line-type="context" data-line-index="16"&gt;&lt;span&gt;3. Is there any additional information that helps &amp;mdash; company details, a product&lt;/span&gt;&lt;/div&gt;
&lt;div data-line="18" data-line-type="context" data-line-index="17"&gt;&lt;span&gt; description, or a sample FIT file? I am happy to provide whatever is needed.&lt;/span&gt;&lt;/div&gt;
&lt;div data-line="19" data-line-type="context" data-line-index="18"&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div data-line="20" data-line-type="context" data-line-index="19"&gt;&lt;span&gt;Thank you.&lt;/span&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>How to get RR intervals from FIT hr messages (Fit file message 132)?</title><link>https://forums.garmin.com/thread/440840?ContentTypeID=0</link><pubDate>Tue, 28 Jul 2026 18:53:16 GMT</pubDate><guid isPermaLink="false">a9571b57-dd57-479e-8763-8f8a603e40aa:78e923fe-80f8-4773-9e57-25637f59266a</guid><dc:creator>pepe</dc:creator><slash:comments>0</slash:comments><comments>https://forums.garmin.com/thread/440840?ContentTypeID=0</comments><wfw:commentRss>https://forums.garmin.com/developer/fit-sdk/f/discussion/440840/how-to-get-rr-intervals-from-fit-hr-messages-fit-file-message-132/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Garmin units write RR intervals to Fit file from Garmin HRM 600 and other Garmin HRM with memory at the end of a offline activity,(like swimming) writing 11 RR intervals per message,&lt;/p&gt;
&lt;p&gt;= TYPE=12 NAME=hr NUMBER=132&lt;br /&gt;--- timestamp=1126167485=2025-09-07T08:18:05Z&lt;br /&gt;--- event_timestamp=1778373632=1736693.000 s&lt;br /&gt;--- fractional_timestamp=0=0.0000 s&lt;br /&gt;--- filtered_bpm=71=71 bpm&lt;br /&gt;--- xxx251=0=0&lt;br /&gt;==&lt;br /&gt;= TYPE=11 NAME=hr NUMBER=132&lt;br /&gt;--- filtered_bpm=71=71 bpm,71 bpm,71 bpm,71 bpm,71 bpm,71 bpm,71 bpm,71 bpm&lt;br /&gt;--- event_timestamp_12=0=0.000 s,0.031 s,0.068 s,0.214 s,0.117 s,0.206 s,0.075 s,0.108 s,0.021 s,0.022 s,0.083 s,0.135 s&lt;br /&gt;==&lt;/p&gt;
&lt;h3&gt;&lt;span class=""&gt;Type‑12 Anchor Processing&lt;/span&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p class="ds-markdown-paragraph"&gt;&lt;code&gt;timestamp&lt;/code&gt;&lt;span class=""&gt; (absolute Unix time) and the scalar &lt;/span&gt;&lt;code&gt;event_timestamp&lt;/code&gt;&lt;span class=""&gt; (a 32‑bit integer in 1/1024‑second units).&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p class="ds-markdown-paragraph"&gt;&lt;span class=""&gt;The anchor&amp;rsquo;s absolute time is calculated as:&lt;/span&gt;&lt;br /&gt;&lt;code&gt;anchor_abs = timestamp + event_timestamp / 1024.0&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li class=""&gt;
&lt;p class="ds-markdown-paragraph"&gt;&lt;span class=""&gt;This &lt;/span&gt;&lt;code&gt;event_timestamp&lt;/code&gt;&lt;span class=""&gt; scalar is used as the &lt;/span&gt;&lt;strong&gt;&lt;span class=""&gt;baseline&lt;/span&gt;&lt;/strong&gt;&lt;span class=""&gt; for the &lt;/span&gt;&lt;strong&gt;&lt;span class=""&gt;first beat&lt;/span&gt;&lt;/strong&gt;&lt;span class=""&gt; of the subsequent Type‑11 message (if present).&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;
&lt;h3&gt;&lt;span class=""&gt;Type‑11 Message Processing (The Core RR Extraction)&lt;/span&gt;&lt;/h3&gt;
&lt;p class="ds-markdown-paragraph"&gt;&lt;span class=""&gt;When a Type‑11 message is encountered, GC processes two fields:&lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;&lt;span class=""&gt;1. Scalar &lt;/span&gt;&lt;code&gt;event_timestamp&lt;/code&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p class="ds-markdown-paragraph"&gt;&lt;span class=""&gt;This is a &lt;/span&gt;&lt;strong&gt;&lt;span class=""&gt;32‑bit integer&lt;/span&gt;&lt;/strong&gt;&lt;span class=""&gt; representing the cumulative offset (in 1/1024 seconds) of the &lt;/span&gt;&lt;strong&gt;&lt;span class=""&gt;first beat&lt;/span&gt;&lt;/strong&gt;&lt;span class=""&gt; of this message from the start of the activity (or midnight).&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;span class=""&gt;2. Packed &lt;/span&gt;&lt;code&gt;event_timestamp_12&lt;/code&gt;&lt;span class=""&gt; (field 10)&lt;/span&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p class="ds-markdown-paragraph"&gt;&lt;span class=""&gt;This field contains &lt;/span&gt;&lt;strong&gt;&lt;span class=""&gt;12 bytes&lt;/span&gt;&lt;/strong&gt;&lt;span class=""&gt; (0&amp;ndash;255). They are &lt;/span&gt;&lt;strong&gt;&lt;span class=""&gt;not&lt;/span&gt;&lt;/strong&gt;&lt;span class=""&gt; RR intervals &amp;ndash; they are packed 12‑bit cumulative offsets that extend the 32‑bit timestamp for the subsequent 11 beats.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p class="ds-markdown-paragraph"&gt;&lt;span class=""&gt;Needs unpacking the bytes using a specific bit‑twiddling algorithm (overlapping pairs, alternating extraction).&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p class="ds-markdown-paragraph"&gt;&lt;span class=""&gt;For each pair of bytes, reconstruct a 12‑bit value&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;&lt;span class=""&gt;Result per Type‑11 Message&lt;/span&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p class="ds-markdown-paragraph"&gt;&lt;strong&gt;&lt;span class=""&gt;1 absolute beat time&lt;/span&gt;&lt;/strong&gt;&lt;span class=""&gt; from the scalar &lt;/span&gt;&lt;code&gt;event_timestamp&lt;/code&gt;&lt;span class=""&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p class="ds-markdown-paragraph"&gt;&lt;strong&gt;&lt;span class=""&gt;11 additional absolute beat times&lt;/span&gt;&lt;/strong&gt;&lt;span class=""&gt; from the unpacked bytes.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p class="ds-markdown-paragraph"&gt;&lt;strong&gt;&lt;span class=""&gt;Total: 12 absolute beat times&lt;/span&gt;&lt;/strong&gt;&lt;span class=""&gt; per message.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p class="ds-markdown-paragraph"&gt;&lt;strong&gt;&lt;span class=""&gt;11 RR intervals&lt;/span&gt;&lt;/strong&gt;&lt;span class=""&gt; (differences between consecutive absolute beat times).&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Fenix 6 product names in fit sdks seem to be wrong?</title><link>https://forums.garmin.com/thread/440597?ContentTypeID=0</link><pubDate>Sat, 25 Jul 2026 17:41:33 GMT</pubDate><guid isPermaLink="false">a9571b57-dd57-479e-8763-8f8a603e40aa:4bc331f5-2dc6-48a4-a417-7d5c7dbad9af</guid><dc:creator>HermoT</dc:creator><slash:comments>2</slash:comments><comments>https://forums.garmin.com/thread/440597?ContentTypeID=0</comments><wfw:commentRss>https://forums.garmin.com/developer/fit-sdk/f/discussion/440597/fenix-6-product-names-in-fit-sdks-seem-to-be-wrong/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;Hi&amp;nbsp;&lt;a href="https://forums.garmin.com/members/4692e6261156423ca1b6bfa5b137c27d"&gt;Ben FIT&lt;/a&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Correct me if I am wrong, but it seems to me the fenix 6 series have the wrong names in the fit sdks.&lt;br /&gt;&lt;a href="https://github.com/garmin/fit-javascript-sdk/blob/main/src/profile.js#L24921-L24925"&gt;https://github.com/garmin/fit-javascript-sdk/blob/main/src/profile.js#L24921-L24925&lt;br /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;My belief is that the &amp;quot;Sport&amp;quot; is the regular fenix 6, and what appears to be the regular fenix 6 in the sdk should be the Pro.&lt;/p&gt;
&lt;p&gt;I have confirmed this with a fit file from my own fenix 6 Pro.&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SDK&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Reality&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Notes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3287: &amp;quot;fenix6SSport&amp;quot;&lt;/td&gt;
&lt;td&gt;fenix6S&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3288: &amp;quot;fenix6S&amp;quot;&lt;/td&gt;
&lt;td&gt;fenix6SPro&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3289: &amp;quot;fenix6Sport&amp;quot;&lt;/td&gt;
&lt;td&gt;fenix6&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3290: &amp;quot;fenix6&amp;quot;&lt;/td&gt;
&lt;td&gt;fenix6Pro&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3291: &amp;quot;fenix6x&amp;quot;&lt;/td&gt;
&lt;td&gt;fenix6XPro&lt;/td&gt;
&lt;td&gt;Based on naming convention of &amp;quot;S&amp;quot; in fenix6S,&amp;nbsp; &amp;quot;x&amp;quot; should be uppercase &amp;quot;X&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Same most likely applies for the Asia versions too:&lt;br /&gt;&lt;a href="https://github.com/garmin/fit-javascript-sdk/blob/main/src/profile.js#L24955-L24959"&gt;https://github.com/garmin/fit-javascript-sdk/blob/main/src/profile.js#L24955-L24959&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Accidental duplicate post. Please delete this Discussion copy and retain the Question version.</title><link>https://forums.garmin.com/thread/440360?ContentTypeID=0</link><pubDate>Wed, 22 Jul 2026 12:37:27 GMT</pubDate><guid isPermaLink="false">a9571b57-dd57-479e-8763-8f8a603e40aa:d1b59ffa-2c41-4ee7-a595-ed299d22f434</guid><dc:creator>Wilson</dc:creator><slash:comments>0</slash:comments><comments>https://forums.garmin.com/thread/440360?ContentTypeID=0</comments><wfw:commentRss>https://forums.garmin.com/developer/fit-sdk/f/discussion/440360/accidental-duplicate-post-please-delete-this-discussion-copy-and-retain-the-question-version/rss?ContentTypeId=0</wfw:commentRss><description>&lt;p&gt;【Duplicate submission created accidentally. Please delete this Discussion thread. The Question version is the intended thread:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="https://forums.garmin.com/developer/fit-sdk/f/discussion/440359/how-should-more-than-five-rr-intervals-from-one-ble-notification-be-serialized-into-fit-hrv-messages"&gt;How should more than five RR intervals from one BLE notification be serialized into FIT hrv messages?&lt;/a&gt;&amp;nbsp; 】&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I would like to distinguish between the capacity of one FIT &lt;code&gt;hrv&lt;/code&gt; message and the number of RR intervals delivered by a sensor in one BLE notification.&lt;/p&gt;
&lt;p&gt;In a previous FIT SDK discussion, Ben FIT explained that the &lt;code&gt;hrv.time&lt;/code&gt; array contains between one and five valid RR intervals, with five physical slots provided because the maximum heart rate representable in a FIT Record message is 254 bpm:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://forums.garmin.com/developer/fit-sdk/f/discussion/255690/fit-file-hrv-data-array-interpretation/1220787"&gt;https://forums.garmin.com/developer/fit-sdk/f/discussion/255690/fit-file-hrv-data-array-interpretation/1220787&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;However, an incoming BLE Heart Rate Measurement notification does not necessarily represent one second of measurements and does not necessarily correspond one-to-one with a FIT &lt;code&gt;hrv&lt;/code&gt; message.&lt;/p&gt;
&lt;p&gt;The Bluetooth Heart Rate Service specification states that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;the RR-Interval Present flag may change during a connection;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;a Heart Rate Measurement may contain no RR intervals or multiple RR intervals;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;with the default 23-byte ATT MTU, one notification may contain up to eight or nine RR-Interval fields, depending on the other fields present;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;the notification interval is determined by the sensor and may vary.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Specification:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.bluetooth.com/wp-content/uploads/Files/Specification/HTML/HRS_v1.0/out/en/index-en.html"&gt;https://www.bluetooth.com/wp-content/uploads/Files/Specification/HTML/HRS_v1.0/out/en/index-en.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A valid sensor implementation may therefore send several heart-rate-only notifications and then include the accumulated RR intervals in a later notification. If it batches approximately two seconds of data, a single notification can contain more than five RR intervals when heart rate exceeds approximately 150 bpm.&lt;/p&gt;
&lt;p&gt;My FIT-format questions are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Is the five-value capacity only a limit of each individual FIT &lt;code&gt;hrv&lt;/code&gt; message?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If a recording device receives six to nine RR intervals in one BLE &lt;code&gt;0x2A37&lt;/code&gt; notification, is the expected FIT representation to write the first five values in one &lt;code&gt;hrv&lt;/code&gt; message and the remaining values in one or more immediately following &lt;code&gt;hrv&lt;/code&gt; messages?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Is it valid for multiple consecutive FIT &lt;code&gt;hrv&lt;/code&gt; messages to originate from the same incoming BLE notification?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Since &lt;code&gt;hrv&lt;/code&gt; messages have no independent timestamps, are the values in these consecutive messages simply interpreted as one continuous RR-interval sequence in file order?&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This question was prompted by an actual Forerunner 955 activity:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Approximately 2,004 seconds / one-second Record messages&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;1,018 FIT &lt;code&gt;hrv&lt;/code&gt; messages&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Average spacing of approximately 1.968 seconds per &lt;code&gt;hrv&lt;/code&gt; message&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Physical capacity: 1,018 &amp;times; 5 = 5,090 RR-interval slots&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Valid RR intervals in the FIT file: 5,012&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RR intervals in the aligned sensor-local sequence: 5,294&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Difference: 282 RR intervals&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If only one five-slot &lt;code&gt;hrv&lt;/code&gt; message is written every 1.968 seconds, the maximum storage rate is:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;5 &amp;times; 60 / 1.968 &amp;asymp; 152.4 RR intervals per minute&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This is very close to the heart-rate range above which the discrepancy becomes apparent.&lt;/p&gt;
&lt;p&gt;In a separate low-heart-rate test, an nRF Connect log showed that the sensor sent a Heart Rate Measurement notification approximately every 700 ms but included accumulated RR intervals only about once every two seconds. All 136 RR intervals covered by that capture were present in the BLE payloads, in the correct order.&lt;/p&gt;
&lt;p&gt;I have not yet captured the BLE payloads during the high-heart-rate portion, so I am not claiming that the FR955 has definitively discarded the missing values. I am first trying to establish the intended FIT serialization behavior.&lt;/p&gt;
&lt;p&gt;Could the FIT team confirm whether more than five RR intervals received together should be preserved by writing multiple &lt;code&gt;hrv&lt;/code&gt; messages, and whether that representation is supported by Garmin activity files?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>