From 2318ea0b08edb81049e8a7602786230f31688d3e Mon Sep 17 00:00:00 2001 From: Damien Date: Mon, 2 Dec 2013 18:02:29 +0100 Subject: [PATCH] FitRideFile: Correction for last Garmin firmware updates In last Garmin firmware there is some (unknow) fields with multiples values Fixes #724 --- src/FitRideFile.cpp | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/FitRideFile.cpp b/src/FitRideFile.cpp index 1579ea731..1218946b3 100644 --- a/src/FitRideFile.cpp +++ b/src/FitRideFile.cpp @@ -557,23 +557,28 @@ struct FitFileReaderState std::vector values; foreach(const FitField &field, def.fields) { fit_value_t v; + int size; switch (field.type) { - case 0: v = read_uint8(&count); break; - case 1: v = read_int8(&count); break; - case 2: v = read_uint8(&count); break; - case 3: v = read_int16(def.is_big_endian, &count); break; - case 4: v = read_uint16(def.is_big_endian, &count); break; - case 5: v = read_int32(def.is_big_endian, &count); break; - case 6: v = read_uint32(def.is_big_endian, &count); break; - case 10: v = read_uint8z(&count); break; - case 11: v = read_uint16z(def.is_big_endian, &count); break; - case 12: v = read_uint32z(def.is_big_endian, &count); break; + case 0: v = read_uint8(&count); size = 1; break; + case 1: v = read_int8(&count); size = 1; break; + case 2: v = read_uint8(&count); size = 1; break; + case 3: v = read_int16(def.is_big_endian, &count); size = 2; break; + case 4: v = read_uint16(def.is_big_endian, &count); size = 2; break; + case 5: v = read_int32(def.is_big_endian, &count); size = 4; break; + case 6: v = read_uint32(def.is_big_endian, &count); size = 4; break; + case 10: v = read_uint8z(&count); size = 1; break; + case 11: v = read_uint16z(def.is_big_endian, &count); size = 2; break; + case 12: v = read_uint32z(def.is_big_endian, &count); size = 4; break; // we may need to add support for float, string + byte base types here default: read_unknown( field.size, &count ); v = NA_VALUE; unknown_base_type.insert(field.num); } + // Quick fix : we need to support multivalues + if (size < field.size) + read_unknown( field.size-size, &count ); + values.push_back(v); //printf( " field: type=%d num=%d value=%lld\n", // field.type, field.num, v );