97 |
return retval; |
return retval; |
98 |
} |
} |
99 |
|
|
100 |
float gps_get_epe(appdata_t *appdata) { |
float gps_get_eph(appdata_t *appdata) { |
101 |
float retval = NAN; |
float retval = NAN; |
102 |
|
|
103 |
g_mutex_lock(appdata->gps_state->mutex); |
g_mutex_lock(appdata->gps_state->mutex); |
180 |
fixp->altitude = NAN; |
fixp->altitude = NAN; |
181 |
fixp->ept = NAN; |
fixp->ept = NAN; |
182 |
fixp->eph = NAN; |
fixp->eph = NAN; |
|
fixp->epv = NAN; |
|
183 |
fixp->epd = NAN; |
fixp->epd = NAN; |
184 |
fixp->eps = NAN; |
fixp->eps = NAN; |
185 |
fixp->epc = NAN; |
fixp->epc = NAN; |
210 |
/* C - cycle isn't supported by gpxview */ |
/* C - cycle isn't supported by gpxview */ |
211 |
/* D - utc time isn't supported by gpxview */ |
/* D - utc time isn't supported by gpxview */ |
212 |
case 'E': |
case 'E': |
213 |
gpsdata->epe = gpsdata->fix.eph = gpsdata->fix.epv = NAN; |
gpsdata->fix.eph = NAN; |
214 |
/* epe should always be present if eph or epv is */ |
/* epe should always be present if eph or epv is */ |
215 |
if (sp[2] != '?') { |
if (sp[2] != '?') { |
216 |
char epe[20], eph[20], epv[20]; |
char epe[20], eph[20], epv[20]; |
217 |
(void)sscanf(sp, "E=%s %s %s", epe, eph, epv); |
(void)sscanf(sp, "E=%s %s %s", epe, eph, epv); |
218 |
#define DEFAULT(val) (val[0] == '?') ? NAN : g_ascii_strtod(val, NULL) |
#define DEFAULT(val) (val[0] == '?') ? NAN : g_ascii_strtod(val, NULL) |
|
gpsdata->epe = DEFAULT(epe); |
|
219 |
gpsdata->fix.eph = DEFAULT(eph); |
gpsdata->fix.eph = DEFAULT(eph); |
|
gpsdata->fix.epv = DEFAULT(epv); |
|
220 |
#undef DEFAULT |
#undef DEFAULT |
221 |
} |
} |
222 |
break; |
break; |
257 |
nf.ept = DEFAULT(ept); |
nf.ept = DEFAULT(ept); |
258 |
nf.altitude = DEFAULT(alt); |
nf.altitude = DEFAULT(alt); |
259 |
nf.eph = DEFAULT(eph); |
nf.eph = DEFAULT(eph); |
|
nf.epv = DEFAULT(epv); |
|
260 |
nf.track = DEFAULT(track); |
nf.track = DEFAULT(track); |
261 |
nf.speed = DEFAULT(speed); |
nf.speed = DEFAULT(speed); |
262 |
nf.climb = DEFAULT(climb); |
nf.climb = DEFAULT(climb); |
272 |
gpsdata->set |= ALTITUDE_SET | CLIMB_SET; |
gpsdata->set |= ALTITUDE_SET | CLIMB_SET; |
273 |
if (isnan(nf.eph)==0) |
if (isnan(nf.eph)==0) |
274 |
gpsdata->set |= HERR_SET; |
gpsdata->set |= HERR_SET; |
|
if (isnan(nf.epv)==0) |
|
|
gpsdata->set |= VERR_SET; |
|
275 |
if (isnan(nf.track)==0) |
if (isnan(nf.track)==0) |
276 |
gpsdata->set |= TRACK_SET | SPEED_SET; |
gpsdata->set |= TRACK_SET | SPEED_SET; |
277 |
if (isnan(nf.eps)==0) |
if (isnan(nf.eps)==0) |
476 |
} |
} |
477 |
|
|
478 |
void gps_init(appdata_t *appdata) { |
void gps_init(appdata_t *appdata) { |
479 |
appdata->gps_state = malloc(sizeof(gps_state_t)); |
appdata->gps_state = g_new0(gps_state_t, 1); |
|
memset(appdata->gps_state, 0, sizeof(gps_state_t)); |
|
480 |
|
|
481 |
/* start a new thread to listen to gpsd */ |
/* start a new thread to listen to gpsd */ |
482 |
appdata->gps_state->mutex = g_mutex_new(); |
appdata->gps_state->mutex = g_mutex_new(); |
488 |
#ifdef USE_MAEMO |
#ifdef USE_MAEMO |
489 |
gpsbt_stop(&appdata->gps_state->context); |
gpsbt_stop(&appdata->gps_state->context); |
490 |
#endif |
#endif |
491 |
free(appdata->gps_state); |
g_free(appdata->gps_state); |
492 |
} |
} |
493 |
|
|
494 |
#else |
#else |
495 |
|
|
|
#warning "liblocation interface not completely implemented" |
|
|
|
|
496 |
static void |
static void |
497 |
location_changed(LocationGPSDevice *device, gps_state_t *gps_state) { |
location_changed(LocationGPSDevice *device, gps_state_t *gps_state) { |
498 |
|
|
499 |
gps_state->fix = |
gps_state->fields = device->fix->fields; |
500 |
(device->fix->fields & LOCATION_GPS_DEVICE_LATLONG_SET); |
|
501 |
|
if(gps_state->fields & LOCATION_GPS_DEVICE_LATLONG_SET) { |
|
if(gps_state->fix) { |
|
502 |
gps_state->latitude = device->fix->latitude; |
gps_state->latitude = device->fix->latitude; |
503 |
gps_state->longitude = device->fix->longitude; |
gps_state->longitude = device->fix->longitude; |
504 |
|
gps_state->eph = device->fix->eph/100.0; // we want eph in meters |
505 |
|
} |
506 |
|
|
507 |
|
if(gps_state->fields & LOCATION_GPS_DEVICE_TRACK_SET) |
508 |
gps_state->heading = device->fix->track; |
gps_state->heading = device->fix->track; |
509 |
gps_state->epe = device->fix->eph; |
|
510 |
|
/* update list of sattelites */ |
511 |
|
|
512 |
|
/* free old list */ |
513 |
|
if(gps_state->sats.num) { |
514 |
|
g_free(gps_state->sats.PRN); |
515 |
|
g_free(gps_state->sats.used); |
516 |
|
g_free(gps_state->sats.ss); |
517 |
|
gps_state->sats.num = 0; |
518 |
|
} |
519 |
|
|
520 |
|
/* build new one */ |
521 |
|
if(device->satellites_in_view) { |
522 |
|
gps_state->sats.PRN = g_new0(int, device->satellites_in_view); |
523 |
|
gps_state->sats.used = g_new0(int, device->satellites_in_view); |
524 |
|
gps_state->sats.ss = g_new0(int, device->satellites_in_view); |
525 |
|
|
526 |
|
int i; |
527 |
|
for(i=0;i<device->satellites_in_view;i++) { |
528 |
|
LocationGPSDeviceSatellite *sat = |
529 |
|
g_ptr_array_index(device->satellites, i); |
530 |
|
|
531 |
|
gps_state->sats.PRN[i] = sat->prn; |
532 |
|
gps_state->sats.used[i] = sat->in_use; |
533 |
|
gps_state->sats.ss[i] = sat->signal_strength; |
534 |
|
} |
535 |
|
|
536 |
|
gps_state->sats.num = device->satellites_in_view; |
537 |
} |
} |
538 |
} |
} |
539 |
|
|
552 |
g_signal_connect(gps_state->device, "changed", |
g_signal_connect(gps_state->device, "changed", |
553 |
G_CALLBACK(location_changed), gps_state); |
G_CALLBACK(location_changed), gps_state); |
554 |
|
|
555 |
|
gps_state->control = location_gpsd_control_get_default(); |
556 |
|
|
557 |
|
if(gps_state->control |
558 |
|
#if MAEMO_VERSION_MAJOR < 5 |
559 |
|
&& gps_state->control->can_control |
560 |
|
#endif |
561 |
|
) { |
562 |
|
|
563 |
|
printf("Having control over GPSD and GPS is to be enabled, starting it\n"); |
564 |
|
location_gpsd_control_start(gps_state->control); |
565 |
|
} |
566 |
} |
} |
567 |
|
|
568 |
void gps_release(appdata_t *appdata) { |
void gps_release(appdata_t *appdata) { |
569 |
gps_state_t *gps_state = appdata->gps_state; |
gps_state_t *gps_state = appdata->gps_state; |
570 |
|
|
571 |
if(!gps_state->device) return; |
if(!gps_state->device) return; |
572 |
|
|
573 |
|
if(gps_state->control |
574 |
|
#if MAEMO_VERSION_MAJOR < 5 |
575 |
|
&& gps_state->control->can_control |
576 |
|
#endif |
577 |
|
) { |
578 |
|
printf("Having control over GPSD, stopping it\n"); |
579 |
|
location_gpsd_control_stop(gps_state->control); |
580 |
|
} |
581 |
|
|
582 |
/* Disconnect signal */ |
/* Disconnect signal */ |
583 |
g_signal_handler_disconnect(gps_state->device, gps_state->idd_changed); |
g_signal_handler_disconnect(gps_state->device, gps_state->idd_changed); |
594 |
|
|
595 |
gps_state_t *gps_state = appdata->gps_state; |
gps_state_t *gps_state = appdata->gps_state; |
596 |
|
|
597 |
if(!gps_state->fix) |
if(!(gps_state->fields & LOCATION_GPS_DEVICE_LATLONG_SET)) |
598 |
return NULL; |
return NULL; |
599 |
|
|
600 |
pos.lat = gps_state->latitude; |
pos.lat = gps_state->latitude; |
606 |
float gps_get_heading(appdata_t *appdata) { |
float gps_get_heading(appdata_t *appdata) { |
607 |
gps_state_t *gps_state = appdata->gps_state; |
gps_state_t *gps_state = appdata->gps_state; |
608 |
|
|
609 |
if(!gps_state->fix) |
if(!(gps_state->fields & LOCATION_GPS_DEVICE_TRACK_SET)) |
610 |
return NAN; |
return NAN; |
611 |
|
|
612 |
return gps_state->heading; |
return gps_state->heading; |
613 |
} |
} |
614 |
|
|
615 |
float gps_get_epe(appdata_t *appdata) { |
float gps_get_eph(appdata_t *appdata) { |
616 |
gps_state_t *gps_state = appdata->gps_state; |
gps_state_t *gps_state = appdata->gps_state; |
617 |
|
|
618 |
if(!gps_state->fix) |
if(!(gps_state->fields & LOCATION_GPS_DEVICE_LATLONG_SET)) |
619 |
return NAN; |
return NAN; |
620 |
|
|
621 |
return gps_state->epe; |
return gps_state->eph; |
622 |
} |
} |
623 |
|
|
624 |
gps_sat_t *gps_get_sats(appdata_t *appdata) { return NULL; } |
gps_sat_t *gps_get_sats(appdata_t *appdata) { |
625 |
|
gps_sat_t *retval = NULL; |
626 |
|
gps_state_t *gps_state = appdata->gps_state; |
627 |
|
|
628 |
|
if(gps_state->sats.num) { |
629 |
|
retval = g_new0(gps_sat_t, 1); |
630 |
|
retval->num = gps_state->sats.num; |
631 |
|
|
632 |
|
retval->PRN = g_memdup(gps_state->sats.PRN, |
633 |
|
sizeof(int)*gps_state->sats.num); |
634 |
|
retval->used = g_memdup(gps_state->sats.used, |
635 |
|
sizeof(int)*gps_state->sats.num); |
636 |
|
retval->ss = g_memdup(gps_state->sats.ss, |
637 |
|
sizeof(int)*gps_state->sats.num); |
638 |
|
} |
639 |
|
|
640 |
|
return retval; |
641 |
|
} |
642 |
|
|
643 |
|
|
644 |
#endif |
#endif |