add satconfig part
[enigma2.git] / lib / dvb / sec.cpp
1 #include <config.h>
2 #include <lib/dvb/sec.h>
3 #if HAVE_DVB_API_VERSION < 3
4 #include <ost/frontend.h>
5 #define INVERSION Inversion
6 #define FREQUENCY Frequency
7 #define FEC_INNER FEC_inner
8 #define SYMBOLRATE SymbolRate
9 #else
10 #include <linux/dvb/frontend.h>
11 #define INVERSION inversion
12 #define FREQUENCY frequency
13 #define FEC_INNER fec_inner
14 #define SYMBOLRATE symbol_rate
15 #endif
16 #include <lib/base/eerror.h>
17
18 DEFINE_REF(eDVBSatelliteEquipmentControl);
19
20 eDVBSatelliteEquipmentControl::eDVBSatelliteEquipmentControl()
21 {
22         m_lnblist.push_back(eDVBSatelliteLNBParameters());
23         eDVBSatelliteLNBParameters &lnb_ref = m_lnblist.front();
24         eDVBSatelliteParameters &astra1 = lnb_ref.m_satellites[192];
25         eDVBSatelliteDiseqcParameters &diseqc_ref = astra1.m_diseqc_parameters;
26         eDVBSatelliteSwitchParameters &switch_ref = astra1.m_switch_parameters;
27
28         lnb_ref.m_lof_hi = 10600000;
29         lnb_ref.m_lof_lo = 9750000;
30         lnb_ref.m_lof_threshold = 11700000;
31
32         diseqc_ref.m_diseqc_mode = eDVBSatelliteDiseqcParameters::V1_0;
33         diseqc_ref.m_commited_cmd = eDVBSatelliteDiseqcParameters::BB;
34         diseqc_ref.m_repeats = 0;
35         diseqc_ref.m_seq_repeat = false;
36         diseqc_ref.m_swap_cmds = false;
37         diseqc_ref.m_toneburst_param = eDVBSatelliteDiseqcParameters::NO;
38         diseqc_ref.m_uncommitted_cmd = 0;
39         diseqc_ref.m_use_fast = 1;
40
41         switch_ref.m_22khz_signal = eDVBSatelliteSwitchParameters::HILO;
42         switch_ref.m_voltage_mode = eDVBSatelliteSwitchParameters::HV;
43 }
44
45 RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, eDVBFrontendParametersSatellite &sat)
46 {
47         std::list<eDVBSatelliteLNBParameters>::iterator it = m_lnblist.begin();
48         for (;it != m_lnblist.end(); ++it )
49         {
50                 eDVBSatelliteLNBParameters &lnb_param = *it;
51                 std::map<int, eDVBSatelliteParameters>::iterator sit =
52                         lnb_param.m_satellites.find(sat.orbital_position);
53                 if ( sit != lnb_param.m_satellites.end())
54                 {
55                         int hi=0;
56                         int voltage = iDVBFrontend::voltageOff;
57                         int tone = iDVBFrontend::toneOff;
58
59                         eDVBSatelliteDiseqcParameters &di_param = sit->second.m_diseqc_parameters;
60                         eDVBSatelliteSwitchParameters &sw_param = sit->second.m_switch_parameters;
61
62                         if ( sat.frequency > lnb_param.m_lof_threshold )
63                                 hi = 1;
64
65                         if (hi)
66                                 parm.FREQUENCY = sat.frequency - lnb_param.m_lof_hi;
67                         else
68                                 parm.FREQUENCY = sat.frequency - lnb_param.m_lof_lo;
69
70                         parm.INVERSION = (!sat.inversion) ? INVERSION_ON : INVERSION_OFF;
71
72                         switch (sat.fec)
73                         {
74                 //              case 1:
75                 //              case ...:
76                         default:
77                                 parm.u.qpsk.FEC_INNER = FEC_AUTO;
78                                 break;
79                         }
80
81                         parm.u.qpsk.SYMBOLRATE = sat.symbol_rate;
82
83                         if ( sw_param.m_voltage_mode == eDVBSatelliteSwitchParameters::_14V
84                                 || ( sat.polarisation == eDVBFrontendParametersSatellite::Polarisation::Vertical
85                                         && sw_param.m_voltage_mode == eDVBSatelliteSwitchParameters::HV )  )
86                                 voltage = iDVBFrontend::voltage13;
87                         else if ( sw_param.m_voltage_mode == eDVBSatelliteSwitchParameters::_18V
88                                 || ( sat.polarisation == eDVBFrontendParametersSatellite::Polarisation::Horizontal
89                                         && sw_param.m_voltage_mode == eDVBSatelliteSwitchParameters::HV )  )
90                                 voltage = iDVBFrontend::voltage18;
91
92                         if ( (sw_param.m_22khz_signal == eDVBSatelliteSwitchParameters::ON)
93                                 || ( sw_param.m_22khz_signal == eDVBSatelliteSwitchParameters::HILO && hi ) )
94                                 tone = iDVBFrontend::toneOn;
95                         else if ( (sw_param.m_22khz_signal == eDVBSatelliteSwitchParameters::OFF)
96                                 || ( sw_param.m_22khz_signal == eDVBSatelliteSwitchParameters::HILO && !hi ) )
97                                 tone = iDVBFrontend::toneOff;
98
99                         eDVBDiseqcCommand diseqc;
100
101 #if HAVE_DVB_API_VERSION < 3
102                         diseqc.voltage = voltage;
103                         diseqc.tone = tone;
104 #else
105                         frontend.setVoltage(voltage);
106 #endif
107
108                         if ( di_param.m_commited_cmd < eDVBSatelliteDiseqcParameters::NO )
109                         {
110                                 diseqc.len = 4;
111                                 diseqc.data[0] = 0xe0;
112                                 diseqc.data[1] = 0x10;
113                                 diseqc.data[2] = 0x38;
114                                 diseqc.data[3] = di_param.m_commited_cmd;
115
116                                 if (hi)
117                                         diseqc.data[3] |= 1;
118
119                                 if (sat.polarisation == eDVBFrontendParametersSatellite::Polarisation::Horizontal)
120                                         diseqc.data[3] |= 2;
121                         }
122                         else
123                                 diseqc.len = 0;
124
125                         frontend.sendDiseqc(diseqc);
126
127 #if HAVE_DVB_API_VERSION > 2
128                         frontend.setTone(tone);
129 #endif
130                         return 0;
131                 }
132         }
133
134         eDebug("not found satellite configuration for orbital position (%d)", sat.orbital_position );
135
136         return -1;
137 }
138