FIT Parser Example
This directory contains a complete example application that demonstrates how to use the FIT parser.
Running the Example
# 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:
- Reads and validates the FIT file
- Decodes all messages with CRC validation
- Displays file information (type, manufacturer, timestamps)
- Shows activity summaries (distance, time, heart rate, power, etc.)
- 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
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)
}
}
}
}