- add timer, RecordTimer
authorFelix Domke <tmbinc@elitedvb.net>
Wed, 4 May 2005 15:56:32 +0000 (15:56 +0000)
committerFelix Domke <tmbinc@elitedvb.net>
Wed, 4 May 2005 15:56:32 +0000 (15:56 +0000)
 - use timer for instantReport

RecordTimer.py [new file with mode: 0644]
mytest.py
screens.py
timer.py [new file with mode: 0644]

diff --git a/RecordTimer.py b/RecordTimer.py
new file mode 100644 (file)
index 0000000..ad7fa56
--- /dev/null
@@ -0,0 +1,66 @@
+from timer import *
+import time
+
+class RecordTimerEntry(TimerEntry):
+       def __init__(self, begin, end, nav, serviceref, epg):
+               TimerEntry.__init__(self, begin, end)
+               self.ServiceRef = serviceref
+               self.EpgData = epg
+               self.Timer = None
+               self.Nav = nav
+               self.RecordService = None
+               
+               # build filename from epg
+               
+               # pff das geht noch nicht...
+               if epg == None:
+                       self.Filename = "recording.ts"
+               else:
+                       self.Filename = "record_" + str(epg.m_event_name) + ".ts"
+               
+               print "------------ record filename: %s" % (self.Filename)
+               
+       def activate(self, event):
+               if event == self.EventPrepare:
+                       self.RecordService = self.Nav.recordService(self.ServiceRef)
+                       if self.RecordService == None:
+                               print "timer record failed."
+                       else:   
+                               self.RecordService.prepare()
+               elif self.RecordService == None:
+                       if event != self.EventAbort:
+                               print "timer record start failed, can't finish recording."
+               elif event == self.EventStart:
+                       self.RecordService.start()
+                       print "timer started!"
+               elif event == self.EventEnd or event == self.EventAbort:
+                       self.RecordService.stop()
+                       self.RecordService = None
+                       print "Timer successfully ended"
+
+class RecordTimer(Timer):
+       def __init__(self):
+               Timer.__init__(self)
+               
+       def loadTimer(self):
+               print "TODO: load timers from xml"
+       
+       def saveTimer(self):
+               print "TODO: save timers to xml"
+       
+       def record(self, entry):
+               entry.Timer = self
+               self.addTimerEntry(entry)
+
+       def removeEntry(self, entry):
+               if entry.State == TimerEntry.StateRunning:
+                       entry.End = time.time()
+                       print "aborting timer"
+               elif entry.State != TimerEntry.StateEnded:
+                       entry.activate(TimerEntry.EventAbort)
+                       self.TimerList.remove(entry)
+                       print "timer did not yet start - removing"
+               else:
+                       print "timer did already end - doing nothing."
+
+               self.calcNextActivation()
index a8559c0..1f86302 100644 (file)
--- a/mytest.py
+++ b/mytest.py
@@ -1,6 +1,7 @@
 from enigma import *
 from tools import *
 
 from enigma import *
 from tools import *
 
+import RecordTimer
 
 import sys
 import time
 
 import sys
 import time
@@ -153,6 +154,8 @@ class Navigation:
                self.pnav.m_event.get().append(self.callEvent)
                self.event = [ ]
                self.currentlyPlayingService = None
                self.pnav.m_event.get().append(self.callEvent)
                self.event = [ ]
                self.currentlyPlayingService = None
+               
+               self.RecordTimer = RecordTimer.RecordTimer()
 
        def callEvent(self, i):
                for x in self.event:
 
        def callEvent(self, i):
                for x in self.event:
@@ -169,12 +172,14 @@ class Navigation:
                return self.currentlyPlayingServiceReference
        
        def recordService(self, ref):
                return self.currentlyPlayingServiceReference
        
        def recordService(self, ref):
+               service = iRecordableServicePtr()
                print "recording service: %s" % (str(ref))
                print "recording service: %s" % (str(ref))
-               print self.pnav.recordService
-               return self.pnav.recordService(ref)
-       
-       def endRecording(self):
-               return self.pnav.endRecording()
+               if self.pnav.recordService(ref, service):
+                       print "record returned non-zero"
+                       return None
+               else:
+                       print "ok, recordService didn't fail"
+                       return service
        
        def enqueueService(self, ref):
                return self.pnav.enqueueService(ref)
        
        def enqueueService(self, ref):
                return self.pnav.enqueueService(ref)
@@ -193,6 +198,11 @@ class Navigation:
        
        def pause(self, p):
                return self.pnav.pause(p)
        
        def pause(self, p):
                return self.pnav.pause(p)
+       
+       def recordWithTimer(self, begin, end, ref, epg):
+               entry = RecordTimer.RecordTimerEntry(begin, end, self, ref, epg)
+               self.RecordTimer.record(entry)
+               return entry
 
 def runScreenTest():
        session = Session()
 
 def runScreenTest():
        session = Session()
index df0870a..288a225 100644 (file)
@@ -6,6 +6,7 @@ import xml.dom.minidom
 from xml.dom import EMPTY_NAMESPACE
 from skin import elementsWithTag
 
 from xml.dom import EMPTY_NAMESPACE
 from skin import elementsWithTag
 
+import time
 
 # some screens
 def doGlobal(screen):
 
 # some screens
 def doGlobal(screen):
@@ -347,7 +348,7 @@ class infoBar(Screen):
                self["Event_Now_Duration"] = EventInfo(self.session.nav, EventInfo.Now_Duration)
                self["Event_Next_Duration"] = EventInfo(self.session.nav, EventInfo.Next_Duration)
                
                self["Event_Now_Duration"] = EventInfo(self.session.nav, EventInfo.Now_Duration)
                self["Event_Next_Duration"] = EventInfo(self.session.nav, EventInfo.Next_Duration)
                
-               self.recording = 0
+               self.recording = None
        
        def mainMenu(self):
                print "loading mainmenu XML..."
        
        def mainMenu(self):
                print "loading mainmenu XML..."
@@ -365,12 +366,25 @@ class infoBar(Screen):
                self.servicelist.zapDown()
                
        def instantRecord(self):
                self.servicelist.zapDown()
                
        def instantRecord(self):
-               if self.recording:
-                       self.session.nav.endRecording()
-                       self.recording = 0
+               if self.recording != None:
+                       print "remove entry"
+                       self.session.nav.RecordTimer.removeEntry(self.recording)
+                       self.recording = None
                else:
                else:
-                       self.session.nav.recordService(self.session.nav.getCurrentlyPlayingServiceReference())
-                       self.recording = 1
+                       serviceref = self.session.nav.getCurrentlyPlayingServiceReference()
+                       
+                       # try to get event info
+                       epg = None
+                       service = self.session.nav.getCurrentService()
+                       if service != None:
+                               info = iServiceInformationPtr()
+                               if not service.info(info):
+                                       ev = eServiceEventPtr()
+                                       if info.getEvent(ev, 0) == 0:
+                                               epg = ev
+
+                       self.recording = self.session.nav.recordWithTimer(time.time(), time.time() + 30, serviceref, epg)
+                       print "got entry: %s" % (str(self.recording))
 
 # a clock display dialog
 class clockDisplay(Screen):
 
 # a clock display dialog
 class clockDisplay(Screen):
@@ -406,4 +420,3 @@ class serviceScan(Screen):
                                "ok": self.ok,
                                "cancel": self.cancel
                        })
                                "ok": self.ok,
                                "cancel": self.cancel
                        })
-
diff --git a/timer.py b/timer.py
new file mode 100644 (file)
index 0000000..294102b
--- /dev/null
+++ b/timer.py
@@ -0,0 +1,94 @@
+import bisect
+from time import *
+from enigma import *
+
+class TimerEntry:
+       EventPrepare = 0
+       EventStart   = 1
+       EventEnd     = 2
+       EventAbort   = 3
+       
+       StateWait    = 0
+       StatePrepare = 1
+       StateRunning = 2
+       StateEnded   = 3
+       
+       def __init__(self, begin, end):
+               self.Begin = begin
+               self.Prepare = 10
+               self.End = end
+               self.State = 0
+       
+       def getTime(self):
+               if self.State == 0:
+                       return self.Begin - self.Prepare
+               elif self.State == 1:
+                       return self.Begin
+               else:
+                       return self.End 
+       
+       def __lt__(self, o):
+               return self.getTime() < o.getTime()
+       
+       def activate(self, event):
+               print "timer %s got activated (%d)!" % (self.Description, event)
+
+class Timer:
+
+       MaxWaitTime = 100
+
+       def __init__(self):
+               self.TimerList = [ ]
+               self.ProcessedTimers = [ ]
+               
+               self.Timer = eTimer()
+               self.Timer.timeout.get().append(self.calcNextActivation)
+               
+               self.calcNextActivation()
+       
+       def addTimerEntry(self, entry):
+               bisect.insort(self.TimerList, entry)
+               self.calcNextActivation()
+       
+       def setNextActivation(self, when):
+               delay = int((when - time()) * 1000)
+               print "next activation: %d (in %d seconds)" % (when, delay)
+               
+               self.Timer.start(delay, 1)
+               self.next = when
+
+       def calcNextActivation(self):
+               self.processActivation()
+       
+               min = int(time()) + self.MaxWaitTime
+               
+               # calculate next activation point
+               if len(self.TimerList):
+                       w = self.TimerList[0].getTime()
+                       if w < min:
+                               min = w
+               
+               self.setNextActivation(min)
+       
+       def doActivate(self, w):
+               w.activate(w.State)
+               self.TimerList.remove(w)
+               w.State += 1
+               if w.State < TimerEntry.StateEnded:
+                       bisect.insort(self.TimerList, w)
+               else:
+                       bisect.insort(self.ProcessedTimers, w)
+       
+       def processActivation(self):
+               t = int(time()) + 1
+               
+               # we keep on processing the first entry until it goes into the future.
+               while len(self.TimerList) and self.TimerList[0].getTime() < t:
+                       self.doActivate(self.TimerList[0])
+
+#t = Timer()
+#base = time() + 5
+#t.addTimerEntry(TimerEntry(base+10, base+20, None, None, "test #1: 10 - 20"))
+#t.addTimerEntry(TimerEntry(base+10, base+30, None, None, "test #2: 10 - 30"))
+#t.addTimerEntry(TimerEntry(base+15, base+20, None, None, "test #3: 15 - 20"))
+#t.addTimerEntry(TimerEntry(base+20, base+35, None, None, "test #4: 20 - 35"))