more complete lamedb (Astra 19.2 and Hotbird 13.0) ( Astra 19.2 is DiSEqC AA Hotbird...
[enigma2.git] / lib / dvb / sec.cpp
index edecca902fa12bc779d4d9a8703514cbc6e32cf7..a964b75ece43501db15c09ac1632909e9e4cfccd 100644 (file)
@@ -20,26 +20,62 @@ DEFINE_REF(eDVBSatelliteEquipmentControl);
 eDVBSatelliteEquipmentControl::eDVBSatelliteEquipmentControl()
 {
        m_lnblist.push_back(eDVBSatelliteLNBParameters());
-       eDVBSatelliteLNBParameters &lnb_ref = m_lnblist.front();
-       eDVBSatelliteParameters &astra1 = lnb_ref.m_satellites[192];
-       eDVBSatelliteDiseqcParameters &diseqc_ref = astra1.m_diseqc_parameters;
-       eDVBSatelliteSwitchParameters &switch_ref = astra1.m_switch_parameters;
-
-       lnb_ref.m_lof_hi = 10600000;
-       lnb_ref.m_lof_lo = 9750000;
-       lnb_ref.m_lof_threshold = 11700000;
-
-       diseqc_ref.m_diseqc_mode = eDVBSatelliteDiseqcParameters::V1_0;
-       diseqc_ref.m_committed_cmd = eDVBSatelliteDiseqcParameters::AA;
-       diseqc_ref.m_repeats = 0;
-       diseqc_ref.m_seq_repeat = false;
-       diseqc_ref.m_swap_cmds = false;
-       diseqc_ref.m_toneburst_param = eDVBSatelliteDiseqcParameters::NO;
-       diseqc_ref.m_uncommitted_cmd = 0;
-       diseqc_ref.m_use_fast = 1;
-
-       switch_ref.m_22khz_signal = eDVBSatelliteSwitchParameters::HILO;
-       switch_ref.m_voltage_mode = eDVBSatelliteSwitchParameters::HV;
+       eDVBSatelliteLNBParameters &lnb1_ref = m_lnblist.back();
+       eDVBSatelliteDiseqcParameters &diseqc1_ref = lnb1_ref.m_diseqc_parameters;
+
+/*
+       eDVBSatelliteRotorParameters &rotor_ref = lnb1_ref.m_rotor_parameters;
+       eDVBSatelliteRotorParameters::eDVBSatelliteRotorInputpowerParameters &rotor_input_ref = rotor_ref.m_inputpower_parameters;
+       eDVBSatelliteRotorParameters::eDVBSatelliteRotorGotoxxParameters &rotor_gotoxx_ref = rotor_ref.m_gotoxx_parameters;
+
+       rotor_input_ref.m_use = true;
+       rotor_input_ref.m_threshold = 50;
+
+       rotor_gotoxx_ref.m_can_use = true;
+       rotor_gotoxx_ref.m_lo_direction = eDVBSatelliteRotorParameters::EAST;
+       rotor_gotoxx_ref.m_la_direction = eDVBSatelliteRotorParameters::NORTH;
+       rotor_gotoxx_ref.m_longitude = 8.683;
+       rotor_gotoxx_ref.m_latitude = 51.017;*/
+
+       lnb1_ref.m_lof_hi = 10600000;
+       lnb1_ref.m_lof_lo = 9750000;
+       lnb1_ref.m_lof_threshold = 11700000;
+
+       diseqc1_ref.m_diseqc_mode = eDVBSatelliteDiseqcParameters::V1_0;
+       diseqc1_ref.m_committed_cmd = eDVBSatelliteDiseqcParameters::AA;
+       diseqc1_ref.m_repeats = 0;
+       diseqc1_ref.m_seq_repeat = false;
+       diseqc1_ref.m_swap_cmds = false;
+       diseqc1_ref.m_toneburst_param = eDVBSatelliteDiseqcParameters::NO;
+       diseqc1_ref.m_uncommitted_cmd = 0;
+       diseqc1_ref.m_use_fast = 0;
+
+       eDVBSatelliteSwitchParameters &astra_ref = lnb1_ref.m_satellites[192];
+       astra_ref.m_22khz_signal = eDVBSatelliteSwitchParameters::HILO;
+       astra_ref.m_voltage_mode = eDVBSatelliteSwitchParameters::HV;
+
+// HOTBIRD
+
+       m_lnblist.push_back(eDVBSatelliteLNBParameters());
+       eDVBSatelliteLNBParameters &lnb2_ref = m_lnblist.back();
+       eDVBSatelliteDiseqcParameters &diseqc2_ref = lnb2_ref.m_diseqc_parameters;
+
+       lnb2_ref.m_lof_hi = 10600000;
+       lnb2_ref.m_lof_lo = 9750000;
+       lnb2_ref.m_lof_threshold = 11700000;
+
+       diseqc2_ref.m_diseqc_mode = eDVBSatelliteDiseqcParameters::V1_0;
+       diseqc2_ref.m_committed_cmd = eDVBSatelliteDiseqcParameters::AB;
+       diseqc2_ref.m_repeats = 0;
+       diseqc2_ref.m_seq_repeat = false;
+       diseqc2_ref.m_swap_cmds = false;
+       diseqc1_ref.m_toneburst_param = eDVBSatelliteDiseqcParameters::NO;
+       diseqc2_ref.m_uncommitted_cmd = 0;
+       diseqc2_ref.m_use_fast = 0;
+
+       eDVBSatelliteSwitchParameters &hotbird_ref = lnb2_ref.m_satellites[130];
+       hotbird_ref.m_22khz_signal = eDVBSatelliteSwitchParameters::HILO;
+       hotbird_ref.m_voltage_mode = eDVBSatelliteSwitchParameters::HV;
 }
 
 RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, eDVBFrontendParametersSatellite &sat)
@@ -48,13 +84,15 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
        for (;it != m_lnblist.end(); ++it )
        {
                eDVBSatelliteLNBParameters &lnb_param = *it;
-               std::map<int, eDVBSatelliteParameters>::iterator sit =
+               eDVBSatelliteDiseqcParameters &di_param = lnb_param.m_diseqc_parameters;
+               eDVBSatelliteRotorParameters &rotor_param = lnb_param.m_rotor_parameters;
+
+               std::map<int, eDVBSatelliteSwitchParameters>::iterator sit =
                        lnb_param.m_satellites.find(sat.orbital_position);
                if ( sit != lnb_param.m_satellites.end())
                {
-                       eDVBSatelliteDiseqcParameters &di_param = sit->second.m_diseqc_parameters;
-                       eDVBSatelliteSwitchParameters &sw_param = sit->second.m_switch_parameters;
-                       eDVBSatelliteRotorParameters &rotor_param = sit->second.m_rotor_parameters;
+                       eDVBSatelliteSwitchParameters &sw_param = sit->second;
+
                        int hi=0,
                                voltage = iDVBFrontend::voltageOff,
                                tone = iDVBFrontend::toneOff,
@@ -70,8 +108,8 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                        frontend.getData(0, lastcsw);
                        frontend.getData(1, lastucsw);
                        frontend.getData(2, lastToneburst);
-                       frontend.getData(3, lastRotorCmd);
-                       frontend.getData(4, curRotorPos);
+                       frontend.getData(5, lastRotorCmd);
+                       frontend.getData(6, curRotorPos);
 
                        if ( sat.frequency > lnb_param.m_lof_threshold )
                                hi = 1;
@@ -127,7 +165,6 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                                tone = iDVBFrontend::toneOff;
 
                        eSecCommandList sec_sequence;
-                       bool setVoltage=true;
 
                        if (di_param.m_diseqc_mode >= eDVBSatelliteDiseqcParameters::V1_0)
                        {
@@ -165,9 +202,12 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                                if ( send_diseqc || changed_burst )
                                {
                                        sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, iDVBFrontend::toneOff) );
+                                       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) );
-                                       sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 30) );  // standard says 15 msek here
-                                       setVoltage=false;
+                                       sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) ); 
                                }
 
                                if ( send_diseqc )
@@ -307,6 +347,25 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                                        }
                                        if ( RotorCmd != lastRotorCmd )
                                        {
+                                               if ( changed_burst || send_diseqc )
+                                               {
+                                                       // override first voltage change
+                                                       *(++(++sec_sequence.begin()))=eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage13);
+                                                       // 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 50msec after voltage 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, iDVBFrontend::voltage13) );
+                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) );  // wait 50msec after voltage change
+                                               }
+
                                                eDVBDiseqcCommand diseqc;
                                                diseqc.data[0] = 0xE0;
                                                diseqc.data[1] = 0x31;          // positioner
@@ -323,10 +382,48 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                                                        diseqc.data[2] = 0x6B;  // goto stored sat position
                                                        diseqc.data[3] = RotorCmd;
                                                }
+
                                                if ( rotor_param.m_inputpower_parameters.m_use )
                                                { // use measure rotor input power to detect rotor state
-                                                       sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_IDLE_INPUTPOWER) );
+                                                       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, iDVBFrontend::voltage18) );
+                                                       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, iDVBFrontend::voltage13) ); // 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
+// 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_threshold;
+                                                       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, +11 ) );  // timeout ?
+                                                       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, iDVBFrontend::voltage18) );
+                                                       sec_sequence.push_back( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeDynamic) );
+// 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 ?
+                                                       sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -4) );  // running loop start
+/////////////////////
+                                                       sec_sequence.push_back( eSecCommand(eSecCommand::UPDATE_CURRENT_ROTORPARAMS) );
                                                        frontend.setData(3, RotorCmd);
                                                        frontend.setData(4, sat.orbital_position);
                                                }
@@ -336,11 +433,12 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                                }
                        }
 
-                       if ( setVoltage )
-                       {
-                               sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, voltage) );
-                               sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 10) );
-                       }
+                       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) );
+                       sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 10) );
 
                        sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, tone) );
                        sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 15) );