use new string concept for sending diseqc commands
[enigma2.git] / lib / python / Plugins / SystemPlugins / PositionerSetup / plugin.py
index cd39fecf48c2f1fa6e99508f9c8ce147a2c014b5..8353f873609f2b0bc546ff3294c80844fa26d2d8 100644 (file)
@@ -1,30 +1,48 @@
-from enigma import eTimer, eDVBSatelliteEquipmentControl
+from enigma import eTimer, eDVBSatelliteEquipmentControl, eDVBResourceManager, eDVBDiseqcCommand, eDVBResourceManagerPtr, iDVBChannelPtr, iDVBFrontendPtr, iDVBFrontend
 from Screens.Screen import Screen
 from Plugins.Plugin import PluginDescriptor
 
 from Components.Label import Label
 from Components.ConfigList import ConfigList
 from Screens.Screen import Screen
 from Plugins.Plugin import PluginDescriptor
 
 from Components.Label import Label
 from Components.ConfigList import ConfigList
+from Components.TunerInfo import TunerInfo
 from Components.ActionMap import ActionMap
 from Components.config import config, ConfigSubsection, configElement_nonSave, configNothing, getConfigListEntry, configSelection
 
 class PositionerSetup(Screen):
        skin = """
                <screen position="100,100" size="560,400" title="Positioner setup..." >
 from Components.ActionMap import ActionMap
 from Components.config import config, ConfigSubsection, configElement_nonSave, configNothing, getConfigListEntry, configSelection
 
 class PositionerSetup(Screen):
        skin = """
                <screen position="100,100" size="560,400" title="Positioner setup..." >
-                       <widget name="red" position="0,100" size="140,80" backgroundColor="red" halign="center" valign="center" font="Regular;21" />
-                       <widget name="green" position="140,100" size="140,80" backgroundColor="green" halign="center" valign="center" font="Regular;21" />
-                       <widget name="yellow" position="280,100" size="140,80" backgroundColor="yellow" halign="center" valign="center" font="Regular;21" />
-                       <widget name="blue" position="420,100" size="140,80" backgroundColor="blue" halign="center" valign="center" font="Regular;21" />
-                       <widget name="status" position="0,200" size="550,40" font="Regular;15" />
-                       <widget name="list" position="100,0" size="350,100" />
+                       <widget name="list" position="100,0" size="350,120" />
+
+                       <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="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" />
                </screen>"""
        def __init__(self, session):
                self.skin = PositionerSetup.skin
                Screen.__init__(self, session)
                
                </screen>"""
        def __init__(self, session):
                self.skin = PositionerSetup.skin
                Screen.__init__(self, session)
                
+               self.session.nav.stopService()
+               
+               self.diseqc = Diseqc()
+               
+               #self.session.nav.stopService()
+               
                self.createConfig()
                
                self.createConfig()
                
-               self.status = Label("")
-               self["status"] = self.status
+               self.isMoving = False
                
                self.red = Label("")
                self["red"] = self.red
                
                self.red = Label("")
                self["red"] = self.red
@@ -34,11 +52,25 @@ class PositionerSetup(Screen):
                self["yellow"] = self.yellow
                self.blue = Label("")
                self["blue"] = self.blue
                self["yellow"] = self.yellow
                self.blue = Label("")
                self["blue"] = self.blue
+               
+               self.feid = 0
 
                self.list = []
                self["list"] = ConfigList(self.list)
                self.createSetup()
 
                self.list = []
                self["list"] = ConfigList(self.list)
                self.createSetup()
-
+               
+               self["snr"] = Label()
+               self["agc"] = Label()
+               self["ber"] = Label()
+               self["lock"] = Label()
+               self["snr_percentage"] = TunerInfo(TunerInfo.SNR_PERCENTAGE, self.session.nav.getCurrentService)
+               self["agc_percentage"] = TunerInfo(TunerInfo.AGC_PERCENTAGE, self.session.nav.getCurrentService)
+               self["ber_value"] = TunerInfo(TunerInfo.BER_VALUE, self.session.nav.getCurrentService)
+               self["snr_bar"] = TunerInfo(TunerInfo.SNR_BAR, self.session.nav.getCurrentService)
+               self["agc_bar"] = TunerInfo(TunerInfo.AGC_BAR, self.session.nav.getCurrentService)
+               self["ber_bar"] = TunerInfo(TunerInfo.BER_BAR, self.session.nav.getCurrentService)
+               self["lock_state"] = TunerInfo(TunerInfo.LOCK_STATE, self.session.nav.getCurrentService)
+               
                self["actions"] = ActionMap(["DirectionActions", "OkCancelActions", "ColorActions"],
                {
                        "ok": self.go,
                self["actions"] = ActionMap(["DirectionActions", "OkCancelActions", "ColorActions"],
                {
                        "ok": self.go,
@@ -53,19 +85,24 @@ class PositionerSetup(Screen):
                        "blue": self.blueKey,
                }, -1)
                
                        "blue": self.blueKey,
                }, -1)
                
-               self.updateColors("move")
+               self.updateColors("tune")
                
                self.statusTimer = eTimer()
                self.statusTimer.timeout.get().append(self.updateStatus)
                
                self.statusTimer = eTimer()
                self.statusTimer.timeout.get().append(self.updateStatus)
-               self.statusTimer.start(500, False)
+               self.statusTimer.start(200, False)
                
        def createConfig(self):
                config.positioner = ConfigSubsection()
                
        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)
                config.positioner.move = configElement_nonSave("move", configNothing, 0, None)
                config.positioner.limits = configElement_nonSave("limits", configNothing, 0, None)
-               config.positioner.storage = configElement_nonSave("storage", configSelection, 0, ("1", "2", "3"))
+               storepos = []
+               for x in range(255):
+                       storepos.append(str(x))
+               config.positioner.storage = configElement_nonSave("storage", configSelection, 0, 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(getConfigListEntry(_("Positioner movement"), config.positioner.move))
                self.list.append(getConfigListEntry(_("Set limits"), config.positioner.limits))
                self.list.append(getConfigListEntry(_("Positioner storage"), config.positioner.storage))
@@ -75,13 +112,16 @@ class PositionerSetup(Screen):
        def go(self):
                pass
        
        def go(self):
                pass
        
+       def getCurrentConfigPath(self):
+               return self["list"].getCurrent()[1].parent.configPath
+       
        def up(self):
                self["list"].instance.moveSelection(self["list"].instance.moveUp)
        def up(self):
                self["list"].instance.moveSelection(self["list"].instance.moveUp)
-               self.updateColors(self["list"].getCurrent()[1].parent.configPath)
+               self.updateColors(self.getCurrentConfigPath())
        
        def down(self):
                self["list"].instance.moveSelection(self["list"].instance.moveDown)
        
        def down(self):
                self["list"].instance.moveSelection(self["list"].instance.moveDown)
-               self.updateColors(self["list"].getCurrent()[1].parent.configPath)
+               self.updateColors(self.getCurrentConfigPath())
        
        def left(self):
                self["list"].handleKey(config.key["prevElement"])
        
        def left(self):
                self["list"].handleKey(config.key["prevElement"])
@@ -90,18 +130,29 @@ class PositionerSetup(Screen):
                self["list"].handleKey(config.key["nextElement"])
        
        def updateColors(self, entry):
                self["list"].handleKey(config.key["nextElement"])
        
        def updateColors(self, entry):
-               if entry == "move":
-                       self.red.setText(_("Move east"))
-                       self.green.setText(_("Step east"))
-                       self.yellow.setText(_("Step west"))
-                       self.blue.setText(_("Move west"))
+               if entry == "tune":
+                       self.red.setText("tune manually")
+                       self.green.setText("predefined transponder")
+                       self.yellow.setText("")
+                       self.blue.setText("")
+               elif entry == "move":
+                       if self.isMoving:
+                               self.red.setText(_("Stop"))
+                               self.green.setText(_("Stop"))
+                               self.yellow.setText(_("Stop"))
+                               self.blue.setText(_("Stop"))
+                       else:
+                               self.red.setText(_("Move west"))
+                               self.green.setText(_("Step west"))
+                               self.yellow.setText(_("Step east"))
+                               self.blue.setText(_("Move east"))
                elif entry == "limits":
                        self.red.setText(_("Limits off"))
                elif entry == "limits":
                        self.red.setText(_("Limits off"))
-                       self.green.setText(_("Limit east"))
-                       self.yellow.setText(_("Limit west"))
+                       self.green.setText(_("Limit west"))
+                       self.yellow.setText(_("Limit east"))
                        self.blue.setText("")
                elif entry == "storage":
                        self.blue.setText("")
                elif entry == "storage":
-                       self.red.setText(_("Apply satellite"))
+                       self.red.setText()
                        self.green.setText(_("Store position"))
                        self.yellow.setText(_("Goto position"))
                        self.blue.setText("")
                        self.green.setText(_("Store position"))
                        self.yellow.setText(_("Goto position"))
                        self.blue.setText("")
@@ -112,26 +163,109 @@ class PositionerSetup(Screen):
                        self.blue.setText("")
        
        def redKey(self):
                        self.blue.setText("")
        
        def redKey(self):
-               print "red"
-       
+               entry = self.getCurrentConfigPath()
+               if entry == "move":
+                       if self.isMoving:
+                               self.diseqc.command("stop")
+                               self.isMoving = False
+                       else:
+                               self.diseqc.command("moveWest", 0)
+                               self.isMoving = True
+                       self.updateColors("move")
+                       print "moving west"
+               elif entry == "limits":
+                       self.diseqc.command("limitOff")
+                               
        def greenKey(self):
        def greenKey(self):
-               pass
+               entry = self.getCurrentConfigPath()
+               if entry == "move":
+                       print "stepping west"
+                       self.diseqc.command("moveWest", 1)
+               elif entry == "storage":
+                       print "store at position", (config.positioner.storage.value + 1)
+                       self.diseqc.command("store", config.positioner.storage.value + 1)
+               elif entry == "limits":
+                       self.diseqc.command("limitWest")
        
        def yellowKey(self):
        
        def yellowKey(self):
-               pass
-       
+               entry = self.getCurrentConfigPath()
+               if entry == "move":
+                       print "stepping east"
+                       self.diseqc.command("moveEast", 1)
+               elif entry == "storage":
+                       print "move to position", (config.positioner.storage.value + 1)
+                       self.diseqc.command("moveTo", config.positioner.storage.value + 1)
+               elif entry == "limits":
+                       self.diseqc.command("limitEast")
+#      
        def blueKey(self):
        def blueKey(self):
-               pass
+               entry = self.getCurrentConfigPath()
+               if entry == "move":
+                       if self.isMoving:
+                               self.diseqc.command("stop")
+                               self.isMoving = False
+                       else:
+                               self.diseqc.command("moveEast", 0)
+                               self.isMoving = True
+                       self.updateColors("move")
+                       print "moving east"
 
        def updateStatus(self):
 
        def updateStatus(self):
-               if eDVBSatelliteEquipmentControl.getInstance().isRotorMoving():
-                       self.status.setText("moving...")
+               self["snr_percentage"].update()
+               self["agc_percentage"].update()
+               self["ber_value"].update()
+               self["snr_bar"].update()
+               self["agc_bar"].update()
+               self["ber_bar"].update()
+
+class Diseqc:
+       def __init__(self, feid = 0):
+               self.ready = False
+               self.feid = feid
+               res_mgr = eDVBResourceManagerPtr()
+               if eDVBResourceManager.getInstance(res_mgr) == 0:
+                       raw_channel = iDVBChannelPtr()
+                       if res_mgr.allocateRawChannel(raw_channel, self.feid) == 0:
+                               self.frontend = iDVBFrontendPtr()
+                               if raw_channel.getFrontend(self.frontend) == 0:
+                                       self.frontend.setVoltage(iDVBFrontend.voltage18)
+                                       self.ready = True
+                               else:
+                                       print "getFrontend failed"
+                       else:
+                               print "getRawChannel failed"
                else:
                else:
-                       self.status.setText("not moving")
+                               print "getResourceManager instance failed"
                
                
-def PositionerMain(session):
+       def command(self, what, param = 0):
+               if self.ready:
+                       cmd = eDVBDiseqcCommand()
+                       if what == "moveWest":
+                               string = 'e13169' + ("%02x" % param)
+                       elif what == "moveEast":
+                               string = 'e13168' + ("%02x" % param)
+                       elif what == "moveTo":
+                               string = 'e1316b' + ("%02x" % param)
+                       elif what == "store":
+                               string = 'e1316a' + ("%02x" % param)
+                       elif what == "limitOff":
+                               string = 'e13163'
+                       elif what == "limitEast":
+                               string = 'e13166'
+                       elif what == "limitWest":
+                               string = 'e13167'
+                       else:
+                               string = 'e03160' #positioner stop
+                       print "diseqc command:",
+                       for x in string:
+                               print hex(ord(x)),
+                       print
+                       
+                       cmd.setCommandString(string)
+                       self.frontend.sendDiseqc(cmd)
+                                       
+def PositionerMain(session, **kwargs):
        session.open(PositionerSetup)
 
        session.open(PositionerSetup)
 
-def Plugins():
+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_PLUGINMENU, fnc=PositionerMain)
-