From fb8883c185713aeaf15cdbe79a09e75ea9211513 Mon Sep 17 00:00:00 2001 From: Filip Date: Sat, 27 Sep 2025 19:41:36 +0200 Subject: [PATCH] Initial fit file parsing. --- src/corchestrate/__init__.py | 1 + src/corchestrate/parse.py | 38 ++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 src/corchestrate/parse.py diff --git a/src/corchestrate/__init__.py b/src/corchestrate/__init__.py index e69de29..20433f0 100644 --- a/src/corchestrate/__init__.py +++ b/src/corchestrate/__init__.py @@ -0,0 +1 @@ +from corchestrate.measurement import Measurement \ No newline at end of file diff --git a/src/corchestrate/parse.py b/src/corchestrate/parse.py new file mode 100644 index 0000000..dc78b6c --- /dev/null +++ b/src/corchestrate/parse.py @@ -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) + ]