Diff of /trunk/src/gps.c

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

revision 1 by harbaum, Sat Jun 20 11:08:47 2009 UTC revision 11 by harbaum, Fri Jun 26 12:24:24 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;
510        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 529  void gps_init(appdata_t *appdata) { Line 558  void gps_init(appdata_t *appdata) {
558      g_signal_connect(gps_state->device, "changed",      g_signal_connect(gps_state->device, "changed",
559                       G_CALLBACK(location_changed), gps_state);                       G_CALLBACK(location_changed), gps_state);
560    
561    #if MAEMO_VERSION_MAJOR < 5
562      gps_state->control = location_gpsd_control_get_default();
563    
564      if(appdata->gps_enabled && gps_state->control &&
565         gps_state->control->can_control) {
566        printf("Having control over GPSD and GPS is to be enabled, starting it\n");
567        location_gpsd_control_start(gps_state->control);
568      }
569    #endif
570  }  }
571    
572  void gps_release(appdata_t *appdata) {  void gps_release(appdata_t *appdata) {
573    gps_state_t *gps_state = appdata->gps_state;    gps_state_t *gps_state = appdata->gps_state;
574    
575    if(!gps_state->device) return;    if(!gps_state->device) return;
576    
577    #if MAEMO_VERSION_MAJOR < 5
578      if(gps_state->control && gps_state->control->can_control) {
579        printf("Having control over GPSD, stopping it\n");
580        location_gpsd_control_stop(gps_state->control);
581      }
582    #endif
583    
584    /* Disconnect signal */    /* Disconnect signal */
585    g_signal_handler_disconnect(gps_state->device, gps_state->idd_changed);    g_signal_handler_disconnect(gps_state->device, gps_state->idd_changed);
# Line 551  pos_t *gps_get_pos(appdata_t *appdata) { Line 596  pos_t *gps_get_pos(appdata_t *appdata) {
596    
597    gps_state_t *gps_state = appdata->gps_state;    gps_state_t *gps_state = appdata->gps_state;
598    
599    if(!gps_state->fix)    if(!(gps_state->fields & LOCATION_GPS_DEVICE_LATLONG_SET))
600      return NULL;      return NULL;
601    
602    pos.lat = gps_state->latitude;    pos.lat = gps_state->latitude;
# Line 560  pos_t *gps_get_pos(appdata_t *appdata) { Line 605  pos_t *gps_get_pos(appdata_t *appdata) {
605    return &pos;    return &pos;
606  }  }
607    
608  float gps_get_heading(appdata_t *appdata) { return NAN; }  float gps_get_heading(appdata_t *appdata) {
609      gps_state_t *gps_state = appdata->gps_state;
610    
611      if(!(gps_state->fields & LOCATION_GPS_DEVICE_TRACK_SET))
612        return NAN;
613    
614      return gps_state->heading;
615    }
616    
617    float gps_get_epe(appdata_t *appdata) {
618      gps_state_t *gps_state = appdata->gps_state;
619    
620      if(!(gps_state->fields & LOCATION_GPS_DEVICE_LATLONG_SET))
621        return NAN;
622    
623      return gps_state->epe;
624    }
625    
626    gps_sat_t *gps_get_sats(appdata_t *appdata) {
627      gps_sat_t *retval = NULL;
628      gps_state_t *gps_state = appdata->gps_state;
629    
630  float gps_get_epe(appdata_t *appdata) { return NAN; }    if(gps_state->sats.num) {
631        retval = g_new0(gps_sat_t, 1);
632        retval->num = gps_state->sats.num;
633    
634        retval->PRN  = g_memdup(gps_state->sats.PRN,
635                                sizeof(int)*gps_state->sats.num);
636        retval->used = g_memdup(gps_state->sats.used,
637                                sizeof(int)*gps_state->sats.num);
638        retval->ss   = g_memdup(gps_state->sats.ss,
639                                sizeof(int)*gps_state->sats.num);
640      }
641    
642  gps_sat_t *gps_get_sats(appdata_t *appdata) { return NULL; }    return retval;
643    }
644    
645    
646  #endif  #endif

Legend:
Removed from v.1  
changed lines
  Added in v.11