Merge branch 'PolynomialDivision-feature/add_workflow'
[olsrd.git] / lib / pud / src / posAvg.h
1 /*
2  * The olsr.org Optimized Link-State Routing daemon (olsrd)
3  *
4  * (c) by the OLSR project
5  *
6  * See our Git repository to find out who worked on this file
7  * and thus is a copyright holder on it.
8  *
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  *
15  * * Redistributions of source code must retain the above copyright
16  *   notice, this list of conditions and the following disclaimer.
17  * * Redistributions in binary form must reproduce the above copyright
18  *   notice, this list of conditions and the following disclaimer in
19  *   the documentation and/or other materials provided with the
20  *   distribution.
21  * * Neither the name of olsr.org, olsrd nor the names of its
22  *   contributors may be used to endorse or promote products derived
23  *   from this software without specific prior written permission.
24  *
25  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
28  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
29  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
30  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
31  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
32  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
33  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
35  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36  * POSSIBILITY OF SUCH DAMAGE.
37  *
38  * Visit http://www.olsr.org for more information.
39  *
40  * If you find this software useful feel free to make a donation
41  * to the project. For more information see the website or contact
42  * the copyright holders.
43  *
44  */
45
46 #ifndef _PUD_POSAVG_H_
47 #define _PUD_POSAVG_H_
48
49 /* Plugin includes */
50
51 /* OLSR includes */
52
53 /* System includes */
54 #include <nmealib/info.h>
55 #include <stdbool.h>
56
57 /** Stores angle components */
58 typedef struct _AngleComponents {
59                 double x; /**< cos of the angle (in radians) */
60                 double y; /**< sin of the angle (in radians) */
61 } AngleComponents;
62
63 /** Stores an nmeaINFO entry, used in the averaging */
64 typedef struct _PositionUpdateEntry {
65                 NmeaInfo nmeaInfo; /**< the position information */
66
67                 /* used for averaging of angles */
68                 AngleComponents track; /**< the track angle components */
69                 AngleComponents mtrack; /**< the mtrack angle components */
70                 AngleComponents magvar; /**< the magvar angle components */
71 } PositionUpdateEntry;
72
73 /**
74  Counts the number of GPxxx based entries. Some parameters in nmeaINFO are
75  dependent on different GPxxx NMEA sentences. These counters are used to
76  determine which information would be valid for the average position.
77  Also counts the fix values.
78  */
79 typedef struct _PositionUpdateCounters {
80                 /* present */
81                 unsigned long long smask; /**< the number of entries with SMASK present */
82                 unsigned long long utcdate; /**< the number of entries with UTCDATE present */
83                 unsigned long long utctime; /**< the number of entries with UTCTIME present */
84                 unsigned long long sig; /**< the number of entries with SIG present */
85                 unsigned long long fix; /**< the number of entries with FIX present */
86                 unsigned long long pdop; /**< the number of entries with PDOP present */
87                 unsigned long long hdop; /**< the number of entries with HDOP present */
88                 unsigned long long vdop; /**< the number of entries with VDOP present */
89                 unsigned long long lat; /**< the number of entries with LAT present */
90                 unsigned long long lon; /**< the number of entries with LON present */
91                 unsigned long long elv; /**< the number of entries with ELV present */
92                 unsigned long long speed; /**< the number of entries with SPEED present */
93                 unsigned long long track; /**< the number of entries with TRACK present */
94                 unsigned long long mtrack; /**< the number of entries with MTRACK present */
95                 unsigned long long magvar; /**< the number of entries with MAGVAR present */
96                 unsigned long long satinusecount; /**< the number of entries with SATINUSECOUNT present */
97                 unsigned long long satinuse; /**< the number of entries with SATINUSE present */
98                 unsigned long long satinviewcount; /**< the number of entries with SATINVIEWCOUNT present */
99                 unsigned long long satinview; /**< the number of entries with SATINVIEW present */
100                 unsigned long long height; /**< the number of entries with HEIGHT present */
101                 unsigned long long dgpsage; /**< the number of entries with DGPSAGE present */
102                 unsigned long long dgpssid; /**< the number of entries with DGPSSID present */
103
104                 /* smask */
105                 unsigned long long gpgga; /**< the number of GPGGA based entries */
106                 unsigned long long gpgsa; /**< the number of GPGSA based entries */
107                 unsigned long long gpgsv; /**< the number of GPGSV based entries */
108                 unsigned long long gprmc; /**< the number of GPRMC based entries */
109                 unsigned long long gpvtg; /**< the number of GPVTG based entries */
110
111                 /* sig */
112                 unsigned long long sigBad; /**< the number of entries with a bad sig */
113                 unsigned long long sigLow; /**< the number of entries with a low sig */
114                 unsigned long long sigMid; /**< the number of entries with a mid sig */
115                 unsigned long long sigHigh; /**< the number of entries with a high sig */
116
117                 /* fix */
118                 unsigned long long fixBad; /**< the number of entries with a bad fix */
119                 unsigned long long fix2d; /**< the number of entries with a 2D fix */
120                 unsigned long long fix3d; /**< the number of entries with a 3D fix */
121 } PositionUpdateCounters;
122
123 /**
124  A list of position updates that are used to determine the average position.
125
126  The list uses 1 extra entry: when 5 entries have to be averaged then the list
127  will have 6 entries. The 6th entry is used for the incoming entry, so that
128  it is already in the list (together with the old entry that will be removed
129  from the average) and does not need to be copied into the list. This is for
130  better performance.
131
132  The list is a circular list.
133  This means that there is a gap/unused entry in the list between the
134  newest entry and the oldest entry, which is the 'incoming entry'.
135
136  Note that 'positionAverageCumulative' stores cumulative values for parameters
137  for which an average is calculated. The reason is to minimise the number of
138  calculations to be performed.
139  */
140 typedef struct _PositionAverageList {
141                 unsigned long long entriesMaxCount; /**< the maximum number of entries in the list */
142                 PositionUpdateEntry * entries; /**< the list entries */
143
144                 unsigned long long entriesCount; /**< the number of entries in the list */
145                 unsigned long long newestEntryIndex; /**< index of the newest entry in the list (zero-based) */
146                 PositionUpdateCounters counters; /**< the counters */
147
148                 PositionUpdateEntry positionAverageCumulative; /**< the average position with cumulative values */
149                 PositionUpdateEntry positionAverage; /**< the average position */
150 } PositionAverageList;
151
152 /**
153  Enumeration describing the type of an entry position in the average list
154  */
155 typedef enum _AverageEntryPositionType {
156         OLDEST, NEWEST, INCOMING, AVERAGECUMULATIVE, AVERAGE
157 } AverageEntryPositionType;
158
159 bool initPositionAverageList(PositionAverageList * positionAverageList,
160                 unsigned long long maxEntries);
161 void flushPositionAverageList(PositionAverageList * positionAverageList);
162 void destroyPositionAverageList(PositionAverageList * positionAverageList);
163
164 PositionUpdateEntry * getPositionAverageEntry(
165                 PositionAverageList * positionAverageList,
166                 AverageEntryPositionType positionType);
167
168 void addNewPositionToAverage(PositionAverageList * positionAverageList,
169                 PositionUpdateEntry * newEntry);
170
171 #endif /* _PUD_POSAVG_H_ */