2 * This file is part of jSpeed.
4 * jSpeed is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
9 * jSpeed is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with jSpeed. If not, see <http://www.gnu.org/licenses/>.
19 #include <QtCore/QTime>
20 #include <QtCore/QDebug>
21 #include <QtCore/QTimer>
27 QString const TOTAL_FIELD = "odometer_total";
28 QString const TOTALTIME_FIELD = "odometer_totaltime";
29 QString const TRIP_FIELD = "odometer_trip";
30 QString const TRIPTIME_FIELD = "odometer_triptime";
31 QString const MAXSPEED_FIELD = "odometer_maxspeed";
32 QString const KM_UNIT = "km";
33 QString const MILE_UNIT = "mi";
34 QString const KM_SPEEDUNIT = "km/h";
35 QString const MILE_SPEEDUNIT = "mph";
36 double const SPEED_TRESHOLD = 0.8;
37 double const SPEED_IGNORE_LEVEL = 0.2;
40 Odometer::Odometer(): QObject(0), trip_(0), total_(0),
41 maxSpeed_(0), totalTime_(0), tripTime_(0), fixTimer_(0),
42 mainTimer_(0), emitUpdate_(true), location_(0), signalTimer_(0)
44 total_ = Settings::instance().value(TOTAL_FIELD, 0).toDouble();
45 totalTime_ = Settings::instance().value(TOTALTIME_FIELD, 0).toULongLong();
46 maxSpeed_ = Settings::instance().value(MAXSPEED_FIELD, 0).toDouble();
47 trip_ = Settings::instance().value(TRIP_FIELD, 0).toDouble();
48 tripTime_ = Settings::instance().value(TRIPTIME_FIELD, 0).toULongLong();
49 signalTimer_ = new QTimer(this);
50 signalTimer_->setSingleShot(false);
51 signalTimer_->setInterval(1000);
52 connect(signalTimer_, SIGNAL(timeout()), this, SIGNAL(timeUpdated()));
64 Odometer& Odometer::instance()
66 static Odometer instance;
70 void Odometer::start()
72 location_ = new Location;
73 connect(location_, SIGNAL(locationChanged(Location::Fix const&)),
74 this, SLOT(update(Location::Fix const&)));
84 void Odometer::update(Location::Fix const& fix)
86 if(fix.kmSpeed > maxSpeed_)
88 maxSpeed_ = fix.kmSpeed;
93 fixTimer_ = new QTime();
97 int elapsed = fixTimer_->elapsed();
101 if(elapsed > 200 && fix.kmSpeed > SPEED_IGNORE_LEVEL && elapsed < 10000)
103 if(fix.kmSpeed > SPEED_TRESHOLD)
105 double km = fix.kmSpeed * (static_cast<double>(elapsed) / (1000 * 3600));
124 if(latestFix_.kmSpeed > 0.49)
127 latestFix_.speed = 0.0;
128 latestFix_.kmSpeed = 0.0;
136 double Odometer::getTrip() const
138 return trip_ * Location::getUnitMultiplier();
141 double Odometer::getAverageSpeed() const
143 int elapsed = getTripTime();
150 return (static_cast<double>(trip_) * Location::getUnitMultiplier()) / (static_cast<double>(elapsed) / 60.0);
153 double Odometer::getTotal() const
155 return total_ * Location::getUnitMultiplier();
158 double Odometer::getMaxSpeed() const
160 return maxSpeed_ * Location::getUnitMultiplier();
163 qulonglong Odometer::getTotalTime() const
165 return totalTime_ + timeAddition();
168 qulonglong Odometer::getTripTime() const
170 return tripTime_ + timeAddition();
173 void Odometer::resetTrip()
187 void Odometer::resetTotal()
200 void Odometer::resetAll()
210 void Odometer::store()
212 Settings::instance().setValue(TOTAL_FIELD, total_);
213 Settings::instance().setValue(TOTALTIME_FIELD, getTotalTime());
214 Settings::instance().setValue(TRIP_FIELD, trip_);
215 Settings::instance().setValue(TRIPTIME_FIELD, getTripTime());
216 Settings::instance().setValue(MAXSPEED_FIELD, maxSpeed_);
217 Settings::instance().sync();
220 Location::Fix const& Odometer::getLatestFix() const
225 QString const& Odometer::getUnit()
227 if(Location::getUnit() == Location::KM)
237 QString const& Odometer::getSpeedUnit()
239 if(Location::getUnit() == Location::KM)
245 return MILE_SPEEDUNIT;
249 void Odometer::updateUnit()
251 QString unit = Settings::instance().value("unit", "km").toString();
255 Location::setUnit(Location::KM);
257 else if(unit == "mile")
259 Location::setUnit(Location::MILE);
269 void Odometer::startTiming()
271 signalTimer_->start();
275 mainTimer_->restart();
279 mainTimer_ = new QTime();
281 signalTimer_->start();
284 void Odometer::endTiming()
286 signalTimer_->stop();
293 int elapsed = mainTimer_->elapsed() / 1000;
294 totalTime_ += elapsed;
295 tripTime_ += elapsed;
300 void Odometer::resetTiming()
311 int Odometer::timeAddition() const
315 return mainTimer_->elapsed() / 1000;