This guide walks through the most common FitAPI.jl usage patterns.
using FitAPI
fit = readfit("data/sdk/Activity.fit")readfit performs:
- low-level parse
- profile-aware high-level decode
- grouping by logical message name from the FIT global profile
records = messages(fit; name=:record)
laps = messages(fit; name=:lap)
unknown = messages(fit; name=:unknown)
record = first(records)
fieldvalue(record, :timestamp)
fieldvalue(record, :distance)messages(fit; name=:unknown) is an aggregate over any messages that are not present in the loaded global profile.
rows_wide = to_table(fit; message=:record, extras_policy=:wide)
rows_long = to_table(fit; message=:record, extras_policy=:long)Use :wide when you want one row per record and dynamic extra columns.
Use :long when you want one row per decoded field, including raw value, units, source, and developer metadata.
core = parsefit("data/sdk/Activity.fit")
for msg in eachmessage("data/sdk/Activity.fit")
# msg is a DefinitionMessage or DataMessage
endUse this when you need strict control over raw message handling.
opts = ParserOptions(validate_crc=true, strict=true, enable_logging=false)
fit = readfit("data/sdk/Activity.fit"; options=opts)decode = DecodeOptions(
process_invalids=true,
decode_enums=true,
apply_scale_offset=true,
convert_datetime=true,
)
fit = readfit("data/sdk/Activity.fit"; decode=decode)- For complete signatures and return types, see API.md
- For operational issues and malformed input behavior, see TROUBLESHOOTING.md