6ed184f50af03439b4332074aea65958a4cd0f0a
[olsrd.git] / lib / pud / src / wireFormat.h
1 #ifndef _PUD_WIREFORMAT_H_
2 #define _PUD_WIREFORMAT_H_
3
4 /* System includes */
5 #include <stdint.h>
6 #include <time.h>
7
8 /*
9  * Version
10  */
11
12 /** The version of the wire format */
13 #define PUD_WIRE_FORMAT_VERSION         0
14
15 /*
16  * Flags
17  * We use the smask of nmeaINFO and the flags below on top of that
18  */
19
20 /** Flags that the GPS information contains the nodeId */
21 #define PUD_FLAGS_ID                            0x80
22
23 /*
24  * Time
25  */
26
27 /** The number of bits for the time field */
28 #define PUD_TIME_BITS                           17
29
30 /*
31  * Latitude
32  */
33
34 /** The number of bits for the latitude field */
35 #define PUD_LATITUDE_BITS                       28
36
37 /** The maximum size of the string representation of the latitude
38  * sign [0,90] [0,59] dot [0,59] [0,999] */
39 #define PUD_TX_LATITUDE_DIGITS          (1 + 2 + 2 + 1 + 2 + 3)
40
41 /** The number of decimals of the latitude in the transmit sentence */
42 #define PUD_TX_LATITUDE_DECIMALS        "5"
43
44 /*
45  * Longitude
46  */
47
48 /** The number of bits for the longitude field */
49 #define PUD_LONGITUDE_BITS                      27
50
51 /** The maximum size of the string representation of the longitude
52  * sign [0,180] [0,59] dot [0,59] [0,999] */
53 #define PUD_TX_LONGITUDE_DIGITS         (1 + 3 + 2 + 1 + 2 + 3)
54
55 /** The number of decimals of the longitude in the transmit sentence */
56 #define PUD_TX_LONGITUDE_DECIMALS       "5"
57
58 /*
59  * Altitude
60  */
61
62 /** The number of bits for the altitude field */
63 #define PUD_ALTITUDE_BITS                       16
64
65 /** The minimum altitude */
66 #define PUD_ALTITUDE_MIN                        (-400)
67
68 /** The maximum altitude */
69 #define PUD_ALTITUDE_MAX        (((1 << PUD_ALTITUDE_BITS) - 1) + PUD_ALTITUDE_MIN)
70
71 /** The maximum size of the string representation of the altitude */
72 #define PUD_TX_ALTITUDE_DIGITS          6
73
74 /*
75  * Speed
76  */
77
78 /** The number of bits for the speed field */
79 #define PUD_SPEED_BITS                          12
80
81 /** The maximum speed value */
82 #define PUD_SPEED_MAX                           ((1 << PUD_SPEED_BITS) - 1)
83
84 /** The maximum size of the string representation of the speed */
85 #define PUD_TX_SPEED_DIGITS                     4
86
87 /*
88  * Track
89  */
90
91 /** The number of bits for the track angle field */
92 #define PUD_TRACK_BITS                          9
93
94 /** The maximum size of the string representation of the track angle */
95 #define PUD_TX_TRACK_DIGITS                     3
96
97 /*
98  * HDOP
99  */
100
101 /** The number of bits for the HDOP field */
102 #define PUD_HDOP_BITS                           11
103
104 /** The HDOP resolution (in m) */
105 #define PUD_HDOP_RESOLUTION                     (0.1)
106
107 /** The maximum HDOP value (in m) */
108 #define PUD_HDOP_MAX            (((1 << PUD_HDOP_BITS) - 1) * PUD_HDOP_RESOLUTION)
109
110 /** The maximum size of the string representation of the HDOP */
111 #define PUD_TX_HDOP_DIGITS                      5
112
113 /** The number of decimals of the HDOP in the transmit sentence */
114 #define PUD_TX_HDOP_DECIMALS            "3"
115
116 /*
117  * Node ID Type
118  */
119
120 /** nodeIdType legal values */
121 typedef enum _NodeIdType {
122         /** MAC address, 48 bits, 6 bytes */
123         PUD_NODEIDTYPE_MAC = 0,
124
125         /** MSISDN number, 15 digits, 50 bits, 7 bytes */
126         PUD_NODEIDTYPE_MSISDN = 1,
127
128         /** TETRA number, 17 digits, 57 bits, 8 bytes */
129         PUD_NODEIDTYPE_TETRA = 2,
130
131         /** DNS name, variable length */
132         PUD_NODEIDTYPE_DNS = 3,
133
134         /** IPv4 address, 32 bits, 4 bytes */
135         PUD_NODEIDTYPE_IPV4 = 4,
136
137         /** IPv6 address, 128 bits, 16 bytes */
138         PUD_NODEIDTYPE_IPV6 = 6,
139
140         /** Brandweer number, 7 digits, 24 bits, 3 bytes */
141         PUD_NODEIDTYPE_192 = 192,
142
143         /** Ambulance number, 6 digits, 20 bits, 3 bytes */
144         PUD_NODEIDTYPE_193 = 193,
145
146         /** Number in the range [1, 8191], 4 digits, 13 bits, 2 bytes */
147         PUD_NODEIDTYPE_194 = 194
148 } NodeIdType;
149
150 /** The maximum size of the string representation of the nodeIdType */
151 #define PUD_TX_NODEIDTYPE_DIGITS        3
152
153 /*
154  * Node ID
155  */
156
157 /** The maximum size of the string representation of the nodeId */
158 #define PUD_TX_NODEID_BUFFERSIZE        1023
159
160 /*
161  * Wire Format Structures
162  */
163
164 /** Sub-format GPS information, 120 bits = 15 bytes */
165 typedef struct _GpsInfo {
166                 uint32_t time :PUD_TIME_BITS; /**< the number of seconds since midnight, ALWAYS present */
167                 uint32_t lat :PUD_LATITUDE_BITS; /**< latitude */
168                 uint32_t lon :PUD_LONGITUDE_BITS; /**< longitude */
169                 uint32_t alt :PUD_ALTITUDE_BITS; /**< altitude */
170                 uint32_t speed :PUD_SPEED_BITS; /**< speed */
171                 uint32_t track :PUD_TRACK_BITS; /**< track angle */
172                 uint32_t hdop :PUD_HDOP_BITS; /**< HDOP */
173 }__attribute__((__packed__)) GpsInfo;
174
175 /** Sub-format Node information, 8 + variable bits = 1 + variable bytes */
176 typedef struct _NodeInfo {
177                 uint8_t nodeIdType; /**< the nodeIdType */
178                 unsigned char nodeId; /**< placeholder for variable length nodeId string */
179 }__attribute__((__packed__)) NodeInfo;
180
181 /** Complete format, 8+8+8+120+(8+variable) bits =  18+(1+variable) bytes*/
182 typedef struct _PudOlsrWireFormat {
183                 uint8_t version; /**< the version of the sentence */
184                 uint8_t validityTime; /**< the validity time of the sentence */
185                 uint8_t smask; /**< mask signaling the contents of the sentence */
186                 GpsInfo gpsInfo; /**< the GPS information (MANDATORY) */
187                 NodeInfo nodeInfo; /**< placeholder for node information (OPTIONAL) */
188 }__attribute__((__packed__)) PudOlsrWireFormat;
189
190 /** The size of the wire format, minus the size of the node information */
191 #define PUD_OLSRWIREFORMATSIZE (sizeof(PudOlsrWireFormat) - sizeof(NodeInfo))
192
193 /* ************************************************************************
194  * FUNCTIONS
195  * ************************************************************************ */
196
197 unsigned char getValidityTimeForOlsr(unsigned long long validityTime);
198 unsigned long getValidityTimeFromOlsr(unsigned char internal);
199
200 unsigned long getTimeForOlsr(int hour, int min, int sec);
201 void getTimeFromOlsr(uint32_t olsrTime, struct tm *nowStruct);
202
203 unsigned long getLatitudeForOlsr(double infoLat);
204 double getLatitudeFromOlsr(uint32_t olsrLat);
205
206 unsigned long getLongitudeForOlsr(double infoLon);
207 double getLongitudeFromOlsr(uint32_t olsrLon);
208
209 long getAltitudeForOlsr(double infoElv);
210 long getAltitudeFromOlsr(uint32_t olsrAlt);
211
212 long getSpeedForOlsr(double infoSpeed);
213 unsigned long getSpeedFromOlsr(uint32_t olsrSpeed);
214
215 long getTrackForOlsr(double infoTrack);
216 unsigned long getTrackFromOlsr(uint32_t olsrTrack);
217
218 long getHdopForOlsr(double infoHdop);
219 double getHdopFromOlsr(uint32_t olsrHdop);
220
221 #endif /* _PUD_WIREFORMAT_H_ */