Small change to text element.
[jspeed] / src / odometer.cpp
index e4da0a9..b2c8488 100644 (file)
@@ -33,9 +33,18 @@ namespace
     QString const MILE_UNIT = "mi";
     QString const KM_SPEEDUNIT = "km/h";
     QString const MILE_SPEEDUNIT = "mph";
+    QString const METER_UNIT = "m";
+    QString const FEET_UNIT = "ft";
+    static const int FIX_TIMEOUT = 4000;
     double const DEFAULT_SPEED_TRESHOLD = 8.0;
-    double const MIN_SPEED_TRESHOLD = 0.9;
+    double const MIN_SPEED_TRESHOLD = 0.8;
     double const SPEED_IGNORE_LEVEL = 0.01;
+    double const TRESHOLD_POINT1_EPS = 40.0;
+    double const TRESHOLD_POINT1_TRESHOLD = 10.0;
+    double const TRESHOLD_POINT2_EPS = 1.8;
+    double const TRESHOLD_POINT2_TRESHOLD = MIN_SPEED_TRESHOLD;
+    double const TRESHOLD_X = (TRESHOLD_POINT1_TRESHOLD - TRESHOLD_POINT2_TRESHOLD) / (TRESHOLD_POINT1_EPS - TRESHOLD_POINT2_EPS);
+    double const TRESHOLD_Y = TRESHOLD_POINT1_TRESHOLD - (TRESHOLD_POINT1_EPS * TRESHOLD_X);
 }
 
 Odometer::Odometer(): QObject(0), trip_(0), total_(0),
@@ -52,6 +61,10 @@ mainTimer_(0), emitUpdate_(true), location_(0), signalTimer_(0)
     signalTimer_->setInterval(1000);
     connect(signalTimer_, SIGNAL(timeout()), this, SIGNAL(timeUpdated()));
     updateUnit();
+    timeoutTimer_ = new QTimer(this);
+    timeoutTimer_->setSingleShot(true);
+    connect(timeoutTimer_, SIGNAL(timeout()), this, SLOT(fixTimeout()));
+
 }
 
 Odometer::~Odometer()
@@ -84,11 +97,6 @@ void Odometer::end()
 
 void Odometer::update(Location::Fix const& fix)
 {
-    if(fix.kmSpeed > maxSpeed_)
-    {
-        maxSpeed_ = fix.kmSpeed;
-    }
-
     if(!fixTimer_)
     {
         fixTimer_ = new QTime();
@@ -98,6 +106,7 @@ void Odometer::update(Location::Fix const& fix)
     int elapsed = fixTimer_->elapsed();
 
     fixTimer_->restart();
+    timeoutTimer_->start(FIX_TIMEOUT);
 
     if(fix.kmSpeed > SPEED_IGNORE_LEVEL)
     {
@@ -105,7 +114,7 @@ void Odometer::update(Location::Fix const& fix)
 
         if(fix.eps > 0.01)
         {
-           treshold = fix.eps * 0.23822 + 0.471204;
+           treshold = fix.eps * TRESHOLD_X + TRESHOLD_Y;
 
            if(treshold < MIN_SPEED_TRESHOLD)
            {
@@ -113,7 +122,12 @@ void Odometer::update(Location::Fix const& fix)
            }
         }
 
-        if(fix.kmSpeed > treshold && elapsed > 200 && elapsed < 8000)
+        if(fix.kmSpeed > treshold && fix.kmSpeed > maxSpeed_)
+        {
+            maxSpeed_ = fix.kmSpeed;
+        }
+
+        if(fix.kmSpeed > treshold && elapsed > 200 && elapsed < FIX_TIMEOUT)
         {
             double km = fix.kmSpeed * (static_cast<double>(elapsed) / (1000 * 3600));
             trip_ += km;
@@ -134,16 +148,19 @@ void Odometer::update(Location::Fix const& fix)
     }
     else
     {
-        if(latestFix_.kmSpeed > SPEED_IGNORE_LEVEL)
-        {
-            latestFix_ = fix;
-            latestFix_.speed = 0.0;
-            latestFix_.kmSpeed = 0.0;
-            emit dataUpdated();
-        }
+        fixTimeout();
+    }
+}
 
-        endTiming();
+void Odometer::fixTimeout()
+{
+    if(latestFix_.kmSpeed > SPEED_IGNORE_LEVEL)
+    {
+        latestFix_ = Location::Fix();
+        emit dataUpdated();
     }
+
+    endTiming();
 }
 
 double Odometer::getTrip() const
@@ -160,7 +177,7 @@ double Odometer::getAverageSpeed() const
         return 0.0;
     }
 
-    return (static_cast<double>(trip_) * Location::getUnitMultiplier()) / (static_cast<double>(elapsed) / 60.0);
+    return (static_cast<double>(getTrip())) / (static_cast<double>(getTripTime()) / 3600.0);
 }
 
 double Odometer::getTotal() const
@@ -269,6 +286,28 @@ QString const& Odometer::getSpeedUnit()
     }
 }
 
+double Odometer::getUnitMultiplier()
+{
+    return Location::getUnitMultiplier();
+}
+
+double Odometer::getMeterMultiplier()
+{
+    return Location::getMeterMultiplier();
+}
+
+QString Odometer::getMeterUnit()
+{
+    if(Location::getUnit() == Location::KM)
+    {
+        return METER_UNIT;
+    }
+    else
+    {
+        return FEET_UNIT;
+    }
+}
+
 void Odometer::updateUnit()
 {
     QString unit = Settings::instance().value("unit", "km").toString();