support DVB-T2 auto scan
authorhschang <chang@dev3>
Fri, 1 Nov 2013 05:31:48 +0000 (14:31 +0900)
committerhschang <chang@dev3>
Fri, 1 Nov 2013 10:10:14 +0000 (19:10 +0900)
lib/dvb/frontend.cpp
lib/python/Screens/ScanSetup.py

index 26b47cf..21d897e 100755 (executable)
@@ -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;
 }
index 19075b3..08ce21e 100644 (file)
@@ -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()