PUD: remove unneeded mutex on the position average list
[olsrd.git] / lib / pud / src / posAvg.h
1 #ifndef _PUD_POSAVG_H_
2 #define _PUD_POSAVG_H_
3
4 /* Plugin includes */
5
6 /* OLSR includes */
7
8 /* System includes */
9 #include <nmea/info.h>
10 #include <pthread.h>
11 #include <stdbool.h>
12
13 /** Stores an nmeaINFO entry, used in the averaging */
14 typedef struct _PositionUpdateEntry {
15                 nmeaINFO nmeaInfo; /**< the position information */
16 } PositionUpdateEntry;
17
18 /**
19  Counts the number of GPxxx based entries. Some parameters in nmeaINFO are
20  dependent on different GPxxx NMEA sentences. These counters are used to
21  determine which information would be valid for the average position.
22  Also counts the fix values.
23  */
24 typedef struct _PositionUpdateCounters {
25                 /* smask */
26                 unsigned long long gpgga; /**< the number of GPGGA based entries */
27                 unsigned long long gpgsa; /**< the number of GPGSA based entries */
28                 unsigned long long gpgsv; /**< the number of GPGSV based entries */
29                 unsigned long long gprmc; /**< the number of GPRMC based entries */
30                 unsigned long long gpvtg; /**< the number of GPVTG based entries */
31
32                 /* sig */
33                 unsigned long long sigBad; /**< the number of entries with a bad sig */
34                 unsigned long long sigLow; /**< the number of entries with a low sig */
35                 unsigned long long sigMid; /**< the number of entries with a mid sig */
36                 unsigned long long sigHigh; /**< the number of entries with a high sig */
37
38                 /* fix */
39                 unsigned long long fixBad; /**< the number of entries with a bad fix */
40                 unsigned long long fix2d; /**< the number of entries with a 2D fix */
41                 unsigned long long fix3d; /**< the number of entries with a 3D fix */
42 } PositionUpdateCounters;
43
44 /**
45  A list of position updates that are used to determine the average position.
46
47  The list uses 1 extra entry: when 5 entries have to be averaged then the list
48  will have 6 entries. The 6th entry is used for the incoming entry, so that
49  it is already in the list (together with the old entry that will be removed
50  from the average) and does not need to be copied into the list. This is for
51  better performance.
52
53  The list is a circular list.
54  This means that there is a gap/unused entry in the list between the
55  newest entry and the oldest entry, which is the 'incoming entry'.
56
57  Note that 'positionAverageCumulative' stores cumulative values for parameters
58  for which an average is calculated. The reason is to minimise the number of
59  calculations to be performed.
60  */
61 typedef struct _PositionAverageList {
62                 unsigned long long entriesMaxCount; /**< the maximum number of entries in the list */
63                 PositionUpdateEntry * entries; /**< the list entries */
64
65                 unsigned long long entriesCount; /**< the number of entries in the list */
66                 unsigned long long newestEntryIndex; /**< index of the newest entry in the list (zero-based) */
67                 PositionUpdateCounters counters; /**< the counters */
68
69                 PositionUpdateEntry positionAverageCumulative; /**< the average position with cumulative values */
70                 PositionUpdateEntry positionAverage; /**< the average position */
71 } PositionAverageList;
72
73 /**
74  Enumeration describing the type of an entry position in the average list
75  */
76 typedef enum _AverageEntryPositionType {
77         OLDEST, NEWEST, INCOMING, AVERAGECUMULATIVE, AVERAGE
78 } AverageEntryPositionType;
79
80 bool initPositionAverageList(PositionAverageList * positionAverageList,
81                 unsigned long long maxEntries);
82 void flushPositionAverageList(PositionAverageList * positionAverageList);
83 void destroyPositionAverageList(PositionAverageList * positionAverageList);
84
85 PositionUpdateEntry * getPositionAverageEntry(
86                 PositionAverageList * positionAverageList,
87                 AverageEntryPositionType positionType);
88
89 void addNewPositionToAverage(PositionAverageList * positionAverageList,
90                 PositionUpdateEntry * newEntry);
91
92 #endif /* _PUD_POSAVG_H_ */