much better motor turning without possibility of power measurement
[enigma2.git] / lib / dvb / sec.cpp
index f011934242358872dbf531c532a5ce7e7c297002..71c8a19cfd10a3ed5874a13c8a4a46ecae79e667 100644 (file)
@@ -61,14 +61,14 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite
        bool direct_connected = m_not_linked_slot_mask & slot_id;
        int score=0, satcount=0;
        long linked_prev_ptr=-1, linked_next_ptr=-1, linked_csw=-1, linked_ucsw=-1, linked_toneburst=-1,
-               satpos_depends_ptr=-1, rotor_pos=-1;
+               fe_satpos_depends_ptr=-1, fe_rotor_pos=-1;
        bool linked_in_use = false;
 
        eSecDebugNoSimulate("direct_connected %d", !!direct_connected);
 
        fe->getData(eDVBFrontend::LINKED_PREV_PTR, linked_prev_ptr);
        fe->getData(eDVBFrontend::LINKED_NEXT_PTR, linked_next_ptr);
-       fe->getData(eDVBFrontend::SATPOS_DEPENDS_PTR, satpos_depends_ptr);
+       fe->getData(eDVBFrontend::SATPOS_DEPENDS_PTR, fe_satpos_depends_ptr);
 
        // first we search the linkage base frontend and check if any tuner in prev direction is used
        while (linked_prev_ptr != -1)
@@ -80,7 +80,7 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite
                linked_fe->m_frontend->getData(eDVBFrontend::LINKED_PREV_PTR, (long&)linked_prev_ptr);
        }
 
-       fe->getData(eDVBFrontend::ROTOR_POS, rotor_pos);
+       fe->getData(eDVBFrontend::ROTOR_POS, fe_rotor_pos);
 
        // now check also the linked tuners  is in use
        while (!linked_in_use && linked_next_ptr != -1)
@@ -123,10 +123,11 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite
                        {
                                bool diseqc=false;
                                long band=0,
-                                       satpos_depends_ptr=-1,
+                                       satpos_depends_ptr=fe_satpos_depends_ptr,
                                        csw = di_param.m_committed_cmd,
                                        ucsw = di_param.m_uncommitted_cmd,
-                                       toneburst = di_param.m_toneburst_param;
+                                       toneburst = di_param.m_toneburst_param,
+                                       rotor_pos = fe_rotor_pos;
 
                                eSecDebugNoSimulate("sat %d found", sat.orbital_position);
 
@@ -147,7 +148,7 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite
                                        if ( di_param.m_diseqc_mode == eDVBSatelliteDiseqcParameters::V1_2 )  // ROTOR
                                                rotor = true;
 
-                                       ret=10000;
+                                       ret = 10000;
                                }
                                else
                                {
@@ -164,20 +165,20 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite
                                                ( diseqc && (ucsw != linked_ucsw || toneburst != linked_toneburst) ) ||
                                                ( rotor && rotor_pos != sat.orbital_position ) )
                                        {
-                                               ret=0;
+                                               ret = 0;
                                        }
+                                       else
+                                               ret += 15;
                                        eSecDebugNoSimulate("ret2 %d", ret);
                                        if (ret) // special case when this tuner is linked to a satpos dependent tuner
                                        {
-                                               long satpos_depends_ptr=-1;
                                                fe->getData(eDVBFrontend::SATPOS_DEPENDS_PTR, satpos_depends_ptr);
                                                if (satpos_depends_ptr != -1)
                                                {
                                                        eDVBRegisteredFrontend *satpos_depends_to_fe = (eDVBRegisteredFrontend*) satpos_depends_ptr;
-                                                       long satpos_depends_rotor_pos;
-                                                       satpos_depends_to_fe->m_frontend->getData(eDVBFrontend::ROTOR_POS, satpos_depends_rotor_pos);
-                                                       if (!rotor || satpos_depends_rotor_pos == -1 /* we dont know the rotor position yet */
-                                                               || satpos_depends_rotor_pos != sat.orbital_position ) // not the same orbital position?
+                                                       satpos_depends_to_fe->m_frontend->getData(eDVBFrontend::ROTOR_POS, rotor_pos);
+                                                       if (!rotor || rotor_pos == -1 /* we dont know the rotor position yet */
+                                                               || rotor_pos != sat.orbital_position ) // not the same orbital position?
                                                        {
                                                                ret = 0;
                                                        }
@@ -194,16 +195,17 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite
                                                if (satpos_depends_to_fe->m_inuse) // if the dependent frontend is in use?
                                                {
                                                        if (!rotor || rotor_pos != sat.orbital_position) // new orbital position not equal to current orbital pos?
-                                                               ret=0;
+                                                               ret = 0;
+                                                       else
+                                                               ret += 10;
                                                }
                                        }
                                        else // current fe is dependent of another tuner ... (so this fe can't turn the rotor!)
                                        {
                                                // get current orb pos of the tuner with rotor connection
-                                               long satpos_depends_rotor_pos;
-                                               satpos_depends_to_fe->m_frontend->getData(eDVBFrontend::ROTOR_POS, satpos_depends_rotor_pos);
-                                               if (!rotor || satpos_depends_rotor_pos == -1 /* we dont know the rotor position yet */
-                                                       || satpos_depends_rotor_pos != sat.orbital_position ) // not the same orbital position?
+                                               satpos_depends_to_fe->m_frontend->getData(eDVBFrontend::ROTOR_POS, rotor_pos);
+                                               if (!rotor || rotor_pos == -1 /* we dont know the rotor position yet */
+                                                       || rotor_pos != sat.orbital_position ) // not the same orbital position?
                                                {
                                                        ret = 0;
                                                }
@@ -222,7 +224,7 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite
                                                lnb_param.m_lof_hi : lnb_param.m_lof_lo;
                                        int tuner_freq = abs(sat.frequency - lof);
                                        if (tuner_freq < 900000 || tuner_freq > 2200000)
-                                               ret=0;
+                                               ret = 0;
                                }
 
                                if (ret && lnb_param.m_prio != -1)
@@ -312,7 +314,6 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                        eDVBSatelliteSwitchParameters &sw_param = sit->second;
                        bool doSetFrontend = true;
                        bool doSetVoltageToneFrontend = true;
-                       bool forceStaticMode = true;
                        bool forceChanged = false;
                        bool needDiSEqCReset = false;
                        long band=0,
@@ -753,6 +754,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                                                }
                                                if(lnb_param.SatCR_idx == -1)
                                                {
+                                                       int mrt = m_params[MOTOR_RUNNING_TIMEOUT]; // in seconds!
                                                        if ( rotor_param.m_inputpower_parameters.m_use )
                                                        { // use measure rotor input power to detect rotor state
                                                                bool turn_fast = need_turn_fast(rotor_param.m_inputpower_parameters.m_turning_speed);
@@ -799,7 +801,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                                                                sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_MOVING) );
                                                                if (turn_fast)
                                                                        sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(18)) );
-                                                               sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, m_params[MOTOR_RUNNING_TIMEOUT]*20) );  // 2 minutes running timeout
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, mrt*20) );  // mrt is in seconds... our SLEEP time is 50ms.. so * 20
        // rotor running loop
                                                                sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) );  // wait 50msec
                                                                sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_RUNNING_INPUTPOWER) );
@@ -814,6 +816,17 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                                                        }
                                                        else
                                                        {  // use normal turning mode
+                                                               if (curRotorPos != -1)
+                                                               {               
+                                                                       mrt = abs(curRotorPos - sat.orbital_position);
+                                                                       if (mrt > 1800)
+                                                                               mrt = 3600 - mrt;
+                                                                       if (mrt % 10)
+                                                                               mrt += 10; // round a little bit
+                                                                       mrt *= 2000;  // (we assume a very slow rotor with just 0.5 degree per second here)
+                                                                       mrt /= 10000;
+                                                                       mrt += 3; // a little bit overhead
+                                                               }
                                                                doSetVoltageToneFrontend=false;
                                                                doSetFrontend=false;
                                                                eSecCommand::rotor cmd;
@@ -827,37 +840,40 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                                                                sec_sequence.push_back( eSecCommand(eSecCommand::INVALIDATE_CURRENT_ROTORPARMS) );
                                                                sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_MOVING) );
                                                                sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) );
-       
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 1000) ); // sleep one second before change voltage or tone
+
                                                                compare.voltage = voltage;
                                                                compare.steps = +3;
                                                                sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) ); // correct final voltage?
                                                                sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 2000) );  // wait 2 second before set high voltage
                                                                sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, voltage) );
-       
+
                                                                compare.tone = tone;
                                                                sec_sequence.push_back( eSecCommand(eSecCommand::IF_TONE_GOTO, compare) );
                                                                sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, tone) );
                                                                sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_FINAL_CONT_TONE_CHANGE]) );
-                                                               sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND) );
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND, 0) );
        
                                                                cmd.direction=1;  // check for running rotor
                                                                cmd.deltaA=0;
-                                                               cmd.steps=+3;
+                                                               cmd.steps = +3;
                                                                cmd.okcount=0;
-                                                               sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, m_params[MOTOR_RUNNING_TIMEOUT]*4) );  // 2 minutes running timeout
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, mrt*4) );  // mrt is in seconds... our SLEEP time is 250ms.. so * 4
                                                                sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 250) );  // 250msec delay
                                                                sec_sequence.push_back( eSecCommand(eSecCommand::IF_TUNER_LOCKED_GOTO, cmd ) );
-                                                               sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +3 ) ); 
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +5 ) );
                                                                sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -3) );  // goto loop start
                                                                sec_sequence.push_back( eSecCommand(eSecCommand::UPDATE_CURRENT_ROTORPARAMS) );
                                                                sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_STOPPED) );
-                                                               sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, +3) );
-                                                               sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND) );
-                                                               sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -4) );
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, +4) );
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::START_TUNE_TIMEOUT, tunetimeout) );
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND, 1) );
+                                                               sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -5) );
                                                        }
+                                                       eDebug("set rotor timeout to %d seconds", mrt);
+                                                       sec_fe->setData(eDVBFrontend::NEW_ROTOR_CMD, RotorCmd);
+                                                       sec_fe->setData(eDVBFrontend::NEW_ROTOR_POS, sat.orbital_position);
                                                }
-                                               sec_fe->setData(eDVBFrontend::NEW_ROTOR_CMD, RotorCmd);
-                                               sec_fe->setData(eDVBFrontend::NEW_ROTOR_POS, sat.orbital_position);
                                        }
                                }
                        }
@@ -918,14 +934,13 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                        if (doSetFrontend)
                        {
                                sec_sequence.push_back( eSecCommand(eSecCommand::START_TUNE_TIMEOUT, tunetimeout) );
-                               sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND) );
-                       }
-                               
-                       if (forceStaticMode)
-                       {
-                               sec_sequence.push_front( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeStatic) );
-                               sec_sequence.push_back( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeDynamic) );
+                               sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND, 1) );
                        }
+
+                       sec_sequence.push_front( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeStatic) );
+                       sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 500) );
+                       sec_sequence.push_back( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeDynamic) );
+
                        frontend.setSecSequence(sec_sequence);
 
                        return 0;