catch up DiseqcTest development
[enigma2.git] / lib / python / Components / TuneTest.py
1 from enigma import eDVBFrontendParametersSatellite, eDVBFrontendParameters, eDVBResourceManager, eTimer
2
3 class Tuner:
4         def __init__(self, frontend):
5                 self.frontend = frontend
6         
7         # transponder = (frequency, symbolrate, polarisation, fec, inversion, orbpos, system, modulation)
8         #                    0         1             2         3       4         5       6        7
9         def tune(self, transponder):
10                 if self.frontend:
11                         print "tuning to transponder with data", transponder
12                         parm = eDVBFrontendParametersSatellite()
13                         parm.frequency = transponder[0] * 1000
14                         parm.symbol_rate = transponder[1] * 1000
15                         parm.polarisation = transponder[2]
16                         parm.fec = transponder[3]
17                         parm.inversion = transponder[4]
18                         parm.orbital_position = transponder[5]
19                         parm.system = 0  # FIXMEE !! HARDCODED DVB-S (add support for DVB-S2)
20                         parm.modulation = 1 # FIXMEE !! HARDCODED QPSK 
21                         feparm = eDVBFrontendParameters()
22                         feparm.setDVBS(parm)
23                         self.lastparm = feparm
24                         self.frontend.tune(feparm)
25         
26         def retune(self):
27                 if self.frontend:
28                         self.frontend.tune(self.lastparm)
29
30 # tunes a list of transponders and checks, if they lock and optionally checks the onid/tsid combination
31 # 1) add transponders with addTransponder()
32 # 2) call run(<checkPIDs = True>)
33 # 3) finishedChecking() is called, when the run is finished
34 class TuneTest:
35         def __init__(self, feid, stopOnSuccess = False, stopOnError = False):
36                 self.stopOnSuccess = stopOnSuccess
37                 self.stopOnError = stopOnError
38                 self.feid = feid
39                 self.transponderlist = []
40                 self.currTuned = None
41                 print "TuneTest for feid %d" % self.feid
42                 if not self.openFrontend():
43                         self.oldref = self.session.nav.getCurrentlyPlayingServiceReference()
44                         self.session.nav.stopService() # try to disable foreground service
45                         if not self.openFrontend():
46                                 if self.session.pipshown: # try to disable pip
47                                         self.session.pipshown = False
48                                         del self.session.pip
49                                         if not self.openFrontend():
50                                                 self.frontend = None # in normal case this should not happen
51                 self.tuner = Tuner(self.frontend)
52                 self.timer = eTimer()
53                 self.timer.callback.append(self.updateStatus)
54                         
55         def updateStatus(self):
56                 dict = {}
57                 self.frontend.getFrontendStatus(dict)
58                 print "status:", dict
59
60                 stop = False
61                 
62                 if dict["tuner_state"] == "TUNING":
63                         self.timer.start(100, True)
64                         self.progressCallback((len(self.transponderlist), self.tuningtransponder, self.STATUS_TUNING, self.currTuned))
65                 elif self.checkPIDs and self.pidStatus == self.INTERNAL_PID_STATUS_NOOP:
66                         if dict["tuner_state"] == "LOCKED":
67                                 print "acquiring TSID/ONID"
68                                 # TODO start getting TSID/ONID
69                                 self.pidStatus = self.INTERNAL_PID_STATUS_WAITING
70                         else:
71                                 self.pidStatus = self.INTERNAL_PID_STATUS_FAILED
72                 elif self.checkPIDs and self.pidStatus == self.INTERNAL_PID_STATUS_WAITING:
73                         print "waiting for pids"                        
74                 else:
75                         if dict["tuner_state"] == "LOSTLOCK" or dict["tuner_state"] == "FAILED":
76                                 self.tuningtransponder = self.nextTransponder()
77                                 self.failedTune.append([self.currTuned, self.oldTuned, "tune_failed"])
78                                 if self.stopOnError == True:
79                                         stop = True
80                         elif dict["tuner_state"] == "LOCKED":
81                                 pidsFailed = False
82                                 if self.checkPIDs:
83                                         tsid = 0 # TODO read values
84                                         onid = 0 # TODO read values
85                                         if tsid != self.currTuned[8] or onid != self.currTuned[9]:
86                                                 self.failedTune.append([self.currTuned, self.oldTuned, "pids_failed"])
87                                                 pidsFailes = True
88                                 elif not self.checkPIDs or (self.checkPids and not pidsFailed):  
89                                         self.successfullyTune.append([self.currTuned, self.oldTuned])
90                                         if self.stopOnSuccess == True:
91                                                 stop = True
92                                 self.tuningtransponder = self.nextTransponder()
93                         else:
94                                 print "************* tuner_state:", dict["tuner_state"]
95                                 
96                         self.progressCallback((len(self.transponderlist), self.tuningtransponder, self.STATUS_NOOP, self.currTuned))
97                         
98                         if not stop:
99                                 self.tune()
100                 if self.tuningtransponder < len(self.transponderlist) and not stop:
101                         self.timer.start(100, True)
102                         print "restart timer"
103                 else:
104                         self.progressCallback((len(self.transponderlist), self.tuningtransponder, self.STATUS_DONE, self.currTuned))
105                         print "finishedChecking"
106                         self.finishedChecking()
107                                 
108         def firstTransponder(self):
109                 print "firstTransponder:"
110                 index = 0
111                 if self.checkPIDs:
112                         print "checkPIDs-loop"
113                         # check for tsid != -1 and onid != -1 
114                         print "index:", index
115                         print "len(self.transponderlist):", len(self.transponderlist)
116                         while (index < len(self.transponderlist) and (self.transponderlist[index][8] == -1 or self.transponderlist[index][9] == -1)):
117                                 index += 1
118                 print "FirstTransponder final index:", index
119                 return index
120         
121         def nextTransponder(self):
122                 index = self.tuningtransponder + 1
123                 if self.checkPIDs:
124                         # check for tsid != -1 and onid != -1 
125                         while (index < len(self.transponderlist) and self.transponderlist[index][8] != -1 and self.transponderlist[index][9] != -1):
126                                 index += 1
127
128                 return index
129         
130         def finishedChecking(self):
131                 print "finished testing"
132                 print "successfull:", self.successfullyTune
133                 print "failed:", self.failedTune
134         
135         def openFrontend(self):
136                 res_mgr = eDVBResourceManager.getInstance()
137                 if res_mgr:
138                         self.raw_channel = res_mgr.allocateRawChannel(self.feid)
139                         if self.raw_channel:
140                                 self.frontend = self.raw_channel.getFrontend()
141                                 if self.frontend:
142                                         return True
143                                 else:
144                                         print "getFrontend failed"
145                         else:
146                                 print "getRawChannel failed"
147                 else:
148                         print "getResourceManager instance failed"
149                 return False
150
151         def tune(self):
152                 print "tuning to", self.tuningtransponder
153                 if self.tuningtransponder < len(self.transponderlist):
154                         self.pidStatus = self.INTERNAL_PID_STATUS_NOOP
155                         self.oldTuned = self.currTuned
156                         self.currTuned = self.transponderlist[self.tuningtransponder]
157                         self.tuner.tune(self.transponderlist[self.tuningtransponder])           
158
159         INTERNAL_PID_STATUS_NOOP = 0
160         INTERNAL_PID_STATUS_WAITING = 1
161         INTERNAL_PID_STATUS_SUCCESSFUL = 2
162         INTERNAL_PID_STATUS_FAILED = 3
163         
164         def run(self, checkPIDs = False):
165                 self.checkPIDs = checkPIDs
166                 self.pidStatus = self.INTERNAL_PID_STATUS_NOOP
167                 self.failedTune = []
168                 self.successfullyTune = []
169                 self.tuningtransponder = self.firstTransponder()
170                 self.tune()
171                 self.progressCallback((len(self.transponderlist), self.tuningtransponder, self.STATUS_START, self.currTuned))
172                 self.timer.start(100, True)
173         
174         # transponder = (frequency, symbolrate, polarisation, fec, inversion, orbpos, <system>, <modulation>, <tsid>, <onid>)
175         #                    0         1             2         3       4         5       6        7              8      9
176         def addTransponder(self, transponder):
177                 self.transponderlist.append(transponder)
178                 
179         def clearTransponder(self):
180                 self.transponderlist = []
181                 
182         STATUS_START = 0
183         STATUS_TUNING = 1
184         STATUS_DONE = 2
185         STATUS_NOOP = 3
186         # can be overwritten
187         # progress = (range, value, status, transponder)
188         def progressCallback(self, progress):
189                 pass