add specific rc settings to diffrent box defaults:
[enigma2.git] / timer.py
index 3511694839ae635a773812e1235776c326b9fcce..be629099f62e7f91464f92178e16553dcd7b5003 100644 (file)
--- a/timer.py
+++ b/timer.py
@@ -1,7 +1,7 @@
 from bisect import insort
-from time import strftime, time, localtime, gmtime, mktime
-from calendar import timegm
+from time import strftime, time, localtime, mktime
 from enigma import eTimer
+import datetime
 
 class TimerEntry:
        StateWaiting  = 0
@@ -15,10 +15,19 @@ class TimerEntry:
                self.end = end
                self.state = 0
                self.resetRepeated()
+               #begindate = localtime(self.begin)
+               #newdate = datetime.datetime(begindate.tm_year, begindate.tm_mon, begindate.tm_mday 0, 0, 0);
+               self.repeatedbegindate = begin
                self.backoff = 0
                
                self.disabled = False
-               
+
+       def resetState(self):
+               self.state = self.StateWaiting
+               self.cancelled = False
+               self.first_try_prepare = True
+               self.timeChanged()
+
        def resetRepeated(self):
                self.repeated = int(0)
 
@@ -29,6 +38,13 @@ class TimerEntry:
        def isRunning(self):
                return self.state == self.StateRunning
                
+       def addOneDay(self, timedatestruct):
+               oldHour = timedatestruct.tm_hour
+               newdate =  (datetime.datetime(timedatestruct.tm_year, timedatestruct.tm_mon, timedatestruct.tm_mday, timedatestruct.tm_hour, timedatestruct.tm_min, timedatestruct.tm_sec) + datetime.timedelta(days=1)).timetuple()
+               if localtime(mktime(newdate)).tm_hour != oldHour:
+                       return (datetime.datetime(timedatestruct.tm_year, timedatestruct.tm_mon, timedatestruct.tm_mday, timedatestruct.tm_hour, timedatestruct.tm_min, timedatestruct.tm_sec) + datetime.timedelta(days=2)).timetuple()                        
+               return newdate
+               
        # update self.begin and self.end according to the self.repeated-flags
        def processRepeated(self, findRunningEvent = True):
                print "ProcessRepeated"
@@ -36,12 +52,15 @@ class TimerEntry:
                        now = int(time()) + 1
 
                        #to avoid problems with daylight saving, we need to calculate with localtime, in struct_time representation
+                       localrepeatedbegindate = localtime(self.repeatedbegindate)
                        localbegin = localtime(self.begin)
                        localend = localtime(self.end)
                        localnow = localtime(now)
 
-                       print strftime("%c", localbegin)
-                       print strftime("%c", localend)
+                       print "localrepeatedbegindate:", strftime("%c", localrepeatedbegindate)
+                       print "localbegin:", strftime("%c", localbegin)
+                       print "localend:", strftime("%c", localend)
+                       print "localnow:", strftime("%c", localnow)
 
                        day = []
                        flags = self.repeated
@@ -53,18 +72,20 @@ class TimerEntry:
                                        day.append(1)
                                flags = flags >> 1
 
-                       print strftime("%c", localnow)
-
-                       while ((day[localbegin.tm_wday] != 0) or ((day[localbegin.tm_wday] == 0) and ((findRunningEvent and localend < localnow) or ((not findRunningEvent) and localbegin < localnow)))):
-                               print "localbegin:", strftime("%c", localbegin)
-                               print "localend:", strftime("%c", localend)
-                               #add one day to the struct_time, we have to convert using gmt functions, because the daylight saving flag might change after we add our 86400 seconds
-                               localbegin = gmtime(timegm(localbegin) + 86400)
-                               localend = gmtime(timegm(localend) + 86400)
-
+                       # if day is NOT in the list of repeated days
+                       # OR if the day IS in the list of the repeated days, check, if event is currently running... then if findRunningEvent is false, go to the next event
+                       while ((day[localbegin.tm_wday] != 0) or (mktime(localrepeatedbegindate) > mktime(localbegin))  or
+                               ((day[localbegin.tm_wday] == 0) and ((findRunningEvent and localend < localnow) or ((not findRunningEvent) and localbegin < localnow)))):
+                               localbegin = self.addOneDay(localbegin)
+                               localend = self.addOneDay(localend)
+                               print "localbegin after addOneDay:", strftime("%c", localbegin)
+                               print "localend after addOneDay:", strftime("%c", localend)
+                               
                        #we now have a struct_time representation of begin and end in localtime, but we have to calculate back to (gmt) seconds since epoch
                        self.begin = int(mktime(localbegin))
-                       self.end = int(mktime(localend)) + 1
+                       self.end = int(mktime(localend))
+                       if self.begin == self.end:
+                               self.end += 1
 
                        print "ProcessRepeated result"
                        print strftime("%c", localtime(self.begin))
@@ -124,7 +145,7 @@ class Timer:
                self.processed_timers = [ ]
                
                self.timer = eTimer()
-               self.timer.timeout.get().append(self.calcNextActivation)
+               self.timer.callback.append(self.calcNextActivation)
                self.lastActivation = time()
                
                self.calcNextActivation()
@@ -182,6 +203,8 @@ class Timer:
                        w = self.timer_list[0].getNextActivation()
                        if w < min:
                                min = w
+                       else:
+                               print "next real activation is", strftime("%c", localtime(w))
                
                self.setNextActivation(min)