Some bugs fixed.
[gpssportsniffer] / track.cpp
index 3d3b7a7..571ff95 100755 (executable)
--- a/track.cpp
+++ b/track.cpp
@@ -40,8 +40,11 @@ Summarized::Summarized(){
     elevationLoss=0.0;
     minElevation=0.0;
     maxElevation=0.0;
+    lastElevation=0.0;
     avgPace=0.0;
     bestPace=0.0;
+    lastElevationAccuracy=ACCURACY_V_GAIN+1;
+
 }
 
 QString Summarized::toSumString(){
@@ -52,21 +55,28 @@ QString Summarized::toSumString(){
 void Summarized::addSummary(Summarized summary){
 
     duration+=summary.getDuration();
-    distance=distance+summary.getDistance();
+    distance+=summary.getDistance();
+
     // avgSpeed of summary is not Avg, is speed of last point!
     if(summary.getAvgPace()!=-1)
         avgSpeed=((avgSpeed*numPoints)+summary.getAvgSpeed())/(numPoints+1);
 
-    elevationGain+=summary.getElevationGain();
-    elevationLoss+=summary.getElevationLoss();
+    if(summary.lastElevationAccuracy<=ACCURACY_V_GAIN){
+
+        elevationGain+=summary.getElevationGain();
+        elevationLoss+=summary.getElevationLoss();
 
-    if(minElevation!=0 && summary.minElevation!=0){
-        minElevation=min(minElevation,summary.minElevation);
-    }else if(minElevation==0 && summary.minElevation!=0){
-        minElevation=summary.minElevation;
+        if(minElevation!=0 && summary.minElevation!=0){
+            minElevation=min(minElevation,summary.minElevation);
+        }else if(minElevation==0 && summary.minElevation!=0){
+            minElevation=summary.minElevation;
+        }
+
+        maxElevation=max(maxElevation,summary.maxElevation);
+        lastElevation=summary.lastElevation;
+        lastElevationAccuracy=summary.lastElevationAccuracy;
     }
 
-    maxElevation=max(maxElevation,summary.maxElevation);
     maxSpeed=max(maxSpeed,summary.maxSpeed);
 
     if(bestPace!=0 && summary.avgPace!=0){
@@ -75,7 +85,9 @@ void Summarized::addSummary(Summarized summary){
         bestPace=summary.avgPace;
     }
 
-    avgPace=(1000*duration)/(60*distance);
+    if(distance>0)
+        avgPace=(1000*duration)/(60*distance);
+
     numPoints++;
 }
 
@@ -90,8 +102,15 @@ Summarized& Summarized::account(GpsPoint point){
     endTime=point.getTime();
     maxSpeed=point.getSpeed();
     avgSpeed=point.getSpeed();
-    minElevation=point.getElevation();
-    maxElevation=point.getElevation();
+
+    lastElevationAccuracy = point.getVerticalAccuracy();
+
+
+    if(lastElevationAccuracy<=ACCURACY_V_GAIN){
+        minElevation=point.getElevation();
+        maxElevation=point.getElevation();
+        lastElevation=point.getElevation();
+    }
 
     return (*this);
 }
@@ -103,46 +122,67 @@ Summarized& Summarized::account(GpsPoint first, GpsPoint last){
     // data in here is not secure and not controlled.
 
     numPoints++;
+
+    qDebug() << "first:" << first.toString();
+    qDebug() << "last:" << last.toString();
+
     distance=first.distance(last);
     duration=first.getTime().secsTo(last.getTime());
     startTime=first.getTime();
     endTime=last.getTime();
     double lastEle=last.getElevation();
     double firstEle=first.getElevation();
-    if(lastEle>=firstEle)
-        elevationGain=lastEle-firstEle;
-    else
-        elevationLoss=firstEle-lastEle;
+
+    lastElevationAccuracy = last.getVerticalAccuracy();
+
+    qDebug() <<"firstElevation:" << firstEle;
+    qDebug() <<"lastElevation:" << lastEle;
+    qDebug() << "vertical accuracy:" << lastElevationAccuracy;
+
+
+    if(lastElevationAccuracy<=ACCURACY_V_GAIN){
+        if(lastEle>=firstEle){
+            elevationGain=lastEle-firstEle;
+        }else{
+            elevationLoss=firstEle-lastEle;
+        }
+
+        minElevation=min(first.getElevation(),last.getElevation());
+        maxElevation=max(first.getElevation(),last.getElevation());
+        lastElevation = last.getElevation();
+    }
 
     maxSpeed=max(first.getSpeed(),last.getSpeed());
     // keep speed of last point, will be usefull
     // in add function
     avgSpeed=last.getSpeed();
-    minElevation=min(first.getElevation(),last.getElevation());
-    maxElevation=max(first.getElevation(),last.getElevation());
-    avgPace=(1000*duration)/(60*distance);
+
+
+    if(distance>0)
+        avgPace=(1000*duration)/(60*distance);
 
     return (*this);
 }
 
 
-GpsPoint::GpsPoint(double latitude, double longitude, int elevation)
+GpsPoint::GpsPoint(double latitude, double longitude, double elevation)
     :latitude(latitude),
     longitude(longitude),
       elevation(elevation),speed(0),direction(0),magneticVariation(0),horizontalAccuracy(0),verticalAccuracy(0){
 }
 
-GpsPoint::GpsPoint(double latitude, double longitude, int elevation,QDateTime time,
-                   qreal speed, qreal direction, qreal magneticVariation, qreal horizontalAccuracy, qreal verticalAccuracy)
-:latitude(latitude),longitude(longitude),elevation(elevation),time(time),
+GpsPoint::GpsPoint(double latitude, double longitude, double elevation,QDateTime time,
+                   double speed, double direction, double magneticVariation, double horizontalAccuracy, double verticalAccuracy)
+:latitude(latitude),longitude(longitude),elevation(elevation), time(time),
   speed(speed), direction(direction), magneticVariation(magneticVariation),
   horizontalAccuracy(horizontalAccuracy),verticalAccuracy(verticalAccuracy){
 
+    //qDebug() << "elevation:" << elevation;
 }
 
-GpsPoint::GpsPoint(double latitude, double longitude, int elevation,QDateTime time,
-                   qreal speed, qreal direction, qreal magneticVariation, qreal horizontalAccuracy, qreal verticalAccuracy,
-                   qreal distancePrev, QTime timeToPrev)
+GpsPoint::GpsPoint(double latitude, double longitude, double elevation,QDateTime time,
+                   double speed, double direction, double magneticVariation, double horizontalAccuracy, double verticalAccuracy,
+                   double distancePrev, QTime timeToPrev)
 :latitude(latitude),longitude(longitude),elevation(elevation),time(time),
   speed(speed), direction(direction), magneticVariation(magneticVariation),
   horizontalAccuracy(horizontalAccuracy),verticalAccuracy(verticalAccuracy),distancePrev(distancePrev), timeToPrev(timeToPrev){
@@ -178,16 +218,22 @@ GpsPoint& GpsPoint::operator= (const GpsPoint &p){
 
 double GpsPoint::distance(GpsPoint p){
 
+    double dist=0;
+
     double latitude1 = toRad(latitude);
     double longitude1 = toRad(longitude);
 
     double latitude2 = toRad(p.latitude);
     double longitude2 = toRad(p.longitude);
 
-    double temp = sin(latitude1)*sin(latitude2)+cos(latitude1)*cos(latitude2)*cos(longitude2-longitude1);
+    if(latitude1==latitude2 && longitude1==longitude2){
+        dist=0;
+    }else{
 
-    double dist= acos(temp)*EARTH_RADIUS*1000;
-    //qDebug() << "distance between points: " << QString::number(dist,'f',10);
+        double temp = sin(latitude1)*sin(latitude2)+cos(latitude1)*cos(latitude2)*cos(longitude2-longitude1);
+        dist= acos(temp)*EARTH_RADIUS*1000;
+    }
+    qDebug() << "distance between points: " << QString::number(dist,'f',10);
     return dist;
 }