]> git.itanic.dy.fi Git - maemo-mapper/blob - src/defines.h
01caeaed57c423e9e47590d6249f77bcc1ec1b47
[maemo-mapper] / src / defines.h
1 /*
2  * Copyright (C) 2006, 2007 John Costigan.
3  *
4  * POI and GPS-Info code originally written by Cezary Jackiewicz.
5  *
6  * Default map data provided by http://www.openstreetmap.org/
7  *
8  * This file is part of Maemo Mapper.
9  *
10  * Maemo Mapper is free software: you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation, either version 3 of the License, or
13  * (at your option) any later version.
14  *
15  * Maemo Mapper is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with Maemo Mapper.  If not, see <http://www.gnu.org/licenses/>.
22  */
23
24 #ifndef MAEMO_MAPPER_DEFINES
25 #define MAEMO_MAPPER_DEFINES
26
27 #include <libintl.h>
28
29 #define _(String) gettext(String)
30
31 #ifndef DEBUG
32 #define printf(...)
33 #endif
34
35 /* Set the below if to determine whether to get verbose output. */
36 #if 1
37 #define vprintf printf
38 #else
39 #define vprintf(...)
40 #endif
41
42 #define BOUND(x, a, b) { \
43     if((x) < (a)) \
44         (x) = (a); \
45     else if((x) > (b)) \
46         (x) = (b); \
47 }
48
49 #define PI   (3.14159265358979323846)
50
51 #define EARTH_RADIUS (3443.91847)
52
53 /** MAX_ZOOM defines the largest map zoom level we will download.
54  * (MAX_ZOOM - 1) is the largest map zoom level that the user can zoom to.
55  */
56 #define MIN_ZOOM (0)
57 #define MAX_ZOOM (20)
58
59 #define TILE_SIZE_PIXELS (256)
60 #define TILE_HALFDIAG_PIXELS (181)
61 #define TILE_SIZE_P2 (8)
62
63 #define ARRAY_CHUNK_SIZE (1024)
64
65 #define BUFFER_SIZE (2048)
66
67 #define GPSD_PORT_DEFAULT (2947)
68
69 #define NUM_DOWNLOAD_THREADS (4)
70 #define MAX_PIXBUF_DUP_SIZE (137)
71 #define WORLD_SIZE_UNITS (2 << (MAX_ZOOM + TILE_SIZE_P2))
72
73 #define HOURGLASS_SEPARATION (7)
74
75 #define deg2rad(deg) ((deg) * (PI / 180.0))
76 #define rad2deg(rad) ((rad) * (180.0 / PI))
77
78 #define tile2pixel(TILE) ((TILE) << TILE_SIZE_P2)
79 #define pixel2tile(PIXEL) ((PIXEL) >> TILE_SIZE_P2)
80 #define tile2unit(TILE) ((TILE) << (TILE_SIZE_P2 + _zoom))
81 #define unit2tile(unit) ((unit) >> (TILE_SIZE_P2 + _zoom))
82 #define tile2zunit(TILE, ZOOM) ((TILE) << (TILE_SIZE_P2 + (ZOOM)))
83 #define unit2ztile(unit, ZOOM) ((unit) >> (TILE_SIZE_P2 + (ZOOM)))
84
85 #define pixel2unit(PIXEL) ((PIXEL) << _zoom)
86 #define unit2pixel(PIXEL) ((PIXEL) >> _zoom)
87 #define pixel2zunit(PIXEL, ZOOM) ((PIXEL) << (ZOOM))
88 #define unit2zpixel(PIXEL, ZOOM) ((PIXEL) >> (ZOOM))
89
90 #define unit2buf_full(UNITX, UNITY, BUFX, BUFY, CENTER, MATRIX) { \
91     gfloat fdevx, fdevy; \
92     gdk_pixbuf_rotate_vector(&fdevx, &fdevy, (MATRIX), \
93             (gint)((UNITX) - (CENTER).unitx), \
94             (gint)((UNITY) - (CENTER).unity)); \
95     (BUFX) = unit2pixel((gint)(fdevx)) + _view_halfwidth_pixels; \
96     (BUFY) = unit2pixel((gint)(fdevy)) + _view_halfheight_pixels; \
97 }
98
99 #define unit2buf(UNITX, UNITY, BUFX, BUFY) \
100     (unit2buf_full(UNITX, UNITY, BUFX, BUFY, _center, _map_rotate_matrix))
101
102 #define pixel2buf_full(PIXELX, PIXELY, BUFX, BUFY, CENTER, ZOOM, MATRIX) { \
103     gfloat fdevx, fdevy; \
104     gdk_pixbuf_rotate_vector(&fdevx, &fdevy, MATRIX, \
105             (gint)((PIXELX) - unit2zpixel((CENTER).unitx, (ZOOM))), \
106             (gint)((PIXELY) - unit2zpixel((CENTER).unity, (ZOOM)))); \
107     (BUFX) = fdevx + _view_halfwidth_pixels; \
108     (BUFY) = fdevy + _view_halfheight_pixels; \
109 }
110
111 #define pixel2buf(PIXELX, PIXELY, BUFX, BUFY) \
112     (pixel2buf_full(PIXELX, PIXELY, BUFX, BUFY, _center, _zoom, \
113                     _map_rotate_matrix))
114
115
116 #define unit2screen_full(UNITX, UNITY, SCREENX, SCREENY, CENTER, MATRIX) { \
117     unit2buf_full(UNITX, UNITY, SCREENX, SCREENY, CENTER, MATRIX); \
118     (SCREENX) = (SCREENX) + _map_offset_devx; \
119     (SCREENY) = (SCREENY) + _map_offset_devy; \
120 }
121
122 #define unit2screen(UNITX, UNITY, SCREENX, SCREENY) \
123     (unit2screen_full(UNITX, UNITY, SCREENX, SCREENY, _center, \
124                       _map_rotate_matrix))
125
126 #define pixel2screen_full(PIXELX, PIXELY, SCREENX, SCREENY, CENTER, MATRIX) { \
127     pixel2buf_full(PIXELX, PIXELY, SCREENX, SCREENY, CENTER, ZOOM, MATRIX); \
128     (SCREENX) = (SCREENX) + _map_offset_devx; \
129     (SCREENY) = (SCREENY) + _map_offset_devy; \
130 }
131
132 #define pixel2screen(PIXELX, PIXELY, SCREENX, SCREENY) \
133     (pixel2screen_full(PIXELX, PIXELY, SCREENX, SCREENY, _center, \
134                        _map_rotate_matrix))
135
136 #define buf2unit_full(BUFX, BUFY, UNITX, UNITY, CENTER, MATRIX) { \
137     gfloat funitx, funity; \
138     gdk_pixbuf_rotate_vector(&funitx, &funity, MATRIX, \
139             pixel2unit((gint)((BUFX) - _view_halfwidth_pixels)), \
140             pixel2unit((gint)((BUFY) - _view_halfheight_pixels))); \
141     (UNITX) = (CENTER).unitx + (gint)funitx; \
142     (UNITY) = (CENTER).unity + (gint)funity; \
143 }
144
145 #define buf2unit(BUFX, BUFY, UNITX, UNITY) \
146     (buf2unit_full(BUFX, BUFY, UNITX, UNITY, _center, _map_reverse_matrix))
147
148 #define buf2pixel_full(BUFX, BUFY, PIXELX, PIXELY, CENTER, MATRIX) { \
149     gfloat fpixelx, fpixely; \
150     gdk_pixbuf_rotate_vector(&fpixelx, &fpixely, MATRIX, \
151             (gint)(BUFX) - _view_halfwidth_pixels, \
152             (gint)(BUFY) - _view_halfheight_pixels); \
153     (PIXELX) = unit2pixel((CENTER).unitx) + (gint)fpixelx; \
154     (PIXELY) = unit2pixel((CENTER).unity) + (gint)fpixely; \
155 }
156
157 #define buf2pixel(BUFX, BUFY, PIXELX, PIXELY) \
158     (buf2pixel_full(BUFX, BUFY, PIXELX, PIXELY, _center, _map_reverse_matrix))
159
160 #define screen2unit_full(SCREENX, SCREENY, UNITX, UNITY, CENTER, MATRIX) ( \
161     buf2unit_full((SCREENX) - _map_offset_devx, (SCREENY) - _map_offset_devy, \
162         UNITX, UNITY, CENTER, MATRIX))
163
164 #define screen2unit(SCREENX, SCREENY, UNITX, UNITY) \
165     (screen2unit_full(SCREENX, SCREENY, UNITX, UNITY, _center, \
166                       _map_reverse_matrix))
167
168 #define screen2pixel_full(SCREENX, SCREENY, PIXELX, PIXELY, CENTER, MATRIX) ( \
169     buf2pixel_full((SCREENX) - _map_offset_devx, (SCREENY) - _map_offset_devy,\
170         PIXELX, PIXELY, CENTER, MATRIX))
171
172 #define screen2pixel(SCREENX, SCREENY, PIXELX, PIXELY) ( \
173     screen2pixel_full(SCREENX, SCREENY, PIXELX, PIXELY, \
174         _center,_map_reverse_matrix))
175
176 /* Pans are done 64 pixels at a time. */
177 #define PAN_PIXELS (64)
178 #define ROTATE_DEGREES (30)
179
180 #define INITIAL_DOWNLOAD_RETRIES (3)
181
182 #define GCONF_KEY_PREFIX "/apps/maemo/maemo-mapper"
183 #define GCONF_KEY_GPS_RCVR_TYPE GCONF_KEY_PREFIX"/gps_rcvr_type"
184 #define GCONF_KEY_GPS_BT_MAC GCONF_KEY_PREFIX"/receiver_mac"
185 #define GCONF_KEY_GPS_GPSD_HOST GCONF_KEY_PREFIX"/gps_gpsd_host"
186 #define GCONF_KEY_GPS_GPSD_PORT GCONF_KEY_PREFIX"/gps_gpsd_port"
187 #define GCONF_KEY_GPS_FILE_PATH GCONF_KEY_PREFIX"/gps_file_path"
188 #define GCONF_KEY_AUTO_DOWNLOAD GCONF_KEY_PREFIX"/auto_download"
189 #define GCONF_KEY_AUTO_DOWNLOAD_PRECACHE \
190                                       GCONF_KEY_PREFIX"/auto_download_precache"
191 #define GCONF_KEY_CENTER_SENSITIVITY GCONF_KEY_PREFIX"/center_sensitivity"
192 #define GCONF_KEY_ANNOUNCE_NOTICE GCONF_KEY_PREFIX"/announce_notice"
193 #define GCONF_KEY_ROTATE_SENSITIVITY GCONF_KEY_PREFIX"/rotate_sensitivity"
194 #define GCONF_KEY_AC_MIN_SPEED GCONF_KEY_PREFIX"/autocenter_min_speed"
195 #define GCONF_KEY_ROTATE_DIR GCONF_KEY_PREFIX"/rotate_direction"
196 #define GCONF_KEY_DRAW_WIDTH GCONF_KEY_PREFIX"/draw_width"
197 #define GCONF_KEY_ENABLE_VOICE GCONF_KEY_PREFIX"/enable_voice"
198 #define GCONF_KEY_VOICE_SPEED GCONF_KEY_PREFIX"/voice_speed"
199 #define GCONF_KEY_VOICE_PITCH GCONF_KEY_PREFIX"/voice_pitch"
200 #define GCONF_KEY_FULLSCREEN GCONF_KEY_PREFIX"/fullscreen"
201 #define GCONF_KEY_UNITS GCONF_KEY_PREFIX"/units"
202 #define GCONF_KEY_SPEED_LIMIT_ON GCONF_KEY_PREFIX"/speed_limit_on"
203 #define GCONF_KEY_SPEED_LIMIT GCONF_KEY_PREFIX"/speed_limit"
204 #define GCONF_KEY_SPEED_LOCATION GCONF_KEY_PREFIX"/speed_location"
205 #define GCONF_KEY_UNBLANK_SIZE GCONF_KEY_PREFIX"/unblank_option"
206 #define GCONF_KEY_INFO_FONT_SIZE GCONF_KEY_PREFIX"/info_font_size"
207
208 #define GCONF_KEY_POI_DB GCONF_KEY_PREFIX"/poi_db"
209 #define GCONF_KEY_POI_ZOOM GCONF_KEY_PREFIX"/poi_zoom"
210
211 #define GCONF_KEY_AUTOCENTER_MODE GCONF_KEY_PREFIX"/autocenter_mode"
212 #define GCONF_KEY_AUTOCENTER_ROTATE GCONF_KEY_PREFIX"/autocenter_rotate"
213 #define GCONF_KEY_LEAD_AMOUNT GCONF_KEY_PREFIX"/lead_amount"
214 #define GCONF_KEY_LEAD_IS_FIXED GCONF_KEY_PREFIX"/lead_is_fixed"
215 #define GCONF_KEY_LAST_LAT GCONF_KEY_PREFIX"/last_latitude"
216 #define GCONF_KEY_LAST_LON GCONF_KEY_PREFIX"/last_longitude"
217 #define GCONF_KEY_LAST_ALT GCONF_KEY_PREFIX"/last_altitude"
218 #define GCONF_KEY_LAST_SPEED GCONF_KEY_PREFIX"/last_speed"
219 #define GCONF_KEY_LAST_HEADING GCONF_KEY_PREFIX"/last_heading"
220 #define GCONF_KEY_LAST_TIME GCONF_KEY_PREFIX"/last_timestamp"
221 #define GCONF_KEY_CENTER_LAT GCONF_KEY_PREFIX"/center_latitude"
222 #define GCONF_KEY_CENTER_LON GCONF_KEY_PREFIX"/center_longitude"
223 #define GCONF_KEY_CENTER_ANGLE GCONF_KEY_PREFIX"/center_angle"
224 #define GCONF_KEY_ZOOM GCONF_KEY_PREFIX"/zoom"
225 #define GCONF_KEY_ROUTEDIR GCONF_KEY_PREFIX"/route_directory"
226 #define GCONF_KEY_TRACKFILE GCONF_KEY_PREFIX"/track_file"
227 #define GCONF_KEY_SHOWZOOMLEVEL GCONF_KEY_PREFIX"/show_zoomlevel"
228 #define GCONF_KEY_SHOWSCALE GCONF_KEY_PREFIX"/show_scale"
229 #define GCONF_KEY_SHOWCOMPROSE GCONF_KEY_PREFIX"/show_comprose"
230 #define GCONF_KEY_SHOWTRACKS GCONF_KEY_PREFIX"/show_tracks"
231 #define GCONF_KEY_SHOWROUTES GCONF_KEY_PREFIX"/show_routes"
232 #define GCONF_KEY_SHOWVELVEC GCONF_KEY_PREFIX"/show_velocity_vector"
233 #define GCONF_KEY_SHOWPOIS GCONF_KEY_PREFIX"/show_poi"
234 #define GCONF_KEY_ENABLE_GPS GCONF_KEY_PREFIX"/enable_gps"
235 #define GCONF_KEY_ROUTE_LOCATIONS GCONF_KEY_PREFIX"/route_locations"
236 #define GCONF_KEY_REPOSITORIES GCONF_KEY_PREFIX"/repositories"
237 #define GCONF_KEY_CURRREPO GCONF_KEY_PREFIX"/curr_repo"
238 #define GCONF_KEY_GPS_INFO GCONF_KEY_PREFIX"/gps_info"
239 #define GCONF_KEY_ROUTE_DL_URL GCONF_KEY_PREFIX"/route_dl_url"
240 #define GCONF_KEY_ROUTE_DL_RADIUS GCONF_KEY_PREFIX"/route_dl_radius"
241 #define GCONF_KEY_POI_DL_URL GCONF_KEY_PREFIX"/poi_dl_url"
242 #define GCONF_KEY_DEG_FORMAT GCONF_KEY_PREFIX"/deg_format"
243
244 #define CONFIG_DIR_NAME "~/.maemo-mapper/"
245 #define CONFIG_PATH_DB_FILE "paths.db"
246
247 #define REPO_DEFAULT_NAME "OpenStreet"
248 #define REPO_DEFAULT_CACHE_BASE "~/MyDocs/.documents/Maps/"
249 #define REPO_DEFAULT_CACHE_DIR REPO_DEFAULT_CACHE_BASE"OpenStreet.db"
250 #define REPO_DEFAULT_MAP_URI "http://tile.openstreetmap.org/%0d/%d/%d.png"
251 #define REPO_DEFAULT_DL_ZOOM_STEPS (2)
252 #define REPO_DEFAULT_VIEW_ZOOM_STEPS (1)
253 #define REPO_DEFAULT_MIN_ZOOM (4)
254 #define REPO_DEFAULT_MAX_ZOOM (20)
255
256 #define XML_DATE_FORMAT "%FT%T"
257
258 #define HELP_ID_PREFIX "help_maemomapper_"
259 #define HELP_ID_INTRO HELP_ID_PREFIX"intro"
260 #define HELP_ID_GETSTARTED HELP_ID_PREFIX"getstarted"
261 #define HELP_ID_ABOUT HELP_ID_PREFIX"about"
262 #define HELP_ID_SETTINGS HELP_ID_PREFIX"settings"
263 #define HELP_ID_REPOMAN HELP_ID_PREFIX"repoman"
264 #define HELP_ID_MAPMAN HELP_ID_PREFIX"mapman"
265 #define HELP_ID_DOWNROUTE HELP_ID_PREFIX"downroute"
266 #define HELP_ID_DOWNPOI HELP_ID_PREFIX"downpoi"
267 #define HELP_ID_BROWSEPOI HELP_ID_PREFIX"browsepoi"
268 #define HELP_ID_POILIST HELP_ID_PREFIX"poilist"
269 #define HELP_ID_POICAT HELP_ID_PREFIX"poicat"
270
271 #define MERCATOR_SPAN (-6.28318377773622)
272 #define MERCATOR_TOP (3.14159188886811)
273 #define latlon2unit(lat, lon, unitx, unity) { \
274     gdouble tmp; \
275     unitx = (lon + 180.0) * (WORLD_SIZE_UNITS / 360.0) + 0.5; \
276     tmp = sin(deg2rad(lat)); \
277     unity = 0.5 + (WORLD_SIZE_UNITS / MERCATOR_SPAN) \
278         * (log((1.0 + tmp) / (1.0 - tmp)) * 0.5 - MERCATOR_TOP); \
279 }
280
281 #define unit2latlon(unitx, unity, lat, lon) { \
282     (lon) = ((unitx) * (360.0 / WORLD_SIZE_UNITS)) - 180.0; \
283     (lat) = (360.0 * (atan(exp(((unity) * (MERCATOR_SPAN / WORLD_SIZE_UNITS)) \
284                      + MERCATOR_TOP)))) * (1.0 / PI) - 90.0; \
285 }
286
287 #define MACRO_PATH_INIT(path) { \
288     (path).head = (path).tail = g_new(Point, ARRAY_CHUNK_SIZE); \
289     *((path).tail) = _point_null; \
290     (path).cap = (path).head + ARRAY_CHUNK_SIZE; \
291     (path).whead = g_new(WayPoint, ARRAY_CHUNK_SIZE); \
292     (path).wtail = (path).whead - 1; \
293     (path).wcap = (path).whead + ARRAY_CHUNK_SIZE; \
294 }
295
296 #define MACRO_PATH_FREE(path) if((path).head) { \
297     WayPoint *curr; \
298     g_free((path).head); \
299     (path).head = (path).tail = (path).cap = NULL; \
300     for(curr = (path).whead - 1; curr++ != (path).wtail; ) \
301         g_free(curr->desc); \
302     g_free((path).whead); \
303     (path).whead = (path).wtail = (path).wcap = NULL; \
304 }
305
306 #define MACRO_PATH_INCREMENT_TAIL(route) { \
307     if(++(route).tail == (route).cap) \
308         path_resize(&(route), (route).cap - (route).head + ARRAY_CHUNK_SIZE);\
309 }
310
311 #define MACRO_PATH_INCREMENT_WTAIL(route) { \
312     if(++(route).wtail == (route).wcap) \
313         path_wresize(&(route), \
314                 (route).wcap - (route).whead + ARRAY_CHUNK_SIZE); \
315 }
316
317 #define DISTANCE_SQUARED(a, b) \
318    ((guint64)((((gint64)(b).unitx)-(a).unitx)*(((gint64)(b).unitx)-(a).unitx))\
319   + (guint64)((((gint64)(b).unity)-(a).unity)*(((gint64)(b).unity)-(a).unity)))
320
321 #define MACRO_QUEUE_DRAW_AREA() \
322     gtk_widget_queue_draw_area( \
323             _map_widget, \
324             0, 0, \
325             _view_width_pixels, \
326             _view_height_pixels)
327
328 /* Render all on-map metadata an annotations, including POI and paths. */
329 #define MACRO_MAP_RENDER_DATA() { \
330     if(_show_poi) \
331         map_render_poi(); \
332     if(_show_paths > 0) \
333         map_render_paths(); \
334 }
335
336 #define UNBLANK_SCREEN(MOVING, APPROACHING_WAYPOINT) { \
337     /* Check if we need to unblank the screen. */ \
338     switch(_unblank_option) \
339     { \
340         case UNBLANK_NEVER: \
341             break; \
342         case UNBLANK_WAYPOINT: \
343             if(APPROACHING_WAYPOINT) \
344             { \
345                 printf("Unblanking screen...\n"); \
346                 osso_display_state_on(_osso); \
347                 osso_display_blanking_pause(_osso); \
348             } \
349             break; \
350         default: \
351         case UNBLANK_FULLSCREEN: \
352             if(!_fullscreen) \
353                 break; \
354         case UNBLANK_WHEN_MOVING: \
355             if(!(MOVING)) \
356                 break; \
357         case UNBLANK_WITH_GPS: \
358             printf("Unblanking screen...\n"); \
359             osso_display_state_on(_osso); \
360             osso_display_blanking_pause(_osso); \
361     } \
362 }
363
364 #define LL_FMT_LEN 20
365 #define lat_format(A, B) deg_format((A), (B), 'S', 'N')
366 #define lon_format(A, B) deg_format((A), (B), 'W', 'E')
367
368 #define TRACKS_MASK 0x00000001
369 #define ROUTES_MASK 0x00000002
370
371 #define MACRO_BANNER_SHOW_INFO(A, S) { \
372     gchar *my_macro_buffer = g_markup_printf_escaped( \
373             "<span size='%s'>%s</span>", \
374             INFO_FONT_ENUM_TEXT[_info_font_size], (S)); \
375     hildon_banner_show_information_with_markup(A, NULL, my_macro_buffer); \
376     g_free(my_macro_buffer); \
377 }
378
379 #endif /* ifndef MAEMO_MAPPER_DEFINES */