4 enigma.eTimer = eBaseImpl.eTimer
5 enigma.eSocketNotifier = eBaseImpl.eSocketNotifier
6 enigma.eConsoleAppContainer = eConsoleImpl.eConsoleAppContainer
8 from Tools.Profile import profile, profile_final
10 profile("PYTHON_START")
12 from enigma import runMainloop, eDVBDB, eTimer, quitMainloop, \
13 getDesktop, ePythonConfigQuery, eAVSwitch, eServiceEvent
18 from Components.Language import language
21 print "language set to", language.getLanguage()
22 eServiceEvent.setEPGLanguage(language.getLanguage())
24 language.addCallback(setEPGLanguage)
26 from traceback import print_exc
27 profile("LOAD:InfoBar")
28 import Screens.InfoBar
29 from Screens.SimpleSummary import SimpleSummary
31 from sys import stdout, exc_info
34 eDVBDB.getInstance().reloadBouquets()
36 profile("ParentalControl")
37 from Components.ParentalControl import InitParentalControl
40 profile("LOAD:Navigation")
41 from Navigation import Navigation
44 from skin import readSkin
47 from Tools.Directories import InitFallbackFiles, resolveFilename, SCOPE_PLUGINS, SCOPE_CURRENT_SKIN
48 from Components.config import config, configfile, ConfigText, ConfigYesNo, ConfigInteger, NoSave
51 profile("config.misc")
53 config.misc.radiopic = ConfigText(default = resolveFilename(SCOPE_CURRENT_SKIN, "radio.mvi"))
54 config.misc.isNextRecordTimerAfterEventActionAuto = ConfigYesNo(default=False)
55 config.misc.useTransponderTime = ConfigYesNo(default=True)
56 config.misc.startCounter = ConfigInteger(default=0) # number of e2 starts...
57 config.misc.standbyCounter = NoSave(ConfigInteger(default=0)) # number of standby
59 #demo code for use of standby enter leave callbacks
61 # print "!!!!!!!!!!!!!!!!!leave standby"
63 #def standbyCountChanged(configElement):
64 # print "!!!!!!!!!!!!!!!!!enter standby num", configElement.value
65 # from Screens.Standby import inStandby
66 # inStandby.onClose.append(leaveStandby)
68 #config.misc.standbyCounter.addNotifier(standbyCountChanged, initial_call = False)
69 ####################################################
71 def useTransponderTimeChanged(configElement):
72 enigma.eDVBLocalTimeHandler.getInstance().setUseDVBTime(configElement.value)
73 config.misc.useTransponderTime.addNotifier(useTransponderTimeChanged)
77 import twisted.python.runtime
78 twisted.python.runtime.platform.supportsThreads = lambda: False
83 from twisted.internet import reactor
86 reactor.run(installSignalHandlers=False)
88 print "twisted not available"
92 profile("LOAD:Plugin")
94 # initialize autorun plugins and plugin menu entries
95 from Components.PluginComponent import plugins
97 profile("LOAD:Wizard")
98 from Screens.Wizard import wizardManager
99 from Screens.DefaultWizard import *
100 from Screens.StartWizard import *
101 from Screens.TutorialWizard import *
103 from Tools.BoundFunction import boundFunction
104 from Plugins.Plugin import PluginDescriptor
109 def dump(dir, p = ""):
110 if isinstance(dir, dict):
111 for (entry, val) in dir.items():
112 dump(val, p + "(dict)/" + entry)
113 if hasattr(dir, "__dict__"):
114 for name, value in dir.__dict__.items():
115 if not had.has_key(str(value)):
117 dump(value, p + "/" + str(name))
119 print p + "/" + str(name) + ":" + str(dir.__class__) + "(cycle)"
121 print p + ":" + str(dir)
123 # + ":" + str(dir.__class__)
127 profile("LOAD:ScreenGlobals")
128 from Screens.Globals import Globals
129 from Screens.SessionGlobals import SessionGlobals
130 from Screens.Screen import Screen
133 Screen.global_screen = Globals()
136 # * push current active dialog ('current_dialog') onto stack
137 # * call execEnd for this dialog
138 # * clear in_exec flag
140 # * instantiate new dialog into 'current_dialog'
141 # * create screens, components
143 # * create GUI for screen
144 # * call execBegin for new dialog
147 # * call components' / screen's onExecBegin
148 # ... screen is active, until it calls 'close'...
151 # * save return value
152 # * start deferred close handler ('onClose')
161 def __init__(self, desktop = None, summary_desktop = None, navigation = None):
162 self.desktop = desktop
163 self.summary_desktop = summary_desktop
164 self.nav = navigation
165 self.delay_timer = eTimer()
166 self.delay_timer.callback.append(self.processDelay)
168 self.current_dialog = None
170 self.dialog_stack = [ ]
171 self.summary_stack = [ ]
176 self.screen = SessionGlobals(self)
178 for p in plugins.getPlugins(PluginDescriptor.WHERE_SESSIONSTART):
179 p(reason=0, session=self)
181 def processDelay(self):
182 callback = self.current_dialog.callback
184 retval = self.current_dialog.returnValue
186 if self.current_dialog.isTmp:
187 self.current_dialog.doClose()
188 # dump(self.current_dialog)
189 del self.current_dialog
191 del self.current_dialog.callback
194 if callback is not None:
197 def execBegin(self, first=True, do_show = True):
198 assert not self.in_exec
200 c = self.current_dialog
202 # when this is an execbegin after a execend of a "higher" dialog,
203 # popSummary already did the right thing.
206 summary = c.createSummary() or SimpleSummary
207 self.summary = self.instantiateSummaryDialog(summary, c)
209 c.addSummary(self.summary)
213 # when execBegin opened a new dialog, don't bother showing the old one.
214 if c == self.current_dialog and do_show:
217 def execEnd(self, last=True):
221 self.current_dialog.execEnd()
222 self.current_dialog.hide()
225 self.current_dialog.removeSummary(self.summary)
228 def create(self, screen, arguments, **kwargs):
229 # creates an instance of 'screen' (which is a class)
231 return screen(self, *arguments, **kwargs)
233 errstr = "Screen %s(%s, %s): %s" % (str(screen), str(arguments), str(kwargs), exc_info()[0])
235 print_exc(file=stdout)
238 def instantiateDialog(self, screen, *arguments, **kwargs):
239 return self.doInstantiateDialog(screen, arguments, kwargs, self.desktop)
241 def deleteDialog(self, screen):
245 def instantiateSummaryDialog(self, screen, *arguments, **kwargs):
246 return self.doInstantiateDialog(screen, arguments, kwargs, self.summary_desktop)
248 def doInstantiateDialog(self, screen, arguments, kwargs, desktop):
252 dlg = self.create(screen, arguments, **kwargs)
254 print 'EXCEPTION IN DIALOG INIT CODE, ABORTING:'
256 print_exc(file=stdout)
264 readSkin(dlg, None, dlg.skinName, desktop)
266 # create GUI view of this dialog
267 assert desktop is not None
269 dlg.setDesktop(desktop)
274 def pushCurrent(self):
275 if self.current_dialog is not None:
276 self.dialog_stack.append((self.current_dialog, self.current_dialog.shown))
277 self.execEnd(last=False)
279 def popCurrent(self):
280 if self.dialog_stack:
281 (self.current_dialog, do_show) = self.dialog_stack.pop()
282 self.execBegin(first=False, do_show=do_show)
284 self.current_dialog = None
286 def execDialog(self, dialog):
288 self.current_dialog = dialog
289 self.current_dialog.isTmp = False
290 self.current_dialog.callback = None # would cause re-entrancy problems.
293 def openWithCallback(self, callback, screen, *arguments, **kwargs):
294 dlg = self.open(screen, *arguments, **kwargs)
295 dlg.callback = callback
298 def open(self, screen, *arguments, **kwargs):
299 if self.dialog_stack and not self.in_exec:
300 raise RuntimeError("modal open are allowed only from a screen which is modal!")
301 # ...unless it's the very first screen.
304 dlg = self.current_dialog = self.instantiateDialog(screen, *arguments, **kwargs)
310 def close(self, screen, *retval):
312 print "close after exec!"
315 # be sure that the close is for the right dialog!
316 # if it's not, you probably closed after another dialog
317 # was opened. this can happen if you open a dialog
318 # onExecBegin, and forget to do this only once.
319 # after close of the top dialog, the underlying will
320 # gain focus again (for a short time), thus triggering
321 # the onExec, which opens the dialog again, closing the loop.
322 assert screen == self.current_dialog
324 self.current_dialog.returnValue = retval
325 self.delay_timer.start(0, 1)
328 def pushSummary(self):
329 if self.summary is not None:
331 self.summary_stack.append(self.summary)
334 def popSummary(self):
335 if self.summary is not None:
336 self.summary.doClose()
337 self.summary = self.summary_stack.pop()
338 if self.summary is not None:
341 profile("Standby,PowerKey")
342 import Screens.Standby
343 from Screens.Menu import MainMenu, mdom
344 from GlobalActions import globalActionMap
347 """ PowerKey stuff - handles the powerkey press and powerkey release actions"""
349 def __init__(self, session):
350 self.session = session
351 globalActionMap.actions["power_down"]=self.powerdown
352 globalActionMap.actions["power_up"]=self.powerup
353 globalActionMap.actions["power_long"]=self.powerlong
354 globalActionMap.actions["deepstandby"]=self.shutdown # frontpanel long power button press
355 self.standbyblocked = 1
357 def MenuClosed(self, *val):
358 self.session.infobar = None
361 print "PowerOff - Now!"
362 if not Screens.Standby.inTryQuitMainloop and self.session.current_dialog and self.session.current_dialog.ALLOW_SUSPEND:
363 self.session.open(Screens.Standby.TryQuitMainloop, 1)
366 if Screens.Standby.inTryQuitMainloop or (self.session.current_dialog and not self.session.current_dialog.ALLOW_SUSPEND):
368 self.doAction(action = config.usage.on_long_powerpress.value)
370 def doAction(self, action):
371 self.standbyblocked = 1
372 if action == "shutdown":
374 elif action == "show_menu":
375 print "Show shutdown Menu"
376 root = mdom.getroot()
377 for x in root.findall("menu"):
381 if id and id == "shutdown":
382 self.session.infobar = self
383 menu_screen = self.session.openWithCallback(self.MenuClosed, MainMenu, x)
384 menu_screen.setTitle(_("Standby / Restart"))
388 self.standbyblocked = 0
391 if self.standbyblocked == 0:
392 self.doAction(action = config.usage.on_short_powerpress.value)
395 if not Screens.Standby.inStandby and self.session.current_dialog and self.session.current_dialog.ALLOW_SUSPEND and self.session.in_exec:
396 self.session.open(Screens.Standby.Standby)
399 from Screens.Scart import Scart
401 class AutoScartControl:
402 def __init__(self, session):
404 self.current_vcr_sb = eAVSwitch.getInstance().getVCRSlowBlanking()
405 if self.current_vcr_sb and config.av.vcrswitch.value:
406 self.scartDialog = session.instantiateDialog(Scart, True)
408 self.scartDialog = session.instantiateDialog(Scart, False)
409 config.av.vcrswitch.addNotifier(self.recheckVCRSb)
410 eAVSwitch.getInstance().vcr_sb_notifier.get().append(self.VCRSbChanged)
412 def recheckVCRSb(self, configElement):
413 self.VCRSbChanged(self.current_vcr_sb)
415 def VCRSbChanged(self, value):
416 #print "vcr sb changed to", value
417 self.current_vcr_sb = value
418 if config.av.vcrswitch.value or value > 2:
420 self.scartDialog.showMessageBox()
422 self.scartDialog.switchToTV()
425 from enigma import eDVBCIInterfaces
426 from Screens.Ci import CiHandler
428 profile("Load:VolumeControl")
429 from Components.VolumeControl import VolumeControl
432 config.misc.startCounter.value += 1
434 profile("readPluginList")
435 plugins.readPluginList(resolveFilename(SCOPE_PLUGINS))
437 profile("Init:Session")
438 nav = Navigation(config.misc.isNextRecordTimerAfterEventActionAuto.value)
439 session = Session(desktop = getDesktop(0), summary_desktop = getDesktop(1), navigation = nav)
441 CiHandler.setSession(session)
443 screensToRun = [ p.__call__ for p in plugins.getPlugins(PluginDescriptor.WHERE_WIZARD) ]
446 screensToRun += wizardManager.getWizards()
448 screensToRun.append((100, Screens.InfoBar.InfoBar))
452 ePythonConfigQuery.setQueryFunc(configfile.getResolvedKey)
454 # eDVBCIInterfaces.getInstance().setDescrambleRules(0 # Slot Number
455 # ,( ["1:0:1:24:4:85:C00000:0:0:0:"], #service_list
456 # ["PREMIERE"], #provider_list,
460 def runNextScreen(session, screensToRun, *result):
462 quitMainloop(*result)
465 screen = screensToRun[0][1]
466 args = screensToRun[0][2:]
469 session.openWithCallback(boundFunction(runNextScreen, session, screensToRun[1:]), screen, *args)
471 session.open(screen, *args)
473 runNextScreen(session, screensToRun)
475 profile("Init:VolumeControl")
476 vol = VolumeControl(session)
477 profile("Init:PowerKey")
478 power = PowerKey(session)
480 # we need session.scart to access it from within menu.xml
481 session.scart = AutoScartControl(session)
483 profile("RunReactor")
487 config.misc.startCounter.save()
490 from time import time, strftime, localtime
491 from Tools.DreamboxHardware import setFPWakeuptime, getFPWakeuptime, setRTCtime
495 x for x in ((session.nav.RecordTimer.getNextRecordingTime(), 0, session.nav.RecordTimer.isNextRecordAfterEventActionAuto()),
496 (session.nav.RecordTimer.getNextZapTime(), 1),
497 (plugins.getNextWakeupTime(), 2))
501 recordTimerWakeupAuto = False
503 from time import strftime
504 startTime = wakeupList[0]
505 if (startTime[0] - nowTime) < 270: # no time to switch box back on
506 wptime = nowTime + 30 # so switch back on in 30 seconds
508 wptime = startTime[0] - 240
509 if not config.misc.useTransponderTime.value:
510 print "dvb time sync disabled... so set RTC now to current linux time!", strftime("%Y/%m/%d %H:%M", localtime(nowTime))
512 print "set wakeup time to", strftime("%Y/%m/%d %H:%M", localtime(wptime))
513 setFPWakeuptime(wptime)
514 recordTimerWakeupAuto = startTime[1] == 0 and startTime[2]
515 config.misc.isNextRecordTimerAfterEventActionAuto.value = recordTimerWakeupAuto
516 config.misc.isNextRecordTimerAfterEventActionAuto.save()
518 profile("stopService")
519 session.nav.stopService()
520 profile("nav shutdown")
521 session.nav.shutdown()
523 profile("configfile.save")
530 skin.loadSkinData(getDesktop(0))
532 profile("InputDevice")
533 import Components.InputDevice
534 Components.InputDevice.InitInputDevices()
537 import Components.AVSwitch
538 Components.AVSwitch.InitAVSwitch()
540 profile("RecordingConfig")
541 import Components.RecordingConfig
542 Components.RecordingConfig.InitRecordingConfig()
544 profile("UsageConfig")
545 import Components.UsageConfig
546 Components.UsageConfig.InitUsageConfig()
548 profile("keymapparser")
550 keymapparser.readKeymap(config.usage.keymap.value)
553 import Components.Network
554 Components.Network.InitNetwork()
557 import Components.Lcd
558 Components.Lcd.InitLcd()
560 profile("SetupDevices")
561 import Components.SetupDevices
562 Components.SetupDevices.InitSetupDevices()
565 import Components.RFmod
566 Components.RFmod.InitRFmod()
570 Screens.Ci.InitCiConfig()
572 #from enigma import dump_malloc_stats
574 #t.callback.append(dump_malloc_stats)
577 # first, setup a screen
583 from Components.ParentalControl import parentalControl
584 parentalControl.save()
586 print 'EXCEPTION IN PYTHON STARTUP CODE:'
588 print_exc(file=stdout)