- fix event info
[enigma2.git] / lib / dvb / sec.cpp
index e8c6b479a0f7732eb8aa3b2e948ba4e48ce7433d..78e5949e4e7be3bcbe933fb09958965c3efeb674 100644 (file)
+#include <config.h>
 #include <lib/dvb/sec.h>
-#include <linux/dvb/frontend.h>
+#if HAVE_DVB_API_VERSION < 3
+#define INVERSION Inversion
+#define FREQUENCY Frequency
+#define FEC_INNER FEC_inner
+#define SYMBOLRATE SymbolRate
+#else
+#define INVERSION inversion
+#define FREQUENCY frequency
+#define FEC_INNER fec_inner
+#define SYMBOLRATE symbol_rate
+#endif
 #include <lib/base/eerror.h>
 
 DEFINE_REF(eDVBSatelliteEquipmentControl);
 
-eDVBSatelliteEquipmentControl::eDVBSatelliteEquipmentControl(): ref(0)
+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 = 10607000;
+       lnb_ref.m_lof_lo = 9750000;
+       lnb_ref.m_lof_threshold = 11700000;
+
+       diseqc_ref.m_diseqc_mode = eDVBSatelliteDiseqcParameters::V1_0;
+       diseqc_ref.m_commited_cmd = eDVBSatelliteDiseqcParameters::BB;
+       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;
 }
 
-RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, struct dvb_frontend_parameters &parm, eDVBFrontendParametersSatellite &sat)
+RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, eDVBFrontendParametersSatellite &sat)
 {
-       int hi;
-       eDebug("(very) ugly and hardcoded eDVBSatelliteEquipmentControl");
-       
-       if (sat.frequency > 11700000)
-               hi = 1;
-       else
-               hi = 0;
-       
-       if (hi)
-               parm.frequency = sat.frequency - 10600000;
-       else
-               parm.frequency = sat.frequency -  9750000;
-       
-//     frontend.sentDiseqc(...);
-
-       parm.inversion = (!sat.inversion) ? INVERSION_ON : INVERSION_OFF;
-
-       switch (sat.fec)
+       std::list<eDVBSatelliteLNBParameters>::iterator it = m_lnblist.begin();
+       for (;it != m_lnblist.end(); ++it )
        {
-//             case 1:
-//             case ...:
-       default:
-               parm.u.qpsk.fec_inner = FEC_AUTO;
-               break;
+               eDVBSatelliteLNBParameters &lnb_param = *it;
+               std::map<int, eDVBSatelliteParameters>::iterator sit =
+                       lnb_param.m_satellites.find(sat.orbital_position);
+               if ( sit != lnb_param.m_satellites.end())
+               {
+                       int hi=0;
+                       int voltage = iDVBFrontend::voltageOff;
+                       int tone = iDVBFrontend::toneOff;
+
+                       eDVBSatelliteDiseqcParameters &di_param = sit->second.m_diseqc_parameters;
+                       eDVBSatelliteSwitchParameters &sw_param = sit->second.m_switch_parameters;
+
+                       if ( sat.frequency > lnb_param.m_lof_threshold )
+                               hi = 1;
+
+                       if (hi)
+                               parm.FREQUENCY = sat.frequency - lnb_param.m_lof_hi;
+                       else
+                               parm.FREQUENCY = sat.frequency - lnb_param.m_lof_lo;
+
+                       parm.INVERSION = (!sat.inversion) ? INVERSION_ON : INVERSION_OFF;
+
+                       switch (sat.fec)
+                       {
+               //              case 1:
+               //              case ...:
+                       default:
+                               parm.u.qpsk.FEC_INNER = FEC_AUTO;
+                               break;
+                       }
+
+                       parm.u.qpsk.SYMBOLRATE = sat.symbol_rate;
+
+                       if ( sw_param.m_voltage_mode == eDVBSatelliteSwitchParameters::_14V
+                               || ( sat.polarisation == eDVBFrontendParametersSatellite::Polarisation::Vertical
+                                       && sw_param.m_voltage_mode == eDVBSatelliteSwitchParameters::HV )  )
+                               voltage = iDVBFrontend::voltage13;
+                       else if ( sw_param.m_voltage_mode == eDVBSatelliteSwitchParameters::_18V
+                               || ( sat.polarisation == eDVBFrontendParametersSatellite::Polarisation::Horizontal
+                                       && sw_param.m_voltage_mode == eDVBSatelliteSwitchParameters::HV )  )
+                               voltage = iDVBFrontend::voltage18;
+
+                       if ( (sw_param.m_22khz_signal == eDVBSatelliteSwitchParameters::ON)
+                               || ( sw_param.m_22khz_signal == eDVBSatelliteSwitchParameters::HILO && hi ) )
+                               tone = iDVBFrontend::toneOn;
+                       else if ( (sw_param.m_22khz_signal == eDVBSatelliteSwitchParameters::OFF)
+                               || ( sw_param.m_22khz_signal == eDVBSatelliteSwitchParameters::HILO && !hi ) )
+                               tone = iDVBFrontend::toneOff;
+
+                       eSecCommandList sec_sequence;
+
+                       if ( di_param.m_diseqc_mode == eDVBSatelliteDiseqcParameters::V1_2 )
+                       {
+                               eDebug("rotor...");
+                       }
+                       else if (di_param.m_diseqc_mode >= eDVBSatelliteDiseqcParameters::V1_0)
+                       {
+                               if ( di_param.m_commited_cmd < eDVBSatelliteDiseqcParameters::SENDNO ||
+                                       di_param.m_toneburst_param != eDVBSatelliteDiseqcParameters::NO )
+                               {
+                                       sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, iDVBFrontend::toneOff) );
+                                       sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, voltage) );
+                                       sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 30) );
+                               }
+
+                               if ( di_param.m_commited_cmd < eDVBSatelliteDiseqcParameters::SENDNO )
+                               {
+                                       eDVBDiseqcCommand diseqc;
+                                       diseqc.len = 4;
+                                       diseqc.data[0] = 0xe0;
+                                       diseqc.data[1] = 0x10;
+                                       diseqc.data[2] = 0x38;
+                                       diseqc.data[3] = 0xF0 | (di_param.m_commited_cmd << 2);
+
+                                       if (hi)
+                                               diseqc.data[3] |= 1;
+
+                                       if (sat.polarisation == eDVBFrontendParametersSatellite::Polarisation::Horizontal)
+                                               diseqc.data[3] |= 2;
+
+                                       sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) );
+                                       sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 30) );
+                               }
+
+                               if ( di_param.m_toneburst_param != eDVBSatelliteDiseqcParameters::NO )
+                               {
+                                       sec_sequence.push_back( eSecCommand(eSecCommand::SEND_TONEBURST, di_param.m_toneburst_param) );
+                                       sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 30) );
+                               }
+                       }
+                       else
+                       {
+                               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) );
+
+                       frontend.setSecSequence(sec_sequence);
+
+                       return 0;
+               }
        }
-       parm.u.qpsk.symbol_rate = sat.symbol_rate;
-       
-
-       frontend.setVoltage((sat.polarisation == eDVBFrontendParametersSatellite::Polarisation::Vertical) ? iDVBFrontend::voltage13 : iDVBFrontend::voltage18);
-
-       eDVBDiseqcCommand diseqc;
-       
-       diseqc.len = 4;
-       diseqc.data[0] = 0xe0;
-       diseqc.data[1] = 0x10;
-       diseqc.data[2] = 0x38;
-       diseqc.data[3] = 0xF0;
-       
-       if (hi)
-               diseqc.data[3] |= 1;
-               
-       if (sat.polarisation == eDVBFrontendParametersSatellite::Polarisation::Horizontal)
-               diseqc.data[3] |= 2;
-
-       frontend.sendDiseqc(diseqc);
-       frontend.setTone(hi ? iDVBFrontend::toneOn : iDVBFrontend::toneOff);
-       
-       return 0;
+
+       eDebug("not found satellite configuration for orbital position (%d)", sat.orbital_position );
+
+       return -1;
 }