From d732b430ccc1d1a78e666f16553b2e3c5dd131a8 Mon Sep 17 00:00:00 2001 From: ghost Date: Sun, 16 Nov 2008 13:12:56 +0100 Subject: work on asynchron pic loading... to get rid of spinning wheels --- lib/python/Components/AVSwitch.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'lib/python/Components') diff --git a/lib/python/Components/AVSwitch.py b/lib/python/Components/AVSwitch.py index 8f99b98e..7ac2bb98 100644 --- a/lib/python/Components/AVSwitch.py +++ b/lib/python/Components/AVSwitch.py @@ -28,6 +28,21 @@ class AVSwitch: def setSystem(self, value): eAVSwitch.getInstance().setVideomode(value) + def getOutputAspect(self): + if valstr in ("4_3_letterbox", "4_3_panscan"): # 4:3 + return 1.333333333 + elif valstr == "16_9": # auto ... 4:3 or 16:9 + # TODO: here we must retrieve the current video aspect ratio... + # because the TV can run in 4:3 or in 16:9 mode.. (switched by wss or scart pin8) + # until we have done this we always return the scale value for 16:9!! + return 1.777777778 + elif valstr in ("16_9_always", "16_9_letterbox"): # 16:9 + return 1.777777778 + elif valstr in ("16_10_letterbox", "16_10_panscan"): # 16:10 + return 1.6 + print "unknown output aspect!" + return 1.0000 + def getAspectRatioSetting(self): valstr = config.av.aspectratio.value if valstr == "4_3_letterbox": -- cgit v1.2.3 From 9ccb92fb3eaca35ec60c1a596db9620f9f302044 Mon Sep 17 00:00:00 2001 From: ghost Date: Mon, 17 Nov 2008 21:17:34 +0100 Subject: more changes for async picture decode support --- lib/gdi/picload.cpp | 109 +++++++++++++++------ lib/gdi/picload.h | 5 + lib/python/Components/AVSwitch.py | 16 ++- .../SystemPlugins/Videomode/VideoHardware.py | 29 ++++++ 4 files changed, 125 insertions(+), 34 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/gdi/picload.cpp b/lib/gdi/picload.cpp index 2ef901f5..b1dfd1a1 100644 --- a/lib/gdi/picload.cpp +++ b/lib/gdi/picload.cpp @@ -569,19 +569,29 @@ ePicLoad::ePicLoad() m_conf.thumbnailsize = 180; } -ePicLoad::~ePicLoad() +void ePicLoad::waitFinished() { msg_thread.send(Message(Message::quit)); kill(); +} +ePicLoad::~ePicLoad() +{ + if (threadrunning) + waitFinished(); if(m_filepara != NULL) delete m_filepara; } +void ePicLoad::thread_finished() +{ + threadrunning=false; +} void ePicLoad::thread() { hasStarted(); + threadrunning=true; nice(4); runLoop(); } @@ -759,7 +769,6 @@ void ePicLoad::gotMessage(const Message &msg) break; case Message::decode_finished: // called from main thread //eDebug("[Picload] decode finished... %s", m_filepara->file); - threadrunning=false; if(m_filepara->callback) { PictureData(m_filepara->picinfo.c_str()); @@ -824,7 +833,6 @@ int ePicLoad::startThread(int what, const char *file, int x, int y) return 1; } - threadrunning=true; if(what==1) msg_thread.send(Message(Message::decode_Pic)); else @@ -843,33 +851,6 @@ RESULT ePicLoad::getThumbnail(const char *file, int x, int y) return startThread(0, file, x, y); } -RESULT ePicLoad::setPara(PyObject *val) -{ - if (!PyList_Check(val)) - return 0; - if (PyList_Size(val) < 6) - return 0; - - m_conf.max_x = PyInt_AsLong( PyList_GET_ITEM(val, 0)); - m_conf.max_y = PyInt_AsLong( PyList_GET_ITEM(val, 1)); - m_conf.aspect_ratio = PyFloat_AsDouble( PyList_GET_ITEM(val, 2)); - m_conf.usecache = PyInt_AsLong( PyList_GET_ITEM(val, 3)); - m_conf.resizetype = PyInt_AsLong( PyList_GET_ITEM(val, 4)); - const char *bg_str = PyString_AsString( PyList_GET_ITEM(val, 5)); - - if(bg_str[0] == '#' && strlen(bg_str)==9) - { - int bg = strtoul(bg_str+1, NULL, 16); - m_conf.background[0] = bg&0xFF; //BB - m_conf.background[1] = (bg>>8)&0xFF; //GG - m_conf.background[2] = (bg>>16)&0xFF; //RR - m_conf.background[3] = bg>>24; //AA - } - - eDebug("[Picload] setPara max-X=%d max-Y=%d aspect_ratio=%lf cache=%d resize=%d bg=#%02X%02X%02X%02X", m_conf.max_x, m_conf.max_y, m_conf.aspect_ratio, (int)m_conf.usecache, (int)m_conf.resizetype, m_conf.background[3], m_conf.background[2], m_conf.background[1], m_conf.background[0]); - return 1; -} - PyObject *ePicLoad::getInfo(const char *filename) { ePyObject list; @@ -935,6 +916,7 @@ PyObject *ePicLoad::getInfo(const char *filename) int ePicLoad::getData(ePtr &result) { + result = 0; if(m_filepara->pic_buffer == NULL) return 0; m_filepara->pic_buffer = conv24to32(m_filepara->pic_buffer, m_filepara->ox * m_filepara->oy); @@ -1015,3 +997,70 @@ int ePicLoad::getData(ePtr &result) return 0; } + +RESULT ePicLoad::setPara(PyObject *val) +{ + if (!PyList_Check(val)) + return 0; + if (PyList_Size(val) < 6) + return 0; + + m_conf.max_x = PyInt_AsLong( PyList_GET_ITEM(val, 0)); + m_conf.max_y = PyInt_AsLong( PyList_GET_ITEM(val, 1)); + m_conf.aspect_ratio = PyFloat_AsDouble( PyList_GET_ITEM(val, 2)); + m_conf.usecache = PyInt_AsLong( PyList_GET_ITEM(val, 3)); + m_conf.resizetype = PyInt_AsLong( PyList_GET_ITEM(val, 4)); + const char *bg_str = PyString_AsString( PyList_GET_ITEM(val, 5)); + + if(bg_str[0] == '#' && strlen(bg_str)==9) + { + int bg = strtoul(bg_str+1, NULL, 16); + m_conf.background[0] = bg&0xFF; //BB + m_conf.background[1] = (bg>>8)&0xFF; //GG + m_conf.background[2] = (bg>>16)&0xFF; //RR + m_conf.background[3] = bg>>24; //AA + } + + eDebug("[Picload] setPara max-X=%d max-Y=%d aspect_ratio=%lf cache=%d resize=%d bg=#%02X%02X%02X%02X", m_conf.max_x, m_conf.max_y, m_conf.aspect_ratio, (int)m_conf.usecache, (int)m_conf.resizetype, m_conf.background[3], m_conf.background[2], m_conf.background[1], m_conf.background[0]); + return 1; +} + +//------------------------------------------------------------------------------------ + +//for old plugins +SWIG_VOID(int) loadPic(ePtr &result, std::string filename, int x, int y, int aspect, int resize_mode, int rotate, int background, std::string cachefile) +{ + result = 0; + eDebug("deprecated loadPic function used!!! please use the non blocking version! you can see demo code in Pictureplayer plugin... this function is removed in the near future!"); + ePicLoad mPL; + + double aspect_ratio; + switch(aspect) + { + case 1: aspect_ratio = 1.778 / ((double)720/576); break; //16:9 + case 2: aspect_ratio = 1.600 / ((double)720/576); break; //16:10 + case 3: aspect_ratio = 1.250 / ((double)720/576); break; //5:4 + default: aspect_ratio = 1.333 / ((double)720/576); //4:3 + } + + ePyObject list = PyList_New(6); + PyList_SET_ITEM(list, 0, PyLong_FromLong(x)); + PyList_SET_ITEM(list, 1, PyLong_FromLong(y)); + PyList_SET_ITEM(list, 2, PyFloat_FromDouble(aspect_ratio)); + PyList_SET_ITEM(list, 3, PyLong_FromLong(0)); + PyList_SET_ITEM(list, 4, PyLong_FromLong(resize_mode)); + if(background) + PyList_SET_ITEM(list, 5, PyString_FromString("#ff000000")); + else + PyList_SET_ITEM(list, 5, PyString_FromString("#00000000")); + + mPL.setPara(list); + + if(!mPL.startDecode(filename.c_str())) + { + mPL.waitFinished(); // this blocks until the thread is finished + mPL.getData(result); + } + + return 0; +} diff --git a/lib/gdi/picload.h b/lib/gdi/picload.h index a85567c0..6a0f70b9 100644 --- a/lib/gdi/picload.h +++ b/lib/gdi/picload.h @@ -86,7 +86,9 @@ class ePicLoad: public eMainloop, public eThread, public Object, public iObject void gotMessage(const Message &message); void thread(); int startThread(int what, const char *file, int x, int y); + void thread_finished(); public: + void waitFinished(); PSignal1 PictureData; ePicLoad(); @@ -99,4 +101,7 @@ public: SWIG_VOID(int) getData(ePtr &SWIG_OUTPUT); }; +//for old plugins +SWIG_VOID(int) loadPic(ePtr &SWIG_OUTPUT, std::string filename, int x, int y, int aspect, int resize_mode=0, int rotate=0, int background=0, std::string cachefile=""); + #endif // __picload_h__ diff --git a/lib/python/Components/AVSwitch.py b/lib/python/Components/AVSwitch.py index 7ac2bb98..19aca24d 100644 --- a/lib/python/Components/AVSwitch.py +++ b/lib/python/Components/AVSwitch.py @@ -1,5 +1,5 @@ from config import config, ConfigSlider, ConfigSelection, ConfigYesNo, ConfigEnableDisable, ConfigSubsection, ConfigBoolean -from enigma import eAVSwitch +from enigma import eAVSwitch, getDesktop from SystemInfo import SystemInfo class AVSwitch: @@ -32,9 +32,12 @@ class AVSwitch: if valstr in ("4_3_letterbox", "4_3_panscan"): # 4:3 return 1.333333333 elif valstr == "16_9": # auto ... 4:3 or 16:9 - # TODO: here we must retrieve the current video aspect ratio... - # because the TV can run in 4:3 or in 16:9 mode.. (switched by wss or scart pin8) - # until we have done this we always return the scale value for 16:9!! + try: + aspect_str = open("/proc/stb/vmpeg/0/aspect", "r").read() + if aspect_str == "1": # 4:3 + return 1.333333333 + except IOError: + pass return 1.777777778 elif valstr in ("16_9_always", "16_9_letterbox"): # 16:9 return 1.777777778 @@ -43,6 +46,11 @@ class AVSwitch: print "unknown output aspect!" return 1.0000 + def getFramebufferScale(self): + aspect = self.getOutputAspect() + fb_size = getDesktop(0).size() + return aspect / ((1.0 * fb_size.width()) / fb_size.height()) + def getAspectRatioSetting(self): valstr = config.av.aspectratio.value if valstr == "4_3_letterbox": diff --git a/lib/python/Plugins/SystemPlugins/Videomode/VideoHardware.py b/lib/python/Plugins/SystemPlugins/Videomode/VideoHardware.py index 2422475e..5e38f3e6 100644 --- a/lib/python/Plugins/SystemPlugins/Videomode/VideoHardware.py +++ b/lib/python/Plugins/SystemPlugins/Videomode/VideoHardware.py @@ -59,6 +59,34 @@ class VideoHardware: widescreen_modes = set(["720p", "1080i"]) + def getOutputAspect(self): + ret = 1.777777778 # 16:9 + port = config.av.videoport.value + if port not in config.av.videomode: + print "current port not available in getOutputAspect!!! force 16:9" + else: + mode = config.av.videomode[port].value + force_widescreen = self.isWidescreenMode(port, mode) + is_widescreen = force_widescreen or config.av.aspect.value in ["16_9", "16_10"] + is_auto = config.av.aspect.value == "auto" + if is_widescreen: + if force_widescreen: + pass + else: + aspect = {"16_9": "16:9", "16_10": "16:10"}[config.av.aspect.value] + if aspect == "16:10": + ret = 1.6 + elif is_auto: + try: + aspect_str = open("/proc/stb/vmpeg/0/aspect", "r").read() + if aspect_str == "1": # 4:3 + ret = 1.333333333 + except IOError: + pass + else: # 4:3 + ret = 1.333333333 + return ret + def __init__(self): self.last_modes_preferred = [ ] self.on_hotplug = CList() @@ -80,6 +108,7 @@ class VideoHardware: config.av.tvsystem.notifiers = [ ] config.av.wss.notifiers = [ ] AVSwitch.setInput = self.AVSwitchSetInput + AVSwitch.getOutputAspect = self.getOutputAspect config.av.aspect.addNotifier(self.updateAspect) config.av.wss.addNotifier(self.updateAspect) -- cgit v1.2.3 From 5aa89f34249397330995cc0ab1e080c1f567e174 Mon Sep 17 00:00:00 2001 From: ghost Date: Mon, 17 Nov 2008 23:34:41 +0100 Subject: get rid of some floating point values --- lib/gdi/picload.cpp | 35 +++++++++++----------- lib/python/Components/AVSwitch.py | 14 ++++----- .../Plugins/Extensions/PicturePlayer/plugin.py | 14 +++++---- .../SystemPlugins/Videomode/VideoHardware.py | 8 ++--- 4 files changed, 36 insertions(+), 35 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/gdi/picload.cpp b/lib/gdi/picload.cpp index f67507ca..375f33fb 100644 --- a/lib/gdi/picload.cpp +++ b/lib/gdi/picload.cpp @@ -1011,16 +1011,16 @@ RESULT ePicLoad::setPara(PyObject *val) { if (!PySequence_Check(val)) return 0; - if (PySequence_Size(val) < 6) + if (PySequence_Size(val) < 7) return 0; else { ePyObject fast = PySequence_Fast(val, ""); m_conf.max_x = PyInt_AsLong( PySequence_Fast_GET_ITEM(val, 0)); m_conf.max_y = PyInt_AsLong( PySequence_Fast_GET_ITEM(val, 1)); - m_conf.aspect_ratio = PyFloat_AsDouble( PySequence_Fast_GET_ITEM(val, 2)); - m_conf.usecache = PyInt_AsLong( PySequence_Fast_GET_ITEM(val, 3)); - m_conf.resizetype = PyInt_AsLong( PySequence_Fast_GET_ITEM(val, 4)); - const char *bg_str = PyString_AsString( PySequence_Fast_GET_ITEM(val, 5)); + m_conf.aspect_ratio = (double)PyInt_AsLong( PySequence_Fast_GET_ITEM(val, 2)) / PyInt_AsLong(PySequence_Fast_GET_ITEM(val, 3)); + m_conf.usecache = PyInt_AsLong( PySequence_Fast_GET_ITEM(val, 4)); + m_conf.resizetype = PyInt_AsLong( PySequence_Fast_GET_ITEM(val, 5)); + const char *bg_str = PyString_AsString( PySequence_Fast_GET_ITEM(val, 6)); if(bg_str[0] == '#' && strlen(bg_str)==9) { @@ -1040,29 +1040,30 @@ RESULT ePicLoad::setPara(PyObject *val) //for old plugins SWIG_VOID(int) loadPic(ePtr &result, std::string filename, int x, int y, int aspect, int resize_mode, int rotate, int background, std::string cachefile) { + long asp1, asp2; result = 0; eDebug("deprecated loadPic function used!!! please use the non blocking version! you can see demo code in Pictureplayer plugin... this function is removed in the near future!"); ePicLoad mPL; - double aspect_ratio; switch(aspect) { - case 1: aspect_ratio = 1.778 / ((double)720/576); break; //16:9 - case 2: aspect_ratio = 1.600 / ((double)720/576); break; //16:10 - case 3: aspect_ratio = 1.250 / ((double)720/576); break; //5:4 - default: aspect_ratio = 1.333 / ((double)720/576); //4:3 + case 1: asp1 = 16*576, asp2 = 9*720; break; //16:9 + case 2: asp1 = 16*576, asp2 = 10*720; break; //16:10 + case 3: asp1 = 5*576, asp2 = 4*720; break; //5:4 + default: asp1 = 4*576, asp2 = 3*720; break; //4:3 } - - ePyObject tuple = PyTuple_New(6); + + ePyObject tuple = PyTuple_New(7); PyTuple_SET_ITEM(tuple, 0, PyLong_FromLong(x)); PyTuple_SET_ITEM(tuple, 1, PyLong_FromLong(y)); - PyTuple_SET_ITEM(tuple, 2, PyFloat_FromDouble(aspect_ratio)); - PyTuple_SET_ITEM(tuple, 3, PyLong_FromLong(0)); - PyTuple_SET_ITEM(tuple, 4, PyLong_FromLong(resize_mode)); + PyTuple_SET_ITEM(tuple, 2, PyLong_FromLong(asp1)); + PyTuple_SET_ITEM(tuple, 3, PyLong_FromLong(asp2)); + PyTuple_SET_ITEM(tuple, 4, PyLong_FromLong(0)); + PyTuple_SET_ITEM(tuple, 5, PyLong_FromLong(resize_mode)); if(background) - PyTuple_SET_ITEM(tuple, 5, PyString_FromString("#ff000000")); + PyTuple_SET_ITEM(tuple, 6, PyString_FromString("#ff000000")); else - PyTuple_SET_ITEM(tuple, 5, PyString_FromString("#00000000")); + PyTuple_SET_ITEM(tuple, 6, PyString_FromString("#00000000")); mPL.setPara(tuple); diff --git a/lib/python/Components/AVSwitch.py b/lib/python/Components/AVSwitch.py index 19aca24d..00350cbb 100644 --- a/lib/python/Components/AVSwitch.py +++ b/lib/python/Components/AVSwitch.py @@ -30,26 +30,24 @@ class AVSwitch: def getOutputAspect(self): if valstr in ("4_3_letterbox", "4_3_panscan"): # 4:3 - return 1.333333333 + return (4,3) elif valstr == "16_9": # auto ... 4:3 or 16:9 try: aspect_str = open("/proc/stb/vmpeg/0/aspect", "r").read() if aspect_str == "1": # 4:3 - return 1.333333333 + return (4,3) except IOError: pass - return 1.777777778 elif valstr in ("16_9_always", "16_9_letterbox"): # 16:9 - return 1.777777778 + pass elif valstr in ("16_10_letterbox", "16_10_panscan"): # 16:10 - return 1.6 - print "unknown output aspect!" - return 1.0000 + return (16,10) + return (16,9) def getFramebufferScale(self): aspect = self.getOutputAspect() fb_size = getDesktop(0).size() - return aspect / ((1.0 * fb_size.width()) / fb_size.height()) + return (aspect[0] * fb_size.height(), aspect[1] * fb_size.width()) def getAspectRatioSetting(self): valstr = config.av.aspectratio.value diff --git a/lib/python/Plugins/Extensions/PicturePlayer/plugin.py b/lib/python/Plugins/Extensions/PicturePlayer/plugin.py index 7d62d2be..0cdab563 100644 --- a/lib/python/Plugins/Extensions/PicturePlayer/plugin.py +++ b/lib/python/Plugins/Extensions/PicturePlayer/plugin.py @@ -15,7 +15,7 @@ from Components.ConfigList import ConfigList from Components.config import config, ConfigSubsection, ConfigInteger, ConfigSelection, ConfigText, ConfigEnableDisable, KEY_LEFT, KEY_RIGHT, KEY_0, getConfigListEntry -def getAspectforPic(): +def getScale(): return AVSwitch().getFramebufferScale() config.pic = ConfigSubsection() @@ -119,8 +119,9 @@ class picshow(Screen): self.session.openWithCallback(self.callbackView, Pic_Full_View, self.filelist.getFileList(), self.filelist.getSelectionIndex(), self.filelist.getCurrentDirectory()) def setConf(self): + sc = getScale() #0=Width 1=Height 2=Aspect 3=use_cache 4=resize_type 5=Background(#AARRGGBB) - self.picload.setPara([self["thn"].instance.size().width(), self["thn"].instance.size().height(), getAspectforPic(), config.pic.cache.value, int(config.pic.resize.value), "#00000000"]) + self.picload.setPara((self["thn"].instance.size().width(), self["thn"].instance.size().height(), sc[0], sc[1], config.pic.cache.value, int(config.pic.resize.value), "#00000000")) def callbackView(self, val=0): if val > 0: @@ -311,10 +312,10 @@ class Pic_Thumb(Screen): self.ThumbTimer.callback.append(self.showPic) def setPicloadConf(self): - self.picload.setPara([self["thumb0"].instance.size().width(), self["thumb0"].instance.size().height(), getAspectforPic(), config.pic.cache.value, int(config.pic.resize.value), self.color]) + sc = getScale() + self.picload.setPara([self["thumb0"].instance.size().width(), self["thumb0"].instance.size().height(), sc[0], sc[1], config.pic.cache.value, int(config.pic.resize.value), self.color]) self.paintFrame() - - + def paintFrame(self): #print "index=" + str(self.index) if self.maxentry < self.index or self.index < 0: @@ -468,7 +469,8 @@ class Pic_Full_View(Screen): self.onLayoutFinish.append(self.setPicloadConf) def setPicloadConf(self): - self.picload.setPara([self["pic"].instance.size().width(), self["pic"].instance.size().height(), getAspectforPic(), 0, int(config.pic.resize.value), self.bgcolor]) + sc = getScale() + self.picload.setPara([self["pic"].instance.size().width(), self["pic"].instance.size().height(), sc[0], sc[1], 0, int(config.pic.resize.value), self.bgcolor]) self["play_icon"].hide() if config.pic.infoline.value == False: diff --git a/lib/python/Plugins/SystemPlugins/Videomode/VideoHardware.py b/lib/python/Plugins/SystemPlugins/Videomode/VideoHardware.py index 5e38f3e6..02fdf9a5 100644 --- a/lib/python/Plugins/SystemPlugins/Videomode/VideoHardware.py +++ b/lib/python/Plugins/SystemPlugins/Videomode/VideoHardware.py @@ -60,7 +60,7 @@ class VideoHardware: widescreen_modes = set(["720p", "1080i"]) def getOutputAspect(self): - ret = 1.777777778 # 16:9 + ret = (16,9) port = config.av.videoport.value if port not in config.av.videomode: print "current port not available in getOutputAspect!!! force 16:9" @@ -75,16 +75,16 @@ class VideoHardware: else: aspect = {"16_9": "16:9", "16_10": "16:10"}[config.av.aspect.value] if aspect == "16:10": - ret = 1.6 + ret = (16,10) elif is_auto: try: aspect_str = open("/proc/stb/vmpeg/0/aspect", "r").read() if aspect_str == "1": # 4:3 - ret = 1.333333333 + ret = (4,3) except IOError: pass else: # 4:3 - ret = 1.333333333 + ret = (4,3) return ret def __init__(self): -- cgit v1.2.3 From 7b99a1af4abb7fdd77889feabe6bbd08d6c1d343 Mon Sep 17 00:00:00 2001 From: ghost Date: Sat, 22 Nov 2008 09:23:16 +0100 Subject: AVSwitch.py: fix getOutputAspect function --- lib/python/Components/AVSwitch.py | 1 + 1 file changed, 1 insertion(+) (limited to 'lib/python/Components') diff --git a/lib/python/Components/AVSwitch.py b/lib/python/Components/AVSwitch.py index 00350cbb..1f529cfd 100644 --- a/lib/python/Components/AVSwitch.py +++ b/lib/python/Components/AVSwitch.py @@ -29,6 +29,7 @@ class AVSwitch: eAVSwitch.getInstance().setVideomode(value) def getOutputAspect(self): + valstr = config.av.aspectratio.value if valstr in ("4_3_letterbox", "4_3_panscan"): # 4:3 return (4,3) elif valstr == "16_9": # auto ... 4:3 or 16:9 -- cgit v1.2.3 From 2dbd18117bf8519ea700c7f87424eaa2e5a794fa Mon Sep 17 00:00:00 2001 From: ghost Date: Tue, 25 Nov 2008 21:15:42 +0100 Subject: add possibility to always switch to 13V before do sec commands --- lib/dvb/sec.cpp | 17 ++++++++++----- lib/dvb/sec.h | 2 +- lib/python/Components/NimManager.py | 42 ++++++++++++++++++++++++------------- 3 files changed, 40 insertions(+), 21 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/dvb/sec.cpp b/lib/dvb/sec.cpp index 2b7f717b..39124b34 100644 --- a/lib/dvb/sec.cpp +++ b/lib/dvb/sec.cpp @@ -388,6 +388,11 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA iDVBFrontend *sec_fe=&frontend; eDVBRegisteredFrontend *linked_fe = 0; eDVBSatelliteDiseqcParameters::t_diseqc_mode diseqc_mode = di_param.m_diseqc_mode; + eDVBSatelliteSwitchParameters::t_voltage_mode voltage_mode = sw_param.m_voltage_mode; + bool diseqc13V = voltage_mode == eDVBSatelliteSwitchParameters::HV_13; + + if (diseqc13V) + voltage_mode = eDVBSatelliteSwitchParameters::HV; frontend.getData(eDVBFrontend::SATPOS_DEPENDS_PTR, satposDependPtr); @@ -437,13 +442,13 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA if (!(sat.polarisation & eDVBFrontendParametersSatellite::Polarisation::Vertical)) band |= 2; - if ( sw_param.m_voltage_mode == eDVBSatelliteSwitchParameters::_14V + if ( voltage_mode == eDVBSatelliteSwitchParameters::_14V || ( sat.polarisation & eDVBFrontendParametersSatellite::Polarisation::Vertical - && sw_param.m_voltage_mode == eDVBSatelliteSwitchParameters::HV ) ) + && voltage_mode == eDVBSatelliteSwitchParameters::HV ) ) voltage = VOLTAGE(13); - else if ( sw_param.m_voltage_mode == eDVBSatelliteSwitchParameters::_18V + else if ( voltage_mode == eDVBSatelliteSwitchParameters::_18V || ( !(sat.polarisation & eDVBFrontendParametersSatellite::Polarisation::Vertical) - && sw_param.m_voltage_mode == eDVBSatelliteSwitchParameters::HV ) ) + && voltage_mode == eDVBSatelliteSwitchParameters::HV ) ) voltage = VOLTAGE(18); if ( (sw_param.m_22khz_signal == eDVBSatelliteSwitchParameters::ON) || ( sw_param.m_22khz_signal == eDVBSatelliteSwitchParameters::HILO && (band&1) ) ) @@ -597,7 +602,9 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, iDVBFrontend::toneOff) ); sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_CONT_TONE]) ); - if ( RotorCmd != -1 && RotorCmd != lastRotorCmd ) + if (diseqc13V) + vlt = iDVBFrontend::voltage13; + else if ( RotorCmd != -1 && RotorCmd != lastRotorCmd ) { if (rotor_param.m_inputpower_parameters.m_use) vlt = VOLTAGE(18); // in input power mode set 18V for measure input power diff --git a/lib/dvb/sec.h b/lib/dvb/sec.h index e68ed167..27dcedd5 100644 --- a/lib/dvb/sec.h +++ b/lib/dvb/sec.h @@ -170,7 +170,7 @@ class eDVBSatelliteSwitchParameters #endif public: enum t_22khz_signal { HILO=0, ON=1, OFF=2 }; // 22 Khz - enum t_voltage_mode { HV=0, _14V=1, _18V=2, _0V=3 }; // 14/18 V + enum t_voltage_mode { HV=0, _14V=1, _18V=2, _0V=3, HV_13=4 }; // 14/18 V #ifndef SWIG t_voltage_mode m_voltage_mode; t_22khz_signal m_22khz_signal; diff --git a/lib/python/Components/NimManager.py b/lib/python/Components/NimManager.py index f4e91083..edd3bbbb 100644 --- a/lib/python/Components/NimManager.py +++ b/lib/python/Components/NimManager.py @@ -39,7 +39,7 @@ class SecConfigure: sec.addSatellite(orbpos) self.configuredSatellites.add(orbpos) - def addLNBSimple(self, sec, slotid, diseqcmode, toneburstmode = diseqcParam.NO, diseqcpos = diseqcParam.SENDNO, orbpos = 0, longitude = 0, latitude = 0, loDirection = 0, laDirection = 0, turningSpeed = rotorParam.FAST, useInputPower=True, inputPowerDelta=50, fastDiSEqC = False, setVoltageTone = True): + def addLNBSimple(self, sec, slotid, diseqcmode, toneburstmode = diseqcParam.NO, diseqcpos = diseqcParam.SENDNO, orbpos = 0, longitude = 0, latitude = 0, loDirection = 0, laDirection = 0, turningSpeed = rotorParam.FAST, useInputPower=True, inputPowerDelta=50, fastDiSEqC = False, setVoltageTone = True, diseqc13V = False): if orbpos is None or orbpos == 3601: return #simple defaults @@ -70,7 +70,10 @@ class SecConfigure: if 0 <= diseqcmode < 3: self.addSatellite(sec, orbpos) if setVoltageTone: - sec.setVoltageMode(switchParam.HV) + if diseqc13V: + sec.setVoltageMode(switchParam.HV_13) + else: + sec.setVoltageMode(switchParam.HV) sec.setToneMode(switchParam.HILO) else: sec.setVoltageMode(switchParam._14V) @@ -90,7 +93,10 @@ class SecConfigure: for x in self.NimManager.satList: print "Add sat " + str(x[0]) self.addSatellite(sec, int(x[0])) - sec.setVoltageMode(switchParam.HV) + if diseqc13V: + sec.setVoltageMode(switchParam.HV_13) + else: + sec.setVoltageMode(switchParam.HV) sec.setToneMode(switchParam.HILO) sec.setRotorPosNum(0) # USALS @@ -172,24 +178,24 @@ class SecConfigure: print "diseqcmode: ", nim.diseqcMode.value if nim.diseqcMode.value == "single": #single if nim.simpleSingleSendDiSEqC.value: - self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AA) + self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AA, diseqc13V = nim.diseqc13V.value) else: - self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.NONE, diseqcpos = diseqcParam.SENDNO) + self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.NONE, diseqcpos = diseqcParam.SENDNO, diseqc13V = nim.diseqc13V.value) elif nim.diseqcMode.value == "toneburst_a_b": #Toneburst A/B - self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.A, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.SENDNO) - self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcB.orbital_position, toneburstmode = diseqcParam.B, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.SENDNO) + self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.A, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.SENDNO, diseqc13V = nim.diseqc13V.value) + self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcB.orbital_position, toneburstmode = diseqcParam.B, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.SENDNO, diseqc13V = nim.diseqc13V.value) elif nim.diseqcMode.value == "diseqc_a_b": #DiSEqC A/B fastDiSEqC = nim.simpleDiSEqCOnlyOnSatChange.value setVoltageTone = nim.simpleDiSEqCSetVoltageTone.value - self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AA, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone) - self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcB.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AB, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone) + self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AA, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone, diseqc13V = nim.diseqc13V.value) + self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcB.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AB, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone, diseqc13V = nim.diseqc13V.value) elif nim.diseqcMode.value == "diseqc_a_b_c_d": #DiSEqC A/B/C/D fastDiSEqC = nim.simpleDiSEqCOnlyOnSatChange.value setVoltageTone = nim.simpleDiSEqCSetVoltageTone.value - self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AA, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone) - self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcB.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AB, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone) - self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcC.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.BA, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone) - self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcD.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.BB, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone) + self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AA, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone, diseqc13V = nim.diseqc13V.value) + self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcB.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AB, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone, diseqc13V = nim.diseqc13V.value) + self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcC.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.BA, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone, diseqc13V = nim.diseqc13V.value) + self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcD.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.BB, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone, diseqc13V = nim.diseqc13V.value) elif nim.diseqcMode.value == "positioner": #Positioner if nim.latitudeOrientation.value == "north": laValue = rotorParam.NORTH @@ -219,7 +225,8 @@ class SecConfigure: laDirection = laValue, turningSpeed = turning_speed, useInputPower = useInputPower, - inputPowerDelta = inputPowerDelta) + inputPowerDelta = inputPowerDelta, + diseqc13V = nim.diseqc13V.value) elif nim.configMode.value == "advanced": #advanced config self.updateAdvanced(sec, x) print "sec config completed" @@ -383,7 +390,10 @@ class SecConfigure: satpos = y currSat = config.Nims[slotid].advanced.sat[satpos] if currSat.voltage.value == "polarization": - sec.setVoltageMode(switchParam.HV) + if config.Nims[slotid].diseqc13V.value: + sec.setVoltageMode(switchParam.HV_13) + else: + sec.setVoltageMode(switchParam.HV) elif currSat.voltage.value == "13V": sec.setVoltageMode(switchParam._14V) elif currSat.voltage.value == "18V": @@ -902,6 +912,8 @@ def InitNimManager(nimmgr): # nim.configMode.value = "simple" # nim.configMode.save() + nim.diseqc13V = ConfigYesNo(default = False) + nim.diseqcMode = ConfigSelection( choices = [ ("single", _("Single")), -- cgit v1.2.3 From 04b3fc4ece96fd8dc6c7d53bd55e9ee1b7bf8b3b Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Wed, 26 Nov 2008 13:31:41 +0100 Subject: add frisian language, update language cache --- data/countries/x-fy.png | Bin 0 -> 2685 bytes lib/python/Components/Language.py | 1 + lib/python/Components/language_cache.py | 140 +- po/Makefile.am | 2 +- po/fy.po | 4615 +++++++++++++++++++++++++++++++ 5 files changed, 4737 insertions(+), 21 deletions(-) create mode 100644 data/countries/x-fy.png create mode 100644 po/fy.po (limited to 'lib/python/Components') diff --git a/data/countries/x-fy.png b/data/countries/x-fy.png new file mode 100644 index 00000000..ac32ca28 Binary files /dev/null and b/data/countries/x-fy.png differ diff --git a/lib/python/Components/Language.py b/lib/python/Components/Language.py index 6d1e31f3..395f6829 100644 --- a/lib/python/Components/Language.py +++ b/lib/python/Components/Language.py @@ -36,6 +36,7 @@ class Language: self.addLanguage(_("Swedish"), "sv", "SE") self.addLanguage(_("Turkish"), "tr", "TR") self.addLanguage(_("Ukrainian"), "uk", "UA") + self.addLanguage(_("Frisian"), "fy", "x-FY") # there is no separate country for frisian self.callbacks = [] diff --git a/lib/python/Components/language_cache.py b/lib/python/Components/language_cache.py index 046f281d..a9c02bc0 100644 --- a/lib/python/Components/language_cache.py +++ b/lib/python/Components/language_cache.py @@ -4,6 +4,7 @@ LANG_TEXT = { "fr_FR": "French", "fi_FI": "Finnish", "pt_PT": "Portuguese", + "fy_x-FY": "Frisian", "it_IT": "Italian", "no_NO": "Norwegian", "nl_NL": "Dutch", @@ -21,6 +22,7 @@ LANG_TEXT = { "tr_TR": "Turkish", "de_DE": "German", "ar_AE": "Arabic", + "uk_UA": "Ukrainian", "sv_SE": "Swedish", "pl_PL": "Polish", "T1": "Please use the UP and DOWN keys to select your language. Afterwards press the OK button.", @@ -30,6 +32,7 @@ LANG_TEXT = { "fr_FR": "Französisch", "fi_FI": "Finnisch", "pt_PT": "portugiesisch", + "fy_x-FY": "Frisian", "it_IT": "Italienisch", "no_NO": "Norwegisch", "nl_NL": "Holländisch", @@ -47,6 +50,7 @@ LANG_TEXT = { "tr_TR": "Türkisch", "de_DE": "Deutsch", "ar_AE": "Arabisch", + "uk_UA": "Ukrainian", "sv_SE": "Schwedisch", "pl_PL": "Polnisch", "T1": "Bitte benutzen Sie die Hoch/Runter-Tasten, um Ihre Sprache auszuwählen. Danach drücken Sie bitte OK.", @@ -56,6 +60,7 @@ LANG_TEXT = { "fr_FR": "French", "fi_FI": "Finnish", "pt_PT": "Portuguese", + "fy_x-FY": "Frisian", "it_IT": "Italian", "no_NO": "Norwegian", "nl_NL": "Dutch", @@ -73,6 +78,7 @@ LANG_TEXT = { "tr_TR": "Turkish", "de_DE": "المانـى", "ar_AE": "Arabic", + "uk_UA": "Ukrainian", "sv_SE": "Swedish", "pl_PL": "Polish", "T1": "Please use the UP and DOWN keys to select your language. Afterwards press the OK button.", @@ -82,6 +88,7 @@ LANG_TEXT = { "fr_FR": "Francès", "fi_FI": "Finlandès", "pt_PT": "Portuguès", + "fy_x-FY": "Frisian", "it_IT": "Italià", "no_NO": "Noruec", "nl_NL": "Holandès", @@ -99,6 +106,7 @@ LANG_TEXT = { "tr_TR": "Turc", "de_DE": "Alemany", "ar_AE": "Àrab", + "uk_UA": "Ukrainian", "sv_SE": "Suec", "pl_PL": "Polish", "T1": "Please use the UP and DOWN keys to select your language. Afterwards press the OK button.", @@ -108,6 +116,7 @@ LANG_TEXT = { "fr_FR": "Francuski", "fi_FI": "Finski", "pt_PT": "Portugalski", + "fy_x-FY": "Frisian", "it_IT": "Talijanski", "no_NO": "Norveški", "nl_NL": "Nizozemski", @@ -125,6 +134,7 @@ LANG_TEXT = { "tr_TR": "Turski", "de_DE": "Njemački", "ar_AE": "Arabski", + "uk_UA": "Ukrainian", "sv_SE": "Švedski", "pl_PL": "Poljski", "T1": "Please use the UP and DOWN keys to select your language. Afterwards press the OK button.", @@ -134,6 +144,7 @@ LANG_TEXT = { "fr_FR": "Francouzsky", "fi_FI": "Finsky", "pt_PT": "Portugalsky", + "fy_x-FY": "Frisian", "it_IT": "Italsky", "no_NO": "Norsky", "nl_NL": "Holandsky", @@ -151,6 +162,7 @@ LANG_TEXT = { "tr_TR": "Turecky", "de_DE": "Německy", "ar_AE": "Arabsky", + "uk_UA": "Ukrainian", "sv_SE": "Švédsky", "pl_PL": "Polsky", "T1": "Please use the UP and DOWN keys to select your language. Afterwards press the OK button.", @@ -160,6 +172,7 @@ LANG_TEXT = { "fr_FR": "Fransk", "fi_FI": "Finsk", "pt_PT": "Portugisisk", + "fy_x-FY": "Frisian", "it_IT": "Italiensk", "no_NO": "Norsk", "nl_NL": "Hollandsk", @@ -177,6 +190,7 @@ LANG_TEXT = { "tr_TR": "Tyrkisk", "de_DE": "Tysk", "ar_AE": "Arabisk", + "uk_UA": "Ukrainian", "sv_SE": "Svensk", "pl_PL": "Polsk", "T1": "Benyt venligst OP og NED tasten til at vælge sprog. Tryk bagefter på OK knappen.", @@ -186,6 +200,7 @@ LANG_TEXT = { "fr_FR": "Frans", "fi_FI": "Fins", "pt_PT": "Portugees", + "fy_x-FY": "Frisian", "it_IT": "Italiaans", "no_NO": "Noors", "nl_NL": "Nederlands", @@ -203,6 +218,7 @@ LANG_TEXT = { "tr_TR": "Turks", "de_DE": "Duits", "ar_AE": "Arabisch", + "uk_UA": "Ukrainian", "sv_SE": "Zweeds", "pl_PL": "Pools", "T1": "Gebruik de omhoog/omlaag toeten om de gewenste taal te selecteren. Druk daarna op OK.", @@ -212,6 +228,7 @@ LANG_TEXT = { "fr_FR": "Ranska", "fi_FI": "Suomi", "pt_PT": "Portugali", + "fy_x-FY": "Frisian", "it_IT": "Italia", "no_NO": "Norja", "nl_NL": "Hollanti", @@ -229,15 +246,17 @@ LANG_TEXT = { "tr_TR": "Turkki", "de_DE": "Saksa", "ar_AE": "Arabia", + "uk_UA": "Ukrainian", "sv_SE": "Ruotsi", "pl_PL": "Puola", - "T1": "Valitse kieli ylös/alas nappuloilla ja paina OK.", + "T1": "Valitse kieli ylös/alas näppäimillä ja paina OK-näppäintä.", "T2": "Kielivalinta", }, "fr_FR": { "fr_FR": "Français", "fi_FI": "Finlandais", "pt_PT": "Portugais", + "fy_x-FY": "Frisian", "it_IT": "Italien", "no_NO": "Norvégien", "nl_NL": "Hollandais", @@ -255,6 +274,7 @@ LANG_TEXT = { "tr_TR": "Turke", "de_DE": "Allemand", "ar_AE": "Arabe", + "uk_UA": "Ukrainian", "sv_SE": "Suédois", "pl_PL": "Polonais", "T1": "Veuillez utiliser les touches HAUT et BAS pour choisir votre langage. Ensuite presser le bouton OK.", @@ -264,6 +284,7 @@ LANG_TEXT = { "fr_FR": "Γαλλικά", "fi_FI": "Φιλλανδικά", "pt_PT": "Πορτογαλλικά", + "fy_x-FY": "Frisian", "it_IT": "Ιταλικά", "no_NO": "Νορβηφικά", "nl_NL": "Ολλανδικά", @@ -281,6 +302,7 @@ LANG_TEXT = { "tr_TR": "Τούρκικα", "de_DE": "Γερμανικά", "ar_AE": "Αραβικά", + "uk_UA": "Ukrainian", "sv_SE": "Σουιδεζικά", "pl_PL": "Πολωνικά", "T1": "Please use the UP and DOWN keys to select your language. Afterwards press the OK button.", @@ -290,6 +312,7 @@ LANG_TEXT = { "fr_FR": "Francia", "fi_FI": "Finn", "pt_PT": "Portugál", + "fy_x-FY": "Frisian", "it_IT": "Olasz", "no_NO": "Norvég", "nl_NL": "Holland", @@ -307,6 +330,7 @@ LANG_TEXT = { "tr_TR": "Török", "de_DE": "Német", "ar_AE": "Arab", + "uk_UA": "Ukrainian", "sv_SE": "Svéd", "pl_PL": "Lengyel", "T1": "Please use the UP and DOWN keys to select your language. Afterwards press the OK button.", @@ -316,6 +340,7 @@ LANG_TEXT = { "fr_FR": "Prancūzų", "fi_FI": "Suomių", "pt_PT": "Portugalų", + "fy_x-FY": "Frisian", "it_IT": "Italų", "no_NO": "Norvegų", "nl_NL": "Olandų", @@ -333,6 +358,7 @@ LANG_TEXT = { "tr_TR": "Turkų", "de_DE": "Vokiečių", "ar_AE": "Arabų", + "uk_UA": "Ukrainiečių", "sv_SE": "Švedų", "pl_PL": "Lenkų", "T1": "Prašome naudoti AUKŠTYN IR ŽEMYN mygtukus, kad išsirinktumėte savo kalbą. Po to spauskite OK mygtuką.", @@ -342,6 +368,7 @@ LANG_TEXT = { "fr_FR": "Franska", "fi_FI": "Finnska", "pt_PT": "Portúgalska", + "fy_x-FY": "Frisian", "it_IT": "Ítalska", "no_NO": "Norska", "nl_NL": "Hollenska", @@ -359,15 +386,17 @@ LANG_TEXT = { "tr_TR": "Tyrkneska", "de_DE": "Þýska", "ar_AE": "Arabíska", + "uk_UA": "Ukrainian", "sv_SE": "Sænskt", "pl_PL": "Pólska", - "T1": "Please use the UP and DOWN keys to select your language. Afterwards press the OK button.", + "T1": "Vinsamlega notið UP og NIÐUR takka til að velja tungumál. Ýttu svo á OK til að nota.", "T2": "Val tungumáls", }, "it_IT": { "fr_FR": "Francese", "fi_FI": "Finlandese", "pt_PT": "Portoghese", + "fy_x-FY": "Frisian", "it_IT": "Italiano", "no_NO": "Norvegese", "nl_NL": "Olandese", @@ -385,6 +414,7 @@ LANG_TEXT = { "tr_TR": "Turco", "de_DE": "Tedesco", "ar_AE": "Arabo", + "uk_UA": "Ucraino", "sv_SE": "Svedese", "pl_PL": "Polacco", "T1": "Selezionare la propria lingua utilizzando i tasti Sù/Giù. Premere OK per confermare.", @@ -394,6 +424,7 @@ LANG_TEXT = { "fr_FR": "Fransk", "fi_FI": "Finsk", "pt_PT": "Portugisisk", + "fy_x-FY": "Frisian", "it_IT": "Italiensk", "no_NO": "Norsk", "nl_NL": "Nederlandsk", @@ -411,6 +442,7 @@ LANG_TEXT = { "tr_TR": "Tyrkisk", "de_DE": "Tysk", "ar_AE": "Arabisk", + "uk_UA": "Ukrainian", "sv_SE": "Svensk", "pl_PL": "Polsk", "T1": "Please use the UP and DOWN keys to select your language. Afterwards press the OK button.", @@ -420,6 +452,7 @@ LANG_TEXT = { "fr_FR": "Francuski", "fi_FI": "Fiński", "pt_PT": "Portugalski", + "fy_x-FY": "Frisian", "it_IT": "Włoski", "no_NO": "Norweski", "nl_NL": "Holenderski", @@ -437,6 +470,7 @@ LANG_TEXT = { "tr_TR": "Turecki", "de_DE": "Niemiecki", "ar_AE": "Arabski", + "uk_UA": "Ukrainian", "sv_SE": "Szwedzki", "pl_PL": "Polski", "T1": "W celu wyboru języka użyj klawiszy GÓRA i DÓŁ. Nastepnie nacisnij przycisk OK.", @@ -446,6 +480,7 @@ LANG_TEXT = { "fr_FR": "Francês", "fi_FI": "Finlandês", "pt_PT": "Português", + "fy_x-FY": "Frisian", "it_IT": "Italiano", "no_NO": "Norueguês", "nl_NL": "Holandês", @@ -463,6 +498,7 @@ LANG_TEXT = { "tr_TR": "Turco", "de_DE": "Alemão", "ar_AE": "Arabe", + "uk_UA": "Ukrainian", "sv_SE": "Sueco", "pl_PL": "Polaco", "T1": "Please use the UP and DOWN keys to select your language. Afterwards press the OK button.", @@ -472,6 +508,7 @@ LANG_TEXT = { "fr_FR": "Французский", "fi_FI": "Окончание", "pt_PT": "Portuguese", + "fy_x-FY": "Frisian", "it_IT": "Итальянский", "no_NO": "Норвежский", "nl_NL": "Нидерландский", @@ -489,6 +526,7 @@ LANG_TEXT = { "tr_TR": "Турецкий", "de_DE": "Немецкий", "ar_AE": "Арабский", + "uk_UA": "Ukrainian", "sv_SE": "Шведский", "pl_PL": "Polish", "T1": "Please use the UP and DOWN keys to select your language. Afterwards press the OK button.", @@ -498,6 +536,7 @@ LANG_TEXT = { "fr_FR": "Francés", "fi_FI": "Finlandés", "pt_PT": "Portugués", + "fy_x-FY": "Frisian", "it_IT": "Italiano", "no_NO": "Noruego", "nl_NL": "Alemán", @@ -515,6 +554,7 @@ LANG_TEXT = { "tr_TR": "Turco", "de_DE": "Alemán", "ar_AE": "Arábigo", + "uk_UA": "Ukrainian", "sv_SE": "Sueco", "pl_PL": "Polaco", "T1": "Use las teclas ARRIBA y ABAJO para seleccionar su idioma. Después, pulse el botón OK.", @@ -524,6 +564,7 @@ LANG_TEXT = { "fr_FR": "Franska", "fi_FI": "Finska", "pt_PT": "Portugisiska", + "fy_x-FY": "Frisian", "it_IT": "Italienska", "no_NO": "Norska", "nl_NL": "Holländska", @@ -541,6 +582,7 @@ LANG_TEXT = { "tr_TR": "Turkiska", "de_DE": "Tyska", "ar_AE": "Arabiska", + "uk_UA": "Ukrainian", "sv_SE": "Svenska", "pl_PL": "Polska", "T1": "Vänligen använd UPP och NER pil för att välja språk. Efter val tryck på OK knappen.", @@ -548,28 +590,86 @@ LANG_TEXT = { }, "tr_TR": { "fr_FR": "Fransızca", - "fi_FI": "Bitiş", - "pt_PT": "Portuguese", - "it_IT": "İtalya", - "no_NO": "Norveç", - "nl_NL": "Almanca", + "fi_FI": "Fince", + "pt_PT": "Portekizce", + "fy_x-FY": "Frisian", + "it_IT": "İtalyanca", + "no_NO": "Norveççe", + "nl_NL": "Flemenkçe", "el_GR": "Greek", - "hu_HU": "Hungarian", - "lt_LT": "Lithuanian", - "hr_HR": "Croatian", + "hu_HU": "Macarca", + "lt_LT": "Litvanyaca", + "hr_HR": "Hırvatça", "en_EN": "İngilizce", "es_ES": "İspanyolca", - "ca_AD": "Catalan", - "ru_RU": "Russian", - "is_IS": "izlanda", - "da_DK": "Çanak", - "cs_CZ": "Czech", - "tr_TR": "Turkish", - "de_DE": "Alman", + "ca_AD": "Katalanca", + "ru_RU": "Rusça", + "is_IS": "İzlandaca", + "da_DK": "Danca", + "cs_CZ": "Çekçe", + "tr_TR": "Türkçe", + "de_DE": "Almanca", "ar_AE": "Arapça", - "sv_SE": "İsveç", + "uk_UA": "Ukraynaca", + "sv_SE": "İsveççe", "pl_PL": "Polish", - "T1": "Please use the UP and DOWN keys to select your language. Afterwards press the OK button.", - "T2": "Lisan Seçimi", + "T1": "Dil seçiminizi, yapmak için YUKARI ve AŞAĞI tuşlarını, onaylamak için OK tuşunu kullanın.", + "T2": "Dil seçimi", +}, +"uk_UA": { + "fr_FR": "Французька", + "fi_FI": "Фінська", + "pt_PT": "Португальська", + "fy_x-FY": "Frisian", + "it_IT": "Італійська", + "no_NO": "Норвежська", + "nl_NL": "Данська", + "el_GR": "Грецька", + "hu_HU": "Угорська", + "lt_LT": "Литовська", + "hr_HR": "Хорватьска", + "en_EN": "Англійська", + "es_ES": "Іспанська", + "ca_AD": "Каталонська", + "ru_RU": "Російська", + "is_IS": "Ісландська", + "da_DK": "Данська", + "cs_CZ": "Чешська", + "tr_TR": "Турецька", + "de_DE": "Німецька", + "ar_AE": "Арабський", + "uk_UA": "Ukrainian", + "sv_SE": "Шведська", + "pl_PL": "Польська", + "T1": "Використовуйте кнопки ВВЕРХ і ВНИЗ, щоб вибрати Вашу мову. Після вибору натисніть OK.", + "T2": "Вибір мови", +}, +"fy_x-FY": { + "fr_FR": "Frans", + "fi_FI": "Finsk", + "pt_PT": "Portugeesk", + "fy_x-FY": "Frisian", + "it_IT": "Italiaansk", + "no_NO": "Noarsk", + "nl_NL": "Nederlansk", + "el_GR": "Gryks", + "hu_HU": "Hongaarsk", + "lt_LT": "Lithuaniansk", + "hr_HR": "Kroatysk", + "en_EN": "Engelsk", + "es_ES": "Spaans", + "ca_AD": "Catalânsk", + "ru_RU": "Russysk", + "is_IS": "Iislansk", + "da_DK": "Deensk", + "cs_CZ": "Tsjechysk", + "tr_TR": "Turks", + "de_DE": "Dúts", + "ar_AE": "Arabysk", + "uk_UA": "Ukrainian", + "sv_SE": "Zweeds", + "pl_PL": "Poolsk", + "T1": "Brúk de op en del toets om jo taal te kiezen. Dernei druk op OK", + "T2": "Taal Kieze", }, } diff --git a/po/Makefile.am b/po/Makefile.am index 02727930..26518b56 100644 --- a/po/Makefile.am +++ b/po/Makefile.am @@ -5,7 +5,7 @@ GETTEXT=xgettext #MSGFMT = ./msgfmt.py MSGFMT = msgfmt -LANGS := de en ar nl es is it da sv no fr fi tr ca cs hr hu ru pt el lt pl uk +LANGS := ar ca cs da de el en es fi fr fy hr hu is it lt nl no pl pt ru sv tr uk LANGPO := $(foreach LANG, $(LANGS),$(LANG).po) LANGMO := $(foreach LANG, $(LANGS),$(LANG).mo) diff --git a/po/fy.po b/po/fy.po new file mode 100644 index 00000000..af5e21ad --- /dev/null +++ b/po/fy.po @@ -0,0 +1,4615 @@ +# translation of fy.po to gerrit +# Copyright (C) 2005 THE tuxbox-enigma'S COPYRIGHT HOLDER +# This file is distributed under the same license as the tuxbox-enigma package. +# +# Automatically generated, 2005. +# Gerrit , 2007, 2008. +# gerrit , 2008. +msgid "" +msgstr "" +"Project-Id-Version: fy\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-11-26 13:07+0100\n" +"PO-Revision-Date: 2008-11-15 09:40+0100\n" +"Last-Translator: gerrit \n" +"Language-Team: gerrit \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-Language: Nederlands\n" +"X-Poedit-Country: NEDERLAND\n" +"X-Poedit-SourceCharset: iso-8859-15\n" +"X-Generator: KBabel 1.11.4\n" + +msgid " " +msgstr " " + +msgid "#000000" +msgstr "#000000" + +msgid "#0064c7" +msgstr "#0064c7" + +msgid "#25062748" +msgstr "#25062748" + +msgid "#389416" +msgstr "#389416" + +msgid "#80000000" +msgstr "#80000000" + +msgid "#80ffffff" +msgstr "#80ffffff" + +msgid "#bab329" +msgstr "#bab329" + +msgid "#f23d21" +msgstr "#f23d21" + +msgid "#ffffff" +msgstr "#ffffff" + +msgid "#ffffffff" +msgstr "#ffffffff" + +msgid "%H:%M" +msgstr "%H:%M" + +#, python-format +msgid "%d jobs are running in the background!" +msgstr "%d processen rinne op 'e eftergrûn" + +#, python-format +msgid "%d min" +msgstr "%d min" + +#, python-format +msgid "%d services found!" +msgstr "%d services fûn" + +msgid "%d.%B %Y" +msgstr "%d.%B %Y" + +#, python-format +msgid "" +"%s\n" +"(%s, %d MB free)" +msgstr "" +"%s\n" +"(%s, %d MB frij)" + +#, python-format +msgid "%s (%s)\n" +msgstr "%s (%s)\n" + +msgid "(ZAP)" +msgstr "(ZAP)" + +msgid "(empty)" +msgstr "(leech)" + +msgid "(show optional DVD audio menu)" +msgstr "(opsje DVD lûd menu sjen litte)" + +msgid "* Only available if more than one interface is active." +msgstr "" + +msgid "* Only available when entering hidden SSID or network key" +msgstr "" + +msgid ".NFI Download failed:" +msgstr "flater by it binnenhelje fan .NFI triem." + +msgid "" +".NFI file passed md5sum signature check. You can safely flash this image!" +msgstr "" +".NFI triem goedkarre by de md5sum kontrole. Dit image kin feilich nei flash " +"skreawn wurde." + +msgid "/usr/share/enigma2 directory" +msgstr "/usr/share/enigma2 map" + +msgid "/var directory" +msgstr "/var map" + +msgid "0" +msgstr "0" + +msgid "1" +msgstr "1" + +msgid "1.0" +msgstr "1.0" + +msgid "1.1" +msgstr "1.1" + +msgid "1.2" +msgstr "1.2" + +msgid "12V output" +msgstr "12V útgong" + +msgid "13 V" +msgstr "13 V" + +msgid "16:10" +msgstr "16:10" + +msgid "16:10 Letterbox" +msgstr "16:10 Letterbox" + +msgid "16:10 PanScan" +msgstr "16:10 PanScan" + +msgid "16:9" +msgstr "16:9" + +msgid "16:9 Letterbox" +msgstr "16:9 Letterbox" + +msgid "16:9 always" +msgstr "altiid 16:9" + +msgid "18 V" +msgstr "18 V" + +msgid "2" +msgstr "2" + +msgid "3" +msgstr "3" + +msgid "30 minutes" +msgstr "30 minuten" + +msgid "4" +msgstr "4" + +msgid "4:3" +msgstr "4:3" + +msgid "4:3 Letterbox" +msgstr "4:3 Letterbox" + +msgid "4:3 PanScan" +msgstr "4:3 PanScan" + +msgid "5" +msgstr "5" + +msgid "5 minutes" +msgstr "5 minuten" + +msgid "50 Hz" +msgstr "50 Hz" + +msgid "6" +msgstr "6" + +msgid "60 minutes" +msgstr "60 minuten" + +msgid "7" +msgstr "7" + +msgid "8" +msgstr "8" + +msgid "9" +msgstr "9" + +msgid "" +msgstr "" + +msgid "??" +msgstr "??" + +msgid "A" +msgstr "A" + +#, python-format +msgid "" +"A configuration file (%s) was modified since Installation.\n" +"Do you want to keep your version?" +msgstr "" +"In konfiguraasje triem (%s) wie feroare nei ynstalaasje.\n" +"Wolle jo jo ferzje hâlde ?" + +msgid "" +"A finished record timer wants to set your\n" +"Dreambox to standby. Do that now?" +msgstr "" +"In tiidsbarren wol de Dreambox yn sliipstand\n" +"skeakelje... No nei de sliipstand ?" + +msgid "" +"A finished record timer wants to shut down\n" +"your Dreambox. Shutdown now?" +msgstr "" +"In tiidsbarren wol de Dreambox\n" +"útskeakelje... No útskeakelje ?" + +msgid "A graphical EPG for all services of an specific bouquet" +msgstr "In grafyske EPG foar alle kanalen fan in spesifyk bouquet" + +#, python-format +msgid "" +"A record has been started:\n" +"%s" +msgstr "" +"In opnimmen is start:\n" +"%s" + +msgid "" +"A recording is currently running.\n" +"What do you want to do?" +msgstr "" +"In opnimmen is dwaande.\n" +"Wat wolle jo dwaan ?" + +msgid "" +"A recording is currently running. Please stop the recording before trying to " +"configure the positioner." +msgstr "" +"Opnimmen is dwaande. Stopje it opnimmen earst foar jo de rotor-ynstellingen " +"wizigje." + +msgid "" +"A recording is currently running. Please stop the recording before trying to " +"start the satfinder." +msgstr "" +"Opnimmen is dwaande. Stopje it opnimmen earst, foar jo de satfyner brûke." + +#, python-format +msgid "A required tool (%s) was not found." +msgstr "In benedicht programma (%s) wie net fûn" + +msgid "" +"A sleep timer wants to set your\n" +"Dreambox to standby. Do that now?" +msgstr "" +"In sliiptiidsbarren wol de Dreambox yn paraatstand sette\n" +"Dit no dwaan ?" + +msgid "" +"A sleep timer wants to shut down\n" +"your Dreambox. Shutdown now?" +msgstr "" +"In sliiptiidsbarren wol de Dreambox útskeakelje\n" +"No útskeakelje ?" + +msgid "" +"A timer failed to record!\n" +"Disable TV and try again?\n" +msgstr "" +"In tiidsbarren koe net opnimme!\n" +"TV utskeakelje en opnei besykje ?\n" + +msgid "A/V Settings" +msgstr "A/F ynstellingen" + +msgid "AA" +msgstr "AA" + +msgid "AB" +msgstr "AB" + +msgid "AC3 default" +msgstr "AC3 standert" + +msgid "AC3 downmix" +msgstr "AC3 downmix" + +msgid "AGC" +msgstr "AGC" + +msgid "AGC:" +msgstr "AGC:" + +msgid "About" +msgstr "Oer" + +msgid "About..." +msgstr "Oer...." + +msgid "Action on long powerbutton press" +msgstr "Aksje by lang yndrukken oanknop" + +msgid "Action:" +msgstr "Aksje:" + +msgid "Activate Picture in Picture" +msgstr "PIP ynskeakelje" + +msgid "Activate network settings" +msgstr "Netwurk ynstellingen aktief meitsje" + +msgid "Adapter settings" +msgstr "Adapter ynstellingen" + +msgid "Add" +msgstr "Tafoegje" + +msgid "Add Bookmark" +msgstr "In blêdwizer tafoegje" + +msgid "Add a mark" +msgstr "In merker tafoegje" + +msgid "Add a new title" +msgstr "In nije titel tafoegje" + +msgid "Add timer" +msgstr "In tiidsbarren tafoegje" + +msgid "Add title" +msgstr "In titel tafoegje" + +msgid "Add to bouquet" +msgstr "Oan in boeket tafoegje" + +msgid "Add to favourites" +msgstr "Oan favorieten tafoegje" + +msgid "" +"Adjust the color settings so that all the color shades are distinguishable, " +"but appear as saturated as possible. If you are happy with the result, press " +"OK to close the video fine-tuning, or use the number keys to select other " +"test screens." +msgstr "" +"Feroarje de ynstellingen sa, da't alle skaad fan 'e kleur fuort is, mar wol " +"fol fan kleur binne. Ot jo lokkig binne mei it einresultaat, druk OK om " +"fideo ôfstellen ôf te slúten, of brûk de nûmmer toetsen foar in oar test " +"skerm." + +msgid "Advanced" +msgstr "Afansjearre" + +msgid "Advanced Video Setup" +msgstr "Afansjearre Fideo Ynstellingen" + +msgid "After event" +msgstr "Nei it barren" + +msgid "" +"After the start wizard is completed, you need to protect single services. " +"Refer to your dreambox's manual on how to do that." +msgstr "" +"Ot de startgucheler klear is, kinne jo in service befeilichje. Sjoch yn 'e " +"hânlieding foar ynformaasje." + +msgid "Album:" +msgstr "Album:" + +msgid "All" +msgstr "Alles" + +msgid "All Satellites" +msgstr "Alle Satellyten" + +msgid "Alpha" +msgstr "Alpha" + +msgid "Alternative radio mode" +msgstr "Oare Radio mode" + +msgid "Alternative services tuner priority" +msgstr "Alternatief kanaal tuner prioriteit" + +msgid "An empty filename is illegal." +msgstr "Gjin triemnamme is net tastien" + +msgid "An unknown error occured!" +msgstr "In unbekende flater !" + +msgid "Arabic" +msgstr "Arabysk" + +msgid "" +"Are you sure you want to activate this network configuration?\n" +"\n" +msgstr "" + +msgid "" +"Are you sure you want to restart your network interfaces?\n" +"\n" +msgstr "" +"Wolle jo de netwurk interfaces nij starte?\n" +"\n" + +msgid "Artist:" +msgstr "Artyst:" + +msgid "Ask before shutdown:" +msgstr "Freechje foar it útskeakeljen:" + +msgid "Ask user" +msgstr "freechje gebrûker" + +msgid "Aspect Ratio" +msgstr "Aspect ratio" + +msgid "Audio" +msgstr "Lûd" + +msgid "Audio Options..." +msgstr "Lûd opsjes..." + +msgid "Authoring mode" +msgstr "Authentikaasje troch" + +msgid "Auto" +msgstr "Auto" + +msgid "Auto chapter split every ? minutes (0=never)" +msgstr "Haadstik automatysk eltse ? minuten splitse (0=nea)" + +msgid "Auto scart switching" +msgstr "Auto scart skeakelje" + +msgid "Automatic" +msgstr "Automatysk" + +msgid "Automatic Scan" +msgstr "Automatysk sykjen" + +msgid "Available format variables" +msgstr "Beskikbere variabele formaten" + +msgid "B" +msgstr "B" + +msgid "BA" +msgstr "BA" + +msgid "BB" +msgstr "BB" + +msgid "BER" +msgstr "BER" + +msgid "BER:" +msgstr "BER:" + +msgid "Back" +msgstr "Werom" + +msgid "Background" +msgstr "Eftergrûn" + +msgid "Backup" +msgstr "Backup" + +msgid "Backup Location" +msgstr "Backup Lokaasje" + +msgid "Backup Mode" +msgstr "Backup Mode" + +msgid "Backup is done. Please press OK to see the result." +msgstr "Backup is klear. Druk Ok foar útfier" + +msgid "Band" +msgstr "Bân" + +msgid "Bandwidth" +msgstr "Bânbridte" + +msgid "Begin time" +msgstr "Begjin tiid" + +msgid "Behavior of 'pause' when paused" +msgstr "Gedrach fan 'pause' yn pause mode" + +msgid "Behavior of 0 key in PiP-mode" +msgstr "Gedrach fan 0 toets yn PiP mode" + +msgid "Behavior when a movie is started" +msgstr "Gedrach wannear in film start is" + +msgid "Behavior when a movie is stopped" +msgstr "Gedrach wannear in film stoppe is" + +msgid "Behavior when a movie reaches the end" +msgstr "Gedrach wannear in film bijna op syn ein is." + +msgid "Bookmarks" +msgstr "Boekmerkers" + +msgid "Brightness" +msgstr "Helderens" + +msgid "Burn DVD" +msgstr "In DVD brâne" + +msgid "Burn existing image to DVD" +msgstr "Besteand Image op DVD skiif brâne" + +msgid "Burn to DVD..." +msgstr "Nei DVD brâne" + +msgid "Bus: " +msgstr "Bus: " + +msgid "" +"By pressing the OK Button on your remote control, the info bar is being " +"displayed." +msgstr "By de Ok toets op jo ôfstansbetsjinning, wurd de ynfo balke toant" + +msgid "C" +msgstr "C" + +msgid "C-Band" +msgstr "C-Bân" + +msgid "CF Drive" +msgstr "CF Drive" + +msgid "CVBS" +msgstr "CVBS" + +msgid "Cable" +msgstr "Kabel" + +msgid "Cache Thumbnails" +msgstr "Cache Plaatsjes" + +msgid "Call monitoring" +msgstr "Skille monitor" + +msgid "Cancel" +msgstr "Ôfbrekke" + +msgid "Cannot parse feed directory" +msgstr "Kin feed map net ferwurkje" + +msgid "Capacity: " +msgstr "Skiif-grutte:" + +msgid "Card" +msgstr "Kaart" + +msgid "Catalan" +msgstr "Catalânsk" + +msgid "Change bouquets in quickzap" +msgstr "Feroarje fan boeket yn quickzap" + +msgid "Change dir." +msgstr "Feroarje dir." + +msgid "Change pin code" +msgstr "Feroarje pinkode" + +msgid "Change service pin" +msgstr "Feroarje service pin" + +msgid "Change service pins" +msgstr "Feroarje service pins" + +msgid "Change setup pin" +msgstr "Feroarje ynstellingen pin" + +msgid "Channel" +msgstr "Kanaal" + +msgid "Channel Selection" +msgstr "Kanaal seleksje" + +msgid "Channel:" +msgstr "Kanaal:" + +msgid "Channellist menu" +msgstr "Kanaal-lyst menu" + +msgid "Chap." +msgstr "Haads." + +msgid "Chapter" +msgstr "Haadstik" + +msgid "Chapter:" +msgstr "Haadstik:" + +msgid "Check" +msgstr "Neisjen" + +msgid "Checking Filesystem..." +msgstr "Bestânsysteem neisjen" + +msgid "Choose Tuner" +msgstr "Kies Tuner" + +msgid "Choose bouquet" +msgstr "Kies bouquet" + +msgid "Choose source" +msgstr "Kies bron" + +msgid "Choose target folder" +msgstr "Kies doel map" + +msgid "Choose your Skin" +msgstr "Kies Oanklaaiing" + +msgid "Cleanup" +msgstr "Opskjinje" + +msgid "Clear before scan" +msgstr "Wiskje foar sykjen ?" + +msgid "Clear log" +msgstr "Log wiskje" + +msgid "Close" +msgstr "Slúte" + +msgid "Code rate high" +msgstr "Kode faasje heech" + +msgid "Code rate low" +msgstr "Kode faasje leech" + +msgid "Coderate HP" +msgstr "Kode faasje HP" + +msgid "Coderate LP" +msgstr "Kode faasje LP" + +msgid "Collection name" +msgstr "Kolleksje namme" + +msgid "Collection settings" +msgstr "Kolleksje ynstellingen" + +msgid "Color Format" +msgstr "Kleur formaat" + +msgid "Command execution..." +msgstr "Kommando útfiere" + +msgid "Command order" +msgstr "Kommando folgoarde" + +msgid "Committed DiSEqC command" +msgstr "Oanwizen DiSEqC kommando" + +msgid "Common Interface" +msgstr "Common Interface" + +msgid "Compact Flash" +msgstr "Compact flash" + +msgid "Compact flash card" +msgstr "Compact flash kaart" + +msgid "Complete" +msgstr "Kompleet" + +msgid "Complex (allows mixing audio tracks and aspects)" +msgstr "" + +msgid "Configuration Mode" +msgstr "Ynstellingen modus" + +msgid "Configuring" +msgstr "Oan it ynstellen" + +msgid "Conflicting timer" +msgstr "Tiidsbarren konflikt" + +msgid "Connected to" +msgstr "Ferbûn mei" + +msgid "Connected to Fritz!Box!" +msgstr "Ferbûn mei Fritz!Box!" + +msgid "Connecting to Fritz!Box..." +msgstr "Ferbine mei Fritz!Box..." + +#, python-format +msgid "" +"Connection to Fritz!Box\n" +"failed! (%s)\n" +"retrying..." +msgstr "" +"Ferbine mei Fritz!Box\n" +"mislearre ! (%s)\n" +"Besykje opnei ..." + +msgid "Constellation" +msgstr "Himmel" + +msgid "Content does not fit on DVD!" +msgstr "Ynhald past net op in DVD !" + +msgid "Continue in background" +msgstr "Fjierder gean yn 'e eftergrûn" + +msgid "Continue playing" +msgstr "Kontinu spielje" + +msgid "Contrast" +msgstr "Kontrast" + +msgid "Could not connect to Dreambox .NFI Image Feed Server:" +msgstr "Kin net ferbine mei Dreambox .NFI Image feed server:" + +msgid "Could not load Medium! No disc inserted?" +msgstr "Koe medium net lade ! Is der wol in disc oanwezig ?" + +msgid "Create DVD-ISO" +msgstr "Meitsje DVD-ISO" + +msgid "Create movie folder failed" +msgstr "Meitjse fan film map mislearre" + +#, python-format +msgid "Creating directory %s failed." +msgstr "Meitjse fan map %s is mislearre" + +msgid "Creating partition failed" +msgstr "Meitsjen fan partisje is mislearre" + +msgid "Croatian" +msgstr "Kroatysk" + +msgid "Current Transponder" +msgstr "Hjoeddeiske Transponder" + +msgid "Current settings:" +msgstr "Hjoeddeiske ynstellingen:" + +msgid "Current version:" +msgstr "Hjoeddeiske ferzje :" + +msgid "Custom skip time for '1'/'3'-keys" +msgstr "Brûker spring tiid foar knoppen 1-3" + +msgid "Custom skip time for '4'/'6'-keys" +msgstr "Brûker spring tiid foar knoppen 4-6" + +msgid "Custom skip time for '7'/'9'-keys" +msgstr "Brûker spring tiid foar knoppen 7-9" + +msgid "Customize" +msgstr "Oanpasse" + +msgid "Cut" +msgstr "Knip" + +msgid "Cutlist editor..." +msgstr "Kniplyst bewurker..." + +msgid "Czech" +msgstr "Tsjechysk" + +msgid "D" +msgstr "D" + +msgid "DHCP" +msgstr "DHCP" + +msgid "DVB-S" +msgstr "DVB-S" + +msgid "DVB-S2" +msgstr "DVB-S2" + +msgid "DVD Player" +msgstr "DVD Spieler" + +msgid "DVD media toolbox" +msgstr "DVD media arkbak" + +msgid "Danish" +msgstr "Deensk" + +msgid "Date" +msgstr "Datum" + +msgid "Deep Standby" +msgstr "Sliip stand" + +msgid "Default services lists" +msgstr "Standert ynstellingen lysten" + +msgid "Default settings" +msgstr "Standert ynstellingen" + +msgid "Delay" +msgstr "Fertraging" + +msgid "Delete" +msgstr "Ferwiderje" + +msgid "Delete entry" +msgstr "Ferwiderje ynfier" + +msgid "Delete failed!" +msgstr "Ferwiderjen mislearre!" + +#, python-format +msgid "" +"Delete no more configured satellite\n" +"%s?" +msgstr "" +"Ferwiderje de net brûkte satellyt\n" +"%s?" + +msgid "Description" +msgstr "Beskriuwing" + +msgid "Destination directory" +msgstr "Doel Directory" + +msgid "Detected HDD:" +msgstr "Fûne hurde skiif:" + +msgid "Detected NIMs:" +msgstr "Fûne Tuners:" + +msgid "DiSEqC" +msgstr "DiSEqC" + +msgid "DiSEqC A/B" +msgstr "DiSEqC A/B" + +msgid "DiSEqC A/B/C/D" +msgstr "DiSEqC A/B/C/D" + +msgid "DiSEqC mode" +msgstr "DiSEqC-Mode" + +msgid "DiSEqC repeats" +msgstr "DiSEqC herhellingen" + +msgid "Direct playback of linked titles without menu" +msgstr "Direkt ôfspielje fan keppele titels sûnder menu" + +#, python-format +msgid "Directory %s nonexistent." +msgstr "Map %s bestiit net" + +msgid "Disable" +msgstr "Utskeakelje" + +msgid "Disable Picture in Picture" +msgstr "PIP utskeakelje" + +msgid "Disable Subtitles" +msgstr "Undertitels út" + +msgid "Disable timer" +msgstr "Tiidstjoering útskeakelje" + +msgid "Disabled" +msgstr "Utskeakele" + +#, python-format +msgid "" +"Disconnected from\n" +"Fritz!Box! (%s)\n" +"retrying..." +msgstr "" +"Ferbining ferbrutsen mei\n" +"Fritz!Box! (%s)\n" +"besyket nochris..." + +msgid "Dish" +msgstr "Panne" + +msgid "Display 16:9 content as" +msgstr "16:9 ynhâld sjen litte as" + +msgid "Display 4:3 content as" +msgstr "4:3 ynhâld sjen litte as" + +msgid "Display Setup" +msgstr "Ynstellingen sjen litte" + +#, python-format +msgid "" +"Do you really want to REMOVE\n" +"the plugin \"%s\"?" +msgstr "Wolle jo wier de plugin \"%s\" ferwiderje ?" + +msgid "" +"Do you really want to check the filesystem?\n" +"This could take lots of time!" +msgstr "Wolle jo echt it bestânsysteem neisjen ?
Dit kin lang duorje !" + +#, python-format +msgid "Do you really want to delete %s?" +msgstr "Wolle jo wier %s ferwiderje?" + +#, python-format +msgid "" +"Do you really want to download\n" +"the plugin \"%s\"?" +msgstr "Wolle jo wier de plugin \"%s\" binnenhelje ?" + +msgid "" +"Do you really want to initialize the harddisk?\n" +"All data on the disk will be lost!" +msgstr "" + +#, python-format +msgid "Do you really want to remove directory %s from the disk?" +msgstr "Wolle jo echt map %s ferwiderje van skiif ?" + +#, python-format +msgid "Do you really want to remove your bookmark of %s?" +msgstr "Wolle jo echt boekmerk fan %s ferwiderje ?" + +msgid "" +"Do you want to backup now?\n" +"After pressing OK, please wait!" +msgstr "" +"Wolle jo no in backup meitsje?\n" +"Nei OK, eefkes wachtsje" + +msgid "Do you want to burn this collection to DVD medium?" +msgstr "Wolle jo dizze kolleksje nei DVD brâne ?" + +msgid "Do you want to do a service scan?" +msgstr "Wolle jo no nei kanalen sykje ?" + +msgid "Do you want to do another manual service scan?" +msgstr "Wolle jo opnei mei de hân sykje ?" + +msgid "Do you want to enable the parental control feature on your dreambox?" +msgstr "Wolle jo it berne slot ynskeakelje ?" + +msgid "Do you want to install default sat lists?" +msgstr "Wolle jo de standert sat lysten installearje ?" + +msgid "Do you want to play DVD in drive?" +msgstr "Wolle jo de DVD ôfspielje ?" + +msgid "Do you want to preview this DVD before burning?" +msgstr "Wolle jo de DVD besjen foar it brânen ?" + +msgid "Do you want to restore your settings?" +msgstr "Wolle jo jo ynstellingen wêrom sette ?" + +msgid "Do you want to resume this playback?" +msgstr "Wolle jo dit opnimmen fjierder ôfspielje ?" + +msgid "" +"Do you want to update your Dreambox?\n" +"After pressing OK, please wait!" +msgstr "" +"Wolle jo jo dreambox bywurkje ?\n" +"Nei Ok, eefkes geduld !" + +msgid "Do you want to view a tutorial?" +msgstr "Wolle jo in foarbyld sjen ?" + +msgid "Don't stop current event but disable coming events" +msgstr "Dit barren net stopje, maar oankommende barren útskeakelje" + +#, python-format +msgid "Done - Installed or upgraded %d packages" +msgstr "Dien - %d paket(ten) ynstalllearre of bywurke" + +#, python-format +msgid "Done - Installed or upgraded %d packages with %d errors" +msgstr "Klear - %d paket(ten) ynstallearre of bywurke mei %d flaters" + +msgid "Download" +msgstr "Binnenhelje" + +msgid "Download .NFI-Files for USB-Flasher" +msgstr "Binnenhelje fan .NFI triemen foar USB Flasher" + +msgid "Download Plugins" +msgstr "Ynstekkers binnenhelje" + +msgid "Download of USB flasher boot image failed: " +msgstr "Binnenhelje fan USB boot image misljearre:" + +msgid "Downloadable new plugins" +msgstr "Binnen te heljen nije ynstekkers" + +msgid "Downloadable plugins" +msgstr "Binnen te heljen ynstekkers" + +msgid "Downloading" +msgstr "Binnenheljen fan" + +msgid "Downloading plugin information. Please wait..." +msgstr "Binnenheljen fan ynstekker ynformaasje..." + +msgid "Dreambox format data DVD (HDTV compatible)" +msgstr "Dreambox yndieling data DVD (HDTV geskikt)" + +msgid "Dutch" +msgstr "Nederlansk" + +msgid "E" +msgstr "E" + +msgid "EPG Selection" +msgstr "EPG Seleksje" + +#, python-format +msgid "ERROR - failed to scan (%s)!" +msgstr "Flater - Sykjen mislearre (%s)!" + +msgid "East" +msgstr "East" + +msgid "Edit" +msgstr "" + +msgid "Edit DNS" +msgstr "Wyzigje de DNS" + +msgid "Edit Title" +msgstr "" + +msgid "Edit chapters of current title" +msgstr "Bewurkje haadstik fan dizze titel" + +msgid "Edit services list" +msgstr "Wyzigje kanaallyst" + +msgid "Edit settings" +msgstr "Wyzigje ynstellingen" + +msgid "Edit the Nameserver configuration of your Dreambox.\n" +msgstr "Bewrukje de nammeserver ynstellingen fan de Dreambox.\n" + +msgid "Edit the network configuration of your Dreambox.\n" +msgstr "Bewurkje de netwurk ynstellingen fan de Dreambox.\n" + +msgid "Edit title" +msgstr "Bewukje titel" + +msgid "Electronic Program Guide" +msgstr "Elektroniske Programma Gids" + +msgid "Enable" +msgstr "Ynskeakelje" + +msgid "Enable 5V for active antenna" +msgstr "5V ynskeakelje foar hjoeddeiske antenne" + +msgid "Enable multiple bouquets" +msgstr "Mear boeketten sjen litte" + +msgid "Enable parental control" +msgstr "Alderlik tasjoch ynskeakelje" + +msgid "Enable timer" +msgstr "Tiidsjtoering ynskeakelje" + +msgid "Enabled" +msgstr "Ynskeakele" + +msgid "Encryption" +msgstr "Encryption" + +msgid "Encryption Key" +msgstr "Encryption Kaai" + +msgid "Encryption Keytype" +msgstr "" + +msgid "Encryption Type" +msgstr "Encryption Type" + +msgid "End time" +msgstr "Eintiid" + +msgid "EndTime" +msgstr "Eintiid" + +msgid "English" +msgstr "Engelsk" + +msgid "" +"Enigma2 Skinselector v0.5 BETA\n" +"\n" +"If you experience any problems please contact\n" +"stephan@reichholf.net\n" +"\n" +"© 2006 - Stephan Reichholf" +msgstr "" +"Enigma2 Skinselector v0.5 BETA\n" +"\n" +"Ot jo problemen hawwe, kinne jo stephan@reichholf.net\n" +"probearje te beriken\n" +"© 2006 - Stephan Reichholf" + +#. TRANSLATORS: Note that "Enter" in the two strings below should *not* +#. be interpreted as "Give speed as input". The intended meaning is +#. instead "Initial speed when starting winding", i.e. the speed at +#. which "winding mode" is entered when first pressing "rewind" or +#. "fast forward". +msgid "Enter Fast Forward at speed" +msgstr "Ynjefte rap foarút by faasje" + +msgid "Enter Rewind at speed" +msgstr "Ynjefte rap efterút by faasje" + +msgid "Enter WLAN network name/SSID:" +msgstr "" + +msgid "Enter WLAN passphrase/key:" +msgstr "" + +msgid "Enter main menu..." +msgstr "Nei it haadmenu..." + +msgid "Enter the service pin" +msgstr "Fier de service pin yn" + +msgid "Error" +msgstr "Flater" + +msgid "Error executing plugin" +msgstr "Flater by útfieren fan ynstekker" + +#, python-format +msgid "" +"Error: %s\n" +"Retry?" +msgstr "" +"Flater: %s\n" +"Opnei ?" + +msgid "Eventview" +msgstr "Barren oersjoch" + +msgid "Everything is fine" +msgstr "Alles is goed" + +msgid "Execution Progress:" +msgstr "Utfieren foarutgong:" + +msgid "Execution finished!!" +msgstr "Utfiering klear.." + +msgid "Exif" +msgstr "" + +msgid "Exit" +msgstr "ofslúte" + +msgid "Exit editor" +msgstr "Bewurker ofslúte" + +msgid "Exit the wizard" +msgstr "De gucheler ofslúte" + +msgid "Exit wizard" +msgstr "Gucheler ofslúte" + +msgid "Expert" +msgstr "Avansearre" + +msgid "Extended Networksetup Plugin..." +msgstr "Utwreide Netwurkynstellingen Ynstekker..." + +msgid "Extended Setup..." +msgstr "Utwreide Ynstellingen..." + +msgid "Extensions" +msgstr "Utwreidingen" + +msgid "FEC" +msgstr "FEC" + +msgid "Factory reset" +msgstr "Fabryks ynstellingen" + +msgid "Failed" +msgstr "mislearre" + +msgid "Fast" +msgstr "Rap" + +msgid "Fast DiSEqC" +msgstr "Rappe DiSEqC" + +msgid "Fast Forward speeds" +msgstr "Rap foarút faasje" + +msgid "Fast epoch" +msgstr "Snelle epoch" + +msgid "Favourites" +msgstr "Favoryten" + +msgid "Filesystem Check..." +msgstr "Bestânsysteem Neisjen..." + +msgid "Filesystem contains uncorrectable errors" +msgstr "It bestânsysteem hat grutte flaters" + +msgid "Finetune" +msgstr "Fyn ôfstemme" + +msgid "Finished" +msgstr "Ofrûn" + +msgid "Finished configuring your network" +msgstr "" + +msgid "Finished restarting your network" +msgstr "" + +msgid "Finnish" +msgstr "Finsk" + +msgid "" +"First we need to download the latest boot environment for the USB flasher." +msgstr "" +"Earst moat de lêste opstart triemen binnenhelle wurde foar de USB flasher." + +msgid "Flash" +msgstr "Flash" + +msgid "Flashing failed" +msgstr "Flashen misljearre" + +msgid "Font size" +msgstr "Font grutte" + +msgid "Format" +msgstr "Formaat" + +msgid "Frame repeat count during non-smooth winding" +msgstr "Byld herhelling by net glêd foar/efterút spielen" + +msgid "Frame size in full view" +msgstr "" + +msgid "French" +msgstr "Frans" + +msgid "Frequency" +msgstr "Frekwinsje" + +msgid "Frequency bands" +msgstr "Frekwinsje bânnen" + +msgid "Frequency scan step size(khz)" +msgstr "Frekwinsje sykjen stap grutte(kHz)" + +msgid "Frequency steps" +msgstr "Oantal Frekwinsje stappen" + +msgid "Fri" +msgstr "Fre" + +msgid "Friday" +msgstr "Freed" + +msgid "Frisian" +msgstr "" + +msgid "Fritz!Box FON IP address" +msgstr "Fritz!Box FON IP adres" + +#, python-format +msgid "Frontprocessor version: %d" +msgstr "Foarprocessor ferzje: %d" + +msgid "Fsck failed" +msgstr "mislearre fsck" + +msgid "Function not yet implemented" +msgstr "Nog net ynbouwde funksje" + +msgid "" +"GUI needs a restart to apply a new skin\n" +"Do you want to Restart the GUI now?" +msgstr "" +"De GUI moat opnij starte fan wege de nije skin\n" +"Wolle jo de GUI no opnei starte ?" + +msgid "Gateway" +msgstr "Gateway" + +msgid "Genre:" +msgstr "Sjenre:" + +msgid "German" +msgstr "Dúts" + +msgid "Getting plugin information. Please wait..." +msgstr "Binnenhelje fan ynstekker ynformaasje...." + +msgid "Goto 0" +msgstr "Gjin nei 0" + +msgid "Goto position" +msgstr "Gjin nei posysje" + +msgid "Graphical Multi EPG" +msgstr "Grafyske Multi EPG" + +msgid "Greek" +msgstr "Gryks" + +msgid "Guard Interval" +msgstr "ynterfal yn 'e gaten halde" + +msgid "Guard interval mode" +msgstr "Ynterfal modus yn 'e gaten halde" + +msgid "Harddisk" +msgstr "Hurde skiif" + +msgid "Harddisk setup" +msgstr "Hurde skiif ynstellingen" + +msgid "Harddisk standby after" +msgstr "Hurde skiif yn sliipstand nei" + +msgid "Hidden network SSID" +msgstr "" + +msgid "Hierarchy Information" +msgstr "Hiërarchie Ynformaasje" + +msgid "Hierarchy mode" +msgstr "Hiërarchie mode" + +msgid "How many minutes do you want to record?" +msgstr "Hoe folle minuten wolle jo opnimme?" + +msgid "Hungarian" +msgstr "Hongaarsk" + +msgid "IP Address" +msgstr "IP Adres" + +msgid "ISO file is too large for this filesystem!" +msgstr "" + +msgid "ISO path" +msgstr "ISO paad" + +msgid "Icelandic" +msgstr "Iislansk" + +msgid "If you can see this page, please press OK." +msgstr "Kinne dizze side sjen, druk dan op OK" + +msgid "" +"If you see this, something is wrong with\n" +"your scart connection. Press OK to return." +msgstr "" +"Ot jo dit leze, is der iets raar skeef mei\n" +"jo skart oansluting. Druk OK om werom te gean." + +msgid "" +"If your TV has a brightness or contrast enhancement, disable it. If there is " +"something called \"dynamic\", set it to standard. Adjust the backlight level " +"to a value suiting your taste. Turn down contrast on your TV as much as " +"possible.\n" +"Then turn the brightness setting as low as possible, but make sure that the " +"two lowermost shades of gray stay distinguishable.\n" +"Do not care about the bright shades now. They will be set up in the next " +"step.\n" +"If you are happy with the result, press OK." +msgstr "" +"Skeakelje in helderens of kontrast ferbettering op jo TV út. Is der iets mei " +"de namme \"dynamysk\", set it nei standert. Set it eftergrûn helderens nivo " +"nei jo eigen smaak. Set it konstrast sa leech mooglik op jo TV.\n" +"Dan, set it helderens nivo sa leech as mooglik, mar soargje dat de twa " +"leechste griistinten krek anwêzig bliuwe\n" +"Meitsje jo net drok om de helderenstinten no. Die komme werom yn de folgende " +"stap\n" +"Binne jo tefreden mei it resultaat, druk OK" + +msgid "Image flash utility" +msgstr "Image flash ark" + +msgid "Image-Upgrade" +msgstr "Byld-bywurkje" + +msgid "In Progress" +msgstr "Dwaande" + +msgid "" +"In order to record a timer, the TV was switched to the recording service!\n" +msgstr "Op in barren op te nimmen, wurd de TV nei opnimmen skeakele!\n" + +msgid "Increased voltage" +msgstr "Ferheeche spanning" + +msgid "Index" +msgstr "Yndex" + +msgid "InfoBar" +msgstr "Ynfobalke" + +msgid "Infobar timeout" +msgstr "Ynfobalke tiid" + +msgid "Information" +msgstr "Ynformaasje" + +msgid "Init" +msgstr "Initialisearje" + +msgid "Initialization..." +msgstr "Formattearje..." + +msgid "Initialize" +msgstr "Formattearje HDD" + +msgid "Initializing Harddisk..." +msgstr "" + +msgid "Input" +msgstr "Ynfier" + +msgid "Installing" +msgstr "Oan it ynstallearjen" + +msgid "Installing Software..." +msgstr "Software oan it ynstallearjen..." + +msgid "Installing default sat lists... Please wait..." +msgstr "Standert sat lyst oan it ynstalearjen... " + +msgid "Installing defaults... Please wait..." +msgstr "Standert waarden an it ynstellen..." + +msgid "Installing package content... Please wait..." +msgstr "Pakket ynhald an it ynstallearjen... Eefkes wachtsje" + +msgid "Instant Record..." +msgstr "In direct opnimmen..." + +msgid "Integrated Ethernet" +msgstr "Integreerd Ethernet" + +msgid "Integrated Wireless" +msgstr "Integreerd Triidloas" + +msgid "Intermediate" +msgstr "Yntermediate" + +msgid "Internal Flash" +msgstr "Ynterne Flash" + +msgid "Invalid Location" +msgstr "Plak net tastien" + +#, python-format +msgid "Invalid directory selected: %s" +msgstr "Unjildige map selektearre: %s" + +msgid "Inversion" +msgstr "Infertearring" + +msgid "Invert display" +msgstr "Infertearje LCD" + +msgid "Italian" +msgstr "Italiaansk" + +msgid "Job View" +msgstr "Opdracht oansjoch" + +#. TRANSLATORS: (aspect ratio policy: display as fullscreen, even if this breaks the aspect) +msgid "Just Scale" +msgstr "Alinne skale" + +msgid "Keyboard Map" +msgstr "Toetseboerd Map" + +msgid "Keyboard Setup" +msgstr "Toetseboerd Ynstellingen" + +msgid "Keymap" +msgstr "Toetsebord yndieling" + +msgid "LAN Adapter" +msgstr "LAN oanslúting" + +msgid "LNB" +msgstr "LNB" + +msgid "LOF" +msgstr "LOF" + +msgid "LOF/H" +msgstr "LOF/H" + +msgid "LOF/L" +msgstr "LOF/L" + +msgid "Language selection" +msgstr "Taal Kieze" + +msgid "Language..." +msgstr "Taal..." + +msgid "Last speed" +msgstr "Lêste faasje" + +msgid "Latitude" +msgstr "Bridtegraad" + +msgid "Leave DVD Player?" +msgstr "DVD Spieler ôfslúte ?" + +msgid "Left" +msgstr "Links" + +#. TRANSLATORS: (aspect ratio policy: black bars on top/bottom) in doubt, keep english term. +msgid "Letterbox" +msgstr "Letterbox" + +msgid "Limit east" +msgstr "Limyt east" + +msgid "Limit west" +msgstr "Limyt west" + +msgid "Limits off" +msgstr "Limyten út" + +msgid "Limits on" +msgstr "Limyt oan" + +msgid "Link:" +msgstr "Link:" + +msgid "Linked titles with a DVD menu" +msgstr "Keppele titels mei in DVD menu" + +msgid "List of Storage Devices" +msgstr "Lyst Opslach Apparatuur" + +msgid "Lithuanian" +msgstr "Lithuaniansk" + +msgid "Load" +msgstr "Laad" + +msgid "Load Length of Movies in Movielist" +msgstr "Laad lengte fan films yn filmlyst" + +msgid "Local Network" +msgstr "Lokaal netwurk" + +msgid "Location" +msgstr "Doel" + +msgid "Lock:" +msgstr "Slot:" + +msgid "Long Keypress" +msgstr "Lang taste yndrukken" + +msgid "Longitude" +msgstr "Lingtegraad" + +msgid "MMC Card" +msgstr "MMC kaart" + +msgid "MORE" +msgstr "MEER" + +msgid "Main menu" +msgstr "Haad menu" + +msgid "Mainmenu" +msgstr "HaadMenu" + +msgid "Make this mark an 'in' point" +msgstr "Markeer dit as in 'yn' punt" + +msgid "Make this mark an 'out' point" +msgstr "Markeer dit as in 'út' punt" + +msgid "Make this mark just a mark" +msgstr "Meitsje dit in gewoan markeer punt" + +msgid "Manual Scan" +msgstr "Hanmatig sykje" + +msgid "Manual transponder" +msgstr "Hanmatige transponder" + +msgid "Margin after record" +msgstr "Extra tiid nei by it opnimmen" + +msgid "Margin before record (minutes)" +msgstr "Extra tiid foar by it opnimmen" + +msgid "Media player" +msgstr "Media Spieler" + +msgid "MediaPlayer" +msgstr "MediaSpieler" + +msgid "Medium is not a writeable DVD!" +msgstr "Medium is net in skriuwbêre DVD!" + +msgid "Medium is not empty!" +msgstr "Medium is net leech!" + +msgid "Menu" +msgstr "Menu" + +msgid "Message" +msgstr "Berjocht" + +msgid "Mkfs failed" +msgstr "Mkfs mislearre" + +msgid "Mode" +msgstr "Moadus" + +msgid "Model: " +msgstr "Model: " + +msgid "Modulation" +msgstr "Modulaasje" + +msgid "Modulator" +msgstr "Modulator" + +msgid "Mon" +msgstr "Moan" + +msgid "Mon-Fri" +msgstr "Moan - Fre" + +msgid "Monday" +msgstr "Moandei" + +msgid "Mount failed" +msgstr "Oankeppeljen mislearre" + +msgid "Move Picture in Picture" +msgstr "Ferpleats Byld yn Byld" + +msgid "Move east" +msgstr "Draai nei east" + +msgid "Move west" +msgstr "Draai nei west" + +msgid "Movielist menu" +msgstr "Filmlyst menu" + +msgid "Multi EPG" +msgstr "Multi EPG" + +msgid "Multiple service support" +msgstr "Kin meardere utstjoeringen oan" + +msgid "Multisat" +msgstr "Multisat" + +msgid "Mute" +msgstr "Mute" + +msgid "N/A" +msgstr "Net oanwêzig" + +msgid "NEXT" +msgstr "Folgende" + +msgid "NFI image flashing completed. Press Yellow to Reboot!" +msgstr "NFI image flashen is klear. Druk giel om nei te starten!" + +msgid "NOW" +msgstr "No" + +msgid "NTSC" +msgstr "NTSC" + +msgid "Name" +msgstr "Namme" + +msgid "Nameserver" +msgstr "Nammeserver" + +#, python-format +msgid "Nameserver %d" +msgstr "Nammeserver %d" + +msgid "Nameserver Setup" +msgstr "Nammeserver Ynstellingen" + +msgid "Nameserver settings" +msgstr "Nammeserver ynstellingen" + +msgid "Netmask" +msgstr "Netmasker" + +msgid "Network Configuration..." +msgstr "Netwurk configuraasje" + +msgid "Network Mount" +msgstr "Netwurk oankeppelingen" + +msgid "Network SSID" +msgstr "Netwurk SSID" + +msgid "Network Setup" +msgstr "Netwurk Ynstellingen" + +msgid "Network scan" +msgstr "Netwurk ôfsykje" + +msgid "Network setup" +msgstr "Netwurk ynstellingen" + +msgid "Network test" +msgstr "Netwurk test" + +msgid "Network test..." +msgstr "Netwurk test..." + +msgid "Network..." +msgstr "Netwurk..." + +msgid "Network:" +msgstr "Netwurk:" + +msgid "NetworkWizard" +msgstr "Netwurk gûcheler" + +msgid "New" +msgstr "Nij" + +msgid "New pin" +msgstr "Nije pin" + +msgid "New version:" +msgstr "Nije ferzje:" + +msgid "Next" +msgstr "Folgende" + +msgid "No" +msgstr "Nee" + +msgid "No (supported) DVDROM found!" +msgstr "Gjin (ondersteunde) DVDROM fûn!" + +msgid "No 50 Hz, sorry. :(" +msgstr "Gjin 50 Hz, sorry. :(" + +msgid "No HDD found or HDD not initialized!" +msgstr "Gjin hurde skiif fûn of HDD net formatearre!" + +msgid "No Networks found" +msgstr "" + +msgid "No backup needed" +msgstr "Gjin backup nedich" + +msgid "" +"No data on transponder!\n" +"(Timeout reading PAT)" +msgstr "" +"Gjin data op transponder\n" +"(tiid fan lêzen PAT)" + +msgid "No details for this image file" +msgstr "Gjin details beskikber foar dit image triem" + +msgid "No event info found, recording indefinitely." +msgstr "Gjin barren ynfo fûn, giit foar altiid troch mei opnimmen.." + +msgid "No free tuner!" +msgstr "Gjin tuner oer" + +msgid "" +"No packages were upgraded yet. So you can check your network and try again." +msgstr "Pakketten bin net bywurke. Besjoch it netwurk en besykje opnei." + +msgid "No picture on TV? Press EXIT and retry." +msgstr "Gjin plaatsje op TV? Druk EXIT en probearje opnei" + +msgid "No positioner capable frontend found." +msgstr "Gjin posysjesyker foarein fûn." + +msgid "No satellite frontend found!!" +msgstr "Gjin sattelyt foarein fûn." + +msgid "No tags are set on these movies." +msgstr "" + +msgid "No tuner is configured for use with a diseqc positioner!" +msgstr "Der is gjin tuner ynsteld foar gebrûk mei in diseqc posysje syker!" + +msgid "" +"No tuner is enabled!\n" +"Please setup your tuner settings before you start a service scan." +msgstr "" +"Gjin tuner aktief!\n" +"Stel dizze earst yn foar jo kanalen sykje kinne." + +msgid "No useable USB stick found" +msgstr "Gjin brûkbere USB stick fûn" + +msgid "" +"No valid service PIN found!\n" +"Do you like to change the service PIN now?\n" +"When you say 'No' here the service protection stay disabled!" +msgstr "" +"Gjin jildige service PIN fûn !\n" +"Wolle jo dizze no ynstelle ?\n" +"By 'nee' wurd de service befeiliging útskeakele !" + +msgid "" +"No valid setup PIN found!\n" +"Do you like to change the setup PIN now?\n" +"When you say 'No' here the setup protection stay disabled!" +msgstr "" +"Gjin jildige ynstellingen PIN fûn !\n" +"Wolle jo dizze no ynstelle ?\n" +"By 'nee' wurd de ynstellingen befeiliging útskeakele !" + +msgid "" +"No working local network adapter found.\n" +"Please verify that you have attached a network cable and your network is " +"configured correctly." +msgstr "" + +msgid "" +"No working wireless network adapter found.\n" +"Please verify that you have attached a compatible WLAN device and your " +"network is configured correctly." +msgstr "" + +msgid "" +"No working wireless network interface found.\n" +" Please verify that you have attached a compatible WLAN device or enable " +"your local network interface." +msgstr "" + +msgid "No, but restart from begin" +msgstr "Nee, mar start fanôf it begjin" + +msgid "No, do nothing." +msgstr "Nee, doch neat.." + +msgid "No, just start my dreambox" +msgstr "Nee, allinne myn box starte" + +msgid "No, scan later manually" +msgstr "Nee, letter mei de hân sykje" + +msgid "None" +msgstr "Gjin" + +#. TRANSLATORS: (aspect ratio policy: display as fullscreen, with stretching the left/right) +msgid "Nonlinear" +msgstr "Net lineair" + +msgid "North" +msgstr "Noard" + +msgid "Norwegian" +msgstr "Noarsk" + +#, python-format +msgid "" +"Not enough diskspace. Please free up some diskspace and try again. (%d MB " +"required, %d MB available)" +msgstr "" +"Net genôch diskrûmte. Rûmje wat rotzooi op en besykje opnei. (%d MB nedich, %" +"d oanwêzich)" + +msgid "" +"Nothing to scan!\n" +"Please setup your tuner settings before you start a service scan." +msgstr "" +"Neat te sykjen\n" +"Earst de tuner ynstellingen dwaan, foar jo senders sykje kinne." + +msgid "Now Playing" +msgstr "No oan it ôfspieljen" + +msgid "" +"Now, use the contrast setting to turn up the brightness of the background as " +"much as possible, but make sure that you can still see the difference " +"between the two brightest levels of shades.If you have done that, press OK." +msgstr "" +"No, feroare it helderens nivo en set it sa heech, mar wêz seker dat jo " +"altiid nog it ferskil sjogge tusken de twa helderste skaadnivos.Binne jo " +"klear, druk OK" + +msgid "OK" +msgstr "Ok" + +msgid "OK, guide me through the upgrade process" +msgstr "Ok, rin troch it bywurkjen proces" + +msgid "OSD Settings" +msgstr "OSD-ynstellingen" + +msgid "OSD visibility" +msgstr "OSD sichtberhiid" + +msgid "Off" +msgstr "Ut" + +msgid "On" +msgstr "Oan" + +msgid "One" +msgstr "Ien" + +msgid "Online-Upgrade" +msgstr "Online-Bywurkje" + +msgid "Only Free scan" +msgstr "Allinne Freie útstjoeringen" + +msgid "Orbital Position" +msgstr "Rumtelyke posisje" + +msgid "PAL" +msgstr "PAL" + +msgid "PIDs" +msgstr "PIDs" + +msgid "Package list update" +msgstr "Bywurkje pakketlyst " + +msgid "Packet management" +msgstr "Pakket beheer" + +msgid "Page" +msgstr "Side" + +#. TRANSLATORS: (aspect ratio policy: cropped content on left/right) in doubt, keep english term +msgid "Pan&Scan" +msgstr "Pan&Scan" + +msgid "Parent Directory" +msgstr "Boppelizzende map" + +msgid "Parental control" +msgstr "Alderlik tasjoch" + +msgid "Parental control services Editor" +msgstr "Alderlik tasjoch bewurker" + +msgid "Parental control setup" +msgstr "Alderlik tasjoch" + +msgid "Parental control type" +msgstr "Alderlik tasjoch type" + +msgid "Pause movie at end" +msgstr "Film op pause by ein" + +msgid "PiPSetup" +msgstr "PIP Ynstellingen" + +msgid "PicturePlayer" +msgstr "" + +#. TRANSLATORS: (aspect ratio policy: black bars on left/right) in doubt, keep english term. +msgid "Pillarbox" +msgstr "Pillar box" + +msgid "Pilot" +msgstr "Pilot" + +msgid "Pin code needed" +msgstr "Pinkode is needich" + +msgid "Play" +msgstr "Ofspylje" + +msgid "Play Audio-CD..." +msgstr "Ofspylje fan Audio-CD..." + +msgid "Play recorded movies..." +msgstr "Opname films ôfspielje..." + +msgid "Please Reboot" +msgstr "Start Dreambox opnei" + +msgid "Please Select Medium to be Scanned" +msgstr "Graach Medium kieze om ôf te sykjen" + +msgid "Please change recording endtime" +msgstr "Graach eintiid fan it opnimmen feroarje." + +msgid "Please check your network settings!" +msgstr "Graach netwurk ynstellingen neisjen!" + +msgid "Please choose .NFI image file from feed server to download" +msgstr "Graach .NFI image triem kize fan feed server om binnen te heljen" + +msgid "Please choose an extension..." +msgstr "Kies in uitbreiding..." + +msgid "Please choose he package..." +msgstr "Kies it pakket..." + +msgid "Please choose the default services lists you want to install." +msgstr "Kies de standert lysts, welk jo ynstallearje wolle." + +msgid "" +"Please disconnect all USB devices from your Dreambox and (re-)attach the " +"target USB stick (minimum size is 64 MB) now!" +msgstr "" + +msgid "Please do not change any values unless you know what you are doing!" +msgstr "Feroarje gjin waarden, wannear jo net witte wat jo dogge!" + +msgid "Please enter a name for the new bouquet" +msgstr "Namme ynjefte foar it nije bouquet" + +msgid "Please enter a name for the new marker" +msgstr "Namme ynjefte foar in nije markering" + +msgid "Please enter a new filename" +msgstr "Jou in nije bestânnamme yn" + +msgid "Please enter filename (empty = use current date)" +msgstr "Jou in triemnamme yn (leech = datum fan hjoed)" + +msgid "Please enter name of the new directory" +msgstr "Jou in namme yn foar de nije map" + +msgid "Please enter the correct pin code" +msgstr "Graach de júste pinkode yn jaan" + +msgid "Please enter the old pin code" +msgstr "De âlde pinkode graach yn jaan" + +msgid "Please follow the instructions on the TV" +msgstr "Folgje de ynstruksjes op TV" + +msgid "" +"Please note that the previously selected media could not be accessed and " +"therefore the default directory is being used instead." +msgstr "" +"Tink der om dat de foarige selektearre media net oansprutsen wurde koe, en " +"dêrom de standert map brûkt wurd." + +msgid "Please press OK to continue." +msgstr "Druk OK om fierder te gean." + +msgid "Please press OK!" +msgstr "Druk Ok!" + +msgid "Please select .NFI flash image file from medium" +msgstr "Selektearje in .NFI flash image triem fan medium" + +msgid "Please select a playlist to delete..." +msgstr "Selektearje in ofspiellyst om te ferwiderjen..." + +msgid "Please select a playlist..." +msgstr "Selektearje in ofspiellyst" + +msgid "Please select a subservice to record..." +msgstr "Jou in undersender op, om op te nimmen." + +msgid "Please select a subservice..." +msgstr "Selektearje in undersender..." + +msgid "Please select tag to filter..." +msgstr "" + +msgid "Please select target directory or medium" +msgstr "Selektearje doel map of medium" + +msgid "Please select the movie path..." +msgstr "Selektearje it paad nei de film" + +msgid "Please set up tuner B" +msgstr "ynstelle fan tuner B" + +msgid "Please set up tuner C" +msgstr "ynstelle fan tuner C" + +msgid "Please set up tuner D" +msgstr "ynstelle fan tuner D" + +msgid "" +"Please use direction keys to move the PiP window.\n" +"Press Bouquet +/- to resize the window.\n" +"Press OK to go back to the TV mode or EXIT to cancel the moving." +msgstr "" +"Pylkje knoppen om BIB finster te ferskowen.\n" +"Druk Bouquet +/- om finstergrutte te feroarjen" + +msgid "" +"Please use the UP and DOWN keys to select your language. Afterwards press " +"the OK button." +msgstr "Brúk de op en del toets om jo taal te kiezen. Dernei druk op OK" + +msgid "Please wait for activation of your network configuration..." +msgstr "" + +msgid "Please wait while we configure your network..." +msgstr "" + +msgid "Please wait while your network is restarting..." +msgstr "" + +msgid "Please wait..." +msgstr "" + +msgid "Please wait... Loading list..." +msgstr "Lyst wurd laden..." + +msgid "Plugin browser" +msgstr "Ynstekker browser" + +msgid "Plugins" +msgstr "Ynstekkers" + +msgid "Polarity" +msgstr "Polariteit" + +msgid "Polarization" +msgstr "Polarisaasje" + +msgid "Polish" +msgstr "Poolsk" + +msgid "Port A" +msgstr "Poort A" + +msgid "Port B" +msgstr "Poort B" + +msgid "Port C" +msgstr "Poort C" + +msgid "Port D" +msgstr "Poort D" + +msgid "Portuguese" +msgstr "Portugeesk" + +msgid "Positioner" +msgstr "Rotor" + +msgid "Positioner fine movement" +msgstr "Fyn ôfstelling rotor" + +msgid "Positioner movement" +msgstr "Rotor beweging" + +msgid "Positioner setup" +msgstr "Rotor ynstellingen" + +msgid "Positioner storage" +msgstr "Rotor positie opslach" + +msgid "Power threshold in mA" +msgstr "Stroom nivo yn mA" + +msgid "Predefined transponder" +msgstr "Foarôf ynstelde transponder" + +msgid "Preparing... Please wait" +msgstr "Foarbereide fan... Eefkes wachtsje" + +msgid "Press OK on your remote control to continue." +msgstr "Druk OK op of ôfstandsbestjinning om fierder te gean." + +msgid "Press OK to activate the settings." +msgstr "Druk Ok om ynstellingen aktief te meitsjen." + +msgid "Press OK to edit the settings." +msgstr "Druk OK om dizze ynstellingen te bewurkjen" + +msgid "Press OK to scan" +msgstr "Druk Ok om te sykjen" + +msgid "Press OK to start the scan" +msgstr "Druk Ok om sykjen te starten" + +msgid "Prev" +msgstr "Foarige" + +msgid "Preview menu" +msgstr "Foarige menu" + +msgid "Primary DNS" +msgstr "Eerste DNS" + +msgid "Properties of current title" +msgstr "" + +msgid "Protect services" +msgstr "Befeilich kanalen" + +msgid "Protect setup" +msgstr "Ynstellingen befeiligje" + +msgid "Provider" +msgstr "Leveransier" + +msgid "Provider to scan" +msgstr "Utstjoerder ôfsykje" + +msgid "Providers" +msgstr "Providers" + +msgid "Quickzap" +msgstr "Rapzappe" + +msgid "RC Menu" +msgstr "Ofstandsbetsjinnings menu" + +msgid "RF output" +msgstr "RF Ynstellingen" + +msgid "RGB" +msgstr "RGB" + +msgid "RSS Feed URI" +msgstr "RSS Feed URI" + +msgid "Radio" +msgstr "Radio" + +msgid "Ram Disk" +msgstr "Ram Disk" + +msgid "Really close without saving settings?" +msgstr "Slúte sunder op te slaan ?" + +msgid "Really delete done timers?" +msgstr "Ferwiderje diene tiidsbarren?" + +msgid "Really delete this timer?" +msgstr "Dit tiidsbarren ferwiderje?" + +msgid "Really exit the subservices quickzap?" +msgstr "De undersender rapzap ôfslúte?" + +msgid "Really reboot now?" +msgstr "Wier no kompleet opnei starte ?" + +msgid "Really restart now?" +msgstr "Wier no nei starte ?" + +msgid "Really shutdown now?" +msgstr "Wier no kompleet útskeakelje ?" + +msgid "Reboot" +msgstr "kompleet nei starte" + +msgid "Reception Settings" +msgstr "Untfangst Ynstellingen" + +msgid "Record" +msgstr "Opnimme" + +msgid "Recorded files..." +msgstr "Opnâme bestannen..." + +msgid "Recording" +msgstr "An it opnimmen" + +msgid "Recording(s) are in progress or coming up in few seconds!" +msgstr "In Opnimmen is dwaande of start binnen in pear sekonden!" + +msgid "Recordings always have priority" +msgstr "Opnimmen hat altiid foarrang" + +msgid "Reenter new pin" +msgstr "pin opnei ynjaan" + +msgid "Refresh Rate" +msgstr "Fernij faasje" + +msgid "Refresh rate selection." +msgstr "Fernij faasje seleksje" + +msgid "Remove Bookmark" +msgstr "Ferwiderje boekmerk" + +msgid "Remove Plugins" +msgstr "Ferwiderje ynstekkers" + +msgid "Remove a mark" +msgstr "Ferwiderje in Markeerder" + +msgid "Remove currently selected title" +msgstr "Ferwiderje it selektearre bestan" + +msgid "Remove plugins" +msgstr "Ferwiderje ynstekker" + +msgid "Remove the broken .NFI file?" +msgstr "Foute .NFI triem fuortsmite ?" + +msgid "Remove the incomplete .NFI file?" +msgstr "Net komplete .NFI triem fuortsmite ?" + +msgid "Remove title" +msgstr "Ferwiderje de titel" + +#, python-format +msgid "Removing directory %s failed. (Maybe not empty.)" +msgstr "Ferwiderje fan map %s mislearre ( miskien is der net leech )" + +msgid "Rename" +msgstr "Omneame" + +msgid "Repeat" +msgstr "Herhelje" + +msgid "Repeat Type" +msgstr "Herhelje Type" + +msgid "Repeating event currently recording... What do you want to do?" +msgstr "Herhelle barren an it opnimmen... Wat wolle jo dwaan ?" + +msgid "Repeats" +msgstr "Herhellingen" + +msgid "Reset" +msgstr "Reset" + +msgid "Reset and renumerate title names" +msgstr "" + +msgid "Resolution" +msgstr "Skermresolusje" + +msgid "Restart" +msgstr "Opnij starte" + +msgid "Restart GUI" +msgstr "" + +msgid "Restart GUI now?" +msgstr "GUI no opnij starte?" + +msgid "Restart network" +msgstr "Netwurk nij starte" + +msgid "Restart test" +msgstr "Test nij starte" + +msgid "Restart your network connection and interfaces.\n" +msgstr "netwurk oanslúting en interfaces nij starte.\n" + +msgid "Restore" +msgstr "Werom sette" + +msgid "" +"Restoring the settings is done. Please press OK to activate the restored " +"settings now." +msgstr "" +"Werom sette fan ynstellingen is klear. Druk Ok om ynstellingen aktief te " +"meitsjen" + +msgid "Resume from last position" +msgstr "Fierder gean fanôf lêste posysje" + +#. TRANSLATORS: The string "Resuming playback" flashes for a moment +#. TRANSLATORS: at the start of a movie, when the user has selected +#. TRANSLATORS: "Resume from last position" as start behavior. +#. TRANSLATORS: The purpose is to notify the user that the movie starts +#. TRANSLATORS: in the middle somewhere and not from the beginning. +#. TRANSLATORS: (Some translators seem to have interpreted it as a +#. TRANSLATORS: question or a choice, but it is a statement.) +msgid "Resuming playback" +msgstr "Fierder gean mei ôfspieljen" + +msgid "Return to file browser" +msgstr "Werom nei triem browser" + +msgid "Return to movie list" +msgstr "Werom nei de film lyst" + +msgid "Return to previous service" +msgstr "Werom nei foariche service" + +msgid "Rewind speeds" +msgstr "Werom spiel faasje" + +msgid "Right" +msgstr "Rjochts" + +msgid "Rolloff" +msgstr "Utrolje" + +msgid "Rotor turning speed" +msgstr "Rotor rotaasje faasje" + +msgid "Running" +msgstr "Dwaande" + +msgid "Russian" +msgstr "Russysk" + +msgid "S-Video" +msgstr "S Video" + +msgid "SNR" +msgstr "SNR" + +msgid "SNR:" +msgstr "SNR:" + +msgid "Sat" +msgstr "Sneon" + +msgid "Sat / Dish Setup" +msgstr "Sat / Panne Ynstellingen" + +msgid "Satellite" +msgstr "Satellyt" + +msgid "Satellite Equipment Setup" +msgstr "Satellyt ynstellingen" + +msgid "Satellites" +msgstr "Satellyten" + +msgid "Satfinder" +msgstr "Sat syker" + +msgid "Sats" +msgstr "Sats" + +msgid "Saturday" +msgstr "Sneon" + +msgid "Save" +msgstr "Opslaan" + +msgid "Save Playlist" +msgstr "Ofspiellyst opslaan" + +msgid "Scaling Mode" +msgstr "Skaal Moadus" + +msgid "Scan " +msgstr "Sykje" + +msgid "Scan QAM128" +msgstr "Sykje QAM128" + +msgid "Scan QAM16" +msgstr "Sykje QAM16" + +msgid "Scan QAM256" +msgstr "Sykje QAM256" + +msgid "Scan QAM32" +msgstr "Sykje QAM32" + +msgid "Scan QAM64" +msgstr "Sykje QAM64" + +msgid "Scan SR6875" +msgstr "Sykje SR6875" + +msgid "Scan SR6900" +msgstr "Sykje SR6900" + +msgid "Scan Wireless Networks" +msgstr "Sykje Triitloaze netwerken" + +msgid "Scan additional SR" +msgstr "Sykje op in oanfullende SR" + +msgid "Scan band EU HYPER" +msgstr "Sykje op bân EU HYPER" + +msgid "Scan band EU MID" +msgstr "Sykje op bân EU MID" + +msgid "Scan band EU SUPER" +msgstr "Sykje op bân EU SUPER" + +msgid "Scan band EU UHF IV" +msgstr "Sykje op bân EU UHF IV" + +msgid "Scan band EU UHF V" +msgstr "Sykje op bân EU UHF V" + +msgid "Scan band EU VHF I" +msgstr "Sykje op bân EU VHF I" + +msgid "Scan band EU VHF III" +msgstr "Sykje op bân EU VHF III" + +msgid "Scan band US HIGH" +msgstr "Sykje op bân US HIGH" + +msgid "Scan band US HYPER" +msgstr "Sykje op bân US HYPER" + +msgid "Scan band US LOW" +msgstr "Sykje op bân US LOW" + +msgid "Scan band US MID" +msgstr "Sykje op bân US MID" + +msgid "Scan band US SUPER" +msgstr "Sykje op bân US SUPER" + +msgid "" +"Scan your network for wireless Access Points and connect to them using your " +"WLAN USB Stick\n" +msgstr "" +"Sykje nei triidloaze oankeppel punten en ferbyn der mei troch de WLAN USB " +"stick\n" + +msgid "" +"Scans default lamedbs sorted by satellite with a connected dish positioner" +msgstr "" +"Sykje standert lame dbs, neffens de sattelyt mei in oanslúten panne ôfsteller" + +msgid "Search east" +msgstr "Sykje east" + +msgid "Search west" +msgstr "Sykje west" + +msgid "Secondary DNS" +msgstr "Twadde DNS" + +msgid "Seek" +msgstr "Sykje" + +msgid "Select HDD" +msgstr "" + +msgid "Select Location" +msgstr "Kies Lokaasje" + +msgid "Select Network Adapter" +msgstr "Kies Netwurk Adapter" + +msgid "Select a movie" +msgstr "Kies in film" + +msgid "Select audio mode" +msgstr "Kies lûd mode" + +msgid "Select audio track" +msgstr "Kies lûd spoor" + +msgid "Select channel to record from" +msgstr "Kies kanaal om fan op te nimmen" + +msgid "Select image" +msgstr "Kies image" + +msgid "Select refresh rate" +msgstr "Kies faasje fan fernije" + +msgid "Select video input" +msgstr "Kies fideo yngong" + +msgid "Select video mode" +msgstr "Kies fideo moadus" + +msgid "Selected source image" +msgstr "Koazen bron image" + +msgid "Send DiSEqC" +msgstr "" + +msgid "Send DiSEqC only on satellite change" +msgstr "" + +msgid "Seperate titles with a main menu" +msgstr "Aparte triemen mei in haad menu" + +msgid "Sequence repeat" +msgstr "folch oarde herhelling" + +msgid "Service" +msgstr "Kanaal ynfo" + +msgid "Service Scan" +msgstr "Kanaal sykje" + +msgid "Service Searching" +msgstr "Kanalen sykje" + +msgid "Service has been added to the favourites." +msgstr "Kanaal is tafoege oan favorieten." + +msgid "Service has been added to the selected bouquet." +msgstr "Kanaal is tafoege oan selektearre bouquet." + +msgid "" +"Service invalid!\n" +"(Timeout reading PMT)" +msgstr "" +"Kanaal net jildig!\n" +"(Tiidsoerskriding lêzen fan PMT)" + +msgid "" +"Service not found!\n" +"(SID not found in PAT)" +msgstr "" +"Service net fûn!\n" +"(SID net fûn yn PAT)" + +msgid "Service scan" +msgstr "Kanaal sykje" + +msgid "" +"Service unavailable!\n" +"Check tuner configuration!" +msgstr "Kanaal net beskikber!
Sjoch tuner ynstellingen nei." + +msgid "Serviceinfo" +msgstr "Kanaal ynformaasje" + +msgid "Services" +msgstr "Kanalen" + +msgid "Set Voltage and 22KHz" +msgstr "" + +msgid "Set as default Interface" +msgstr "Ynstelle as standert ynterface" + +msgid "Set interface as default Interface" +msgstr "" + +msgid "Set limits" +msgstr "Set limyten" + +msgid "Settings" +msgstr "Ynstellingen" + +msgid "Setup" +msgstr "Ynstelle" + +msgid "Setup Mode" +msgstr "Ynstellingen Moadus" + +msgid "Show Info" +msgstr "Ynformaasje sjen litte" + +msgid "Show WLAN Status" +msgstr "WLAN status sjen litte" + +msgid "Show blinking clock in display during recording" +msgstr "Lit klok knipperje yn display by opnimmen" + +msgid "Show infobar on channel change" +msgstr "Ynfobalke sjen litte by kanaal wiksel" + +msgid "Show infobar on event change" +msgstr "Ynfobalke sjen litte by barren wiksel" + +msgid "Show infobar on skip forward/backward" +msgstr "Ynfobalke sjen by rap foarút / efterút" + +msgid "Show positioner movement" +msgstr "Rotor beweching sjen litte" + +msgid "Show services beginning with" +msgstr "Kanalen sjen litte beginnent mei" + +msgid "Show the radio player..." +msgstr "Radio spieler sjen litte..." + +msgid "Show the tv player..." +msgstr "TV Spieler sjen litte..." + +msgid "Shows the state of your wireless LAN connection.\n" +msgstr "Status fan WLAN sjen litte.\n" + +msgid "Shutdown Dreambox after" +msgstr "Dreambox útskeakelje nei" + +msgid "Similar" +msgstr "Gelykese" + +msgid "Similar broadcasts:" +msgstr "Gelykese utsjoeringen" + +msgid "Simple" +msgstr "Simpel" + +msgid "Simple titleset (compatibility for legacy players)" +msgstr "" + +msgid "Single" +msgstr "Inkel" + +msgid "Single EPG" +msgstr "Inkele EPG" + +msgid "Single satellite" +msgstr "Ien satellyt" + +msgid "Single transponder" +msgstr "Ien transponder" + +msgid "Singlestep (GOP)" +msgstr "Ien stap (GOP)" + +msgid "Skin..." +msgstr "Oanklaaiing" + +msgid "Sleep Timer" +msgstr "Tiidstjoering" + +msgid "Sleep timer action:" +msgstr "Sleep tiid barren aksje:" + +msgid "Slideshow Interval (sec.)" +msgstr "Slide foarstelling tiid (sec.)" + +#, python-format +msgid "Slot %d" +msgstr "Slot %d" + +msgid "Slow" +msgstr "Langsaam" + +msgid "Slow Motion speeds" +msgstr "Langsaam beweechjen faasje" + +msgid "Some plugins are not available:\n" +msgstr "Inkele ynstekkers binne net anwêzig:\n" + +msgid "Somewhere else" +msgstr "Ergens oars" + +msgid "" +"Sorry your Backup destination does not exist\n" +"\n" +"Please choose an other one." +msgstr "" +"Sorry.. Jo Reserve kopie plak bestiit net\n" +"\n" +"Kies in oar plak aub..." + +#. TRANSLATORS: This must fit into the header button in the EPG-List +msgid "Sort A-Z" +msgstr "Sorteer op A-Z" + +#. TRANSLATORS: This must fit into the header button in the EPG-List +msgid "Sort Time" +msgstr "Sorteer op Tiid" + +msgid "Sound" +msgstr "Lûd" + +msgid "Soundcarrier" +msgstr "Lûd-drager" + +msgid "South" +msgstr "Sud" + +msgid "Spanish" +msgstr "Spaans" + +msgid "Standby" +msgstr "Paraatmode" + +msgid "Standby / Restart" +msgstr "Paraatmode / Nijstart" + +msgid "Start from the beginning" +msgstr "Start fanôf it begjin" + +msgid "Start recording?" +msgstr "Start opnimmen?" + +msgid "Start test" +msgstr "Start test" + +msgid "StartTime" +msgstr "Starttiid" + +msgid "Starting on" +msgstr "Starte op" + +msgid "Step east" +msgstr "Stap nei east" + +msgid "Step west" +msgstr "Stap nei west" + +msgid "Stereo" +msgstr "Stereo" + +msgid "Stop" +msgstr "Stop" + +msgid "Stop Timeshift?" +msgstr "Tiidsskowen stopje?" + +msgid "Stop current event and disable coming events" +msgstr "Stopje hjoeddeiske en ankommend barren" + +msgid "Stop current event but not coming events" +msgstr "Stopje hjoeddeiske mar net ankommend barren" + +msgid "Stop playing this movie?" +msgstr "Stopje ôfspieljen fan dizze film?" + +msgid "Stop test" +msgstr "Stop test" + +msgid "Store position" +msgstr "Posysje opslaan" + +msgid "Stored position" +msgstr "Opsleine posysje" + +msgid "Subservice list..." +msgstr "UnderSender lyst..." + +msgid "Subservices" +msgstr "UnderSender" + +msgid "Subtitle selection" +msgstr "Undertitel seleksje" + +msgid "Subtitles" +msgstr "Undertitels" + +msgid "Sun" +msgstr "Sne" + +msgid "Sunday" +msgstr "Snein" + +msgid "Swap Services" +msgstr "Kanalen wikselje" + +msgid "Swedish" +msgstr "Zweeds" + +msgid "Switch to next subservice" +msgstr "Gjin nei folgende undersender" + +msgid "Switch to previous subservice" +msgstr "Gjin nei foarige undersender" + +msgid "Symbol Rate" +msgstr "Symbool faasje" + +msgid "Symbolrate" +msgstr "Symboolfaasje" + +msgid "System" +msgstr "Systeem" + +#. TRANSLATORS: Add here whatever should be shown in the "translator" about screen, up to 6 lines (use \n for newline) +msgid "TRANSLATOR_INFO" +msgstr "Oersetter ynfo" + +msgid "TS file is too large for ISO9660 level 1!" +msgstr "" + +msgid "TV System" +msgstr "TV Systeem" + +msgid "Table of content for collection" +msgstr "Ynhalds tabel foar kolleksje" + +msgid "Tag 1" +msgstr "" + +msgid "Tag 2" +msgstr "" + +msgid "Tags" +msgstr "" + +msgid "Terrestrial" +msgstr "Ether" + +msgid "Terrestrial provider" +msgstr "Ether útstjoerder" + +msgid "Test mode" +msgstr "Test moadus" + +msgid "Test the network configuration of your Dreambox.\n" +msgstr "Test de netwurk konfiguraasje fan de Dreambox.\n" + +msgid "Test-Messagebox?" +msgstr "Test-Berjochtbox?" + +msgid "" +"Thank you for using the wizard. Your box is now ready to use.\n" +"Please press OK to start using your Dreambox." +msgstr "" +"Bedankt foar it brûken fan de gucheler. Jo box is no klear om te brûken.\n" +"Druk OK om mei de Dreambox te begjinnen." + +msgid "" +"The DVD standard doesn't support H.264 (HDTV) video streams. Do you want to " +"create a Dreambox format data DVD (which will not play in stand-alone DVD " +"players) instead?" +msgstr "" +"De DVD standert kin gjin H.264 (HDTV) fideo streams an. Wolle jo dan in " +"Dreambox formaat data DVD meitsje ? Tink der om, dizze kin net in gewoane " +"DVD spielers ôfspiele wurde !" + +msgid "" +"The USB stick is now bootable. Do you want to download the latest image from " +"the feed server and save it on the stick?" +msgstr "" + +msgid "The backup failed. Please choose a different backup location." +msgstr "Backup is mislearre. Kies in oare backup lokaasje." + +#, python-format +msgid "" +"The following device was found:\n" +"\n" +"%s\n" +"\n" +"Do you want to write the USB flasher to this stick?" +msgstr "" +"It folgende apparaat wie fûn:\n" +"\n" +"%s\n" +"\n" +"Wolle jo de USB flasher nei dizze stick skriuwe ?" + +msgid "" +"The input port should be configured now.\n" +"You can now configure the screen by displaying some test pictures. Do you " +"want to do that now?" +msgstr "" +"De yngongs poort moat no ynstelt wurde\n" +"Ynstelle kin mei it sjen litten fan in oantal bylden. No dwaan ?" + +msgid "The installation of the default services lists is finished." +msgstr "Ynstalaasje fan standert ynstellingen is klear." + +msgid "" +"The installation of the default settings is finished. You can now continue " +"configuring your Dreambox by pressing the OK button on the remote control." +msgstr "" +"Standert ynstellingen binne werom set. Jo kinne fierder gean mei it " +"ynstellen fan de Dreambox troch OK te drukken op de ôfstandsbetsjinning" + +msgid "" +"The md5sum validation failed, the file may be corrupted! Are you sure that " +"you want to burn this image to flash memory? You are doing this at your own " +"risk!" +msgstr "" +"De md5sum misljearre, de triem is blikber Korrupt. Wolle jo wier dit byld yn " +"it flash geheugen sette ? Dit gjid op eigen risiko !" + +msgid "" +"The md5sum validation failed, the file may be downloaded incompletely or be " +"corrupted!" +msgstr "" +"De md5sum misljearre. De triem mei net kompleet binnen helle wêze of gewoan " +"korrupt weze !" + +msgid "The package doesn't contain anything." +msgstr "It pakket hat gjin ynhâld" + +#, python-format +msgid "The path %s already exists." +msgstr "It paad %s bestiit al." + +msgid "The pin code has been changed successfully." +msgstr "De pinkode is mei sukses feroare." + +msgid "The pin code you entered is wrong." +msgstr "De ynjûne pinkode is ferkeard." + +msgid "The pin codes you entered are different." +msgstr "De pinkodes binne net gelyk." + +msgid "The sleep timer has been activated." +msgstr "De sliep tiid klok is aktiveert." + +msgid "The sleep timer has been disabled." +msgstr "De sliep tiid klok is útskeakele" + +msgid "The timer file (timers.xml) is corrupt and could not be loaded." +msgstr "De tiidsbarrenlyst is korrupt en koe net laden wurde." + +msgid "" +"The wireless LAN plugin is not installed!\n" +"Please install it." +msgstr "" +"De WLAN ynstekker is net ynstallearre!\n" +"Ynstallearje dizze earst." + +msgid "" +"The wizard can backup your current settings. Do you want to do a backup now?" +msgstr "" +"De gucheler kin jo ynstellingen efterút sette. Wolle jo no een backup " +"meitsje ?" + +msgid "The wizard is finished now." +msgstr "De gucheler is klear." + +msgid "There are no default services lists in your image." +msgstr "Der binne gjin standert lysts yn de Dreambox" + +msgid "There are no default settings in your image." +msgstr "Der binne gjin standert ynstellingen yn jo byld" + +msgid "" +"There might not be enough Space on the selected Partition.\n" +"Do you really want to continue?" +msgstr "" +"Blikber is der net genôch rûmte op de koazen partysje.\n" +"Wolle jo trochgean ?" + +#, python-format +msgid "This .NFI file does not contain a valid %s image!" +msgstr "Dizze .NFI triem hat net in jildich %s image!" + +msgid "" +"This .NFI file does not have a md5sum signature and is not guaranteed to " +"work. Do you really want to burn this image to flash memory?" +msgstr "" +"Dizze .NFI triem had gjin md5sum kontrolesom en mei misskien net wurkje. " +"Wolle jo wier dit byld yn flash geheugen sette ?" + +msgid "" +"This .NFI file has a valid md5 signature. Continue programming this image to " +"flash memory?" +msgstr "" +"Dit .NFI triem hat it jildige md5 kontrolesom. Fjierder gean mei it nei " +"flash skriuwen fan dit byld ?" + +msgid "" +"This DVD RW medium is already formatted - reformatting will erase all " +"content on the disc." +msgstr "" +"Dit DVD RW medium is al formattearre. Wer opnei dwaan sil alle gegevens op " +"disk wiskje." + +#, python-format +msgid "This Dreambox can't decode %s video streams!" +msgstr "De Dreambox kin %s fideo streams net oan !" + +msgid "This is step number 2." +msgstr "Dit is stap nûmer 2." + +msgid "This is unsupported at the moment." +msgstr "Dit wurd no nog net ondersteund." + +msgid "" +"This test checks for configured Nameservers.\n" +"If you get a \"unconfirmed\" message:\n" +"- please check your DHCP, cabling and Adapter setup\n" +"- if you configured your Nameservers manually please verify your entries in " +"the \"Nameserver\" Configuration" +msgstr "" +"Dizze test sjocht nei ynstelde nammeservers.\n" +"Krije jo in \"net befestige\" berjocht :\n" +"- Sjoch nei de DHCP, kabels/tridden en adapter ynstellingen\n" +"- By hânmatig ynstellen fan nammeservers, sjoch nei de ynjeftes yn de " +"\"nammeservers\" konfiguraasje" + +msgid "" +"This test checks whether a network cable is connected to your LAN-Adapter.\n" +"If you get a \"disconnected\" message:\n" +"- verify that a network cable is attached\n" +"- verify that the cable is not broken" +msgstr "" +"Dizze test sjocht nei in oanslúten LAN adapter.\n" +"Krije jo in \"net oanslúten\" berjocht :\n" +"- Sjoch nei wol of net oanslúten kabels/tridden\n" +"- Sjoch ot de kabel miskien net brutsen is" + +msgid "" +"This test checks whether a valid IP Address is found for your LAN Adapter.\n" +"If you get a \"unconfirmed\" message:\n" +"- no valid IP Address was found\n" +"- please check your DHCP, cabling and adapter setup" +msgstr "" +"Dizze test sjocht nei ynstelde IP adressen foar de LAN adapter.\n" +"Krije jo in \"net befestige\" berjocht :\n" +"- Is der in jildig IP adres ynstelt ?\n" +"- Sjoch nei de DHCP, kabels/tridden en adapter ynstellingen" + +msgid "" +"This test checks whether your LAN Adapter is set up for automatic IP Address " +"configuration with DHCP.\n" +"If you get a \"disabled\" message:\n" +" - then your LAN Adapter is configured for manual IP Setup\n" +"- verify thay you have entered correct IP informations in the AdapterSetup " +"dialog.\n" +"If you get an \"enabeld\" message:\n" +"-verify that you have a configured and working DHCP Server in your network." +msgstr "" +"Dizze test sjocht ot de LAN adapter ynsteld is foar automatysk IP Adres " +"ferkrije troch DHCP.\n" +"Krije jo in \"útskeakele\" berjocht :\n" +"- In hânmatig IP adres is ynstelt ?\n" +"- Is de ynjûne IP ynformaasje goed, yn it Adapterynstellingen menu ?\n" +"Krije jo in \"ynskeakele\" berjocht :\n" +"- Is der ek een DHCP server aktyf yn jo netwurk ?" + +msgid "This test detects your configured LAN-Adapter." +msgstr "Dizze test syket nei de ynstelde LAN-Adapter" + +msgid "Three" +msgstr "Trije" + +msgid "Threshold" +msgstr "Drompel" + +msgid "Thu" +msgstr "Tong" + +msgid "Thumbnails" +msgstr "" + +msgid "Thursday" +msgstr "Tongersdei" + +msgid "Time" +msgstr "Tiid" + +msgid "Time/Date Input" +msgstr "Tiid / Dei ynjefte" + +msgid "Timer" +msgstr "Tiidssjtoering" + +msgid "Timer Edit" +msgstr "Tiidsbarren bewurkje" + +msgid "Timer Editor" +msgstr "Tiidsbarren bewurker" + +msgid "Timer Type" +msgstr "Tiidsbarren type" + +msgid "Timer entry" +msgstr "Tiidsbarren item" + +msgid "Timer log" +msgstr "Tiidsbarren log" + +msgid "" +"Timer overlap in timers.xml detected!\n" +"Please recheck it!" +msgstr "" +"Tiidstjoerings conflicten fûn yn timers.xml\n" +"Graach nei sjen en meitsje!" + +msgid "Timer sanity error" +msgstr "Tiidsbarren kontrole flater" + +msgid "Timer selection" +msgstr "Tiidsbarren seleksje" + +msgid "Timer status:" +msgstr "Tiidsbarren status:" + +msgid "Timeshift" +msgstr "Tiidsskowen" + +msgid "Timeshift not possible!" +msgstr "Tiidsskowen is net mooglik !" + +msgid "Timeshift path..." +msgstr "" + +msgid "Timezone" +msgstr "Tiidszone" + +msgid "Title" +msgstr "Titel" + +msgid "Title properties" +msgstr "" + +msgid "Title:" +msgstr "Titel:" + +msgid "Titleset mode" +msgstr "" + +msgid "" +"To update your Dreambox firmware, please follow these steps:\n" +"1) Turn off your box with the rear power switch and plug in the bootable USB " +"stick.\n" +"2) Turn mains back on and hold the DOWN button on the front panel pressed " +"for 10 seconds.\n" +"3) Wait for bootup and follow instructions of the wizard." +msgstr "" + +msgid "Today" +msgstr "Hjoed" + +msgid "Tone mode" +msgstr "Toan moadus" + +msgid "Toneburst" +msgstr "Toan piek" + +msgid "Toneburst A/B" +msgstr "Toneburst A/B" + +msgid "Track" +msgstr "Nummer" + +msgid "Translation" +msgstr "Oersetting" + +msgid "Translation:" +msgstr "Oersetting:" + +msgid "Transmission Mode" +msgstr "Oerstjoeren moadus" + +msgid "Transmission mode" +msgstr "Oerstjoeren type" + +msgid "Transponder" +msgstr "Transponder" + +msgid "Transponder Type" +msgstr "Transponder type" + +msgid "Tries left:" +msgstr "Oantal kearen besykjen oer:" + +msgid "Try to find used Transponders in cable network.. please wait..." +msgstr "Besykje brûkte transponders te finen yn kabel netwurk.. " + +msgid "Try to find used transponders in cable network.. please wait..." +msgstr "Besykje brûkte transponders te finen yn kabel netwurk.. " + +msgid "Tue" +msgstr "Tiis" + +msgid "Tuesday" +msgstr "Tiisdei" + +msgid "Tune" +msgstr "Ofstimme" + +msgid "Tune failed!" +msgstr "Ofstimme mislearre !" + +msgid "Tuner" +msgstr "Tuner" + +msgid "Tuner " +msgstr "Tuner" + +msgid "Tuner Slot" +msgstr "Tuner Slot" + +msgid "Tuner configuration" +msgstr "Tuner ynstellingen" + +msgid "Tuner status" +msgstr "Tuner status" + +msgid "Turkish" +msgstr "Turks" + +msgid "Two" +msgstr "Twa" + +msgid "Type of scan" +msgstr "Type fan sykjen" + +msgid "USALS" +msgstr "USALS" + +msgid "USB" +msgstr "USB" + +msgid "USB Stick" +msgstr "USB Stick" + +msgid "USB stick wizard" +msgstr "" + +msgid "Ukrainian" +msgstr "" + +msgid "" +"Unable to complete filesystem check.\n" +"Error: " +msgstr "" +"Net yn steat om bestânsysteem nei te sjen\n" +"Flater: " + +msgid "" +"Unable to initialize harddisk.\n" +"Error: " +msgstr "" + +msgid "Uncommitted DiSEqC command" +msgstr "Net oanwizen DiSEqC kommando" + +msgid "Universal LNB" +msgstr "Unifersele LNB" + +msgid "Unmount failed" +msgstr "Ofkeppeljen mislearre" + +msgid "Update" +msgstr "Bywurkje" + +msgid "Updates your receiver's software" +msgstr "UntfangerSoftware bywurkje" + +msgid "Updating finished. Here is the result:" +msgstr "Klear met bywurkjen. Dit hat allegear bart :" + +msgid "Updating... Please wait... This can take some minutes..." +msgstr "Bywurkjen is dwaande. Waachtje even. Dit kin inkele minuten duorje." + +msgid "Upgrade finished. Do you want to reboot your Dreambox?" +msgstr "Klear mei bywurkjen. Wolle jo de Dreambox opnij starte?" + +msgid "Upgrading" +msgstr "An it bywurkjen" + +msgid "Upgrading Dreambox... Please wait" +msgstr "Dreambox an it bywurkjen..." + +msgid "Use" +msgstr "" + +msgid "Use DHCP" +msgstr "DHCP brûke" + +msgid "Use Interface" +msgstr "Brûk ynterface" + +msgid "Use Power Measurement" +msgstr "Bruk Enerzy behear" + +msgid "Use a gateway" +msgstr "In gateway brûke" + +#. TRANSLATORS: The effect of "Non-smooth winding" is that rather +#. than using ordinary "continuous" or "smooth" winding, a fast +#. sequence of stills is shown when winding at high speeds. This +#. makes it much easier too follow when almost each frame comes from +#. a new scene. The effect is achieved by repeating each shown frame +#. a couple of times. The settings control both at which speed this +#. winding mode sets in, and how many times each frame should be +#. repeated. This was previously called "Discontinuous playback" +#. which was incomprehensible. "Non-smooth winding" may be a better +#. term, but note that there is nothing irregular about it. Synonyms +#. better suited for translation to other languages may be "stepwise +#. winding/playback", or "winding/playback using stills". +msgid "Use non-smooth winding at speeds above" +msgstr "Brûk net glêd spielen by faasjes heecher" + +msgid "Use power measurement" +msgstr "Fermogensmjitting brûke" + +msgid "Use the Networkwizard to configure your Network\n" +msgstr "Bruk de netwurk gûcheler om it netwurk yn te stellen\n" + +msgid "" +"Use the left and right buttons to change an option.\n" +"\n" +"Please set up tuner A" +msgstr "" +"Knoppen links en rjochts brûke om in opsje te feroarjen.\n" +"\n" +"Stel tuner A yn" + +msgid "" +"Use the up/down keys on your remote control to select an option. After that, " +"press OK." +msgstr "Knoppen op en del brûke om in opsje te kiezen. Dêrnei druk Ok" + +msgid "Use usals for this sat" +msgstr "USALS foar dizze satellyt brûke" + +msgid "Use wizard to set up basic features" +msgstr "Gucheler foar basis ynstellingen brûke" + +msgid "Used service scan type" +msgstr "Brukte type kanaal sykjen" + +msgid "User defined" +msgstr "Gebruker ynstelling" + +msgid "VCR scart" +msgstr "VCR scart" + +msgid "VMGM (intro trailer)" +msgstr "VMGM (yntro fan film)" + +msgid "Video Fine-Tuning" +msgstr "Fideo fyn ynstellen" + +msgid "Video Fine-Tuning Wizard" +msgstr "Fideo fyn ynstel gucheler" + +msgid "Video Output" +msgstr "Fideo útgong" + +msgid "Video Setup" +msgstr "Fideo ynstellingen" + +msgid "Video Wizard" +msgstr "Fideo gucheler" + +msgid "" +"Video input selection\n" +"\n" +"Please press OK if you can see this page on your TV (or select a different " +"input port).\n" +"\n" +"The next input port will be automatically probed in 10 seconds." +msgstr "" +"Fideo yngong seleksje\n" +"\n" +"Druk OK wannear jo dit sjen kinne op jo TV (of kies in oare yngong).\n" +"\n" +"De folgende yngong wurd automatysk probearre yn 10 seconden." + +msgid "Video mode selection." +msgstr "Fideo moadus seleksje" + +msgid "View Rass interactive..." +msgstr "Rass interaktief sjen litte" + +msgid "View teletext..." +msgstr "tiletekst toane..." + +msgid "Virtual KeyBoard" +msgstr "" + +msgid "Voltage mode" +msgstr "Spanning mode" + +msgid "Volume" +msgstr "Lûdsterkte" + +msgid "W" +msgstr "W" + +msgid "WEP" +msgstr "WEP" + +msgid "WPA" +msgstr "WPA" + +msgid "WPA or WPA2" +msgstr "" + +msgid "WPA2" +msgstr "WPA2" + +msgid "WSS on 4:3" +msgstr "WSS by 4:3" + +msgid "Waiting" +msgstr "Oan it wachtsjen" + +msgid "" +"We will now test if your TV can also display this resolution at 50hz. If " +"your screen goes black, wait 20 seconds and it will switch back to 60hz.\n" +"Please press OK to begin." +msgstr "" +"Wy probearje no of jo TV dizze resolusje dwaan kin by 50 Hz. Giet jo skerm " +"op swart, wachtsje 20 sec. en it giet werom nei 60 Hz.\n" +"Druk OK om te begjinnen." + +msgid "Wed" +msgstr "Woa" + +msgid "Wednesday" +msgstr "Woansdei" + +msgid "Weekday" +msgstr "Wiekdei" + +msgid "" +"Welcome to the Cutlist editor.\n" +"\n" +"Seek to the start of the stuff you want to cut away. Press OK, select 'start " +"cut'.\n" +"\n" +"Then seek to the end, press OK, select 'end cut'. That's it." +msgstr "" +"Wolkom by de Cutlist bewurker.\n" +"\n" +"Sykje oant it begjin fan wat jo fuorthelje wolle. Druk OK, kies start cut.\n" +"\n" +"Dan kies oant it ein, druk OK, kies ein cut. Klear.." + +msgid "" +"Welcome to the Image upgrade wizard. The wizard will assist you in upgrading " +"the firmware of your Dreambox by providing a backup facility for your " +"current settings and a short explanation of how to upgrade your firmware." +msgstr "" +"Wolkom by de byld bywurkje gucheler. De gucheler helpt jo by it bywurkjen " +"fan de software yn jo Dreambox, in backup mochelikhiid foar jo ynstellingen " +"en in koarte útlis fan hoe de software by te wurkjen." + +msgid "" +"Welcome.\n" +"\n" +"This start wizard will guide you through the basic setup of your Dreambox.\n" +"Press the OK button on your remote control to move to the next step." +msgstr "" +"Wolkom.\n" +"\n" +"Dizze gucheler helpt jo troch de basis ynstellingen fan jo Dreambox.\n" +"Druk Ok op jo ôfstandsbetsjinning om nei de folgende stap te gean." + +msgid "Welcome..." +msgstr "Wolkom..." + +msgid "West" +msgstr "West" + +msgid "What do you want to scan?" +msgstr "Wat wolle jo ôfsykje ?" + +msgid "Where do you want to backup your settings?" +msgstr "Wêr wolle jo de gegevens opslaan?" + +msgid "Where to save temporary timeshift recordings?" +msgstr "" + +msgid "Wireless" +msgstr "Triitloas" + +msgid "Wireless Network" +msgstr "Triidloas netwurk" + +msgid "Write error while recording. Disk full?\n" +msgstr "Skriuw flater by it opnimmen. Skiif fol ?\n" + +msgid "Write failed!" +msgstr "Skriuw flater!" + +msgid "Writing NFI image file to flash completed" +msgstr "Skriuwen fan NFI byld nei flash is klear" + +msgid "YPbPr" +msgstr "YPbPr" + +msgid "Year:" +msgstr "Jier:" + +msgid "Yes" +msgstr "Ja" + +msgid "Yes, and delete this movie" +msgstr "Ja, en ferwiderje dizze film" + +msgid "Yes, backup my settings!" +msgstr "Ja, myn ynstellingen extra bewarje" + +msgid "Yes, do a manual scan now" +msgstr "Ja, no hânmatig sykje" + +msgid "Yes, do an automatic scan now" +msgstr "Ja, no automatysk sykje" + +msgid "Yes, do another manual scan now" +msgstr "Ja, no nochris hânmatig sykje" + +msgid "Yes, perform a shutdown now." +msgstr "Ja, no útskeakelje" + +msgid "Yes, restore the settings now" +msgstr "Ja, no de ynstellingen werom sette" + +msgid "Yes, returning to movie list" +msgstr "Ja, werom nei de film lyst" + +msgid "Yes, view the tutorial" +msgstr "Ja, besjoch de hânlieding" + +msgid "" +"You can choose some default settings now. Please select the settings you " +"want to be installed." +msgstr "" +"Jo kinne inkele ynstellingen dwaan no. Kies de ynstellingen die't jo " +"ynstallearje wolle" + +msgid "You can choose, what you want to install..." +msgstr "Jo kinne kieze wat te ynstallearen" + +msgid "You cannot delete this!" +msgstr "Jo kinne dit net ferwiderje!" + +msgid "You chose not to install any default services lists." +msgstr "Jo hawwe koazen gjin standert kanaallysten te ynstallearjen." + +msgid "" +"You chose not to install any default settings. You can however install the " +"default settings later in the settings menu." +msgstr "" +"Jo hawwe koazen gjin standert ynstellingen te ynstallearjen. Jo kinne letter " +"dit altiid nog dwaan in it ynstellingen menu" + +msgid "" +"You chose not to install anything. Please press OK finish the install wizard." +msgstr "" +"Jo hawwe koazen neat te ynstallearjen. Druk OK om de gucheler ôf te slúten." + +msgid "" +"You do not seem to have a harddisk in your Dreambox. So backing up to a " +"harddisk is not an option for you." +msgstr "" +"Jo hawwe blykber gjin hurde skiif yn jo Dreambox. Extra bewarje fan " +"ynstellingen nei in hurde skiif kin net by jo." + +msgid "" +"You have chosen to backup to a compact flash card. The card must be in the " +"slot. We do not verify if it is really used at the moment. So better backup " +"to the harddisk!\n" +"Please press OK to start the backup now." +msgstr "" +"Jo wolle de ynstellingen extra bewarje op in compact flash kaart. De kaart " +"moat oanwezig weze. Wy sjogge net nei, at it ek werkelijk brukt wurd. It is " +"better om op hurde skiif te bewarjen.\n" +"Druk Ok om de ynstellingen extra op te slaan." + +msgid "" +"You have chosen to backup to an usb drive. Better backup to the harddisk!\n" +"Please press OK to start the backup now." +msgstr "" +"Jo wolle de ynstellingen extra bewarje op in USB skiif. It is better om dit " +"nei hurde skiif te dwaan\n" +"Druk Ok om de ynstellingen extra te bewarjen." + +msgid "" +"You have chosen to backup to your harddisk. Please press OK to start the " +"backup now." +msgstr "" +"Jo wolle de ynstellingen extra bewarje op hurde skiif.Druk Ok om de " +"ynstellingen extra te bewarjen." + +msgid "" +"You have chosen to create a new .NFI flasher bootable USB stick. This will " +"repartition the USB stick and therefore all data on it will be erased." +msgstr "" +"Jo hawwe koazen in neie .NFI opstart USB stick te meitsjen. Dit sil de USB " +"opnei partitionearje en sa sil alle data ferlên gean." + +#, python-format +msgid "You have to wait %s!" +msgstr "Jo moatte %s wachtsje!" + +msgid "" +"You need a PC connected to your dreambox. If you need further instructions, " +"please visit the website http://www.dm7025.de.\n" +"Your dreambox will now be halted. After you have performed the update " +"instructions from the website, your new firmware will ask you to restore " +"your settings." +msgstr "" +"De moat in PC oan de dreambox ansluten weze. Foar mear ynstruktiessjoch op " +"de webside http://www.dm7025.de.\n" +"Jo dreambox sil no stopje. Nei it bywurkjen neffens de webside, de neie " +"software sil jo freegje om de oarspronkelike ynstellingen werom te setten." + +msgid "" +"You need to set a pin code and hide it from your children.\n" +"\n" +"Do you want to set the pin now?" +msgstr "" +"In pincode moat brûkt wurde om of te sluten foar bern.\n" +"\n" +"No in pinkode ynstelle ?" + +msgid "Your Dreambox will restart after pressing OK on your remote control." +msgstr "Jo D" + +msgid "Your TV works with 50 Hz. Good!" +msgstr "Jo TV wurket goed mei 50 Hz. Ok !" + +msgid "" +"Your backup succeeded. We will now continue to explain the further upgrade " +"process." +msgstr "" +"It extra bewarjen is slagge. Wy gjinne jo fierder mei utlizzen fan it bywurk " +"proces." + +msgid "Your dreambox is shutting down. Please stand by..." +msgstr "Jo Dreambox wurd no ôfsluten. Eefkes wachtsje..." + +msgid "" +"Your dreambox isn't connected to the internet properly. Please check it and " +"try again." +msgstr "" +"Jo Dreambox is net goed ferbun mei it internet. Kontrolearje en besykje " +"opnij." + +msgid "" +"Your frontprocessor firmware must be upgraded.\n" +"Press OK to start upgrade." +msgstr "" +"Jo foarprocessor software moat bywurke wurde\n" +"Druk Ok om te begjinnen." + +msgid "Your network configuration has been activated." +msgstr "" + +msgid "" +"Your network configuration has been activated.\n" +"A second configured interface has been found.\n" +"\n" +"Do you want to disable the second network interface?" +msgstr "" + +msgid "Zap back to service before positioner setup?" +msgstr "Werom zappe nei kanaal foar rotor ynstellingen?" + +msgid "Zap back to service before satfinder?" +msgstr "Werom zappe nei kanaal foar satellytsyker?" + +msgid "[alternative edit]" +msgstr "[alternatief bewurkje]" + +msgid "[bouquet edit]" +msgstr "[bouquet bewurkje]" + +msgid "[favourite edit]" +msgstr "[favorieten bewurkje]" + +msgid "[move mode]" +msgstr "[Ferpleats moadus]" + +msgid "abort alternatives edit" +msgstr "alternatieven bewurkjen ôfbrekke" + +msgid "abort bouquet edit" +msgstr "boeket bewurkjen ôfbrekke" + +msgid "abort favourites edit" +msgstr "favoriet bewurkje ôfbrekke" + +msgid "about to start" +msgstr "op it punt om te starten" + +msgid "activate current configuration" +msgstr "" + +msgid "add a nameserver entry" +msgstr "" + +msgid "add alternatives" +msgstr "alernatief tafoegje" + +msgid "add bookmark" +msgstr "boekmerk tafoegje" + +msgid "add bouquet" +msgstr "boeket tafoegje" + +msgid "add directory to playlist" +msgstr "map oan ofspiellyst tafoegje" + +msgid "add file to playlist" +msgstr "triem oan ofspiellyst tafoegje" + +msgid "add files to playlist" +msgstr "triemen tafoegje an ôfspiellyst" + +msgid "add marker" +msgstr "marker tafoegje" + +msgid "add recording (enter recording duration)" +msgstr "opnimmen tafoegje (opnimtiid)" + +msgid "add recording (enter recording endtime)" +msgstr "opnimmen tafoegje (eintiid opnimmen ynjaan)" + +msgid "add recording (indefinitely)" +msgstr "opnimmen tafoegje (foar altiid trochgean)" + +msgid "add recording (stop after current event)" +msgstr "opnimmen tafoegje (stopje nei dit barren)" + +msgid "add service to bouquet" +msgstr "kanaal tafoegje oan bouquet" + +msgid "add service to favourites" +msgstr "kanaal tafoegje oan favorieten" + +msgid "add to parental protection" +msgstr "âlderlik tasjoch tafoegje " + +msgid "advanced" +msgstr "afansjearre" + +msgid "alphabetic sort" +msgstr "sortearje op alfabet" + +msgid "" +"are you sure you want to restore\n" +"following backup:\n" +msgstr "" +"witte jo seker dizze werom te setten\n" +"de extra kopie:\n" + +#, python-format +msgid "audio track (%s) format" +msgstr "" + +#, python-format +msgid "audio track (%s) language" +msgstr "" + +msgid "audio tracks" +msgstr "audio spoor" + +msgid "back" +msgstr "werom" + +msgid "background image" +msgstr "Eftergrûn ôfbylding" + +msgid "backgroundcolor" +msgstr "" + +msgid "better" +msgstr "better" + +msgid "black" +msgstr "" + +msgid "blacklist" +msgstr "swarte lyst" + +msgid "blue" +msgstr "" + +#, python-format +msgid "burn audio track (%s)" +msgstr "" + +msgid "change recording (duration)" +msgstr "feroarje opnim tiiden" + +msgid "change recording (endtime)" +msgstr "wizigje opnimmen (eintiid)" + +msgid "chapters" +msgstr "Haadstikken" + +msgid "choose destination directory" +msgstr "kies doel map" + +msgid "circular left" +msgstr "circular links" + +msgid "circular right" +msgstr "circular rjochts" + +msgid "clear playlist" +msgstr "ofspiellyst leeg meitsje" + +msgid "color" +msgstr "kleur" + +msgid "complex" +msgstr "complex" + +msgid "config menu" +msgstr "konfiguraasje menu" + +msgid "confirmed" +msgstr "befestigt" + +msgid "connected" +msgstr "oanslúten" + +msgid "continue" +msgstr "gjea fierder" + +msgid "copy to bouquets" +msgstr "kopieer nei boeketten" + +msgid "create directory" +msgstr "map meitsje" + +msgid "daily" +msgstr "eltse dei" + +msgid "day" +msgstr "dei" + +msgid "delete cut" +msgstr "ferwiderje stik" + +msgid "delete file" +msgstr "" + +msgid "delete playlist entry" +msgstr "ofspiellyst rigele ferwiderje" + +msgid "delete saved playlist" +msgstr "ferwiderje opsleine ofspiellyst" + +msgid "delete..." +msgstr "ferwiderje..." + +msgid "disable" +msgstr "utskeakelje" + +msgid "disable move mode" +msgstr "ferpleats modus útskeakelje" + +msgid "disabled" +msgstr "útskeakele" + +msgid "disconnected" +msgstr "net oanslúten" + +msgid "do not change" +msgstr "net feroarje" + +msgid "do nothing" +msgstr "doch neat" + +msgid "don't record" +msgstr "net opnimme" + +msgid "done!" +msgstr "Klear!" + +msgid "edit alternatives" +msgstr "bewurkje alternatief" + +msgid "empty" +msgstr "leeg" + +msgid "enable" +msgstr "ynskeakelje" + +msgid "enable bouquet edit" +msgstr "bewurkjen boeket oan" + +msgid "enable favourite edit" +msgstr "bewurkjen favorieten oan" + +msgid "enable move mode" +msgstr "ferpleatsen mode oan" + +msgid "enabled" +msgstr "ynskeakele" + +msgid "end alternatives edit" +msgstr "bewurkjen alternatief út" + +msgid "end bouquet edit" +msgstr "bewurkjen boeket út" + +msgid "end cut here" +msgstr "stop stik hjirre" + +msgid "end favourites edit" +msgstr "bewurkjen favoriet út" + +msgid "enigma2 and network" +msgstr "" + +msgid "equal to" +msgstr "gelyk oan" + +msgid "exceeds dual layer medium!" +msgstr "te grut foar 2 laags medium!" + +msgid "exit DVD player or return to file browser" +msgstr "DVD spieler ferlitte en werom nei triem browser" + +msgid "exit mediaplayer" +msgstr "mediaspieler ferlitte" + +msgid "exit movielist" +msgstr "filmlyst ferlitte" + +msgid "exit nameserver configuration" +msgstr "" + +msgid "exit network adapter configuration" +msgstr "" + +msgid "exit network adapter setup menu" +msgstr "" + +msgid "exit network interface list" +msgstr "" + +msgid "exit networkadapter setup menu" +msgstr "" + +msgid "failed" +msgstr "mislearre" + +msgid "fileformats (BMP, PNG, JPG, GIF)" +msgstr "" + +msgid "filename" +msgstr "triemnamme" + +msgid "fine-tune your display" +msgstr "it skerm fyn tune" + +msgid "font face" +msgstr "font ansjoch" + +msgid "forward to the next chapter" +msgstr "foarút nei it folgende haadstik" + +msgid "free" +msgstr "frij" + +msgid "free diskspace" +msgstr "freie skiif rûmte" + +msgid "go to deep standby" +msgstr "gean nei djip paraatstand" + +msgid "go to standby" +msgstr "gean nei paraatstand" + +msgid "green" +msgstr "" + +msgid "headline" +msgstr "koptekst" + +msgid "hear radio..." +msgstr "nei radio harkje..." + +msgid "help..." +msgstr "help..." + +msgid "hidden network" +msgstr "" + +msgid "hide extended description" +msgstr "utbreide beskriuwing ferbergje" + +msgid "hide player" +msgstr "spieler ferbergje" + +msgid "highlighted button" +msgstr "oarskleurde knop" + +msgid "horizontal" +msgstr "horizontal" + +msgid "hour" +msgstr "oere" + +msgid "hours" +msgstr "oeren" + +msgid "immediate shutdown" +msgstr "direkt útskeakelje" + +#, python-format +msgid "" +"incoming call!\n" +"%s calls on %s!" +msgstr "" +"binnenkommend gesprek!\n" +"%s skillet nei %s!" + +msgid "init module" +msgstr "CI-Module initialisearje" + +msgid "insert mark here" +msgstr "tuskenfoegje marker" + +msgid "jump back to the previous title" +msgstr "werom nei de foarige titel" + +msgid "jump forward to the next title" +msgstr "foarút nei de folgende titel" + +msgid "jump to listbegin" +msgstr "spring nei begjin fan lyst" + +msgid "jump to listend" +msgstr "spring nei ein fan lyst" + +msgid "jump to next marked position" +msgstr "spring nei folgende index punt" + +msgid "jump to previous marked position" +msgstr "spring nei foarige index punt" + +msgid "leave movie player..." +msgstr "film ôfspieljen ferlitte..." + +msgid "left" +msgstr "links" + +msgid "length" +msgstr "lengte" + +msgid "list style compact" +msgstr "lyst styl kompakt" + +msgid "list style compact with description" +msgstr "lyst styl kompakt mei beskriuwing" + +msgid "list style default" +msgstr "lyst styl standert" + +msgid "list style single line" +msgstr "lyst styl ien rigele" + +msgid "load playlist" +msgstr "ofspiellyst lade" + +msgid "locked" +msgstr "op slot" + +msgid "loopthrough to" +msgstr "trochskeakele nei" + +msgid "manual" +msgstr "hânmatig" + +msgid "menu" +msgstr "menu" + +msgid "menulist" +msgstr "menulyst" + +msgid "mins" +msgstr "min" + +msgid "minute" +msgstr "minuut" + +msgid "minutes" +msgstr "minuten" + +msgid "month" +msgstr "maand" + +msgid "move PiP to main picture" +msgstr "ferplaats PiP nei haad skerm" + +msgid "move down to last entry" +msgstr "" + +msgid "move down to next entry" +msgstr "" + +msgid "move up to first entry" +msgstr "" + +msgid "move up to previous entry" +msgstr "" + +msgid "movie list" +msgstr "film lyst" + +msgid "multinorm" +msgstr "multinorm" + +msgid "never" +msgstr "nea" + +msgid "next channel" +msgstr "folgend kanaal" + +msgid "next channel in history" +msgstr "set folgende kanaal in skiednis" + +msgid "no" +msgstr "nee" + +msgid "no HDD found" +msgstr "" + +msgid "no module found" +msgstr "gjin CI-Module fûn" + +msgid "no standby" +msgstr "gjin paraatstand" + +msgid "no timeout" +msgstr "gjin tiidslimyt" + +msgid "none" +msgstr "gjin" + +msgid "not locked" +msgstr "net op slot" + +msgid "nothing connected" +msgstr "neat anslúten" + +msgid "of a DUAL layer medium used." +msgstr "fan in DUAL layer medium brûkt" + +msgid "of a SINGLE layer medium used." +msgstr "fan in SINGLE layer medium brûkt" + +msgid "off" +msgstr "uit" + +msgid "on" +msgstr "oan" + +msgid "on READ ONLY medium." +msgstr "fan in ALLINNE-LEZE medium" + +msgid "once" +msgstr "ienmalig" + +msgid "open nameserver configuration" +msgstr "" + +msgid "open servicelist" +msgstr "iepenje kanaallyst" + +msgid "open servicelist(down)" +msgstr "iepenje kanaallyst (nei beneden)" + +msgid "open servicelist(up)" +msgstr "iepenje kanaallyst (nei boppe)" + +msgid "open virtual keyboard input help" +msgstr "" + +msgid "pass" +msgstr "trochgean" + +msgid "pause" +msgstr "pause" + +msgid "play entry" +msgstr "rigele ofspielje" + +msgid "play from next mark or playlist entry" +msgstr "Spielje fanôf it folgende punt of ôfspiellyst rigele" + +msgid "play from previous mark or playlist entry" +msgstr "Spielje fanôf it foarige punt of ôfspiellyst rigele" + +msgid "please press OK when ready" +msgstr "druk Ok wanneer klear" + +msgid "please wait, loading picture..." +msgstr "plaatsje wurd laden..." + +msgid "previous channel" +msgstr "foariche kanaal" + +msgid "previous channel in history" +msgstr "set foarich kanaal yn skiednis" + +msgid "record" +msgstr "opnimme" + +msgid "recording..." +msgstr "an it opnimmen..." + +msgid "red" +msgstr "" + +msgid "remove a nameserver entry" +msgstr "" + +msgid "remove after this position" +msgstr "nei dizze posysje alles ferwiderje" + +msgid "remove all alternatives" +msgstr "ferwiderje alle alternatieven" + +msgid "remove all new found flags" +msgstr "ferwiderje nij fûn flaggen" + +msgid "remove before this position" +msgstr "foar dizze posysje alles ferwiderje" + +msgid "remove bookmark" +msgstr "boekmerk ferwiderje" + +msgid "remove directory" +msgstr "map ferwiderje" + +msgid "remove entry" +msgstr "ferwiderje yngong" + +msgid "remove from parental protection" +msgstr "ferwiderje út alderlik tasjoch" + +msgid "remove new found flag" +msgstr "ferwiderje nij fun flagge" + +msgid "remove selected satellite" +msgstr "selektearre sat ferwiderje" + +msgid "remove this mark" +msgstr "ferwiderje punt" + +msgid "repeat playlist" +msgstr "ôfspyllyst opnei spylje" + +msgid "repeated" +msgstr "herhelle" + +msgid "rewind to the previous chapter" +msgstr "werom spile nei it foarige haadstik" + +msgid "right" +msgstr "rjochts" + +msgid "save last directory on exit" +msgstr "" + +msgid "save playlist" +msgstr "ofspiellyst opslaan" + +msgid "save playlist on exit" +msgstr "" + +msgid "scan done!" +msgstr "sykjen klear !" + +#, python-format +msgid "scan in progress - %d%% done!" +msgstr "sykjen dwaande - %d%% klear!" + +msgid "scan state" +msgstr "sykjen status" + +msgid "second" +msgstr "seconde" + +msgid "second cable of motorized LNB" +msgstr "twadde kabel fan LNB-motor" + +msgid "seconds" +msgstr "seconden" + +msgid "select" +msgstr "kies" + +msgid "select .NFI flash file" +msgstr "kies .NFI flash triem" + +msgid "select image from server" +msgstr "kies byld fan server" + +msgid "select interface" +msgstr "" + +msgid "select menu entry" +msgstr "" + +msgid "select movie" +msgstr "kies film" + +msgid "select the movie path" +msgstr "kies it film paad" + +msgid "service pin" +msgstr "service pin" + +msgid "setup pin" +msgstr "pin ynstellingen" + +msgid "show DVD main menu" +msgstr "DVD haadmenu sjen litte" + +msgid "show EPG..." +msgstr "EPG sjen litte..." + +msgid "show Infoline" +msgstr "" + +msgid "show all" +msgstr "alles sjen litte" + +msgid "show alternatives" +msgstr "alternatieven sjen litte" + +msgid "show event details" +msgstr "EPG details sjen litte" + +msgid "show extended description" +msgstr "útbreide beskriuwing sjen litte" + +msgid "show first selected tag" +msgstr "" + +msgid "show second selected tag" +msgstr "" + +msgid "show shutdown menu" +msgstr "útskeakel menu sjen litte" + +msgid "show single service EPG..." +msgstr "ien kanaals EPG sjen litte" + +msgid "show tag menu" +msgstr "label menu sjen litte" + +msgid "show transponder info" +msgstr "transponder ynfo sjen litte" + +msgid "shuffle playlist" +msgstr "meitsje willekeurige ôfspiellyst" + +msgid "shutdown" +msgstr "útskeakelje" + +msgid "simple" +msgstr "simpel" + +msgid "skip backward" +msgstr "efterút oerslaan" + +msgid "skip backward (enter time)" +msgstr "efterút oerslaan (tiid ynjaan)" + +msgid "skip forward" +msgstr "foarút oerslaan" + +msgid "skip forward (enter time)" +msgstr "foarút oerslaan (tiid ynjaan)" + +msgid "slide picture in loop" +msgstr "" + +msgid "sort by date" +msgstr "sortearje op datum" + +msgid "spaces (top, between rows, left)" +msgstr "spaties (top, tusken rigels, links)" + +msgid "standard" +msgstr "standert" + +msgid "standby" +msgstr "paraatstand" + +msgid "start cut here" +msgstr "start stik hjirre" + +msgid "start directory" +msgstr "" + +msgid "start timeshift" +msgstr "tiidskowen starte" + +msgid "stereo" +msgstr "stereo" + +msgid "stop PiP" +msgstr "stopje PiP" + +msgid "stop entry" +msgstr "stopje rigele" + +msgid "stop recording" +msgstr "stopje opnimmen" + +msgid "stop timeshift" +msgstr "tiidskowen stopje" + +msgid "swap PiP and main picture" +msgstr "Pip en haad skerm wikselje" + +msgid "switch to bookmarks" +msgstr "skeakelje nei boekmerkers" + +msgid "switch to filelist" +msgstr "skeakelje nei triemlyst" + +msgid "switch to playlist" +msgstr "skeakelje nei ofspiellyst" + +msgid "switch to the next audio track" +msgstr "skeakelje nei it folgende lûd spoor" + +msgid "switch to the next subtitle language" +msgstr "skeakelje nei de folgende undertiteling taal" + +msgid "text" +msgstr "tekst" + +msgid "textcolor" +msgstr "" + +msgid "this recording" +msgstr "dit opnimmen" + +msgid "this service is protected by a parental control pin" +msgstr "dit kanaal is net beskikber troch it alderlik tasjoch." + +msgid "toggle a cut mark at the current position" +msgstr "merker oan/út op dizze posysje" + +msgid "toggle time, chapter, audio, subtitle info" +msgstr "tiid, haadstik, lûd en undertiteling ynfo omskeakelje" + +msgid "unconfirmed" +msgstr "net befestigt" + +msgid "unknown service" +msgstr "unbeneame kanaal" + +msgid "until restart" +msgstr "oant nijstart ta" + +msgid "user defined" +msgstr "brûkers ynstelling" + +msgid "vertical" +msgstr "ferticaal" + +msgid "view extensions..." +msgstr "lit útbreidingen sjen..." + +msgid "view recordings..." +msgstr "lit opname triemen sjen..." + +msgid "wait for ci..." +msgstr "wachtsje op ci..." + +msgid "wait for mmi..." +msgstr "wachtsje op mmi" + +msgid "waiting" +msgstr "oan it wachtsjen" + +msgid "weekly" +msgstr "wikeliks" + +msgid "whitelist" +msgstr "wyte lyst" + +msgid "year" +msgstr "jier" + +msgid "yellow" +msgstr "" + +msgid "yes" +msgstr "ja" + +msgid "yes (keep feeds)" +msgstr "ja (feeds hâlde)" + +msgid "" +"your dreambox might be unusable now. Please consult the manual for further " +"assistance before rebooting your dreambox." +msgstr "" +"jo Dreambox is miskien no net brûkber. sjoch yn de hanlieding foar jo jo " +"Dreambox opnij starte." + +msgid "zap" +msgstr "knip" + +msgid "zapped" +msgstr "knipt" -- cgit v1.2.3 From 4030160e538a616edfd896c5cf6481bb458aaabe Mon Sep 17 00:00:00 2001 From: ghost Date: Tue, 2 Dec 2008 00:07:43 +0100 Subject: fix disc handling for /dev/discs/disc in fstab ... --- lib/python/Components/Harddisk.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/Harddisk.py b/lib/python/Components/Harddisk.py index f7c3a7cb..febd16dd 100644 --- a/lib/python/Components/Harddisk.py +++ b/lib/python/Components/Harddisk.py @@ -19,20 +19,22 @@ class Harddisk: s_minor = int(tmp[1]) for disc in listdir("/dev/discs"): path = readlink('/dev/discs/'+disc) - devidex = '/dev'+path[2:]+'/' - disc = devidex+'disc' + devidex = '/dev/discs/'+disc+'/' + devidex2 = '/dev'+path[2:]+'/' + disc = devidex2+'disc' ret = stat(disc).st_rdev if s_major == major(ret) and s_minor == minor(ret): self.devidex = devidex - print "new Harddisk", device, self.devidex + self.devidex2 = devidex2 + print "new Harddisk", device, '->', self.devidex, '->', self.devidex2 break def __lt__(self, ob): return self.device < ob.device def bus(self): - ide_cf = self.device.find("hd") == 0 and self.devidex.find("host0") == -1 # 7025 specific - internal = self.device.find("hd") == 0 and self.devidex + ide_cf = self.device.find("hd") == 0 and self.devidex2.find("host0") == -1 # 7025 specific + internal = self.device.find("hd") == 0 if ide_cf: ret = "External (CF)" elif internal: -- cgit v1.2.3 From 819285a4572823e343f0d1ab88e2c68c2caf2677 Mon Sep 17 00:00:00 2001 From: ghost Date: Tue, 2 Dec 2008 00:14:00 +0100 Subject: add "divx" as known file extension --- lib/python/Components/FileList.py | 1 + lib/python/Plugins/Extensions/MediaPlayer/plugin.py | 2 +- lib/service/servicemp3.cpp | 3 ++- 3 files changed, 4 insertions(+), 2 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/FileList.py b/lib/python/Components/FileList.py index e028ec3a..231fde2f 100644 --- a/lib/python/Components/FileList.py +++ b/lib/python/Components/FileList.py @@ -21,6 +21,7 @@ EXTENSIONS = { "bmp": "picture", "ts": "movie", "avi": "movie", + "divx": "movie", "mpg": "movie", "mpeg": "movie", "mkv": "movie", diff --git a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py index 607294ba..41e6ad18 100644 --- a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py +++ b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py @@ -110,7 +110,7 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB # 'None' is magic to start at the list of mountpoints defaultDir = config.mediaplayer.defaultDir.getValue() - self.filelist = FileList(defaultDir, matchingPattern = "(?i)^.*\.(mp2|mp3|ogg|ts|wav|wave|m3u|pls|e2pls|mpg|vob|avi|mkv|mp4|dat|flac)", useServiceRef = True, additionalExtensions = "4098:m3u 4098:e2pls 4098:pls") + self.filelist = FileList(defaultDir, matchingPattern = "(?i)^.*\.(mp2|mp3|ogg|ts|wav|wave|m3u|pls|e2pls|mpg|vob|avi|mkv|mp4|dat|flac|divx)", useServiceRef = True, additionalExtensions = "4098:m3u 4098:e2pls 4098:pls") self["filelist"] = self.filelist self.playlist = MyPlayList() diff --git a/lib/service/servicemp3.cpp b/lib/service/servicemp3.cpp index 017c58f0..9c1972d7 100644 --- a/lib/service/servicemp3.cpp +++ b/lib/service/servicemp3.cpp @@ -37,6 +37,7 @@ eServiceFactoryMP3::eServiceFactoryMP3() extensions.push_back("wave"); extensions.push_back("mkv"); extensions.push_back("avi"); + extensions.push_back("divx"); extensions.push_back("dat"); extensions.push_back("flac"); extensions.push_back("mp4"); @@ -207,7 +208,7 @@ eServiceMP3::eServiceMP3(const char *filename): m_filename(filename), m_pump(eAp sourceinfo.containertype = ctMPEGTS; else if ( strcasecmp(ext, ".mkv") == 0 ) sourceinfo.containertype = ctMKV; - else if ( strcasecmp(ext, ".avi") == 0 ) + else if ( strcasecmp(ext, ".avi") == 0 || strcasecmp(ext, ".divx") == 0) sourceinfo.containertype = ctAVI; else if ( strcasecmp(ext, ".mp4") == 0 ) sourceinfo.containertype = ctMP4; -- cgit v1.2.3 From 2e5c13aebb389a6d74e4130658ccee6a863d01f6 Mon Sep 17 00:00:00 2001 From: ghost Date: Wed, 3 Dec 2008 17:40:25 +0100 Subject: add possibility to change start/end time in timer edit with Vol/Bouquet +/- (thx to Moritz Venn) --- lib/python/Components/config.py | 28 ++++++++++++++++++++++++++++ lib/python/Screens/TimerEntry.py | 33 ++++++++++++++++++++++++++++++--- 2 files changed, 58 insertions(+), 3 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/config.py b/lib/python/Components/config.py index 4d57bbb9..d79337ba 100755 --- a/lib/python/Components/config.py +++ b/lib/python/Components/config.py @@ -604,6 +604,34 @@ class ConfigClock(ConfigSequence): t = time.localtime(default) ConfigSequence.__init__(self, seperator = ":", limits = [(0,23),(0,59)], default = [t.tm_hour, t.tm_min]) + def increment(self): + # Check if Minutes maxed out + if self._value[1] == 59: + # Check if Hours not maxed out + if self._value[0] < 23: + # Increment Hour, reset Minutes to 0 + self._value[0] += 1 + self._value[1] = 0 + else: + # Increment Minutes + self._value[1] += 1 + # Trigger change + self.changed() + + def decrement(self): + # Check if Minutes is minimum + if self._value[1] == 0: + # Check if Hour is greater than 0 + if self._value[0] > 0: + # Decrement Hour, set Minutes to 59 + self._value[0] -= 1 + self._value[1] = 59 + else: + # Decrement Minutes + self._value[1] -= 1 + # Trigger change + self.changed() + class ConfigInteger(ConfigSequence): def __init__(self, default, limits = (0, 9999999999)): ConfigSequence.__init__(self, seperator = ":", limits = [limits], default = default) diff --git a/lib/python/Screens/TimerEntry.py b/lib/python/Screens/TimerEntry.py index be8b5240..0544eff1 100644 --- a/lib/python/Screens/TimerEntry.py +++ b/lib/python/Screens/TimerEntry.py @@ -32,11 +32,15 @@ class TimerEntry(Screen, ConfigListScreen): self.createConfig() - self["actions"] = NumberActionMap(["SetupActions"], + self["actions"] = NumberActionMap(["SetupActions", "GlobalActions", "PiPSetupActions"], { "ok": self.keySelect, "save": self.keyGo, "cancel": self.keyCancel, + "volumeUp": self.incrementStart, + "volumeDown": self.decrementStart, + "size+": self.incrementEnd, + "size-": self.decrementEnd }, -2) self.list = [] @@ -160,9 +164,14 @@ class TimerEntry(Screen, ConfigListScreen): self.entryDate = getConfigListEntry(_("Date"), self.timerentry_date) if self.timerentry_type.value == "once": self.list.append(self.entryDate) - self.list.append(getConfigListEntry(_("StartTime"), self.timerentry_starttime)) + + self.entryStartTime = getConfigListEntry(_("StartTime"), self.timerentry_starttime) + self.list.append(self.entryStartTime) if self.timerentry_justplay.value != "zap": - self.list.append(getConfigListEntry(_("EndTime"), self.timerentry_endtime)) + self.entryEndTime = getConfigListEntry(_("EndTime"), self.timerentry_endtime) + self.list.append(self.entryEndTime) + else: + self.entryEndTime = None self.channelEntry = getConfigListEntry(_("Channel"), self.timerentry_service) self.list.append(self.channelEntry) @@ -319,6 +328,24 @@ class TimerEntry(Screen, ConfigListScreen): self.saveTimer() self.close((True, self.timer)) + def incrementStart(self): + self.timerentry_starttime.increment() + self["config"].invalidate(self.entryStartTime) + + def decrementStart(self): + self.timerentry_starttime.decrement() + self["config"].invalidate(self.entryStartTime) + + def incrementEnd(self): + if self.entryEndTime is not None: + self.timerentry_endtime.increment() + self["config"].invalidate(self.entryEndTime) + + def decrementEnd(self): + if self.entryEndTime is not None: + self.timerentry_endtime.decrement() + self["config"].invalidate(self.entryEndTime) + def subserviceSelected(self, service): if not service is None: self.timer.service_ref = ServiceReference(service[1]) -- cgit v1.2.3 From bf85c027880227646227e9f4ffc658e81eae5c69 Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Thu, 4 Dec 2008 11:18:09 +0100 Subject: allow callback-less ePopen --- lib/python/Components/Console.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/Console.py b/lib/python/Components/Console.py index c5fa5f98..136d10d0 100644 --- a/lib/python/Components/Console.py +++ b/lib/python/Components/Console.py @@ -8,7 +8,7 @@ class Console(object): self.callbacks = {} self.extra_args = {} - def ePopen(self, cmd, callback, extra_args=[]): + def ePopen(self, cmd, callback=None, extra_args=[]): name = cmd i = 0 while self.appContainers.has_key(name): @@ -50,5 +50,6 @@ class Console(object): extra_args = self.extra_args[name] del self.appContainers[name] del self.extra_args[name] - self.callbacks[name](data,retval,extra_args) + if self.callbacks[name]: + self.callbacks[name](data,retval,extra_args) del self.callbacks[name] -- cgit v1.2.3 From 94b2320a63cb6731178fd0b81e27498eff806033 Mon Sep 17 00:00:00 2001 From: ghost Date: Thu, 4 Dec 2008 13:10:46 +0100 Subject: add m4a as audio extension --- lib/python/Components/FileList.py | 1 + 1 file changed, 1 insertion(+) (limited to 'lib/python/Components') diff --git a/lib/python/Components/FileList.py b/lib/python/Components/FileList.py index 231fde2f..a93d4441 100644 --- a/lib/python/Components/FileList.py +++ b/lib/python/Components/FileList.py @@ -10,6 +10,7 @@ from enigma import RT_HALIGN_LEFT, eListboxPythonMultiContent, \ from Tools.LoadPixmap import LoadPixmap EXTENSIONS = { + "m4a": "music", "mp2": "music", "mp3": "music", "wav": "music", -- cgit v1.2.3 From d53eb38c31fb300d39c98fef81af99a40819246f Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Mon, 8 Dec 2008 13:35:55 +0100 Subject: allow using complex shell commandlines (including | etc.) for job tasks (handle with care, no tool exist precondition checking!) --- lib/python/Components/Task.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/Task.py b/lib/python/Components/Task.py index 9a768425..04e5c938 100644 --- a/lib/python/Components/Task.py +++ b/lib/python/Components/Task.py @@ -127,6 +127,7 @@ class Task(object): self.cmd = None self.cwd = "/tmp" self.args = [ ] + self.cmdline = None self.task_progress_changed = None self.output_line = "" job.addTask(self) @@ -141,6 +142,9 @@ class Task(object): self.global_preconditions.append(ToolExistsPrecondition()) self.postconditions.append(ReturncodePostcondition()) + def setCmdline(self, cmdline): + self.cmdline = cmdline + def checkPreconditions(self, immediate = False): not_met = [ ] if immediate: @@ -166,13 +170,15 @@ class Task(object): self.container.stdoutAvail.append(self.processStdout) self.container.stderrAvail.append(self.processStderr) - assert self.cmd is not None - assert len(self.args) >= 1 - if self.cwd is not None: self.container.setCWD(self.cwd) - print "execute:", self.container.execute(self.cmd, *self.args), self.cmd, self.args + if not self.cmd and self.cmdline: + print "execute:", self.container.execute(self.cmdline), self.cmdline + else: + assert self.cmd is not None + assert len(self.args) >= 1 + print "execute:", self.container.execute(self.cmd, *self.args), ' '.join(self.args) if self.initial_input: self.writeInput(self.initial_input) -- cgit v1.2.3 From 73b5c76cb020ac7baa2536e14997618b0e17eef5 Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Mon, 8 Dec 2008 13:45:18 +0100 Subject: add new config types ConfigSearchText, which uses the new sql NumericalTextInput search map plus type ConfigDirectory which displays paths as strings --- lib/python/Components/config.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'lib/python/Components') diff --git a/lib/python/Components/config.py b/lib/python/Components/config.py index d79337ba..cfa4318c 100755 --- a/lib/python/Components/config.py +++ b/lib/python/Components/config.py @@ -926,6 +926,31 @@ class ConfigNumber(ConfigText): self.marked_pos = 0 self.offset = 0 +class ConfigSearchText(ConfigText): + def __init__(self, default = "", fixed_size = False, visible_width = False): + ConfigText.__init__(self, default = default, fixed_size = fixed_size, visible_width = visible_width) + NumericalTextInput.__init__(self, nextFunc = self.nextFunc, handleTimeout = False, search = True) + +class ConfigDirectory(ConfigText): + def __init__(self, default="", visible_width=60): + ConfigText.__init__(self, default, fixed_size = True, visible_width = visible_width) + def handleKey(self, key): + pass + def getValue(self): + if self.text == "": + return None + else: + return ConfigText.getValue(self) + def setValue(self, val): + if val == None: + val = "" + ConfigText.setValue(self, val) + def getMulti(self, selected): + if self.text == "": + return ("mtext"[1-selected:], _("List of Storage Devices"), range(0)) + else: + return ConfigText.getMulti(self, selected) + # a slider. class ConfigSlider(ConfigElement): def __init__(self, default = 0, increment = 1, limits = (0, 100)): -- cgit v1.2.3 From 50182c33fbbd4845ceb81afa7a5cbf263c929412 Mon Sep 17 00:00:00 2001 From: ghost Date: Tue, 9 Dec 2008 15:59:34 +0100 Subject: add SNRdB to TunerInfo --- lib/python/Components/TunerInfo.py | 40 +++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/TunerInfo.py b/lib/python/Components/TunerInfo.py index d8b4d064..39f54c0b 100644 --- a/lib/python/Components/TunerInfo.py +++ b/lib/python/Components/TunerInfo.py @@ -10,13 +10,14 @@ class TunerInfo(GUIComponent): BER = 2 LOCK = 3 SNR_PERCENTAGE = 0 - AGC_PERCENTAGE = 1 - BER_VALUE = 2 - SNR_BAR = 3 - AGC_BAR = 4 - BER_BAR = 5 - LOCK_STATE = 6 - SYNC_STATE = 7 + SNR_DB = 1 + AGC_PERCENTAGE = 2 + BER_VALUE = 3 + SNR_BAR = 4 + AGC_BAR = 5 + BER_BAR = 6 + LOCK_STATE = 7 + SYNC_STATE = 8 def __init__(self, type, servicefkt = None, frontendfkt = None, statusDict = None): GUIComponent.__init__(self) @@ -47,7 +48,9 @@ class TunerInfo(GUIComponent): return val*100/65535 def update(self): - if self.type == self.SNR_PERCENTAGE or self.type == self.SNR_BAR: + if self.type == self.SNR_DB: + value = self.getValue(self.SNR_DB) + elif self.type == self.SNR_PERCENTAGE or self.type == self.SNR_BAR: value = self.getValue(self.SNR) * 100 / 65536 elif self.type == self.AGC_PERCENTAGE or self.type == self.AGC_BAR: value = self.getValue(self.AGC) * 100 / 65536 @@ -55,8 +58,13 @@ class TunerInfo(GUIComponent): value = self.getValue(self.BER) elif self.type == self.LOCK_STATE: value = self.getValue(self.LOCK) - - if self.type == self.SNR_PERCENTAGE or self.type == self.AGC_PERCENTAGE: + + if self.type == self.SNR_DB: + if value != 0x12345678: + self.setText("%3.02f dB" % (value / 100.0)) + else: + self.setText("") + elif self.type == self.SNR_PERCENTAGE or self.type == self.AGC_PERCENTAGE: self.setText("%d%%" % (value)) elif self.type == self.BER_VALUE: self.setText("%d" % (value)) @@ -72,7 +80,9 @@ class TunerInfo(GUIComponent): def getValue(self, what): if self.statusDict: - if what == self.SNR: + if what == self.SNR_DB: + return self.statusDict.get("tuner_signal_quality_db", 0x12345678) + elif what == self.SNR: return self.statusDict.get("tuner_signal_quality", 0) elif what == self.AGC: return self.statusDict.get("tuner_signal_power", 0) @@ -85,7 +95,9 @@ class TunerInfo(GUIComponent): if service is not None: feinfo = service.frontendInfo() if feinfo is not None: - if what == self.SNR: + if what == self.SNR_DB: + return feinfo.getFrontendInfo(iFrontendInformation.signalQualitydB) + elif what == self.SNR: return feinfo.getFrontendInfo(iFrontendInformation.signalQuality) elif what == self.AGC: return feinfo.getFrontendInfo(iFrontendInformation.signalPower) @@ -96,7 +108,9 @@ class TunerInfo(GUIComponent): elif self.frontendfkt: frontend = self.frontendfkt() if frontend: - if what == self.SNR: + if what == self.SNR_DB: + return frontend.readFrontendData(iFrontendInformation.signalQualitydB) + elif what == self.SNR: return frontend.readFrontendData(iFrontendInformation.signalQuality) elif what == self.AGC: return frontend.readFrontendData(iFrontendInformation.signalPower) -- cgit v1.2.3 From 9ef5b8eaa067430868c27f7ef063ecf32e84ea68 Mon Sep 17 00:00:00 2001 From: ghost Date: Tue, 9 Dec 2008 23:23:40 +0100 Subject: RemainingToText.py: more flexible use --- lib/python/Components/Converter/RemainingToText.py | 34 ++++++++++++++++++---- 1 file changed, 29 insertions(+), 5 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/Converter/RemainingToText.py b/lib/python/Components/Converter/RemainingToText.py index adefe9cf..4249e30a 100644 --- a/lib/python/Components/Converter/RemainingToText.py +++ b/lib/python/Components/Converter/RemainingToText.py @@ -2,19 +2,43 @@ from Components.Converter.Converter import Converter from Components.Element import cached class RemainingToText(Converter, object): + DEFAULT = 0 + WITH_SECONDS = 1 + NO_SECONDS = 2 + def __init__(self, type): Converter.__init__(self, type) + if type == "WithSeconds": + self.type = self.WITH_SECONDS + elif type == "NoSeconds": + self.type = self.NO_SECONDS + else: + self.type = self.DEFAULT @cached def getText(self): - r = self.source.time - if r is None: + time = self.source.time + if time is None: return "" (duration, remaining) = self.source.time - if remaining is not None: - return "+%d min" % (remaining / 60) + + if self.type == self.WITH_SECONDS: + if remaining is not None: + return "%d:%02d:%02d" % (remaining / 3600, (remaining / 60) - ((remaining / 3600) * 60), remaining % 60) + else: + return "%02d:%02d:%02d" % (duration / 3600, (duration / 60) - ((duration / 3600) * 60), duration % 60) + elif self.type == self.NO_SECONDS: + if remaining is not None: + return "+%d:%02d" % (remaining / 3600, (remaining / 60) - ((remaining / 3600) * 60)) + else: + return "%02d:%02d" % (duration / 3600, (duration / 60) - ((duration / 3600) * 60)) + elif self.type == self.DEFAULT: + if remaining is not None: + return "+%d min" % (remaining / 60) + else: + return "%d min" % (duration / 60) else: - return "%d min" % (duration / 60) + return "???" text = property(getText) -- cgit v1.2.3 From efe45cc966495fe6d581a465df5a3c6a1280d633 Mon Sep 17 00:00:00 2001 From: ghost Date: Tue, 9 Dec 2008 23:37:05 +0100 Subject: ServicePosition.py: add Option "ShowNoSeconds" --- lib/python/Components/Converter/ServicePosition.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/Converter/ServicePosition.py b/lib/python/Components/Converter/ServicePosition.py index b488258b..d7a55dae 100644 --- a/lib/python/Components/Converter/ServicePosition.py +++ b/lib/python/Components/Converter/ServicePosition.py @@ -19,6 +19,7 @@ class ServicePosition(Converter, Poll, object): self.negate = 'Negate' in args self.detailed = 'Detailed' in args self.showHours = 'ShowHours' in args + self.showNoSeconds = 'ShowNoSeconds' in args if self.detailed: self.poll_interval = 100 @@ -34,7 +35,7 @@ class ServicePosition(Converter, Poll, object): elif type == "Gauge": self.type = self.TYPE_GAUGE else: - raise "type must be {Length|Position|Remaining|Gauge} with optional arguments {Negate|Detailed|ShowHours}" + raise "type must be {Length|Position|Remaining|Gauge} with optional arguments {Negate|Detailed|ShowHours|NoSeconds}" self.poll_enabled = self.type != self.TYPE_LENGTH @@ -94,9 +95,15 @@ class ServicePosition(Converter, Poll, object): if not self.detailed: if self.showHours: - return sign + "%d:%02d:%02d" % (l/3600, l%3600/60, l%60) + if self.showNoSeconds: + return sign + "%d:%02d" % (l/3600, l%3600/60) + else: + return sign + "%d:%02d:%02d" % (l/3600, l%3600/60, l%60) else: - return sign + "%d:%02d" % (l/60, l%60) + if self.showNoSeconds: + return sign + "%d" % (l/60) + else: + return sign + "%d:%02d" % (l/60, l%60) else: if self.showHours: return sign + "%d:%02d:%02d:%03d" % ((l/3600/90000), (l/90000)%3600/60, (l/90000)%60, (l%90000)/90) -- cgit v1.2.3 From 2db3e8afead0a9ee14871c8436691755be22a5ca Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Thu, 6 Nov 2008 00:17:52 +0100 Subject: Patch by Anders Holst: * ConfigElement.addNotifier takes a new optional argument immediate_feedback (which is True by default). If True the notifier is called whenever an editing key is pressed in the element. When False, the notifier is only called when editing is finished, i.e the element is deselected or the dialog closed. * ConfigSet is updated in accordance with Teros suggestion so that it behaves like the others and feedback can be given immediately. * All ConfigElements are modified to check whether they have changed since last selected (by a new variable last_value). * UsageConfig.py is updated to use immediate_feedback=False in the case of validating the speeds. (The only case so far where this setting is needed, but with the possibility more uses may follow.) --- lib/python/Components/UsageConfig.py | 8 +++--- lib/python/Components/config.py | 53 +++++++++++++++++++++++++++++------- 2 files changed, 47 insertions(+), 14 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/UsageConfig.py b/lib/python/Components/UsageConfig.py index 6ed87840..2ea91aeb 100644 --- a/lib/python/Components/UsageConfig.py +++ b/lib/python/Components/UsageConfig.py @@ -89,8 +89,8 @@ def InitUsageConfig(): config.seek.speeds_backward = ConfigSet(default=[8, 16, 32, 64, 128], choices=[1, 2, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128]) config.seek.speeds_slowmotion = ConfigSet(default=[2, 4, 8], choices=[2, 4, 6, 8, 12, 16, 25]) - config.seek.enter_forward = ConfigSelection(default = "2", choices = ["2"]) - config.seek.enter_backward = ConfigSelection(default = "2", choices = ["2"]) + config.seek.enter_forward = ConfigSelection(default = "2", choices = ["2", "4", "6", "8", "12", "16", "24", "32", "48", "64", "96", "128"]) + config.seek.enter_backward = ConfigSelection(default = "1", choices = ["1", "2", "4", "6", "8", "12", "16", "24", "32", "48", "64", "96", "128"]) config.seek.stepwise_minspeed = ConfigSelection(default = "16", choices = ["Never", "2", "4", "6", "8", "12", "16", "24", "32", "48", "64", "96", "128"]) config.seek.stepwise_repeat = ConfigSelection(default = "3", choices = ["2", "3", "4", "5", "6"]) @@ -104,14 +104,14 @@ def InitUsageConfig(): configElement.value = [2] updateChoices(config.seek.enter_forward, configElement.value) - config.seek.speeds_forward.addNotifier(updateEnterForward) + config.seek.speeds_forward.addNotifier(updateEnterForward, immediate_feedback = False) def updateEnterBackward(configElement): if not configElement.value: configElement.value = [2] updateChoices(config.seek.enter_backward, configElement.value) - config.seek.speeds_backward.addNotifier(updateEnterBackward) + config.seek.speeds_backward.addNotifier(updateEnterBackward, immediate_feedback = False) def updateChoices(sel, choices): if choices: diff --git a/lib/python/Components/config.py b/lib/python/Components/config.py index cfa4318c..1efb8a56 100755 --- a/lib/python/Components/config.py +++ b/lib/python/Components/config.py @@ -31,8 +31,10 @@ class ConfigElement(object): object.__init__(self) self.saved_value = None + self.last_value = None self.save_disabled = False self.notifiers = [] + self.notifiers_final = [] self.enabled = True self.callNotifiersOnSaveAndCancel = False @@ -85,10 +87,16 @@ class ConfigElement(object): for x in self.notifiers: x(self) - def addNotifier(self, notifier, initial_call = True): + def changedFinal(self): + for x in self.notifiers_final: + x(self) + + def addNotifier(self, notifier, initial_call = True, immediate_feedback = True): assert callable(notifier), "notifiers must be callable" - self.notifiers.append(notifier) - + if immediate_feedback: + self.notifiers.append(notifier) + else: + self.notifiers_final.append(notifier) # CHECKME: # do we want to call the notifier # - at all when adding it? (yes, though optional) @@ -110,7 +118,9 @@ class ConfigElement(object): pass def onDeselect(self, session): - pass + if not self.last_value == self.value: + self.changedFinal() + self.last_value = self.value KEY_LEFT = 0 KEY_RIGHT = 1 @@ -143,6 +153,7 @@ class ConfigSelection(ConfigElement): ConfigElement.__init__(self) self._value = None self.setChoices(choices, default) + self.last_value = self._value def setChoices(self, choices, default = None): self.choices = [] @@ -262,7 +273,8 @@ class ConfigBoolean(ConfigElement): def __init__(self, default = False, descriptions = {False: "false", True: "true"}): ConfigElement.__init__(self) self.descriptions = descriptions - self.value = self.default = default + self.value = self.last_value = self.default = default + def handleKey(self, key): if key in [KEY_LEFT, KEY_RIGHT]: self.value = not self.value @@ -309,6 +321,11 @@ class ConfigBoolean(ConfigElement): else: self.value = False + def onDeselect(self, session): + if not self.last_value == self.value: + self.changedFinal() + self.last_value = self.value + class ConfigYesNo(ConfigBoolean): def __init__(self, default = False): ConfigBoolean.__init__(self, default = default, descriptions = {False: _("no"), True: _("yes")}) @@ -326,7 +343,7 @@ class ConfigDateTime(ConfigElement): ConfigElement.__init__(self) self.increment = increment self.formatstring = formatstring - self.value = self.default = int(default) + self.value = self.last_value = self.default = int(default) def handleKey(self, key): if key == KEY_LEFT: @@ -367,6 +384,7 @@ class ConfigSequence(ConfigElement): self.default = default self.value = copy.copy(default) + self.last_value = copy.copy(default) self.endNotifier = [] @@ -507,6 +525,11 @@ class ConfigSequence(ConfigElement): def fromstring(self, value): return [int(x) for x in value.split(self.seperator)] + def onDeselect(self, session): + if not self.last_value == self._value: + self.changedFinal() + self.last_value = copy.copy(self._value) + class ConfigIP(ConfigSequence): def __init__(self, default, auto_jump = False): ConfigSequence.__init__(self, seperator = ".", limits = [(0,255),(0,255),(0,255),(0,255)], default = default) @@ -685,7 +708,7 @@ class ConfigText(ConfigElement, NumericalTextInput): self.offset = 0 self.overwrite = fixed_size self.help_window = None - self.value = self.default = default + self.value = self.last_value = self.default = default def validateMarker(self): if self.fixed_size: @@ -851,6 +874,9 @@ class ConfigText(ConfigElement, NumericalTextInput): if self.help_window: session.deleteDialog(self.help_window) self.help_window = None + if not self.last_value == self.value: + self.changedFinal() + self.last_value = self.value def getHTML(self, id): return '
\n' @@ -925,6 +951,9 @@ class ConfigNumber(ConfigText): def onDeselect(self, session): self.marked_pos = 0 self.offset = 0 + if not self.last_value == self.value: + self.changedFinal() + self.last_value = self.value class ConfigSearchText(ConfigText): def __init__(self, default = "", fixed_size = False, visible_width = False): @@ -955,7 +984,7 @@ class ConfigDirectory(ConfigText): class ConfigSlider(ConfigElement): def __init__(self, default = 0, increment = 1, limits = (0, 100)): ConfigElement.__init__(self) - self.value = self.default = default + self.value = self.last_value = self.default = default self.min = limits[0] self.max = limits[1] self.increment = increment @@ -1027,7 +1056,7 @@ class ConfigSet(ConfigElement): default = [] self.pos = -1 default.sort() - self.default = default + self.last_value = self.default = default self.value = default+[] def toggleChoice(self, choice): @@ -1036,6 +1065,7 @@ class ConfigSet(ConfigElement): else: self.value.append(choice) self.value.sort() + self.changed() def handleKey(self, key): if key in KEY_NUMBERS + [KEY_DELETE, KEY_BACKSPACE]: @@ -1082,7 +1112,9 @@ class ConfigSet(ConfigElement): def onDeselect(self, session): self.pos = -1 - self.changed() + if not self.last_value == self.value: + self.changedFinal() + self.last_value = self.value+[] def tostring(self, value): return str(value) @@ -1099,6 +1131,7 @@ class ConfigLocations(ConfigElement): self.locations = [] self.mountpoints = [] harddiskmanager.on_partition_list_change.append(self.mountpointsChanged) + self.value = default+[] def setValue(self, value): loc = [x[0] for x in self.locations if x[3]] -- cgit v1.2.3 From 647889e65bc8aabd907bc327e62c6209a947ae1b Mon Sep 17 00:00:00 2001 From: ghost Date: Fri, 12 Dec 2008 12:58:25 +0100 Subject: cleanup --- lib/python/Components/ServiceScan.py | 86 ++++++++++++++++-------------------- 1 file changed, 39 insertions(+), 47 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/ServiceScan.py b/lib/python/Components/ServiceScan.py index 5a7b3dea..5d624264 100644 --- a/lib/python/Components/ServiceScan.py +++ b/lib/python/Components/ServiceScan.py @@ -36,54 +36,46 @@ class ServiceScan: tp_text = "" if transponder: tp_type = transponder.getSystem() - if not tp_type[0]: - tp_type = tp_type[1] - if tp_type == iDVBFrontend.feSatellite: - network = _("Satellite") - tp = transponder.getDVBS() - if not tp[0]: - tp = tp[1] - orb_pos = tp.orbital_position - try: - sat_name = str(nimmgr.getSatDescription(orb_pos)) - except KeyError: - sat_name = "" - if orb_pos > 1800: # west - orb_pos = 3600 - orb_pos - h = _("W") - else: - h = _("E") - if sat_name.find("%d.%d" % (orb_pos/10, orb_pos%10)) != -1: - network = sat_name - else: - network = ("%s %d.%d %s") % (sat_name, orb_pos / 10, orb_pos % 10, h) - tp_text = ("%s %s %d%c / %d / %s") %( { 0 : "DVB-S", 1 : "DVB-S2" }[tp.system], - { 0 : "Auto", 1 : "QPSK", 2 : "M8PSK", 3 : "QAM16" }[tp.modulation], - tp.frequency/1000, - { 0 : 'H', 1 : 'V', 2 : 'L', 3 : 'R' }[tp.polarisation], - tp.symbol_rate/1000, - { 0 : "AUTO", 1 : "1/2", 2 : "2/3", 3 : "3/4", 4 : "5/6", - 5 : "7/8", 6 : "8/9", 7 : "3/5", 8 : "4/5", 9 : "9/10", - 15 : "NONE" }[tp.fec] ) - elif tp_type == iDVBFrontend.feCable: - network = _("Cable") - tp = transponder.getDVBC() - if not tp[0]: - tp = tp[1] - tp_text = ("DVB-C %s %d / %d / %s") %( { 0 : "AUTO", 1 : "QAM16", 2 : "QAM32", 3 : "QAM64", 4 : "QAM128", 5 : "QAM256" }[tp.modulation], - tp.frequency, - tp.symbol_rate/1000, - { 0 : "AUTO", 1 : "1/2", 2 : "2/3", 3 : "3/4", 4 : "5/6", 5 : "7/8", 6 : "8/9", 15 : "NONE" }[tp.fec_inner] ) - elif tp_type == iDVBFrontend.feTerrestrial: - network = _("Terrestrial") - tp = transponder.getDVBT() - if not tp[0]: - tp = tp[1] - tp_text = ("DVB-T %s %d %s") %( { 0 : "QPSK", 1 : "QAM16", 2 : "QAM64", 3 : "AUTO"}[tp.modulation], - tp.frequency, - { 0 : "Bw 8MHz", 1 : "Bw 7MHz", 2 : "Bw 6MHz", 3 : "Bw Auto" }[tp.bandwidth]) + if tp_type == iDVBFrontend.feSatellite: + network = _("Satellite") + tp = transponder.getDVBS() + orb_pos = tp.orbital_position + try: + sat_name = str(nimmgr.getSatDescription(orb_pos)) + except KeyError: + sat_name = "" + if orb_pos > 1800: # west + orb_pos = 3600 - orb_pos + h = _("W") else: - print "unknown transponder type in scanStatusChanged" + h = _("E") + if sat_name.find("%d.%d" % (orb_pos/10, orb_pos%10)) != -1: + network = sat_name + else: + network = ("%s %d.%d %s") % (sat_name, orb_pos / 10, orb_pos % 10, h) + tp_text = ("%s %s %d%c / %d / %s") %( { 0 : "DVB-S", 1 : "DVB-S2" }[tp.system], + { 0 : "Auto", 1 : "QPSK", 2 : "M8PSK", 3 : "QAM16" }[tp.modulation], + tp.frequency/1000, + { 0 : 'H', 1 : 'V', 2 : 'L', 3 : 'R' }[tp.polarisation], + tp.symbol_rate/1000, + { 0 : "AUTO", 1 : "1/2", 2 : "2/3", 3 : "3/4", 4 : "5/6", + 5 : "7/8", 6 : "8/9", 7 : "3/5", 8 : "4/5", 9 : "9/10", + 15 : "NONE" }[tp.fec] ) + elif tp_type == iDVBFrontend.feCable: + network = _("Cable") + tp = transponder.getDVBC() + tp_text = ("DVB-C %s %d / %d / %s") %( { 0 : "AUTO", 1 : "QAM16", 2 : "QAM32", 3 : "QAM64", 4 : "QAM128", 5 : "QAM256" }[tp.modulation], + tp.frequency, + tp.symbol_rate/1000, + { 0 : "AUTO", 1 : "1/2", 2 : "2/3", 3 : "3/4", 4 : "5/6", 5 : "7/8", 6 : "8/9", 15 : "NONE" }[tp.fec_inner] ) + elif tp_type == iDVBFrontend.feTerrestrial: + network = _("Terrestrial") + tp = transponder.getDVBT() + tp_text = ("DVB-T %s %d %s") %( { 0 : "QPSK", 1 : "QAM16", 2 : "QAM64", 3 : "AUTO"}[tp.modulation], + tp.frequency, + { 0 : "Bw 8MHz", 1 : "Bw 7MHz", 2 : "Bw 6MHz", 3 : "Bw Auto" }[tp.bandwidth]) + else: + print "unknown transponder type in scanStatusChanged" self.network.setText(network) self.transponder.setText(tp_text) -- cgit v1.2.3 From b833353b5285a547eb18c079aa860c9ee2765d6e Mon Sep 17 00:00:00 2001 From: ghost Date: Sat, 13 Dec 2008 01:33:05 +0100 Subject: add possibility to set manual lnb priority (only in advanced sat config) range 0..64 to decrease priorities (this is lower as all auto given priorities) range 14000..14064 this is higher than auto given rotor priorities range 19000..19064 this is higher than each auto given priorities --- lib/dvb/sec.cpp | 28 ++++++++++++++++++++++++---- lib/dvb/sec.h | 5 ++++- lib/python/Components/NimManager.py | 10 ++++++++++ lib/python/Screens/Satconfig.py | 1 + 4 files changed, 39 insertions(+), 5 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/dvb/sec.cpp b/lib/dvb/sec.cpp index 751a5453..1022b955 100644 --- a/lib/dvb/sec.cpp +++ b/lib/dvb/sec.cpp @@ -140,7 +140,7 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite { bool rotor=false; eDVBSatelliteLNBParameters &lnb_param = m_lnbs[idx]; - if ( lnb_param.slot_mask & slot_id ) // lnb for correct tuner? + if ( lnb_param.m_slot_mask & slot_id ) // lnb for correct tuner? { int ret = 0; eDVBSatelliteDiseqcParameters &di_param = lnb_param.m_diseqc_parameters; @@ -297,6 +297,9 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite ret=0; } + if (ret && lnb_param.m_prio != -1) + ret = lnb_param.m_prio; + eSecDebugNoSimulate("ret %d, score old %d", ret, score); if (ret > score) { @@ -309,7 +312,12 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite } } if (score && satcount) - score -= (satcount-1); + { + if (score > (satcount-1)) + score -= (satcount-1); + else + score = 1; // min score + } if (score && direct_connected) score += 5; // increase score for tuners with direct sat connection eSecDebugNoSimulate("final score %d", score); @@ -963,7 +971,8 @@ RESULT eDVBSatelliteEquipmentControl::clear() for (int i=0; i <= m_lnbidx; ++i) { m_lnbs[i].m_satellites.clear(); - m_lnbs[i].slot_mask = 0; + m_lnbs[i].m_slot_mask = 0; + m_lnbs[i].m_prio = -1; // auto } m_lnbidx=-1; @@ -1021,7 +1030,7 @@ RESULT eDVBSatelliteEquipmentControl::setLNBSlotMask(int slotmask) { eSecDebug("eDVBSatelliteEquipmentControl::setLNBSlotMask(%d)", slotmask); if ( currentLNBValid() ) - m_lnbs[m_lnbidx].slot_mask = slotmask; + m_lnbs[m_lnbidx].m_slot_mask = slotmask; else return -ENOENT; return 0; @@ -1067,6 +1076,17 @@ RESULT eDVBSatelliteEquipmentControl::setLNBIncreasedVoltage(bool onoff) return 0; } +RESULT eDVBSatelliteEquipmentControl::setLNBPrio(int prio) +{ + eSecDebug("eDVBSatelliteEquipmentControl::setLNBPrio(%d)", prio); + if ( currentLNBValid() ) + m_lnbs[m_lnbidx].m_prio = prio; + else + return -ENOENT; + return 0; +} + + /* DiSEqC Specific Parameters */ RESULT eDVBSatelliteEquipmentControl::setDiSEqCMode(int diseqcmode) { diff --git a/lib/dvb/sec.h b/lib/dvb/sec.h index 27dcedd5..2efd0b49 100644 --- a/lib/dvb/sec.h +++ b/lib/dvb/sec.h @@ -231,7 +231,7 @@ public: #ifndef SWIG t_12V_relais_state m_12V_relais_state; // 12V relais output on/off - __u8 slot_mask; // useable by slot ( 1 | 2 | 4...) + int m_slot_mask; // useable by slot ( 1 | 2 | 4...) unsigned int m_lof_hi, // for 2 band universal lnb 10600 Mhz (high band offset frequency) m_lof_lo, // for 2 band universal lnb 9750 Mhz (low band offset frequency) @@ -242,6 +242,8 @@ public: std::map m_satellites; eDVBSatelliteDiseqcParameters m_diseqc_parameters; eDVBSatelliteRotorParameters m_rotor_parameters; + + int m_prio; // to override automatic tuner management ... -1 is Auto #endif }; @@ -304,6 +306,7 @@ public: RESULT setLNBLOFH(int lofh); RESULT setLNBThreshold(int threshold); RESULT setLNBIncreasedVoltage(bool onoff); + RESULT setLNBPrio(int prio); /* DiSEqC Specific Parameters */ RESULT setDiSEqCMode(int diseqcmode); RESULT setToneburst(int toneburst); diff --git a/lib/python/Components/NimManager.py b/lib/python/Components/NimManager.py index edd3bbbb..168962e9 100644 --- a/lib/python/Components/NimManager.py +++ b/lib/python/Components/NimManager.py @@ -381,6 +381,8 @@ class SecConfigure: sec.setLNBSlotMask(tunermask) + sec.setLNBPrio(int(currLnb.prio.value)) + # finally add the orbital positions for y in lnbSat[x]: self.addSatellite(sec, y) @@ -1026,6 +1028,14 @@ def InitNimManager(nimmgr): nim.advanced.lnb[x].fastTurningBegin = ConfigDateTime(default=mktime(btime.timetuple()), formatstring = _("%H:%M"), increment = 600) etime = datetime(1970, 1, 1, 19, 0); nim.advanced.lnb[x].fastTurningEnd = ConfigDateTime(default=mktime(etime.timetuple()), formatstring = _("%H:%M"), increment = 600) + prio_list = [ ("-1", _("Auto")) ] + for prio in range(65): + prio_list.append((str(prio), str(prio))) + for prio in range(14000,14065): + prio_list.append((str(prio), str(prio))) + for prio in range(19000,19065): + prio_list.append((str(prio), str(prio))) + nim.advanced.lnb[x].prio = ConfigSelection(default="-1", choices=prio_list) elif slot.isCompatible("DVB-C"): nim.configMode = ConfigSelection( choices = { diff --git a/lib/python/Screens/Satconfig.py b/lib/python/Screens/Satconfig.py index 6489f28f..5628926f 100644 --- a/lib/python/Screens/Satconfig.py +++ b/lib/python/Screens/Satconfig.py @@ -283,6 +283,7 @@ class NimSetup(Screen, ConfigListScreen): self.list.append(getConfigListEntry(_("Threshold"), currLnb.threshold)) # self.list.append(getConfigListEntry(_("12V Output"), currLnb.output_12v)) self.list.append(getConfigListEntry(_("Increased voltage"), currLnb.increased_voltage)) + self.list.append(getConfigListEntry(_("Priority"), currLnb.prio)) def fillAdvancedList(self): self.list = [ ] -- cgit v1.2.3 From 67b8794397ca2ac4e05c59fc417456f4d4cac8f0 Mon Sep 17 00:00:00 2001 From: Stefan Pluecken Date: Fri, 7 Nov 2008 18:41:14 +0100 Subject: add ResourceManager for handling resources in inter plugin communication --- lib/python/Components/Makefile.am | 2 +- lib/python/Components/ResourceManager.py | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 lib/python/Components/ResourceManager.py (limited to 'lib/python/Components') diff --git a/lib/python/Components/Makefile.am b/lib/python/Components/Makefile.am index fda58bf3..9c04701b 100644 --- a/lib/python/Components/Makefile.am +++ b/lib/python/Components/Makefile.am @@ -18,4 +18,4 @@ install_PYTHON = \ MultiContent.py MediaPlayer.py TunerInfo.py VideoWindow.py ChoiceList.py \ Element.py Playlist.py ParentalControl.py ParentalControlList.py \ Ipkg.py SelectionList.py Scanner.py SystemInfo.py DreamInfoHandler.py \ - Task.py language_cache.py Console.py + Task.py language_cache.py Console.py ResourceManager.py diff --git a/lib/python/Components/ResourceManager.py b/lib/python/Components/ResourceManager.py new file mode 100644 index 00000000..fb6be4a8 --- /dev/null +++ b/lib/python/Components/ResourceManager.py @@ -0,0 +1,23 @@ +class ResourceManager: + def __init__(self): + self.resourceList = {} + + def addResource(self, name, resource): + print "adding Resource", name + self.resourceList[name] = resource + print "resources:", self.resourceList + + + def getResource(self, name): + if not self.hasResource(name): + return None + return self.resourceList[name] + + def hasResource(self, name): + return self.resourceList.has_key(name) + + def removeResource(self, name): + if self.hasResource(name): + del self.resourceList[name] + +resourcemanager = ResourceManager() \ No newline at end of file -- cgit v1.2.3 From 216dbbfd18a36835b8a48d2f2e1e1ce2c65c8f14 Mon Sep 17 00:00:00 2001 From: Stefan Pluecken Date: Mon, 24 Nov 2008 22:42:42 +0100 Subject: catch up DiseqcTest development --- configure.ac | 1 + lib/dvb/db.cpp | 73 ++++--- lib/python/Components/Makefile.am | 2 +- lib/python/Components/Sources/Progress.py | 7 + lib/python/Components/TuneTest.py | 189 ++++++++++++++++ .../Plugins/SystemPlugins/DiseqcTester/Makefile.am | 5 + .../Plugins/SystemPlugins/DiseqcTester/__init__.py | 0 .../Plugins/SystemPlugins/DiseqcTester/plugin.py | 239 +++++++++++++++++++++ lib/python/Plugins/SystemPlugins/Makefile.am | 2 +- .../Plugins/SystemPlugins/Satfinder/plugin.py | 27 +-- lib/python/Screens/Satconfig.py | 88 ++++---- 11 files changed, 533 insertions(+), 100 deletions(-) create mode 100644 lib/python/Components/TuneTest.py create mode 100644 lib/python/Plugins/SystemPlugins/DiseqcTester/Makefile.am create mode 100644 lib/python/Plugins/SystemPlugins/DiseqcTester/__init__.py create mode 100644 lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py (limited to 'lib/python/Components') diff --git a/configure.ac b/configure.ac index 7aebe25f..719baa11 100644 --- a/configure.ac +++ b/configure.ac @@ -120,6 +120,7 @@ lib/python/Plugins/SystemPlugins/SkinSelector/Makefile lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/Makefile lib/python/Plugins/SystemPlugins/Videomode/Makefile lib/python/Plugins/SystemPlugins/VideoTune/Makefile +lib/python/Plugins/SystemPlugins/DiseqcTester/Makefile lib/python/Plugins/DemoPlugins/Makefile lib/python/Plugins/DemoPlugins/TestPlugin/Makefile lib/python/Plugins/Extensions/Makefile diff --git a/lib/dvb/db.cpp b/lib/dvb/db.cpp index 44191586..6f30253a 100644 --- a/lib/dvb/db.cpp +++ b/lib/dvb/db.cpp @@ -786,7 +786,7 @@ PyObject *eDVBDB::readSatellites(ePyObject sat_list, ePyObject sat_dict, ePyObje return Py_False; } int tmp, *dest = NULL, - modulation, system, freq, sr, pol, fec, inv, pilot, rolloff; + modulation, system, freq, sr, pol, fec, inv, pilot, rolloff, tsid, onid; char *end_ptr; const Attribute *at; std::string name; @@ -851,6 +851,9 @@ PyObject *eDVBDB::readSatellites(ePyObject sat_list, ePyObject sat_dict, ePyObje inv = 2; // AUTO default pilot = 2; // AUTO default rolloff = 0; // alpha 0.35 + tsid = -1; + onid = -1; + for (AttributeConstIterator it(tp_attributes.begin()); it != end; ++it) { // eDebug("\t\tattr: %s", at->name().c_str()); @@ -865,6 +868,8 @@ PyObject *eDVBDB::readSatellites(ePyObject sat_list, ePyObject sat_dict, ePyObje else if (name == "inversion") dest = &inv; else if (name == "rolloff") dest = &rolloff; else if (name == "pilot") dest = &pilot; + else if (name == "tsid") dest = &tsid; + else if (name == "onid") dest = &onid; if (dest) { tmp = strtol(at->value().c_str(), &end_ptr, 10); @@ -874,7 +879,7 @@ PyObject *eDVBDB::readSatellites(ePyObject sat_list, ePyObject sat_dict, ePyObje } if (freq && sr && pol != -1) { - tuple = PyTuple_New(10); + tuple = PyTuple_New(12); PyTuple_SET_ITEM(tuple, 0, PyInt_FromLong(0)); PyTuple_SET_ITEM(tuple, 1, PyInt_FromLong(freq)); PyTuple_SET_ITEM(tuple, 2, PyInt_FromLong(sr)); @@ -885,6 +890,8 @@ PyObject *eDVBDB::readSatellites(ePyObject sat_list, ePyObject sat_dict, ePyObje PyTuple_SET_ITEM(tuple, 7, PyInt_FromLong(inv)); PyTuple_SET_ITEM(tuple, 8, PyInt_FromLong(rolloff)); PyTuple_SET_ITEM(tuple, 9, PyInt_FromLong(pilot)); + PyTuple_SET_ITEM(tuple, 10, PyInt_FromLong(tsid)); + PyTuple_SET_ITEM(tuple, 11, PyInt_FromLong(onid)); PyList_Append(tplist, tuple); Py_DECREF(tuple); } @@ -1497,7 +1504,7 @@ int eDVBDBQueryBase::compareLessEqual(const eServiceReferenceDVB &a, const eServ { ePtr a_service, b_service; int sortmode = m_query ? m_query->m_sort : eDVBChannelQuery::tName; - + if ((sortmode == eDVBChannelQuery::tName) || (sortmode == eDVBChannelQuery::tProvider)) { if (a.name.empty() && m_db->getService(a, a_service)) @@ -1505,7 +1512,7 @@ int eDVBDBQueryBase::compareLessEqual(const eServiceReferenceDVB &a, const eServ if (b.name.empty() && m_db->getService(b, b_service)) return 1; } - + switch (sortmode) { case eDVBChannelQuery::tName: @@ -1747,10 +1754,10 @@ static int decodeType(const std::string &type) RESULT parseExpression(ePtr &res, std::list::const_iterator begin, std::list::const_iterator end) { std::list::const_iterator end_of_exp; - + if (begin == end) return 0; - + if (*begin == "(") { end_of_exp = begin; @@ -1759,36 +1766,36 @@ RESULT parseExpression(ePtr &res, std::list::cons break; else ++end_of_exp; - + if (end_of_exp == end) { eDebug("expression parse: end of expression while searching for closing brace"); return -1; } - + ++begin; // begin..end_of_exp int r = parseExpression(res, begin, end_of_exp); if (r) return r; ++end_of_exp; - + /* we had only one sub expression */ if (end_of_exp == end) { // eDebug("only one sub expression"); return 0; } - + /* otherwise we have an operator here.. */ - + ePtr r2 = res; res = new eDVBChannelQuery(); res->m_sort = 0; res->m_p1 = r2; res->m_inverse = 0; r2 = 0; - + if (*end_of_exp == "||") res->m_type = eDVBChannelQuery::tOR; else if (*end_of_exp == "&&") @@ -1799,18 +1806,18 @@ RESULT parseExpression(ePtr &res, std::list::cons res = 0; return 1; } - + ++end_of_exp; - + return parseExpression(res->m_p2, end_of_exp, end); } - + // "begin" "end" std::string type, op, val; - + res = new eDVBChannelQuery(); res->m_sort = 0; - + int cnt = 0; while (begin != end) { @@ -1832,23 +1839,23 @@ RESULT parseExpression(ePtr &res, std::list::cons ++begin; ++cnt; } - + if (cnt != 3) { eDebug("malformed query: missing stuff"); res = 0; return 1; } - + res->m_type = decodeType(type); - + if (res->m_type == -1) { eDebug("malformed query: invalid type %s", type.c_str()); res = 0; return 1; } - + if (op == "==") res->m_inverse = 0; else if (op == "!=") @@ -1859,7 +1866,7 @@ RESULT parseExpression(ePtr &res, std::list::cons res = 0; return 1; } - + res->m_string = val; if (res->m_type == eDVBChannelQuery::tChannelID) @@ -1879,7 +1886,7 @@ RESULT parseExpression(ePtr &res, std::list::cons RESULT eDVBChannelQuery::compile(ePtr &res, std::string query) { std::list tokens; - + std::string current_token; std::string bouquet_name; @@ -1891,34 +1898,34 @@ RESULT eDVBChannelQuery::compile(ePtr &res, std::string query) { int c = (i < query.size()) ? query[i] : ' '; ++i; - + int issplit = !!strchr(splitchars, c); int isaln = isalnum(c); int iswhite = c == ' '; int isquot = c == '\"'; - + if (quotemode) { iswhite = issplit = 0; isaln = lastalnum; } - + if (issplit || iswhite || isquot || lastsplit || (lastalnum != isaln)) { if (current_token.size()) tokens.push_back(current_token); current_token.clear(); } - + if (!(iswhite || isquot)) current_token += c; - + if (isquot) quotemode = !quotemode; lastsplit = issplit; lastalnum = isaln; } - + // for (std::list::const_iterator a(tokens.begin()); a != tokens.end(); ++a) // { // printf("%s\n", a->c_str()); @@ -1970,12 +1977,12 @@ RESULT eDVBChannelQuery::compile(ePtr &res, std::string query) res = 0; return -1; } - + // eDebug("sort by %d", sort); - + /* now we recursivly parse that. */ int r = parseExpression(res, tokens.begin(), tokens.end()); - + /* we have an empty (but valid!) expression */ if (!r && !res) { @@ -1983,7 +1990,7 @@ RESULT eDVBChannelQuery::compile(ePtr &res, std::string query) res->m_inverse = 0; res->m_type = eDVBChannelQuery::tAny; } - + if (res) { res->m_sort = sort; diff --git a/lib/python/Components/Makefile.am b/lib/python/Components/Makefile.am index 9c04701b..67cec18d 100644 --- a/lib/python/Components/Makefile.am +++ b/lib/python/Components/Makefile.am @@ -18,4 +18,4 @@ install_PYTHON = \ MultiContent.py MediaPlayer.py TunerInfo.py VideoWindow.py ChoiceList.py \ Element.py Playlist.py ParentalControl.py ParentalControlList.py \ Ipkg.py SelectionList.py Scanner.py SystemInfo.py DreamInfoHandler.py \ - Task.py language_cache.py Console.py ResourceManager.py + Task.py language_cache.py Console.py ResourceManager.py TuneTest.py diff --git a/lib/python/Components/Sources/Progress.py b/lib/python/Components/Sources/Progress.py index b96065b3..d57a6179 100644 --- a/lib/python/Components/Sources/Progress.py +++ b/lib/python/Components/Sources/Progress.py @@ -12,5 +12,12 @@ class Progress(Source): def setValue(self, value): self.__value = value self.changed((self.CHANGED_ALL,)) + + def setRange(self, range = 100): + self.range = range + self.changed((self.CHANGED_ALL,)) + + def getRange(self): + return self.range value = property(getValue, setValue) diff --git a/lib/python/Components/TuneTest.py b/lib/python/Components/TuneTest.py new file mode 100644 index 00000000..7b087b98 --- /dev/null +++ b/lib/python/Components/TuneTest.py @@ -0,0 +1,189 @@ +from enigma import eDVBFrontendParametersSatellite, eDVBFrontendParameters, eDVBResourceManager, eTimer + +class Tuner: + def __init__(self, frontend): + self.frontend = frontend + + # transponder = (frequency, symbolrate, polarisation, fec, inversion, orbpos, system, modulation) + # 0 1 2 3 4 5 6 7 + def tune(self, transponder): + if self.frontend: + print "tuning to transponder with data", transponder + parm = eDVBFrontendParametersSatellite() + parm.frequency = transponder[0] * 1000 + parm.symbol_rate = transponder[1] * 1000 + parm.polarisation = transponder[2] + parm.fec = transponder[3] + parm.inversion = transponder[4] + parm.orbital_position = transponder[5] + parm.system = 0 # FIXMEE !! HARDCODED DVB-S (add support for DVB-S2) + parm.modulation = 1 # FIXMEE !! HARDCODED QPSK + feparm = eDVBFrontendParameters() + feparm.setDVBS(parm) + self.lastparm = feparm + self.frontend.tune(feparm) + + def retune(self): + if self.frontend: + self.frontend.tune(self.lastparm) + +# tunes a list of transponders and checks, if they lock and optionally checks the onid/tsid combination +# 1) add transponders with addTransponder() +# 2) call run() +# 3) finishedChecking() is called, when the run is finished +class TuneTest: + def __init__(self, feid, stopOnSuccess = False, stopOnError = False): + self.stopOnSuccess = stopOnSuccess + self.stopOnError = stopOnError + self.feid = feid + self.transponderlist = [] + self.currTuned = None + print "TuneTest for feid %d" % self.feid + if not self.openFrontend(): + self.oldref = self.session.nav.getCurrentlyPlayingServiceReference() + self.session.nav.stopService() # try to disable foreground service + if not self.openFrontend(): + if self.session.pipshown: # try to disable pip + self.session.pipshown = False + del self.session.pip + if not self.openFrontend(): + self.frontend = None # in normal case this should not happen + self.tuner = Tuner(self.frontend) + self.timer = eTimer() + self.timer.callback.append(self.updateStatus) + + def updateStatus(self): + dict = {} + self.frontend.getFrontendStatus(dict) + print "status:", dict + + stop = False + + if dict["tuner_state"] == "TUNING": + self.timer.start(100, True) + self.progressCallback((len(self.transponderlist), self.tuningtransponder, self.STATUS_TUNING, self.currTuned)) + elif self.checkPIDs and self.pidStatus == self.INTERNAL_PID_STATUS_NOOP: + if dict["tuner_state"] == "LOCKED": + print "acquiring TSID/ONID" + # TODO start getting TSID/ONID + self.pidStatus = self.INTERNAL_PID_STATUS_WAITING + else: + self.pidStatus = self.INTERNAL_PID_STATUS_FAILED + elif self.checkPIDs and self.pidStatus == self.INTERNAL_PID_STATUS_WAITING: + print "waiting for pids" + else: + if dict["tuner_state"] == "LOSTLOCK" or dict["tuner_state"] == "FAILED": + self.tuningtransponder = self.nextTransponder() + self.failedTune.append([self.currTuned, self.oldTuned, "tune_failed"]) + if self.stopOnError == True: + stop = True + elif dict["tuner_state"] == "LOCKED": + pidsFailed = False + if self.checkPIDs: + tsid = 0 # TODO read values + onid = 0 # TODO read values + if tsid != self.currTuned[8] or onid != self.currTuned[9]: + self.failedTune.append([self.currTuned, self.oldTuned, "pids_failed"]) + pidsFailes = True + elif not self.checkPIDs or (self.checkPids and not pidsFailed): + self.successfullyTune.append([self.currTuned, self.oldTuned]) + if self.stopOnSuccess == True: + stop = True + self.tuningtransponder = self.nextTransponder() + else: + print "************* tuner_state:", dict["tuner_state"] + + self.progressCallback((len(self.transponderlist), self.tuningtransponder, self.STATUS_NOOP, self.currTuned)) + + if not stop: + self.tune() + if self.tuningtransponder < len(self.transponderlist) and not stop: + self.timer.start(100, True) + print "restart timer" + else: + self.progressCallback((len(self.transponderlist), self.tuningtransponder, self.STATUS_DONE, self.currTuned)) + print "finishedChecking" + self.finishedChecking() + + def firstTransponder(self): + print "firstTransponder:" + index = 0 + if self.checkPIDs: + print "checkPIDs-loop" + # check for tsid != -1 and onid != -1 + print "index:", index + print "len(self.transponderlist):", len(self.transponderlist) + while (index < len(self.transponderlist) and (self.transponderlist[index][8] == -1 or self.transponderlist[index][9] == -1)): + index += 1 + print "FirstTransponder final index:", index + return index + + def nextTransponder(self): + index = self.tuningtransponder + 1 + if self.checkPIDs: + # check for tsid != -1 and onid != -1 + while (index < len(self.transponderlist) and self.transponderlist[index][8] != -1 and self.transponderlist[index][9] != -1): + index += 1 + + return index + + def finishedChecking(self): + print "finished testing" + print "successfull:", self.successfullyTune + print "failed:", self.failedTune + + 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 tune(self): + print "tuning to", self.tuningtransponder + if self.tuningtransponder < len(self.transponderlist): + self.pidStatus = self.INTERNAL_PID_STATUS_NOOP + self.oldTuned = self.currTuned + self.currTuned = self.transponderlist[self.tuningtransponder] + self.tuner.tune(self.transponderlist[self.tuningtransponder]) + + INTERNAL_PID_STATUS_NOOP = 0 + INTERNAL_PID_STATUS_WAITING = 1 + INTERNAL_PID_STATUS_SUCCESSFUL = 2 + INTERNAL_PID_STATUS_FAILED = 3 + + def run(self, checkPIDs = False): + self.checkPIDs = checkPIDs + self.pidStatus = self.INTERNAL_PID_STATUS_NOOP + self.failedTune = [] + self.successfullyTune = [] + self.tuningtransponder = self.firstTransponder() + self.tune() + self.progressCallback((len(self.transponderlist), self.tuningtransponder, self.STATUS_START, self.currTuned)) + self.timer.start(100, True) + + # transponder = (frequency, symbolrate, polarisation, fec, inversion, orbpos, , , , ) + # 0 1 2 3 4 5 6 7 8 9 + def addTransponder(self, transponder): + self.transponderlist.append(transponder) + + def clearTransponder(self): + self.transponderlist = [] + + STATUS_START = 0 + STATUS_TUNING = 1 + STATUS_DONE = 2 + STATUS_NOOP = 3 + # can be overwritten + # progress = (range, value, status, transponder) + def progressCallback(self, progress): + pass \ No newline at end of file diff --git a/lib/python/Plugins/SystemPlugins/DiseqcTester/Makefile.am b/lib/python/Plugins/SystemPlugins/DiseqcTester/Makefile.am new file mode 100644 index 00000000..cd72696a --- /dev/null +++ b/lib/python/Plugins/SystemPlugins/DiseqcTester/Makefile.am @@ -0,0 +1,5 @@ +installdir = $(LIBDIR)/enigma2/python/Plugins/SystemPlugins/DiseqcTester + +install_PYTHON = \ + __init__.py \ + plugin.py \ No newline at end of file diff --git a/lib/python/Plugins/SystemPlugins/DiseqcTester/__init__.py b/lib/python/Plugins/SystemPlugins/DiseqcTester/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py b/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py new file mode 100644 index 00000000..57340368 --- /dev/null +++ b/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py @@ -0,0 +1,239 @@ +from Screens.Satconfig import NimSelection +from Screens.Screen import Screen + +from Plugins.Plugin import PluginDescriptor + +from Components.ActionMap import NumberActionMap +from Components.NimManager import nimmanager +from Components.ResourceManager import resourcemanager +from Components.Sources.FrontendStatus import FrontendStatus +from Components.TuneTest import TuneTest +from Components.Sources.Progress import Progress +from Components.Sources.StaticText import StaticText + +class DiseqcTester(Screen, TuneTest): + skin = """ + + + + SNRdB + + + + SNR + + + SNR + + + + AGC + + + AGC + + + + BER + + + BER + + + + LOCK + + + + LOCK + Invert + + + + + + + + + + + + """ + + TEST_TYPE_QUICK = 0 + TEST_TYPE_RANDOM = 1 + TEST_TYPE_COMPLETE = 2 + def __init__(self, session, feid, test_type = TEST_TYPE_QUICK): + Screen.__init__(self, session) + self.feid = feid + self.test_type = test_type + + self["actions"] = NumberActionMap(["SetupActions"], + { + "ok": self.keyGo, + "cancel": self.keyCancel, + }, -2) + + TuneTest.__init__(self, feid, stopOnSuccess = True) + self["Frontend"] = FrontendStatus(frontend_source = lambda : self.frontend, update_interval = 100) + self["overall_progress"] = Progress() + self["sub_progress"] = Progress() + self["failed_counter"] = StaticText("10") + self["succeeded_counter"] = StaticText("10") + + self.indexlist = {} + self.readTransponderList() + + def readTransponderList(self): + for sat in nimmanager.getSatListForNim(self.feid): + for transponder in nimmanager.getTransponders(sat[0]): + #print transponder + mytransponder = (transponder[1] / 1000, transponder[2] / 1000, transponder[3], transponder[4], transponder[5], sat[0], None, None, transponder[10], transponder[11]) + self.analyseTransponder(mytransponder) + + def getIndexForTransponder(self, transponder): + if transponder[0] < 11700: + band = 1 # low + else: + band = 0 # high + + polarisation = transponder[2] + + sat = transponder[5] + + index = (band, polarisation, sat) + return index + + # sort the transponder into self.transponderlist + def analyseTransponder(self, transponder): + index = self.getIndexForTransponder(transponder) + if index not in self.indexlist: + self.indexlist[index] = [] + self.indexlist[index].append(transponder) + #print "self.indexlist:", self.indexlist + + # returns a string for the user representing a human readable output for index + def getTextualIndexRepresentation(self, index): + print "getTextualIndexRepresentation:", index + text = "" + + # TODO better sat representation + text += "%s, " % index[2] + + if index[0] == 1: + text += "Low Band, " + else: + text += "High Band, " + + if index[1] == 0: + text += "H" + else: + text += "V" + return text + + def fillTransponderList(self): + self.clearTransponder() + print "----------- fillTransponderList" + print "index:", self.currentlyTestedIndex + keys = self.indexlist.keys() + if self.getContinueScanning(): + print "index:", self.getTextualIndexRepresentation(self.currentlyTestedIndex) + for transponder in self.indexlist[self.currentlyTestedIndex]: + self.addTransponder(transponder) + print "transponderList:", self.transponderlist + return True + else: + return False + + def progressCallback(self, progress): + if progress[0] != self["sub_progress"].getRange(): + self["sub_progress"].setRange(progress[0]) + self["sub_progress"].setValue(progress[1]) + + # logic for scanning order of transponders + # on go getFirstIndex is called + def getFirstIndex(self): + # TODO use other function to scan more randomly + if self.test_type == self.TEST_TYPE_QUICK: + self.myindex = 0 + keys = self.indexlist.keys() + self["overall_progress"].setRange(len(keys)) + self["overall_progress"].setValue(self.myindex) + return keys[0] + + # after each index is finished, getNextIndex is called to get the next index to scan + def getNextIndex(self): + # TODO use other function to scan more randomly + if self.test_type == self.TEST_TYPE_QUICK: + self.myindex += 1 + keys = self.indexlist.keys() + + self["overall_progress"].setValue(self.myindex) + if self.myindex < len(keys): + return keys[self.myindex] + else: + return None + + # after each index is finished and the next index is returned by getNextIndex + # the algorithm checks, if we should continue scanning + def getContinueScanning(self): + if self.test_type == self.TEST_TYPE_QUICK: + return (self.myindex < len(self.indexlist.keys())) + + def finishedChecking(self): + print "finishedChecking" + TuneTest.finishedChecking(self) + self.currentlyTestedIndex = self.getNextIndex() + if self.fillTransponderList(): + self.run(checkPIDs = True) + + def keyGo(self): + self.currentlyTestedIndex = self.getFirstIndex() + if self.fillTransponderList(): + self.run(True) + + def keyCancel(self): + self.close() + +class DiseqcTesterNimSelection(NimSelection): + skin = """ + + + + {"template": [ + MultiContentEntryText(pos = (10, 5), size = (360, 30), flags = RT_HALIGN_LEFT, text = 1), # index 1 is the nim name, + MultiContentEntryText(pos = (50, 30), size = (320, 30), font = 1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is a description of the nim settings, + ], + "fonts": [gFont("Regular", 20), gFont("Regular", 15)], + "itemHeight": 70 + } + + + """ + + def __init__(self, session, args = None): + NimSelection.__init__(self, session) + + def setResultClass(self): + self.resultclass = DiseqcTester + + def showNim(self, nim): + nimConfig = nimmanager.getNimConfig(nim.slot) + if nim.isCompatible("DVB-S"): + if nimConfig.configMode.value in ["loopthrough", "equal", "satposdepends", "nothing"]: + return False + if nimConfig.configMode.value == "simple": + if nimConfig.diseqcMode.value == "positioner": + return False + return True + return False + +def DiseqcTesterMain(session, **kwargs): + session.open(DiseqcTesterNimSelection) + +def autostart(reason, **kwargs): + resourcemanager.addResource("DiseqcTester", DiseqcTesterMain) + +def Plugins(**kwargs): + return [ PluginDescriptor(name="DiSEqC Tester", description=_("Test DiSEqC settings"), where = PluginDescriptor.WHERE_PLUGINMENU, fnc=DiseqcTesterMain), + PluginDescriptor(where = PluginDescriptor.WHERE_AUTOSTART, fnc = autostart)] \ No newline at end of file diff --git a/lib/python/Plugins/SystemPlugins/Makefile.am b/lib/python/Plugins/SystemPlugins/Makefile.am index 36b4bde5..4491eafc 100644 --- a/lib/python/Plugins/SystemPlugins/Makefile.am +++ b/lib/python/Plugins/SystemPlugins/Makefile.am @@ -1 +1 @@ -SUBDIRS = SoftwareUpdate FrontprocessorUpgrade PositionerSetup ConfigurationBackup Satfinder SkinSelector SatelliteEquipmentControl Videomode VideoTune Hotplug DefaultServicesScanner NFIFlash +SUBDIRS = SoftwareUpdate FrontprocessorUpgrade PositionerSetup ConfigurationBackup Satfinder SkinSelector SatelliteEquipmentControl Videomode VideoTune Hotplug DefaultServicesScanner NFIFlash DiseqcTester diff --git a/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py b/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py index d61c1503..72982483 100644 --- a/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py +++ b/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py @@ -12,33 +12,8 @@ from Components.ActionMap import ActionMap from Components.NimManager import nimmanager, getConfigSatlist from Components.MenuList import MenuList from Components.config import ConfigSelection, getConfigListEntry +from Components.TuneTest import Tuner -class Tuner: - def __init__(self, frontend): - self.frontend = frontend - - def tune(self, transponder): - if self.frontend: - print "tuning to transponder with data", transponder - parm = eDVBFrontendParametersSatellite() - parm.frequency = transponder[0] * 1000 - parm.symbol_rate = transponder[1] * 1000 - parm.polarisation = transponder[2] - parm.fec = transponder[3] - parm.inversion = transponder[4] - parm.orbital_position = transponder[5] - parm.system = transponder[6] - parm.modulation = transponder[7] - parm.rolloff = transponder[8] - parm.pilot = transponder[9] - feparm = eDVBFrontendParameters() - feparm.setDVBS(parm, True) - self.lastparm = feparm - self.frontend.tune(feparm) - - def retune(self): - if self.frontend: - self.frontend.tune(self.lastparm) class Satfinder(ScanSetup): def openFrontend(self): diff --git a/lib/python/Screens/Satconfig.py b/lib/python/Screens/Satconfig.py index 5628926f..320bea84 100644 --- a/lib/python/Screens/Satconfig.py +++ b/lib/python/Screens/Satconfig.py @@ -384,18 +384,26 @@ class NimSelection(Screen): self.list = [None] * nimmanager.getSlotCount() self["nimlist"] = List(self.list) self.updateList() + + self.setResultClass() self["actions"] = ActionMap(["OkCancelActions"], { "ok": self.okbuttonClick , "cancel": self.close }, -2) + + def setResultClass(self): + self.resultclass = NimSetup def okbuttonClick(self): nim = self["nimlist"].getCurrent() nim = nim and nim[3] if nim is not None and not nim.empty: - self.session.openWithCallback(self.updateList, NimSetup, nim.slot) + self.session.openWithCallback(self.updateList, self.resultclass, nim.slot) + + def showNim(self, nim): + return True def updateList(self): self.list = [ ] @@ -403,42 +411,44 @@ class NimSelection(Screen): slotid = x.slot nimConfig = nimmanager.getNimConfig(x.slot) text = nimConfig.configMode.value - if x.isCompatible("DVB-S"): - if nimConfig.configMode.value in ["loopthrough", "equal", "satposdepends"]: - text = { "loopthrough": _("loopthrough to"), - "equal": _("equal to"), - "satposdepends": _("second cable of motorized LNB") } [nimConfig.configMode.value] - text += " " + _("Tuner") + " " + ["A", "B", "C", "D"][int(nimConfig.connectedTo.value)] - elif nimConfig.configMode.value == "nothing": - text = _("nothing connected") - elif nimConfig.configMode.value == "simple": - if nimConfig.diseqcMode.value in ["single", "toneburst_a_b", "diseqc_a_b", "diseqc_a_b_c_d"]: - text = _("Sats") + ": " - if nimConfig.diseqcA.orbital_position != 3601: - text += nimmanager.getSatName(int(nimConfig.diseqcA.value)) - if nimConfig.diseqcMode.value in ["toneburst_a_b", "diseqc_a_b", "diseqc_a_b_c_d"]: - if nimConfig.diseqcB.orbital_position != 3601: - text += "," + nimmanager.getSatName(int(nimConfig.diseqcB.value)) - if nimConfig.diseqcMode.value == "diseqc_a_b_c_d": - if nimConfig.diseqcC.orbital_position != 3601: - text += "," + nimmanager.getSatName(int(nimConfig.diseqcC.value)) - if nimConfig.diseqcD.orbital_position != 3601: - text += "," + nimmanager.getSatName(int(nimConfig.diseqcD.value)) - elif nimConfig.diseqcMode.value == "positioner": - text = _("Positioner") + ":" - if nimConfig.positionerMode.value == "usals": - text += _("USALS") - elif nimConfig.positionerMode.value == "manual": - text += _("manual") - else: - text = _("simple") - elif nimConfig.configMode.value == "advanced": - text = _("advanced") - elif x.isCompatible("DVB-T") or x.isCompatible("DVB-C"): - if nimConfig.configMode.value == "nothing": - text = _("nothing connected") - elif nimConfig.configMode.value == "enabled": - text = _("enabled") - - self.list.append((slotid, x.friendly_full_description, text, x)) + if self.showNim(x): + if x.isCompatible("DVB-S"): + if nimConfig.configMode.value in ["loopthrough", "equal", "satposdepends"]: + text = { "loopthrough": _("loopthrough to"), + "equal": _("equal to"), + "satposdepends": _("second cable of motorized LNB") } [nimConfig.configMode.value] + text += " " + _("Tuner") + " " + ["A", "B", "C", "D"][int(nimConfig.connectedTo.value)] + elif nimConfig.configMode.value == "nothing": + text = _("nothing connected") + elif nimConfig.configMode.value == "simple": + if nimConfig.diseqcMode.value in ["single", "toneburst_a_b", "diseqc_a_b", "diseqc_a_b_c_d"]: + text = _("Sats") + ": " + if nimConfig.diseqcA.orbital_position != 3601: + text += nimmanager.getSatName(int(nimConfig.diseqcA.value)) + if nimConfig.diseqcMode.value in ["toneburst_a_b", "diseqc_a_b", "diseqc_a_b_c_d"]: + if nimConfig.diseqcB.orbital_position != 3601: + text += "," + nimmanager.getSatName(int(nimConfig.diseqcB.value)) + if nimConfig.diseqcMode.value == "diseqc_a_b_c_d": + if nimConfig.diseqcC.orbital_position != 3601: + text += "," + nimmanager.getSatName(int(nimConfig.diseqcC.value)) + if nimConfig.diseqcD.orbital_position != 3601: + text += "," + nimmanager.getSatName(int(nimConfig.diseqcD.value)) + elif nimConfig.diseqcMode.value == "positioner": + text = _("Positioner") + ":" + if nimConfig.positionerMode.value == "usals": + text += _("USALS") + elif nimConfig.positionerMode.value == "manual": + text += _("manual") + else: + text = _("simple") + elif nimConfig.configMode.value == "advanced": + text = _("advanced") + elif x.isCompatible("DVB-T") or x.isCompatible("DVB-C"): + if nimConfig.configMode.value == "nothing": + text = _("nothing connected") + elif nimConfig.configMode.value == "enabled": + text = _("enabled") + + self.list.append((slotid, x.friendly_full_description, text, x)) + self["nimlist"].setList(self.list) self["nimlist"].updateList(self.list) \ No newline at end of file -- cgit v1.2.3 From 1d07f28ae2ebe4fd075f24f601cd37770435eb52 Mon Sep 17 00:00:00 2001 From: Stefan Pluecken Date: Mon, 24 Nov 2008 23:52:26 +0100 Subject: add onid/tsid polling --- lib/dvb/dvb.cpp | 110 +++++++++++++++++++------------------- lib/python/Components/TuneTest.py | 28 +++++++--- 2 files changed, 75 insertions(+), 63 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp index eac4554d..24609438 100644 --- a/lib/dvb/dvb.cpp +++ b/lib/dvb/dvb.cpp @@ -70,19 +70,19 @@ eDVBResourceManager::eDVBResourceManager() if (!instance) instance = this; - + /* search available adapters... */ // add linux devices - + int num_adapter = 0; while (eDVBAdapterLinux::exist(num_adapter)) { addAdapter(new eDVBAdapterLinux(num_adapter)); num_adapter++; } - - eDebug("found %d adapter, %d frontends(%d sim) and %d demux", + + eDebug("found %d adapter, %d frontends(%d sim) and %d demux", m_adapter.size(), m_frontend.size(), m_simulate_frontend.size(), m_demux.size()); eDVBCAService::registerChannelCallback(this); @@ -104,7 +104,7 @@ eDVBAdapterLinux::eDVBAdapterLinux(int nr): m_nr(nr) { // scan frontends int num_fe = 0; - + eDebug("scanning for frontends.."); while (1) { @@ -133,7 +133,7 @@ eDVBAdapterLinux::eDVBAdapterLinux(int nr): m_nr(nr) } ++num_fe; } - + // scan demux int num_demux = 0; while (1) @@ -148,10 +148,10 @@ eDVBAdapterLinux::eDVBAdapterLinux(int nr): m_nr(nr) if (stat(filename, &s)) break; ePtr demux; - + demux = new eDVBDemux(m_nr, num_demux); m_demux.push_back(demux); - + ++num_demux; } } @@ -169,12 +169,12 @@ RESULT eDVBAdapterLinux::getDemux(ePtr &demux, int nr) --nr; ++i; } - + if (i != m_demux.end()) demux = *i; else return -1; - + return 0; } @@ -191,12 +191,12 @@ RESULT eDVBAdapterLinux::getFrontend(ePtr &fe, int nr, bool simula --nr; ++i; } - + if (i != m_frontend.end()) fe = *i; else return -1; - + return 0; } @@ -224,9 +224,9 @@ void eDVBResourceManager::addAdapter(iDVBAdapter *adapter) { int num_fe = adapter->getNumFrontends(); int num_demux = adapter->getNumDemux(); - + m_adapter.push_back(adapter); - + int i; for (i=0; i unused; - + if (m_demux.size() < 5) { /* FIXME: hardware demux policy */ @@ -444,14 +444,14 @@ RESULT eDVBResourceManager::allocateDemux(eDVBRegisteredFrontend *fe, ePtrm_demux->getRefCount() != 2) : i->m_inuse; - + if ((!in_use) && ((!fe) || (i->m_adapter == fe->m_adapter))) { if ((cap & iDVBChannel::capDecode) && !is_decode) continue; - unused = i; + unused = i; break; } } @@ -467,7 +467,7 @@ RESULT eDVBResourceManager::allocateDemux(eDVBRegisteredFrontend *fe, ePtrm_adapter == fe->m_adapter && + else if (i->m_adapter == fe->m_adapter && i->m_demux->getSource() == fe->m_frontend->getDVBID()) { demux = new eDVBAllocatedDemux(i); @@ -573,7 +573,7 @@ RESULT eDVBResourceManager::allocateChannel(const eDVBChannelID &channelid, eUse } /* allocate a frontend. */ - + ePtr fe; int err = allocateFrontend(fe, feparm, simulate); @@ -999,7 +999,7 @@ int eDVBChannelFilePush::filterRecordData(const unsigned char *_data, int len, s if (m_iframe_state == 1) { - /* we are allowing data, and stop allowing data on the next frame. + /* we are allowing data, and stop allowing data on the next frame. we now found a frame. so stop here. */ memset(data + offset, 0, 188 - (offset%188)); /* zero out rest of TS packet */ current_span_remaining = 0; @@ -1064,9 +1064,9 @@ eDVBChannel::eDVBChannel(eDVBResourceManager *mgr, eDVBAllocatedFrontend *fronte m_frontend = frontend; m_pvr_thread = 0; - + m_skipmode_n = m_skipmode_m = 0; - + if (m_frontend) m_frontend->get().connectStateChange(slot(*this, &eDVBChannel::frontendStateChanged), m_conn_frontendStateChanged); } @@ -1082,14 +1082,14 @@ eDVBChannel::~eDVBChannel() void eDVBChannel::frontendStateChanged(iDVBFrontend*fe) { int state, ourstate = 0; - + /* if we are already in shutdown, don't change state. */ if (m_state == state_release) return; - + if (fe->getState(state)) return; - + if (state == iDVBFrontend::stateLock) { eDebug("OURSTATE: ok"); @@ -1118,7 +1118,7 @@ void eDVBChannel::frontendStateChanged(iDVBFrontend*fe) ourstate = state_failed; } else eFatal("state unknown"); - + if (ourstate != m_state) { m_state = ourstate; @@ -1235,7 +1235,7 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off const int blocksize = 188; unsigned int max = align(10*1024*1024, blocksize); current_offset = align(current_offset, blocksize); - + if (!m_cue) { eDebug("no cue sheet. forcing normal play"); @@ -1306,7 +1306,7 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off continue; } } - + if (relative == 1) /* pts relative */ { pts += now; @@ -1317,7 +1317,7 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off if (relative != 2) if (pts < 0) pts = 0; - + if (relative == 2) /* AP relative */ { eDebug("AP relative seeking: %lld, at %lld", pts, now); @@ -1332,7 +1332,7 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off pts = nextap; } } - + off_t offset = 0; if (m_tstools.getOffset(offset, pts)) { @@ -1350,7 +1350,7 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off { long long aligned_start = align(i->first, blocksize); long long aligned_end = align(i->second, blocksize); - + if ((current_offset >= aligned_start) && (current_offset < aligned_end)) { start = current_offset; @@ -1449,7 +1449,7 @@ RESULT eDVBChannel::setChannel(const eDVBChannelID &channelid, ePtrremoveChannel(this); - + if (!channelid) return 0; @@ -1458,7 +1458,7 @@ RESULT eDVBChannel::setChannel(const eDVBChannelID &channelid, ePtraddChannel(channelid, this); m_state = state_tuning; @@ -1466,14 +1466,14 @@ RESULT eDVBChannel::setChannel(const eDVBChannelID &channelid, ePtrget().tune(*feparm); m_current_frontend_parameters = feparm; - + if (res) { m_state = state_release; m_stateChanged(this); return res; } - + return 0; } @@ -1558,21 +1558,21 @@ RESULT eDVBChannel::requestTsidOnid(ePyObject callback) RESULT eDVBChannel::getDemux(ePtr &demux, int cap) { ePtr &our_demux = (cap & capDecode) ? m_decoder_demux : m_demux; - + if (!our_demux) { demux = 0; - + if (m_mgr->allocateDemux(m_frontend ? (eDVBRegisteredFrontend*)*m_frontend : (eDVBRegisteredFrontend*)0, our_demux, cap)) return -1; } - + demux = *our_demux; /* don't hold a reference to the decoding demux, we don't need it. */ - + /* FIXME: by dropping the 'allocated demux' in favour of the 'iDVBDemux', - the refcount is lost. thus, decoding demuxes are never allocated. - + the refcount is lost. thus, decoding demuxes are never allocated. + this poses a big problem for PiP. */ if (cap & capDecode) our_demux = 0; @@ -1605,12 +1605,12 @@ RESULT eDVBChannel::playFile(const char *file) delete m_pvr_thread; m_pvr_thread = 0; } - + m_tstools.openFile(file); - + /* DON'T EVEN THINK ABOUT FIXING THIS. FIX THE ATI SOURCES FIRST, THEN DO A REAL FIX HERE! */ - + /* (this codepath needs to be improved anyway.) */ #if HAVE_DVB_API_VERSION < 3 m_pvr_fd_dst = open("/dev/pvr", O_WRONLY); @@ -1671,11 +1671,11 @@ RESULT eDVBChannel::getCurrentPosition(iDVBDemux *decoding_demux, pts_t &pos, in { if (!decoding_demux) return -1; - + pts_t now; - + int r; - + if (mode == 0) /* demux */ { r = decoding_demux->getSTC(now, 0); @@ -1686,7 +1686,7 @@ RESULT eDVBChannel::getCurrentPosition(iDVBDemux *decoding_demux, pts_t &pos, in } } else now = pos; /* fixup supplied */ - + off_t off = 0; /* TODO: fixme */ r = m_tstools.fixupPTS(off, now); if (r) @@ -1694,9 +1694,9 @@ RESULT eDVBChannel::getCurrentPosition(iDVBDemux *decoding_demux, pts_t &pos, in eDebug("fixup PTS failed"); return -1; } - + pos = now; - + return 0; } @@ -1707,7 +1707,7 @@ void eDVBChannel::flushPVR(iDVBDemux *decoding_demux) a.) the filepush's internal buffer b.) the PVR buffer (before demux) c.) the ratebuffer (after demux) - + it's important to clear them in the correct order, otherwise the ratebuffer (for example) would immediately refill from the not-yet-flushed PVR buffer. @@ -1718,7 +1718,7 @@ void eDVBChannel::flushPVR(iDVBDemux *decoding_demux) m_pvr_thread->flush(); /* HACK: flush PVR buffer */ ::ioctl(m_pvr_fd_dst, 0); - + /* flush ratebuffers (video, audio) */ if (decoding_demux) decoding_demux->flush(); @@ -1742,7 +1742,7 @@ void eCueSheet::seekTo(int relative, const pts_t &pts) m_lock.Unlock(); m_event(evtSeek); } - + void eCueSheet::clear() { m_lock.WrLock(); diff --git a/lib/python/Components/TuneTest.py b/lib/python/Components/TuneTest.py index 7b087b98..2d448e8f 100644 --- a/lib/python/Components/TuneTest.py +++ b/lib/python/Components/TuneTest.py @@ -51,21 +51,32 @@ class TuneTest: self.tuner = Tuner(self.frontend) self.timer = eTimer() self.timer.callback.append(self.updateStatus) + + def gotTsidOnid(self, tsid, onid): + print "******** got tsid, onid:", tsid, onid + self.tsid = tsid + self.onid = onid + if tsid is not None and onid is not None: + self.pidStatus = self.INTERNAL_PID_STATUS_SUCCESSFUL + else: + self.pidStatus = self.INTERNAL_PID_STATUS_FAILED + self.timer.start(100, True) def updateStatus(self): dict = {} self.frontend.getFrontendStatus(dict) - print "status:", dict - stop = False + print "status:", dict if dict["tuner_state"] == "TUNING": + print "TUNING" self.timer.start(100, True) self.progressCallback((len(self.transponderlist), self.tuningtransponder, self.STATUS_TUNING, self.currTuned)) elif self.checkPIDs and self.pidStatus == self.INTERNAL_PID_STATUS_NOOP: + print "2nd choice" if dict["tuner_state"] == "LOCKED": print "acquiring TSID/ONID" - # TODO start getting TSID/ONID + self.raw_channel.requestTsidOnid(self.gotTsidOnid) self.pidStatus = self.INTERNAL_PID_STATUS_WAITING else: self.pidStatus = self.INTERNAL_PID_STATUS_FAILED @@ -80,9 +91,7 @@ class TuneTest: elif dict["tuner_state"] == "LOCKED": pidsFailed = False if self.checkPIDs: - tsid = 0 # TODO read values - onid = 0 # TODO read values - if tsid != self.currTuned[8] or onid != self.currTuned[9]: + if self.tsid != self.currTuned[8] or self.onid != self.currTuned[9]: self.failedTune.append([self.currTuned, self.oldTuned, "pids_failed"]) pidsFailes = True elif not self.checkPIDs or (self.checkPids and not pidsFailed): @@ -98,8 +107,11 @@ class TuneTest: if not stop: self.tune() if self.tuningtransponder < len(self.transponderlist) and not stop: - self.timer.start(100, True) - print "restart timer" + if self.pidStatus != self.INTERNAL_PID_STATUS_WAITING: + self.timer.start(100, True) + print "restart timer" + else: + print "not restarting timers (waiting for pids)" else: self.progressCallback((len(self.transponderlist), self.tuningtransponder, self.STATUS_DONE, self.currTuned)) print "finishedChecking" -- cgit v1.2.3 From f95be11f0517eac56013b0ccb14825be97fc1540 Mon Sep 17 00:00:00 2001 From: stefan Date: Tue, 16 Dec 2008 10:33:19 +0000 Subject: finish and polish diseqc tester plugin --- data/skin_default.xml | 5 + lib/dvb/db.cpp | 2 +- lib/python/Components/TuneTest.py | 54 +++- .../Plugins/SystemPlugins/DiseqcTester/plugin.py | 283 +++++++++++++++++++-- lib/python/Screens/Makefile.am | 3 +- lib/python/Screens/TextBox.py | 26 ++ 6 files changed, 340 insertions(+), 33 deletions(-) mode change 100755 => 100644 data/skin_default.xml mode change 100755 => 100644 lib/python/Screens/Makefile.am create mode 100644 lib/python/Screens/TextBox.py (limited to 'lib/python/Components') diff --git a/data/skin_default.xml b/data/skin_default.xml old mode 100755 new mode 100644 index 5946097d..d60933eb --- a/data/skin_default.xml +++ b/data/skin_default.xml @@ -940,6 +940,11 @@ self.instance.move(ePoint(orgpos.x() + (orgwidth - newwidth)/2, orgpos.y())) + + + + + diff --git a/lib/dvb/db.cpp b/lib/dvb/db.cpp index 6f30253a..e5a94392 100644 --- a/lib/dvb/db.cpp +++ b/lib/dvb/db.cpp @@ -856,7 +856,7 @@ PyObject *eDVBDB::readSatellites(ePyObject sat_list, ePyObject sat_dict, ePyObje for (AttributeConstIterator it(tp_attributes.begin()); it != end; ++it) { -// eDebug("\t\tattr: %s", at->name().c_str()); + //eDebug("\t\tattr: %s", at->name().c_str()); at = *it; name = at->name(); if (name == "modulation") dest = &modulation; diff --git a/lib/python/Components/TuneTest.py b/lib/python/Components/TuneTest.py index 2d448e8f..422036cd 100644 --- a/lib/python/Components/TuneTest.py +++ b/lib/python/Components/TuneTest.py @@ -32,7 +32,7 @@ class Tuner: # 2) call run() # 3) finishedChecking() is called, when the run is finished class TuneTest: - def __init__(self, feid, stopOnSuccess = False, stopOnError = False): + def __init__(self, feid, stopOnSuccess = -1, stopOnError = -1): self.stopOnSuccess = stopOnSuccess self.stopOnError = stopOnError self.feid = feid @@ -54,12 +54,14 @@ class TuneTest: def gotTsidOnid(self, tsid, onid): print "******** got tsid, onid:", tsid, onid - self.tsid = tsid - self.onid = onid if tsid is not None and onid is not None: self.pidStatus = self.INTERNAL_PID_STATUS_SUCCESSFUL + self.tsid = tsid + self.onid = onid else: self.pidStatus = self.INTERNAL_PID_STATUS_FAILED + self.tsid = -1 + self.onid = -1 self.timer.start(100, True) def updateStatus(self): @@ -71,7 +73,7 @@ class TuneTest: if dict["tuner_state"] == "TUNING": print "TUNING" self.timer.start(100, True) - self.progressCallback((len(self.transponderlist), self.tuningtransponder, self.STATUS_TUNING, self.currTuned)) + self.progressCallback((self.getProgressLength(), self.tuningtransponder, self.STATUS_TUNING, self.currTuned)) elif self.checkPIDs and self.pidStatus == self.INTERNAL_PID_STATUS_NOOP: print "2nd choice" if dict["tuner_state"] == "LOCKED": @@ -86,23 +88,28 @@ class TuneTest: if dict["tuner_state"] == "LOSTLOCK" or dict["tuner_state"] == "FAILED": self.tuningtransponder = self.nextTransponder() self.failedTune.append([self.currTuned, self.oldTuned, "tune_failed"]) - if self.stopOnError == True: + if self.stopOnError != -1 and self.stopOnError <= len(self.failedTune): stop = True elif dict["tuner_state"] == "LOCKED": pidsFailed = False if self.checkPIDs: - if self.tsid != self.currTuned[8] or self.onid != self.currTuned[9]: - self.failedTune.append([self.currTuned, self.oldTuned, "pids_failed"]) - pidsFailes = True + if self.currTuned is not None: + if self.tsid != self.currTuned[8] or self.onid != self.currTuned[9]: + self.failedTune.append([self.currTuned, self.oldTuned, "pids_failed", {"real": (self.tsid, self.onid), "expected": (self.currTuned[8], self.currTuned[9])}]) + pidsFailed = True + else: + self.successfullyTune.append([self.currTuned, self.oldTuned]) + if self.stopOnSuccess != -1 and self.stopOnSuccess <= len(self.successfullyTune): + stop = True elif not self.checkPIDs or (self.checkPids and not pidsFailed): self.successfullyTune.append([self.currTuned, self.oldTuned]) - if self.stopOnSuccess == True: - stop = True + if self.stopOnSuccess != -1 and self.stopOnSuccess <= len(self.successfullyTune): + stop = True self.tuningtransponder = self.nextTransponder() else: print "************* tuner_state:", dict["tuner_state"] - self.progressCallback((len(self.transponderlist), self.tuningtransponder, self.STATUS_NOOP, self.currTuned)) + self.progressCallback((self.getProgressLength(), self.tuningtransponder, self.STATUS_NOOP, self.currTuned)) if not stop: self.tune() @@ -113,7 +120,7 @@ class TuneTest: else: print "not restarting timers (waiting for pids)" else: - self.progressCallback((len(self.transponderlist), self.tuningtransponder, self.STATUS_DONE, self.currTuned)) + self.progressCallback((self.getProgressLength(), len(self.transponderlist), self.STATUS_DONE, self.currTuned)) print "finishedChecking" self.finishedChecking() @@ -131,12 +138,17 @@ class TuneTest: return index def nextTransponder(self): + print "getting next transponder", self.tuningtransponder index = self.tuningtransponder + 1 if self.checkPIDs: + print "checkPIDs-loop" # check for tsid != -1 and onid != -1 - while (index < len(self.transponderlist) and self.transponderlist[index][8] != -1 and self.transponderlist[index][9] != -1): + print "index:", index + print "len(self.transponderlist):", len(self.transponderlist) + while (index < len(self.transponderlist) and (self.transponderlist[index][8] == -1 or self.transponderlist[index][9] == -1)): index += 1 + print "next transponder index:", index return index def finishedChecking(self): @@ -180,7 +192,7 @@ class TuneTest: self.successfullyTune = [] self.tuningtransponder = self.firstTransponder() self.tune() - self.progressCallback((len(self.transponderlist), self.tuningtransponder, self.STATUS_START, self.currTuned)) + self.progressCallback((self.getProgressLength(), self.tuningtransponder, self.STATUS_START, self.currTuned)) self.timer.start(100, True) # transponder = (frequency, symbolrate, polarisation, fec, inversion, orbpos, , , , ) @@ -191,6 +203,20 @@ class TuneTest: def clearTransponder(self): self.transponderlist = [] + def getProgressLength(self): + count = 0 + if self.stopOnError == -1: + count = len(self.transponderlist) + else: + if count < self.stopOnError: + count = self.stopOnError + if self.stopOnSuccess == -1: + count = len(self.transponderlist) + else: + if count < self.stopOnSuccess: + count = self.stopOnSuccess + return count + STATUS_START = 0 STATUS_TUNING = 1 STATUS_DONE = 2 diff --git a/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py b/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py index 57340368..f997acd1 100644 --- a/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py +++ b/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py @@ -1,20 +1,81 @@ from Screens.Satconfig import NimSelection from Screens.Screen import Screen +from Screens.TextBox import TextBox from Plugins.Plugin import PluginDescriptor -from Components.ActionMap import NumberActionMap +from Components.ActionMap import ActionMap, NumberActionMap from Components.NimManager import nimmanager from Components.ResourceManager import resourcemanager from Components.Sources.FrontendStatus import FrontendStatus from Components.TuneTest import TuneTest +from Components.Sources.List import List from Components.Sources.Progress import Progress from Components.Sources.StaticText import StaticText +from Components.ConfigList import ConfigListScreen +from Components.config import getConfigListEntry, ConfigSelection -class DiseqcTester(Screen, TuneTest): +# always use: +# setResultType(type) +# setResultParameter(parameter) +# getTextualResult() +class ResultParser: + def __init__(self): + pass + + TYPE_BYORBPOS = 0 + TYPE_BYINDEX = 1 + TYPE_ALL = 2 + def setResultType(self, type): + self.type = type + + def setResultParameter(self, parameter): + if self.type == self.TYPE_BYORBPOS: + self.orbpos = parameter + elif self.type == self.TYPE_BYINDEX: + self.index = parameter + + def getTextualResultForIndex(self, index): + text = "" + text += "%s:\n" % self.getTextualIndexRepresentation(index) + + failed, successful = self.results[index]["failed"], self.results[index]["successful"] + countfailed = len(failed) + countsuccessful = len(successful) + countall = countfailed + countsuccessful + percentfailed = round(countfailed / float(countall + 0.0001) * 100) + percentsuccessful = round(countsuccessful / float(countall + 0.0001) * 100) + text += "Tested %d transponders\n%d (%d %%) transponders succeeded\n%d (%d %%) transponders failed\n" % (countall, countsuccessful, percentsuccessful, countfailed, percentfailed) + reasons = {} + if countfailed > 0: + for transponder in failed: + reasons[transponder[2]] = reasons.get(transponder[2], []) + reasons[transponder[2]].append(transponder) + if transponder[2] == "pids_failed": + print transponder[2], "-", transponder[3] + + text += "The %d unsuccessful tuning attempts failed for the following reasons:\n" % countfailed + + for reason in reasons.keys(): + text += "%s: %d transponders failed\n" % (reason, len(reasons[reason])) + return text + + def getTextualResult(self): + text = "" + if self.type == self.TYPE_BYINDEX: + text += self.getTextualResultForIndex(self.index) + elif self.type == self.TYPE_BYORBPOS: + for index in self.results.keys(): + if index[2] == self.orbpos: + text += self.getTextualResultForIndex(index) + text += "\n-----------------------------------------------------\n" + + return text + +class DiseqcTester(Screen, TuneTest, ResultParser): skin = """ - + + + + {"template": [ + MultiContentEntryText(pos = (10, 0), size = (330, 25), flags = RT_HALIGN_LEFT, text = 1), # index 1 is the index name, + MultiContentEntryText(pos = (330, 0), size = (150, 25), flags = RT_HALIGN_RIGHT, text = 2) # index 2 is the status, + ], + "fonts": [gFont("Regular", 20)], + "itemHeight": 25 + } + @@ -54,35 +126,93 @@ class DiseqcTester(Screen, TuneTest): - + - + + + + + + + + + """ TEST_TYPE_QUICK = 0 TEST_TYPE_RANDOM = 1 TEST_TYPE_COMPLETE = 2 - def __init__(self, session, feid, test_type = TEST_TYPE_QUICK): + def __init__(self, session, feid, test_type = TEST_TYPE_QUICK, loopsfailed = 3, loopssuccessful = 1): Screen.__init__(self, session) self.feid = feid self.test_type = test_type + self.loopsfailed = loopsfailed + self.loopssuccessful = loopssuccessful self["actions"] = NumberActionMap(["SetupActions"], { - "ok": self.keyGo, + "ok": self.select, "cancel": self.keyCancel, }, -2) - TuneTest.__init__(self, feid, stopOnSuccess = True) - self["Frontend"] = FrontendStatus(frontend_source = lambda : self.frontend, update_interval = 100) + TuneTest.__init__(self, feid, stopOnSuccess = self.loopssuccessful, stopOnError = self.loopsfailed) + #self["Frontend"] = FrontendStatus(frontend_source = lambda : self.frontend, update_interval = 100) self["overall_progress"] = Progress() self["sub_progress"] = Progress() - self["failed_counter"] = StaticText("10") - self["succeeded_counter"] = StaticText("10") + + self["failed_counter"] = StaticText("0") + self["succeeded_counter"] = StaticText("0") + self["witherrors_counter"] = StaticText("0") + self["untestable_counter"] = StaticText("0") + + self.list = [] + self["progress_list"] = List(self.list) + self["progress_list"].onSelectionChanged.append(self.selectionChanged) + + self["CmdText"] = StaticText(_("Please wait while scanning is in progress...")) self.indexlist = {} self.readTransponderList() + + self.running = False + + self.results = {} + self.resultsstatus = {} + + self.onLayoutFinish.append(self.go) + + def getProgressListComponent(self, index, status): + return (index, self.getTextualIndexRepresentation(index), status) + + def clearProgressList(self): + self.list = [] + self["progress_list"].list = self.list + + def addProgressListItem(self, index): + if index in self.indexlist: + for entry in self.list: + if entry[0] == index: + self.changeProgressListStatus(index, "working") + return + self.list.append(self.getProgressListComponent(index, _("working"))) + self["progress_list"].list = self.list + self["progress_list"].setIndex(len(self.list) - 1) + + def changeProgressListStatus(self, index, status): + self.newlist = [] + count = 0 + indexpos = 0 + for entry in self.list: + if entry[0] == index: + self.newlist.append(self.getProgressListComponent(index, status)) + indexpos = count + else: + self.newlist.append(entry) + count += 1 + self.list = self.newlist + self["progress_list"].list = self.list + self["progress_list"].setIndex(indexpos) def readTransponderList(self): for sat in nimmanager.getSatListForNim(self.feid): @@ -92,11 +222,12 @@ class DiseqcTester(Screen, TuneTest): self.analyseTransponder(mytransponder) def getIndexForTransponder(self, transponder): + if transponder[0] < 11700: band = 1 # low else: band = 0 # high - + polarisation = transponder[2] sat = transponder[5] @@ -117,8 +248,7 @@ class DiseqcTester(Screen, TuneTest): print "getTextualIndexRepresentation:", index text = "" - # TODO better sat representation - text += "%s, " % index[2] + text += nimmanager.getSatDescription(index[2]) + ", " if index[0] == 1: text += "Low Band, " @@ -157,6 +287,7 @@ class DiseqcTester(Screen, TuneTest): if self.test_type == self.TEST_TYPE_QUICK: self.myindex = 0 keys = self.indexlist.keys() + keys.sort(key = lambda a: a[2]) # sort by orbpos self["overall_progress"].setRange(len(keys)) self["overall_progress"].setValue(self.myindex) return keys[0] @@ -167,6 +298,7 @@ class DiseqcTester(Screen, TuneTest): if self.test_type == self.TEST_TYPE_QUICK: self.myindex += 1 keys = self.indexlist.keys() + keys.sort(key = lambda a: a[2]) # sort by orbpos self["overall_progress"].setValue(self.myindex) if self.myindex < len(keys): @@ -179,21 +311,137 @@ class DiseqcTester(Screen, TuneTest): def getContinueScanning(self): if self.test_type == self.TEST_TYPE_QUICK: return (self.myindex < len(self.indexlist.keys())) + + def addResult(self, index, status, failedTune, successfullyTune): + self.results[index] = self.results.get(index, {"failed": [], "successful": [], "status": None}) + self.resultsstatus[status] = self.resultsstatus.get(status, []) + + self.results[index]["status"] = status + self.results[index]["failed"] = failedTune + self.results[index]["successful"] = successfullyTune + + self.resultsstatus[status].append(index) def finishedChecking(self): print "finishedChecking" TuneTest.finishedChecking(self) + + if not self.results.has_key(self.currentlyTestedIndex): + self.results[self.currentlyTestedIndex] = {"failed": [], "successful": [], "status": None} + + if len(self.failedTune) > 0 and len(self.successfullyTune) > 0: + self.changeProgressListStatus(self.currentlyTestedIndex, "with errors") + self["witherrors_counter"].setText(str(int(self["witherrors_counter"].getText()) + 1)) + self.addResult(self.currentlyTestedIndex, "with_errors", self.failedTune, self.successfullyTune) + elif len(self.failedTune) == 0 and len(self.successfullyTune) == 0: + self.changeProgressListStatus(self.currentlyTestedIndex, "not tested") + self["untestable_counter"].setText(str(int(self["untestable_counter"].getText()) + 1)) + self.addResult(self.currentlyTestedIndex, "untestable", self.failedTune, self.successfullyTune) + elif len(self.failedTune) > 0: + self.changeProgressListStatus(self.currentlyTestedIndex, "failed") + self["failed_counter"].setText(str(int(self["failed_counter"].getText()) + len(self.failedTune))) + self.addResult(self.currentlyTestedIndex, "failed", self.failedTune, self.successfullyTune) + else: + self.changeProgressListStatus(self.currentlyTestedIndex, "successful") + self["succeeded_counter"].setText(str(int(self["succeeded_counter"].getText()) + len(self.successfullyTune))) + self.addResult(self.currentlyTestedIndex, "successful", self.failedTune, self.successfullyTune) + + + #self["failed_counter"].setText(str(int(self["failed_counter"].getText()) + len(self.failedTune))) + #self["succeeded_counter"].setText(str(int(self["succeeded_counter"].getText()) + len(self.successfullyTune))) + #if len(self.failedTune) == 0 and len(self.successfullyTune) == 0: + #self["untestable_counter"].setText(str(int(self["untestable_counter"].getText()) + 1)) + self.currentlyTestedIndex = self.getNextIndex() + self.addProgressListItem(self.currentlyTestedIndex) + if self.fillTransponderList(): self.run(checkPIDs = True) + else: + self.running = False + self["progress_list"].setIndex(0) + print "results:", self.results + print "resultsstatus:", self.resultsstatus - def keyGo(self): + def go(self): + self.running = True + self["failed_counter"].setText("0") + self["succeeded_counter"].setText("0") + self["untestable_counter"].setText("0") self.currentlyTestedIndex = self.getFirstIndex() + + self.clearProgressList() + self.addProgressListItem(self.currentlyTestedIndex) + if self.fillTransponderList(): self.run(True) def keyCancel(self): self.close() + + def select(self): + print "selectedIndex:", self["progress_list"].getCurrent()[0] + if not self.running: + index = self["progress_list"].getCurrent()[0] + #self.setResultType(ResultParser.TYPE_BYORBPOS) + #self.setResultParameter(index[2]) + self.setResultType(ResultParser.TYPE_BYINDEX) + self.setResultParameter(index) + self.session.open(TextBox, self.getTextualResult()) + + def selectionChanged(self): + print "selection changed" + if len(self.list) > 0 and not self.running: + self["CmdText"].setText(_("Press OK to get further details for %s") % str(self["progress_list"].getCurrent()[1])) + +class DiseqcTesterTestTypeSelection(Screen, ConfigListScreen): + skin = """ + + + """ + def __init__(self, session, feid): + Screen.__init__(self, session) + self.feid = feid + + self.list = [] + ConfigListScreen.__init__(self, self.list) + + self["actions"] = ActionMap(["SetupActions"], + { + "cancel": self.keyCancel + }, -2) + + self.createSetup() + + def createSetup(self): + self.testtype = ConfigSelection(choices={"quick": _("Quick")}, default = "quick") + self.testtypeEntry = getConfigListEntry(_("Test Type"), self.testtype) + self.list.append(self.testtypeEntry) + + self.loopsfailed = ConfigSelection(choices={"-1": "Every known", "1": "1", "2": "2", "3": "3", "4": "4", "5": "5", "6": "6", "7": "7", "8": "8"}, default = "3") + self.loopsfailedEntry = getConfigListEntry(_("Stop testing plane after # failed transponders"), self.loopsfailed) + self.list.append(self.loopsfailedEntry) + + self.loopssuccessful = ConfigSelection(choices={"-1": "Every known", "1": "1", "2": "2", "3": "3", "4": "4", "5": "5", "6": "6", "7": "7", "8": "8"}, default = "1") + self.loopssuccessfulEntry = getConfigListEntry(_("Stop testing plane after # successful transponders"), self.loopssuccessful) + self.list.append(self.loopssuccessfulEntry) + + self["config"].list = self.list + self["config"].l.setList(self.list) + + def keyOK(self): + print self.testtype.getValue() + testtype = DiseqcTester.TEST_TYPE_QUICK + if self.testtype.getValue() == "quick": + testtype = DiseqcTester.TEST_TYPE_QUICK + elif self.testtype.getValue() == "random": + testtype = DiseqcTester.TEST_TYPE_RANDOM + elif self.testtype.getValue() == "complete": + testtype = DiseqcTester.TEST_TYPE_COMPLETE + self.session.open(DiseqcTester, feid = self.feid, test_type = testtype, loopsfailed = int(self.loopsfailed.value), loopssuccessful = int(self.loopssuccessful.value)) + + def keyCancel(self): + self.close() class DiseqcTesterNimSelection(NimSelection): skin = """ @@ -215,7 +463,8 @@ class DiseqcTesterNimSelection(NimSelection): NimSelection.__init__(self, session) def setResultClass(self): - self.resultclass = DiseqcTester + #self.resultclass = DiseqcTester + self.resultclass = DiseqcTesterTestTypeSelection def showNim(self, nim): nimConfig = nimmanager.getNimConfig(nim.slot) @@ -224,7 +473,7 @@ class DiseqcTesterNimSelection(NimSelection): return False if nimConfig.configMode.value == "simple": if nimConfig.diseqcMode.value == "positioner": - return False + return True return True return False diff --git a/lib/python/Screens/Makefile.am b/lib/python/Screens/Makefile.am old mode 100755 new mode 100644 index a3cf70bb..cde2d6c3 --- a/lib/python/Screens/Makefile.am +++ b/lib/python/Screens/Makefile.am @@ -13,5 +13,6 @@ install_PYTHON = \ TimerSelection.py PictureInPicture.py TimeDateInput.py \ SubtitleDisplay.py SubservicesQuickzap.py ParentalControlSetup.py NumericalTextInputHelpDialog.py \ SleepTimerEdit.py Ipkg.py RdsDisplay.py Globals.py DefaultWizard.py \ - SessionGlobals.py LocationBox.py WizardLanguage.py TaskView.py Rc.py VirtualKeyBoard.py + SessionGlobals.py LocationBox.py WizardLanguage.py TaskView.py Rc.py VirtualKeyBoard.py \ + TextBox.py diff --git a/lib/python/Screens/TextBox.py b/lib/python/Screens/TextBox.py new file mode 100644 index 00000000..117c5c72 --- /dev/null +++ b/lib/python/Screens/TextBox.py @@ -0,0 +1,26 @@ +from Screens.Screen import Screen + +from Components.ActionMap import ActionMap +from Components.Sources.StaticText import StaticText +from Components.ScrollLabel import ScrollLabel + +class TextBox(Screen): + def __init__(self, session, text = ""): + Screen.__init__(self, session) + + self.text = text + self["text"] = ScrollLabel(self.text) + + self["actions"] = ActionMap(["OkCancelActions", "DirectionActions"], + { + "cancel": self.cancel, + "ok": self.ok, + "up": self["text"].pageUp, + "down": self["text"].pageDown, + }, -1) + + def ok(self): + self.close() + + def cancel(self): + self.close() \ No newline at end of file -- cgit v1.2.3 From 24ec7ceb4ddd2749c60716f35f3f01ba0e2fcc13 Mon Sep 17 00:00:00 2001 From: ghost Date: Sun, 21 Dec 2008 11:11:47 +0100 Subject: fix death screen in some conditions del fakeRec doesnt work, when the fakeRecList was empty thx to adenin --- lib/python/Components/TimerSanityCheck.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/TimerSanityCheck.py b/lib/python/Components/TimerSanityCheck.py index 031c9cae..10dc31bd 100644 --- a/lib/python/Components/TimerSanityCheck.py +++ b/lib/python/Components/TimerSanityCheck.py @@ -200,7 +200,7 @@ class TimerSanityCheck: if timer == fakeRec[0] and fakeRec[1]: NavigationInstance.instance.stopRecordService(fakeRec[1]) fakeRecList.remove(fakeRec) - del fakeRec + fakeRec = None for entry in overlaplist: if entry[1] == timer: overlaplist.remove(entry) -- cgit v1.2.3 From 65d84bb0627f0e3e21fcdae27ba98cb584d7ad37 Mon Sep 17 00:00:00 2001 From: ghost Date: Mon, 22 Dec 2008 20:53:34 +0100 Subject: add possibility to remove timers in epglist TODO: this is not working for subtitles yet and not its working in graphical multi epg --- RecordTimer.py | 25 +++++++++---- data/skin_default/icons/epgclock_add.png | Bin 0 -> 358 bytes data/skin_default/icons/epgclock_post.png | Bin 0 -> 354 bytes data/skin_default/icons/epgclock_pre.png | Bin 0 -> 360 bytes lib/python/Components/EpgList.py | 32 +++++++++++++---- lib/python/Screens/EpgSelection.py | 57 ++++++++++++++++++++++++++---- lib/python/Screens/TimerEdit.py | 15 ++------ 7 files changed, 99 insertions(+), 30 deletions(-) create mode 100644 data/skin_default/icons/epgclock_add.png create mode 100644 data/skin_default/icons/epgclock_post.png create mode 100644 data/skin_default/icons/epgclock_pre.png (limited to 'lib/python/Components') diff --git a/RecordTimer.py b/RecordTimer.py index 8449a2d2..dcfdd578 100644 --- a/RecordTimer.py +++ b/RecordTimer.py @@ -577,6 +577,7 @@ class RecordTimer(timer.Timer): print "ignore timer conflict" elif timersanitycheck.doubleCheck(): print "ignore double timer" + return None entry.timeChanged() print "[Timer] Record " + str(entry) entry.Timer = self @@ -584,15 +585,16 @@ class RecordTimer(timer.Timer): if dosave: self.saveTimer() return None - + def isInTimer(self, eventid, begin, duration, service): time_match = 0 chktime = None chktimecmp = None chktimecmp_end = None end = begin + duration + refstr = str(service) for x in self.timer_list: - check = x.service_ref.ref.toCompareString() == str(service) + check = x.service_ref.ref.toString() == refstr if not check: sref = x.service_ref.ref parent_sid = sref.getUnsignedData(5) @@ -604,7 +606,7 @@ class RecordTimer(timer.Timer): sref.setUnsignedData(2, parent_tsid) sref.setUnsignedData(5, 0) sref.setUnsignedData(6, 0) - check = x.service_ref.ref.toCompareString() == str(service) + check = sref.toCompareString() == refstr num = 0 if check: check = False @@ -620,9 +622,6 @@ class RecordTimer(timer.Timer): check = True break if check: - #if x.eit is not None and x.repeated == 0: - # if x.eit == eventid: - # return duration if x.repeated != 0: if chktime is None: chktime = localtime(begin) @@ -645,6 +644,8 @@ class RecordTimer(timer.Timer): diff = x.end - begin if time_match < diff: time_match = diff + if time_match: + break return time_match def removeEntry(self, entry): @@ -663,6 +664,18 @@ class RecordTimer(timer.Timer): print "state: ", entry.state print "in processed: ", entry in self.processed_timers print "in running: ", entry in self.timer_list + # autoincrease instanttimer if possible + if not entry.dontSave: + for x in self.timer_list: + if x.dontSave and x.autoincrease: + x.end = x.begin + (3600 * 24 * 356 * 1) + self.timeChanged(x) + timersanitycheck = TimerSanityCheck(self.timer_list,x) + if not timersanitycheck.check(): + tsc_list = timersanitycheck.getSimulTimerList() + if len(tsc_list) > 1: + x.end = tsc_list[1].begin - 30 + self.timeChanged(x) # now the timer should be in the processed_timers list. remove it from there. self.processed_timers.remove(entry) self.saveTimer() diff --git a/data/skin_default/icons/epgclock_add.png b/data/skin_default/icons/epgclock_add.png new file mode 100644 index 00000000..487ac483 Binary files /dev/null and b/data/skin_default/icons/epgclock_add.png differ diff --git a/data/skin_default/icons/epgclock_post.png b/data/skin_default/icons/epgclock_post.png new file mode 100644 index 00000000..5716d99f Binary files /dev/null and b/data/skin_default/icons/epgclock_post.png differ diff --git a/data/skin_default/icons/epgclock_pre.png b/data/skin_default/icons/epgclock_pre.png new file mode 100644 index 00000000..ff424637 Binary files /dev/null and b/data/skin_default/icons/epgclock_pre.png differ diff --git a/lib/python/Components/EpgList.py b/lib/python/Components/EpgList.py index dbcd572b..042abccb 100644 --- a/lib/python/Components/EpgList.py +++ b/lib/python/Components/EpgList.py @@ -52,6 +52,9 @@ class EPGList(HTMLComponent, GUIComponent): self.l.setBuildFunc(self.buildSimilarEntry) self.epgcache = eEPGCache.getInstance() self.clock_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock.png')) + self.clock_add_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock_add.png')) + self.clock_pre_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock_pre.png')) + self.clock_post_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock_post.png')) def getEventFromId(self, service, eventid): event = None @@ -135,8 +138,22 @@ class EPGList(HTMLComponent, GUIComponent): self.datetime_rect = Rect(width/20*2, 0, width/20*5-15, height) self.service_rect = Rect(width/20*7, 0, width/20*13, height) + def getClockPixmap(self, refstr, beginTime, duration, eventId): + endTime = beginTime + duration + for x in self.timer.timer_list: + if x.service_ref.ref.toString() == refstr: + beg = x.begin + end = x.end + if x.eit == eventId: + return self.clock_pixmap + elif beginTime > beg and beginTime < end and endTime > end: + return self.clock_post_pixmap + elif beginTime < beg and endTime > beg and endTime < end: + return self.clock_pre_pixmap + return self.clock_add_pixmap + def buildSingleEntry(self, service, eventId, beginTime, duration, EventName): - rec=beginTime and (self.timer.isInTimer(eventId, beginTime, duration, service) > ((duration/10)*8)) + rec=beginTime and (self.timer.isInTimer(eventId, beginTime, duration, service)) r1=self.weekday_rect r2=self.datetime_rect r3=self.descr_rect @@ -145,14 +162,15 @@ class EPGList(HTMLComponent, GUIComponent): res.append((eListboxPythonMultiContent.TYPE_TEXT, r1.left(), r1.top(), r1.width(), r1.height(), 0, RT_HALIGN_RIGHT, self.days[t[6]])) res.append((eListboxPythonMultiContent.TYPE_TEXT, r2.left(), r2.top(), r2.width(), r1.height(), 0, RT_HALIGN_RIGHT, "%02d.%02d, %02d:%02d"%(t[2],t[1],t[3],t[4]))) if rec: - res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r3.left(), r3.top(), 21, 21, self.clock_pixmap)) + clock_pic = self.getClockPixmap(service, beginTime, duration, eventId) + res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r3.left(), r3.top(), 21, 21, clock_pic)) res.append((eListboxPythonMultiContent.TYPE_TEXT, r3.left() + 25, r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT, EventName)) else: res.append((eListboxPythonMultiContent.TYPE_TEXT, r3.left(), r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT, EventName)) return res def buildSimilarEntry(self, service, eventId, beginTime, service_name, duration): - rec=beginTime and (self.timer.isInTimer(eventId, beginTime, duration, service) > ((duration/10)*8)) + rec=beginTime and (self.timer.isInTimer(eventId, beginTime, duration, service)) r1=self.weekday_rect r2=self.datetime_rect r3=self.service_rect @@ -161,22 +179,24 @@ class EPGList(HTMLComponent, GUIComponent): res.append((eListboxPythonMultiContent.TYPE_TEXT, r1.left(), r1.top(), r1.width(), r1.height(), 0, RT_HALIGN_RIGHT, self.days[t[6]])) res.append((eListboxPythonMultiContent.TYPE_TEXT, r2.left(), r2.top(), r2.width(), r1.height(), 0, RT_HALIGN_RIGHT, "%02d.%02d, %02d:%02d"%(t[2],t[1],t[3],t[4]))) if rec: - res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r3.left(), r3.top(), 21, 21, self.clock_pixmap)) + clock_pic = self.getClockPixmap(service, beginTime, duration, eventId) + res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r3.left(), r3.top(), 21, 21, clock_pic)) res.append((eListboxPythonMultiContent.TYPE_TEXT, r3.left() + 25, r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT, service_name)) else: res.append((eListboxPythonMultiContent.TYPE_TEXT, r3.left(), r3.top(), r3.width(), r3.height(), 0, RT_HALIGN_LEFT, service_name)) return res def buildMultiEntry(self, changecount, service, eventId, begTime, duration, EventName, nowTime, service_name): - rec=begTime and (self.timer.isInTimer(eventId, begTime, duration, service) > ((duration/10)*8)) + rec=beginTime and (self.timer.isInTimer(eventId, begTime, duration, service)) r1=self.service_rect r2=self.progress_rect r3=self.descr_rect r4=self.start_end_rect res = [ None ] # no private data needed if rec: + clock_pic = self.getClockPixmap(service, begTime, duration, eventId) res.append((eListboxPythonMultiContent.TYPE_TEXT, r1.left(), r1.top(), r1.width()-21, r1.height(), 0, RT_HALIGN_LEFT, service_name)) - res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r1.left()+r1.width()-16, r1.top(), 21, 21, self.clock_pixmap)) + res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, r1.left()+r1.width()-16, r1.top(), 21, 21, clock_pic)) else: res.append((eListboxPythonMultiContent.TYPE_TEXT, r1.left(), r1.top(), r1.width(), r1.height(), 0, RT_HALIGN_LEFT, service_name)) if begTime is not None: diff --git a/lib/python/Screens/EpgSelection.py b/lib/python/Screens/EpgSelection.py index 6740bfb6..b40f445f 100644 --- a/lib/python/Screens/EpgSelection.py +++ b/lib/python/Screens/EpgSelection.py @@ -5,11 +5,13 @@ from Components.Pixmap import Pixmap from Components.Label import Label from Components.EpgList import EPGList, EPG_TYPE_SINGLE, EPG_TYPE_SIMILAR, EPG_TYPE_MULTI from Components.ActionMap import ActionMap +from Components.TimerSanityCheck import TimerSanityCheck from Screens.TimerEdit import TimerSanityConflict from Screens.EventView import EventViewSimple +from Screens.MessageBox import MessageBox from TimeDateInput import TimeDateInput from enigma import eServiceReference -from RecordTimer import RecordTimerEntry, parseEvent +from RecordTimer import RecordTimerEntry, parseEvent, AFTEREVENT from TimerEntry import TimerEntry from ServiceReference import ServiceReference from time import localtime, time @@ -17,6 +19,9 @@ from time import localtime, time mepg_config_initialized = False class EPGSelection(Screen): + ADD_TIMER = 0 + REMOVE_TIMER = 1 + def __init__(self, session, service, zapFunc=None, eventid=None, bouquetChangeCB=None): Screen.__init__(self, session) self.bouquetChangeCB = bouquetChangeCB @@ -58,6 +63,7 @@ class EPGSelection(Screen): self.zapFunc = zapFunc self["key_green"] = Button(_("Add timer")) + self.key_green_choice = self.ADD_TIMER self["list"] = EPGList(type = self.type, selChangedCB = self.onSelectionChanged, timer = self.session.nav.RecordTimer) self["actions"] = ActionMap(["EPGSelectActions", "OkCancelActions"], @@ -179,14 +185,28 @@ class EPGSelection(Screen): if self.type == EPG_TYPE_MULTI: self["list"].updateMultiEPG(1) + def removeTimer(self, timer): + timer.afterEvent = AFTEREVENT.NONE + self.session.nav.RecordTimer.removeEntry(timer) + self["key_green"].setText(_("Add timer")) + self.key_green_choice = self.ADD_TIMER + def timerAdd(self): cur = self["list"].getCurrent() event = cur[0] serviceref = cur[1] if event is None: return - newEntry = RecordTimerEntry(serviceref, checkOldTimers = True, *parseEvent(event)) - self.session.openWithCallback(self.finishedAdd, TimerEntry, newEntry) + eventid = event.getEventId() + refstr = serviceref.ref.toString() + for timer in self.session.nav.RecordTimer.timer_list: + if timer.eit == eventid and timer.service_ref.ref.toString() == refstr: + cb_func = lambda ret : not ret or self.removeTimer(timer) + self.session.openWithCallback(cb_func, MessageBox, _("Do you really want to delete %s?") % event.getEventName()) + break + else: + newEntry = RecordTimerEntry(serviceref, checkOldTimers = True, *parseEvent(event)) + self.session.openWithCallback(self.finishedAdd, TimerEntry, newEntry) def finishedAdd(self, answer): print "finished add" @@ -200,8 +220,12 @@ class EPGSelection(Screen): self.session.nav.RecordTimer.record(entry) else: self.session.openWithCallback(self.finishSanityCorrection, TimerSanityConflict, simulTimerList) + self["key_green"].setText(_("Remove timer")) + self.key_green_choice = self.REMOVE_TIMER else: - print "Timeredit aborted" + self["key_green"].setText(_("Add timer")) + self.key_green_choice = self.ADD_TIMER + print "Timeredit aborted" def finishSanityCorrection(self, answer): self.finishedAdd(answer) @@ -211,7 +235,7 @@ class EPGSelection(Screen): def moveDown(self): self["list"].moveDown() - + def applyButtonState(self, state): if state == 0: self["now_button"].hide() @@ -249,6 +273,7 @@ class EPGSelection(Screen): self["more_button_sel"].hide() def onSelectionChanged(self): + cur = self["list"].getCurrent() if self.type == EPG_TYPE_MULTI: count = self["list"].getCurrentChangeCount() if self.ask_time != -1: @@ -261,7 +286,7 @@ class EPGSelection(Screen): self.applyButtonState(1) days = [ _("Mon"), _("Tue"), _("Wed"), _("Thu"), _("Fri"), _("Sat"), _("Sun") ] datastr = "" - event = self["list"].getCurrent()[0] + event = cur[0] if event is not None: now = time() beg = event.getBeginTime() @@ -272,3 +297,23 @@ class EPGSelection(Screen): else: datestr = '%s %d.%d.'%(_("Today"), begTime[2], begTime[1]) self["date"].setText(datestr) + else: + event = cur[0] + + if event is None: + return + + serviceref = cur[1] + eventid = event.getEventId() + refstr = serviceref.ref.toString() + + for timer in self.session.nav.RecordTimer.timer_list: + if self.key_green_choice != self.REMOVE_TIMER: + if timer.eit == eventid and timer.service_ref.ref.toString() == refstr: + self["key_green"].setText(_("Remove timer")) + self.key_green_choice = self.REMOVE_TIMER + break + else: + if self.key_green_choice != self.ADD_TIMER: + self["key_green"].setText(_("Add timer")) + self.key_green_choice = self.ADD_TIMER diff --git a/lib/python/Screens/TimerEdit.py b/lib/python/Screens/TimerEdit.py index 18ab2b79..59e2bd03 100644 --- a/lib/python/Screens/TimerEdit.py +++ b/lib/python/Screens/TimerEdit.py @@ -214,18 +214,6 @@ class TimerEditList(Screen): timer = cur timer.afterEvent = AFTEREVENT.NONE self.session.nav.RecordTimer.removeEntry(timer) - if not timer.dontSave: - for timer in self.session.nav.RecordTimer.timer_list: - if timer.dontSave and timer.autoincrease: - timer.end = timer.begin + (3600 * 24 * 356 * 1) - self.session.nav.RecordTimer.timeChanged(timer) - timersanitycheck = TimerSanityCheck(self.session.nav.RecordTimer.timer_list,timer) - if not timersanitycheck.check(): - tsc_list = timersanitycheck.getSimulTimerList() - if len(tsc_list) > 1: - timer.end = tsc_list[1].begin - 30 - self.session.nav.RecordTimer.timeChanged(timer) - self.refill() self.updateState() @@ -261,6 +249,7 @@ class TimerEditList(Screen): def addTimer(self, timer): self.session.openWithCallback(self.finishedAdd, TimerEntry, timer) + def finishedEdit(self, answer): print "finished edit" @@ -335,6 +324,8 @@ class TimerSanityConflict(Screen): self.list.append((_("Conflicting timer") + " " + str(count), x)) self.list2.append((timer[count], False)) count += 1 + if count == 1: + self.list.append((_("Channel not in services list"))) self["list"] = MenuList(self.list) self["timer2"] = TimerList(self.list2) -- cgit v1.2.3 From 0abc1f0d2cb05ee24dc6928ca6ddf573c03f5fd2 Mon Sep 17 00:00:00 2001 From: ghost Date: Sun, 28 Dec 2008 12:22:15 +0100 Subject: fix typo --- lib/python/Components/EpgList.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/EpgList.py b/lib/python/Components/EpgList.py index 042abccb..01157842 100644 --- a/lib/python/Components/EpgList.py +++ b/lib/python/Components/EpgList.py @@ -187,7 +187,7 @@ class EPGList(HTMLComponent, GUIComponent): return res def buildMultiEntry(self, changecount, service, eventId, begTime, duration, EventName, nowTime, service_name): - rec=beginTime and (self.timer.isInTimer(eventId, begTime, duration, service)) + rec=begTime and (self.timer.isInTimer(eventId, begTime, duration, service)) r1=self.service_rect r2=self.progress_rect r3=self.descr_rect -- cgit v1.2.3 From 85209b4213f85d7b5f9f46ee5cfc1c6115c51828 Mon Sep 17 00:00:00 2001 From: ghost Date: Sat, 3 Jan 2009 10:36:40 +0100 Subject: small timer fixes by adenin --- lib/python/Components/EpgList.py | 36 ++++++++++++++-------- .../Extensions/GraphMultiEPG/GraphMultiEpg.py | 25 +++++++-------- lib/python/Screens/EpgSelection.py | 22 ++++++------- 3 files changed, 48 insertions(+), 35 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/EpgList.py b/lib/python/Components/EpgList.py index 01157842..30f566fd 100644 --- a/lib/python/Components/EpgList.py +++ b/lib/python/Components/EpgList.py @@ -55,6 +55,7 @@ class EPGList(HTMLComponent, GUIComponent): self.clock_add_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock_add.png')) self.clock_pre_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock_pre.png')) self.clock_post_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock_post.png')) + self.clock_prepost_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock_prepost.png')) def getEventFromId(self, service, eventid): event = None @@ -63,7 +64,7 @@ class EPGList(HTMLComponent, GUIComponent): return event def getCurrentChangeCount(self): - if self.type == EPG_TYPE_MULTI: + if self.type == EPG_TYPE_MULTI and self.l.getCurrentSelection() is not None: return self.l.getCurrentSelection()[0] return 0 @@ -95,11 +96,12 @@ class EPGList(HTMLComponent, GUIComponent): def selectionChanged(self): for x in self.onSelChanged: if x is not None: - try: - x() - except: # FIXME!!! - print "FIXME in EPGList.selectionChanged" - pass + x() +# try: +# x() +# except: # FIXME!!! +# print "FIXME in EPGList.selectionChanged" +# pass GUI_WIDGET = eListbox @@ -139,18 +141,28 @@ class EPGList(HTMLComponent, GUIComponent): self.service_rect = Rect(width/20*7, 0, width/20*13, height) def getClockPixmap(self, refstr, beginTime, duration, eventId): + pre_clock = 1 + post_clock = 2 + clock_type = 0 endTime = beginTime + duration for x in self.timer.timer_list: if x.service_ref.ref.toString() == refstr: - beg = x.begin - end = x.end if x.eit == eventId: return self.clock_pixmap - elif beginTime > beg and beginTime < end and endTime > end: - return self.clock_post_pixmap + beg = x.begin + end = x.end + if beginTime > beg and beginTime < end and endTime > end: + clock_type |= pre_clock elif beginTime < beg and endTime > beg and endTime < end: - return self.clock_pre_pixmap - return self.clock_add_pixmap + clock_type |= post_clock + if clock_type == 0: + return self.clock_add_pixmap + elif clock_type == pre_clock: + return self.clock_pre_pixmap + elif clock_type == post_clock: + return self.clock_post_pixmap + else: + return self.clock_prepost_pixmap def buildSingleEntry(self, service, eventId, beginTime, duration, EventName): rec=beginTime and (self.timer.isInTimer(eventId, beginTime, duration, service)) diff --git a/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py b/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py index 441cb5d8..afae6b3a 100644 --- a/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py +++ b/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py @@ -155,11 +155,12 @@ class EPGList(HTMLComponent, GUIComponent): def selectionChanged(self): for x in self.onSelChanged: if x is not None: - try: - x() - except: # FIXME!!! - print "FIXME in EPGList.selectionChanged" - pass + x() +# try: +# x() +# except: # FIXME!!! +# print "FIXME in EPGList.selectionChanged" +# pass GUI_WIDGET = eListbox @@ -291,13 +292,13 @@ class EPGList(HTMLComponent, GUIComponent): self.time_base = int(stime) test = [ (service.ref.toString(), 0, self.time_base, self.time_epoch) for service in services ] test.insert(0, 'XRnITBD') - print "BEFORE:" - for x in test: - print x +# print "BEFORE:" +# for x in test: +# print x epg_data = self.queryEPG(test) - print "EPG:" - for x in epg_data: - print x +# print "EPG:" +# for x in epg_data: +# print x self.list = [ ] tmp_list = None service = "" @@ -535,7 +536,7 @@ class GraphMultiEPG(Screen): else: self.session.openWithCallback(self.finishSanityCorrection, TimerSanityConflict, simulTimerList) else: - print "Timeredit aborted" + print "Timeredit aborted" def finishSanityCorrection(self, answer): self.finishedAdd(answer) diff --git a/lib/python/Screens/EpgSelection.py b/lib/python/Screens/EpgSelection.py index b40f445f..f6793269 100644 --- a/lib/python/Screens/EpgSelection.py +++ b/lib/python/Screens/EpgSelection.py @@ -285,7 +285,7 @@ class EPGSelection(Screen): else: self.applyButtonState(1) days = [ _("Mon"), _("Tue"), _("Wed"), _("Thu"), _("Fri"), _("Sat"), _("Sun") ] - datastr = "" + datestr = "" event = cur[0] if event is not None: now = time() @@ -306,14 +306,14 @@ class EPGSelection(Screen): serviceref = cur[1] eventid = event.getEventId() refstr = serviceref.ref.toString() - + isRecordEvent = False for timer in self.session.nav.RecordTimer.timer_list: - if self.key_green_choice != self.REMOVE_TIMER: - if timer.eit == eventid and timer.service_ref.ref.toString() == refstr: - self["key_green"].setText(_("Remove timer")) - self.key_green_choice = self.REMOVE_TIMER - break - else: - if self.key_green_choice != self.ADD_TIMER: - self["key_green"].setText(_("Add timer")) - self.key_green_choice = self.ADD_TIMER + if timer.eit == eventid and timer.service_ref.ref.toString() == refstr: + isRecordEvent = True + break + if isRecordEvent and self.key_green_choice != self.REMOVE_TIMER: + self["key_green"].setText(_("Remove timer")) + self.key_green_choice = self.REMOVE_TIMER + elif not isRecordEvent and self.key_green_choice != self.ADD_TIMER: + self["key_green"].setText(_("Add timer")) + self.key_green_choice = self.ADD_TIMER -- cgit v1.2.3 From 5b7a1c9dae868020473e9dcb79a5dfa442e019e1 Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Tue, 6 Jan 2009 13:20:57 +0100 Subject: only kill actual containers on aborting tasks --- lib/python/Components/Task.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/Task.py b/lib/python/Components/Task.py index 04e5c938..df94f8a6 100644 --- a/lib/python/Components/Task.py +++ b/lib/python/Components/Task.py @@ -131,6 +131,7 @@ class Task(object): self.task_progress_changed = None self.output_line = "" job.addTask(self) + self.container = None def setCommandline(self, cmd, args): self.cmd = cmd @@ -211,7 +212,8 @@ class Task(object): self.finish() def abort(self): - self.container.kill() + if self.container: + self.container.kill() self.finish(aborted = True) def finish(self, aborted = False): -- cgit v1.2.3 From 15171632716c0734526eefc55e3d0601be177b45 Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Fri, 9 Jan 2009 18:42:01 +0100 Subject: fixes by adenin: - fixed "sometimes, timer changes would not be applied" - allow deleting timers in GraphMultiEPG - fix displayed clock icons in epg view, - fix button text for "zap", "add/remove timer" - multiepg and graphmultiepg will automatically switch to correct service --- lib/python/Components/EpgList.py | 6 + .../Extensions/GraphMultiEPG/GraphMultiEpg.py | 143 ++++++++++++++++++--- lib/python/Screens/EpgSelection.py | 40 ++++-- lib/python/Screens/EventView.py | 46 ++++++- lib/python/Screens/TimerEdit.py | 5 +- 5 files changed, 210 insertions(+), 30 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/EpgList.py b/lib/python/Components/EpgList.py index 30f566fd..8a7c8d45 100644 --- a/lib/python/Components/EpgList.py +++ b/lib/python/Components/EpgList.py @@ -284,6 +284,12 @@ class EPGList(HTMLComponent, GUIComponent): x = self.l.getCurrentSelection() return x and x[1] + def moveToService(self,serviceref): + for x in range(len(self.list)): + if self.list[x][1] == serviceref.toString(): + self.instance.moveSelectionTo(x) + break + def moveToEventId(self, eventId): index = 0 for x in self.list: diff --git a/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py b/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py index afae6b3a..b2e07e10 100644 --- a/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py +++ b/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py @@ -15,8 +15,9 @@ from Screens.TimeDateInput import TimeDateInput from Screens.TimerEntry import TimerEntry from Screens.EpgSelection import EPGSelection from Screens.TimerEdit import TimerSanityConflict +from Screens.MessageBox import MessageBox from Tools.Directories import resolveFilename, SCOPE_SKIN_IMAGE -from RecordTimer import RecordTimerEntry, parseEvent +from RecordTimer import RecordTimerEntry, parseEvent, AFTEREVENT from ServiceReference import ServiceReference from Tools.LoadPixmap import LoadPixmap from enigma import eEPGCache, eListbox, gFont, eListboxPythonMultiContent, \ @@ -41,6 +42,10 @@ class EPGList(HTMLComponent, GUIComponent): self.l.setSelectableFunc(self.isSelectable) self.epgcache = eEPGCache.getInstance() self.clock_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock.png')) + self.clock_add_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock_add.png')) + self.clock_pre_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock_pre.png')) + self.clock_post_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock_post.png')) + self.clock_prepost_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock_prepost.png')) self.time_base = None self.time_epoch = time_epoch self.list = None @@ -92,6 +97,22 @@ class EPGList(HTMLComponent, GUIComponent): event = self.epgcache.lookupEventId(service.ref, eventid) return event + def moveToService(self,serviceref): + for x in range(len(self.list)): + if self.list[x][0] == serviceref.toString(): + self.instance.moveSelectionTo(x) + break + + def getIndexFromService(self, serviceref): + for x in range(len(self.list)): + if self.list[x][0] == serviceref.toString(): + return x + return 0 + + def setCurrentIndex(self, index): + if self.instance is not None: + self.instance.moveSelectionTo(index) + def getCurrent(self): if self.cur_service is None: return ( None, None ) @@ -227,7 +248,7 @@ class EPGList(HTMLComponent, GUIComponent): borderColor = self.borderColor for ev in events: #(event_id, event_title, begin_time, duration) - rec=ev[2] and self.timer.isInTimer(ev[0], ev[2], ev[3], service) > ((ev[3]/10)*8) + rec=ev[2] and self.timer.isInTimer(ev[0], ev[2], ev[3], service) xpos, ewidth = self.calcEntryPosAndWidthHelper(ev[2], ev[3], start, end, width) res.append(MultiContentEntryText( pos = (left+xpos, top), size = (ewidth, height), @@ -237,7 +258,8 @@ class EPGList(HTMLComponent, GUIComponent): if rec and ewidth > 23: res.append(MultiContentEntryPixmapAlphaTest( pos = (left+xpos+ewidth-22, top+height-22), size = (21, 21), - png = self.clock_pixmap, backcolor = backColor, + png = self.getClockPixmap(service, ev[2], ev[3], ev[0]), + backcolor = backColor, backcolor_sel = backColorSelected)) return res @@ -329,6 +351,30 @@ class EPGList(HTMLComponent, GUIComponent): def resetOffset(self): self.offs = 0 + + def getClockPixmap(self, refstr, beginTime, duration, eventId): + pre_clock = 1 + post_clock = 2 + clock_type = 0 + endTime = beginTime + duration + for x in self.timer.timer_list: + if x.service_ref.ref.toString() == refstr: + if x.eit == eventId: + return self.clock_pixmap + beg = x.begin + end = x.end + if beginTime > beg and beginTime < end and endTime > end: + clock_type |= pre_clock + elif beginTime < beg and endTime > beg and endTime < end: + clock_type |= post_clock + if clock_type == 0: + return self.clock_add_pixmap + elif clock_type == pre_clock: + return self.clock_pre_pixmap + elif clock_type == post_clock: + return self.clock_post_pixmap + else: + return self.clock_prepost_pixmap class TimelineText(HTMLComponent, GUIComponent): def __init__(self): @@ -356,6 +402,12 @@ config.misc.graph_mepg_prev_time=ConfigClock(default = time()) config.misc.graph_mepg_prev_time_period=ConfigInteger(default=120, limits=(60,300)) class GraphMultiEPG(Screen): + EMPTY = 0 + ADD_TIMER = 1 + REMOVE_TIMER = 2 + + ZAP = 1 + def __init__(self, session, services, zapFunc=None, bouquetChangeCB=None): Screen.__init__(self, session) self.bouquetChangeCB = bouquetChangeCB @@ -364,7 +416,9 @@ class GraphMultiEPG(Screen): self.ask_time = now - tmp self.closeRecursive = False self["key_red"] = Button("") - self["key_green"] = Button(_("Add timer")) + self["key_green"] = Button("") + self.key_green_choice = self.EMPTY + self.key_red_choice = self.EMPTY self["timeline_text"] = TimelineText() self["Event"] = Event() self.time_lines = [ ] @@ -488,6 +542,7 @@ class GraphMultiEPG(Screen): #just used in multipeg def onCreate(self): self["list"].fillMultiEPG(self.services, self.ask_time) + self["list"].moveToService(self.session.nav.getCurrentlyPlayingServiceReference()) self.moveTimeLines() def eventViewCallback(self, setEvent, setService, val): @@ -505,7 +560,7 @@ class GraphMultiEPG(Screen): setEvent(cur[0]) def zapTo(self): - if self.zapFunc and self["key_red"].getText() == "Zap": + if self.zapFunc and self.key_red_choice == self.ZAP: self.closeRecursive = True ref = self["list"].getCurrent()[1] if ref: @@ -514,14 +569,28 @@ class GraphMultiEPG(Screen): def eventSelected(self): self.infoKeyPressed() + def removeTimer(self, timer): + timer.afterEvent = AFTEREVENT.NONE + self.session.nav.RecordTimer.removeEntry(timer) + self["key_green"].setText(_("Add timer")) + self.key_green_choice = self.ADD_TIMER + def timerAdd(self): cur = self["list"].getCurrent() event = cur[0] serviceref = cur[1] if event is None: return - newEntry = RecordTimerEntry(serviceref, checkOldTimers = True, *parseEvent(event)) - self.session.openWithCallback(self.finishedAdd, TimerEntry, newEntry) + eventid = event.getEventId() + refstr = serviceref.ref.toString() + for timer in self.session.nav.RecordTimer.timer_list: + if timer.eit == eventid and timer.service_ref.ref.toString() == refstr: + cb_func = lambda ret : not ret or self.removeTimer(timer) + self.session.openWithCallback(cb_func, MessageBox, _("Do you really want to delete %s?") % event.getEventName()) + break + else: + newEntry = RecordTimerEntry(serviceref, checkOldTimers = True, *parseEvent(event)) + self.session.openWithCallback(self.finishedAdd, TimerEntry, newEntry) def finishedAdd(self, answer): print "finished add" @@ -535,25 +604,63 @@ class GraphMultiEPG(Screen): self.session.nav.RecordTimer.record(entry) else: self.session.openWithCallback(self.finishSanityCorrection, TimerSanityConflict, simulTimerList) + self["key_green"].setText(_("Remove timer")) + self.key_green_choice = self.REMOVE_TIMER else: + self["key_green"].setText(_("Add timer")) + self.key_green_choice = self.ADD_TIMER print "Timeredit aborted" def finishSanityCorrection(self, answer): self.finishedAdd(answer) def onSelectionChanged(self): - evt = self["list"].getCurrent() - self["Event"].newEvent(evt and evt[0]) - if evt and evt[0]: - evt = evt[0] - now = time() - start = evt.getBeginTime() - end = start + evt.getDuration() - if now >= start and now <= end: - self["key_red"].setText("Zap") - else: + cur = self["list"].getCurrent() + if cur is None: + if self.key_green_choice != self.EMPTY: + self["key_green"].setText("") + self.key_green_choice = self.EMPTY + if self.key_red_choice != self.EMPTY: self["key_red"].setText("") - + self.key_red_choice = self.EMPTY + return + + event = cur[0] + self["Event"].newEvent(event) + + if cur[1] is None or cur[1].getServiceName() == "": + if self.key_green_choice != self.EMPTY: + self["key_green"].setText("") + self.key_green_choice = self.EMPTY + if self.key_red_choice != self.EMPTY: + self["key_red"].setText("") + self.key_red_choice = self.EMPTY + return + elif self.key_red_choice != self.ZAP: + self["key_red"].setText("Zap") + self.key_red_choice = self.ZAP + + if not event: + if self.key_green_choice != self.EMPTY: + self["key_green"].setText("") + self.key_green_choice = self.EMPTY + return + + serviceref = cur[1] + eventid = event.getEventId() + refstr = serviceref.ref.toString() + isRecordEvent = False + for timer in self.session.nav.RecordTimer.timer_list: + if timer.eit == eventid and timer.service_ref.ref.toString() == refstr: + isRecordEvent = True + break + if isRecordEvent and self.key_green_choice != self.REMOVE_TIMER: + self["key_green"].setText(_("Remove timer")) + self.key_green_choice = self.REMOVE_TIMER + elif not isRecordEvent and self.key_green_choice != self.ADD_TIMER: + self["key_green"].setText(_("Add timer")) + self.key_green_choice = self.ADD_TIMER + def moveTimeLines(self, force=False): l = self["list"] event_rect = l.getEventRect() diff --git a/lib/python/Screens/EpgSelection.py b/lib/python/Screens/EpgSelection.py index f6793269..526576e1 100644 --- a/lib/python/Screens/EpgSelection.py +++ b/lib/python/Screens/EpgSelection.py @@ -19,8 +19,11 @@ from time import localtime, time mepg_config_initialized = False class EPGSelection(Screen): - ADD_TIMER = 0 - REMOVE_TIMER = 1 + EMPTY = 0 + ADD_TIMER = 1 + REMOVE_TIMER = 2 + + ZAP = 1 def __init__(self, session, service, zapFunc=None, eventid=None, bouquetChangeCB=None): Screen.__init__(self, session) @@ -64,6 +67,7 @@ class EPGSelection(Screen): self["key_green"] = Button(_("Add timer")) self.key_green_choice = self.ADD_TIMER + self.key_red_choice = self.EMPTY self["list"] = EPGList(type = self.type, selChangedCB = self.onSelectionChanged, timer = self.session.nav.RecordTimer) self["actions"] = ActionMap(["EPGSelectActions", "OkCancelActions"], @@ -131,6 +135,7 @@ class EPGSelection(Screen): l.recalcEntrySize() if self.type == EPG_TYPE_MULTI: l.fillMultiEPG(self.services, self.ask_time) + l.moveToService(self.session.nav.getCurrentlyPlayingServiceReference()) elif self.type == EPG_TYPE_SINGLE: l.fillSingleEPG(self.currentService) else: @@ -151,7 +156,7 @@ class EPGSelection(Screen): setEvent(cur[0]) def zapTo(self): # just used in multiepg - if self.zapFunc and self["key_red"].getText() == "Zap": + if self.zapFunc and self.key_red_choice == self.ZAP: lst = self["list"] count = lst.getCurrentChangeCount() if count == 0: @@ -250,13 +255,11 @@ class EPGSelection(Screen): self["key_red"].setText("") else: if state == 1: - self["key_red"].setText("Zap") self["now_button_sel"].show() self["now_button"].hide() else: self["now_button"].show() self["now_button_sel"].hide() - self["key_red"].setText("") if state == 2: self["next_button_sel"].show() @@ -274,6 +277,15 @@ class EPGSelection(Screen): def onSelectionChanged(self): cur = self["list"].getCurrent() + if cur is None: + if self.key_green_choice != self.EMPTY: + self["key_green"].setText("") + self.key_green_choice = self.EMPTY + if self.key_red_choice != self.EMPTY: + self["key_red"].setText("") + self.key_red_choice = self.EMPTY + return + event = cur[0] if self.type == EPG_TYPE_MULTI: count = self["list"].getCurrentChangeCount() if self.ask_time != -1: @@ -286,7 +298,6 @@ class EPGSelection(Screen): self.applyButtonState(1) days = [ _("Mon"), _("Tue"), _("Wed"), _("Thu"), _("Fri"), _("Sat"), _("Sun") ] datestr = "" - event = cur[0] if event is not None: now = time() beg = event.getBeginTime() @@ -297,10 +308,23 @@ class EPGSelection(Screen): else: datestr = '%s %d.%d.'%(_("Today"), begTime[2], begTime[1]) self["date"].setText(datestr) - else: - event = cur[0] + + if cur[1] is None or cur[1].getServiceName() == "": + if self.key_green_choice != self.EMPTY: + self["key_green"].setText("") + self.key_green_choice = self.EMPTY + if self.key_red_choice != self.EMPTY: + self["key_red"].setText("") + self.key_red_choice = self.EMPTY + return + elif self.key_red_choice != self.ZAP and self.type == EPG_TYPE_MULTI: + self["key_red"].setText("Zap") + self.key_red_choice = self.ZAP if event is None: + if self.key_green_choice != self.EMPTY: + self["key_green"].setText("") + self.key_green_choice = self.EMPTY return serviceref = cur[1] diff --git a/lib/python/Screens/EventView.py b/lib/python/Screens/EventView.py index 5d50d9bc..5d3786fb 100644 --- a/lib/python/Screens/EventView.py +++ b/lib/python/Screens/EventView.py @@ -1,17 +1,21 @@ from Screen import Screen from Screens.TimerEdit import TimerSanityConflict +from Screens.MessageBox import MessageBox from Components.ActionMap import ActionMap from Components.Button import Button from Components.Label import Label from Components.ScrollLabel import ScrollLabel from Components.TimerList import TimerList from enigma import eEPGCache, eTimer, eServiceReference -from RecordTimer import RecordTimerEntry, parseEvent +from RecordTimer import RecordTimerEntry, parseEvent, AFTEREVENT from TimerEntry import TimerEntry from time import localtime from Components.config import config class EventViewBase: + ADD_TIMER = 0 + REMOVE_TIMER = 1 + def __init__(self, Event, Ref, callback=None, similarEPGCB=None): self.similarEPGCB = similarEPGCB self.cbFunc = callback @@ -28,6 +32,7 @@ class EventViewBase: self.SimilarBroadcastTimer.callback.append(self.getSimilarEvents) else: self.SimilarBroadcastTimer = None + self.key_green_choice = self.ADD_TIMER if self.isRecording: self["key_green"] = Button("") else: @@ -59,8 +64,25 @@ class EventViewBase: if self.cbFunc is not None: self.cbFunc(self.setEvent, self.setService, +1) + def removeTimer(self, timer): + timer.afterEvent = AFTEREVENT.NONE + self.session.nav.RecordTimer.removeEntry(timer) + self["key_green"].setText(_("Add timer")) + self.key_green_choice = self.ADD_TIMER + def timerAdd(self): - if not self.isRecording: + event = self.event + serviceref = self.currentService + if event is None: + return + eventid = event.getEventId() + refstr = serviceref.ref.toString() + for timer in self.session.nav.RecordTimer.timer_list: + if timer.eit == eventid and timer.service_ref.ref.toString() == refstr: + cb_func = lambda ret : not ret or self.removeTimer(timer) + self.session.openWithCallback(cb_func, MessageBox, _("Do you really want to delete %s?") % event.getEventName()) + break + else: newEntry = RecordTimerEntry(self.currentService, checkOldTimers = True, *parseEvent(self.event)) self.session.openWithCallback(self.finishedAdd, TimerEntry, newEntry) @@ -76,7 +98,11 @@ class EventViewBase: self.session.nav.RecordTimer.record(entry) else: self.session.openWithCallback(self.finishSanityCorrection, TimerSanityConflict, simulTimerList) + self["key_green"].setText(_("Remove timer")) + self.key_green_choice = self.REMOVE_TIMER else: + self["key_green"].setText(_("Add timer")) + self.key_green_choice = self.ADD_TIMER print "Timeredit aborted" def finishSanityCorrection(self, answer): @@ -123,6 +149,22 @@ class EventViewBase: if self.SimilarBroadcastTimer is not None: self.SimilarBroadcastTimer.start(400,True) + serviceref = self.currentService + eventid = self.event.getEventId() + refstr = serviceref.ref.toString() + isRecordEvent = False + for timer in self.session.nav.RecordTimer.timer_list: + if timer.eit == eventid and timer.service_ref.ref.toString() == refstr: + isRecordEvent = True + break + if isRecordEvent and self.key_green_choice != self.REMOVE_TIMER: + self["key_green"].setText(_("Remove timer")) + self.key_green_choice = self.REMOVE_TIMER + elif not isRecordEvent and self.key_green_choice != self.ADD_TIMER: + self["key_green"].setText(_("Add timer")) + self.key_green_choice = self.ADD_TIMER + + def pageUp(self): self["epg_description"].pageUp() diff --git a/lib/python/Screens/TimerEdit.py b/lib/python/Screens/TimerEdit.py index 59e2bd03..8cda8ca4 100644 --- a/lib/python/Screens/TimerEdit.py +++ b/lib/python/Screens/TimerEdit.py @@ -269,8 +269,9 @@ class TimerEditList(Screen): self.session.openWithCallback(self.finishedEdit, TimerSanityConflict, timersanitycheck.getSimulTimerList()) else: print "Sanity check passed" - if not timersanitycheck.doubleCheck(): - self.session.nav.RecordTimer.timeChanged(entry) +# if not timersanitycheck.doubleCheck(): + self.session.nav.RecordTimer.timeChanged(entry) + self.fillTimerList() self.updateState() else: -- cgit v1.2.3 From 2c9a0e18d4ad0b5a73abb5466ea2f70b61daf7fa Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Thu, 15 Jan 2009 13:21:08 +0100 Subject: allow styleable TemplatedMultiContent lists --- .../Components/Converter/TemplatedMultiContent.py | 30 ++++++++++++++++++++-- lib/python/Components/Sources/List.py | 17 +++++++----- 2 files changed, 39 insertions(+), 8 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/Converter/TemplatedMultiContent.py b/lib/python/Components/Converter/TemplatedMultiContent.py index a1b601d6..cc00455c 100644 --- a/lib/python/Components/Converter/TemplatedMultiContent.py +++ b/lib/python/Components/Converter/TemplatedMultiContent.py @@ -11,16 +11,21 @@ class TemplatedMultiContent(StringList): del l["args"] self.template = eval(args, {}, l) + self.active_style = None assert "fonts" in self.template assert "itemHeight" in self.template - assert "template" in self.template + assert "template" in self.template or "templates" in self.template + assert "template" in self.template or "default" in self.template["templates"] # we need to have a default template + + if not "template" in self.template: # default template can be ["template"] or ["templates"]["default"] + self.template["template"] = self.template["templates"]["default"] def changed(self, what): if not self.content: from enigma import eListboxPythonMultiContent self.content = eListboxPythonMultiContent() self.content.setItemHeight(self.template["itemHeight"]) - self.content.setTemplate(self.template["template"]) + self.setTemplate() # also setup fonts (also given by source) index = 0 @@ -28,7 +33,28 @@ class TemplatedMultiContent(StringList): self.content.setFont(index, f) index += 1 + # if only template changed, don't reload list + if what[0] == self.CHANGED_SPECIFIC and what[1] == "style": + self.setTemplate() + return + if self.source: self.content.setList(self.source.list) + self.setTemplate() self.downstream_elements.changed(what) + + def setTemplate(self): + if self.source: + style = self.source.style + if style == self.active_style: + return # style did not change + + # if skin defined "templates", that means that it defines multiple styles in a dict. template should still be a default + templates = self.template.get("templates") + template = self.template.get("template") + + if templates and style: # if we have a custom style defined in the source, and different templates in the skin, look it up + template = templates.get(self.source.style, template) # default to default template + + self.content.setTemplate(template) diff --git a/lib/python/Components/Sources/List.py b/lib/python/Components/Sources/List.py index ef9c1c89..26c68ab5 100644 --- a/lib/python/Components/Sources/List.py +++ b/lib/python/Components/Sources/List.py @@ -17,6 +17,7 @@ to generate HTML.""" self.fonts = fonts self.disable_callbacks = False self.enableWrapAround = enableWrapAround + self.__style = "default" # style might be an optional string which can be used to define different visualisations in the skin def setList(self, list): self.__list = list @@ -76,17 +77,21 @@ to generate HTML.""" self.index -= 1 self.setIndex(self.index) + @cached + def getStyle(self): + return self.__style + + def setStyle(self, style): + self.__style = style + self.changed((self.CHANGED_SPECIFIC, "style")) + + style = property(getStyle, setStyle) + def updateList(self, list): """Changes the list without changing the selection or emitting changed Events""" assert len(list) == len(self.__list) - print "get old index" old_index = self.index - print "disable callback" self.disable_callbacks = True - print "set list" self.list = list - print "set index" self.index = old_index - print "reenable callbacks" self.disable_callbacks = False - print "done" -- cgit v1.2.3 From b37fb8b50e48795882cd933c8ef9fe31b3ef007d Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Mon, 19 Jan 2009 02:16:11 +0100 Subject: rework block device scanning a bit --- data/menu.xml | 2 +- lib/python/Components/Harddisk.py | 100 ++++++++++++++++++--- lib/python/Plugins/SystemPlugins/Hotplug/plugin.py | 13 +-- 3 files changed, 89 insertions(+), 26 deletions(-) (limited to 'lib/python/Components') diff --git a/data/menu.xml b/data/menu.xml index 6bf5e3f2..7dc764ac 100644 --- a/data/menu.xml +++ b/data/menu.xml @@ -54,7 +54,7 @@ - + diff --git a/lib/python/Components/Harddisk.py b/lib/python/Components/Harddisk.py index febd16dd..8e30a512 100644 --- a/lib/python/Components/Harddisk.py +++ b/lib/python/Components/Harddisk.py @@ -2,6 +2,7 @@ from os import system, listdir, statvfs, popen, makedirs, readlink, stat, major, from Tools.Directories import SCOPE_HDD, resolveFilename from Tools.CList import CList from SystemInfo import SystemInfo +import string def tryOpen(filename): try: @@ -213,11 +214,12 @@ class Harddisk: return self.getDeviceDir() + "disc" class Partition: - def __init__(self, mountpoint, description = "", force_mounted = False): + def __init__(self, mountpoint, device = None, description = "", force_mounted = False): self.mountpoint = mountpoint self.description = description self.force_mounted = force_mounted self.is_hotplug = force_mounted # so far; this might change. + self.device = device def stat(self): return statvfs(self.mountpoint) @@ -247,6 +249,14 @@ class Partition: return True return False +DEVICEDB = \ + { + # dm8000: + "devices/platform/brcm-ehci.0/usb1/1-1/1-1.1/1-1.1:1.0": "Front USB Slot", + "devices/platform/brcm-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0": "Back, upper USB Slot", + "devices/platform/brcm-ehci.0/usb1/1-1/1-1.3/1-1.3:1.0": "Back, lower USB Slot", + } + class HarddiskManager: def __init__(self): self.hdd = [ ] @@ -307,37 +317,63 @@ class HarddiskManager: self.cd = blockdev except IOError: error = True - return error, blacklisted, removable, is_cdrom, partitions + # check for medium + medium_found = True + try: + open("/dev/" + blockdev).close() + except IOError, err: + if err.errno == 159: # no medium present + medium_found = False + + return error, blacklisted, removable, is_cdrom, partitions, medium_found def enumerateBlockDevices(self): print "enumerating block devices..." for blockdev in listdir("/sys/block"): - error, blacklisted, removable, is_cdrom, partitions = self.getBlockDevInfo(blockdev) + error, blacklisted, removable, is_cdrom, partitions, medium_found = self.getBlockDevInfo(blockdev) print "found block device '%s':" % blockdev, if error: print "error querying properties" elif blacklisted: print "blacklisted" + elif not medium_found: + print "no medium" else: print "ok, removable=%s, cdrom=%s, partitions=%s, device=%s" % (removable, is_cdrom, partitions, blockdev) - self.addHotplugPartition(blockdev, blockdev) + + self.addHotplugPartition(blockdev) for part in partitions: - self.addHotplugPartition(part, part) + self.addHotplugPartition(part) def getAutofsMountpoint(self, device): return "/autofs/%s/" % (device) - def addHotplugPartition(self, device, description): - p = Partition(mountpoint = self.getAutofsMountpoint(device), description = description, force_mounted = True) + def addHotplugPartition(self, device, physdev = None): + if not physdev: + dev, part = self.splitDeviceName(device) + physdev = dev + try: + import os + physdev = os.readlink("/sys/block/" + dev + "/device")[6:] + except IOError: + print "couldn't determine blockdev physdev for device", dev + + # device is the device name, without /dev + # physdev is the physical device path, which we (might) use to determine the userfriendly name + description = self.getUserfriendlyDeviceName(device, physdev) + + p = Partition(mountpoint = self.getAutofsMountpoint(device), description = description, force_mounted = True, device = device) self.partitions.append(p) self.on_partition_list_change("add", p) + + # see if this is a harddrive l = len(device) - if l and device[l-1] not in ('0','1','2','3','4','5','6','7','8','9'): - error, blacklisted, removable, is_cdrom, partitions = self.getBlockDevInfo(device) - if not blacklisted and not removable and not is_cdrom: + if l and device[l-1] not in string.digits: + error, blacklisted, removable, is_cdrom, partitions, medium_found = self.getBlockDevInfo(device) + if not blacklisted and not removable and not is_cdrom and medium_found: self.hdd.append(Harddisk(device)) self.hdd.sort() - SystemInfo["Harddisc"] = len(self.hdd) > 0 + SystemInfo["Harddisk"] = len(self.hdd) > 0 def removeHotplugPartition(self, device): mountpoint = self.getAutofsMountpoint(device) @@ -346,13 +382,13 @@ class HarddiskManager: self.partitions.remove(x) self.on_partition_list_change("remove", x) l = len(device) - if l and device[l-1] not in ('0','1','2','3','4','5','6','7','8','9'): + if l and device[l-1] not in string.digits: idx = 0 for hdd in self.hdd: if hdd.device == device: del self.hdd[idx] break - SystemInfo["Harddisc"] = len(self.hdd) > 0 + SystemInfo["Harddisk"] = len(self.hdd) > 0 def HDDCount(self): return len(self.hdd) @@ -371,6 +407,42 @@ class HarddiskManager: return self.cd def getMountedPartitions(self, onlyhotplug = False): - return [x for x in self.partitions if (x.is_hotplug or not onlyhotplug) and x.mounted()] + parts = [x for x in self.partitions if (x.is_hotplug or not onlyhotplug) and x.mounted()] + devs = set([x.device for x in parts]) + for devname in devs.copy(): + if not devname: + continue + dev, part = self.splitDeviceName(devname) + if part and dev in devs: # if this is a partition and we still have the wholedisk, remove wholedisk + devs.remove(dev) + + # return all devices which are not removed due to being a wholedisk when a partition exists + return [x for x in parts if not x.device or x.device in devs] + + def splitDeviceName(self, devname): + dev = "" + part = "" + for i in devname: + if i in string.digits: + part += i + else: + dev += i + return dev, part and int(part) or 0 + + def getUserfriendlyDeviceName(self, dev, phys): + dev, part = self.splitDeviceName(dev) + description = "External Storage %s" % dev + try: + description = open("/sys/" + phys + "/model").read().strip() + except IOError, s: + print "couldn't read model (from /sys/" + phys + "/model): ", s + for physdevprefix, pdescription in DEVICEDB.items(): + if phys.startswith(physdevprefix): + description = pdescription + + # not wholedisk and not partition 1 + if part and part != 1: + description += " (Partition %d)" % part + return description harddiskmanager = HarddiskManager() diff --git a/lib/python/Plugins/SystemPlugins/Hotplug/plugin.py b/lib/python/Plugins/SystemPlugins/Hotplug/plugin.py index e593e942..b19007c9 100644 --- a/lib/python/Plugins/SystemPlugins/Hotplug/plugin.py +++ b/lib/python/Plugins/SystemPlugins/Hotplug/plugin.py @@ -3,17 +3,9 @@ from twisted.internet.protocol import Protocol, Factory from twisted.internet import reactor from Components.Harddisk import harddiskmanager -DEVICEDB = \ - { "/devices/pci0000:00/0000:00:14.2/usb1/1-1/1-1:1.0/host0/target0:0:0/0:0:0:0": "CF Slot", - "/devices/pci0000:00/0000:00:14.2/usb1/1-1/1-1:1.0/host0/target1:0:0/0:0:0:0": "SD Slot" - } - hotplugNotifier = [ ] class Hotplug(Protocol): - def getUserfriendlyDeviceName(self, phys): - return DEVICEDB.get(phys, "USB Storage") - def connectionMade(self): self.received = "" @@ -40,14 +32,13 @@ class Hotplug(Protocol): dev = device.split('/')[-1] if action is not None and action == "add": - print "Medium found in", self.getUserfriendlyDeviceName(dev) - harddiskmanager.addHotplugPartition(dev, self.getUserfriendlyDeviceName(physdevpath)) + harddiskmanager.addHotplugPartition(dev, physdevpath) elif action is not None and action == "remove": harddiskmanager.removeHotplugPartition(dev) elif media_state is not None: if media_state == '1': harddiskmanager.removeHotplugPartition(dev) - harddiskmanager.addHotplugPartition(dev, self.getUserfriendlyDeviceName(physdevpath)) + harddiskmanager.addHotplugPartition(dev, physdevpath) elif media_state == '0': harddiskmanager.removeHotplugPartition(dev) -- cgit v1.2.3 From 0621e74942fa09f300e8b63d5e586db4575ba180 Mon Sep 17 00:00:00 2001 From: ghost Date: Mon, 19 Jan 2009 11:12:54 +0100 Subject: use OSError instead of IOError and small fix for sr devices --- lib/python/Components/Harddisk.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/Harddisk.py b/lib/python/Components/Harddisk.py index 8e30a512..d739e984 100644 --- a/lib/python/Components/Harddisk.py +++ b/lib/python/Components/Harddisk.py @@ -351,12 +351,15 @@ class HarddiskManager: def addHotplugPartition(self, device, physdev = None): if not physdev: dev, part = self.splitDeviceName(device) - physdev = dev try: - import os - physdev = os.readlink("/sys/block/" + dev + "/device")[6:] - except IOError: - print "couldn't determine blockdev physdev for device", dev + physdev = readlink("/sys/block/" + dev + "/device")[6:] + except OSError: + print "couldn't determine blockdev physdev for device", dev, "try", device, "now" + try: + physdev = readlink("/sys/block/" + device + "/device")[6:] + except OSError: + physdev = dev + print "couldn't determine blockdev physdev for device", device # device is the device name, without /dev # physdev is the physical device path, which we (might) use to determine the userfriendly name -- cgit v1.2.3 From a2f2b1a1523b784e70cf3bd9a74b4cc5cfdbb3de Mon Sep 17 00:00:00 2001 From: ghost Date: Mon, 19 Jan 2009 13:24:54 +0100 Subject: add unicable support (thx to adenin) --- lib/dvb/frontend.cpp | 43 ++++ lib/dvb/frontend.h | 4 + lib/dvb/sec.cpp | 378 +++++++++++++++++++++++------------- lib/dvb/sec.h | 24 +++ lib/python/Components/NimManager.py | 183 ++++++++++++++++- lib/python/Screens/Satconfig.py | 76 ++++++-- 6 files changed, 545 insertions(+), 163 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/dvb/frontend.cpp b/lib/dvb/frontend.cpp index 284844dc..aae7bbc2 100644 --- a/lib/dvb/frontend.cpp +++ b/lib/dvb/frontend.cpp @@ -587,6 +587,10 @@ int eDVBFrontend::closeFrontend(bool force) if (m_fd >= 0) { eDebugNoSimulate("close frontend %d", m_dvbid); + if (m_data[SATCR] != -1) + { + turnOffSatCR(m_data[SATCR]); + } setTone(iDVBFrontend::toneOff); setVoltage(iDVBFrontend::voltageOff); m_tuneTimer->stop(); @@ -2552,3 +2556,42 @@ arg_error: "eDVBFrontend::setSlotInfo must get a tuple with first param slotid, second param slot description and third param enabled boolean"); return false; } + +RESULT eDVBFrontend::turnOffSatCR(int satcr) +{ + eSecCommandList sec_sequence; + // check if voltage is disabled + eSecCommand::pair compare; + compare.steps = +9; //nothing to do + compare.voltage = iDVBFrontend::voltageOff; + sec_sequence.push_back( eSecCommand(eSecCommand::IF_NOT_VOLTAGE_GOTO, compare) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage13) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50 ) ); + + sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage18_5) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, iDVBFrontend::toneOff) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 250) ); + + eDVBDiseqcCommand diseqc; + memset(diseqc.data, 0, MAX_DISEQC_LENGTH); + diseqc.len = 5; + diseqc.data[0] = 0xE0; + diseqc.data[1] = 0x10; + diseqc.data[2] = 0x5A; + diseqc.data[3] = satcr << 5; + diseqc.data[4] = 0x00; + + sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50+20+14*diseqc.len) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage13) ); + setSecSequence(sec_sequence); + return 0; +} + +RESULT eDVBFrontend::ScanSatCR() +{ + setFrontend(); + usleep(20000); + setTone(iDVBFrontend::toneOff); + return 0; +} diff --git a/lib/dvb/frontend.h b/lib/dvb/frontend.h index 6e272aca..81334886 100644 --- a/lib/dvb/frontend.h +++ b/lib/dvb/frontend.h @@ -63,6 +63,7 @@ public: FREQ_OFFSET, // current frequency offset CUR_VOLTAGE, // current voltage CUR_TONE, // current continuous tone + SATCR, // current SatCR NUM_DATA_ENTRIES }; Signal1 m_stateChanged; @@ -142,6 +143,9 @@ public: int closeFrontend(bool force=false); const char *getDescription() const { return m_description; } bool is_simulate() const { return m_simulate; } + + RESULT turnOffSatCR(int satcr); + RESULT ScanSatCR(); }; #endif // SWIG diff --git a/lib/dvb/sec.cpp b/lib/dvb/sec.cpp index da2439f9..6f64cf56 100644 --- a/lib/dvb/sec.cpp +++ b/lib/dvb/sec.cpp @@ -305,10 +305,16 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA lnb_param.m_satellites.find(sat.orbital_position); if ( sit != lnb_param.m_satellites.end()) { + eSecCommandList sec_sequence; + + lnb_param.guard_offset = 0; //HACK + + frontend.setData(eDVBFrontend::SATCR, lnb_param.SatCR_idx); + eDVBSatelliteSwitchParameters &sw_param = sit->second; bool doSetFrontend = true; bool doSetVoltageToneFrontend = true; - bool sendDiSEqC = false; + bool forceStaticMode = true; bool forceChanged = false; bool needDiSEqCReset = false; long band=0, @@ -367,35 +373,54 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA if ( sat.frequency > lnb_param.m_lof_threshold ) band |= 1; - - if (band&1) - parm.FREQUENCY = sat.frequency - lnb_param.m_lof_hi; - else - parm.FREQUENCY = sat.frequency - lnb_param.m_lof_lo; - - parm.FREQUENCY = abs(parm.FREQUENCY); - - frontend.setData(eDVBFrontend::FREQ_OFFSET, sat.frequency - parm.FREQUENCY); - if (!(sat.polarisation & eDVBFrontendParametersSatellite::Polarisation::Vertical)) band |= 2; - if ( voltage_mode == eDVBSatelliteSwitchParameters::_14V - || ( sat.polarisation & eDVBFrontendParametersSatellite::Polarisation::Vertical - && voltage_mode == eDVBSatelliteSwitchParameters::HV ) ) - voltage = VOLTAGE(13); - else if ( voltage_mode == eDVBSatelliteSwitchParameters::_18V - || ( !(sat.polarisation & eDVBFrontendParametersSatellite::Polarisation::Vertical) - && voltage_mode == eDVBSatelliteSwitchParameters::HV ) ) - voltage = VOLTAGE(18); - if ( (sw_param.m_22khz_signal == eDVBSatelliteSwitchParameters::ON) - || ( sw_param.m_22khz_signal == eDVBSatelliteSwitchParameters::HILO && (band&1) ) ) - tone = iDVBFrontend::toneOn; - else if ( (sw_param.m_22khz_signal == eDVBSatelliteSwitchParameters::OFF) - || ( sw_param.m_22khz_signal == eDVBSatelliteSwitchParameters::HILO && !(band&1) ) ) - tone = iDVBFrontend::toneOff; + int lof = (band&1)?lnb_param.m_lof_hi:lnb_param.m_lof_lo; + + int local=0; - eSecCommandList sec_sequence; + + if(lnb_param.SatCR_idx == -1) + { + // calc Frequency + local = abs(sat.frequency + - ((lof - (lof % 1000)) + ((lof % 1000)>500 ? 1000 : 0)) ); //TODO fr den Mist mal ein Macro schreiben + parm.FREQUENCY = (local - (local % 125)) + ((local % 125)>62 ? 125 : 0); + frontend.setData(eDVBFrontend::FREQ_OFFSET, sat.frequency - parm.FREQUENCY); + + if ( voltage_mode == eDVBSatelliteSwitchParameters::_14V + || ( sat.polarisation & eDVBFrontendParametersSatellite::Polarisation::Vertical + && voltage_mode == eDVBSatelliteSwitchParameters::HV ) ) + voltage = VOLTAGE(13); + else if ( voltage_mode == eDVBSatelliteSwitchParameters::_18V + || ( !(sat.polarisation & eDVBFrontendParametersSatellite::Polarisation::Vertical) + && voltage_mode == eDVBSatelliteSwitchParameters::HV ) ) + voltage = VOLTAGE(18); + if ( (sw_param.m_22khz_signal == eDVBSatelliteSwitchParameters::ON) + || ( sw_param.m_22khz_signal == eDVBSatelliteSwitchParameters::HILO && (band&1) ) ) + tone = iDVBFrontend::toneOn; + else if ( (sw_param.m_22khz_signal == eDVBSatelliteSwitchParameters::OFF) + || ( sw_param.m_22khz_signal == eDVBSatelliteSwitchParameters::HILO && !(band&1) ) ) + tone = iDVBFrontend::toneOff; + } + else + { + unsigned int tmp = abs(sat.frequency + - ((lof - (lof % 1000)) + ((lof % 1000)>500 ? 1000 : 0)) ) + + lnb_param.SatCRvco + - 1400000 + + lnb_param.guard_offset; + parm.FREQUENCY = (lnb_param.SatCRvco - (tmp % 4000))+((tmp%4000)>2000?4000:0)+lnb_param.guard_offset; + lnb_param.UnicableTuningWord = (((tmp / 4000)+((tmp%4000)>2000?1:0)) + | ((band & 1) ? 0x400 : 0) //HighLow + | ((band & 2) ? 0x800 : 0) //VertHor + | ((lnb_param.LNBNum & 1) ? 0 : 0x1000) //Umschaltung LNB1 LNB2 + | (lnb_param.SatCR_idx << 13)); //Adresse des SatCR + eDebug("[prepare] UnicableTuningWord %#04x",lnb_param.UnicableTuningWord); + eDebug("[prepare] guard_offset %d",lnb_param.guard_offset); + frontend.setData(eDVBFrontend::FREQ_OFFSET, sat.frequency - ((lnb_param.UnicableTuningWord & 0x3FF) *4000 + 1400000 - lnb_param.SatCRvco + lof)); + } if (diseqc_mode >= eDVBSatelliteDiseqcParameters::V1_0) { @@ -668,14 +693,13 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA if (di_param.m_seq_repeat && seq_repeat == 0) sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_BEFORE_SEQUENCE_REPEAT]) ); } - sendDiSEqC = true; } eDebugNoSimulate("RotorCmd %02x, lastRotorCmd %02lx", RotorCmd, lastRotorCmd); if ( RotorCmd != -1 && RotorCmd != lastRotorCmd ) { eSecCommand::pair compare; - if (!send_mask) + if (!send_mask && lnb_param.SatCR_idx == -1) { compare.steps = +3; compare.tone = iDVBFrontend::toneOff; @@ -729,112 +753,113 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA diseqc.data[3] = RotorCmd; diseqc.data[4] = 0x00; } - - if ( rotor_param.m_inputpower_parameters.m_use ) - { // use measure rotor input power to detect rotor state - bool turn_fast = need_turn_fast(rotor_param.m_inputpower_parameters.m_turning_speed); - eSecCommand::rotor cmd; - eSecCommand::pair compare; - if (turn_fast) - compare.voltage = VOLTAGE(18); + if(lnb_param.SatCR_idx == -1) + { + if ( rotor_param.m_inputpower_parameters.m_use ) + { // use measure rotor input power to detect rotor state + bool turn_fast = need_turn_fast(rotor_param.m_inputpower_parameters.m_turning_speed); + eSecCommand::rotor cmd; + eSecCommand::pair compare; + if (turn_fast) + compare.voltage = VOLTAGE(18); + else + compare.voltage = VOLTAGE(13); + compare.steps = +3; + sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, compare.voltage) ); + // measure idle power values + compare.steps = -2; + if (turn_fast) { + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_MEASURE_IDLE_INPUTPOWER]) ); // wait 150msec after voltage change + sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_IDLE_INPUTPOWER, 1) ); + compare.val = 1; + sec_sequence.push_back( eSecCommand(eSecCommand::IF_MEASURE_IDLE_WAS_NOT_OK_GOTO, compare) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(13)) ); + } + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_MEASURE_IDLE_INPUTPOWER]) ); // wait 150msec before measure + sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_IDLE_INPUTPOWER, 0) ); + compare.val = 0; + sec_sequence.push_back( eSecCommand(eSecCommand::IF_MEASURE_IDLE_WAS_NOT_OK_GOTO, compare) ); + //////////////////////////// + sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_DISEQC_RETRYS, m_params[MOTOR_COMMAND_RETRIES]) ); // 2 retries + sec_sequence.push_back( eSecCommand(eSecCommand::INVALIDATE_CURRENT_ROTORPARMS) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, 40) ); // 2 seconds rotor start timout + // rotor start loop + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) ); // 50msec delay + sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_RUNNING_INPUTPOWER) ); + cmd.direction=1; // check for running rotor + cmd.deltaA=rotor_param.m_inputpower_parameters.m_delta; + cmd.steps=+5; + cmd.okcount=0; + sec_sequence.push_back( eSecCommand(eSecCommand::IF_INPUTPOWER_DELTA_GOTO, cmd ) ); // check if rotor has started + sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +2 ) ); // timeout .. we assume now the rotor is already at the correct position + sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -4) ); // goto loop start + sec_sequence.push_back( eSecCommand(eSecCommand::IF_NO_MORE_ROTOR_DISEQC_RETRYS_GOTO, turn_fast ? 10 : 9 ) ); // timeout .. we assume now the rotor is already at the correct position + sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -8) ); // goto loop start + //////////////////// + sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_MOVING) ); + if (turn_fast) + sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(18)) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, m_params[MOTOR_RUNNING_TIMEOUT]*20) ); // 2 minutes running timeout + // rotor running loop + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) ); // wait 50msec + sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_RUNNING_INPUTPOWER) ); + cmd.direction=0; // check for stopped rotor + cmd.steps=+3; + sec_sequence.push_back( eSecCommand(eSecCommand::IF_INPUTPOWER_DELTA_GOTO, cmd ) ); + sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +2 ) ); // timeout ? this should never happen + sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -4) ); // running loop start + ///////////////////// + sec_sequence.push_back( eSecCommand(eSecCommand::UPDATE_CURRENT_ROTORPARAMS) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_STOPPED) ); + } else + { // use normal turning mode + doSetVoltageToneFrontend=false; + doSetFrontend=false; + eSecCommand::rotor cmd; + eSecCommand::pair compare; compare.voltage = VOLTAGE(13); - compare.steps = +3; - sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, compare.voltage) ); -// measure idle power values - compare.steps = -2; - if (turn_fast) { - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_MEASURE_IDLE_INPUTPOWER]) ); // wait 150msec after voltage change - sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_IDLE_INPUTPOWER, 1) ); - compare.val = 1; - sec_sequence.push_back( eSecCommand(eSecCommand::IF_MEASURE_IDLE_WAS_NOT_OK_GOTO, compare) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(13)) ); + compare.steps = +3; + sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, compare.voltage) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_MOTOR_CMD]) ); // wait 150msec after voltage change + + sec_sequence.push_back( eSecCommand(eSecCommand::INVALIDATE_CURRENT_ROTORPARMS) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_MOVING) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) ); + + compare.voltage = voltage; + compare.steps = +3; + sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) ); // correct final voltage? + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 2000) ); // wait 2 second before set high voltage + sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, voltage) ); + + compare.tone = tone; + sec_sequence.push_back( eSecCommand(eSecCommand::IF_TONE_GOTO, compare) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, tone) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_CONT_TONE]) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND) ); + + cmd.direction=1; // check for running rotor + cmd.deltaA=0; + cmd.steps=+3; + cmd.okcount=0; + sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, m_params[MOTOR_RUNNING_TIMEOUT]*4) ); // 2 minutes running timeout + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 250) ); // 250msec delay + sec_sequence.push_back( eSecCommand(eSecCommand::IF_TUNER_LOCKED_GOTO, cmd ) ); + sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +3 ) ); + sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -3) ); // goto loop start + sec_sequence.push_back( eSecCommand(eSecCommand::UPDATE_CURRENT_ROTORPARAMS) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_STOPPED) ); + sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, +3) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND) ); + sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -4) ); } - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_MEASURE_IDLE_INPUTPOWER]) ); // wait 150msec before measure - sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_IDLE_INPUTPOWER, 0) ); - compare.val = 0; - sec_sequence.push_back( eSecCommand(eSecCommand::IF_MEASURE_IDLE_WAS_NOT_OK_GOTO, compare) ); -//////////////////////////// - sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_DISEQC_RETRYS, m_params[MOTOR_COMMAND_RETRIES]) ); // 2 retries - sec_sequence.push_back( eSecCommand(eSecCommand::INVALIDATE_CURRENT_ROTORPARMS) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, 40) ); // 2 seconds rotor start timout -// rotor start loop - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) ); // 50msec delay - sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_RUNNING_INPUTPOWER) ); - cmd.direction=1; // check for running rotor - cmd.deltaA=rotor_param.m_inputpower_parameters.m_delta; - cmd.steps=+5; - cmd.okcount=0; - sec_sequence.push_back( eSecCommand(eSecCommand::IF_INPUTPOWER_DELTA_GOTO, cmd ) ); // check if rotor has started - sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +2 ) ); // timeout .. we assume now the rotor is already at the correct position - sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -4) ); // goto loop start - sec_sequence.push_back( eSecCommand(eSecCommand::IF_NO_MORE_ROTOR_DISEQC_RETRYS_GOTO, turn_fast ? 10 : 9 ) ); // timeout .. we assume now the rotor is already at the correct position - sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -8) ); // goto loop start -//////////////////// - sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_MOVING) ); - if (turn_fast) - sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(18)) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, m_params[MOTOR_RUNNING_TIMEOUT]*20) ); // 2 minutes running timeout -// rotor running loop - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) ); // wait 50msec - sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_RUNNING_INPUTPOWER) ); - cmd.direction=0; // check for stopped rotor - cmd.steps=+3; - sec_sequence.push_back( eSecCommand(eSecCommand::IF_INPUTPOWER_DELTA_GOTO, cmd ) ); - sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +2 ) ); // timeout ? this should never happen - sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -4) ); // running loop start -///////////////////// - sec_sequence.push_back( eSecCommand(eSecCommand::UPDATE_CURRENT_ROTORPARAMS) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_STOPPED) ); - } - else - { // use normal turning mode - doSetVoltageToneFrontend=false; - doSetFrontend=false; - eSecCommand::rotor cmd; - eSecCommand::pair compare; - compare.voltage = VOLTAGE(13); - compare.steps = +3; - sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, compare.voltage) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_MOTOR_CMD]) ); // wait 150msec after voltage change - - sec_sequence.push_back( eSecCommand(eSecCommand::INVALIDATE_CURRENT_ROTORPARMS) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_MOVING) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) ); - - compare.voltage = voltage; - compare.steps = +3; - sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) ); // correct final voltage? - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 2000) ); // wait 2 second before set high voltage - sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, voltage) ); - - compare.tone = tone; - sec_sequence.push_back( eSecCommand(eSecCommand::IF_TONE_GOTO, compare) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, tone) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_CONT_TONE]) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND) ); - - cmd.direction=1; // check for running rotor - cmd.deltaA=0; - cmd.steps=+3; - cmd.okcount=0; - sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, m_params[MOTOR_RUNNING_TIMEOUT]*4) ); // 2 minutes running timeout - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 250) ); // 250msec delay - sec_sequence.push_back( eSecCommand(eSecCommand::IF_TUNER_LOCKED_GOTO, cmd ) ); - sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +3 ) ); - sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -3) ); // goto loop start - sec_sequence.push_back( eSecCommand(eSecCommand::UPDATE_CURRENT_ROTORPARAMS) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_STOPPED) ); - sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, +3) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND) ); - sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -4) ); } sec_fe->setData(eDVBFrontend::NEW_ROTOR_CMD, RotorCmd); sec_fe->setData(eDVBFrontend::NEW_ROTOR_POS, sat.orbital_position); - sendDiSEqC = true; } } } @@ -844,14 +869,11 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA csw = band; } -// if (sendDiSEqC) - sec_sequence.push_front( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeStatic) ); - sec_fe->setData(eDVBFrontend::NEW_CSW, csw); sec_fe->setData(eDVBFrontend::NEW_UCSW, ucsw); sec_fe->setData(eDVBFrontend::NEW_TONEBURST, di_param.m_toneburst_param); - if (doSetVoltageToneFrontend) + if ((doSetVoltageToneFrontend) && (lnb_param.SatCR_idx == -1)) { eSecCommand::pair compare; compare.voltage = voltage; @@ -867,16 +889,45 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA sec_sequence.push_back( eSecCommand(eSecCommand::UPDATE_CURRENT_SWITCHPARMS) ); + if(lnb_param.SatCR_idx != -1) + { + // check if voltage is disabled + eSecCommand::pair compare; + compare.steps = +3; + compare.voltage = iDVBFrontend::voltageOff; + sec_sequence.push_back( eSecCommand(eSecCommand::IF_NOT_VOLTAGE_GOTO, compare) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage13) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50 ) ); + + sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage18_5) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, iDVBFrontend::toneOff) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_MOTOR_CMD]) ); // wait 150msec after voltage change + + eDVBDiseqcCommand diseqc; + memset(diseqc.data, 0, MAX_DISEQC_LENGTH); + diseqc.len = 5; + diseqc.data[0] = 0xE0; + diseqc.data[1] = 0x10; + diseqc.data[2] = 0x5A; + diseqc.data[3] = lnb_param.UnicableTuningWord >> 8; + diseqc.data[4] = lnb_param.UnicableTuningWord; + + sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_LAST_DISEQC_CMD]) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage13) ); + } + if (doSetFrontend) { sec_sequence.push_back( eSecCommand(eSecCommand::START_TUNE_TIMEOUT, tunetimeout) ); sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND) ); } - -// if (sendDiSEqC) - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeDynamic) ); - + + if (forceStaticMode) + { + sec_sequence.push_front( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeStatic) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeDynamic) ); + } frontend.setSecSequence(sec_sequence); return 0; @@ -928,6 +979,7 @@ RESULT eDVBSatelliteEquipmentControl::clear() it->m_frontend->setData(eDVBFrontend::LINKED_NEXT_PTR, -1); it->m_frontend->setData(eDVBFrontend::ROTOR_POS, -1); it->m_frontend->setData(eDVBFrontend::ROTOR_CMD, -1); + it->m_frontend->setData(eDVBFrontend::SATCR, -1); } for (eSmartPtrList::iterator it(m_avail_simulate_frontends.begin()); it != m_avail_simulate_frontends.end(); ++it) @@ -937,6 +989,7 @@ RESULT eDVBSatelliteEquipmentControl::clear() it->m_frontend->setData(eDVBFrontend::LINKED_NEXT_PTR, -1); it->m_frontend->setData(eDVBFrontend::ROTOR_POS, -1); it->m_frontend->setData(eDVBFrontend::ROTOR_CMD, -1); + it->m_frontend->setData(eDVBFrontend::SATCR, -1); } return 0; @@ -1016,6 +1069,17 @@ RESULT eDVBSatelliteEquipmentControl::setLNBPrio(int prio) return 0; } +RESULT eDVBSatelliteEquipmentControl::setLNBNum(int LNBNum) +{ + eSecDebug("eDVBSatelliteEquipmentControl::setLNBNum(%d)", LNBNum); + if(!((LNBNum >= 1) && (LNBNum <= MAX_LNBNUM))) + return -EPERM; + if ( currentLNBValid() ) + m_lnbs[m_lnbidx].LNBNum = LNBNum; + else + return -ENOENT; + return 0; +} /* DiSEqC Specific Parameters */ RESULT eDVBSatelliteEquipmentControl::setDiSEqCMode(int diseqcmode) @@ -1159,6 +1223,46 @@ RESULT eDVBSatelliteEquipmentControl::setInputpowerDelta(int delta) return 0; } +/* Unicable Specific Parameters */ +RESULT eDVBSatelliteEquipmentControl::setLNBSatCR(int SatCR_idx) +{ + eSecDebug("eDVBSatelliteEquipmentControl::setLNBSatCR(%d)", SatCR_idx); + if(!((SatCR_idx >=-1) && (SatCR_idx < MAX_SATCR))) + return -EPERM; + if ( currentLNBValid() ) + m_lnbs[m_lnbidx].SatCR_idx = SatCR_idx; + else + return -ENOENT; + return 0; +} + +RESULT eDVBSatelliteEquipmentControl::setLNBSatCRvco(int SatCRvco) +{ + eSecDebug("eDVBSatelliteEquipmentControl::setLNBSatCRvco(%d)", SatCRvco); + if(!((SatCRvco >= 950*1000) && (SatCRvco <= 2150*1000))) + return -EPERM; + if(!((m_lnbs[m_lnbidx].SatCR_idx >= 0) && (m_lnbs[m_lnbidx].SatCR_idx < MAX_SATCR))) + return -ENOENT; + if ( currentLNBValid() ) + m_lnbs[m_lnbidx].SatCRvco = SatCRvco; + else + return -ENOENT; + return 0; +} +RESULT eDVBSatelliteEquipmentControl::getLNBSatCR() +{ + if ( currentLNBValid() ) + return m_lnbs[m_lnbidx].SatCR_idx; + return -ENOENT; +} + +RESULT eDVBSatelliteEquipmentControl::getLNBSatCRvco() +{ + if ( currentLNBValid() ) + return m_lnbs[m_lnbidx].SatCRvco; + return -ENOENT; +} + /* Satellite Specific Parameters */ RESULT eDVBSatelliteEquipmentControl::addSatellite(int orbital_position) { diff --git a/lib/dvb/sec.h b/lib/dvb/sec.h index 2efd0b49..5bff6bf7 100644 --- a/lib/dvb/sec.h +++ b/lib/dvb/sec.h @@ -245,6 +245,23 @@ public: int m_prio; // to override automatic tuner management ... -1 is Auto #endif +public: +#define guard_offset_min -8000 +#define guard_offset_max 8000 +#define guard_offset_step 8000 +#define MAX_SATCR 8 +#define MAX_LNBNUM 32 + + int SatCR_idx; + unsigned int SatCRvco; + unsigned int UnicableTuningWord; + unsigned int UnicableConfigWord; + int old_frequency; + int old_polarisation; + int old_orbital_position; + int guard_offset_old; + int guard_offset; + int LNBNum; }; class eDVBRegisteredFrontend; @@ -307,6 +324,7 @@ public: RESULT setLNBThreshold(int threshold); RESULT setLNBIncreasedVoltage(bool onoff); RESULT setLNBPrio(int prio); + RESULT setLNBNum(int LNBNum); /* DiSEqC Specific Parameters */ RESULT setDiSEqCMode(int diseqcmode); RESULT setToneburst(int toneburst); @@ -324,6 +342,12 @@ public: RESULT setUseInputpower(bool onoff); RESULT setInputpowerDelta(int delta); // delta between running and stopped rotor RESULT setRotorTurningSpeed(int speed); // set turning speed.. +/* Unicable Specific Parameters */ + RESULT setLNBSatCR(int SatCR_idx); + RESULT setLNBSatCRvco(int SatCRvco); +// RESULT checkGuardOffset(const eDVBFrontendParametersSatellite &sat); + RESULT getLNBSatCR(); + RESULT getLNBSatCRvco(); /* Satellite Specific Parameters */ RESULT addSatellite(int orbital_position); RESULT setVoltageMode(int mode); diff --git a/lib/python/Components/NimManager.py b/lib/python/Components/NimManager.py index 168962e9..1fcbda1a 100644 --- a/lib/python/Components/NimManager.py +++ b/lib/python/Components/NimManager.py @@ -51,6 +51,8 @@ class SecConfigure: elif self.linked.has_key(slotid): for slot in self.linked[slotid]: tunermask |= (1 << slot) + sec.setLNBSatCR(-1) + sec.setLNBNum(1) sec.setLNBLOFL(9750000) sec.setLNBLOFH(10600000) sec.setLNBThreshold(11700000) @@ -255,6 +257,9 @@ class SecConfigure: currLnb = config.Nims[slotid].advanced.lnb[x] sec.addLNB() + if x < 33: + sec.setLNBNum(x) + tunermask = 1 << slotid if self.equal.has_key(slotid): for slot in self.equal[slotid]: @@ -263,10 +268,32 @@ class SecConfigure: for slot in self.linked[slotid]: tunermask |= (1 << slot) + if currLnb.lof.value != "unicable": + sec.setLNBSatCR(-1) + if currLnb.lof.value == "universal_lnb": sec.setLNBLOFL(9750000) sec.setLNBLOFH(10600000) sec.setLNBThreshold(11700000) + elif currLnb.lof.value == "unicable": + sec.setLNBLOFL(9750000) + sec.setLNBLOFH(10600000) + sec.setLNBThreshold(11700000) + if currLnb.unicable.value == "unicable_user": + sec.setLNBSatCR(currLnb.satcruser.index) + sec.setLNBSatCRvco(currLnb.satcrvcouser[currLnb.satcruser.index].value*1000) + elif currLnb.unicable.value == "unicable_matrix": + manufacturer_name = currLnb.unicableMatrixManufacturer.value + manufacturer = currLnb.unicableMatrix[manufacturer_name] + product_name = manufacturer.product.value + sec.setLNBSatCR(manufacturer.scr[product_name].index) + sec.setLNBSatCRvco(manufacturer.vco[product_name][manufacturer.scr[product_name].index].value*1000) + elif currLnb.unicable.value == "unicable_lnb": + manufacturer_name = currLnb.unicableMatrixManufacturer.value + manufacturer = currLnb.unicableMatrix[manufacturer_name] + product_name = manufacturer.product.value + sec.setLNBSatCR(manufacturer.scr[product_name].index) + sec.setLNBSatCRvco(manufacturer.vco[product_name][manufacturer.scr[product_name].index].value*1000) elif currLnb.lof.value == "c_band": sec.setLNBLOFL(5150000) sec.setLNBLOFH(5150000) @@ -892,6 +919,129 @@ def InitNimManager(nimmgr): for x in range(len(nimmgr.nim_slots)): config.Nims.append(ConfigSubsection()) + lnb_choices = { + "universal_lnb": _("Universal LNB"), + "unicable": _("Unicable"), + "c_band": _("C-Band"), + "user_defined": _("User defined")} + lnb_choices_default = "universal_lnb" + + unicablelnbproducts = { + "Humax": {"150 SCR":["1210","1420","1680","2040"]}, + "Inverto": {"IDLP-40UNIQD+S":["1680","1420","2040","1210"]}, + "Kathrein": {"UAS481":["1400","1516","1632","1748"]}, + "Kreiling": {"KR1440":["1680","1420","2040","1210"]}, + "Radix": {"Unicable LNB":["1680","1420","2040","1210"]}, + "Wisi": {"OC 05":["1210","1420","1680","2040"]}} + UnicableLnbManufacturers = unicablelnbproducts.keys() + UnicableLnbManufacturers.sort() + + unicablematrixproducts = { + "Ankaro": { + "UCS 51440":["1400","1632","1284","1516"], + "UCS 51820":["1400","1632","1284","1516","1864","2096","1748","1980"], + "UCS 51840":["1400","1632","1284","1516","1864","2096","1748","1980"], + "UCS 52240":["1400","1632"], + "UCS 52420":["1400","1632","1284","1516"], + "UCS 52440":["1400","1632","1284","1516"], + "UCS 91440":["1400","1632","1284","1516"], + "UCS 91820":["1400","1632","1284","1516","1864","2096","1748","1980"], + "UCS 91840":["1400","1632","1284","1516","1864","2096","1748","1980"], + "UCS 92240":["1400","1632"], + "UCS 92420":["1400","1632","1284","1516"], + "UCS 92440":["1400","1632","1284","1516"]}, + "DCT Delta": { + "SUM518":["1284","1400","1516","1632","1748","1864","1980","2096"], + "SUM918":["1284","1400","1516","1632","1748","1864","1980","2096"], + "SUM928":["1284","1400","1516","1632","1748","1864","1980","2096"]}, + "Inverto": { + "IDLP-UST11O-CUO1O-8PP":["1076","1178","1280","1382","1484","1586","1688","1790"]}, + "Kathrein": { + "EXR501":["1400","1516","1632","1748"], + "EXR551":["1400","1516","1632","1748"], + "EXR552":["1400","1516"]}, + "ROTEK": { + "EKL2/1":["1400","1516"], + "EKL2/1E":["0","0","1632","1748"]}, + "Smart": { + "DPA 51":["1284","1400","1516","1632","1748","1864","1980","2096"]}, + "Technisat": { + "TechniRouter 5/1x8 G":["1284","1400","1516","1632","1748","1864","1980","2096"], + "TechniRouter 5/1x8 K":["1284","1400","1516","1632","1748","1864","1980","2096"], + "TechniRouter 5/2x4 G":["1284","1400","1516","1632"], + "TechniRouter 5/2x4 K":["1284","1400","1516","1632"]}, + "Telstar": { + "SCR 5/1x8 G":["1284","1400","1516","1632","1748","1864","1980","2096"], + "SCR 5/1x8 K":["1284","1400","1516","1632","1748","1864","1980","2096"], + "SCR 5/2x4 G":["1284","1400","1516","1632"], + "SCR 5/2x4 K":["1284","1400","1516","1632"]}} + UnicableMatrixManufacturers = unicablematrixproducts.keys() + UnicableMatrixManufacturers.sort() + + unicable_choices = { + "unicable_lnb": _("Unicable LNB"), + "unicable_matrix": _("Unicable Martix"), + "unicable_user": "Unicable "+_("User defined")} + unicable_choices_default = "unicable_lnb" + + unicableLnb = ConfigSubDict() + for y in unicablelnbproducts: + products = unicablelnbproducts[y].keys() + products.sort() + unicableLnb[y] = ConfigSubsection() + unicableLnb[y].product = ConfigSelection(choices = products, default = products[0]) + unicableLnb[y].scr = ConfigSubDict() + unicableLnb[y].vco = ConfigSubDict() + for z in products: + scrlist = [] + vcolist = unicablelnbproducts[y][z] + unicableLnb[y].vco[z] = ConfigSubList() + for cnt in range(1,1+len(vcolist)): + scrlist.append(("%d" %cnt,"SCR %d" %cnt)) + vcofreq = int(vcolist[cnt-1]) + unicableLnb[y].vco[z].append(ConfigInteger(default=vcofreq, limits = (vcofreq, vcofreq))) + unicableLnb[y].scr[z] = ConfigSelection(choices = scrlist, default = scrlist[0][0]) + + unicableMatrix = ConfigSubDict() + + for y in unicablematrixproducts: + products = unicablematrixproducts[y].keys() + products.sort() + unicableMatrix[y] = ConfigSubsection() + unicableMatrix[y].product = ConfigSelection(choices = products, default = products[0]) + unicableMatrix[y].scr = ConfigSubDict() + unicableMatrix[y].vco = ConfigSubDict() + for z in products: + scrlist = [] + vcolist = unicablematrixproducts[y][z] + unicableMatrix[y].vco[z] = ConfigSubList() + for cnt in range(1,1+len(vcolist)): + vcofreq = int(vcolist[cnt-1]) + if vcofreq == 0: + scrlist.append(("%d" %cnt,"SCR %d " %cnt +_("not used"))) + else: + scrlist.append(("%d" %cnt,"SCR %d" %cnt)) + unicableMatrix[y].vco[z].append(ConfigInteger(default=vcofreq, limits = (vcofreq, vcofreq))) + unicableMatrix[y].scr[z] = ConfigSelection(choices = scrlist, default = scrlist[0][0]) + + satcrvcouser = ConfigSubList() + satcrvcouser.append(ConfigInteger(default=1284, limits = (0, 9999))) + satcrvcouser.append(ConfigInteger(default=1400, limits = (0, 9999))) + satcrvcouser.append(ConfigInteger(default=1516, limits = (0, 9999))) + satcrvcouser.append(ConfigInteger(default=1632, limits = (0, 9999))) + satcrvcouser.append(ConfigInteger(default=1748, limits = (0, 9999))) + satcrvcouser.append(ConfigInteger(default=1864, limits = (0, 9999))) + satcrvcouser.append(ConfigInteger(default=1980, limits = (0, 9999))) + satcrvcouser.append(ConfigInteger(default=2096, limits = (0, 9999))) + + prio_list = [ ("-1", _("Auto")) ] + for prio in range(65): + prio_list.append((str(prio), str(prio))) + for prio in range(14000,14065): + prio_list.append((str(prio), str(prio))) + for prio in range(19000,19065): + prio_list.append((str(prio), str(prio))) + for slot in nimmgr.nim_slots: x = slot.slot nim = config.Nims[x] @@ -990,12 +1140,36 @@ def InitNimManager(nimmgr): nim.advanced.lnb = ConfigSubList() nim.advanced.lnb.append(ConfigNothing()) + + for x in range(1, 37): nim.advanced.lnb.append(ConfigSubsection()) - nim.advanced.lnb[x].lof = ConfigSelection(choices={"universal_lnb": _("Universal LNB"), "c_band": _("C-Band"), "user_defined": _("User defined")}, default="universal_lnb") + nim.advanced.lnb[x].lof = ConfigSelection(choices = lnb_choices, default = lnb_choices_default) + nim.advanced.lnb[x].lofl = ConfigInteger(default=9750, limits = (0, 99999)) nim.advanced.lnb[x].lofh = ConfigInteger(default=10600, limits = (0, 99999)) nim.advanced.lnb[x].threshold = ConfigInteger(default=11700, limits = (0, 99999)) + + nim.advanced.lnb[x].unicable = ConfigSelection(choices = unicable_choices, default = unicable_choices_default) + + nim.advanced.lnb[x].unicableLnb = unicableLnb + nim.advanced.lnb[x].unicableLnbManufacturer = ConfigSelection(choices = UnicableLnbManufacturers, default = UnicableLnbManufacturers[0]) + + nim.advanced.lnb[x].unicableMatrix = unicableMatrix + nim.advanced.lnb[x].unicableMatrixManufacturer = ConfigSelection(choices = UnicableMatrixManufacturers, default = UnicableMatrixManufacturers[0]) + + nim.advanced.lnb[x].satcruser = ConfigSelection(choices=[ + ("1", "SatCR 1"), + ("2", "SatCR 2"), + ("3", "SatCR 3"), + ("4", "SatCR 4"), + ("5", "SatCR 5"), + ("6", "SatCR 6"), + ("7", "SatCR 7"), + ("8", "SatCR 8")], + default="1") + nim.advanced.lnb[x].satcrvcouser = satcrvcouser + # nim.advanced.lnb[x].output_12v = ConfigSelection(choices = [("0V", _("0 V")), ("12V", _("12 V"))], default="0V") nim.advanced.lnb[x].increased_voltage = ConfigYesNo(default=False) nim.advanced.lnb[x].toneburst = ConfigSelection(choices = [("none", _("None")), ("A", _("A")), ("B", _("B"))], default = "none") @@ -1028,13 +1202,6 @@ def InitNimManager(nimmgr): nim.advanced.lnb[x].fastTurningBegin = ConfigDateTime(default=mktime(btime.timetuple()), formatstring = _("%H:%M"), increment = 600) etime = datetime(1970, 1, 1, 19, 0); nim.advanced.lnb[x].fastTurningEnd = ConfigDateTime(default=mktime(etime.timetuple()), formatstring = _("%H:%M"), increment = 600) - prio_list = [ ("-1", _("Auto")) ] - for prio in range(65): - prio_list.append((str(prio), str(prio))) - for prio in range(14000,14065): - prio_list.append((str(prio), str(prio))) - for prio in range(19000,19065): - prio_list.append((str(prio), str(prio))) nim.advanced.lnb[x].prio = ConfigSelection(default="-1", choices=prio_list) elif slot.isCompatible("DVB-C"): nim.configMode = ConfigSelection( diff --git a/lib/python/Screens/Satconfig.py b/lib/python/Screens/Satconfig.py index 320bea84..da6fcc12 100644 --- a/lib/python/Screens/Satconfig.py +++ b/lib/python/Screens/Satconfig.py @@ -87,6 +87,10 @@ class NimSetup(Screen, ConfigListScreen): self.uncommittedDiseqcCommand = None self.cableScanType = None self.have_advanced = False + self.advancedUnicable = None + self.advancedType = None + self.advancedManufacturer = None + self.advancedSCR = None if self.nim.isCompatible("DVB-S"): self.configMode = getConfigListEntry(_("Configuration Mode"), self.nimConfig.configMode) @@ -190,6 +194,7 @@ class NimSetup(Screen, ConfigListScreen): checkList = (self.configMode, self.diseqcModeEntry, self.advancedSatsEntry, \ self.advancedLnbsEntry, self.advancedDiseqcMode, self.advancedUsalsEntry, \ self.advancedLof, self.advancedPowerMeasurement, self.turningSpeed, \ + self.advancedType, self.advancedSCR, self.advancedManufacturer, self.advancedUnicable, \ self.uncommittedDiseqcCommand, self.cableScanType) for x in checkList: if self["config"].getCurrent() == x: @@ -216,19 +221,57 @@ class NimSetup(Screen, ConfigListScreen): if isinstance(currLnb, ConfigNothing): currLnb = None - self.list.append(getConfigListEntry(_("Voltage mode"), Sat.voltage)) - self.list.append(getConfigListEntry(_("Tone mode"), Sat.tonemode)) - if currLnb and currLnb.diseqcMode.value == "1_2": - if lnbnum < 33: - self.advancedUsalsEntry = getConfigListEntry(_("Use usals for this sat"), Sat.usals) - self.list.append(self.advancedUsalsEntry) - if not Sat.usals.value: - self.list.append(getConfigListEntry(_("Stored position"), Sat.rotorposition)) - # LNBs self.advancedLnbsEntry = getConfigListEntry(_("LNB"), Sat.lnb) self.list.append(self.advancedLnbsEntry) + if currLnb: + self.list.append(getConfigListEntry(_("Priority"), currLnb.prio)) + self.advancedLof = getConfigListEntry(_("LOF"), currLnb.lof) + self.list.append(self.advancedLof) + if currLnb.lof.value == "user_defined": + self.list.append(getConfigListEntry(_("LOF/L"), currLnb.lofl)) + self.list.append(getConfigListEntry(_("LOF/H"), currLnb.lofh)) + self.list.append(getConfigListEntry(_("Threshold"), currLnb.threshold)) +# self.list.append(getConfigListEntry(_("12V Output"), currLnb.output_12v)) + + if currLnb.lof.value == "unicable": + self.advancedUnicable = getConfigListEntry("Unicable "+_("Configuration Mode"), currLnb.unicable) + self.list.append(self.advancedUnicable) + if currLnb.unicable.value == "unicable_user": + self.advancedSCR = getConfigListEntry(_("Channel"), currLnb.satcruser) + self.list.append(self.advancedSCR) + self.list.append(getConfigListEntry(_("Frequency"), currLnb.satcrvcouser[currLnb.satcruser.index])) + self.list.append(getConfigListEntry(_("LOF/L"), currLnb.lofl)) + self.list.append(getConfigListEntry(_("LOF/H"), currLnb.lofh)) + self.list.append(getConfigListEntry(_("Threshold"), currLnb.threshold)) + elif currLnb.unicable.value == "unicable_matrix": + manufacturer_name = currLnb.unicableMatrixManufacturer.value + manufacturer = currLnb.unicableMatrix[manufacturer_name] + product_name = manufacturer.product.value + self.advancedManufacturer = getConfigListEntry(_("Manufacturer"), currLnb.unicableMatrixManufacturer) + self.advancedType = getConfigListEntry(_("Type"), manufacturer.product) + self.advancedSCR = getConfigListEntry(_("Channel"), manufacturer.scr[product_name]) + self.list.append(self.advancedManufacturer) + self.list.append(self.advancedType) + self.list.append(self.advancedSCR) + self.list.append(getConfigListEntry(_("Frequency"), manufacturer.vco[product_name][manufacturer.scr[product_name].index])) + elif currLnb.unicable.value == "unicable_lnb": + manufacturer_name = currLnb.unicableLnbManufacturer.value + manufacturer = currLnb.unicableLnb[manufacturer_name] + product_name = manufacturer.product.value + self.advancedManufacturer = getConfigListEntry(_("Manufacturer"), currLnb.unicableLnbManufacturer) + self.advancedType = getConfigListEntry(_("Type"), manufacturer.product) + self.advancedSCR = getConfigListEntry(_("Channel"), manufacturer.scr[product_name]) + self.list.append(self.advancedManufacturer) + self.list.append(self.advancedType) + self.list.append(self.advancedSCR) + self.list.append(getConfigListEntry(_("Frequency"), manufacturer.vco[product_name][manufacturer.scr[product_name].index])) + else: #kein Unicable + self.list.append(getConfigListEntry(_("Voltage mode"), Sat.voltage)) + self.list.append(getConfigListEntry(_("Increased voltage"), currLnb.increased_voltage)) + self.list.append(getConfigListEntry(_("Tone mode"), Sat.tonemode)) + if lnbnum < 33: self.advancedDiseqcMode = getConfigListEntry(_("DiSEqC mode"), currLnb.diseqcMode) self.list.append(self.advancedDiseqcMode) @@ -275,15 +318,12 @@ class NimSetup(Screen, ConfigListScreen): if currLnb.powerMeasurement.value: currLnb.powerMeasurement.value = False currLnb.powerMeasurement.save() - self.advancedLof = getConfigListEntry(_("LOF"), currLnb.lof) - self.list.append(self.advancedLof) - if currLnb.lof.value == "user_defined": - self.list.append(getConfigListEntry(_("LOF/L"), currLnb.lofl)) - self.list.append(getConfigListEntry(_("LOF/H"), currLnb.lofh)) - self.list.append(getConfigListEntry(_("Threshold"), currLnb.threshold)) -# self.list.append(getConfigListEntry(_("12V Output"), currLnb.output_12v)) - self.list.append(getConfigListEntry(_("Increased voltage"), currLnb.increased_voltage)) - self.list.append(getConfigListEntry(_("Priority"), currLnb.prio)) + self.advancedUsalsEntry = getConfigListEntry(_("Use usals for this sat"), Sat.usals) + self.list.append(self.advancedUsalsEntry) + if not Sat.usals.value: + self.list.append(getConfigListEntry(_("Stored position"), Sat.rotorposition)) + + def fillAdvancedList(self): self.list = [ ] -- cgit v1.2.3 From c668e555f7f57a878b8295abfeeb87d0f4550fbd Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Mon, 19 Jan 2009 14:10:02 +0100 Subject: physdev path start with /, like in hotplug. add dvd drive into devicedb. fix scanner component. fix splitDeviceName for sr0-like devices. --- lib/python/Components/Harddisk.py | 34 +++++++++++++++------------------- lib/python/Components/Scanner.py | 2 +- 2 files changed, 16 insertions(+), 20 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/Harddisk.py b/lib/python/Components/Harddisk.py index d739e984..ad7f28de 100644 --- a/lib/python/Components/Harddisk.py +++ b/lib/python/Components/Harddisk.py @@ -252,9 +252,10 @@ class Partition: DEVICEDB = \ { # dm8000: - "devices/platform/brcm-ehci.0/usb1/1-1/1-1.1/1-1.1:1.0": "Front USB Slot", - "devices/platform/brcm-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0": "Back, upper USB Slot", - "devices/platform/brcm-ehci.0/usb1/1-1/1-1.3/1-1.3:1.0": "Back, lower USB Slot", + "/devices/platform/brcm-ehci.0/usb1/1-1/1-1.1/1-1.1:1.0": "Front USB Slot", + "/devices/platform/brcm-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0": "Back, upper USB Slot", + "/devices/platform/brcm-ehci.0/usb1/1-1/1-1.3/1-1.3:1.0": "Back, lower USB Slot", + "/devices/platform/brcm-ehci-1.1/usb2/2-1/2-1:1.0/host1/target1:0:0/1:0:0:0": "DVD Drive", } class HarddiskManager: @@ -352,14 +353,10 @@ class HarddiskManager: if not physdev: dev, part = self.splitDeviceName(device) try: - physdev = readlink("/sys/block/" + dev + "/device")[6:] + physdev = readlink("/sys/block/" + dev + "/device")[5:] except OSError: - print "couldn't determine blockdev physdev for device", dev, "try", device, "now" - try: - physdev = readlink("/sys/block/" + device + "/device")[6:] - except OSError: - physdev = dev - print "couldn't determine blockdev physdev for device", device + physdev = dev + print "couldn't determine blockdev physdev for device", device # device is the device name, without /dev # physdev is the physical device path, which we (might) use to determine the userfriendly name @@ -423,22 +420,21 @@ class HarddiskManager: return [x for x in parts if not x.device or x.device in devs] def splitDeviceName(self, devname): - dev = "" - part = "" - for i in devname: - if i in string.digits: - part += i - else: - dev += i + # this works for: sdaX, hdaX, sr0 (which is in fact dev="sr0", part=""). It doesn't work for other names like mtdblock3, but they are blacklisted anyway. + dev = devname[:3] + part = devname[3:] + for p in part: + if p not in string.digits: + return devname, 0 return dev, part and int(part) or 0 def getUserfriendlyDeviceName(self, dev, phys): dev, part = self.splitDeviceName(dev) description = "External Storage %s" % dev try: - description = open("/sys/" + phys + "/model").read().strip() + description = open("/sys" + phys + "/model").read().strip() except IOError, s: - print "couldn't read model (from /sys/" + phys + "/model): ", s + print "couldn't read model: ", s for physdevprefix, pdescription in DEVICEDB.items(): if phys.startswith(physdevprefix): description = pdescription diff --git a/lib/python/Components/Scanner.py b/lib/python/Components/Scanner.py index 766d1966..86a5431d 100644 --- a/lib/python/Components/Scanner.py +++ b/lib/python/Components/Scanner.py @@ -135,7 +135,7 @@ def scanDevice(mountpoint): from Components.Harddisk import harddiskmanager blockdev = mountpoint.rstrip("/").rsplit('/',1)[-1] - error, blacklisted, removable, is_cdrom, partitions = harddiskmanager.getBlockDevInfo(blockdev) + error, blacklisted, removable, is_cdrom, partitions, medium_found = harddiskmanager.getBlockDevInfo(blockdev) # now scan the paths for p in paths_to_scan: -- cgit v1.2.3 From 6f281bfa8fb9eccc5e623b67c39f5b9e478eeeb0 Mon Sep 17 00:00:00 2001 From: ghost Date: Mon, 19 Jan 2009 21:02:12 +0100 Subject: allow non string choices in ConfigSelection --- lib/python/Components/config.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/config.py b/lib/python/Components/config.py index 1efb8a56..a7724f40 100755 --- a/lib/python/Components/config.py +++ b/lib/python/Components/config.py @@ -183,9 +183,8 @@ class ConfigSelection(ConfigElement): default = self.choices[0] assert default in self.choices, "default must be in choice list, but " + repr(default) + " is not!" - for x in self.choices: - assert isinstance(x, str), "ConfigSelection choices must be strings" - +# for x in self.choices: +# assert isinstance(x, str), "ConfigSelection choices must be strings" self.default = default if self.value == None or not self.value in self.choices: -- cgit v1.2.3 From f3c7b0323c40580aadbfd2c91be681fe97a20071 Mon Sep 17 00:00:00 2001 From: ghost Date: Mon, 19 Jan 2009 22:56:05 +0100 Subject: more codecleanup --- lib/python/Components/TuneTest.py | 16 ++++++-- .../SystemPlugins/PositionerSetup/plugin.py | 44 +++------------------- .../Plugins/SystemPlugins/Satfinder/plugin.py | 1 - 3 files changed, 18 insertions(+), 43 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/TuneTest.py b/lib/python/Components/TuneTest.py index 422036cd..de7b0098 100644 --- a/lib/python/Components/TuneTest.py +++ b/lib/python/Components/TuneTest.py @@ -3,7 +3,7 @@ from enigma import eDVBFrontendParametersSatellite, eDVBFrontendParameters, eDVB class Tuner: def __init__(self, frontend): self.frontend = frontend - + # transponder = (frequency, symbolrate, polarisation, fec, inversion, orbpos, system, modulation) # 0 1 2 3 4 5 6 7 def tune(self, transponder): @@ -16,17 +16,25 @@ class Tuner: parm.fec = transponder[3] parm.inversion = transponder[4] parm.orbital_position = transponder[5] - parm.system = 0 # FIXMEE !! HARDCODED DVB-S (add support for DVB-S2) - parm.modulation = 1 # FIXMEE !! HARDCODED QPSK + parm.system = transponder[6] + parm.modulation = transponder[7] + parm.rolloff = transponder[8] + parm.pilot = transponder[9] feparm = eDVBFrontendParameters() feparm.setDVBS(parm) self.lastparm = feparm self.frontend.tune(feparm) - + def retune(self): if self.frontend: self.frontend.tune(self.lastparm) + def getTransponderData(self): + ret = { } + if self.frontend: + self.frontend.getTransponderData(ret, True) + return ret + # tunes a list of transponders and checks, if they lock and optionally checks the onid/tsid combination # 1) add transponders with addTransponder() # 2) call run() diff --git a/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py b/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py index 9e87d6d5..19076bad 100644 --- a/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py +++ b/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py @@ -14,6 +14,7 @@ from Components.ActionMap import ActionMap from Components.NimManager import nimmanager from Components.MenuList import MenuList from Components.config import ConfigSatlist, ConfigNothing, ConfigSelection, ConfigSubsection, KEY_LEFT, KEY_RIGHT, getConfigListEntry +from Components.TuneTest import Tuner from time import sleep @@ -81,11 +82,11 @@ class PositionerSetup(Screen): cur.get("symbol_rate", 0) / 1000, cur.get("polarization", eDVBFrontendParametersSatellite.Polarisation_Horizontal), cur.get("fec_inner", eDVBFrontendParametersSatellite.FEC_Auto), - cur.get("inversion", eDVBFrontendParametersSatellite.Inversion_Unknown) - cur.get("orbital_position", 0) - cur.get("system", eDVBFrontendParametersSatellite.System_DVB_S) - cur.get("modulation", eDVBFrontendParametersSatellite.Modulation_QPSK) - cur.get("rolloff", eDVBFrontendParametersSatellite.RollOff_alpha_0_35) + cur.get("inversion", eDVBFrontendParametersSatellite.Inversion_Unknown), + cur.get("orbital_position", 0), + cur.get("system", eDVBFrontendParametersSatellite.System_DVB_S), + cur.get("modulation", eDVBFrontendParametersSatellite.Modulation_QPSK), + cur.get("rolloff", eDVBFrontendParametersSatellite.RollOff_alpha_0_35), cur.get("pilot", eDVBFrontendParametersSatellite.Pilot_Unknown)) self.tuner.tune(tp) @@ -404,39 +405,6 @@ class Diseqc: sleep(0.05) self.frontend.sendDiseqc(cmd) # send 2nd time -class Tuner: - def __init__(self, frontend): - self.frontend = frontend - - def tune(self, transponder): - print "tuning to transponder with data", transponder - parm = eDVBFrontendParametersSatellite() - parm.frequency = transponder[0] * 1000 - parm.symbol_rate = transponder[1] * 1000 - parm.polarisation = transponder[2] - parm.fec = transponder[3] - parm.inversion = transponder[4] - parm.orbital_position = transponder[5] - parm.system = transponder[6] - parm.modulation = transponder[7] - parm.rolloff = transponder[8] - parm.pilot = transponder[9] - feparm = eDVBFrontendParameters() - feparm.setDVBS(parm, True) - self.lastparm = feparm - if self.frontend: - self.frontend.tune(feparm) - - def retune(self): - if self.frontend: - self.frontend.tune(self.lastparm) - - def getTransponderData(self): - ret = { } - if self.frontend: - self.frontend.getTransponderData(ret, True) - return ret - tuning = None class TunerScreen(ScanSetup): diff --git a/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py b/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py index 8174eb64..048bad90 100644 --- a/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py +++ b/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py @@ -14,7 +14,6 @@ from Components.MenuList import MenuList from Components.config import ConfigSelection, getConfigListEntry from Components.TuneTest import Tuner - class Satfinder(ScanSetup): def openFrontend(self): res_mgr = eDVBResourceManager.getInstance() -- cgit v1.2.3 From af3c70e61bf4e7e2e0afc51b0e3a0cd717c20f54 Mon Sep 17 00:00:00 2001 From: ghost Date: Wed, 21 Jan 2009 13:38:00 +0100 Subject: "type" -> "tuner_type"... tuner_type is one of "DVB-S" "DVB-T" "DVB-C" --- lib/python/Components/TimerSanityCheck.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/TimerSanityCheck.py b/lib/python/Components/TimerSanityCheck.py index 10dc31bd..99b2fba5 100644 --- a/lib/python/Components/TimerSanityCheck.py +++ b/lib/python/Components/TimerSanityCheck.py @@ -173,8 +173,7 @@ class TimerSanityCheck: def getServiceType(ref): # helper function to get a service type of a service reference serviceInfo = serviceHandler.info(ref) serviceInfo = serviceInfo and serviceInfo.getInfoObject(ref, iServiceInformation.sTransponderData) - if serviceInfo: - return { "Satellite" : "DVB-S", "Cable" : "DVB-C", "Terrestrial" : "DVB-T"}[serviceInfo["type"]] + return serviceInfo and serviceInfo["tuner_type"] or "" ref = timer.service_ref.ref if ref.flags & eServiceReference.isGroup: # service group ? -- cgit v1.2.3 From 1d0a109bc97ea1d32928de03b90c4d043ddf2b25 Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Mon, 17 Nov 2008 17:19:39 +0100 Subject: performance fix: don't redraw if in/out list is the same --- lib/python/Components/Renderer/PositionGauge.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/Renderer/PositionGauge.py b/lib/python/Components/Renderer/PositionGauge.py index 5fa8c356..3f93d82e 100644 --- a/lib/python/Components/Renderer/PositionGauge.py +++ b/lib/python/Components/Renderer/PositionGauge.py @@ -50,9 +50,10 @@ class PositionGauge(Renderer): return self.__cutlist def setCutlist(self, cutlist): - self.__cutlist = cutlist - if self.instance is not None: - self.instance.setInOutList(cutlist) + if self.__cutlist != cutlist: + self.__cutlist = cutlist + if self.instance is not None: + self.instance.setInOutList(cutlist) cutlist = property(getCutlist, setCutlist) -- cgit v1.2.3 From a4fd5bddb0f8c1b05b963cb8af9692f6c89f3dab Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Mon, 26 Jan 2009 23:47:10 +0100 Subject: patch by moritz venn: wrap around for minutes/hours --- lib/python/Components/config.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/config.py b/lib/python/Components/config.py index a7724f40..6eeca698 100755 --- a/lib/python/Components/config.py +++ b/lib/python/Components/config.py @@ -629,11 +629,12 @@ class ConfigClock(ConfigSequence): def increment(self): # Check if Minutes maxed out if self._value[1] == 59: - # Check if Hours not maxed out + # Increment Hour, reset Minutes if self._value[0] < 23: - # Increment Hour, reset Minutes to 0 self._value[0] += 1 - self._value[1] = 0 + else: + self._value[0] = 0 + self._value[1] = 0 else: # Increment Minutes self._value[1] += 1 @@ -643,11 +644,12 @@ class ConfigClock(ConfigSequence): def decrement(self): # Check if Minutes is minimum if self._value[1] == 0: - # Check if Hour is greater than 0 + # Decrement Hour, set Minutes to 59 if self._value[0] > 0: - # Decrement Hour, set Minutes to 59 self._value[0] -= 1 - self._value[1] = 59 + else: + self._value[0] = 23 + self._value[1] = 59 else: # Decrement Minutes self._value[1] -= 1 -- cgit v1.2.3 From 15d7074f55a2c3dd38ce9877626be6ec32b448d2 Mon Sep 17 00:00:00 2001 From: ghost Date: Tue, 27 Jan 2009 00:04:59 +0100 Subject: fixes for python 2.6 by Moritz Venn --- keymapparser.py | 15 +++++++++++---- lib/actions/parseactions.py | 4 ++-- lib/dvb/epgcache.cpp | 8 ++++++++ lib/python/Components/Converter/EventTime.py | 4 ++-- lib/python/Components/Converter/MovieInfo.py | 4 ++-- lib/python/Components/Converter/ServicePosition.py | 4 ++-- lib/python/Components/Converter/ServiceTime.py | 4 ++-- lib/python/Components/Element.py | 7 +++++++ lib/python/Components/NimManager.py | 6 ++---- lib/python/Components/Renderer/Canvas.py | 2 +- lib/python/Plugins/DemoPlugins/TestPlugin/plugin.py | 2 +- lib/python/Screens/ChannelSelection.py | 2 +- lib/python/Screens/Setup.py | 9 ++++++++- lib/python/Tools/LoadPixmap.py | 2 +- lib/python/python.h | 11 +++++++++++ mytest.py | 2 +- skin.py | 4 ++-- 17 files changed, 64 insertions(+), 26 deletions(-) (limited to 'lib/python/Components') diff --git a/keymapparser.py b/keymapparser.py index 5023e944..63bca0f9 100644 --- a/keymapparser.py +++ b/keymapparser.py @@ -1,11 +1,18 @@ import enigma import xml.etree.cElementTree -from keyids import KEYIDS; +from keyids import KEYIDS # these are only informational (for help)... from Tools.KeyBindings import addKeyBinding +class KeymapError(Exception): + def __init__(self, message): + self.message = message + + def __str__(self): + return self.message + def parseKeys(context, filename, actionmap, device, keys): for x in keys.findall("key"): get_attr = x.attrib.get @@ -29,12 +36,12 @@ def parseKeys(context, filename, actionmap, device, keys): elif id[1] == 'd': keyid = int(id[2:]) | 0x8000 else: - raise "key id '" + str(id) + "' is neither hex nor dec" + raise KeymapError("key id '" + str(id) + "' is neither hex nor dec") else: try: keyid = KEYIDS[id] except: - raise "key id '" + str(id) + "' is illegal" + raise KeymapError("key id '" + str(id) + "' is illegal") # print context + "::" + mapto + " -> " + device + "." + hex(keyid) actionmap.bindKey(filename, device, keyid, flags, context, mapto) addKeyBinding(filename, keyid, context, mapto, flags) @@ -48,7 +55,7 @@ def readKeymap(filename): try: dom = xml.etree.cElementTree.parse(source) except: - raise "keymap %s not well-formed." % filename + raise KeymapError("keymap %s not well-formed." % filename) keymap = dom.getroot() diff --git a/lib/actions/parseactions.py b/lib/actions/parseactions.py index 4ab71af7..2462a751 100644 --- a/lib/actions/parseactions.py +++ b/lib/actions/parseactions.py @@ -65,7 +65,7 @@ def do_file(f, mode): except: pass - raise "action enum must be simple." + raise Exception("action enum must be simple.") counter = 0 @@ -82,7 +82,7 @@ def do_file(f, mode): if counter: if t != ",": - raise "no comma" + raise Exception("no comma") t = tokens.next() if firsthit: diff --git a/lib/dvb/epgcache.cpp b/lib/dvb/epgcache.cpp index a8eca85b..fdcbe0e9 100644 --- a/lib/dvb/epgcache.cpp +++ b/lib/dvb/epgcache.cpp @@ -2058,7 +2058,11 @@ PyObject *eEPGCache::search(ePyObject arg) ePyObject obj = PyTuple_GET_ITEM(arg,0); if (PyString_Check(obj)) { +#if PY_VERSION_HEX < 0x02060000 argcount = PyString_GET_SIZE(obj); +#else + argcount = PyString_Size(obj); +#endif argstring = PyString_AS_STRING(obj); for (int i=0; i < argcount; ++i) switch(argstring[i]) @@ -2156,7 +2160,11 @@ PyObject *eEPGCache::search(ePyObject arg) { int casetype = PyLong_AsLong(PyTuple_GET_ITEM(arg, 4)); const char *str = PyString_AS_STRING(obj); +#if PY_VERSION_HEX < 0x02060000 int textlen = PyString_GET_SIZE(obj); +#else + int textlen = PyString_Size(obj); +#endif if (querytype == 1) eDebug("lookup for events with '%s' as title(%s)", str, casetype?"ignore case":"case sensitive"); else diff --git a/lib/python/Components/Converter/EventTime.py b/lib/python/Components/Converter/EventTime.py index 966f2ca8..41f1ebf3 100644 --- a/lib/python/Components/Converter/EventTime.py +++ b/lib/python/Components/Converter/EventTime.py @@ -1,7 +1,7 @@ from Converter import Converter from Poll import Poll from time import time -from Components.Element import cached +from Components.Element import cached, ElementError class EventTime(Poll, Converter, object): STARTTIME = 0 @@ -28,7 +28,7 @@ class EventTime(Poll, Converter, object): self.poll_interval = 30*1000 self.poll_enabled = True else: - raise str("'%s' is not for EventTime converter" % type) + raise ElementError("'%s' is not for EventTime converter" % type) @cached def getTime(self): diff --git a/lib/python/Components/Converter/MovieInfo.py b/lib/python/Components/Converter/MovieInfo.py index 068d24d3..be28dcce 100644 --- a/lib/python/Components/Converter/MovieInfo.py +++ b/lib/python/Components/Converter/MovieInfo.py @@ -1,5 +1,5 @@ from Components.Converter.Converter import Converter -from Components.Element import cached +from Components.Element import cached, ElementError from enigma import iServiceInformation from ServiceReference import ServiceReference @@ -16,7 +16,7 @@ class MovieInfo(Converter, object): elif type == "RecordServiceName": self.type = self.MOVIE_REC_SERVICE_NAME else: - raise str("'%s' is not for MovieInfo converter" % type) + raise ElementError("'%s' is not for MovieInfo converter" % type) Converter.__init__(self, type) @cached diff --git a/lib/python/Components/Converter/ServicePosition.py b/lib/python/Components/Converter/ServicePosition.py index d7a55dae..2bcc5492 100644 --- a/lib/python/Components/Converter/ServicePosition.py +++ b/lib/python/Components/Converter/ServicePosition.py @@ -1,7 +1,7 @@ from Converter import Converter from Poll import Poll from enigma import iPlayableService -from Components.Element import cached +from Components.Element import cached, ElementError class ServicePosition(Converter, Poll, object): TYPE_LENGTH = 0 @@ -35,7 +35,7 @@ class ServicePosition(Converter, Poll, object): elif type == "Gauge": self.type = self.TYPE_GAUGE else: - raise "type must be {Length|Position|Remaining|Gauge} with optional arguments {Negate|Detailed|ShowHours|NoSeconds}" + raise ElementError("type must be {Length|Position|Remaining|Gauge} with optional arguments {Negate|Detailed|ShowHours|NoSeconds}") self.poll_enabled = self.type != self.TYPE_LENGTH diff --git a/lib/python/Components/Converter/ServiceTime.py b/lib/python/Components/Converter/ServiceTime.py index 16bcae3a..89965067 100644 --- a/lib/python/Components/Converter/ServiceTime.py +++ b/lib/python/Components/Converter/ServiceTime.py @@ -1,5 +1,5 @@ from Converter import Converter -from Components.Element import cached +from Components.Element import cached, ElementError from enigma import iServiceInformation class ServiceTime(Converter, object): @@ -16,7 +16,7 @@ class ServiceTime(Converter, object): elif type == "Duration": self.type = self.DURATION else: - raise str("'%s' is not for eEventTime converter" % type) + raise ElementError("'%s' is not for eEventTime converter" % type) @cached def getTime(self): diff --git a/lib/python/Components/Element.py b/lib/python/Components/Element.py index 2af57793..f4a8f127 100644 --- a/lib/python/Components/Element.py +++ b/lib/python/Components/Element.py @@ -16,6 +16,13 @@ def cached(f): return cache[name][1] return wrapper +class ElementError(Exception): + def __init__(self, message): + self.message = message + + def __str__(self): + return self.message + class Element(object): CHANGED_DEFAULT = 0 # initial "pull" state CHANGED_ALL = 1 # really everything changed diff --git a/lib/python/Components/NimManager.py b/lib/python/Components/NimManager.py index 1fcbda1a..2692cb5b 100644 --- a/lib/python/Components/NimManager.py +++ b/lib/python/Components/NimManager.py @@ -14,8 +14,6 @@ from enigma import eDVBSatelliteEquipmentControl as secClass, \ from time import localtime, mktime from datetime import datetime -from sets import Set - def getConfigSatlist(orbpos, satlist): default_orbpos = None for x in satlist: @@ -123,7 +121,7 @@ class SecConfigure: def update(self): sec = secClass.getInstance() - self.configuredSatellites = Set() + self.configuredSatellites = set() sec.clear() ## this do unlinking NIMs too !! print "sec config cleared" @@ -442,7 +440,7 @@ class SecConfigure: def __init__(self, nimmgr): self.NimManager = nimmgr - self.configuredSatellites = Set() + self.configuredSatellites = set() self.update() class NIM(object): diff --git a/lib/python/Components/Renderer/Canvas.py b/lib/python/Components/Renderer/Canvas.py index bd7ffb5e..acf0dbf7 100644 --- a/lib/python/Components/Renderer/Canvas.py +++ b/lib/python/Components/Renderer/Canvas.py @@ -35,7 +35,7 @@ class Canvas(Renderer): self.instance.writeText(eRect(l[1], l[2], l[3], l[4]), gRGB(l[5]), gRGB(l[6]), l[7], l[8], l[9]) else: print "drawlist entry:", l - raise "invalid drawlist entry" + raise RuntimeError("invalid drawlist entry") def changed(self, what): self.pull_updates() diff --git a/lib/python/Plugins/DemoPlugins/TestPlugin/plugin.py b/lib/python/Plugins/DemoPlugins/TestPlugin/plugin.py index a63562c8..69f935e4 100644 --- a/lib/python/Plugins/DemoPlugins/TestPlugin/plugin.py +++ b/lib/python/Plugins/DemoPlugins/TestPlugin/plugin.py @@ -51,7 +51,7 @@ class Test(Screen): def mycallback(self, answer): print "answer:", answer if answer: - raise "test-crash" + raise Exception("test-crash") self.close() def keyLeft(self): diff --git a/lib/python/Screens/ChannelSelection.py b/lib/python/Screens/ChannelSelection.py index b203b24e..ebfbe812 100644 --- a/lib/python/Screens/ChannelSelection.py +++ b/lib/python/Screens/ChannelSelection.py @@ -76,7 +76,7 @@ def append_when_current_valid(current, menu, args, level = 0): class ChannelContextMenu(Screen): def __init__(self, session, csel): Screen.__init__(self, session) - #raise "we need a better summary screen here" + #raise Exception("we need a better summary screen here") self.csel = csel self.bsel = None diff --git a/lib/python/Screens/Setup.py b/lib/python/Screens/Setup.py index 35918b5b..1d035b8a 100644 --- a/lib/python/Screens/Setup.py +++ b/lib/python/Screens/Setup.py @@ -19,6 +19,13 @@ except: setupdom = xml.etree.cElementTree.parse(setupfile) setupfile.close() +class SetupError(Exception): + def __init__(self, message): + self.message = message + + def __str__(self): + return self.message + class SetupSummary(Screen): skin = """ @@ -145,4 +152,4 @@ def getSetupTitle(id): for x in xmldata.findall("setup"): if x.get("key") == id: return x.get("title", "").encode("UTF-8") - raise "unknown setup id '%s'!" % repr(id) + raise SetupError("unknown setup id '%s'!" % repr(id)) diff --git a/lib/python/Tools/LoadPixmap.py b/lib/python/Tools/LoadPixmap.py index 53e04e54..fff414ad 100644 --- a/lib/python/Tools/LoadPixmap.py +++ b/lib/python/Tools/LoadPixmap.py @@ -14,7 +14,7 @@ def LoadPixmap(path, desktop = None, cached = False): alpha = loadPNG(path + "a.png") ptr = loadJPG(path + "rgb.jpg", alpha) else: - raise "neither .png nor .jpg, please fix file extension" + raise Exception("neither .png nor .jpg, please fix file extension") if ptr and desktop: desktop.makeCompatiblePixmap(ptr) diff --git a/lib/python/python.h b/lib/python/python.h index f56d49bb..52ec6c1e 100644 --- a/lib/python/python.h +++ b/lib/python/python.h @@ -24,6 +24,7 @@ public: #ifdef PYTHON_REFCOUNT_DEBUG inline ePyObject(PyObject *ob, const char *file, int line); #endif + inline ePyObject(PyVarObject *ob); inline ePyObject(PyDictObject *ob); inline ePyObject(PyTupleObject *ob); inline ePyObject(PyListObject *ob); @@ -32,11 +33,13 @@ public: operator bool() { return !!m_ob; } ePyObject &operator=(const ePyObject &); ePyObject &operator=(PyObject *); + ePyObject &operator=(PyVarObject *ob) { return operator=((PyObject*)ob); } ePyObject &operator=(PyDictObject *ob) { return operator=((PyObject*)ob); } ePyObject &operator=(PyTupleObject *ob) { return operator=((PyObject*)ob); } ePyObject &operator=(PyListObject *ob) { return operator=((PyObject*)ob); } ePyObject &operator=(PyStringObject *ob) { return operator=((PyObject*)ob); } operator PyObject*(); + operator PyVarObject*() { return (PyVarObject*)operator PyVarObject*(); } operator PyTupleObject*() { return (PyTupleObject*)operator PyObject*(); } operator PyListObject*() { return (PyListObject*)operator PyObject*(); } operator PyStringObject*() { return (PyStringObject*)operator PyObject*(); } @@ -84,6 +87,14 @@ inline ePyObject::ePyObject(PyObject *ob, const char* file, int line) } #endif +inline ePyObject::ePyObject(PyVarObject *ob) + :m_ob((PyObject*)ob) +#ifdef PYTHON_REFCOUNT_DEBUG + ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false) +#endif +{ +} + inline ePyObject::ePyObject(PyDictObject *ob) :m_ob((PyObject*)ob) #ifdef PYTHON_REFCOUNT_DEBUG diff --git a/mytest.py b/mytest.py index 014f94c9..8f23beac 100644 --- a/mytest.py +++ b/mytest.py @@ -277,7 +277,7 @@ class Session: def open(self, screen, *arguments, **kwargs): if len(self.dialog_stack) and not self.in_exec: - raise "modal open are allowed only from a screen which is modal!" + raise RuntimeError("modal open are allowed only from a screen which is modal!") # ...unless it's the very first screen. self.pushCurrent() diff --git a/skin.py b/skin.py index eae6ea4b..03fe96bb 100644 --- a/skin.py +++ b/skin.py @@ -274,7 +274,7 @@ def loadSingleSkinData(desktop, skin, path_prefix): colorNames[name] = parseColor(color) #print "Color:", name, color else: - raise ("need color and name, got %s %s" % (name, color)) + raise SkinError("need color and name, got %s %s" % (name, color)) for c in skin.findall("fonts"): for font in c.findall("font"): @@ -335,7 +335,7 @@ def loadSingleSkinData(desktop, skin, path_prefix): try: style.setColor(eWindowStyleSkinned.__dict__["col" + type], color) except: - raise ("Unknown color %s" % (type)) + raise SkinError("Unknown color %s" % (type)) #pass #print " color:", type, color -- cgit v1.2.3 From fc102394e60824f5c07da710d36ba28eaf160c72 Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Tue, 27 Jan 2009 15:56:25 +0100 Subject: when length is not available, just don't show anything --- lib/python/Components/MovieList.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/MovieList.py b/lib/python/Components/MovieList.py index 8568f3d6..5c98e4be 100644 --- a/lib/python/Components/MovieList.py +++ b/lib/python/Components/MovieList.py @@ -93,10 +93,7 @@ class MovieList(GUIComponent): if len > 0: len = "%d:%02d" % (len / 60, len % 60) else: - if config.usage.load_length_of_movies_in_moviellist.value: - len = "?:??" - else: - len = "X:XX" + len = "" res = [ None ] -- cgit v1.2.3 From 622d40a8ed6823a63f97e26267cfee3c874189fe Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Tue, 27 Jan 2009 18:57:10 +0100 Subject: allow using a list for ePopen --- lib/python/Components/Console.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/Console.py b/lib/python/Components/Console.py index 136d10d0..f1f3fd95 100644 --- a/lib/python/Components/Console.py +++ b/lib/python/Components/Console.py @@ -21,7 +21,9 @@ class Console(object): self.appContainers[name] = eConsoleAppContainer() self.appContainers[name].dataAvail.append(boundFunction(self.dataAvailCB,name)) self.appContainers[name].appClosed.append(boundFunction(self.finishedCB,name)) - retval = self.appContainers[name].execute(cmd) + if isinstance(cmd, str): # until .execute supports a better api + cmd = [cmd] + retval = self.appContainers[name].execute(*cmd) if retval: self.finishedCB(name, retval) -- cgit v1.2.3 From fdc322a811049c371bd7dbdb75192534cebd36c8 Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Tue, 27 Jan 2009 18:57:33 +0100 Subject: don't rely on hdd standby timer, but manage own idle timer. --- lib/python/Components/Harddisk.py | 64 +++++++++++++++++++++++++++++++++++- lib/python/Components/UsageConfig.py | 14 ++++---- 2 files changed, 70 insertions(+), 8 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/Harddisk.py b/lib/python/Components/Harddisk.py index ad7f28de..1fc629a0 100644 --- a/lib/python/Components/Harddisk.py +++ b/lib/python/Components/Harddisk.py @@ -2,7 +2,8 @@ from os import system, listdir, statvfs, popen, makedirs, readlink, stat, major, from Tools.Directories import SCOPE_HDD, resolveFilename from Tools.CList import CList from SystemInfo import SystemInfo -import string +import string, time +from Components.Console import Console def tryOpen(filename): try: @@ -18,6 +19,8 @@ class Harddisk: tmp = procfile.readline().split(':') s_major = int(tmp[0]) s_minor = int(tmp[1]) + self.max_idle_time = 0 + self.idle_running = False for disc in listdir("/dev/discs"): path = readlink('/dev/discs/'+disc) devidex = '/dev/discs/'+disc+'/' @@ -28,6 +31,7 @@ class Harddisk: self.devidex = devidex self.devidex2 = devidex2 print "new Harddisk", device, '->', self.devidex, '->', self.devidex2 + self.startIdle() break def __lt__(self, ob): @@ -213,6 +217,64 @@ class Harddisk: def getDeviceName(self): return self.getDeviceDir() + "disc" + # the HDD idle poll daemon. + # as some harddrives have a buggy standby timer, we are doing this by hand here. + # first, we disable the hardware timer. then, we check every now and then if + # any access has been made to the disc. If there has been no access over a specifed time, + # we set the hdd into standby. + def readStats(self): + l = open("/sys/block/%s/stat" % self.device).read() + nr_read = int(l[:8].strip()) + nr_write = int(l[4*9:4*9+8].strip()) + return nr_read, nr_write + + def startIdle(self): + self.last_access = time.time() + self.last_stat = 0 + self.is_sleeping = False + from enigma import eTimer + + # disable HDD standby timer + Console().ePopen(("hdparm", "hdparm", "-S0", (self.devidex + "disc"))) + self.timer = eTimer() + self.timer.callback.append(self.runIdle) + self.idle_running = True + self.setIdleTime(self.max_idle_time) # kick the idle polling loop + + def runIdle(self): + if not self.max_idle_time: + return + t = time.time() + + idle_time = t - self.last_access + + l = sum(self.readStats()) + + if l != self.last_stat: # access + self.last_stat = l + self.last_access = t + self.idle_time = 0 + self.is_sleeping = False + + #print "[IDLE]", idle_time, self.max_idle_time, self.is_sleeping + if idle_time >= self.max_idle_time and not self.is_sleeping: + self.setSleep() + self.is_sleeping = True + + def setSleep(self): + Console().ePopen(("hdparm", "hdparm", "-y", (self.devidex + "disc"))) + + def setIdleTime(self, idle): + self.max_idle_time = idle + if self.idle_running: + if not idle: + self.timer.stop() + else: + self.timer.start(idle * 250, False) # poll 4 times per period. + + def isSleeping(self): + return self.is_sleeping + class Partition: def __init__(self, mountpoint, device = None, description = "", force_mounted = False): self.mountpoint = mountpoint diff --git a/lib/python/Components/UsageConfig.py b/lib/python/Components/UsageConfig.py index 2ea91aeb..21e057f2 100644 --- a/lib/python/Components/UsageConfig.py +++ b/lib/python/Components/UsageConfig.py @@ -17,12 +17,12 @@ def InitUsageConfig(): config.usage.show_infobar_on_zap = ConfigYesNo(default = True) config.usage.show_infobar_on_skip = ConfigYesNo(default = True) config.usage.show_infobar_on_event_change = ConfigYesNo(default = True) - config.usage.hdd_standby = ConfigSelection(default = "120", choices = [ - ("0", _("no standby")), ("2", "10 " + _("seconds")), ("6", "30 " + _("seconds")), - ("12", "1 " + _("minute")), ("24", "2 " + _("minutes")), - ("60", "5 " + _("minutes")), ("120", "10 " + _("minutes")), ("240", "20 " + _("minutes")), - ("241", "30 " + _("minutes")), ("242", "1 " + _("hour")), ("244", "2 " + _("hours")), - ("248", "4 " + _("hours")) ]) + config.usage.hdd_standby = ConfigSelection(default = "600", choices = [ + ("0", _("no standby")), ("10", "10 " + _("seconds")), ("30", "30 " + _("seconds")), + ("60", "1 " + _("minute")), ("120", "2 " + _("minutes")), + ("300", "5 " + _("minutes")), ("600", "10 " + _("minutes")), ("1200", "20 " + _("minutes")), + ("1800", "30 " + _("minutes")), ("3600", "1 " + _("hour")), ("7200", "2 " + _("hours")), + ("14400", "4 " + _("hours")) ]) config.usage.output_12V = ConfigSelection(default = "do not change", choices = [ ("do not change", _("do not change")), ("off", _("off")), ("on", _("on")) ]) @@ -66,7 +66,7 @@ def InitUsageConfig(): def setHDDStandby(configElement): for hdd in harddiskmanager.HDDList(): - os.system("hdparm -S%s %s" % (configElement.value, hdd[1].getDeviceName())) + hdd[1].setIdleTime(int(configElement.value)) config.usage.hdd_standby.addNotifier(setHDDStandby) def set12VOutput(configElement): -- cgit v1.2.3 From ac91892f80fccfc09347cd1314b7e0ba88842be7 Mon Sep 17 00:00:00 2001 From: ghost Date: Fri, 30 Jan 2009 17:07:49 +0100 Subject: use .get instead of operator [] --- lib/python/Components/ServiceScan.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/ServiceScan.py b/lib/python/Components/ServiceScan.py index 5d624264..f2b0c053 100644 --- a/lib/python/Components/ServiceScan.py +++ b/lib/python/Components/ServiceScan.py @@ -53,27 +53,27 @@ class ServiceScan: network = sat_name else: network = ("%s %d.%d %s") % (sat_name, orb_pos / 10, orb_pos % 10, h) - tp_text = ("%s %s %d%c / %d / %s") %( { 0 : "DVB-S", 1 : "DVB-S2" }[tp.system], - { 0 : "Auto", 1 : "QPSK", 2 : "M8PSK", 3 : "QAM16" }[tp.modulation], + tp_text = ("%s %s %d%c / %d / %s") %( { 0 : "DVB-S", 1 : "DVB-S2" }.get(tp.system, 0), + { 0 : "Auto", 1 : "QPSK", 2 : "8PSK", 3 : "QAM16" }.get(tp.modulation, 0), tp.frequency/1000, - { 0 : 'H', 1 : 'V', 2 : 'L', 3 : 'R' }[tp.polarisation], + { 0 : 'H', 1 : 'V', 2 : 'L', 3 : 'R' }.get(tp.polarisation, 0), tp.symbol_rate/1000, { 0 : "AUTO", 1 : "1/2", 2 : "2/3", 3 : "3/4", 4 : "5/6", 5 : "7/8", 6 : "8/9", 7 : "3/5", 8 : "4/5", 9 : "9/10", - 15 : "NONE" }[tp.fec] ) + 15 : "NONE" }.get(tp.fec, 0)) elif tp_type == iDVBFrontend.feCable: network = _("Cable") tp = transponder.getDVBC() - tp_text = ("DVB-C %s %d / %d / %s") %( { 0 : "AUTO", 1 : "QAM16", 2 : "QAM32", 3 : "QAM64", 4 : "QAM128", 5 : "QAM256" }[tp.modulation], + tp_text = ("DVB-C %s %d / %d / %s") %( { 0 : "AUTO", 1 : "QAM16", 2 : "QAM32", 3 : "QAM64", 4 : "QAM128", 5 : "QAM256" }.get(tp.modulation, 0), tp.frequency, tp.symbol_rate/1000, - { 0 : "AUTO", 1 : "1/2", 2 : "2/3", 3 : "3/4", 4 : "5/6", 5 : "7/8", 6 : "8/9", 15 : "NONE" }[tp.fec_inner] ) + { 0 : "AUTO", 1 : "1/2", 2 : "2/3", 3 : "3/4", 4 : "5/6", 5 : "7/8", 6 : "8/9", 15 : "NONE" }.get(tp.fec_inner, 0)) elif tp_type == iDVBFrontend.feTerrestrial: network = _("Terrestrial") tp = transponder.getDVBT() - tp_text = ("DVB-T %s %d %s") %( { 0 : "QPSK", 1 : "QAM16", 2 : "QAM64", 3 : "AUTO"}[tp.modulation], + tp_text = ("DVB-T %s %d %s") %( { 0 : "QPSK", 1 : "QAM16", 2 : "QAM64", 3 : "AUTO" }.get(tp.modulation, 3), tp.frequency, - { 0 : "Bw 8MHz", 1 : "Bw 7MHz", 2 : "Bw 6MHz", 3 : "Bw Auto" }[tp.bandwidth]) + { 0 : "Bw 8MHz", 1 : "Bw 7MHz", 2 : "Bw 6MHz", 3 : "Bw Auto" }.get(tp.bandwidth, 3)) else: print "unknown transponder type in scanStatusChanged" self.network.setText(network) -- cgit v1.2.3 From 4b811a968884ce645d71cf22d538bd646acdc677 Mon Sep 17 00:00:00 2001 From: ghost Date: Fri, 30 Jan 2009 19:47:50 +0100 Subject: use enum values from frontendparams.h --- lib/python/Components/ServiceScan.py | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/ServiceScan.py b/lib/python/Components/ServiceScan.py index f2b0c053..78cd758e 100644 --- a/lib/python/Components/ServiceScan.py +++ b/lib/python/Components/ServiceScan.py @@ -53,27 +53,39 @@ class ServiceScan: network = sat_name else: network = ("%s %d.%d %s") % (sat_name, orb_pos / 10, orb_pos % 10, h) - tp_text = ("%s %s %d%c / %d / %s") %( { 0 : "DVB-S", 1 : "DVB-S2" }.get(tp.system, 0), - { 0 : "Auto", 1 : "QPSK", 2 : "8PSK", 3 : "QAM16" }.get(tp.modulation, 0), + tp_text = ("%s %s %d%c / %d / %s") %( { tp.System_DVB_S : "DVB-S", + tp.System_DVB_S2 : "DVB-S2" }.get(tp.system, tp.System_DVB_S), + { tp.Modulation_Auto : "Auto", tp.Modulation_QPSK : "QPSK", + tp.Modulation_8PSK : "8PSK", tp.Modulation_QAM16 : "QAM16" }.get(tp.modulation, tp.Modulation_QPSK), tp.frequency/1000, - { 0 : 'H', 1 : 'V', 2 : 'L', 3 : 'R' }.get(tp.polarisation, 0), + { tp.Polarisation_Horizontal : 'H', tp.Polarisation_Vertical : 'V', tp.Polarisation_CircularLeft : 'L', + tp.Polarisation_CircularRight : 'R' }.get(tp.polarisation, tp.Polarisation_Horizontal), tp.symbol_rate/1000, - { 0 : "AUTO", 1 : "1/2", 2 : "2/3", 3 : "3/4", 4 : "5/6", - 5 : "7/8", 6 : "8/9", 7 : "3/5", 8 : "4/5", 9 : "9/10", - 15 : "NONE" }.get(tp.fec, 0)) + { tp.FEC_Auto : "AUTO", tp.FEC_1_2 : "1/2", tp.FEC_2_3 : "2/3", + tp.FEC_3_4 : "3/4", tp.FEC_5_6 : "5/6", tp.FEC_7_8 : "7/8", + tp.FEC_8_9 : "8/9", tp.FEC_3_5 : "3/5", tp.FEC_4_5 : "4/5", + tp.FEC_9_10 : "9/10", tp.FEC_None : "NONE" }.get(tp.fec, tp.FEC_Auto)) elif tp_type == iDVBFrontend.feCable: network = _("Cable") tp = transponder.getDVBC() - tp_text = ("DVB-C %s %d / %d / %s") %( { 0 : "AUTO", 1 : "QAM16", 2 : "QAM32", 3 : "QAM64", 4 : "QAM128", 5 : "QAM256" }.get(tp.modulation, 0), + tp_text = ("DVB-C %s %d / %d / %s") %( { tp.Modulation_Auto : "AUTO", + tp.Modulation_QAM16 : "QAM16", tp.Modulation_QAM32 : "QAM32", + tp.Modulation_QAM64 : "QAM64", tp.Modulation_QAM128 : "QAM128", + tp.Modulation_QAM256 : "QAM256" }.get(tp.modulation, tp.Modulation_Auto), tp.frequency, tp.symbol_rate/1000, - { 0 : "AUTO", 1 : "1/2", 2 : "2/3", 3 : "3/4", 4 : "5/6", 5 : "7/8", 6 : "8/9", 15 : "NONE" }.get(tp.fec_inner, 0)) + { tp.FEC_Auto : "AUTO", tp.FEC_1_2 : "1/2", tp.FEC_2_3 : "2/3", + tp.FEC_3_4 : "3/4", tp.FEC_5_6 : "5/6", tp.FEC_7_8 : "7/8", + tp.FEC_8_9 : "8/9", tp.FEC_None : "NONE" }.get(tp.fec_inner, tp.FEC_Auto)) elif tp_type == iDVBFrontend.feTerrestrial: network = _("Terrestrial") tp = transponder.getDVBT() - tp_text = ("DVB-T %s %d %s") %( { 0 : "QPSK", 1 : "QAM16", 2 : "QAM64", 3 : "AUTO" }.get(tp.modulation, 3), + tp_text = ("DVB-T %s %d %s") %( { tp.Modulation_QPSK : "QPSK", + tp.Modulation_QAM16 : "QAM16", tp.Modulation_QAM64 : "QAM64", + tp.Modulation_Auto : "AUTO" }.get(tp.modulation, tp.Modulation_Auto), tp.frequency, - { 0 : "Bw 8MHz", 1 : "Bw 7MHz", 2 : "Bw 6MHz", 3 : "Bw Auto" }.get(tp.bandwidth, 3)) + { tp.Bandwidth_8MHz : "Bw 8MHz", tp.Bandwidth_7MHz : "Bw 7MHz", tp.Bandwidth_6MHz : "Bw 6MHz", + tp.Bandwidth_Auto : "Bw Auto" }.get(tp.bandwidth, tp.Bandwidth_Auto)) else: print "unknown transponder type in scanStatusChanged" self.network.setText(network) -- cgit v1.2.3 From c7e822df550005a8b359604d005d8da74b937152 Mon Sep 17 00:00:00 2001 From: ghost Date: Mon, 2 Feb 2009 13:11:04 +0100 Subject: now the code is working for /dev/ide/discs/discX mounts and direkt mounts to /dev/ide/hostX/busX/... --- lib/python/Components/Harddisk.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/Harddisk.py b/lib/python/Components/Harddisk.py index 1fc629a0..9cf9b4a2 100644 --- a/lib/python/Components/Harddisk.py +++ b/lib/python/Components/Harddisk.py @@ -97,7 +97,7 @@ class Harddisk: line = procfile.readline() if line == "": break - if line.startswith(self.devidex): + if line.startswith(self.devidex) or line.startswith(self.devidex2): parts = line.strip().split(" ") try: stat = statvfs(parts[1]) -- cgit v1.2.3 From 337572d8d61c37c2121a96ec7ab79e191eaa2e29 Mon Sep 17 00:00:00 2001 From: ghost Date: Tue, 3 Feb 2009 15:47:13 +0100 Subject: also check devidex2 here --- lib/python/Components/Harddisk.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/Harddisk.py b/lib/python/Components/Harddisk.py index 9cf9b4a2..404baafa 100644 --- a/lib/python/Components/Harddisk.py +++ b/lib/python/Components/Harddisk.py @@ -130,7 +130,7 @@ class Harddisk: cmd = "/bin/umount" for line in procfile: - if line.startswith(self.devidex): + if line.startswith(self.devidex) or line.startswith(self.devidex2): parts = line.split() cmd = ' '.join([cmd, parts[1]]) -- cgit v1.2.3 From b6b788b0f8da7e1adcde03cebb464da484f48508 Mon Sep 17 00:00:00 2001 From: ghost Date: Fri, 6 Feb 2009 16:39:08 +0100 Subject: check harddisc idle 10 times per period add some debug output --- lib/python/Components/Harddisk.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/Harddisk.py b/lib/python/Components/Harddisk.py index 404baafa..44245ebb 100644 --- a/lib/python/Components/Harddisk.py +++ b/lib/python/Components/Harddisk.py @@ -248,15 +248,21 @@ class Harddisk: idle_time = t - self.last_access - l = sum(self.readStats()) + stats = self.readStats() + print "nr_read", stats[0], "nr_write", stats[1] + l = sum(stats) + print "sum", l, "prev_sum", self.last_stat if l != self.last_stat: # access + print "hdd was accessed since previous check!" self.last_stat = l self.last_access = t self.idle_time = 0 self.is_sleeping = False + else: + print "hdd IDLE!" - #print "[IDLE]", idle_time, self.max_idle_time, self.is_sleeping + print "[IDLE]", idle_time, self.max_idle_time, self.is_sleeping if idle_time >= self.max_idle_time and not self.is_sleeping: self.setSleep() self.is_sleeping = True @@ -270,7 +276,7 @@ class Harddisk: if not idle: self.timer.stop() else: - self.timer.start(idle * 250, False) # poll 4 times per period. + self.timer.start(idle * 100, False) # poll 10 times per period. def isSleeping(self): return self.is_sleeping -- cgit v1.2.3 From d00d32df526b88b146c711ce8951008d72ec6a56 Mon Sep 17 00:00:00 2001 From: ghost Date: Fri, 6 Feb 2009 17:58:59 +0100 Subject: code cleanup ... use more /proc/stb/avs/0/* auto functions this change needs current drivers (SRCDATE >= 20090206) --- lib/driver/avswitch.cpp | 30 -------------- lib/driver/avswitch.h | 2 - lib/python/Components/AVSwitch.py | 47 +++------------------- .../SystemPlugins/Videomode/VideoHardware.py | 44 -------------------- 4 files changed, 6 insertions(+), 117 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/driver/avswitch.cpp b/lib/driver/avswitch.cpp index dbfebf5f..f05bdd95 100644 --- a/lib/driver/avswitch.cpp +++ b/lib/driver/avswitch.cpp @@ -132,23 +132,6 @@ void eAVSwitch::setInput(int val) write(fd, input[val], strlen(input[val])); close(fd); - - if (val == 1) - setFastBlank(2); -} - -void eAVSwitch::setFastBlank(int val) -{ - int fd; - const char *fb[] = {"low", "high", "vcr"}; - - if((fd = open("/proc/stb/avs/0/fb", O_WRONLY)) < 0) { - eDebug("cannot open /proc/stb/avs/0/fb"); - return; - } - - write(fd, fb[val], strlen(fb[0])); - close(fd); } void eAVSwitch::setColorFormat(int format) @@ -284,18 +267,5 @@ void eAVSwitch::setWSS(int val) // 0 = auto, 1 = auto(4:3_off) close(fd); } -void eAVSwitch::setSlowblank(int val) -{ - int fd; - if((fd = open("/proc/stb/avs/0/sb", O_WRONLY)) < 0) { - eDebug("cannot open /proc/stb/avs/0/sb"); - return; - } - const char *sb[] = {"0", "6", "12", "vcr", "auto"}; - write(fd, sb[val], strlen(sb[val])); -// eDebug("set slow blanking to %s", sb[val]); - close(fd); -} - //FIXME: correct "run/startlevel" eAutoInitP0 init_avswitch(eAutoInitNumbers::rc, "AVSwitch Driver"); diff --git a/lib/driver/avswitch.h b/lib/driver/avswitch.h index 8fdafdd1..bcb29c40 100644 --- a/lib/driver/avswitch.h +++ b/lib/driver/avswitch.h @@ -26,12 +26,10 @@ public: static eAVSwitch *getInstance(); bool haveScartSwitch(); int getVCRSlowBlanking(); - void setFastBlank(int val); void setColorFormat(int format); void setAspectRatio(int ratio); void setVideomode(int mode); void setInput(int val); - void setSlowblank(int val); void setWSS(int val); PSignal1 vcr_sb_notifier; }; diff --git a/lib/python/Components/AVSwitch.py b/lib/python/Components/AVSwitch.py index 1f529cfd..3188469a 100644 --- a/lib/python/Components/AVSwitch.py +++ b/lib/python/Components/AVSwitch.py @@ -3,27 +3,15 @@ from enigma import eAVSwitch, getDesktop from SystemInfo import SystemInfo class AVSwitch: - INPUT = { "ENCODER": (0, 4), "SCART": (1, 3), "AUX": (2, 4) } - def setInput(self, input): - eAVSwitch.getInstance().setInput(self.INPUT[input][0]) - if self.INPUT[input][1] == 4: - aspect = self.getAspectRatioSetting() - self.setAspectWSS(aspect) - self.setAspectSlowBlank(aspect) - else: - eAVSwitch.getInstance().setSlowblank(self.INPUT[input][1]) - # FIXME why do we have to reset the colorformat? bug in avs-driver? - map = {"cvbs": 0, "rgb": 1, "svideo": 2, "yuv": 3} - eAVSwitch.getInstance().setColorFormat(map[config.av.colorformat.value]) + INPUT = { "ENCODER": 0, "SCART": 1, "AUX": 2 } + eAVSwitch.getInstance().setInput(INPUT[input]) def setColorFormat(self, value): eAVSwitch.getInstance().setColorFormat(value) def setAspectRatio(self, value): eAVSwitch.getInstance().setAspectRatio(value) - self.setAspectWSS(value) - self.setAspectSlowBlank(value) def setSystem(self, value): eAVSwitch.getInstance().setVideomode(value) @@ -69,35 +57,12 @@ class AVSwitch: return val def setAspectWSS(self, aspect=None): - if aspect is None: - aspect = self.getAspectRatioSetting() - if aspect == 0 or aspect == 1: # letterbox or panscan - if not config.av.wss.value: - value = 0 # wss off - else: - value = 3 # 4:3_full_format - elif aspect == 2: # 16:9 - if not config.av.wss.value: - value = 2 # auto(4:3_off) - else: - value = 1 # auto - elif aspect == 3 or aspect == 6: # always 16:9 - value = 4 # 16:9_full_format - elif aspect == 4 or aspect == 5: # 16:10 - value = 10 # 14:9_full_format + if not config.av.wss.value: + value = 2 # auto(4:3_off) + else: + value = 1 # auto eAVSwitch.getInstance().setWSS(value) - def setAspectSlowBlank(self, aspect=None): - if aspect is None: - aspect = self.getAspectRatioSetting() - if aspect == 0 or aspect == 1: # letterbox or panscan - value = 2 # 12 V - elif aspect == 2: # 16:9 - value = 4 # auto - elif aspect == 3 or aspect == 4 or aspect == 5 or aspect == 6: # always 16:9 - value = 1 # 6V - eAVSwitch.getInstance().setSlowblank(value) - def InitAVSwitch(): config.av = ConfigSubsection() config.av.yuvenabled = ConfigBoolean(default=False) diff --git a/lib/python/Plugins/SystemPlugins/Videomode/VideoHardware.py b/lib/python/Plugins/SystemPlugins/Videomode/VideoHardware.py index 7149504a..6a85c4da 100644 --- a/lib/python/Plugins/SystemPlugins/Videomode/VideoHardware.py +++ b/lib/python/Plugins/SystemPlugins/Videomode/VideoHardware.py @@ -90,7 +90,6 @@ class VideoHardware: def __init__(self): self.last_modes_preferred = [ ] self.on_hotplug = CList() - self.standby = False self.current_mode = None self.current_port = None @@ -107,7 +106,6 @@ class VideoHardware: config.av.aspectratio.notifiers = [ ] config.av.tvsystem.notifiers = [ ] config.av.wss.notifiers = [ ] - AVSwitch.setInput = self.AVSwitchSetInput AVSwitch.getOutputAspect = self.getOutputAspect config.av.aspect.addNotifier(self.updateAspect) @@ -120,12 +118,6 @@ class VideoHardware: # self.timer.callback.append(self.readPreferredModes) # self.timer.start(1000) - config.av.colorformat.addNotifier(self.updateFastblank) - - def AVSwitchSetInput(self, mode): - self.standby = mode == "SCART" - self.updateStandby() - def readAvailableModes(self): try: modes = open("/proc/stb/video/videomode_choices").read()[:-1] @@ -322,42 +314,6 @@ class VideoHardware: open("/proc/stb/video/policy2", "w").write(policy2) except IOError: pass - self.updateSlowblank() - self.updateFastblank() - - def updateSlowblank(self): - if self.standby: - from Components.SystemInfo import SystemInfo - if SystemInfo["ScartSwitch"]: - input = "scart" - sb = "vcr" - else: - input = "off" - sb = "0" - else: - input = "encoder" - sb = "auto" - - open("/proc/stb/avs/0/sb", "w").write(sb) - open("/proc/stb/avs/0/input", "w").write(input) - - def updateStandby(self): - self.updateSlowblank() - self.updateFastblank() - - def updateFastblank(self, *args): - if self.standby: - from Components.SystemInfo import SystemInfo - if SystemInfo["ScartSwitch"]: - fb = "vcr" - else: - fb = "low" - else: - if self.current_port == "Scart" and config.av.colorformat.value == "rgb": - fb = "high" - else: - fb = "low" - open("/proc/stb/avs/0/fb", "w").write(fb) config.av.edid_override = ConfigYesNo(default = False) video_hw = VideoHardware() -- cgit v1.2.3 From 737d231c90d1e7ca5971346a4acddad5a6a58a1c Mon Sep 17 00:00:00 2001 From: ghost Date: Mon, 9 Feb 2009 11:53:17 +0100 Subject: speedup / cleanup --- lib/python/Components/NimManager.py | 214 ++++++++++++++++-------------------- 1 file changed, 97 insertions(+), 117 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/NimManager.py b/lib/python/Components/NimManager.py index 2692cb5b..4be10d53 100644 --- a/lib/python/Components/NimManager.py +++ b/lib/python/Components/NimManager.py @@ -1022,6 +1022,9 @@ def InitNimManager(nimmgr): unicableMatrix[y].vco[z].append(ConfigInteger(default=vcofreq, limits = (vcofreq, vcofreq))) unicableMatrix[y].scr[z] = ConfigSelection(choices = scrlist, default = scrlist[0][0]) + advanced_lnb_satcruser_choices = [ ("1", "SatCR 1"), ("2", "SatCR 2"), ("3", "SatCR 3"), ("4", "SatCR 4"), + ("5", "SatCR 5"), ("6", "SatCR 6"), ("7", "SatCR 7"), ("8", "SatCR 8")] + satcrvcouser = ConfigSubList() satcrvcouser.append(ConfigInteger(default=1284, limits = (0, 9999))) satcrvcouser.append(ConfigInteger(default=1400, limits = (0, 9999))) @@ -1033,70 +1036,78 @@ def InitNimManager(nimmgr): satcrvcouser.append(ConfigInteger(default=2096, limits = (0, 9999))) prio_list = [ ("-1", _("Auto")) ] - for prio in range(65): - prio_list.append((str(prio), str(prio))) - for prio in range(14000,14065): - prio_list.append((str(prio), str(prio))) - for prio in range(19000,19065): - prio_list.append((str(prio), str(prio))) + prio_list += [(str(prio), str(prio)) for prio in range(65)+range(14000,14065)+range(19000,19065)] + + advanced_lnb_csw_choices = [("none", _("None")), ("AA", _("AA")), ("AB", _("AB")), ("BA", _("BA")), ("BB", _("BB"))] + advanced_lnb_csw_choices += [(str(0xF0|y), "Input " + str(y+1)) for y in range(0, 16)] + + advanced_lnb_ucsw_choices = [("0", _("None"))] + [(str(y), "Input " + str(y)) for y in range(1, 17)] + + diseqc_mode_choices = [ + ("single", _("Single")), ("toneburst_a_b", _("Toneburst A/B")), + ("diseqc_a_b", _("DiSEqC A/B")), ("diseqc_a_b_c_d", _("DiSEqC A/B/C/D")), + ("positioner", _("Positioner"))] + positioner_mode_choices = [("usals", _("USALS")), ("manual", _("manual"))] + + diseqc_satlist_choices = [(3601, _('nothing connected'), 1)] + nimmgr.satList + + longitude_orientation_choices = [("east", _("East")), ("west", _("West"))] + latitude_orientation_choices = [("north", _("North")), ("south", _("South"))] + turning_speed_choices = [("fast", _("Fast")), ("slow", _("Slow")), ("fast epoch", _("Fast epoch"))] + + advanced_satlist_choices = nimmgr.satList + [ + (3601, _('All Satellites')+' 1', 1), (3602, _('All Satellites')+' 2', 1), + (3603, _('All Satellites')+' 3', 1), (3604, _('All Satellites')+' 4', 1)] + advanced_lnb_choices = [("0", "not available")] + [(str(y), "LNB " + str(y)) for y in range(1, 33)] + advanced_voltage_choices = [("polarization", _("Polarization")), ("13V", _("13 V")), ("18V", _("18 V"))] + advanced_tonemode_choices = [("band", _("Band")), ("on", _("On")), ("off", _("Off"))] + advanced_lnb_toneburst_choices = [("none", _("None")), ("A", _("A")), ("B", _("B"))] + advanced_lnb_allsat_diseqcmode_choices = [("1_2", _("1.2"))] + advanced_lnb_diseqcmode_choices = [("none", _("None")), ("1_0", _("1.0")), ("1_1", _("1.1")), ("1_2", _("1.2"))] + advanced_lnb_commandOrder1_0_choices = [("ct", "committed, toneburst"), ("tc", "toneburst, committed")] + advanced_lnb_commandOrder_choices = [ + ("ct", "committed, toneburst"), ("tc", "toneburst, committed"), + ("cut", "committed, uncommitted, toneburst"), ("tcu", "toneburst, committed, uncommitted"), + ("uct", "uncommitted, committed, toneburst"), ("tuc", "toneburst, uncommitted, commmitted")] + advanced_lnb_diseqc_repeat_choices = [("none", _("None")), ("one", _("One")), ("two", _("Two")), ("three", _("Three"))] + advanced_lnb_fast_turning_btime = mktime(datetime(1970, 1, 1, 7, 0).timetuple()); + advanced_lnb_fast_turning_etime = mktime(datetime(1970, 1, 1, 19, 0).timetuple()); for slot in nimmgr.nim_slots: x = slot.slot nim = config.Nims[x] if slot.isCompatible("DVB-S"): - choices = { "nothing": _("nothing connected"), - "simple": _("simple"), - "advanced": _("advanced")} + config_mode_choices = [ ("nothing", _("nothing connected")), + ("simple", _("simple")), ("advanced", _("advanced"))] if len(nimmgr.getNimListOfType(slot.type, exception = x)) > 0: - choices["equal"] = _("equal to") - choices["satposdepends"] = _("second cable of motorized LNB") + config_mode_choices.append(("equal", _("equal to"))) + config_mode_choices.append(("satposdepends", _("second cable of motorized LNB"))) if len(nimmgr.canConnectTo(x)) > 0: - choices["loopthrough"] = _("loopthrough to") - nim.configMode = ConfigSelection(choices = choices, default = "nothing") - -# for y in nimmgr.nim_slots: -# if y.slot == 0: -# if not y.isCompatible("DVB-S"): -# # reset to simple -# nim.configMode.value = "simple" -# nim.configMode.save() - - nim.diseqc13V = ConfigYesNo(default = False) - - nim.diseqcMode = ConfigSelection( - choices = [ - ("single", _("Single")), - ("toneburst_a_b", _("Toneburst A/B")), - ("diseqc_a_b", _("DiSEqC A/B")), - ("diseqc_a_b_c_d", _("DiSEqC A/B/C/D")), - ("positioner", _("Positioner"))], - default = "diseqc_a_b") - - choices = [] - for id in nimmgr.getNimListOfType("DVB-S"): - if id != x: - choices.append((str(id), nimmgr.getNimDescription(id))) - nim.connectedTo = ConfigSelection(choices = choices) - nim.simpleSingleSendDiSEqC = ConfigYesNo(default=False) - nim.simpleDiSEqCSetVoltageTone = ConfigYesNo(default=True) - nim.simpleDiSEqCOnlyOnSatChange = ConfigYesNo(default=False) - nim.diseqcA = getConfigSatlist(192, [(3601, _('nothing connected'), 1)] + nimmgr.satList) - nim.diseqcB = getConfigSatlist(130, [(3601, _('nothing connected'), 1)] + nimmgr.satList) - nim.diseqcC = ConfigSatlist(list = [(3601, _('nothing connected'), 1)] + nimmgr.satList) - nim.diseqcD = ConfigSatlist(list = [(3601, _('nothing connected'), 1)] + nimmgr.satList) - nim.positionerMode = ConfigSelection( - choices = [ - ("usals", _("USALS")), - ("manual", _("manual"))], - default = "usals") + config_mode_choices.append(("loopthrough", _("loopthrough to"))) + nim.configMode = ConfigSelection(config_mode_choices, "nothing") + + nim.diseqc13V = ConfigYesNo(False) + + nim.diseqcMode = ConfigSelection(diseqc_mode_choices, "diseqc_a_b") + + nim.connectedTo = ConfigSelection([(str(id), nimmgr.getNimDescription(id)) for id in nimmgr.getNimListOfType("DVB-S") if id != x]) + + nim.simpleSingleSendDiSEqC = ConfigYesNo(False) + nim.simpleDiSEqCSetVoltageTone = ConfigYesNo(True) + nim.simpleDiSEqCOnlyOnSatChange = ConfigYesNo(False) + nim.diseqcA = getConfigSatlist(192, diseqc_satlist_choices) + nim.diseqcB = getConfigSatlist(130, diseqc_satlist_choices) + nim.diseqcC = ConfigSatlist(list = diseqc_satlist_choices) + nim.diseqcD = ConfigSatlist(list = diseqc_satlist_choices) + nim.positionerMode = ConfigSelection(positioner_mode_choices, "usals") nim.longitude = ConfigFloat(default=[5,100], limits=[(0,359),(0,999)]) - nim.longitudeOrientation = ConfigSelection(choices={"east": _("East"), "west": _("West")}, default = "east") + nim.longitudeOrientation = ConfigSelection(longitude_orientation_choices, "east") nim.latitude = ConfigFloat(default=[50,767], limits=[(0,359),(0,999)]) - nim.latitudeOrientation = ConfigSelection(choices={"north": _("North"), "south": _("South")}, default="north") - nim.powerMeasurement = ConfigYesNo(default=True) + nim.latitudeOrientation = ConfigSelection(latitude_orientation_choices, "north") + nim.powerMeasurement = ConfigYesNo(True) nim.powerThreshold = ConfigInteger(default=hw.get_device_name() == "dm8000" and 15 or 50, limits=(0, 100)) - nim.turningSpeed = ConfigSelection(choices = [("fast", _("Fast")), ("slow", _("Slow")), ("fast epoch", _("Fast epoch")) ], default = "fast") + nim.turningSpeed = ConfigSelection(turning_speed_choices, "fast") btime = datetime(1970, 1, 1, 7, 0); nim.fastTurningBegin = ConfigDateTime(default = mktime(btime.timetuple()), formatstring = _("%H:%M"), increment = 900) etime = datetime(1970, 1, 1, 19, 0); @@ -1104,103 +1115,72 @@ def InitNimManager(nimmgr): # advanced config: nim.advanced = ConfigSubsection() - tmp = [(3601, _('All Satellites')+' 1', 1), (3602, _('All Satellites')+' 2', 1), (3603, _('All Satellites')+' 3', 1), (3604, _('All Satellites')+' 4', 1)] - nim.advanced.sats = getConfigSatlist(192,nimmgr.satList+tmp) + nim.advanced.sats = getConfigSatlist(192, advanced_satlist_choices) nim.advanced.sat = ConfigSubDict() - lnbs = [("0", "not available")] - for y in range(1, 33): - lnbs.append((str(y), "LNB " + str(y))) for x in nimmgr.satList: nim.advanced.sat[x[0]] = ConfigSubsection() - nim.advanced.sat[x[0]].voltage = ConfigSelection(choices={"polarization": _("Polarization"), "13V": _("13 V"), "18V": _("18 V")}, default = "polarization") - nim.advanced.sat[x[0]].tonemode = ConfigSelection(choices={"band": _("Band"), "on": _("On"), "off": _("Off")}, default = "band") - nim.advanced.sat[x[0]].usals = ConfigYesNo(default=True) + nim.advanced.sat[x[0]].voltage = ConfigSelection(advanced_voltage_choices, "polarization") + nim.advanced.sat[x[0]].tonemode = ConfigSelection(advanced_tonemode_choices, "band") + nim.advanced.sat[x[0]].usals = ConfigYesNo(True) nim.advanced.sat[x[0]].rotorposition = ConfigInteger(default=1, limits=(1, 255)) - nim.advanced.sat[x[0]].lnb = ConfigSelection(choices = lnbs) + nim.advanced.sat[x[0]].lnb = ConfigSelection(advanced_lnb_choices, "0") for x in range(3601, 3605): nim.advanced.sat[x] = ConfigSubsection() - nim.advanced.sat[x].voltage = ConfigSelection(choices={"polarization": _("Polarization"), "13V": _("13 V"), "18V": _("18 V")}, default = "polarization") - nim.advanced.sat[x].tonemode = ConfigSelection(choices={"band": _("Band"), "on": _("On"), "off": _("Off")}, default = "band") + nim.advanced.sat[x].voltage = ConfigSelection(advanced_voltage_choices, "polarization") + nim.advanced.sat[x].tonemode = ConfigSelection(advanced_tonemode_choices, "band") nim.advanced.sat[x].usals = ConfigYesNo(default=True) nim.advanced.sat[x].rotorposition = ConfigInteger(default=1, limits=(1, 255)) lnbnum = 33+x-3601 - nim.advanced.sat[x].lnb = ConfigSelection(choices = [("0", "not available"), (str(lnbnum), "LNB %d"%(lnbnum))], default="0") - - csw = [("none", _("None")), ("AA", _("AA")), ("AB", _("AB")), ("BA", _("BA")), ("BB", _("BB"))] - for y in range(0, 16): - csw.append((str(0xF0|y), "Input " + str(y+1))) - - ucsw = [("0", _("None"))] - for y in range(1, 17): - ucsw.append((str(y), "Input " + str(y))) + nim.advanced.sat[x].lnb = ConfigSelection([("0", "not available"), (str(lnbnum), "LNB %d"%(lnbnum))], "0") nim.advanced.lnb = ConfigSubList() nim.advanced.lnb.append(ConfigNothing()) - for x in range(1, 37): nim.advanced.lnb.append(ConfigSubsection()) - nim.advanced.lnb[x].lof = ConfigSelection(choices = lnb_choices, default = lnb_choices_default) + nim.advanced.lnb[x].lof = ConfigSelection(lnb_choices, lnb_choices_default) nim.advanced.lnb[x].lofl = ConfigInteger(default=9750, limits = (0, 99999)) nim.advanced.lnb[x].lofh = ConfigInteger(default=10600, limits = (0, 99999)) nim.advanced.lnb[x].threshold = ConfigInteger(default=11700, limits = (0, 99999)) - nim.advanced.lnb[x].unicable = ConfigSelection(choices = unicable_choices, default = unicable_choices_default) + nim.advanced.lnb[x].unicable = ConfigSelection(unicable_choices, unicable_choices_default) - nim.advanced.lnb[x].unicableLnb = unicableLnb - nim.advanced.lnb[x].unicableLnbManufacturer = ConfigSelection(choices = UnicableLnbManufacturers, default = UnicableLnbManufacturers[0]) + nim.advanced.lnb[x].unicableLnb = unicableLnb # is this okay? all lnb use the same ConfigSubDict ? ! ? + nim.advanced.lnb[x].unicableLnbManufacturer = ConfigSelection(UnicableLnbManufacturers, UnicableLnbManufacturers[0]) - nim.advanced.lnb[x].unicableMatrix = unicableMatrix - nim.advanced.lnb[x].unicableMatrixManufacturer = ConfigSelection(choices = UnicableMatrixManufacturers, default = UnicableMatrixManufacturers[0]) + nim.advanced.lnb[x].unicableMatrix = unicableMatrix # is this okay? all lnb use the same ConfigSubDict ? ! ? + nim.advanced.lnb[x].unicableMatrixManufacturer = ConfigSelection(UnicableMatrixManufacturers, UnicableMatrixManufacturers[0]) - nim.advanced.lnb[x].satcruser = ConfigSelection(choices=[ - ("1", "SatCR 1"), - ("2", "SatCR 2"), - ("3", "SatCR 3"), - ("4", "SatCR 4"), - ("5", "SatCR 5"), - ("6", "SatCR 6"), - ("7", "SatCR 7"), - ("8", "SatCR 8")], - default="1") - nim.advanced.lnb[x].satcrvcouser = satcrvcouser + nim.advanced.lnb[x].satcruser = ConfigSelection(advanced_lnb_satcruser_choices, "1") + nim.advanced.lnb[x].satcrvcouser = satcrvcouser # is this okay? all lnb use the same ConfigSubDict ? ! ? # nim.advanced.lnb[x].output_12v = ConfigSelection(choices = [("0V", _("0 V")), ("12V", _("12 V"))], default="0V") - nim.advanced.lnb[x].increased_voltage = ConfigYesNo(default=False) - nim.advanced.lnb[x].toneburst = ConfigSelection(choices = [("none", _("None")), ("A", _("A")), ("B", _("B"))], default = "none") + nim.advanced.lnb[x].increased_voltage = ConfigYesNo(False) + nim.advanced.lnb[x].toneburst = ConfigSelection(advanced_lnb_toneburst_choices, "none") if x > 32: - nim.advanced.lnb[x].diseqcMode = ConfigSelection(choices = [("1_2", _("1.2"))], default = "1_2") + nim.advanced.lnb[x].diseqcMode = ConfigSelection(advanced_lnb_allsat_diseqcmode_choices, "1_2") else: - nim.advanced.lnb[x].diseqcMode = ConfigSelection(choices = [("none", _("None")), ("1_0", _("1.0")), ("1_1", _("1.1")), ("1_2", _("1.2"))], default = "none") - nim.advanced.lnb[x].commitedDiseqcCommand = ConfigSelection(choices = csw) - nim.advanced.lnb[x].fastDiseqc = ConfigYesNo(default=False) - nim.advanced.lnb[x].sequenceRepeat = ConfigYesNo(default=False) - nim.advanced.lnb[x].commandOrder1_0 = ConfigSelection(choices = [("ct", "committed, toneburst"), ("tc", "toneburst, committed")], default = "ct") - nim.advanced.lnb[x].commandOrder = ConfigSelection(choices = [ - ("ct", "committed, toneburst"), - ("tc", "toneburst, committed"), - ("cut", "committed, uncommitted, toneburst"), - ("tcu", "toneburst, committed, uncommitted"), - ("uct", "uncommitted, committed, toneburst"), - ("tuc", "toneburst, uncommitted, commmitted")], - default="ct") - nim.advanced.lnb[x].uncommittedDiseqcCommand = ConfigSelection(choices = ucsw) - nim.advanced.lnb[x].diseqcRepeats = ConfigSelection(choices = [("none", _("None")), ("one", _("One")), ("two", _("Two")), ("three", _("Three"))], default = "none") + nim.advanced.lnb[x].diseqcMode = ConfigSelection(advanced_lnb_diseqcmode_choices, "none") + nim.advanced.lnb[x].commitedDiseqcCommand = ConfigSelection(advanced_lnb_csw_choices) + nim.advanced.lnb[x].fastDiseqc = ConfigYesNo(False) + nim.advanced.lnb[x].sequenceRepeat = ConfigYesNo(False) + nim.advanced.lnb[x].commandOrder1_0 = ConfigSelection(advanced_lnb_commandOrder1_0_choices, "ct") + nim.advanced.lnb[x].commandOrder = ConfigSelection(advanced_lnb_commandOrder_choices, "ct") + nim.advanced.lnb[x].uncommittedDiseqcCommand = ConfigSelection(advanced_lnb_ucsw_choices) + nim.advanced.lnb[x].diseqcRepeats = ConfigSelection(advanced_lnb_diseqc_repeat_choices, "none") nim.advanced.lnb[x].longitude = ConfigFloat(default = [5,100], limits = [(0,359),(0,999)]) - nim.advanced.lnb[x].longitudeOrientation = ConfigSelection(choices = [("east", _("East")), ("west", _("West"))], default = "east") + nim.advanced.lnb[x].longitudeOrientation = ConfigSelection(longitude_orientation_choices, "east") nim.advanced.lnb[x].latitude = ConfigFloat(default = [50,767], limits = [(0,359),(0,999)]) - nim.advanced.lnb[x].latitudeOrientation = ConfigSelection(choices = [("north", _("North")), ("south", _("South"))], default = "north") + nim.advanced.lnb[x].latitudeOrientation = ConfigSelection(latitude_orientation_choices, "north") nim.advanced.lnb[x].powerMeasurement = ConfigYesNo(default=True) nim.advanced.lnb[x].powerThreshold = ConfigInteger(default=hw.get_device_name() == "dm8000" and 15 or 50, limits=(0, 100)) - nim.advanced.lnb[x].turningSpeed = ConfigSelection(choices = [("fast", _("Fast")), ("slow", _("Slow")), ("fast epoch", _("Fast epoch"))], default = "fast") - btime = datetime(1970, 1, 1, 7, 0); - nim.advanced.lnb[x].fastTurningBegin = ConfigDateTime(default=mktime(btime.timetuple()), formatstring = _("%H:%M"), increment = 600) - etime = datetime(1970, 1, 1, 19, 0); - nim.advanced.lnb[x].fastTurningEnd = ConfigDateTime(default=mktime(etime.timetuple()), formatstring = _("%H:%M"), increment = 600) - nim.advanced.lnb[x].prio = ConfigSelection(default="-1", choices=prio_list) + nim.advanced.lnb[x].turningSpeed = ConfigSelection(turning_speed_choices, "fast") + nim.advanced.lnb[x].fastTurningBegin = ConfigDateTime(default=advanced_lnb_fast_turning_btime, formatstring = _("%H:%M"), increment = 600) + nim.advanced.lnb[x].fastTurningEnd = ConfigDateTime(default=advanced_lnb_fast_turning_etime, formatstring = _("%H:%M"), increment = 600) + nim.advanced.lnb[x].prio = ConfigSelection(prio_list, "-1") elif slot.isCompatible("DVB-C"): nim.configMode = ConfigSelection( choices = { -- cgit v1.2.3 From ddff18e87301a328b7b8b03d2f68de8e1029120b Mon Sep 17 00:00:00 2001 From: ghost Date: Mon, 9 Feb 2009 12:00:52 +0100 Subject: increased performance on ConfigSelection and ConfigSet create to speedup enigma2 start for performance reasons we have removed the assertion to check if the ConfigSelection default is in choices list/dict... so please ensure that your default entry is in the choices list.. when it is not None! --- lib/python/Components/config.py | 183 +++++++++++++++++++++++++++------------- 1 file changed, 125 insertions(+), 58 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/config.py b/lib/python/Components/config.py index 6eeca698..1f2975ef 100755 --- a/lib/python/Components/config.py +++ b/lib/python/Components/config.py @@ -28,7 +28,6 @@ import os # class ConfigElement(object): def __init__(self): - object.__init__(self) self.saved_value = None self.last_value = None @@ -140,6 +139,104 @@ def getKeyNumber(key): assert key in KEY_NUMBERS return key - KEY_0 +class choicesList(object): # XXX: we might want a better name for this + LIST_TYPE_LIST = 1 + LIST_TYPE_DICT = 2 + + def __init__(self, choices, type = None): + self.choices = choices + if type is None: + if isinstance(choices, list): + self.type = choicesList.LIST_TYPE_LIST + elif isinstance(choices, dict): + self.type = choicesList.LIST_TYPE_DICT + else: + assert False, "choices must be dict or list!" + else: + self.type = type + + def __list__(self): + if self.type is choicesList.LIST_TYPE_LIST: + ret = [isinstance(x, tuple) and x[0] or x for x in self.choices] + else: + ret = self.choices.keys() + return ret or [""] + + def __iter__(self): + if self.type is choicesList.LIST_TYPE_LIST: + ret = [isinstance(x, tuple) and x[0] or x for x in self.choices] + else: + ret = self.choices + return iter(ret or [""]) + + def __len__(self): + return len(self.choices) or 1 + + def __getitem__(self, index): + if self.type is choicesList.LIST_TYPE_LIST: + ret = self.choices[index] + if isinstance(ret, tuple): + ret = ret[0] + return ret + return self.choices.keys()[index] + + def index(self, value): + return self.__list__().index(value) + + def __setitem__(self, index, value): + if self.type is choicesList.LIST_TYPE_LIST: + if isinstance(self.choices[index], tuple): + self.choices[index] = (value, self.choices[index][1]) + else: + self.choices[index] = value + else: + key = self.choices.keys()[index] + orig = self.choices[key] + del self.choices[key] + self.choices[value] = orig + + def default(self): + if self.type is choicesList.LIST_TYPE_LIST: + default = self.choices[0] + if isinstance(default, tuple): + default = default[0] + else: + default = self.choices.keys()[0] + return default + +class descriptionList(choicesList): # XXX: we might want a better name for this + def __list__(self): + if self.type is choicesList.LIST_TYPE_LIST: + ret = [isinstance(x, tuple) and x[1] or x for x in self.choices] + else: + ret = self.choices.values() + return ret or [""] + + def __iter__(self): + return iter(self.__list__()) + + def __getitem__(self, index): + if self.type is choicesList.LIST_TYPE_LIST: + for x in self.choices: + if isinstance(x, tuple): + if x[0] is index: + return str(x[1]) + elif x is index: + return str(x) + return str(index) # Fallback! + else: + return str(self.choices.get(index, "")) + + def __setitem__(self, index, value): + if self.type is choicesList.LIST_TYPE_LIST: + i = self.index(index) + if isinstance(self.choices[i], tuple): + self.choices[i] = (self.choices[i][0], value) + else: + self.choices[i] = value + else: + self.choices[index] = value + # # ConfigSelection is a "one of.."-type. # it has the "choices", usually a list, which contains @@ -151,51 +248,30 @@ def getKeyNumber(key): class ConfigSelection(ConfigElement): def __init__(self, choices, default = None): ConfigElement.__init__(self) - self._value = None - self.setChoices(choices, default) - self.last_value = self._value - def setChoices(self, choices, default = None): - self.choices = [] - self.description = {} - - if isinstance(choices, list): - for x in choices: - if isinstance(x, tuple): - self.choices.append(x[0]) - self.description[x[0]] = x[1] - else: - self.choices.append(x) - self.description[x] = x - elif isinstance(choices, dict): - for (key, val) in choices.items(): - self.choices.append(key) - self.description[key] = val - else: - assert False, "ConfigSelection choices must be dict or list!" - - #assert len(self.choices), "you can't have an empty configselection" - if len(self.choices) == 0: - self.choices = [""] - self.description[""] = "" + # this is an exakt copy of def setChoices.. but we save the call overhead + self.choices = choicesList(choices) if default is None: - default = self.choices[0] + default = self.choices.default() - assert default in self.choices, "default must be in choice list, but " + repr(default) + " is not!" -# for x in self.choices: -# assert isinstance(x, str), "ConfigSelection choices must be strings" - self.default = default + self.default = self._value = self.last_value = default + self.changed() + + def setChoices(self, choices, default = None): + self.choices = choicesList(choices) + + if default is None: + default = self.choices.default() - if self.value == None or not self.value in self.choices: - self.value = default + self.default = self._value = self.last_value = default + self.changed() def setValue(self, value): if value in self.choices: self._value = value else: self._value = self.default - self.changed() def tostring(self, val): @@ -206,9 +282,8 @@ class ConfigSelection(ConfigElement): def setCurrentText(self, text): i = self.choices.index(self.value) - del self.description[self.choices[i]] self.choices[i] = text - self.description[text] = text + descriptionList(self.choices.choices, self.choices.type)[text] = text self._value = text value = property(getValue, setValue) @@ -237,13 +312,13 @@ class ConfigSelection(ConfigElement): self.value = self.choices[(i + 1) % nchoices] def getText(self): - descr = self.description[self.value] + descr = descriptionList(self.choices.choices, self.choices.type)[self.value] if len(descr): return _(descr) return descr def getMulti(self, selected): - descr = self.description[self.value] + descr = descriptionList(self.choices.choices, self.choices.type)[self.value] if len(descr): return ("text", _(descr)) return ("text", descr) @@ -252,11 +327,12 @@ class ConfigSelection(ConfigElement): def getHTML(self, id): res = "" for v in self.choices: + descr = descriptionList(self.choices.choices, self.choices.type)[v] if self.value == v: checked = 'checked="checked" ' else: checked = '' - res += '' + self.description[v] + "
\n" + res += '' + descr + "
\n" return res; def unsafeAssign(self, value): @@ -1037,28 +1113,17 @@ class ConfigSatlist(ConfigSelection): class ConfigSet(ConfigElement): def __init__(self, choices, default = []): ConfigElement.__init__(self) - self.choices = [] - self.description = {} if isinstance(choices, list): choices.sort() - for x in choices: - if isinstance(x, tuple): - self.choices.append(x[0]) - self.description[x[0]] = str(x[1]) - else: - self.choices.append(x) - self.description[x] = str(x) + self.choices = choicesList(choices, choicesList.LIST_TYPE_LIST) else: assert False, "ConfigSet choices must be a list!" - if len(self.choices) == 0: - self.choices = [""] - self.description[""] = "" if default is None: default = [] self.pos = -1 default.sort() self.last_value = self.default = default - self.value = default+[] + self.value = default[:] def toggleChoice(self, choice): if choice in self.value: @@ -1085,8 +1150,9 @@ class ConfigSet(ConfigElement): def genString(self, lst): res = "" + description = descriptionList(self.choices.choices, choicesList.LIST_TYPE_LIST) for x in lst: - res += self.description[x]+" " + res += description[x]+" " return res def getText(self): @@ -1096,7 +1162,8 @@ class ConfigSet(ConfigElement): if not selected or self.pos == -1: return ("text", self.genString(self.value)) else: - tmp = self.value+[] + description = descriptionList(self.choices.choices, choicesList.LIST_TYPE_LIST) + tmp = self.value[:] ch = self.choices[self.pos] mem = ch in self.value if not mem: @@ -1106,16 +1173,16 @@ class ConfigSet(ConfigElement): val1 = self.genString(tmp[:ind]) val2 = " "+self.genString(tmp[ind+1:]) if mem: - chstr = " "+self.description[ch]+" " + chstr = " "+description[ch]+" " else: - chstr = "("+self.description[ch]+")" + chstr = "("+description[ch]+")" return ("mtext", val1+chstr+val2, range(len(val1),len(val1)+len(chstr))) def onDeselect(self, session): self.pos = -1 if not self.last_value == self.value: self.changedFinal() - self.last_value = self.value+[] + self.last_value = self.value[:] def tostring(self, value): return str(value) -- cgit v1.2.3 From 7e8ac9dc454a3b6edc2d3c68e1ec92765e4fd34f Mon Sep 17 00:00:00 2001 From: ghost Date: Mon, 9 Feb 2009 12:50:38 +0100 Subject: Revert "increased performance on ConfigSelection and ConfigSet create to speedup enigma2 start" This reverts commit ddff18e87301a328b7b8b03d2f68de8e1029120b until its working okay ;) --- lib/python/Components/config.py | 183 +++++++++++++--------------------------- 1 file changed, 58 insertions(+), 125 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/config.py b/lib/python/Components/config.py index 1f2975ef..6eeca698 100755 --- a/lib/python/Components/config.py +++ b/lib/python/Components/config.py @@ -28,6 +28,7 @@ import os # class ConfigElement(object): def __init__(self): + object.__init__(self) self.saved_value = None self.last_value = None @@ -139,104 +140,6 @@ def getKeyNumber(key): assert key in KEY_NUMBERS return key - KEY_0 -class choicesList(object): # XXX: we might want a better name for this - LIST_TYPE_LIST = 1 - LIST_TYPE_DICT = 2 - - def __init__(self, choices, type = None): - self.choices = choices - if type is None: - if isinstance(choices, list): - self.type = choicesList.LIST_TYPE_LIST - elif isinstance(choices, dict): - self.type = choicesList.LIST_TYPE_DICT - else: - assert False, "choices must be dict or list!" - else: - self.type = type - - def __list__(self): - if self.type is choicesList.LIST_TYPE_LIST: - ret = [isinstance(x, tuple) and x[0] or x for x in self.choices] - else: - ret = self.choices.keys() - return ret or [""] - - def __iter__(self): - if self.type is choicesList.LIST_TYPE_LIST: - ret = [isinstance(x, tuple) and x[0] or x for x in self.choices] - else: - ret = self.choices - return iter(ret or [""]) - - def __len__(self): - return len(self.choices) or 1 - - def __getitem__(self, index): - if self.type is choicesList.LIST_TYPE_LIST: - ret = self.choices[index] - if isinstance(ret, tuple): - ret = ret[0] - return ret - return self.choices.keys()[index] - - def index(self, value): - return self.__list__().index(value) - - def __setitem__(self, index, value): - if self.type is choicesList.LIST_TYPE_LIST: - if isinstance(self.choices[index], tuple): - self.choices[index] = (value, self.choices[index][1]) - else: - self.choices[index] = value - else: - key = self.choices.keys()[index] - orig = self.choices[key] - del self.choices[key] - self.choices[value] = orig - - def default(self): - if self.type is choicesList.LIST_TYPE_LIST: - default = self.choices[0] - if isinstance(default, tuple): - default = default[0] - else: - default = self.choices.keys()[0] - return default - -class descriptionList(choicesList): # XXX: we might want a better name for this - def __list__(self): - if self.type is choicesList.LIST_TYPE_LIST: - ret = [isinstance(x, tuple) and x[1] or x for x in self.choices] - else: - ret = self.choices.values() - return ret or [""] - - def __iter__(self): - return iter(self.__list__()) - - def __getitem__(self, index): - if self.type is choicesList.LIST_TYPE_LIST: - for x in self.choices: - if isinstance(x, tuple): - if x[0] is index: - return str(x[1]) - elif x is index: - return str(x) - return str(index) # Fallback! - else: - return str(self.choices.get(index, "")) - - def __setitem__(self, index, value): - if self.type is choicesList.LIST_TYPE_LIST: - i = self.index(index) - if isinstance(self.choices[i], tuple): - self.choices[i] = (self.choices[i][0], value) - else: - self.choices[i] = value - else: - self.choices[index] = value - # # ConfigSelection is a "one of.."-type. # it has the "choices", usually a list, which contains @@ -248,30 +151,51 @@ class descriptionList(choicesList): # XXX: we might want a better name for this class ConfigSelection(ConfigElement): def __init__(self, choices, default = None): ConfigElement.__init__(self) - - # this is an exakt copy of def setChoices.. but we save the call overhead - self.choices = choicesList(choices) - - if default is None: - default = self.choices.default() - - self.default = self._value = self.last_value = default - self.changed() + self._value = None + self.setChoices(choices, default) + self.last_value = self._value def setChoices(self, choices, default = None): - self.choices = choicesList(choices) + self.choices = [] + self.description = {} + + if isinstance(choices, list): + for x in choices: + if isinstance(x, tuple): + self.choices.append(x[0]) + self.description[x[0]] = x[1] + else: + self.choices.append(x) + self.description[x] = x + elif isinstance(choices, dict): + for (key, val) in choices.items(): + self.choices.append(key) + self.description[key] = val + else: + assert False, "ConfigSelection choices must be dict or list!" + + #assert len(self.choices), "you can't have an empty configselection" + if len(self.choices) == 0: + self.choices = [""] + self.description[""] = "" if default is None: - default = self.choices.default() + default = self.choices[0] - self.default = self._value = self.last_value = default - self.changed() + assert default in self.choices, "default must be in choice list, but " + repr(default) + " is not!" +# for x in self.choices: +# assert isinstance(x, str), "ConfigSelection choices must be strings" + self.default = default + + if self.value == None or not self.value in self.choices: + self.value = default def setValue(self, value): if value in self.choices: self._value = value else: self._value = self.default + self.changed() def tostring(self, val): @@ -282,8 +206,9 @@ class ConfigSelection(ConfigElement): def setCurrentText(self, text): i = self.choices.index(self.value) + del self.description[self.choices[i]] self.choices[i] = text - descriptionList(self.choices.choices, self.choices.type)[text] = text + self.description[text] = text self._value = text value = property(getValue, setValue) @@ -312,13 +237,13 @@ class ConfigSelection(ConfigElement): self.value = self.choices[(i + 1) % nchoices] def getText(self): - descr = descriptionList(self.choices.choices, self.choices.type)[self.value] + descr = self.description[self.value] if len(descr): return _(descr) return descr def getMulti(self, selected): - descr = descriptionList(self.choices.choices, self.choices.type)[self.value] + descr = self.description[self.value] if len(descr): return ("text", _(descr)) return ("text", descr) @@ -327,12 +252,11 @@ class ConfigSelection(ConfigElement): def getHTML(self, id): res = "" for v in self.choices: - descr = descriptionList(self.choices.choices, self.choices.type)[v] if self.value == v: checked = 'checked="checked" ' else: checked = '' - res += '' + descr + "
\n" + res += '' + self.description[v] + "
\n" return res; def unsafeAssign(self, value): @@ -1113,17 +1037,28 @@ class ConfigSatlist(ConfigSelection): class ConfigSet(ConfigElement): def __init__(self, choices, default = []): ConfigElement.__init__(self) + self.choices = [] + self.description = {} if isinstance(choices, list): choices.sort() - self.choices = choicesList(choices, choicesList.LIST_TYPE_LIST) + for x in choices: + if isinstance(x, tuple): + self.choices.append(x[0]) + self.description[x[0]] = str(x[1]) + else: + self.choices.append(x) + self.description[x] = str(x) else: assert False, "ConfigSet choices must be a list!" + if len(self.choices) == 0: + self.choices = [""] + self.description[""] = "" if default is None: default = [] self.pos = -1 default.sort() self.last_value = self.default = default - self.value = default[:] + self.value = default+[] def toggleChoice(self, choice): if choice in self.value: @@ -1150,9 +1085,8 @@ class ConfigSet(ConfigElement): def genString(self, lst): res = "" - description = descriptionList(self.choices.choices, choicesList.LIST_TYPE_LIST) for x in lst: - res += description[x]+" " + res += self.description[x]+" " return res def getText(self): @@ -1162,8 +1096,7 @@ class ConfigSet(ConfigElement): if not selected or self.pos == -1: return ("text", self.genString(self.value)) else: - description = descriptionList(self.choices.choices, choicesList.LIST_TYPE_LIST) - tmp = self.value[:] + tmp = self.value+[] ch = self.choices[self.pos] mem = ch in self.value if not mem: @@ -1173,16 +1106,16 @@ class ConfigSet(ConfigElement): val1 = self.genString(tmp[:ind]) val2 = " "+self.genString(tmp[ind+1:]) if mem: - chstr = " "+description[ch]+" " + chstr = " "+self.description[ch]+" " else: - chstr = "("+description[ch]+")" + chstr = "("+self.description[ch]+")" return ("mtext", val1+chstr+val2, range(len(val1),len(val1)+len(chstr))) def onDeselect(self, session): self.pos = -1 if not self.last_value == self.value: self.changedFinal() - self.last_value = self.value[:] + self.last_value = self.value+[] def tostring(self, value): return str(value) -- cgit v1.2.3 From 0b8963f5c10d8adc880d2c4ac24e282d5d055497 Mon Sep 17 00:00:00 2001 From: ghost Date: Mon, 9 Feb 2009 14:50:06 +0100 Subject: ConfigSelection / ConfigSet speedup second try --- lib/python/Components/config.py | 174 ++++++++++++++++++++++++++++------------ 1 file changed, 122 insertions(+), 52 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/config.py b/lib/python/Components/config.py index 6eeca698..0faf26da 100755 --- a/lib/python/Components/config.py +++ b/lib/python/Components/config.py @@ -28,7 +28,6 @@ import os # class ConfigElement(object): def __init__(self): - object.__init__(self) self.saved_value = None self.last_value = None @@ -140,6 +139,107 @@ def getKeyNumber(key): assert key in KEY_NUMBERS return key - KEY_0 +class choicesList(object): # XXX: we might want a better name for this + LIST_TYPE_LIST = 1 + LIST_TYPE_DICT = 2 + + def __init__(self, choices, type = None): + object.__init__(self) + self.choices = choices + if type is None: + if isinstance(choices, list): + self.type = choicesList.LIST_TYPE_LIST + elif isinstance(choices, dict): + self.type = choicesList.LIST_TYPE_DICT + else: + assert False, "choices must be dict or list!" + else: + self.type = type + + def __list__(self): + if self.type == choicesList.LIST_TYPE_LIST: + ret = [isinstance(x, tuple) and x[0] or x for x in self.choices] + else: + ret = self.choices.keys() + return ret or [""] + + def __iter__(self): + if self.type == choicesList.LIST_TYPE_LIST: + ret = [isinstance(x, tuple) and x[0] or x for x in self.choices] + else: + ret = self.choices + return iter(ret or [""]) + + def __len__(self): + return len(self.choices) or 1 + + def __getitem__(self, index): + if self.type == choicesList.LIST_TYPE_LIST: + ret = self.choices[index] + if isinstance(ret, tuple): + ret = ret[0] + return ret + return self.choices.keys()[index] + + def index(self, value): + return self.__list__().index(value) + + def __setitem__(self, index, value): + if self.type == choicesList.LIST_TYPE_LIST: + orig = self.choices[index] + if isinstance(orig, tuple): + self.choices[index] = (value, orig[1]) + else: + self.choices[index] = value + else: + key = self.choices.keys()[index] + orig = self.choices[key] + del self.choices[key] + self.choices[value] = orig + + def default(self): + if self.type is choicesList.LIST_TYPE_LIST: + default = self.choices[0] + if isinstance(default, tuple): + default = default[0] + else: + default = self.choices.keys()[0] + return default + +class descriptionList(choicesList): # XXX: we might want a better name for this + def __list__(self): + if self.type == choicesList.LIST_TYPE_LIST: + ret = [isinstance(x, tuple) and x[1] or x for x in self.choices] + else: + ret = self.choices.values() + return ret or [""] + + def __iter__(self): + return iter(self.__list__()) + + def __getitem__(self, index): + if self.type == choicesList.LIST_TYPE_LIST: + for x in self.choices: + if isinstance(x, tuple): + if x[0] == index: + return str(x[1]) + elif x == index: + return str(x) + return str(index) # Fallback! + else: + return str(self.choices.get(index, "")) + + def __setitem__(self, index, value): + if self.type == choicesList.LIST_TYPE_LIST: + i = self.index(index) + orig = self.choices[i] + if isinstance(orig, tuple): + self.choices[i] = (orig[0], value) + else: + self.choices[i] = value + else: + self.choices[index] = value + # # ConfigSelection is a "one of.."-type. # it has the "choices", usually a list, which contains @@ -151,43 +251,21 @@ def getKeyNumber(key): class ConfigSelection(ConfigElement): def __init__(self, choices, default = None): ConfigElement.__init__(self) - self._value = None - self.setChoices(choices, default) - self.last_value = self._value + self.choices = choicesList(choices) + + if default is None: + default = self.choices.default() + + self.default = self._value = self.last_value = default + self.changed() def setChoices(self, choices, default = None): - self.choices = [] - self.description = {} - - if isinstance(choices, list): - for x in choices: - if isinstance(x, tuple): - self.choices.append(x[0]) - self.description[x[0]] = x[1] - else: - self.choices.append(x) - self.description[x] = x - elif isinstance(choices, dict): - for (key, val) in choices.items(): - self.choices.append(key) - self.description[key] = val - else: - assert False, "ConfigSelection choices must be dict or list!" - - #assert len(self.choices), "you can't have an empty configselection" - if len(self.choices) == 0: - self.choices = [""] - self.description[""] = "" + self.choices = choicesList(choices) if default is None: - default = self.choices[0] - - assert default in self.choices, "default must be in choice list, but " + repr(default) + " is not!" -# for x in self.choices: -# assert isinstance(x, str), "ConfigSelection choices must be strings" - self.default = default + default = self.choices.default() - if self.value == None or not self.value in self.choices: + if self.value not in self.choices: self.value = default def setValue(self, value): @@ -195,7 +273,6 @@ class ConfigSelection(ConfigElement): self._value = value else: self._value = self.default - self.changed() def tostring(self, val): @@ -206,7 +283,6 @@ class ConfigSelection(ConfigElement): def setCurrentText(self, text): i = self.choices.index(self.value) - del self.description[self.choices[i]] self.choices[i] = text self.description[text] = text self._value = text @@ -230,7 +306,7 @@ class ConfigSelection(ConfigElement): self.value = self.choices[0] elif key == KEY_END: self.value = self.choices[nchoices - 1] - + def selectNext(self): nchoices = len(self.choices) i = self.choices.index(self.value) @@ -252,17 +328,20 @@ class ConfigSelection(ConfigElement): def getHTML(self, id): res = "" for v in self.choices: + descr = self.description[v] if self.value == v: checked = 'checked="checked" ' else: checked = '' - res += '' + self.description[v] + "
\n" + res += '' + descr + "
\n" return res; def unsafeAssign(self, value): # setValue does check if value is in choices. This is safe enough. self.value = value + description = property(lambda self: descriptionList(self.choices.choices, self.choices.type)) + # a binary decision. # # several customized versions exist for different @@ -1037,28 +1116,17 @@ class ConfigSatlist(ConfigSelection): class ConfigSet(ConfigElement): def __init__(self, choices, default = []): ConfigElement.__init__(self) - self.choices = [] - self.description = {} if isinstance(choices, list): choices.sort() - for x in choices: - if isinstance(x, tuple): - self.choices.append(x[0]) - self.description[x[0]] = str(x[1]) - else: - self.choices.append(x) - self.description[x] = str(x) + self.choices = choicesList(choices, choicesList.LIST_TYPE_LIST) else: assert False, "ConfigSet choices must be a list!" - if len(self.choices) == 0: - self.choices = [""] - self.description[""] = "" if default is None: default = [] self.pos = -1 default.sort() self.last_value = self.default = default - self.value = default+[] + self.value = default[:] def toggleChoice(self, choice): if choice in self.value: @@ -1096,7 +1164,7 @@ class ConfigSet(ConfigElement): if not selected or self.pos == -1: return ("text", self.genString(self.value)) else: - tmp = self.value+[] + tmp = self.value[:] ch = self.choices[self.pos] mem = ch in self.value if not mem: @@ -1115,7 +1183,7 @@ class ConfigSet(ConfigElement): self.pos = -1 if not self.last_value == self.value: self.changedFinal() - self.last_value = self.value+[] + self.last_value = self.value[:] def tostring(self, value): return str(value) @@ -1123,6 +1191,8 @@ class ConfigSet(ConfigElement): def fromstring(self, val): return eval(val) + description = property(lambda self: descriptionList(self.choices.choices, choicesList.LIST_TYPE_LIST)) + class ConfigLocations(ConfigElement): def __init__(self, default = [], visible_width = False): ConfigElement.__init__(self) -- cgit v1.2.3 From c0ecfb78c4aa1beb6c0a525c5bf9ac3653bd46ae Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Mon, 9 Feb 2009 15:09:32 +0100 Subject: properly handle: non-accessible directories, 'None' (=list of mountpoints) with showMountPoints=false --- lib/python/Components/FileList.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/FileList.py b/lib/python/Components/FileList.py index a93d4441..84abf328 100644 --- a/lib/python/Components/FileList.py +++ b/lib/python/Components/FileList.py @@ -119,8 +119,6 @@ class FileList(MenuList): def changeDir(self, directory, select = None): self.list = [] - if directory and not os_path.isdir(directory): - directory = None # if we are just entering from the list of mount points: if self.current_directory is None: if directory and self.showMountpoints: @@ -138,6 +136,9 @@ class FileList(MenuList): self.list.append(FileEntryComponent(name = p.description, absolute = path, isDir = True)) files = [ ] directories = [ ] + elif directory is None: + files = [ ] + directories = [ ] elif self.useServiceRef: root = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + directory) if self.additional_extensions: -- cgit v1.2.3 From b7f0a4fed2bf0249c9bffc3cc185688748ab3058 Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Tue, 10 Feb 2009 15:02:13 +0100 Subject: stop idle timer when removing a harddisk --- lib/python/Components/Harddisk.py | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'lib/python/Components') diff --git a/lib/python/Components/Harddisk.py b/lib/python/Components/Harddisk.py index 44245ebb..470055e4 100644 --- a/lib/python/Components/Harddisk.py +++ b/lib/python/Components/Harddisk.py @@ -21,6 +21,7 @@ class Harddisk: s_minor = int(tmp[1]) self.max_idle_time = 0 self.idle_running = False + self.timer = None for disc in listdir("/dev/discs"): path = readlink('/dev/discs/'+disc) devidex = '/dev/discs/'+disc+'/' @@ -37,6 +38,11 @@ class Harddisk: def __lt__(self, ob): return self.device < ob.device + def stop(self): + if self.timer: + self.timer.stop() + self.timer.callback.remove(self.runIdle) + def bus(self): ide_cf = self.device.find("hd") == 0 and self.devidex2.find("host0") == -1 # 7025 specific internal = self.device.find("hd") == 0 @@ -454,6 +460,7 @@ class HarddiskManager: idx = 0 for hdd in self.hdd: if hdd.device == device: + self.hdd[x].stop() del self.hdd[idx] break SystemInfo["Harddisk"] = len(self.hdd) > 0 -- cgit v1.2.3 From eb6da808cc048f7a2e78c200094d290c5b3f2579 Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Tue, 10 Feb 2009 16:04:03 +0100 Subject: fix sleep-after-access --- lib/python/Components/Harddisk.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/Harddisk.py b/lib/python/Components/Harddisk.py index 470055e4..6c6c3c6c 100644 --- a/lib/python/Components/Harddisk.py +++ b/lib/python/Components/Harddisk.py @@ -263,7 +263,7 @@ class Harddisk: print "hdd was accessed since previous check!" self.last_stat = l self.last_access = t - self.idle_time = 0 + idle_time = 0 self.is_sleeping = False else: print "hdd IDLE!" -- cgit v1.2.3 From 90d04613d81ad20728dea5ff9795569bc14df03c Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Tue, 10 Feb 2009 22:29:43 +0100 Subject: Add MultoContentTemplateColor, which takes the color out of a templated argument --- lib/python/Components/MultiContent.py | 2 ++ 1 file changed, 2 insertions(+) (limited to 'lib/python/Components') diff --git a/lib/python/Components/MultiContent.py b/lib/python/Components/MultiContent.py index 71096df8..ff0219ff 100644 --- a/lib/python/Components/MultiContent.py +++ b/lib/python/Components/MultiContent.py @@ -1,5 +1,7 @@ from enigma import eListboxPythonMultiContent, RT_HALIGN_LEFT, RT_VALIGN_TOP +def MultiContentTemplateColor(n): return 0xff000000 | n + def MultiContentEntryText(pos = (0, 0), size = (0, 0), font = 0, flags = RT_HALIGN_LEFT | RT_VALIGN_TOP, text = "", color = None, color_sel = None, backcolor = None, backcolor_sel = None, border_width = None, border_color = None): return (eListboxPythonMultiContent.TYPE_TEXT, pos[0], pos[1], size[0], size[1], font, flags, text, color, color_sel, backcolor, backcolor_sel, border_width, border_color) -- cgit v1.2.3 From 9190777bc7e49f2a5e451ee58f3085215f9cf74a Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Tue, 10 Feb 2009 22:30:03 +0100 Subject: add modifyEntry --- lib/python/Components/Sources/List.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/Sources/List.py b/lib/python/Components/Sources/List.py index 26c68ab5..23b53957 100644 --- a/lib/python/Components/Sources/List.py +++ b/lib/python/Components/Sources/List.py @@ -28,7 +28,11 @@ to generate HTML.""" def entry_changed(self, index): if not self.disable_callbacks: self.downstream_elements.entry_changed(self, index) - + + def modifyEntry(self, index, data): + self.__list[index] = data + self.entry_changed(index) + def count(self): return len(self.__list) -- cgit v1.2.3 From 4e43f222adc69754295f64251753e3633bc68dd2 Mon Sep 17 00:00:00 2001 From: ghost Date: Wed, 11 Feb 2009 12:31:43 +0100 Subject: small speedups / whitespace cleanups --- lib/python/Components/config.py | 129 ++++++++++++++++++++-------------------- 1 file changed, 66 insertions(+), 63 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/config.py b/lib/python/Components/config.py index 0faf26da..eaf07180 100755 --- a/lib/python/Components/config.py +++ b/lib/python/Components/config.py @@ -1,10 +1,10 @@ -import time from enigma import getPrevAsciiCode from Tools.NumericalTextInput import NumericalTextInput from Tools.Directories import resolveFilename, SCOPE_CONFIG from Components.Harddisk import harddiskmanager -import copy -import os +from copy import copy as copy_copy +from os import path as os_path +from time import localtime, strftime # ConfigElement, the base class of all ConfigElements. @@ -347,8 +347,9 @@ class ConfigSelection(ConfigElement): # several customized versions exist for different # descriptions. # +boolean_descriptions = {False: "false", True: "true"} class ConfigBoolean(ConfigElement): - def __init__(self, default = False, descriptions = {False: "false", True: "true"}): + def __init__(self, default = False, descriptions = boolean_descriptions): ConfigElement.__init__(self) self.descriptions = descriptions self.value = self.last_value = self.default = default @@ -404,17 +405,20 @@ class ConfigBoolean(ConfigElement): self.changedFinal() self.last_value = self.value +yes_no_descriptions = {False: _("no"), True: _("yes")} class ConfigYesNo(ConfigBoolean): def __init__(self, default = False): - ConfigBoolean.__init__(self, default = default, descriptions = {False: _("no"), True: _("yes")}) + ConfigBoolean.__init__(self, default = default, descriptions = yes_no_descriptions) +on_off_descriptions = {False: _("off"), True: _("on")} class ConfigOnOff(ConfigBoolean): def __init__(self, default = False): - ConfigBoolean.__init__(self, default = default, descriptions = {False: _("off"), True: _("on")}) + ConfigBoolean.__init__(self, default = default, descriptions = on_off_descriptions) +enable_disable_descriptions = {False: _("disable"), True: _("enable")} class ConfigEnableDisable(ConfigBoolean): def __init__(self, default = False): - ConfigBoolean.__init__(self, default = default, descriptions = {False: _("disable"), True: _("enable")}) + ConfigBoolean.__init__(self, default = default, descriptions = enable_disable_descriptions) class ConfigDateTime(ConfigElement): def __init__(self, default, formatstring, increment = 86400): @@ -432,10 +436,10 @@ class ConfigDateTime(ConfigElement): self.value = self.default def getText(self): - return time.strftime(self.formatstring, time.localtime(self.value)) + return strftime(self.formatstring, localtime(self.value)) def getMulti(self, selected): - return ("text", time.strftime(self.formatstring, time.localtime(self.value))) + return ("text", strftime(self.formatstring, localtime(self.value))) def fromstring(self, val): return int(val) @@ -447,7 +451,7 @@ class ConfigDateTime(ConfigElement): # several helper exist to ease this up a bit. # class ConfigSequence(ConfigElement): - def __init__(self, seperator, limits, censor_char = "", default = None): + def __init__(self, seperator, limits, default, censor_char = ""): ConfigElement.__init__(self) assert isinstance(limits, list) and len(limits[0]) == 2, "limits must be [(min, max),...]-tuple-list" assert censor_char == "" or len(censor_char) == 1, "censor char must be a single char (or \"\")" @@ -459,12 +463,10 @@ class ConfigSequence(ConfigElement): self.seperator = seperator self.limits = limits self.censor_char = censor_char - - self.default = default - self.value = copy.copy(default) - self.last_value = copy.copy(default) - - self.endNotifier = [] + + self.last_value = self.default = default + self.value = copy_copy(default) + self.endNotifier = None def validate(self): max_pos = 0 @@ -481,8 +483,9 @@ class ConfigSequence(ConfigElement): num += 1 if self.marked_pos >= max_pos: - for x in self.endNotifier: - x(self) + if endNotifier: + for x in self.endNotifier: + x(self) self.marked_pos = max_pos - 1 if self.marked_pos < 0: @@ -491,13 +494,15 @@ class ConfigSequence(ConfigElement): def validatePos(self): if self.marked_pos < 0: self.marked_pos = 0 - + total_len = sum([len(str(x[1])) for x in self.limits]) if self.marked_pos >= total_len: self.marked_pos = total_len - 1 - + def addEndNotifier(self, notifier): + if endNotifier is None: + endNotifier = [] self.endNotifier.append(notifier) def handleKey(self, key): @@ -508,7 +513,7 @@ class ConfigSequence(ConfigElement): if key == KEY_RIGHT: self.marked_pos += 1 self.validatePos() - + if key == KEY_HOME: self.marked_pos = 0 self.validatePos() @@ -521,7 +526,7 @@ class ConfigSequence(ConfigElement): num += 1 self.marked_pos = max_pos - 1 self.validatePos() - + if key in KEY_NUMBERS or key == KEY_ASCII: if key == KEY_ASCII: code = getPrevAsciiCode() @@ -530,11 +535,11 @@ class ConfigSequence(ConfigElement): number = code - 48 else: number = getKeyNumber(key) - + block_len = [] for x in self.limits: block_len.append(len(str(x[1]))) - + total_len = sum(block_len) pos = 0 @@ -553,17 +558,17 @@ class ConfigSequence(ConfigElement): # position in the block posinblock = self.marked_pos - block_len_total[blocknumber] - + oldvalue = self._value[blocknumber] olddec = oldvalue % 10 ** (number_len - posinblock) - (oldvalue % 10 ** (number_len - posinblock - 1)) newvalue = oldvalue - olddec + (10 ** (number_len - posinblock - 1) * number) - + self._value[blocknumber] = newvalue self.marked_pos += 1 - + self.validate() self.changed() - + def genText(self): value = "" mPos = self.marked_pos @@ -573,18 +578,17 @@ class ConfigSequence(ConfigElement): value += self.seperator if mPos >= len(value) - 1: mPos += 1 - if self.censor_char == "": value += ("%0" + str(len(str(self.limits[num][1]))) + "d") % i else: value += (self.censor_char * len(str(self.limits[num][1]))) num += 1 return (value, mPos) - + def getText(self): (value, mPos) = self.genText() return value - + def getMulti(self, selected): (value, mPos) = self.genText() # only mark cursor when we are selected @@ -596,7 +600,7 @@ class ConfigSequence(ConfigElement): def tostring(self, val): return self.seperator.join([self.saveSingle(x) for x in val]) - + def saveSingle(self, v): return str(v) @@ -604,13 +608,14 @@ class ConfigSequence(ConfigElement): return [int(x) for x in value.split(self.seperator)] def onDeselect(self, session): - if not self.last_value == self._value: + if self.last_value != self._value: self.changedFinal() - self.last_value = copy.copy(self._value) + self.last_value = copy_copy(self._value) +ip_limits = [(0,255),(0,255),(0,255),(0,255)] class ConfigIP(ConfigSequence): def __init__(self, default, auto_jump = False): - ConfigSequence.__init__(self, seperator = ".", limits = [(0,255),(0,255),(0,255),(0,255)], default = default) + ConfigSequence.__init__(self, seperator = ".", limits = ip_limits, default = default) self.block_len = [] for x in self.limits: self.block_len.append(len(str(x[1]))) @@ -691,19 +696,20 @@ class ConfigIP(ConfigSequence): # we definitely don't want leading zeros return '.'.join(["%d" % d for d in self.value]) +mac_limits = [(1,255),(1,255),(1,255),(1,255),(1,255),(1,255)] class ConfigMAC(ConfigSequence): def __init__(self, default): - ConfigSequence.__init__(self, seperator = ":", limits = [(1,255),(1,255),(1,255),(1,255),(1,255),(1,255)], default = default) + ConfigSequence.__init__(self, seperator = ":", limits = mac_limits, default = default) class ConfigPosition(ConfigSequence): def __init__(self, default, args): ConfigSequence.__init__(self, seperator = ",", limits = [(0,args[0]),(0,args[1]),(0,args[2]),(0,args[3])], default = default) +clock_limits = [(0,23),(0,59)] class ConfigClock(ConfigSequence): def __init__(self, default): - import time - t = time.localtime(default) - ConfigSequence.__init__(self, seperator = ":", limits = [(0,23),(0,59)], default = [t.tm_hour, t.tm_min]) + t = localtime(default) + ConfigSequence.__init__(self, seperator = ":", limits = clock_limits, default = [t.tm_hour, t.tm_min]) def increment(self): # Check if Minutes maxed out @@ -735,8 +741,9 @@ class ConfigClock(ConfigSequence): # Trigger change self.changed() +integer_limits = (0, 9999999999) class ConfigInteger(ConfigSequence): - def __init__(self, default, limits = (0, 9999999999)): + def __init__(self, default, limits = integer_limits): ConfigSequence.__init__(self, seperator = ":", limits = [limits], default = default) # you need to override this to do input validation @@ -746,7 +753,7 @@ class ConfigInteger(ConfigSequence): def getValue(self): return self._value[0] - + value = property(getValue, setValue) def fromstring(self, value): @@ -1235,7 +1242,7 @@ class ConfigLocations(ConfigElement): self.locations = [[x, None, False, False] for x in tmp] self.refreshMountpoints() for x in self.locations: - if os.path.exists(x[0]): + if os_path.exists(x[0]): x[1] = self.getMountpoint(x[0]) x[2] = True @@ -1264,7 +1271,7 @@ class ConfigLocations(ConfigElement): for x in self.locations: if x[1] == mp: x[2] = True - elif x[1] == None and os.path.exists(x[0]): + elif x[1] == None and os_path.exists(x[0]): x[1] = self.getMountpoint(x[0]) x[2] = True @@ -1290,7 +1297,7 @@ class ConfigLocations(ConfigElement): self.addedMount(x) def getMountpoint(self, file): - file = os.path.realpath(file)+"/" + file = os_path.realpath(file)+"/" for m in self.mountpoints: if file.startswith(m): return m @@ -1387,7 +1394,7 @@ class ConfigSubList(list, object): x.load() def getSavedValue(self): - res = {} + res = { } for i in range(len(self)): sv = self[i].saved_value if sv is not None: @@ -1410,10 +1417,7 @@ class ConfigSubList(list, object): item.load() def dict(self): - res = dict() - for index in range(len(self)): - res[str(index)] = self[index] - return res + return dict([(str(index), value) for index, value in self.enumerate()]) # same as ConfigSubList, just as a dictionary. # care must be taken that the 'key' has a proper @@ -1479,11 +1483,12 @@ class ConfigSubsection(object): def __setattr__(self, name, value): if name == "saved_value": return self.setSavedValue(value) - assert isinstance(value, ConfigSubsection) or isinstance(value, ConfigElement) or isinstance(value, ConfigSubList) or isinstance(value, ConfigSubDict), "ConfigSubsections can only store ConfigSubsections, ConfigSubLists, ConfigSubDicts or ConfigElements" + assert isinstance(value, (ConfigSubsection, ConfigElement, ConfigSubList, ConfigSubDict)), "ConfigSubsections can only store ConfigSubsections, ConfigSubLists, ConfigSubDicts or ConfigElements" self.content.items[name] = value - if name in self.content.stored_values: - #print "ok, now we have a new item,", name, "and have the following value for it:", self.content.stored_values[name] - value.saved_value = self.content.stored_values[name] + x = self.content.stored_values.get(name, None) + if x is not None: + #print "ok, now we have a new item,", name, "and have the following value for it:", x + value.saved_value = x value.load() def __getattr__(self, name): @@ -1501,12 +1506,11 @@ class ConfigSubsection(object): def setSavedValue(self, values): values = dict(values) - self.content.stored_values = values - for (key, val) in self.content.items.items(): - if key in values: - val.saved_value = values[key] + value = values.get(key, None) + if value is not None: + val.saved_value = value saved_value = property(getSavedValue, setSavedValue) @@ -1534,19 +1538,18 @@ class Config(ConfigSubsection): def pickle_this(self, prefix, topickle, result): for (key, val) in topickle.items(): - name = prefix + "." + key - + name = ''.join((prefix, '.', key)) if isinstance(val, dict): self.pickle_this(name, val, result) elif isinstance(val, tuple): - result.append(name + "=" + val[0]) # + " ; " + val[1]) + result += [name, '=', val[0], '\n'] else: - result.append(name + "=" + val) + result += [name, '=', val, '\n'] def pickle(self): - result = [ ] + result = [] self.pickle_this("config", self.saved_value, result) - return '\n'.join(result) + "\n" + return ''.join(result) def unpickle(self, lines): tree = { } -- cgit v1.2.3 From fbb4dcf5b33aeb937b93ccde522a7d32c328be9f Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Wed, 11 Feb 2009 12:46:28 +0100 Subject: import MultiContentTemplateColor --- lib/python/Components/Converter/TemplatedMultiContent.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/Converter/TemplatedMultiContent.py b/lib/python/Components/Converter/TemplatedMultiContent.py index cc00455c..5f1d4f24 100644 --- a/lib/python/Components/Converter/TemplatedMultiContent.py +++ b/lib/python/Components/Converter/TemplatedMultiContent.py @@ -5,7 +5,7 @@ class TemplatedMultiContent(StringList): def __init__(self, args): StringList.__init__(self, args) from enigma import eListboxPythonMultiContent, gFont, RT_HALIGN_LEFT, RT_HALIGN_CENTER, RT_HALIGN_RIGHT, RT_VALIGN_TOP, RT_VALIGN_CENTER, RT_VALIGN_BOTTOM - from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmap, MultiContentEntryPixmapAlphaTest + from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmap, MultiContentEntryPixmapAlphaTest, MultiContentTemplateColor l = locals() del l["self"] # cleanup locals a bit del l["args"] -- cgit v1.2.3