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 = "feet";
+ 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),
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()
void Odometer::update(Location::Fix const& fix)
{
- if(fix.kmSpeed > maxSpeed_)
- {
- maxSpeed_ = fix.kmSpeed;
- }
-
if(!fixTimer_)
{
fixTimer_ = new QTime();
int elapsed = fixTimer_->elapsed();
fixTimer_->restart();
+ timeoutTimer_->start(FIX_TIMEOUT);
if(fix.kmSpeed > SPEED_IGNORE_LEVEL)
{
if(fix.eps > 0.01)
{
- treshold = fix.eps * 0.23822 + 0.471204;
+ treshold = fix.eps * TRESHOLD_X + TRESHOLD_Y;
if(treshold < MIN_SPEED_TRESHOLD)
{
}
}
- 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;
}
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
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
}
}
+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();