From 91594773dfa84bddac674e9654d12d751efece77 Mon Sep 17 00:00:00 2001 From: kszaq Date: Mon, 29 Apr 2019 23:03:52 +0200 Subject: [PATCH] fd628: remove addon --- packages/addons/service/fd628/changelog.txt | 13 -- packages/addons/service/fd628/icon/icon.png | Bin 31528 -> 0 bytes packages/addons/service/fd628/package.mk | 30 --- .../addons/service/fd628/sources/addon.xml | 22 --- .../resource.language.en_gb/strings.po | 136 ------------- .../fd628/sources/resources/lib/fd628dev.py | 78 -------- .../sources/resources/lib/fd628settings.py | 95 --------- .../sources/resources/lib/fd628states.py | 187 ------------------ .../fd628/sources/resources/lib/fd628utils.py | 19 -- .../fd628/sources/resources/lib/ioctl.py | 89 --------- .../fd628/sources/resources/lib/service.py | 143 -------------- .../fd628/sources/resources/settings.xml | 21 -- 12 files changed, 833 deletions(-) delete mode 100644 packages/addons/service/fd628/changelog.txt delete mode 100644 packages/addons/service/fd628/icon/icon.png delete mode 100644 packages/addons/service/fd628/package.mk delete mode 100644 packages/addons/service/fd628/sources/addon.xml delete mode 100644 packages/addons/service/fd628/sources/resources/language/resource.language.en_gb/strings.po delete mode 100644 packages/addons/service/fd628/sources/resources/lib/fd628dev.py delete mode 100644 packages/addons/service/fd628/sources/resources/lib/fd628settings.py delete mode 100644 packages/addons/service/fd628/sources/resources/lib/fd628states.py delete mode 100644 packages/addons/service/fd628/sources/resources/lib/fd628utils.py delete mode 100644 packages/addons/service/fd628/sources/resources/lib/ioctl.py delete mode 100644 packages/addons/service/fd628/sources/resources/lib/service.py delete mode 100644 packages/addons/service/fd628/sources/resources/settings.xml diff --git a/packages/addons/service/fd628/changelog.txt b/packages/addons/service/fd628/changelog.txt deleted file mode 100644 index 7e95b5bcd7..0000000000 --- a/packages/addons/service/fd628/changelog.txt +++ /dev/null @@ -1,13 +0,0 @@ -110 -- Rewrite add-on from scratch -- Add support for APPS, SETUP, CVBS (X92) and POWER (A1 Max) indicators. -- Add a configuration dialog: - * Adjust display brightness. - * Storage access indication. - * Advanced hardware configuration of the display. -- Fix crash if aml_fd628 module is not loaded (led_on, led_off files don't exist) -- Fix disable add-on from Kodi UI. -- Turn off indicators when add-on is disabled. - -100 -- Initial add-on diff --git a/packages/addons/service/fd628/icon/icon.png b/packages/addons/service/fd628/icon/icon.png deleted file mode 100644 index 265d6fa9431148d3494e12518e68eb670d323fad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31528 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 IBKm&+4@hXYN&o-= diff --git a/packages/addons/service/fd628/package.mk b/packages/addons/service/fd628/package.mk deleted file mode 100644 index 14aaa72623..0000000000 --- a/packages/addons/service/fd628/package.mk +++ /dev/null @@ -1,30 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) - -PKG_NAME="fd628" -PKG_VERSION="1.1" -PKG_REV="100" -PKG_ARCH="any" -PKG_LICENSE="GPL" -PKG_SITE="https://libreelec.tv" -PKG_URL="" -PKG_DEPENDS_TARGET="toolchain" -PKG_SECTION="service" -PKG_SHORTDESC="fd628: Kodi service to light up additional icons on devices with FD628 display" -PKG_LONGDESC="fd628: Kodi service to light up additional icons on devices with FD628 display" -PKG_TOOLCHAIN="manual" - -PKG_IS_ADDON="yes" -PKG_ADDON_NAME="service.fd628" -PKG_ADDON_PROJECTS="S905 S912" -PKG_ADDON_TYPE="xbmc.service" - -make_target() { - sed -e "s|@PKG_VERSION@|$PKG_VERSION|g" \ - -i addon.xml -} - -addon() { - mkdir -p $ADDON_BUILD/$PKG_ADDON_ID - cp -R $PKG_BUILD/* $ADDON_BUILD/$PKG_ADDON_ID -} diff --git a/packages/addons/service/fd628/sources/addon.xml b/packages/addons/service/fd628/sources/addon.xml deleted file mode 100644 index 781a99bf3d..0000000000 --- a/packages/addons/service/fd628/sources/addon.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - Service for controlling FD628 VFD display icons - Service for controlling FD628 VFD display icons, e.g. Ethernet/WiFi connection status and Time - all - - resources/icon.png - - - - diff --git a/packages/addons/service/fd628/sources/resources/language/resource.language.en_gb/strings.po b/packages/addons/service/fd628/sources/resources/language/resource.language.en_gb/strings.po deleted file mode 100644 index 2173018e15..0000000000 --- a/packages/addons/service/fd628/sources/resources/language/resource.language.en_gb/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: FD628 Display -# Addon id: service.fd628 -# Addon Provider: Team LibreELEC -msgid "" -msgstr "" -"Project-Id-Version: XBMC-Addons\n" -"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" -"POT-Creation-Date: 2018-02-12 17:48+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en_GB\n" -"Plural-Forms: nplurals=2; plural=(n != 1)\n" - -# Kodi Settings -msgctxt "#30000" -msgid "General" -msgstr "" - -msgctxt "#30001" -msgid "Turn on display" -msgstr "" - -msgctxt "#30002" -msgid "Display brightness" -msgstr "" - -msgctxt "#30003" -msgid "Advanced settings" -msgstr "" - -msgctxt "#30004" -msgid "Display type" -msgstr "" - -msgctxt "#30026" -msgid "Common anode display (transposed ram)" -msgstr "" - -msgctxt "#30013" -msgid "Enable storage access (RW) indicator" -msgstr "" - -msgctxt "#30014" -msgid "Select which icon is to be used as the access indicator" -msgstr "" - -msgctxt "#30028" -msgid "Clock colon (:) always on" -msgstr "" - -msgctxt "#30015" -msgid "play" -msgstr "" - -msgctxt "#30016" -msgid "pause" -msgstr "" - -msgctxt "#30017" -msgid "hdmi" -msgstr "" - -msgctxt "#30018" -msgid "cvbs" -msgstr "" - -msgctxt "#30019" -msgid "eth" -msgstr "" - -msgctxt "#30020" -msgid "wifi" -msgstr "" - -msgctxt "#30021" -msgid "setup" -msgstr "" - -msgctxt "#30022" -msgid "apps" -msgstr "" - -msgctxt "#30023" -msgid "usb" -msgstr "" - -msgctxt "#30024" -msgid "sd" -msgstr "" - -msgctxt "#30025" -msgid "alarm" -msgstr "" - -msgctxt "#30027" -msgid "power" -msgstr "" - -msgctxt "#30012" -msgid "Reorder character indexes" -msgstr "" - -msgctxt "#30005" -msgid "Index 0" -msgstr "" - -msgctxt "#30006" -msgid "Index 1" -msgstr "" - -msgctxt "#30007" -msgid "Index 2" -msgstr "" - -msgctxt "#30008" -msgid "Index 3" -msgstr "" - -msgctxt "#30009" -msgid "Index 4" -msgstr "" - -msgctxt "#30010" -msgid "Index 5" -msgstr "" - -msgctxt "#30011" -msgid "Index 6" -msgstr "" - -# Max index 30028 diff --git a/packages/addons/service/fd628/sources/resources/lib/fd628dev.py b/packages/addons/service/fd628/sources/resources/lib/fd628dev.py deleted file mode 100644 index 36963fc2b2..0000000000 --- a/packages/addons/service/fd628/sources/resources/lib/fd628dev.py +++ /dev/null @@ -1,78 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) - -import os -import struct -from fd628utils import * - -_led_cmd = '/sys/class/leds/le-vfd/led_cmd' - -class fd628Dev: - def __init__(self): - import ioctl - import ctypes - size = ctypes.sizeof(ctypes.c_int(0)) - self._FD628_IOC_MAGIC = ord('M') - self._FD628_IOC_SMODE = ioctl.IOW(self._FD628_IOC_MAGIC, 1, size) - self._FD628_IOC_GMODE = ioctl.IOR(self._FD628_IOC_MAGIC, 2, size) - self._FD628_IOC_SBRIGHT = ioctl.IOW(self._FD628_IOC_MAGIC, 3, size) - self._FD628_IOC_GBRIGHT = ioctl.IOR(self._FD628_IOC_MAGIC, 4, size) - self._FD628_IOC_POWER = ioctl.IOW(self._FD628_IOC_MAGIC, 5, size) - self._FD628_IOC_GVER = ioctl.IOR(self._FD628_IOC_MAGIC, 6, size) - self._FD628_IOC_STATUS_LED = ioctl.IOW(self._FD628_IOC_MAGIC, 7, size) - self._FD628_IOC_GDISPLAY_TYPE = ioctl.IOR(self._FD628_IOC_MAGIC, 8, size) - self._FD628_IOC_SDISPLAY_TYPE = ioctl.IOW(self._FD628_IOC_MAGIC, 9, size) - self._FD628_IOC_SCHARS_ORDER = ioctl.IOW(self._FD628_IOC_MAGIC, 10, 7) - self._FD628_IOC_USE_DTB_CONFIG = ioctl.IOW(self._FD628_IOC_MAGIC, 11, size) - self._FD628_IOC_MAXNR = 12 - - def enableDisplay(self, value): - self.__writeFD628(self._FD628_IOC_POWER, int(value)) - - def getBrightness(self): - return self.__readFD628(self._FD628_IOC_GBRIGHT) - - def setBrightness(self, value): - self.__writeFD628(self._FD628_IOC_SBRIGHT, value) - - def getDisplayType(self): - return self.__readFD628(self._FD628_IOC_GDISPLAY_TYPE) - - def setDisplayType(self, value): - self.__writeFD628(self._FD628_IOC_SDISPLAY_TYPE, value) - - def setCharacterOrder(self, value): - pack = struct.pack('BBBBBBB', value[0], value[1], value[2], value[3], value[4], value[5], value[6]) - self.__writeFD628(self._FD628_IOC_SCHARS_ORDER, pack, True) - - def useDtbConfig(self): - self.__writeFD628(self._FD628_IOC_USE_DTB_CONFIG, 0) - - def __readFD628(self, cmd, isBuf = False): - import ioctl - ret = None - if (ioctl.DIR(cmd) == ioctl.READ and self.__writeFD628(cmd, 0)): - with open(_led_cmd, "rb") as vfd: - ret = vfd.read() - if (ret == ''): - ret = None - if (not isBuf and ret != None): - ret = int(ret, 0) - kodiLog('fd628Dev.__readFD628: value = {0}'.format(str(ret))) - return ret - - def __writeFD628(self, cmd, value, isBuf = False): - ret = False - if (os.path.isfile(_led_cmd)): - if isBuf: - value = ''.join([struct.pack('I', cmd), value]) - else: - value = struct.pack('Ii', cmd, value) - kodiLog('fd628Dev.__writeFD628: value = {0}'.format(repr(value))) - try: - with open(_led_cmd, "wb") as vfd: - vfd.write(value) - ret = True - except Exception as inst: - kodiLogError(inst) - return ret diff --git a/packages/addons/service/fd628/sources/resources/lib/fd628settings.py b/packages/addons/service/fd628/sources/resources/lib/fd628settings.py deleted file mode 100644 index 2e22db6931..0000000000 --- a/packages/addons/service/fd628/sources/resources/lib/fd628settings.py +++ /dev/null @@ -1,95 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) - -import xbmcaddon - -addon = xbmcaddon.Addon(id='service.fd628') - -def getSetting(id): - return addon.getSetting(id) - -def getSettingBool(id): - value = getSetting(id).lower() - if (value == 'true'): - value = True - else: - value = False - return value - -def getSettingInt(id): - return int(getSetting(id)) - -def getSettingNumber(id): - return float(getSetting(id)) - -class fd628Settings: - def __init__(self): - self.readValues() - - def isDisplayOn(self): - return self._displayOn - - def isAdvancedSettings(self): - return self._displayAdvanced - - def getBrightness(self): - return self._displayBrightness - - def getDisplayType(self): - return self._displayType - - def isCommonAnode(self): - return self._commonAnode - - def getDisplay(self): - value = self.getDisplayType() - if (self.isCommonAnode()): - value = value + (1 << 16) - return value - - def getCharacterIndex(self, i): - return self._characterIndexes[i] - - def getCharacterIndexes(self): - return self._characterIndexes - - def isStorageIndicator(self): - return self._storageIndicator - - def getStorageIndicatorIcon(self): - return self._storageIndicatorIcon - - def isColonOn(self): - return self._colonOn - - def readValues(self): - self._displayAdvanced = False - self._displayOn = getSettingBool('display.on') - if (self._displayOn): - self._displayBrightness = getSettingInt('display.brightness') - self._storageIndicator = getSettingBool('display.storage.indicator') - self._storageIndicatorIcon = getSetting('display.storage.indicator.icon') - self._colonOn = getSettingBool('display.colon.on') - self._displayAdvanced = getSettingBool('display.advanced') - if (self._displayAdvanced): - self._displayType = getSettingInt('display.type') - self._commonAnode = getSettingBool('display.common.anode') - self._characterIndexes = [] - for i in range(7): - self._characterIndexes.append(getSettingInt('display.char.index{0}'.format(i))) - else: - self.__initDefaultValues() - else: - self.__initDefaultValues() - - def __initDefaultValues(self): - if not (self._displayOn): - self._displayBrightness = 7 - self._storageIndicator = False - self._storageIndicatorIcon = '' - self._colonOn = False - self._displayAdvanced = False - if not (self._displayAdvanced): - self._displayType = 0 - self._commonAnode = False - self._characterIndexes = range(0, 7) diff --git a/packages/addons/service/fd628/sources/resources/lib/fd628states.py b/packages/addons/service/fd628/sources/resources/lib/fd628states.py deleted file mode 100644 index 081d80142f..0000000000 --- a/packages/addons/service/fd628/sources/resources/lib/fd628states.py +++ /dev/null @@ -1,187 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) - -import xbmc -import os -from fd628utils import * - -class fd628State(object): - def __init__(self, ledName): - self._value = False - self._hasChanged = False - self._ledName = ledName - - def _getStr(self, className): - return '{0} ({1})'.format(className, self._ledName) - - def update(self): - raise NotImplementedError - - def getValue(self): - return self._value - - def hasChanged(self): - return self._hasChanged - - def getLedName(self): - return self._ledName - - def _update(self, value): - if (value != self._value): - self._hasChanged = True - self._value = value - else: - self._hasChanged = False - -class fd628IconIndicator(fd628State): - def __init__(self, on, ledName): - super(fd628IconIndicator, self).__init__(ledName) - self._on = on - - def __str__(self): - return self._getStr('fd628IconIndicator') - - def turnOn(self): - self._on = True - - def turnOff(self): - self._on = False - - def toggle(self): - self._on = not self._on - - def update(self): - self._update(self._on) - -class fd628CondVisibility(fd628State): - def __init__(self, ledName, cmd): - super(fd628CondVisibility, self).__init__(ledName) - self._cmd = cmd - - def __str__(self): - return self._getStr('fd628CondVisibility') - - def update(self): - value = xbmc.getCondVisibility(self._cmd) - self._update(value) - -class fd628FileContains(fd628State): - def __init__(self, ledName, path, strings): - super(fd628FileContains, self).__init__(ledName) - self._path = path - self._strings = strings - - def __str__(self): - return self._getStr('fd628FileContains') - - def update(self): - if (os.path.isfile(self._path)): - with open(self._path, 'rb') as state: - content = state.read() - value = self.__checkContent(content) - self._update(value) - else: - self._update(False) - - def __checkContent(self, content): - ret = False - for s in self._strings: - if (s in content): - ret = True - break - return ret - -class fd628WindowChecker(fd628State): - def __init__(self, ledName, windows): - super(fd628WindowChecker, self).__init__(ledName) - self._windows = windows - - def __str__(self): - return self._getStr('fd628WindowChecker') - - def update(self): - value = False - for id in self._windows: - if (xbmc.getCondVisibility('Window.IsVisible({0})'.format(id))): - value = True - break - self._update(value) - -class fd628ExtStorageChecker(fd628State): - def __init__(self, ledName, path): - super(fd628ExtStorageChecker, self).__init__(ledName) - self._path = path - - def __str__(self): - return self._getStr('fd628ExtStorageChecker') - - def update(self): - value = False - for folder, subs, files in os.walk('/dev/disk/by-uuid'): - for filename in files: - path = os.path.realpath(os.path.join(folder, filename)) - if (path.startswith(self._path)): - value = True - break - self._update(value) - -class fd628ExtStorageCount(fd628State): - def __init__(self, ledName, drives, type): - super(fd628ExtStorageCount, self).__init__(ledName) - if (drives == None): # Monitor all drives - self._drives = None - drives = self.__getAllDrives() - else: # Monitor listed drives - self._drives = drives - drives = self.__getSelectedDrives() - self._driveStats = {key: self.__readStatus(key) for key in drives} - kodiLogNotice('fd628ExtStorageCount.__init__: Drive stats ' + str(self._driveStats)) - self._read = False - self._write = False - if (type == 'r'): - self._read = True - elif (type == 'w'): - self._write = True - elif (type == 'rw'): - self._read = True - self._write = True - else: - raise Exception('\'type\' must be \'r\', \'w\' or \'rw\'.') - - def update(self): - value = False - if (self._drives == None): - drives = self.__getAllDrives() - else: - drives = self.__getSelectedDrives() - for drive in drives: - if (not drive in self._driveStats): - self._driveStats[drive] = None - kodiLogNotice('fd628ExtStorageCount.update: New drive found \'{0}\''.format(drive)) - for path, stats in self._driveStats.iteritems(): - newStats = self.__readStatus(path) - if (stats != None and newStats != None): - if (self._read): - value = value or stats[0] != newStats[0] - if (self._write): - value = value or stats[1] != newStats[1] - self._driveStats[path] = newStats - self._update(value) - - def __readStatus(self, path): - path = os.path.join('/sys/block', path, 'stat') - if (os.path.isfile(path)): - with open(path, 'rb') as status: - values = status.read().split() - return (values[2], values[6]) - else: - return None - - def __getAllDrives(self): - drives = [] - for folder, subs, files in os.walk('/sys/block'): - drives = [sub for sub in subs if (not sub.startswith('loop'))] - return drives - - def __getSelectedDrives(self): - return [drive for drive in self.__getAllDrives() if ([d for d in self._drives if drive.startswith(d)])] diff --git a/packages/addons/service/fd628/sources/resources/lib/fd628utils.py b/packages/addons/service/fd628/sources/resources/lib/fd628utils.py deleted file mode 100644 index 3f72dd9de2..0000000000 --- a/packages/addons/service/fd628/sources/resources/lib/fd628utils.py +++ /dev/null @@ -1,19 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) - -import xbmc -import xbmcaddon - -addonName = xbmcaddon.Addon(id='service.fd628').getAddonInfo('name') - -def kodiLog(message, level = xbmc.LOGDEBUG): - xbmc.log('{0} -> {1}'.format(addonName, str(message)), level) - -def kodiLogError(message): - kodiLog(message, xbmc.LOGERROR) - -def kodiLogWarning(message): - kodiLog(message, xbmc.LOGWARNING) - -def kodiLogNotice(message): - kodiLog(message, xbmc.LOGNOTICE) diff --git a/packages/addons/service/fd628/sources/resources/lib/ioctl.py b/packages/addons/service/fd628/sources/resources/lib/ioctl.py deleted file mode 100644 index e368e16d35..0000000000 --- a/packages/addons/service/fd628/sources/resources/lib/ioctl.py +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/python - -""" -Author: SpliFF -License: Public Domain - -Python ioctl constants and functions module - -Mostly follows specifications in asm-generic/ioctl.h from linux 2.5.36 - -Notable differences: -* no architecture dependant stuff -* size parameters are all passed as bytes, not types (ie pass 4, not int) - -!! WARNING EXPERIMENTAL SOFTWARE !! -Make sure the values returned by these functions are properly tested before using fcntl on anything remotely valuable! -""" - -NRBITS = 8 -TYPEBITS = 8 - -# may be arch dependent - -SIZEBITS = 14 -DIRBITS = 2 - -NRMASK = (1 << NRBITS) - 1 -TYPEMASK = (1 << TYPEBITS) - 1 -SIZEMASK = (1 << SIZEBITS) - 1 -DIRMASK = (1 << DIRBITS) - 1 - -NRSHIFT = 0 -TYPESHIFT = NRSHIFT + NRBITS -SIZESHIFT = TYPESHIFT + TYPEBITS -DIRSHIFT = SIZESHIFT + SIZEBITS - -# may be arch dependent - -NONE = 0x0 -WRITE = 0x1 -READ = 0x2 - -# for the drivers/sound files... - -IN = WRITE << DIRSHIFT -OUT = READ << DIRSHIFT -INOUT = (WRITE | READ) << DIRSHIFT -IOCSIZE_MASK = SIZEMASK << SIZESHIFT -IOCSIZE_SHIFT = SIZESHIFT - -# used to create numbers ... - -def IO( _type, nr): - return IOC(NONE, _type, nr, 0) - -def IOC(direction, _type, nr, size): - return (direction << DIRSHIFT) | (_type << TYPESHIFT) | (nr << NRSHIFT) | (size << SIZESHIFT) - -def IOR( _type, nr, size): - return IOC(READ, _type, nr, size) - -def IOW(_type, nr, size): - return IOC(WRITE, _type, nr, size) - -def IOWR(_type, nr, size): - return IOC(READ|WRITE, _type, nr, size) - -def IOR_BAD(_type, nr, size): - return IOC(READ, _type, nr, size) - -def IOW_BAD(_type, nr, size): - return IOC(WRITE, _type, nr, size) - -def IOWR_BAD(_type, nr, size): - return IOC(READ|WRITE, _type, nr, size) - -# used to decode ioctl numbers.. - -def DIR(nr): - return (nr >> DIRSHIFT) & DIRMASK - -def TYPE(nr): - return (nr >> TYPESHIFT) & TYPEMASK - -def NR(nr): - return (nr >> NRSHIFT) & NRMASK - -def SIZE(nr): - return (nr >> SIZESHIFT) & SIZEMASK diff --git a/packages/addons/service/fd628/sources/resources/lib/service.py b/packages/addons/service/fd628/sources/resources/lib/service.py deleted file mode 100644 index e6de460acc..0000000000 --- a/packages/addons/service/fd628/sources/resources/lib/service.py +++ /dev/null @@ -1,143 +0,0 @@ -# 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.') diff --git a/packages/addons/service/fd628/sources/resources/settings.xml b/packages/addons/service/fd628/sources/resources/settings.xml deleted file mode 100644 index 614f0e65af..0000000000 --- a/packages/addons/service/fd628/sources/resources/settings.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - -