]> git.itanic.dy.fi Git - maemo-mapper/blob - src/types.h
05c0b99e166a328dae88afaa7f644b9ca7d34ff8
[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  * Parts of this code have been ported from Xastir by Rob Williams (10 Aug 2008):
25  * 
26  *  * XASTIR, Amateur Station Tracking and Information Reporting
27  * Copyright (C) 1999,2000  Frank Giannandrea
28  * Copyright (C) 2000-2007  The Xastir Group
29  * 
30  */
31
32 #ifndef MAEMO_MAPPER_TYPES_H
33 #define MAEMO_MAPPER_TYPES_H
34
35
36 #ifdef HAVE_CONFIG_H
37 #    include "config.h"
38 #endif
39
40 #include <time.h>
41 #include <gdbm.h>
42 #include <gtk/gtk.h>
43 #include <libgnomevfs/gnome-vfs.h>
44
45 #define _(String) gettext(String)
46
47 /* #define MAPDB_SQLITE */
48
49 #ifdef MAPDB_SQLITE
50 #include "sqlite3.h"
51 #endif
52
53 // Latitude and longitude string formats.
54 #define CONVERT_HP_NORMAL       0
55 #define CONVERT_HP_NOSP         1
56 #define CONVERT_LP_NORMAL       2
57 #define CONVERT_LP_NOSP         3
58 #define CONVERT_DEC_DEG         4
59 #define CONVERT_UP_TRK          5
60 #define CONVERT_DMS_NORMAL      6
61 #define CONVERT_VHP_NOSP        7
62 #define CONVERT_DMS_NORMAL_FORMATED      8
63 #define CONVERT_HP_NORMAL_FORMATED       9
64 #define CONVERT_DEC_DEG_N       10
65
66 #define MAX_DEVICE_BUFFER       4096
67
68 /** This enumerated type defines the possible connection states. */
69 typedef enum
70 {
71     /** The receiver is "off", meaning that either the bluetooth radio is
72      * off or the user has requested not to connect to the GPS receiver.
73      * No gtk_banner is visible. */
74     RCVR_OFF,
75
76     /** The connection with the receiver is down.  A gtk_banner is visible with
77      * the text, "Connecting to GPS receiver". */
78     RCVR_DOWN,
79
80     /** The connection with the receiver is up, but a GPS fix is not available.
81      * A gtk_banner is visible with the text, "(Re-)Establishing GPS fix". */
82     RCVR_UP,
83
84     /** The connection with the receiver is up and a GPS fix IS available.
85      * No gtk_banner is visible. */
86     RCVR_FIXED
87 } ConnState;
88
89 /** This enumerated type defines the supported types of repositories. */
90 typedef enum
91 {
92     REPOTYPE_NONE, /* No URL set. */
93     REPOTYPE_XYZ, /* x=%d, y=%d, and zoom=%d */
94     REPOTYPE_XYZ_SIGNED, /* x=%d, y=%d, and zoom=%d-2 */
95     REPOTYPE_XYZ_INV, /* zoom=%0d, x=%d, y=%d */
96     REPOTYPE_QUAD_QRST, /* t=%s   (%s = {qrst}*) */
97     REPOTYPE_QUAD_ZERO, /* t=%0s  (%0s = {0123}*) */
98     REPOTYPE_WMS        /* "service=wms" */
99 } RepoType;
100
101 /** Possible center modes.  The "WAS" modes imply no current center mode;
102  * they only hint at what the last center mode was, so that it can be
103  * recalled. */
104 typedef enum
105 {
106     CENTER_WAS_LATLON = -2,
107     CENTER_WAS_LEAD = -1,
108     CENTER_LEAD = 1,
109     CENTER_LATLON = 2
110 } CenterMode;
111
112 /** POI dialog action **/
113 typedef enum
114 {
115     ACTION_ADD_POI,
116     ACTION_EDIT_POI,
117 } POIAction;
118
119 /** Category list **/
120 typedef enum
121 {
122     CAT_ID,
123     CAT_ENABLED,
124     CAT_LABEL,
125     CAT_DESC,
126     CAT_POI_CNT,
127     CAT_NUM_COLUMNS
128 } CategoryList;
129
130 /** POI list **/
131 typedef enum
132 {
133     POI_SELECTED,
134     POI_POIID,
135     POI_CATID,
136     POI_LAT,
137     POI_LON,
138     POI_LATLON,
139     POI_BEARING,
140     POI_DISTANCE,
141     POI_LABEL,
142     POI_DESC,
143     POI_CLABEL,
144     POI_NUM_COLUMNS
145 } POIList;
146
147 /** This enum defines the possible units we can use. */
148 typedef enum
149 {
150     UNITS_KM,
151     UNITS_MI,
152     UNITS_NM,
153     UNITS_ENUM_COUNT
154 } UnitType;
155
156 typedef enum
157 {
158     UNBLANK_WITH_GPS,
159     UNBLANK_WHEN_MOVING,
160     UNBLANK_FULLSCREEN,
161     UNBLANK_WAYPOINT,
162     UNBLANK_NEVER,
163     UNBLANK_ENUM_COUNT
164 } UnblankOption;
165
166 /** This enum defines the possible font sizes. */
167 typedef enum
168 {
169     INFO_FONT_XXSMALL,
170     INFO_FONT_XSMALL,
171     INFO_FONT_SMALL,
172     INFO_FONT_MEDIUM,
173     INFO_FONT_LARGE,
174     INFO_FONT_XLARGE,
175     INFO_FONT_XXLARGE,
176     INFO_FONT_ENUM_COUNT
177 } InfoFontSize;
178
179 /** This enum defines the possible font sizes. */
180 typedef enum
181 {
182     ROTATE_DIR_UP,
183     ROTATE_DIR_RIGHT,
184     ROTATE_DIR_DOWN,
185     ROTATE_DIR_LEFT,
186     ROTATE_DIR_ENUM_COUNT
187 } RotateDir;
188
189 /** This enum defines all of the key-customizable actions. */
190 typedef enum
191 {
192     CUSTOM_ACTION_PAN_NORTH,
193     CUSTOM_ACTION_PAN_WEST,
194     CUSTOM_ACTION_PAN_SOUTH,
195     CUSTOM_ACTION_PAN_EAST,
196     CUSTOM_ACTION_PAN_UP,
197     CUSTOM_ACTION_PAN_DOWN,
198     CUSTOM_ACTION_PAN_LEFT,
199     CUSTOM_ACTION_PAN_RIGHT,
200     CUSTOM_ACTION_RESET_VIEW_ANGLE,
201     CUSTOM_ACTION_ROTATE_CLOCKWISE,
202     CUSTOM_ACTION_ROTATE_COUNTERCLOCKWISE,
203     CUSTOM_ACTION_TOGGLE_AUTOCENTER,
204     CUSTOM_ACTION_TOGGLE_AUTOROTATE,
205     CUSTOM_ACTION_ZOOM_IN,
206     CUSTOM_ACTION_ZOOM_OUT,
207     CUSTOM_ACTION_TOGGLE_FULLSCREEN,
208     CUSTOM_ACTION_TOGGLE_TRACKING,
209     CUSTOM_ACTION_TOGGLE_TRACKS,
210     CUSTOM_ACTION_TOGGLE_SCALE,
211     CUSTOM_ACTION_TOGGLE_POI,
212     CUSTOM_ACTION_CHANGE_REPO,
213     CUSTOM_ACTION_ROUTE_DISTNEXT,
214     CUSTOM_ACTION_ROUTE_DISTLAST,
215     CUSTOM_ACTION_TRACK_BREAK,
216     CUSTOM_ACTION_TRACK_CLEAR,
217     CUSTOM_ACTION_TRACK_DISTLAST,
218     CUSTOM_ACTION_TRACK_DISTFIRST,
219     CUSTOM_ACTION_TOGGLE_GPS,
220     CUSTOM_ACTION_TOGGLE_GPSINFO,
221     CUSTOM_ACTION_TOGGLE_SPEEDLIMIT,
222     CUSTOM_ACTION_RESET_BLUETOOTH,
223     CUSTOM_ACTION_TOGGLE_LAYERS,
224     CUSTOM_ACTION_ENUM_COUNT
225 } CustomAction;
226
227 /** This enum defines all of the customizable keys. */
228 typedef enum
229 {
230     CUSTOM_KEY_UP,
231     CUSTOM_KEY_LEFT,
232     CUSTOM_KEY_DOWN,
233     CUSTOM_KEY_RIGHT,
234     CUSTOM_KEY_SELECT,
235     CUSTOM_KEY_INCREASE,
236     CUSTOM_KEY_DECREASE,
237     CUSTOM_KEY_FULLSCREEN,
238     CUSTOM_KEY_ESC,
239     CUSTOM_KEY_ENUM_COUNT
240 } CustomKey;
241
242 /** This enum defines all of the colorable objects. */
243 typedef enum
244 {
245     COLORABLE_MARK,
246     COLORABLE_MARK_VELOCITY,
247     COLORABLE_MARK_OLD,
248     COLORABLE_TRACK,
249     COLORABLE_TRACK_MARK,
250     COLORABLE_TRACK_BREAK,
251     COLORABLE_ROUTE,
252     COLORABLE_ROUTE_WAY,
253     COLORABLE_ROUTE_BREAK,
254     COLORABLE_POI,
255 #ifdef INCLUDE_APRS
256     COLORABLE_APRS_STATION,
257 #endif // INCLUDE_APRS
258     COLORABLE_ENUM_COUNT
259 } Colorable;
260
261 typedef enum
262 {
263     DDPDDDDD,
264     DD_MMPMMM,
265     DD_MM_SSPS,
266     DDPDDDDD_NSEW,
267     DD_MMPMMM_NSEW,
268     DD_MM_SSPS_NSEW,
269     NSEW_DDPDDDDD,
270     NSEW_DD_MMPMMM,
271     NSEW_DD_MM_SSPS,
272     UK_OSGB,
273     UK_NGR, // 8 char grid ref
274     UK_NGR6,// 6 char grid ref
275     IARU_LOC,
276     DEG_FORMAT_ENUM_COUNT
277 } DegFormat;
278
279 typedef struct _CoordFormatSetup CoordFormatSetup;
280 struct _CoordFormatSetup 
281 {
282         gchar    *name;
283         gchar    *short_field_1;
284         gchar    *long_field_1;
285         gchar    *short_field_2;
286         gchar    *long_field_2;
287         gboolean field_2_in_use;
288 } _CoordFormatSetup;
289
290 typedef enum
291 {
292     SPEED_LOCATION_BOTTOM_LEFT,
293     SPEED_LOCATION_BOTTOM_RIGHT,
294     SPEED_LOCATION_TOP_RIGHT,
295     SPEED_LOCATION_TOP_LEFT,
296     SPEED_LOCATION_ENUM_COUNT
297 } SpeedLocation;
298
299 typedef enum
300 {
301     MAP_UPDATE_ADD,
302     MAP_UPDATE_OVERWRITE,
303     MAP_UPDATE_AUTO,
304     MAP_UPDATE_DELETE,
305     MAP_UPDATE_ENUM_COUNT
306 } MapUpdateType;
307
308 typedef enum
309 {
310     GPS_RCVR_BT,
311     GPS_RCVR_GPSD,
312     GPS_RCVR_FILE,
313     GPS_RCVR_ENUM_COUNT
314 } GpsRcvrType;
315
316 /** A general definition of a point in the Maemo Mapper unit system. */
317 typedef struct _Point Point;
318 struct _Point {
319     gint unitx;
320     gint unity;
321     time_t time;
322     gint altitude;
323 };
324
325 /** A WayPoint, which is a Point with a description. */
326 typedef struct _WayPoint WayPoint;
327 struct _WayPoint {
328     Point *point;
329     gchar *desc;
330 };
331
332 /** A Path is a set of PathPoints and WayPoints. */
333 typedef struct _Path Path;
334 struct _Path {
335     Point *head; /* points to first element in array; NULL if empty. */
336     Point *tail; /* points to last element in array. */
337     Point *cap; /* points after last slot in array. */
338     WayPoint *whead; /* points to first element in array; NULL if empty. */
339     WayPoint *wtail; /* points to last element in array. */
340     WayPoint *wcap; /* points after last slot in array. */
341 };
342
343 /** Data to describe a POI. */
344 typedef struct _PoiInfo PoiInfo;
345 struct _PoiInfo {
346     gint poi_id;
347     gint cat_id;
348     gdouble lat;
349     gdouble lon;
350     gchar *label;
351     gchar *desc;
352     gchar *clabel;
353 };
354
355 /** Data regarding a map repository. */
356 typedef struct _RepoData RepoData;
357 struct _RepoData {
358     gchar *name;
359     gchar *url;
360     gchar *db_filename;
361     gchar *db_dirname;
362     gint dl_zoom_steps;
363     gint view_zoom_steps;
364     gboolean double_size;
365     gboolean nextable;
366     gint min_zoom;
367     gint max_zoom;
368     RepoType type;
369     RepoData *layers;
370     gint8 layer_level;
371     gboolean layer_enabled;
372     gboolean layer_was_enabled; /* needed for ability to temporarily toggle layers on and off */
373     gint layer_refresh_interval;
374     gint layer_refresh_countdown;
375 #ifdef MAPDB_SQLITE
376     sqlite3 *db;
377     sqlite3_stmt *stmt_map_select;
378     sqlite3_stmt *stmt_map_exists;
379     sqlite3_stmt *stmt_map_update;
380     sqlite3_stmt *stmt_map_insert;
381     sqlite3_stmt *stmt_map_delete;
382     sqlite3_stmt *stmt_dup_select;
383     sqlite3_stmt *stmt_dup_exists;
384     sqlite3_stmt *stmt_dup_insert;
385     sqlite3_stmt *stmt_dup_increm;
386     sqlite3_stmt *stmt_dup_decrem;
387     sqlite3_stmt *stmt_dup_delete;
388     sqlite3_stmt *stmt_trans_begin;
389     sqlite3_stmt *stmt_trans_commit;
390     sqlite3_stmt *stmt_trans_rollback;
391 #else
392     GDBM_FILE db;
393 #endif
394     GtkWidget *menu_item;
395 };
396
397 /** GPS Data and Satellite **/
398 typedef struct _GpsData GpsData;
399 struct _GpsData {
400     gint fix;
401     gint fixquality;
402     gdouble lat;
403     gdouble lon;
404     gfloat speed;    /* in knots */
405     gfloat maxspeed;    /* in knots */
406     gfloat heading;
407     gfloat hdop;
408     gfloat pdop;
409     gfloat vdop;
410     gint satinview;
411     gint satinuse;
412     gint satforfix[12];
413 };
414
415 typedef struct _GpsSatelliteData GpsSatelliteData;
416 struct _GpsSatelliteData {
417     gint prn;
418     gint elevation;
419     gint azimuth;
420     gint snr;
421 };
422
423 /** Data used for rendering the entire screen. */
424 typedef struct _MapRenderTask MapRenderTask;
425 struct _MapRenderTask
426 {
427     RepoData *repo;
428     Point new_center;
429     gint old_offsetx;
430     gint old_offsety;
431     gint screen_width_pixels;
432     gint screen_height_pixels;
433     gint zoom;
434     gint rotate_angle;
435     gboolean smooth_pan;
436     GdkPixbuf *pixbuf;
437 };
438
439 /** Data used for rendering the entire screen. */
440 typedef struct _MapOffsetArgs MapOffsetArgs;
441 struct _MapOffsetArgs
442 {
443     gfloat old_center_offset_devx;
444     gfloat old_center_offset_devy;
445     gfloat new_center_offset_devx;
446     gfloat new_center_offset_devy;
447     gint rotate_angle;
448     gfloat percent_complete;
449 };
450
451 typedef struct _ThreadLatch ThreadLatch;
452 struct _ThreadLatch
453 {
454     gboolean is_open;
455     gboolean is_done_adding_tasks;
456     gint num_tasks;
457     gint num_done;
458     GMutex *mutex;
459     GCond *cond;
460 };
461
462 /** Data used during the asynchronous progress update phase of automatic map
463  * downloading. */
464 typedef struct _MapUpdateTask MapUpdateTask;
465 struct _MapUpdateTask
466 {
467     gint priority;
468     gint tilex;
469     gint tiley;
470     ThreadLatch *refresh_latch;
471     GdkPixbuf *pixbuf;
472     RepoData *repo;
473     gint8 update_type;
474     gint8 zoom;
475     gint8 vfs_result;
476     gint8 batch_id;
477     gint8 layer_level;
478 };
479
480 /** Data used during the asynchronous automatic route downloading operation. */
481 typedef struct _AutoRouteDownloadData AutoRouteDownloadData;
482 struct _AutoRouteDownloadData {
483     gboolean enabled;
484     gboolean in_progress;
485     gchar *source_url;
486     gchar *dest;
487     gboolean avoid_highways;
488 };
489
490 /** Data to describe the GPS connection. */
491 typedef struct _GpsRcvrInfo GpsRcvrInfo;
492 struct _GpsRcvrInfo {
493     GpsRcvrType type;
494     gchar *bt_mac;
495     gchar *file_path;
496     gchar *gpsd_host;
497     gint gpsd_port;
498 };
499
500 typedef struct _BrowseInfo BrowseInfo;
501 struct _BrowseInfo {
502     GtkWidget *dialog;
503     GtkWidget *txt;
504 };
505
506
507 #ifdef INCLUDE_APRS
508
509 // --------------------------------------------------------------------------------------
510 // Start of APRS Types - Code taken from Xastir code 25 March 2008 by Rob Williams
511 // Modification made to fit in with Maemo mapper
512 // --------------------------------------------------------------------------------------
513
514 typedef struct _TWriteBuffer TWriteBuffer;
515 struct _TWriteBuffer
516 {
517     int    write_in_pos;                          /* current write buffer input pos          */
518     int    write_out_pos;                         /* current write buffer output pos         */
519     GMutex* write_lock;                      /* Lock for writing the port data          */
520     char   device_write_buffer[MAX_DEVICE_BUFFER];/* write buffer for this port              */
521     int    errors;
522 };
523
524
525 typedef enum
526 {
527         TNC_CONNECTION_BT,
528         TNC_CONNECTION_FILE
529 } TTncConnection;
530
531 typedef enum
532 {
533         APRS_PORT_INET,
534         APRS_PORT_TTY,
535         APRS_PORT_COUNT
536 } TAprsPort;
537
538 // We should probably be using APRS_DF in extract_bearing_NRQ()
539 // and extract_omnidf() functions.  We aren't currently.
540 /* Define APRS Types */
541 enum APRS_Types {
542     APRS_NULL,
543     APRS_MSGCAP,
544     APRS_FIXED,
545     APRS_DOWN,      // Not used anymore
546     APRS_MOBILE,
547     APRS_DF,
548     APRS_OBJECT,
549     APRS_ITEM,
550     APRS_STATUS,
551     APRS_WX1,
552     APRS_WX2,
553     APRS_WX3,
554     APRS_WX4,
555     APRS_WX5,
556     APRS_WX6,
557     QM_WX,
558     PEET_COMPLETE,
559     RSWX200,
560     GPS_RMC,
561     GPS_GGA,
562     GPS_GLL,
563     STATION_CALL_DATA,
564     OTHER_DATA,
565     APRS_MICE,
566     APRS_GRID,
567     DALLAS_ONE_WIRE,
568     DAVISMETEO
569 };
570
571
572 /* Define Record Types */
573 #define NORMAL_APRS     'N'
574 #define MOBILE_APRS     'M'
575 #define DF_APRS         'D'
576 #define DOWN_APRS       'Q'
577 #define NORMAL_GPS_RMC  'C'
578 #define NORMAL_GPS_GGA  'A'
579 #define NORMAL_GPS_GLL  'L'
580
581 /* define RECORD ACTIVES */
582 #define RECORD_ACTIVE    'A'
583 #define RECORD_NOTACTIVE 'N'
584 #define RECORD_CLOSED     'C'
585
586 /* define data from info type */
587 #define DATA_VIA_LOCAL 'L'
588 #define DATA_VIA_TNC   'T'
589 #define DATA_VIA_NET   'I'
590 #define DATA_VIA_FILE  'F'
591
592
593 /* define Heard info type */
594 #define VIA_TNC         'Y'
595 #define NOT_VIA_TNC     'N'
596
597 /* define Message types */
598 #define MESSAGE_MESSAGE  'M'
599 #define MESSAGE_BULLETIN 'B'
600 #define MESSAGE_NWS      'W'
601
602
603 // trail flag definitions
604 #define MAX_CALLSIGN 9
605 #define MAX_TIME             20
606 #define MAX_LONG             12
607 #define MAX_LAT              11
608 #define MAX_ALTITUDE         10         //-32808.4 to 300000.0? feet
609 #define MAX_SPEED             9         /* ?? 3 in knots */
610 #define MAX_COURSE            7         /* ?? */
611 #define MAX_POWERGAIN         7
612 #define MAX_STATION_TIME     10         /* 6+1 */
613 #define MAX_SAT               4
614 #define MAX_DISTANCE         10
615 #define MAX_WXSTATION        50
616 #define MAX_TEMP            100
617 #define MAX_MULTIPOINTS 35
618
619 #define MAX_DEVICE_BUFFER 4096
620
621 /* define max size of info field */
622 #define MAX_INFO_FIELD_SIZE 256
623
624 // Number of times to send killed objects/items before ceasing to
625 // transmit them.
626 #define MAX_KILLED_OBJECT_RETRANSMIT 20
627
628 // Check entire station list at this rate for objects/items that
629 // might need to be transmitted via the decaying algorithm.  This is
630 // the start rate, which gets doubled on each transmit.
631 #define OBJECT_CHECK_RATE 20
632
633
634 #define MAX_MESSAGE_LENGTH  100
635 #define MAX_MESSAGE_ORDER    10
636
637
638 #define CHECKMALLOC(m)  if (!m) { fprintf(stderr, "***** Malloc Failed *****\n"); exit(0); }
639
640
641 #define STATION_REMOVE_CYCLE 300    /* check station remove in seconds (every 5 minutes) */
642 #define MESSAGE_REMOVE_CYCLE 600    /* check message remove in seconds (every 10 minutes) */
643 #define IN_VIEW_MIN         600l    /* margin for off-screen stations, with possible trails on screen, in minutes */
644 #define TRAIL_POINT_MARGIN   30l    /* margin for off-screen trails points, for segment to be drawn, in minutes */
645 #define TRAIL_MAX_SPEED      900    /* max. acceptible speed for drawing trails, in mph */
646 #define MY_TRAIL_COLOR      0x16    /* trail color index reserved for my station */
647 #define TRAIL_ECHO_TIME       30    /* check for delayed echos during last 30 minutes */
648 /* MY_TRAIL_DIFF_COLOR changed to user configurable my_trail_diff_color  */
649
650
651 typedef struct { 
652     int digis;
653     int wxs;
654     int other_mobiles;
655     int mobiles_in_motion;
656     int homes;
657     int total;
658 } aloha_stats;
659
660
661 // station flag definitions.  We have 16 bits available here as
662 // "flag" in "DataRow" is defined as a short.
663 //
664 #define ST_OBJECT       0x01    // station is an object
665 #define ST_ITEM         0x02    // station is an item
666 #define ST_ACTIVE       0x04    // station is active (deleted objects are
667                                 // inactive)
668 #define ST_MOVING       0x08    // station is moving
669 #define ST_DIRECT       0x10    // heard direct (not via digis)
670 #define ST_VIATNC       0x20    // station heard via TNC
671 #define ST_3RD_PT       0x40    // third party traffic (not used yet)
672 #define ST_MSGCAP       0x80    // message capable (not used yet)
673 #define ST_STATUS       0x100   // got real status message
674 #define ST_INVIEW       0x200   // station is in current screen view
675 #define ST_MYSTATION    0x400   // station is owned by my call-SSID
676 #define ST_MYOBJITEM    0x800   // object/item owned by me
677
678
679 #define TR_LOCAL        0x01    // heard direct (not via digis)
680 #define TR_NEWTRK       0x02    // start new track
681
682
683 enum AprsAreaObjectTypes {
684     AREA_OPEN_CIRCLE     = 0x0,
685     AREA_LINE_LEFT       = 0x1,
686     AREA_OPEN_ELLIPSE    = 0x2,
687     AREA_OPEN_TRIANGLE   = 0x3,
688     AREA_OPEN_BOX        = 0x4,
689     AREA_FILLED_CIRCLE   = 0x5,
690     AREA_LINE_RIGHT      = 0x6,
691     AREA_FILLED_ELLIPSE  = 0x7,
692     AREA_FILLED_TRIANGLE = 0x8,
693     AREA_FILLED_BOX      = 0x9,
694     AREA_MAX             = 0x9,
695     AREA_NONE            = 0xF
696 };
697
698
699
700 enum AprsAreaObjectColors {
701     AREA_BLACK_HI  = 0x0,
702     AREA_BLUE_HI   = 0x1,
703     AREA_GREEN_HI  = 0x2,
704     AREA_CYAN_HI   = 0x3,
705     AREA_RED_HI    = 0x4,
706     AREA_VIOLET_HI = 0x5,
707     AREA_YELLOW_HI = 0x6,
708     AREA_GRAY_HI   = 0x7,
709     AREA_BLACK_LO  = 0x8,
710     AREA_BLUE_LO   = 0x9,
711     AREA_GREEN_LO  = 0xA,
712     AREA_CYAN_LO   = 0xB,
713     AREA_RED_LO    = 0xC,
714     AREA_VIOLET_LO = 0xD,
715     AREA_YELLOW_LO = 0xE,
716     AREA_GRAY_LO   = 0xF
717 };
718
719
720 typedef struct {
721     unsigned type : 4;
722     unsigned color : 4;
723     unsigned sqrt_lat_off : 8;
724     unsigned sqrt_lon_off : 8;
725     unsigned corridor_width : 16;
726 } AprsAreaObject;
727
728 typedef struct {
729     char aprs_type;
730     char aprs_symbol;
731     char special_overlay;
732     AprsAreaObject area_object;
733 } APRS_Symbol;
734
735 // Struct for holding track data.  Keeps a dynamically allocated
736 // doubly-linked list of track points.  The first record should have its
737 // "prev" pointer set to NULL and the last record should have its "next"
738 // pointer set to NULL.  If no track storage exists then the pointers to
739 // these structs in the DataRow struct should be NULL.
740 typedef struct _AprsTrackRow{
741     long    trail_long_pos;     // coordinate of trail point
742     long    trail_lat_pos;      // coordinate of trail point
743     time_t  sec;                // date/time of position
744     long    speed;              // in 0.1 km/h   undefined: -1
745     int     course;             // in degrees    undefined: -1
746     long    altitude;           // in 0.1 m      undefined: -99999
747     char    flag;               // several flags, see below
748     struct  _AprsTrackRow *prev;    // pointer to previous record in list
749     struct  _AprsTrackRow *next;    // pointer to next record in list
750 } AprsTrackRow;
751
752
753
754 // Struct for holding current weather data.
755 // This struct is pointed to by the DataRow structure.
756 // An empty string indicates undefined data.
757 typedef struct {                //                      strlen
758     time_t  wx_sec_time;
759     int     wx_storm;           // Set to one if severe storm
760     char    wx_time[MAX_TIME];
761     char    wx_course[4];       // in °                     3
762     char    wx_speed[4];        // in mph                   3
763     time_t  wx_speed_sec_time;
764     char    wx_gust[4];         // in mph                   3
765     char    wx_hurricane_radius[4];  //nautical miles       3
766     char    wx_trop_storm_radius[4]; //nautical miles       3
767     char    wx_whole_gale_radius[4]; // nautical miles      3
768     char    wx_temp[5];         // in °F                    3
769     char    wx_rain[10];        // in hundredths inch/h     3
770     char    wx_rain_total[10];  // in hundredths inch
771     char    wx_snow[6];         // in inches/24h            3
772     char    wx_prec_24[10];     // in hundredths inch/day   3
773     char    wx_prec_00[10];     // in hundredths inch       3
774     char    wx_hum[5];          // in %                     3
775     char    wx_baro[10];        // in hPa                   6
776     char    wx_fuel_temp[5];    // in °F                    3
777     char    wx_fuel_moisture[5];// in %                     2
778     char    wx_type;
779     char    wx_station[MAX_WXSTATION];
780 } AprsWeatherRow;
781
782
783 // Struct for holding comment/status data.  Will keep a dynamically
784 // allocated list of text.  Every different comment field will be
785 // stored in a separate line.
786 typedef struct _AprsCommentRow{
787     char   *text_ptr;           // Ptr to the comment text
788     time_t sec_heard;           // Latest timestamp for this comment/status
789     struct _AprsCommentRow *next;   // Ptr to next record or NULL
790 } AprsCommentRow;
791
792
793
794
795 // Struct for holding multipoint data.
796 typedef struct _AprsMultipointRow{
797     long multipoints[MAX_MULTIPOINTS][2];
798 } AprsMultipointRow;
799
800 typedef struct _AprsDisplayData
801 {
802     gchar *call_sign; // call sign or name index or object/item
803                                     // name
804     gdouble coord_lon;
805     gdouble coord_lat;
806
807     gchar   *coord_lat_lon;
808     gchar   *path;
809     
810     gchar   *comment;
811     gchar   *status;
812 } AprsDisplayData;
813
814 typedef struct _AprsDataRow {
815
816     struct _AprsDataRow *n_next;    // pointer to next element in name ordered list
817     struct _AprsDataRow *n_prev;    // pointer to previous element in name ordered
818                                 // list
819     struct _AprsDataRow *t_newer;   // pointer to next element in time ordered
820                                 // list (newer)
821     struct _AprsDataRow *t_older;   // pointer to previous element in time ordered
822                                 // list (older)
823
824     
825     char call_sign[MAX_CALLSIGN+1]; // call sign or name index or object/item
826                                     // name
827     char *tactical_call_sign;   // Tactical callsign.  NULL if not assigned
828     APRS_Symbol aprs_symbol;
829     long coord_lon;             // Xastir coordinates 1/100 sec, 0 = 180°W
830     long coord_lat;             // Xastir coordinates 1/100 sec, 0 =  90°N
831
832     int  time_sn;               // serial number for making time index unique
833     time_t sec_heard;           // time last heard, used also for time index
834     time_t heard_via_tnc_last_time;
835     time_t direct_heard;        // KC2ELS - time last heard direct
836
837 // Change into time_t structs?  It'd save us a bunch of space.
838     char packet_time[MAX_TIME];
839     char pos_time[MAX_TIME];
840
841     short flag;                 // several flags, see below
842     char pos_amb;               // Position ambiguity, 0 = none,
843                                 // 1 = 0.1 minute...
844
845     unsigned int error_ellipse_radius; // Degrades precision for this
846                                 // station, from 0 to 65535 cm or
847                                 // 655.35 meters.  Assigned when we
848                                 // decode each type of packet.
849                                 // Default is 6.0 meters (600 cm)
850                                 // unless we know the GPS position
851                                 // is augmented, or is degraded by
852                                 // less precision in the packet.
853
854     unsigned int lat_precision; // In 100ths of a second latitude
855     unsigned int lon_precision; // In 100ths of a second longitude
856
857     int trail_color;            // trail color (when assigned)
858     char record_type;
859     //char data_via;              // L local, T TNC, I internet, F file
860
861 // Change to char's to save space?
862     int  heard_via_tnc_port;    // Current this will always be 0, but keep for future
863     TAprsPort  last_port_heard;       // Current this will always be 0, but keep for future
864     unsigned int  num_packets;
865     char *node_path_ptr;        // Pointer to path string
866     char altitude[MAX_ALTITUDE]; // in meters (feet gives better resolution ??)
867     char speed[MAX_SPEED+1];    // in knots (same as nautical miles/hour)
868     char course[MAX_COURSE+1];
869     char bearing[MAX_COURSE+1];
870     char NRQ[MAX_COURSE+1];
871     char power_gain[MAX_POWERGAIN+1];   // Holds the phgd values
872     char signal_gain[MAX_POWERGAIN+1];  // Holds the shgd values (for DF'ing)
873
874     AprsWeatherRow *weather_data;   // Pointer to weather data or NULL
875  
876     AprsCommentRow *status_data;    // Ptr to status records or NULL
877     AprsCommentRow *comment_data;   // Ptr to comment records or NULL
878
879     // Below two pointers are NULL if only one position has been received
880     AprsTrackRow *oldest_trackpoint; // Pointer to oldest track point in
881                                  // doubly-linked list
882     AprsTrackRow *newest_trackpoint; // Pointer to newest track point in
883                                  // doubly-linked list
884
885     // When the station is an object, it can include coordinates
886     // of related points. Currently these are being used to draw
887     // outlines of NWS severe weather watches and warnings, and
888     // storm regions. The coordinates are stored here in Xastir
889     // coordinate form. Element [x][0] is the latitude, and 
890     // element [x][1] is the longitude.  --KG4NBB
891     //
892     // Is there anything preventing a multipoint string from being
893     // in other types of packets, in the comment field?  --WE7U
894     //
895     int num_multipoints;
896     char type;      // from '0' to '9'
897     char style;     // from 'a' to 'z'
898     AprsMultipointRow *multipoint_data;
899
900
901 ///////////////////////////////////////////////////////////////////////
902 // Optional stuff for Objects/Items only (I think, needs to be
903 // checked).  These could be moved into an ObjectRow structure, with
904 // only a NULL pointer here if not an object/item.
905 ///////////////////////////////////////////////////////////////////////
906  
907     char origin[MAX_CALLSIGN+1]; // call sign originating an object
908     short object_retransmit;     // Number of times to retransmit object.
909                                  // -1 = forever
910                                  // Used currently to stop sending killed
911                                  // objects.
912     time_t last_transmit_time;   // Time we last transmitted an object/item.
913                                  // Used to implement decaying transmit time
914                                  // algorithm
915     short transmit_time_increment; // Seconds to add to transmit next time
916                                    // around.  Used to implement decaying
917                                    // transmit time algorithm
918 //    time_t last_modified_time;   // Seconds since the object/item
919                                  // was last modified.  We'll
920                                  // eventually use this for
921                                  // dead-reckoning.
922     char signpost[5+1];          // Holds signpost data
923     int  df_color;
924     char sats_visible[MAX_SAT];
925     char probability_min[10+1];  // Holds prob_min (miles)
926     char probability_max[10+1];  // Holds prob_max (miles)
927
928 } AprsDataRow;
929
930 typedef enum
931 {
932     APRSPOI_SELECTED,
933     APRSPOI_CALLSIGN,
934 //    APRSPOI_LAT,
935 //    APRSPOI_LON,
936 //    APRSPOI_LATLON,
937 //    APRSPOI_BEARING,
938 //    APRSPOI_DISTANCE,
939 //    APRSPOI_PATH,
940 //    APRSPOI_COMMENT,
941 //    APRSPOI_STATUS,
942     APRSPOI_NUM_COLUMNS
943 } APRSPOIList;
944
945
946
947 typedef struct _AprsStationList{
948     struct  _AprsStationList *next;    // pointer to next record in list
949     AprsDataRow *station;
950 } AprsStationList;
951
952
953
954
955 // --------------------------------------------------------------------------------------
956 // End of APRS Types - Code taken from Xastir code 25 March 2008 by Rob Williams M1BGT
957 // Modification made to fit in with Maemo mapper
958 // --------------------------------------------------------------------------------------
959 #endif // INCLUDE_APRS
960
961
962 #endif /* ifndef MAEMO_MAPPER_TYPES_H */