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 7aebe25f3b2a5a1af08c758cf260eb8c52b1478b..719baa11a1e0de637cb3301c40cab0d4465c118d 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/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
 lib/python/Plugins/DemoPlugins/Makefile
 lib/python/Plugins/DemoPlugins/TestPlugin/Makefile
 lib/python/Plugins/Extensions/Makefile
index 4419158616832714ee287e40a6fcfea9ad92babc..6f30253afe17029a591df1d43d650137ec1b2eb1 100644 (file)
@@ -786,7 +786,7 @@ PyObject *eDVBDB::readSatellites(ePyObject sat_list, ePyObject sat_dict, ePyObje
                return Py_False;
        }
        int tmp, *dest = NULL,
                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;
        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
                                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());
                                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 == "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);
                                        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)
                                {
                                }
                                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));
                                        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, 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);
                                }
                                        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;
 {
        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))
        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;
        }
                if (b.name.empty() && m_db->getService(b, b_service))
                        return 1;
        }
-       
+
        switch (sortmode)
        {
        case eDVBChannelQuery::tName:
        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;
 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)
                return 0;
-       
+
        if (*begin == "(")
        {
                end_of_exp = begin;
        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;
                                break;
                        else
                                ++end_of_exp;
-       
+
                if (end_of_exp == end)
                {
                        eDebug("expression parse: end of expression while searching for closing brace");
                        return -1;
                }
                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;
                ++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;
                }
                        /* we had only one sub expression */
                if (end_of_exp == end)
                {
 //                     eDebug("only one sub expression");
                        return 0;
                }
-               
+
                        /* otherwise we have an operator here.. */
                        /* 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;
                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 == "&&")
                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;
                }
                        res = 0;
                        return 1;
                }
-               
+
                ++end_of_exp;
                ++end_of_exp;
-               
+
                return parseExpression(res->m_p2, end_of_exp, end);
        }
                return parseExpression(res->m_p2, end_of_exp, end);
        }
-       
+
        // "begin" <op> "end"
        std::string type, op, val;
        // "begin" <op> "end"
        std::string type, op, val;
-       
+
        res = new eDVBChannelQuery();
        res->m_sort = 0;
        res = new eDVBChannelQuery();
        res->m_sort = 0;
-       
+
        int cnt = 0;
        while (begin != end)
        {
        int cnt = 0;
        while (begin != end)
        {
@@ -1832,23 +1839,23 @@ RESULT parseExpression(ePtr<eDVBChannelQuery> &res, std::list<std::string>::cons
                ++begin;
                ++cnt;
        }
                ++begin;
                ++cnt;
        }
-       
+
        if (cnt != 3)
        {
                eDebug("malformed query: missing stuff");
                res = 0;
                return 1;
        }
        if (cnt != 3)
        {
                eDebug("malformed query: missing stuff");
                res = 0;
                return 1;
        }
-       
+
        res->m_type = decodeType(type);
        res->m_type = decodeType(type);
-       
+
        if (res->m_type == -1)
        {
                eDebug("malformed query: invalid type %s", type.c_str());
                res = 0;
                return 1;
        }
        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 == "!=")
        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 = 0;
                return 1;
        }
-       
+
        res->m_string = val;
 
        if (res->m_type == eDVBChannelQuery::tChannelID)
        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;
 RESULT eDVBChannelQuery::compile(ePtr<eDVBChannelQuery> &res, std::string query)
 {
        std::list<std::string> tokens;
-       
+
        std::string current_token;
        std::string bouquet_name;
 
        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 c = (i < query.size()) ? query[i] : ' ';
                ++i;
-               
+
                int issplit = !!strchr(splitchars, c);
                int isaln = isalnum(c);
                int iswhite = c == ' ';
                int isquot = c == '\"';
                int issplit = !!strchr(splitchars, c);
                int isaln = isalnum(c);
                int iswhite = c == ' ';
                int isquot = c == '\"';
-               
+
                if (quotemode)
                {
                        iswhite = issplit = 0;
                        isaln = lastalnum;
                }
                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 (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 (!(iswhite || isquot))
                        current_token += c;
-               
+
                if (isquot)
                        quotemode = !quotemode;
                lastsplit = issplit;
                lastalnum = isaln;
        }
                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());
 //     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;
        }
                res = 0;
                return -1;
        }
-       
+
 //     eDebug("sort by %d", sort);
 //     eDebug("sort by %d", sort);
-       
+
                /* now we recursivly parse that. */
        int r = parseExpression(res, tokens.begin(), tokens.end());
                /* now we recursivly parse that. */
        int r = parseExpression(res, tokens.begin(), tokens.end());
-       
+
                /* we have an empty (but valid!) expression */
        if (!r && !res)
        {
                /* 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;
        }
                res->m_inverse = 0;
                res->m_type = eDVBChannelQuery::tAny;
        }
-       
+
        if (res)
        {
                res->m_sort = sort;
        if (res)
        {
                res->m_sort = sort;
index 9c04701b4822ffdb707530331fe75049da5ff768..67cec18dd5e56ff9a8e541842db8df2146ef708b 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 \
        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 b96065b3d1bda98bcae8a25837640b35e22cc2cb..d57a617905dfe835ef4e401c2fa8345e23687e3b 100644 (file)
@@ -12,5 +12,12 @@ class Progress(Source):
        def setValue(self, value):
                self.__value = value
                self.changed((self.CHANGED_ALL,))
        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)
 
        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 36b4bde5af63bdaae5228bbe471c3f758e71bbef..4491eafc258cc9ec4a6e17e9422e2ea6842eb63f 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 d61c1503a393a9ac78f0186402be9d5c673dd835..72982483e5a67858f437a9797b7fd57a30e9a21b 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.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):
 
 class Satfinder(ScanSetup):
        def openFrontend(self):
index 5628926f78c10b06d194652f3b27ec281f71014e..320bea8444a671704b0850a5fe52d56c1a763908 100644 (file)
@@ -384,18 +384,26 @@ class NimSelection(Screen):
                self.list = [None] * nimmanager.getSlotCount()
                self["nimlist"] = List(self.list)
                self.updateList()
                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)
 
                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:
 
        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 = [ ]
 
        def updateList(self):
                self.list = [ ]
@@ -403,42 +411,44 @@ class NimSelection(Screen):
                        slotid = x.slot
                        nimConfig = nimmanager.getNimConfig(x.slot)
                        text = nimConfig.configMode.value
                        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
                self["nimlist"].updateList(self.list)
\ No newline at end of file