update unicable stuff (by adenin)
authorghost <andreas.monzner@multimedia-labs.de>
Tue, 8 Jun 2010 12:28:29 +0000 (14:28 +0200)
committerghost <andreas.monzner@multimedia-labs.de>
Tue, 8 Jun 2010 12:55:15 +0000 (14:55 +0200)
data/Makefile.am
data/unicable.xml [new file with mode: 0644]
lib/dvb/frontend.cpp
lib/dvb/frontend.h
lib/dvb/idvb.h
lib/dvb/sec.cpp
lib/dvb/sec.h
lib/python/Components/NimManager.py
lib/python/Components/config.py
lib/python/Screens/Satconfig.py

index 67f2ad2..fcc29a8 100644 (file)
@@ -14,4 +14,5 @@ dist_pkgdata_DATA = \
        skin_default.xml \
        skin.xml \
        startwizard.xml \
        skin_default.xml \
        skin.xml \
        startwizard.xml \
-       tutorialwizard.xml
+       tutorialwizard.xml \
+       unicable.xml
diff --git a/data/unicable.xml b/data/unicable.xml
new file mode 100644 (file)
index 0000000..33951d7
--- /dev/null
@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<unicable version="20100522">
+<!--
+structur of tree
+unicable (version)
+  |
+  |\
+  | \
+  | lnb
+  |  |
+  |  |\
+  |  | \
+  |  | manufacturer (name)
+  |  |  |\
+  |  |  | \
+  |  |  | product (name, position, sc11-scr8. lofl, lofh, loft)
+  |  |  |
+  |  |  |\
+  |  |  | \
+  |  |  | product
+  |  |  
+  |  |\
+  |  | \
+  |  | manufacturer
+  |  |  |\
+  |  |  | \
+  |  |  | product
+  |  |  |
+  |  |  |\
+  |  |  | \
+  |  |  | product
+  |
+   \
+    \
+    matrix
+     |
+     |\
+     | \
+     | manufacturer
+     |  |\
+     |  | \
+     |  | product
+     |  |
+     |  |\
+     |  | \
+     |  | product
+     |  
+     |\
+     | \
+     | manufacturer
+     |  |\
+     |  | \
+     |  | product
+     |  |
+     |  |\
+     |  | \
+     |  | product
+
+-->
+
+       <lnb>
+               <manufacturer name="DUR-line">
+                       <product name="Unicable LNB" scr1="1210" scr2="1420" scr3="1680" scr4="2040"/>
+               </manufacturer>
+               <manufacturer name="G-STAR">
+                       <product name="GS-404-L1" scr1="1280" scr2="1382" scr3="1484"/>
+                       <product name="GS-406-L1" scr1="1280" scr2="1382" scr3="1484" scr4="1586" scr5="1688" scr6="1790"/>
+               </manufacturer>
+               <manufacturer name="Humax">
+                       <product name="150 SCR" scr1="1210" scr2="1420" scr3="1680" scr4="2040"/>
+               </manufacturer>
+               <manufacturer name="Inverto">
+                       <product name="IDLP-40UNIQD+S" scr1="1680" scr2="1420" scr3="2040" scr4="1210"/>
+                       <product name="IDLB-QUDL-UNI2L-OPP" scr1="1210" scr2="1420" scr3="1680" scr4="2040"/>
+               </manufacturer>
+               <manufacturer name="Kathrein">
+                       <product name="UAS481"  lofl="10200" lofh="10200" scr1="1400" scr2="1516" scr3="1632" scr4="1748"/>
+               </manufacturer>
+               <manufacturer name="Kreiling">
+                       <product name="KR1440" scr1="1680" scr2="1420" scr3="2040" scr4="1210"/>
+               </manufacturer>
+               <manufacturer name="Radix">
+                       <product name="Unicable LNB" scr1="1680" scr2="1420" scr3="2040" scr4="1210"/>
+               </manufacturer>
+               <manufacturer name="Wisi">
+                       <product name="OC 05" scr1="1210" scr2="1420" scr3="1680" scr4="2040"/>
+               </manufacturer>
+       </lnb>
+       <matrix>
+               <manufacturer name="Ankaro">
+                       <product name="UCS 51440" scr1="1400" scr2="1632" scr3="1284" scr4="1516"/>
+                       <product name="UCS 51820" scr1="1400" scr2="1632" scr3="1284" scr4="1516" scr5="1864" scr6="2096" scr7="1748" scr8="1980"/>
+                       <product name="UCS 51840" scr1="1400" scr2="1632" scr3="1284" scr4="1516" scr5="1864" scr6="2096" scr7="1748" scr8="1980"/>
+                       <product name="UCS 52240" scr1="1400" scr2="1632"/>
+                       <product name="UCS 52420" scr1="1400" scr2="1632" scr3="1284" scr4="1516"/>
+                       <product name="UCS 52440" scr1="1400" scr2="1632" scr3="1284" scr4="1516"/>
+                       <product name="UCS 91440" positions="2" scr1="1400" scr2="1632" scr3="1284" scr4="1516"/>
+                       <product name="UCS 91820" positions="2" scr1="1400" scr2="1632" scr3="1284" scr4="1516" scr5="1864" scr6="2096" scr7="1748" scr8="1980"/>
+                       <product name="UCS 91840" positions="2" scr1="1400" scr2="1632" scr3="1284" scr4="1516" scr5="1864" scr6="2096" scr7="1748" scr8="1980"/>
+                       <product name="UCS 92240" positions="2" scr1="1400" scr2="1632"/>
+                       <product name="UCS 92420" positions="2" scr1="1400" scr2="1632" scr3="1284" scr4="1516"/>
+                       <product name="UCS 92440" positions="2" scr1="1400" scr2="1632" scr3="1284" scr4="1516"/>
+               </manufacturer>
+               <manufacturer name="DCT Delta">
+                       <product name="SUM518" scr1="1284" scr2="1400" scr3="1516" scr4="1632" scr5="1748" scr6="1864" scr7="1980" scr8="2096"/>
+                       <product name="SUM918" positions="2" scr1="1284" scr2="1400" scr3="1516" scr4="1632" scr5="1748" scr6="1864" scr7="1980" scr8="2096"/>
+                       <product name="SUM928" positions="2" scr1="1284" scr2="1400" scr3="1516" scr4="1632" scr5="1748" scr6="1864" scr7="1980" scr8="2096"/>
+               </manufacturer>
+               <manufacturer name="Dura-Sat">
+                       <product name="UCP18" scr1="1284" scr2="1400" scr3="1516" scr4="1632" scr5="1748" scr6="1864" scr7="1980" scr8="2096"/>
+                       <product name="VDU543NT" scr1="1280" scr2="1382" scr3="1484"/>
+                       <product name="VDU563NT" scr1="1280" scr2="1382" scr3="1484"/>
+                       <product name="VDU583NT" scr1="1280" scr2="1382" scr3="1484"/>
+                       <product name="VDU586NT" scr1="1280" scr2="1382" scr3="1484" scr4="1586" scr5="1688" scr6="1790"/>
+                       <product name="VDU983NT" positions="2" scr1="1280" scr2="1382" scr3="1484"/>
+               </manufacturer>
+               <manufacturer name="G-STAR">
+                       <product name="GS-506-S1" scr1="1280" scr2="1382" scr3="1484"/>
+                       <product name="GS-516-S1" scr1="1280" scr2="1382" scr3="1484" scr4="1586" scr5="1688" scr6="1790"/>
+               </manufacturer>
+               <manufacturer name="Inverto">
+                       <product name="IDLP-UST11O-CUO1O-8PP" scr1="1076" scr2="1178" scr3="1280" scr4="1382" scr5="1484" scr6="1586" scr7="1688" scr8="1790"/>
+               </manufacturer>
+               <manufacturer name="JULTEC">
+                       <product name="JPS0501-6" scr1="1280" scr2="1382" scr3="1484" scr4="1586" scr5="1688" scr6="1790"/>
+                       <product name="JPS0502-3" scr1="1280" scr2="1382" scr3="1484"/>
+                       <product name="JPS0502-6" scr1="1280" scr2="1382" scr3="1484" scr4="1586" scr5="1688" scr6="1790"/>
+                       <product name="JPS0504-3" scr1="1280" scr2="1382" scr3="1484"/>
+               </manufacturer>
+               <manufacturer name="Kathrein">
+                       <product name="EXR501" scr1="1400" scr2="1516" scr3="1632" scr4="1748"/>
+                       <product name="EXR551" scr1="1400" scr2="1516" scr3="1632" scr4="1748"/>
+                       <product name="EXR552" scr1="1400" scr2="1516"/>
+                       <product name="EXR1541" scr1="1284" scr2="1400" scr3="1516" scr4="1632"/>
+                       <product name="EXR1542" scr1="1284" scr2="1400" scr3="1516" scr4="1632"/>
+                       <product name="EXR1581" scr1="1284" scr2="1400" scr3="1516" scr4="1632" scr5="1748" scr6="1864" scr7="1980" scr8="2096"/>
+                       <product name="EXR1942" positions="2" scr1="1284" scr2="1400" scr3="1516" scr4="1632"/>
+                       <product name="EXR1981" positions="2" scr1="1284" scr2="1400" scr3="1516" scr4="1632" scr5="1748" scr6="1864" scr7="1980" scr8="2096"/>
+                       <product name="EXR2541" scr1="1284" scr2="1400" scr3="1516" scr4="1632"/>
+                       <product name="EXR2542" scr1="1284" scr2="1400" scr3="1516" scr4="1632"/>
+                       <product name="EXR2581" scr1="1284" scr2="1400" scr3="1516" scr4="1632" scr5="1748" scr6="1864" scr7="1980" scr8="2096"/>
+                       <product name="EXR2942" positions="2" scr1="1284" scr2="1400" scr3="1516" scr4="1632"/>
+                       <product name="EXR2981" positions="2" scr1="1284" scr2="1400" scr3="1516" scr4="1632" scr5="1748" scr6="1864" scr7="1980" scr8="2096"/>
+                       <product name="EXU908" positions="2" scr1="1284" scr2="1400" scr3="1516" scr4="1632"/>
+               </manufacturer>
+               <manufacturer name="ROTEK">
+                       <product name="EKL2/1" scr1="1400" scr2="1516"/>
+                       <product name="EKL2/1E" scr3="1632" scr4="1748"/>
+               </manufacturer>
+               <manufacturer name="Smart">
+                       <product name="DPA 51" scr1="1284" scr2="1400" scr3="1516" scr4="1632" scr5="1748" scr6="1864" scr7="1980" scr8="2096"/>
+               </manufacturer>
+               <manufacturer name="Technisat">
+                       <product name="TechniRouter 5/1x8" scr1="1284" scr2="1400" scr3="1516" scr4="1632" scr5="1748" scr6="1864" scr7="1980" scr8="2096"/>
+                       <product name="TechniRouter 9/1x8" positions="2" scr1="1284" scr2="1400" scr3="1516" scr4="1632" scr5="1748" scr6="1864" scr7="1980" scr8="2096"/>
+                       <product name="TechniRouter 5/2x4" scr1="1284" scr2="1400" scr3="1516" scr4="1632"/>
+                       <product name="TechniRouter 9/2x4" positions="2" scr1="1284" scr2="1400" scr3="1516" scr4="1632"/>
+               </manufacturer>
+               <manufacturer name="Telstar">
+                       <product name="SCR 5/1x8" scr1="1284" scr2="1400" scr3="1516" scr4="1632" scr5="1748" scr6="1864" scr7="1980" scr8="2096"/>
+                       <product name="SCR 9/1x8" positions="2" scr1="1284" scr2="1400" scr3="1516" scr4="1632" scr5="1748" scr6="1864" scr7="1980" scr8="2096"/>
+                       <product name="SCR 5/2x4" scr1="1284" scr2="1400" scr3="1516" scr4="1632"/>
+                       <product name="SCR 9/2x4" positions="2" scr1="1284" scr2="1400" scr3="1516" scr4="1632"/>
+               </manufacturer>
+               <manufacturer name="Wisi">
+                       <product name="DY 64 1810" scr1="1178" scr2="1280" scr3="1382" scr4="1484" scr5="1586" scr6="1688" scr7="1790" scr8="1892"/>
+                       <product name="DY 64 2410" scr1="1178" scr2="1280" scr3="1382" scr4="1484"/>
+                       <product name="DY 68 1810" positions="2" scr1="1178" scr2="1280" scr3="1382" scr4="1484" scr5="1586" scr6="1688" scr7="1790" scr8="1892"/>
+                       <product name="DY 68 2410" positions="2" scr1="1178" scr2="1280" scr3="1382" scr4="1484"/>
+               </manufacturer>
+       </matrix>
+</unicable>
index bc3a88d..bd8f002 100644 (file)
@@ -582,7 +582,7 @@ int eDVBFrontend::openFrontend()
        return 0;
 }
 
        return 0;
 }
 
-int eDVBFrontend::closeFrontend(bool force)
+int eDVBFrontend::closeFrontend(bool force, bool no_delayed)
 {
        if (!force && m_data[CUR_VOLTAGE] != -1 && m_data[CUR_VOLTAGE] != iDVBFrontend::voltageOff)
        {
 {
        if (!force && m_data[CUR_VOLTAGE] != -1 && m_data[CUR_VOLTAGE] != iDVBFrontend::voltageOff)
        {
@@ -605,11 +605,34 @@ int eDVBFrontend::closeFrontend(bool force)
                eDebugNoSimulate("close frontend %d", m_dvbid);
                if (m_data[SATCR] != -1)
                {
                eDebugNoSimulate("close frontend %d", m_dvbid);
                if (m_data[SATCR] != -1)
                {
-                       turnOffSatCR(m_data[SATCR]);
+                       if (!no_delayed)
+                       {
+                               m_sec->prepareTurnOffSatCR(*this, m_data[SATCR]);
+                               m_tuneTimer->start(0, true);
+                               if(!m_tuneTimer->isActive())
+                               {
+                                       int timeout=0;
+                                       eDebug("[turnOffSatCR] no mainloop");
+                                       while(true)
+                                       {
+                                               timeout = tuneLoopInt();
+                                               if (timeout == -1)
+                                                       break;
+                                               usleep(timeout*1000); // blockierendes wait.. eTimer gibts ja nicht mehr
+                                       }
+                               }
+                               else
+                                       eDebug("[turnOffSatCR] running mainloop");
+                               return 0;
+                       }
+                       else
+                               m_data[ROTOR_CMD] = -1;
                }
                }
+
                setTone(iDVBFrontend::toneOff);
                setVoltage(iDVBFrontend::voltageOff);
                m_tuneTimer->stop();
                setTone(iDVBFrontend::toneOff);
                setVoltage(iDVBFrontend::voltageOff);
                m_tuneTimer->stop();
+
                if (m_sec && !m_simulate)
                        m_sec->setRotorMoving(m_slotid, false);
                if (!::close(m_fd))
                if (m_sec && !m_simulate)
                        m_sec->setRotorMoving(m_slotid, false);
                if (!::close(m_fd))
@@ -1486,9 +1509,14 @@ bool eDVBFrontend::setSecSequencePos(int steps)
        return true;
 }
 
        return true;
 }
 
-void eDVBFrontend::tuneLoop()  // called by m_tuneTimer
+void eDVBFrontend::tuneLoop()
+{
+       tuneLoopInt();
+}
+
+int eDVBFrontend::tuneLoopInt()  // called by m_tuneTimer
 {
 {
-       int delay=0;
+       int delay=-1;
        eDVBFrontend *sec_fe = this;
        eDVBRegisteredFrontend *regFE = 0;
        long tmp = m_data[LINKED_PREV_PTR];
        eDVBFrontend *sec_fe = this;
        eDVBRegisteredFrontend *regFE = 0;
        long tmp = m_data[LINKED_PREV_PTR];
@@ -1518,6 +1546,7 @@ void eDVBFrontend::tuneLoop()  // called by m_tuneTimer
        {
                long *sec_fe_data = sec_fe->m_data;
 //             eDebugNoSimulate("tuneLoop %d\n", m_sec_sequence.current()->cmd);
        {
                long *sec_fe_data = sec_fe->m_data;
 //             eDebugNoSimulate("tuneLoop %d\n", m_sec_sequence.current()->cmd);
+               delay = 0;
                switch (m_sec_sequence.current()->cmd)
                {
                        case eSecCommand::SLEEP:
                switch (m_sec_sequence.current()->cmd)
                {
                        case eSecCommand::SLEEP:
@@ -1844,6 +1873,13 @@ void eDVBFrontend::tuneLoop()  // called by m_tuneTimer
                                ++m_sec_sequence.current();
                                break;
                        }
                                ++m_sec_sequence.current();
                                break;
                        }
+                       case eSecCommand::DELAYED_CLOSE_FRONTEND:
+                       {
+                               eDebugNoSimulate("[SEC] delayed close frontend");
+                               closeFrontend(false, true);
+                               ++m_sec_sequence.current();
+                               break;
+                       }
                        default:
                                eDebugNoSimulate("[SEC] unhandled sec command %d",
                                        ++m_sec_sequence.current()->cmd);
                        default:
                                eDebugNoSimulate("[SEC] unhandled sec command %d",
                                        ++m_sec_sequence.current()->cmd);
@@ -1856,6 +1892,7 @@ void eDVBFrontend::tuneLoop()  // called by m_tuneTimer
                regFE->dec_use();
        if (m_simulate && m_sec_sequence.current() != m_sec_sequence.end())
                tuneLoop();
                regFE->dec_use();
        if (m_simulate && m_sec_sequence.current() != m_sec_sequence.end())
                tuneLoop();
+       return delay;
 }
 
 void eDVBFrontend::setFrontend(bool recvEvents)
 }
 
 void eDVBFrontend::setFrontend(bool recvEvents)
@@ -2591,9 +2628,12 @@ RESULT eDVBFrontend::setSEC(iDVBSatelliteEquipmentControl *sec)
        return 0;
 }
 
        return 0;
 }
 
-RESULT eDVBFrontend::setSecSequence(const eSecCommandList &list)
+RESULT eDVBFrontend::setSecSequence(eSecCommandList &list)
 {
 {
-       m_sec_sequence = list;
+       if (m_data[SATCR] != -1 && m_sec_sequence.current() != m_sec_sequence.end())
+               m_sec_sequence.push_back(list);
+       else
+               m_sec_sequence = list;
        return 0;
 }
 
        return 0;
 }
 
@@ -2670,42 +2710,3 @@ arg_error:
                "eDVBFrontend::setSlotInfo must get a tuple with first param slotid, second param slot description and third param enabled boolean");
        return false;
 }
                "eDVBFrontend::setSlotInfo must get a tuple with first param slotid, second param slot description and third param enabled boolean");
        return false;
 }
-
-RESULT eDVBFrontend::turnOffSatCR(int satcr)
-{
-       eSecCommandList sec_sequence;
-       // check if voltage is disabled
-       eSecCommand::pair compare;
-       compare.steps = +9;     //nothing to do
-       compare.voltage = iDVBFrontend::voltageOff;
-       sec_sequence.push_back( eSecCommand(eSecCommand::IF_NOT_VOLTAGE_GOTO, compare) );
-       sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage13) );
-       sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50 ) );
-
-       sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage18_5) );
-       sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, iDVBFrontend::toneOff) );
-       sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 250) );
-
-       eDVBDiseqcCommand diseqc;
-       memset(diseqc.data, 0, MAX_DISEQC_LENGTH);
-       diseqc.len = 5;
-       diseqc.data[0] = 0xE0;
-       diseqc.data[1] = 0x10;
-       diseqc.data[2] = 0x5A;
-       diseqc.data[3] = satcr << 5;
-       diseqc.data[4] = 0x00;
-
-       sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) );
-       sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50+20+14*diseqc.len) );
-       sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage13) );
-       setSecSequence(sec_sequence);
-       return 0;
-}
-
-RESULT eDVBFrontend::ScanSatCR()
-{
-       setFrontend();
-       usleep(20000);
-       setTone(iDVBFrontend::toneOff);
-       return 0;
-}
index bc31755..bef4a18 100644 (file)
@@ -110,6 +110,7 @@ private:
        void feEvent(int);
        void timeout();
        void tuneLoop();  // called by m_tuneTimer
        void feEvent(int);
        void timeout();
        void tuneLoop();  // called by m_tuneTimer
+       int tuneLoopInt();
        void setFrontend(bool recvEvents=true);
        bool setSecSequencePos(int steps);
        static int PriorityOrder;
        void setFrontend(bool recvEvents=true);
        bool setSecSequencePos(int steps);
        static int PriorityOrder;
@@ -130,7 +131,7 @@ public:
        RESULT sendDiseqc(const eDVBDiseqcCommand &diseqc);
        RESULT sendToneburst(int burst);
        RESULT setSEC(iDVBSatelliteEquipmentControl *sec);
        RESULT sendDiseqc(const eDVBDiseqcCommand &diseqc);
        RESULT sendToneburst(int burst);
        RESULT setSEC(iDVBSatelliteEquipmentControl *sec);
-       RESULT setSecSequence(const eSecCommandList &list);
+       RESULT setSecSequence(eSecCommandList &list);
        RESULT getData(int num, long &data);
        RESULT setData(int num, long val);
 
        RESULT getData(int num, long &data);
        RESULT setData(int num, long val);
 
@@ -148,12 +149,9 @@ public:
 
        void reopenFrontend();
        int openFrontend();
 
        void reopenFrontend();
        int openFrontend();
-       int closeFrontend(bool force=false);
+       int closeFrontend(bool force=false, bool no_delayed=false);
        const char *getDescription() const { return m_description; }
        bool is_simulate() const { return m_simulate; }
        const char *getDescription() const { return m_description; }
        bool is_simulate() const { return m_simulate; }
-
-       RESULT turnOffSatCR(int satcr);
-       RESULT ScanSatCR();
 };
 
 #endif // SWIG
 };
 
 #endif // SWIG
index 996d790..f1217a6 100644 (file)
@@ -459,7 +459,7 @@ class iDVBFrontend: public iDVBFrontend_ENUMS, public iObject
 public:
        virtual RESULT getFrontendType(int &SWIG_OUTPUT)=0;
        virtual RESULT tune(const iDVBFrontendParameters &where)=0;
 public:
        virtual RESULT getFrontendType(int &SWIG_OUTPUT)=0;
        virtual RESULT tune(const iDVBFrontendParameters &where)=0;
-       virtual int closeFrontend(bool force = false)=0;
+       virtual int closeFrontend(bool force = false, bool no_delayed = false)=0;
        virtual void reopenFrontend()=0;
 #ifndef SWIG
        virtual RESULT connectStateChange(const Slot1<void,iDVBFrontend*> &stateChange, ePtr<eConnection> &connection)=0;
        virtual void reopenFrontend()=0;
 #ifndef SWIG
        virtual RESULT connectStateChange(const Slot1<void,iDVBFrontend*> &stateChange, ePtr<eConnection> &connection)=0;
@@ -471,7 +471,7 @@ public:
        virtual RESULT sendToneburst(int burst)=0;
 #ifndef SWIG
        virtual RESULT setSEC(iDVBSatelliteEquipmentControl *sec)=0;
        virtual RESULT sendToneburst(int burst)=0;
 #ifndef SWIG
        virtual RESULT setSEC(iDVBSatelliteEquipmentControl *sec)=0;
-       virtual RESULT setSecSequence(const eSecCommandList &list)=0;
+       virtual RESULT setSecSequence(eSecCommandList &list)=0;
 #endif
        virtual int readFrontendData(int type)=0;
        virtual void getFrontendStatus(SWIG_PYOBJECT(ePyObject) dest)=0;
 #endif
        virtual int readFrontendData(int type)=0;
        virtual void getFrontendStatus(SWIG_PYOBJECT(ePyObject) dest)=0;
@@ -491,6 +491,7 @@ class iDVBSatelliteEquipmentControl: public iObject
 {
 public:
        virtual RESULT prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, const eDVBFrontendParametersSatellite &sat, int frontend_id, unsigned int timeout)=0;
 {
 public:
        virtual RESULT prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, const eDVBFrontendParametersSatellite &sat, int frontend_id, unsigned int timeout)=0;
+       virtual void prepareTurnOffSatCR(iDVBFrontend &frontend, int satcr)=0;
        virtual int canTune(const eDVBFrontendParametersSatellite &feparm, iDVBFrontend *fe, int frontend_id, int *highest_score_lnb=0)=0;
        virtual void setRotorMoving(int slotid, bool)=0;
 };
        virtual int canTune(const eDVBFrontendParametersSatellite &feparm, iDVBFrontend *fe, int frontend_id, int *highest_score_lnb=0)=0;
        virtual void setRotorMoving(int slotid, bool)=0;
 };
index 0e3e7e0..58fc5e3 100644 (file)
@@ -108,6 +108,9 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite
        {
                bool rotor=false;
                eDVBSatelliteLNBParameters &lnb_param = m_lnbs[idx];
        {
                bool rotor=false;
                eDVBSatelliteLNBParameters &lnb_param = m_lnbs[idx];
+               bool is_unicable = lnb_param.SatCR_idx != -1;
+               bool is_unicable_position_switch = lnb_param.SatCR_positions > 1;
+
                if ( lnb_param.m_slot_mask & slot_id ) // lnb for correct tuner?
                {
                        int ret = 0;
                if ( lnb_param.m_slot_mask & slot_id ) // lnb for correct tuner?
                {
                        int ret = 0;
@@ -163,7 +166,7 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite
 
                                eSecDebugNoSimulate("ret1 %d", ret);
 
 
                                eSecDebugNoSimulate("ret1 %d", ret);
 
-                               if (linked_in_use)
+                               if (linked_in_use && !is_unicable)
                                {
                                        // compare tuner data
                                        if ( (csw != linked_csw) ||
                                {
                                        // compare tuner data
                                        if ( (csw != linked_csw) ||
@@ -176,7 +179,7 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite
                                                ret += 15;
                                        eSecDebugNoSimulate("ret2 %d", ret);
                                }
                                                ret += 15;
                                        eSecDebugNoSimulate("ret2 %d", ret);
                                }
-                               else if (satpos_depends_ptr != -1)
+                               else if ((satpos_depends_ptr != -1) && !(is_unicable && is_unicable_position_switch))
                                {
                                        eSecDebugNoSimulate("satpos depends");
                                        eDVBRegisteredFrontend *satpos_depends_to_fe = (eDVBRegisteredFrontend*) satpos_depends_ptr;
                                {
                                        eSecDebugNoSimulate("satpos depends");
                                        eDVBRegisteredFrontend *satpos_depends_to_fe = (eDVBRegisteredFrontend*) satpos_depends_ptr;
@@ -209,7 +212,7 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite
 
                                eSecDebugNoSimulate("ret5 %d", ret);
 
 
                                eSecDebugNoSimulate("ret5 %d", ret);
 
-                               if (ret)
+                               if (ret && lnb_param.SatCR_idx != -1)
                                {
                                        int lof = sat.frequency > lnb_param.m_lof_threshold ?
                                                lnb_param.m_lof_hi : lnb_param.m_lof_lo;
                                {
                                        int lof = sat.frequency > lnb_param.m_lof_threshold ?
                                                lnb_param.m_lof_hi : lnb_param.m_lof_lo;
@@ -375,8 +378,8 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                        {
                        // calc Frequency
                                local = abs(sat.frequency 
                        {
                        // calc Frequency
                                local = abs(sat.frequency 
-                                       - ((lof - (lof % 1000)) + ((lof % 1000)>500 ? 1000 : 0)) ); //TODO für den Mist mal ein Macro schreiben
-                               parm.FREQUENCY = (local - (local % 125)) + ((local % 125)>62 ? 125 : 0);
+                                       - lof);
+                               parm.FREQUENCY = ((((local * 2) / 125) + 1) / 2) * 125;
                                frontend.setData(eDVBFrontend::FREQ_OFFSET, sat.frequency - parm.FREQUENCY);
 
                                if ( voltage_mode == eDVBSatelliteSwitchParameters::_14V
                                frontend.setData(eDVBFrontend::FREQ_OFFSET, sat.frequency - parm.FREQUENCY);
 
                                if ( voltage_mode == eDVBSatelliteSwitchParameters::_14V
@@ -396,20 +399,21 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                        }
                        else
                        {
                        }
                        else
                        {
-                               unsigned int tmp = abs(sat.frequency 
-                                               - ((lof - (lof % 1000)) + ((lof % 1000)>500 ? 1000 : 0)) )
+                               int tmp1 = abs(sat.frequency 
+                                               -lof)
                                                + lnb_param.SatCRvco
                                                - 1400000
                                                + lnb_param.guard_offset;
                                                + lnb_param.SatCRvco
                                                - 1400000
                                                + lnb_param.guard_offset;
-                               parm.FREQUENCY = (lnb_param.SatCRvco - (tmp % 4000))+((tmp%4000)>2000?4000:0)+lnb_param.guard_offset;
-                               lnb_param.UnicableTuningWord = (((tmp / 4000)+((tmp%4000)>2000?1:0)) 
+                               int tmp2 = ((((tmp1 * 2) / 4000) + 1) / 2) * 4000;
+                               parm.FREQUENCY = lnb_param.SatCRvco - (tmp1-tmp2) + lnb_param.guard_offset;
+                               lnb_param.UnicableTuningWord = ((tmp2 / 4000) 
                                                | ((band & 1) ? 0x400 : 0)                      //HighLow
                                                | ((band & 2) ? 0x800 : 0)                      //VertHor
                                                | ((lnb_param.LNBNum & 1) ? 0 : 0x1000)                 //Umschaltung LNB1 LNB2
                                                | (lnb_param.SatCR_idx << 13));         //Adresse des SatCR
                                                eDebug("[prepare] UnicableTuningWord %#04x",lnb_param.UnicableTuningWord);
                                                eDebug("[prepare] guard_offset %d",lnb_param.guard_offset);
                                                | ((band & 1) ? 0x400 : 0)                      //HighLow
                                                | ((band & 2) ? 0x800 : 0)                      //VertHor
                                                | ((lnb_param.LNBNum & 1) ? 0 : 0x1000)                 //Umschaltung LNB1 LNB2
                                                | (lnb_param.SatCR_idx << 13));         //Adresse des SatCR
                                                eDebug("[prepare] UnicableTuningWord %#04x",lnb_param.UnicableTuningWord);
                                                eDebug("[prepare] guard_offset %d",lnb_param.guard_offset);
-                               frontend.setData(eDVBFrontend::FREQ_OFFSET, sat.frequency - ((lnb_param.UnicableTuningWord & 0x3FF) *4000 + 1400000 - lnb_param.SatCRvco + lof));
+                               frontend.setData(eDVBFrontend::FREQ_OFFSET, (lnb_param.UnicableTuningWord & 0x3FF) *4000 + 1400000 + lof - (2 * (lnb_param.SatCRvco - (tmp1-tmp2))) );
                        }
 
                        if (diseqc_mode >= eDVBSatelliteDiseqcParameters::V1_0)
                        }
 
                        if (diseqc_mode >= eDVBSatelliteDiseqcParameters::V1_0)
@@ -743,10 +747,10 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                                                        diseqc.data[3] = RotorCmd;
                                                        diseqc.data[4] = 0x00;
                                                }
                                                        diseqc.data[3] = RotorCmd;
                                                        diseqc.data[4] = 0x00;
                                                }
-                                               if(lnb_param.SatCR_idx == -1)
+//                                             if(lnb_param.SatCR_idx == -1)
                                                {
                                                        int mrt = m_params[MOTOR_RUNNING_TIMEOUT]; // in seconds!
                                                {
                                                        int mrt = m_params[MOTOR_RUNNING_TIMEOUT]; // in seconds!
-                                                       if ( rotor_param.m_inputpower_parameters.m_use )
+                                                       if ( rotor_param.m_inputpower_parameters.m_use || lnb_param.SatCR_idx == -1)
                                                        { // use measure rotor input power to detect rotor state
                                                                bool turn_fast = need_turn_fast(rotor_param.m_inputpower_parameters.m_turning_speed);
                                                                eSecCommand::rotor cmd;
                                                        { // use measure rotor input power to detect rotor state
                                                                bool turn_fast = need_turn_fast(rotor_param.m_inputpower_parameters.m_turning_speed);
                                                                eSecCommand::rotor cmd;
@@ -950,6 +954,40 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
        return -1;
 }
 
        return -1;
 }
 
+void eDVBSatelliteEquipmentControl::prepareTurnOffSatCR(iDVBFrontend &frontend, int satcr)
+{
+       eSecCommandList sec_sequence;
+
+       // check if voltage is disabled
+       eSecCommand::pair compare;
+       compare.steps = +9;     //only close frontend
+       compare.voltage = iDVBFrontend::voltageOff;
+
+       sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) );
+       sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage13) );
+       sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_ENABLE_VOLTAGE_BEFORE_SWITCH_CMDS]) );
+
+       sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage18_5) );
+       sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, iDVBFrontend::toneOff) );
+       sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_SWITCH_CMDS]) );
+
+       eDVBDiseqcCommand diseqc;
+       memset(diseqc.data, 0, MAX_DISEQC_LENGTH);
+       diseqc.len = 5;
+       diseqc.data[0] = 0xE0;
+       diseqc.data[1] = 0x10;
+       diseqc.data[2] = 0x5A;
+       diseqc.data[3] = satcr << 5;
+       diseqc.data[4] = 0x00;
+
+       sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) );
+       sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_LAST_DISEQC_CMD]) );
+       sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage13) );
+       sec_sequence.push_back( eSecCommand(eSecCommand::DELAYED_CLOSE_FRONTEND) );
+
+       frontend.setSecSequence(sec_sequence);
+}
+
 RESULT eDVBSatelliteEquipmentControl::clear()
 {
        eSecDebug("eDVBSatelliteEquipmentControl::clear()");
 RESULT eDVBSatelliteEquipmentControl::clear()
 {
        eSecDebug("eDVBSatelliteEquipmentControl::clear()");
@@ -1254,6 +1292,26 @@ RESULT eDVBSatelliteEquipmentControl::setLNBSatCRvco(int SatCRvco)
                return -ENOENT;
        return 0;
 }
                return -ENOENT;
        return 0;
 }
+
+RESULT eDVBSatelliteEquipmentControl::setLNBSatCRpositions(int SatCR_positions)
+{
+       eSecDebug("eDVBSatelliteEquipmentControl::setLNBSatCRpositions(%d)", SatCR_positions);
+       if(SatCR_positions < 1 || SatCR_positions > 2)
+               return -EPERM;
+       if ( currentLNBValid() )
+               m_lnbs[m_lnbidx].SatCR_positions = SatCR_positions;
+       else
+               return -ENOENT;
+       return 0;
+}
+
+RESULT eDVBSatelliteEquipmentControl::getLNBSatCRpositions()
+{
+       if ( currentLNBValid() )
+               return m_lnbs[m_lnbidx].SatCR_positions;
+       return -ENOENT;
+}
+
 RESULT eDVBSatelliteEquipmentControl::getLNBSatCR()
 {
        if ( currentLNBValid() )
 RESULT eDVBSatelliteEquipmentControl::getLNBSatCR()
 {
        if ( currentLNBValid() )
index c50aee4..b38671d 100644 (file)
@@ -25,7 +25,8 @@ public:
                IF_TONE_GOTO, IF_NOT_TONE_GOTO,
                START_TUNE_TIMEOUT,
                SET_ROTOR_MOVING,
                IF_TONE_GOTO, IF_NOT_TONE_GOTO,
                START_TUNE_TIMEOUT,
                SET_ROTOR_MOVING,
-               SET_ROTOR_STOPPED
+               SET_ROTOR_STOPPED,
+               DELAYED_CLOSE_FRONTEND
        };
        int cmd;
        struct rotor
        };
        int cmd;
        struct rotor
@@ -103,6 +104,11 @@ public:
        {
                secSequence.push_back(cmd);
        }
        {
                secSequence.push_back(cmd);
        }
+       void push_back(eSecCommandList &list)
+       {
+               ASSERT(*this != list);
+               secSequence.splice(end(), list.secSequence);
+       }
        void clear()
        {
                secSequence.clear();
        void clear()
        {
                secSequence.clear();
@@ -252,6 +258,7 @@ public:
 #define MAX_SATCR 8
 #define MAX_LNBNUM 32
 
 #define MAX_SATCR 8
 #define MAX_LNBNUM 32
 
+       int SatCR_positions;
        int SatCR_idx;
        unsigned int SatCRvco;
        unsigned int UnicableTuningWord;
        int SatCR_idx;
        unsigned int SatCRvco;
        unsigned int UnicableTuningWord;
@@ -311,6 +318,7 @@ public:
 #ifndef SWIG
        eDVBSatelliteEquipmentControl(eSmartPtrList<eDVBRegisteredFrontend> &avail_frontends, eSmartPtrList<eDVBRegisteredFrontend> &avail_simulate_frontends);
        RESULT prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, const eDVBFrontendParametersSatellite &sat, int frontend_id, unsigned int tunetimeout);
 #ifndef SWIG
        eDVBSatelliteEquipmentControl(eSmartPtrList<eDVBRegisteredFrontend> &avail_frontends, eSmartPtrList<eDVBRegisteredFrontend> &avail_simulate_frontends);
        RESULT prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, const eDVBFrontendParametersSatellite &sat, int frontend_id, unsigned int tunetimeout);
+       void prepareTurnOffSatCR(iDVBFrontend &frontend, int satcr); // used for unicable
        int canTune(const eDVBFrontendParametersSatellite &feparm, iDVBFrontend *, int frontend_id, int *highest_score_lnb=0);
        bool currentLNBValid() { return m_lnbidx > -1 && m_lnbidx < (int)(sizeof(m_lnbs) / sizeof(eDVBSatelliteLNBParameters)); }
 #endif
        int canTune(const eDVBFrontendParametersSatellite &feparm, iDVBFrontend *, int frontend_id, int *highest_score_lnb=0);
        bool currentLNBValid() { return m_lnbidx > -1 && m_lnbidx < (int)(sizeof(m_lnbs) / sizeof(eDVBSatelliteLNBParameters)); }
 #endif
@@ -346,9 +354,10 @@ public:
 /* Unicable Specific Parameters */
        RESULT setLNBSatCR(int SatCR_idx);
        RESULT setLNBSatCRvco(int SatCRvco);
 /* Unicable Specific Parameters */
        RESULT setLNBSatCR(int SatCR_idx);
        RESULT setLNBSatCRvco(int SatCRvco);
-//     RESULT checkGuardOffset(const eDVBFrontendParametersSatellite &sat);
+       RESULT setLNBSatCRpositions(int SatCR_positions);
        RESULT getLNBSatCR();
        RESULT getLNBSatCRvco();
        RESULT getLNBSatCR();
        RESULT getLNBSatCRvco();
+       RESULT getLNBSatCRpositions();
 /* Satellite Specific Parameters */
        RESULT addSatellite(int orbital_position);
        RESULT setVoltageMode(int mode);
 /* Satellite Specific Parameters */
        RESULT addSatellite(int orbital_position);
        RESULT setVoltageMode(int mode);
index c68e940..663ec16 100644 (file)
@@ -16,6 +16,9 @@ from time import localtime, mktime
 from datetime import datetime
 from Tools.BoundFunction import boundFunction
 
 from datetime import datetime
 from Tools.BoundFunction import boundFunction
 
+from Tools import Directories
+import xml.etree.cElementTree
+
 def getConfigSatlist(orbpos, satlist):
        default_orbpos = None
        for x in satlist:
 def getConfigSatlist(orbpos, satlist):
        default_orbpos = None
        for x in satlist:
@@ -234,6 +237,20 @@ class SecConfigure:
                print "sec config completed"
 
        def updateAdvanced(self, sec, slotid):
                print "sec config completed"
 
        def updateAdvanced(self, sec, slotid):
+               try:
+                       if config.Nims[slotid].advanced.unicableconnected is not None:
+                               if config.Nims[slotid].advanced.unicableconnected.value == True:
+                                       config.Nims[slotid].advanced.unicableconnectedTo.save_forced = True
+                                       self.linkNIMs(sec, slotid, int(config.Nims[slotid].advanced.unicableconnectedTo.value))
+                                       connto = self.getRoot(slotid, int(config.Nims[slotid].advanced.unicableconnectedTo.value))
+                                       if not self.linked.has_key(connto):
+                                               self.linked[connto] = []
+                                       self.linked[connto].append(slotid)
+                               else:
+                                       config.Nims[slotid].advanced.unicableconnectedTo.save_forced = False
+               except:
+                       pass
+
                lnbSat = {}
                for x in range(1,37):
                        lnbSat[x] = []
                lnbSat = {}
                for x in range(1,37):
                        lnbSat[x] = []
@@ -276,24 +293,40 @@ class SecConfigure:
                                        sec.setLNBLOFH(10600000)
                                        sec.setLNBThreshold(11700000)
                                elif currLnb.lof.value == "unicable":
                                        sec.setLNBLOFH(10600000)
                                        sec.setLNBThreshold(11700000)
                                elif currLnb.lof.value == "unicable":
-                                       sec.setLNBLOFL(9750000)
-                                       sec.setLNBLOFH(10600000)
-                                       sec.setLNBThreshold(11700000)
                                        if currLnb.unicable.value == "unicable_user":
                                        if currLnb.unicable.value == "unicable_user":
+#TODO satpositions for satcruser
+                                               sec.setLNBLOFL(currLnb.lofl.value * 1000)
+                                               sec.setLNBLOFH(currLnb.lofh.value * 1000)
+                                               sec.setLNBThreshold(currLnb.threshold.value * 1000)
                                                sec.setLNBSatCR(currLnb.satcruser.index)
                                                sec.setLNBSatCRvco(currLnb.satcrvcouser[currLnb.satcruser.index].value*1000)
                                                sec.setLNBSatCR(currLnb.satcruser.index)
                                                sec.setLNBSatCRvco(currLnb.satcrvcouser[currLnb.satcruser.index].value*1000)
+                                               sec.setLNBSatCRpositions(1)     #HACK
                                        elif currLnb.unicable.value == "unicable_matrix":
                                                manufacturer_name = currLnb.unicableMatrixManufacturer.value
                                                manufacturer = currLnb.unicableMatrix[manufacturer_name]
                                                product_name = manufacturer.product.value
                                                sec.setLNBSatCR(manufacturer.scr[product_name].index)
                                                sec.setLNBSatCRvco(manufacturer.vco[product_name][manufacturer.scr[product_name].index].value*1000)
                                        elif currLnb.unicable.value == "unicable_matrix":
                                                manufacturer_name = currLnb.unicableMatrixManufacturer.value
                                                manufacturer = currLnb.unicableMatrix[manufacturer_name]
                                                product_name = manufacturer.product.value
                                                sec.setLNBSatCR(manufacturer.scr[product_name].index)
                                                sec.setLNBSatCRvco(manufacturer.vco[product_name][manufacturer.scr[product_name].index].value*1000)
+                                               sec.setLNBSatCRpositions(manufacturer.positions[product_name][0].value)
+                                               sec.setLNBLOFL(manufacturer.lofl[product_name][0].value * 1000)
+                                               sec.setLNBLOFH(manufacturer.lofh[product_name][0].value * 1000)
+                                               sec.setLNBThreshold(manufacturer.loft[product_name][0].value * 1000)
+                                               currLnb.unicableMatrixManufacturer.save_forced = True
+                                               manufacturer.product.save_forced = True
+                                               manufacturer.vco[product_name][manufacturer.scr[product_name].index].save_forced = True
                                        elif currLnb.unicable.value == "unicable_lnb":
                                                manufacturer_name = currLnb.unicableLnbManufacturer.value
                                                manufacturer = currLnb.unicableLnb[manufacturer_name]
                                                product_name = manufacturer.product.value
                                                sec.setLNBSatCR(manufacturer.scr[product_name].index)
                                                sec.setLNBSatCRvco(manufacturer.vco[product_name][manufacturer.scr[product_name].index].value*1000)
                                        elif currLnb.unicable.value == "unicable_lnb":
                                                manufacturer_name = currLnb.unicableLnbManufacturer.value
                                                manufacturer = currLnb.unicableLnb[manufacturer_name]
                                                product_name = manufacturer.product.value
                                                sec.setLNBSatCR(manufacturer.scr[product_name].index)
                                                sec.setLNBSatCRvco(manufacturer.vco[product_name][manufacturer.scr[product_name].index].value*1000)
+                                               sec.setLNBSatCRpositions(manufacturer.positions[product_name][0].value)
+                                               sec.setLNBLOFL(manufacturer.lofl[product_name][0].value * 1000)
+                                               sec.setLNBLOFH(manufacturer.lofh[product_name][0].value * 1000)
+                                               sec.setLNBThreshold(manufacturer.loft[product_name][0].value * 1000)
+                                               currLnb.unicableLnbManufacturer.save_forced = True
+                                               manufacturer.product.save_forced = True
+                                               manufacturer.vco[product_name][manufacturer.scr[product_name].index].save_forced = True
                                elif currLnb.lof.value == "c_band":
                                        sec.setLNBLOFL(5150000)
                                        sec.setLNBLOFH(5150000)
                                elif currLnb.lof.value == "c_band":
                                        sec.setLNBLOFL(5150000)
                                        sec.setLNBLOFH(5150000)
@@ -988,55 +1021,57 @@ def InitNimManager(nimmgr):
 
        lnb_choices_default = "universal_lnb"
 
 
        lnb_choices_default = "universal_lnb"
 
-       unicablelnbproducts = {
-               "Humax": {"150 SCR":("1210","1420","1680","2040")},
-               "Inverto": {"IDLP-40UNIQD+S":("1680","1420","2040","1210")},
-               "Kathrein": {"UAS481":("1400","1516","1632","1748")},
-               "Kreiling": {"KR1440":("1680","1420","2040","1210")},
-               "Radix": {"Unicable LNB":("1680","1420","2040","1210")},
-               "Wisi": {"OC 05":("1210","1420","1680","2040")}}
+       unicablelnbproducts = {}
+       unicablematrixproducts = {}
+       doc = xml.etree.cElementTree.parse("/usr/share/enigma2/unicable.xml")
+       root = doc.getroot()
+
+       entry = root.find("lnb")
+       for manufacturer in entry.getchildren():
+               m={}
+               for product in manufacturer.getchildren():
+                       scr=[]
+                       lscr=("scr1","scr2","scr3","scr4","scr5","scr6","scr7","scr8")
+                       for i in range(len(lscr)):
+                               scr.append(product.get(lscr[i],"0"))
+                       for i in range(len(lscr)):
+                               if scr[len(lscr)-i-1] == "0":
+                                       scr.pop()
+                               else:
+                                       break;
+                       lof=[]
+                       lof.append(product.get("positions","1"))
+                       lof.append(product.get("lofl","9750"))
+                       lof.append(product.get("lofh","10600"))
+                       lof.append(product.get("threshold","11700"))
+                       scr.append(tuple(lof))
+                       m.update({product.get("name"):tuple(scr)})
+               unicablelnbproducts.update({manufacturer.get("name"):m})
+
+       entry = root.find("matrix")
+       for manufacturer in entry.getchildren():
+               m={}
+               for product in manufacturer.getchildren():
+                       scr=[]
+                       lscr=("scr1","scr2","scr3","scr4","scr5","scr6","scr7","scr8")
+                       for i in range(len(lscr)):
+                               scr.append(product.get(lscr[i],"0"))
+                       for i in range(len(lscr)):
+                               if scr[len(lscr)-i-1] == "0":
+                                       scr.pop()
+                               else:
+                                       break;
+                       lof=[]
+                       lof.append(product.get("positions","1"))
+                       lof.append(product.get("lofl","9750"))
+                       lof.append(product.get("lofh","10600"))
+                       lof.append(product.get("threshold","11700"))
+                       scr.append(tuple(lof))
+                       m.update({product.get("name"):tuple(scr)})
+               unicablematrixproducts.update({manufacturer.get("name"):m})
+
        UnicableLnbManufacturers = unicablelnbproducts.keys()
        UnicableLnbManufacturers.sort()
        UnicableLnbManufacturers = unicablelnbproducts.keys()
        UnicableLnbManufacturers.sort()
-
-       unicablematrixproducts = {
-               "Ankaro": {
-                       "UCS 51440":("1400","1632","1284","1516"),
-                       "UCS 51820":("1400","1632","1284","1516","1864","2096","1748","1980"),
-                       "UCS 51840":("1400","1632","1284","1516","1864","2096","1748","1980"),
-                       "UCS 52240":("1400","1632"),
-                       "UCS 52420":("1400","1632","1284","1516"),
-                       "UCS 52440":("1400","1632","1284","1516"),
-                       "UCS 91440":("1400","1632","1284","1516"),
-                       "UCS 91820":("1400","1632","1284","1516","1864","2096","1748","1980"),
-                       "UCS 91840":("1400","1632","1284","1516","1864","2096","1748","1980"),
-                       "UCS 92240":("1400","1632"),
-                       "UCS 92420":("1400","1632","1284","1516"),
-                       "UCS 92440":("1400","1632","1284","1516")},
-               "DCT Delta": {
-                       "SUM518":("1284","1400","1516","1632","1748","1864","1980","2096"),
-                       "SUM918":("1284","1400","1516","1632","1748","1864","1980","2096"),
-                       "SUM928":("1284","1400","1516","1632","1748","1864","1980","2096")},
-               "Inverto": {
-                       "IDLP-UST11O-CUO1O-8PP":("1076","1178","1280","1382","1484","1586","1688","1790")},
-               "Kathrein": {
-                       "EXR501":("1400","1516","1632","1748"),
-                       "EXR551":("1400","1516","1632","1748"),
-                       "EXR552":("1400","1516")},
-               "ROTEK": {
-                       "EKL2/1":("1400","1516"),
-                       "EKL2/1E":("0","0","1632","1748")},
-               "Smart": {
-                       "DPA 51":("1284","1400","1516","1632","1748","1864","1980","2096")},
-               "Technisat": {
-                       "TechniRouter 5/1x8 G":("1284","1400","1516","1632","1748","1864","1980","2096"),
-                       "TechniRouter 5/1x8 K":("1284","1400","1516","1632","1748","1864","1980","2096"),
-                       "TechniRouter 5/2x4 G":("1284","1400","1516","1632"),
-                       "TechniRouter 5/2x4 K":("1284","1400","1516","1632")},
-               "Telstar": {
-                       "SCR 5/1x8 G":("1284","1400","1516","1632","1748","1864","1980","2096"),
-                       "SCR 5/1x8 K":("1284","1400","1516","1632","1748","1864","1980","2096"),
-                       "SCR 5/2x4 G":("1284","1400","1516","1632"),
-                       "SCR 5/2x4 K":("1284","1400","1516","1632")}}
        UnicableMatrixManufacturers = unicablematrixproducts.keys()
        UnicableMatrixManufacturers.sort()
 
        UnicableMatrixManufacturers = unicablematrixproducts.keys()
        UnicableMatrixManufacturers.sort()
 
@@ -1117,7 +1152,7 @@ def InitNimManager(nimmgr):
                                                        scrlist = []
                                                        vcolist = unicablematrixproducts[y][z]
                                                        tmp.vco[z] = ConfigSubList()
                                                        scrlist = []
                                                        vcolist = unicablematrixproducts[y][z]
                                                        tmp.vco[z] = ConfigSubList()
-                                                       for cnt in range(1,1+len(vcolist)):
+                                                       for cnt in range(1,1+len(vcolist)-1):
                                                                vcofreq = int(vcolist[cnt-1])
                                                                if vcofreq == 0:
                                                                        scrlist.append(("%d" %cnt,"SCR %d " %cnt +_("not used")))
                                                                vcofreq = int(vcolist[cnt-1])
                                                                if vcofreq == 0:
                                                                        scrlist.append(("%d" %cnt,"SCR %d " %cnt +_("not used")))
@@ -1137,29 +1172,54 @@ def InitNimManager(nimmgr):
                                                tmp.product = ConfigSelection(choices = products, default = products[0])
                                                tmp.scr = ConfigSubDict()
                                                tmp.vco = ConfigSubDict()
                                                tmp.product = ConfigSelection(choices = products, default = products[0])
                                                tmp.scr = ConfigSubDict()
                                                tmp.vco = ConfigSubDict()
+                                               tmp.lofl = ConfigSubDict()
+                                               tmp.lofh = ConfigSubDict()
+                                               tmp.loft = ConfigSubDict()
+                                               tmp.positions = ConfigSubDict()
                                                for z in products:
                                                        scrlist = []
                                                        vcolist = unicablelnbproducts[y][z]
                                                        tmp.vco[z] = ConfigSubList()
                                                for z in products:
                                                        scrlist = []
                                                        vcolist = unicablelnbproducts[y][z]
                                                        tmp.vco[z] = ConfigSubList()
-                                                       for cnt in range(1,1+len(vcolist)):
+                                                       for cnt in range(1,1+len(vcolist)-1):
                                                                scrlist.append(("%d" %cnt,"SCR %d" %cnt))
                                                                vcofreq = int(vcolist[cnt-1])
                                                                tmp.vco[z].append(ConfigInteger(default=vcofreq, limits = (vcofreq, vcofreq)))
                                                        tmp.scr[z] = ConfigSelection(choices = scrlist, default = scrlist[0][0])
                                                                scrlist.append(("%d" %cnt,"SCR %d" %cnt))
                                                                vcofreq = int(vcolist[cnt-1])
                                                                tmp.vco[z].append(ConfigInteger(default=vcofreq, limits = (vcofreq, vcofreq)))
                                                        tmp.scr[z] = ConfigSelection(choices = scrlist, default = scrlist[0][0])
+                                                       
+                                                       positions = int(vcolist[len(vcolist)-1][0])
+                                                       tmp.positions[z] = ConfigSubList()
+                                                       tmp.positions[z].append(ConfigInteger(default=positions, limits = (positions, positions)))
+                                                       
+                                                       lofl = vcolist[len(vcolist)-1][1]
+                                                       tmp.lofl[z] = ConfigSubList()
+                                                       tmp.lofl[z].append(ConfigInteger(default=lofl, limits = (lofl, lofl)))
+                                                       
+                                                       lofh = int(vcolist[len(vcolist)-1][2])
+                                                       tmp.lofh[z] = ConfigSubList()
+                                                       tmp.lofh[z].append(ConfigInteger(default=lofh, limits = (lofh, lofh)))
+                                                       
+                                                       loft = int(vcolist[len(vcolist)-1][3])
+                                                       tmp.loft[z] = ConfigSubList()
+                                                       tmp.loft[z].append(ConfigInteger(default=loft, limits = (loft, loft)))
+                                               
                                                section.unicableLnb[y] = tmp
                                                section.unicableLnb[y] = tmp
-
+                               
+#TODO satpositions for satcruser
                                section.satcruser = ConfigSelection(advanced_lnb_satcruser_choices, default="1")
                                tmp = ConfigSubList()
                                section.satcruser = ConfigSelection(advanced_lnb_satcruser_choices, default="1")
                                tmp = ConfigSubList()
-                               tmp.append(ConfigInteger(default=1284, limits = (0, 9999)))
-                               tmp.append(ConfigInteger(default=1400, limits = (0, 9999)))
-                               tmp.append(ConfigInteger(default=1516, limits = (0, 9999)))
-                               tmp.append(ConfigInteger(default=1632, limits = (0, 9999)))
-                               tmp.append(ConfigInteger(default=1748, limits = (0, 9999)))
-                               tmp.append(ConfigInteger(default=1864, limits = (0, 9999)))
-                               tmp.append(ConfigInteger(default=1980, limits = (0, 9999)))
-                               tmp.append(ConfigInteger(default=2096, limits = (0, 9999)))
+                               tmp.append(ConfigInteger(default=1284, limits = (950, 2150)))
+                               tmp.append(ConfigInteger(default=1400, limits = (950, 2150)))
+                               tmp.append(ConfigInteger(default=1516, limits = (950, 2150)))
+                               tmp.append(ConfigInteger(default=1632, limits = (950, 2150)))
+                               tmp.append(ConfigInteger(default=1748, limits = (950, 2150)))
+                               tmp.append(ConfigInteger(default=1864, limits = (950, 2150)))
+                               tmp.append(ConfigInteger(default=1980, limits = (950, 2150)))
+                               tmp.append(ConfigInteger(default=2096, limits = (950, 2150)))
                                section.satcrvcouser = tmp 
 
                                section.satcrvcouser = tmp 
 
+                               nim.advanced.unicableconnected = ConfigYesNo(default=False)
+                               nim.advanced.unicableconnectedTo = ConfigSelection([(str(id), nimmgr.getNimDescription(id)) for id in nimmgr.getNimListOfType("DVB-S") if id != x])
+       
        def configDiSEqCModeChanged(configElement):
                section = configElement.section
                if configElement.value == "1_2" and isinstance(section.longitude, ConfigNothing):
        def configDiSEqCModeChanged(configElement):
                section = configElement.section
                if configElement.value == "1_2" and isinstance(section.longitude, ConfigNothing):
index 471b59e..d7506e3 100755 (executable)
@@ -29,6 +29,7 @@ from time import localtime, strftime
 class ConfigElement(object):
        def __init__(self):
                self.saved_value = None
 class ConfigElement(object):
        def __init__(self):
                self.saved_value = None
+               self.save_forced = False
                self.last_value = None
                self.save_disabled = False
                self.__notifiers = None
                self.last_value = None
                self.save_disabled = False
                self.__notifiers = None
@@ -83,7 +84,7 @@ class ConfigElement(object):
 
        # you need to override this if str(self.value) doesn't work
        def save(self):
 
        # you need to override this if str(self.value) doesn't work
        def save(self):
-               if self.save_disabled or self.value == self.default:
+               if self.save_disabled or (self.value == self.default and not self.save_forced):
                        self.saved_value = None
                else:
                        self.saved_value = self.tostring(self.value)
                        self.saved_value = None
                else:
                        self.saved_value = self.tostring(self.value)
index 749c09d..44f4251 100644 (file)
@@ -95,6 +95,7 @@ class NimSetup(Screen, ConfigListScreen, ServiceStopScreen):
                self.advancedType = None
                self.advancedManufacturer = None
                self.advancedSCR = None
                self.advancedType = None
                self.advancedManufacturer = None
                self.advancedSCR = None
+               self.advancedConnected = None
                
                if self.nim.isMultiType():
                        multiType = self.nimConfig.multiType
                
                if self.nim.isMultiType():
                        multiType = self.nimConfig.multiType
@@ -205,7 +206,7 @@ class NimSetup(Screen, ConfigListScreen, ServiceStopScreen):
                checkList = (self.configMode, self.diseqcModeEntry, self.advancedSatsEntry, \
                        self.advancedLnbsEntry, self.advancedDiseqcMode, self.advancedUsalsEntry, \
                        self.advancedLof, self.advancedPowerMeasurement, self.turningSpeed, \
                checkList = (self.configMode, self.diseqcModeEntry, self.advancedSatsEntry, \
                        self.advancedLnbsEntry, self.advancedDiseqcMode, self.advancedUsalsEntry, \
                        self.advancedLof, self.advancedPowerMeasurement, self.turningSpeed, \
-                       self.advancedType, self.advancedSCR, self.advancedManufacturer, self.advancedUnicable, \
+                       self.advancedType, self.advancedSCR, self.advancedManufacturer, self.advancedUnicable, self.advancedConnected, \
                        self.uncommittedDiseqcCommand, self.cableScanType, self.multiType)
                if self["config"].getCurrent() == self.multiType:
                        from Components.NimManager import InitNimManager
                        self.uncommittedDiseqcCommand, self.cableScanType, self.multiType)
                if self["config"].getCurrent() == self.multiType:
                        from Components.NimManager import InitNimManager
@@ -285,6 +286,18 @@ class NimSetup(Screen, ConfigListScreen, ServiceStopScreen):
                                        self.list.append(self.advancedType)
                                        self.list.append(self.advancedSCR)
                                        self.list.append(getConfigListEntry(_("Frequency"), manufacturer.vco[product_name][manufacturer.scr[product_name].index])) 
                                        self.list.append(self.advancedType)
                                        self.list.append(self.advancedSCR)
                                        self.list.append(getConfigListEntry(_("Frequency"), manufacturer.vco[product_name][manufacturer.scr[product_name].index])) 
+
+                               choices = []
+                               connectable = nimmanager.canConnectTo(self.slotid)
+                               for id in connectable:
+                                       choices.append((str(id), nimmanager.getNimDescription(id)))
+                               if len(choices):
+                                       self.advancedConnected = getConfigListEntry(_("connected"), self.nimConfig.advanced.unicableconnected)
+                                       self.list.append(self.advancedConnected)
+                                       if self.nimConfig.advanced.unicableconnected.value == True:
+                                               self.nimConfig.advanced.unicableconnectedTo.setChoices(choices)
+                                               self.list.append(getConfigListEntry(_("Connected to"),self.nimConfig.advanced.unicableconnectedTo))
+
                        else:   #kein Unicable
                                self.list.append(getConfigListEntry(_("Voltage mode"), Sat.voltage))
                                self.list.append(getConfigListEntry(_("Increased voltage"), currLnb.increased_voltage))
                        else:   #kein Unicable
                                self.list.append(getConfigListEntry(_("Voltage mode"), Sat.voltage))
                                self.list.append(getConfigListEntry(_("Increased voltage"), currLnb.increased_voltage))