catch up DiseqcTest development
authorStefan Pluecken <stefan.pluecken@multimedia-labs.de>
Mon, 24 Nov 2008 21:42:42 +0000 (22:42 +0100)
committerStefan <stefan@tuxboxls.(none)>
Tue, 16 Dec 2008 18:55:34 +0000 (19:55 +0100)
configure.ac
lib/dvb/db.cpp
lib/python/Components/Makefile.am
lib/python/Components/Sources/Progress.py
lib/python/Components/TuneTest.py [new file with mode: 0644]
lib/python/Plugins/SystemPlugins/DiseqcTester/Makefile.am [new file with mode: 0644]
lib/python/Plugins/SystemPlugins/DiseqcTester/__init__.py [new file with mode: 0644]
lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py [new file with mode: 0644]
lib/python/Plugins/SystemPlugins/Makefile.am
lib/python/Plugins/SystemPlugins/Satfinder/plugin.py
lib/python/Screens/Satconfig.py

index 7aebe25..719baa1 100644 (file)
@@ -120,6 +120,7 @@ lib/python/Plugins/SystemPlugins/SkinSelector/Makefile
 lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/Makefile
 lib/python/Plugins/SystemPlugins/Videomode/Makefile
 lib/python/Plugins/SystemPlugins/VideoTune/Makefile
+lib/python/Plugins/SystemPlugins/DiseqcTester/Makefile
 lib/python/Plugins/DemoPlugins/Makefile
 lib/python/Plugins/DemoPlugins/TestPlugin/Makefile
 lib/python/Plugins/Extensions/Makefile
index 4419158..6f30253 100644 (file)
@@ -786,7 +786,7 @@ PyObject *eDVBDB::readSatellites(ePyObject sat_list, ePyObject sat_dict, ePyObje
                return Py_False;
        }
        int tmp, *dest = NULL,
-               modulation, system, freq, sr, pol, fec, inv, pilot, rolloff;
+               modulation, system, freq, sr, pol, fec, inv, pilot, rolloff, tsid, onid;
        char *end_ptr;
        const Attribute *at;
        std::string name;
@@ -851,6 +851,9 @@ PyObject *eDVBDB::readSatellites(ePyObject sat_list, ePyObject sat_dict, ePyObje
                                inv = 2; // AUTO default
                                pilot = 2; // AUTO default
                                rolloff = 0; // alpha 0.35
+                               tsid = -1;
+                               onid = -1;
+
                                for (AttributeConstIterator it(tp_attributes.begin()); it != end; ++it)
                                {
 //                                     eDebug("\t\tattr: %s", at->name().c_str());
@@ -865,6 +868,8 @@ PyObject *eDVBDB::readSatellites(ePyObject sat_list, ePyObject sat_dict, ePyObje
                                        else if (name == "inversion") dest = &inv;
                                        else if (name == "rolloff") dest = &rolloff;
                                        else if (name == "pilot") dest = &pilot;
+                                       else if (name == "tsid") dest = &tsid;
+                                       else if (name == "onid") dest = &onid;
                                        if (dest)
                                        {
                                                tmp = strtol(at->value().c_str(), &end_ptr, 10);
@@ -874,7 +879,7 @@ PyObject *eDVBDB::readSatellites(ePyObject sat_list, ePyObject sat_dict, ePyObje
                                }
                                if (freq && sr && pol != -1)
                                {
-                                       tuple = PyTuple_New(10);
+                                       tuple = PyTuple_New(12);
                                        PyTuple_SET_ITEM(tuple, 0, PyInt_FromLong(0));
                                        PyTuple_SET_ITEM(tuple, 1, PyInt_FromLong(freq));
                                        PyTuple_SET_ITEM(tuple, 2, PyInt_FromLong(sr));
@@ -885,6 +890,8 @@ PyObject *eDVBDB::readSatellites(ePyObject sat_list, ePyObject sat_dict, ePyObje
                                        PyTuple_SET_ITEM(tuple, 7, PyInt_FromLong(inv));
                                        PyTuple_SET_ITEM(tuple, 8, PyInt_FromLong(rolloff));
                                        PyTuple_SET_ITEM(tuple, 9, PyInt_FromLong(pilot));
+                                       PyTuple_SET_ITEM(tuple, 10, PyInt_FromLong(tsid));
+                                       PyTuple_SET_ITEM(tuple, 11, PyInt_FromLong(onid));
                                        PyList_Append(tplist, tuple);
                                        Py_DECREF(tuple);
                                }
@@ -1497,7 +1504,7 @@ int eDVBDBQueryBase::compareLessEqual(const eServiceReferenceDVB &a, const eServ
 {
        ePtr<eDVBService> a_service, b_service;
        int sortmode = m_query ? m_query->m_sort : eDVBChannelQuery::tName;
-       
+
        if ((sortmode == eDVBChannelQuery::tName) || (sortmode == eDVBChannelQuery::tProvider))
        {
                if (a.name.empty() && m_db->getService(a, a_service))
@@ -1505,7 +1512,7 @@ int eDVBDBQueryBase::compareLessEqual(const eServiceReferenceDVB &a, const eServ
                if (b.name.empty() && m_db->getService(b, b_service))
                        return 1;
        }
-       
+
        switch (sortmode)
        {
        case eDVBChannelQuery::tName:
@@ -1747,10 +1754,10 @@ static int decodeType(const std::string &type)
 RESULT parseExpression(ePtr<eDVBChannelQuery> &res, std::list<std::string>::const_iterator begin, std::list<std::string>::const_iterator end)
 {
        std::list<std::string>::const_iterator end_of_exp;
-       
+
        if (begin == end)
                return 0;
-       
+
        if (*begin == "(")
        {
                end_of_exp = begin;
@@ -1759,36 +1766,36 @@ RESULT parseExpression(ePtr<eDVBChannelQuery> &res, std::list<std::string>::cons
                                break;
                        else
                                ++end_of_exp;
-       
+
                if (end_of_exp == end)
                {
                        eDebug("expression parse: end of expression while searching for closing brace");
                        return -1;
                }
-               
+
                ++begin;
                // begin..end_of_exp
                int r = parseExpression(res, begin, end_of_exp);
                if (r)
                        return r;
                ++end_of_exp;
-               
+
                        /* we had only one sub expression */
                if (end_of_exp == end)
                {
 //                     eDebug("only one sub expression");
                        return 0;
                }
-               
+
                        /* otherwise we have an operator here.. */
-               
+
                ePtr<eDVBChannelQuery> r2 = res;
                res = new eDVBChannelQuery();
                res->m_sort = 0;
                res->m_p1 = r2;
                res->m_inverse = 0;
                r2 = 0;
-               
+
                if (*end_of_exp == "||")
                        res->m_type = eDVBChannelQuery::tOR;
                else if (*end_of_exp == "&&")
@@ -1799,18 +1806,18 @@ RESULT parseExpression(ePtr<eDVBChannelQuery> &res, std::list<std::string>::cons
                        res = 0;
                        return 1;
                }
-               
+
                ++end_of_exp;
-               
+
                return parseExpression(res->m_p2, end_of_exp, end);
        }
-       
+
        // "begin" <op> "end"
        std::string type, op, val;
-       
+
        res = new eDVBChannelQuery();
        res->m_sort = 0;
-       
+
        int cnt = 0;
        while (begin != end)
        {
@@ -1832,23 +1839,23 @@ RESULT parseExpression(ePtr<eDVBChannelQuery> &res, std::list<std::string>::cons
                ++begin;
                ++cnt;
        }
-       
+
        if (cnt != 3)
        {
                eDebug("malformed query: missing stuff");
                res = 0;
                return 1;
        }
-       
+
        res->m_type = decodeType(type);
-       
+
        if (res->m_type == -1)
        {
                eDebug("malformed query: invalid type %s", type.c_str());
                res = 0;
                return 1;
        }
-       
+
        if (op == "==")
                res->m_inverse = 0;
        else if (op == "!=")
@@ -1859,7 +1866,7 @@ RESULT parseExpression(ePtr<eDVBChannelQuery> &res, std::list<std::string>::cons
                res = 0;
                return 1;
        }
-       
+
        res->m_string = val;
 
        if (res->m_type == eDVBChannelQuery::tChannelID)
@@ -1879,7 +1886,7 @@ RESULT parseExpression(ePtr<eDVBChannelQuery> &res, std::list<std::string>::cons
 RESULT eDVBChannelQuery::compile(ePtr<eDVBChannelQuery> &res, std::string query)
 {
        std::list<std::string> tokens;
-       
+
        std::string current_token;
        std::string bouquet_name;
 
@@ -1891,34 +1898,34 @@ RESULT eDVBChannelQuery::compile(ePtr<eDVBChannelQuery> &res, std::string query)
        {
                int c = (i < query.size()) ? query[i] : ' ';
                ++i;
-               
+
                int issplit = !!strchr(splitchars, c);
                int isaln = isalnum(c);
                int iswhite = c == ' ';
                int isquot = c == '\"';
-               
+
                if (quotemode)
                {
                        iswhite = issplit = 0;
                        isaln = lastalnum;
                }
-               
+
                if (issplit || iswhite || isquot || lastsplit || (lastalnum != isaln))
                {
                        if (current_token.size())
                                tokens.push_back(current_token);
                        current_token.clear();
                }
-               
+
                if (!(iswhite || isquot))
                        current_token += c;
-               
+
                if (isquot)
                        quotemode = !quotemode;
                lastsplit = issplit;
                lastalnum = isaln;
        }
-       
+
 //     for (std::list<std::string>::const_iterator a(tokens.begin()); a != tokens.end(); ++a)
 //     {
 //             printf("%s\n", a->c_str());
@@ -1970,12 +1977,12 @@ RESULT eDVBChannelQuery::compile(ePtr<eDVBChannelQuery> &res, std::string query)
                res = 0;
                return -1;
        }
-       
+
 //     eDebug("sort by %d", sort);
-       
+
                /* now we recursivly parse that. */
        int r = parseExpression(res, tokens.begin(), tokens.end());
-       
+
                /* we have an empty (but valid!) expression */
        if (!r && !res)
        {
@@ -1983,7 +1990,7 @@ RESULT eDVBChannelQuery::compile(ePtr<eDVBChannelQuery> &res, std::string query)
                res->m_inverse = 0;
                res->m_type = eDVBChannelQuery::tAny;
        }
-       
+
        if (res)
        {
                res->m_sort = sort;
index 9c04701..67cec18 100644 (file)
@@ -18,4 +18,4 @@ install_PYTHON = \
        MultiContent.py MediaPlayer.py TunerInfo.py VideoWindow.py ChoiceList.py \
        Element.py Playlist.py ParentalControl.py ParentalControlList.py \
        Ipkg.py SelectionList.py Scanner.py SystemInfo.py DreamInfoHandler.py \
-       Task.py language_cache.py Console.py ResourceManager.py
+       Task.py language_cache.py Console.py ResourceManager.py TuneTest.py
index b96065b..d57a617 100644 (file)
@@ -12,5 +12,12 @@ class Progress(Source):
        def setValue(self, value):
                self.__value = value
                self.changed((self.CHANGED_ALL,))
+               
+       def setRange(self, range = 100):
+               self.range = range
+               self.changed((self.CHANGED_ALL,))
+
+       def getRange(self):
+               return self.range
 
        value = property(getValue, setValue)
diff --git a/lib/python/Components/TuneTest.py b/lib/python/Components/TuneTest.py
new file mode 100644 (file)
index 0000000..7b087b9
--- /dev/null
@@ -0,0 +1,189 @@
+from enigma import eDVBFrontendParametersSatellite, eDVBFrontendParameters, eDVBResourceManager, eTimer
+
+class Tuner:
+       def __init__(self, frontend):
+               self.frontend = frontend
+       
+       # transponder = (frequency, symbolrate, polarisation, fec, inversion, orbpos, system, modulation)
+       #                    0         1             2         3       4         5       6        7
+       def tune(self, transponder):
+               if self.frontend:
+                       print "tuning to transponder with data", transponder
+                       parm = eDVBFrontendParametersSatellite()
+                       parm.frequency = transponder[0] * 1000
+                       parm.symbol_rate = transponder[1] * 1000
+                       parm.polarisation = transponder[2]
+                       parm.fec = transponder[3]
+                       parm.inversion = transponder[4]
+                       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)
+                       self.lastparm = feparm
+                       self.frontend.tune(feparm)
+       
+       def retune(self):
+               if self.frontend:
+                       self.frontend.tune(self.lastparm)
+
+# tunes a list of transponders and checks, if they lock and optionally checks the onid/tsid combination
+# 1) add transponders with addTransponder()
+# 2) call run(<checkPIDs = True>)
+# 3) finishedChecking() is called, when the run is finished
+class TuneTest:
+       def __init__(self, feid, stopOnSuccess = False, stopOnError = False):
+               self.stopOnSuccess = stopOnSuccess
+               self.stopOnError = stopOnError
+               self.feid = feid
+               self.transponderlist = []
+               self.currTuned = None
+               print "TuneTest for feid %d" % self.feid
+               if not self.openFrontend():
+                       self.oldref = self.session.nav.getCurrentlyPlayingServiceReference()
+                       self.session.nav.stopService() # try to disable foreground service
+                       if not self.openFrontend():
+                               if self.session.pipshown: # try to disable pip
+                                       self.session.pipshown = False
+                                       del self.session.pip
+                                       if not self.openFrontend():
+                                               self.frontend = None # in normal case this should not happen
+               self.tuner = Tuner(self.frontend)
+               self.timer = eTimer()
+               self.timer.callback.append(self.updateStatus)
+                       
+       def updateStatus(self):
+               dict = {}
+               self.frontend.getFrontendStatus(dict)
+               print "status:", dict
+
+               stop = False
+               
+               if dict["tuner_state"] == "TUNING":
+                       self.timer.start(100, True)
+                       self.progressCallback((len(self.transponderlist), self.tuningtransponder, self.STATUS_TUNING, self.currTuned))
+               elif self.checkPIDs and self.pidStatus == self.INTERNAL_PID_STATUS_NOOP:
+                       if dict["tuner_state"] == "LOCKED":
+                               print "acquiring TSID/ONID"
+                               # TODO start getting TSID/ONID
+                               self.pidStatus = self.INTERNAL_PID_STATUS_WAITING
+                       else:
+                               self.pidStatus = self.INTERNAL_PID_STATUS_FAILED
+               elif self.checkPIDs and self.pidStatus == self.INTERNAL_PID_STATUS_WAITING:
+                       print "waiting for pids"                        
+               else:
+                       if dict["tuner_state"] == "LOSTLOCK" or dict["tuner_state"] == "FAILED":
+                               self.tuningtransponder = self.nextTransponder()
+                               self.failedTune.append([self.currTuned, self.oldTuned, "tune_failed"])
+                               if self.stopOnError == True:
+                                       stop = True
+                       elif dict["tuner_state"] == "LOCKED":
+                               pidsFailed = False
+                               if self.checkPIDs:
+                                       tsid = 0 # TODO read values
+                                       onid = 0 # TODO read values
+                                       if tsid != self.currTuned[8] or onid != self.currTuned[9]:
+                                               self.failedTune.append([self.currTuned, self.oldTuned, "pids_failed"])
+                                               pidsFailes = True
+                               elif not self.checkPIDs or (self.checkPids and not pidsFailed):  
+                                       self.successfullyTune.append([self.currTuned, self.oldTuned])
+                                       if self.stopOnSuccess == True:
+                                               stop = True
+                               self.tuningtransponder = self.nextTransponder()
+                       else:
+                               print "************* tuner_state:", dict["tuner_state"]
+                               
+                       self.progressCallback((len(self.transponderlist), self.tuningtransponder, self.STATUS_NOOP, self.currTuned))
+                       
+                       if not stop:
+                               self.tune()
+               if self.tuningtransponder < len(self.transponderlist) and not stop:
+                       self.timer.start(100, True)
+                       print "restart timer"
+               else:
+                       self.progressCallback((len(self.transponderlist), self.tuningtransponder, self.STATUS_DONE, self.currTuned))
+                       print "finishedChecking"
+                       self.finishedChecking()
+                               
+       def firstTransponder(self):
+               print "firstTransponder:"
+               index = 0
+               if self.checkPIDs:
+                       print "checkPIDs-loop"
+                       # check for tsid != -1 and onid != -1 
+                       print "index:", index
+                       print "len(self.transponderlist):", len(self.transponderlist)
+                       while (index < len(self.transponderlist) and (self.transponderlist[index][8] == -1 or self.transponderlist[index][9] == -1)):
+                               index += 1
+               print "FirstTransponder final index:", index
+               return index
+       
+       def nextTransponder(self):
+               index = self.tuningtransponder + 1
+               if self.checkPIDs:
+                       # check for tsid != -1 and onid != -1 
+                       while (index < len(self.transponderlist) and self.transponderlist[index][8] != -1 and self.transponderlist[index][9] != -1):
+                               index += 1
+
+               return index
+       
+       def finishedChecking(self):
+               print "finished testing"
+               print "successfull:", self.successfullyTune
+               print "failed:", self.failedTune
+       
+       def openFrontend(self):
+               res_mgr = eDVBResourceManager.getInstance()
+               if res_mgr:
+                       self.raw_channel = res_mgr.allocateRawChannel(self.feid)
+                       if self.raw_channel:
+                               self.frontend = self.raw_channel.getFrontend()
+                               if self.frontend:
+                                       return True
+                               else:
+                                       print "getFrontend failed"
+                       else:
+                               print "getRawChannel failed"
+               else:
+                       print "getResourceManager instance failed"
+               return False
+
+       def tune(self):
+               print "tuning to", self.tuningtransponder
+               if self.tuningtransponder < len(self.transponderlist):
+                       self.pidStatus = self.INTERNAL_PID_STATUS_NOOP
+                       self.oldTuned = self.currTuned
+                       self.currTuned = self.transponderlist[self.tuningtransponder]
+                       self.tuner.tune(self.transponderlist[self.tuningtransponder])           
+
+       INTERNAL_PID_STATUS_NOOP = 0
+       INTERNAL_PID_STATUS_WAITING = 1
+       INTERNAL_PID_STATUS_SUCCESSFUL = 2
+       INTERNAL_PID_STATUS_FAILED = 3
+       
+       def run(self, checkPIDs = False):
+               self.checkPIDs = checkPIDs
+               self.pidStatus = self.INTERNAL_PID_STATUS_NOOP
+               self.failedTune = []
+               self.successfullyTune = []
+               self.tuningtransponder = self.firstTransponder()
+               self.tune()
+               self.progressCallback((len(self.transponderlist), self.tuningtransponder, self.STATUS_START, self.currTuned))
+               self.timer.start(100, True)
+       
+       # transponder = (frequency, symbolrate, polarisation, fec, inversion, orbpos, <system>, <modulation>, <tsid>, <onid>)
+       #                    0         1             2         3       4         5       6        7              8      9
+       def addTransponder(self, transponder):
+               self.transponderlist.append(transponder)
+               
+       def clearTransponder(self):
+               self.transponderlist = []
+               
+       STATUS_START = 0
+       STATUS_TUNING = 1
+       STATUS_DONE = 2
+       STATUS_NOOP = 3
+       # can be overwritten
+       # progress = (range, value, status, transponder)
+       def progressCallback(self, progress):
+               pass
\ No newline at end of file
diff --git a/lib/python/Plugins/SystemPlugins/DiseqcTester/Makefile.am b/lib/python/Plugins/SystemPlugins/DiseqcTester/Makefile.am
new file mode 100644 (file)
index 0000000..cd72696
--- /dev/null
@@ -0,0 +1,5 @@
+installdir = $(LIBDIR)/enigma2/python/Plugins/SystemPlugins/DiseqcTester
+
+install_PYTHON =       \
+       __init__.py \
+       plugin.py
\ No newline at end of file
diff --git a/lib/python/Plugins/SystemPlugins/DiseqcTester/__init__.py b/lib/python/Plugins/SystemPlugins/DiseqcTester/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py b/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py
new file mode 100644 (file)
index 0000000..5734036
--- /dev/null
@@ -0,0 +1,239 @@
+from Screens.Satconfig import NimSelection
+from Screens.Screen import Screen
+
+from Plugins.Plugin import PluginDescriptor
+
+from Components.ActionMap import NumberActionMap
+from Components.NimManager import nimmanager
+from Components.ResourceManager import resourcemanager
+from Components.Sources.FrontendStatus import FrontendStatus
+from Components.TuneTest import TuneTest
+from Components.Sources.Progress import Progress
+from Components.Sources.StaticText import StaticText
+
+class DiseqcTester(Screen, TuneTest):
+       skin = """
+               <screen position="90,100" size="520,400" title="DiSEqC Tester" >
+                       <ePixmap pixmap="skin_default/icons/dish_scan.png" position="5,25" zPosition="0" size="119,110" transparent="1" alphatest="on" />
+               <widget source="Frontend" render="Label" position="190,10" zPosition="2" size="260,20" font="Regular;19" halign="center" valign="center" transparent="1">
+                       <convert type="FrontendInfo">SNRdB</convert>
+               </widget>
+               <eLabel name="snr" text="SNR:" position="120,35" size="60,22" font="Regular;21" halign="right" transparent="1" />
+               <widget source="Frontend" render="Progress" position="190,35" size="260,20" pixmap="skin_default/bar_snr.png" borderWidth="2" borderColor="#cccccc">
+                       <convert type="FrontendInfo">SNR</convert>
+               </widget>
+               <widget source="Frontend" render="Label" position="460,35" size="60,22" font="Regular;21">
+                       <convert type="FrontendInfo">SNR</convert>
+               </widget>
+               <eLabel name="agc" text="AGC:" position="120,60" size="60,22" font="Regular;21" halign="right" transparent="1" />
+               <widget source="Frontend" render="Progress" position="190,60" size="260,20" pixmap="skin_default/bar_snr.png" borderWidth="2" borderColor="#cccccc">
+                       <convert type="FrontendInfo">AGC</convert>
+               </widget>
+               <widget source="Frontend" render="Label" position="460,60" size="60,22" font="Regular;21">
+                       <convert type="FrontendInfo">AGC</convert>
+               </widget>
+               <eLabel name="ber" text="BER:" position="120,85" size="60,22" font="Regular;21" halign="right" transparent="1" />
+               <widget source="Frontend" render="Progress" position="190,85" size="260,20" pixmap="skin_default/bar_ber.png" borderWidth="2" borderColor="#cccccc">
+                       <convert type="FrontendInfo">BER</convert>
+               </widget>
+               <widget source="Frontend" render="Label" position="460,85" size="60,22" font="Regular;21">
+                       <convert type="FrontendInfo">BER</convert>
+               </widget>
+               <eLabel name="lock" text="Lock:" position="120,115" size="60,22" font="Regular;21" halign="right" />
+               <widget source="Frontend" render="Pixmap" pixmap="skin_default/icons/lock_on.png" position="190,110" zPosition="1" size="38,31" alphatest="on">
+                       <convert type="FrontendInfo">LOCK</convert>
+                       <convert type="ConditionalShowHide" />
+               </widget>
+               <widget source="Frontend" render="Pixmap" pixmap="skin_default/icons/lock_off.png" position="190,110" zPosition="1" size="38,31" alphatest="on">
+                       <convert type="FrontendInfo">LOCK</convert>
+                       <convert type="ConditionalShowHide">Invert</convert>
+               </widget>
+               <eLabel name="overall_progress" text="Overall progress:" position="20,162" size="480,22" font="Regular;21" halign="center" transparent="1" />
+               <widget source="overall_progress" render="Progress" position="20,192" size="480,20" borderWidth="2" backgroundColor="#254f7497" />
+               <eLabel name="overall_progress" text="Progress:" position="20,222" size="480,22" font="Regular;21" halign="center" transparent="1" />
+               <widget source="sub_progress" render="Progress" position="20,252" size="480,20" borderWidth="2" backgroundColor="#254f7497" />
+               
+               <eLabel name="" text="Failed:" position="20,282" size="140,22" font="Regular;21" halign="left" transparent="1" />
+               <widget source="failed_counter" render="Label" position="160,282" size="480,20" font="Regular;21" />
+               
+               <eLabel name="" text="Succeeded:" position="20,312" size="140,22" font="Regular;21" halign="left" transparent="1" />
+               <widget source="succeeded_counter" render="Label" position="160,312" size="480,20" font="Regular;21" />
+               </screen>"""
+               
+       TEST_TYPE_QUICK = 0
+       TEST_TYPE_RANDOM = 1
+       TEST_TYPE_COMPLETE = 2
+       def __init__(self, session, feid, test_type = TEST_TYPE_QUICK):
+               Screen.__init__(self, session)
+               self.feid = feid
+               self.test_type = test_type
+               
+               self["actions"] = NumberActionMap(["SetupActions"],
+               {
+                       "ok": self.keyGo,
+                       "cancel": self.keyCancel,
+               }, -2)
+               
+               TuneTest.__init__(self, feid, stopOnSuccess = True)
+               self["Frontend"] = FrontendStatus(frontend_source = lambda : self.frontend, update_interval = 100)
+               self["overall_progress"] = Progress()
+               self["sub_progress"] = Progress()
+               self["failed_counter"] = StaticText("10")
+               self["succeeded_counter"] = StaticText("10")
+                               
+               self.indexlist = {}
+               self.readTransponderList()
+
+       def readTransponderList(self):
+               for sat in nimmanager.getSatListForNim(self.feid):
+                       for transponder in nimmanager.getTransponders(sat[0]):
+                               #print transponder
+                               mytransponder = (transponder[1] / 1000, transponder[2] / 1000, transponder[3], transponder[4], transponder[5], sat[0], None, None, transponder[10], transponder[11])
+                               self.analyseTransponder(mytransponder)
+
+       def getIndexForTransponder(self, transponder):
+               if transponder[0] < 11700:
+                       band = 1 # low
+               else:
+                       band = 0 # high
+                       
+               polarisation = transponder[2]
+               
+               sat = transponder[5]
+               
+               index = (band, polarisation, sat)
+               return index
+
+       # sort the transponder into self.transponderlist
+       def analyseTransponder(self, transponder):
+               index = self.getIndexForTransponder(transponder)
+               if index not in self.indexlist:
+                       self.indexlist[index] = []
+               self.indexlist[index].append(transponder)
+               #print "self.indexlist:", self.indexlist
+       
+       # returns a string for the user representing a human readable output for index 
+       def getTextualIndexRepresentation(self, index):
+               print "getTextualIndexRepresentation:", index
+               text = ""
+               
+               # TODO better sat representation
+               text += "%s, " % index[2] 
+               
+               if index[0] == 1:
+                       text += "Low Band, "
+               else:
+                       text += "High Band, "
+                       
+               if index[1] == 0:
+                       text += "H"
+               else:
+                       text += "V"
+               return text
+       
+       def fillTransponderList(self):
+               self.clearTransponder()
+               print "----------- fillTransponderList"
+               print "index:", self.currentlyTestedIndex
+               keys = self.indexlist.keys()
+               if self.getContinueScanning():
+                       print "index:", self.getTextualIndexRepresentation(self.currentlyTestedIndex)
+                       for transponder in self.indexlist[self.currentlyTestedIndex]:
+                               self.addTransponder(transponder)
+                       print "transponderList:", self.transponderlist
+                       return True
+               else:
+                       return False
+               
+       def progressCallback(self, progress):
+               if progress[0] != self["sub_progress"].getRange():
+                       self["sub_progress"].setRange(progress[0])
+               self["sub_progress"].setValue(progress[1])
+
+       # logic for scanning order of transponders
+       # on go getFirstIndex is called
+       def getFirstIndex(self):
+               # TODO use other function to scan more randomly
+               if self.test_type == self.TEST_TYPE_QUICK:
+                       self.myindex = 0
+                       keys = self.indexlist.keys()
+                       self["overall_progress"].setRange(len(keys))
+                       self["overall_progress"].setValue(self.myindex)
+                       return keys[0]
+               
+       # after each index is finished, getNextIndex is called to get the next index to scan 
+       def getNextIndex(self):
+               # TODO use other function to scan more randomly
+               if self.test_type == self.TEST_TYPE_QUICK:
+                       self.myindex += 1
+                       keys = self.indexlist.keys()
+                       
+                       self["overall_progress"].setValue(self.myindex)
+                       if self.myindex < len(keys):
+                               return keys[self.myindex]
+                       else:
+                               return None
+       
+       # after each index is finished and the next index is returned by getNextIndex
+       # the algorithm checks, if we should continue scanning
+       def getContinueScanning(self):
+               if self.test_type == self.TEST_TYPE_QUICK:
+                       return (self.myindex < len(self.indexlist.keys()))
+       
+       def finishedChecking(self):
+               print "finishedChecking"
+               TuneTest.finishedChecking(self)
+               self.currentlyTestedIndex = self.getNextIndex()
+               if self.fillTransponderList():
+                       self.run(checkPIDs = True)
+
+       def keyGo(self):
+               self.currentlyTestedIndex = self.getFirstIndex()
+               if self.fillTransponderList():
+                       self.run(True)
+
+       def keyCancel(self):
+               self.close()
+
+class DiseqcTesterNimSelection(NimSelection):
+       skin = """
+               <screen position="160,123" size="400,330" title="Choose Tuner">
+               <widget source="nimlist" render="Listbox" position="0,0" size="380,300" scrollbarMode="showOnDemand">
+                       <convert type="TemplatedMultiContent">
+                               {"template": [
+                                               MultiContentEntryText(pos = (10, 5), size = (360, 30), flags = RT_HALIGN_LEFT, text = 1), # index 1 is the nim name,
+                                               MultiContentEntryText(pos = (50, 30), size = (320, 30), font = 1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is a description of the nim settings,
+                                       ],
+                                "fonts": [gFont("Regular", 20), gFont("Regular", 15)],
+                                "itemHeight": 70
+                               }
+                       </convert>
+               </widget>
+       </screen>"""
+               
+       def __init__(self, session, args = None):
+               NimSelection.__init__(self, session)
+
+       def setResultClass(self):
+               self.resultclass = DiseqcTester
+               
+       def showNim(self, nim):
+               nimConfig = nimmanager.getNimConfig(nim.slot)
+               if nim.isCompatible("DVB-S"):
+                       if nimConfig.configMode.value in ["loopthrough", "equal", "satposdepends", "nothing"]:
+                               return False
+                       if nimConfig.configMode.value == "simple":
+                               if nimConfig.diseqcMode.value == "positioner":
+                                       return False
+                       return True
+               return False
+
+def DiseqcTesterMain(session, **kwargs):
+       session.open(DiseqcTesterNimSelection)
+       
+def autostart(reason, **kwargs):
+       resourcemanager.addResource("DiseqcTester", DiseqcTesterMain)
+
+def Plugins(**kwargs):
+       return [ PluginDescriptor(name="DiSEqC Tester", description=_("Test DiSEqC settings"), where = PluginDescriptor.WHERE_PLUGINMENU, fnc=DiseqcTesterMain),
+                       PluginDescriptor(where = PluginDescriptor.WHERE_AUTOSTART, fnc = autostart)]
\ No newline at end of file
index 36b4bde..4491eaf 100644 (file)
@@ -1 +1 @@
-SUBDIRS = SoftwareUpdate FrontprocessorUpgrade PositionerSetup ConfigurationBackup Satfinder SkinSelector SatelliteEquipmentControl Videomode VideoTune Hotplug DefaultServicesScanner NFIFlash
+SUBDIRS = SoftwareUpdate FrontprocessorUpgrade PositionerSetup ConfigurationBackup Satfinder SkinSelector SatelliteEquipmentControl Videomode VideoTune Hotplug DefaultServicesScanner NFIFlash DiseqcTester
index d61c150..7298248 100644 (file)
@@ -12,33 +12,8 @@ from Components.ActionMap import ActionMap
 from Components.NimManager import nimmanager, getConfigSatlist
 from Components.MenuList import MenuList
 from Components.config import ConfigSelection, getConfigListEntry
+from Components.TuneTest import Tuner
 
-class Tuner:
-       def __init__(self, frontend):
-               self.frontend = frontend
-               
-       def tune(self, transponder):
-               if self.frontend:
-                       print "tuning to transponder with data", transponder
-                       parm = eDVBFrontendParametersSatellite()
-                       parm.frequency = transponder[0] * 1000
-                       parm.symbol_rate = transponder[1] * 1000
-                       parm.polarisation = transponder[2]
-                       parm.fec = transponder[3]
-                       parm.inversion = transponder[4]
-                       parm.orbital_position = transponder[5]
-                       parm.system = transponder[6]
-                       parm.modulation = transponder[7]
-                       parm.rolloff = transponder[8]
-                       parm.pilot = transponder[9]
-                       feparm = eDVBFrontendParameters()
-                       feparm.setDVBS(parm, True)
-                       self.lastparm = feparm
-                       self.frontend.tune(feparm)
-
-       def retune(self):
-               if self.frontend:
-                       self.frontend.tune(self.lastparm)
 
 class Satfinder(ScanSetup):
        def openFrontend(self):
index 5628926..320bea8 100644 (file)
@@ -384,18 +384,26 @@ class NimSelection(Screen):
                self.list = [None] * nimmanager.getSlotCount()
                self["nimlist"] = List(self.list)
                self.updateList()
+               
+               self.setResultClass()
 
                self["actions"] = ActionMap(["OkCancelActions"],
                {
                        "ok": self.okbuttonClick ,
                        "cancel": self.close
                }, -2)
+               
+       def setResultClass(self):
+               self.resultclass = NimSetup
 
        def okbuttonClick(self):
                nim = self["nimlist"].getCurrent()
                nim = nim and nim[3]
                if nim is not None and not nim.empty:
-                       self.session.openWithCallback(self.updateList, NimSetup, nim.slot)
+                       self.session.openWithCallback(self.updateList, self.resultclass, nim.slot)
+                       
+       def showNim(self, nim):
+               return True
 
        def updateList(self):
                self.list = [ ]
@@ -403,42 +411,44 @@ class NimSelection(Screen):
                        slotid = x.slot
                        nimConfig = nimmanager.getNimConfig(x.slot)
                        text = nimConfig.configMode.value
-                       if x.isCompatible("DVB-S"):
-                               if nimConfig.configMode.value in ["loopthrough", "equal", "satposdepends"]:
-                                       text = { "loopthrough": _("loopthrough to"),
-                                                        "equal": _("equal to"),
-                                                        "satposdepends": _("second cable of motorized LNB") } [nimConfig.configMode.value]
-                                       text += " " + _("Tuner") + " " + ["A", "B", "C", "D"][int(nimConfig.connectedTo.value)]
-                               elif nimConfig.configMode.value == "nothing":
-                                       text = _("nothing connected")
-                               elif nimConfig.configMode.value == "simple":
-                                       if nimConfig.diseqcMode.value in ["single", "toneburst_a_b", "diseqc_a_b", "diseqc_a_b_c_d"]:
-                                               text = _("Sats") + ": " 
-                                               if nimConfig.diseqcA.orbital_position != 3601:
-                                                       text += nimmanager.getSatName(int(nimConfig.diseqcA.value))
-                                               if nimConfig.diseqcMode.value in ["toneburst_a_b", "diseqc_a_b", "diseqc_a_b_c_d"]:
-                                                       if nimConfig.diseqcB.orbital_position != 3601:
-                                                               text += "," + nimmanager.getSatName(int(nimConfig.diseqcB.value))
-                                               if nimConfig.diseqcMode.value == "diseqc_a_b_c_d":
-                                                       if nimConfig.diseqcC.orbital_position != 3601:
-                                                               text += "," + nimmanager.getSatName(int(nimConfig.diseqcC.value))
-                                                       if nimConfig.diseqcD.orbital_position != 3601:
-                                                               text += "," + nimmanager.getSatName(int(nimConfig.diseqcD.value))
-                                       elif nimConfig.diseqcMode.value == "positioner":
-                                               text = _("Positioner") + ":"
-                                               if nimConfig.positionerMode.value == "usals":
-                                                       text += _("USALS")
-                                               elif nimConfig.positionerMode.value == "manual":
-                                                       text += _("manual")
-                                       else:   
-                                               text = _("simple")
-                               elif nimConfig.configMode.value == "advanced":
-                                       text = _("advanced")
-                       elif x.isCompatible("DVB-T") or x.isCompatible("DVB-C"):
-                               if nimConfig.configMode.value == "nothing":
-                                       text = _("nothing connected")
-                               elif nimConfig.configMode.value == "enabled":
-                                       text = _("enabled")
-                               
-                       self.list.append((slotid, x.friendly_full_description, text, x))
+                       if self.showNim(x):
+                               if x.isCompatible("DVB-S"):
+                                       if nimConfig.configMode.value in ["loopthrough", "equal", "satposdepends"]:
+                                               text = { "loopthrough": _("loopthrough to"),
+                                                                "equal": _("equal to"),
+                                                                "satposdepends": _("second cable of motorized LNB") } [nimConfig.configMode.value]
+                                               text += " " + _("Tuner") + " " + ["A", "B", "C", "D"][int(nimConfig.connectedTo.value)]
+                                       elif nimConfig.configMode.value == "nothing":
+                                               text = _("nothing connected")
+                                       elif nimConfig.configMode.value == "simple":
+                                               if nimConfig.diseqcMode.value in ["single", "toneburst_a_b", "diseqc_a_b", "diseqc_a_b_c_d"]:
+                                                       text = _("Sats") + ": " 
+                                                       if nimConfig.diseqcA.orbital_position != 3601:
+                                                               text += nimmanager.getSatName(int(nimConfig.diseqcA.value))
+                                                       if nimConfig.diseqcMode.value in ["toneburst_a_b", "diseqc_a_b", "diseqc_a_b_c_d"]:
+                                                               if nimConfig.diseqcB.orbital_position != 3601:
+                                                                       text += "," + nimmanager.getSatName(int(nimConfig.diseqcB.value))
+                                                       if nimConfig.diseqcMode.value == "diseqc_a_b_c_d":
+                                                               if nimConfig.diseqcC.orbital_position != 3601:
+                                                                       text += "," + nimmanager.getSatName(int(nimConfig.diseqcC.value))
+                                                               if nimConfig.diseqcD.orbital_position != 3601:
+                                                                       text += "," + nimmanager.getSatName(int(nimConfig.diseqcD.value))
+                                               elif nimConfig.diseqcMode.value == "positioner":
+                                                       text = _("Positioner") + ":"
+                                                       if nimConfig.positionerMode.value == "usals":
+                                                               text += _("USALS")
+                                                       elif nimConfig.positionerMode.value == "manual":
+                                                               text += _("manual")
+                                               else:   
+                                                       text = _("simple")
+                                       elif nimConfig.configMode.value == "advanced":
+                                               text = _("advanced")
+                               elif x.isCompatible("DVB-T") or x.isCompatible("DVB-C"):
+                                       if nimConfig.configMode.value == "nothing":
+                                               text = _("nothing connected")
+                                       elif nimConfig.configMode.value == "enabled":
+                                               text = _("enabled")
+                                       
+                               self.list.append((slotid, x.friendly_full_description, text, x))
+               self["nimlist"].setList(self.list)
                self["nimlist"].updateList(self.list)
\ No newline at end of file