PUD: add plugin
[olsrd.git] / lib / pud / src / wireFormat.h
1 #ifndef _PUD_WIREFORMAT_H_
2 #define _PUD_WIREFORMAT_H_
3
4 /* Plugin includes */
5
6 /* OLSR includes */
7
8 /* System includes */
9 #include <stdint.h>
10
11 /*
12  * Version
13  */
14
15 /** The version of the wire format */
16 #define PUD_WIRE_FORMAT_VERSION         0
17
18 /** The version of the transmit sentence */
19 #define PUD_TX_SENTENCE_VERSION         0
20
21 /*
22  * Flags
23  * We use the smask of nmeaINFO and the flags below on top of that
24  */
25
26 /** Flags that the GPS information contains the nodeId */
27 #define PUD_FLAGS_ID                            0x80
28
29 /*
30  * Time
31  */
32
33 /** The number of bits for the time field */
34 #define PUD_TIME_BITS                           17
35
36 /*
37  * Latitude
38  */
39
40 /** The number of bits for the latitude field */
41 #define PUD_LATITUDE_BITS                       28
42
43 /** The maximum size of the string representation of the latitude
44  * sign [0,90] [0,59] dot [0,59] [0,999] */
45 #define PUD_TX_LATITUDE_DIGITS          (1 + 2 + 2 + 1 + 2 + 3)
46
47 /** The number of decimals of the latitude in the transmit sentence */
48 #define PUD_TX_LATITUDE_DECIMALS        "5"
49
50 /*
51  * Longitude
52  */
53
54 /** The number of bits for the longitude field */
55 #define PUD_LONGITUDE_BITS                      27
56
57 /** The maximum size of the string representation of the longitude
58  * sign [0,180] [0,59] dot [0,59] [0,999] */
59 #define PUD_TX_LONGITUDE_DIGITS         (1 + 3 + 2 + 1 + 2 + 3)
60
61 /** The number of decimals of the longitude in the transmit sentence */
62 #define PUD_TX_LONGITUDE_DECIMALS       "5"
63
64 /*
65  * Altitude
66  */
67
68 /** The number of bits for the altitude field */
69 #define PUD_ALTITUDE_BITS                       16
70
71 /** The minimum altitude */
72 #define PUD_ALTITUDE_MIN                        (-400)
73
74 /** The maximum altitude */
75 #define PUD_ALTITUDE_MAX        (((1 << PUD_ALTITUDE_BITS) - 1) + PUD_ALTITUDE_MIN)
76
77 /** The maximum size of the string representation of the altitude */
78 #define PUD_TX_ALTITUDE_DIGITS          6
79
80 /*
81  * Speed
82  */
83
84 /** The number of bits for the speed field */
85 #define PUD_SPEED_BITS                          12
86
87 /** The maximum speed value */
88 #define PUD_SPEED_MAX                           ((1 << PUD_SPEED_BITS) - 1)
89
90 /** The maximum size of the string representation of the speed */
91 #define PUD_TX_SPEED_DIGITS                     4
92
93 /*
94  * Track
95  */
96
97 /** The number of bits for the track angle field */
98 #define PUD_TRACK_BITS                          9
99
100 /** The maximum size of the string representation of the track angle */
101 #define PUD_TX_TRACK_DIGITS                     3
102
103 /*
104  * HDOP
105  */
106
107 /** The number of bits for the HDOP field */
108 #define PUD_HDOP_BITS                           11
109
110 /** The HDOP resolution (in m) */
111 #define PUD_HDOP_RESOLUTION                     (0.1)
112
113 /** The maximum HDOP value (in m) */
114 #define PUD_HDOP_MAX            (((1 << PUD_HDOP_BITS) - 1) * PUD_HDOP_RESOLUTION)
115
116 /** The maximum size of the string representation of the HDOP */
117 #define PUD_TX_HDOP_DIGITS                      5
118
119 /** The number of decimals of the HDOP in the transmit sentence */
120 #define PUD_TX_HDOP_DECIMALS            "3"
121
122 /*
123  * Node ID Type
124  */
125
126 /** The maximum size of the string representation of the nodeIdType */
127 #define PUD_TX_NODEIDTYPE_DIGITS        3
128
129 /*
130  * Node ID
131  */
132
133 /** The maximum size of the string representation of the nodeId */
134 #define PUD_TX_NODEID_BUFFERSIZE        1023
135
136 /*
137  * Wire Format Structures
138  */
139
140 /** Sub-format GPS information, 120 bits = 15 bytes */
141 typedef struct {
142                 uint32_t time :PUD_TIME_BITS; /**< the number of seconds since midnight, ALWAYS present */
143                 uint32_t lat :PUD_LATITUDE_BITS; /**< latitude */
144                 uint32_t lon :PUD_LONGITUDE_BITS; /**< longitude */
145                 uint32_t alt :PUD_ALTITUDE_BITS; /**< altitude */
146                 uint32_t speed :PUD_SPEED_BITS; /**< speed */
147                 uint32_t track :PUD_TRACK_BITS; /**< track angle */
148                 uint32_t hdop :PUD_HDOP_BITS; /**< HDOP */
149 }__attribute__((__packed__)) GpsInfo;
150
151 /** Sub-format Node information, 8 + variable bits = 1 + variable bytes */
152 typedef struct {
153                 uint8_t nodeIdType; /**< the nodeIdType */
154                 unsigned char nodeId; /**< placeholder for variable length nodeId string */
155 }__attribute__((__packed__)) NodeInfo;
156
157 /** Complete format, 8+8+8+120+(8+variable) bits =  18+(1+variable) bytes*/
158 typedef struct {
159                 uint8_t version; /**< the version of the sentence */
160                 uint8_t validityTime; /**< the validity time of the sentence */
161                 uint8_t smask; /**< mask signaling the contents of the sentence */
162                 GpsInfo gpsInfo; /**< the GPS information (MANDATORY) */
163                 NodeInfo nodeInfo; /**< placeholder for node information (OPTIONAL) */
164 }__attribute__((__packed__)) PudOlsrWireFormat;
165
166 /** The size of the wire format, minus the size of the node information */
167 #define PUD_OLSRWIREFORMATSIZE (sizeof(PudOlsrWireFormat) - sizeof(NodeInfo))
168
169 #endif /* _PUD_WIREFORMAT_H_ */