move Satfinder and Positioner Plugin to Menu -> Setup -> Service Searching
[enigma2.git] / lib / python / Plugins / SystemPlugins / PositionerSetup / plugin.py
index 554adaea621b0b3d500e4d4d5befba0dec390631..e09359ef2ed3d291e6e3ab3c16c930db3b14e8cc 100644 (file)
@@ -1,6 +1,7 @@
 from enigma import eTimer, eDVBSatelliteEquipmentControl, eDVBResourceManager, eDVBDiseqcCommand, eDVBResourceManagerPtr, iDVBChannelPtr, iDVBFrontendPtr, iDVBFrontend, eDVBFrontendParametersSatellite, eDVBFrontendParameters
 from Screens.Screen import Screen
 from Screens.ScanSetup import ScanSetup
 from enigma import eTimer, eDVBSatelliteEquipmentControl, eDVBResourceManager, eDVBDiseqcCommand, eDVBResourceManagerPtr, iDVBChannelPtr, iDVBFrontendPtr, iDVBFrontend, eDVBFrontendParametersSatellite, eDVBFrontendParameters
 from Screens.Screen import Screen
 from Screens.ScanSetup import ScanSetup
+from Screens.MessageBox import MessageBox
 from Plugins.Plugin import PluginDescriptor
 
 from Components.Label import Label
 from Plugins.Plugin import PluginDescriptor
 
 from Components.Label import Label
@@ -8,53 +9,65 @@ from Components.ConfigList import ConfigList
 from Components.TunerInfo import TunerInfo
 from Components.ActionMap import ActionMap
 from Components.NimManager import nimmanager
 from Components.TunerInfo import TunerInfo
 from Components.ActionMap import ActionMap
 from Components.NimManager import nimmanager
-from Components.config import config, ConfigSubsection, configElement_nonSave, configNothing, getConfigListEntry, configSelection, currentConfigSelectionElement, configSatlist
+from Components.MenuList import MenuList
+from Components.config import ConfigSatlist, ConfigNothing, ConfigSelection, ConfigSubsection, KEY_LEFT, KEY_RIGHT, getConfigListEntry
+
+from time import sleep
 
 class PositionerSetup(Screen):
        skin = """
                <screen position="100,100" size="560,400" title="Positioner setup..." >
 
 class PositionerSetup(Screen):
        skin = """
                <screen position="100,100" size="560,400" title="Positioner setup..." >
-                       <widget name="list" position="100,0" size="350,120" />
+                       <widget name="list" position="100,0" size="350,155" />
 
 
-                       <widget name="red" position="0,120" size="140,80" backgroundColor="red" halign="center" valign="center" font="Regular;21" />
-                       <widget name="green" position="140,120" size="140,80" backgroundColor="green" halign="center" valign="center" font="Regular;21" />
-                       <widget name="yellow" position="280,120" size="140,80" backgroundColor="yellow" halign="center" valign="center" font="Regular;21" />
-                       <widget name="blue" position="420,120" size="140,80" backgroundColor="blue" halign="center" valign="center" font="Regular;21" />
+                       <widget name="red" position="0,155" size="140,80" backgroundColor="red" halign="center" valign="center" font="Regular;21" />
+                       <widget name="green" position="140,155" size="140,80" backgroundColor="green" halign="center" valign="center" font="Regular;21" />
+                       <widget name="yellow" position="280,155" size="140,80" backgroundColor="yellow" halign="center" valign="center" font="Regular;21" />
+                       <widget name="blue" position="420,155" size="140,80" backgroundColor="blue" halign="center" valign="center" font="Regular;21" />
                        
                        
-                       <widget name="snr" text="SNR:" position="0,220" size="60,22" font="Regular;21" />
-                       <widget name="agc" text="AGC:" position="0,245" size="60,22" font="Regular;21" />
-                       <widget name="ber" text="BER:" position="0,270" size="60,22" font="Regular;21" />
-                       <widget name="lock" text="Lock:" position="0,295" size="60,22" font="Regular;21" />
-                       <widget name="snr_percentage" position="220,220" size="60,22" font="Regular;21" />
-                       <widget name="agc_percentage" position="220,245" size="60,22" font="Regular;21" />
-                       <widget name="ber_value" position="220,270" size="60,22" font="Regular;21" />
-                       <widget name="lock_state" position="60,295" size="150,22" font="Regular;21" />
-                       <widget name="snr_bar" position="60,220" size="150,22" />
-                       <widget name="agc_bar" position="60,245" size="150,22" />
-                       <widget name="ber_bar" position="60,270" size="150,22" />
-
-                       <widget name="frequency" text="Frequency:" position="300,220" size="120,22" font="Regular;21" />
-                       <widget name="symbolrate" text="Symbolrate:" position="300,245" size="120,22" font="Regular;21" />
-                       <widget name="fec" text="FEC:" position="300,270" size="120,22" font="Regular;21" />
-                       <widget name="frequency_value" position="420,220" size="120,22" font="Regular;21" />
-                       <widget name="symbolrate_value" position="420,245" size="120,22" font="Regular;21" />
-                       <widget name="fec_value" position="420,270" size="120,22" font="Regular;21" />
+                       <widget name="snr" text="SNR:" position="0,245" size="60,22" font="Regular;21" />
+                       <widget name="agc" text="AGC:" position="0,270" size="60,22" font="Regular;21" />
+                       <widget name="ber" text="BER:" position="0,295" size="60,22" font="Regular;21" />
+                       <widget name="lock" text="Lock:" position="0,320" size="60,22" font="Regular;21" />
+                       <widget name="snr_percentage" position="220,245" size="60,22" font="Regular;21" />
+                       <widget name="agc_percentage" position="220,270" size="60,22" font="Regular;21" />
+                       <widget name="ber_value" position="220,295" size="60,22" font="Regular;21" />
+                       <widget name="lock_state" position="60,320" size="150,22" font="Regular;21" />
+                       <widget name="snr_bar" position="60,245" size="150,22" />
+                       <widget name="agc_bar" position="60,270" size="150,22" />
+                       <widget name="ber_bar" position="60,295" size="150,22" />
+
+                       <widget name="frequency" text="Frequency:" position="300,245" size="120,22" font="Regular;21" />
+                       <widget name="symbolrate" text="Symbolrate:" position="300,270" size="120,22" font="Regular;21" />
+                       <widget name="fec" text="FEC:" position="300,295" size="120,22" font="Regular;21" />
+                       <widget name="frequency_value" position="420,245" size="120,22" font="Regular;21" />
+                       <widget name="symbolrate_value" position="420,270" size="120,22" font="Regular;21" />
+                       <widget name="fec_value" position="420,295" size="120,22" font="Regular;21" />
                </screen>"""
                </screen>"""
-       def __init__(self, session):
+       def __init__(self, session, feid):
                self.skin = PositionerSetup.skin
                Screen.__init__(self, session)
                self.skin = PositionerSetup.skin
                Screen.__init__(self, session)
+               self.feid = feid
+               self.oldref = None
                
                
-               self.session.nav.stopService()
-               
-               self.feid = 1
+               if not self.openFrontend():
+                       self.oldref = session.nav.getCurrentlyPlayingServiceReference()
+                       session.nav.stopService() # try to disable foreground service
+                       if not self.openFrontend():
+                               if session.pipshown: # try to disable pip
+                                       session.pipshown = False
+                                       del session.pip
+                                       if not self.openFrontend():
+                                               self.frontend = None # in normal case this should not happen
+                                               self.getFrontend = None
                
                self.diseqc = Diseqc(self.feid)
                
                self.diseqc = Diseqc(self.feid)
-               self.tuner = Tuner(self.diseqc.getFrontend())
-               
-               #self.session.nav.stopService()
+               self.tuner = Tuner(self.frontend)
+               self.tuner.tune((0,0,0,0,0,0))
                
                self.createConfig()
                
                self.isMoving = False
                
                self.createConfig()
                
                self.isMoving = False
+               self.stopOnLock = False
                
                self.red = Label("")
                self["red"] = self.red
                
                self.red = Label("")
                self["red"] = self.red
@@ -73,13 +86,13 @@ class PositionerSetup(Screen):
                self["agc"] = Label()
                self["ber"] = Label()
                self["lock"] = Label()
                self["agc"] = Label()
                self["ber"] = Label()
                self["lock"] = Label()
-               self["snr_percentage"] = TunerInfo(TunerInfo.SNR_PERCENTAGE, frontendfkt = self.diseqc.getFrontend)
-               self["agc_percentage"] = TunerInfo(TunerInfo.AGC_PERCENTAGE, frontendfkt = self.diseqc.getFrontend)
-               self["ber_value"] = TunerInfo(TunerInfo.BER_VALUE, frontendfkt = self.diseqc.getFrontend)
-               self["snr_bar"] = TunerInfo(TunerInfo.SNR_BAR, frontendfkt = self.diseqc.getFrontend)
-               self["agc_bar"] = TunerInfo(TunerInfo.AGC_BAR, frontendfkt = self.diseqc.getFrontend)
-               self["ber_bar"] = TunerInfo(TunerInfo.BER_BAR, frontendfkt = self.diseqc.getFrontend)
-               self["lock_state"] = TunerInfo(TunerInfo.LOCK_STATE, frontendfkt = self.diseqc.getFrontend)
+               self["snr_percentage"] = TunerInfo(TunerInfo.SNR_PERCENTAGE, frontendfkt = self.getFrontend)
+               self["agc_percentage"] = TunerInfo(TunerInfo.AGC_PERCENTAGE, frontendfkt = self.getFrontend)
+               self["ber_value"] = TunerInfo(TunerInfo.BER_VALUE, frontendfkt = self.getFrontend)
+               self["snr_bar"] = TunerInfo(TunerInfo.SNR_BAR, frontendfkt = self.getFrontend)
+               self["agc_bar"] = TunerInfo(TunerInfo.AGC_BAR, frontendfkt = self.getFrontend)
+               self["ber_bar"] = TunerInfo(TunerInfo.BER_BAR, frontendfkt = self.getFrontend)
+               self["lock_state"] = TunerInfo(TunerInfo.LOCK_STATE, frontendfkt = self.getFrontend)
 
                self["frequency"] = Label()
                self["symbolrate"] = Label()
 
                self["frequency"] = Label()
                self["symbolrate"] = Label()
@@ -92,7 +105,7 @@ class PositionerSetup(Screen):
                self["actions"] = ActionMap(["DirectionActions", "OkCancelActions", "ColorActions"],
                {
                        "ok": self.go,
                self["actions"] = ActionMap(["DirectionActions", "OkCancelActions", "ColorActions"],
                {
                        "ok": self.go,
-                       "cancel": self.close,
+                       "cancel": self.keyCancel,
                        "up": self.up,
                        "down": self.down,
                        "left": self.left,
                        "up": self.up,
                        "down": self.down,
                        "left": self.left,
@@ -107,49 +120,86 @@ class PositionerSetup(Screen):
                
                self.statusTimer = eTimer()
                self.statusTimer.timeout.get().append(self.updateStatus)
                
                self.statusTimer = eTimer()
                self.statusTimer.timeout.get().append(self.updateStatus)
-               self.statusTimer.start(200, False)
-               
+               self.statusTimer.start(50, False)
+
+       def restartPrevService(self, yesno):
+               if yesno:
+                       if self.frontend:
+                               self.frontend = None
+                               del self.raw_channel
+                       self.session.nav.playService(self.oldref)
+               self.close(None)
+       
+       def keyCancel(self):
+               if self.oldref:
+                       self.session.openWithCallback(self.restartPrevService, MessageBox, _("Zap back to service before positioner setup?"), MessageBox.TYPE_YESNO)
+               else:
+                       self.restartPrevService(False)
+
+       def getFrontend(self):
+               return self.frontend
+
+       def openFrontend(self):
+               res_mgr = eDVBResourceManagerPtr()
+               if eDVBResourceManager.getInstance(res_mgr) == 0:
+                       self.raw_channel = iDVBChannelPtr()
+                       if res_mgr.allocateRawChannel(self.raw_channel, self.feid) == 0:
+                               self.frontend = iDVBFrontendPtr()
+                               if self.raw_channel.getFrontend(self.frontend) == 0:
+                                       return True
+                               else:
+                                       print "getFrontend failed"
+                       else:
+                               print "getRawChannel failed"
+               else:
+                       print "getResourceManager instance failed"
+               return False
+
        def createConfig(self):
        def createConfig(self):
-               config.positioner = ConfigSubsection()
-               config.positioner.tune = configElement_nonSave("tune", configNothing, 0, None)
-               config.positioner.move = configElement_nonSave("move", configNothing, 0, None)
-               config.positioner.limits = configElement_nonSave("limits", configNothing, 0, None)
+               self.positioner_tune = ConfigNothing()
+               self.positioner_move = ConfigNothing()
+               self.positioner_finemove = ConfigNothing()
+               self.positioner_limits = ConfigNothing()
+               self.positioner_goto0 = ConfigNothing()
                storepos = []
                storepos = []
-               for x in range(255):
+               for x in range(1,255):
                        storepos.append(str(x))
                        storepos.append(str(x))
-               config.positioner.storage = configElement_nonSave("storage", configSelection, 0, storepos)
-       
+               self.positioner_storage = ConfigSelection(choices = storepos)
+
        def createSetup(self):
        def createSetup(self):
-               self.list.append(getConfigListEntry(_("Tune"), config.positioner.tune))
-               self.list.append(getConfigListEntry(_("Positioner movement"), config.positioner.move))
-               self.list.append(getConfigListEntry(_("Set limits"), config.positioner.limits))
-               self.list.append(getConfigListEntry(_("Positioner storage"), config.positioner.storage))
-               
+               self.list.append((_("Tune"), self.positioner_tune, "tune"))
+               self.list.append((_("Positioner movement"), self.positioner_move, "move"))
+               self.list.append((_("Positioner fine movement"), self.positioner_finemove, "finemove"))
+               self.list.append((_("Set limits"), self.positioner_limits, "limits"))
+               self.list.append((_("Positioner storage"), self.positioner_storage, "storage"))
+               self.list.append((_("Goto 0"), self.positioner_goto0, "goto0"))
                self["list"].l.setList(self.list)
                self["list"].l.setList(self.list)
-               
+
        def go(self):
                pass
        def go(self):
                pass
-       
+
        def getCurrentConfigPath(self):
        def getCurrentConfigPath(self):
-               return self["list"].getCurrent()[1].parent.configPath
-       
+               return self["list"].getCurrent()[2]
+
        def up(self):
        def up(self):
-               self["list"].instance.moveSelection(self["list"].instance.moveUp)
-               self.updateColors(self.getCurrentConfigPath())
-       
+               if not self.isMoving:
+                       self["list"].instance.moveSelection(self["list"].instance.moveUp)
+                       self.updateColors(self.getCurrentConfigPath())
+
        def down(self):
        def down(self):
-               self["list"].instance.moveSelection(self["list"].instance.moveDown)
-               self.updateColors(self.getCurrentConfigPath())
-       
+               if not self.isMoving:
+                       self["list"].instance.moveSelection(self["list"].instance.moveDown)
+                       self.updateColors(self.getCurrentConfigPath())
+
        def left(self):
        def left(self):
-               self["list"].handleKey(config.key["prevElement"])
-       
+               self["list"].handleKey(KEY_LEFT)
+
        def right(self):
        def right(self):
-               self["list"].handleKey(config.key["nextElement"])
-       
+               self["list"].handleKey(KEY_RIGHT)
+
        def updateColors(self, entry):
                if entry == "tune":
        def updateColors(self, entry):
                if entry == "tune":
-                       self.red.setText("tune")
+                       self.red.setText(_("Tune"))
                        self.green.setText("")
                        self.yellow.setText("")
                        self.blue.setText("")
                        self.green.setText("")
                        self.yellow.setText("")
                        self.blue.setText("")
@@ -161,74 +211,114 @@ class PositionerSetup(Screen):
                                self.blue.setText(_("Stop"))
                        else:
                                self.red.setText(_("Move west"))
                                self.blue.setText(_("Stop"))
                        else:
                                self.red.setText(_("Move west"))
-                               self.green.setText(_("Step west"))
-                               self.yellow.setText(_("Step east"))
+                               self.green.setText(_("Search west"))
+                               self.yellow.setText(_("Search east"))
                                self.blue.setText(_("Move east"))
                                self.blue.setText(_("Move east"))
+               elif entry == "finemove":
+                       self.red.setText("")
+                       self.green.setText(_("Step west"))
+                       self.yellow.setText(_("Step east"))
+                       self.blue.setText("")
                elif entry == "limits":
                        self.red.setText(_("Limits off"))
                        self.green.setText(_("Limit west"))
                        self.yellow.setText(_("Limit east"))
                elif entry == "limits":
                        self.red.setText(_("Limits off"))
                        self.green.setText(_("Limit west"))
                        self.yellow.setText(_("Limit east"))
-                       self.blue.setText("")
+                       self.blue.setText(_("Limits on"))
                elif entry == "storage":
                        self.red.setText("")
                        self.green.setText(_("Store position"))
                        self.yellow.setText(_("Goto position"))
                        self.blue.setText("")
                elif entry == "storage":
                        self.red.setText("")
                        self.green.setText(_("Store position"))
                        self.yellow.setText(_("Goto position"))
                        self.blue.setText("")
+               elif entry == "goto0":
+                       self.red.setText(_("Goto 0"))
+                       self.green.setText("")
+                       self.yellow.setText("")
+                       self.blue.setText("")
                else:
                        self.red.setText("")
                        self.green.setText("")
                        self.yellow.setText("")
                        self.blue.setText("")
                else:
                        self.red.setText("")
                        self.green.setText("")
                        self.yellow.setText("")
                        self.blue.setText("")
-       
+
        def redKey(self):
                entry = self.getCurrentConfigPath()
                if entry == "move":
                        if self.isMoving:
        def redKey(self):
                entry = self.getCurrentConfigPath()
                if entry == "move":
                        if self.isMoving:
-                               self.diseqc.command("stop")
+                               self.diseqccommand("stop")
                                self.isMoving = False
                                self.isMoving = False
+                               self.stopOnLock = False
                        else:
                        else:
-                               self.diseqc.command("moveWest", 0)
+                               self.diseqccommand("moveWest", 0)
                                self.isMoving = True
                        self.updateColors("move")
                                self.isMoving = True
                        self.updateColors("move")
-                       print "moving west"
                elif entry == "limits":
                elif entry == "limits":
-                       self.diseqc.command("limitOff")
+                       self.diseqccommand("limitOff")
                elif entry == "tune":
                        self.session.openWithCallback(self.tune, TunerScreen, self.feid)
                elif entry == "tune":
                        self.session.openWithCallback(self.tune, TunerScreen, self.feid)
-                               
+               elif entry == "goto0":
+                       print "move to position 0"
+                       self.diseqccommand("moveTo", 0)
+
        def greenKey(self):
                entry = self.getCurrentConfigPath()
                if entry == "move":
        def greenKey(self):
                entry = self.getCurrentConfigPath()
                if entry == "move":
+                       if self.isMoving:
+                               self.diseqccommand("stop")
+                               self.isMoving = False
+                               self.stopOnLock = False
+                       else:
+                               self.isMoving = True
+                               self.stopOnLock = True
+                               self.diseqccommand("moveWest", 0)
+                       self.updateColors("move")
+               elif entry == "finemove":
                        print "stepping west"
                        print "stepping west"
-                       self.diseqc.command("moveWest", 1)
+                       self.diseqccommand("moveWest", 0xFF) # one step
                elif entry == "storage":
                elif entry == "storage":
-                       print "store at position", (config.positioner.storage.value + 1)
-                       self.diseqc.command("store", config.positioner.storage.value + 1)
+                       print "store at position", int(self.positioner_storage.value)
+                       self.diseqccommand("store", int(self.positioner_storage.value))
                elif entry == "limits":
                elif entry == "limits":
-                       self.diseqc.command("limitWest")
-       
+                       self.diseqccommand("limitWest")
+
        def yellowKey(self):
                entry = self.getCurrentConfigPath()
                if entry == "move":
        def yellowKey(self):
                entry = self.getCurrentConfigPath()
                if entry == "move":
+                       if self.isMoving:
+                               self.diseqccommand("stop")
+                               self.isMoving = False
+                               self.stopOnLock = False
+                       else:
+                               self.isMoving = True
+                               self.stopOnLock = True
+                               self.diseqccommand("moveEast", 0)
+                       self.updateColors("move")
+               elif entry == "finemove":
                        print "stepping east"
                        print "stepping east"
-                       self.diseqc.command("moveEast", 1)
+                       self.diseqccommand("moveEast", 0xFF) # one step
                elif entry == "storage":
                elif entry == "storage":
-                       print "move to position", (config.positioner.storage.value + 1)
-                       self.diseqc.command("moveTo", config.positioner.storage.value + 1)
+                       print "move to position", int(self.positioner_storage.value)
+                       self.diseqccommand("moveTo", int(self.positioner_storage.value))
                elif entry == "limits":
                elif entry == "limits":
-                       self.diseqc.command("limitEast")
-#      
+                       self.diseqccommand("limitEast")
+
        def blueKey(self):
                entry = self.getCurrentConfigPath()
                if entry == "move":
                        if self.isMoving:
        def blueKey(self):
                entry = self.getCurrentConfigPath()
                if entry == "move":
                        if self.isMoving:
-                               self.diseqc.command("stop")
+                               self.diseqccommand("stop")
                                self.isMoving = False
                                self.isMoving = False
+                               self.stopOnLock = False
                        else:
                        else:
-                               self.diseqc.command("moveEast", 0)
+                               self.diseqccommand("moveEast", 0)
                                self.isMoving = True
                        self.updateColors("move")
                        print "moving east"
                                self.isMoving = True
                        self.updateColors("move")
                        print "moving east"
+               elif entry == "limits":
+                       self.diseqccommand("limitOn")
+
+       def diseqccommand(self, cmd, param = 0):
+               self.diseqc.command(cmd, param)
+               self.tuner.retune()
 
        def updateStatus(self):
                self["snr_percentage"].update()
 
        def updateStatus(self):
                self["snr_percentage"].update()
@@ -237,38 +327,27 @@ class PositionerSetup(Screen):
                self["snr_bar"].update()
                self["agc_bar"].update()
                self["ber_bar"].update()
                self["snr_bar"].update()
                self["agc_bar"].update()
                self["ber_bar"].update()
+               self["lock_state"].update()
                transponderdata = self.tuner.getTransponderData()
                self["frequency_value"].setText(str(transponderdata["frequency"]))
                self["symbolrate_value"].setText(str(transponderdata["symbol_rate"]))
                self["fec_value"].setText(str(transponderdata["fec_inner"]))
                transponderdata = self.tuner.getTransponderData()
                self["frequency_value"].setText(str(transponderdata["frequency"]))
                self["symbolrate_value"].setText(str(transponderdata["symbol_rate"]))
                self["fec_value"].setText(str(transponderdata["fec_inner"]))
+               if transponderdata["tuner_locked"] == 1 and self.isMoving and self.stopOnLock:
+                       self.diseqccommand("stop")
+                       self.isMoving = False
+                       self.stopOnLock = False
+                       self.updateColors(self.getCurrentConfigPath())
 
        def tune(self, transponder):
                if transponder is not None:
                        self.tuner.tune(transponder)
 
        def tune(self, transponder):
                if transponder is not None:
                        self.tuner.tune(transponder)
-                       
+
 class Diseqc:
 class Diseqc:
-       def __init__(self, feid = 0):
-               self.ready = False
-               self.feid = feid
-               res_mgr = eDVBResourceManagerPtr()
-               if eDVBResourceManager.getInstance(res_mgr) == 0:
-                       self.raw_channel = iDVBChannelPtr()
-                       if res_mgr.allocateRawChannel(self.raw_channel, self.feid) == 0:
-                               self.frontend = iDVBFrontendPtr()
-                               if self.raw_channel.getFrontend(self.frontend) == 0:
-                                       self.ready = True
-                               else:
-                                       print "getFrontend failed"
-                       else:
-                               print "getRawChannel failed"
-               else:
-                       print "getResourceManager instance failed"
-       
-       def getFrontend(self):
-               return self.frontend
-               
+       def __init__(self, frontend):
+               self.frontend = frontend
+
        def command(self, what, param = 0):
        def command(self, what, param = 0):
-               if self.ready:
+               if self.frontend:
                        cmd = eDVBDiseqcCommand()
                        if what == "moveWest":
                                string = 'e03169' + ("%02x" % param)
                        cmd = eDVBDiseqcCommand()
                        if what == "moveWest":
                                string = 'e03169' + ("%02x" % param)
@@ -278,6 +357,8 @@ class Diseqc:
                                string = 'e0316b' + ("%02x" % param)
                        elif what == "store":
                                string = 'e0316a' + ("%02x" % param)
                                string = 'e0316b' + ("%02x" % param)
                        elif what == "store":
                                string = 'e0316a' + ("%02x" % param)
+                       elif what == "limitOn":
+                               string = 'e0316a00'
                        elif what == "limitOff":
                                string = 'e03163'
                        elif what == "limitEast":
                        elif what == "limitOff":
                                string = 'e03163'
                        elif what == "limitEast":
@@ -286,16 +367,19 @@ class Diseqc:
                                string = 'e03167'
                        else:
                                string = 'e03160' #positioner stop
                                string = 'e03167'
                        else:
                                string = 'e03160' #positioner stop
+                       
                        print "diseqc command:",
                        print string
                        print "diseqc command:",
                        print string
-                       
                        cmd.setCommandString(string)
                        self.frontend.sendDiseqc(cmd)
                        cmd.setCommandString(string)
                        self.frontend.sendDiseqc(cmd)
-                       
+                       if string == 'e03160': #positioner stop
+                               sleep(0.05)
+                               self.frontend.sendDiseqc(cmd) # send 2nd time
+
 class Tuner:
        def __init__(self, frontend):
                self.frontend = frontend
 class Tuner:
        def __init__(self, frontend):
                self.frontend = frontend
-               
+
        def tune(self, transponder):
                print "tuning to transponder with data", transponder
                parm = eDVBFrontendParametersSatellite()
        def tune(self, transponder):
                print "tuning to transponder with data", transponder
                parm = eDVBFrontendParametersSatellite()
@@ -304,13 +388,25 @@ class Tuner:
                parm.polarisation = transponder[2]
                parm.fec = transponder[3]
                parm.inversion = transponder[4]
                parm.polarisation = transponder[2]
                parm.fec = transponder[3]
                parm.inversion = transponder[4]
-               parm.orbital_position = 192
+               parm.orbital_position = transponder[5]
+               parm.system = 0  # FIXMEE !! HARDCODED DVB-S (add support for DVB-S2)
+               parm.modulation = 1 # FIXMEE !! HARDCODED QPSK
                feparm = eDVBFrontendParameters()
                feparm.setDVBS(parm, True)
                feparm = eDVBFrontendParameters()
                feparm.setDVBS(parm, True)
-               self.frontend.tune(feparm)
-       
+               self.lastparm = feparm
+               if self.frontend:
+                       self.frontend.tune(feparm)
+
+       def retune(self):
+               if self.frontend:
+                       self.frontend.tune(self.lastparm)
+
        def getTransponderData(self):
        def getTransponderData(self):
-               return self.frontend.readTransponderData(True)
+               if self.frontend:
+                       return self.frontend.readTransponderData(True)
+               return None
+
+tuning = None
 
 class TunerScreen(ScanSetup):
        skin = """
 
 class TunerScreen(ScanSetup):
        skin = """
@@ -322,26 +418,24 @@ class TunerScreen(ScanSetup):
        def __init__(self, session, feid):
                self.feid = feid
                ScanSetup.__init__(self, session)
        def __init__(self, session, feid):
                self.feid = feid
                ScanSetup.__init__(self, session)
-
                self["introduction"].setText("")
                self["introduction"].setText("")
-               
+
        def createSetup(self):
                self.typeOfTuningEntry = None
                self.satEntry = None
        def createSetup(self):
                self.typeOfTuningEntry = None
                self.satEntry = None
-
                self.list = []
                self.list = []
-               self.typeOfTuningEntry = getConfigListEntry(_('Tune'), config.tuning.type)
+               self.typeOfTuningEntry = getConfigListEntry(_('Tune'), tuning.type)
                self.list.append(self.typeOfTuningEntry)
                self.list.append(self.typeOfTuningEntry)
-               self.satEntry = getConfigListEntry(_('Satellite'), config.tuning.sat)
+               self.satEntry = getConfigListEntry(_('Satellite'), tuning.sat)
                self.list.append(self.satEntry)
                self.list.append(self.satEntry)
-               if currentConfigSelectionElement(config.tuning.type) == "manual_transponder":
-                       self.list.append(getConfigListEntry(_('Frequency'), config.scan.sat.frequency))
-                       self.list.append(getConfigListEntry(_('Inversion'), config.scan.sat.inversion))
-                       self.list.append(getConfigListEntry(_('Symbol Rate'), config.scan.sat.symbolrate))
-                       self.list.append(getConfigListEntry(_("Polarity"), config.scan.sat.polarization))
-                       self.list.append(getConfigListEntry(_("FEC"), config.scan.sat.fec))
-               elif currentConfigSelectionElement(config.tuning.type) == "predefined_transponder":
-                       self.list.append(getConfigListEntry(_("Transponder"), config.tuning.transponder))
+               if tuning.type.value == "manual_transponder":
+                       self.list.append(getConfigListEntry(_('Frequency'), self.scan_sat.frequency))
+                       self.list.append(getConfigListEntry(_('Inversion'), self.scan_sat.inversion))
+                       self.list.append(getConfigListEntry(_('Symbol Rate'), self.scan_sat.symbolrate))
+                       self.list.append(getConfigListEntry(_("Polarity"), self.scan_sat.polarization))
+                       self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec))
+               elif tuning.type.value == "predefined_transponder":
+                       self.list.append(getConfigListEntry(_("Transponder"), tuning.transponder))
                self["config"].list = self.list
                self["config"].l.setList(self.list)
 
                self["config"].list = self.list
                self["config"].l.setList(self.list)
 
@@ -349,63 +443,128 @@ class TunerScreen(ScanSetup):
                if self["config"].getCurrent() == self.typeOfTuningEntry:
                        self.createSetup()
                elif self["config"].getCurrent() == self.satEntry:
                if self["config"].getCurrent() == self.typeOfTuningEntry:
                        self.createSetup()
                elif self["config"].getCurrent() == self.satEntry:
-                       self.updateSats()
                        self.createSetup()
 
                        self.createSetup()
 
-       def createConfig(self):
-               config.tuning = ConfigSubsection()
-               
-               config.tuning.type = configElement_nonSave("config.tuning.type", configSelection, 0, (("manual_transponder", _("Manual transponder")), ("predefined_transponder", _("Predefined satellite"))))
+       def createConfig(self, foo):
+               if not tuning:
+                       global tuning
+                       tuning = ConfigSubsection()
+                       tuning.type = ConfigSelection(
+                               default = "manual_transponder",
+                               choices = { "manual_transponder" : _("Manual transponder"),
+                                                       "predefined_transponder" : _("Predefined transponder") } )
+                       tuning.sat = ConfigSatlist(list=nimmanager.getRotorSatListForNim(self.feid))
+                       tuning.sat.addNotifier(self.tuningSatChanged)
+                       self.updateTransponders()
+                       TunerScreenConfigCreated = True
+               ScanSetup.createConfig(self, None)
+
+       def tuningSatChanged(self, *parm):
+               self.updateTransponders()
+
+       def updateTransponders(self):
+               if len(tuning.sat.choices):
+                       transponderlist = nimmanager.getTransponders(int(tuning.sat.value))
+                       tps = []
+                       cnt=0
+                       for x in transponderlist:
+                               if x[3] == 0:
+                                       pol = "H"
+                               elif x[3] == 1:
+                                       pol = "V"
+                               elif x[3] == 2:
+                                       pol = "CL"
+                               elif x[3] == 3:
+                                       pol = "CR"
+                               if x[4] == 0:
+                                       fec = "FEC_AUTO"
+                               elif x[4] == 1:
+                                       fec = "FEC_1_2"
+                               elif x[4] == 2:
+                                       fec = "FEC_2_3"
+                               elif x[4] == 3:
+                                       fec = "FEC_3_4"
+                               elif x[4] == 4:
+                                       fec = "FEC_5_6"
+                               elif x[4] == 5:
+                                       fec = "FEC_7_8"
+                               elif x[4] == 5:
+                                       fec = "FEC_8_9"
+                               elif x[4] == 6:
+                                       fec = "FEC_None"
+                               tps.append(str(x[1]) + "," + str(x[2]) + "," + pol + "," + fec)
+                       tuning.transponder = ConfigSelection(choices=tps)
 
 
-               config.tuning.sat = configElement_nonSave("config.tuning.sat", configSatlist, 192, nimmanager.getSatListForNim(self.feid))
-               ScanSetup.createConfig(self)
-               self.updateSats()
-               
-       def updateSats(self):
-               transponderlist = nimmanager.getTransponders(config.tuning.sat.vals[config.tuning.sat.value][1])
-               list = []
-               for x in transponderlist:
-                       if x[3] == 0:
-                               pol = "H"
-                       elif x[3] == 1:
-                               pol = "V"
-                       elif x[3] == 2:
-                               pol = "CL"
-                       elif x[3] == 3:
-                               pol = "CR"
-                       if x[4] == 0:
-                               fec = "FEC_AUTO"
-                       elif x[4] == 1:
-                               fec = "FEC_1_2"
-                       elif x[4] == 2:
-                               fec = "FEC_2_3"
-                       elif x[4] == 3:
-                               fec = "FEC_3_4"
-                       elif x[4] == 4:
-                               fec = "FEC_5_6"
-                       elif x[4] == 5:
-                               fec = "FEC_7_8"
-                       elif x[4] == 5:
-                               fec = "FEC_8_9"
-                       elif x[4] == 6:
-                               fec = "FEC_None"
-                       list.append(str(x[1]) + "," + str(x[2]) + "," + pol + "," + fec)
-               config.tuning.transponder = configElement_nonSave("config.tuning.transponder", configSelection, 0, list)
-       
        def keyGo(self):
                returnvalue = (0, 0, 0, 0, 0, 0)
        def keyGo(self):
                returnvalue = (0, 0, 0, 0, 0, 0)
-               if currentConfigSelectionElement(config.tuning.type) == "manual_transponder":
-                       returnvalue = (config.scan.sat.frequency.value[0], config.scan.sat.symbolrate.value[0], config.scan.sat.polarization.value, config.scan.sat.fec.value, config.scan.sat.inversion.value)
-               elif currentConfigSelectionElement(config.tuning.type) == "predefined_transponder":
-                       transponder = nimmanager.getTransponders(config.tuning.sat.vals[config.tuning.sat.value][1])[config.tuning.transponder.value]
-                       returnvalue = (int(transponder[1] / 100), int(transponder[2] / 1000), transponder[3], transponder[4], 2, config.tuning.sat.vals[config.tuning.sat.value][1])
+               satpos = int(tuning.sat.value)
+               if tuning.type.value == "manual_transponder":
+                       returnvalue = (
+                               self.scan_sat.frequency.value,
+                               self.scan_sat.symbolrate.value,
+                               self.scan_sat.polarization.index,
+                               self.scan_sat.fec.index,
+                               self.scan_sat.inversion.index,
+                               satpos)
+               elif tuning.type.value == "predefined_transponder":
+                       transponder = nimmanager.getTransponders(satpos)[tuning.transponder.index]
+                       returnvalue = (int(transponder[1] / 1000), int(transponder[2] / 1000), transponder[3], transponder[4], 2, satpos)
                self.close(returnvalue)
 
        def keyCancel(self):
                self.close(None)
 
                self.close(returnvalue)
 
        def keyCancel(self):
                self.close(None)
 
+class NimSelection(Screen):
+       skin = """
+               <screen position="140,165" size="400,100" title="select Slot">
+                       <widget name="nimlist" position="20,10" size="360,75" />
+               </screen>"""
+
+       def __init__(self, session):
+               Screen.__init__(self, session)
+
+               nimlist = nimmanager.getNimListOfType(nimmanager.nimType["DVB-S"])
+               nimMenuList = []
+               for x in nimlist:
+                       nimMenuList.append((_("NIM ") + (["A", "B", "C", "D"][x]) + ": " + nimmanager.getNimName(x) + " (" + nimmanager.getNimTypeName(x) + ")", x))
+               
+               self["nimlist"] = MenuList(nimMenuList)
+
+               self["actions"] = ActionMap(["OkCancelActions"],
+               {
+                       "ok": self.okbuttonClick ,
+                       "cancel": self.close
+               }, -1)
+
+       def okbuttonClick(self):
+               selection = self["nimlist"].getCurrent()
+               self.session.open(PositionerSetup, selection[1])
+
 def PositionerMain(session, **kwargs):
 def PositionerMain(session, **kwargs):
-       session.open(PositionerSetup)
+       nimList = nimmanager.getNimListOfType(nimmanager.nimType["DVB-S"])
+       if len(nimList) == 0:
+               session.open(MessageBox, _("No positioner capable frontend found."), MessageBox.TYPE_ERROR)
+       else:
+               if session.nav.RecordTimer.isRecording():
+                       session.open(MessageBox, _("A recording is currently running. Please stop the recording before trying to configure the positioner."), MessageBox.TYPE_ERROR)
+               else:
+                       usableNims = []
+                       for x in nimList:
+                               configured_rotor_sats = nimmanager.getRotorSatListForNim(x)
+                               if len(configured_rotor_sats) != 0:
+                                       usableNims.append(x)
+                       if len(usableNims) == 1:
+                               session.open(PositionerSetup, usableNims[0])
+                       elif len(usableNims) > 1:
+                               session.open(NimSelection)
+                       else:
+                               session.open(MessageBox, _("No tuner is configured for use with a diseqc positioner!"), MessageBox.TYPE_ERROR)
+
+def PositionerSetupStart(menuid):
+       if menuid == "scan":
+               return [("Positioner setup", PositionerMain)]
+       else:
+               return []
 
 def Plugins(**kwargs):
 
 def Plugins(**kwargs):
-       return PluginDescriptor(name="Positioner setup", description="Setup your positioner", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=PositionerMain)
+       return PluginDescriptor(name="Positioner setup", description="Setup your positioner", where = PluginDescriptor.WHERE_SETUP, fnc=PositionerSetupStart)