Use a larger size hint for main widget.
[maegirls] / trunk / src / algo.py
index 06209bd..3078483 100755 (executable)
@@ -24,33 +24,56 @@ __version__ = "$Id: 0.py 2265 2010-02-21 19:16:26Z v13 $"
 
 import time
 
+def today():
+    t=time.time() - time.timezone
+    day=int(t/86400)
+
+    return(day)
+
+# Defaults for a girl
+defaults={
+    'cycle':       28,         # Cycle length
+    'menstr':      5,          # Duration of menstruation
+    'ovday':       -14,        # When ovulation happens. Positive: This number
+                               # of days after the start of the cycle.
+                               # Negative: This number of days before the end
+                               # of the cycle.
+    'day0':        today()
+    }
+
 class Algo(object):
     def __init__(self):
        t=today()
-       self.setReference(t, 28)
+       self.setReference(t, defaults)
 
     # set day "day" as the reference day of starting period cycle
     # day is int(time.time()/86400)
     # cycle is the cycle width in days, starting from 0
-    def setReference(self, day, cycle):
+    def setReference(self, day, cfg):
+       self.cfg=cfg
        self.refday=day
-       self.cycle=cycle
 
     # Convert an arbitary day to a day in cycle
     def dayInCycle(self, day):
-       d=(day-self.refday) % self.cycle
+       d=(day-self.refday) % self.cfg['cycle']
        if d<0:
-           d+=self.cycle
+           d+=self.cycleLength()
 
        return(d)
 
     def cycleLength(self):
-       return(self.cycle)
+       return(self.cfg['cycle'])
 
     def currentDayInCycle(self):
        d=today()
        return(self.dayInCycle(d))
 
+    def menstruationDuration(self):
+       return(self.cfg['menstr'])
+
+    def ovulationDay(self):
+       return(self.cfg['ovday'])
+
     # Return:
     # ret={
     #  'status':   ['ok', 'red']
@@ -63,28 +86,41 @@ class Algo(object):
     def status(self, day):
        d=self.dayInCycle(day)
 
-       ovbefore=14
+       cycle=self.cycleLength()
 
-       if d<5:
+       #ovbefore=14
+       ovday=self.ovulationDay()
+       if ovday>0:
+           ovstart=ovday-3
+           ovmid=ovday
+           ovend=ovday+1
+       else:
+           ovstart=cycle+ovday-3
+           ovmid=cycle+ovday
+           ovend=cycle+ovday+1
+
+       menstr=self.menstruationDuration()
+
+       if d<menstr:
            # Red
            ret={
                'status':   'red',
                'day':      d,
-               'len':      5,
+               'len':      menstr,
                }
-       elif d>=self.cycle-7:
+       elif d>=cycle-7:
            ret={
                'status':   'blue',
-               'day':      7+d-self.cycle,
+               'day':      7+d-cycle,
                'len':      7,
                }
-       elif d>self.cycle-ovbefore-4 and d<=self.cycle-ovbefore:
+       elif d>=ovstart and d<=ovmid:
            ret={
                'status':   'green',
-               'day':      d-self.cycle+ovbefore+3,
+               'day':      d-ovstart,
                'len':      4,
                }
-       elif d>self.cycle-16 and d<=self.cycle-ovbefore+1:
+       elif d>ovmid and d<=ovend:
            ret={
                'status':   'green',
                'day':      2,
@@ -94,17 +130,11 @@ class Algo(object):
            ret={
                'status':   'ok',
                'day':      d,
-               'len':      self.cycle
+               'len':      cycle
                }
 
        return(ret)
 
-def today():
-    t=time.time() - time.timezone
-    day=int(t/86400)
-
-    return(day)
-
 
 # vim: set ts=8 sts=4 sw=4 noet formatoptions=r ai nocindent: