{"id":2799,"date":"2017-05-13T12:00:30","date_gmt":"2017-05-13T03:00:30","guid":{"rendered":"https:\/\/regex.info\/blog\/2017-05-13\/2799"},"modified":"2017-05-13T12:00:30","modified_gmt":"2017-05-13T03:00:30","slug":"a-fit-to-gpx-converter-that-understands-fit-version-2","status":"publish","type":"post","link":"https:\/\/regex.info\/blog\/2017-05-13\/2799","title":{"rendered":"A FIT-to-GPX Converter that Understands FIT Version 2"},"content":{"rendered":"\n\n\n<div class='ic' itemscope itemtype='http:\/\/schema.org\/Photograph'><a name=\"i100032\" href='\/i\/JF4_100032.jpg' itemprop='image'\n><img loading=\"lazy\" decoding=\"async\" src=\"\/i\/JF4_100032_sm.jpg\" width=\"383\" height=\"575\"\nalt=\"\"\nid=\"i100032\"\/><\/a>\n<br\/><span class=\"camera-info robots-nocontent\">Nikon D4 + Voigtl\u00e4nder 125mm f\/2.5 &mdash; <sup>1<\/sup><big>\/<\/big>200 sec, <span class='f'>f<\/span>\/2.5, ISO 6400 &mdash;\n<a href='\/imageinfo.cgi?url=http%3A%2F%2Fregex.info%2Fi%2FJF4_100032.jpg'>map &amp; image data<\/a> &mdash; <a href='\/blog\/proximity\/i\/JF4_100032.jpg'>nearby photos<\/a><\/span>\n<br\/><span class='caption'>That Face<\/span>\n<br\/>when you realize that Garmin has screwed you yet again\n<br\/><span class='subtle'>( statue at the Ushio Kannon Temple &mdash; <span class='nobr'>\u725b\u5c3e\u89b3\u97f3<\/span> &mdash; <a style='color:#888' href='\/blog\/2016-12-06\/2758'>described here<\/a> )<\/span>\n<meta itemprop='url' content='http:\/\/regex.info\/i\/JF4_100032.jpg'\/>\n<meta itemprop='creator' content='Jeffrey Friedl'\/>\n<meta itemprop='copyrightHolder' content='Jeffrey Friedl'\/>\n<meta itemprop='dateCreated' content='2016-12-04'\/><\/div>\n\n<p>I've complained for more than <span class='nobr'>a decade<\/span> about what <span class='nobr'>a horrible<\/span> company Garmin is (such as <a\nhref='\/blog\/2006-03-25\/165'>here<\/a> in 2006, <a href='\/blog\/2013-12-26\/2355'>here<\/a> in 2013,\nand <a href='\/blog\/2016-08-31\/2727'>here<\/a> last year, among others). <span class='nobr'>The only thing<\/span> worse than their hardware\ndesign is their software design, but it's <span class='nobr'>a strong<\/span> competition to the bottom, backed by an apparent company-wide disdain for their\ncustomers.<\/p>\n\n<p>The latest evidence of this disdain is new firmware for some of their cycling computers that renders them utterly incompatible\n<i>with Garmin's own desktop software<\/i>, and, for good measure, almost all other track-processing software in existence. Of\ncourse, this <span class='QO'>&#8220;<\/span>feature<span class='QC'>&#8221;<\/span> is not even hinted at in the release notes. <span class='nobr'>In my case<\/span>, they got me via <span class='nobr'>a firmware<\/span> update for the Garmin\nEdge 820 that <span class='nobr'>I cycle<\/span> with.<\/p>\n\n<p>The problem is manifest in the <span class='QO'>&#8220;<\/span>FIT<span class='QC'>&#8221;<\/span> file that the unit produces\nafter an activity, containing info about the activity (the route you took, the status of the sensors such as your heart rate along\nthe course, etc.). Since the <span class='QO'>&#8220;<\/span>FIT<span class='QC'>&#8221;<\/span> file format was created by Garmin\nmore than half <span class='nobr'>a decade<\/span> ago, it's been at <span class='QO'>&#8220;<\/span><span\nclass='nobr'>Version 1<\/span><span class='QC'>&#8221;<\/span>, but this new firmware update bumped the FIT file format to <span\nclass='QO'>&#8220;<\/span><span class='nobr'>Version 2<\/span><span class='QC'>&#8221;<\/span>. And that's the problem, because\n<i>Garmin's own software<\/i> can't handle <span class='nobr'>Version 2 FIT files.<\/span> If your workflow with Garmin's product\nrelied on Garmin's products, you are screwed.<\/p>\n\n<p>(If you relied on other, non-Garmin software, you're almost certainly screwed there as well, because almost nothing handles\n<span class='nobr'>FIT Version 2.<\/span>\nThe only saving grace here is that Strava <i>can<\/i> handle a\n<span class='nobr'>Version 2 FIT file,<\/span> so <span class='nobr'>a riot<\/span> has been averted.)<\/p>\n\n\n<div class='ic' itemscope itemtype='http:\/\/schema.org\/Photograph'><a name=\"i10570\" href='\/i\/JF100_10570.jpg' itemprop='image'\n><img loading=\"lazy\" decoding=\"async\" src=\"\/i\/JF100_10570_sm.jpg\" width=\"690\" height=\"461\"\nalt=\"\"\nid=\"i10570\"\/><\/a>\n<br\/><span class=\"camera-info robots-nocontent\">Panasonic LX100 at an effective 24mm &mdash; <sup>1<\/sup><big>\/<\/big>250 sec, <span class='f'>f<\/span>\/5.6, ISO 200 &mdash;\n<a href='\/imageinfo.cgi?url=http%3A%2F%2Fregex.info%2Fi%2FJF100_10570.jpg'>map &amp; image data<\/a> &mdash; <a href='\/blog\/proximity\/i\/JF100_10570.jpg'>nearby photos<\/a><\/span>\n<br\/><span class='caption'>Garmin<\/span>\n<br\/><span class='subtle'>( taken during <a style='color:#888' href='https:\/\/www.strava.com\/activities\/696790251'>this ride<\/a> )<\/span>\n<meta itemprop='url' content='http:\/\/regex.info\/i\/JF100_10570.jpg'\/>\n<meta itemprop='creator' content='Jeffrey Friedl'\/>\n<meta itemprop='copyrightHolder' content='Jeffrey Friedl'\/>\n<meta itemprop='dateCreated' content='2016-09-01'\/><\/div>\n\n<p>My after-ride processing requires <span class='nobr'>a GPX<\/span> file, which <span class='nobr'>I used<\/span> to convert to\nvia the most-excellent <a href='http:\/\/gpsbabel.org\/'>GPS Babel<\/a>, but like most other software, <span class='nobr'>GPS\nBabel<\/span> doesn't work with the new FIT files. So, <span class='nobr'>I came up<\/span> with <span class='nobr'>a cheap<\/span>\nsubstitute <span class='QO'>&#8220;<\/span><tt>fit2gpx<\/tt><span class='QC'>&#8221;<\/span> script that invokes the ANT+\nconsortium's <span class='QO'>&#8220;<\/span>FIT to CVS<span class='QC'>&#8221;<\/span> java utility under the hood. That utility\ndoes handle both <span class='nobr'>Versions 1 and 2 FIT files<\/span>, and perhaps will be kept up-to-date going forward, so even\nif Garmin decides to screw everyone again with <span class='nobr'>a surprise<\/span>-and-unsupported move to <span\nclass='QO'>&#8220;<\/span><span class='nobr'>Version 3<\/span><span class='QC'>&#8221;<\/span>, perhaps we'll be covered.<\/p>\n\n<p>Here's the script at GitHub:<\/p>\n<p style='margin-left:3em'><a href='https:\/\/github.com\/jeffrey-friedl\/FIT-to-GPX'><span class='QO'>&#8220;<\/span>FIT to GPX<span class='QC'>&#8221;<\/span> at GitHub<\/a><\/p>\n\n<p>It's my first project to try GitHub with.<\/p>\n\n<div class='ic' itemscope itemtype='http:\/\/schema.org\/Photograph'><a name=\"i13400\" href='\/i\/JF100_13400.jpg' itemprop='image'\n><img loading=\"lazy\" decoding=\"async\" src=\"\/i\/JF100_13400_sm.jpg\" width=\"384\" height=\"575\"\nalt=\"\"\nid=\"i13400\"\/><\/a>\n<br\/><span class=\"camera-info robots-nocontent\">Panasonic LX100 at an effective 24mm &mdash; <sup>1<\/sup><big>\/<\/big>125 sec, <span class='f'>f<\/span>\/1.8, ISO 200 &mdash;\n<a href='\/imageinfo.cgi?url=http%3A%2F%2Fregex.info%2Fi%2FJF100_13400.jpg'>map &amp; image data<\/a> &mdash; <a href='\/blog\/proximity\/i\/JF100_13400.jpg'>nearby photos<\/a><\/span>\n<br\/><span class='caption'>Calm Thoughts<\/span>\n<br><span class='subtle'>( from <a href='https:\/\/www.strava.com\/activities\/870539330' style='color:#888'>this ride<\/a> )<\/span>\n<meta itemprop='url' content='http:\/\/regex.info\/i\/JF100_13400.jpg'\/>\n<meta itemprop='creator' content='Jeffrey Friedl'\/>\n<meta itemprop='copyrightHolder' content='Jeffrey Friedl'\/>\n<meta itemprop='dateCreated' content='2017-02-18'\/><\/div>\n\n<p>As I mentioned, the script is cheap and kludgy; it does exactly what <span class='nobr'>I need,<\/span> but not much more. <span class='nobr'>The GPX file<\/span> it produces is not\neven standards compliant, because it uses simple Strava extensions not published as <span class='nobr'>a DTD.<\/span> This is why I'm trying GitHub, to allow\nothers to make these changes if they like.<\/p>\n\n<div class='ic' itemscope itemtype='http:\/\/schema.org\/Photograph'><a name=\"i14324\" href='\/i\/JF100_14324.jpg' itemprop='image'\n><img loading=\"lazy\" decoding=\"async\" src=\"\/i\/JF100_14324_sm.jpg\" width=\"690\" height=\"461\"\nalt=\"\"\nid=\"i14324\"\/><\/a>\n<br\/><span class=\"camera-info robots-nocontent\">Panasonic LX100 at an effective 28mm &mdash; <sup>1<\/sup><big>\/<\/big>125 sec, <span class='f'>f<\/span>\/2.1, ISO 2500 &mdash;\n<a href='\/imageinfo.cgi?url=http%3A%2F%2Fregex.info%2Fi%2FJF100_14324.jpg'>map &amp; image data<\/a> &mdash; <a href='\/blog\/proximity\/i\/JF100_14324.jpg'>nearby photos<\/a><\/span>\n<br\/><span class='caption'>Life With Garmin<\/span>\n<br\/>down a black hole\n<br><span class='subtle'>( from <a href='\/blog\/2017-03-21\/2784' style='color:#888'>this ride<\/a> )<\/span>\n<meta itemprop='url' content='http:\/\/regex.info\/i\/JF100_14324.jpg'\/>\n<meta itemprop='creator' content='Jeffrey Friedl'\/>\n<meta itemprop='copyrightHolder' content='Jeffrey Friedl'\/>\n<meta itemprop='dateCreated' content='2017-03-13'\/><\/div>\n\n\n\n\n\n","protected":false},"excerpt":{"rendered":"<p>I've complained for more than a decade about what a horrible company Garmin is (such as here in 2006, here in 2013, and here last year, among others). The only thing worse than their hardware design is their software design, but it's a strong competition to the bottom, backed by an apparent company-wide disdain for their customers.<\/p> <p>The latest evidence of this disdain is new firmware for some of their cycling computers that renders them utterly incompatible with Garmin's own desktop software, and, for good measure, almost all other track-processing software in existence. Of course, this \"feature\" is not even [...]","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[30,1,4],"tags":[],"_links":{"self":[{"href":"https:\/\/regex.info\/blog\/wp-json\/wp\/v2\/posts\/2799"}],"collection":[{"href":"https:\/\/regex.info\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/regex.info\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/regex.info\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/regex.info\/blog\/wp-json\/wp\/v2\/comments?post=2799"}],"version-history":[{"count":0,"href":"https:\/\/regex.info\/blog\/wp-json\/wp\/v2\/posts\/2799\/revisions"}],"wp:attachment":[{"href":"https:\/\/regex.info\/blog\/wp-json\/wp\/v2\/media?parent=2799"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/regex.info\/blog\/wp-json\/wp\/v2\/categories?post=2799"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/regex.info\/blog\/wp-json\/wp\/v2\/tags?post=2799"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}