4c0b61a376cc55427d3299ed5ebe3f6f8b11c640
[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     qreal avgSpeed;
48     qreal maxSpeed;
49     qreal elevationGain;
50     qreal elevationLoss;
51     qreal minElevation;
52     qreal maxElevation;
53     qreal avgPace;
54     qreal bestPace;
55
56 public:
57
58     explicit Summarized();
59     //virtual ~Summarized();
60
61     /*
62     inline double getDuration(){return duration;}
63     inline double getDistance(){return distance;}
64     inline qreal getAvgSpeed(){return avgSpeed;}
65     inline qreal getMaxSpeed(){return maxSpeed;}
66     inline qreal getElevationGain(){return elevationGain;}
67     inline qreal getElevationLoss(){return elevationLoss;}
68     inline qreal getMinElevation(){return minElevation;}
69     inline qreal getMaxElevation(){return maxelevation;}
70     inline qreal getAvgPace(){return avgPace;}
71     inline qreal getBestPace(){return bestPace;}
72     */
73
74     void addSummary(Summarized summary);
75     Summarized& account(GpsPoint point);
76     Summarized& account(GpsPoint first, GpsPoint last);
77
78     inline int getNumPoints(){return numPoints;}
79     inline void setNumPoints(int p){numPoints=p;}
80
81     inline double getMinLatitude(){return minLatitude;}
82     inline void setMinLatitude(double latitude){minLatitude=latitude;}
83
84     inline double getMaxLatitude(){return maxLatitude;}
85     inline void setMaxLatitude(double latitude){maxLatitude=latitude;}
86
87     inline double getMinLongitude(){return minLongitude;}
88     inline void setMinLongitude(double longitude){minLongitude=longitude;}
89
90     inline double getMaxLongitude(){return maxLongitude;}
91     inline void setMaxLongitude(double longitude){maxLongitude=longitude;}
92
93     inline int getGpsInterval(){return gpsInterval;}
94     inline void setGpsInterval(int interval){gpsInterval=interval;}
95
96     inline QDateTime getStartTime(){return startTime;}
97     inline void setStartTime(QDateTime time){startTime=time;}
98
99     inline QDateTime getEndTime(){return endTime;}
100     inline void setEndTime(QDateTime time){endTime=time;}
101
102     inline double getDuration(){return duration;}
103     inline void setDuration(double duration_p){duration=duration_p;}
104
105     inline double getDistance(){return distance;}
106     inline void setDistance(double distance_p){distance=distance_p;}
107
108     inline int getAvgSpeed(){return avgSpeed;}
109     inline void setAvgSpeed(int speed){avgSpeed=speed;}
110
111     inline int getMaxSpeed(){return maxSpeed;}
112     inline void setMaxSpeed(int speed){maxSpeed=speed;}
113
114     inline int getElevationGain(){return elevationGain;}
115     inline void setElevationGain(int elevation){elevationGain=elevation;}
116
117     inline int getElevationLoss(){return elevationLoss;}
118     inline void setElevationLoss(int elevation){elevationLoss=elevation;}
119
120     inline int getMinElevation(){return minElevation;}
121     inline void setMinElevation(int elevation){minElevation=elevation;}
122
123     inline int getMaxElevation(){return maxElevation;}
124     inline void setMaxElevation(int elevation){maxElevation=elevation;}
125
126     inline int getAvgPace(){return avgPace;}
127     inline void setAvgPace(int time){avgPace=time;}
128
129     inline int getBestPace(){return bestPace;}
130     inline void setBestPace(int time){bestPace=time;}
131     QString toSumString();
132 };
133
134
135 class GpsPoint{
136
137 private:
138     double latitude;
139     double longitude;
140     double elevation;
141
142     QDateTime time;
143     qreal speed;
144     qreal direction;
145     qreal magneticVariation;
146     qreal horizontalAccuracy;
147     qreal verticalAccuracy;
148     qreal distancePrev;
149     QTime timeToPrev;
150 public:
151     explicit GpsPoint(double latitude, double longitude, int elevation);
152     explicit GpsPoint(double latitude, double longitude, int elevation,QDateTime time, qreal speed,
153                       qreal direction, qreal magneticVariation,qreal horizontalAccuracy, qreal verticalAccuracy);
154     explicit GpsPoint(double latitude, double longitude, int elevation,QDateTime time, qreal speed,
155                       qreal direction, qreal magneticVariation,qreal horizontalAccuracy, qreal verticalAccuracy, qreal distancePrev, QTime timeToPrev);
156
157     //virtual ~GpsPoint();
158
159     inline double getLatitude(){return latitude;}
160     inline void setLatitude(double lat){latitude=lat;}
161
162     inline double getLongitude(){return longitude;}
163     inline void setLongitude(double longitude_p){longitude=longitude_p;}
164
165     inline double getElevation(){return elevation;}
166     inline void setElevation(double elevation_p){elevation=elevation_p;}
167
168     inline QDateTime getTime(){return time;}
169     inline void setTime(QDateTime time_p){time=time_p;}
170
171     inline qreal getSpeed(){return speed;}
172     inline void setSpeed(qreal speed_p){speed=speed_p;}
173
174     inline qreal getDirection(){return direction;}
175     inline void setDirection(qreal direction_p){direction=direction_p;}
176
177     inline qreal getMagneticVariation(){return magneticVariation;}
178     inline void setMagneticVariation(qreal magneticVariation_p){magneticVariation=magneticVariation_p;}
179
180     inline qreal getHorizontalAccuracy(){return horizontalAccuracy;}
181     inline void setHorizontalAccuracy(qreal horizontalAccuracy_p){horizontalAccuracy=horizontalAccuracy_p;}
182
183     inline qreal getVerticalAccuracy(){return verticalAccuracy;}
184     inline void setVerticalAccuracy(qreal verticalAccuracy_p){verticalAccuracy=verticalAccuracy_p;}
185
186     inline double getDistancePrev(){return distancePrev;}
187     inline void setDistancePrev(double distance){distancePrev=distance;}
188
189     QString toString();
190
191     GpsPoint& operator= (const GpsPoint&);
192
193     friend int operator== (const GpsPoint&, const GpsPoint&);
194     friend int operator!= (const GpsPoint&, const GpsPoint&);
195     friend QDataStream& operator<< (QDataStream&, const GpsPoint&);
196
197     double distance(GpsPoint p);
198
199 };
200
201 class Lap: public Summarized{
202
203 private:
204     int number;
205     QList<GpsPoint*> points;
206
207 public:
208
209     explicit Lap(int number);
210     virtual ~Lap();
211
212     inline int getNumber(){return number;}
213     inline void setNumber(int number_p){number=number_p;}
214
215     Summarized* addPoint(GpsPoint* point);
216     inline QList<GpsPoint*> getPoints(){return points;}
217     QString toString();
218
219 };
220
221 class Activity: public Summarized{
222
223 private:
224     QString sport;
225     int numLaps;
226     QDateTime id;
227     QList<Lap*> laps;
228
229 public:
230
231     explicit Activity(QString sport);
232     virtual ~Activity();
233
234     inline QDateTime getId(){return id;}
235     inline void setId(QDateTime time){id=time;}
236
237     inline QString getSport(){return sport;}
238     inline void setSport(QString sport_p){sport=sport_p;}
239
240     inline int getNumLaps(){return numLaps;}
241     inline void setNumLaps(int laps){numLaps=laps;}
242
243     void addLap();
244     Summarized* addPoint(GpsPoint* point);
245
246     inline QList<Lap*> getLaps(){return laps;}
247     QString toString();
248 };
249
250
251 class Track:public Summarized
252 {
253
254 private:
255
256     QString fileName;
257     QString name;
258     int numActivities;
259     QList<Activity*> activities;
260
261     double minLat;
262     double minLong;
263     double maxLat;
264     double maxLong;
265
266
267     void writeTCXCourses(QXmlStreamWriter* xmlWriter);
268     void writeTCXCourse(QXmlStreamWriter* xmlWriter, Activity* act);
269     void writeTCXLap(QXmlStreamWriter* xmlWriter, Lap* lap);
270     void writeTCXPoint(QXmlStreamWriter* xmlWriter, GpsPoint* point);
271     void writeGPXTracks(QXmlStreamWriter* xmlWriter);
272     void writeGPXTrack(QXmlStreamWriter* xmlWriter, Activity* act);
273     void writeGPXPoint(QXmlStreamWriter* xmlWriter, GpsPoint* point);
274     void writeGPXTrkseg(QXmlStreamWriter* xmlWriter, Lap* lap);
275
276
277 public:
278
279     explicit Track(QString fileName,QString name);
280     explicit Track(QString fname);
281     explicit Track();
282     virtual ~Track();
283
284     bool readFromXML(QString fileName);
285     GpsPoint* parseGpsPoint(QXmlStreamReader& xml);
286     QList<GpsPoint*> getGpsPoints();
287     inline QString getFileName(){return fileName;}
288     inline void setFileName(QString file){fileName=file;}
289
290     inline QString getName(){return name;}
291     inline void setName(QString n){name=n;}
292     inline void setName(const char* n){name=n;}
293     inline int getNumActivities(){return numActivities;}
294     inline void setNumActivites(int activities){numActivities=activities;}
295
296     void addActivity(QString sport);
297     void addLap();
298     Summarized* addPoint(GpsPoint* point);
299     QString toString();
300
301     bool saveToXML();
302
303 };
304
305 #endif // TRACK_H