summaryrefslogtreecommitdiff
path: root/apps/plugins/stopwatch.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/stopwatch.c')
-rw-r--r--apps/plugins/stopwatch.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/apps/plugins/stopwatch.c b/apps/plugins/stopwatch.c
index 2a5f97f93d..6bd6d2be2a 100644
--- a/apps/plugins/stopwatch.c
+++ b/apps/plugins/stopwatch.c
@@ -32,6 +32,8 @@ PLUGIN_HEADER
32#define LAP_Y TIMER_Y+1 32#define LAP_Y TIMER_Y+1
33#define MAX_LAPS 64 33#define MAX_LAPS 64
34 34
35#define STOPWATCH_FILE ROCKBOX_DIR "/apps/stopwatch.dat"
36
35/* variable button definitions */ 37/* variable button definitions */
36#if CONFIG_KEYPAD == RECORDER_PAD 38#if CONFIG_KEYPAD == RECORDER_PAD
37#define STOPWATCH_QUIT BUTTON_OFF 39#define STOPWATCH_QUIT BUTTON_OFF
@@ -230,6 +232,75 @@ static void ticks_to_string(int ticks,int lap,int buflen, char * buf)
230 } 232 }
231} 233}
232 234
235/*
236 * Load saved stopwatch state, if exists.
237 */
238void load_stopwatch(void)
239{
240 int fd;
241
242 fd = rb->open(STOPWATCH_FILE, O_RDONLY);
243
244 if (fd < 0)
245 {
246 return;
247 }
248
249 /* variable stopwatch isn't saved/loaded, because it is only used
250 * temporarily in main loop
251 */
252
253 rb->read(fd, &start_at, sizeof(start_at));
254 rb->read(fd, &prev_total, sizeof(prev_total));
255 rb->read(fd, &counting, sizeof(counting));
256 rb->read(fd, &curr_lap, sizeof(curr_lap));
257 rb->read(fd, &lap_scroll, sizeof(lap_scroll));
258 rb->read(fd, &lap_start, sizeof(lap_start));
259 rb->read(fd, lap_times, sizeof(lap_times));
260
261 if (counting && start_at > *rb->current_tick)
262 {
263 /* Stopwatch started in the future? Unlikely; probably started on a
264 * previous session and powered off in-between. We'll keep
265 * everything intact (user can clear manually) but stop the
266 * stopwatch to avoid negative timing.
267 */
268 start_at = 0;
269 counting = false;
270 }
271
272 rb->close(fd);
273}
274
275/*
276 * Save stopwatch state.
277 */
278void save_stopwatch(void)
279{
280 int fd;
281
282 fd = rb->open(STOPWATCH_FILE, O_CREAT|O_WRONLY|O_TRUNC);
283
284 if (fd < 0)
285 {
286 return;
287 }
288
289 /* variable stopwatch isn't saved/loaded, because it is only used
290 * temporarily in main loop
291 */
292
293 rb->write(fd, &start_at, sizeof(start_at));
294 rb->write(fd, &prev_total, sizeof(prev_total));
295 rb->write(fd, &counting, sizeof(counting));
296 rb->write(fd, &curr_lap, sizeof(curr_lap));
297 rb->write(fd, &lap_scroll, sizeof(lap_scroll));
298 rb->write(fd, &lap_start, sizeof(lap_start));
299 rb->write(fd, lap_times, sizeof(lap_times));
300
301 rb->close(fd);
302}
303
233enum plugin_status plugin_start(const struct plugin_api* api, const void* parameter) 304enum plugin_status plugin_start(const struct plugin_api* api, const void* parameter)
234{ 305{
235 char buf[32]; 306 char buf[32];
@@ -251,6 +322,8 @@ enum plugin_status plugin_start(const struct plugin_api* api, const void* parame
251 lines = 1; 322 lines = 1;
252#endif 323#endif
253 324
325 load_stopwatch();
326
254 rb->lcd_clear_display(); 327 rb->lcd_clear_display();
255 328
256 while (!done) 329 while (!done)
@@ -308,6 +381,7 @@ enum plugin_status plugin_start(const struct plugin_api* api, const void* parame
308 case STOPWATCH_RC_QUIT: 381 case STOPWATCH_RC_QUIT:
309#endif 382#endif
310 case STOPWATCH_QUIT: 383 case STOPWATCH_QUIT:
384 save_stopwatch();
311 done = true; 385 done = true;
312 break; 386 break;
313 387