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 53 by harbaum, Wed Aug 12 19:18:53 2009 UTC
# Line 97  float gps_get_heading(appdata_t *appdata Line 97  float gps_get_heading(appdata_t *appdata
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);
# Line 180  void gps_clear_fix(struct gps_fix_t *fix Line 180  void gps_clear_fix(struct gps_fix_t *fix
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;
# Line 211  static void gps_unpack(char *buf, struct Line 210  static void gps_unpack(char *buf, struct
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;
# Line 260  static void gps_unpack(char *buf, struct Line 257  static void gps_unpack(char *buf, struct
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);
# Line 276  static void gps_unpack(char *buf, struct Line 272  static void gps_unpack(char *buf, struct
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)
# Line 482  gpointer gps_thread(gpointer data) { Line 476  gpointer gps_thread(gpointer data) {
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();
# Line 495  void gps_release(appdata_t *appdata) { Line 488  void gps_release(appdata_t *appdata) {
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    
# Line 533  void gps_init(appdata_t *appdata) { Line 552  void gps_init(appdata_t *appdata) {
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);
# Line 555  pos_t *gps_get_pos(appdata_t *appdata) { Line 594  pos_t *gps_get_pos(appdata_t *appdata) {
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;
# Line 567  pos_t *gps_get_pos(appdata_t *appdata) { Line 606  pos_t *gps_get_pos(appdata_t *appdata) {
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

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