add videowizard
authorStefan Pluecken <stefan.pluecken@multimedia-labs.de>
Thu, 24 Jan 2008 03:49:08 +0000 (03:49 +0000)
committerStefan Pluecken <stefan.pluecken@multimedia-labs.de>
Thu, 24 Jan 2008 03:49:08 +0000 (03:49 +0000)
lib/python/Plugins/SystemPlugins/Videomode/Makefile.am
lib/python/Plugins/SystemPlugins/Videomode/VideoHardware.py [new file with mode: 0644]
lib/python/Plugins/SystemPlugins/Videomode/VideoWizard.py [new file with mode: 0644]
lib/python/Plugins/SystemPlugins/Videomode/plugin.py
lib/python/Plugins/SystemPlugins/Videomode/videowizard.xml [new file with mode: 0644]

index 3dbd934ec462e996fe83a276d5ec1e20c1e44e96..412c80cd78ba35529b9f46546e77a0e5d432fc54 100644 (file)
@@ -2,4 +2,7 @@ installdir = $(LIBDIR)/enigma2/python/Plugins/SystemPlugins/Videomode
 
 install_PYTHON =       \
        __init__.py \
-       plugin.py
+       plugin.py \
+       VideoHardware.py \
+       VideoWizard.py \
+       videowizard.xml
diff --git a/lib/python/Plugins/SystemPlugins/Videomode/VideoHardware.py b/lib/python/Plugins/SystemPlugins/Videomode/VideoHardware.py
new file mode 100644 (file)
index 0000000..258f78b
--- /dev/null
@@ -0,0 +1,158 @@
+from Screens.Screen import Screen
+from Plugins.Plugin import PluginDescriptor
+
+from enigma import eTimer
+
+from Components.ActionMap import ActionMap
+from Components.Label import Label
+from Components.Pixmap import Pixmap
+from Screens.MessageBox import MessageBox
+from Screens.Setup import SetupSummary
+from Components.ConfigList import ConfigListScreen
+from Components.config import getConfigListEntry, config, ConfigNothing, ConfigSelection, ConfigSubDict
+
+from Tools.CList import CList
+
+# The "VideoHardware" is the interface to /proc/stb/video.
+# It generates hotplug events, and gives you the list of 
+# available and preferred modes, as well as handling the currently
+# selected mode. No other strict checking is done.
+class VideoHardware:
+       rates = { } # high-level, use selectable modes.
+
+       modes = { }  # a list of (high-level) modes for a certain port.
+
+       rates["PAL"] =                  { "50Hz":               { 50: "pal", 60: "pal"},
+                                                                                               "60Hz":         { 50: "pal60", 60: "pal60"},
+                                                                                               "multi":        { 50: "pal", 60: "pal60"} }
+       rates["NTSC"] =                 { "60Hz":       { 50: "ntsc", 60: "ntsc"} }
+       rates["Multi"] =                { "multi":      { 50: "pal", 60: "ntsc"} }
+       rates["720p"] =                 {       "50Hz":         { 50: "720p50", 60: "720p50"},
+                                                                                               "60Hz":         { 50: "720p", 60: "720p"},
+                                                                                               "multi":        { 50: "720p50", 60: "720p"} }
+       rates["1080i"] =                { "50Hz":               { 50: "1080i50", 60: "1080i50"},
+                                                                                               "60Hz":         { 50: "1080i", 60: "1080i"},
+                                                                                               "multi":        { 50: "1080i50", 60: "1080i"} }
+       rates["PC"] = { 
+               "1024x768": { 60: "1024x768"}, # not possible on DM7025
+               "800x600" : { 60: "800x600"},  # also not possible
+               "720x480" : { 60: "720x480"},
+               "720x576" : { 60: "720x576"},
+               "1280x720": { 60: "1280x720"},
+               "1280x720 multi": { 50: "1280x720_50", 60: "1280x720"},
+               "1920x1080": { 60: "1920x1080"},
+               "1920x1080 multi": { 50: "1920x1080", 60: "1920x1080_50"},
+               "1280x1024" : { 60: "1280x1024"},
+               "640x480" : { 60: "640x480"} 
+       }
+
+       modes["Scart"] = ["PAL", "NTSC", "Multi"]
+       modes["YPrPb"] = ["720p", "1080i"]
+       modes["DVI"] = ["720p", "1080i", "PC"]
+
+       def __init__(self):
+               self.last_modes_preferred =  [ ]
+               self.on_hotplug = CList()
+
+               self.on_hotplug.append(self.createConfig)
+               self.ignore_preferred = False   # "edid override"
+
+               self.readAvailableModes()
+               self.readPreferredModes()
+
+               # until we have the hotplug poll socket
+               self.timer = eTimer()
+               self.timer.timeout.get().append(self.readAvailableModes)
+               self.timer.start(1000)
+
+       def readAvailableModes(self):
+               try:
+                       modes = open("/proc/stb/video/videomode_choices").read()[:-1]
+               except IOError:
+                       print "couldn't read available videomodes."
+                       self.modes_available = [ ]
+                       return
+               self.modes_available = modes.split(' ')
+
+       def readPreferredModes(self):
+               try:
+                       modes = open("/proc/stb/video/videomode_preferred").read()[:-1]
+                       self.modes_preferred = modes.split(' ')
+               except IOError:
+                       print "reading preferred modes failed, using all modes"
+                       self.modes_preferred = self.modes_available
+
+               if self.modes_preferred != self.last_modes_preferred:
+                       self.last_modes_preferred = self.modes_preferred
+                       self.on_hotplug("DVI") # must be DVI
+
+       # check if a high-level mode with a given rate is available.
+       def isModeAvailable(self, port, mode, rate):
+               rate = self.rates[mode][rate]
+               for mode in rate.values():
+                       # DVI modes must be in "modes_preferred"
+                       if port == "DVI":
+                               if mode not in self.modes_preferred and not self.ignore_preferred:
+                                       return False
+                       if mode not in self.modes_available:
+                               return False
+               return True
+
+       def setMode(self, port, mode, rate):
+               # we can ignore "port"
+               self.current_mode = mode
+               modes = self.rates[mode][rate]
+
+               mode_50 = modes.get(50)
+               mode_60 = modes.get(60)
+               if mode_50 is None:
+                       mode_50 = mode_60
+               if mode_60 is None:
+                       mode_60 = mode_50
+
+               try:
+                       open("/proc/stb/video/videomode_60hz", "w").write(mode_50)
+                       open("/proc/stb/video/videomode_50hz", "w").write(mode_60)
+               except IOError:
+                       try:
+                               # fallback if no possibility to setup 50/60 hz mode
+                               open("/proc/stb/video/videomode", "w").write(mode_50)
+                       except IOError:
+                               print "setting videomode failed."
+
+       def isPortAvailable(self, port):
+               # fixme
+               return True
+
+       def getPortList(self):
+               return [port for port in self.modes if self.isPortAvailable(port)]
+
+       # get a list with all modes, with all rates, for a given port.
+       def getModeList(self, port):
+               res = [ ]
+               for mode in self.modes[port]:
+                       # list all rates which are completely valid
+                       rates = [rate for rate in self.rates[mode] if self.isModeAvailable(port, mode, rate)]
+
+                       # if at least one rate is ok, add this mode
+                       if len(rates):
+                               res.append( (mode, rates) )
+               return res
+
+       def createConfig(self, *args):
+               # create list of output ports
+               portlist = self.getPortList()
+
+               # create list of available modes
+               config.av.videoport = ConfigSelection(choices = [(port, _(port)) for port in portlist])
+               config.av.videomode = ConfigSubDict()
+               config.av.videorate = ConfigSubDict()
+
+               for port in portlist:
+                       modes = self.getModeList(port)
+                       if len(modes):
+                               config.av.videomode[port] = ConfigSelection(choices = [mode for (mode, rates) in modes])
+                       for (mode, rates) in modes:
+                               config.av.videorate[mode] = ConfigSelection(choices = rates)
+
+video_hw = VideoHardware()
\ No newline at end of file
diff --git a/lib/python/Plugins/SystemPlugins/Videomode/VideoWizard.py b/lib/python/Plugins/SystemPlugins/Videomode/VideoWizard.py
new file mode 100644 (file)
index 0000000..f0fe140
--- /dev/null
@@ -0,0 +1,89 @@
+from Screens.Wizard import Wizard, wizardManager
+import sys
+from VideoHardware import video_hw
+
+from Components.Pixmap import Pixmap, MovingPixmap
+from Components.config import config, ConfigBoolean, configfile
+
+class VideoWizard(Wizard):
+       skin = """
+               <screen position="0,0" size="720,576" title="Welcome..." flags="wfNoBorder" >
+                       <widget name="text" position="153,50" size="340,270" font="Regular;23" />
+                       <widget source="list" render="Listbox" position="50,300" size="440,200" scrollbarMode="showOnDemand" >
+                               <convert type="StringList" />
+                       </widget>
+                       <widget name="config" position="50,300" zPosition="1" size="440,200" transparent="1" scrollbarMode="showOnDemand" />                    
+                       <widget name="stepslider" position="50,500" zPosition="1" borderWidth="2" size="440,20" backgroundColor="dark" />
+                       <widget name="wizard" pixmap="wizard.png" position="40,50" zPosition="10" size="110,174" transparent="1" alphatest="on"/>
+                       <widget name="rc" pixmap="rc.png" position="500,600" zPosition="10" size="154,475" transparent="1" alphatest="on"/>
+                       <widget name="arrowdown" pixmap="arrowdown.png" position="0,0" zPosition="11" size="37,70" transparent="1" alphatest="on"/>
+                       <widget name="arrowup" pixmap="arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="on"/>
+                       <widget name="arrowup2" pixmap="arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="on"/>
+               </screen>"""
+       
+       def __init__(self, session):
+               # FIXME anyone knows how to use relative paths from the plugin's directory?
+               self.xmlfile = sys.path[0] + "/Plugins/SystemPlugins/Videomode/videowizard.xml"
+               self.hw = video_hw
+               
+               Wizard.__init__(self, session, showSteps = False)
+               self["wizard"] = Pixmap()
+               self["rc"] = MovingPixmap()
+               self["arrowdown"] = MovingPixmap()
+               self["arrowup"] = MovingPixmap()
+               self["arrowup2"] = MovingPixmap()
+               
+               self.port = None
+               self.mode = None
+               
+       def createSummary(self):
+               print "++++++++++++***++**** VideoWizard-createSummary"
+               from Screens.Wizard import WizardSummary
+               return WizardSummary
+               
+       def markDone(self):
+               pass
+       
+       def listInputChannels(self):
+               list = []
+
+               for port in self.hw.getPortList():
+                       list.append((port, port))
+               return list
+
+       def inputSelectionMade(self, index):
+               print "inputSelectionMade:", index
+               self.port = index
+               
+       def inputSelectionMoved(self):
+               print "selection moved:", self.selection
+               
+       def listModes(self):
+               list = []
+               print "modes for port", self.port
+               for mode in self.hw.getModeList(self.port):
+                       list.append((mode[0], mode[0]))
+               return list
+       
+       def modeSelectionMade(self, index):
+               print "modeSelectionMade:", index
+               self.mode = index
+               
+       def modeSelectionMoved(self):
+               print "selection moved:", self.selection
+               
+       def listRates(self):
+               list = []
+               print "modes for port", self.port
+               for mode in self.hw.getModeList(self.port):
+                       print mode
+                       if mode[0] == self.mode:
+                               for rate in mode[1]:
+                                       list.append((rate, rate))
+               return list
+       
+       def rateSelectionMade(self, index):
+               print "rateSelectionMade:", index
+               
+       def rateSelectionMoved(self):
+               print "selection moved:", self.selection
\ No newline at end of file
index 5e61d67d9a1b424d36fd2cbf79aa24cf18b211d8..1d196de4417c4d5b2ede17d11184dc0976fcca3c 100644 (file)
@@ -10,152 +10,12 @@ from Screens.MessageBox import MessageBox
 from Screens.Setup import SetupSummary
 from Components.ConfigList import ConfigListScreen
 from Components.config import getConfigListEntry, config, ConfigNothing, ConfigSelection, ConfigSubDict
+from VideoWizard import VideoWizard
+from Components.config import config
 
 from Tools.CList import CList
 
-# The "VideoHardware" is the interface to /proc/stb/video.
-# It generates hotplug events, and gives you the list of 
-# available and preferred modes, as well as handling the currently
-# selected mode. No other strict checking is done.
-class VideoHardware:
-       rates = { } # high-level, use selectable modes.
-
-       modes = { }  # a list of (high-level) modes for a certain port.
-
-       rates["PAL"] =                  { "50Hz":               { 50: "pal", 60: "pal"},
-                                                                                               "60Hz":         { 50: "pal60", 60: "pal60"},
-                                                                                               "multi":        { 50: "pal", 60: "pal60"} }
-       rates["NTSC"] =                 { "60Hz":       { 50: "ntsc", 60: "ntsc"} }
-       rates["Multi"] =                { "multi":      { 50: "pal", 60: "ntsc"} }
-       rates["720p"] =                 {       "50Hz":         { 50: "720p50", 60: "720p50"},
-                                                                                               "60Hz":         { 50: "720p", 60: "720p"},
-                                                                                               "multi":        { 50: "720p50", 60: "720p"} }
-       rates["1080i"] =                { "50Hz":               { 50: "1080i50", 60: "1080i50"},
-                                                                                               "60Hz":         { 50: "1080i", 60: "1080i"},
-                                                                                               "multi":        { 50: "1080i50", 60: "1080i"} }
-       rates["PC"] = { 
-               "1024x768": { 60: "1024x768"}, # not possible on DM7025
-               "800x600" : { 60: "800x600"},  # also not possible
-               "720x480" : { 60: "720x480"},
-               "720x576" : { 60: "720x576"},
-               "1280x720": { 60: "1280x720"},
-               "1280x720 multi": { 50: "1280x720_50", 60: "1280x720"},
-               "1920x1080": { 60: "1920x1080"},
-               "1920x1080 multi": { 50: "1920x1080", 60: "1920x1080_50"},
-               "1280x1024" : { 60: "1280x1024"},
-               "640x480" : { 60: "640x480"} 
-       }
-
-       modes["Scart"] = ["PAL", "NTSC", "Multi"]
-       modes["YPrPb"] = ["720p", "1080i"]
-       modes["DVI"] = ["720p", "1080i", "PC"]
-
-       def __init__(self):
-               self.last_modes_preferred =  [ ]
-               self.on_hotplug = CList()
-
-               self.on_hotplug.append(self.createConfig)
-               self.ignore_preferred = False   # "edid override"
-
-               self.readAvailableModes()
-               self.readPreferredModes()
-
-               # until we have the hotplug poll socket
-               self.timer = eTimer()
-               self.timer.timeout.get().append(self.readAvailableModes)
-               self.timer.start(1000)
-
-       def readAvailableModes(self):
-               try:
-                       modes = open("/proc/stb/video/videomode_choices").read()[:-1]
-               except IOError:
-                       print "couldn't read available videomodes."
-                       self.modes_available = [ ]
-                       return
-               self.modes_available = modes.split(' ')
-
-       def readPreferredModes(self):
-               try:
-                       modes = open("/proc/stb/video/videomode_preferred").read()[:-1]
-                       self.modes_preferred = modes.split(' ')
-               except IOError:
-                       print "reading preferred modes failed, using all modes"
-                       self.modes_preferred = self.modes_available
-
-               if self.modes_preferred != self.last_modes_preferred:
-                       self.last_modes_preferred = self.modes_preferred
-                       self.on_hotplug("DVI") # must be DVI
-
-       # check if a high-level mode with a given rate is available.
-       def isModeAvailable(self, port, mode, rate):
-               rate = self.rates[mode][rate]
-               for mode in rate.values():
-                       # DVI modes must be in "modes_preferred"
-                       if port == "DVI":
-                               if mode not in self.modes_preferred and not self.ignore_preferred:
-                                       return False
-                       if mode not in self.modes_available:
-                               return False
-               return True
-
-       def setMode(self, port, mode, rate):
-               # we can ignore "port"
-               self.current_mode = mode
-               modes = self.rates[mode][rate]
-
-               mode_50 = modes.get(50)
-               mode_60 = modes.get(60)
-               if mode_50 is None:
-                       mode_50 = mode_60
-               if mode_60 is None:
-                       mode_60 = mode_50
-
-               try:
-                       open("/proc/stb/video/videomode_60hz", "w").write(mode_50)
-                       open("/proc/stb/video/videomode_50hz", "w").write(mode_60)
-               except IOError:
-                       try:
-                               # fallback if no possibility to setup 50/60 hz mode
-                               open("/proc/stb/video/videomode", "w").write(mode_50)
-                       except IOError:
-                               print "setting videomode failed."
-
-       def isPortAvailable(self, port):
-               # fixme
-               return True
-
-       def getPortList(self):
-               return [port for port in self.modes if self.isPortAvailable(port)]
-
-       # get a list with all modes, with all rates, for a given port.
-       def getModeList(self, port):
-               res = [ ]
-               for mode in self.modes[port]:
-                       # list all rates which are completely valid
-                       rates = [rate for rate in self.rates[mode] if self.isModeAvailable(port, mode, rate)]
-
-                       # if at least one rate is ok, add this mode
-                       if len(rates):
-                               res.append( (mode, rates) )
-               return res
-
-       def createConfig(self, *args):
-               # create list of output ports
-               portlist = self.getPortList()
-
-               # create list of available modes
-               config.av.videoport = ConfigSelection(choices = [(port, _(port)) for port in portlist])
-               config.av.videomode = ConfigSubDict()
-               config.av.videorate = ConfigSubDict()
-
-               for port in portlist:
-                       modes = self.getModeList(port)
-                       if len(modes):
-                               config.av.videomode[port] = ConfigSelection(choices = [mode for (mode, rates) in modes])
-                       for (mode, rates) in modes:
-                               config.av.videorate[mode] = ConfigSelection(choices = rates)
-
-video_hw = VideoHardware()
+from VideoHardware import video_hw
 
 class VideoSetup(Screen, ConfigListScreen):
        def __init__(self, session, hw):
@@ -293,7 +153,8 @@ def startSetup(menuid):
        return [(_("Video Setup"), videoSetupMain, "video_setup", None)]
 
 def Plugins(**kwargs):
-       return [ 
-#              PluginDescriptor(where = [PluginDescriptor.WHERE_SESSIONSTART, PluginDescriptor.WHERE_AUTOSTART], fnc = autostart),
-               PluginDescriptor(name=_("Video Setup"), description=_("Advanced Video Setup"), where = PluginDescriptor.WHERE_MENU, fnc=startSetup) 
-       ]
+       list = []
+       list.append(PluginDescriptor(name=_("Video Setup"), description=_("Advanced Video Setup"), where = PluginDescriptor.WHERE_MENU, fnc=startSetup))
+       if config.misc.firstrun.value:
+               list.append(PluginDescriptor(name=_("Video Wizard"), where = PluginDescriptor.WHERE_WIZARD, fnc=VideoWizard))
+       return list
diff --git a/lib/python/Plugins/SystemPlugins/Videomode/videowizard.xml b/lib/python/Plugins/SystemPlugins/Videomode/videowizard.xml
new file mode 100644 (file)
index 0000000..b4b9faf
--- /dev/null
@@ -0,0 +1,49 @@
+<wizard>
+       <step id="inputselection" nextstep="modeselection" timeout="10" timeoutaction="selectnext">
+               <text value="Video input selction\n\nPlease press OK if you can see this page on your TV (or select a different input port).\n\nThe next input port will be automatically probed in 10 seconds." />
+               <displaytext value="Select video input" />
+               <list type="dynamic" source="listInputChannels" evaluation="inputSelectionMade" onselect="inputSelectionMoved" />
+               <code>
+self["arrowdown"].moveTo(557, 232, 1)
+self["arrowdown"].startMoving()
+self["arrowup"].moveTo(800, 232, 1)
+self["arrowup"].startMoving()
+self["rc"].moveTo(500, 50, 1)
+self["rc"].startMoving()
+               </code>
+       </step>
+       <step id="modeselection" nextstep="rateselection" timeout="10" timeoutaction="selectnext">
+               <text value="Video mode selection." />
+               <displaytext value="Select video mode" />
+               <list type="dynamic" source="listModes" evaluation="modeSelectionMade" onselect="modeSelectionMoved" />
+               <code>
+self["arrowup2"].moveTo(800, 320, 1)
+self["arrowup2"].startMoving()
+self["arrowdown"].moveTo(557, 200, 1)
+self["arrowup"].moveTo(557, 355, 1)
+self["arrowdown"].startMoving()
+self["arrowup"].startMoving()
+self["rc"].moveTo(500, 50, 1)
+self["rc"].startMoving()
+               </code>
+       </step>
+       <step id="rateselection" nextstep="end" timeout="10" timeoutaction="selectnext">
+               <text value="Rate selection." />
+               <displaytext value="Select video mode rate" />
+               <list type="dynamic" source="listRates" evaluation="rateSelectionMade" onselect="rateSelectionMoved" />
+               <code>
+self["arrowup2"].moveTo(800, 320, 1)
+self["arrowup2"].startMoving()
+self["arrowdown"].moveTo(557, 200, 1)
+self["arrowup"].moveTo(557, 355, 1)
+self["arrowdown"].startMoving()
+self["arrowup"].startMoving()
+self["rc"].moveTo(500, 50, 1)
+self["rc"].startMoving()
+               </code>
+       </step>
+       <step id="end">
+                       <text value="The input port should be configured now." />
+                       <displaytext value="No picture on TV? Press EXIT and retry." />
+               </step>
+</wizard>