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 |
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) { |
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) { |
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( |
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 |
|
|
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); |
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; |