2 * Copyright (C) 2006, 2007 John Costigan.
4 * POI and GPS-Info code originally written by Cezary Jackiewicz.
6 * Default map data provided by http://www.openstreetmap.org/
8 * This file is part of Maemo Mapper.
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.
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.
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/>.
24 * Parts of this code have been ported from Xastir by Rob Williams (10 Aug 2008):
26 * * XASTIR, Amateur Station Tracking and Information Reporting
27 * Copyright (C) 1999,2000 Frank Giannandrea
28 * Copyright (C) 2000-2007 The Xastir Group
32 #ifndef MAEMO_MAPPER_TYPES_H
33 #define MAEMO_MAPPER_TYPES_H
43 #include <libgnomevfs/gnome-vfs.h>
45 #define _(String) gettext(String)
49 // Latitude and longitude string formats.
50 #define CONVERT_HP_NORMAL 0
51 #define CONVERT_HP_NOSP 1
52 #define CONVERT_LP_NORMAL 2
53 #define CONVERT_LP_NOSP 3
54 #define CONVERT_DEC_DEG 4
55 #define CONVERT_UP_TRK 5
56 #define CONVERT_DMS_NORMAL 6
57 #define CONVERT_VHP_NOSP 7
58 #define CONVERT_DMS_NORMAL_FORMATED 8
59 #define CONVERT_HP_NORMAL_FORMATED 9
60 #define CONVERT_DEC_DEG_N 10
62 #define MAX_DEVICE_BUFFER 4096
64 /** This enumerated type defines the possible connection states. */
67 /** The receiver is "off", meaning that either the bluetooth radio is
68 * off or the user has requested not to connect to the GPS receiver.
69 * No gtk_banner is visible. */
72 /** The connection with the receiver is down. A gtk_banner is visible with
73 * the text, "Connecting to GPS receiver". */
76 /** The connection with the receiver is up, but a GPS fix is not available.
77 * A gtk_banner is visible with the text, "(Re-)Establishing GPS fix". */
80 /** The connection with the receiver is up and a GPS fix IS available.
81 * No gtk_banner is visible. */
85 /** This enumerated type defines the supported types of repositories. */
88 REPOTYPE_NONE, /* No URL set. */
89 REPOTYPE_XYZ, /* x=%d, y=%d, and zoom=%d */
90 REPOTYPE_XYZ_SIGNED, /* x=%d, y=%d, and zoom=%d-2 */
91 REPOTYPE_XYZ_INV, /* zoom=%0d, x=%d, y=%d */
92 REPOTYPE_QUAD_QRST, /* t=%s (%s = {qrst}*) */
93 REPOTYPE_QUAD_ZERO, /* t=%0s (%0s = {0123}*) */
94 REPOTYPE_WMS /* "service=wms" */
97 /** Possible center modes. The "WAS" modes imply no current center mode;
98 * they only hint at what the last center mode was, so that it can be
102 CENTER_WAS_LATLON = -2,
103 CENTER_WAS_LEAD = -1,
108 /** POI dialog action **/
115 /** Category list **/
143 /** This enum defines the possible units we can use. */
162 /** This enum defines the possible font sizes. */
175 /** This enum defines the possible font sizes. */
182 ROTATE_DIR_ENUM_COUNT
185 /** This enum defines all of the key-customizable actions. */
188 CUSTOM_ACTION_PAN_NORTH,
189 CUSTOM_ACTION_PAN_WEST,
190 CUSTOM_ACTION_PAN_SOUTH,
191 CUSTOM_ACTION_PAN_EAST,
192 CUSTOM_ACTION_PAN_UP,
193 CUSTOM_ACTION_PAN_DOWN,
194 CUSTOM_ACTION_PAN_LEFT,
195 CUSTOM_ACTION_PAN_RIGHT,
196 CUSTOM_ACTION_RESET_VIEW_ANGLE,
197 CUSTOM_ACTION_ROTATE_CLOCKWISE,
198 CUSTOM_ACTION_ROTATE_COUNTERCLOCKWISE,
199 CUSTOM_ACTION_TOGGLE_AUTOCENTER,
200 CUSTOM_ACTION_TOGGLE_AUTOROTATE,
201 CUSTOM_ACTION_ZOOM_IN,
202 CUSTOM_ACTION_ZOOM_OUT,
203 CUSTOM_ACTION_TOGGLE_FULLSCREEN,
204 CUSTOM_ACTION_TOGGLE_TRACKING,
205 CUSTOM_ACTION_TOGGLE_TRACKS,
206 CUSTOM_ACTION_TOGGLE_SCALE,
207 CUSTOM_ACTION_TOGGLE_POI,
208 CUSTOM_ACTION_CHANGE_REPO,
209 CUSTOM_ACTION_ROUTE_DISTNEXT,
210 CUSTOM_ACTION_ROUTE_DISTLAST,
211 CUSTOM_ACTION_TRACK_BREAK,
212 CUSTOM_ACTION_TRACK_CLEAR,
213 CUSTOM_ACTION_TRACK_DISTLAST,
214 CUSTOM_ACTION_TRACK_DISTFIRST,
215 CUSTOM_ACTION_TOGGLE_GPS,
216 CUSTOM_ACTION_TOGGLE_GPSINFO,
217 CUSTOM_ACTION_TOGGLE_SPEEDLIMIT,
218 CUSTOM_ACTION_RESET_BLUETOOTH,
219 CUSTOM_ACTION_TOGGLE_LAYERS,
220 CUSTOM_ACTION_ENUM_COUNT
223 /** This enum defines all of the customizable keys. */
233 CUSTOM_KEY_FULLSCREEN,
235 CUSTOM_KEY_ENUM_COUNT
238 /** This enum defines all of the colorable objects. */
242 COLORABLE_MARK_VELOCITY,
245 COLORABLE_TRACK_MARK,
246 COLORABLE_TRACK_BREAK,
249 COLORABLE_ROUTE_BREAK,
252 COLORABLE_APRS_STATION,
253 #endif // INCLUDE_APRS
269 UK_NGR, // 8 char grid ref
270 UK_NGR6,// 6 char grid ref
272 DEG_FORMAT_ENUM_COUNT
275 typedef struct _CoordFormatSetup CoordFormatSetup;
276 struct _CoordFormatSetup
279 gchar *short_field_1;
281 gchar *short_field_2;
283 gboolean field_2_in_use;
288 SPEED_LOCATION_BOTTOM_LEFT,
289 SPEED_LOCATION_BOTTOM_RIGHT,
290 SPEED_LOCATION_TOP_RIGHT,
291 SPEED_LOCATION_TOP_LEFT,
292 SPEED_LOCATION_ENUM_COUNT
298 MAP_UPDATE_OVERWRITE,
301 MAP_UPDATE_ENUM_COUNT
312 /** A general definition of a point in the Maemo Mapper unit system. */
313 typedef struct _Point Point;
321 /** A WayPoint, which is a Point with a description. */
322 typedef struct _WayPoint WayPoint;
328 /** A Path is a set of PathPoints and WayPoints. */
329 typedef struct _Path Path;
331 Point *head; /* points to first element in array; NULL if empty. */
332 Point *tail; /* points to last element in array. */
333 Point *cap; /* points after last slot in array. */
334 WayPoint *whead; /* points to first element in array; NULL if empty. */
335 WayPoint *wtail; /* points to last element in array. */
336 WayPoint *wcap; /* points after last slot in array. */
339 /** Data to describe a POI. */
340 typedef struct _PoiInfo PoiInfo;
351 /** Data regarding a map repository. */
352 typedef struct _RepoData RepoData;
359 gint view_zoom_steps;
360 gboolean double_size;
367 gboolean layer_enabled;
368 gboolean layer_was_enabled; /* needed for ability to temporarily toggle layers on and off */
369 gint layer_refresh_interval;
370 gint layer_refresh_countdown;
373 sqlite3_stmt *stmt_map_select;
374 sqlite3_stmt *stmt_map_exists;
375 sqlite3_stmt *stmt_map_update;
376 sqlite3_stmt *stmt_map_delete;
378 GtkWidget *menu_item;
381 /** GPS Data and Satellite **/
382 typedef struct _GpsData GpsData;
388 gfloat speed; /* in knots */
389 gfloat maxspeed; /* in knots */
399 typedef struct _GpsSatelliteData GpsSatelliteData;
400 struct _GpsSatelliteData {
407 /** Data used for rendering the entire screen. */
408 typedef struct _MapRenderTask MapRenderTask;
409 struct _MapRenderTask
415 gint screen_width_pixels;
416 gint screen_height_pixels;
423 /** Data used for rendering the entire screen. */
424 typedef struct _MapOffsetArgs MapOffsetArgs;
425 struct _MapOffsetArgs
427 gfloat old_center_offset_devx;
428 gfloat old_center_offset_devy;
429 gfloat new_center_offset_devx;
430 gfloat new_center_offset_devy;
432 gfloat percent_complete;
435 typedef struct _ThreadLatch ThreadLatch;
439 gboolean is_done_adding_tasks;
446 /** Data used during the asynchronous progress update phase of automatic map
448 typedef struct _MapUpdateTask MapUpdateTask;
449 struct _MapUpdateTask
454 ThreadLatch *refresh_latch;
464 /** Data used during the asynchronous automatic route downloading operation. */
465 typedef struct _AutoRouteDownloadData AutoRouteDownloadData;
466 struct _AutoRouteDownloadData {
468 gboolean in_progress;
471 gboolean avoid_highways;
474 /** Data to describe the GPS connection. */
475 typedef struct _GpsRcvrInfo GpsRcvrInfo;
476 struct _GpsRcvrInfo {
484 typedef struct _BrowseInfo BrowseInfo;
493 // --------------------------------------------------------------------------------------
494 // Start of APRS Types - Code taken from Xastir code 25 March 2008 by Rob Williams
495 // Modification made to fit in with Maemo mapper
496 // --------------------------------------------------------------------------------------
498 typedef struct _TWriteBuffer TWriteBuffer;
501 int write_in_pos; /* current write buffer input pos */
502 int write_out_pos; /* current write buffer output pos */
503 GMutex* write_lock; /* Lock for writing the port data */
504 char device_write_buffer[MAX_DEVICE_BUFFER];/* write buffer for this port */
522 // We should probably be using APRS_DF in extract_bearing_NRQ()
523 // and extract_omnidf() functions. We aren't currently.
524 /* Define APRS Types */
529 APRS_DOWN, // Not used anymore
556 /* Define Record Types */
557 #define NORMAL_APRS 'N'
558 #define MOBILE_APRS 'M'
560 #define DOWN_APRS 'Q'
561 #define NORMAL_GPS_RMC 'C'
562 #define NORMAL_GPS_GGA 'A'
563 #define NORMAL_GPS_GLL 'L'
565 /* define RECORD ACTIVES */
566 #define RECORD_ACTIVE 'A'
567 #define RECORD_NOTACTIVE 'N'
568 #define RECORD_CLOSED 'C'
570 /* define data from info type */
571 #define DATA_VIA_LOCAL 'L'
572 #define DATA_VIA_TNC 'T'
573 #define DATA_VIA_NET 'I'
574 #define DATA_VIA_FILE 'F'
577 /* define Heard info type */
579 #define NOT_VIA_TNC 'N'
581 /* define Message types */
582 #define MESSAGE_MESSAGE 'M'
583 #define MESSAGE_BULLETIN 'B'
584 #define MESSAGE_NWS 'W'
587 // trail flag definitions
588 #define MAX_CALLSIGN 9
592 #define MAX_ALTITUDE 10 //-32808.4 to 300000.0? feet
593 #define MAX_SPEED 9 /* ?? 3 in knots */
594 #define MAX_COURSE 7 /* ?? */
595 #define MAX_POWERGAIN 7
596 #define MAX_STATION_TIME 10 /* 6+1 */
598 #define MAX_DISTANCE 10
599 #define MAX_WXSTATION 50
601 #define MAX_MULTIPOINTS 35
603 #define MAX_DEVICE_BUFFER 4096
605 /* define max size of info field */
606 #define MAX_INFO_FIELD_SIZE 256
608 // Number of times to send killed objects/items before ceasing to
610 #define MAX_KILLED_OBJECT_RETRANSMIT 20
612 // Check entire station list at this rate for objects/items that
613 // might need to be transmitted via the decaying algorithm. This is
614 // the start rate, which gets doubled on each transmit.
615 #define OBJECT_CHECK_RATE 20
618 #define MAX_MESSAGE_LENGTH 100
619 #define MAX_MESSAGE_ORDER 10
622 #define CHECKMALLOC(m) if (!m) { fprintf(stderr, "***** Malloc Failed *****\n"); exit(0); }
625 #define STATION_REMOVE_CYCLE 300 /* check station remove in seconds (every 5 minutes) */
626 #define MESSAGE_REMOVE_CYCLE 600 /* check message remove in seconds (every 10 minutes) */
627 #define IN_VIEW_MIN 600l /* margin for off-screen stations, with possible trails on screen, in minutes */
628 #define TRAIL_POINT_MARGIN 30l /* margin for off-screen trails points, for segment to be drawn, in minutes */
629 #define TRAIL_MAX_SPEED 900 /* max. acceptible speed for drawing trails, in mph */
630 #define MY_TRAIL_COLOR 0x16 /* trail color index reserved for my station */
631 #define TRAIL_ECHO_TIME 30 /* check for delayed echos during last 30 minutes */
632 /* MY_TRAIL_DIFF_COLOR changed to user configurable my_trail_diff_color */
639 int mobiles_in_motion;
645 // station flag definitions. We have 16 bits available here as
646 // "flag" in "DataRow" is defined as a short.
648 #define ST_OBJECT 0x01 // station is an object
649 #define ST_ITEM 0x02 // station is an item
650 #define ST_ACTIVE 0x04 // station is active (deleted objects are
652 #define ST_MOVING 0x08 // station is moving
653 #define ST_DIRECT 0x10 // heard direct (not via digis)
654 #define ST_VIATNC 0x20 // station heard via TNC
655 #define ST_3RD_PT 0x40 // third party traffic (not used yet)
656 #define ST_MSGCAP 0x80 // message capable (not used yet)
657 #define ST_STATUS 0x100 // got real status message
658 #define ST_INVIEW 0x200 // station is in current screen view
659 #define ST_MYSTATION 0x400 // station is owned by my call-SSID
660 #define ST_MYOBJITEM 0x800 // object/item owned by me
663 #define TR_LOCAL 0x01 // heard direct (not via digis)
664 #define TR_NEWTRK 0x02 // start new track
667 enum AprsAreaObjectTypes {
668 AREA_OPEN_CIRCLE = 0x0,
669 AREA_LINE_LEFT = 0x1,
670 AREA_OPEN_ELLIPSE = 0x2,
671 AREA_OPEN_TRIANGLE = 0x3,
673 AREA_FILLED_CIRCLE = 0x5,
674 AREA_LINE_RIGHT = 0x6,
675 AREA_FILLED_ELLIPSE = 0x7,
676 AREA_FILLED_TRIANGLE = 0x8,
677 AREA_FILLED_BOX = 0x9,
684 enum AprsAreaObjectColors {
690 AREA_VIOLET_HI = 0x5,
691 AREA_YELLOW_HI = 0x6,
698 AREA_VIOLET_LO = 0xD,
699 AREA_YELLOW_LO = 0xE,
707 unsigned sqrt_lat_off : 8;
708 unsigned sqrt_lon_off : 8;
709 unsigned corridor_width : 16;
715 char special_overlay;
716 AprsAreaObject area_object;
719 // Struct for holding track data. Keeps a dynamically allocated
720 // doubly-linked list of track points. The first record should have its
721 // "prev" pointer set to NULL and the last record should have its "next"
722 // pointer set to NULL. If no track storage exists then the pointers to
723 // these structs in the DataRow struct should be NULL.
724 typedef struct _AprsTrackRow{
725 long trail_long_pos; // coordinate of trail point
726 long trail_lat_pos; // coordinate of trail point
727 time_t sec; // date/time of position
728 long speed; // in 0.1 km/h undefined: -1
729 int course; // in degrees undefined: -1
730 long altitude; // in 0.1 m undefined: -99999
731 char flag; // several flags, see below
732 struct _AprsTrackRow *prev; // pointer to previous record in list
733 struct _AprsTrackRow *next; // pointer to next record in list
738 // Struct for holding current weather data.
739 // This struct is pointed to by the DataRow structure.
740 // An empty string indicates undefined data.
741 typedef struct { // strlen
743 int wx_storm; // Set to one if severe storm
744 char wx_time[MAX_TIME];
745 char wx_course[4]; // in ° 3
746 char wx_speed[4]; // in mph 3
747 time_t wx_speed_sec_time;
748 char wx_gust[4]; // in mph 3
749 char wx_hurricane_radius[4]; //nautical miles 3
750 char wx_trop_storm_radius[4]; //nautical miles 3
751 char wx_whole_gale_radius[4]; // nautical miles 3
752 char wx_temp[5]; // in °F 3
753 char wx_rain[10]; // in hundredths inch/h 3
754 char wx_rain_total[10]; // in hundredths inch
755 char wx_snow[6]; // in inches/24h 3
756 char wx_prec_24[10]; // in hundredths inch/day 3
757 char wx_prec_00[10]; // in hundredths inch 3
758 char wx_hum[5]; // in % 3
759 char wx_baro[10]; // in hPa 6
760 char wx_fuel_temp[5]; // in °F 3
761 char wx_fuel_moisture[5];// in % 2
763 char wx_station[MAX_WXSTATION];
767 // Struct for holding comment/status data. Will keep a dynamically
768 // allocated list of text. Every different comment field will be
769 // stored in a separate line.
770 typedef struct _AprsCommentRow{
771 char *text_ptr; // Ptr to the comment text
772 time_t sec_heard; // Latest timestamp for this comment/status
773 struct _AprsCommentRow *next; // Ptr to next record or NULL
779 // Struct for holding multipoint data.
780 typedef struct _AprsMultipointRow{
781 long multipoints[MAX_MULTIPOINTS][2];
784 typedef struct _AprsDisplayData
786 gchar *call_sign; // call sign or name index or object/item
791 gchar *coord_lat_lon;
798 typedef struct _AprsDataRow {
800 struct _AprsDataRow *n_next; // pointer to next element in name ordered list
801 struct _AprsDataRow *n_prev; // pointer to previous element in name ordered
803 struct _AprsDataRow *t_newer; // pointer to next element in time ordered
805 struct _AprsDataRow *t_older; // pointer to previous element in time ordered
809 char call_sign[MAX_CALLSIGN+1]; // call sign or name index or object/item
811 char *tactical_call_sign; // Tactical callsign. NULL if not assigned
812 APRS_Symbol aprs_symbol;
813 long coord_lon; // Xastir coordinates 1/100 sec, 0 = 180°W
814 long coord_lat; // Xastir coordinates 1/100 sec, 0 = 90°N
816 int time_sn; // serial number for making time index unique
817 time_t sec_heard; // time last heard, used also for time index
818 time_t heard_via_tnc_last_time;
819 time_t direct_heard; // KC2ELS - time last heard direct
821 // Change into time_t structs? It'd save us a bunch of space.
822 char packet_time[MAX_TIME];
823 char pos_time[MAX_TIME];
825 short flag; // several flags, see below
826 char pos_amb; // Position ambiguity, 0 = none,
829 unsigned int error_ellipse_radius; // Degrades precision for this
830 // station, from 0 to 65535 cm or
831 // 655.35 meters. Assigned when we
832 // decode each type of packet.
833 // Default is 6.0 meters (600 cm)
834 // unless we know the GPS position
835 // is augmented, or is degraded by
836 // less precision in the packet.
838 unsigned int lat_precision; // In 100ths of a second latitude
839 unsigned int lon_precision; // In 100ths of a second longitude
841 int trail_color; // trail color (when assigned)
843 //char data_via; // L local, T TNC, I internet, F file
845 // Change to char's to save space?
846 int heard_via_tnc_port; // Current this will always be 0, but keep for future
847 TAprsPort last_port_heard; // Current this will always be 0, but keep for future
848 unsigned int num_packets;
849 char *node_path_ptr; // Pointer to path string
850 char altitude[MAX_ALTITUDE]; // in meters (feet gives better resolution ??)
851 char speed[MAX_SPEED+1]; // in knots (same as nautical miles/hour)
852 char course[MAX_COURSE+1];
853 char bearing[MAX_COURSE+1];
854 char NRQ[MAX_COURSE+1];
855 char power_gain[MAX_POWERGAIN+1]; // Holds the phgd values
856 char signal_gain[MAX_POWERGAIN+1]; // Holds the shgd values (for DF'ing)
858 AprsWeatherRow *weather_data; // Pointer to weather data or NULL
860 AprsCommentRow *status_data; // Ptr to status records or NULL
861 AprsCommentRow *comment_data; // Ptr to comment records or NULL
863 // Below two pointers are NULL if only one position has been received
864 AprsTrackRow *oldest_trackpoint; // Pointer to oldest track point in
865 // doubly-linked list
866 AprsTrackRow *newest_trackpoint; // Pointer to newest track point in
867 // doubly-linked list
869 // When the station is an object, it can include coordinates
870 // of related points. Currently these are being used to draw
871 // outlines of NWS severe weather watches and warnings, and
872 // storm regions. The coordinates are stored here in Xastir
873 // coordinate form. Element [x][0] is the latitude, and
874 // element [x][1] is the longitude. --KG4NBB
876 // Is there anything preventing a multipoint string from being
877 // in other types of packets, in the comment field? --WE7U
880 char type; // from '0' to '9'
881 char style; // from 'a' to 'z'
882 AprsMultipointRow *multipoint_data;
885 ///////////////////////////////////////////////////////////////////////
886 // Optional stuff for Objects/Items only (I think, needs to be
887 // checked). These could be moved into an ObjectRow structure, with
888 // only a NULL pointer here if not an object/item.
889 ///////////////////////////////////////////////////////////////////////
891 char origin[MAX_CALLSIGN+1]; // call sign originating an object
892 short object_retransmit; // Number of times to retransmit object.
894 // Used currently to stop sending killed
896 time_t last_transmit_time; // Time we last transmitted an object/item.
897 // Used to implement decaying transmit time
899 short transmit_time_increment; // Seconds to add to transmit next time
900 // around. Used to implement decaying
901 // transmit time algorithm
902 // time_t last_modified_time; // Seconds since the object/item
903 // was last modified. We'll
904 // eventually use this for
906 char signpost[5+1]; // Holds signpost data
908 char sats_visible[MAX_SAT];
909 char probability_min[10+1]; // Holds prob_min (miles)
910 char probability_max[10+1]; // Holds prob_max (miles)
931 typedef struct _AprsStationList{
932 struct _AprsStationList *next; // pointer to next record in list
933 AprsDataRow *station;
939 // --------------------------------------------------------------------------------------
940 // End of APRS Types - Code taken from Xastir code 25 March 2008 by Rob Williams M1BGT
941 // Modification made to fit in with Maemo mapper
942 // --------------------------------------------------------------------------------------
943 #endif // INCLUDE_APRS
946 #endif /* ifndef MAEMO_MAPPER_TYPES_H */