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"))
386 elif action == "standby":
390 self.standbyblocked = 0
393 if self.standbyblocked == 0:
394 self.doAction(action = config.usage.on_short_powerpress.value)
397 if not Screens.Standby.inStandby and self.session.current_dialog and self.session.current_dialog.ALLOW_SUSPEND and self.session.in_exec:
398 self.session.open(Screens.Standby.Standby)
401 from Screens.Scart import Scart
403 class AutoScartControl:
404 def __init__(self, session):
406 self.current_vcr_sb = eAVSwitch.getInstance().getVCRSlowBlanking()
407 if self.current_vcr_sb and config.av.vcrswitch.value:
408 self.scartDialog = session.instantiateDialog(Scart, True)
410 self.scartDialog = session.instantiateDialog(Scart, False)
411 config.av.vcrswitch.addNotifier(self.recheckVCRSb)
412 eAVSwitch.getInstance().vcr_sb_notifier.get().append(self.VCRSbChanged)
414 def recheckVCRSb(self, configElement):
415 self.VCRSbChanged(self.current_vcr_sb)
417 def VCRSbChanged(self, value):
418 #print "vcr sb changed to", value
419 self.current_vcr_sb = value
420 if config.av.vcrswitch.value or value > 2:
422 self.scartDialog.showMessageBox()
424 self.scartDialog.switchToTV()
427 from enigma import eDVBCIInterfaces
428 from Screens.Ci import CiHandler
430 profile("Load:VolumeControl")
431 from Components.VolumeControl import VolumeControl
434 config.misc.startCounter.value += 1
436 profile("readPluginList")
437 plugins.readPluginList(resolveFilename(SCOPE_PLUGINS))
439 profile("Init:Session")
440 nav = Navigation(config.misc.isNextRecordTimerAfterEventActionAuto.value)
441 session = Session(desktop = getDesktop(0), summary_desktop = getDesktop(1), navigation = nav)
443 CiHandler.setSession(session)
445 screensToRun = [ p.__call__ for p in plugins.getPlugins(PluginDescriptor.WHERE_WIZARD) ]
448 screensToRun += wizardManager.getWizards()
450 screensToRun.append((100, Screens.InfoBar.InfoBar))
454 ePythonConfigQuery.setQueryFunc(configfile.getResolvedKey)
456 # eDVBCIInterfaces.getInstance().setDescrambleRules(0 # Slot Number
457 # ,( ["1:0:1:24:4:85:C00000:0:0:0:"], #service_list
458 # ["PREMIERE"], #provider_list,
462 def runNextScreen(session, screensToRun, *result):
464 quitMainloop(*result)
467 screen = screensToRun[0][1]
468 args = screensToRun[0][2:]
471 session.openWithCallback(boundFunction(runNextScreen, session, screensToRun[1:]), screen, *args)
473 session.open(screen, *args)
475 runNextScreen(session, screensToRun)
477 profile("Init:VolumeControl")
478 vol = VolumeControl(session)
479 profile("Init:PowerKey")
480 power = PowerKey(session)
482 # we need session.scart to access it from within menu.xml
483 session.scart = AutoScartControl(session)
485 profile("RunReactor")
489 config.misc.startCounter.save()
492 from time import time, strftime, localtime
493 from Tools.DreamboxHardware import setFPWakeuptime, getFPWakeuptime, setRTCtime
497 x for x in ((session.nav.RecordTimer.getNextRecordingTime(), 0, session.nav.RecordTimer.isNextRecordAfterEventActionAuto()),
498 (session.nav.RecordTimer.getNextZapTime(), 1),
499 (plugins.getNextWakeupTime(), 2))
503 recordTimerWakeupAuto = False
505 from time import strftime
506 startTime = wakeupList[0]
507 if (startTime[0] - nowTime) < 270: # no time to switch box back on
508 wptime = nowTime + 30 # so switch back on in 30 seconds
510 wptime = startTime[0] - 240
511 if not config.misc.useTransponderTime.value:
512 print "dvb time sync disabled... so set RTC now to current linux time!", strftime("%Y/%m/%d %H:%M", localtime(nowTime))
514 print "set wakeup time to", strftime("%Y/%m/%d %H:%M", localtime(wptime))
515 setFPWakeuptime(wptime)
516 recordTimerWakeupAuto = startTime[1] == 0 and startTime[2]
517 config.misc.isNextRecordTimerAfterEventActionAuto.value = recordTimerWakeupAuto
518 config.misc.isNextRecordTimerAfterEventActionAuto.save()
520 profile("stopService")
521 session.nav.stopService()
522 profile("nav shutdown")
523 session.nav.shutdown()
525 profile("configfile.save")
532 skin.loadSkinData(getDesktop(0))
534 profile("InputDevice")
535 import Components.InputDevice
536 Components.InputDevice.InitInputDevices()
539 import Components.AVSwitch
540 Components.AVSwitch.InitAVSwitch()
542 profile("RecordingConfig")
543 import Components.RecordingConfig
544 Components.RecordingConfig.InitRecordingConfig()
546 profile("UsageConfig")
547 import Components.UsageConfig
548 Components.UsageConfig.InitUsageConfig()
550 profile("keymapparser")
552 keymapparser.readKeymap(config.usage.keymap.value)
555 import Components.Network
556 Components.Network.InitNetwork()
559 import Components.Lcd
560 Components.Lcd.InitLcd()
562 profile("SetupDevices")
563 import Components.SetupDevices
564 Components.SetupDevices.InitSetupDevices()
567 import Components.RFmod
568 Components.RFmod.InitRFmod()
572 Screens.Ci.InitCiConfig()
574 #from enigma import dump_malloc_stats
576 #t.callback.append(dump_malloc_stats)
579 # first, setup a screen
585 from Components.ParentalControl import parentalControl
586 parentalControl.save()
588 print 'EXCEPTION IN PYTHON STARTUP CODE:'
590 print_exc(file=stdout)