The branch, eden has been updated
via 025dd0fd3d5c2d65c41580ecc091a8c9800698e7 (commit)
from c7e222045198f1ac404a956d4358f638b7131715 (commit)
- Log -----------------------------------------------------------------
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/scripts;a=commit;h=025dd0fd3d5c2d65c41580ecc091a8c9800698e7
commit 025dd0fd3d5c2d65c41580ecc091a8c9800698e7
Author: M. Kaijser <[email protected]>
Date: Thu Jul 11 11:12:23 2013 +0200
[script.xbmc.lcdproc] 1.3.0
diff --git a/script.xbmc.lcdproc/addon.xml b/script.xbmc.lcdproc/addon.xml
index e5624a8..ca50668 100644
--- a/script.xbmc.lcdproc/addon.xml
+++ b/script.xbmc.lcdproc/addon.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<addon id="script.xbmc.lcdproc" name="XBMC LCDproc" version="1.2.1"
provider-name="Team XBMC: Memphiz, Daniel 'herrnst' Scheller">
+<addon id="script.xbmc.lcdproc" name="XBMC LCDproc" version="1.3.0"
provider-name="Team XBMC: Memphiz, Daniel 'herrnst' Scheller">
<requires>
<import addon="xbmc.python" version="2.0"/>
<import addon="xbmc.gui" version="3.0"/>
diff --git a/script.xbmc.lcdproc/changelog.txt
b/script.xbmc.lcdproc/changelog.txt
index 6970eee..172a1e2 100644
--- a/script.xbmc.lcdproc/changelog.txt
+++ b/script.xbmc.lcdproc/changelog.txt
@@ -1,3 +1,14 @@
+1.3.0 / 2.3.0
+- Alternate charmap selection, support for HD44780/iMON ROM (A00 and A02
variants) charsets
+- New "tvshow" mode, active when playing media from the TV-shows database
+- Refactored backlight dimming handling and configuration via GUI settings
+- Cleaned up and improved TCP/Telnet socket handling
+- Indicate internet stream on extraicon-supported displays
+- Use XBMC's time for daytime display on BigDigit-mode and thus properly
display 12/24h clocks, improve bigdigit handling
+- Additional "finetuning"-options for extraicon/bar-support
+- Option to entirely disable extra stuff support
+- Always load defaults so LCD.xml in the masterprofile acts as user override,
makes additions like new modes or wrong spelling in XML tags not result in
empty displays
+- Bugfixes and friends, of course
1.2.1 / 2.2.1
- Bugfixes, Credits, slightly more convenient configuration option bools
1.2.0 / 2.2.0
diff --git a/script.xbmc.lcdproc/lcdmain.py b/script.xbmc.lcdproc/lcdmain.py
index fbb19f9..3bdb45c 100644
--- a/script.xbmc.lcdproc/lcdmain.py
+++ b/script.xbmc.lcdproc/lcdmain.py
@@ -79,6 +79,7 @@ def getLcdMode():
navActive = InfoLabel_IsNavigationActive()
screenSaver = InfoLabel_IsScreenSaverActive()
playingVideo = InfoLabel_PlayingVideo()
+ playingTVShow = InfoLabel_PlayingTVShow()
playingMusic = InfoLabel_PlayingAudio()
playingPVRTV = InfoLabel_PlayingLiveTV()
playingPVRRadio = InfoLabel_PlayingLiveRadio()
@@ -91,6 +92,8 @@ def getLcdMode():
ret = LCD_MODE.LCD_MODE_PVRTV
elif playingPVRRadio:
ret = LCD_MODE.LCD_MODE_PVRRADIO
+ elif playingTVShow:
+ ret = LCD_MODE.LCD_MODE_TVSHOW
elif playingVideo:
ret = LCD_MODE.LCD_MODE_VIDEO
elif playingMusic:
@@ -99,34 +102,19 @@ def getLcdMode():
return ret
def process_lcd():
- bBacklightDimmed = False
while not xbmc.abortRequested:
if handleConnectLCD():
settingsChanged = settings_didSettingsChange()
- mode = getLcdMode()
- if mode == LCD_MODE.LCD_MODE_SCREENSAVER and
settings_getDimOnScreensaver() and not bBacklightDimmed:
- g_lcdproc.SetBackLight(0)
- bBacklightDimmed = True
+ if settingsChanged:
+ g_lcdproc.UpdateGUISettings()
- g_lcdproc.Render(mode, settingsChanged)
-
- # turn the backlight on when leaving screensaver and it was dimmed
- if mode != LCD_MODE.LCD_MODE_SCREENSAVER and bBacklightDimmed:
- g_lcdproc.SetBackLight(1)
- bBacklightDimmed = False
-
- if mode == LCD_MODE.LCD_MODE_MUSIC or mode == LCD_MODE.LCD_MODE_PVRRADIO:
- g_lcdproc.DisableOnPlayback(False, True)
- elif mode == LCD_MODE.LCD_MODE_VIDEO or mode == LCD_MODE.LCD_MODE_PVRTV:
- g_lcdproc.DisableOnPlayback(True, False)
- else:
- g_lcdproc.DisableOnPlayback(False, False)
+ g_lcdproc.Render(getLcdMode(), settingsChanged)
time.sleep(1.0 / float(settings_getRefreshRate())) # refresh after
configured rate
- g_lcdproc.Shutdown(settings_getDimOnShutdown())
+ g_lcdproc.Shutdown()
def handleConnectLCD():
ret = True
@@ -136,12 +124,10 @@ def handleConnectLCD():
#check for new settings
if settings_checkForNewSettings() or not g_lcdproc.IsConnected():
#networksettings changed?
g_failedConnectionNotified = False #reset notification flag
- else:
- return True
- ret = g_lcdproc.Initialize()
- if not settings_getHideConnPopups():
- HandleConnectionNotification(ret)
+ ret = g_lcdproc.Initialize()
+ if not settings_getHideConnPopups():
+ HandleConnectionNotification(ret)
return ret
diff --git a/script.xbmc.lcdproc/resources/LCD.xml.defaults
b/script.xbmc.lcdproc/resources/LCD.xml.defaults
index 7d50cc5..b565702 100644
--- a/script.xbmc.lcdproc/resources/LCD.xml.defaults
+++ b/script.xbmc.lcdproc/resources/LCD.xml.defaults
@@ -20,6 +20,13 @@
<line>$INFO[LCD.ProgressBar]</line>
<line>Freemem: $INFO[System.FreeMemory]</line>
</video>
+ <tvshow>
+ <line>$INFO[LCD.PlayIcon]
$INFO[Player.Time]/$INFO[Player.Duration]</line>
+ <line>$INFO[VideoPlayer.TVShowTitle]</line>
+ <line>$INFO[VideoPlayer.Title]</line>
+ <line>$INFO[LCD.ProgressBar]</line>
+ <line>Freemem: $INFO[System.FreeMemory]</line>
+ </tvshow>
<general>
<line>XBMC running...</line>
<line>$INFO[System.Time] $INFO[System.Date]</line>
diff --git a/script.xbmc.lcdproc/resources/language/English/strings.xml
b/script.xbmc.lcdproc/resources/language/English/strings.xml
index ac2b658..832a683 100644
--- a/script.xbmc.lcdproc/resources/language/English/strings.xml
+++ b/script.xbmc.lcdproc/resources/language/English/strings.xml
@@ -7,11 +7,18 @@
<string id="32102">Scroll mode</string>
<string id="32103">Navigation display duration (s)</string>
<string id="32104">Display refresh rate (Hz)</string>
+ <string id="32105">Use alternate charset</string>
+ <string id="32106">Charset</string>
+ <string id="32107">Support for extra display elements (e.g. icons)</string>
<!--Backlight-->
<string id="32200">Backlight</string>
- <string id="32201">Dim backlight on screensaver</string>
- <string id="32202">Dim backlight on shutdown</string>
+ <string id="32201">on screensaver</string>
+ <string id="32202">Dim on shutdown</string>
+ <string id="32203">on video/LiveTV playback</string>
+ <string id="32204">on music/radio playback</string>
+ <string id="32205">Delay (s)</string>
+ <string id="32206">Dim/turn off...</string>
<!--Connection-->
<string id="32300">Connection</string>
@@ -21,10 +28,19 @@
<string id="32304">Show heartbeat symbol</string>
<string id="32305">Hide connection error notifications</string>
- <!--Enum values-->
+ <!--Enum values: Scroll mode-->
<string id="32401">Marquee</string>
<string id="32402">Left/Right</string>
+ <!--Enum values: Charsets-->
+ <string id="32411">ISO8859-1 (default)</string>
+ <string id="32412">ISO8859-15</string>
+ <string id="32413">KOI8-R</string>
+ <string id="32414">CP1251</string>
+ <string id="32415">ISO8859-5</string>
+ <string id="32416">HD44780-ROM A00</string>
+ <string id="32417">HD44780-ROM A02</string>
+
<!--Notifications-->
<string id="32500">Failed to connect to LCDProc!</string>
<string id="32501">Connected to LCDProc!</string>
diff --git a/script.xbmc.lcdproc/resources/language/German/strings.xml
b/script.xbmc.lcdproc/resources/language/German/strings.xml
index a589205..205fc86 100644
--- a/script.xbmc.lcdproc/resources/language/German/strings.xml
+++ b/script.xbmc.lcdproc/resources/language/German/strings.xml
@@ -7,11 +7,18 @@
<string id="32102">Scroll-Modus</string>
<string id="32103">Anzeigedauer der Navigationsansicht (s)</string>
<string id="32104">Display-Aktualisierungsrate (Hz)</string>
+ <string id="32105">Verwende alternativen Zeichensatz</string>
+ <string id="32106">Zeichensatz</string>
+ <string id="32107">Zusatzdisplayelemente (z.B. Icons) unterstützen</string>
<!--Backlight-->
<string id="32200">Beleuchtung</string>
- <string id="32201">Hintergrundbeleuchtung ausschalten, wenn
Bildschirmschoner aktiv</string>
- <string id="32202">Hintergrundbeleuchtung beim Herunterfahren
ausschalten</string>
+ <string id="32201">wenn Bildschirmschoner aktiv</string>
+ <string id="32202">Beim Herunterfahren abdunkeln/abschalten</string>
+ <string id="32203">während Video/LiveTV-Wiedergabe</string>
+ <string id="32204">während Musik/Radio-Wiedergabe</string>
+ <string id="32205">Verzögerung (s)</string>
+ <string id="32206">Abdunkeln/Abschalten...</string>
<!--Connection-->
<string id="32300">Verbindung</string>
@@ -21,10 +28,19 @@
<string id="32304">Heartbeatsymbol anzeigen</string>
<string id="32305">Verbindungsfehler-Benachrichtigung verstecken</string>
- <!--Enum values-->
+ <!--Enum values: Scroll mode-->
<string id="32401">Durchlaufend</string>
<string id="32402">Links/Rechts</string>
+ <!--Enum values: Charsets-->
+ <string id="32411">ISO8859-1 (Standard)</string>
+ <string id="32412">ISO8859-15</string>
+ <string id="32413">KOI8-R</string>
+ <string id="32414">CP1251</string>
+ <string id="32415">ISO8859-5</string>
+ <string id="32416">HD44780-ROM A00</string>
+ <string id="32417">HD44780-ROM A02</string>
+
<!--Notifications-->
<string id="32500">Fehler beim Verbinden zu LCDproc!</string>
<string id="32501">Verbunden mit LCDproc!</string>
diff --git a/script.xbmc.lcdproc/resources/lib/extraicons.py
b/script.xbmc.lcdproc/resources/lib/extraicons.py
index 1de8164..21d63f4 100644
--- a/script.xbmc.lcdproc/resources/lib/extraicons.py
+++ b/script.xbmc.lcdproc/resources/lib/extraicons.py
@@ -39,6 +39,7 @@ LCD_EXTRAICONS = enum(
'LCD_EXTRAICON_WEATHER',
'LCD_EXTRAICON_TV',
'LCD_EXTRAICON_PHOTO',
+ 'LCD_EXTRAICON_WEBCASTING',
'LCD_EXTRAICON_MUTE',
'LCD_EXTRAICON_REPEAT',
'LCD_EXTRAICON_SHUFFLE',
diff --git a/script.xbmc.lcdproc/resources/lib/infolabels.py
b/script.xbmc.lcdproc/resources/lib/infolabels.py
index 150862c..0423fd2 100644
--- a/script.xbmc.lcdproc/resources/lib/infolabels.py
+++ b/script.xbmc.lcdproc/resources/lib/infolabels.py
@@ -58,20 +58,44 @@ class WINDOW_IDS:
WINDOW_DIALOG_VOLUME_BAR = 10104
WINDOW_DIALOG_KAI_TOAST = 10107
+g_StreamPrefixes = [ \
+ "http", "https", "tcp", "udp", "rtp", \
+ "sdp", "mms", "mmst", "mmsh", "rtsp", \
+ "rtmp", "rtmpt", "rtmpe", "rtmpte", "rtmps" \
+]
+
global g_InfoLabel_oldMenu
global g_InfoLabel_oldSubMenu
global g_InfoLabel_navTimer
+global g_InfoLabel_oldFilenameandpath
+global g_InfoLabel_CachedFilenameIsStream
def InfoLabel_Initialize():
global g_InfoLabel_oldMenu
global g_InfoLabel_oldSubMenu
global g_InfoLabel_navTimer
+ global g_InfoLabel_oldFilenameandpath
+ global g_InfoLabel_CachedFilenameIsStream
g_InfoLabel_oldMenu = ""
g_InfoLabel_oldSubMenu = ""
g_InfoLabel_navTimer = time.time()
+ g_InfoLabel_oldFilenameandpath = ""
+ g_InfoLabel_CachedFilenameIsStream = False
+
+def InfoLabel_GetInfoLabel(strLabel):
+ return xbmc.getInfoLabel(strLabel)
+
+def InfoLabel_GetBool(strBool):
+ return xbmc.getCondVisibility(strBool)
+
+def InfoLabel_GetActiveWindowID():
+ return int(xbmcgui.getCurrentWindowId())
def InfoLabel_timeToSecs(timeAr):
+ # initialise return
+ currentSecs = 0
+
arLen = len(timeAr)
if arLen == 1:
currentSecs = int(timeAr[0])
@@ -79,43 +103,54 @@ def InfoLabel_timeToSecs(timeAr):
currentSecs = int(timeAr[0]) * 60 + int(timeAr[1])
elif arLen == 3:
currentSecs = int(timeAr[0]) * 60 * 60 + int(timeAr[1]) * 60 +
int(timeAr[2])
+
return currentSecs
def InfoLabel_WindowIsActive(WindowID):
- return xbmc.getCondVisibility("Window.IsActive(" + str(WindowID) + ")")
+ return InfoLabel_GetBool("Window.IsActive(" + str(WindowID) + ")")
def InfoLabel_PlayingVideo():
- return xbmc.getCondVisibility("Player.HasVideo")
+ return InfoLabel_GetBool("Player.HasVideo")
+
+def InfoLabel_PlayingTVShow():
+ if InfoLabel_PlayingVideo() and
len(InfoLabel_GetInfoLabel("VideoPlayer.TVShowTitle")):
+ return True
+ else:
+ return False
def InfoLabel_PlayingAudio():
- return xbmc.getCondVisibility("Player.HasAudio")
+ return InfoLabel_GetBool("Player.HasAudio")
def InfoLabel_PlayingLiveTV():
- return xbmc.getCondVisibility("PVR.IsPlayingTV")
+ return InfoLabel_GetBool("PVR.IsPlayingTV")
def InfoLabel_PlayingLiveRadio():
- return xbmc.getCondVisibility("PVR.IsPlayingRadio")
+ return InfoLabel_GetBool("PVR.IsPlayingRadio")
+
+def InfoLabel_GetSystemTime():
+ # apply some split magic for 12h format here, as "hh:mm:ss"
+ # makes up for format guessing inside XBMC - fix for post-frodo at
+ # https://github.com/xbmc/xbmc/pull/2321
+ ret = "0" + InfoLabel_GetInfoLabel("System.Time(hh:mm:ss)").split(" ")[0]
+ return ret[-8:]
def InfoLabel_GetPlayerTime():
- return xbmc.getInfoLabel("Player.Time")
+ return InfoLabel_GetInfoLabel("Player.Time")
def InfoLabel_GetPlayerDuration():
- return xbmc.getInfoLabel("Player.Duration")
-
-def InfoLabel_GetActiveWindowID():
- return int(xbmcgui.getCurrentWindowId())
+ return InfoLabel_GetInfoLabel("Player.Duration")
def InfoLabel_IsPlayerPlaying():
- return xbmc.getCondVisibility("Player.Playing")
+ return InfoLabel_GetBool("Player.Playing")
def InfoLabel_IsPlayerPaused():
- return xbmc.getCondVisibility("Player.Paused")
+ return InfoLabel_GetBool("Player.Paused")
def InfoLabel_IsPlayerForwarding():
- return xbmc.getCondVisibility("Player.Forwarding")
+ return InfoLabel_GetBool("Player.Forwarding")
def InfoLabel_IsPlayerRewinding():
- return xbmc.getCondVisibility("Player.Rewinding")
+ return InfoLabel_GetBool("Player.Rewinding")
def InfoLabel_IsPlayingAny():
return (InfoLabel_IsPlayerPlaying() |
@@ -123,35 +158,48 @@ def InfoLabel_IsPlayingAny():
InfoLabel_IsPlayerForwarding() |
InfoLabel_IsPlayerRewinding())
+def InfoLabel_IsInternetStream():
+ global g_InfoLabel_oldFilenameandpath
+ global g_InfoLabel_CachedFilenameIsStream
+
+ fname = InfoLabel_GetInfoLabel("Player.Filenameandpath")
+
+ if fname != g_InfoLabel_oldFilenameandpath:
+ g_InfoLabel_oldFilenameandpath = fname
+ g_InfoLabel_CachedFilenameIsStream = False
+
+ for prefix in g_StreamPrefixes:
+ if fname.find(prefix + "://") == 0:
+ g_InfoLabel_CachedFilenameIsStream = True
+
+ return g_InfoLabel_CachedFilenameIsStream
+
def InfoLabel_IsPassthroughAudio():
- return xbmc.getCondVisibility("Player.Passthrough")
+ return InfoLabel_GetBool("Player.Passthrough")
def InfoLabel_IsPVRRecording():
- return xbmc.getCondVisibility("PVR.IsRecording")
+ return InfoLabel_GetBool("PVR.IsRecording")
def InfoLabel_IsPlaylistRandom():
- return xbmc.getCondVisibility("Playlist.IsRandom")
+ return InfoLabel_GetBool("Playlist.IsRandom")
def InfoLabel_IsPlaylistRepeatAll():
- return xbmc.getCondVisibility("Playlist.IsRepeat")
+ return InfoLabel_GetBool("Playlist.IsRepeat")
def InfoLabel_IsPlaylistRepeatOne():
- return xbmc.getCondVisibility("Playlist.IsRepeatOne")
+ return InfoLabel_GetBool("Playlist.IsRepeatOne")
def InfoLabel_IsPlaylistRepeatAny():
return (InfoLabel_IsPlaylistRepeatAll() | InfoLabel_IsPlaylistRepeatOne())
def InfoLabel_IsDiscInDrive():
- return xbmc.getCondVisibility("System.HasMediaDVD")
+ return InfoLabel_GetBool("System.HasMediaDVD")
def InfoLabel_IsScreenSaverActive():
- return xbmc.getCondVisibility("System.ScreenSaverActive")
-
-def InfoLabel_GetInfoLabel(strLabel):
- return xbmc.getInfoLabel(strLabel)
+ return InfoLabel_GetBool("System.ScreenSaverActive")
def InfoLabel_GetVolumePercent():
- volumedb =
float(string.replace(string.replace(xbmc.getInfoLabel("Player.Volume"), ",",
"."), " dB", ""))
+ volumedb =
float(string.replace(string.replace(InfoLabel_GetInfoLabel("Player.Volume"),
",", "."), " dB", ""))
return (100 * (60.0 + volumedb) / 60)
def InfoLabel_GetPlayerTimeSecs():
diff --git a/script.xbmc.lcdproc/resources/lib/lcdbase.py
b/script.xbmc.lcdproc/resources/lib/lcdbase.py
index 7c7ea07..db60af9 100644
--- a/script.xbmc.lcdproc/resources/lib/lcdbase.py
+++ b/script.xbmc.lcdproc/resources/lib/lcdbase.py
@@ -41,29 +41,26 @@ __icon__ = sys.modules[ "__main__" ].__icon__
__lcdxml__ = xbmc.translatePath(
os.path.join("special://masterprofile","LCD.xml"))
__lcddefaultxml__ = xbmc.translatePath( os.path.join(__cwd__, "resources",
"LCD.xml.defaults"))
+from settings import *
from extraicons import *
from infolabels import *
+from charset_hd44780 import *
# global functions
def log(loglevel, msg):
xbmc.log("### [%s] - %s" % (__scriptname__,msg,),level=loglevel )
-# enumerations
-class DISABLE_ON_PLAY:
- DISABLE_ON_PLAY_NONE = 0
- DISABLE_ON_PLAY_VIDEO = 1
- DISABLE_ON_PLAY_MUSIC = 2
-
class LCD_MODE:
LCD_MODE_GENERAL = 0
LCD_MODE_MUSIC = 1
LCD_MODE_VIDEO = 2
- LCD_MODE_NAVIGATION = 3
- LCD_MODE_SCREENSAVER = 4
- LCD_MODE_XBE_LAUNCH = 5
- LCD_MODE_PVRTV = 6
- LCD_MODE_PVRRADIO = 7
- LCD_MODE_MAX = 8
+ LCD_MODE_TVSHOW = 3
+ LCD_MODE_NAVIGATION = 4
+ LCD_MODE_SCREENSAVER = 5
+ LCD_MODE_XBE_LAUNCH = 6
+ LCD_MODE_PVRTV = 7
+ LCD_MODE_PVRRADIO = 8
+ LCD_MODE_MAX = 9
class LCD_LINETYPE:
LCD_LINETYPE_TEXT = "text"
@@ -85,23 +82,29 @@ g_dictEmptyLineDescriptor['align'] =
LCD_LINEALIGN.LCD_LINEALIGN_LEFT
class LcdBase():
def __init__(self):
- self.m_disableOnPlay = DISABLE_ON_PLAY.DISABLE_ON_PLAY_NONE
- self.m_timeDisableOnPlayTimer = time.time()
+ # configuration vars (from LCD.xml)
self.m_lcdMode = [None] * LCD_MODE.LCD_MODE_MAX
self.m_extraBars = [None] * (LCD_EXTRABARS_MAX + 1)
- self.m_bDimmedOnPlayback = False
- self.m_iDimOnPlayDelay = 0
- self.m_strInfoLabelEncoding = "utf-8" #
http://forum.xbmc.org/showthread.php?tid=125492&pid=1045926#pid1045926
- self.m_strLCDEncoding = "iso-8859-1" # LCDproc wants iso-8859-1!
- self.m_strScrollSeparator = " "
+ self.m_bAllowEmptyLines = False
+ self.m_bCenterBigDigits = False
+ self.m_bDisablePlayIndicatorOnPause = False
self.m_bProgressbarSurroundings = False
+ self.m_iDimOnPlayDelay = 0
self.m_iIconTextOffset = 2
- self.m_bAllowEmptyLines = False
- self.m_strOldVideoCodec = ""
- self.m_strOldAudioCodec = ""
- self.m_iOldAudioChannelsVar = 0
+ self.m_strLCDEncoding = "iso-8859-1" # LCDproc default is iso-8859-1!
+ self.m_strScrollSeparator = " "
+
+ # runtime vars/state tracking
+ self.m_strInfoLabelEncoding = "utf-8" #
http://forum.xbmc.org/showthread.php?tid=125492&pid=1045926#pid1045926
+ self.m_timeDisableOnPlayTimer = time.time()
+ self.m_bCurrentlyDimmed = False
+ self.m_bHaveHD44780Charmap = False
+ self.m_bVolumeChangeActive = False
self.m_bWasStopped = True
self.m_bXMLWarningDisplayed = False
+ self.m_iOldAudioChannelsVar = 0
+ self.m_strOldAudioCodec = ""
+ self.m_strOldVideoCodec = ""
# @abstractmethod
def _concrete_method(self):
@@ -186,21 +189,53 @@ class LcdBase():
return ret
def Initialize(self):
- strXMLFile = __lcdxml__
- self.m_disableOnPlay = DISABLE_ON_PLAY.DISABLE_ON_PLAY_NONE
+ bGotDefaultSkin = False
+ bSkinHandled = False
+
+ try:
+ if not self.m_bHaveHD44780Charmap:
+ log(xbmc.LOGDEBUG, "Registering HD44780-ROM pseudocodepages")
+ codecs.register(charset_hd44780)
+ self.m_bHaveHD44780Charmap = True
+ except:
+ log(xbmc.LOGERROR, "Failed to register custom HD44780-ROM
pseudocodepage, expect problems with alternative charsets!")
+
+ # make sure we got reasonable defaults for users who didn't adapt to
newest additions
+ bGotDefaultSkin = self.LoadSkin(__lcddefaultxml__, True)
- if not self.ManageLCDXML():
- strXMLFile = __lcddefaultxml__
+ # check for user-LCD.xml, optionally create it
+ bSkinHandled = self.ManageLCDXML()
- if not self.LoadSkin(strXMLFile):
+ # try to load user setup
+ if not self.LoadSkin(__lcdxml__, False) and not bGotDefaultSkin:
+ log(xbmc.LOGERROR, "No usable mode configuration/skin could be loaded,
check your addon installation!")
return False
+ # force-update GUI settings
+ self.UpdateGUISettings()
+
+ self.m_bCurrentlyDimmed = False
return True
- def LoadSkin(self, xmlFile):
- self.Reset()
+ def UpdateGUISettings(self):
+ str_charset = settings_getCharset()
+ if str_charset != self.m_strLCDEncoding:
+ if (str_charset == "hd44780-a00" or str_charset == "hd44780-a02") and
not self.m_bHaveHD44780Charmap:
+ str_charset = "iso8859-1"
+
+ self.m_strLCDEncoding = str_charset
+ log(xbmc.LOGDEBUG, "Setting character encoding to %s" %
(self.m_strLCDEncoding))
+
+ self.m_iDimOnPlayDelay = settings_getDimDelay()
+
+ def LoadSkin(self, xmlFile, doReset):
+ if doReset == True:
+ self.Reset()
+
bHaveSkin = False
+ log(xbmc.LOGNOTICE, "Loading settings from %s" % (xmlFile))
+
try:
doc = xmltree.parse(xmlFile)
except:
@@ -217,30 +252,6 @@ class LcdBase():
if element.tag == "lcd":
# load our settings
- # disable on play
- disableOnPlay = element.find("disableonplay")
- if disableOnPlay != None:
- self.m_disableOnPlay = DISABLE_ON_PLAY.DISABLE_ON_PLAY_NONE
- if str(disableOnPlay.text).find("video") >= 0:
- self.m_disableOnPlay += DISABLE_ON_PLAY.DISABLE_ON_PLAY_VIDEO
- if str(disableOnPlay.text).find("music") >= 0:
- self.m_disableOnPlay += DISABLE_ON_PLAY.DISABLE_ON_PLAY_MUSIC
-
- # disable on play delay
- self.m_iDimOnPlayDelay = 0
-
- disableonplaydelay = element.find("disableonplaydelay")
- if disableonplaydelay != None and disableonplaydelay.text != None:
- try:
- intdelay = int(disableonplaydelay.text)
- except ValueError, TypeError:
- log(xbmc.LOGERROR, "Value for disableonplaydelay must be integer
(got: %s)" % (disableonplaydelay.text))
- else:
- if intdelay < 0:
- log(xbmc.LOGERROR, "Value %d for disableonplaydelay smaller than
zero, ignoring" % (intdelay))
- else:
- self.m_iDimOnPlayDelay = intdelay
-
# apply scrollseparator
scrollSeparator = element.find("scrollseparator")
if scrollSeparator != None:
@@ -281,12 +292,28 @@ class LcdBase():
if str(allowemptylines.text).lower() in ["on", "true"]:
self.m_bAllowEmptyLines = True
+ # check for centerbigdigits setting
+ self.m_bCenterBigDigits = False
+
+ centerbigdigits = element.find("centerbigdigits")
+ if centerbigdigits != None:
+ if str(centerbigdigits.text).lower() in ["on", "true"]:
+ self.m_bCenterBigDigits = True
+
+ # check for disableplayindicatoronpause setting
+ self.m_bDisablePlayIndicatorOnPause = False
+
+ disableplayindicatoronpause =
element.find("disableplayindicatoronpause")
+ if disableplayindicatoronpause != None:
+ if str(disableplayindicatoronpause.text).lower() in ["on", "true"]:
+ self.m_bDisablePlayIndicatorOnPause = True
+
# extra progress bars
for i in range(1, LCD_EXTRABARS_MAX + 1):
extrabar = None
extrabar = element.find("extrabar%i" % (i))
if extrabar != None:
- if str(extrabar.text).strip() in ["progress", "volume", "menu"]:
+ if str(extrabar.text).strip() in ["progress", "volume",
"volumehidden", "menu", "alwayson"]:
self.m_extraBars[i] = str(extrabar.text).strip()
else:
self.m_extraBars[i] = ""
@@ -298,6 +325,9 @@ class LcdBase():
tmpMode = element.find("video")
self.LoadMode(tmpMode, LCD_MODE.LCD_MODE_VIDEO)
+ tmpMode = element.find("tvshow")
+ self.LoadMode(tmpMode, LCD_MODE.LCD_MODE_TVSHOW)
+
tmpMode = element.find("general")
self.LoadMode(tmpMode, LCD_MODE.LCD_MODE_GENERAL)
@@ -324,14 +354,24 @@ class LcdBase():
return bHaveSkin
def LoadMode(self, node, mode):
+ # clear mode (probably overriding defaults), assume the user knows what he
wants if an empty node is given
+ self.m_lcdMode[mode] = []
+
if node == None:
- log(xbmc.LOGWARNING, "Empty Mode %d, check LCD.xml" % (mode))
- self.m_lcdMode[mode].append(g_dictEmptyLineDescriptor)
+ log(xbmc.LOGWARNING, "Empty Mode %d, consider checking LCD.xml" % (mode))
+
+ # if mode is empty, initialise with blank line
+ if len(self.m_lcdMode[mode]) <= 0:
+ self.m_lcdMode[mode].append(g_dictEmptyLineDescriptor)
+
return
if len(node.findall("line")) <= 0:
- log(xbmc.LOGWARNING, "Mode %d defined without lines, check LCD.xml" %
(mode))
- self.m_lcdMode[mode].append(g_dictEmptyLineDescriptor)
+ log(xbmc.LOGWARNING, "Mode %d defined without lines, consider checking
LCD.xml" % (mode))
+
+ if len(self.m_lcdMode[mode]) <= 0:
+ self.m_lcdMode[mode].append(g_dictEmptyLineDescriptor)
+
return
# regex to determine any of $INFO[LCD.Time(Wide)21-44]
@@ -403,26 +443,23 @@ class LcdBase():
self.m_lcdMode[mode].append(linedescriptor)
def Reset(self):
- self.m_disableOnPlay = DISABLE_ON_PLAY.DISABLE_ON_PLAY_NONE
for i in range(0,LCD_MODE.LCD_MODE_MAX):
self.m_lcdMode[i] = [] #clear list
- def Shutdown(self, bDimOnShutdown):
+ def Shutdown(self):
log(xbmc.LOGNOTICE, "Shutting down")
- if bDimOnShutdown:
+ if settings_getDimOnShutdown():
self.SetBackLight(0)
- if self.m_cExtraIcons is not None:
- if not self.SendCommand(self.m_cExtraIcons.GetClearAllCmd(), True):
- log(xbmc.LOGERROR, "Shutdown(): Cannot clear extra icons")
-
self.CloseSocket()
def Render(self, mode, bForce):
outLine = 0
inLine = 0
+ self.HandleBacklight(mode)
+
while (outLine < int(self.GetRows()) and inLine <
len(self.m_lcdMode[mode])):
#parse the progressbar infolabel by ourselfs!
if self.m_lcdMode[mode][inLine]['type'] ==
LCD_LINETYPE.LCD_LINETYPE_PROGRESS:
@@ -434,9 +471,14 @@ class LcdBase():
if self.m_lcdMode[mode][inLine]['type'] ==
LCD_LINETYPE.LCD_LINETYPE_ICONTEXT:
self.SetPlayingStateIcon()
- line = InfoLabel_GetInfoLabel(self.m_lcdMode[mode][inLine]['text'])
+ srcline = InfoLabel_GetInfoLabel(self.m_lcdMode[mode][inLine]['text'])
if self.m_strInfoLabelEncoding != self.m_strLCDEncoding:
- line =
line.decode(self.m_strInfoLabelEncoding).encode(self.m_strLCDEncoding,
"replace")
+ try:
+ line =
srcline.decode(self.m_strInfoLabelEncoding).encode(self.m_strLCDEncoding,
"replace")
+ except:
+ log(xbmc.LOGDEBUG, "Caught exception on charset conversion: " +
srcline)
+ line = "---"
+
self.SetProgressBar(0, -1)
if self.m_bAllowEmptyLines or len(line) > 0:
@@ -457,24 +499,34 @@ class LcdBase():
self.FlushLines()
- def DisableOnPlayback(self, playingVideo, playingAudio):
- # check if any dimming is requested and matching config
- dodim = (playingVideo and (self.m_disableOnPlay &
DISABLE_ON_PLAY.DISABLE_ON_PLAY_VIDEO)) or (playingAudio and
(self.m_disableOnPlay & DISABLE_ON_PLAY.DISABLE_ON_PLAY_MUSIC))
+ def DoDimOnMusic(self, mode):
+ return (mode == LCD_MODE.LCD_MODE_MUSIC or mode ==
LCD_MODE.LCD_MODE_PVRRADIO) and settings_getDimOnMusicPlayback()
- # if dimrequest matches, check if pause is active (don't dim then)
- if dodim:
- dodim = dodim and not InfoLabel_IsPlayerPaused()
+ def DoDimOnVideo(self, mode):
+ return (mode == LCD_MODE.LCD_MODE_VIDEO or LCD_MODE.LCD_MODE_TVSHOW or
mode == LCD_MODE.LCD_MODE_PVRTV) and settings_getDimOnVideoPlayback()
+
+ def DoDimOnScreensaver(self, mode):
+ return (mode == LCD_MODE.LCD_MODE_SCREENSAVER) and
settings_getDimOnScreensaver()
+
+ def HandleBacklight(self, mode):
+ # dimming display in case screensaver is active or something is being
played back (and not paused!)
+ doDim = False
+
+ if self.DoDimOnScreensaver(mode):
+ doDim = True
+ elif not InfoLabel_IsPlayerPaused() and (self.DoDimOnVideo(mode) or
self.DoDimOnMusic(mode)):
+ doDim = True
- if dodim:
- if not self.m_bDimmedOnPlayback:
+ if doDim:
+ if not self.m_bCurrentlyDimmed:
if (self.m_timeDisableOnPlayTimer + self.m_iDimOnPlayDelay) <
time.time():
self.SetBackLight(0)
- self.m_bDimmedOnPlayback = True
+ self.m_bCurrentlyDimmed = True
else:
self.m_timeDisableOnPlayTimer = time.time()
- if self.m_bDimmedOnPlayback:
+ if self.m_bCurrentlyDimmed:
self.SetBackLight(1)
- self.m_bDimmedOnPlayback = False
+ self.m_bCurrentlyDimmed = False
def SetExtraInfoPlaying(self, isplaying, isvideo, isaudio):
# make sure output scaling indicators are off when not playing and/or not
playing video
@@ -495,6 +547,8 @@ class LcdBase():
if InfoLabel_PlayingLiveTV():
self.m_cExtraIcons.SetIconState(LCD_EXTRAICONS.LCD_EXTRAICON_TV,
True)
+ elif InfoLabel_IsInternetStream():
+
self.m_cExtraIcons.SetIconState(LCD_EXTRAICONS.LCD_EXTRAICON_WEBCASTING, True)
else:
self.m_cExtraIcons.SetIconState(LCD_EXTRAICONS.LCD_EXTRAICON_MOVIE,
True)
@@ -509,7 +563,10 @@ class LcdBase():
self.m_cExtraIcons.SetIconState(LCD_EXTRAICONS.LCD_EXTRAICON_OUTFIT,
True)
elif isaudio:
- self.m_cExtraIcons.SetIconState(LCD_EXTRAICONS.LCD_EXTRAICON_MUSIC,
True)
+ if InfoLabel_IsInternetStream():
+
self.m_cExtraIcons.SetIconState(LCD_EXTRAICONS.LCD_EXTRAICON_WEBCASTING, True)
+ else:
+ self.m_cExtraIcons.SetIconState(LCD_EXTRAICONS.LCD_EXTRAICON_MUSIC,
True)
else: # not playing
@@ -692,8 +749,10 @@ class LcdBase():
if InfoLabel_WindowIsActive(WINDOW_IDS.WINDOW_DIALOG_VOLUME_BAR):
self.m_cExtraIcons.SetIconState(LCD_EXTRAICONS.LCD_EXTRAICON_VOLUME,
True)
+ self.m_bVolumeChangeActive = True
else:
self.m_cExtraIcons.SetIconState(LCD_EXTRAICONS.LCD_EXTRAICON_VOLUME,
False)
+ self.m_bVolumeChangeActive = False
if InfoLabel_WindowIsActive(WINDOW_IDS.WINDOW_DIALOG_KAI_TOAST):
self.m_cExtraIcons.SetIconState(LCD_EXTRAICONS.LCD_EXTRAICON_ALARM, True)
@@ -709,11 +768,18 @@ class LcdBase():
self.m_cExtraIcons.SetBar(i, 0)
elif self.m_extraBars[i] == "volume":
self.m_cExtraIcons.SetBar(i, InfoLabel_GetVolumePercent())
+ elif self.m_extraBars[i] == "volumehidden":
+ if self.m_bVolumeChangeActive:
+ self.m_cExtraIcons.SetBar(i, InfoLabel_GetVolumePercent())
+ else:
+ self.m_cExtraIcons.SetBar(i, 0)
elif self.m_extraBars[i] == "menu":
if isplaying:
self.m_cExtraIcons.SetBar(i, 0)
else:
self.m_cExtraIcons.SetBar(i, 100)
+ elif self.m_extraBars[i] == "alwayson":
+ self.m_cExtraIcons.SetBar(i, 100)
else:
self.m_cExtraIcons.SetBar(i, 0)
@@ -724,7 +790,8 @@ class LcdBase():
bIsVideo = InfoLabel_PlayingVideo()
bIsAudio = InfoLabel_PlayingAudio()
- self.m_cExtraIcons.SetIconState(LCD_EXTRAICONS.LCD_EXTRAICON_PLAYING,
bPlaying)
+ self.m_cExtraIcons.SetIconState(LCD_EXTRAICONS.LCD_EXTRAICON_PLAYING,
+ bPlaying and not (bPaused and self.m_bDisablePlayIndicatorOnPause))
self.SetExtraInfoPlaying(bPlaying, bIsVideo, bIsAudio)
self.SetExtraInfoCodecs(bPlaying, bIsVideo, bIsAudio)
diff --git a/script.xbmc.lcdproc/resources/lib/lcdproc.py
b/script.xbmc.lcdproc/resources/lib/lcdproc.py
index 384cec5..e18d364 100644
--- a/script.xbmc.lcdproc/resources/lib/lcdproc.py
+++ b/script.xbmc.lcdproc/resources/lib/lcdproc.py
@@ -60,6 +60,7 @@ class LCDProc(LcdBase):
self.m_initRetryInterval = INIT_RETRY_INTERVAL
self.m_used = True
self.tn = telnetlib.Telnet()
+ self.tnsocket = None
self.m_timeLastSockAction = time.time()
self.m_timeSocketIdleTimeout = 2
self.m_strLineText = [None]*MAX_ROWS
@@ -70,6 +71,7 @@ class LCDProc(LcdBase):
self.m_iProgressBarLine = -1
self.m_strIconName = "BLOCK_FILLED"
self.m_iBigDigits = int(8) # 12:45:78 / colons count as digit
+ self.m_iOffset = 1
self.m_strSetLineCmds = ""
self.m_cExtraIcons = None
self.m_vPythonVersion = sys.version_info
@@ -90,8 +92,9 @@ class LCDProc(LcdBase):
sendcmd += "\n"
try:
- # Send to server
- self.tn.write(sendcmd)
+ # Send to server via raw socket to prevent telnetlib tampering with
+ # certain chars (especially 0xFF -> telnet IAC)
+ self.tnsocket.sendall(sendcmd)
except:
# Something bad happened, abort
log(xbmc.LOGERROR, "SendCommand: Telnet exception - send")
@@ -211,6 +214,7 @@ class LCDProc(LcdBase):
self.m_initRetryInterval = INIT_RETRY_INTERVAL
self.m_bStop = False
connected = True
+
else:
log(xbmc.LOGERROR, "Connection successful but LCD.xml has errors,
aborting connect")
@@ -231,6 +235,9 @@ class LCDProc(LcdBase):
def DetermineExtraSupport(self):
rematch_imon = "SoundGraph iMON(.*)LCD"
rematch_mdm166a = "Targa(.*)mdm166a"
+ rematch_imonvfd = "Soundgraph(.*)VFD"
+
+ bUseExtraIcons = settings_getUseExtraElements()
# Never cause script failure/interruption by this! This is totally
optional!
try:
@@ -247,12 +254,22 @@ class LCDProc(LcdBase):
if re.match(rematch_imon, reply):
log(xbmc.LOGNOTICE, "SoundGraph iMON LCD detected")
- self.m_cExtraIcons = LCDproc_extra_imon()
- self.m_cExtraIcons.Initialize()
+ if bUseExtraIcons:
+ self.m_cExtraIcons = LCDproc_extra_imon()
+
+ # override bigdigits counter, the imonlcd driver handles bigdigits
+ # different: digits count for two columns instead of three
+ self.m_iBigDigits = 7
elif re.match(rematch_mdm166a, reply):
log(xbmc.LOGNOTICE, "Futaba/Targa USB mdm166a VFD detected")
- self.m_cExtraIcons = LCDproc_extra_mdm166a()
+ if bUseExtraIcons:
+ self.m_cExtraIcons = LCDproc_extra_mdm166a()
+
+ elif re.match(rematch_imonvfd, reply):
+ log(xbmc.LOGNOTICE, "SoundGraph iMON IR/VFD detected")
+
+ if self.m_cExtraIcons is not None:
self.m_cExtraIcons.Initialize()
except:
@@ -295,18 +312,30 @@ class LCDProc(LcdBase):
# tell users what's going on
log(xbmc.LOGNOTICE, "Connected to LCDd at %s:%s, Protocol version %s -
Geometry %sx%s characters (%sx%s pixels, %sx%s pixels per character)" %
(str(ip), str(port), float(lcdinfo.group(1)), str(self.m_iColumns),
str(self.m_iRows), str(self.m_iColumns * self.m_iCellWidth), str(self.m_iRows *
self.m_iCellHeight), str(self.m_iCellWidth), str(self.m_iCellHeight)))
- self.DetermineExtraSupport()
-
# Set up BigNum values based on display geometry
- if self.m_iColumns < 16:
- self.m_iBigDigits = 5
+ if self.m_iColumns < 13:
+ self.m_iBigDigits = 0 # No clock
+ elif self.m_iColumns < 17:
+ self.m_iBigDigits = 5 # HH:MM
elif self.m_iColumns < 20:
- self.m_iBigDigits = 7
+ self.m_iBigDigits = 7 # H:MM:SS on play, HH:MM on clock
+ else:
+ self.m_iBigDigits = 8 # HH:MM:SS
+
+ # Check LCDproc if we can enable any extras or override values
+ # (might override e.g. m_iBigDigits!)
+ self.DetermineExtraSupport()
except:
log(xbmc.LOGERROR,"Connect: Caught exception, aborting.")
return False
+ # retrieve raw socket object
+ self.tnsocket = self.tn.get_socket()
+ if self.tnsocket is None:
+ log(xbmc.LOGERROR, "Retrieval of socket object failed!")
+ return False
+
if not self.SetupScreen():
log(xbmc.LOGERROR, "Screen setup failed!")
return False
@@ -314,9 +343,14 @@ class LCDProc(LcdBase):
return True
def CloseSocket(self):
- if self.tn.get_socket() != None:
+ if self.tnsocket:
# no pyexceptions, please, we're disconnecting anyway
try:
+ # if we served extra elements, (try to) reset them
+ if self.m_cExtraIcons is not None:
+ if not self.SendCommand(self.m_cExtraIcons.GetClearAllCmd(), True):
+ log(xbmc.LOGERROR, "CloseSocket(): Cannot clear extra icons")
+
# do gracefully disconnect (send directly as we won't get any response
on this)
self.tn.write("bye\n")
# and close socket afterwards
@@ -325,11 +359,16 @@ class LCDProc(LcdBase):
# exception caught on this, so what? :)
pass
+ # delete/cleanup extra support instance
+ del self.m_cExtraIcons
+ self.m_cExtraIcons = None
+
+ self.tnsocket = None
del self.tn
self.tn = telnetlib.Telnet()
def IsConnected(self):
- if self.tn.get_socket() == None:
+ if not self.tnsocket:
return False
# Ping only every SocketIdleTimeout seconds
@@ -343,16 +382,14 @@ class LCDProc(LcdBase):
return True
def SetBackLight(self, iLight):
- if self.tn.get_socket() == None:
+ if not self.tnsocket:
return
log(xbmc.LOGDEBUG, "Switch Backlight to: " + str(iLight))
# Build command
if iLight == 0:
- #self.m_bStop = True
cmd = "screen_set xbmc -backlight off\n"
elif iLight > 0:
- #self.m_bStop = False
cmd = "screen_set xbmc -backlight on\n"
# Send to server
@@ -369,7 +406,7 @@ class LCDProc(LcdBase):
self.m_bStop = True
def Suspend(self):
- if self.m_bStop or self.tn.get_socket() == None:
+ if self.m_bStop or not self.tnsocket:
return
# Build command to suspend screen
@@ -381,7 +418,7 @@ class LCDProc(LcdBase):
self.CloseSocket()
def Resume(self):
- if self.m_bStop or self.tn.get_socket() == None:
+ if self.m_bStop or not self.tnsocket:
return
# Build command to resume screen
@@ -396,13 +433,15 @@ class LCDProc(LcdBase):
return int(self.m_iColumns)
def GetBigDigitTime(self):
- ret = InfoLabel_GetPlayerTime()
+ ret = InfoLabel_GetPlayerTime()[-self.m_iBigDigits:]
if ret == "": # no usable timestring, e.g. not playing anything
- if self.m_iBigDigits < 8: # return only h:m when display too small
- ret = time.strftime("%X")[:5] # %X = locale-based currenttime
- else:
- ret = time.strftime("%X")[:8]
+ strSysTime = InfoLabel_GetSystemTime()
+
+ if self.m_iBigDigits >= 8: # return h:m:s
+ ret = strSysTime
+ elif self.m_iBigDigits >= 5: # return h:m when display too small
+ ret = strSysTime[:5]
return ret
@@ -417,8 +456,18 @@ class LCDProc(LcdBase):
iStringLength = int(len(strTimeString))
+ if self.m_bCenterBigDigits:
+ iColons = strTimeString.count(":")
+ iWidth = 3 * (iStringLength - iColons) + iColons
+ iOffset = 1 + max(self.m_iColumns - iWidth, 0) / 2
+
if iStringLength > self.m_iBigDigits:
iStringOffset = len(strTimeString) - self.m_iBigDigits
+ iOffset = 1;
+
+ if self.m_iOffset != iOffset:
+ self.ClearBigDigits()
+ self.m_iOffset = iOffset
for i in range(int(iStringOffset), int(iStringLength)):
if self.m_strDigits[iDigitCount] != strTimeString[i] or bForceUpdate:
@@ -426,8 +475,10 @@ class LCDProc(LcdBase):
if strTimeString[i] == ":":
self.m_strSetLineCmds += "widget_set xbmc lineBigDigit%i %i 10\n" %
(iDigitCount, iOffset)
- else:
+ elif strTimeString[i].isdigit():
self.m_strSetLineCmds += "widget_set xbmc lineBigDigit%i %i %s\n" %
(iDigitCount, iOffset, strTimeString[i])
+ else:
+ self.m_strSetLineCmds += "widget_set xbmc lineBigDigit" +
str(iDigitCount) + " 0 0\n"
if strTimeString[i] == ":":
iOffset += 1
@@ -436,10 +487,10 @@ class LCDProc(LcdBase):
iDigitCount += 1
- for j in range(i + 2, int(self.m_iBigDigits + 1)):
+ while iDigitCount <= self.m_iBigDigits:
if self.m_strDigits[iDigitCount] != "" or bForceUpdate:
self.m_strDigits[iDigitCount] = ""
- self.m_strSetLineCmds += "widget_set xbmc lineBigDigit" + str(j) + " 0
0\n"
+ self.m_strSetLineCmds += "widget_set xbmc lineBigDigit" +
str(iDigitCount) + " 0 0\n"
iDigitCount += 1
@@ -483,9 +534,9 @@ class LCDProc(LcdBase):
self.m_strSetLineCmds += "widget_set xbmc lineIcon%i 0 0 BLOCK_FILLED\n" %
(iLine)
self.m_strSetLineCmds += "widget_set xbmc lineProgress%i 0 0 0\n" % (iLine)
self.m_strSetLineCmds += "widget_set xbmc lineScroller%i 1 %i %i %i m 1
\"\"\n" % (iLine, iLine, self.m_iColumns, iLine)
-
+
def SetLine(self, iLine, strLine, dictDescriptor, bForce):
- if self.m_bStop or self.tn.get_socket() == None:
+ if self.m_bStop or not self.tnsocket:
return
if iLine < 0 or iLine >= int(self.m_iRows):
diff --git a/script.xbmc.lcdproc/resources/lib/lcdproc_extra_imon.py
b/script.xbmc.lcdproc/resources/lib/lcdproc_extra_imon.py
index 8397186..7a54ab3 100644
--- a/script.xbmc.lcdproc/resources/lib/lcdproc_extra_imon.py
+++ b/script.xbmc.lcdproc/resources/lib/lcdproc_extra_imon.py
@@ -200,6 +200,10 @@ class LCDproc_extra_imon(LCDproc_extra_base):
self.m_iOutputValueIcons &= IMON_ICONS.ICON_CLEAR_TOPROW
self._SetIconStateDo(IMON_ICONS.ICON_TOP_MUSIC, state)
+ elif icon == LCD_EXTRAICONS.LCD_EXTRAICON_WEBCASTING:
+ self.m_iOutputValueIcons &= IMON_ICONS.ICON_CLEAR_TOPROW
+ self._SetIconStateDo(IMON_ICONS.ICON_TOP_WEBCASTING, state)
+
elif icon == LCD_EXTRAICONS.LCD_EXTRAICON_WEATHER:
self.m_iOutputValueIcons &= IMON_ICONS.ICON_CLEAR_TOPROW
self._SetIconStateDo(IMON_ICONS.ICON_TOP_NEWSWEATHER, state)
diff --git a/script.xbmc.lcdproc/resources/lib/settings.py
b/script.xbmc.lcdproc/resources/lib/settings.py
index 1e624cf..c7a69e1 100644
--- a/script.xbmc.lcdproc/resources/lib/settings.py
+++ b/script.xbmc.lcdproc/resources/lib/settings.py
@@ -42,9 +42,15 @@ global g_scrollmode
global g_settingsChanged
global g_dimonscreensaver
global g_dimonshutdown
+global g_dimonvideoplayback
+global g_dimonmusicplayback
+global g_dimdelay
global g_navtimeout
global g_refreshrate
global g_hideconnpopups
+global g_usealternatecharset
+global g_charset
+global g_useextraelements
#init globals with defaults
def settings_initGlobals():
@@ -57,22 +63,34 @@ def settings_initGlobals():
global g_settingsChanged
global g_dimonscreensaver
global g_dimonshutdown
+ global g_dimonvideoplayback
+ global g_dimonmusicplayback
+ global g_dimdelay
global g_navtimeout
global g_refreshrate
global g_hideconnpopups
-
- g_hostip = "127.0.0.1"
- g_hostport = 13666
- g_timer = time.time()
- g_heartbeat = False
- g_scrolldelay = 1
- g_scrollmode = "0"
- g_settingsChanged = True
- g_dimonscreensaver = False
- g_dimonshutdown = False
- g_navtimeout = 3
- g_refreshrate = 1
- g_hideconnpopups = True
+ global g_usealternatecharset
+ global g_charset
+ global g_useextraelements
+
+ g_hostip = "127.0.0.1"
+ g_hostport = 13666
+ g_timer = time.time()
+ g_heartbeat = False
+ g_scrolldelay = 1
+ g_scrollmode = "0"
+ g_settingsChanged = True
+ g_dimonscreensaver = False
+ g_dimonshutdown = False
+ g_dimonvideoplayback = False
+ g_dimonmusicplayback = False
+ g_dimdelay = 0
+ g_navtimeout = 3
+ g_refreshrate = 1
+ g_hideconnpopups = True
+ g_usealternatecharset = False
+ g_charset = "iso-8859-1"
+ g_useextraelements = True
def settings_getHostIp():
global g_hostip
@@ -86,6 +104,10 @@ def settings_getHeartBeat():
global g_heartbeat
return g_heartbeat
+def settings_getUseExtraElements():
+ global g_useextraelements
+ return g_useextraelements
+
def settings_getScrollDelay():
global g_scrolldelay
return g_scrolldelay
@@ -108,6 +130,18 @@ def settings_getDimOnShutdown():
global g_dimonshutdown
return g_dimonshutdown
+def settings_getDimOnVideoPlayback():
+ global g_dimonvideoplayback
+ return g_dimonvideoplayback
+
+def settings_getDimOnMusicPlayback():
+ global g_dimonmusicplayback
+ return g_dimonmusicplayback
+
+def settings_getDimDelay():
+ global g_dimdelay
+ return g_dimdelay
+
def settings_getNavTimeout():
global g_navtimeout
return g_navtimeout
@@ -120,6 +154,33 @@ def settings_getHideConnPopups():
global g_hideconnpopups
return g_hideconnpopups
+def settings_getCharset():
+ global g_usealternatecharset
+ global g_charset
+ ret = ""
+
+ # if alternatecharset is disabled, return LCDproc's default
+ if g_usealternatecharset == False:
+ ret = "iso-8859-1"
+ else:
+ # make sure to keep this in sync with settings.xml!
+ if g_charset == "1":
+ ret = "iso-8859-15"
+ elif g_charset == "2":
+ ret = "koi8-r"
+ elif g_charset == "3":
+ ret = "cp1251"
+ elif g_charset == "4":
+ ret = "iso-8859-5"
+ elif g_charset == "5":
+ ret = "hd44780-a00"
+ elif g_charset == "6":
+ ret = "hd44780-a02"
+ else:
+ ret = "iso-8859-1"
+
+ return ret
+
#check for new settings and handle them if anything changed
#only checks if the last check is 5 secs old
#returns if a reconnect is needed due to settings change
@@ -140,18 +201,21 @@ def settings_didSettingsChange():
g_settingsChanged = False
return settingsChanged
-#handle all settings in the general tab according to network access
-#returns true if reconnect is needed due to network changes
-def settings_handleNetworkSettings():
+# handle all settings that might require a reinit and/or reconnect
+# (e.g. network config changes)
+# returns true if reconnect is needed due to network changes
+def settings_handleCriticalSettings():
global g_hostip
global g_hostport
global g_heartbeat
+ global g_useextraelements
reconnect = False
hostip = __settings__.getSetting("hostip")
hostport = int(__settings__.getSetting("hostport"))
heartbeat = __settings__.getSetting("heartbeat") == "true"
+ useextraelements = __settings__.getSetting("useextraelements") == "true"
#server settings
#we need to reconnect if networkaccess bool changes
@@ -179,6 +243,12 @@ def settings_handleNetworkSettings():
g_heartbeat = heartbeat
reconnect = True
+ # extra element support needs a reinit+reconnect so the extraelement
+ # support object resets
+ if g_useextraelements != useextraelements:
+ g_useextraelements = useextraelements
+ reconnect = True
+
return reconnect
def settings_handleLcdSettings():
@@ -188,9 +258,14 @@ def settings_handleLcdSettings():
global g_settingsChanged
global g_dimonscreensaver
global g_dimonshutdown
+ global g_dimonvideoplayback
+ global g_dimonmusicplayback
+ global g_dimdelay
global g_navtimeout
global g_refreshrate
global g_hideconnpopups
+ global g_usealternatecharset
+ global g_charset
g_settingsChanged = False
@@ -198,10 +273,15 @@ def settings_handleLcdSettings():
scrollmode = __settings__.getSetting("scrollmode")
dimonscreensaver = __settings__.getSetting("dimonscreensaver") == "true"
dimonshutdown = __settings__.getSetting("dimonshutdown") == "true"
+ dimonvideoplayback = __settings__.getSetting("dimonvideoplayback") == "true"
+ dimonmusicplayback = __settings__.getSetting("dimonmusicplayback") == "true"
+ dimdelay = int(float(string.replace(__settings__.getSetting("dimdelay"),
",", ".")))
navtimeout = int(float(string.replace(__settings__.getSetting("navtimeout"),
",", ".")))
refreshrate =
int(float(string.replace(__settings__.getSetting("refreshrate"), ",", ".")))
hideconnpopups = __settings__.getSetting("hideconnpopups") == "true"
-
+ usealternatecharset = __settings__.getSetting("usealternatecharset") ==
"true"
+ charset = __settings__.getSetting("charset")
+
if g_scrolldelay != scrolldelay:
g_scrolldelay = scrolldelay
g_settingsChanged = True
@@ -217,6 +297,18 @@ def settings_handleLcdSettings():
if g_dimonshutdown != dimonshutdown:
g_dimonshutdown = dimonshutdown
g_settingsChanged = True
+
+ if g_dimonvideoplayback != dimonvideoplayback:
+ g_dimonvideoplayback = dimonvideoplayback
+ g_settingsChanged = True
+
+ if g_dimonmusicplayback != dimonmusicplayback:
+ g_dimonmusicplayback = dimonmusicplayback
+ g_settingsChanged = True
+
+ if g_dimdelay != dimdelay:
+ g_dimdelay = dimdelay
+ g_settingsChanged = True
if g_navtimeout != navtimeout:
g_navtimeout = navtimeout
@@ -234,12 +326,19 @@ def settings_handleLcdSettings():
g_hideconnpopups = hideconnpopups
g_settingsChanged = True
+ if g_usealternatecharset != usealternatecharset:
+ g_usealternatecharset = usealternatecharset
+ g_settingsChanged = True
+
+ if g_charset != charset:
+ g_charset = charset
+ g_settingsChanged = True
+
#handles all settings and applies them as needed
#returns if a reconnect is needed due to settings changes
def settings_setup():
reconnect = False
- reconnect = settings_handleNetworkSettings()
+ reconnect = settings_handleCriticalSettings()
settings_handleLcdSettings()
return reconnect
-
diff --git a/script.xbmc.lcdproc/resources/settings.xml
b/script.xbmc.lcdproc/resources/settings.xml
index 3a4e1a4..2b006e8 100644
--- a/script.xbmc.lcdproc/resources/settings.xml
+++ b/script.xbmc.lcdproc/resources/settings.xml
@@ -5,18 +5,28 @@
<setting id="scrollmode" type="enum" label="32102" lvalues="32401|32402"
default="0" />
<setting id="navtimeout" type="slider" label="32103" option="int"
default="2" range="1,10" />
<setting id="refreshrate" type="slider" label="32104" option="int"
default="1" range="1,20" />
+ <setting id="sep1" type="sep" />
+ <setting id="usealternatecharset" type="bool" label="32105"
default="false" />
+ <setting id="charset" enable="eq(-1,true)" type="enum" label="32106"
lvalues="32411|32412|32413|32414|32415|32416|32417" default="0"
subsetting="true"/>
+ <setting id="sep2" type="sep" />
+ <setting id="useextraelements" type="bool" label="32107" default="true" />
</category>
<category label="32200">
- <setting id="dimonscreensaver" type="bool" label="32201" default="false" />
+ <setting label="32206" type="lsep" />
+ <setting id="dimonvideoplayback" type="bool" label="32203" default="false"
subsetting="true" />
+ <setting id="dimonmusicplayback" type="bool" label="32204" default="false"
subsetting="true" />
+ <setting id="dimonscreensaver" type="bool" label="32201" default="false"
subsetting="true" />
+ <setting id="dimdelay" type="slider" label="32205" default="0"
range="0,30" subsetting="true" />
+ <setting id="sep3" type="sep" />
<setting id="dimonshutdown" type="bool" label="32202" default="false" />
</category>
<category label="32300">
<setting id="remotelcdproc" type="bool" label="32301" default="false" />
<setting id="hostip" enable="eq(-1,true)" type="ipaddress" label="32302"
default="127.0.0.1" subsetting="true" />
<setting id="hostport" enable="eq(-2,true)" type="number" label="32303"
default="13666" subsetting="true" />
- <setting id="sep2" type="sep" />
+ <setting id="sep4" type="sep" />
<setting id="heartbeat" type="bool" label="32304" default="false" />
- <setting id="sep3" type="sep" />
+ <setting id="sep5" type="sep" />
<setting id="hideconnpopups" type="bool" label="32305" default="true" />
</category>
</settings>
-----------------------------------------------------------------------
Summary of changes:
script.xbmc.lcdproc/addon.xml | 2 +-
script.xbmc.lcdproc/changelog.txt | 11 +
script.xbmc.lcdproc/lcdmain.py | 34 +--
script.xbmc.lcdproc/resources/LCD.xml.defaults | 7 +
.../resources/language/English/strings.xml | 22 +-
.../resources/language/German/strings.xml | 22 +-
.../resources/lib/charset_hd44780.py | 77 ++++
.../resources/lib/charset_map_hd44780_a00.py | 301 +++++++++++++++
.../resources/lib/charset_map_hd44780_a02.py | 387 ++++++++++++++++++++
script.xbmc.lcdproc/resources/lib/extraicons.py | 1 +
script.xbmc.lcdproc/resources/lib/infolabels.py | 98 ++++--
script.xbmc.lcdproc/resources/lib/lcdbase.py | 229 ++++++++----
script.xbmc.lcdproc/resources/lib/lcdproc.py | 105 ++++--
.../resources/lib/lcdproc_extra_imon.py | 4 +
script.xbmc.lcdproc/resources/lib/settings.py | 137 ++++++-
script.xbmc.lcdproc/resources/settings.xml | 16 +-
16 files changed, 1267 insertions(+), 186 deletions(-)
create mode 100644 script.xbmc.lcdproc/resources/lib/charset_hd44780.py
create mode 100644 script.xbmc.lcdproc/resources/lib/charset_map_hd44780_a00.py
create mode 100644 script.xbmc.lcdproc/resources/lib/charset_map_hd44780_a02.py
hooks/post-receive
--
Scripts
------------------------------------------------------------------------------
See everything from the browser to the database with AppDynamics
Get end-to-end visibility with application monitoring from AppDynamics
Isolate bottlenecks and diagnose root cause in seconds.
Start your free trial of AppDynamics Pro today!
http://pubads.g.doubleclick.net/gampad/clk?id=48808831&iu=/4140/ostg.clktrk
_______________________________________________
Xbmc-addons mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/xbmc-addons