1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2025-02-19 17:10:49 +01:00

Code cleanup

This commit is contained in:
Martin Tůma 2020-04-08 22:28:35 +02:00
parent 6ee3a8ea8d
commit eb0ff84379
2 changed files with 53 additions and 63 deletions

View File

@ -205,49 +205,51 @@ bool FITParser::parseDefinitionMessage(CTX &ctx, quint8 header)
return true; return true;
} }
bool FITParser::readField(CTX &ctx, Field *field, QVariant &val) bool FITParser::readField(CTX &ctx, Field *field, QVariant &val, bool &valid)
{ {
quint8 v8 = (quint8)-1;
quint16 v16 = (quint16)-1;
quint32 v32 = (quint32)-1;
bool ret; bool ret;
val = (quint32)-1; #define VAL(type, inval) \
{type var; \
if (field->size == sizeof(var)) { \
ret = readValue(ctx, var); \
val = var; \
valid = (var != (inval)); \
} else { \
ret = skipValue(ctx, field->size); \
valid = false; \
}}
switch (field->type) { switch (field->type) {
case 0: // enum
case 1: // sint8 case 1: // sint8
VAL(qint8, 0x7fU);
break;
case 2: // uint8 case 2: // uint8
if (field->size == 1) { case 0: // enum
ret = readValue(ctx, v8); VAL(quint8, 0xffU);
val = v8;
} else
ret = skipValue(ctx, field->size);
break; break;
case 7: // UTF8 nul terminated string case 7: // UTF8 nul terminated string
{QByteArray ba(ctx.file->read(field->size)); {QByteArray ba(ctx.file->read(field->size));
ctx.len -= field->size; ctx.len -= field->size;
ret = (ba.size() == field->size); ret = (ba.size() == field->size);
val = ret ? ba : QString();} val = ret ? ba : QString();
valid = !ba.isEmpty();}
break; break;
case 0x83: // sint16 case 0x83: // sint16
VAL(qint16, 0x7fffU);
break;
case 0x84: // uint16 case 0x84: // uint16
if (field->size == 2) { VAL(quint16, 0xffffU);
ret = readValue(ctx, v16);
val = v16;
} else
ret = skipValue(ctx, field->size);
break; break;
case 0x85: // sint32 case 0x85: // sint32
VAL(qint32, 0x7fffffffU);
break;
case 0x86: // uint32 case 0x86: // uint32
if (field->size == 4) { VAL(quint32, 0xffffffffU);
ret = readValue(ctx, v32);
val = v32;
} else
ret = skipValue(ctx, field->size);
break; break;
default: default:
ret = skipValue(ctx, field->size); ret = skipValue(ctx, field->size);
valid = false;
break; break;
} }
@ -257,9 +259,10 @@ bool FITParser::readField(CTX &ctx, Field *field, QVariant &val)
bool FITParser::parseData(CTX &ctx, const MessageDefinition *def) bool FITParser::parseData(CTX &ctx, const MessageDefinition *def)
{ {
Field *field; Field *field;
Event event;
QVariant val; QVariant val;
Waypoint w; bool valid;
Event event;
Waypoint waypoint;
if (!def->fields && !def->devFields) { if (!def->fields && !def->devFields) {
@ -271,58 +274,47 @@ bool FITParser::parseData(CTX &ctx, const MessageDefinition *def)
for (int i = 0; i < def->numFields; i++) { for (int i = 0; i < def->numFields; i++) {
field = &def->fields[i]; field = &def->fields[i];
if (!readField(ctx, field, val)) if (!readField(ctx, field, val, valid))
return false; return false;
if (!valid)
continue;
if (field->id == TIMESTAMP_FIELD) if (field->id == TIMESTAMP_FIELD)
ctx.timestamp = val.toUInt(); ctx.timestamp = val.toUInt();
else if (def->globalId == RECORD_MESSAGE) { else if (def->globalId == RECORD_MESSAGE) {
switch (field->id) { switch (field->id) {
case 0: case 0:
if (val != 0x7fffffffU)
ctx.trackpoint.rcoordinates().setLat( ctx.trackpoint.rcoordinates().setLat(
((qint32)val.toUInt() / (double)0x7fffffff) * 180); (val.toInt() / (double)0x7fffffff) * 180);
break; break;
case 1: case 1:
if (val != 0x7fffffffU)
ctx.trackpoint.rcoordinates().setLon( ctx.trackpoint.rcoordinates().setLon(
((qint32)val.toUInt() / (double)0x7fffffff) * 180); (val.toInt() / (double)0x7fffffff) * 180);
break; break;
case 2: case 2:
if (val != 0xffffU)
ctx.trackpoint.setElevation((val.toUInt() / 5.0) - 500); ctx.trackpoint.setElevation((val.toUInt() / 5.0) - 500);
break; break;
case 3: case 3:
if (val != 0xffU)
ctx.trackpoint.setHeartRate(val.toUInt()); ctx.trackpoint.setHeartRate(val.toUInt());
break; break;
case 4: case 4:
if (val != 0xffU)
ctx.trackpoint.setCadence(val.toUInt()); ctx.trackpoint.setCadence(val.toUInt());
break; break;
case 6: case 6:
if (val != 0xffffU)
ctx.trackpoint.setSpeed(val.toUInt() / 1000.0f); ctx.trackpoint.setSpeed(val.toUInt() / 1000.0f);
break; break;
case 7: case 7:
if (val != 0xffffU)
ctx.trackpoint.setPower(val.toUInt()); ctx.trackpoint.setPower(val.toUInt());
break; break;
case 13: case 13:
if (val != 0x7fU) ctx.trackpoint.setTemperature(val.toInt());
ctx.trackpoint.setTemperature((qint8)val.toUInt());
break; break;
case 73: case 73:
if (val != 0xffffffffU)
ctx.trackpoint.setSpeed(val.toUInt() / 1000.0f); ctx.trackpoint.setSpeed(val.toUInt() / 1000.0f);
break; break;
case 78: case 78:
if (val != 0xffffffffU)
ctx.trackpoint.setElevation((val.toUInt() / 5.0) - 500); ctx.trackpoint.setElevation((val.toUInt() / 5.0) - 500);
break; break;
default:
break;
} }
} else if (def->globalId == EVENT_MESSAGE) { } else if (def->globalId == EVENT_MESSAGE) {
switch (field->id) { switch (field->id) {
@ -339,24 +331,22 @@ bool FITParser::parseData(CTX &ctx, const MessageDefinition *def)
} else if (def->globalId == COURSE_POINT) { } else if (def->globalId == COURSE_POINT) {
switch (field->id) { switch (field->id) {
case 1: case 1:
w.setTimestamp(QDateTime::fromTime_t(val.toUInt() waypoint.setTimestamp(QDateTime::fromTime_t(val.toUInt()
+ 631065600)); + 631065600));
break; break;
case 2: case 2:
if (val != 0x7fffffff) waypoint.rcoordinates().setLat(
w.rcoordinates().setLat( (val.toInt() / (double)0x7fffffff) * 180);
((qint32)val.toUInt() / (double)0x7fffffff) * 180);
break; break;
case 3: case 3:
if (val != 0x7fffffff) waypoint.rcoordinates().setLon(
w.rcoordinates().setLon( (val.toInt() / (double)0x7fffffff) * 180);
((qint32)val.toUInt() / (double)0x7fffffff) * 180);
break; break;
case 5: case 5:
w.setDescription(coursePointDesc.value(val.toUInt())); waypoint.setDescription(coursePointDesc.value(val.toUInt()));
break; break;
case 6: case 6:
w.setName(val.toString()); waypoint.setName(val.toString());
break; break;
} }
} }
@ -364,7 +354,7 @@ bool FITParser::parseData(CTX &ctx, const MessageDefinition *def)
for (int i = 0; i < def->numDevFields; i++) { for (int i = 0; i < def->numDevFields; i++) {
field = &def->devFields[i]; field = &def->devFields[i];
if (!readField(ctx, field, val)) if (!readField(ctx, field, val, valid))
return false; return false;
} }
@ -386,8 +376,8 @@ bool FITParser::parseData(CTX &ctx, const MessageDefinition *def)
ctx.lastWrite = ctx.timestamp; ctx.lastWrite = ctx.timestamp;
} }
} else if (def->globalId == COURSE_POINT) } else if (def->globalId == COURSE_POINT)
if (w.coordinates().isValid()) if (waypoint.coordinates().isValid())
ctx.waypoints.append(w); ctx.waypoints.append(waypoint);
return true; return true;
} }

View File

@ -21,7 +21,7 @@ private:
bool readData(QFile *file, char *data, size_t size); bool readData(QFile *file, char *data, size_t size);
template<class T> bool readValue(CTX &ctx, T &val); template<class T> bool readValue(CTX &ctx, T &val);
bool skipValue(CTX &ctx, quint8 size); bool skipValue(CTX &ctx, quint8 size);
bool readField(CTX &ctx, Field *field, QVariant &val); bool readField(CTX &ctx, Field *field, QVariant &val, bool &valid);
bool parseHeader(CTX &ctx); bool parseHeader(CTX &ctx);
bool parseRecord(CTX &ctx); bool parseRecord(CTX &ctx);