From 36232c1bb02dfa4de18a4f3353603180f750a957 Mon Sep 17 00:00:00 2001 From: kos Date: Wed, 6 Jul 2011 19:06:33 +0900 Subject: [PATCH] add blindscan plugin. --- configure.ac | 2 + .../Plugins/SystemPlugins/Blindscan/Makefile.am | 8 + .../Plugins/SystemPlugins/Blindscan/__init__.py | 0 .../SystemPlugins/Blindscan/meta/Makefile.am | 3 + .../Blindscan/meta/plugin_blindscan.xml | 16 + .../Plugins/SystemPlugins/Blindscan/plugin.py | 404 +++++++++++++++++++++ .../SystemPlugins/Blindscan/vuplus_blindscan | Bin 0 -> 50763 bytes lib/python/Plugins/SystemPlugins/Makefile.am | 3 +- 8 files changed, 435 insertions(+), 1 deletion(-) create mode 100755 lib/python/Plugins/SystemPlugins/Blindscan/Makefile.am create mode 100644 lib/python/Plugins/SystemPlugins/Blindscan/__init__.py create mode 100755 lib/python/Plugins/SystemPlugins/Blindscan/meta/Makefile.am create mode 100755 lib/python/Plugins/SystemPlugins/Blindscan/meta/plugin_blindscan.xml create mode 100644 lib/python/Plugins/SystemPlugins/Blindscan/plugin.py create mode 100644 lib/python/Plugins/SystemPlugins/Blindscan/vuplus_blindscan diff --git a/configure.ac b/configure.ac index 480da58..27beb1e 100644 --- a/configure.ac +++ b/configure.ac @@ -209,6 +209,8 @@ lib/python/Plugins/SystemPlugins/WirelessLanSetup/Makefile lib/python/Plugins/SystemPlugins/WirelessLanSetup/meta/Makefile lib/python/Plugins/SystemPlugins/ManualFancontrol/Makefile lib/python/Plugins/SystemPlugins/ManualFancontrol/meta/Makefile +lib/python/Plugins/SystemPlugins/Blindscan/Makefile +lib/python/Plugins/SystemPlugins/Blindscan/meta/Makefile lib/python/Tools/Makefile lib/service/Makefile lib/components/Makefile diff --git a/lib/python/Plugins/SystemPlugins/Blindscan/Makefile.am b/lib/python/Plugins/SystemPlugins/Blindscan/Makefile.am new file mode 100755 index 0000000..ca509ab --- /dev/null +++ b/lib/python/Plugins/SystemPlugins/Blindscan/Makefile.am @@ -0,0 +1,8 @@ +installdir = $(pkglibdir)/python/Plugins/SystemPlugins/Blindscan + +SUBDIRS = meta + +install_PYTHON = \ + __init__.py \ + plugin.py \ + vuplus_blindscan diff --git a/lib/python/Plugins/SystemPlugins/Blindscan/__init__.py b/lib/python/Plugins/SystemPlugins/Blindscan/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lib/python/Plugins/SystemPlugins/Blindscan/meta/Makefile.am b/lib/python/Plugins/SystemPlugins/Blindscan/meta/Makefile.am new file mode 100755 index 0000000..62195c6 --- /dev/null +++ b/lib/python/Plugins/SystemPlugins/Blindscan/meta/Makefile.am @@ -0,0 +1,3 @@ +installdir = $(datadir)/meta + +dist_install_DATA = plugin_blindscan.xml diff --git a/lib/python/Plugins/SystemPlugins/Blindscan/meta/plugin_blindscan.xml b/lib/python/Plugins/SystemPlugins/Blindscan/meta/plugin_blindscan.xml new file mode 100755 index 0000000..fc27119 --- /dev/null +++ b/lib/python/Plugins/SystemPlugins/Blindscan/meta/plugin_blindscan.xml @@ -0,0 +1,16 @@ + + + + + + doliyu & oskwon + Blindscan + enigma2-plugin-systemplugins-blindscan + vuplus blindscan... + + + + + + + diff --git a/lib/python/Plugins/SystemPlugins/Blindscan/plugin.py b/lib/python/Plugins/SystemPlugins/Blindscan/plugin.py new file mode 100644 index 0000000..27aedde --- /dev/null +++ b/lib/python/Plugins/SystemPlugins/Blindscan/plugin.py @@ -0,0 +1,404 @@ +from Plugins.Plugin import PluginDescriptor + +from Screens.Screen import Screen +from Screens.ServiceScan import ServiceScan +from Screens.MessageBox import MessageBox +from Screens.DefaultWizard import DefaultWizard + +from Components.Label import Label +from Components.TuneTest import Tuner +from Components.ConfigList import ConfigListScreen +from Components.Sources.StaticText import StaticText +from Components.ActionMap import NumberActionMap, ActionMap +from Components.NimManager import nimmanager, getConfigSatlist +from Components.config import config, ConfigSubsection, ConfigSelection, ConfigYesNo, ConfigInteger, getConfigListEntry, ConfigSlider, ConfigEnableDisable + +from Tools.HardwareInfo import HardwareInfo +from Tools.Directories import resolveFilename, SCOPE_DEFAULTPARTITIONMOUNTDIR, SCOPE_DEFAULTDIR, SCOPE_DEFAULTPARTITION + +from enigma import eTimer, eDVBFrontendParametersSatellite, eComponentScan, eDVBSatelliteEquipmentControl, eDVBFrontendParametersTerrestrial, eDVBFrontendParametersCable, eConsoleAppContainer, eDVBResourceManager + +class SatBlindscanSearchSupport: + def blindTransponderSearchSessionClosed(self, *val): + self.blind_search_container.appClosed.remove(self.blindScanSearchClosed) + self.blind_search_container.dataAvail.remove(self.getBlindTransponderData) + if val and len(val): + if val[0]: + self.tlist = self.__tlist + print self.__tlist + if self.frontend: + self.frontend = None + del self.raw_channel + + self.blind_search_container.sendCtrlC() + import time + time.sleep(2) + + self.blind_search_container = None + self.blind_search_container = None + self.__tlist = None + + if self.tlist is None: + self.tlist = [] + else: + self.startScan(self.tlist, self.flags, self.feid) + + def blindScanSearchClosed(self, retval): + self.blind_search_session.close(True) + + def getBlindTransponderData(self, str): + str = self.remainingdata + str + #split in lines + lines = str.split('\n') + #'str' should end with '\n', so when splitting, the last line should be empty. If this is not the case, we received an incomplete line + if len(lines[-1]): + #remember this data for next time + self.remainingdata = lines[-1] + lines = lines[0:-1] + else: + self.remainingdata = "" + + for line in lines: + data = line.split() + if len(data): + print data + if data[0] == 'OK': + parm = eDVBFrontendParametersSatellite() + sys = { "DVB-S" : eDVBFrontendParametersSatellite.System_DVB_S, + "DVB-S2" : eDVBFrontendParametersSatellite.System_DVB_S2 } + qam = { "QPSK" : parm.Modulation_QPSK, + "8PSK" : parm.Modulation_8PSK } + inv = { "INVERSION_OFF" : parm.Inversion_Off, + "INVERSION_ON" : parm.Inversion_On, + "INVERSION_AUTO" : parm.Inversion_Unknown } + fec = { "FEC_AUTO" : parm.FEC_Auto, + "FEC_1_2" : parm.FEC_1_2, + "FEC_2_3" : parm.FEC_2_3, + "FEC_3_4" : parm.FEC_3_4, + "FEC_5_6": parm.FEC_5_6, + "FEC_7_8" : parm.FEC_7_8, + "FEC_8_9" : parm.FEC_8_9, + "FEC_3_5" : parm.FEC_3_5, + "FEC_9_10" : parm.FEC_9_10, + "FEC_NONE" : parm.FEC_None } + roll = { "ROLLOFF_20" : parm.RollOff_alpha_0_20, + "ROLLOFF_25" : parm.RollOff_alpha_0_25, + "ROLLOFF_35" : parm.RollOff_alpha_0_35 } + pilot = { "PILOT_ON" : parm.Pilot_On, + "PILOT_OFF" : parm.Pilot_Off } + pol = { "HORIZONTAL" : parm.Polarisation_Horizontal, + "VERTICAL" : parm.Polarisation_Vertical } + + sat = self.satList[0][self.scan_satselection[0].index] + parm.orbital_position = sat[0] + + parm.polarisation = pol[data[1]] + parm.frequency = int(data[2]) + parm.symbol_rate = int(data[3]) + parm.system = sys[data[4]] + parm.inversion = inv[data[5]] + parm.pilot = pilot[data[6]] + parm.fec = fec[data[7]] + parm.modulation = qam[data[8]] + parm.rolloff = roll[data[9]] + self.__tlist.append(parm) + flags = None + + def openFrontend(self): + res_mgr = eDVBResourceManager.getInstance() + if res_mgr: + self.raw_channel = res_mgr.allocateRawChannel(self.feid) + if self.raw_channel: + self.frontend = self.raw_channel.getFrontend() + if self.frontend: + return True + else: + print "getFrontend failed" + else: + print "getRawChannel failed" + else: + print "getResourceManager instance failed" + return False + + def startSatBlindscanSearch(self, nim_idx, orbpos, session): + if self.blindscan_start_frequency.value < 950*1000000 or self.blindscan_start_frequency.value > 2150*1000000 : + self.session.open(MessageBox, _("Please check again.\nStart frequency must be between 950 and 2150."), MessageBox.TYPE_ERROR) + return + if self.blindscan_stop_frequency.value < 950*1000000 or self.blindscan_stop_frequency.value > 2150*1000000 : + self.session.open(MessageBox, _("Please check again.\nStop frequency must be between 950 and 2150."), MessageBox.TYPE_ERROR) + return + if self.blindscan_start_frequency.value > self.blindscan_stop_frequency.value : + self.session.open(MessageBox, _("Please check again.\nFrequency : start value is larger than stop value."), MessageBox.TYPE_ERROR) + return + if self.blindscan_start_symbol.value < 2*1000000 or self.blindscan_start_symbol.value > 45*1000000 : + self.session.open(MessageBox, _("Please check again.\nStart symbolrate must be between 2MHz and 45MHz."), MessageBox.TYPE_ERROR) + return + if self.blindscan_stop_symbol.value < 2*1000000 or self.blindscan_stop_symbol.value > 45*1000000 : + self.session.open(MessageBox, _("Please check again.\nStop symbolrate must be between 2MHz and 45MHz."), MessageBox.TYPE_ERROR) + return + if self.blindscan_start_symbol.value > self.blindscan_stop_symbol.value : + self.session.open(MessageBox, _("Please check again.\nSymbolrate : start value is larger than stop value."), MessageBox.TYPE_ERROR) + return + + self.__tlist = [ ] + self.remainingdata = "" + self.feid = nim_idx + if not self.openFrontend(): + self.oldref = session.nav.getCurrentlyPlayingServiceReference() + session.nav.stopService() # try to disable foreground service + if not self.openFrontend(): + if session.pipshown: # try to disable pip + session.pipshown = False + del session.pip + if not self.openFrontend(): + self.frontend = None # in normal case this should not happen + + self.tuner = Tuner(self.frontend) + sat = self.satList[0][self.scan_satselection[0].index] + + tab_hilow = {"high" : 1, "low" : 0} + returnvalue = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + if tab_hilow[self.blindscan_hi.value]: + self.scan_sat.frequency.value = 12515 + else: + self.scan_sat.frequency.value = 11015 + returnvalue = (self.scan_sat.frequency.value, + 0, + self.scan_sat.polarization.value, + 0, + 0, + int(orbpos[0]), + eDVBFrontendParametersSatellite.System_DVB_S, + 0, + 0, + 0) + self.tuner.tune(returnvalue) + + self.blind_search_container = eConsoleAppContainer() + self.blind_search_container.appClosed.append(self.blindScanSearchClosed) + self.blind_search_container.dataAvail.append(self.getBlindTransponderData) + cmd = "/usr/lib/enigma2/python/Plugins/SystemPlugins/Blindscan/vuplus_blindscan %d %d %d %d %d %d %d" % (self.blindscan_start_frequency.value/1000000, self.blindscan_stop_frequency.value/1000000, self.blindscan_start_symbol.value/1000000, self.blindscan_stop_symbol.value/1000000, self.scan_sat.polarization.value, tab_hilow[self.blindscan_hi.value], self.feid) + print "prepared command : ", cmd + self.blind_search_container.execute(cmd) + + tmpstr = _("Preparing scanning... \nPlease wait a few minutes.") + self.blind_search_session = self.session.openWithCallback(self.blindTransponderSearchSessionClosed, MessageBox, tmpstr, MessageBox.TYPE_INFO) + +class Blindscan(ConfigListScreen, Screen, SatBlindscanSearchSupport): + skin=""" + + + + + + + + + + """ + def __init__(self, session): + Screen.__init__(self, session) + + self.updateSatList() + self.service = session.nav.getCurrentService() + self.current_play_service = self.session.nav.getCurrentlyPlayingServiceReference() + self.feinfo = None + self.networkid = 0 + frontendData = None + if self.service is not None: + self.feinfo = self.service.frontendInfo() + frontendData = self.feinfo and self.feinfo.getAll(True) + + self.createConfig(frontendData) + + del self.feinfo + del self.service + + self["actions"] = ActionMap(["OkCancelActions", "ShortcutActions", "WizardActions", "ColorActions", "SetupActions", ], + { + "red": self.keyCancel, + "green": self.keyGo, + "ok": self.keyGo, + "cancel": self.keyCancel, + }, -2) + + self.statusTimer = eTimer() + self.statusTimer.callback.append(self.updateStatus) + + self.list = [] + ConfigListScreen.__init__(self, self.list) + + self["key_red"] = StaticText(_("Exit")) + self["key_green"] = StaticText("Start") + + if not self.scan_nims.value == "": + self.createSetup() + + def updateSatList(self): + self.satList = [] + for slot in nimmanager.nim_slots: + if slot.isCompatible("DVB-S"): + self.satList.append(nimmanager.getSatListForNim(slot.slot)) + else: + self.satList.append(None) + + def createConfig(self, frontendData): + defaultSat = {"orbpos": 192, "frequency": 11836, "polarization": eDVBFrontendParametersSatellite.Polarisation_Horizontal} + + if frontendData is not None: + ttype = frontendData.get("tuner_type", "UNKNOWN") + defaultSat["orbpos"] = frontendData.get("orbital_position", 0) + defaultSat["frequency"] = frontendData.get("frequency", 0) / 1000 + defaultSat["polarization"] = frontendData.get("polarization", eDVBFrontendParametersSatellite.Polarisation_Horizontal) + + self.scan_sat = ConfigSubsection() + self.scan_networkScan = ConfigYesNo(default = False) + + # blindscan add + self.blindscan_hi = ConfigSelection(default = "low", choices = [("low", _("low")), ("high", _("high"))]) + + #ConfigYesNo(default = True) + self.blindscan_start_frequency = ConfigInteger(default = 950*1000000) + self.blindscan_stop_frequency = ConfigInteger(default = 2150*1000000) + self.blindscan_start_symbol = ConfigInteger(default = 2*1000000) + self.blindscan_stop_symbol = ConfigInteger(default = 45*1000000) + + nim_list = [] + # collect all nims which are *not* set to "nothing" + for n in nimmanager.nim_slots: + if n.config_mode == "nothing": + continue + if n.config_mode == "advanced" and len(nimmanager.getSatListForNim(n.slot)) < 1: + continue + if n.config_mode in ("loopthrough", "satposdepends"): + root_id = nimmanager.sec.getRoot(n.slot_id, int(n.config.connectedTo.value)) + if n.type == nimmanager.nim_slots[root_id].type: # check if connected from a DVB-S to DVB-S2 Nim or vice versa + continue + nim_list.append((str(n.slot), n.friendly_full_description)) + + self.scan_nims = ConfigSelection(choices = nim_list) + + # status + self.scan_snr = ConfigSlider() + self.scan_snr.enabled = False + self.scan_agc = ConfigSlider() + self.scan_agc.enabled = False + self.scan_ber = ConfigSlider() + self.scan_ber.enabled = False + + # sat + self.scan_sat.frequency = ConfigInteger(default = defaultSat["frequency"], limits = (1, 99999)) + self.scan_sat.polarization = ConfigSelection(default = defaultSat["polarization"], choices = [ + (eDVBFrontendParametersSatellite.Polarisation_Horizontal, _("horizontal")), + (eDVBFrontendParametersSatellite.Polarisation_Vertical, _("vertical")), + (eDVBFrontendParametersSatellite.Polarisation_CircularLeft, _("circular left")), + (eDVBFrontendParametersSatellite.Polarisation_CircularRight, _("circular right"))]) + self.scan_scansat = {} + for sat in nimmanager.satList: + self.scan_scansat[sat[0]] = ConfigYesNo(default = False) + + self.scan_satselection = [] + for slot in nimmanager.nim_slots: + if slot.isCompatible("DVB-S"): + self.scan_satselection.append(getConfigSatlist(defaultSat["orbpos"], self.satList[slot.slot])) + else: + self.scan_satselection.append(None) + return True + + def newConfig(self): + cur = self["config"].getCurrent() + print "cur is", cur + if cur == self.tunerEntry or \ + cur == self.systemEntry or \ + (self.modulationEntry and self.systemEntry[1].value == eDVBFrontendParametersSatellite.System_DVB_S2 and cur == self.modulationEntry): + self.createSetup() + + def keyLeft(self): + ConfigListScreen.keyLeft(self) + self.newConfig() + + def keyRight(self): + ConfigListScreen.keyRight(self) + self.newConfig() + + def updateStatus(self): + print "updatestatus" + + def keyGo(self): + if self.scan_nims.value == "": + return + tlist = [] + flags = None + removeAll = True + index_to_scan = int(self.scan_nims.value) + + if self.scan_nims == [ ]: + self.session.open(MessageBox, _("No tuner is enabled!\nPlease setup your tuner settings before you start a service scan."), MessageBox.TYPE_ERROR) + return + + nim = nimmanager.nim_slots[index_to_scan] + print "nim", nim.slot + if nim.isCompatible("DVB-S") : + print "is compatible with DVB-S" + else: + print "is not compatible with DVB-S" + return + + flags = self.scan_networkScan.value and eComponentScan.scanNetworkSearch or 0 + for x in self["config"].list: + x[1].save() + + self.flags = flags + self.feid = index_to_scan + self.tlist = [] + orbpos = self.satList[index_to_scan][self.scan_satselection[index_to_scan].index] + self.startSatBlindscanSearch(index_to_scan, orbpos, self.session) + + def keyCancel(self): + for x in self["config"].list: + x[1].cancel() + self.session.nav.playService(self.current_play_service) + self.close() + + def startScan(self, tlist, flags, feid, networkid = 0): + if len(tlist): + self.session.open(ServiceScan, [{"transponders": tlist, "feid": feid, "flags": flags, "networkid": networkid}]) + else: + self.session.open(MessageBox, _("Nothing to scan!\nPlease setup your tuner settings before you start a service scan."), MessageBox.TYPE_ERROR) + + def createSetup(self): + self.list = [] + self.multiscanlist = [] + index_to_scan = int(self.scan_nims.value) + print "ID: ", index_to_scan + + self.tunerEntry = getConfigListEntry(_("Tuner"), self.scan_nims) + self.list.append(self.tunerEntry) + + if self.scan_nims == [ ]: + return + + self.systemEntry = None + self.modulationEntry = None + nim = nimmanager.nim_slots[index_to_scan] + + self.scan_networkScan.value = False + if nim.isCompatible("DVB-S") : + self.list.append(getConfigListEntry(_('Satellite'), self.scan_satselection[index_to_scan])) + self.list.append(getConfigListEntry(_('Scan start frequency'), self.blindscan_start_frequency)) + self.list.append(getConfigListEntry(_('Scan stop frequency'), self.blindscan_stop_frequency)) + self.list.append(getConfigListEntry(_("Polarity"), self.scan_sat.polarization)) + self.list.append(getConfigListEntry(_("Scan band"), self.blindscan_hi)) + self.list.append(getConfigListEntry(_('Scan start symbolrate'), self.blindscan_start_symbol)) + self.list.append(getConfigListEntry(_('Scan stop symbolrate'), self.blindscan_stop_symbol)) + self["config"].list = self.list + self["config"].l.setList(self.list) + else: + self.session.open(MessageBox, _("Please setup DVB-S Tuner"), MessageBox.TYPE_ERROR) + +def main(session, **kwargs): + session.open(Blindscan) + +def Plugins(**kwargs): + return PluginDescriptor(name=_("Blindscan"), description="scan type(DVB-S)", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=main) + diff --git a/lib/python/Plugins/SystemPlugins/Blindscan/vuplus_blindscan b/lib/python/Plugins/SystemPlugins/Blindscan/vuplus_blindscan new file mode 100644 index 0000000000000000000000000000000000000000..83d0fbda684e879314205eee6bb860a3f2c27e43 GIT binary patch literal 50763 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 literal 0 HcmV?d00001 diff --git a/lib/python/Plugins/SystemPlugins/Makefile.am b/lib/python/Plugins/SystemPlugins/Makefile.am index 98e3600..ab4883e 100755 --- a/lib/python/Plugins/SystemPlugins/Makefile.am +++ b/lib/python/Plugins/SystemPlugins/Makefile.am @@ -4,7 +4,8 @@ SUBDIRS = SoftwareManager FrontprocessorUpgrade PositionerSetup Satfinder \ SkinSelector SatelliteEquipmentControl Videomode VideoTune Hotplug \ DefaultServicesScanner NFIFlash DiseqcTester CommonInterfaceAssignment \ CrashlogAutoSubmit CleanupWizard VideoEnhancement WirelessLan NetworkWizard \ - TempFanControl FactoryTest Fancontrol FPGAUpgrade WirelessLanSetup ManualFancontrol + TempFanControl FactoryTest Fancontrol FPGAUpgrade WirelessLanSetup ManualFancontrol \ + Blindscan install_PYTHON = \ __init__.py -- 2.7.4