482 |
} |
} |
483 |
|
|
484 |
void gps_init(appdata_t *appdata) { |
void gps_init(appdata_t *appdata) { |
485 |
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)); |
|
486 |
|
|
487 |
/* start a new thread to listen to gpsd */ |
/* start a new thread to listen to gpsd */ |
488 |
appdata->gps_state->mutex = g_mutex_new(); |
appdata->gps_state->mutex = g_mutex_new(); |
494 |
#ifdef USE_MAEMO |
#ifdef USE_MAEMO |
495 |
gpsbt_stop(&appdata->gps_state->context); |
gpsbt_stop(&appdata->gps_state->context); |
496 |
#endif |
#endif |
497 |
free(appdata->gps_state); |
g_free(appdata->gps_state); |
498 |
} |
} |
499 |
|
|
500 |
#else |
#else |
501 |
|
|
|
#warning "liblocation interface not completely implemented" |
|
|
|
|
502 |
static void |
static void |
503 |
location_changed(LocationGPSDevice *device, gps_state_t *gps_state) { |
location_changed(LocationGPSDevice *device, gps_state_t *gps_state) { |
504 |
|
|
505 |
gps_state->fix = |
gps_state->fields = device->fix->fields; |
506 |
(device->fix->fields & LOCATION_GPS_DEVICE_LATLONG_SET); |
|
507 |
|
if(gps_state->fields & LOCATION_GPS_DEVICE_LATLONG_SET) { |
|
if(gps_state->fix) { |
|
508 |
gps_state->latitude = device->fix->latitude; |
gps_state->latitude = device->fix->latitude; |
509 |
gps_state->longitude = device->fix->longitude; |
gps_state->longitude = device->fix->longitude; |
|
gps_state->heading = device->fix->track; |
|
510 |
gps_state->epe = device->fix->eph; |
gps_state->epe = device->fix->eph; |
511 |
|
} |
512 |
|
|
513 |
|
if(gps_state->fields & LOCATION_GPS_DEVICE_TRACK_SET) |
514 |
|
gps_state->heading = device->fix->track; |
515 |
|
|
516 |
|
/* update list of sattelites */ |
517 |
|
|
518 |
|
/* free old list */ |
519 |
|
if(gps_state->sats.num) { |
520 |
|
g_free(gps_state->sats.PRN); |
521 |
|
g_free(gps_state->sats.used); |
522 |
|
g_free(gps_state->sats.ss); |
523 |
|
gps_state->sats.num = 0; |
524 |
|
} |
525 |
|
|
526 |
|
/* build new one */ |
527 |
|
if(device->satellites_in_view) { |
528 |
|
gps_state->sats.PRN = g_new0(int, device->satellites_in_view); |
529 |
|
gps_state->sats.used = g_new0(int, device->satellites_in_view); |
530 |
|
gps_state->sats.ss = g_new0(int, device->satellites_in_view); |
531 |
|
|
532 |
|
int i; |
533 |
|
for(i=0;i<device->satellites_in_view;i++) { |
534 |
|
LocationGPSDeviceSatellite *sat = |
535 |
|
g_ptr_array_index(device->satellites, i); |
536 |
|
|
537 |
|
gps_state->sats.PRN[i] = sat->prn; |
538 |
|
gps_state->sats.used[i] = sat->in_use; |
539 |
|
gps_state->sats.ss[i] = sat->signal_strength; |
540 |
|
} |
541 |
|
|
542 |
|
gps_state->sats.num = device->satellites_in_view; |
543 |
} |
} |
544 |
} |
} |
545 |
|
|
580 |
|
|
581 |
gps_state_t *gps_state = appdata->gps_state; |
gps_state_t *gps_state = appdata->gps_state; |
582 |
|
|
583 |
if(!gps_state->fix) |
if(!(gps_state->fields & LOCATION_GPS_DEVICE_LATLONG_SET)) |
584 |
return NULL; |
return NULL; |
585 |
|
|
586 |
pos.lat = gps_state->latitude; |
pos.lat = gps_state->latitude; |
592 |
float gps_get_heading(appdata_t *appdata) { |
float gps_get_heading(appdata_t *appdata) { |
593 |
gps_state_t *gps_state = appdata->gps_state; |
gps_state_t *gps_state = appdata->gps_state; |
594 |
|
|
595 |
if(!gps_state->fix) |
if(!(gps_state->fields & LOCATION_GPS_DEVICE_TRACK_SET)) |
596 |
return NAN; |
return NAN; |
597 |
|
|
598 |
return gps_state->heading; |
return gps_state->heading; |
601 |
float gps_get_epe(appdata_t *appdata) { |
float gps_get_epe(appdata_t *appdata) { |
602 |
gps_state_t *gps_state = appdata->gps_state; |
gps_state_t *gps_state = appdata->gps_state; |
603 |
|
|
604 |
if(!gps_state->fix) |
if(!(gps_state->fields & LOCATION_GPS_DEVICE_LATLONG_SET)) |
605 |
return NAN; |
return NAN; |
606 |
|
|
607 |
return gps_state->epe; |
return gps_state->epe; |
608 |
} |
} |
609 |
|
|
610 |
gps_sat_t *gps_get_sats(appdata_t *appdata) { return NULL; } |
gps_sat_t *gps_get_sats(appdata_t *appdata) { |
611 |
|
gps_sat_t *retval = NULL; |
612 |
|
gps_state_t *gps_state = appdata->gps_state; |
613 |
|
|
614 |
|
if(gps_state->sats.num) { |
615 |
|
retval = g_new0(gps_sat_t, 1); |
616 |
|
retval->num = gps_state->sats.num; |
617 |
|
|
618 |
|
retval->PRN = g_memdup(gps_state->sats.PRN, |
619 |
|
sizeof(int)*gps_state->sats.num); |
620 |
|
retval->used = g_memdup(gps_state->sats.used, |
621 |
|
sizeof(int)*gps_state->sats.num); |
622 |
|
retval->ss = g_memdup(gps_state->sats.ss, |
623 |
|
sizeof(int)*gps_state->sats.num); |
624 |
|
} |
625 |
|
|
626 |
|
return retval; |
627 |
|
} |
628 |
|
|
629 |
|
|
630 |
#endif |
#endif |