--- trunk/src/gps.c 2009/06/25 15:24:24 7 +++ trunk/src/gps.c 2009/10/29 13:59:16 149 @@ -97,7 +97,7 @@ return retval; } -float gps_get_epe(appdata_t *appdata) { +float gps_get_eph(appdata_t *appdata) { float retval = NAN; g_mutex_lock(appdata->gps_state->mutex); @@ -180,7 +180,6 @@ fixp->altitude = NAN; fixp->ept = NAN; fixp->eph = NAN; - fixp->epv = NAN; fixp->epd = NAN; fixp->eps = NAN; fixp->epc = NAN; @@ -211,15 +210,13 @@ /* C - cycle isn't supported by gpxview */ /* D - utc time isn't supported by gpxview */ case 'E': - gpsdata->epe = gpsdata->fix.eph = gpsdata->fix.epv = NAN; + gpsdata->fix.eph = NAN; /* epe should always be present if eph or epv is */ if (sp[2] != '?') { char epe[20], eph[20], epv[20]; (void)sscanf(sp, "E=%s %s %s", epe, eph, epv); #define DEFAULT(val) (val[0] == '?') ? NAN : g_ascii_strtod(val, NULL) - gpsdata->epe = DEFAULT(epe); gpsdata->fix.eph = DEFAULT(eph); - gpsdata->fix.epv = DEFAULT(epv); #undef DEFAULT } break; @@ -260,7 +257,6 @@ nf.ept = DEFAULT(ept); nf.altitude = DEFAULT(alt); nf.eph = DEFAULT(eph); - nf.epv = DEFAULT(epv); nf.track = DEFAULT(track); nf.speed = DEFAULT(speed); nf.climb = DEFAULT(climb); @@ -276,8 +272,6 @@ gpsdata->set |= ALTITUDE_SET | CLIMB_SET; if (isnan(nf.eph)==0) gpsdata->set |= HERR_SET; - if (isnan(nf.epv)==0) - gpsdata->set |= VERR_SET; if (isnan(nf.track)==0) gpsdata->set |= TRACK_SET | SPEED_SET; if (isnan(nf.eps)==0) @@ -482,8 +476,7 @@ } void gps_init(appdata_t *appdata) { - appdata->gps_state = malloc(sizeof(gps_state_t)); - memset(appdata->gps_state, 0, sizeof(gps_state_t)); + appdata->gps_state = g_new0(gps_state_t, 1); /* start a new thread to listen to gpsd */ appdata->gps_state->mutex = g_mutex_new(); @@ -495,26 +488,52 @@ #ifdef USE_MAEMO gpsbt_stop(&appdata->gps_state->context); #endif - free(appdata->gps_state); + g_free(appdata->gps_state); } #else -#warning "liblocation interface not completely implemented" - static void location_changed(LocationGPSDevice *device, gps_state_t *gps_state) { - gps_state->fix = - (device->fix->fields & LOCATION_GPS_DEVICE_LATLONG_SET); - - if(gps_state->fix) { + gps_state->fields = device->fix->fields; + + if(gps_state->fields & LOCATION_GPS_DEVICE_LATLONG_SET) { gps_state->latitude = device->fix->latitude; gps_state->longitude = device->fix->longitude; + gps_state->eph = device->fix->eph/100.0; // we want eph in meters + } + + if(gps_state->fields & LOCATION_GPS_DEVICE_TRACK_SET) gps_state->heading = device->fix->track; - gps_state->epe = device->fix->eph; + + /* update list of sattelites */ + /* free old list */ + if(gps_state->sats.num) { + g_free(gps_state->sats.PRN); + g_free(gps_state->sats.used); + g_free(gps_state->sats.ss); + gps_state->sats.num = 0; + } + /* build new one */ + if(device->satellites_in_view) { + gps_state->sats.PRN = g_new0(int, device->satellites_in_view); + gps_state->sats.used = g_new0(int, device->satellites_in_view); + gps_state->sats.ss = g_new0(int, device->satellites_in_view); + + int i; + for(i=0;isatellites_in_view;i++) { + LocationGPSDeviceSatellite *sat = + g_ptr_array_index(device->satellites, i); + + gps_state->sats.PRN[i] = sat->prn; + gps_state->sats.used[i] = sat->in_use; + gps_state->sats.ss[i] = sat->signal_strength; + } + + gps_state->sats.num = device->satellites_in_view; } } @@ -533,12 +552,32 @@ g_signal_connect(gps_state->device, "changed", G_CALLBACK(location_changed), gps_state); + gps_state->control = location_gpsd_control_get_default(); + + if(gps_state->control +#if MAEMO_VERSION_MAJOR < 5 + && gps_state->control->can_control +#endif + ) { + + printf("Having control over GPSD and GPS is to be enabled, starting it\n"); + location_gpsd_control_start(gps_state->control); + } } void gps_release(appdata_t *appdata) { gps_state_t *gps_state = appdata->gps_state; if(!gps_state->device) return; + + if(gps_state->control +#if MAEMO_VERSION_MAJOR < 5 + && gps_state->control->can_control +#endif + ) { + printf("Having control over GPSD, stopping it\n"); + location_gpsd_control_stop(gps_state->control); + } /* Disconnect signal */ g_signal_handler_disconnect(gps_state->device, gps_state->idd_changed); @@ -555,7 +594,7 @@ gps_state_t *gps_state = appdata->gps_state; - if(!gps_state->fix) + if(!(gps_state->fields & LOCATION_GPS_DEVICE_LATLONG_SET)) return NULL; pos.lat = gps_state->latitude; @@ -567,22 +606,49 @@ float gps_get_heading(appdata_t *appdata) { gps_state_t *gps_state = appdata->gps_state; - if(!gps_state->fix) + if(!(gps_state->fields & LOCATION_GPS_DEVICE_TRACK_SET)) return NAN; return gps_state->heading; } -float gps_get_epe(appdata_t *appdata) { +float gps_get_eph(appdata_t *appdata) { gps_state_t *gps_state = appdata->gps_state; - if(!gps_state->fix) + if(!(gps_state->fields & LOCATION_GPS_DEVICE_LATLONG_SET)) return NAN; - return gps_state->epe; + return gps_state->eph; } -gps_sat_t *gps_get_sats(appdata_t *appdata) { return NULL; } +gps_sat_t *gps_get_sats(appdata_t *appdata) { + gps_sat_t *retval = NULL; + gps_state_t *gps_state = appdata->gps_state; + + if(gps_state->sats.num) { + retval = g_new0(gps_sat_t, 1); + retval->num = gps_state->sats.num; + + retval->PRN = g_memdup(gps_state->sats.PRN, + sizeof(int)*gps_state->sats.num); + retval->used = g_memdup(gps_state->sats.used, + sizeof(int)*gps_state->sats.num); + retval->ss = g_memdup(gps_state->sats.ss, + sizeof(int)*gps_state->sats.num); + } + + return retval; +} #endif + +void *gps_register_callback(appdata_t *appdata, gps_cb cb, gpointer data) { + printf("register gps callback\n"); + return NULL; +} + + +void gps_unregister_callback(appdata_t *appdata, void *cb) { + printf("unregister gps callback\n"); +}