From 8ff350387d2e98bb7485e41f6358ccc13e97bab2 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Sun, 13 Jan 2013 17:44:44 +0100 Subject: Work on a dive localisation tool using GPS coordinates For each dive recorded, place their GPS coordinates onto a map using the OSM-GPS-MAP library. This map is accessible via the "log" menu or the shortcut ctrl+M (M as map). We check for the GPS coordinates "0, 0" which are the default when we do not have real GPS coordinates set. [Dirk Hohndel: fixed int/float math confusion, fixed some whitespace and coding style issues, cleaned up some comments, added a missing cast to prevent a compiler warning] Signed-off-by: Pierre-Yves Chibon Signed-Off-By: Henrik Brautaset Aronsen Signed-off-by: Dirk Hohndel --- Makefile | 8 ++++-- dive.h | 2 ++ gps.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ gtk-gui.c | 2 ++ 4 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 gps.c diff --git a/Makefile b/Makefile index 1a7543556..d866a5c0d 100644 --- a/Makefile +++ b/Makefile @@ -90,6 +90,7 @@ XML2CFLAGS = $(shell $(XML2CONFIG) --cflags) GLIB2CFLAGS = $(shell $(PKGCONFIG) --cflags glib-2.0) GTK2CFLAGS = $(shell $(PKGCONFIG) --cflags gtk+-2.0) CFLAGS += $(shell $(XSLCONFIG) --cflags) +OSMGPSMAPFLAGS += $(shell $(PKGCONFIG) --cflags osmgpsmap) LIBZIP = $(shell $(PKGCONFIG) --libs libzip 2> /dev/null) ifneq ($(strip $(LIBZIP)),) @@ -125,7 +126,7 @@ ifneq ($(strip $(LIBXSLT)),) endif endif -LIBS = $(LIBXML2) $(LIBXSLT) $(LIBGTK) $(LIBGCONF2) $(LIBDIVECOMPUTER) $(EXTRALIBS) $(LIBZIP) -lpthread -lm -lssl -lcrypto +LIBS = $(LIBXML2) $(LIBXSLT) $(LIBGTK) $(LIBGCONF2) $(LIBDIVECOMPUTER) $(EXTRALIBS) $(LIBZIP) -lpthread -lm -lssl -lcrypto -losmgpsmap MSGLANGS=$(notdir $(wildcard po/*po)) MSGOBJS=$(addprefix share/locale/,$(MSGLANGS:.po=.UTF-8/LC_MESSAGES/subsurface.mo)) @@ -133,7 +134,7 @@ MSGOBJS=$(addprefix share/locale/,$(MSGLANGS:.po=.UTF-8/LC_MESSAGES/subsurface.m OBJS = main.o dive.o time.o profile.o info.o equipment.o divelist.o deco.o planner.o \ parse-xml.o save-xml.o libdivecomputer.o print.o uemis.o uemis-downloader.o \ gtk-gui.o statistics.o file.o cochran.o device.o download-dialog.o prefs.o \ - $(OSSUPPORT).o $(RESFILE) + gps.o $(OSSUPPORT).o $(RESFILE) $(NAME): $(OBJS) $(MSGOBJS) $(CC) $(LDFLAGS) -o $(NAME) $(OBJS) $(LIBS) @@ -239,6 +240,9 @@ equipment.o: equipment.c dive.h display.h divelist.h statistics.o: statistics.c dive.h display.h divelist.h $(CC) $(CFLAGS) $(GTK2CFLAGS) $(GLIB2CFLAGS) $(XML2CFLAGS) -c statistics.c +gps.o: gps.c dive.h display.h divelist.h + $(CC) $(CFLAGS) $(GTK2CFLAGS) $(GLIB2CFLAGS) $(XML2CFLAGS) $(OSMGPSMAPFLAGS) -c gps.c + divelist.o: divelist.c dive.h display.h divelist.h $(CC) $(CFLAGS) $(GTK2CFLAGS) $(GLIB2CFLAGS) $(XML2CFLAGS) -c divelist.c diff --git a/dive.h b/dive.h index b80e6bf53..19a1768cb 100644 --- a/dive.h +++ b/dive.h @@ -490,6 +490,8 @@ extern void clear_equipment_widgets(void); extern void show_dive_stats(struct dive *); extern void clear_stats_widgets(void); +extern void show_gps_locations(void); + extern void show_yearly_stats(void); extern void update_dive(struct dive *new_dive); diff --git a/gps.c b/gps.c new file mode 100644 index 000000000..86eb60672 --- /dev/null +++ b/gps.c @@ -0,0 +1,91 @@ +/* gps.c */ +/* Creates the UI displaying the dives locations on a map. + */ +#include + +#include "osm-gps-map.h" + +#include "dive.h" +#include "display.h" +#include "display-gtk.h" +#include "divelist.h" + +static OsmGpsMapSource_t opt_map_provider = OSM_GPS_MAP_SOURCE_OPENSTREETMAP; + + +static void on_close (GtkWidget *widget, gpointer user_data) +{ + gtk_widget_destroy(widget); +} + +static void add_gps_point(OsmGpsMap *map, float latitude, float longitude) +{ + OsmGpsMapTrack * track = osm_gps_map_track_new (); + OsmGpsMapPoint * point = osm_gps_map_point_new_degrees (latitude, longitude); + osm_gps_map_track_add_point(track, point); + osm_gps_map_track_add (map, track); +} + + +void show_gps_locations() +{ + GtkWidget *window; + + OsmGpsMap *map; + OsmGpsMapLayer *osd; + char *cachedir, *cachebasedir; + int idx; + struct dive *dp; + + cachebasedir = osm_gps_map_get_default_cache_directory(); + cachedir = g_strdup(OSM_GPS_MAP_CACHE_AUTO); + + map = g_object_new (OSM_TYPE_GPS_MAP, + "map-source",opt_map_provider, + "tile-cache",cachedir, + "tile-cache-base", cachebasedir, + "proxy-uri",g_getenv("http_proxy"), + NULL); + osd = g_object_new (OSM_TYPE_GPS_MAP_OSD, + "show-scale",TRUE, + "show-coordinates",TRUE, + "show-crosshair",TRUE, + "show-dpad",TRUE, + "show-zoom",TRUE, + "show-gps-in-dpad",TRUE, + "show-gps-in-zoom",FALSE, + "dpad-radius", 30, + NULL); + + osm_gps_map_layer_add(OSM_GPS_MAP(map), osd); + g_object_unref(G_OBJECT(osd)); + for (idx = 0; idx < dive_table.nr; idx++) { + dp = dive_table.dives[idx]; + if (dp->latitude.udeg != 0 && dp->longitude.udeg != 0){ + add_gps_point(map, dp->latitude.udeg / 1000000.0, + dp->longitude.udeg / 1000000.0); + } + } + osm_gps_map_set_center_and_zoom(map, 0, 0, 0); + + /* Enable keyboard navigation */ + osm_gps_map_set_keyboard_shortcut(map, OSM_GPS_MAP_KEY_FULLSCREEN, GDK_KEY_F11); + osm_gps_map_set_keyboard_shortcut(map, OSM_GPS_MAP_KEY_UP, GDK_KEY_Up); + osm_gps_map_set_keyboard_shortcut(map, OSM_GPS_MAP_KEY_DOWN, GDK_KEY_Down); + osm_gps_map_set_keyboard_shortcut(map, OSM_GPS_MAP_KEY_LEFT, GDK_KEY_Left); + osm_gps_map_set_keyboard_shortcut(map, OSM_GPS_MAP_KEY_RIGHT, GDK_KEY_Right); + + window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + + gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); + gtk_window_set_default_size(GTK_WINDOW(window), 640, 480); + gtk_window_set_title(GTK_WINDOW(window), _("Dives locations")); + gtk_container_set_border_width(GTK_CONTAINER(window), 5); + GTK_WINDOW(window)->allow_shrink = TRUE; + + gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET(map)); + + g_signal_connect (window, "destroy", G_CALLBACK (on_close), (gpointer) map); + + gtk_widget_show_all (window); +} diff --git a/gtk-gui.c b/gtk-gui.c index 1bc338811..f72aac42e 100644 --- a/gtk-gui.c +++ b/gtk-gui.c @@ -1027,6 +1027,7 @@ static GtkActionEntry menu_items[] = { { "Preferences", GTK_STOCK_PREFERENCES, N_("Preferences..."), PREFERENCE_ACCEL, NULL, G_CALLBACK(preferences_dialog) }, { "Renumber", NULL, N_("Renumber..."), NULL, NULL, G_CALLBACK(renumber_dialog) }, { "YearlyStats", NULL, N_("Yearly Statistics"), NULL, NULL, G_CALLBACK(show_yearly_stats) }, + { "DivesLocations", NULL, N_("Dives Locations"), CTRLCHAR "M", NULL, G_CALLBACK(show_gps_locations) }, { "SelectEvents", NULL, N_("Select Events..."), NULL, NULL, G_CALLBACK(selectevents_dialog) }, { "Quit", GTK_STOCK_QUIT, N_("Quit"), CTRLCHAR "Q", NULL, G_CALLBACK(quit) }, { "About", GTK_STOCK_ABOUT, N_("About Subsurface"), NULL, NULL, G_CALLBACK(about_dialog) }, @@ -1073,6 +1074,7 @@ static const gchar* ui_string = " \ \ \ \ + \ \ \ \ -- cgit v1.2.3-70-g09d2