Diff of /trunk/src/gps.c

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

revision 144 by harbaum, Wed Mar 25 13:29:27 2009 UTC revision 156 by harbaum, Wed Apr 1 12:47:35 2009 UTC
# Line 27  Line 27 
27    
28  #include <location/location-gps-device.h>  #include <location/location-gps-device.h>
29    
30  pos_t *gps_get_pos(appdata_t *appdata) {  gboolean gps_get_pos(appdata_t *appdata, pos_t *pos, float *alt) {
31    if(!appdata->gps_enabled)    if(!appdata->gps_enabled)
32      return NULL;      return FALSE;
33    
34    gps_state_t *gps_state = appdata->gps_state;    gps_state_t *gps_state = appdata->gps_state;
   static pos_t retval;  
35    
36    if(!gps_state->fix)    if(!gps_state->fix)
37      return NULL;      return FALSE;
38    
39    retval.lat = gps_state->latitude;    if(pos) {
40    retval.lon = gps_state->longitude;      pos->lat = gps_state->latitude;
41        pos->lon = gps_state->longitude;
42      }
43    
44      if(alt)
45        *alt = gps_state->altitude;
46    
47    return &retval;    return TRUE;
48  }  }
49    
50  static void  static void
# Line 53  location_changed(LocationGPSDevice *devi Line 57  location_changed(LocationGPSDevice *devi
57      gps_state->latitude = device->fix->latitude;      gps_state->latitude = device->fix->latitude;
58      gps_state->longitude = device->fix->longitude;      gps_state->longitude = device->fix->longitude;
59    }    }
60    
61      if(device->fix->fields & LOCATION_GPS_DEVICE_ALTITUDE_SET)
62        gps_state->altitude = device->fix->altitude;
63      else
64        gps_state->altitude = NAN;
65  }  }
66    
67  void gps_init(appdata_t *appdata) {  void gps_init(appdata_t *appdata) {
# Line 129  void gps_enable(appdata_t *appdata, gboo Line 138  void gps_enable(appdata_t *appdata, gboo
138  #define GPSD_HOST "127.0.0.1"  #define GPSD_HOST "127.0.0.1"
139  #define GPSD_PORT 2947  #define GPSD_PORT 2947
140    
141  pos_t *gps_get_pos(appdata_t *appdata) {  gboolean gps_get_pos(appdata_t *appdata, pos_t *pos, float *alt) {
142    static pos_t retval;    if(pos) pos->lat = NAN;
   
   retval.lat = NAN;  
143    
144    g_mutex_lock(appdata->gps_state->mutex);    g_mutex_lock(appdata->gps_state->mutex);
145    if(appdata->gps_state->gpsdata.set & STATUS_SET)    if(appdata->gps_state->gpsdata.set & STATUS_SET) {
146      if(appdata->gps_state->gpsdata.status != STATUS_NO_FIX)      if(appdata->gps_state->gpsdata.status != STATUS_NO_FIX) {
147        if(appdata->gps_state->gpsdata.set & LATLON_SET)        if(appdata->gps_state->gpsdata.set & LATLON_SET)
148          retval = appdata->gps_state->gpsdata.fix.pos;          *pos = appdata->gps_state->gpsdata.fix.pos;
149          if(appdata->gps_state->gpsdata.set & ALTITUDE_SET)
150            *alt = appdata->gps_state->gpsdata.fix.alt;
151        }
152      }
153    
154    g_mutex_unlock(appdata->gps_state->mutex);    g_mutex_unlock(appdata->gps_state->mutex);
155    
156    if(isnan(retval.lat))    return(!isnan(pos->lat));
     return NULL;  
   
   return &retval;  
157  }  }
158    
159  static int gps_connect(gps_state_t *gps_state) {  static int gps_connect(gps_state_t *gps_state) {
# Line 169  static int gps_connect(gps_state_t *gps_ Line 177  static int gps_connect(gps_state_t *gps_
177    /* try to connect to gpsd */    /* try to connect to gpsd */
178    /* Create a socket to interact with GPSD. */    /* Create a socket to interact with GPSD. */
179    
180      printf("GPSD: trying to connect to %s %d\n", GPSD_HOST, GPSD_PORT);
181    
182    int retries = 5;    int retries = 5;
183    while(retries &&    while(retries &&
184          (GNOME_VFS_OK != (vfs_result = gnome_vfs_inet_connection_create(          (GNOME_VFS_OK != (vfs_result = gnome_vfs_inet_connection_create(
# Line 215  static int gps_connect(gps_state_t *gps_ Line 225  static int gps_connect(gps_state_t *gps_
225  void gps_clear_fix(struct gps_fix_t *fixp) {  void gps_clear_fix(struct gps_fix_t *fixp) {
226    fixp->mode = MODE_NOT_SEEN;    fixp->mode = MODE_NOT_SEEN;
227    fixp->pos.lat = fixp->pos.lon = NAN;    fixp->pos.lat = fixp->pos.lon = NAN;
228      fixp->alt = NAN;
229    fixp->eph = NAN;    fixp->eph = NAN;
230  }  }
231    
# Line 253  static void gps_unpack(char *buf, struct Line 264  static void gps_unpack(char *buf, struct
264                nf.pos.lat = DEFAULT(lat);                nf.pos.lat = DEFAULT(lat);
265                nf.pos.lon = DEFAULT(lon);                nf.pos.lon = DEFAULT(lon);
266                nf.eph = DEFAULT(eph);                nf.eph = DEFAULT(eph);
267                  nf.alt = DEFAULT(alt);
268  #undef DEFAULT  #undef DEFAULT
269                if (st >= 6)                if (st >= 6)
270                  nf.mode = (mode[0] == '?') ? MODE_NOT_SEEN : atoi(mode);                  nf.mode = (mode[0] == '?') ? MODE_NOT_SEEN : atoi(mode);
# Line 262  static void gps_unpack(char *buf, struct Line 274  static void gps_unpack(char *buf, struct
274                gpsdata->set |= LATLON_SET|MODE_SET;                gpsdata->set |= LATLON_SET|MODE_SET;
275                gpsdata->status = STATUS_FIX;                gpsdata->status = STATUS_FIX;
276                gpsdata->set |= STATUS_SET;                gpsdata->set |= STATUS_SET;
277    
278                  if(alt[0] != '?')
279                    gpsdata->set |= ALTITUDE_SET;
280              }              }
281            }            }
282            break;            break;

Legend:
Removed from v.144  
changed lines
  Added in v.156