Start acceleration measurement button changed to custom button.
[speedfreak] / Client / gpsdata.cpp
1 /*
2  * GPS data
3  *
4  * @author     Toni Jussila <toni.jussila@fudeco.com>
5  * @copyright  (c) 2010 Speed Freak team
6  * @license    http://opensource.org/licenses/gpl-license.php GNU Public License
7  */
8
9 #include "gpsdata.h"
10 #include <QDebug>
11
12 /**
13   *Default constructor of this class.
14   */
15 GPSData::GPSData(Maemo5Location *maemo5location)
16 {
17     qDebug() << "__GPSData";
18     location = maemo5location;
19
20     connect(location,SIGNAL(agnss()),this,SLOT(agnss()));
21     connect(location,SIGNAL(awcp()),this,SLOT(awcp()));
22     connect(location,SIGNAL(locationUpdated()),this,SLOT(locationUpdated()));
23     connect(location,SIGNAL(gps_connected()),this,SLOT(gpsConnected()));
24     connect(location,SIGNAL(gps_disconnected()),this,SLOT(gpsDisconnected()));
25     connect(location,SIGNAL(gps_error(int)),this,SLOT(gpsError()));
26     connect(location,SIGNAL(gpsd_running()),this,SLOT(gpsdRunning()));
27     connect(location,SIGNAL(gpsd_stopped()),this,SLOT(gpsdStopped()));
28
29     gpsDateTime = new QDateTime();
30     resetAll();
31 }
32
33 /**
34   *Destructor of this class. Deletes all dynamic objects and sets them to NULL.
35   */
36 GPSData::~GPSData()
37 {
38     qDebug() << "__~GPSData";
39     location = NULL;
40
41     if(gpsDateTime)
42         delete gpsDateTime;
43 }
44
45 /**
46   * This function reset all variables
47   */
48 void GPSData::resetAll()
49 {
50     satellitesInUse = 0;
51     satellitesInView = 0;
52     signalStrength = 0;
53     latitude = 0;
54     longitude = 0;
55     time = 0;
56     ept = 0;
57     eph = 0;
58     altitude = 0;
59     epv = 0;
60     track = 0;
61     epd = 0;
62     speed = 0;
63     eps = 0;
64     climb = 0;
65     epc = 0;
66     latitudePrevious = 0;
67     longitudePrevious = 0;
68     sLatitudeNow = "";
69     sLongitudeNow = "";
70     sLatitudePrevious = "";
71     sLongitudePrevious = "";
72     routeStartTime = "";
73     routeStopTime = "";
74     recordingStatus = false;
75     roundCounter = 0;
76 }
77
78 /**
79   *This slot function is called when GPS update location.
80   */
81 void GPSData::agnss()
82 {
83     //satellitesInUse   = location->getSatellitesInUse());  //Returns number of satellites in use.
84     //satellitesInView  = location->getSatellitesInView();  //Returns number of satellites in view.
85     //signalStrength    = location->getSignalStrength();    //Returns average signal strength of satellites which are in use.
86     //gpsOnline         = location->getGpsOnline();         //Returns gsp online
87     //ept               = location->getEpt();               //Returns time accuracy in seconds.
88     //eph               = location->getEph();               //Returns horizontal position accuracy in cm.
89     //track             = location->getTrack();             //Returns direction of motion in degrees(0-359).
90     //epd               = location->getEpd();               //Returns track accuracy in degrees.
91     //climb             = location->getClimb();             //Returns current rate of climb in m/s.
92     //epc               = location->getEpc();               //Returns climb accuracy in m/s.
93     //time              = location->getTime();              //Returns timestamp of the update in seconds.
94     //epv               = location->getEpv();               //Returns altitude accuracy in meters.
95     //eps               = location->getEps();               //Returns speed accuracy in km/h.
96     //distance          = location->distance_between_two_points(double latitude_s, double longitude_s, double latitude_f, double longitude_f);
97
98     //If route recording true
99     if ( recordingStatus == true )
100     {
101         latitudePrevious = latitude;
102         longitudePrevious = longitude;
103         latitude    = location->getLatitude();  //Returns latitude.
104         longitude   = location->getLongitude(); //Returns longitude.
105         altitude    = location->getAltitude();  //Returns fix altitude in meters.
106         speed       = location->getSpeed();     //Returns current speed in km/h.
107
108         QFile routeTempFile("routetemp.xml");//Temp xml.
109
110         //If GPS find 4 or more satellite and signal stregth is 30 or more.
111         if (location->getSatellitesInUse() >= 4 && location->getSignalStrength() >= 30)
112         {
113             //If first round
114             if (roundCounter == 0)
115             {
116                 if (!routeTempFile.open(QIODevice::WriteOnly | QIODevice::Text))
117                     return;
118                 writeRouteXml(&routeTempFile, 0);
119                 routeTempFile.close();
120                 roundCounter ++;
121             }
122
123             //Points writing round.
124             else
125             {
126                 sLatitudeNow.sprintf("%.4f", latitude);  //Latitude now to string
127                 sLongitudeNow.sprintf("%.4f", longitude);//Longitude now to string
128                 sLatitudePrevious.sprintf("%.4f", latitudePrevious);  //Previous latitude to string
129                 sLongitudePrevious.sprintf("%.4f", longitudePrevious); //Previous longitude to string
130
131                 //If latitude or longitude change
132                 if ( sLatitudeNow != sLatitudePrevious || sLongitudeNow != sLongitudePrevious )
133                 {
134                     if (!routeTempFile.open(QIODevice::Append | QIODevice::Text))
135                         return;
136
137                     writeRouteXml(&routeTempFile, 0);
138                     roundCounter ++;
139                     routeTempFile.close();
140                 }
141             }
142         }
143     }
144 }
145
146 /**
147   *This slot function is called when gprs update location.
148   */
149 void GPSData::awcp()
150 {
151
152 }
153
154 /**
155   *This slot function is called when .
156   */
157 void GPSData::locationUpdated()
158 {
159
160 }
161
162 /**
163   *This slot function is called when .
164   */
165 void GPSData::gpsConnected()
166 {
167
168 }
169
170 /**
171   *This slot function is called when .
172   */
173 void GPSData::gpsDisconnected()
174 {
175
176 }
177
178 /**
179   *This slot function is called when .
180   */
181 void GPSData::gpsError()
182 {
183
184 }
185
186 /**
187   *This slot function is called when .
188   */
189 void GPSData::gpsdRunning()
190 {
191
192 }
193
194 /**
195   *This slot function is called when .
196   */
197 void GPSData::gpsdStopped()
198 {
199
200 }
201
202 /**
203   *This function start route recording.
204   *@param QString time recording start time.
205   */
206 void GPSData::startRouteRecording()
207 {
208     if (recordingStatus == false)
209     {
210         //Get start time and start recording.
211         gpsDateTime->setTime_t(location->getTime());
212         routeStartTime = gpsDateTime->toString("dd.MM.yyyy hh:mm:ss");
213         recordingStatus = true;
214         roundCounter = 0;
215     }
216 }
217
218 /**
219   *This function stop route recording.
220   *@param QString time recording stop time.
221   */
222 void GPSData::stopRouteRecording()
223 {
224     if (recordingStatus == true)
225     {
226         //Get stop time and stop recording.
227         gpsDateTime->setTime_t(location->getTime());
228         routeStopTime = gpsDateTime->toString("dd.MM.yyyy hh:mm:ss");
229         recordingStatus = false;
230
231         //Write final xml.
232         QFile file("route.xml");
233         if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
234             return;
235         writeRouteXml(&file, 1);
236         file.close();
237         roundCounter = 0;
238     }
239 }
240
241 /**
242   *This function write route to .xml file.
243   */
244 void GPSData::writeRouteXml(QIODevice *device, int round)
245 {
246     xmlwriter.setDevice(device);
247
248     //Write temp xml (routetemp.xml).
249     if ( round == 0 )
250     {
251         xmlwriter.writeStartElement("Point");
252         xmlwriter.writeAttribute("Latitude", QString::number(latitude));
253         xmlwriter.writeAttribute("Longitude", QString::number(longitude));
254         xmlwriter.writeAttribute("Altitude", QString::number(altitude));
255         xmlwriter.writeAttribute("Speed", QString::number(speed));
256         xmlwriter.writeEndElement();//Point
257     }
258
259     //Write final xml (route.xml).
260     else if ( round == 1 )
261     {
262         xmlwriter.writeStartDocument();
263         xmlwriter.writeStartElement("Route");
264         xmlwriter.writeAttribute("Start-time", routeStartTime);
265         xmlwriter.writeAttribute("Stop-time", routeStopTime);
266         xmlwriter.writeAttribute("Points", QString::number(roundCounter));
267
268         //Open temp xml and read points
269         QFile tempFile("routetemp.xml");
270         if (!tempFile.open(QIODevice::ReadOnly | QIODevice::Text))
271             return;
272         QTextStream readRoute(&tempFile);
273         QTextStream writeRoute(device);
274         writeRoute << readRoute.readLine();
275         tempFile.close();//Close temp xml
276
277         xmlwriter.writeEndElement();//Route
278         xmlwriter.writeEndDocument();     
279     }
280 }