timer + capture
[imago.git] / timer.py
1 #!/usr/bin/env python
2
3 """Go timer"""
4
5 import os
6 import sys
7 import time
8 import argparse
9 import subprocess
10
11 import pygame
12
13 class Timer:
14     def __init__(self, main_time):
15         self._last = 0
16         self._elapsed = 0.
17         self._main_t = main_time
18
19     def get_time(self):
20         if self._last > 0:
21             r_time = main_time - (time.time() - self._last + self._elapsed)
22             if (r_time - int(r_time)) < 0.75:
23                 sep = ":"
24             else:
25                sep = " "
26         else:
27             r_time = main_time - self._elapsed
28             sep = ":"
29         if r_time < 0:
30             r_time = 0
31         return "{0:0>2}".format(int(r_time / 60)) + sep + "{0:0>2}".format(int(r_time % 60))
32
33     def start(self):
34         self._last = time.time()
35
36     def stop(self):
37         self._elapsed += time.time() - self._last
38         self._last = 0
39
40     def is_running(self):
41         if self._last > 0:
42             return True
43         else:
44             return False
45
46 parser = argparse.ArgumentParser(description=__doc__)
47 parser.add_argument('-m', type=int, default=45,
48                     help="main time in minutes")
49 parser.add_argument('-c', '--camera', dest='cam', action='store_true',
50                     help="camera on")
51 parser.add_argument('-d', type=int, default=0,
52                     help="video device id")
53 parser.add_argument('-r', type=int, nargs=2, default=[640, 480],
54                     help="set camera resolution")
55 args = parser.parse_args()
56
57
58 pygame.init()
59 pygame.display.set_mode((600, 100))
60 pygame.display.set_caption("Go timer")
61 screen = pygame.display.get_surface()
62
63 clock = pygame.time.Clock()
64
65 font = pygame.font.Font(pygame.font.match_font('monospace'), 80)
66
67 done = False
68 first = True
69
70 main_time = args.m * 60
71
72 timers = (Timer(main_time), Timer(main_time))
73
74 if args.cam:
75     capture = subprocess.Popen(['python', 'capture.py', '-c', '-d', str(args.d), '-r',
76                       str(args.r[0]),
77                       str(args.r[1])], stdin=subprocess.PIPE)
78
79 while not done:
80
81     for event in pygame.event.get():
82         if event.type == pygame.QUIT:
83             done = True
84         elif event.type == pygame.KEYDOWN:
85             if first:
86                 timers[0].start()
87                 first = False
88                 if args.cam:
89                     print >> capture.stdin, "stop"
90                     print >> capture.stdin, "take"
91                 continue
92             if args.cam:
93                 print >> capture.stdin, "take"
94             for timer in timers:
95                 if timer.is_running():
96                     timer.stop()
97                 else:
98                     timer.start()
99
100     screen.fill([0, 0, 0])
101     text1 = font.render(timers[0].get_time(), True, [128, 255, 128])
102     screen.blit(text1, [10, 10])
103     text2 = font.render(timers[1].get_time(), True, [128, 255, 128])
104     screen.blit(text2, [300, 10])
105     pygame.display.flip()
106     clock.tick(15)
107
108
109 print >> capture.stdin, "exit"