From 7b0b4eec6f710727cd56afb03dbf8ef0bcf7864e Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Tue, 26 Feb 2013 20:55:32 +0200 Subject: [PATCH 1/4] connman: update to connman-1.12 --- packages/network/connman/meta | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/network/connman/meta b/packages/network/connman/meta index b0994f57a5..43b9195060 100644 --- a/packages/network/connman/meta +++ b/packages/network/connman/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="connman" -PKG_VERSION="1.11" +PKG_VERSION="1.12" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" From 2be7c80a01cacd048e13fcf49c624862a38bbedb Mon Sep 17 00:00:00 2001 From: vpeter4 Date: Tue, 26 Feb 2013 20:55:47 +0100 Subject: [PATCH 2/4] 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 zcmeAS@N?(olHy`uVBq!ia0y~yU^oTB983%h4B6}+{}~trZh5*mhE&XXJ4Zi9I(l~d z{c6((tk<%>XeKx`Y}GR0Fwl?)NQh;X5Rnj(h)EDw%frOO#lyw3YN}(SW2tDtRxXVV zVT^3yt6!`-u;9RgC`phy7wv4(TB(E&O+WYPS)`wvBiTRM;^peB^>zJgPRP!$FFt4d z{QV01+TY)L87@40E+5PAA)Kv>(RG1%0Lv%^3WBEkn%~F!^_YL0Zo0>mT0 z)7-C}Fr2aCUXJYQaWz5L&|FTU01^Pf7@zwdqVuhW^XC;z|h|ML7nL;vaT=llCR zQ|okC|MzWo$HyxN4R2n0I!Dd;-knJvb+IlQs$TCq_r>VF z{`%|b`{}=#)?9ym@aKZ-ukX&CGGmXAgni0`_LE&x#MY^MUaGvhQX_X`di?`g%V(c| zKB&2nwRO^MmHt$#Hs=$crv7ezckI^D^(=>M{fyU_F(khc%j?B`(uSoh3$eV78^8Ayz8Agdr_0p*|f>oXBcPyzI!JxEIzF6 z)Z4P^Z^w14x;i=zO^90S)U{o@=wY_c`DAOGrB00AiybvNIhV$*OY}IqOn%K5^Gq|# zZdVu8#j3_rJ70e1wvwMPebXPq#c7jWG!#5rnVwlkf5@A+Bs^mAL+x3*89%oc+%@4b zzWwPfD72n`-ud&KX06RW{i4u`(J#mate$5I4|w8ZlRXY zhJb5-tjpDul#Vb8-ds89e1=I^{E?5JZ!8m-Ab%`nqDNBxspKDNH>xfg3* z;)#_-(@sCFu#xLO?sDYpvY7bW>rVLGdRAO_b!(>S?AiR&_2%Z}sV921>iA2QnED1q z8;IZIKeV!AWqZ=sZjSDb$`-G@xh78zhx926DTVi@OsQR>$J zm!|)f7W13Li>+TKB75?|(vl>@ey@9Hp8cM8=xE{T+W6YY(zvo^;lcOk|0=BgTDmoE zy}rKw^2?d`UhOVgqO!90`SW*=r4&3fw|`e!boOjof!zv$4laJ5m8&=C&Qg8HWbQxf zZr*j)*|BGR45o)T9XXnK>x{zWwXv^uowjza`6jR{VOhB*OY-H#!lG(5C&N@k<#>KL z=h=U)I(aoDE78tYRcX-#ExAL@6)UE_?)9<%_-xw^t!L|)l9D`^MoxEA`7A14xAarU zEx|UM3fmcbX3wbC6YD;jBQX0J+wSG?&)S{tIP|#3*YUnu88@fUa&vz z!_R|Yl zf~-2$`))1Uv~}n6ZI_%9++~hWnWTNV!lp0&NTJO1N6#YP@T5<9Te0()nboh`nX_m2 z&R){)k~C*QSCo?j>u1mI&3ylK z`ch9_MLm9&y6I*2RYHPpMtWaNFvu|ZG%w9UW>)NFrv7obD+|d?NxxMAw=EEO!o-dejblal)y!U-8%!93xp}3-+A!D~668QY%SEsnMhmAUZa?vC4UXKlUr>U7qRv=`^+_()8i9#HviDt}6jwCR(Aa?|IB z+!;HsZnR-|>K9=4@y6Y5%RZs)H`eexxayEX|!bOVrvQt+G?i z%x51>GOWs;{(aNbmnBwJ#;1yO?zPN*vUGRtWcR3fuXi|I>wn#RFyT*Gj^4R-X}b&m zcKRt+dF7>)yghs7bm~5iEVJ2uXOFxUV@X@Qgz0i+NLg%AjQ_9N*S-&qv2Wv-;}pNF zxn3r|bkaeGLle{{zgUyMK2Oy~UgfgpMqRnf*uWt6Z1osZHYLU zaVjsia((pMvfX#{+P4~5bzL)m9dzP_#jCR2X}eEsh|#(}?a%DLCGL`*19==e#6`?DWh)vB@9Qu&l3w=CRjWA3%3^}9OfcW$prSGslQ zREpbX{~W8Wd)jww_B<5zVq2*CG?-g$YZMJ+bDnG=y z)lcaElaybcXJ#($m(_WvGv9vh{JI&t3MXvhODHq_T&@4OJ=@;AM=0?Bo_yc4Z5zH` zFFkEt_whT2*Nk~5?*x{J^d3)M7rOS@w~}Lz&iQZhOSPNN-|oC$S!NFZj%oe#TE7c$ zUEXoHdVNiS%Bhxai~C^@F0HzJTiv+3|H<2qJ->PH_Z>R_Q{$tHoY}6lXq}&(aS7WD zeG4+Q_iN1O`o*%Bef;<6(O=icOA^`kJuP}E@9uUy@O$WWxu2{mD|zDi zt>@~iMv z%OBUT*|$b)zF4<^_oQg?_xgtnzI?y@Sp4IUyEo>yoDB21Gb#G<#~WX#>~3Bh?_?bC z?fkE$y+Ye9>oQ9D@AG`-vv{ApN8oqW`cKbJH=dnyzH{l7>Yv$78^nw@msnl;E;ng5 z@BVXs`rmvx<&G(~JLRdX&6X1k6bV{>w7GA}d70ovcNb3;(ritv`1!D?$~1TXntR`~ z=9sh{epq9dKgT2{E01}@_1E$Bd)}4p{-(3XL!#|&{O<0fi?$pMSm<$0b@%xcqno~; z8y~xt$ZU;T`*8NdN1u}l>@;#tre(i9rMhr-HK%P#^;5r1vhVM{zWJ#6?LRSNaXFuccH? zlsbMs`Fie?Xhp{01A@1AwpyP!eZPgXgL&Qc*I%pdhE2F}ZL9R7vb(xBJyRFHwe-I> z?bP{OZv1aj?%TVavHtPM#QwjW0lUbxLx);U9=WUL>2=b~{zJzMRpSF!LpS+;TAa6i z=lko$ZV~~HJahWRw*Blml{%6A!#(u^^XzX2RZQi?toGoWBIg(WjsF|$bo+gp@%$#4y!o~oB5Mq+SboOs@!TwM zK=`!$tvM0voVYHD%)U0)+o(Nn@-~?>o(|8`hnZrzbz9^!YZSo^h*hUZL=oSb4(Dm7Ja#2QDap><|W%0UaZ_keTw)@~2YnG)x zrtxm24drRY?t)B7NoqHjgzlZYJ=X7N zvhZwi?!b(DJ5K7)V))tJxb3pw_dUygPDua7GriRAQAG0FECv19oNhN~mb_g0FzILS zWzLN|ocr!_ah~a93VbDN@h+_Ozlqh-rW&4=_pWoiS#;!x*4;JoXQHG7X7nrGd@XIC zR`BKIy%!psh4m*lbts8UQVEfW^jiK{G_%V2^Sj%DdIgGA(<(f>ogUrnj!gS*q2jqo zQ2o95(cAK?a*~xkCB0qSYw}*%d-AHg39T}#52b|X?0d4UHTTz)>B~!kBKO39R4=oS z(_d8U`};#j*(8-oDY{6)zU2=bB z+>M@e_ftja+oZQ{>vcZd)A@GyeKPyb_iLvw{It?aJ* e3?4lB&v4PC`CR(;#Ciq>1_n=8KbLh*2~7Z^Mnb~? literal 2806 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' $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 @@ + + + + + From 6a9d95d16148be2255c91bda304f935157e5940e Mon Sep 17 00:00:00 2001 From: vpeter4 Date: Tue, 26 Feb 2013 20:57:10 +0100 Subject: [PATCH 3/4] hdhomerun: added addon settings for modifying tuner type (DVB-C, DVB-T, ATSC) and setting delays --- .../addons/driver/hdhomerun/changelog.txt | 4 + .../addons/driver/hdhomerun/icon/icon.png | Bin 4803 -> 36127 bytes packages/addons/driver/hdhomerun/meta | 4 +- .../driver/hdhomerun/settings-default.xml | 4 + .../hdhomerun/source/bin/hdhomerun.start | 28 +++ .../hdhomerun/source/bin/hdhomerun.stop | 26 +++ .../hdhomerun/source/bin/refresh-tuners.py | 125 ++++++++++++++ .../hdhomerun/source/bin/userspace-driver.sh | 88 ++++++++-- .../driver/hdhomerun/source/bin/xmlpp.py | 161 ++++++++++++++++++ .../addons/driver/hdhomerun/source/default.py | 0 .../resources/language/English/strings.xml | 12 ++ .../hdhomerun/source/resources/settings.xml | 13 ++ .../hdhomerun/source/sleep.d/hdhomerun.power | 8 +- 13 files changed, 452 insertions(+), 21 deletions(-) create mode 100644 packages/addons/driver/hdhomerun/settings-default.xml create mode 100644 packages/addons/driver/hdhomerun/source/bin/hdhomerun.start create mode 100644 packages/addons/driver/hdhomerun/source/bin/hdhomerun.stop create mode 100644 packages/addons/driver/hdhomerun/source/bin/refresh-tuners.py mode change 100755 => 100644 packages/addons/driver/hdhomerun/source/bin/userspace-driver.sh create mode 100644 packages/addons/driver/hdhomerun/source/bin/xmlpp.py mode change 100755 => 100644 packages/addons/driver/hdhomerun/source/default.py create mode 100644 packages/addons/driver/hdhomerun/source/resources/language/English/strings.xml create mode 100644 packages/addons/driver/hdhomerun/source/resources/settings.xml mode change 100755 => 100644 packages/addons/driver/hdhomerun/source/sleep.d/hdhomerun.power diff --git a/packages/addons/driver/hdhomerun/changelog.txt b/packages/addons/driver/hdhomerun/changelog.txt index 84281cae66..fb1539bfea 100644 --- a/packages/addons/driver/hdhomerun/changelog.txt +++ b/packages/addons/driver/hdhomerun/changelog.txt @@ -1,3 +1,7 @@ +3.0.2 +- added addon settings for + modifying tuner type (DVB-C, DVB-T, ATSC) + setting delays 3.0.1 - bump addon version - binary files are stored with OpenELEC image diff --git a/packages/addons/driver/hdhomerun/icon/icon.png b/packages/addons/driver/hdhomerun/icon/icon.png index 3e86018bdd7edf031d927c7500442805ed5c0c03..af1fddcd3e72641080b6401b33b26dd8243b9d92 100644 GIT binary patch literal 36127 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 z zhPj>R)?c60em&zAoALhlkGh8E`ioy%%~CVy*-)uB-TCso{qZ~3{r_%t{g3^puUU=i z(~eI4-}9-vdH>RwdlOft&r+-3`!ii)_d%D^j@hT@7yN(4KjYuMeyg^1ZpnT9&+M0k z#WFw8=eJ$9H~!7iRYhBNp=83>od@O0lc2 z{PHB^H*YFxxp;BC>enWPgtEU%`TNoy{9xU4;PC;f!kt&wly*qx>jOf2S$IXRjZ;iE2&dhu{bHb%l($36m z&#HFJ>(89k%-NZ1He3J6%$m2yP3}(g`8mP*;M^+ZV6(uv3&Lg|o20Qe&k+5=hX8rQPy`j8M-hN|Z!tAKaf{xZ~bC}dbn|xm~6@2>fQP}ve$t&p@ zQ;NDiaKB99x)%NMBmeoiv*q-7jf12X2IxGxVYV!@ZFXv6wAi%N#G7V)j{{a;wW#`% zks|G&6g^WzcIxslWsj7Qc`xs7W}DQv#$)>OPo3H=8C!*#>f?7Gn|ph^q~25s&8ZBH znd_2grB%efJiGDZ--h^ozx959e?Omb*2JZf36`hMw=6r_TGt>M%jd%!eBfV(J?oUq z*%ptsOff1f+yAM#q4aXj%?U!CZzlC$zWI5XV{S^NCx=tYrL}ucOyP9l@Y(Wd-R=L+ z1LnKNCSr+CpT3UHf=sDd z7X)S<_|9B&-`nnV%kKAfZTFL%j`-(y?Fx^n8ZC<7sb zxwF+=BEp4lOly5?@uID7p)`l$p*pp{lOM9*o3j7go14BHBY4hB-*(;d)ivePOWOiD z3+)z*`I17H6*mb6yxp*gk55^dqsgaIfMr5V!jF|o>xAX~mme`*dw!vRblLQ>nD-s8N~)yXgbH8o zxt4XiNunuZ`(^2{^dn2Z-Bn(b>od2D;n?{No|;cn+`qW;_e&(D@8VUN+t7JnV%M2- z3;VC}UixZztnHe|vi4&?c3yqAz~suc&1-qf)_*dYawCsPJ$G|9i)pKXaiGXw?irc& zZMoNVKJH$*|LW{hZs}#uu4m6*d3&qxE*;O(xtS-@&+{iIt&L1FI{6}KnuVR!v@GO5ffgE!N1_lOCS3j3^P6 + + + diff --git a/packages/addons/driver/hdhomerun/source/bin/hdhomerun.start b/packages/addons/driver/hdhomerun/source/bin/hdhomerun.start new file mode 100644 index 0000000000..3224d26d4d --- /dev/null +++ b/packages/addons/driver/hdhomerun/source/bin/hdhomerun.start @@ -0,0 +1,28 @@ +#!/bin/sh + +################################################################################ +# This file is part of OpenELEC - http://www.openelec.tv +# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) +# +# 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 +################################################################################ + +. /etc/profile + +ADDON_DIR="$HOME/.xbmc/addons/driver.dvb.hdhomerun" + +logger -t Hdhomerun "### Hdhomerun manual start ###" +. $ADDON_DIR/bin/userspace-driver.sh diff --git a/packages/addons/driver/hdhomerun/source/bin/hdhomerun.stop b/packages/addons/driver/hdhomerun/source/bin/hdhomerun.stop new file mode 100644 index 0000000000..94b1c5f60a --- /dev/null +++ b/packages/addons/driver/hdhomerun/source/bin/hdhomerun.stop @@ -0,0 +1,26 @@ +#!/bin/sh + +################################################################################ +# This file is part of OpenELEC - http://www.openelec.tv +# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) +# +# 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 +################################################################################ + +. /etc/profile + +logger -t Hdhomerun "### Hdhomerun manual stop ###" +killall userhdhomerun diff --git a/packages/addons/driver/hdhomerun/source/bin/refresh-tuners.py b/packages/addons/driver/hdhomerun/source/bin/refresh-tuners.py new file mode 100644 index 0000000000..bc382eeb01 --- /dev/null +++ b/packages/addons/driver/hdhomerun/source/bin/refresh-tuners.py @@ -0,0 +1,125 @@ +""" +################################################################################ +# 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.hdhomerun') +__cwd__ = __settings__.getAddonInfo('path') +__settings_xml__ = xbmc.translatePath(os.path.join(__cwd__, 'resources', 'settings.xml')) + +__hdhomerun_log__ = '/var/log/dvbhdhomerun.log' + +# 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) +tuners = [] +try: + for line in open(__hdhomerun_log__, 'r'): + line = line.strip() + if line.startswith('Registered tuner'): + name = line.split(':'); + name = name[2].strip() + tuners.append(name) +except IOError: + print 'Error reading log file ', __hdhomerun_log__ + +""" +root ~ # grep "Registered tuner" /var/log/dvbhdhomerun.log +Registered tuner, id from kernel: 0 name: 101ADD2B-0 +Registered tuner, id from kernel: 1 name: 101ADD2B-1 +Registered tuner, id from kernel: 2 name: 1031D75A-0 +Registered tuner, id from kernel: 3 name: 1031D75A-1 +""" + +###################################################################################################### + +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_name in enumerate(tuners): + tuner_name_var = tuner_name.replace('-', '_') + + node1 = xmldoc.createElement("setting") + node1.setAttribute("id", 'ATTACHED_TUNER_' + tuner_name_var + '_DVBMODE') + node1.setAttribute("label", tuner_name) + node1.setAttribute("type", 'labelenum') + node1.setAttribute("default", 'auto') + node1.setAttribute("values", 'auto|ATSC|DVB-C|DVB-T') + node_cat.appendChild(node1) + + node2 = xmldoc.createElement("setting") + node2.setAttribute("id", 'ATTACHED_TUNER_' + tuner_name_var + '_FULLNAME') + node2.setAttribute("label", '9020') + node2.setAttribute("type", 'bool') + node2.setAttribute("default", 'false') + node_cat.appendChild(node2) + + node3 = xmldoc.createElement("setting") + node3.setAttribute("id", 'ATTACHED_TUNER_' + tuner_name_var + '_DISABLE') + node3.setAttribute("label", '9030') + node3.setAttribute("type", 'bool') + node3.setAttribute("default", 'false') + 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.hdhomerun').openSettings() diff --git a/packages/addons/driver/hdhomerun/source/bin/userspace-driver.sh b/packages/addons/driver/hdhomerun/source/bin/userspace-driver.sh old mode 100755 new mode 100644 index 3f589962a8..393cc2a5c9 --- a/packages/addons/driver/hdhomerun/source/bin/userspace-driver.sh +++ b/packages/addons/driver/hdhomerun/source/bin/userspace-driver.sh @@ -24,6 +24,11 @@ ADDON_DIR="$HOME/.xbmc/addons/driver.dvb.hdhomerun" ADDON_HOME="$HOME/.xbmc/userdata/addon_data/driver.dvb.hdhomerun" +ADDON_SETTINGS="$ADDON_HOME/settings.xml" + +# modules are not automatically loaded +modprobe dvb_hdhomerun +modprobe dvb_hdhomerun_fe mkdir -p $ADDON_HOME @@ -31,31 +36,84 @@ if [ ! -f "$ADDON_HOME/dvbhdhomerun.sample" ]; then cp $ADDON_DIR/config/* $ADDON_HOME/ fi +if [ ! -f "$ADDON_SETTINGS" ]; then + cp $ADDON_DIR/settings-default.xml $ADDON_SETTINGS +fi + +mkdir -p /var/config +cat "$ADDON_SETTINGS" | awk -F\" '{print $2"=\""$4"\""}' | sed '/^=/d' > /var/config/hdhomerun-addon.conf +. /var/config/hdhomerun-addon.conf + if [ -z "$(pidof userhdhomerun)" ]; then + if [ "$ENABLE_TUNER_TYPES" = "true" ]; then + DVBHDHOMERUN_CONF_TMP=/tmp/dvbhdhomerun.conf + touch $ADDON_HOME/dvbhdhomerun.conf + cp $ADDON_HOME/dvbhdhomerun.conf $DVBHDHOMERUN_CONF_TMP + + # get tuner serial numbers + SERIALS=$(cat /var/config/hdhomerun-addon.conf | sed -n 's|^ATTACHED_TUNER_\(.*\)_\(.*\)_DVBMODE=.*|\1-\2|gp' | sort | uniq) + . /var/config/hdhomerun-addon.conf + + for SERIAL in ${SERIALS[@]}; do + SERIAL_VAR=$(echo $SERIAL | sed 's|-|_|') + DVBMODE=$(eval echo \$ATTACHED_TUNER_${SERIAL_VAR}_DVBMODE) + FULLNAME=$(eval echo \$ATTACHED_TUNER_${SERIAL_VAR}_FULLNAME) + DISABLE=$(eval echo \$ATTACHED_TUNER_${SERIAL_VAR}_DISABLE) + + [ "$DVBMODE" = "auto" ] && DVBMODE="" + + # remove setttings for this tuner + awk -v val="[$SERIAL]" '$0 == val {flag=1; next} /^tuner_type=|^use_full_name=|^disable=|^#|^$/{if (flag==1) next} /.*/{flag=0; print}' $DVBHDHOMERUN_CONF_TMP >${DVBHDHOMERUN_CONF_TMP}-types + mv ${DVBHDHOMERUN_CONF_TMP}-types $DVBHDHOMERUN_CONF_TMP + echo "" >>$DVBHDHOMERUN_CONF_TMP + # remove empty lines at the end of file + sed -i '${/^$/d;}' $DVBHDHOMERUN_CONF_TMP + + ADDNEW=true + if [ -n "$DVBMODE" ]; then + [ $ADDNEW = true ] && ADDNEW=false && echo "[$SERIAL]" >>$DVBHDHOMERUN_CONF_TMP + echo "tuner_type=$DVBMODE" >>$DVBHDHOMERUN_CONF_TMP + fi + if [ "$FULLNAME" = "true" ]; then + [ $ADDNEW = true ] && ADDNEW=false && echo "[$SERIAL]" >>$DVBHDHOMERUN_CONF_TMP + echo "use_full_name=true" >>$DVBHDHOMERUN_CONF_TMP + fi + if [ "$DISABLE" = "true" ]; then + [ $ADDNEW = true ] && ADDNEW=false && echo "[$SERIAL]" >>$DVBHDHOMERUN_CONF_TMP + echo "disable=true" >>$DVBHDHOMERUN_CONF_TMP + fi + + echo "" >>$DVBHDHOMERUN_CONF_TMP + done + + md5_1=$(md5sum -b $DVBHDHOMERUN_CONF_TMP | awk '{print $1}') + md5_2=$(md5sum -b $ADDON_HOME/dvbhdhomerun.conf | awk '{print $1}') + if [ "$md5_1" != "$md5_2" ]; then + # file changed - copy to addon home + cp $DVBHDHOMERUN_CONF_TMP $ADDON_HOME/dvbhdhomerun.conf + fi + fi + rm -f /tmp/dvbhdhomerun if [ -f $ADDON_HOME/dvbhdhomerun.conf ]; then ln -s $ADDON_HOME/dvbhdhomerun.conf /tmp/dvbhdhomerun fi - # modules are not automatically loaded - modprobe dvb_hdhomerun - modprobe dvb_hdhomerun_fe - usleep 2000000 + [ -z "$PRE_WAIT" ] && PRE_WAIT=0 + PRE_WAIT=$(( $PRE_WAIT *1 )) + [ -z "$POST_WAIT" ] && POST_WAIT=0 + POST_WAIT=$(( $POST_WAIT *1 )) - # could be useful - if [ -f $ADDON_HOME/pre-wait.sh ]; then - sh $ADDON_HOME/pre-wait.sh - fi + logger -t HDHomeRun "### Pre wait for $PRE_WAIT sec ###" + sleep $PRE_WAIT mkdir -p /var/log/ rm -f /var/log/dvbhdhomerun.log - + userhdhomerun -f - # how much time should we wait? - usleep 1000000 - if [ -f $ADDON_HOME/post-wait.sh ]; then - sh $ADDON_HOME/post-wait.sh - fi + + logger -t HDHomeRun "### Post wait for $POST_WAIT sec ###" + sleep $POST_WAIT # save adapter names in background ( @@ -67,3 +125,5 @@ if [ -z "$(pidof userhdhomerun)" ]; then fi )& fi + +logger -t HDHomeRun "### HDHomeRun ready ###" diff --git a/packages/addons/driver/hdhomerun/source/bin/xmlpp.py b/packages/addons/driver/hdhomerun/source/bin/xmlpp.py new file mode 100644 index 0000000000..342dcc01d7 --- /dev/null +++ b/packages/addons/driver/hdhomerun/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/hdhomerun/source/default.py b/packages/addons/driver/hdhomerun/source/default.py old mode 100755 new mode 100644 diff --git a/packages/addons/driver/hdhomerun/source/resources/language/English/strings.xml b/packages/addons/driver/hdhomerun/source/resources/language/English/strings.xml new file mode 100644 index 0000000000..143e077530 --- /dev/null +++ b/packages/addons/driver/hdhomerun/source/resources/language/English/strings.xml @@ -0,0 +1,12 @@ + + + General + Pre wait time [sec] + Post wait time [sec] + + Tuner settings + Enable modifying settings + Refresh... + use full name + disabled + diff --git a/packages/addons/driver/hdhomerun/source/resources/settings.xml b/packages/addons/driver/hdhomerun/source/resources/settings.xml new file mode 100644 index 0000000000..afaf8065f9 --- /dev/null +++ b/packages/addons/driver/hdhomerun/source/resources/settings.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/packages/addons/driver/hdhomerun/source/sleep.d/hdhomerun.power b/packages/addons/driver/hdhomerun/source/sleep.d/hdhomerun.power old mode 100755 new mode 100644 index c2c52fc1cd..02ac8750f3 --- a/packages/addons/driver/hdhomerun/source/sleep.d/hdhomerun.power +++ b/packages/addons/driver/hdhomerun/source/sleep.d/hdhomerun.power @@ -23,22 +23,22 @@ . /etc/profile LOCKDIR="/var/lock/" -LOCKFILE="hdhomerun" +LOCKFILE="$LOCKDIR/hdhomerun" case "$1" in hibernate|suspend) if [ -n "$(pidof userhdhomerun)" ]; then progress "Shutting down HDHomeRun driver for suspending..." mkdir -p "$LOCKDIR" - touch "$LOCKDIR/$LOCKFILE" + touch "$LOCKFILE" killall userhdhomerun fi ;; thaw|resume) - if [ -f "$LOCKDIR/$LOCKFILE" ]; then + if [ -f "$LOCKFILE" ]; then # driver started within Tvheadend/VDR - rm -rf "$LOCKDIR/$LOCKFILE" + rm -f "$LOCKFILE" fi ;; From 3d54e09252a4f34de4a2ee7198e02d36e39bf147 Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Tue, 26 Feb 2013 13:48:50 +0200 Subject: [PATCH 4/4] implement 'wait for network' --- .../config/default_settings.xml | 2 ++ .../resources/language/English/strings.xml | 3 ++ .../source/resources/settings.xml | 4 +++ packages/mediacenter/xbmc/init.d/93_xbmc | 3 ++ .../network/connman/profile.d/connman.conf | 36 +++++++++++++++++++ 5 files changed, 48 insertions(+) create mode 100644 packages/network/connman/profile.d/connman.conf diff --git a/packages/mediacenter/xbmc-addon-settings/config/default_settings.xml b/packages/mediacenter/xbmc-addon-settings/config/default_settings.xml index af1f23e09b..89f52ccede 100644 --- a/packages/mediacenter/xbmc-addon-settings/config/default_settings.xml +++ b/packages/mediacenter/xbmc-addon-settings/config/default_settings.xml @@ -2,6 +2,8 @@ + + diff --git a/packages/mediacenter/xbmc-addon-settings/source/resources/language/English/strings.xml b/packages/mediacenter/xbmc-addon-settings/source/resources/language/English/strings.xml index 21f01629a1..53c1d78040 100644 --- a/packages/mediacenter/xbmc-addon-settings/source/resources/language/English/strings.xml +++ b/packages/mediacenter/xbmc-addon-settings/source/resources/language/English/strings.xml @@ -13,6 +13,9 @@ HDD standby Enable HDD standby HDD standby timeout (minutes) + Other + Wait for network before starting xbmc + Wait time (seconds) Network diff --git a/packages/mediacenter/xbmc-addon-settings/source/resources/settings.xml b/packages/mediacenter/xbmc-addon-settings/source/resources/settings.xml index 3e906b7773..42f2ba0db9 100644 --- a/packages/mediacenter/xbmc-addon-settings/source/resources/settings.xml +++ b/packages/mediacenter/xbmc-addon-settings/source/resources/settings.xml @@ -17,6 +17,10 @@ + + + + diff --git a/packages/mediacenter/xbmc/init.d/93_xbmc b/packages/mediacenter/xbmc/init.d/93_xbmc index df8f7d9d05..fa4606486f 100644 --- a/packages/mediacenter/xbmc/init.d/93_xbmc +++ b/packages/mediacenter/xbmc/init.d/93_xbmc @@ -52,6 +52,9 @@ fi # waiting for Xorg to start wait_for_xorg +# wait for network + wait_for_inet_addr + # set cpu's to 'conservative' ( usleep 15000000 progress "set cpu's to 'ondemand'" diff --git a/packages/network/connman/profile.d/connman.conf b/packages/network/connman/profile.d/connman.conf new file mode 100644 index 0000000000..ec281cd8e6 --- /dev/null +++ b/packages/network/connman/profile.d/connman.conf @@ -0,0 +1,36 @@ +################################################################################ +# This file is part of OpenELEC - http://www.openelec.tv +# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) +# +# 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 +################################################################################ + +wait_for_inet_addr () { + if [ -f /var/config/settings.conf ]; then + . /var/config/settings.conf + fi + + if [ "$WAIT_NETWORK" = "true" ] ; then + progress "Wait for network" + [ -z "$WAIT_NETWORK_TIME" ] && WAIT_NETWORK_TIME=10 + LOOP_COUNT=$[$WAIT_NETWORK_TIME * 5] + for i in $(seq 1 $LOOP_COUNT) ; do + cnt=$(ifconfig | sed -e '/inet addr:/!d' -e '/127.0.0.1/d' |wc -l) + [ $cnt -gt 0 ] && break + usleep 200000 + done + fi +}