mirror of
https://github.com/tumic0/GPXSee.git
synced 2025-01-18 19:52:09 +01:00
Made the NMEA parser more robust
This commit is contained in:
parent
535361dada
commit
a6053a4d7b
@ -5,18 +5,22 @@
|
|||||||
|
|
||||||
static bool readTime(const char *data, int len, QTime &time)
|
static bool readTime(const char *data, int len, QTime &time)
|
||||||
{
|
{
|
||||||
int h, m, s ,ms;
|
int h, m, s, ms = 0;
|
||||||
|
|
||||||
if (len < 9)
|
if (len < 6)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
h = str2int(data, 2);
|
h = str2int(data, 2);
|
||||||
m = str2int(data + 2, 2);
|
m = str2int(data + 2, 2);
|
||||||
s = str2int(data + 4, 2);
|
s = str2int(data + 4, 2);
|
||||||
ms = str2int(data + 7, len - 7);
|
if (h < 0 || m < 0 || s < 0)
|
||||||
if (h < 0 || m < 0 || s < 0 || ms < 0 || data[6] != '.')
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (len > 7 && data[6] == '.') {
|
||||||
|
if ((ms = str2int(data + 7, len - 7)) < 0)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
time = QTime(h, m, s, ms);
|
time = QTime(h, m, s, ms);
|
||||||
if (!time.isValid())
|
if (!time.isValid())
|
||||||
return false;
|
return false;
|
||||||
@ -97,6 +101,22 @@ static bool readFloat(const char *data, int len, qreal &f)
|
|||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool validLine(const char *line, int len)
|
||||||
|
{
|
||||||
|
const char *lp;
|
||||||
|
|
||||||
|
if (len < 10 || line[0] != '$')
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for (lp = line + len - 1; lp > line; lp--)
|
||||||
|
if (!::isspace(*lp))
|
||||||
|
break;
|
||||||
|
if (*(lp-2) != '*' || !::isalnum(*(lp-1)) || !::isalnum(*(lp)))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool NMEAParser::readRMC(const char *line, int len)
|
bool NMEAParser::readRMC(const char *line, int len)
|
||||||
{
|
{
|
||||||
int col = 1;
|
int col = 1;
|
||||||
@ -394,9 +414,11 @@ bool NMEAParser::loadFile(QFile *file)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (len < 7 || line[0] != '$') {
|
if (!validLine(line, len)) {
|
||||||
_errorString = "Format error";
|
fprintf(stderr, "%s:%d: Invalid NMEA sentence\n",
|
||||||
return false;
|
qPrintable(file->fileName()), _errorLine);
|
||||||
|
_errorLine++;
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!memcmp(line + 3, "RMC,", 4)) {
|
if (!memcmp(line + 3, "RMC,", 4)) {
|
||||||
@ -416,5 +438,10 @@ bool NMEAParser::loadFile(QFile *file)
|
|||||||
_errorLine++;
|
_errorLine++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!_tracks.last().size() && !_waypoints.size()) {
|
||||||
|
_errorString = "No usable NMEA sentence found";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user