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 36 by harbaum, Thu Jul 30 12:41:20 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      gps_state->control = location_gpsd_control_get_default();
562    
563      if(gps_state->control
564    #if MAEMO_VERSION_MAJOR < 5
565         && gps_state->control->can_control
566    #endif
567         ) {
568    
569        printf("Having control over GPSD and GPS is to be enabled, starting it\n");
570        location_gpsd_control_start(gps_state->control);
571      }
572  }  }
573    
574  void gps_release(appdata_t *appdata) {  void gps_release(appdata_t *appdata) {
575    gps_state_t *gps_state = appdata->gps_state;    gps_state_t *gps_state = appdata->gps_state;
576    
577    if(!gps_state->device) return;    if(!gps_state->device) return;
578    
579      if(gps_state->control
580    #if MAEMO_VERSION_MAJOR < 5
581         && gps_state->control->can_control
582    #endif
583         ) {
584        printf("Having control over GPSD, stopping it\n");
585        location_gpsd_control_stop(gps_state->control);
586      }
587    
588    /* Disconnect signal */    /* Disconnect signal */
589    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 600  pos_t *gps_get_pos(appdata_t *appdata) {
600    
601    gps_state_t *gps_state = appdata->gps_state;    gps_state_t *gps_state = appdata->gps_state;
602    
603    if(!gps_state->fix)    if(!(gps_state->fields & LOCATION_GPS_DEVICE_LATLONG_SET))
604      return NULL;      return NULL;
605    
606    pos.lat = gps_state->latitude;    pos.lat = gps_state->latitude;
# Line 560  pos_t *gps_get_pos(appdata_t *appdata) { Line 609  pos_t *gps_get_pos(appdata_t *appdata) {
609    return &pos;    return &pos;
610  }  }
611    
612  float gps_get_heading(appdata_t *appdata) { return NAN; }  float gps_get_heading(appdata_t *appdata) {
613      gps_state_t *gps_state = appdata->gps_state;
614    
615      if(!(gps_state->fields & LOCATION_GPS_DEVICE_TRACK_SET))
616        return NAN;
617    
618      return gps_state->heading;
619    }
620    
621    float gps_get_epe(appdata_t *appdata) {
622      gps_state_t *gps_state = appdata->gps_state;
623    
624      if(!(gps_state->fields & LOCATION_GPS_DEVICE_LATLONG_SET))
625        return NAN;
626    
627      return gps_state->epe;
628    }
629    
630    gps_sat_t *gps_get_sats(appdata_t *appdata) {
631      gps_sat_t *retval = NULL;
632      gps_state_t *gps_state = appdata->gps_state;
633    
634  float gps_get_epe(appdata_t *appdata) { return NAN; }    if(gps_state->sats.num) {
635        retval = g_new0(gps_sat_t, 1);
636        retval->num = gps_state->sats.num;
637    
638        retval->PRN  = g_memdup(gps_state->sats.PRN,
639                                sizeof(int)*gps_state->sats.num);
640        retval->used = g_memdup(gps_state->sats.used,
641                                sizeof(int)*gps_state->sats.num);
642        retval->ss   = g_memdup(gps_state->sats.ss,
643                                sizeof(int)*gps_state->sats.num);
644      }
645    
646  gps_sat_t *gps_get_sats(appdata_t *appdata) { return NULL; }    return retval;
647    }
648    
649    
650  #endif  #endif

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