Initial commit

Signed-off-by: Thomas Klaehn <thomas.klaehn@perinet.io>
This commit is contained in:
Thomas Klaehn
2026-02-08 07:28:32 +00:00
commit 2945d90d24
25 changed files with 3177 additions and 0 deletions

104
example/README.md Normal file
View File

@@ -0,0 +1,104 @@
# FIT Parser Example
This directory contains a complete example application that demonstrates how to use the FIT parser.
## Running the Example
```bash
# From the example directory
go run main.go testdata/Activity.fit
# Or from the repository root
go run example/main.go example/testdata/Activity.fit
```
## Available Test Files
The `testdata/` directory contains several example FIT files:
- **Activity.fit** - Full activity file with GPS, heart rate, power, and cadence data
- **Settings.fit** - Simple device settings file
- **MonitoringFile.fit** - Daily monitoring data
- **WorkoutIndividualSteps.fit** - Workout definition
- **RealWorld_Cycling.fit** - Real-world cycling activity from Wahoo ELEMNT
## What the Example Does
The example program:
1. Reads and validates the FIT file
2. Decodes all messages with CRC validation
3. Displays file information (type, manufacturer, timestamps)
4. Shows activity summaries (distance, time, heart rate, power, etc.)
5. Prints sample data records with GPS coordinates, speed, and sensor data
## Example Output
```
File: testdata/Activity.fit (94096 bytes)
============================================================
Header Information:
FIT Header: Protocol v2.0, Profile v21158, DataSize=94080 bytes
Decoded 3611 messages
Message Type Summary:
FileId : 1 messages
Record : 3601 messages
Session : 1 messages
Lap : 1 messages
Event : 2 messages
DeviceInfo : 1 messages
Activity : 1 messages
📊 Session Summary:
Sport: Unknown
Total Time: 60.02 minutes
Average Heart Rate: 145 bpm
Max Heart Rate: 178 bpm
```
## Using in Your Own Code
```go
package main
import (
"fmt"
"log"
"os"
"git.blackfinn.de/go/fit-parser/fitparser"
)
func main() {
// Read FIT file
data, err := os.ReadFile("activity.fit")
if err != nil {
log.Fatal(err)
}
// Create decoder
decoder, err := fitparser.NewDecoder(data)
if err != nil {
log.Fatal(err)
}
// Decode with CRC validation (enabled by default)
messages, err := decoder.Decode()
if err != nil {
log.Fatal(err)
}
// Process messages
for _, msg := range messages {
switch msg.Num {
case fitparser.MesgNumRecord:
// Process data records
if hr, ok := msg.GetFieldValueUint8(fitparser.FieldRecordHeartRate); ok {
fmt.Printf("Heart Rate: %d bpm\n", hr)
}
}
}
}
```