GPS Library  0.1
GPS driver and NMEA parser
 All Classes Namespaces Files Functions Variables Typedefs Enumerator Friends Macros
GPSInfo.h
Go to the documentation of this file.
1 #ifndef __GPSINFO_H__
2 #define __GPSINFO_H__
3 
4 #include <Threads/Mutex.h>
5 #include <Filters/Analyze.h>
6 #include <GPS/Info/Pos3DRaw.h>
7 #include <Debug/Debug.h>
8 
9 class I_GPSDriver;
10 
11 namespace GPS
12 {
13  class GPSData;
14 }
15 
16 SYS_DECLARE_MODULE(DM_GPS);
17 
18 namespace GPS
19 {
20  class GPS_PosAnalyzer: public Filter::Analyze<Pos3Draw>
21  {
22  public:
23  GPS_PosAnalyzer(Filter::Group & gr):
24  Filter::Analyze<Pos3Draw>(gr)
25  {
26  }
27 
28  virtual void In(const Pos3Draw & data, Filter::filter_time_t time)
29  {
30  SYS_DEBUG_MEMBER(DM_GPS);
31  SYS_DEBUG(DL_INFO1, "Step size: " << data.Distance(state) << "m, time=" << time);
32  bool believable = data.Distance(state) < 150.0 && time < 15.0 && time > 0.05;
33  Filter::Analyze<Pos3Draw>::In(data, time);
34  if (!believable)
35  ResetRecursive();
36  }
37 
38  private:
39  SYS_DEFINE_CLASS_NAME("GPS_PosAnalyzer");
40  };
41 
42  class Time
43  {
44  public:
45  Time(void)
46  {
47  }
48 
49  Time(float s, int m, int h, int d = 0):
50  day(d),
51  hour(h),
52  minute(m),
53  second(s)
54  {
55  }
56 
57  virtual ~Time()
58  {
59  }
60 
61  int GetDay(void) const { return day; }
62  int GetHour(void) const { return hour; }
63  int GetMinute(void) const { return minute; }
64  float GetSecond(void) const { return second; }
65  int ToMillisecond(void) const;
66  Time & operator-=(const Time & other);
67  Time & operator+=(const Time & other);
68 
69  Time operator-(const Time & other) const
70  {
71  Time result(*this);
72  return result -= other;
73  }
74 
75  Time operator+(const Time & other) const
76  {
77  Time result(*this);
78  return result += other;
79  }
80 
81  protected:
82  int day; // Only for overflow handling
83  int hour;
84  int minute;
85  float second;
86 
87  private:
88  SYS_DEFINE_CLASS_NAME("GPS::Time");
89  };
90 
91  class Date
92  {
93  public:
94  Date(void)
95  {
96  }
97 
98  virtual ~Date()
99  {
100  }
101 
102  int GetYear(void) const { return year; }
103  int GetMonth(void) const { return month; }
104  float GetDay(void) const { return day; }
105 
106  protected:
107  int year;
108  int month;
109  int day;
110 
111  private:
112  SYS_DEFINE_CLASS_NAME("GPS::Date");
113  };
114 
115  class GPSInfo
116  {
117  public:
118  GPSInfo(GPS::GPSData & parent);
119 
120  void GotNewPosition(const Time & gps_time, I_GPSDriver * driver = nullptr);
121 
122  template <class C>
123  void GotMessage(const C & msg, I_GPSDriver * driver = nullptr);
124 
125  Pos3Draw GetExtrapolatedPosition(Filter::filter_time_t delta_time)
126  {
127  Lock _lock(this);
128  return analyzer.OutAt(delta_time);
129  }
130 
132 
134 
136 
137  class Lock: public Threads::Lock
138  {
139  public:
140  Lock(GPSInfo & parent):
141  Threads::Lock(parent.dataMutex)
142  {
143  }
144 
145  Lock(GPSInfo * parent):
146  Threads::Lock(parent->dataMutex)
147  {
148  }
149 
151  {
152  }
153  };
154 
155  friend class Lock;
156 
157  protected:
158  enum {
160  };
161 
163 
164  Filter::Group filters;
165 
167 
169 
170  typedef Filter::I_Filter<GPS::Pos3Draw> MyFilter;
171 
173  {
174  return analyzer;
175  }
176 
177  private:
178  SYS_DEFINE_CLASS_NAME("GPS::GPSInfo");
179 
181 
183 
190 
191  Threads::Mutex dataMutex;
192  };
193 }
194 
195 std::ostream & operator<<(std::ostream & os, const GPS::Time & time);
196 std::ostream & operator<<(std::ostream & os, const GPS::Date & date);
197 
198 #endif /* __GPSINFO_H__ */
199 
200 /* * * * * * * * * * * * * End - of - File * * * * * * * * * * * * * * */