From 2be7c80a01cacd048e13fcf49c624862a38bbedb Mon Sep 17 00:00:00 2001 From: vpeter4 Date: Tue, 26 Feb 2013 20:55:47 +0100 Subject: [PATCH] sundtek-mediatv: added addon settings for modifying tuner type (DVB-C, DVB-T) --- .../driver/sundtek-mediatv/changelog.txt | 2 + .../sundtek-mediatv/config/rc_key_enter | 32 ++++ .../driver/sundtek-mediatv/config/rc_key_ok | 32 ++++ .../driver/sundtek-mediatv/icon/icon.png | Bin 2806 -> 4371 bytes packages/addons/driver/sundtek-mediatv/meta | 2 +- .../source/bin/refresh-tuners.py | 172 ++++++++++++++++++ .../source/bin/userspace-driver.sh | 52 +++++- .../sundtek-mediatv/source/bin/xmlpp.py | 161 ++++++++++++++++ .../resources/language/English/strings.xml | 9 +- .../source/resources/settings.xml | 7 +- 10 files changed, 463 insertions(+), 6 deletions(-) create mode 100644 packages/addons/driver/sundtek-mediatv/config/rc_key_enter create mode 100644 packages/addons/driver/sundtek-mediatv/config/rc_key_ok create mode 100644 packages/addons/driver/sundtek-mediatv/source/bin/refresh-tuners.py create mode 100644 packages/addons/driver/sundtek-mediatv/source/bin/xmlpp.py diff --git a/packages/addons/driver/sundtek-mediatv/changelog.txt b/packages/addons/driver/sundtek-mediatv/changelog.txt index 000cb4f4e1..7161defcaf 100644 --- a/packages/addons/driver/sundtek-mediatv/changelog.txt +++ b/packages/addons/driver/sundtek-mediatv/changelog.txt @@ -1,3 +1,5 @@ +3.0.3 + added addon settings for modifying tuner type (DVB-C, DVB-T) 3.0.2 added addon settings enable HW PID filter (enabled for RPi by default) diff --git a/packages/addons/driver/sundtek-mediatv/config/rc_key_enter b/packages/addons/driver/sundtek-mediatv/config/rc_key_enter new file mode 100644 index 0000000000..8dc5d931cb --- /dev/null +++ b/packages/addons/driver/sundtek-mediatv/config/rc_key_enter @@ -0,0 +1,32 @@ +0x01 KEY_SELECT +0x02 KEY_3 +0x03 KEY_EXIT +0x04 KEY_1 +0x05 KEY_5 +0x06 KEY_6 +0x07 KEY_CHANNELDOWN +0x08 KEY_2 +0x09 KEY_CHANNELUP +0x0a KEY_9 +0x0b KEY_ZOOM +0x0c KEY_7 +0x0d KEY_8 +0x0e KEY_VOLUMEUP +0x0f KEY_4 +0x10 KEY_BACK +0x11 KEY_0 +0x12 KEY_ENTER +0x13 KEY_VOLUMEDOWN +0x14 KEY_RECORD +0x15 KEY_STOP +0x16 KEY_PLAY +0x17 KEY_MUTE +0x18 KEY_UP +0x19 KEY_DOWN +0x1a KEY_LEFT +0x1b KEY_RIGHT +0x1c KEY_RED +0x1d KEY_GREEN +0x1e KEY_YELLOW +0x1f KEY_BLUE +0x43 KEY_POWER diff --git a/packages/addons/driver/sundtek-mediatv/config/rc_key_ok b/packages/addons/driver/sundtek-mediatv/config/rc_key_ok new file mode 100644 index 0000000000..13f2c608c8 --- /dev/null +++ b/packages/addons/driver/sundtek-mediatv/config/rc_key_ok @@ -0,0 +1,32 @@ +0x01 KEY_SELECT +0x02 KEY_3 +0x03 KEY_EXIT +0x04 KEY_1 +0x05 KEY_5 +0x06 KEY_6 +0x07 KEY_CHANNELDOWN +0x08 KEY_2 +0x09 KEY_CHANNELUP +0x0a KEY_9 +0x0b KEY_ZOOM +0x0c KEY_7 +0x0d KEY_8 +0x0e KEY_VOLUMEUP +0x0f KEY_4 +0x10 KEY_BACK +0x11 KEY_0 +0x12 KEY_OK +0x13 KEY_VOLUMEDOWN +0x14 KEY_RECORD +0x15 KEY_STOP +0x16 KEY_PLAY +0x17 KEY_MUTE +0x18 KEY_UP +0x19 KEY_DOWN +0x1a KEY_LEFT +0x1b KEY_RIGHT +0x1c KEY_RED +0x1d KEY_GREEN +0x1e KEY_YELLOW +0x1f KEY_BLUE +0x43 KEY_POWER diff --git a/packages/addons/driver/sundtek-mediatv/icon/icon.png b/packages/addons/driver/sundtek-mediatv/icon/icon.png index 912c71d6b9b26c9ea7bc1a92d8f8368a5090c8fe..eb4144b290d0f516bb422a567ea2393ed26751e4 100644 GIT binary patch literal 4371 zcmeHL={Fk+^Tw?zS8J)#7SXz~@4KSaiz0T4)*2;EtwCw*+}2J>8!9xmTCZB7H1@5Q z60y6)me`|3Vi&R0&pp3S@0a&4c+Z@f=gXY=FwdMb&rG6)nZZ@I+iVOB3|B#hdR7G`APYY&mH+4`S!Q|&C`?ex)E{PW%~`i zO;-KIQ1&fEn)=UjPfR4DqE9d{Dqu)yZR>CCh?Bz2mU z+k!Vy;U~Qa+24-vZ%Dt3GqwIDJo4XRH|GGE4o%)d1COFiwgtyOM!nw{me$ERvK-YO z;>!zA;~%~~2(A59;e1OSgj`({;Q~oo@~EH(`(5y>ijAfw)#|BT^7|NLNddnzyH;mR z-)gG#?vH_VB&atALaydj&3l3}sOwB-F4keZK6(aD)lsC2vPL*R5NERlNJ+^OMGpyU zru~wi0_#`zX|Y-f`*}adwZZ2vP7bxl3Fq%~&ogq*;ZNsg+vju7X6?2EEa)MJm|@cS zVWiq*ueNrRd}(_&)%bKD^_XvSIZsFmBXmajaTw*x(cg(^+X^_wdpyFOZy@&97XCuu zX~PIa;`0aX*<|gI5AULWodg`qVRhKfe;qa_?ELdhVR~#eTU3cOhct|I(i0ak+DdG5 zl-)QuUfn{SFjWvXzR~ju8^oOS%odZI+K`2KTv9r3l^AF&WTH&m=gW(z1;KmdJ^DiU zh$j{~3q(BEh|}%c{csXZ{XWx!xzx2Lg0=rTIEGPZ%^TTR{6urWrCsiY7%!KiL>9Pn&vGpSirb<5E?^2Eg(1t>x?4J$gvBfS+otT~(u5m*~ z<1Zu0=E*z3TEX}8)77gb`lu;c=z=%GgU~du0Y>x*aSmn+wvFtkz{3uEr8SZg5<1`6 zSL!6y^S@m5G8uN$)VkosxbRO2R@P$Ys%M6SB|;VZY96Zhk{{`b6pAQ)Nc>6rT|?*{ zs^(Oo5SpeZeg_oGMAmfJhUFGLd0MzA^-;#1j`brdvn$Q+QvU7M+Fm1lNX0qaUayyn zD{FedPkl4zpz6Fql~Fdb{l`J5j;-BJE_7VRUy{4pV)9foNK{z3n~`g}3_0wsoCNOP z*_$fid?)lB^4`$Zx8LmuIu$yq2)ox+g~1pUz7KhsfnN>Q0w8+zx(7=f!LwC;CNt!K z$O){63L4FUlFjjki9Iull{UW}sA6j6AkRnQ=qyVpi+4RpzLJ~}5@Q6*QC{h?PW^*h z_(=*RJ)%g0g(I~X`|N2UN#d%rRp1J<5hZ8p1JycIee>EBQO!`hd9p5-mt>^C_lZXY?B}&-P#ex)0_~V|@Y=Sg$ zn(pvz$=R0MWW1aVDH0a8S_j|v_PHWr4G>Th7Dn>qLP3hRuKlanhQ_aLn|zbpclrL3({mv7$zdDPQ{3kCcUOkm?MDJ!p* z`6xnVQZxTZgb|q0PJ<@$C~KYWo@X-ychV}I)|>E}y5WbMO)e!t5|`Y@3$Nc04aeC6 zZvfbjbYa>Dp|}Za&u0(riwGCIlLT}|2mhV1kz%5~L#~^WBv&!Hx`K-BQ2M~V8+?() zyVf&YaTimX*@DiDlI2bAas5-zUqH?5_CaXtgy#feBg8W@lClur1Y{QY5;%(lX3w`EW^9+HuaOv((3VwN_WdW2D)i+8P$@xG(0{?u^TT=6N(q zaxCgW3|1>14wwKd^^wE;RJT)j_M9jRh5Geq?H1RgUdt_lbN%e*U{8GWPAn0WYHp=i{QWL{v_ zJI&j6s~@Dh{)$bU-7r(=%cFYy88l919qS(9N_MuRZ!TmWSV0%e6Rol^o$&D{Y!LeM z+nn^T_LWDmf*(}X&^@jSpHjENyJ93nOJD@RuaMs!cD@r$`%&SGfr)4d0mmi2$N z#ku#xoI)@T6nHZc7LS$JNSajJuh2I8>h6Oy!679ut`RUdUuo+nh)J(~CP|dtA!Wt{g^S#B1x*;d``!qE6Km0-HbcuxCl6NHz9Aos$=t z+2sGO=9&v!WiL!_Io?ZK?Jc+Ed5f>8jC);>KR~RPT57-}*tUhnMF!p(TR!k`wu|i2` zIk`HY+Br-Y-_Zl8HbEVv>50xRbqaJ>097-fXlxm)yH%l~X*L7^of%lh4(8Cz^S*wu$j@pY5T^D$Hx6dNw>T}^=ha?Gmibw@gZHdb zyh_P?WIuI*)>}6^kNAxr(T`!rHStsoF|ys)yeczMe8=1q9ww)T*x!kk;Y~?f=ZoBx zuf3I12VX|s;;q5Sa*fvND+1zSEKyQ{lZA+YB;hiR`gJl+cdfpoZ7QJwPpwDD!Wog?B@UJTCGWDe=Dyfbx>-W**B z)={!J96l~i;jX_I>Hdmio_+6{`j%S@=Se7LmyCZsm_3|W{7)F&>rFMUVr`(t7!80# zUu_>UlRGqJ1$@67uLBbkMFY4jd8|r%qEpj{1s)d=3qNp6#6AnAFTM;_@oBFh(LA%2 z2?oxVPAAmh5P zeKQyDG5@K}ksc7WP4923)L0i?^_g#dF+e_gtH*8RaUo@WCn2HlZ}$$n5qwr0?lL~^ z;F@iW)$GI1$FL^+Rz=u22qoISo0`P(FTsg2)1c>{DEG`KGx~>T^f@*m^V<3Ynnz2@ z+UEdy7M{t@&KO)bQ50l^Q`O#1$P`iPn6Rla-7SRGH*OIE^lw@$fxHpCb@aFW&)>6b zlf?Ygybe16wOC_4#Avx5JoBTCh?86yasT!v6ZBF;Pl+IQ=t;oDwd(vTFkm+S0ACiG_|1?mE?EwA+USYA8WO%ZzAwXl!BQ#p;BwJ z{s5^BZgEhSp|@2DAhAygD?fY1&@rpF;w;SnjO95$r1(P;7?4(Bd^buyY42XzOLyA< zo0BFuSY~h*?RePyZ9wxnAi4g405-~RjCF)ox+9Rv+9 z;JQ!{qSHk-tvU5hW<74#(R{yKx|14kavvG!$*=3ixo9mV^mi|g*-@_^EIoCjc;1mi zv+7T01^z5vbfu?^vwmsNO(n9i4kR*Jt_!MDZDY@sHHzPavzL(wS2hc}yCsPgLId{v z7MX~<(;NKSP``Z~>4!M0e-y4JL6`>#w7zL)RJwe_BUE>fI%_HGcQ-U67?iBDG@Wb* zrKtl!HC$p_d_A*5pS|6LcU>u!Dau=a7^i(Ey2J{UcS4?cx2@F0`W&aDN&~IzTEIJE zaBXL~f(X--?F2Xyh=j-(kwgbcyheKsP}Phhr)v}sC$MWNF_(dihs|#)RvIP&PBV!P zNaAj=4aJqBkCEOcNgooo+*lg7Dp8+y%QVEP52$8){{FN>4UXUad`md;uyYQ`_>~5S zzjSM-v`2)JQk@w%xqcy7^V#;9k{-(CU-^INGoNpZI2nD;5M?(K_P+!AKb{9G=M1CD X(L*olpG93fI~YKZ%=D^sT;BX2qDDf) literal 2806 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 Jl%r22{RiCcNF4wG diff --git a/packages/addons/driver/sundtek-mediatv/meta b/packages/addons/driver/sundtek-mediatv/meta index 163e8d3de9..cb1b74034b 100644 --- a/packages/addons/driver/sundtek-mediatv/meta +++ b/packages/addons/driver/sundtek-mediatv/meta @@ -20,7 +20,7 @@ PKG_NAME="sundtek-mediatv" PKG_VERSION="3.0" -PKG_REV="2" +PKG_REV="3" PKG_ARCH="any" PKG_LICENSE="nonfree" PKG_SITE="http://support.sundtek.com/" diff --git a/packages/addons/driver/sundtek-mediatv/source/bin/refresh-tuners.py b/packages/addons/driver/sundtek-mediatv/source/bin/refresh-tuners.py new file mode 100644 index 0000000000..ba9771d103 --- /dev/null +++ b/packages/addons/driver/sundtek-mediatv/source/bin/refresh-tuners.py @@ -0,0 +1,172 @@ +""" +################################################################################ +# This file is part of OpenELEC - http://www.openelec.tv +# Copyright (C) 2009-2013 Stephan Raue (stephan@openelec.tv) +# Copyright (C) 2013 ultraman/vpeter +# +# This Program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This Program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with OpenELEC.tv; see the file COPYING. If not, write to +# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. +# http://www.gnu.org/copyleft/gpl.html +################################################################################ +""" + +import os +import sys +import shutil +import xmlpp +import xbmcaddon + +from xml.dom import minidom +from array import array + +__settings__ = xbmcaddon.Addon(id='driver.dvb.sundtek-mediatv') +__cwd__ = __settings__.getAddonInfo('path') +__mediaclient__ = xbmc.translatePath(os.path.join(__cwd__, 'bin', 'mediaclient')) +__ld_preload__ = xbmc.translatePath(os.path.join(__cwd__, 'lib', 'libmediaclient.so')) +__settings_xml__ = xbmc.translatePath(os.path.join(__cwd__, 'resources', 'settings.xml')) + +__mediaclient_e__ = 'LD_PRELOAD=' + __ld_preload__ + ' ' + __mediaclient__ + ' -e' + +# make backup settings only once +try: + with open(__settings_xml__ + '_orig') as f: pass +except IOError as e: + shutil.copyfile(__settings_xml__, __settings_xml__ + '_orig') + +###################################################################################################### + +# get supported devices on a system (name, serial number, type) +tuners = [] +p = os.popen(__mediaclient_e__, "r") +while 1: + line = p.readline() + if not line: + break + else: + str = line.strip() + if str.startswith('device '): + name = str[str.find("[")+1:str.find("]")] + tuners.append([name, 0, 's']) + + if str.startswith('[SERIAL]:'): + line = p.readline() + str = line.strip() + if str.startswith('ID:'): + id = str.split(':'); + id = id[1].strip() + tuners[len(tuners)-1] = [name, id, 's'] + + if str.startswith('[DVB-C]:'): + tuners[len(tuners)-1] = [name, id, 'c'] + elif str.startswith('[DVB-T]:'): + tuners[len(tuners)-1] = [name, id, 'c'] + elif str.startswith('[DVB-T2]:'): + tuners[len(tuners)-1] = [name, id, 'c'] + +""" +root ~ # mediaclient -e +**** List of Media Hardware Devices **** +device 0: [Sundtek MediaTV Pro (USB 2.0)] DVB-C, DVB-T, ANALOG-TV, FM-RADIO, REMOTE-CONTROL, OSS-AUDIO, RDS + [BUS]: + ID: 1-7 + [SERIAL]: + ID: U110714145205 + [DVB-C]: + FRONTEND: /dev/dvb/adapter0/frontend0 + DVR: /dev/dvb/adapter0/dvr0 + DMX: /dev/dvb/adapter0/demux0 + [DVB-T]: + FRONTEND: /dev/dvb/adapter0/frontend0 + DVR: /dev/dvb/adapter0/dvr0 + DMX: /dev/dvb/adapter0/demux0 + [ANALOG-TV]: + VIDEO0: /dev/video0 + VBI0: /dev/vbi0 + [FM-RADIO]: + RADIO0: /dev/radio0 + RDS: /dev/rds0 + [REMOTECONTROL]: + INPUT0: /dev/mediainput0 + [OSS]: + OSS0: /dev/dsp0 +""" + +###################################################################################################### + +xmldoc = minidom.parse(__settings_xml__) +category = xmldoc.getElementsByTagName('category') + +# remove all nodes with id started with ATTACHED_TUNER_ +for node_cat in category: + setting = node_cat.getElementsByTagName('setting') + for node_set in setting : + if 'id' in node_set.attributes.keys() and not node_set.getAttribute('id').find('ATTACHED_TUNER_'): + node_set.parentNode.removeChild(node_set) + +# add new ATTACHED_TUNER_ nodes for available tuners +for node_cat in category: + setting = node_cat.getElementsByTagName('setting') + for node_set in setting : + if 'label' in node_set.attributes.keys() and '9010' in node_set.getAttribute('label'): + for ix, tuner in enumerate(tuners): + tuner_name = tuner[0] + tuner_serial = tuner[1] + tuner_type = tuner[2] + + node1 = xmldoc.createElement("setting") + node1.setAttribute("id", 'ATTACHED_TUNER_' + tuner_serial + '_DVBMODE') + node1.setAttribute("label", tuner_name + ", " + tuner_serial) + node1.setAttribute("type", 'labelenum') + + if (tuner_type == 's'): + node1.setAttribute("default", 'DVB-S') + node1.setAttribute("values", 'DVB-S') + else: + node1.setAttribute("default", 'DVB-C') + node1.setAttribute("values", 'DVB-C|DVB-T') + + node_cat.appendChild(node1) + + node2 = xmldoc.createElement("setting") + node2.setAttribute("id", 'ATTACHED_TUNER_' + tuner_serial + '_IRPROT') + node2.setAttribute("label", '9020') + node2.setAttribute("type", 'labelenum') + node2.setAttribute("default", 'auto') + node2.setAttribute("values", 'auto|RC5|NEC|RC6') + node_cat.appendChild(node2) + + node3 = xmldoc.createElement("setting") + node3.setAttribute("id", 'ATTACHED_TUNER_' + tuner_serial + '_KEYMAP') + node3.setAttribute("label", '9030') + node3.setAttribute("type", 'text') + node3.setAttribute("default", 'rc_key_ok') + node_cat.appendChild(node3) + + # for tuner + break + +###################################################################################################### + +# save file back +try: + outputfile=open(__settings_xml__, 'w') + xmlpp.pprint(xmldoc.toxml(), output=outputfile, indent=2) + outputfile.close() +except IOError: + print 'Error writing file ', __settings_xml__ + +###################################################################################################### + +# dialog is closed already so just open settings again +xbmcaddon.Addon(id='driver.dvb.sundtek-mediatv').openSettings() diff --git a/packages/addons/driver/sundtek-mediatv/source/bin/userspace-driver.sh b/packages/addons/driver/sundtek-mediatv/source/bin/userspace-driver.sh index 3b50b046a5..b720d77cd5 100644 --- a/packages/addons/driver/sundtek-mediatv/source/bin/userspace-driver.sh +++ b/packages/addons/driver/sundtek-mediatv/source/bin/userspace-driver.sh @@ -46,7 +46,7 @@ else if [ -z "$entry_set" ]; then sed -i 's|^device_attach=.*|# device_attach not used anymore\n\n# enable HW PID filter\nuse_hwpidfilter=off\n\n# enable listening on network\nenablenetwork=off|g' $ADDON_HOME/sundtek.conf sed -i 's|^#first_adapter=.*|first_adapter=0|g' $ADDON_HOME/sundtek.conf - + sed -i 's|.*network tuner IP address (OpenELEC specific).*||g' $ADDON_HOME/sundtek.conf sed -i 's|.*network_tuner_ip=.*||g' $ADDON_HOME/sundtek.conf fi @@ -95,6 +95,7 @@ if [ ! -f $ADDON_DIR/bin/mediasrv ]; then # enable HW PID filter on RPi by default sed -i 's|^use_hwpidfilter=.*|use_hwpidfilter=on|g' $ADDON_DIR/config/sundtek.conf sed -i 's|^use_hwpidfilter=.*|use_hwpidfilter=on|g' $ADDON_HOME/sundtek.conf + sed -i 's|.*id="ENABLE_HW_PID_FILTER".*||' $ADDON_DIR/settings-default.xml sed -i 's|.*id="ENABLE_HW_PID_FILTER".*||' $ADDON_SETTINGS else logger -t Sundtek "### Unsupported architecture ###" @@ -214,7 +215,7 @@ if [ -z "$(pidof mediasrv)" ]; then # remove empty lines at the end of file sed -i '${/^$/d;}' $SUNDTEK_CONF_TMP # add entries - echo "[NETWORK]" >>$SUNDTEK_CONF_TMP + echo -e "\n[NETWORK]" >>$SUNDTEK_CONF_TMP for dev in $(seq 0 $DEVICE1_NUM); do echo "device=$DEVICE1_IP:$dev" >>$SUNDTEK_CONF_TMP done @@ -247,6 +248,53 @@ if [ -z "$(pidof mediasrv)" ]; then sed -i '${/^$/d;}' $SUNDTEK_CONF_TMP fi + if [ "$ENABLE_TUNER_TYPES" = "true" ]; then + # get tuner serial numbers + SERIALS=$(cat /var/config/sundtek-addon.conf | sed -n 's|^ATTACHED_TUNER_\(.*\)_DVBMODE=.*|\1|gp' | sort | uniq) + . /var/config/sundtek-addon.conf + + for SERIAL in ${SERIALS[@]}; do + DVBMODE=$(eval echo \$ATTACHED_TUNER_${SERIAL}_DVBMODE) + IRPROT=$(eval echo \$ATTACHED_TUNER_${SERIAL}_IRPROT) + KEYMAP=$(eval echo \$ATTACHED_TUNER_${SERIAL}_KEYMAP) + + if [ "$DVBMODE" = "DVB-T" ]; then + # only set DVB-T because default is DVB-C (and DVB-S is not set either) + DVBMODE="DVBT" + else + DVBMODE="" + fi + + [ "$IRPROT" = "NEC" -o "$IRPROT" = "auto" ] && IRPROT="" + + KEYMAP_FILE="$ADDON_HOME/$KEYMAP" + [ ! -f $KEYMAP_FILE ] && KEYMAP_FILE="" + + # remove setttings for this tuner + awk -v val="[$SERIAL]" '$0 == val {flag=1; next} /^ir_protocol=|^rcmap=|^initial_dvb_mode=|^#|^$/{if (flag==1) next} /.*/{flag=0; print}' $SUNDTEK_CONF_TMP >${SUNDTEK_CONF_TMP}-types + mv ${SUNDTEK_CONF_TMP}-types $SUNDTEK_CONF_TMP + echo "" >>$SUNDTEK_CONF_TMP + # remove empty lines at the end of file + sed -i '${/^$/d;}' $SUNDTEK_CONF_TMP + + ADDNEW=true + if [ -n "$DVBMODE" ]; then + [ $ADDNEW = true ] && ADDNEW=false && echo -e "\n[$SERIAL]" >>$SUNDTEK_CONF_TMP + echo "initial_dvb_mode=$DVBMODE" >>$SUNDTEK_CONF_TMP + fi + if [ -n "$IRPROT" ]; then + [ $ADDNEW = true ] && ADDNEW=false && echo -e "\n[$SERIAL]" >>$SUNDTEK_CONF_TMP + echo "ir_protocol=$IRPROT" >>$SUNDTEK_CONF_TMP + fi + if [ -n "$KEYMAP_FILE" ]; then + [ $ADDNEW = true ] && ADDNEW=false && echo -e "\n[$SERIAL]" >>$SUNDTEK_CONF_TMP + echo "rcmap=$KEYMAP_FILE" >>$SUNDTEK_CONF_TMP + fi + + echo "" >>$SUNDTEK_CONF_TMP + done + fi + md5_1=$(md5sum -b $SUNDTEK_CONF_TMP | awk '{print $1}') md5_2=$(md5sum -b $ADDON_HOME/sundtek.conf | awk '{print $1}') if [ "$md5_1" != "$md5_2" ]; then diff --git a/packages/addons/driver/sundtek-mediatv/source/bin/xmlpp.py b/packages/addons/driver/sundtek-mediatv/source/bin/xmlpp.py new file mode 100644 index 0000000000..342dcc01d7 --- /dev/null +++ b/packages/addons/driver/sundtek-mediatv/source/bin/xmlpp.py @@ -0,0 +1,161 @@ +"""Pretty print an XML document. + +LICENCE: +Copyright (c) 2008, Fredrik Ekholdt +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. + +* Neither the name of Fredrik Ekholdt nor the names of its contributors may be used to +endorse or promote products derived from this software without specific prior +written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE.""" + +import sys as _sys +import re as _re + +def _usage(this_file): + return """SYNOPSIS: pretty print an XML document +USAGE: python %s \n""" % this_file + +def _pprint_line(indent_level, line, width=100, output=_sys.stdout): + if line.strip(): + start = "" + number_chars = 0 + for l in range(indent_level): + start = start + " " + number_chars = number_chars + 1 + try: + elem_start = _re.findall("(\<\W{0,1}\w+:\w+) ?", line)[0] + elem_finished = _re.findall("([?|\]\]/]*\>)", line)[0] + #should not have * + attrs = _re.findall("(\S*?\=\".*?\")", line) + output.write(start + elem_start) + number_chars = len(start + elem_start) + for attr in attrs: + if (attrs.index(attr) + 1) == len(attrs): + number_chars = number_chars + len(elem_finished) + if (number_chars + len(attr) + 1) > width: + output.write("\n") + for i in range(len(start + elem_start) + 1): + output.write(" ") + number_chars = len(start + elem_start) + 1 + else: + output.write(" ") + number_chars = number_chars + 1 + output.write(attr) + number_chars = number_chars + len(attr) + output.write(elem_finished + "\n") + except IndexError: + #give up pretty print this line + output.write(start + line + "\n") + + +def _pprint_elem_content(indent_level, line, output=_sys.stdout): + if line.strip(): + for l in range(indent_level): + output.write(" ") + output.write(line + "\n") + +def _get_next_elem(data): + start_pos = data.find("<") + end_pos = data.find(">") + 1 + retval = data[start_pos:end_pos] + stopper = retval.rfind("/") + if stopper < retval.rfind("\""): + stopper = -1 + single = (stopper > -1 and ((retval.find(">") - stopper) < (stopper - retval.find("<")))) + + ignore_excl = retval.find(" -1 + ignore_question = retval.find(" -1 + + if ignore_excl: + cdata = retval.find(" -1 + if cdata: + end_pos = data.find("]]>") + if end_pos > -1: + end_pos = end_pos + len("]]>") + + elif ignore_question: + end_pos = data.find("?>") + len("?>") + ignore = ignore_excl or ignore_question + + no_indent = ignore or single + + #print retval, end_pos, start_pos, stopper > -1, no_indent + return start_pos, \ + end_pos, \ + stopper > -1, \ + no_indent + +def get_pprint(xml, indent=4, width=80): + """Returns the pretty printed xml """ + class out: + output = "" + + def write(self, string): + self.output += string + out = out() + pprint(xml, output=out, indent=indent, width=width) + + return out.output + + +def pprint(xml, output=_sys.stdout, indent=4, width=80): + """Pretty print xml. + Use output to select output stream. Default is sys.stdout + Use indent to select indentation level. Default is 4 """ + data = xml + indent_level = 0 + start_pos, end_pos, is_stop, no_indent = _get_next_elem(data) + while ((start_pos > -1 and end_pos > -1)): + _pprint_elem_content(indent_level, data[:start_pos].strip(), + output=output) + data = data[start_pos:] + if is_stop and not no_indent: + indent_level = indent_level - indent + _pprint_line(indent_level, + data[:end_pos - start_pos], + width=width, + output=output) + data = data[end_pos - start_pos:] + if not is_stop and not no_indent : + indent_level = indent_level + indent + + if not data: + break + else: + start_pos, end_pos, is_stop, no_indent = _get_next_elem(data) + + +if __name__ == "__main__": + if "-h" in _sys.argv or "--help" in _sys.argv: + _sys.stderr.write(_usage(_sys.argv[0])) + _sys.exit(1) + if len(_sys.argv) < 2: + _sys.stderr.write(_usage(_sys.argv[0])) + _sys.exit(1) + else: + filename = _sys.argv[1] + fh = open(filename) + + pprint(fh.read(), output=_sys.stdout, indent=4, width=80) diff --git a/packages/addons/driver/sundtek-mediatv/source/resources/language/English/strings.xml b/packages/addons/driver/sundtek-mediatv/source/resources/language/English/strings.xml index a76c6fd8d5..97d55aa426 100644 --- a/packages/addons/driver/sundtek-mediatv/source/resources/language/English/strings.xml +++ b/packages/addons/driver/sundtek-mediatv/source/resources/language/English/strings.xml @@ -3,11 +3,12 @@ General Auto update binary driver Enable analog TV - Extra settle time + Extra delay [sec] Run user script Enable hardware PID filter Enable IR receiver Lowest adapter number (/dev/dvb/adapterX/) + Networking Share local tuner over network Use network shared tuners @@ -21,4 +22,10 @@ # of tuners Server 5 IP address # of tuners + + Tuner settings + Enable modifying settings + Refresh... + IR protocol + keymap filename diff --git a/packages/addons/driver/sundtek-mediatv/source/resources/settings.xml b/packages/addons/driver/sundtek-mediatv/source/resources/settings.xml index 6b4940cfdc..24ffab9056 100644 --- a/packages/addons/driver/sundtek-mediatv/source/resources/settings.xml +++ b/packages/addons/driver/sundtek-mediatv/source/resources/settings.xml @@ -1,7 +1,6 @@ - @@ -12,7 +11,6 @@ - @@ -27,4 +25,9 @@ + + + + +