add tuner B option "Equal to Socket A"
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>
Fri, 20 Jan 2006 01:33:44 +0000 (01:33 +0000)
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>
Fri, 20 Jan 2006 01:33:44 +0000 (01:33 +0000)
add tuner B option "Secondary cable from Rotor-LNB"

lib/dvb/frontend.h
lib/dvb/sec.cpp
lib/dvb/sec.h
lib/python/Components/NimManager.py
lib/python/Screens/Satconfig.py

index eaedac94439fd7ac0856a7aae6e68d884d262f85..0a7943f997b47e5da30ab06de55b879da27c2a2f 100644 (file)
@@ -57,7 +57,7 @@ class eDVBFrontend: public iDVBFrontend, public Object
 
        eSecCommandList m_sec_sequence;
 
-       int m_data[8]; /* when satellite frontend then
+       int m_data[9]; /* when satellite frontend then
                data[0] = lastcsw -> state of the committed switch
                data[1] = lastucsw -> state of the uncommitted switch
                data[2] = lastToneburst -> current state of toneburst switch
@@ -65,7 +65,8 @@ class eDVBFrontend: public iDVBFrontend, public Object
                data[4] = newRotorPos -> current Rotor Position
                data[5] = curRotorCmd
                data[6] = curRotorPos
-               data[7] = linkedToTunerNo */
+               data[7] = linkedToTunerNo
+               data[8] = dependsToTunerNo (just satpos.. for rotor with twin lnb) */
 
        int m_idleInputpower[2];  // 13V .. 18V
        int m_runningInputpower;
index 9b4ee15adecf048d81a262fd99f80fc5ea772052..5d74753a477be7d367e10ba9c6cfb1616c806647 100644 (file)
@@ -114,7 +114,8 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite
                        if ( sit != lnb_param.m_satellites.end())
                        {
                                int band=0,
-                                       linked_to=0, // linked tuner
+                                       linked_to=-1, // linked tuner
+                                       satpos_depends_to=-1,
                                        csw = di_param.m_committed_cmd,
                                        ucsw = di_param.m_uncommitted_cmd,
                                        toneburst = di_param.m_toneburst_param,
@@ -122,6 +123,7 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite
 
                                fe->getData(6, curRotorPos);
                                fe->getData(7, linked_to);
+                               fe->getData(8, satpos_depends_to);
 
                                if ( sat.frequency > lnb_param.m_lof_threshold )
                                        band |= 1;
@@ -188,6 +190,23 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite
 //                                                     eDebug("OK .. can tune this transponder with linked tuner in use :)");
                                        }
                                }
+
+                               if (satpos_depends_to != -1)  // check for linked tuners..
+                               {
+                                       eDVBRegisteredFrontend *satpos_depends_to_fe = (eDVBRegisteredFrontend*) satpos_depends_to;
+                                       if ( satpos_depends_to_fe->m_inuse )
+                                       {
+                                               int oRotorPos = -1;
+                                               satpos_depends_to_fe->m_frontend->getData(6, oRotorPos);
+                                               if (!rotor || oRotorPos != sat.orbital_position)
+                                               {
+//                                                     eDebug("can not tune this transponder ... rotor on other tuner is positioned to %d", oRotorPos);
+                                                       ret=0;
+                                               }
+                                       }
+//                                     else
+//                                             eDebug("OK .. can tune this transponder satpos is correct :)");
+                               }
                        }
                }
        }
@@ -199,6 +218,7 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite
 RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, eDVBFrontendParametersSatellite &sat, int frontend_id)
 {
        bool linked=false;
+       bool depend_satpos_mode=false;
 
        for (int idx=0; idx <= m_lnbidx; ++idx )
        {
@@ -216,6 +236,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
 
                        int band=0,
                                linked_to=-1, // linked tuner
+                               satpos_depends_to=-1,
                                voltage = iDVBFrontend::voltageOff,
                                tone = iDVBFrontend::toneOff,
                                csw = di_param.m_committed_cmd,
@@ -233,6 +254,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                        frontend.getData(5, lastRotorCmd);
                        frontend.getData(6, curRotorPos);
                        frontend.getData(7, linked_to);
+                       frontend.getData(8, satpos_depends_to);
 
                        if (linked_to != -1)
                        {
@@ -244,6 +266,18 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                                }
                        }
 
+                       if (satpos_depends_to != -1)
+                       {
+                               eDVBRegisteredFrontend *satpos_fe = (eDVBRegisteredFrontend*) satpos_depends_to;
+                               if (satpos_fe->m_inuse)
+                               {
+                                       if ( di_param.m_diseqc_mode != eDVBSatelliteDiseqcParameters::V1_2 )
+                                               continue;
+                                       eDebug("[SEC] frontend is depending on satpos of other one.. so we dont turn rotor!!");
+                                       depend_satpos_mode=true;
+                               }
+                       }
+
                        if ( sat.frequency > lnb_param.m_lof_threshold )
                                band |= 1;
 
@@ -471,154 +505,152 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
 
                                if ( di_param.m_diseqc_mode == eDVBSatelliteDiseqcParameters::V1_2 )
                                {
-                                       int RotorCmd=0;
-                                       bool useGotoXX = false;
-
-                                       if (sw_param.m_rotorPosNum) // we have stored rotor pos?
-                                               RotorCmd=sw_param.m_rotorPosNum;
-                                       else  // we must calc gotoxx cmd
+                                       if (depend_satpos_mode || linked)
+                                               // in this both modes we dont really turn the rotor.... but in canTune we need the satpos
+                                               frontend.setData(6, sat.orbital_position);
+                                       else
                                        {
-                                               eDebug("Entry for %d,%d? not in Rotor Table found... i try gotoXX?", sat.orbital_position / 10, sat.orbital_position % 10 );
-                                               useGotoXX = true;
+                                               int RotorCmd=0;
+                                               bool useGotoXX = false;
 
-                                               double  SatLon = abs(sat.orbital_position)/10.00,
-                                                               SiteLat = rotor_param.m_gotoxx_parameters.m_latitude,
-                                                               SiteLon = rotor_param.m_gotoxx_parameters.m_longitude;
+                                               if (sw_param.m_rotorPosNum) // we have stored rotor pos?
+                                                       RotorCmd=sw_param.m_rotorPosNum;
+                                               else  // we must calc gotoxx cmd
+                                               {
+                                                       eDebug("Entry for %d,%d? not in Rotor Table found... i try gotoXX?", sat.orbital_position / 10, sat.orbital_position % 10 );
+                                                       useGotoXX = true;
 
-                                               if ( rotor_param.m_gotoxx_parameters.m_la_direction == eDVBSatelliteRotorParameters::SOUTH )
-                                                       SiteLat = -SiteLat;
+                                                       double  SatLon = abs(sat.orbital_position)/10.00,
+                                                                       SiteLat = rotor_param.m_gotoxx_parameters.m_latitude,
+                                                                       SiteLon = rotor_param.m_gotoxx_parameters.m_longitude;
 
-                                               if ( rotor_param.m_gotoxx_parameters.m_lo_direction == eDVBSatelliteRotorParameters::WEST )
-                                                       SiteLon = 360 - SiteLon;
+                                                       if ( rotor_param.m_gotoxx_parameters.m_la_direction == eDVBSatelliteRotorParameters::SOUTH )
+                                                               SiteLat = -SiteLat;
 
-                                               eDebug("siteLatitude = %lf, siteLongitude = %lf, %lf degrees", SiteLat, SiteLon, SatLon );
-                                               double satHourAngle =
-                                                       calcSatHourangle( SatLon, SiteLat, SiteLon );
-                                               eDebug("PolarmountHourAngle=%lf", satHourAngle );
+                                                       if ( rotor_param.m_gotoxx_parameters.m_lo_direction == eDVBSatelliteRotorParameters::WEST )
+                                                               SiteLon = 360 - SiteLon;
 
-                                               static int gotoXTable[10] =
-                                                       { 0x00, 0x02, 0x03, 0x05, 0x06, 0x08, 0x0A, 0x0B, 0x0D, 0x0E };
+                                                       eDebug("siteLatitude = %lf, siteLongitude = %lf, %lf degrees", SiteLat, SiteLon, SatLon );
+                                                       double satHourAngle =
+                                                               calcSatHourangle( SatLon, SiteLat, SiteLon );
+                                                       eDebug("PolarmountHourAngle=%lf", satHourAngle );
 
-                                               if (SiteLat >= 0) // Northern Hemisphere
-                                               {
-                                                       int tmp=(int)round( fabs( 180 - satHourAngle ) * 10.0 );
-                                                       RotorCmd = (tmp/10)*0x10 + gotoXTable[ tmp % 10 ];
+                                                       static int gotoXTable[10] =
+                                                               { 0x00, 0x02, 0x03, 0x05, 0x06, 0x08, 0x0A, 0x0B, 0x0D, 0x0E };
 
-                                                       if (satHourAngle < 180) // the east
-                                                               RotorCmd |= 0xE000;
-                                                       else                                    // west
-                                                               RotorCmd |= 0xD000;
-                                               }
-                                               else // Southern Hemisphere
-                                               {
-                                                       if (satHourAngle < 180) // the east
+                                                       if (SiteLat >= 0) // Northern Hemisphere
                                                        {
-                                                               int tmp=(int)round( fabs( satHourAngle ) * 10.0 );
+                                                               int tmp=(int)round( fabs( 180 - satHourAngle ) * 10.0 );
                                                                RotorCmd = (tmp/10)*0x10 + gotoXTable[ tmp % 10 ];
-                                                               RotorCmd |= 0xD000;
+
+                                                               if (satHourAngle < 180) // the east
+                                                                       RotorCmd |= 0xE000;
+                                                               else                                    // west
+                                                                       RotorCmd |= 0xD000;
                                                        }
-                                                       else                                    // west
-                                                       {          
-                                                               int tmp=(int)round( fabs( 360 - satHourAngle ) * 10.0 );
-                                                               RotorCmd = (tmp/10)*0x10 + gotoXTable[ tmp % 10 ];
-                                                               RotorCmd |= 0xE000;
+                                                       else // Southern Hemisphere
+                                                       {
+                                                               if (satHourAngle < 180) // the east
+                                                               {
+                                                                       int tmp=(int)round( fabs( satHourAngle ) * 10.0 );
+                                                                       RotorCmd = (tmp/10)*0x10 + gotoXTable[ tmp % 10 ];
+                                                                       RotorCmd |= 0xD000;
+                                                               }
+                                                               else                                    // west
+                                                               {          
+                                                                       int tmp=(int)round( fabs( 360 - satHourAngle ) * 10.0 );
+                                                                       RotorCmd = (tmp/10)*0x10 + gotoXTable[ tmp % 10 ];
+                                                                       RotorCmd |= 0xE000;
+                                                               }
                                                        }
+                                                       eDebug("RotorCmd = %04x", RotorCmd);
                                                }
-                                               eDebug("RotorCmd = %04x", RotorCmd);
-                                       }
-                                       if ( RotorCmd != lastRotorCmd )
-                                       {
-                                               if ( send_mask )
-                                               {
-                                                       // override first voltage change
-                                                       *(++(++sec_sequence.begin()))=eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(13));
-                                                       // wait 1 second after first switch diseqc command
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 1000) );
-                                               }
-                                               else  // no other diseqc commands before
+                                               if ( RotorCmd != lastRotorCmd )
                                                {
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, iDVBFrontend::toneOff) );
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 15) );  // wait 15msec after tone change
-                                                       eSecCommand::pair compare;
-                                                       compare.voltage = voltage;
-                                                       compare.steps = +3;
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) ); // voltage already correct ?
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(13)) );
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) );  // wait 50msec after voltage change
-                                               }
+                                                       if ( send_mask )
+                                                       {
+                                                               // override first voltage change
+                                                               *(++(++sec_sequence.begin()))=eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(13));
+                                                               // wait 1 second after first switch diseqc command
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 1000) );
+                                                       }
+                                                       else  // no other diseqc commands before
+                                                       {
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, iDVBFrontend::toneOff) );
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 15) );  // wait 15msec after tone change
+                                                               eSecCommand::pair compare;
+                                                               compare.voltage = voltage;
+                                                               compare.steps = +3;
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) ); // voltage already correct ?
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(13)) );
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) );  // wait 50msec after voltage change
+                                                       }
 
-                                               eDVBDiseqcCommand diseqc;
-                                               diseqc.data[0] = 0xE0;
-                                               diseqc.data[1] = 0x31;          // positioner
-                                               if ( useGotoXX )
-                                               {
-                                                       diseqc.len = 5;
-                                                       diseqc.data[2] = 0x6E;  // drive to angular position
-                                                       diseqc.data[3] = ((RotorCmd & 0xFF00) / 0x100);
-                                                       diseqc.data[4] = RotorCmd & 0xFF;
-                                               }
-                                               else
-                                               {
-                                                       diseqc.len = 4;
-                                                       diseqc.data[2] = 0x6B;  // goto stored sat position
-                                                       diseqc.data[3] = RotorCmd;
-                                                       diseqc.data[4] = 0x00;
-                                               }
+                                                       eDVBDiseqcCommand diseqc;
+                                                       diseqc.data[0] = 0xE0;
+                                                       diseqc.data[1] = 0x31;          // positioner
+                                                       if ( useGotoXX )
+                                                       {
+                                                               diseqc.len = 5;
+                                                               diseqc.data[2] = 0x6E;  // drive to angular position
+                                                               diseqc.data[3] = ((RotorCmd & 0xFF00) / 0x100);
+                                                               diseqc.data[4] = RotorCmd & 0xFF;
+                                                       }
+                                                       else
+                                                       {
+                                                               diseqc.len = 4;
+                                                               diseqc.data[2] = 0x6B;  // goto stored sat position
+                                                               diseqc.data[3] = RotorCmd;
+                                                               diseqc.data[4] = 0x00;
+                                                       }
 
-                                               if ( rotor_param.m_inputpower_parameters.m_use )
-                                               { // use measure rotor input power to detect rotor state
-                                                       eSecCommand::rotor cmd;
+                                                       if ( rotor_param.m_inputpower_parameters.m_use )
+                                                       { // use measure rotor input power to detect rotor state
+                                                               eSecCommand::rotor cmd;
 // measure idle power values
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::IF_IDLE_INPUTPOWER_AVAIL_GOTO, +8) ); // already measured?
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) );  // wait 50msec after voltage change
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_IDLE_INPUTPOWER, 0) );
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(18)) );
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 100) );  // wait 100msec before measure
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_IDLE_INPUTPOWER, 1) );
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(13)) ); // back to lower voltage
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) );  // wait 50msec
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::IF_IDLE_INPUTPOWER_AVAIL_GOTO, +8) ); // already measured?
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) );  // wait 50msec after voltage change
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_IDLE_INPUTPOWER, 0) );
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(18)) );
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 100) );  // wait 100msec before measure
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_IDLE_INPUTPOWER, 1) );
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(13)) ); // back to lower voltage
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) );  // wait 50msec
 ////////////////////////////
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeStatic) );
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) );  // wait 50msec after voltage change
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) );
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, 40) );  // 2 seconds rotor start timout
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeStatic) );
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) );  // wait 50msec after voltage change
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) );
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, 40) );  // 2 seconds rotor start timout
 // rotor start loop
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) );  // 50msec delay
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_RUNNING_INPUTPOWER) );
-                                                       cmd.direction=1;  // check for running rotor
-                                                       cmd.deltaA=rotor_param.m_inputpower_parameters.m_delta;
-                                                       cmd.steps=+3;
-                                                       cmd.okcount=0;
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::IF_INPUTPOWER_DELTA_GOTO, cmd ) );  // check if rotor has started
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +9 ) );  // timeout .. we assume now the rotor is already at the correct position
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -4) );  // goto loop start
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) );  // 50msec delay
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_RUNNING_INPUTPOWER) );
+                                                               cmd.direction=1;  // check for running rotor
+                                                               cmd.deltaA=rotor_param.m_inputpower_parameters.m_delta;
+                                                               cmd.steps=+3;
+                                                               cmd.okcount=0;
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::IF_INPUTPOWER_DELTA_GOTO, cmd ) );  // check if rotor has started
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +9 ) );  // timeout .. we assume now the rotor is already at the correct position
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -4) );  // goto loop start
 ////////////////////
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, 2400) );  // 2 minutes running timeout
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(18)) );
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, 2400) );  // 2 minutes running timeout
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(18)) );
 // rotor running loop
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) );  // wait 50msec
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_RUNNING_INPUTPOWER) );
-                                                       cmd.direction=0;  // check for stopped rotor
-                                                       cmd.steps=+3;
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::IF_INPUTPOWER_DELTA_GOTO, cmd ) );
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +3 ) );  // timeout ? this should never happen
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -4) );  // running loop start
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) );  // wait 50msec
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_RUNNING_INPUTPOWER) );
+                                                               cmd.direction=0;  // check for stopped rotor
+                                                               cmd.steps=+3;
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::IF_INPUTPOWER_DELTA_GOTO, cmd ) );
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +3 ) );  // timeout ? this should never happen
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -4) );  // running loop start
 /////////////////////
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::UPDATE_CURRENT_ROTORPARAMS) );
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeDynamic) );
-                                                       if ( linked )
-                                                       {
-                                                               frontend.setData(5, RotorCmd);
-                                                               frontend.setData(6, sat.orbital_position);
-                                                       }
-                                                       else
-                                                       {
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::UPDATE_CURRENT_ROTORPARAMS) );
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeDynamic) );
                                                                frontend.setData(3, RotorCmd);
                                                                frontend.setData(4, sat.orbital_position);
                                                        }
+                                                       else
+                                                               eFatal("rotor turning without inputpowermeasure not implemented yet");
                                                }
-                                               else
-                                                       eFatal("rotor turning without inputpowermeasure not implemented yet");
                                        }
                                }
                        }
@@ -648,10 +680,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                }
        }
 
-       if (linked)
-               return 0;
-
-       eDebug("found no satellite configuration for orbital position (%d)", sat.orbital_position );
+       eDebug("found no useable satellite configuration for orbital position (%d)", sat.orbital_position );
        return -1;
 }
 
@@ -671,6 +700,31 @@ RESULT eDVBSatelliteEquipmentControl::clear()
        return 0;
 }
 
+// helper function for setTunerLinked and setTunerDepends
+RESULT eDVBSatelliteEquipmentControl::setDependencyPointers( int tu1, int tu2, int dest_data_byte )
+{
+       if (tu1 == tu2)
+               return -1;
+
+       eDVBRegisteredFrontend *p1=NULL, *p2=NULL;
+
+       int cnt=0;
+       for (eSmartPtrList<eDVBRegisteredFrontend>::iterator it(m_avail_frontends.begin()); it != m_avail_frontends.end(); ++it, ++cnt)
+       {
+               if (cnt == tu1)
+                       p1 = *it;
+               else if (cnt == tu2)
+                       p2 = *it;
+       }
+       if (p1 && p2)
+       {
+               p1->m_frontend->setData(dest_data_byte, (int)p2);  // this is evil..
+               p2->m_frontend->setData(dest_data_byte, (int)p1);
+               return 0;
+       }
+       return -1;
+}
+
 /* LNB Specific Parameters */
 RESULT eDVBSatelliteEquipmentControl::addLNB()
 {
@@ -923,26 +977,12 @@ RESULT eDVBSatelliteEquipmentControl::setRotorPosNum(int rotor_pos_num)
 
 RESULT eDVBSatelliteEquipmentControl::setTunerLinked(int tu1, int tu2)
 {
-       if (tu1 == tu2)
-               return -1;
-
-       eDVBRegisteredFrontend *p1=NULL, *p2=NULL;
+       return setDependencyPointers(tu1, tu2, 7);
+}
 
-       int cnt=0;
-       for (eSmartPtrList<eDVBRegisteredFrontend>::iterator it(m_avail_frontends.begin()); it != m_avail_frontends.end(); ++it, ++cnt)
-       {
-               if (cnt == tu1)
-                       p1 = *it;
-               else if (cnt == tu2)
-                       p2 = *it;
-       }
-       if (p1 && p2)
-       {
-               p1->m_frontend->setData(7, (int)p2);  // this is evil..
-               p2->m_frontend->setData(7, (int)p1);
-               return 0;
-       }
-       return -1;
+RESULT eDVBSatelliteEquipmentControl::setTunerDepends(int tu1, int tu2)
+{
+       return setDependencyPointers(tu1, tu2, 8);
 }
 
 bool eDVBSatelliteEquipmentControl::isRotorMoving()
index 0720beeb07e0169077c0362930692f6217f0d0a7..8a51f3318f406920a187d9f3960f30c76fd00876 100644 (file)
@@ -238,6 +238,8 @@ class eDVBSatelliteEquipmentControl: public iDVBSatelliteEquipmentControl
        eDVBSatelliteEquipmentControl();
        ~eDVBSatelliteEquipmentControl();
 #endif
+       // helper function for setTunerLinked and setTunerDepends
+       RESULT setDependencyPointers( int no1, int no2, int dest_data_byte );
 public:
 #ifndef SWIG
        eDVBSatelliteEquipmentControl(eSmartPtrList<eDVBRegisteredFrontend> &avail_frontends);
@@ -278,6 +280,7 @@ public:
        RESULT setRotorPosNum(int rotor_pos_num);
 /* Tuner Specific Parameters */
        RESULT setTunerLinked(int from, int to);
+       RESULT setTunerDepends(int from, int to);
 
        void setRotorMoving(bool); // called from the frontend's
        bool isRotorMoving();
index 5f0c4b267fe06256d644c6cb6e3f797a86452920..97c6f31cec43ad2721181ecf7518f25c1a58c972 100644 (file)
@@ -38,7 +38,9 @@ class SecConfigure:
                #simple defaults
                sec.addLNB()
                tunermask = 1 << slotid
-               if self.linked.has_key(slotid):
+               if self.equal.has_key(slotid):
+                       tunermask |= (1 << self.equal[slotid])
+               elif self.linked.has_key(slotid):
                        tunermask |= (1 << self.linked[slotid])
                sec.setLNBTunerMask(tunermask)
                sec.setLNBLOFL(9750000)
@@ -60,13 +62,16 @@ class SecConfigure:
                        sec.addSatellite(orbpos)
                        self.satList.append(orbpos)
                elif (diseqcmode == 3): # diseqc 1.2
+                       if self.satposdepends.has_key(slotid):
+                               tunermask |= (1 << self.satposdepends[slotid])
+                               sec.setLNBTunerMask(tunermask)
                        sec.setLatitude(latitude)
                        sec.setLaDirection(laDirection)
                        sec.setLongitude(longitude)
                        sec.setLoDirection(loDirection)
                        sec.setUseInputpower(True)
                        sec.setInputpowerDelta(50)
-                       
+
                        for x in self.NimManager.satList:
                                print "Add sat " + str(x[1])
                                sec.addSatellite(int(x[1]))
@@ -74,6 +79,10 @@ class SecConfigure:
                                sec.setToneMode(0)
                                self.satList.append(int(x[1]))
 
+       def setSatposDepends(self, sec, nim1, nim2):
+               print "tuner", nim1, "depends on satpos of", nim2
+               sec.setTunerDepends(nim1, nim2)
+
        def linkNIMs(self, sec, nim1, nim2):
                print "link tuner", nim1, "to tuner", nim2
                sec.setTunerLinked(nim1, nim2)
@@ -88,20 +97,27 @@ class SecConfigure:
                self.satList = []
 
                self.linked = { }
+               self.satposdepends = { }
+               self.equal = { }
                for slot in self.NimManager.nimslots:
                        x = slot.slotid
                        nim = config.Nims[x]
                        if slot.nimType == self.NimManager.nimType["DVB-S"]:
+                               if currentConfigSelectionElement(nim.configMode) == "equal":
+                                       self.equal[nim.equalTo.value]=x
                                if currentConfigSelectionElement(nim.configMode) == "loopthrough":
                                        self.linkNIMs(sec, x, nim.linkedTo.value)
                                        self.linked[nim.linkedTo.value]=x
+                               elif currentConfigSelectionElement(nim.configMode) == "satposdepends":
+                                       self.setSatposDepends(sec, x, nim.satposDependsTo.value)
+                                       self.satposdepends[nim.satposDependsTo.value]=x
 
                for slot in self.NimManager.nimslots:
                        x = slot.slotid
                        nim = config.Nims[x]
                        if slot.nimType == self.NimManager.nimType["DVB-S"]:
                                print "slot: " + str(x) + " configmode: " + str(nim.configMode.value)
-                               if currentConfigSelectionElement(nim.configMode) == "loopthrough":
+                               if currentConfigSelectionElement(nim.configMode) in [ "loopthrough", "satposdepends", "equal", "nothing" ]:
                                        pass
                                elif currentConfigSelectionElement(nim.configMode) == "simple":         #simple config
                                        if currentConfigSelectionElement(nim.diseqcMode) == "single":                   #single
@@ -131,9 +147,6 @@ class SecConfigure:
                                                        loDirection = loValue,
                                                        latitude = configsequencearg.getFloat(nim.latitude),
                                                        laDirection = laValue)
-#                                      pass
-                               elif currentConfigSelectionElement(nim.configMode) == "nothing":
-                                       pass
                                elif currentConfigSelectionElement(nim.configMode) == "advanced": #advanced config
                                        self.updateAdvanced(sec, x)
                print "sec config completed"
@@ -153,9 +166,10 @@ class SecConfigure:
                                sec.addLNB()
 
                                tunermask = 1 << slotid
-                               if self.linked.has_key(slotid):
+                               if self.equal.has_key(slotid):
+                                       tunermask |= (1 << self.equal[slotid])
+                               elif self.linked.has_key(slotid):
                                        tunermask |= (1 << self.linked[slotid])
-                               sec.setLNBTunerMask(tunermask)
 
                                if currentConfigSelectionElement(currLnb.lof) == "universal_lnb":
                                        sec.setLNBLOFL(9750000)
@@ -188,6 +202,10 @@ class SecConfigure:
                                        sec.setDiSEqCMode(diseqcParam.V1_1)
                                elif currentConfigSelectionElement(currLnb.diseqcMode) == "1_2":
                                        sec.setDiSEqCMode(diseqcParam.V1_2)
+
+                                       if self.satposdepends.has_key(slotid):  # only useable with rotors
+                                               tunermask |= (1 << self.satposdepends[slotid])
+
                                        
                                if currentConfigSelectionElement(currLnb.diseqcMode) != "none":
                                        if currentConfigSelectionElement(currLnb.toneburst) == "none":
@@ -272,7 +290,9 @@ class SecConfigure:
                                        sec.setInputpowerDelta(currLnb.powerThreshold.value[0])
                                else:
                                        sec.setUseInputpower(False)
-                                               
+
+                               sec.setLNBTunerMask(tunermask)
+
                                # finally add the orbital positions
                                for y in lnbSat[x]:
                                        sec.addSatellite(y)
@@ -546,21 +566,6 @@ class NimManager:
                                                list.append(x)
                return list
 
-#      #callbacks for c++ config
-#      def nimConfigModeChanged(self, slotid, mode):
-#              if (mode != 2): # not linked
-#                      print "Unlinking slot " + str(slotid)
-#                      # TODO call c++ to unlink nim in slot slotid
-#              if (mode == 2): # linked
-#                      pass
-#                      #FIXME!!!
-#                      #if (len(self.getNimListOfType(self.nimType["DVB-S"], slotid)) > 0):
-#                      #       print "Linking slot " + str(slotid) + " to " + str(nimmgr.getConfigPrefix(slotid).value)
-#                      # TODO call c++ to link nim in slot slotid with nim in slot nimmgr.getConfigPrefix(slotid).value
-
-#      def nimLinkedToChanged(self, slotid, val):
-#              print "Linking slot " + str(slotid) + " to " + str(val)
-
        def nimDiseqcModeChanged(self, slotid, mode):
                #print "nimDiseqcModeChanged set to " + str(mode)
                pass
@@ -585,8 +590,6 @@ def InitNimManager(nimmgr):
                
 #      def nimConfigModeChanged(slotid, configElement):
 #              nimmgr.nimConfigModeChanged(slotid, configElement.value)
-#      def nimLinkedToChanged(slotid, configElement):
-#              nimmgr.nimLinkedToChanged(slotid, configElement.value)
        def nimDiseqcModeChanged(slotid, configElement):
                nimmgr.nimDiseqcModeChanged(slotid, configElement.value)
                
@@ -606,12 +609,18 @@ def InitNimManager(nimmgr):
                
                if slot.nimType == nimmgr.nimType["DVB-S"]:
                        if slot.slotid == 0:
-                               nim.configMode = configElement(cname + "configMode", configSelection, 0, (("simple", _("Simple")), ("advanced", _("Advanced"))))
-                       else:                                                   
-                               nim.configMode = configElement(cname + "configMode", configSelection, 0, (("simple", _("Simple")), ("nothing", _("Nothing connected")), ("loopthrough", _("Loopthrough to Socket A")), ("advanced", _("Advanced"))))
-                       
+                               nim.configMode = configElement(cname + "configMode", configSelection, 0, (
+                               ("simple", _("Simple")), ("advanced", _("Advanced"))))
+                       else:
+                               nim.configMode = configElement(cname + "configMode", configSelection, 0, (
+                               ("equal", _("Equal to Socket A")),
+                               ("loopthrough", _("Loopthrough to Socket A")),
+                               ("nothing", _("Nothing connected")),
+                               ("satposdepends", _("Secondary cable from Rotor-LNB")),
+                               ("simple", _("Simple")),
+                               ("advanced", _("Advanced"))))
                        #important - check if just the 2nd one is LT only and the first one is DVB-S
-                       if currentConfigSelectionElement(nim.configMode) == "loopthrough": #linked
+                       if currentConfigSelectionElement(nim.configMode) in ["loopthrough", "satposdepends", "equal"]:
                                if x == 0:                                                                              #first one can never be linked to anything
                                        nim.configMode.value = getConfigSelectionElement(nim.configMode, "simple")              #reset to simple
                                        nim.configMode.save()
@@ -637,7 +646,9 @@ def InitNimManager(nimmgr):
                        satNimListNames = []
                        for x in satNimList:
                                satNimListNames.append((("Slot_" + ("A", "B", "C", "D")[x] + "_" + nimmgr.getNimName(x)), _("Slot ") + ("A", "B", "C", "D")[x] + ": " + nimmgr.getNimName(x)))
+                       nim.equalTo = configElement(cname + "equalTo", configSelection, 0, satNimListNames);
                        nim.linkedTo = configElement(cname + "linkedTo", configSelection, 0, satNimListNames);
+                       nim.satposDependsTo = configElement(cname + "satposDependsTo", configSelection, 0, satNimListNames);
                        
                        #perhaps the instance of the slot is more useful?
 #                      nim.configMode.addNotifier(boundFunction(nimConfigModeChanged,x))
@@ -646,7 +657,6 @@ def InitNimManager(nimmgr):
                        nim.diseqcB.addNotifier(boundFunction(nimPortBChanged,x))
                        nim.diseqcC.addNotifier(boundFunction(nimPortCChanged,x))
                        nim.diseqcD.addNotifier(boundFunction(nimPortDChanged,x))
-#                      nim.linkedTo.addNotifier(boundFunction(nimLinkedToChanged,x))
                        
                        # advanced config:
                        nim.advanced = ConfigSubsection()
index 8bd33a8a273ce8fcfce26d839c5fb6e44bdd6d5d..9045acc7cd797b43f40fa7b3976b643abc52e534 100644 (file)
@@ -55,10 +55,7 @@ class NimSetup(Screen):
                                        self.createSimpleSetup(self.nim, self.list, config.Nims[self.nim.slotid].diseqcMode.value)
                                if (config.Nims[self.nim.slotid].diseqcMode.value == 4):
                                        self.createPositionerSetup(self.nim, self.list)
-                       elif currentConfigSelectionElement(config.Nims[self.nim.slotid].configMode) == "nothing": # nothing
-                               #self.list.append(getConfigListEntry(_("Linked to"), config.Nims[self.nim.slotid].linkedTo))
-                               pass
-                       elif currentConfigSelectionElement(config.Nims[self.nim.slotid].configMode) == "loopthrough": # linked
+                       elif currentConfigSelectionElement(config.Nims[self.nim.slotid].configMode) in ["loopthrough", "satposdepends", "nothing", "equal"]:
                                pass
                        elif currentConfigSelectionElement(config.Nims[self.nim.slotid].configMode) == "advanced": # advanced
                                # SATs