From 7a484485a165754e74f1c09093c37bb7b8bfa2a2 Mon Sep 17 00:00:00 2001 From: Andrew Nichols Date: Mon, 9 Mar 2026 14:00:27 -0400 Subject: [PATCH 1/2] bug-fix: translate internal units for distance and speed into FIT units distance is held as *meters* internally and as *centimeters* for FIT speed is held as 10m/hour internally and as mm/s for FIT Closes: #51 --- src/record.rs | 6 ++++-- src/trainer.rs | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/record.rs b/src/record.rs index 57c3d3f..3698807 100644 --- a/src/record.rs +++ b/src/record.rs @@ -83,7 +83,8 @@ fn to_message(data: &BikeData) -> Message { rec.power = power; } if let Some(speed) = data.speed { - rec.speed = speed; + // Translate from 10m/hour (our internal unit) => mm/second (the FIT unit) + rec.speed = (speed as f32 * 2.777) as u16; } if let Some(heart_rate) = data.heart_rate { rec.heart_rate = heart_rate; @@ -92,7 +93,8 @@ fn to_message(data: &BikeData) -> Message { rec.resistance = resistance; } if let Some(distance) = data.distance { - rec.distance = distance; + // Translate from meters (our internal unit) => centimeters (the FIT unit) + rec.distance = distance * 100; } rec.timestamp = to_fit_datetime(data.time); diff --git a/src/trainer.rs b/src/trainer.rs index 7c19b7f..fe73e43 100644 --- a/src/trainer.rs +++ b/src/trainer.rs @@ -252,7 +252,7 @@ mod tests { } if field.num == mesgdef::Record::SPEED { - assert_eq!(field.value.as_u16(), 20) + assert_eq!(field.value.as_u16(), 55) } if field.num == mesgdef::Record::HEART_RATE { @@ -281,7 +281,7 @@ mod tests { } if field.num == mesgdef::Record::SPEED { - assert_eq!(field.value.as_u16(), 20) + assert_eq!(field.value.as_u16(), 55) } if field.num == mesgdef::Record::HEART_RATE { From 6a3b99783ba0a54977d06749011300da74516202 Mon Sep 17 00:00:00 2001 From: Andrew Nichols Date: Mon, 9 Mar 2026 14:00:27 -0400 Subject: [PATCH 2/2] bug-fix: fix session distance to match record distance --- CHANGELOG.md | 4 +++- src/record.rs | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e3636a..c409023 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] -Nothing yet! +### Fixed + +* fix: properly translate the `BikeData` internal units to the FIT file units ## [0.3.0] diff --git a/src/record.rs b/src/record.rs index 3698807..969f4b3 100644 --- a/src/record.rs +++ b/src/record.rs @@ -41,7 +41,10 @@ fn to_fit(data: &mut [BikeData]) -> FIT { // NOTE: required messages and fields via // https://developer.garmin.com/fit/file-types/activity/ - let total_dist: u32 = data.iter().map(|bd| bd.distance.unwrap_or_default()).sum(); + let total_dist: u32 = data + .iter() + .map(|bd| bd.distance.unwrap_or_default() * 100) + .sum(); let mut messages: Vec = data.iter().map(to_message).collect(); messages.insert(0, Message::from(get_file_id(start))); messages.push(Message::from(get_activity(start)));