182 |
fixp->mode = MODE_NOT_SEEN; |
fixp->mode = MODE_NOT_SEEN; |
183 |
fixp->pos.lat = fixp->pos.lon = NAN; |
fixp->pos.lat = fixp->pos.lon = NAN; |
184 |
fixp->track = NAN; |
fixp->track = NAN; |
|
fixp->speed = NAN; |
|
|
fixp->climb = NAN; |
|
|
fixp->altitude = NAN; |
|
|
fixp->ept = NAN; |
|
185 |
fixp->eph = NAN; |
fixp->eph = NAN; |
|
fixp->epd = NAN; |
|
|
fixp->eps = NAN; |
|
|
fixp->epc = NAN; |
|
186 |
} |
} |
187 |
|
|
188 |
/* unpack a daemon response into a status structure */ |
/* unpack a daemon response into a status structure */ |
198 |
else *tp = '\0'; |
else *tp = '\0'; |
199 |
|
|
200 |
switch (*sp) { |
switch (*sp) { |
201 |
case 'A': |
/* A - altitude is not supported */ |
|
if (sp[2] == '?') { |
|
|
gpsdata->fix.altitude = NAN; |
|
|
} else { |
|
|
(void)sscanf(sp, "A=%lf", &gpsdata->fix.altitude); |
|
|
gpsdata->set |= ALTITUDE_SET; |
|
|
} |
|
|
break; |
|
202 |
/* B - baudrate isn't supported by gpxview */ |
/* B - baudrate isn't supported by gpxview */ |
203 |
/* C - cycle isn't supported by gpxview */ |
/* C - cycle isn't supported by gpxview */ |
204 |
/* D - utc time isn't supported by gpxview */ |
/* D - utc time isn't supported by gpxview */ |
247 |
#define DEFAULT(val) (val[0] == '?') ? NAN : g_ascii_strtod(val, NULL) |
#define DEFAULT(val) (val[0] == '?') ? NAN : g_ascii_strtod(val, NULL) |
248 |
nf.pos.lat = DEFAULT(lat); |
nf.pos.lat = DEFAULT(lat); |
249 |
nf.pos.lon = DEFAULT(lon); |
nf.pos.lon = DEFAULT(lon); |
|
nf.ept = DEFAULT(ept); |
|
|
nf.altitude = DEFAULT(alt); |
|
250 |
nf.eph = DEFAULT(eph); |
nf.eph = DEFAULT(eph); |
251 |
nf.track = DEFAULT(track); |
nf.track = DEFAULT(track); |
|
nf.speed = DEFAULT(speed); |
|
|
nf.climb = DEFAULT(climb); |
|
|
nf.epd = DEFAULT(epd); |
|
|
nf.eps = DEFAULT(eps); |
|
|
nf.epc = DEFAULT(epc); |
|
252 |
#undef DEFAULT |
#undef DEFAULT |
253 |
if (st >= 15) |
if (st >= 15) |
254 |
nf.mode = (mode[0] == '?') ? MODE_NOT_SEEN : atoi(mode); |
nf.mode = (mode[0] == '?') ? MODE_NOT_SEEN : atoi(mode); |
255 |
else |
else |
256 |
nf.mode = (alt[0] == '?') ? MODE_2D : MODE_3D; |
nf.mode = (alt[0] == '?') ? MODE_2D : MODE_3D; |
|
if (alt[0] != '?') |
|
|
gpsdata->set |= ALTITUDE_SET | CLIMB_SET; |
|
257 |
if (isnan(nf.eph)==0) |
if (isnan(nf.eph)==0) |
258 |
gpsdata->set |= HERR_SET; |
gpsdata->set |= HERR_SET; |
259 |
if (isnan(nf.track)==0) |
if (isnan(nf.track)==0) |
260 |
gpsdata->set |= TRACK_SET | SPEED_SET; |
gpsdata->set |= TRACK_SET; |
|
if (isnan(nf.eps)==0) |
|
|
gpsdata->set |= SPEEDERR_SET; |
|
|
if (isnan(nf.epc)==0) |
|
|
gpsdata->set |= CLIMBERR_SET; |
|
261 |
gpsdata->fix = nf; |
gpsdata->fix = nf; |
262 |
gpsdata->set |= TIME_SET|TIMERR_SET|LATLON_SET|MODE_SET; |
gpsdata->set |= LATLON_SET|MODE_SET; |
263 |
gpsdata->status = STATUS_FIX; |
gpsdata->status = STATUS_FIX; |
264 |
gpsdata->set |= STATUS_SET; |
gpsdata->set |= STATUS_SET; |
265 |
} |
} |
277 |
gpsdata->set |= LATLON_SET; |
gpsdata->set |= LATLON_SET; |
278 |
} |
} |
279 |
break; |
break; |
280 |
case 'Q': |
/* Q is not supported */ |
|
if (sp[2] == '?') { |
|
|
gpsdata->satellites_used = 0; |
|
|
gpsdata->pdop = 0; |
|
|
gpsdata->hdop = 0; |
|
|
gpsdata->vdop = 0; |
|
|
} else { |
|
|
(void)sscanf(sp, "Q=%d %lf %lf %lf %lf %lf", |
|
|
&gpsdata->satellites_used, |
|
|
&gpsdata->pdop, |
|
|
&gpsdata->hdop, |
|
|
&gpsdata->vdop, |
|
|
&gpsdata->tdop, |
|
|
&gpsdata->gdop); |
|
|
gpsdata->set |= HDOP_SET | VDOP_SET | PDOP_SET; |
|
|
} |
|
|
break; |
|
281 |
case 'S': |
case 'S': |
282 |
if (sp[2] == '?') { |
if (sp[2] == '?') { |
283 |
gpsdata->status = -1; |
gpsdata->status = -1; |
290 |
if (sp[2] == '?') { |
if (sp[2] == '?') { |
291 |
gpsdata->fix.track = NAN; |
gpsdata->fix.track = NAN; |
292 |
} else { |
} else { |
293 |
(void)sscanf(sp, "T=%lf", &gpsdata->fix.track); |
(void)sscanf(sp, "T=%f", &gpsdata->fix.track); |
294 |
gpsdata->set |= TRACK_SET; |
gpsdata->set |= TRACK_SET; |
295 |
} |
} |
296 |
break; |
break; |
297 |
case 'U': |
/* U - climb is not supported */ |
298 |
if (sp[2] == '?') { |
/* V - is not supported */ |
299 |
gpsdata->fix.climb = NAN; |
/* X - online is not supported */ |
|
} else { |
|
|
(void)sscanf(sp, "U=%lf", &gpsdata->fix.climb); |
|
|
gpsdata->set |= CLIMB_SET; |
|
|
} |
|
|
break; |
|
|
case 'V': |
|
|
if (sp[2] == '?') { |
|
|
gpsdata->fix.speed = NAN; |
|
|
} else { |
|
|
(void)sscanf(sp, "V=%lf", &gpsdata->fix.speed); |
|
|
/* V reply is in kt, fix.speed is in metres/sec */ |
|
|
gpsdata->fix.speed = gpsdata->fix.speed / MPS_TO_KNOTS; |
|
|
gpsdata->set |= SPEED_SET; |
|
|
} |
|
|
break; |
|
|
case 'X': |
|
|
if (sp[2] == '?') |
|
|
gpsdata->online = -1; |
|
|
else { |
|
|
(void)sscanf(sp, "X=%lf", &gpsdata->online); |
|
|
gpsdata->set |= ONLINE_SET; |
|
|
} |
|
|
break; |
|
300 |
case 'Y': |
case 'Y': |
301 |
if (sp[2] == '?') { |
if (sp[2] == '?') { |
302 |
gpsdata->satellites = 0; |
gpsdata->satellites = 0; |
406 |
|
|
407 |
if(!cnt) appdata->gps_state->gpsdata.set &= ~SATELLITE_SET; |
if(!cnt) appdata->gps_state->gpsdata.set &= ~SATELLITE_SET; |
408 |
else appdata->gps_state->gpsdata.set &= |
else appdata->gps_state->gpsdata.set &= |
409 |
~(TIME_SET|TIMERR_SET|LATLON_SET|MODE_SET|STATUS_SET); |
~(LATLON_SET|MODE_SET|STATUS_SET); |
410 |
|
|
411 |
gps_unpack(str, &appdata->gps_state->gpsdata); |
gps_unpack(str, &appdata->gps_state->gpsdata); |
412 |
g_mutex_unlock(appdata->gps_state->mutex); |
g_mutex_unlock(appdata->gps_state->mutex); |
459 |
gps_state->fields = device->fix->fields; |
gps_state->fields = device->fix->fields; |
460 |
|
|
461 |
if(gps_state->fields & LOCATION_GPS_DEVICE_LATLONG_SET) { |
if(gps_state->fields & LOCATION_GPS_DEVICE_LATLONG_SET) { |
462 |
gps_state->latitude = device->fix->latitude; |
gps_state->fix.pos.lat = device->fix->latitude; |
463 |
gps_state->longitude = device->fix->longitude; |
gps_state->fix.pos.lon = device->fix->longitude; |
464 |
gps_state->eph = device->fix->eph/100.0; // we want eph in meters |
gps_state->fix.eph = device->fix->eph/100.0; // we want eph in meters |
465 |
} |
} |
466 |
|
|
467 |
if(gps_state->fields & LOCATION_GPS_DEVICE_TRACK_SET) |
if(gps_state->fields & LOCATION_GPS_DEVICE_TRACK_SET) |
468 |
gps_state->heading = device->fix->track; |
gps_state->fix.track = device->fix->track; |
469 |
|
|
470 |
/* update list of sattelites */ |
/* update list of sattelites */ |
471 |
|
|
558 |
if(!(gps_state->fields & LOCATION_GPS_DEVICE_LATLONG_SET)) |
if(!(gps_state->fields & LOCATION_GPS_DEVICE_LATLONG_SET)) |
559 |
return NULL; |
return NULL; |
560 |
|
|
561 |
pos.lat = gps_state->latitude; |
pos.lat = gps_state->fix.pos.lat; |
562 |
pos.lon = gps_state->longitude; |
pos.lon = gps_state->fix.pos.lon; |
563 |
|
|
564 |
return &pos; |
return &pos; |
565 |
} |
} |
570 |
if(!(gps_state->fields & LOCATION_GPS_DEVICE_TRACK_SET)) |
if(!(gps_state->fields & LOCATION_GPS_DEVICE_TRACK_SET)) |
571 |
return NAN; |
return NAN; |
572 |
|
|
573 |
return gps_state->heading; |
return gps_state->fix.track; |
574 |
} |
} |
575 |
|
|
576 |
float gps_get_eph(appdata_t *appdata) { |
float gps_get_eph(appdata_t *appdata) { |
579 |
if(!(gps_state->fields & LOCATION_GPS_DEVICE_LATLONG_SET)) |
if(!(gps_state->fields & LOCATION_GPS_DEVICE_LATLONG_SET)) |
580 |
return NAN; |
return NAN; |
581 |
|
|
582 |
return gps_state->eph; |
return gps_state->fix.eph; |
583 |
} |
} |
584 |
|
|
585 |
gps_sat_t *gps_get_sats(appdata_t *appdata) { |
gps_sat_t *gps_get_sats(appdata_t *appdata) { |