From a1ee851c366182f46d7597292e3156ac7f2da6f7 Mon Sep 17 00:00:00 2001 From: Alejandro Martinez Date: Fri, 13 Nov 2015 18:52:52 -0300 Subject: [PATCH] Fixes Lap Swimming FIT import from Garmin 920xt It generates both record and length messages for each length, we use length messages to recognize lap swimming and filter out record messages. Includes test file contributed by Jonathan Beverley --- src/FitRideFile.cpp | 18 +++++++++++++++++- test/rides/lap_swim_test_FR920xt.FIT | Bin 0 -> 20805 bytes 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 test/rides/lap_swim_test_FR920xt.FIT diff --git a/src/FitRideFile.cpp b/src/FitRideFile.cpp index 8f26718d7..983b3b397 100644 --- a/src/FitRideFile.cpp +++ b/src/FitRideFile.cpp @@ -86,6 +86,7 @@ struct FitFileReaderState int calibration; int devices; bool stopped; + bool isLapSwim; int last_event_type; int last_event; int last_msg_type; @@ -95,7 +96,7 @@ struct FitFileReaderState FitFileReaderState(QFile &file, QStringList &errors) : file(file), errors(errors), rideFile(NULL), start_time(0), - last_time(0), last_distance(0.00f), interval(0), calibration(0), devices(0), stopped(true), + last_time(0), last_distance(0.00f), interval(0), calibration(0), devices(0), stopped(true), isLapSwim(false), last_event_type(-1), last_event(-1), last_msg_type(-1) { } @@ -493,6 +494,7 @@ struct FitFileReaderState } void decodeRecord(const FitDefinition &def, int time_offset, const std::vector values) { + if (isLapSwim) return; // We use the length message for Lap Swimming time_t time = 0; if (time_offset > 0) time = last_time + time_offset; @@ -791,6 +793,20 @@ struct FitFileReaderState } void decodeLength(const FitDefinition &def, int time_offset, const std::vector values) { + if (!isLapSwim) { + isLapSwim = true; + // reset rideFile if not empty + if (!rideFile->dataPoints().empty()) { + start_time = 0; + last_time = 0; + last_distance = 0.00f; + interval = 0; + delete rideFile; + rideFile = new RideFile; + rideFile->setDeviceType("Garmin FIT"); + rideFile->setRecIntSecs(1.0); + } + } time_t time = 0; if (time_offset > 0) time = last_time + time_offset; diff --git a/test/rides/lap_swim_test_FR920xt.FIT b/test/rides/lap_swim_test_FR920xt.FIT new file mode 100644 index 0000000000000000000000000000000000000000..4187866cc693b11be461484c92849881e7f1f499 GIT binary patch literal 20805 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