From 9e583a9dabc2dd18f7c6950d41811a385fd38328 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20T=C5=AFma?= Date: Thu, 3 Nov 2016 08:02:28 +0100 Subject: [PATCH] Added support for FIT files with developer data fields --- src/fitparser.cpp | 40 +++++++++++++++++++++++++++++++--------- src/fitparser.h | 2 ++ 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/fitparser.cpp b/src/fitparser.cpp index 7ab576eb..76ba09ed 100644 --- a/src/fitparser.cpp +++ b/src/fitparser.cpp @@ -18,11 +18,13 @@ FITParser::FITParser(QList &tracks, QList &routes, void FITParser::clearDefinitions() { for (int i = 0; i < 16; i++) { - if (_defs[i].fields) { + if (_defs[i].fields) delete[] _defs[i].fields; - _defs[i].fields = 0; - } + if (_defs[i].devFields) + delete[] _defs[i].devFields; } + + memset(_defs, 0, sizeof(_defs)); } void FITParser::warning(const char *text) const @@ -91,6 +93,10 @@ bool FITParser::parseDefinitionMessage(quint8 header) delete[] def->fields; def->fields = 0; } + if (def->devFields) { + delete[] def->devFields; + def->devFields = 0; + } // reserved/unused if (!readValue(i)) @@ -121,6 +127,20 @@ bool FITParser::parseDefinitionMessage(quint8 header) _len -= sizeof(def->fields[i]); } + // developer definition records + if (header & 0x20) { + if (!readValue(def->numDevFields)) + return false; + + def->devFields = new Field[def->numDevFields]; + for (i = 0; i < def->numDevFields; i++) { + if (!readData((char*)&(def->devFields[i]), + sizeof(def->devFields[i]))) + return false; + _len -= sizeof(def->devFields[i]); + } + } + return true; } @@ -173,7 +193,7 @@ bool FITParser::parseData(MessageDefinition *def, quint8 offset) int i; - if (!def->fields) { + if (!def->fields && !def->devFields) { _errorString = "Undefined data message"; return false; } @@ -222,6 +242,13 @@ bool FITParser::parseData(MessageDefinition *def, quint8 offset) } } + for (i = 0; i < def->numDevFields; i++) { + field = &def->devFields[i]; + if (!readField(field, val)) + return false; + } + + if (def->globalId == RECORD_MESSAGE) { if (trackpoint.coordinates().isValid()) { trackpoint.setTimestamp(QDateTime::fromTime_t(timestamp @@ -261,11 +288,6 @@ bool FITParser::parseRecord() if (!readValue(header)) return false; - if (header & 0x20) { - _errorString = "Developer data not supported"; - return false; - } - if (header & 0x80) return parseCompressedMessage(header); else if (header & 0x40) diff --git a/src/fitparser.h b/src/fitparser.h index ec665fe4..8da65c63 100644 --- a/src/fitparser.h +++ b/src/fitparser.h @@ -34,6 +34,8 @@ private: quint16 globalId; quint8 numFields; Field *fields; + quint8 numDevFields; + Field *devFields; } MessageDefinition;