4.3.1r21
[enigma2.git] / usr / include / enigma2 / lib / dvb / frontend.h
1 #ifndef __dvb_frontend_h
2 #define __dvb_frontend_h
3
4 #include <lib/base/message.h>
5 #include <lib/base/thread.h>
6 #include <lib/dvb/idvb.h>
7 #include <linux/dvb/frontend.h>
8
9 #ifdef SWIG
10 %feature("notabstract") eDVBFrontendParameters;
11 #endif
12
13 class eDVBFrontendParameters: public iDVBFrontendParameters
14 {
15         DECLARE_REF(eDVBFrontendParameters);
16         union
17         {
18                 eDVBFrontendParametersSatellite sat;
19                 eDVBFrontendParametersCable cable;
20                 eDVBFrontendParametersTerrestrial terrestrial;
21         };
22         int m_types;
23         int m_flags;
24 public:
25         eDVBFrontendParameters();
26         ~eDVBFrontendParameters()
27         {
28         }
29
30         SWIG_VOID(RESULT) getSystem(int &SWIG_OUTPUT) const;
31         SWIG_VOID(RESULT) getDVBS(eDVBFrontendParametersSatellite &SWIG_OUTPUT) const;
32         SWIG_VOID(RESULT) getDVBC(eDVBFrontendParametersCable &SWIG_OUTPUT) const;
33         SWIG_VOID(RESULT) getDVBT(eDVBFrontendParametersTerrestrial &SWIG_OUTPUT) const;
34
35         RESULT setDVBS(const eDVBFrontendParametersSatellite &p, bool no_rotor_command_on_tune=false);
36         RESULT setDVBC(const eDVBFrontendParametersCable &p);
37         RESULT setDVBT(const eDVBFrontendParametersTerrestrial &p);
38         SWIG_VOID(RESULT) getFlags(unsigned int &SWIG_NAMED_OUTPUT(flags)) const { flags = m_flags; return 0; }
39         RESULT setFlags(unsigned int flags) { m_flags = flags; return 0; }
40 #ifndef SWIG
41         RESULT calculateDifference(const iDVBFrontendParameters *parm, int &, bool exact) const;
42
43         RESULT getHash(unsigned long &) const;
44         RESULT calcLockTimeout(unsigned int &) const;
45 #endif
46 };
47
48 #ifndef SWIG
49
50 #include <lib/dvb/sec.h>
51 class eSecCommandList;
52
53 class eDVBFrontend: public iDVBFrontend, public eThread, public eMainloop_native, public sigc::trackable
54 {
55 public:
56         enum {
57                 NEW_CSW,
58                 NEW_UCSW,
59                 NEW_TONEBURST,
60                 CSW,                  // state of the committed switch
61                 UCSW,                 // state of the uncommitted switch
62                 TONEBURST,            // current state of toneburst switch
63                 NEW_ROTOR_CMD,        // prev sent rotor cmd
64                 NEW_ROTOR_POS,        // new rotor position (not validated)
65                 ROTOR_CMD,            // completed rotor cmd (finalized)
66                 ROTOR_POS,            // current rotor position
67                 ROTOR_PENDING,        // rotor cmd pending
68                 LINKED_PREV_PTR,      // prev double linked list (for linked FEs)
69                 LINKED_NEXT_PTR,      // next double linked list (for linked FEs)
70                 SATPOS_DEPENDS_IDX,   // pointer to FE with configured rotor (with twin/quattro lnb)
71                 FREQ_OFFSET,          // frequency offset for tuned transponder
72                 CUR_DVBS_VOLTAGE,     // current dvb-s(2) voltage
73                 CUR_DVBT_VOLTAGE,     // current dvb-t voltage
74                 CUR_TONE,             // current continuous tone
75                 SATCR,                // current SatCR
76                 NUM_DATA_ENTRIES
77         };
78         eSignal1<void, iDVBFrontend*> m_stateChanged;
79         sigc::signal0<void> m_inputChanged;
80         friend eDVBRegisteredFrontend;
81 private:
82         DECLARE_REF(eDVBFrontend);
83         bool m_dvbt_5V_via_proc;
84         bool m_simulate;
85         int m_types_enabled; // set from python
86         int m_types;
87         eDVBFrontend *m_simulate_fe; // only used to set frontend type in dvb.cpp
88         int m_dvbid;
89         int m_slotid;
90
91         /* for multi channel frontends with multiple inputs */
92         int m_num_inputs; // number of inputs (-1 for normal tuner)
93         int m_input; // selected input (-1 for normal tuner)
94         int m_slotid_first_channel;
95         int m_slotid_last_channel; // only valid when m_slotid_first_channel is != -1
96         int m_best_link_slot;
97
98         int m_fd;
99         bool m_forced_timeout;
100         bool m_rotor_mode;
101         bool m_need_rotor_workaround;
102         bool m_seen_first_event;
103         bool m_dvb_t2_auto_delsys;
104         bool m_dvb_s2_auto_delsys;
105         bool m_can_s2_multistream;
106         char m_filename[128];
107         char m_description[128];
108         static int dvb_api_minor;
109         dvb_frontend_parameters parm;
110         typedef struct {
111                 eDVBFrontendParametersSatellite sat;
112                 eDVBFrontendParametersCable cab;
113                 eDVBFrontendParametersTerrestrial ter;
114                 int type;
115         } fe_parm_t;
116
117         fe_parm_t oparm, newparm;
118
119         int m_state;
120         ePtr<iDVBSatelliteEquipmentControl> m_sec;
121         ePtr<eSocketNotifier> m_sn;
122         int m_tuning;
123         ePtr<eTimer> m_timeoutTimer, m_tuneTimer, m_lostLockTimer;
124         unsigned int m_sec_lock; // this is a bitmask (1 << m_dvbid)
125
126         eSecCommandList m_sec_sequence;
127
128         long m_data[NUM_DATA_ENTRIES];
129
130         int m_idleInputpower[2];  // 13V .. 18V
131         int m_runningInputpower;
132
133         int m_timeoutCount; // needed for timeout
134         int m_retryCount; // diseqc retry for rotor
135
136         bool m_ml_running;
137         eSingleLock m_sec_mutex, m_sec_lock_mutex;
138         eFixedMessagePump<int> m_pump, m_thread_pump;
139         void thread();
140         void gotMessage(int);
141
142         void feEvent(int);
143         void timeout();
144         void lostLock(); // called by m_lostLockTimer
145         void tuneLoop();  // called by m_tuneTimer from tune thread
146         int tuneLoopInt();
147         void setFrontend(bool recvEvents=true);
148         bool setSecSequencePos(int steps);
149         static int PriorityOrder;
150 public:
151         eDVBFrontend(int adap, int fe, int &ok, bool simulate=false, eDVBFrontend *simulate_fe=NULL);
152         virtual ~eDVBFrontend();
153
154         int readInputpower();
155         RESULT getFrontendType(int &type);
156         RESULT getTunedType(int &type);
157         RESULT tune(const iDVBFrontendParameters &where);
158         RESULT prepare_sat(const eDVBFrontendParametersSatellite &, unsigned int timeout);
159         RESULT prepare_cable(const eDVBFrontendParametersCable &);
160         RESULT prepare_terrestrial(const eDVBFrontendParametersTerrestrial &);
161         RESULT connectStateChange(const sigc::slot1<void,iDVBFrontend*> &stateChange, ePtr<eConnection> &connection);
162         RESULT getState(int &state);
163         RESULT setTone(int tone);
164         RESULT setVoltage(int voltage, iDVBFrontend *child_fe=NULL);
165         RESULT sendDiseqc(const eDVBDiseqcCommand &diseqc);
166         RESULT sendToneburst(int burst);
167         RESULT setSEC(iDVBSatelliteEquipmentControl *sec);
168         RESULT setSecSequence(eSecCommandList &list);
169         RESULT getData(int num, long &data);
170         RESULT setData(int num, long val);
171
172         int readFrontendData(int type); // bitErrorRate, signalPower, signalQualitydB, signalQuality, locked, synced
173         RESULT getFrontendStatus(FrontendDataMap &dest);
174         RESULT getTransponderData(FrontendDataMap &dest, bool original);
175         RESULT getFrontendData(FrontendDataMap &dest);
176         eSignal1<void, iDVBFrontend*> &getStateChangeSignal();
177
178         int isCompatibleWith(ePtr<iDVBFrontendParameters> &feparm);
179         int getDVBID() const { return m_dvbid; }
180         int getSlotID() const { return m_slotid; }
181         bool setSlotInfo(std::tuple<int, std::string, int, int, std::string, int, int>&); // get a tuple (slotid, slotdescr, enabled, dvbid, input_name, slotid_first_channel, slotid_last_channel)
182         static void setTypePriorityOrder(int val) { PriorityOrder = val; }
183         static int getTypePriorityOrder() { return PriorityOrder; }
184
185         /* for multi channel frontends with multiple inputs */
186         int getNumInputs();
187         int getInput() const { return m_input; }
188         int getFirstChannelSlotID() const { return m_slotid_first_channel; }
189         int getLastChannelSlotID() const { return m_slotid_last_channel; }
190         void setBestLinkSlotID(int slot) { m_best_link_slot = slot; }
191         int getBestLinkSlotID() const { return m_best_link_slot; }
192         void dynamicUnlink();
193
194         void reopenFrontend();
195         int openFrontend();
196         int closeFrontend(bool force=false, bool no_delayed=false);
197         void preClose();
198         const char *getDescription() const { return m_description; }
199         bool is_simulate() const { return m_simulate; }
200
201         int getCapabilities() const;
202 };
203
204 #endif // SWIG
205 #endif