]> git.itanic.dy.fi Git - maemo-mapper/blob - src/types.h
Added support for maps that behave like Yahoo Maps (signed Y tile
[maemo-mapper] / src / types.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_TYPES_H
25 #define MAEMO_MAPPER_TYPES_H
26
27 #include <time.h>
28 #include <gdbm.h>
29 #include <gtk/gtk.h>
30 #include <libgnomevfs/gnome-vfs.h>
31
32 #define _(String) gettext(String)
33
34 /* #define MAPDB_SQLITE */
35
36 #ifdef MAPDB_SQLITE
37 #include "sqlite3.h"
38 #endif
39
40 /** This enumerated type defines the possible connection states. */
41 typedef enum
42 {
43     /** The receiver is "off", meaning that either the bluetooth radio is
44      * off or the user has requested not to connect to the GPS receiver.
45      * No gtk_banner is visible. */
46     RCVR_OFF,
47
48     /** The connection with the receiver is down.  A gtk_banner is visible with
49      * the text, "Connecting to GPS receiver". */
50     RCVR_DOWN,
51
52     /** The connection with the receiver is up, but a GPS fix is not available.
53      * A gtk_banner is visible with the text, "(Re-)Establishing GPS fix". */
54     RCVR_UP,
55
56     /** The connection with the receiver is up and a GPS fix IS available.
57      * No gtk_banner is visible. */
58     RCVR_FIXED
59 } ConnState;
60
61 /** This enumerated type defines the supported types of repositories. */
62 typedef enum
63 {
64     REPOTYPE_NONE, /* No URL set. */
65     REPOTYPE_XYZ, /* x=%d, y=%d, and zoom=%d */
66     REPOTYPE_XYZ_SIGNED, /* x=%d, y=%d, and zoom=%d-2 */
67     REPOTYPE_XYZ_INV, /* zoom=%0d, x=%d, y=%d */
68     REPOTYPE_QUAD_QRST, /* t=%s   (%s = {qrst}*) */
69     REPOTYPE_QUAD_ZERO, /* t=%0s  (%0s = {0123}*) */
70     REPOTYPE_WMS        /* "service=wms" */
71 } RepoType;
72
73 /** Possible center modes.  The "WAS" modes imply no current center mode;
74  * they only hint at what the last center mode was, so that it can be
75  * recalled. */
76 typedef enum
77 {
78     CENTER_WAS_LATLON = -2,
79     CENTER_WAS_LEAD = -1,
80     CENTER_LEAD = 1,
81     CENTER_LATLON = 2
82 } CenterMode;
83
84 /** This enum defines the states of the SAX parsing state machine. */
85 typedef enum
86 {
87     START,
88     INSIDE_GPX,
89     INSIDE_WPT,
90     INSIDE_WPT_NAME,
91     INSIDE_WPT_DESC,
92     INSIDE_PATH,
93     INSIDE_PATH_SEGMENT,
94     INSIDE_PATH_POINT,
95     INSIDE_PATH_POINT_ELE,
96     INSIDE_PATH_POINT_TIME,
97     INSIDE_PATH_POINT_DESC,
98     FINISH,
99     UNKNOWN,
100     ERROR,
101 } SaxState;
102
103 /** POI dialog action **/
104 typedef enum
105 {
106     ACTION_ADD_POI,
107     ACTION_EDIT_POI,
108 } POIAction;
109
110 /** Category list **/
111 typedef enum
112 {
113     CAT_ID,
114     CAT_ENABLED,
115     CAT_LABEL,
116     CAT_DESC,
117     CAT_POI_CNT,
118     CAT_NUM_COLUMNS
119 } CategoryList;
120
121 /** POI list **/
122 typedef enum
123 {
124     POI_SELECTED,
125     POI_POIID,
126     POI_CATID,
127     POI_LAT,
128     POI_LON,
129     POI_LATLON,
130     POI_BEARING,
131     POI_DISTANCE,
132     POI_LABEL,
133     POI_DESC,
134     POI_CLABEL,
135     POI_NUM_COLUMNS
136 } POIList;
137
138 /** This enum defines the possible units we can use. */
139 typedef enum
140 {
141     UNITS_KM,
142     UNITS_MI,
143     UNITS_NM,
144     UNITS_ENUM_COUNT
145 } UnitType;
146
147 typedef enum
148 {
149     UNBLANK_WITH_GPS,
150     UNBLANK_WHEN_MOVING,
151     UNBLANK_FULLSCREEN,
152     UNBLANK_WAYPOINT,
153     UNBLANK_NEVER,
154     UNBLANK_ENUM_COUNT
155 } UnblankOption;
156
157 /** This enum defines the possible font sizes. */
158 typedef enum
159 {
160     INFO_FONT_XXSMALL,
161     INFO_FONT_XSMALL,
162     INFO_FONT_SMALL,
163     INFO_FONT_MEDIUM,
164     INFO_FONT_LARGE,
165     INFO_FONT_XLARGE,
166     INFO_FONT_XXLARGE,
167     INFO_FONT_ENUM_COUNT
168 } InfoFontSize;
169
170 /** This enum defines the possible font sizes. */
171 typedef enum
172 {
173     ROTATE_DIR_UP,
174     ROTATE_DIR_RIGHT,
175     ROTATE_DIR_DOWN,
176     ROTATE_DIR_LEFT,
177     ROTATE_DIR_ENUM_COUNT
178 } RotateDir;
179
180 /** This enum defines all of the key-customizable actions. */
181 typedef enum
182 {
183     CUSTOM_ACTION_PAN_NORTH,
184     CUSTOM_ACTION_PAN_WEST,
185     CUSTOM_ACTION_PAN_SOUTH,
186     CUSTOM_ACTION_PAN_EAST,
187     CUSTOM_ACTION_PAN_UP,
188     CUSTOM_ACTION_PAN_DOWN,
189     CUSTOM_ACTION_PAN_LEFT,
190     CUSTOM_ACTION_PAN_RIGHT,
191     CUSTOM_ACTION_RESET_VIEW_ANGLE,
192     CUSTOM_ACTION_ROTATE_CLOCKWISE,
193     CUSTOM_ACTION_ROTATE_COUNTERCLOCKWISE,
194     CUSTOM_ACTION_TOGGLE_AUTOCENTER,
195     CUSTOM_ACTION_TOGGLE_AUTOROTATE,
196     CUSTOM_ACTION_ZOOM_IN,
197     CUSTOM_ACTION_ZOOM_OUT,
198     CUSTOM_ACTION_TOGGLE_FULLSCREEN,
199     CUSTOM_ACTION_TOGGLE_TRACKS,
200     CUSTOM_ACTION_TOGGLE_SCALE,
201     CUSTOM_ACTION_TOGGLE_POI,
202     CUSTOM_ACTION_CHANGE_REPO,
203     CUSTOM_ACTION_ROUTE_DISTNEXT,
204     CUSTOM_ACTION_ROUTE_DISTLAST,
205     CUSTOM_ACTION_TRACK_BREAK,
206     CUSTOM_ACTION_TRACK_CLEAR,
207     CUSTOM_ACTION_TRACK_DISTLAST,
208     CUSTOM_ACTION_TRACK_DISTFIRST,
209     CUSTOM_ACTION_TOGGLE_GPS,
210     CUSTOM_ACTION_TOGGLE_GPSINFO,
211     CUSTOM_ACTION_TOGGLE_SPEEDLIMIT,
212     CUSTOM_ACTION_RESET_BLUETOOTH,
213     CUSTOM_ACTION_ENUM_COUNT
214 } CustomAction;
215
216 /** This enum defines all of the customizable keys. */
217 typedef enum
218 {
219     CUSTOM_KEY_UP,
220     CUSTOM_KEY_LEFT,
221     CUSTOM_KEY_DOWN,
222     CUSTOM_KEY_RIGHT,
223     CUSTOM_KEY_SELECT,
224     CUSTOM_KEY_INCREASE,
225     CUSTOM_KEY_DECREASE,
226     CUSTOM_KEY_FULLSCREEN,
227     CUSTOM_KEY_ESC,
228     CUSTOM_KEY_ENUM_COUNT
229 } CustomKey;
230
231 /** This enum defines all of the colorable objects. */
232 typedef enum
233 {
234     COLORABLE_MARK,
235     COLORABLE_MARK_VELOCITY,
236     COLORABLE_MARK_OLD,
237     COLORABLE_TRACK,
238     COLORABLE_TRACK_MARK,
239     COLORABLE_TRACK_BREAK,
240     COLORABLE_ROUTE,
241     COLORABLE_ROUTE_WAY,
242     COLORABLE_ROUTE_BREAK,
243     COLORABLE_POI,
244     COLORABLE_ENUM_COUNT
245 } Colorable;
246
247 typedef enum
248 {
249     DDPDDDDD,
250     DD_MMPMMM,
251     DD_MM_SSPS,
252     DDPDDDDD_NSEW,
253     DD_MMPMMM_NSEW,
254     DD_MM_SSPS_NSEW,
255     NSEW_DDPDDDDD,
256     NSEW_DD_MMPMMM,
257     NSEW_DD_MM_SSPS,
258     DEG_FORMAT_ENUM_COUNT
259 } DegFormat;
260
261 typedef enum
262 {
263     SPEED_LOCATION_BOTTOM_LEFT,
264     SPEED_LOCATION_BOTTOM_RIGHT,
265     SPEED_LOCATION_TOP_RIGHT,
266     SPEED_LOCATION_TOP_LEFT,
267     SPEED_LOCATION_ENUM_COUNT
268 } SpeedLocation;
269
270 typedef enum
271 {
272     MAP_UPDATE_ADD,
273     MAP_UPDATE_OVERWRITE,
274     MAP_UPDATE_AUTO,
275     MAP_UPDATE_DELETE,
276     MAP_UPDATE_ENUM_COUNT
277 } MapUpdateType;
278
279 typedef enum
280 {
281     GPS_RCVR_BT,
282     GPS_RCVR_GPSD,
283     GPS_RCVR_FILE,
284     GPS_RCVR_ENUM_COUNT
285 } GpsRcvrType;
286
287 /** A general definition of a point in the Maemo Mapper unit system. */
288 typedef struct _Point Point;
289 struct _Point {
290     gint unitx;
291     gint unity;
292     time_t time;
293     gint altitude;
294 };
295
296 /** A WayPoint, which is a Point with a description. */
297 typedef struct _WayPoint WayPoint;
298 struct _WayPoint {
299     Point *point;
300     gchar *desc;
301 };
302
303 /** A Path is a set of PathPoints and WayPoints. */
304 typedef struct _Path Path;
305 struct _Path {
306     Point *head; /* points to first element in array; NULL if empty. */
307     Point *tail; /* points to last element in array. */
308     Point *cap; /* points after last slot in array. */
309     WayPoint *whead; /* points to first element in array; NULL if empty. */
310     WayPoint *wtail; /* points to last element in array. */
311     WayPoint *wcap; /* points after last slot in array. */
312 };
313
314 /** Data used during the SAX parsing operation. */
315 typedef struct _SaxData SaxData;
316 struct _SaxData {
317     SaxState state;
318     SaxState prev_state;
319     gint unknown_depth;
320     gboolean at_least_one_trkpt;
321     GString *chars;
322 };
323
324 typedef struct _PathSaxData PathSaxData;
325 struct _PathSaxData {
326     SaxData sax_data;
327     Path path;
328 };
329
330 /** Data to describe a POI. */
331 typedef struct _PoiInfo PoiInfo;
332 struct _PoiInfo {
333     gint poi_id;
334     gint cat_id;
335     gdouble lat;
336     gdouble lon;
337     gchar *label;
338     gchar *desc;
339     gchar *clabel;
340 };
341
342 typedef struct _PoiSaxData PoiSaxData;
343 struct _PoiSaxData {
344     SaxData sax_data;
345     GList *poi_list;
346     PoiInfo *curr_poi;
347 };
348
349 /** Data regarding a map repository. */
350 typedef struct _RepoData RepoData;
351 struct _RepoData {
352     gchar *name;
353     gchar *url;
354     gchar *db_filename;
355     gchar *db_dirname;
356     gint dl_zoom_steps;
357     gint view_zoom_steps;
358     gboolean double_size;
359     gboolean nextable;
360     gint min_zoom;
361     gint max_zoom;
362     RepoType type;
363 #ifdef MAPDB_SQLITE
364     sqlite3 *db;
365     sqlite3_stmt *stmt_map_select;
366     sqlite3_stmt *stmt_map_exists;
367     sqlite3_stmt *stmt_map_update;
368     sqlite3_stmt *stmt_map_insert;
369     sqlite3_stmt *stmt_map_delete;
370     sqlite3_stmt *stmt_dup_select;
371     sqlite3_stmt *stmt_dup_exists;
372     sqlite3_stmt *stmt_dup_insert;
373     sqlite3_stmt *stmt_dup_increm;
374     sqlite3_stmt *stmt_dup_decrem;
375     sqlite3_stmt *stmt_dup_delete;
376     sqlite3_stmt *stmt_trans_begin;
377     sqlite3_stmt *stmt_trans_commit;
378     sqlite3_stmt *stmt_trans_rollback;
379 #else
380     GDBM_FILE db;
381 #endif
382     GtkWidget *menu_item;
383 };
384
385 /** GPS Data and Satellite **/
386 typedef struct _GpsData GpsData;
387 struct _GpsData {
388     gint fix;
389     gint fixquality;
390     gdouble lat;
391     gdouble lon;
392     gfloat speed;    /* in knots */
393     gfloat maxspeed;    /* in knots */
394     gfloat heading;
395     gfloat hdop;
396     gfloat pdop;
397     gfloat vdop;
398     gint satinview;
399     gint satinuse;
400     gint satforfix[12];
401 };
402
403 typedef struct _GpsSatelliteData GpsSatelliteData;
404 struct _GpsSatelliteData {
405     gint prn;
406     gint elevation;
407     gint azimuth;
408     gint snr;
409 };
410
411 /** Data used for rendering the entire screen. */
412 typedef struct _MapRenderTask MapRenderTask;
413 struct _MapRenderTask
414 {
415     RepoData *repo;
416     Point new_center;
417     gint old_offsetx;
418     gint old_offsety;
419     gint screen_width_pixels;
420     gint screen_height_pixels;
421     gint zoom;
422     gint rotate_angle;
423     gboolean smooth_pan;
424     GdkPixbuf *pixbuf;
425 };
426
427 /** Data used for rendering the entire screen. */
428 typedef struct _MapOffsetArgs MapOffsetArgs;
429 struct _MapOffsetArgs
430 {
431     gfloat old_center_offset_devx;
432     gfloat old_center_offset_devy;
433     gfloat new_center_offset_devx;
434     gfloat new_center_offset_devy;
435     gint rotate_angle;
436     gfloat percent_complete;
437 };
438
439 typedef struct _ThreadLatch ThreadLatch;
440 struct _ThreadLatch
441 {
442     gboolean is_open;
443     gboolean is_done_adding_tasks;
444     gint num_tasks;
445     gint num_done;
446     GMutex *mutex;
447     GCond *cond;
448 };
449
450 /** Data used during the asynchronous progress update phase of automatic map
451  * downloading. */
452 typedef struct _MapUpdateTask MapUpdateTask;
453 struct _MapUpdateTask
454 {
455     gint priority;
456     gint tilex;
457     gint tiley;
458     ThreadLatch *refresh_latch;
459     GdkPixbuf *pixbuf;
460     RepoData *repo;
461     gint8 update_type;
462     gint8 zoom;
463     gint8 vfs_result;
464     gint8 batch_id;
465 };
466
467 /** Data used during the asynchronous automatic route downloading operation. */
468 typedef struct _AutoRouteDownloadData AutoRouteDownloadData;
469 struct _AutoRouteDownloadData {
470     gboolean enabled;
471     gboolean in_progress;
472     gchar *source_url;
473     gchar *dest;
474     gboolean avoid_highways;
475 };
476
477 /** Data to describe the GPS connection. */
478 typedef struct _GpsRcvrInfo GpsRcvrInfo;
479 struct _GpsRcvrInfo {
480     GpsRcvrType type;
481     gchar *bt_mac;
482     gchar *file_path;
483     gchar *gpsd_host;
484     gint gpsd_port;
485 };
486
487 typedef struct _BrowseInfo BrowseInfo;
488 struct _BrowseInfo {
489     GtkWidget *dialog;
490     GtkWidget *txt;
491 };
492
493 #endif /* ifndef MAEMO_MAPPER_TYPES_H */