|
@@ -255,6 +255,7 @@ gpstrack(void *)
|
|
|
static char buf[256], *t[32];
|
|
|
int n, i, k, tp;
|
|
|
vlong localtime;
|
|
|
+ double d;
|
|
|
|
|
|
setline();
|
|
|
fix.messages = 0;
|
|
@@ -312,8 +313,11 @@ gpstrack(void *)
|
|
|
break;
|
|
|
if(isdigit(*t[7]))
|
|
|
fix.satellites = strtol(t[7], nil, 10);
|
|
|
- if(isdigit(*t[8]))
|
|
|
- fix.hdop = strtod(t[8], nil);
|
|
|
+ if(isdigit(*t[8])){
|
|
|
+ d = strtod(t[8], nil);
|
|
|
+ if(!isNaN(d))
|
|
|
+ fix.hdop = d;
|
|
|
+ }
|
|
|
getalt(t[9], t[10], &fix);
|
|
|
getsea(t[11], t[12], &fix);
|
|
|
fix.localtime = localtime;
|
|
@@ -339,9 +343,21 @@ gpstrack(void *)
|
|
|
fix.messages |= 1 << tp;
|
|
|
break;
|
|
|
case GPGSA:
|
|
|
- if(*t[15]) fix.pdop = strtod(t[15], nil);
|
|
|
- if(*t[16]) fix.hdop = strtod(t[16], nil);
|
|
|
- if(*t[17]) fix.vdop = strtod(t[17], nil);
|
|
|
+ if(*t[15]){
|
|
|
+ d = strtod(t[15], nil);
|
|
|
+ if(!isNaN(d))
|
|
|
+ fix.pdop = d;
|
|
|
+ }
|
|
|
+ if(*t[16]){
|
|
|
+ d = strtod(t[16], nil);
|
|
|
+ if(!isNaN(d))
|
|
|
+ fix.hdop = d;
|
|
|
+ }
|
|
|
+ if(*t[17]){
|
|
|
+ d = strtod(t[17], nil);
|
|
|
+ if(!isNaN(d))
|
|
|
+ fix.vdop = d;
|
|
|
+ }
|
|
|
fix.messages |= 1 << tp;
|
|
|
break;
|
|
|
case GPGLL:
|
|
@@ -623,9 +639,13 @@ gettime(Fix *f){
|
|
|
|
|
|
int
|
|
|
getzulu(char *s, Fix *f){
|
|
|
+ double d;
|
|
|
+
|
|
|
if(*s == '\0') return 0;
|
|
|
if(isdigit(*s)){
|
|
|
- f->zulu = strtod(s, nil);
|
|
|
+ d = strtod(s, nil);
|
|
|
+ if(!isNaN(d))
|
|
|
+ f->zulu = d;
|
|
|
return 1;
|
|
|
}
|
|
|
return 0;
|
|
@@ -642,22 +662,28 @@ getdate(char *s, Fix *f){
|
|
|
}
|
|
|
|
|
|
int
|
|
|
-getgs(char *s1, Fix *f){
|
|
|
+getgs(char *s, Fix *f){
|
|
|
+ double d;
|
|
|
|
|
|
- if(*s1 == 0) return 0;
|
|
|
- if(isdigit(*s1)){
|
|
|
- f->groundspeed = strtod(s1, nil);
|
|
|
+ if(*s == 0) return 0;
|
|
|
+ if(isdigit(*s)){
|
|
|
+ d = strtod(s, nil);
|
|
|
+ if(!isNaN(d))
|
|
|
+ f->groundspeed = d;
|
|
|
return 1;
|
|
|
}
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
int
|
|
|
-getkmh(char *s1, Fix *f){
|
|
|
+getkmh(char *s, Fix *f){
|
|
|
+ double d;
|
|
|
|
|
|
- if(*s1 == 0) return 0;
|
|
|
- if(isdigit(*s1)){
|
|
|
- f->kmh = strtod(s1, nil);
|
|
|
+ if(*s == 0) return 0;
|
|
|
+ if(isdigit(*s)){
|
|
|
+ d = strtod(s, nil);
|
|
|
+ if(!isNaN(d))
|
|
|
+ f->kmh = d;
|
|
|
return 1;
|
|
|
}
|
|
|
return 0;
|
|
@@ -665,10 +691,13 @@ getkmh(char *s1, Fix *f){
|
|
|
|
|
|
int
|
|
|
getcrs(char *s1, Fix *f){
|
|
|
+ double d;
|
|
|
|
|
|
if(*s1 == 0) return 0;
|
|
|
if(isdigit(*s1)){
|
|
|
- f->course = strtod(s1, nil);
|
|
|
+ d = strtod(s1, nil);
|
|
|
+ if(!isNaN(d))
|
|
|
+ f->course = d;
|
|
|
return 1;
|
|
|
}
|
|
|
return 0;
|
|
@@ -676,10 +705,13 @@ getcrs(char *s1, Fix *f){
|
|
|
|
|
|
int
|
|
|
gethdg(char *s1, Fix *f){
|
|
|
+ double d;
|
|
|
|
|
|
if(*s1 == 0) return 0;
|
|
|
if(isdigit(*s1)){
|
|
|
- f->heading = strtod(s1, nil);
|
|
|
+ d = strtod(s1, nil);
|
|
|
+ if(!isNaN(d))
|
|
|
+ f->heading = d;
|
|
|
return 1;
|
|
|
}
|
|
|
return 0;
|
|
@@ -692,7 +724,7 @@ getalt(char *s1, char *s2, Fix *f){
|
|
|
if(*s1 == 0) return 0;
|
|
|
if(isdigit(*s1)){
|
|
|
alt = strtod(s1, nil);
|
|
|
- if(*s2 == 'M'){
|
|
|
+ if(*s2 == 'M' && !isNaN(alt)){
|
|
|
f->altitude = alt;
|
|
|
return 1;
|
|
|
}
|
|
@@ -727,6 +759,10 @@ getlat(char *s1, char *s2, Fix *f){
|
|
|
return -1;
|
|
|
}
|
|
|
lat = strtod(s1+2, nil);
|
|
|
+ if(isNaN(lat)){
|
|
|
+ badlat++;
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
lat /= 60.0;
|
|
|
lat += 10*(s1[0] - '0') + s1[1] - '0';
|
|
|
if(lat < 0 || lat > 90.0){
|
|
@@ -762,8 +798,13 @@ getlon(char *s1, char *s2, Fix *f){
|
|
|
badlon++;
|
|
|
return -1;
|
|
|
}
|
|
|
- lon = 100*(s1[0] - '0') + 10*(s1[1] - '0') + s1[2] - '0' +
|
|
|
- strtod(s1+3, nil)/60.0;
|
|
|
+ lon = strtod(s1+3, nil);
|
|
|
+ if(isNaN(lon)){
|
|
|
+ badlon++;
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ lon /= 60.0;
|
|
|
+ lon += 100*(s1[0] - '0') + 10*(s1[1] - '0') + s1[2] - '0';
|
|
|
if(lon < 0 || lon > 180.0){
|
|
|
badlon++;
|
|
|
return -1;
|
|
@@ -794,8 +835,11 @@ getmagvar(char *s1, char *s2, Fix *f){
|
|
|
|
|
|
if(*s1 == 0) return 0;
|
|
|
if(isdigit(*s1) && strlen(s1) > 5){
|
|
|
- magvar = 100*(s1[0] - '0') + 10*(s1[1] - '0') + s1[2] - '0' +
|
|
|
- strtod(s1+3, nil)/60.0;
|
|
|
+ magvar = strtod(s1+3, nil);
|
|
|
+ if(isNaN(magvar))
|
|
|
+ return 0;
|
|
|
+ magvar /= 60.0;
|
|
|
+ magvar += 100*(s1[0] - '0') + 10*(s1[1] - '0') + s1[2] - '0';
|
|
|
if(*s2 == 'W'){
|
|
|
f->magvar = -magvar;
|
|
|
return 1;
|