@@ -27,6 +27,7 @@ import (
27
27
"github.com/muktihari/fit/encoder"
28
28
"github.com/muktihari/fit/kit/datetime"
29
29
"github.com/muktihari/fit/profile/filedef"
30
+ "github.com/muktihari/fit/profile/mesgdef"
30
31
"github.com/muktihari/fit/profile/typedef"
31
32
"github.com/muktihari/fit/proto"
32
33
"github.com/openivity/activity-service/activity"
@@ -69,19 +70,19 @@ func (s *DecodeEncoder) Decode(ctx context.Context, r io.Reader) ([]activity.Act
69
70
for dec .Next () {
70
71
fileId , err := dec .PeekFileId ()
71
72
if err != nil {
72
- return nil , err
73
+ return nil , fmt . Errorf ( "could not peek: %w" , err )
73
74
}
74
75
75
76
if fileId .Type != typedef .FileActivity {
76
77
if err = dec .Discard (); err != nil {
77
- return nil , err
78
+ return nil , fmt . Errorf ( "could not discard: %w" , err )
78
79
}
79
80
continue
80
81
}
81
82
82
83
_ , err = dec .DecodeWithContext (ctx )
83
84
if err != nil {
84
- return nil , err
85
+ return nil , fmt . Errorf ( "could not decode: %w" , err )
85
86
}
86
87
87
88
activityFile := lis .File ().(* filedef.Activity )
@@ -130,6 +131,8 @@ func (s *DecodeEncoder) convertToActivity(activityFile *filedef.Activity) activi
130
131
act := activity.Activity {
131
132
Creator : activity .CreateCreator (& fileId ),
132
133
Timezone : timezone ,
134
+ SplitSummaries : activityFile .SplitSummaries ,
135
+ Activity : activityFile .Activity ,
133
136
UnrelatedMessages : s .handleUnrelatedMessages (activityFile ),
134
137
}
135
138
@@ -264,6 +267,10 @@ func (s *DecodeEncoder) handleUnrelatedMessages(activityFile *filedef.Activity)
264
267
len (activityFile .WorkoutSteps ) +
265
268
len (activityFile .HRs ) +
266
269
len (activityFile .HRVs ) +
270
+ len (activityFile .GpsMetadatas ) +
271
+ len (activityFile .TimeInZones ) +
272
+ len (activityFile .Splits ) +
273
+ len (activityFile .Sports ) +
267
274
len (activityFile .UnrelatedMessages )
268
275
269
276
if activityFile .UserProfile != nil {
@@ -308,6 +315,18 @@ func (s *DecodeEncoder) handleUnrelatedMessages(activityFile *filedef.Activity)
308
315
for i := range activityFile .HRVs {
309
316
unrelatedMessages = append (unrelatedMessages , activityFile .HRVs [i ].ToMesg (nil ))
310
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
+ }
311
330
312
331
unrelatedMessages = append (unrelatedMessages , activityFile .UnrelatedMessages ... )
313
332
@@ -330,7 +349,7 @@ func (s *DecodeEncoder) Encode(ctx context.Context, activities []activity.Activi
330
349
331
350
enc .Reset (bufAt ,
332
351
encoder .WithProtocolVersion (proto .V2 ),
333
- encoder .WithNormalHeader ( 15 ),
352
+ encoder .WithHeaderOption ( encoder . HeaderOptionNormal , 15 ),
334
353
)
335
354
if err := enc .EncodeWithContext (ctx , & fit ); err != nil {
336
355
return nil , fmt .Errorf ("could not encode: %w" , err )
@@ -344,8 +363,10 @@ func (s *DecodeEncoder) Encode(ctx context.Context, activities []activity.Activi
344
363
345
364
func (s * DecodeEncoder ) makeLastSummary (a * activity.Activity ) {
346
365
var lastTimestamp time.Time
366
+ var totalTimerTime uint32
347
367
for i := len (a .Sessions ) - 1 ; i >= 0 ; i -- {
348
368
ses := a .Sessions [i ]
369
+ totalTimerTime += ses .TotalTimerTime
349
370
350
371
for j := len (ses .Records ) - 1 ; j >= 0 ; j -- {
351
372
rec := ses .Records [j ]
@@ -371,6 +392,16 @@ func (s *DecodeEncoder) makeLastSummary(a *activity.Activity) {
371
392
for i := range a .Sessions {
372
393
a .Sessions [i ].Timestamp = lastTimestamp
373
394
}
395
+
396
+ if a .Activity == nil {
397
+ a .Activity = mesgdef .NewActivity (nil )
398
+ }
399
+
400
+ a .Activity .Timestamp = lastTimestamp
401
+ a .Activity .LocalTimestamp = lastTimestamp .Add (time .Duration (a .Timezone ) * time .Hour )
402
+ a .Activity .TotalTimerTime = totalTimerTime
403
+ a .Activity .Type = typedef .ActivityAutoMultiSport
404
+ a .Activity .NumSessions = uint16 (len (a .Sessions ))
374
405
}
375
406
376
407
// bytesBufferAt wraps bytes.Buffer to implement io.WriterAt enabling fast encoding.
0 commit comments