Initial fit file parsing.

This commit is contained in:
Filip 2025-09-27 19:41:36 +02:00
parent bf25559ef2
commit fb8883c185
2 changed files with 39 additions and 0 deletions

View file

@ -0,0 +1 @@
from corchestrate.measurement import Measurement

38
src/corchestrate/parse.py Normal file
View file

@ -0,0 +1,38 @@
from datetime import datetime
from corchestrate.measurement import Measurement
from garmin_fit_sdk import Stream, Decoder
TO_DEGREES = 180 / (2**31)
def from_fit_file_path(fit_file_path: str) -> list[Measurement]:
stream = Stream.from_file(fit_file_path)
decoder = Decoder(stream)
messages, _ = decoder.read()
records = messages["record_mesgs"]
def convert_to_measurement(record) -> Measurement:
measurement = Measurement(record.get("timestamp"))
measurement.heart_rate = record.get("heart_rate")
measurement.speed = record.get("enhanced_speed")
measurement.cadence = record.get("cadence")
measurement.power = record.get("power")
measurement.respiration_rate = record.get("respiration_rate")
measurement.temperature = record.get("temperature")
measurement.latitude = record.get(
"position_lat") * TO_DEGREES if "position_lat" in record else None
measurement.longitude = record.get(
"position_long"
) * TO_DEGREES if "position_long" in record else None
measurement.elevation = record.get("enhanced_altitude")
return measurement
dummy = datetime.fromordinal(1)
def has_timestamp(record) -> bool:
return type(record.get("timestamp")) == type(dummy)
return [
convert_to_measurement(record) for record in records
if has_timestamp(record)
]