Files
LibreELEC.tv/packages/addons/service/fd628/sources/resources/lib/service.py

144 lines
5.3 KiB
Python

# SPDX-License-Identifier: GPL-2.0
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
import xbmcaddon
import threading
import os
import fd628states
import fd628dev
import fd628settings
from fd628utils import *
addon = xbmcaddon.Addon(id='service.fd628')
class fd628Monitor(xbmc.Monitor):
def __init__(self):
super(fd628Monitor, self).__init__()
self._settingsChangedCallback = None
def setSettingsChangedCallback(self, callbackObject):
self._settingsChangedCallback = callbackObject
def onSettingsChanged(self):
kodiLog('Enter fd628Monitor.onSettingsChanged')
if (self._settingsChangedCallback != None):
self._settingsChangedCallback.onSettingsChanged()
class fd628Addon():
def __init__(self, monitor):
self._fd628 = fd628dev.fd628Dev()
self._states = []
self._monitor = monitor
self._monitor.setSettingsChangedCallback(self)
self._settings = fd628settings.fd628Settings()
self._vfdon = '/sys/class/leds/le-vfd/led_on'
self._vfdoff = '/sys/class/leds/le-vfd/led_off'
self._rlock = threading.RLock()
def run(self):
firstLoop = True
while not self._monitor.abortRequested():
if self._monitor.waitForAbort(0.5):
break
if (not os.path.isfile(self._vfdon) or not os.path.isfile(self._vfdoff)):
firstLoop = True
continue
if (firstLoop):
self.onSettingsChanged()
firstLoop = False
self.__updateIndicators()
self.__cleanUp()
def __updateIndicators(self):
ledon = []
ledoff = []
if (self._rlock.acquire()):
for state in self._states:
state.update()
if (state.hasChanged()):
if (state.getValue()):
ledon.append(state.getLedName())
else:
ledoff.append(state.getLedName())
self.__writeFile(self._vfdon, ledon)
self.__writeFile(self._vfdoff, ledoff)
self._rlock.release()
def __cleanUp(self):
self.__turnOffIndicators()
self._monitor = None
def __turnOffIndicators(self):
if (self._rlock.acquire()):
ledoff = [state.getLedName() for state in self._states]
self.__writeFile(self._vfdoff, ledoff)
self._rlock.release()
def __writeFile(self, path, values):
if (os.path.isfile(path)):
with open(path, "wb") as vfd:
for j in values:
vfd.write(j)
vfd.flush()
def onSettingsChanged(self):
kodiLog('Enter fd628Addon.onSettingsChanged')
self._settings.readValues()
if (self._rlock.acquire()):
self.__createStates()
self._fd628.enableDisplay(self._settings.isDisplayOn())
if (self._settings.isDisplayOn()):
self._fd628.setBrightness(self._settings.getBrightness())
if (self._settings.isAdvancedSettings()):
self._fd628.setDisplayType(self._settings.getDisplay())
self._fd628.setCharacterOrder(self._settings.getCharacterIndexes())
else:
self._fd628.useDtbConfig()
if (self._colonIcon != None and self._settings.isColonOn()):
self._colonIcon.turnOn()
self.__updateIndicators()
self._rlock.release()
kodiLog('isDisplayOn = {0}'.format(self._settings.isDisplayOn()))
kodiLog('getBrightness = {0}'.format(self._settings.getBrightness()))
kodiLog('isAdvancedSettings = {0}'.format(self._settings.isAdvancedSettings()))
kodiLog('getDisplayType = {0}'.format(self._settings.getDisplayType()))
kodiLog('isCommonAnode = {0}'.format(self._settings.isCommonAnode()))
kodiLog('getCharacterIndexex = {0}'.format(self._settings.getCharacterIndexes()))
def __createStates(self):
settingsWindows = ['settings', 'systeminfo', 'systemsettings', 'servicesettings', 'pvrsettings', \
'playersettings', 'mediasettings', 'interfacesettings', 'profiles', 'skinsettings', 'videossettings', \
'musicsettings', 'appearancesettings', 'picturessettings', 'weathersettings', 'gamesettings', \
'service-LibreELEC-Settings-mainWindow.xml', 'service-LibreELEC-Settings-wizard.xml', \
'service-LibreELEC-Settings-getPasskey.xml']
appsWindows = ['addonbrowser', 'addonsettings', 'addoninformation', 'addon', 'programs']
states = []
states.append(fd628states.fd628IconIndicator(True, 'power'))
states.append(fd628states.fd628CondVisibility('play', 'Player.Playing'))
states.append(fd628states.fd628CondVisibility('pause', 'Player.Paused'))
states.append(fd628states.fd628FileContains('hdmi', '/sys/class/amhdmitx/amhdmitx0/hpd_state', ['1']))
states.append(fd628states.fd628FileContains('cvbs', '/sys/class/display/mode', ['cvbs']))
states.append(fd628states.fd628FileContains('eth', '/sys/class/net/eth0/operstate', ['up', 'unknown']))
states.append(fd628states.fd628FileContains('wifi', '/sys/class/net/wlan0/operstate', ['up']))
states.append(fd628states.fd628WindowChecker('setup', settingsWindows))
states.append(fd628states.fd628WindowChecker('apps', appsWindows))
states.append(fd628states.fd628ExtStorageChecker('usb', '/dev/sd'))
states.append(fd628states.fd628ExtStorageChecker('sd', '/dev/mmcblk'))
self._colonIcon = fd628states.fd628IconIndicator(False, 'colon')
states.append(self._colonIcon)
if (self._settings.isStorageIndicator()):
for state in states:
if (state.getLedName() == self._settings.getStorageIndicatorIcon()):
states.remove(state)
break
states.append(fd628states.fd628ExtStorageCount(self._settings.getStorageIndicatorIcon(), None, 'rw'))
kodiLog('Active states: ' + str([str(state) for state in states]))
self.__turnOffIndicators()
self._states = states
monitor = fd628Monitor()
fd628 = fd628Addon(monitor)
kodiLog('Service start.')
fd628.run()
kodiLog('Service stop.')