/* * Copyright (C) 2006, 2007 John Costigan. * * POI and GPS-Info code originally written by Cezary Jackiewicz. * * Default map data provided by http://www.openstreetmap.org/ * * This file is part of Maemo Mapper. * * Maemo Mapper is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Maemo Mapper is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Maemo Mapper. If not, see . */ #ifndef MAEMO_MAPPER_DEFINES #define MAEMO_MAPPER_DEFINES #include #define _(String) gettext(String) #ifndef DEBUG #define printf(...) #endif /* Set the below if to determine whether to get verbose output. */ #if 1 #define vprintf printf #else #define vprintf(...) #endif #define BOUND(x, a, b) { \ if((x) < (a)) \ (x) = (a); \ else if((x) > (b)) \ (x) = (b); \ } #define PI (3.14159265358979323846) #define EARTH_RADIUS (3443.91847) /* BT dbus service location */ #define BASE_PATH "/org/bluez" #define BASE_INTERFACE "org.bluez" //#define ADAPTER_PATH BASE_PATH #define ADAPTER_INTERFACE BASE_INTERFACE ".Adapter" #define MANAGER_PATH BASE_PATH #define MANAGER_INTERFACE BASE_INTERFACE ".Manager" #define ERROR_INTERFACE BASE_INTERFACE ".Error" #define SECURITY_INTERFACE BASE_INTERFACE ".Security" #define RFCOMM_INTERFACE BASE_INTERFACE ".RFCOMM" #define BLUEZ_DBUS BASE_INTERFACE #define LIST_ADAPTERS "ListAdapters" #define LIST_BONDINGS "ListBondings" //#define CREATE_BONDING "CreateBonding" #define GET_REMOTE_NAME "GetRemoteName" #define GET_REMOTE_SERVICE_CLASSES "GetRemoteServiceClasses" #define BTCOND_PATH "/com/nokia/btcond/request" #define BTCOND_BASE "com.nokia.btcond" #define BTCOND_INTERFACE BTCOND_BASE ".request" #define BTCOND_REQUEST BTCOND_INTERFACE #define BTCOND_CONNECT "rfcomm_connect" #define BTCOND_DISCONNECT "rfcomm_disconnect" #define BTCOND_DBUS BTCOND_BASE /** MAX_ZOOM defines the largest map zoom level we will download. * (MAX_ZOOM - 1) is the largest map zoom level that the user can zoom to. */ #define MIN_ZOOM (0) #define MAX_ZOOM (20) #define TILE_SIZE_PIXELS (256) #define TILE_HALFDIAG_PIXELS (181) #define TILE_SIZE_P2 (8) #define ARRAY_CHUNK_SIZE (1024) #define BUFFER_SIZE (2048) #define APRS_BUFFER_SIZE (4096) #define APRS_MAX_COMMENT 80 #define APRS_CONVERSE_MODE "k" #define GPSD_PORT_DEFAULT (2947) #define NUM_DOWNLOAD_THREADS (4) #define WORLD_SIZE_UNITS (2 << (MAX_ZOOM + TILE_SIZE_P2)) #define HOURGLASS_SEPARATION (7) #define deg2rad(deg) ((deg) * (PI / 180.0)) #define rad2deg(rad) ((rad) * (180.0 / PI)) #define tile2pixel(TILE) ((TILE) << TILE_SIZE_P2) #define pixel2tile(PIXEL) ((PIXEL) >> TILE_SIZE_P2) #define tile2unit(TILE) ((TILE) << (TILE_SIZE_P2 + _zoom)) #define unit2tile(unit) ((unit) >> (TILE_SIZE_P2 + _zoom)) #define tile2zunit(TILE, ZOOM) ((TILE) << (TILE_SIZE_P2 + (ZOOM))) #define unit2ztile(unit, ZOOM) ((unit) >> (TILE_SIZE_P2 + (ZOOM))) #define pixel2unit(PIXEL) ((PIXEL) << _zoom) #define unit2pixel(PIXEL) ((PIXEL) >> _zoom) #define pixel2zunit(PIXEL, ZOOM) ((PIXEL) << (ZOOM)) #define unit2zpixel(PIXEL, ZOOM) ((PIXEL) >> (ZOOM)) #define unit2buf_full(UNITX, UNITY, BUFX, BUFY, CENTER, MATRIX) { \ gfloat fdevx, fdevy; \ gdk_pixbuf_rotate_vector(&fdevx, &fdevy, (MATRIX), \ (gint)((UNITX) - (CENTER).unitx), \ (gint)((UNITY) - (CENTER).unity)); \ (BUFX) = unit2pixel((gint)(fdevx)) + _view_halfwidth_pixels; \ (BUFY) = unit2pixel((gint)(fdevy)) + _view_halfheight_pixels; \ } #define unit2buf(UNITX, UNITY, BUFX, BUFY) \ (unit2buf_full(UNITX, UNITY, BUFX, BUFY, _center, _map_rotate_matrix)) #define pixel2buf_full(PIXELX, PIXELY, BUFX, BUFY, CENTER, ZOOM, MATRIX) { \ gfloat fdevx, fdevy; \ gdk_pixbuf_rotate_vector(&fdevx, &fdevy, MATRIX, \ (gint)((PIXELX) - unit2zpixel((CENTER).unitx, (ZOOM))), \ (gint)((PIXELY) - unit2zpixel((CENTER).unity, (ZOOM)))); \ (BUFX) = fdevx + _view_halfwidth_pixels; \ (BUFY) = fdevy + _view_halfheight_pixels; \ } #define pixel2buf(PIXELX, PIXELY, BUFX, BUFY) \ (pixel2buf_full(PIXELX, PIXELY, BUFX, BUFY, _center, _zoom, \ _map_rotate_matrix)) #define unit2screen_full(UNITX, UNITY, SCREENX, SCREENY, CENTER, MATRIX) { \ unit2buf_full(UNITX, UNITY, SCREENX, SCREENY, CENTER, MATRIX); \ (SCREENX) = (SCREENX) + _map_offset_devx; \ (SCREENY) = (SCREENY) + _map_offset_devy; \ } #define unit2screen(UNITX, UNITY, SCREENX, SCREENY) \ (unit2screen_full(UNITX, UNITY, SCREENX, SCREENY, _center, \ _map_rotate_matrix)) #define pixel2screen_full(PIXELX, PIXELY, SCREENX, SCREENY, CENTER, MATRIX) { \ pixel2buf_full(PIXELX, PIXELY, SCREENX, SCREENY, CENTER, ZOOM, MATRIX); \ (SCREENX) = (SCREENX) + _map_offset_devx; \ (SCREENY) = (SCREENY) + _map_offset_devy; \ } #define pixel2screen(PIXELX, PIXELY, SCREENX, SCREENY) \ (pixel2screen_full(PIXELX, PIXELY, SCREENX, SCREENY, _center, \ _map_rotate_matrix)) #define buf2unit_full(BUFX, BUFY, UNITX, UNITY, CENTER, MATRIX) { \ gfloat funitx, funity; \ gdk_pixbuf_rotate_vector(&funitx, &funity, MATRIX, \ pixel2unit((gint)((BUFX) - _view_halfwidth_pixels)), \ pixel2unit((gint)((BUFY) - _view_halfheight_pixels))); \ (UNITX) = (CENTER).unitx + (gint)funitx; \ (UNITY) = (CENTER).unity + (gint)funity; \ } #define buf2unit(BUFX, BUFY, UNITX, UNITY) \ (buf2unit_full(BUFX, BUFY, UNITX, UNITY, _center, _map_reverse_matrix)) #define buf2pixel_full(BUFX, BUFY, PIXELX, PIXELY, CENTER, MATRIX) { \ gfloat fpixelx, fpixely; \ gdk_pixbuf_rotate_vector(&fpixelx, &fpixely, MATRIX, \ (gint)(BUFX) - _view_halfwidth_pixels, \ (gint)(BUFY) - _view_halfheight_pixels); \ (PIXELX) = unit2pixel((CENTER).unitx) + (gint)fpixelx; \ (PIXELY) = unit2pixel((CENTER).unity) + (gint)fpixely; \ } #define buf2pixel(BUFX, BUFY, PIXELX, PIXELY) \ (buf2pixel_full(BUFX, BUFY, PIXELX, PIXELY, _center, _map_reverse_matrix)) #define screen2unit_full(SCREENX, SCREENY, UNITX, UNITY, CENTER, MATRIX) ( \ buf2unit_full((SCREENX) - _map_offset_devx, (SCREENY) - _map_offset_devy, \ UNITX, UNITY, CENTER, MATRIX)) #define screen2unit(SCREENX, SCREENY, UNITX, UNITY) \ (screen2unit_full(SCREENX, SCREENY, UNITX, UNITY, _center, \ _map_reverse_matrix)) #define screen2pixel_full(SCREENX, SCREENY, PIXELX, PIXELY, CENTER, MATRIX) ( \ buf2pixel_full((SCREENX) - _map_offset_devx, (SCREENY) - _map_offset_devy,\ PIXELX, PIXELY, CENTER, MATRIX)) #define screen2pixel(SCREENX, SCREENY, PIXELX, PIXELY) ( \ screen2pixel_full(SCREENX, SCREENY, PIXELX, PIXELY, \ _center,_map_reverse_matrix)) /* Pans are done 64 pixels at a time. */ #define PAN_PIXELS (64) #define ROTATE_DEGREES (30) #define INITIAL_DOWNLOAD_RETRIES (3) #define CONFIG_DIR_NAME "~/.maemo-mapper/" #define CONFIG_PATH_DB_FILE "paths.db" #define REPO_DEFAULT_NAME "OpenStreet" #define REPO_DEFAULT_CACHE_BASE "~/MyDocs/.documents/Maps/" #define REPO_DEFAULT_CACHE_DIR REPO_DEFAULT_CACHE_BASE"OpenStreet.db" #define REPO_DEFAULT_MAP_URI "http://tile.openstreetmap.org/%0d/%d/%d.png" #define REPO_DEFAULT_DL_ZOOM_STEPS (2) #define REPO_DEFAULT_VIEW_ZOOM_STEPS (1) #define REPO_DEFAULT_MIN_ZOOM (4) #define REPO_DEFAULT_MAX_ZOOM (20) #define XML_DATE_FORMAT "%FT%T" #define HELP_ID_PREFIX "help_maemomapper_" #define HELP_ID_INTRO HELP_ID_PREFIX"intro" #define HELP_ID_GETSTARTED HELP_ID_PREFIX"getstarted" #define HELP_ID_ABOUT HELP_ID_PREFIX"about" #define HELP_ID_SETTINGS HELP_ID_PREFIX"settings" #define HELP_ID_NEWREPO HELP_ID_PREFIX"newrepo" #define HELP_ID_REPOMAN HELP_ID_PREFIX"repoman" #define HELP_ID_MAPMAN HELP_ID_PREFIX"mapman" #define HELP_ID_DOWNROUTE HELP_ID_PREFIX"downroute" #define HELP_ID_DOWNPOI HELP_ID_PREFIX"downpoi" #define HELP_ID_BROWSEPOI HELP_ID_PREFIX"browsepoi" #define HELP_ID_POILIST HELP_ID_PREFIX"poilist" #define HELP_ID_POICAT HELP_ID_PREFIX"poicat" #define MERCATOR_SPAN (-6.28318377773622) #define MERCATOR_TOP (3.14159188886811) #define latlon2unit(lat, lon, unitx, unity) { \ gdouble tmp; \ unitx = (lon + 180.0) * (WORLD_SIZE_UNITS / 360.0) + 0.5; \ tmp = sin(deg2rad(lat)); \ unity = 0.5 + (WORLD_SIZE_UNITS / MERCATOR_SPAN) \ * (log((1.0 + tmp) / (1.0 - tmp)) * 0.5 - MERCATOR_TOP); \ } #define unit2latlon(unitx, unity, lat, lon) { \ (lon) = ((unitx) * (360.0 / WORLD_SIZE_UNITS)) - 180.0; \ (lat) = (360.0 * (atan(exp(((unity) * (MERCATOR_SPAN / WORLD_SIZE_UNITS)) \ + MERCATOR_TOP)))) * (1.0 / PI) - 90.0; \ } #define MACRO_PATH_INIT(path) { \ (path).head = (path).tail = g_new(Point, ARRAY_CHUNK_SIZE); \ *((path).tail) = _point_null; \ (path).cap = (path).head + ARRAY_CHUNK_SIZE; \ (path).whead = g_new(WayPoint, ARRAY_CHUNK_SIZE); \ (path).wtail = (path).whead - 1; \ (path).wcap = (path).whead + ARRAY_CHUNK_SIZE; \ } #define MACRO_PATH_FREE(path) if((path).head) { \ WayPoint *curr; \ g_free((path).head); \ (path).head = (path).tail = (path).cap = NULL; \ for(curr = (path).whead - 1; curr++ != (path).wtail; ) \ g_free(curr->desc); \ g_free((path).whead); \ (path).whead = (path).wtail = (path).wcap = NULL; \ } #define MACRO_PATH_INCREMENT_TAIL(route) { \ if(++(route).tail == (route).cap) \ path_resize(&(route), (route).cap - (route).head + ARRAY_CHUNK_SIZE);\ } #define MACRO_PATH_INCREMENT_WTAIL(route) { \ if(++(route).wtail == (route).wcap) \ path_wresize(&(route), \ (route).wcap - (route).whead + ARRAY_CHUNK_SIZE); \ } #define DISTANCE_SQUARED(a, b) \ ((guint64)((((gint64)(b).unitx)-(a).unitx)*(((gint64)(b).unitx)-(a).unitx))\ + (guint64)((((gint64)(b).unity)-(a).unity)*(((gint64)(b).unity)-(a).unity))) #define MACRO_QUEUE_DRAW_AREA() \ gtk_widget_queue_draw_area( \ _map_widget, \ 0, 0, \ _view_width_pixels, \ _view_height_pixels) /* Render all on-map metadata an annotations, including POI and paths. */ #ifdef INCLUDE_APRS #define MACRO_MAP_RENDER_DATA() { \ if(_show_poi) \ map_render_poi(); \ if(_show_paths > 0) \ map_render_paths(); \ if(_aprs_enable) \ map_render_aprs(); \ } #else #define MACRO_MAP_RENDER_DATA() { \ if(_show_poi) \ map_render_poi(); \ if(_show_paths > 0) \ map_render_paths(); \ } #endif //INCLUDE_APRS #define UNBLANK_SCREEN(MOVING, APPROACHING_WAYPOINT) { \ /* Check if we need to unblank the screen. */ \ switch(_unblank_option) \ { \ case UNBLANK_NEVER: \ break; \ case UNBLANK_WAYPOINT: \ if(APPROACHING_WAYPOINT) \ { \ printf("Unblanking screen...\n"); \ osso_display_state_on(_osso); \ osso_display_blanking_pause(_osso); \ } \ break; \ default: \ case UNBLANK_FULLSCREEN: \ if(!_fullscreen) \ break; \ case UNBLANK_WHEN_MOVING: \ if(!(MOVING)) \ break; \ case UNBLANK_WITH_GPS: \ printf("Unblanking screen...\n"); \ osso_display_state_on(_osso); \ osso_display_blanking_pause(_osso); \ } \ } #define LL_FMT_LEN 20 #define lat_format(A, B) deg_format((A), (B), 'S', 'N') #define lon_format(A, B) deg_format((A), (B), 'W', 'E') #define TRACKS_MASK 0x00000001 #define ROUTES_MASK 0x00000002 #define MACRO_BANNER_SHOW_INFO(A, S) { \ gchar *my_macro_buffer = g_markup_printf_escaped( \ "%s", \ INFO_FONT_ENUM_TEXT[_info_font_size], (S)); \ hildon_banner_show_information_with_markup(A, NULL, my_macro_buffer); \ g_free(my_macro_buffer); \ } #define MAPDB_EXISTS(map_repo) ( ((map_repo)->is_sqlite) \ ? ((map_repo)->sqlite_db != NULL) \ : ((map_repo)->gdbm_db != NULL) ) #define _voice_synth_path "/usr/bin/flite" #endif /* ifndef MAEMO_MAPPER_DEFINES */