@@ -26,6 +26,7 @@ import (
26
26
"github.com/muktihari/fit/decoder"
27
27
"github.com/muktihari/fit/encoder"
28
28
"github.com/muktihari/fit/kit/datetime"
29
+ "github.com/muktihari/fit/profile/basetype"
29
30
"github.com/muktihari/fit/profile/filedef"
30
31
"github.com/muktihari/fit/profile/mesgdef"
31
32
"github.com/muktihari/fit/profile/typedef"
@@ -57,6 +58,9 @@ func (s *DecodeEncoder) Decode(ctx context.Context, r io.Reader) ([]activity.Act
57
58
lis := filedef .NewListener ()
58
59
defer lis .Close ()
59
60
61
+ lis .Reset (filedef .WithFileFunc (typedef .FileActivity ,
62
+ func () filedef.File { return & wrapActivity {activity : filedef .NewActivity ()} }))
63
+
60
64
dec := decoderPool .Get ().(* decoder.Decoder )
61
65
defer decoderPool .Put (dec )
62
66
@@ -85,12 +89,12 @@ func (s *DecodeEncoder) Decode(ctx context.Context, r io.Reader) ([]activity.Act
85
89
return nil , fmt .Errorf ("could not decode: %w" , err )
86
90
}
87
91
88
- activityFile := lis .File ().(* filedef. Activity )
89
- if len (activityFile .Records ) == 0 {
92
+ wa := lis .File ().(* wrapActivity )
93
+ if len (wa . activity .Records ) == 0 {
90
94
continue
91
95
}
92
96
93
- activities = append (activities , s .convertToActivity (activityFile ))
97
+ activities = append (activities , s .convertToActivity (wa . activity ))
94
98
}
95
99
96
100
if len (activities ) == 0 {
@@ -131,9 +135,10 @@ func (s *DecodeEncoder) convertToActivity(activityFile *filedef.Activity) activi
131
135
act := activity.Activity {
132
136
Creator : activity .CreateCreator (& fileId ),
133
137
Timezone : timezone ,
138
+ Sports : activityFile .Sports ,
134
139
SplitSummaries : activityFile .SplitSummaries ,
135
140
Activity : activityFile .Activity ,
136
- UnrelatedMessages : s . handleUnrelatedMessages ( activityFile ) ,
141
+ UnrelatedMessages : activityFile . UnrelatedMessages ,
137
142
}
138
143
139
144
// Convert Records, Laps and Sessions to activity's structs
@@ -255,84 +260,6 @@ func (s *DecodeEncoder) recalculateSummary(ses *activity.Session) {
255
260
ses .Summarize ()
256
261
}
257
262
258
- func (s * DecodeEncoder ) handleUnrelatedMessages (activityFile * filedef.Activity ) []proto.Message {
259
- size := len (activityFile .DeveloperDataIds ) +
260
- len (activityFile .FieldDescriptions ) +
261
- len (activityFile .DeviceInfos ) +
262
- len (activityFile .Events ) +
263
- len (activityFile .Lengths ) +
264
- len (activityFile .SegmentLaps ) +
265
- len (activityFile .ZonesTargets ) +
266
- len (activityFile .Workouts ) +
267
- len (activityFile .WorkoutSteps ) +
268
- len (activityFile .HRs ) +
269
- len (activityFile .HRVs ) +
270
- len (activityFile .GpsMetadatas ) +
271
- len (activityFile .TimeInZones ) +
272
- len (activityFile .Splits ) +
273
- len (activityFile .Sports ) +
274
- len (activityFile .UnrelatedMessages )
275
-
276
- if activityFile .UserProfile != nil {
277
- size += 1
278
- }
279
-
280
- unrelatedMessages := make ([]proto.Message , 0 , size )
281
-
282
- for i := range activityFile .DeveloperDataIds {
283
- unrelatedMessages = append (unrelatedMessages , activityFile .DeveloperDataIds [i ].ToMesg (nil ))
284
- }
285
- for i := range activityFile .FieldDescriptions {
286
- unrelatedMessages = append (unrelatedMessages , activityFile .FieldDescriptions [i ].ToMesg (nil ))
287
- }
288
- if activityFile .UserProfile != nil {
289
- unrelatedMessages = append (unrelatedMessages , activityFile .UserProfile .ToMesg (nil ))
290
- }
291
- for i := range activityFile .DeviceInfos {
292
- unrelatedMessages = append (unrelatedMessages , activityFile .DeviceInfos [i ].ToMesg (nil ))
293
- }
294
- for i := range activityFile .Events {
295
- unrelatedMessages = append (unrelatedMessages , activityFile .Events [i ].ToMesg (nil ))
296
- }
297
- for i := range activityFile .Lengths {
298
- unrelatedMessages = append (unrelatedMessages , activityFile .Lengths [i ].ToMesg (nil ))
299
- }
300
- for i := range activityFile .SegmentLaps {
301
- unrelatedMessages = append (unrelatedMessages , activityFile .SegmentLaps [i ].ToMesg (nil ))
302
- }
303
- for i := range activityFile .ZonesTargets {
304
- unrelatedMessages = append (unrelatedMessages , activityFile .ZonesTargets [i ].ToMesg (nil ))
305
- }
306
- for i := range activityFile .Workouts {
307
- unrelatedMessages = append (unrelatedMessages , activityFile .Workouts [i ].ToMesg (nil ))
308
- }
309
- for i := range activityFile .WorkoutSteps {
310
- unrelatedMessages = append (unrelatedMessages , activityFile .WorkoutSteps [i ].ToMesg (nil ))
311
- }
312
- for i := range activityFile .HRs {
313
- unrelatedMessages = append (unrelatedMessages , activityFile .HRs [i ].ToMesg (nil ))
314
- }
315
- for i := range activityFile .HRVs {
316
- unrelatedMessages = append (unrelatedMessages , activityFile .HRVs [i ].ToMesg (nil ))
317
- }
318
- for i := range activityFile .GpsMetadatas {
319
- unrelatedMessages = append (unrelatedMessages , activityFile .GpsMetadatas [i ].ToMesg (nil ))
320
- }
321
- for i := range activityFile .TimeInZones {
322
- unrelatedMessages = append (unrelatedMessages , activityFile .TimeInZones [i ].ToMesg (nil ))
323
- }
324
- for i := range activityFile .Splits {
325
- unrelatedMessages = append (unrelatedMessages , activityFile .Splits [i ].ToMesg (nil ))
326
- }
327
- for i := range activityFile .Sports {
328
- unrelatedMessages = append (unrelatedMessages , activityFile .Sports [i ].ToMesg (nil ))
329
- }
330
-
331
- unrelatedMessages = append (unrelatedMessages , activityFile .UnrelatedMessages ... )
332
-
333
- return unrelatedMessages
334
- }
335
-
336
263
func (s * DecodeEncoder ) Encode (ctx context.Context , activities []activity.Activity ) ([][]byte , error ) {
337
264
buf := mem .GetBuffer ()
338
265
defer mem .PutBuffer (buf )
@@ -344,8 +271,26 @@ func (s *DecodeEncoder) Encode(ctx context.Context, activities []activity.Activi
344
271
345
272
bs := make ([][]byte , len (activities ))
346
273
for i := range activities {
347
- s .makeLastSummary (& activities [i ])
348
- fit := activities [i ].ToFIT (nil )
274
+ a := & activities [i ]
275
+ s .makeLastSummary (a )
276
+
277
+ wa := wrapActivity {activity : filedef .NewActivity ()}
278
+ wa .activity .FileId = * a .Creator .FileId
279
+ for j := range a .Sessions {
280
+ ses := & a .Sessions [j ]
281
+ for k := range ses .Laps {
282
+ wa .activity .Laps = append (wa .activity .Laps , ses .Laps [k ].Lap )
283
+ }
284
+ for k := range ses .Records {
285
+ wa .activity .Records = append (wa .activity .Records , ses .Records [k ].Record )
286
+ }
287
+ wa .activity .Sessions = append (wa .activity .Sessions , ses .Session )
288
+ }
289
+ wa .activity .SplitSummaries = a .SplitSummaries
290
+ wa .activity .Activity = a .Activity
291
+ wa .activity .UnrelatedMessages = a .UnrelatedMessages
292
+
293
+ fit := wa .ToFIT (nil )
349
294
350
295
enc .Reset (bufAt ,
351
296
encoder .WithProtocolVersion (proto .V2 ),
@@ -389,6 +334,19 @@ func (s *DecodeEncoder) makeLastSummary(a *activity.Activity) {
389
334
}
390
335
}
391
336
337
+ // Ensure we got the latest timestamp across all messages.
338
+ lastTimestampUint32 := datetime .ToUint32 (lastTimestamp )
339
+ for i := range a .UnrelatedMessages {
340
+ timestamp := a .UnrelatedMessages [i ].FieldValueByNum (proto .FieldNumTimestamp ).Uint32 ()
341
+ if timestamp == basetype .Uint32Invalid {
342
+ continue
343
+ }
344
+ if timestamp < lastTimestampUint32 {
345
+ break
346
+ }
347
+ lastTimestamp = datetime .ToTime (timestamp ) // We get latest timestamp
348
+ }
349
+
392
350
for i := range a .Sessions {
393
351
a .Sessions [i ].Timestamp = lastTimestamp
394
352
}
0 commit comments