@@ -101,6 +101,12 @@ func (p *Preprocessor) AggregateByTimestamp(records []Record) []Record {
101
101
rec .Altitude = next .Altitude
102
102
}
103
103
104
+ if rec .EnhancedAltitude != basetype .Uint32Invalid && next .EnhancedAltitude != basetype .Uint32Invalid {
105
+ rec .EnhancedAltitude = uint32 ((uint64 (rec .EnhancedAltitude ) + uint64 (next .EnhancedAltitude )) / 2 )
106
+ } else if next .EnhancedAltitude != basetype .Uint32Invalid {
107
+ rec .EnhancedAltitude = next .EnhancedAltitude
108
+ }
109
+
104
110
if rec .Cadence != basetype .Uint8Invalid && next .Cadence != basetype .Uint8Invalid {
105
111
rec .Cadence = uint8 ((uint16 (rec .Cadence ) + uint16 (next .Cadence )) / 2 )
106
112
} else if next .Cadence != basetype .Uint8Invalid {
@@ -113,6 +119,12 @@ func (p *Preprocessor) AggregateByTimestamp(records []Record) []Record {
113
119
rec .Speed = next .Speed
114
120
}
115
121
122
+ if rec .EnhancedSpeed != basetype .Uint32Invalid && next .Speed != basetype .Uint16Invalid {
123
+ rec .EnhancedSpeed = uint32 ((uint64 (rec .EnhancedSpeed ) + uint64 (next .EnhancedSpeed )) / 2 )
124
+ } else if next .EnhancedSpeed != basetype .Uint32Invalid {
125
+ rec .EnhancedSpeed = next .EnhancedSpeed
126
+ }
127
+
116
128
if rec .Distance != basetype .Uint32Invalid && next .Distance != basetype .Uint32Invalid {
117
129
rec .Distance = uint32 ((uint64 (rec .Distance ) + uint64 (next .Distance )) / 2 )
118
130
} else if next .Distance != basetype .Uint32Invalid {
@@ -186,8 +198,11 @@ func (p *Preprocessor) SmoothingElevation(records []Record) {
186
198
// Copy altitude value
187
199
for i := range records {
188
200
rec := & records [i ]
189
- if rec .Altitude != basetype .Uint16Invalid {
201
+ switch {
202
+ case rec .Altitude != basetype .Uint16Invalid :
190
203
rec .SmoothedAltitude = rec .AltitudeScaled ()
204
+ case rec .EnhancedAltitude != basetype .Uint32Invalid :
205
+ rec .SmoothedAltitude = rec .EnhancedAltitudeScaled ()
191
206
}
192
207
}
193
208
@@ -226,6 +241,9 @@ func (p *Preprocessor) CalculateGrade(records []Record) {
226
241
if math .IsNaN (altitude ) {
227
242
altitude = rec .AltitudeScaled ()
228
243
}
244
+ if math .IsNaN (altitude ) {
245
+ altitude = rec .EnhancedAltitudeScaled ()
246
+ }
229
247
230
248
if rec .Distance == basetype .Uint32Invalid || math .IsNaN (altitude ) {
231
249
continue
@@ -239,6 +257,9 @@ func (p *Preprocessor) CalculateGrade(records []Record) {
239
257
if math .IsNaN (nextAltitude ) {
240
258
nextAltitude = next .AltitudeScaled ()
241
259
}
260
+ if math .IsNaN (nextAltitude ) {
261
+ nextAltitude = next .EnhancedAltitudeScaled ()
262
+ }
242
263
243
264
if next .Distance == basetype .Uint32Invalid || math .IsNaN (nextAltitude ) {
244
265
continue
@@ -273,11 +294,15 @@ func (p *Preprocessor) CalculatePace(sport typedef.Sport, records []Record) {
273
294
continue
274
295
}
275
296
276
- if ! IsConsideredMoving (sport , rec .SpeedScaled ()) {
297
+ speed := rec .SpeedScaled ()
298
+ if math .IsNaN (speed ) {
299
+ speed = rec .EnhancedSpeedScaled ()
300
+ }
301
+ if ! IsConsideredMoving (sport , speed ) {
277
302
continue
278
303
}
279
304
280
- if rec . Speed == basetype . Uint16Invalid {
305
+ if math . IsNaN ( speed ) {
281
306
pointDistance := rec .DistanceScaled () - prev .DistanceScaled ()
282
307
elapsed := rec .Timestamp .Sub (prev .Timestamp ).Seconds ()
283
308
pointDistanceInKM := pointDistance / 1000
@@ -286,7 +311,7 @@ func (p *Preprocessor) CalculatePace(sport typedef.Sport, records []Record) {
286
311
}
287
312
rec .Pace = elapsed / pointDistanceInKM
288
313
} else {
289
- speedkph := rec . SpeedScaled () * 3.6
314
+ speedkph := speed * 3.6
290
315
rec .Pace = (1 / speedkph ) * 60 * 60
291
316
}
292
317
}
0 commit comments