enigma2: 4.3.1r16
[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 private:
80         DECLARE_REF(eDVBFrontend);
81         bool m_dvbt_5V_via_proc;
82         bool m_simulate;
83         int m_types_enabled; // set from python
84         int m_types;
85         eDVBFrontend *m_simulate_fe; // only used to set frontend type in dvb.cpp
86         int m_dvbid;
87         int m_slotid;
88
89         /* for multi channel frontends with multiple inputs */
90         int m_input; // selected input (-1 for normal tuner)
91         int m_slotid_first_channel;
92         int m_slotid_last_channel; // only valid when m_slotid_first_channel is != -1
93         int m_best_link_slot;
94
95         int m_fd;
96         bool m_forced_timeout;
97         bool m_rotor_mode;
98         bool m_need_rotor_workaround;
99         bool m_seen_first_event;
100         bool m_dvb_t2_auto_delsys;
101         bool m_dvb_s2_auto_delsys;
102         char m_filename[128];
103         char m_description[128];
104         static int dvb_api_minor;
105         dvb_frontend_parameters parm;
106         typedef struct {
107                 eDVBFrontendParametersSatellite sat;
108                 eDVBFrontendParametersCable cab;
109                 eDVBFrontendParametersTerrestrial ter;
110                 int type;
111         } fe_parm_t;
112
113         fe_parm_t oparm, newparm;
114
115         int m_state;
116         ePtr<iDVBSatelliteEquipmentControl> m_sec;
117         ePtr<eSocketNotifier> m_sn;
118         int m_tuning;
119         ePtr<eTimer> m_timeoutTimer, m_tuneTimer, m_lostLockTimer;
120         unsigned int m_sec_lock; // this is a bitmask (1 << m_dvbid)
121
122         eSecCommandList m_sec_sequence;
123
124         long m_data[NUM_DATA_ENTRIES];
125
126         int m_idleInputpower[2];  // 13V .. 18V
127         int m_runningInputpower;
128
129         int m_timeoutCount; // needed for timeout
130         int m_retryCount; // diseqc retry for rotor
131
132         bool m_ml_running;
133         eSingleLock m_sec_mutex, m_sec_lock_mutex;
134         eFixedMessagePump<int> m_pump, m_thread_pump;
135         void thread();
136         void gotMessage(int);
137
138         void feEvent(int);
139         void timeout();
140         void lostLock(); // called by m_lostLockTimer
141         void tuneLoop();  // called by m_tuneTimer from tune thread
142         int tuneLoopInt();
143         void setFrontend(bool recvEvents=true);
144         bool setSecSequencePos(int steps);
145         static int PriorityOrder;
146 public:
147         eDVBFrontend(int adap, int fe, int &ok, bool simulate=false, eDVBFrontend *simulate_fe=NULL);
148         virtual ~eDVBFrontend();
149
150         int readInputpower();
151         RESULT getFrontendType(int &type);
152         RESULT getTunedType(int &type);
153         RESULT tune(const iDVBFrontendParameters &where);
154         RESULT prepare_sat(const eDVBFrontendParametersSatellite &, unsigned int timeout);
155         RESULT prepare_cable(const eDVBFrontendParametersCable &);
156         RESULT prepare_terrestrial(const eDVBFrontendParametersTerrestrial &);
157         RESULT connectStateChange(const sigc::slot1<void,iDVBFrontend*> &stateChange, ePtr<eConnection> &connection);
158         RESULT getState(int &state);
159         RESULT setTone(int tone);
160         RESULT setVoltage(int voltage, iDVBFrontend *child_fe=NULL);
161         RESULT sendDiseqc(const eDVBDiseqcCommand &diseqc);
162         RESULT sendToneburst(int burst);
163         RESULT setSEC(iDVBSatelliteEquipmentControl *sec);
164         RESULT setSecSequence(eSecCommandList &list);
165         RESULT getData(int num, long &data);
166         RESULT setData(int num, long val);
167
168         int readFrontendData(int type); // bitErrorRate, signalPower, signalQualitydB, signalQuality, locked, synced
169         RESULT getFrontendStatus(FrontendDataMap &dest);
170         RESULT getTransponderData(FrontendDataMap &dest, bool original);
171         RESULT getFrontendData(FrontendDataMap &dest);
172         eSignal1<void, iDVBFrontend*> &getStateChangeSignal();
173
174         int isCompatibleWith(ePtr<iDVBFrontendParameters> &feparm);
175         int getDVBID() const { return m_dvbid; }
176         int getSlotID() const { return m_slotid; }
177         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)
178         static void setTypePriorityOrder(int val) { PriorityOrder = val; }
179         static int getTypePriorityOrder() { return PriorityOrder; }
180
181         /* for multi channel frontends with multiple inputs */
182         int getInput() const { return m_input; }
183         int getFirstChannelSlotID() const { return m_slotid_first_channel; }
184         int getLastChannelSlotID() const { return m_slotid_last_channel; }
185         void setBestLinkSlotID(int slot) { m_best_link_slot = slot; }
186         int getBestLinkSlotID() const { return m_best_link_slot; }
187         void dynamicUnlink();
188
189         void reopenFrontend();
190         int openFrontend();
191         int closeFrontend(bool force=false, bool no_delayed=false);
192         void preClose();
193         const char *getDescription() const { return m_description; }
194         bool is_simulate() const { return m_simulate; }
195 };
196
197 #endif // SWIG
198 #endif