test
[push-it] / src / timekeeper.cpp
1 /*
2     Copyright (C) <2010>  <Markus Scharnowski markus.scharnowski@gmail.com>
3
4     This program 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     This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
16 */
17 #include "timekeeper.h"
18 #include <sstream>
19 #include <iomanip>
20
21 using namespace std;
22
23 timeKeeper::timeKeeper()
24 {
25   start();
26   isRunning = false;
27 }
28
29 int timeKeeper::start()
30 {
31   gettimeofday(&tvPrev,NULL);
32   gettimeofday(&tvLast,NULL);
33   gettimeofday(&tvStart,NULL);
34   gettimeofday(&tvStop,NULL);
35   timeStart = time(NULL);
36   timeStop  = timeStart;
37   timePrev  = timeStart;
38   timeLast  = timeStart;
39   pauseTimeSec = 0;
40   pauseTotalTimeSec = 0;
41   isRunning = true;
42   isPauseActive = false;
43   wasLastPauseLogged = true;
44   disableDateForStrings();
45   return EXIT_SUCCESS;
46 }
47
48 int timeKeeper::stop()
49 {
50   if(false == isRunning)
51   {
52     return EXIT_FAILURE;
53   }
54
55   stopPause();
56   timeStop = time(NULL);
57   timeLast = timeStop;
58   gettimeofday(&tvLast,NULL);
59   gettimeofday(&tvStop,NULL);
60   isRunning = false;
61
62   return EXIT_SUCCESS;
63 }
64
65 int timeKeeper::update()
66 {
67   if(false == isRunning)
68   {
69     return EXIT_FAILURE;
70   }
71
72   stopPause();
73   timePrev = timeLast;
74   timeLast = time(NULL);
75
76   tvPrev = tvLast;
77   gettimeofday(&tvLast,NULL);
78
79   return EXIT_SUCCESS;
80 }
81
82 double timeKeeper::getDelta(struct timeval tvLater, struct timeval tvEarlier)
83 {
84   double tvTime = (double)(tvLater.tv_sec - tvEarlier.tv_sec);
85
86   tvTime = tvTime*1e6+(double)(tvLater.tv_usec - tvEarlier.tv_usec);
87   tvTime /=1e6;
88
89   return tvTime;
90 }
91
92 double timeKeeper::getDeltaLastToStart()
93 {
94   double retval = 0;
95
96   if(false == isRunning)
97   {
98     retval = getDelta(tvStop,tvStart);
99   }
100   else
101   {
102     retval = getDelta(tvLast,tvStart);
103   }
104   retval -= pauseTotalTimeSec;
105
106   return retval;
107 }
108
109 double timeKeeper::getDeltaNowToStart()
110 {
111   double retval = 0;
112   struct timeval now;
113
114   gettimeofday(&now,NULL);
115
116   if(false == isRunning)
117   {
118     retval = getDelta(tvStop,tvStart);
119   }
120   else
121   {
122     retval = getDelta(now,tvStart);
123   }
124   retval -= pauseTotalTimeSec;
125
126   return retval;
127 }
128
129 double timeKeeper::getDeltaLastToPrev()
130 {
131   double retval = 0;
132
133   if(false == isRunning)
134   {
135     return -1;
136   }
137
138   retval = getDelta(tvLast,tvPrev);
139
140   if(false == wasLastPauseLogged)
141   {
142     retval -= pauseTimeSec;
143     wasLastPauseLogged = true;
144   }
145
146   return retval;
147 }
148
149 double timeKeeper::getDeltalNowToPrev()
150 {
151   double retval = 0;
152   struct timeval now;
153
154   gettimeofday(&now,NULL);
155
156   if(false == isRunning)
157   {
158     retval = getDelta(tvStop,tvPrev);
159   }
160   else
161   {
162     retval = getDelta(now,tvPrev);
163   }
164   retval -= pauseTotalTimeSec;
165
166   return retval;
167 }
168
169 string timeKeeper::makeString(time_t timer)
170 {
171   stringstream sstr;
172   struct tm *helper=NULL;
173
174   helper=localtime(&timer);
175   sstr << setfill('0');
176   if(true == dateForStrings)
177   {
178     sstr << setw(2) << 1900+helper->tm_year << "-";
179     sstr << setw(2) << helper->tm_mon << "-";
180     sstr << setw(2) << helper->tm_mday << " ";
181   }
182   sstr << setw(2) << helper->tm_hour << ":";
183   sstr << setw(2) << helper->tm_min << ":";
184   sstr << setw(2) << helper->tm_sec;
185
186   return sstr.str();
187 }
188
189 string timeKeeper::getStartTimeString()
190 {
191   return makeString(timeStart);
192 }
193
194 string timeKeeper::getPreviousTimeString()
195 {
196   return makeString(timePrev);
197 }
198
199 string timeKeeper::getLastTimeString()
200 {
201   return makeString(timeLast);
202 }
203
204 string timeKeeper::getNowTimeString()
205 {
206   time_t timeNow = time(NULL);
207   return makeString(timeNow);
208 }
209
210 int timeKeeper::pause()
211 {
212   if(false == isRunning)
213   {
214     return EXIT_FAILURE;
215   }
216
217   startPause();
218
219   return EXIT_SUCCESS;
220 }
221
222 int timeKeeper::startPause()
223 {
224   if(true == isPauseActive)
225   {
226     return stopPause();
227   }
228   gettimeofday(&tvPauseStart,NULL);
229   isPauseActive = true;
230
231   return EXIT_SUCCESS;
232 }
233
234 int timeKeeper::stopPause()
235 {
236   if(false == isPauseActive)
237   {
238     return EXIT_FAILURE;
239   }
240
241   gettimeofday(&tvPauseStop,NULL);
242   pauseTimeSec = getDelta(tvPauseStop,tvPauseStart);
243   pauseTotalTimeSec += pauseTimeSec;
244   wasLastPauseLogged = false;
245   isPauseActive = false;
246
247   return EXIT_SUCCESS;
248 }
249
250 int timeKeeper::isPaused()
251 {
252   return isPauseActive;
253 }
254
255 /*
256 Date string handling
257 */
258 bool timeKeeper::enableDateForStrings()
259 {
260   dateForStrings = true;
261   return dateForStrings;
262 }
263
264 bool timeKeeper::disableDateForStrings()
265 {
266   dateForStrings = false;
267   return dateForStrings;
268 }
269
270 bool timeKeeper::isDateForStringsEnabled()
271 {
272   return dateForStrings;
273 }