Added altitude display to detail screen. Added option to disable auto rotation.
[jspeed] / src / speedalarm.cpp
1 /*
2  * This file is part of jSpeed.
3  *
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.
8  *
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.
13  *
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/>.
16  *
17  */
18
19 #include <QtCore/QFile>
20 #include <QtCore/QTimer>
21 #include "speedalarm.h"
22 #include "settings.h"
23 #include "odometer.h"
24 #include "poialerts.h"
25 #include "mediaplayer.h"
26
27
28 SpeedAlarm::SpeedAlarm(): QObject(0), loaded_(false),
29 enabled_(false), isOver_(false), timer_(0)
30 {
31 }
32
33 SpeedAlarm::~SpeedAlarm()
34 {
35     delete timer_;
36 }
37
38 SpeedAlarm& SpeedAlarm::instance()
39 {
40     static SpeedAlarm instance;
41     return instance;
42 }
43
44 void SpeedAlarm::start()
45 {
46     if(!loaded_)
47     {
48         loadConfig();
49     }
50
51     if(enabled_)
52     {
53         connect(&(Odometer::instance()), SIGNAL(dataUpdated()), this, SLOT(onDataUpdated()));
54     }
55
56 }
57
58 void SpeedAlarm::loadConfig()
59 {
60     loaded_ = true;
61
62     bool enabled = Settings::instance().value("alarm_enabled", false).toBool();
63
64     if(enabled)
65     {
66         enabled_ = true;
67
68         QString sound = Settings::instance().value("alarm_sound", "").toString();
69
70         if(sound.isEmpty())
71         {
72             enabled_ = false;
73             return;
74         }
75
76         QString soundDir = MediaPlayer::getSoundDir();
77
78         if(QFile::exists(soundDir + sound))
79         {
80             soundFile_ = soundDir + sound;
81         }
82         else if(QFile::exists(MediaPlayer::getLocalSoundDir() + sound))
83         {
84             soundFile_ = MediaPlayer::getLocalSoundDir() + sound;
85         }
86         else
87         {
88             enabled_ = false;
89             return;
90         }
91
92         threshold_ = Settings::instance().value("alarm_threshold", 0).toDouble();
93
94         start();
95     }
96     else
97     {
98         end();
99         enabled_ = false;
100     }
101 }
102
103 void SpeedAlarm::end()
104 {
105     if(enabled_)
106     {
107         disconnect(&(Odometer::instance()), SIGNAL(dataUpdated()), this, SLOT(onDataUpdated()));
108     }
109 }
110
111 void SpeedAlarm::onDataUpdated()
112 {
113     if(Odometer::instance().getLatestFix().kmSpeed > threshold_)
114     {
115         if(!isOver_)
116         {
117             MediaPlayer::play(soundFile_);
118             isOver_ = true;
119             emit speedExceedChanged(true);
120             startAlarmTimer();
121         }
122     }
123     else
124     {
125         if(isOver_)
126         {
127             emit speedExceedChanged(false);
128         }
129
130         isOver_ = false;
131     }
132 }
133
134 void SpeedAlarm::startAlarmTimer()
135 {
136     if(timer_)
137     {
138         timer_->stop();
139         delete timer_;
140         timer_ = 0;
141     }
142
143     timer_ = new QTimer;
144     timer_->setInterval(ALARM_INTERVAL * 1000);
145     connect(timer_, SIGNAL(timeout()), this, SLOT(playAlarmSound()));
146     timer_->start();
147 }
148
149 void SpeedAlarm::playAlarmSound()
150 {
151     if(isOver_)
152     {
153         MediaPlayer::play(soundFile_);
154     }
155     else
156     {
157         delete timer_;
158         timer_ = 0;
159     }
160 }