Skip to content

Commit 0ad888b

Browse files
author
mavenh80
committed
Added support for TrackPointExtension v2 urls
1 parent a52148e commit 0ad888b

3 files changed

Lines changed: 75 additions & 2 deletions

File tree

st-exerciseviewer/misc/testdata/gpx/bike-tour-garmin-oregon-with-heartrate_v2.gpx

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

st-exerciseviewer/src/main/kotlin/de/saring/exerciseviewer/parser/impl/TopoGrafixGpxParser.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ class TopoGrafixGpxParser : AbstractExerciseParser() {
3131
private val earthRadiosInMeter: Double = 6371000.0
3232

3333
private val namespace = Namespace.getNamespace("http://www.topografix.com/GPX/1/1")
34-
private val namespaceExt = Namespace.getNamespace("http://www.garmin.com/xmlschemas/TrackPointExtension/v1")
34+
private val namespaceExtV1 = Namespace.getNamespace("http://www.garmin.com/xmlschemas/TrackPointExtension/v1")
35+
private val namespaceExtV2 = Namespace.getNamespace("http://www.garmin.com/xmlschemas/TrackPointExtension/v2")
3536

3637
override
3738
val info = ExerciseParserInfo("TopoGrafix GPX", listOf("gpx", "GPX"))
@@ -136,7 +137,10 @@ class TopoGrafixGpxParser : AbstractExerciseParser() {
136137
}
137138

138139
// try to get heartrate in Garmin Oregon format if present
139-
var strHeartrate = eTrkPt.getChild("extensions", namespace)?.getChild("TrackPointExtension", namespaceExt)?.getChildText("hr", namespaceExt)
140+
var strHeartrate = eTrkPt.getChild("extensions", namespace)?.getChild("TrackPointExtension", namespaceExtV1)?.getChildText("hr", namespaceExtV1)
141+
if (strHeartrate == null) {
142+
strHeartrate = eTrkPt.getChild("extensions", namespace)?.getChild("TrackPointExtension", namespaceExtV2)?.getChildText("hr", namespaceExtV2)
143+
}
140144
// if not present, try to get heartrate in Holux FunTrek 130 pro format if present
141145
if (strHeartrate == null) {
142146
strHeartrate = eTrkPt.getChild("extensions", namespace)?.getChildText("bpm", namespace)

st-exerciseviewer/src/test/kotlin/de/saring/exerciseviewer/parser/impl/TopoGrafixGpxParserTest.kt

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,74 @@ class TopoGrafixGpxParserTest {
159159
assertEquals(32.644943f, exercise.sampleList[203].speed)
160160
assertEquals(154.toShort(), exercise.sampleList[203].heartRate)
161161
}
162+
163+
/**
164+
* This test parses a GPX file for a bike tour created by Garmin Oregon with heart rate monitor using TrackPointExtension v2.
165+
* It contains track (location), time, altitude and heart rate data.
166+
*/
167+
@Test
168+
fun testGpxGarminOregonHeartRateBikeTourv2() {
169+
val exercise = parser.parseExercise("misc/testdata/gpx/bike-tour-garmin-oregon-with-heartrate_v2.gpx")
170+
171+
// check basic exercise data
172+
assertEquals(EVExercise.ExerciseFileType.GPX, exercise.fileType)
173+
assertEquals("Garmin GPX", exercise.deviceName)
174+
assertEquals(EVExercise.DYNAMIC_RECORDING_INTERVAL, exercise.recordingInterval)
175+
assertTrue(exercise.recordingMode.isHeartRate)
176+
assertTrue(exercise.recordingMode.isAltitude)
177+
assertTrue(exercise.recordingMode.isSpeed)
178+
assertTrue(exercise.recordingMode.isHeartRate)
179+
assertFalse(exercise.recordingMode.isCadence)
180+
assertFalse(exercise.recordingMode.isPower)
181+
assertFalse(exercise.recordingMode.isTemperature)
182+
assertTrue(exercise.recordingMode.isLocation)
183+
assertFalse(exercise.recordingMode.isIntervalExercise)
184+
185+
// Check exercise time and duration
186+
assertEquals(LocalDateTime.of(2012, 3, 2, 6, 53, 51), exercise.dateTime)
187+
assertEquals(6090, exercise.duration)
188+
189+
// check altitude data
190+
assertEquals(32.toShort(), exercise.altitude!!.altitudeMin)
191+
assertEquals(41.toShort(), exercise.altitude!!.altitudeAvg)
192+
assertEquals(53.toShort(), exercise.altitude!!.altitudeMax)
193+
assertEquals(41, exercise.altitude!!.ascent)
194+
195+
// check speed summary data
196+
assertEquals(37.978153f, exercise.speed!!.speedMax)
197+
assertEquals(4494, exercise.speed!!.distance)
198+
assertEquals(26.565517f, exercise.speed!!.speedAvg)
199+
200+
// check heartRate data
201+
assertEquals(152.toShort(), exercise.heartRateAVG)
202+
assertEquals(169.toShort(), exercise.heartRateMax)
203+
204+
// check sample data
205+
assertEquals(204, exercise.sampleList.size)
206+
207+
assertEquals(0L, exercise.sampleList[0].timestamp)
208+
assertEquals(50.823521, exercise.sampleList[0].position!!.latitude, 0.00001)
209+
assertEquals(4.672067, exercise.sampleList[0].position!!.longitude, 0.00001)
210+
assertEquals(52.toShort(), exercise.sampleList[0].altitude)
211+
assertEquals(0f, exercise.sampleList[0].speed)
212+
assertEquals(158.toShort(), exercise.sampleList[0].heartRate)
213+
assertNull(exercise.sampleList[0].cadence)
214+
assertEquals(0, exercise.sampleList[0].distance)
215+
216+
assertEquals(303000L, exercise.sampleList[101].timestamp)
217+
assertEquals(50.816284, exercise.sampleList[101].position!!.latitude, 0.00001)
218+
assertEquals(4.65173, exercise.sampleList[101].position!!.longitude, 0.00001)
219+
assertEquals(45.toShort(), exercise.sampleList[101].altitude)
220+
assertEquals(36.26108f, exercise.sampleList[101].speed)
221+
assertEquals(156.toShort(), exercise.sampleList[101].heartRate)
222+
223+
assertEquals(609000L, exercise.sampleList[203].timestamp)
224+
assertEquals(50.802288, exercise.sampleList[203].position!!.latitude, 0.00001)
225+
assertEquals(4.639261, exercise.sampleList[203].position!!.longitude, 0.00001)
226+
assertEquals(33.toShort(), exercise.sampleList[203].altitude)
227+
assertEquals(32.644943f, exercise.sampleList[203].speed)
228+
assertEquals(154.toShort(), exercise.sampleList[203].heartRate)
229+
}
162230

163231
/**
164232
* This test parses a GPX file for a bike tour created by Holux FunTrek 130 pro with heart rate monitor.

0 commit comments

Comments
 (0)