libgpsfile  0.2.2
some useful C-functions
_gps_data_file_v1.h
Go to the documentation of this file.
1 /* kate: indent-mode cstyle; tab-width 6; indent-width 6; */
2 #ifndef X_GPS_DATA_FILE_H
3 #define X_GPS_DATA_FILE_H
4 
5 #include <stdint.h>
6 #include <math.h>
7 
8 /* Macro's: */
9 #define _GPS_SPEC_HAVE_ACCURACY 1
10 #define _GPS_SPEC_VERSION 1
11 
12 /* minima and maxima according to the gps spec for differential notation */
13 #define LAT_GPS_SPEC_DIFF_MAX (uint64_t)(pow(2, _GPS_PARTIAL_LOCATION_BLOCK_LATITUDE_DIFF_FIELD_SIZE) - 1)
14 #define LNG_GPS_SPEC_DIFF_MAX (uint64_t)(pow(2, _GPS_PARTIAL_LOCATION_BLOCK_LONGITUDE_DIFF_FIELD_SIZE) - 1)
15 #define ALT_GPS_SPEC_DIFF_MAX (uint32_t)(pow(2, _GPS_PARTIAL_LOCATION_BLOCK_ALTITUDE_DIFF_FIELD_SIZE) - 1)
16 #define TIME_GPS_SPEC_DIFF_MAX (uint64_t)(pow(2, _GPS_PARTIAL_LOCATION_BLOCK_TIME_DIFF_FIELD_SIZE) - 1)
17 
18 #define LAT_GPS_SPEC_MULTIPIER (double)(pow(10, 10))
19 #define LNG_GPS_SPEC_MULTIPIER (double)(pow(10, 10))
20 #define ALT_GPS_SPEC_MULTIPIER (double)(pow(10, 3))
21 
22 /* blocks from the GPS DATA FILE */
23 #define _GPS_HEADER_BLOCK_SIZE (16)
24 #define _GPS_COMPLETE_LOCATION_BLOCK_SIZE (32)
25 #define _GPS_PARTIAL_LOCATION_BLOCK_SIZE (16)
26 #define _GPS_COMMENT_BLOCK_SIZE (128)
27 #define _GPS_SUMMARY_BLOCK_SIZE (32)
28 #define _GPS_EMPTY_BLOCK_SIZE (8)
29 #define _GPS_DEFAULT_BLOCK_SIZE _GPS_COMPLETE_LOCATION_BLOCK_SIZE
30 
31 #define _GPS_BLOCK_IDENTITY_SIZE (4)
32 #define _GPS_ACCURACY_FIELD_SIZE (10)
33 #define _GPS_SIGN_FIELD_SIZE (1)
34 
35 /* block identities */
36 #define _GPS_HEADER_BLOCK_IDENTITY 0x50
37 #define _GPS_COMPLETE_LOCATION_BLOCK_IDENTITY 0xC0
38 #define _GPS_PARTIAL_LOCATION_BLOCK_IDENTITY 0x30
39 #define _GPS_COMMENT_BLOCK_IDENTITY 0x10
40 #define _GPS_SUMMARY_BLOCK_IDENTITY 0x80
41 #define _GPS_EMPTY_BLOCK_IDENTITY 0x00
42 
43 /* fields for the header block */
44 #define _GPS_HEADER_BLOCK_VERSION_FIELD_START (_GPS_BLOCK_IDENTITY_SIZE)
45 #define _GPS_HEADER_BLOCK_VERSION_FIELD_SIZE (4)
46 #define _GPS_HEADER_BLOCK_TEXT_FIELD_START (_GPS_HEADER_BLOCK_VERSION_FIELD_START + _GPS_HEADER_BLOCK_VERSION_FIELD_SIZE)
47 #define _GPS_HEADER_BLOCK_TEXT_FIELD_SIZE (104)
48 #define _GPS_HEADER_BLOCK_OPTIONS_FIELD_START (_GPS_HEADER_BLOCK_TEXT_FIELD_START + _GPS_HEADER_BLOCK_TEXT_FIELD_SIZE)
49 #define _GPS_HEADER_BLOCK_OPTIONS_FIELD_SIZE (8)
50 #define _GPS_HEADER_BLOCK_FUTURE_FIELD_START (_GPS_HEADER_BLOCK_OPTIONS_FIELD_START + _GPS_HEADER_BLOCK_OPTIONS_FIELD_SIZE)
51 #define _GPS_HEADER_BLOCK_FUTURE_FIELD_SIZE (8)
52 
53 /* fields for the complete location block */
54 #define _GPS_COMPLETE_LOCATION_BLOCK_TIME_FIELD_START (_GPS_BLOCK_IDENTITY_SIZE)
55 #define _GPS_COMPLETE_LOCATION_BLOCK_TIME_FIELD_SIZE (42)
56 #define _GPS_COMPLETE_LOCATION_BLOCK_LATITUDE_FIELD_START (_GPS_COMPLETE_LOCATION_BLOCK_TIME_FIELD_START + _GPS_COMPLETE_LOCATION_BLOCK_TIME_FIELD_SIZE)
57 #define _GPS_COMPLETE_LOCATION_BLOCK_LATITUDE_FIELD_SIZE (41)
58 #define _GPS_COMPLETE_LOCATION_BLOCK_LONGITUDE_FIELD_START (_GPS_COMPLETE_LOCATION_BLOCK_LATITUDE_FIELD_START + _GPS_COMPLETE_LOCATION_BLOCK_LATITUDE_FIELD_SIZE)
59 #define _GPS_COMPLETE_LOCATION_BLOCK_LONGITUDE_FIELD_SIZE (42)
60 #define _GPS_COMPLETE_LOCATION_BLOCK_ALTITUDE_FIELD_START (_GPS_COMPLETE_LOCATION_BLOCK_LONGITUDE_FIELD_START + _GPS_COMPLETE_LOCATION_BLOCK_LONGITUDE_FIELD_SIZE)
61 #define _GPS_COMPLETE_LOCATION_BLOCK_ALTITUDE_FIELD_SIZE (24)
62 #define _GPS_COMPLETE_LOCATION_BLOCK_ACCURACY_FIELD_START (_GPS_COMPLETE_LOCATION_BLOCK_ALTITUDE_FIELD_START + _GPS_COMPLETE_LOCATION_BLOCK_ALTITUDE_FIELD_SIZE)
63 #define _GPS_COMPLETE_LOCATION_BLOCK_ACCURACY_FIELD_SIZE (_GPS_ACCURACY_FIELD_SIZE)
64 #define _GPS_COMPLETE_LOCATION_BLOCK_FUTURE_FIELD_START (_GPS_COMPLETE_LOCATION_BLOCK_ACCURACY_FIELD_START + _GPS_COMPLETE_LOCATION_BLOCK_ACCURACY_FIELD_SIZE)
65 #define _GPS_COMPLETE_LOCATION_BLOCK_FUTURE_FIELD_SIZE (93)
66 
67 /* fields for the partial location block */
68 #define _GPS_PARTIAL_LOCATION_BLOCK_TIME_DIFF_FIELD_START (_GPS_BLOCK_IDENTITY_SIZE)
69 #define _GPS_PARTIAL_LOCATION_BLOCK_TIME_DIFF_FIELD_SIZE (16)
70 #define _GPS_PARTIAL_LOCATION_BLOCK_LATITUDE_SIGN_FIELD_START (_GPS_PARTIAL_LOCATION_BLOCK_TIME_DIFF_FIELD_START + _GPS_PARTIAL_LOCATION_BLOCK_TIME_DIFF_FIELD_SIZE)
71 #define _GPS_PARTIAL_LOCATION_BLOCK_LATITUDE_SIGN_FIELD_SIZE (_GPS_SIGN_FIELD_SIZE)
72 #define _GPS_PARTIAL_LOCATION_BLOCK_LATITUDE_DIFF_FIELD_START (_GPS_PARTIAL_LOCATION_BLOCK_LATITUDE_SIGN_FIELD_START + _GPS_PARTIAL_LOCATION_BLOCK_LATITUDE_SIGN_FIELD_SIZE)
73 #define _GPS_PARTIAL_LOCATION_BLOCK_LATITUDE_DIFF_FIELD_SIZE (24)
74 #define _GPS_PARTIAL_LOCATION_BLOCK_LONGITUDE_SIGN_FIELD_START (_GPS_PARTIAL_LOCATION_BLOCK_LATITUDE_DIFF_FIELD_START + _GPS_PARTIAL_LOCATION_BLOCK_LATITUDE_DIFF_FIELD_SIZE)
75 #define _GPS_PARTIAL_LOCATION_BLOCK_LONGITUDE_SIGN_FIELD_SIZE (_GPS_SIGN_FIELD_SIZE)
76 #define _GPS_PARTIAL_LOCATION_BLOCK_LONGITUDE_DIFF_FIELD_START (_GPS_PARTIAL_LOCATION_BLOCK_LONGITUDE_SIGN_FIELD_START + _GPS_PARTIAL_LOCATION_BLOCK_LONGITUDE_SIGN_FIELD_SIZE)
77 #define _GPS_PARTIAL_LOCATION_BLOCK_LONGITUDE_DIFF_FIELD_SIZE (25)
78 #define _GPS_PARTIAL_LOCATION_BLOCK_ALTITUDE_SIGN_FIELD_START (_GPS_PARTIAL_LOCATION_BLOCK_LONGITUDE_DIFF_FIELD_START + _GPS_PARTIAL_LOCATION_BLOCK_LONGITUDE_DIFF_FIELD_SIZE)
79 #define _GPS_PARTIAL_LOCATION_BLOCK_ALTITUDE_SIGN_FIELD_SIZE (_GPS_SIGN_FIELD_SIZE)
80 #define _GPS_PARTIAL_LOCATION_BLOCK_ALTITUDE_DIFF_FIELD_START (_GPS_PARTIAL_LOCATION_BLOCK_ALTITUDE_SIGN_FIELD_START + _GPS_PARTIAL_LOCATION_BLOCK_ALTITUDE_SIGN_FIELD_SIZE)
81 #define _GPS_PARTIAL_LOCATION_BLOCK_ALTITUDE_DIFF_FIELD_SIZE (14)
82 #define _GPS_PARTIAL_LOCATION_BLOCK_ACCURACY_FIELD_START (_GPS_PARTIAL_LOCATION_BLOCK_ALTITUDE_DIFF_FIELD_START + _GPS_PARTIAL_LOCATION_BLOCK_ALTITUDE_DIFF_FIELD_SIZE)
83 #define _GPS_PARTIAL_LOCATION_BLOCK_ACCURACY_FIELD_SIZE (_GPS_ACCURACY_FIELD_SIZE)
84 #define _GPS_PARTIAL_LOCATION_BLOCK_FUTURE_FIELD_START (_GPS_PARTIAL_LOCATION_BLOCK_ACCURACY_FIELD_START + _GPS_PARTIAL_LOCATION_BLOCK_ACCURACY_FIELD_SIZE)
85 #define _GPS_PARTIAL_LOCATION_BLOCK_FUTURE_FIELD_SIZE (32)
86 
87 /* fields for the summary block */
88 #define _GPS_SUMMARY_BLOCK_MODE_FIELD_START (_GPS_BLOCK_IDENTITY_SIZE)
89 #define _GPS_SUMMARY_BLOCK_MODE_FIELD_SIZE (2)
90 #define _GPS_SUMMARY_BLOCK_TOTAL_TIME_FIELD_START (_GPS_SUMMARY_BLOCK_MODE_FIELD_START + _GPS_SUMMARY_BLOCK_MODE_FIELD_SIZE)
91 #define _GPS_SUMMARY_BLOCK_TOTAL_TIME_FIELD_SIZE (17)
92 #define _GPS_SUMMARY_BLOCK_TRAVEL_TIME_FIELD_START (_GPS_SUMMARY_BLOCK_TOTAL_TIME_FIELD_START + _GPS_SUMMARY_BLOCK_TOTAL_TIME_FIELD_SIZE)
93 #define _GPS_SUMMARY_BLOCK_TRAVEL_TIME_FIELD_SIZE (17)
94 #define _GPS_SUMMARY_BLOCK_DISTANCE_FIELD_START (_GPS_SUMMARY_BLOCK_TRAVEL_TIME_FIELD_START + _GPS_SUMMARY_BLOCK_TRAVEL_TIME_FIELD_SIZE)
95 #define _GPS_SUMMARY_BLOCK_DISTANCE_FIELD_SIZE (20)
96 #define _GPS_SUMMARY_BLOCK_CLIMB_HEIGHT_FIELD_START (_GPS_SUMMARY_BLOCK_DISTANCE_FIELD_START + _GPS_SUMMARY_BLOCK_DISTANCE_FIELD_SIZE)
97 #define _GPS_SUMMARY_BLOCK_CLIMB_HEIGHT_FIELD_SIZE (18)
98 #define _GPS_SUMMARY_BLOCK_CLIMB_DISTANCE_FIELD_START (_GPS_SUMMARY_BLOCK_CLIMB_HEIGHT_FIELD_START + _GPS_SUMMARY_BLOCK_CLIMB_HEIGHT_FIELD_SIZE)
99 #define _GPS_SUMMARY_BLOCK_CLIMB_DISTANCE_FIELD_SIZE (20)
100 #define _GPS_SUMMARY_BLOCK_CLIMB_TOTAL_TIME_FIELD_START (_GPS_SUMMARY_BLOCK_CLIMB_DISTANCE_FIELD_START + _GPS_SUMMARY_BLOCK_CLIMB_DISTANCE_FIELD_SIZE)
101 #define _GPS_SUMMARY_BLOCK_CLIMB_TOTAL_TIME_FIELD_SIZE (17)
102 #define _GPS_SUMMARY_BLOCK_CLIMB_TRAVEL_TIME_FIELD_START (_GPS_SUMMARY_BLOCK_CLIMB_TOTAL_TIME_FIELD_START + _GPS_SUMMARY_BLOCK_CLIMB_TOTAL_TIME_FIELD_SIZE)
103 #define _GPS_SUMMARY_BLOCK_CLIMB_TRAVEL_TIME_FIELD_SIZE (17)
104 #define _GPS_SUMMARY_BLOCK_FUTURE_FIELD_START (_GPS_SUMMARY_BLOCK_CLIMB_TRAVEL_TIME_FIELD_START + _GPS_SUMMARY_BLOCK_CLIMB_TRAVEL_TIME_FIELD_SIZE)
105 #define _GPS_SUMMARY_BLOCK_FUTURE_FIELD_SIZE (124)
106 
107 /* fields for the comment block */
108 #define _GPS_COMMENT_BLOCK_COMMENT_FIELD_START (_GPS_BLOCK_IDENTITY_SIZE + 4)
109 #define _GPS_COMMENT_BLOCK_COMMENT_FIELD_SIZE (1016)
110 
111 /* some macro's that make life easy */
112 #ifndef MIN
113 # define MIN(a,b) (((a) < (b)) ? (a) : (b))
114 #endif
115 #ifndef MAX
116 # define MAX(a,b) (((a) > (b)) ? (a) : (b))
117 #endif
118 
119 /* some handsome macro's for reading and writing from and to bits */
120 #define GET_BYTE(a) ((a) / 8)
121 #define GET_BIT(a) (7 - ((a) % 8))
122 #define SHIFT(b, n) (((n) < 0) ? ((b) << (-(n))) : ((b) >> (n)))
123 #define GET_SHIFT(l, s, p) ((l) + (s) - (1) - (p))
124 
125 #endif /* X_GPS_DATA_FILE_H */