84 |
return NULL; |
return NULL; |
85 |
} |
} |
86 |
|
|
87 |
|
|
88 |
|
pos_t *map_gps_get_pos(map_context_t *context) { |
89 |
|
static pos_t pos; |
90 |
|
|
91 |
|
if(context->gps.set & FIX_LATLON_SET) { |
92 |
|
pos.lat = context->gps.fix.latitude; |
93 |
|
pos.lon = context->gps.fix.longitude; |
94 |
|
return &pos; |
95 |
|
} |
96 |
|
|
97 |
|
return NULL; |
98 |
|
} |
99 |
|
|
100 |
|
pos_t *map_get_pos(map_context_t *context) { |
101 |
|
pos_t *pos = &context->appdata->home; |
102 |
|
|
103 |
|
if(context->appdata->active_location) { |
104 |
|
int i = context->appdata->active_location-1; |
105 |
|
location_t *loc = context->appdata->location; |
106 |
|
while(i--) loc = loc->next; |
107 |
|
pos = &loc->pos; |
108 |
|
} |
109 |
|
|
110 |
|
if(context->appdata->use_gps) |
111 |
|
pos = map_gps_get_pos(context); |
112 |
|
|
113 |
|
return pos; |
114 |
|
} |
115 |
|
|
116 |
|
float map_gps_get_heading(map_context_t *context) { |
117 |
|
if(context->gps.set & FIX_TRACK_SET) |
118 |
|
return context->gps.fix.track; |
119 |
|
|
120 |
|
return NAN; |
121 |
|
} |
122 |
|
|
123 |
|
float map_gps_get_eph(map_context_t *context) { |
124 |
|
if(context->gps.set & FIX_LATLON_SET) |
125 |
|
return context->gps.fix.eph; |
126 |
|
|
127 |
|
return NAN; |
128 |
|
} |
129 |
|
|
130 |
|
/* callback called by the gps layer whenever gps state changes */ |
131 |
|
static void |
132 |
|
gps_callback(gps_mask_t set, struct gps_t *fix, void *data) { |
133 |
|
map_context_t *context = (map_context_t*)data; |
134 |
|
|
135 |
|
printf("map: gps callback\n"); |
136 |
|
|
137 |
|
context->gps.set = set; |
138 |
|
memcpy(&context->gps.fix, fix, sizeof(struct gps_t)); |
139 |
|
} |
140 |
|
|
141 |
static void |
static void |
142 |
cb_map_gps(osd_button_t but, map_context_t *context) { |
cb_map_gps(osd_button_t but, map_context_t *context) { |
143 |
|
|
180 |
#endif |
#endif |
181 |
|
|
182 |
/* get reference position ... */ |
/* get reference position ... */ |
183 |
pos_t *refpos = get_pos(context->appdata); |
pos_t *refpos = map_get_pos(context); |
184 |
gboolean ok = (refpos!= NULL) && !isnan(refpos->lat) && !isnan(refpos->lon); |
gboolean ok = (refpos!= NULL) && !isnan(refpos->lat) && !isnan(refpos->lon); |
185 |
|
|
186 |
/* ... and enable "goto" button if it's valid */ |
/* ... and enable "goto" button if it's valid */ |
195 |
int radius = 0; |
int radius = 0; |
196 |
|
|
197 |
if(context->appdata->use_gps) { |
if(context->appdata->use_gps) { |
198 |
heading = gps_get_heading(context->appdata); |
heading = map_gps_get_heading(context); |
199 |
|
|
200 |
/* get error */ |
/* get error */ |
201 |
float eph = gps_get_eph(context->appdata); |
float eph = map_gps_get_eph(context); |
202 |
if(!isnan(eph)) |
if(!isnan(eph)) |
203 |
radius = dist2pixel(context, eph/1000, refpos->lat); |
radius = dist2pixel(context, eph/1000, refpos->lat); |
204 |
} |
} |
344 |
|
|
345 |
/* clear all existing cache images */ |
/* clear all existing cache images */ |
346 |
osm_gps_map_clear_images (OSM_GPS_MAP(context->widget)); |
osm_gps_map_clear_images (OSM_GPS_MAP(context->widget)); |
|
memset(context->caches_displayed, 0, |
|
|
(cache_num+1) * sizeof(cache_display_t)); |
|
347 |
|
|
348 |
/* draw search results and all other gpx files are semi-transparent */ |
if(context->caches_displayed) { |
349 |
map_draw_gpx(context->appdata, context->caches_displayed, |
memset(context->caches_displayed, 0, |
350 |
context->widget, context->appdata->search_results, |
(cache_num+1) * sizeof(cache_display_t)); |
|
NULL, FALSE); |
|
351 |
|
|
352 |
gpx_t *gpx = context->appdata->gpx; |
/* draw search results and all other gpx files are semi-transparent */ |
|
while(gpx) { |
|
353 |
map_draw_gpx(context->appdata, context->caches_displayed, |
map_draw_gpx(context->appdata, context->caches_displayed, |
354 |
context->widget, gpx, NULL, TRUE); |
context->widget, context->appdata->search_results, |
355 |
|
NULL, FALSE); |
356 |
|
|
357 |
gpx = gpx->next; |
gpx_t *gpx = context->appdata->gpx; |
358 |
} |
while(gpx) { |
359 |
|
map_draw_gpx(context->appdata, context->caches_displayed, |
360 |
|
context->widget, gpx, NULL, TRUE); |
361 |
|
|
362 |
|
gpx = gpx->next; |
363 |
|
} |
364 |
|
} |
365 |
name = g_strdup(_("Search results")); |
name = g_strdup(_("Search results")); |
366 |
context->state = MAP_SEARCH; |
context->state = MAP_SEARCH; |
367 |
} |
} |
380 |
|
|
381 |
/* clear all existing cache images */ |
/* clear all existing cache images */ |
382 |
osm_gps_map_clear_images (OSM_GPS_MAP(context->widget)); |
osm_gps_map_clear_images (OSM_GPS_MAP(context->widget)); |
383 |
memset(context->caches_displayed, 0, |
if(context->caches_displayed) { |
384 |
(cache_num+1) * sizeof(cache_display_t)); |
memset(context->caches_displayed, 0, |
385 |
|
(cache_num+1) * sizeof(cache_display_t)); |
386 |
/* draw all geocaches and none is semi-transparent */ |
|
387 |
gpx_t *gpx = context->appdata->gpx; |
/* draw all geocaches and none is semi-transparent */ |
388 |
while(gpx) { |
gpx_t *gpx = context->appdata->gpx; |
389 |
map_draw_gpx(context->appdata, context->caches_displayed, |
while(gpx) { |
390 |
context->widget, gpx, NULL, FALSE); |
map_draw_gpx(context->appdata, context->caches_displayed, |
391 |
gpx = gpx->next; |
context->widget, gpx, NULL, FALSE); |
392 |
} |
gpx = gpx->next; |
393 |
|
} |
394 |
{ |
|
395 |
int i=0; |
{ |
396 |
while(context->caches_displayed[i].id) i++; |
int i=0; |
397 |
printf("number of caches actually displayed: %d\n", i); |
while(context->caches_displayed[i].id) i++; |
398 |
|
printf("number of caches actually displayed: %d\n", i); |
399 |
|
} |
400 |
} |
} |
|
|
|
401 |
name = g_strdup(_("all")); |
name = g_strdup(_("all")); |
402 |
context->state = MAP_ALL; |
context->state = MAP_ALL; |
403 |
} |
} |
416 |
|
|
417 |
/* clear all existing cache images */ |
/* clear all existing cache images */ |
418 |
osm_gps_map_clear_images (OSM_GPS_MAP(context->widget)); |
osm_gps_map_clear_images (OSM_GPS_MAP(context->widget)); |
419 |
memset(context->caches_displayed, 0, |
if(context->caches_displayed) { |
420 |
(cache_num+1) * sizeof(cache_display_t)); |
memset(context->caches_displayed, 0, |
421 |
|
(cache_num+1) * sizeof(cache_display_t)); |
422 |
/* draw all geocaches and all other gpx files are semi-transparent */ |
|
423 |
map_draw_gpx(context->appdata, context->caches_displayed, |
/* draw all geocaches and all other gpx files are semi-transparent */ |
424 |
context->widget, context->appdata->cur_gpx, NULL, FALSE); |
map_draw_gpx(context->appdata, context->caches_displayed, |
425 |
|
context->widget, context->appdata->cur_gpx, NULL, FALSE); |
426 |
gpx_t *gpx = context->appdata->gpx; |
|
427 |
while(gpx) { |
gpx_t *gpx = context->appdata->gpx; |
428 |
if(gpx != context->appdata->cur_gpx) |
while(gpx) { |
429 |
map_draw_gpx(context->appdata, context->caches_displayed, |
if(gpx != context->appdata->cur_gpx) |
430 |
context->widget, gpx, NULL, TRUE); |
map_draw_gpx(context->appdata, context->caches_displayed, |
431 |
|
context->widget, gpx, NULL, TRUE); |
432 |
gpx = gpx->next; |
|
433 |
|
gpx = gpx->next; |
434 |
|
} |
435 |
} |
} |
436 |
|
|
437 |
name = g_strdup(context->appdata->cur_gpx->name); |
name = g_strdup(context->appdata->cur_gpx->name); |
448 |
|
|
449 |
/* clear all existing ccahe images */ |
/* clear all existing ccahe images */ |
450 |
osm_gps_map_clear_images (OSM_GPS_MAP(context->widget)); |
osm_gps_map_clear_images (OSM_GPS_MAP(context->widget)); |
451 |
memset(context->caches_displayed, 0, |
if(context->caches_displayed) { |
452 |
(cache_num+1) * sizeof(cache_display_t)); |
memset(context->caches_displayed, 0, |
453 |
|
(cache_num+1) * sizeof(cache_display_t)); |
454 |
/* Make sure we really work on the first copy in the list as */ |
|
455 |
/* only this is being used if duplicates exist */ |
/* Make sure we really work on the first copy in the list as */ |
456 |
cache = cache_search_first(context->appdata->gpx, cache); |
/* only this is being used if duplicates exist */ |
457 |
|
cache = cache_search_first(context->appdata->gpx, cache); |
458 |
/* draw all geocaches and all but selected one are semi-transparent */ |
|
459 |
gpx_t *gpx = context->appdata->gpx; |
/* draw all geocaches and all but selected one are semi-transparent */ |
460 |
while(gpx) { |
gpx_t *gpx = context->appdata->gpx; |
461 |
map_draw_gpx(context->appdata, context->caches_displayed, |
while(gpx) { |
462 |
context->widget, gpx, cache, FALSE); |
map_draw_gpx(context->appdata, context->caches_displayed, |
463 |
gpx = gpx->next; |
context->widget, gpx, cache, FALSE); |
464 |
|
gpx = gpx->next; |
465 |
|
} |
466 |
} |
} |
467 |
|
|
468 |
name = g_strdup(cache->name); |
name = g_strdup(cache->name); |
545 |
result = context->appdata->cur_cache; |
result = context->appdata->cur_cache; |
546 |
|
|
547 |
/* make sure this is the first hit */ |
/* make sure this is the first hit */ |
548 |
result = cache_search_first(context->appdata->gpx, result); |
if(context->caches_displayed) |
549 |
|
result = cache_search_first(context->appdata->gpx, result); |
550 |
|
|
551 |
return result; |
return result; |
552 |
} |
} |
770 |
printf("click %s event at %d %d\n", |
printf("click %s event at %d %d\n", |
771 |
event->data.click.down?"down":"up", |
event->data.click.down?"down":"up", |
772 |
event->data.click.x, event->data.click.y); |
event->data.click.x, event->data.click.y); |
773 |
|
|
774 |
/* make the main screen jump to that cache */ |
/* make the main screen jump to that cache */ |
775 |
if(!event->data.click.down) { |
if(!event->data.click.down) { |
776 |
if(context->appdata->cur_cache) { |
if(context->appdata->cur_cache) { |
777 |
printf("ERROR: no current cache should be visible!\n"); |
printf("ERROR: no current cache should be visible!\n"); |
778 |
} else { |
} else { |
779 |
gpx_t *is_in = NULL; |
gpx_t *is_in = NULL; |
780 |
|
|
781 |
|
if(context->appdata->search_results) { |
782 |
|
printf("click while in \"search results\" view\n"); |
783 |
|
|
784 |
if(!context->appdata->cur_gpx) { |
is_in = context->appdata->search_results; |
785 |
|
} else if(!context->appdata->cur_gpx) { |
786 |
printf("click while in \"all\" view\n"); |
printf("click while in \"all\" view\n"); |
787 |
|
|
788 |
/* we first need to figure out which gpx file this cache */ |
/* we first need to figure out which gpx file this cache */ |
789 |
/* is in so we can open it first */ |
/* is in so we can open it first */ |
790 |
gpx_t *gpx = context->appdata->gpx; |
gpx_t *gpx = context->appdata->gpx; |
800 |
|
|
801 |
if(is_in) |
if(is_in) |
802 |
gpxlist_goto_cachelist(context->appdata, is_in); |
gpxlist_goto_cachelist(context->appdata, is_in); |
803 |
|
|
804 |
} else |
} else { |
805 |
|
printf("click while in \"cachelist\" view\n"); |
806 |
|
|
807 |
/* the simple case: there already is an open gpx file and */ |
/* the simple case: there already is an open gpx file and */ |
808 |
/* we just jump into the "cache" view */ |
/* we just jump into the "cache" view */ |
809 |
is_in = context->appdata->cur_gpx; |
is_in = context->appdata->cur_gpx; |
810 |
|
} |
811 |
|
|
812 |
if(is_in) { |
if(is_in) { |
813 |
printf("selecting %s in %s\n", |
printf("selecting %s in %s\n", |
814 |
cache->id, |
cache->id, |
815 |
|
context->appdata->search_results? |
816 |
|
context->appdata->search_results->name: |
817 |
context->appdata->cur_gpx->name); |
context->appdata->cur_gpx->name); |
818 |
|
|
819 |
cachelist_goto_cache(context->appdata, cache); |
cachelist_goto_cache(context->appdata, cache); |
820 |
|
|
821 |
/* give focus to main screen (important for maemo) */ |
/* give focus to main screen (important for maemo) */ |
822 |
printf("raising main window\n"); |
printf("raising main window\n"); |
823 |
gtk_window_present(GTK_WINDOW(context->appdata->window)); |
gtk_window_present(GTK_WINDOW(context->appdata->window)); |
879 |
g_object_get(map, "zoom", &zoom, NULL); |
g_object_get(map, "zoom", &zoom, NULL); |
880 |
context->appdata->map.zoom = zoom; |
context->appdata->map.zoom = zoom; |
881 |
|
|
882 |
|
gboolean dpix; |
883 |
|
g_object_get(map, "double-pixel", &dpix, NULL); |
884 |
|
context->appdata->map.dpix = dpix; |
885 |
|
|
886 |
gfloat lat, lon; |
gfloat lat, lon; |
887 |
g_object_get(map, "latitude", &lat, "longitude", &lon, NULL); |
g_object_get(map, "latitude", &lat, "longitude", &lon, NULL); |
888 |
context->appdata->map.pos.lat = lat; |
context->appdata->map.pos.lat = lat; |
898 |
#endif |
#endif |
899 |
|
|
900 |
gtk_timeout_remove(context->handler_id); |
gtk_timeout_remove(context->handler_id); |
901 |
gps_unregister_callback(appdata, context->cb_id); |
gps_unregister_callback(appdata->gps_state, gps_callback); |
902 |
|
|
903 |
if(context->caches_displayed) { |
if(context->caches_displayed) { |
904 |
g_free(context->caches_displayed); |
g_free(context->caches_displayed); |
978 |
#endif |
#endif |
979 |
} |
} |
980 |
|
|
|
/* callback called by the gps layer whenever gps state changes */ |
|
|
static void |
|
|
gps_callback(struct gps_state *state, gpointer data) { |
|
|
printf("map: gps callback\n"); |
|
|
} |
|
|
|
|
981 |
void map(appdata_t *appdata) { |
void map(appdata_t *appdata) { |
982 |
map_context_t *context = NULL; |
map_context_t *context = NULL; |
983 |
|
|
1030 |
"auto-center", FALSE, |
"auto-center", FALSE, |
1031 |
"record-trip-history", FALSE, |
"record-trip-history", FALSE, |
1032 |
"show-trip-history", FALSE, |
"show-trip-history", FALSE, |
1033 |
|
"double-pixel", context->appdata->map.dpix, |
1034 |
proxy?"proxy-uri":NULL, proxy, |
proxy?"proxy-uri":NULL, proxy, |
1035 |
NULL); |
NULL); |
1036 |
|
|
1098 |
|
|
1099 |
/* install handler for timed updates of the gps button */ |
/* install handler for timed updates of the gps button */ |
1100 |
context->handler_id = gtk_timeout_add(1000, map_gps_update, context); |
context->handler_id = gtk_timeout_add(1000, map_gps_update, context); |
1101 |
context->cb_id = gps_register_callback(appdata, gps_callback, context); |
gps_register_callback(appdata->gps_state, LATLON_CHANGED | HERR_CHANGED, |
1102 |
|
gps_callback, context); |
1103 |
|
|
1104 |
#if MAEMO_VERSION_MAJOR == 5 |
#if MAEMO_VERSION_MAJOR == 5 |
1105 |
/* prevent some of the main screen things */ |
/* prevent some of the main screen things */ |