Diff of /trunk/src/gps.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 7 by harbaum, Thu Jun 25 15:24:24 2009 UTC revision 8 by harbaum, Thu Jun 25 19:08:48 2009 UTC
# Line 482  gpointer gps_thread(gpointer data) { Line 482  gpointer gps_thread(gpointer data) {
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();
# Line 495  void gps_release(appdata_t *appdata) { Line 494  void gps_release(appdata_t *appdata) {
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    
# Line 555  pos_t *gps_get_pos(appdata_t *appdata) { Line 580  pos_t *gps_get_pos(appdata_t *appdata) {
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;
# Line 567  pos_t *gps_get_pos(appdata_t *appdata) { Line 592  pos_t *gps_get_pos(appdata_t *appdata) {
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;
# Line 576  float gps_get_heading(appdata_t *appdata Line 601  float gps_get_heading(appdata_t *appdata
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

Legend:
Removed from v.7  
changed lines
  Added in v.8