2 * This file is part of mapper
4 * Copyright (C) 2007 Kaj-Michael Lang
5 * Copyright (C) 2006-2007 John Costigan.
7 * POI and GPS-Info code originally written by Cezary Jackiewicz.
9 * Default map data provided by http://www.openstreetmap.org/
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License along
22 * with this program; if not, write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
36 #include <glib/gstdio.h>
37 #include <glib/gi18n.h>
40 #include "audio-note.h"
44 #include <gdk/gdkkeysyms.h>
45 #include <dbus/dbus.h>
46 #include <dbus/dbus-glib.h>
47 #include <dbus/dbus-glib-lowlevel.h>
48 #include <libgnomevfs/gnome-vfs.h>
49 #include <curl/multi.h>
50 #include <gconf/gconf-client.h>
58 #ifdef WITH_HILDON_DBUS_BT
65 #include <gtk/gtkgl.h>
69 #include "hildon-mapper.h"
71 #include "mapper-types.h"
75 #include "map-download.h"
78 #include "ui-common.h"
84 #include "config-gconf.h"
87 gfloat UNITS_CONVERT[] = {1.85200,1.15077945,1.f,};
89 GdkColor COLORABLE_DEFAULT[COLORABLE_ENUM_COUNT] = {
90 {0, 0x0000, 0x0000, 0xc000}
91 , /* COLORABLE_MARK */
92 {0, 0x6000, 0x6000, 0xf800}
93 , /* COLORABLE_MARK_VELOCITY */
94 {0, 0x8000, 0x8000, 0x8000}
95 , /* COLORABLE_MARK_OLD */
96 {0, 0xe000, 0x0000, 0x0000}
97 , /* COLORABLE_TRACK */
98 {0, 0xa000, 0x0000, 0x0000}
99 , /* COLORABLE_TRACK_MARK */
100 {0, 0x7000, 0x0000, 0x0000}
101 , /* COLORABLE_TRACK_BREAK */
102 {0, 0x0000, 0xa000, 0x0000}
103 , /* COLORABLE_ROUTE */
104 {0, 0x0000, 0x8000, 0x0000}
105 , /* COLORABLE_ROUTE_WAY */
106 {0, 0x0000, 0x6000, 0x0000}
107 , /* COLORABLE_ROUTE_BREAK */
108 {0, 0xa000, 0x0000, 0xa000} /* COLORABLE_POI */
124 guint mis=MAPPER_INIT_START;
126 static GtkWidget *init_progress;
127 static GtkWidget *init_dialog;
139 INFO_FONT_TEXT[INFO_FONT_XXSMALL] = "xx-small";
140 INFO_FONT_TEXT[INFO_FONT_XSMALL] = "x-small";
141 INFO_FONT_TEXT[INFO_FONT_SMALL] = "small";
142 INFO_FONT_TEXT[INFO_FONT_MEDIUM] = "medium";
143 INFO_FONT_TEXT[INFO_FONT_LARGE] = "large";
144 INFO_FONT_TEXT[INFO_FONT_XLARGE] = "x-large";
145 INFO_FONT_TEXT[INFO_FONT_XXLARGE] = "xx-large";
147 CUSTOM_KEY_GCONF[CUSTOM_KEY_UP] = GCONF_KEY_PREFIX "/key_up";
148 CUSTOM_KEY_GCONF[CUSTOM_KEY_DOWN] = GCONF_KEY_PREFIX "/key_down";
149 CUSTOM_KEY_GCONF[CUSTOM_KEY_LEFT] = GCONF_KEY_PREFIX "/key_left";
150 CUSTOM_KEY_GCONF[CUSTOM_KEY_RIGHT] = GCONF_KEY_PREFIX "/key_right";
151 CUSTOM_KEY_GCONF[CUSTOM_KEY_SELECT] = GCONF_KEY_PREFIX "/key_select";
152 CUSTOM_KEY_GCONF[CUSTOM_KEY_INCREASE] = GCONF_KEY_PREFIX "/key_increase";
153 CUSTOM_KEY_GCONF[CUSTOM_KEY_DECREASE] = GCONF_KEY_PREFIX "/key_decrease";
154 CUSTOM_KEY_GCONF[CUSTOM_KEY_FULLSCREEN] = GCONF_KEY_PREFIX "/key_fullscreen";
155 CUSTOM_KEY_GCONF[CUSTOM_KEY_ESC] = GCONF_KEY_PREFIX "/key_esc";
157 CUSTOM_KEY_ICON[CUSTOM_KEY_UP] = HWK_BUTTON_UP;
158 CUSTOM_KEY_ICON[CUSTOM_KEY_LEFT] = HWK_BUTTON_LEFT;
159 CUSTOM_KEY_ICON[CUSTOM_KEY_DOWN] = HWK_BUTTON_DOWN;
160 CUSTOM_KEY_ICON[CUSTOM_KEY_RIGHT] = HWK_BUTTON_RIGHT;
161 CUSTOM_KEY_ICON[CUSTOM_KEY_SELECT] = HWK_BUTTON_SELECT;
162 CUSTOM_KEY_ICON[CUSTOM_KEY_INCREASE] = HWK_BUTTON_INCREASE;
163 CUSTOM_KEY_ICON[CUSTOM_KEY_DECREASE] = HWK_BUTTON_DECREASE;
164 CUSTOM_KEY_ICON[CUSTOM_KEY_FULLSCREEN] = HWK_BUTTON_VIEW;
165 CUSTOM_KEY_ICON[CUSTOM_KEY_ESC] = HWK_BUTTON_CANCEL;
167 CUSTOM_KEY_DEFAULT[CUSTOM_KEY_UP] = CUSTOM_ACTION_PAN_NORTH;
168 CUSTOM_KEY_DEFAULT[CUSTOM_KEY_LEFT] = CUSTOM_ACTION_PAN_WEST;
169 CUSTOM_KEY_DEFAULT[CUSTOM_KEY_DOWN] = CUSTOM_ACTION_PAN_SOUTH;
170 CUSTOM_KEY_DEFAULT[CUSTOM_KEY_RIGHT] = CUSTOM_ACTION_PAN_EAST;
171 CUSTOM_KEY_DEFAULT[CUSTOM_KEY_SELECT] = CUSTOM_ACTION_TOGGLE_AUTOCENTER;
172 CUSTOM_KEY_DEFAULT[CUSTOM_KEY_INCREASE] = CUSTOM_ACTION_ZOOM_IN;
173 CUSTOM_KEY_DEFAULT[CUSTOM_KEY_DECREASE] = CUSTOM_ACTION_ZOOM_OUT;
174 CUSTOM_KEY_DEFAULT[CUSTOM_KEY_FULLSCREEN] = CUSTOM_ACTION_TOGGLE_FULLSCREEN;
175 CUSTOM_KEY_DEFAULT[CUSTOM_KEY_ESC] = CUSTOM_ACTION_TOGGLE_TRACKS;
177 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_PAN_NORTH] = _("Pan North");
178 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_PAN_WEST] = _("Pan West");
179 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_PAN_SOUTH] = _("Pan South");
180 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_PAN_EAST] = _("Pan East");
181 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_AUTOCENTER] = _("Toggle Auto-Center");
182 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_FULLSCREEN] = _("Toggle Fullscreen");
183 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_ZOOM_IN] = _("Zoom In");
184 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_ZOOM_OUT] = _("Zoom Out");
185 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_TRACKS] = _("Toggle Tracks");
186 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_SCALE] = _("Toggle Scale");
187 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_POI] = _("Toggle POIs");
188 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_CHANGE_REPO] = _("Select Next Repository");
189 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_ROUTE_DISTNEXT] = _("Show Distance to Next Waypoint");
190 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_ROUTE_DISTLAST] = _("Show Distance to End of Route");
191 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TRACK_BREAK] = _("Insert Track Break");
192 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TRACK_DISTLAST] = _("Show Distance from Last Break");
193 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TRACK_DISTFIRST] = _("Show Distance from Beginning");
194 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_GPS] = _("Toggle GPS");
195 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_GPSINFO] = _("Toggle GPS Info");
196 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_SPEEDLIMIT] = _("Toggle Speed Limit");
198 COLORABLE_GCONF[COLORABLE_MARK] = GCONF_KEY_PREFIX "/color_mark";
199 COLORABLE_GCONF[COLORABLE_MARK_VELOCITY] = GCONF_KEY_PREFIX "/color_mark_velocity";
200 COLORABLE_GCONF[COLORABLE_MARK_OLD] = GCONF_KEY_PREFIX "/color_mark_old";
201 COLORABLE_GCONF[COLORABLE_TRACK] = GCONF_KEY_PREFIX "/color_track";
202 COLORABLE_GCONF[COLORABLE_TRACK_MARK] = GCONF_KEY_PREFIX "/color_track_mark";
203 COLORABLE_GCONF[COLORABLE_TRACK_BREAK] = GCONF_KEY_PREFIX "/color_track_break";
204 COLORABLE_GCONF[COLORABLE_ROUTE] = GCONF_KEY_PREFIX "/color_route";
205 COLORABLE_GCONF[COLORABLE_ROUTE_WAY] = GCONF_KEY_PREFIX "/color_route_way";
206 COLORABLE_GCONF[COLORABLE_ROUTE_BREAK] = GCONF_KEY_PREFIX "/color_route_break";
207 COLORABLE_GCONF[COLORABLE_POI] = GCONF_KEY_PREFIX "/color_poi";
211 * Save state and destroy all non-UI elements created by this program in
212 * preparation for exiting.
219 map_download_deinit();
222 #if defined (WITH_GST)
223 #if defined (WITH_ESPEAK)
229 gps_disconnect(_gps);
231 osm_db_enable_mainloop(_db, FALSE);
236 position_free(_home);
237 position_free(_dest);
239 gnome_vfs_shutdown();
241 osso_deinitialize(_osso);
245 libhal_ctx_shutdown(ctx, NULL);
247 curl_global_cleanup();
251 mapper_osso_init(void)
254 /* Initialize _osso. */
255 _osso = osso_initialize("org.tal.mapper", VERSION, TRUE, NULL);
257 g_printerr("osso_initialize failed.\n");
266 hal_condition_cb(LibHalContext *ctx, const char *udi, const char *name, const char *detail)
268 g_debug("HAL: [%s]->[%s:%s]", udi, name, detail);
269 if (strcmp(name, "ButtonPressed")==0 && strcmp(detail, "phone")==0)
270 g_idle_add_full(G_PRIORITY_HIGH_IDLE, headphone_button_cb, NULL,NULL);
274 mapper_hal_init(DBusGConnection *gdbc)
277 DBusConnection *dbc=dbus_g_connection_get_connection(gdbc);
279 g_return_val_if_fail(dbc, FALSE);
281 dbus_error_init(&error);
283 ctx=libhal_ctx_new();
284 g_return_val_if_fail(ctx, FALSE);
286 if (!libhal_ctx_set_dbus_connection(ctx, dbc)) {
287 g_warning("HAL dbus connection failed");
291 if (!libhal_ctx_init(ctx, &error)) {
292 g_warning("HAL Init failed");
297 libhal_ctx_set_device_condition(ctx, hal_condition_cb);
298 libhal_device_add_property_watch(ctx, "/org/freedesktop/Hal/devices/platform_retu_headset_logicaldev_input",NULL);
305 mapper_osso_cb_init(void)
307 gchar *filter_string;
310 if (OSSO_OK != osso_rpc_set_default_cb_f(_osso, dbus_cb_default, NULL)) {
311 g_printerr("osso_rpc_set_default_cb_f failed.\n");
317 filter_string = g_strdup_printf("interface=%s", ICD_DBUS_INTERFACE);
319 dbus_bus_add_match(dbus_conn, filter_string, NULL);
320 g_free(filter_string);
322 /* add the callback */
323 dbus_connection_add_filter(dbus_conn, get_connection_status_signal_cb, NULL, NULL);
324 osso_iap_cb(iap_callback);
337 localtime_r(&time1, &time2);
338 _gmtoffset = time2.tm_gmtoff;
342 mapper_init(gpointer data)
344 GError *error = NULL;
350 case MAPPER_INIT_START:
351 curl_global_init(CURL_GLOBAL_NOTHING);
353 /* XXX: Load GPS configuration, then create gps */
354 _gps=gps_new(GPS_IO_SIMULATION);
355 _gps->connection_retry=gps_retry_connection;
356 _gps->connection_error=NULL;
357 _gps->connection_progress=gps_conn_set_progress;
358 _gps->update_location=gps_location_update;
359 _gps->update_info=gps_info_update;
364 _track=path_new(PATH_TYPE_TRACK, 0);
365 _route=path_new(PATH_TYPE_ROUTE, 1);
366 _home=position_new(POSITION_TYPE_HOME, 0);
367 _dest=position_new(POSITION_TYPE_DESTINATION, 1);
368 mis=MAPPER_INIT_CONFIG;
372 case MAPPER_INIT_CONFIG:
380 if (db_connect(&_db, _mapper_db)) {
383 mis=MAPPER_INIT_VOICE;
388 case MAPPER_INIT_POI:
394 case MAPPER_INIT_OSM:
396 osm_db_enable_mainloop(_db, TRUE);
397 mis=MAPPER_INIT_VOICE;
401 case MAPPER_INIT_VOICE:
402 #if defined (WITH_GST)
403 if (audio_note_init()==FALSE)
404 g_printerr("Audio note init failed\n");
405 #if defined (WITH_ESPEAK)
406 if (speak_init("en",_voice_speed,_voice_pitch)==FALSE) {
407 g_printerr("Espeak init failed\n");
408 popup_error(_window, "Speech init failed. Disabled.");
412 mis=MAPPER_INIT_MISC;
416 case MAPPER_INIT_MISC:
417 /* Initialize D-Bus system connection. */
418 if (NULL == (dbus_conn = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error))) {
419 g_warning("Failed to open connection to D-Bus: %s.\n", error->message);
420 popup_error(NULL, "Failed to connect to D-Bus.");
426 osso_hw_set_event_cb(_osso, NULL, osso_cb_hw_state, NULL);
429 mapper_hal_init(dbus_conn);
437 mis=MAPPER_INIT_GOTO;
441 case MAPPER_INIT_GOTO:
442 if (gtk_map_goto_position(_map, &_home)==FALSE)
443 g_printerr("Home is not set.\n");
445 gtk_map_center_latlon(_map, 60.45, 22.25);
446 mis=MAPPER_INIT_DONE;
450 case MAPPER_INIT_DONE:
451 progress_dialog_remove(init_dialog);
453 gps_connect_now(_gps);
458 gtk_progress_bar_set_fraction(GTK_PROGRESS(init_progress), p);
459 gtk_progress_bar_set_text(GTK_PROGRESS(init_progress), w);
464 main(gint argc, gchar * argv[])
468 setlocale(LC_ALL, "");
469 bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
470 bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
471 textdomain(GETTEXT_PACKAGE);
475 g_set_application_name("Mapper");
476 #if defined (WITH_GST)
477 gst_init(&argc, &argv);
479 gtk_init(&argc, &argv);
480 #if defined (WITH_GL)
481 if (!gtk_gl_init_check(&argc, &argv)) {
482 g_warning("OpenGL init failed");
486 if (mapper_osso_init()!=0)
488 if (mapper_osso_cb_init()!=0)
491 init_progress=gtk_progress_bar_new();
492 init_dialog=progress_dialog(NULL, "Mapper is loading...",init_progress);
493 gtk_widget_show_all(init_dialog);
494 g_idle_add((GSourceFunc)mapper_init, NULL);