--- /dev/null
+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()
from enigma import *
from tools import *
+import RecordTimer
import sys
import time
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:
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)
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()
from xml.dom import EMPTY_NAMESPACE
from skin import elementsWithTag
+import time
# some screens
def doGlobal(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..."
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):
"ok": self.ok,
"cancel": self.cancel
})
-
--- /dev/null
+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"))