timer with byoyomi
authorTomas Musil <tomik.musil@gmail.com>
Sat, 8 Sep 2012 19:01:22 +0000 (21:01 +0200)
committerTomas Musil <tomik.musil@gmail.com>
Sat, 8 Sep 2012 19:01:22 +0000 (21:01 +0200)
timer.py

index 587b436..bc8a5c3 100755 (executable)
--- a/timer.py
+++ b/timer.py
@@ -11,23 +11,39 @@ import subprocess
 import pygame
 
 class Timer:
-    def __init__(self, main_time):
+    def __init__(self, main_time, byop, byot):
         self._last = 0
         self._elapsed = 0.
         self._main_t = main_time
+        self.byost = "main time"
+        self._byop = byop + 1
+        self._byot = byot
+        self._byo = False
 
     def get_time(self):
-        if self._last > 0:
-            r_time = main_time - (time.time() - self._last + self._elapsed)
+        if self._last > 0: # when running:
+            r_time = self._main_t - (time.time() - self._last + self._elapsed)
             if (r_time - int(r_time)) < 0.75:
                 sep = ":"
             else:
                sep = " "
-        else:
-            r_time = main_time - self._elapsed
+        else: # not running:
+            if self._byo and self._byop > 0:
+                self._elapsed = 0
+            r_time = self._main_t - self._elapsed
             sep = ":"
         if r_time < 0:
-            r_time = 0
+            self._byo = True
+            self._main_t = self._byot
+            self._byop -= 1
+            if self._byop > 0:
+                self._elapsed = 0
+                self._last = time.time()
+                self.byost = "(" + str(self._byop) + ")"
+                return self.get_time()
+            else:
+                r_time = 0
+                self.byost = "lost on time"
         return "{0:0>2}".format(int(r_time / 60)) + sep + "{0:0>2}".format(int(r_time % 60))
 
     def start(self):
@@ -44,8 +60,11 @@ class Timer:
             return False
 
 parser = argparse.ArgumentParser(description=__doc__)
-parser.add_argument('-m', type=int, default=45,
-                    help="main time in minutes")
+parser.add_argument('-m', type=int, default=10,
+                    help="main time in minutes (default is 10)")
+parser.add_argument('-b', type=int, nargs=2, default=[5, 20],
+                    help="japanese byoyomi: number of periods, period length in"
+                        " seconds (default is 5 periods, 20 seconds)")
 parser.add_argument('-c', '--camera', dest='cam', action='store_true',
                     help="camera on")
 parser.add_argument('-d', type=int, default=0,
@@ -56,32 +75,36 @@ args = parser.parse_args()
 
 
 pygame.init()
-pygame.display.set_mode((600, 100))
+pygame.display.set_mode((600, 130))
 pygame.display.set_caption("Go timer")
 screen = pygame.display.get_surface()
 
 clock = pygame.time.Clock()
 
 font = pygame.font.Font(pygame.font.match_font('monospace'), 80)
+font2 = pygame.font.Font(None, 25)
 
 done = False
 first = True
 
 main_time = args.m * 60
 
-timers = (Timer(main_time), Timer(main_time))
+timers = (Timer(main_time, args.b[0], args.b[1]), Timer(main_time, args.b[0], args.b[1]))
 
 if args.cam:
     capture = subprocess.Popen(['python', 'capture.py', '-c', '-d', str(args.d), '-r',
                       str(args.r[0]),
                       str(args.r[1])], stdin=subprocess.PIPE)
+last = 0
 
 while not done:
-
     for event in pygame.event.get():
         if event.type == pygame.QUIT:
             done = True
         elif event.type == pygame.KEYDOWN:
+            if time.time() - last < 0.7:
+                continue
+            last = time.time()
             if first:
                 timers[0].start()
                 first = False
@@ -102,8 +125,12 @@ while not done:
     screen.blit(text1, [10, 10])
     text2 = font.render(timers[1].get_time(), True, [128, 255, 128])
     screen.blit(text2, [300, 10])
+    text3 = font2.render(timers[0].byost, True, [128, 255, 128])
+    screen.blit(text3, [10, 90])
+    text4 = font2.render(timers[1].byost, True, [128, 255, 128])
+    screen.blit(text4, [300, 90])
     pygame.display.flip()
     clock.tick(15)
 
-
-print >> capture.stdin, "exit"
+if args.cam:
+    print >> capture.stdin, "exit"