Some bugs fixed.
[gpssportsniffer] / track.h
1 /****************************************************************************
2 **
3 **  Copyright (C) 2011  Tito Eritja Real <jtitoo@gmail.com>
4 **
5 **  This program is free software: you can redistribute it and/or modify
6 **  it under the terms of the GNU General Public License as published by
7 **  the Free Software Foundation, either version 3 of the License, or
8 **  (at your option) any later version.
9 **
10 **  This program is distributed in the hope that it will be useful,
11 **  but WITHOUT ANY WARRANTY; without even the implied warranty of
12 **  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 **  GNU General Public License for more details.
14 **
15 **  You should have received a copy of the GNU General Public License
16 **  along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 **
18 ****************************************************************************/
19
20 #ifndef TRACK_H
21 #define TRACK_H
22
23 #include <QList>
24 #include <QDateTime>
25 #include <QTime>
26 #include "constants.h"
27
28 class QXmlStreamWriter;
29 class GpsPoint;
30 class QXmlStreamReader;
31
32
33 class Summarized{
34
35 protected:
36
37     int numPoints;
38     double minLatitude;
39     double maxLatitude;
40     double minLongitude;
41     double maxLongitude;
42     int gpsInterval;
43     QDateTime startTime;
44     QDateTime endTime;
45     double duration;
46     double distance;
47     double avgSpeed;
48     double maxSpeed;
49     double elevationGain;
50     double elevationLoss;
51     double minElevation;
52     double maxElevation;
53     double lastElevation;
54     double lastElevationAccuracy;
55     double avgPace;
56     double bestPace;
57
58 public:
59
60     explicit Summarized();
61     //virtual ~Summarized();
62
63     /*
64     inline double getDuration(){return duration;}
65     inline double getDistance(){return distance;}
66     inline double getAvgSpeed(){return avgSpeed;}
67     inline double getMaxSpeed(){return maxSpeed;}
68     inline double getElevationGain(){return elevationGain;}
69     inline double getElevationLoss(){return elevationLoss;}
70     inline double getMinElevation(){return minElevation;}
71     inline double getMaxElevation(){return maxelevation;}
72     inline double getAvgPace(){return avgPace;}
73     inline double getBestPace(){return bestPace;}
74     */
75
76     void addSummary(Summarized summary);
77     Summarized& account(GpsPoint point);
78     Summarized& account(GpsPoint first, GpsPoint last);
79
80     inline int getNumPoints(){return numPoints;}
81     inline void setNumPoints(int p){numPoints=p;}
82
83     inline double getMinLatitude(){return minLatitude;}
84     inline void setMinLatitude(double latitude){minLatitude=latitude;}
85
86     inline double getMaxLatitude(){return maxLatitude;}
87     inline void setMaxLatitude(double latitude){maxLatitude=latitude;}
88
89     inline double getMinLongitude(){return minLongitude;}
90     inline void setMinLongitude(double longitude){minLongitude=longitude;}
91
92     inline double getMaxLongitude(){return maxLongitude;}
93     inline void setMaxLongitude(double longitude){maxLongitude=longitude;}
94
95     inline int getGpsInterval(){return gpsInterval;}
96     inline void setGpsInterval(int interval){gpsInterval=interval;}
97
98     inline QDateTime getStartTime(){return startTime;}
99     inline void setStartTime(QDateTime time){startTime=time;}
100
101     inline QDateTime getEndTime(){return endTime;}
102     inline void setEndTime(QDateTime time){endTime=time;}
103
104     inline double getDuration(){return duration;}
105     inline void setDuration(double duration_p){duration=duration_p;}
106
107     inline double getDistance(){return distance;}
108     inline void setDistance(double distance_p){distance=distance_p;}
109
110     inline int getAvgSpeed(){return avgSpeed;}
111     inline void setAvgSpeed(int speed){avgSpeed=speed;}
112
113     inline int getMaxSpeed(){return maxSpeed;}
114     inline void setMaxSpeed(int speed){maxSpeed=speed;}
115
116     inline double getElevationGain(){return elevationGain;}
117     inline void setElevationGain(double elevation){elevationGain=elevation;}
118
119     inline double getElevationLoss(){return elevationLoss;}
120     inline void setElevationLoss(double elevation){elevationLoss=elevation;}
121
122     inline double getMinElevation(){return minElevation;}
123     inline void setMinElevation(double elevation){minElevation=elevation;}
124
125     inline double getMaxElevation(){return maxElevation;}
126     inline void setMaxElevation(double elevation){maxElevation=elevation;}
127
128     inline double getLastElevation(){return lastElevation;}
129     inline void setLastElevation(double elevation){lastElevation=elevation;}
130
131     inline double getLastElevationAccuracy(){return lastElevationAccuracy;}
132     inline void setLastElevationAccuracy(double elevation){lastElevationAccuracy=elevation;}
133
134     inline int getAvgPace(){return avgPace;}
135     inline void setAvgPace(int time){avgPace=time;}
136
137     inline int getBestPace(){return bestPace;}
138     inline void setBestPace(int time){bestPace=time;}
139     QString toSumString();
140 };
141
142
143 class GpsPoint{
144
145 private:
146     double latitude;
147     double longitude;
148     double elevation;
149
150     QDateTime time;
151     double speed;
152     double direction;
153     double magneticVariation;
154     double horizontalAccuracy;
155     double verticalAccuracy;
156     double distancePrev;
157     QTime timeToPrev;
158 public:
159     explicit GpsPoint(double latitude, double longitude, double elevation);
160     explicit GpsPoint(double latitude, double longitude, double elevation,QDateTime time, double speed,
161                       double direction, double magneticVariation,double horizontalAccuracy, double verticalAccuracy);
162     explicit GpsPoint(double latitude, double longitude, double elevation,QDateTime time, double speed,
163                       double direction, double magneticVariation,double horizontalAccuracy, double verticalAccuracy, double distancePrev, QTime timeToPrev);
164
165     //virtual ~GpsPoint();
166
167     inline double getLatitude(){return latitude;}
168     inline void setLatitude(double lat){latitude=lat;}
169
170     inline double getLongitude(){return longitude;}
171     inline void setLongitude(double longitude_p){longitude=longitude_p;}
172
173     inline double getElevation(){return elevation;}
174     inline void setElevation(double elevation_p){elevation=elevation_p;}
175
176     inline QDateTime getTime(){return time;}
177     inline void setTime(QDateTime time_p){time=time_p;}
178
179     inline double getSpeed(){return speed;}
180     inline void setSpeed(double speed_p){speed=speed_p;}
181
182     inline double getDirection(){return direction;}
183     inline void setDirection(double direction_p){direction=direction_p;}
184
185     inline double getMagneticVariation(){return magneticVariation;}
186     inline void setMagneticVariation(double magneticVariation_p){magneticVariation=magneticVariation_p;}
187
188     inline double getHorizontalAccuracy(){return horizontalAccuracy;}
189     inline void setHorizontalAccuracy(double horizontalAccuracy_p){horizontalAccuracy=horizontalAccuracy_p;}
190
191     inline double getVerticalAccuracy(){return verticalAccuracy;}
192     inline void setVerticalAccuracy(double verticalAccuracy_p){verticalAccuracy=verticalAccuracy_p;}
193
194     inline double getDistancePrev(){return distancePrev;}
195     inline void setDistancePrev(double distance){distancePrev=distance;}
196
197     QString toString();
198
199     GpsPoint& operator= (const GpsPoint&);
200
201     friend int operator== (const GpsPoint&, const GpsPoint&);
202     friend int operator!= (const GpsPoint&, const GpsPoint&);
203     friend QDataStream& operator<< (QDataStream&, const GpsPoint&);
204
205     double distance(GpsPoint p);
206
207 };
208
209 class Lap: public Summarized{
210
211 private:
212     int number;
213     QList<GpsPoint*> points;
214
215 public:
216
217     explicit Lap(int number);
218     virtual ~Lap();
219
220     inline int getNumber(){return number;}
221     inline void setNumber(int number_p){number=number_p;}
222
223     Summarized* addPoint(GpsPoint* point);
224     inline QList<GpsPoint*> getPoints(){return points;}
225     QString toString();
226
227 };
228
229 class Activity: public Summarized{
230
231 private:
232     QString sport;
233     int numLaps;
234     QDateTime id;
235     QList<Lap*> laps;
236
237 public:
238
239     explicit Activity(QString sport);
240     virtual ~Activity();
241
242     inline QDateTime getId(){return id;}
243     inline void setId(QDateTime time){id=time;}
244
245     inline QString getSport(){return sport;}
246     inline void setSport(QString sport_p){sport=sport_p;}
247
248     inline int getNumLaps(){return numLaps;}
249     inline void setNumLaps(int laps){numLaps=laps;}
250
251     void addLap();
252     Summarized* addPoint(GpsPoint* point);
253
254     inline QList<Lap*> getLaps(){return laps;}
255     QString toString();
256 };
257
258
259 class Track:public Summarized
260 {
261
262 private:
263
264     QString fileName;
265     QString name;
266     int numActivities;
267     QList<Activity*> activities;
268
269     double minLat;
270     double minLong;
271     double maxLat;
272     double maxLong;
273
274
275     void writeTCXCourses(QXmlStreamWriter* xmlWriter);
276     void writeTCXCourse(QXmlStreamWriter* xmlWriter, Activity* act);
277     void writeTCXLap(QXmlStreamWriter* xmlWriter, Lap* lap);
278     void writeTCXPoint(QXmlStreamWriter* xmlWriter, GpsPoint* point);
279     void writeGPXTracks(QXmlStreamWriter* xmlWriter);
280     void writeGPXTrack(QXmlStreamWriter* xmlWriter, Activity* act);
281     void writeGPXPoint(QXmlStreamWriter* xmlWriter, GpsPoint* point);
282     void writeGPXTrkseg(QXmlStreamWriter* xmlWriter, Lap* lap);
283
284
285 public:
286
287     explicit Track(QString fileName,QString name);
288     explicit Track(QString fname);
289     explicit Track();
290     virtual ~Track();
291
292     bool readFromXML(QString fileName);
293     GpsPoint* parseGpsPoint(QXmlStreamReader& xml);
294     QList<GpsPoint*> getGpsPoints();
295     inline QString getFileName(){return fileName;}
296     inline void setFileName(QString file){fileName=file;}
297
298     inline QString getName(){return name;}
299     inline void setName(QString n){name=n;}
300     inline void setName(const char* n){name=n;}
301     inline int getNumActivities(){return numActivities;}
302     inline void setNumActivites(int activities){numActivities=activities;}
303
304     void addActivity(QString sport);
305     void addLap();
306     Summarized* addPoint(GpsPoint* point);
307     QString toString();
308
309     bool saveToXML();
310
311 };
312
313 #endif // TRACK_H