From c9269f3fc682d55d4fda55795b14a4224467aa43 Mon Sep 17 00:00:00 2001 From: hschang Date: Fri, 1 Nov 2013 14:31:48 +0900 Subject: [PATCH] support DVB-T2 auto scan --- lib/dvb/frontend.cpp | 12 +- lib/python/Screens/ScanSetup.py | 235 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 236 insertions(+), 11 deletions(-) diff --git a/lib/dvb/frontend.cpp b/lib/dvb/frontend.cpp index 26b47cf..21d897e 100755 --- a/lib/dvb/frontend.cpp +++ b/lib/dvb/frontend.cpp @@ -397,7 +397,6 @@ RESULT eDVBFrontendParameters::calculateDifference(const iDVBFrontendParameters eDVBFrontendParametersTerrestrial oterrestrial; if (parm->getDVBT(oterrestrial)) return -2; - if (exact && oterrestrial.bandwidth != terrestrial.bandwidth && oterrestrial.bandwidth != eDVBFrontendParametersTerrestrial::Bandwidth_Auto && terrestrial.bandwidth != eDVBFrontendParametersTerrestrial::Bandwidth_Auto) @@ -426,6 +425,11 @@ RESULT eDVBFrontendParameters::calculateDifference(const iDVBFrontendParameters oterrestrial.code_rate_HP != eDVBFrontendParametersTerrestrial::FEC_Auto && terrestrial.code_rate_HP != eDVBFrontendParametersTerrestrial::FEC_Auto) diff = 1 << 30; + else if (oterrestrial.system != terrestrial.system) + diff = 1 << 30; + else if (oterrestrial.system == terrestrial.System_DVB_T2 && + oterrestrial.plpid != terrestrial.plpid) + diff = 1 << 30; else diff = abs(terrestrial.frequency - oterrestrial.frequency) / 1000; return 0; @@ -2754,7 +2758,7 @@ RESULT eDVBFrontend::prepare_terrestrial(const eDVBFrontendParametersTerrestrial parm_inversion = INVERSION_AUTO; break; } - eDebug("tuning to %d khz, bandwidth %d, crl %d, crh %d, modulation %d, tm %d, guard %d, hierarchy %d, inversion %d", + eDebug("tuning to %d khz, bandwidth %d, crl %d, crh %d, modulation %d, tm %d, guard %d, hierarchy %d, inversion %d, system %d, plpid %d", parm_frequency/1000, parm_u_ofdm_bandwidth, parm_u_ofdm_code_rate_LP, @@ -2763,7 +2767,9 @@ RESULT eDVBFrontend::prepare_terrestrial(const eDVBFrontendParametersTerrestrial parm_u_ofdm_transmission_mode, parm_u_ofdm_guard_interval, parm_u_ofdm_hierarchy_information, - parm_inversion); + parm_inversion, + feparm.system, + feparm.plpid); oparm.ter = feparm; return 0; } diff --git a/lib/python/Screens/ScanSetup.py b/lib/python/Screens/ScanSetup.py index 19075b3..08ce21e 100644 --- a/lib/python/Screens/ScanSetup.py +++ b/lib/python/Screens/ScanSetup.py @@ -283,6 +283,175 @@ class CableTransponderSearchSupport: tmpstr += "\n\n..." self.cable_search_session = self.session.openWithCallback(self.cableTransponderSearchSessionClosed, MessageBox, tmpstr, MessageBox.TYPE_INFO) +class TerrestrialTransponderSearchSupport: +# def setTerrestrialTransponderSearchResult(self, tlist): +# pass + +# def terrestrialTransponderSearchFinished(self): +# pass + + def terrestrialTransponderSearchSessionClosed(self, *val): + print "TerrestrialTransponderSearchSessionClosed, val", val + self.terrestrial_search_container.appClosed.remove(self.terrestrialTransponderSearchClosed) + self.terrestrial_search_container.dataAvail.remove(self.getTerrestrialTransponderData) + if val and len(val): + if val[0]: + self.setTerrestrialTransponderSearchResult(self.__tlist) + else: + self.terrestrial_search_container.sendCtrlC() + self.setTerrestrialTransponderSearchResult(None) + self.terrestrial_search_container = None + self.terrestrial_search_session = None + self.__tlist = None + self.terrestrialTransponderSearchFinished() + + def terrestrialTransponderSearchClosed(self, retval): + self.setTerrestrialTransponderData() + opt = self.terrestrialTransponderGetOpt() + if opt is None: + print "terrestrialTransponderSearch finished", retval + self.terrestrial_search_session.close(True) + else: + (freq, bandWidth) = opt + self.terrestrialTransponderSearch(freq, bandWidth) + + def getTerrestrialTransponderData(self, str): + self.terrestrial_search_data += str + + def setTerrestrialTransponderData(self): + print self.terrestrial_search_data + data = self.terrestrial_search_data.split() + if len(data): + if data[0] == 'OK': + # DVB-T : OK frequency bandwidth delivery system -1 + # DVB-T2 : OK frequency bandwidth delivery system number_of_plp plp_id0:plp_type0 + if data[3] == 1: # DVB-T + parm = eDVBFrontendParametersTerrestrial() + parm.frequency = int(data[1]) + parm.bandwidth = int(data[2]) + parm.inversion = parm.Inversion_Unknown + parm.code_rate_HP = parm.FEC_Auto + parm.code_rate_LP = parm.FEC_Auto + parm.modulation = parm.Modulation_Auto + parm.transmission_mode = parm.TransmissionMode_Auto + parm.guard_interval = parm.GuardInterval_Auto + parm.hierarchy = parm.Hierarchy_Auto + parm.system = parm.System_DVB_T + parm.plpid = 0 + self.__tlist.append(parm) + else: + plp_list = data[5:] + plp_num = data[4] + if len(plp_list) > plp_num: + plp_list = plp_list[:plp_num] + for plp in plp_list: + (plp_id, plp_type) = plp.split(':') + if plp_type == '0': # common PLP: + continue + parm = eDVBFrontendParametersTerrestrial() + parm.frequency = int(data[1]) + parm.bandwidth = self.terrestrialTransponderconvBandwidth_P(int(data[2])) + parm.inversion = parm.Inversion_Unknown + parm.code_rate_HP = parm.FEC_Auto + parm.code_rate_LP = parm.FEC_Auto + parm.modulation = parm.Modulation_Auto + parm.transmission_mode = parm.TransmissionMode_Auto + parm.guard_interval = parm.GuardInterval_Auto + parm.hierarchy = parm.Hierarchy_Auto + parm.system = parm.System_DVB_T2 + parm.plpid = int(plp_id) + self.__tlist.append(parm) + + tmpstr = _("Try to find used Transponders in cable network.. please wait...") + tmpstr += "\n\n" + tmpstr += data[1][:-3] + tmpstr += " kHz " + tmpstr += data[0] + self.terrestrial_search_session["text"].setText(tmpstr) + + def terrestrialTransponderInitSearchList(self, searchList, region): + tpList = nimmanager.getTranspondersTerrestrial(region) + for x in tpList: + if x[0] == 2: #TERRESTRIAL + freq = x[1] # frequency + bandWidth = self.terrestrialTransponderConvBandwidth_I(x[2]) # bandWidth + parm = (freq, bandWidth) + searchList.append(parm) + + def terrestrialTransponderConvBandwidth_I(self, _bandWidth): + bandWidth = { + eDVBFrontendParametersTerrestrial.Bandwidth_8MHz : 8000000, + eDVBFrontendParametersTerrestrial.Bandwidth_7MHz : 7000000, + eDVBFrontendParametersTerrestrial.Bandwidth_6MHz : 6000000, + eDVBFrontendParametersTerrestrial.Bandwidth_5MHz : 5000000, + eDVBFrontendParametersTerrestrial.Bandwidth_1_712MHz : 1712000, + eDVBFrontendParametersTerrestrial.Bandwidth_10MHz : 10000000, + }.get(_bandWidth, 8000000) + return bandWidth + + def terrestrialTransponderconvBandwidth_P(self, _bandWidth): + bandWidth = { + 8000000 : eDVBFrontendParametersTerrestrial.Bandwidth_8MHz, + 7000000 : eDVBFrontendParametersTerrestrial.Bandwidth_7MHz, + 6000000 : eDVBFrontendParametersTerrestrial.Bandwidth_6MHz, + 5000000 : eDVBFrontendParametersTerrestrial.Bandwidth_5MHz, + 1712000 : eDVBFrontendParametersTerrestrial.Bandwidth_1_712MHz, + 10000000 : eDVBFrontendParametersTerrestrial.Bandwidth_10MHz, + }.get(_bandWidth, eDVBFrontendParametersTerrestrial.Bandwidth_8MHz) + return bandWidth + + def terrestrialTransponderGetOpt(self): + if len(self.terrestrial_search_list) > 0: + return self.terrestrial_search_list.pop(0) + else: + return None + + def startTerrestrialTransponderSearch(self, nim_idx, region): + def GetCommand(nimIdx): + _supportNimType = { 'SSH108':'ssh108_t2_scan' } + description = nimmanager.getNimName(nimIdx) + try: + tunername = description.split()[2][4:-1] + except: + tunername = description + return _supportNimType.get(tunername, 'ssh108_t2_scan') + + if not self.tryGetRawFrontend(nim_idx): + self.session.nav.stopService() + if not self.tryGetRawFrontend(nim_idx): + if self.session.pipshown: # try to disable pip + self.session.pipshown = False + del self.session.pip + if not self.tryGetRawFrontend(nim_idx): + self.terrestrialTransponderSearchFinished() + return + self.__tlist = [ ] + self.terrestrial_search_container = eConsoleAppContainer() + self.terrestrial_search_container.appClosed.append(self.terrestrialTransponderSearchClosed) + self.terrestrial_search_container.dataAvail.append(self.getTerrestrialTransponderData) + + self.terrestrial_search_binName = GetCommand(nim_idx) + + self.terrestrial_search_bus = nimmanager.getI2CDevice(nim_idx) + if self.terrestrial_search_bus is None: + print "ERROR: could not get I2C device for nim", nim_idx, "for terrestrial transponder search" + self.terrestrial_search_bus = 2 + + self.terrestrial_search_list = [] + self.terrestrialTransponderInitSearchList(self.terrestrial_search_list ,region) + (freq, bandWidth) = self.terrestrialTransponderGetOpt() + self.terrestrialTransponderSearch(freq, bandWidth) + + tmpstr = _("Try to find used transponders in terrestrial network.. please wait...") + tmpstr += "\n\n..." + self.terrestrial_search_session = self.session.openWithCallback(self.terrestrialTransponderSearchSessionClosed, MessageBox, tmpstr, MessageBox.TYPE_INFO) + + def terrestrialTransponderSearch(self, freq, bandWidth): + self.terrestrial_search_data = "" + cmd = "%s --freq %d --bw %d --bus %d --ds 2" % (self.terrestrial_search_binName, freq, bandWidth, self.terrestrial_search_bus) + print "SCAN CMD : ",cmd + self.terrestrial_search_container.execute(cmd) + class DefaultSatLists(DefaultWizard): def __init__(self, session, silent = True, showSteps = False): self.xmlfile = "defaultsatlists.xml" @@ -304,7 +473,7 @@ class DefaultSatLists(DefaultWizard): self.markDone() self.disableKeys = False -class ScanSetup(ConfigListScreen, Screen, CableTransponderSearchSupport): +class ScanSetup(ConfigListScreen, Screen, CableTransponderSearchSupport, TerrestrialTransponderSearchSupport): def __init__(self, session): Screen.__init__(self, session) @@ -556,7 +725,7 @@ class ScanSetup(ConfigListScreen, Screen, CableTransponderSearchSupport): defaultCab["fec"] = frontendData.get("fec_inner", eDVBFrontendParametersCable.FEC_Auto) defaultCab["modulation"] = frontendData.get("modulation", eDVBFrontendParametersCable.Modulation_QAM16) elif ttype == "DVB-T": - defaultTer["frequency"] = frontendData.get("frequency", 0) + defaultTer["frequency"] = frontendData.get("frequency", 0) / 1000 defaultTer["inversion"] = frontendData.get("inversion", eDVBFrontendParametersTerrestrial.Inversion_Unknown) defaultTer["bandwidth"] = frontendData.get("bandwidth", eDVBFrontendParametersTerrestrial.Bandwidth_7MHz) defaultTer["fechigh"] = frontendData.get("code_rate_hp", eDVBFrontendParametersTerrestrial.FEC_Auto) @@ -566,6 +735,7 @@ class ScanSetup(ConfigListScreen, Screen, CableTransponderSearchSupport): defaultTer["guard_interval"] = frontendData.get("guard_interval", eDVBFrontendParametersTerrestrial.GuardInterval_Auto) defaultTer["hierarchy"] = frontendData.get("hierarchy_information", eDVBFrontendParametersTerrestrial.Hierarchy_Auto) defaultTer["system"] = frontendData.get("system", eDVBFrontendParametersTerrestrial.System_DVB_T) + defaultTer["plp_id"] = frontendData.get("plp_id", 0) self.scan_sat = ConfigSubsection() self.scan_cab = ConfigSubsection() @@ -670,7 +840,7 @@ class ScanSetup(ConfigListScreen, Screen, CableTransponderSearchSupport): self.scan_cab.symbolrate = ConfigInteger(default = defaultCab["symbolrate"], limits = (1, 99999)) # terrestial - self.scan_ter.frequency = ConfigInteger(default = 466000, limits = (50000, 999000)) + self.scan_ter.frequency = ConfigInteger(default = defaultTer["frequency"], limits = (50000, 999000)) self.scan_ter.inversion = ConfigSelection(default = defaultTer["inversion"], choices = [ (eDVBFrontendParametersTerrestrial.Inversion_Off, _("Off")), (eDVBFrontendParametersTerrestrial.Inversion_On, _("On")), @@ -824,11 +994,15 @@ class ScanSetup(ConfigListScreen, Screen, CableTransponderSearchSupport): tlist.append(buildTerTransponder(*args, **kwargs)) def keyGo(self): + START_SCAN =0 + SEARCH_CABLE_TRANSPONDERS = 1 + SEARCH_TERRESTRIAL2_TRANSPONDERS = 2 + if self.scan_nims.value == "": return tlist = [] flags = None - startScan = True + action = START_SCAN removeAll = True index_to_scan = int(self.scan_nims.value) @@ -889,7 +1063,7 @@ class ScanSetup(ConfigListScreen, Screen, CableTransponderSearchSupport): if config.Nims[index_to_scan].cable.scan_type.value == "provider": getInitialCableTransponderList(tlist, index_to_scan) else: - startScan = False + action = SEARCH_CABLE_TRANSPONDERS elif nim.isCompatible("DVB-T"): if self.scan_typeterrestrial.value == "single_transponder": @@ -922,6 +1096,8 @@ class ScanSetup(ConfigListScreen, Screen, CableTransponderSearchSupport): removeAll = False elif self.scan_typeterrestrial.value == "complete": getInitialTerrestrialTransponderList(tlist, nimmanager.getTerrestrialDescription(index_to_scan)) + if nim.isCompatible("DVB-T2"): + action = SEARCH_TERRESTRIAL2_TRANSPONDERS flags = self.scan_networkScan.value and eComponentScan.scanNetworkSearch or 0 @@ -941,13 +1117,18 @@ class ScanSetup(ConfigListScreen, Screen, CableTransponderSearchSupport): for x in self["config"].list: x[1].save() - if startScan: + if action == START_SCAN: self.startScan(tlist, flags, index_to_scan) - else: + elif action == SEARCH_CABLE_TRANSPONDERS: self.flags = flags self.feid = index_to_scan self.tlist = [] self.startCableTransponderSearch(self.feid) + elif action == SEARCH_TERRESTRIAL2_TRANSPONDERS: + self.flags = flags + self.feid = index_to_scan + self.tlist = tlist + self.startTerrestrialTransponderSearch(self.feid, nimmanager.getTerrestrialDescription(self.feid)) def setCableTransponderSearchResult(self, tlist): self.tlist = tlist @@ -958,6 +1139,16 @@ class ScanSetup(ConfigListScreen, Screen, CableTransponderSearchSupport): else: self.startScan(self.tlist, self.flags, self.feid) + def setTerrestrialTransponderSearchResult(self, tlist): + if tlist is not None: + self.tlist.extend(tlist) + + def terrestrialTransponderSearchFinished(self): + if self.tlist is None: + self.tlist = [] + else: + self.startScan(self.tlist, self.flags, self.feid) + def startScan(self, tlist, flags, feid): if len(tlist): # flags |= eComponentScan.scanSearchBAT @@ -976,7 +1167,7 @@ class ScanSetup(ConfigListScreen, Screen, CableTransponderSearchSupport): x[1].cancel() self.close() -class ScanSimple(ConfigListScreen, Screen, CableTransponderSearchSupport): +class ScanSimple(ConfigListScreen, Screen, CableTransponderSearchSupport, TerrestrialTransponderSearchSupport): def getNetworksForNim(self, nim): if nim.isCompatible("DVB-S"): networks = nimmanager.getSatListForNim(nim.slot) @@ -1027,6 +1218,16 @@ class ScanSimple(ConfigListScreen, Screen, CableTransponderSearchSupport): if need_scan: nims_to_scan.append(nim) + + if "DVB-T2" in known_networks: # we need to remove "DVB-T" when networks have "DVB-T2" + nims_dvb_t = [] + for nim in nims_to_scan: + if nim.type == "DVB-T": + nims_dvb_t.append(nim) + + for nim in nims_dvb_t: + nims_to_scan.remove(nim) + # we save the config elements to use them on keyGo self.nim_enable = [ ] @@ -1057,6 +1258,7 @@ class ScanSimple(ConfigListScreen, Screen, CableTransponderSearchSupport): def buildTransponderList(self): # this method is called multiple times because of asynchronous stuff APPEND_NOW = 0 SEARCH_CABLE_TRANSPONDERS = 1 + SEARCH_TERRESTRIAL2_TRANSPONDERS = 2 action = APPEND_NOW n = self.nim_iter < len(self.nim_enable) and self.nim_enable[self.nim_iter] or None @@ -1082,6 +1284,8 @@ class ScanSimple(ConfigListScreen, Screen, CableTransponderSearchSupport): action = SEARCH_CABLE_TRANSPONDERS elif nim.isCompatible("DVB-T"): getInitialTerrestrialTransponderList(tlist, nimmanager.getTerrestrialDescription(nim.slot)) + if nim.isCompatible("DVB-T2"): + action = SEARCH_TERRESTRIAL2_TRANSPONDERS else: assert False @@ -1100,6 +1304,12 @@ class ScanSimple(ConfigListScreen, Screen, CableTransponderSearchSupport): self.feid = nim.slot self.startCableTransponderSearch(nim.slot) return + elif action == SEARCH_TERRESTRIAL2_TRANSPONDERS: + self.tlist = tlist + self.flags = flags + self.feid = nim.slot + self.startTerrestrialTransponderSearch(nim.slot, nimmanager.getTerrestrialDescription(nim.slot)) + return else: assert False @@ -1128,6 +1338,15 @@ class ScanSimple(ConfigListScreen, Screen, CableTransponderSearchSupport): def cableTransponderSearchFinished(self): self.buildTransponderList() + def setTerrestrialTransponderSearchResult(self, tlist): + if tlist is not None: + self.tlist.extend(tlist) + if self.tlist is not None: + self.scanList.append({"transponders": self.tlist, "feid": self.feid, "flags": self.flags}) + + def terrestrialTransponderSearchFinished(self): + self.buildTransponderList() + def keyCancel(self): self.close() -- 2.7.4