From: Felix Domke Date: Wed, 4 May 2005 15:56:32 +0000 (+0000) Subject: - add timer, RecordTimer X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=commitdiff_plain;h=f0273520285e28b22053eda706690774b0c8448c - add timer, RecordTimer - use timer for instantReport --- diff --git a/RecordTimer.py b/RecordTimer.py new file mode 100644 index 0000000..ad7fa56 --- /dev/null +++ b/RecordTimer.py @@ -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() diff --git a/mytest.py b/mytest.py index a8559c0..1f86302 100644 --- a/mytest.py +++ b/mytest.py @@ -1,6 +1,7 @@ from enigma import * from tools import * +import RecordTimer import sys import time @@ -153,6 +154,8 @@ class Navigation: 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: @@ -169,12 +172,14 @@ class Navigation: return self.currentlyPlayingServiceReference def recordService(self, ref): + service = iRecordableServicePtr() 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) @@ -193,6 +198,11 @@ class Navigation: 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() diff --git a/screens.py b/screens.py index df0870a..288a225 100644 --- a/screens.py +++ b/screens.py @@ -6,6 +6,7 @@ import xml.dom.minidom from xml.dom import EMPTY_NAMESPACE from skin import elementsWithTag +import time # 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.recording = 0 + self.recording = None def mainMenu(self): print "loading mainmenu XML..." @@ -365,12 +366,25 @@ class infoBar(Screen): 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: - 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): @@ -406,4 +420,3 @@ class serviceScan(Screen): "ok": self.ok, "cancel": self.cancel }) - diff --git a/timer.py b/timer.py new file mode 100644 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"))