openATV enigma2
openATV is an open source SetTopBox Graphical user interface.
dvbci.h
Go to the documentation of this file.
1 #ifndef __dvbci_dvbci_h
2 #define __dvbci_dvbci_h
3 
4 #ifndef SWIG
5 
6 #include <lib/base/ebase.h>
7 #include <lib/service/iservice.h>
8 #ifdef __sh__
9 #include <lib/base/thread.h>
10 #endif
11 #include <lib/python/python.h>
12 #include <set>
13 #include <queue>
14 
15 class eDVBCISession;
18 class eDVBCIMMISession;
20 class eDVBCISlot;
21 class eDVBCIInterfaces;
22 
23 struct queueData
24 {
25  uint8_t prio;
26  unsigned char *data;
27  unsigned int len;
28  queueData( unsigned char *data, unsigned int len, uint8_t prio = 0 )
29  :prio(prio), data(data), len(len)
30  {
31 
32  }
33  bool operator < ( const struct queueData &a ) const
34  {
35  return prio < a.prio;
36  }
37 };
38 
39 typedef std::pair<std::string, uint32_t> providerPair;
40 typedef std::set<providerPair> providerSet;
41 typedef std::set<uint16_t> caidSet;
42 typedef std::set<eServiceReference> serviceSet;
43 
44 #ifdef __sh__
45 /* ********************************** */
46 /* constants taken from dvb-apps
47  */
48 #define T_SB 0x80 // sb primitive h<--m
49 #define T_RCV 0x81 // receive primitive h-->m
50 #define T_CREATE_T_C 0x82 // create transport connection primitive h-->m
51 #define T_C_T_C_REPLY 0x83 // ctc reply primitive h<--m
52 #define T_DELETE_T_C 0x84 // delete tc primitive h<->m
53 #define T_D_T_C_REPLY 0x85 // dtc reply primitive h<->m
54 #define T_REQUEST_T_C 0x86 // request transport connection primitive h<--m
55 #define T_NEW_T_C 0x87 // new tc / reply to t_request primitive h-->m
56 #define T_T_C_ERROR 0x77 // error creating tc primitive h-->m
57 #define T_DATA_LAST 0xA0 // convey data from higher constructed h<->m
58  // layers
59 #define T_DATA_MORE 0xA1 // convey data from higher constructed h<->m
60  // layers
61 
62 typedef enum {eDataTimeout, eDataError, eDataReady, eDataWrite, eDataStatusChanged} eData;
63 
64 static inline int time_after(struct timespec oldtime, uint32_t delta_ms)
65 {
66  // calculate the oldtime + add on the delta
67  uint64_t oldtime_ms = (oldtime.tv_sec * 1000) + (oldtime.tv_nsec / 1000000);
68  oldtime_ms += delta_ms;
69 
70  // calculate the nowtime
71  struct timespec nowtime;
72  clock_gettime(CLOCK_MONOTONIC, &nowtime);
73  uint64_t nowtime_ms = (nowtime.tv_sec * 1000) + (nowtime.tv_nsec / 1000000);
74 
75  // check
76  return nowtime_ms > oldtime_ms;
77 }
78 #endif
79 
80 class eDVBCISlot: public iObject, public sigc::trackable
81 {
82  friend class eDVBCIInterfaces;
83  DECLARE_REF(eDVBCISlot);
84  int slotid;
85  int fd;
86  ePtr<eSocketNotifier> notifier;
87  int state;
88  std::map<uint16_t, uint8_t> running_services;
89  eDVBCIApplicationManagerSession *application_manager;
90  eDVBCICAManagerSession *ca_manager;
91  eDVBCIMMISession *mmi_session;
92  std::priority_queue<queueData> sendqueue;
93  caidSet possible_caids;
94  serviceSet possible_services;
95  providerSet possible_providers;
96  int use_count;
97  eDVBCISlot *linked_next; // needed for linked CI handling
98  std::string current_source;
99  int current_tuner;
100  bool user_mapped;
101  void data(int);
102  bool plugged;
103  eMainloop *m_context;
104 #ifdef __sh__
105  //dagobert
106  char connection_id;
107  bool mmi_active;
108  int receivedLen;
109  unsigned char* receivedData;
110 #endif
111 public:
113  eDVBCISlot(eMainloop *context, int nr);
114  ~eDVBCISlot();
115  void closeDevice();
116  void openDevice();
117 
118  int send(const unsigned char *data, size_t len);
119 
123 
124  eDVBCIApplicationManagerSession *getAppManager() { return application_manager; }
125  eDVBCIMMISession *getMMIManager() { return mmi_session; }
126  eDVBCICAManagerSession *getCAManager() { return ca_manager; }
127 
128  int getState() { return state; }
129  int getSlotID();
130  int reset();
131  int startMMI();
132  int stopMMI();
133  int answerText(int answer);
134  int answerEnq(char *value);
135  int cancelEnq();
136  int getMMIState();
137  int sendCAPMT(eDVBServicePMTHandler *ptr, const std::vector<uint16_t> &caids=std::vector<uint16_t>());
138  void removeService(uint16_t program_number=0xFFFF);
139  int getNumOfServices() { return running_services.size(); }
140  int setSource(const std::string &source);
141  int setClockRate(int);
142  int setEnabled(bool);
143  static std::string getTunerLetter(int tuner_no) { return std::string(1, char(65 + tuner_no)); }
144 #ifdef __sh__
145  bool checkQueueSize();
146  void thread();
147  void mmiOpened() { mmi_active = true; };
148  void mmiClosed() { mmi_active = false; };
149  void process_tpdu(unsigned char tpdu_tag, __u8* data, int asn_data_length, int con_id);
150  bool sendCreateTC();
151  eData sendData(unsigned char* data, int len);
152  struct timeval tx_time;
153  struct timespec last_poll_time;
154 #endif
155 };
156 
158 {
163  {}
166  {}
169  {}
170  bool operator==(const CIPmtHandler &x) const { return x.pmthandler == pmthandler; }
171 };
172 
173 typedef std::list<CIPmtHandler> PMTHandlerList;
174 
175 #endif // SWIG
176 
178 {
179 private:
180  typedef enum
181  {
182  interface_none,
183  interface_use_dvr,
184  interface_use_pvr,
185  } stream_interface_t;
186 
187  typedef enum
188  {
189  finish_none,
190  finish_use_tuner_a,
191  finish_use_pvr_none,
192  finish_use_none,
193  } stream_finish_mode_t;
194 
195  DECLARE_REF(eDVBCIInterfaces);
196  stream_interface_t m_stream_interface;
197  stream_finish_mode_t m_stream_finish_mode;
198  static eDVBCIInterfaces *instance;
200  eDVBCISlot *getSlot(int slotid);
201  PMTHandlerList m_pmt_handlers;
202 #ifndef SWIG
203 public:
204 #endif
207 
208  void addPMTHandler(eDVBServicePMTHandler *pmthandler);
209  void removePMTHandler(eDVBServicePMTHandler *pmthandler);
210  void recheckPMTHandlers();
211  void gotPMT(eDVBServicePMTHandler *pmthandler);
212  void ciRemoved(eDVBCISlot *slot);
213  int getSlotState(int slot);
214 
215  int setCIEnabled(int slot, bool enabled);
216  int reset(int slot);
217  int initialize(int slot);
218  int startMMI(int slot);
219  int stopMMI(int slot);
220  int answerText(int slot, int answer);
221  int answerEnq(int slot, char *value);
222  int cancelEnq(int slot);
223  int getMMIState(int slot);
224  int sendCAPMT(int slot);
225  int setInputSource(int tunerno, const std::string &source);
226  int setCIClockRate(int slot, int rate);
227 #ifdef SWIG
228 public:
229 #endif
230  static eDVBCIInterfaces *getInstance();
231  int getNumOfSlots() { return m_slots.size(); }
232  PyObject *getDescrambleRules(int slotid);
234  PyObject *readCICaIds(int slotid);
235 };
236 
237 #endif
static int ptr
Definition: bcm.cpp:17
Definition: dvbci_appmgr.h:7
Definition: dvbci_camgr.h:9
Definition: dvbci.h:178
int getMMIState(int slot)
Definition: dvbci.cpp:1050
~eDVBCIInterfaces()
Definition: dvbci.cpp:424
int initialize(int slot)
Definition: dvbci.cpp:464
int sendCAPMT(int slot)
Definition: dvbci.cpp:476
void ciRemoved(eDVBCISlot *slot)
Definition: dvbci.cpp:550
int cancelEnq(int slot)
Definition: dvbci.cpp:540
int getNumOfSlots()
Definition: dvbci.h:231
eDVBCIInterfaces()
Definition: dvbci.cpp:335
int setCIEnabled(int slot, bool enabled)
Definition: dvbci.cpp:1294
void addPMTHandler(eDVBServicePMTHandler *pmthandler)
Definition: dvbci.cpp:897
void recheckPMTHandlers()
Definition: dvbci.cpp:603
PyObject * readCICaIds(int slotid)
Definition: dvbci.cpp:1269
int getSlotState(int slot)
Definition: dvbci.cpp:444
RESULT setDescrambleRules(int slotid, SWIG_PYOBJECT(ePyObject))
Definition: dvbci.cpp:1146
void removePMTHandler(eDVBServicePMTHandler *pmthandler)
Definition: dvbci.cpp:915
int answerText(int slot, int answer)
Definition: dvbci.cpp:520
void gotPMT(eDVBServicePMTHandler *pmthandler)
Definition: dvbci.cpp:1033
int stopMMI(int slot)
Definition: dvbci.cpp:510
int reset(int slot)
Definition: dvbci.cpp:454
static eDVBCIInterfaces * getInstance()
Definition: dvbci.cpp:428
int startMMI(int slot)
Definition: dvbci.cpp:500
int answerEnq(int slot, char *value)
Definition: dvbci.cpp:530
int setInputSource(int tunerno, const std::string &source)
Definition: dvbci.cpp:1060
PyObject * getDescrambleRules(int slotid)
Definition: dvbci.cpp:1094
int setCIClockRate(int slot, int rate)
Definition: dvbci.cpp:1302
Definition: dvbci_mmi.h:7
Definition: dvbci_session.h:11
Definition: dvbci.h:81
int send(const unsigned char *data, size_t len)
Definition: dvbci.cpp:1310
int reset()
Definition: dvbci.cpp:1667
int startMMI()
Definition: dvbci.cpp:1703
void setMMIManager(eDVBCIMMISession *session)
Definition: dvbci.cpp:1652
@ stateInvalid
Definition: dvbci.h:112
@ stateDisabled
Definition: dvbci.h:112
@ stateRemoved
Definition: dvbci.h:112
@ stateInserted
Definition: dvbci.h:112
@ stateResetted
Definition: dvbci.h:112
eDVBCIMMISession * getMMIManager()
Definition: dvbci.h:125
int getMMIState()
Definition: dvbci.cpp:1733
int getSlotID()
Definition: dvbci.cpp:1662
eDVBCISlot(eMainloop *context, int nr)
Definition: dvbci.cpp:1561
void openDevice()
Definition: dvbci.cpp:1575
void setAppManager(eDVBCIApplicationManagerSession *session)
Definition: dvbci.cpp:1647
int setSource(const std::string &source)
Definition: dvbci.cpp:1865
int getNumOfServices()
Definition: dvbci.h:139
int setEnabled(bool)
Definition: dvbci.cpp:1907
void removeService(uint16_t program_number=0xFFFF)
Definition: dvbci.cpp:1857
int stopMMI()
Definition: dvbci.cpp:1713
int cancelEnq()
Definition: dvbci.cpp:1751
eDVBCICAManagerSession * getCAManager()
Definition: dvbci.h:126
void closeDevice()
Definition: dvbci.cpp:1631
int setClockRate(int)
Definition: dvbci.cpp:1898
int answerEnq(char *value)
Definition: dvbci.cpp:1741
int sendCAPMT(eDVBServicePMTHandler *ptr, const std::vector< uint16_t > &caids=std::vector< uint16_t >())
Definition: dvbci.cpp:1761
int answerText(int answer)
Definition: dvbci.cpp:1723
int getState()
Definition: dvbci.h:128
void setCAManager(eDVBCICAManagerSession *session)
Definition: dvbci.cpp:1657
~eDVBCISlot()
Definition: dvbci.cpp:1626
static std::string getTunerLetter(int tuner_no)
Definition: dvbci.h:143
eDVBCIApplicationManagerSession * getAppManager()
Definition: dvbci.h:124
Definition: pmt.h:66
Definition: ebase.h:187
Definition: python.h:31
Definition: object.h:15
std::set< uint16_t > caidSet
Definition: dvbci.h:41
std::set< eServiceReference > serviceSet
Definition: dvbci.h:42
std::set< providerPair > providerSet
Definition: dvbci.h:40
std::list< CIPmtHandler > PMTHandlerList
Definition: dvbci.h:173
std::pair< std::string, uint32_t > providerPair
Definition: dvbci.h:39
#define NULL
Definition: eerror.h:101
unsigned char data[256]
Definition: hdmi_cec.h:2
enabled
Definition: Components/HdmiCec.py:16
session
Definition: SystemPlugins/SatelliteEquipmentControl/plugin.py:52
value
Definition: Profile.py:29
source
Definition: enigma_py_patcher.py:9
int RESULT
Definition: object.h:12
std::string int x
Definition: picload.cpp:1503
Definition: dvbci.h:158
CIPmtHandler(const CIPmtHandler &x)
Definition: dvbci.h:164
CIPmtHandler(eDVBServicePMTHandler *ptr)
Definition: dvbci.h:167
bool operator==(const CIPmtHandler &x) const
Definition: dvbci.h:170
eDVBServicePMTHandler * pmthandler
Definition: dvbci.h:159
eDVBCISlot * cislot
Definition: dvbci.h:160
CIPmtHandler()
Definition: dvbci.h:161
Definition: dvbci.h:24
bool operator<(const struct queueData &a) const
Definition: dvbci.h:33
unsigned char * data
Definition: dvbci.h:26
queueData(unsigned char *data, unsigned int len, uint8_t prio=0)
Definition: dvbci.h:28
unsigned int len
Definition: dvbci.h:27
uint8_t prio
Definition: dvbci.h:25
#define SWIG_PYOBJECT(x)
Definition: swig.h:23