From c9e75cca1d27495f092900bfff718bc20b01b400 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Fri, 5 Mar 2021 02:13:45 +0100 Subject: [PATCH] Cleanup and small enhancements Restructured code to simplify maintenance and building Fixed message delay calculation Switched to kv language for interface description Enhanced logging handling of modules with Kivy Add application icon Streamlined windows binary --- .gitignore | 2 +- README.md | 7 +- constraints.txt | 2 - denonremote.spec | 24 +- cli.py => denonremote/cli.py | 0 config.py => denonremote/config.py | 0 {denon => denonremote/denon}/__init__.py | 0 {denon => denonremote/denon}/communication.py | 70 ++--- {denon => denonremote/denon}/dn500av.py | 48 ++- denonremote/denonremote.kv | 161 +++++++++++ .../fonts/Unicode_IEC_symbol.ttf | Bin denonremote/gui.py | 197 +++++++++++++ {assets => denonremote/images}/DN-500AV.png | Bin denonremote/images/icon.png | Bin 0 -> 26402 bytes main.py => denonremote/main.py | 32 +- gui.py | 273 ------------------ icon.ico | Bin 0 -> 34542 bytes requirements.txt | 1 - screenshot-v0.3.0.png | Bin 0 -> 82753 bytes 19 files changed, 456 insertions(+), 361 deletions(-) delete mode 100644 constraints.txt rename cli.py => denonremote/cli.py (100%) rename config.py => denonremote/config.py (100%) rename {denon => denonremote/denon}/__init__.py (100%) rename {denon => denonremote/denon}/communication.py (71%) rename {denon => denonremote/denon}/dn500av.py (94%) create mode 100644 denonremote/denonremote.kv rename Unicode_IEC_symbol.ttf => denonremote/fonts/Unicode_IEC_symbol.ttf (100%) create mode 100644 denonremote/gui.py rename {assets => denonremote/images}/DN-500AV.png (100%) create mode 100644 denonremote/images/icon.png rename main.py => denonremote/main.py (50%) delete mode 100644 gui.py create mode 100644 icon.ico create mode 100644 screenshot-v0.3.0.png diff --git a/.gitignore b/.gitignore index b4e6c29..1f05d7f 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,4 @@ build dist __pycache__ # Asset sources -sources +assets diff --git a/README.md b/README.md index 7c139dc..c623cca 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ Denon Remote ============ -![Screenshot](screenshot-v0.2.0.png) +![Screenshot](screenshot-v0.3.0.png) Author: Raphael Doursenaud @@ -85,6 +85,11 @@ Dependencies: - [ ] The Pythonic Way - [ ] Handle shutdown to power off the device - [x] PyInstaller + - [x] Generate icon with [IconMaker](https://github.com/Inedo/iconmaker) + - [x] [UPX](https://upx.github.io/) support + - How to build: + - Review [denonremote.spec](denonremote.spec) + - Use `python -m PyInstaller denonremote.spec --upx-dir=c:\upx-3.96-win64` - [ ] VST plugin? (Not required if MIDI input is implemented but would be neat to have in the monitoring section of a DAW) - [ ] See [PyVST](https://pypi.org/project/pyvst/) diff --git a/constraints.txt b/constraints.txt deleted file mode 100644 index 6f799fb..0000000 --- a/constraints.txt +++ /dev/null @@ -1,2 +0,0 @@ -# Twisted doesn't support python 3.9 yet -python <= 3.8 \ No newline at end of file diff --git a/denonremote.spec b/denonremote.spec index 1b82830..4038dce 100644 --- a/denonremote.spec +++ b/denonremote.spec @@ -2,28 +2,29 @@ from kivy_deps import sdl2, glew +# Minimize dependencies bundling +from kivy.tools.packaging.pyinstaller_hooks import get_deps_minimal, get_deps_all, hookspath, runtime_hooks + block_cipher = None added_files = [ - ( 'Unicode_IEC_symbol.ttf', '.' ), - ('assets', 'assets') + ('denonremote\\fonts', 'fonts'), + ('denonremote\\images', 'images') ] -a = Analysis(['main.py'], - pathex=['G:\\raph\\Documents\\GitHub\\denonremote'], - binaries=[], +a = Analysis(['denonremote\\main.py'], + pathex=['denonremote'], datas=added_files, - hiddenimports=[], - hookspath=[], + hookspath=hookspath(), runtime_hooks=[], - excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, - noarchive=False) + noarchive=False, + **get_deps_all()) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) -exe = EXE(pyz, Tree('G:\\raph\\Documents\\GitHub\\denonremote\\'), +exe = EXE(pyz, Tree('denonremote'), a.scripts, a.binaries, a.zipfiles, @@ -37,4 +38,5 @@ exe = EXE(pyz, Tree('G:\\raph\\Documents\\GitHub\\denonremote\\'), upx=True, upx_exclude=[], runtime_tmpdir=None, - console=False) + console=False, + icon='icon.ico') diff --git a/cli.py b/denonremote/cli.py similarity index 100% rename from cli.py rename to denonremote/cli.py diff --git a/config.py b/denonremote/config.py similarity index 100% rename from config.py rename to denonremote/config.py diff --git a/denon/__init__.py b/denonremote/denon/__init__.py similarity index 100% rename from denon/__init__.py rename to denonremote/denon/__init__.py diff --git a/denon/communication.py b/denonremote/denon/communication.py similarity index 71% rename from denon/communication.py rename to denonremote/denon/communication.py index aa70d45..7642ae1 100644 --- a/denon/communication.py +++ b/denonremote/denon/communication.py @@ -6,13 +6,9 @@ from twisted.internet.protocol import ClientFactory from twisted.protocols.basic import LineOnlyReceiver -from config import GUI -from denon.dn500av import DN500AVMessages, DN500AVFormat +from denon.dn500av import DN500AVMessage, DN500AVFormat -if GUI: - from kivy import Logger - - logger = Logger +logger = logging.getLogger(__name__) # TODO: Implement Serial ? @@ -24,40 +20,35 @@ class DenonProtocol(LineOnlyReceiver): MAX_LENGTH = 135 DELAY = 0.04 # in seconds. The documentation requires 200 ms. 40 ms seems safe. delimiter = b'\r' - ongoing_calls = -1 # Delay handling. FIXME: should timeout after 200 ms. - - logger = None + ongoing_calls = 0 # Delay handling. FIXME: should timeout after 200 ms. def sendLine(self, line): if b'?' in line: # A request is made. We need to delay the next calls self.ongoing_calls += 1 - self.logger.debug("Ongoing calls for delay: %s", self.ongoing_calls) - self.logger.debug("Will send line: %s", line) - return task.deferLater(reactor, delay=self.DELAY * self.ongoing_calls, callable=super().sendLine, line=line) + logger.debug("Ongoing calls for delay: %s", self.ongoing_calls) + logger.debug("Will send line: %s", line) + if self.ongoing_calls: + delay = self.DELAY * (self.ongoing_calls - 1) + else: + delay = self.DELAY + return task.deferLater(reactor, delay=delay, + callable=super().sendLine, line=line) def lineReceived(self, line): if self.ongoing_calls: # We received a reply self.ongoing_calls -= 1 - self.logger.debug("Ongoing calls for delay: %s", self.ongoing_calls) - receiver = DN500AVMessages(logger=self.logger) + logger.debug("Ongoing calls for delay: %s", self.ongoing_calls) + receiver = DN500AVMessage() receiver.parse_response(line) - self.logger.info("Received line: %s", receiver.response) - if self.factory.gui: - self.factory.app.print_message(receiver.response) - # FIXME: abstract - # MUTE - if receiver.command_code == 'MU': - state = False - if receiver.parameter_code == 'ON': - state = True - self.factory.app.update_volume_mute(state) + logger.info("Received line: %s", receiver.response) - # VOLUME - if receiver.command_code == 'MV': - if receiver.subcommand_code is None: - self.factory.app.update_volume(receiver.parameter_label) + # FIXME: parse message into state + + # FIXME: abstract away with a callback to the factory + if self.factory.gui: + self.factory.app.print_debug(receiver.response) # POWER if receiver.command_code == 'PW': @@ -66,10 +57,22 @@ def lineReceived(self, line): state = False self.factory.app.update_power(state) + # VOLUME + if receiver.command_code == 'MV': + if receiver.subcommand_code is None: + self.factory.app.update_volume(receiver.parameter_label) + + # MUTE + if receiver.command_code == 'MU': + state = False + if receiver.parameter_code == 'ON': + state = True + self.factory.app.set_volume_mute(state) + # SOURCE if receiver.command_code == 'SI': source = receiver.parameter_code - self.factory.app.update_source(source) + self.factory.app.set_sources(source) def connectionMade(self): if self.factory.gui: @@ -79,7 +82,7 @@ def get_power(self): self.sendLine('PW?'.encode('ASCII')) def set_power(self, state): - self.logger.debug("Entering power callback") + logger.debug("Entering power callback") if state: self.sendLine('PWON'.encode('ASCII')) else: @@ -91,7 +94,7 @@ def get_volume(self): def set_volume(self, value): rawvalue = DN500AVFormat().mv_reverse_params.get(value) if rawvalue is None: - self.logger.warning("Set volume value %s is invalid.", value) + logger.warning("Set volume value %s is invalid.", value) else: message = 'MV' + rawvalue self.sendLine(message.encode('ASCII')) @@ -118,7 +121,6 @@ class DenonClientFactory(ClientFactory): def __init__(self): self.gui = False - self.protocol.logger = logging.getLogger(__name__) class DenonClientGUIFactory(ClientFactory): @@ -127,4 +129,6 @@ class DenonClientGUIFactory(ClientFactory): def __init__(self, app): self.gui = True self.app = app - self.protocol.logger = Logger + import kivy.logger + global logger + logger = kivy.logger.Logger diff --git a/denon/dn500av.py b/denonremote/denon/dn500av.py similarity index 94% rename from denon/dn500av.py rename to denonremote/denon/dn500av.py index a761281..e0c69bf 100644 --- a/denon/dn500av.py +++ b/denonremote/denon/dn500av.py @@ -1,10 +1,11 @@ # -*- coding: utf-8 -*- -from config import GUI +""" +Denon DN-500AV serial and IP communication protocol description +""" -if GUI: - from kivy import Logger +import logging - logger = Logger +logger = logging.getLogger(__name__) commands = { 'PW': "Power", @@ -722,12 +723,10 @@ def compute_lfe_volume_label(value): # TODO: abstract device -class DN500AVMessages(): +class DN500AVMessage: # From DN-500 manual (DN-500AVEM_ENG_CD-ROM_v00.pdf) # Pages 93-101 (99-107 in PDF form) - logger = None - command_code = None command_label = None subcommand_code = None @@ -736,15 +735,15 @@ class DN500AVMessages(): parameter_label = None response = None - def __init__(self, logger=None): - self.logger = logger + def __init__(self): + pass def parse_response(self, status_command): # Handle strings and bytes if type(status_command) is bytes: # FIXME: some parts can be UTF-8 encoded status_command = status_command.decode('ASCII') - self.logger.debug("Received status command: %s", status_command) + logger.debug("Received status command: %s", status_command) # Commands are of known sizes. Try the largest first. for i in range(commands_max_size, commands_min_size - 1, -1): @@ -754,19 +753,19 @@ def parse_response(self, status_command): break if self.command_label is None: - self.logger.error("Command unknown: %s", status_command) + logger.error("Command unknown: %s", status_command) return else: - self.logger.info("Parsed command %s: %s", self.command_code, self.command_label) + logger.info("Parsed command %s: %s", self.command_code, self.command_label) # Trim command from status command stream status_command = status_command[len(self.command_code):] # Handle subcommands if commands_subcommands.get(self.command_code) is None: - self.logger.debug("The command %s doesn't have any known subcommands.", self.command_code) + logger.debug("The command %s doesn't have any known subcommands.", self.command_code) else: - self.logger.debug("Searching for subcommands in: %s", status_command) + logger.debug("Searching for subcommands in: %s", status_command) # Subcommands are of known sizes. Try the largest first. for i in range(commands_subcommands_max_size[self.command_code], @@ -777,23 +776,23 @@ def parse_response(self, status_command): break if self.subcommand_label is None: - self.logger.debug("Subcommand unknown. Probably a parameter: %s", status_command) + logger.debug("Subcommand unknown. Probably a parameter: %s", status_command) self.subcommand_code = None else: - self.logger.info("Parsed subcommand %s: %s", self.subcommand_code, self.subcommand_label) + logger.info("Parsed subcommand %s: %s", self.subcommand_code, self.subcommand_label) # Trim subcommand from status command stream status_command = status_command[ len(self.subcommand_code) + 1:] # Subcommands have a space before the parameter # Handle parameters - self.logger.debug("Searching for parameters in: %s", status_command) + logger.debug("Searching for parameters in: %s", status_command) self.parameter_code = status_command if self.command_code == 'PS': self.parameter_label = commands_params[self.command_code][self.subcommand_code].get(self.parameter_code) else: self.parameter_label = commands_params[self.command_code].get(self.parameter_code) if self.parameter_label is None: - self.logger.error("Parameter unknown: %s", status_command) + logger.error("Parameter unknown: %s", status_command) self.parameter_code = None else: # Trim parameters from status command stream @@ -801,7 +800,7 @@ def parse_response(self, status_command): # Handle unexpected leftovers if status_command: - self.logger.error("Unexpected unparsed data found: %s", status_command) + logger.error("Unexpected unparsed data found: %s", status_command) if self.subcommand_label: self.response = "%s, %s: %s" % (self.command_label, self.subcommand_label, self.parameter_label) @@ -809,17 +808,14 @@ def parse_response(self, status_command): self.response = "%s: %s" % (self.command_label, self.parameter_label) -class DN500AVFormat(): - logger = None - +class DN500AVFormat: mv_reverse_params = {} - def __init__(self, logger=None): - self.logger = logger + def __init__(self): self.mv_reverse_params = dict([(value, key) for key, value in mv_params.items()]) def get_raw_volume_value_from_db_value(self, value): - self.logger.debug('value: %s', value) + logger.debug('value: %s', value) raw_value = self.mv_reverse_params['value'] - self.logger.debug('rawvalue: %s', raw_value) + logger.debug('rawvalue: %s', raw_value) return raw_value diff --git a/denonremote/denonremote.kv b/denonremote/denonremote.kv new file mode 100644 index 0000000..f3b98a3 --- /dev/null +++ b/denonremote/denonremote.kv @@ -0,0 +1,161 @@ +#:import VOL_PRESET_1 config.VOL_PRESET_1 +#:import VOL_PRESET_2 config.VOL_PRESET_2 +#:import VOL_PRESET_3 config.VOL_PRESET_3 +#:import FAV_SRC_1_LABEL config.FAV_SRC_1_LABEL +#:import FAV_SRC_2_LABEL config.FAV_SRC_2_LABEL +#:import FAV_SRC_3_LABEL config.FAV_SRC_3_LABEL +#:import FAV_SRC_1_CODE config.FAV_SRC_1_CODE +#:import FAV_SRC_2_CODE config.FAV_SRC_2_CODE +#:import FAV_SRC_3_CODE config.FAV_SRC_3_CODE +#:import VERSION main.__version__ +#:import DEBUG config.DEBUG +#:import BUILD_DATE config.BUILD_DATE +#:import system platform.system +#:import BooleanProperty kivy.properties.BooleanProperty + +FloatLayout: + + Image: + id: denon_image + source: 'DN-500AV.png' + size: (0, 50) + size_hint: (.3, None) + pos_hint: {'top': .96, 'left': .99} + + Label: + id: name_label + text: "DENON REMOTE" + font_size: 40 + bold: True + size: (200, 50) + size_hint: (1, None) + pos_hint: {'top': .96} + color: [.75, .75, .75, 1] + + ToggleButton: + id: power + text: "⏻" + font_name: 'Unicode_IEC_symbol' + font_size: 50 + size: (80, 72) + size_hint: (None, None) + pos_hint: {'top': .983, 'right': .89} + color: [.1, .8, .1, 1] if self.state == 'down' else [.8, .1, .1, 1] # Green when down otherwise red + background_color: [.25, .25, .25, 1] + on_press: app.power_pressed(self) + + BoxLayout: + id: content + orientation: 'vertical' + spacing: 15 + size_hint: (1, .75) + pos: (0, 63) + pos_hint: {'top': .85} + + BoxLayout: + id: volume_section + orientation: 'vertical' + disabled: False if root.ids.power.state == 'down' else True + + TextInput: + id: volume_display + text: "---.-dB" + font_name: 'RobotoMono-Regular' + font_size: 36 + halign: 'center' + multiline: False + size: (200, 60) + size_hint: (1, None) + foreground_color: [.85, .85, .85, 1] + background_color: [.1, .1, .1, 1] + on_text_validate: app.volume_text_changed(self) + + BoxLayout: + id: volume_keys_layout + orientation: 'horizontal' + + Button + id: volume_minus + text: "-" + on_press: app.volume_minus_pressed(self) + + Button: + id: volume_plus + text: "+" + on_press: app.volume_plus_pressed(self) + + ToggleButton: + id: volume_mute + text: "Mute" + group: 'mute' + on_press: app.volume_mute_pressed(self) + + BoxLayout + id: volume_presets_layout + orientation: 'horizontal' + + ToggleButton: + id: vol_preset_1 + text: VOL_PRESET_1 # FIXME: get from config + group: 'vol_preset' + on_press: app.vol_preset_1_pressed(self) + + ToggleButton: + id: vol_preset_2 + text: VOL_PRESET_2 # FIXME: get from config + group: 'vol_preset' + on_press: app.vol_preset_2_pressed(self) + + ToggleButton: + id: vol_preset_3 + text: VOL_PRESET_3 # FIXME: get from config + group: 'vol_preset' + on_press: app.vol_preset_3_pressed(self) + + BoxLayout: + id: sources_section + orientation: 'vertical' + + ToggleButton: + id: fav_src_1 + text: FAV_SRC_1_LABEL # FIXME: get from config + group: 'sources' + on_press: app.fav_src_1_pressed(self) + + ToggleButton: + id: fav_src_2 + text: FAV_SRC_2_LABEL # FIXME: get from config + group: 'sources' + on_press: app.fav_src_2_pressed(self) + + ToggleButton: + id: fav_src_3 + text: FAV_SRC_3_LABEL # FIXME: get from config + group: 'sources' + on_press: app.fav_src_3_pressed(self) + + BoxLayout: + id: brand_layout + orientation: 'vertical' + size: (200, 65) + size_hint: (1, None) + pos_hint: {'bottom': 1} + + Label: + id: brand_label + text: "EMA Tech." + + Label: + id: version_label + text: "v%s %s (Built on %s)" % (VERSION, system(), BUILD_DATE) # FIXME: get from config + font_size: 10 + + TextInput: + id: debug_messages + text: u"Initializing GUI...\n" + readonly: True + background_color: [0, 0, 0, 1] + foreground_color: [0, 1, 0, 1] + size: (200, 65) + size_hint: (1, None) + diff --git a/Unicode_IEC_symbol.ttf b/denonremote/fonts/Unicode_IEC_symbol.ttf similarity index 100% rename from Unicode_IEC_symbol.ttf rename to denonremote/fonts/Unicode_IEC_symbol.ttf diff --git a/denonremote/gui.py b/denonremote/gui.py new file mode 100644 index 0000000..3b9cd62 --- /dev/null +++ b/denonremote/gui.py @@ -0,0 +1,197 @@ +# -*- coding: utf-8 -*- +import os +import sys + +import kivy.app +import kivy.resources +import kivy.support + +# FIXME: should be in Config object? +from config import RECEIVER_IP, RECEIVER_PORT, VOL_PRESET_1, VOL_PRESET_2, VOL_PRESET_3, FAV_SRC_1_CODE, \ + FAV_SRC_2_CODE, FAV_SRC_3_CODE, DEBUG + +# fix for pyinstaller packages app to avoid ReactorAlreadyInstalledError +# See: https://github.com/kivy/kivy/issues/4182 +# See: https://github.com/pyinstaller/pyinstaller/issues/3390 +if 'twisted.internet.reactor' in sys.modules: + del sys.modules['twisted.internet.reactor'] + +# Must be called before importing or using the reactor +kivy.support.install_twisted_reactor() +import twisted.internet +from denon.communication import DenonClientGUIFactory + +kivy.require('2.0.0') + +# Fixed size window +kivy.Config.set('graphics', 'resizable', False) + +APP_PATHS = ['fonts', 'images'] + +# PyInstaller data support +for path in APP_PATHS: + if hasattr(sys, '_MEIPASS'): + kivy.resources.resource_add_path(os.path.join(sys._MEIPASS, path)) + else: + kivy.resources.resource_add_path(path) + + +class DenonRemoteApp(kivy.app.App): + """ + A remote for the Denon DN-500AV Receiver + """ + + client = None + """Twisted IP client to the receiver""" + + title = "Denon Remote" + """Application title""" + + icon = 'icon.png' + """Application icon""" + + def on_start(self): + """ + Fired by Kivy on application startup + :return: + """ + if not DEBUG: + # Hide debug_messages + self.root.ids.debug_messages.size = (0, 0) + + self.print_debug('Connecting to ' + RECEIVER_IP + '...') + twisted.internet.reactor.connectTCP(RECEIVER_IP, RECEIVER_PORT, DenonClientGUIFactory(self)) + + def on_stop(self): + """ + Fired by Kivy on application shutdown + + :return: + """ + pass + + def on_pause(self): + """ + Fired by Kivy on application pause + + :return: + """ + pass + + def on_resume(self): + """ + Fired by Kivy on application resume after pause + + :return: + """ + pass + + def on_connection(self, connection): + """ + Fired by Kivy when the Twisted reactor is connected + + :param connection: + :return: + """ + self.print_debug('Connection successful!') + self.client = connection + + self.client.get_power() + self.client.get_volume() + self.client.get_mute() + self.client.get_source() + + def update_power(self, status=True): + if status: + self.root.ids.power.state = 'down' + else: + self.root.ids.power.state = 'normal' + + def power_pressed(self, instance): + power = False if instance.state == 'normal' else True + self.client.set_power(power) + + def update_volume(self, text=""): + self.root.ids.volume_display.text = text + if text in VOL_PRESET_1: + self.root.ids.vol_preset_1.state = 'down' + else: + self.root.ids.vol_preset_1.state = 'normal' + if text in VOL_PRESET_2: + self.root.ids.vol_preset_2.state = 'down' + else: + self.root.ids.vol_preset_2.state = 'normal' + if text in VOL_PRESET_3: + self.root.ids.vol_preset_3.state = 'down' + else: + self.root.ids.vol_preset_3.state = 'normal' + + def volume_text_changed(self, instance): + # TODO: validate user input + if len(instance.text) != 7: + self.client.get_volume() + return + self.client.set_volume(instance.text) + + def volume_minus_pressed(self, instance): + self.client.set_volume('Down') + + def volume_plus_pressed(self, instance): + self.client.set_volume('Up') + + def volume_mute_pressed(self, instance): + mute = True if instance.state == 'down' else False + # Stay down. Updated on message received + self.root.ids.volume_mute.state = 'down' + self.client.set_mute(mute) + + def set_volume_mute(self, status=False): + if status: + self.root.ids.volume_mute.state = 'down' + self.root.ids.volume_display.foreground_color = [.3, .3, .3, 1] + else: + self.root.ids.volume_mute.state = 'normal' + self.root.ids.volume_display.foreground_color = [.85, .85, .85, 1] + + def vol_preset_1_pressed(self, instance): + self.client.set_volume(VOL_PRESET_1) + instance.state = 'down' # Disallow depressing the button manually + + def vol_preset_2_pressed(self, instance): + self.client.set_volume(VOL_PRESET_2) + instance.state = 'down' + + def vol_preset_3_pressed(self, instance): + self.client.set_volume(VOL_PRESET_3) + instance.state = 'down' + + def set_sources(self, source=None): + if source in FAV_SRC_1_CODE: + self.root.ids.fav_src_1.state = 'down' + else: + self.root.ids.fav_src_1.state = 'normal' + if source in FAV_SRC_2_CODE: + self.root.ids.fav_src_2.state = 'down' + else: + self.root.ids.fav_src_2.state = 'normal' + if source in FAV_SRC_3_CODE: + self.root.ids.fav_src_3.state = 'down' + else: + self.root.ids.fav_src_3.state = 'normal' + + # TODO: display other sources + + def fav_src_1_pressed(self, instance): + self.client.set_source(FAV_SRC_1_CODE) + instance.state = 'down' # Disallow depressing the button manually + + def fav_src_2_pressed(self, instance): + self.client.set_source(FAV_SRC_2_CODE) + instance.state = 'down' + + def fav_src_3_pressed(self, instance): + self.client.set_source(FAV_SRC_3_CODE) + instance.state = 'down' + + def print_debug(self, msg): + self.root.ids.debug_messages.text += "{}\n".format(msg) diff --git a/assets/DN-500AV.png b/denonremote/images/DN-500AV.png similarity index 100% rename from assets/DN-500AV.png rename to denonremote/images/DN-500AV.png diff --git a/denonremote/images/icon.png b/denonremote/images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3134a05f782b08757497c1ba72e0c29caea2ceb7 GIT binary patch literal 26402 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 C>D$VLIqTa}l3LU(Lr08r)!B#~5S#fFb(n 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 literal 0 HcmV?d00001 diff --git a/main.py b/denonremote/main.py similarity index 50% rename from main.py rename to denonremote/main.py index e6d61bc..9926ba0 100644 --- a/main.py +++ b/denonremote/main.py @@ -2,49 +2,55 @@ # -*- coding: utf-8 -*- """ -DN-500AV Remote +Denon DN-500AV Remote @author Raphael Doursenaud """ -__author__ = 'Raphaël Doursenaud' +__author__ = 'Raphaël Doursenaud ' + +__version__ = '0.3.0' # FIXME: use setuptools import logging from config import DEBUG, GUI +logger = logging.getLogger() + def init_logging(): + global logger + if not GUI: if DEBUG: logging.basicConfig(level=logging.DEBUG) else: logging.basicConfig(level=logging.INFO) - logging.getLogger("denon.dn500av").setLevel(logging.WARNING) # Silence module’s logging + logging.getLogger('denon.dn500av').setLevel(logging.WARNING) # Silence module’s logging else: - from kivy import Logger - logger = Logger + import kivy.logger + logger = kivy.logger.Logger + logging.Logger.manager.root = kivy.logger.Logger # Hack to retrieve logs from modules using standard logging into Kivy if DEBUG: - logger.setLevel(logging.DEBUG) + logger.setLevel(kivy.logger.LOG_LEVELS['debug']) else: - logger.setLevel(logging.INFO) + logger.setLevel(kivy.logger.LOG_LEVELS['info']) def run(): # FIXME: autodetect when running from CLI - if GUI == True: + if GUI: from gui import DenonRemoteApp # PyInstaller data support import os, sys - from kivy.resources import resource_add_path + import kivy.resources if hasattr(sys, '_MEIPASS'): - resource_add_path(os.path.join(sys._MEIPASS)) - - DenonRemoteApp().run() + kivy.resources.resource_add_path(os.path.join(sys._MEIPASS)) else: from cli import DenonRemoteApp - DenonRemoteApp().run() + + DenonRemoteApp().run() if __name__ == '__main__': diff --git a/gui.py b/gui.py deleted file mode 100644 index 2fae398..0000000 --- a/gui.py +++ /dev/null @@ -1,273 +0,0 @@ -# -*- coding: utf-8 -*- - -import platform -import sys - -import kivy -from kivy import Logger, Config - -Config.set('graphics', 'resizable', False) -from kivy.uix.boxlayout import BoxLayout -from kivy.uix.button import Button -from kivy.uix.floatlayout import FloatLayout -from kivy.uix.image import Image -from kivy.uix.textinput import TextInput -from kivy.uix.togglebutton import ToggleButton - -from config import RECEIVER_IP, RECEIVER_PORT, VOL_PRESET_1, VOL_PRESET_2, VOL_PRESET_3, FAV_SRC_1_LABEL, \ - FAV_SRC_2_LABEL, FAV_SRC_3_LABEL, FAV_SRC_1_CODE, FAV_SRC_2_CODE, FAV_SRC_3_CODE, DEBUG, BUILD_DATE - -# fix for pyinstaller packages app to avoid ReactorAlreadyInstalledError -# See: https://github.com/kivy/kivy/issues/4182 -# See: https://github.com/pyinstaller/pyinstaller/issues/3390 -if 'twisted.internet.reactor' in sys.modules: - del sys.modules['twisted.internet.reactor'] - -# install twisted reactor -from kivy.support import install_twisted_reactor - -install_twisted_reactor() - -from denon.communication import DenonClientGUIFactory - -kivy.require('2.0.0') - -from kivy.app import App -from kivy.uix.label import Label -from twisted.internet import reactor - -logging = Logger - - -class DenonRemoteApp(App): - connection = None - debug_messages = None - power = None - volume_display = None - volume_plus = None - volume_minus = None - vol_preset_1 = None - vol_preset_2 = None - vol_preset_3 = None - volume_mute = None - fav_src_1 = None - fav_src_2 = None - fav_src_3 = None - - def build(self): - self.title = "Denon Remote" - # TODO: self.icon = '' - root = self.setup_gui() - self.connect_to_receiver() - return root - - def setup_gui(self): - # TODO: switch to kv lang? - - root = FloatLayout() - - denon_image = Image(source='assets/DN-500AV.png') - denon_image.size = (0, 50) - denon_image.size_hint = (.3, None) - denon_image.pos_hint = {'top': .96, 'left': .99} - root.add_widget(denon_image) - - name_label = Label(text="DENON REMOTE", font_size=40, bold=True) - name_label.size = (200, 50) - name_label.size_hint = (1, None) - name_label.pos_hint = {'top': .96} - name_label.color = [.75, .75, .75, 1] - - root.add_widget(name_label) - - content = BoxLayout(orientation='vertical', spacing=15) - content.size_hint = (1, .75) - content.pos = (0, 65) - content.pos_hint = {'top': .85} - - self.power = ToggleButton(text="⏻", font_name='Unicode_IEC_symbol', font_size=50) - self.power.size = (80, 72) - self.power.size_hint = (None, None) - self.power.pos_hint = {'top': .983, 'right': .87} - self.power.background_color = [.3, .3, .3, 1] - root.add_widget(self.power) - - volume_section = BoxLayout(orientation='vertical') - self.volume_display = TextInput(text="---.-dB", font_name="RobotoMono-Regular", font_size=36, - halign='center', multiline=False) - self.volume_display.size = (200, 60) - self.volume_display.size_hint = (1, None) - self.volume_display.foreground_color = [.85, .85, .85, 1] - self.volume_display.background_color = [.1, .1, .1, 1] - volume_section.add_widget(self.volume_display) - volume_keys_layout = BoxLayout(orientation='horizontal') - self.volume_plus = Button(text="+") - self.volume_minus = Button(text="-") - volume_keys_layout.add_widget(self.volume_minus) - volume_keys_layout.add_widget(self.volume_plus) - volume_section.add_widget(volume_keys_layout) - self.volume_mute = ToggleButton(text="Mute", group='mute') - volume_section.add_widget(self.volume_mute) - volume_presets_layout = BoxLayout(orientation='horizontal') - self.vol_preset_1 = ToggleButton(text=VOL_PRESET_1, group='vol_preset') - self.vol_preset_2 = ToggleButton(text=VOL_PRESET_2, group='vol_preset') - self.vol_preset_3 = ToggleButton(text=VOL_PRESET_3, group='vol_preset') - volume_presets_layout.add_widget(self.vol_preset_1) - volume_presets_layout.add_widget(self.vol_preset_2) - volume_presets_layout.add_widget(self.vol_preset_3) - volume_section.add_widget(volume_presets_layout) - content.add_widget(volume_section) - - sources_section = BoxLayout(orientation='vertical') - self.fav_src_1 = ToggleButton(text=FAV_SRC_1_LABEL, group='sources') - self.fav_src_2 = ToggleButton(text=FAV_SRC_2_LABEL, group='sources') - self.fav_src_3 = ToggleButton(text=FAV_SRC_3_LABEL, group='sources') - sources_section.add_widget(self.fav_src_1) - sources_section.add_widget(self.fav_src_2) - sources_section.add_widget(self.fav_src_3) - content.add_widget(sources_section) - - root.add_widget(content) - - brand_layout = BoxLayout(orientation='vertical') - brand_label = Label(text="EMA Tech.") - os_name = platform.system() - build_date = BUILD_DATE - version_label = Label(text="pre-release %s, (Built on %s)" % (os_name, build_date), font_size=10) - brand_layout.add_widget(brand_label) - brand_layout.add_widget(version_label) - brand_layout.size = (200, 65) - brand_layout.size_hint = (1, None) - brand_layout.pos_hint = {'bottom': 1} - - root.add_widget(brand_layout) - - self.debug_messages = TextInput(background_color=[0, 0, 0, 1], foreground_color=[0, 1, 0, 1]) - self.debug_messages.size = (200, 65) - self.debug_messages.size_hint = (1, None) - if DEBUG: - root.add_widget(self.debug_messages) - - return root - - def connect_to_receiver(self): - self.print_message('Connection to ' + RECEIVER_IP + '...\n') - reactor.connectTCP(RECEIVER_IP, RECEIVER_PORT, DenonClientGUIFactory(self)) - - def on_connection(self, connection): - self.print_message('... successful!\n') - self.connection = connection - - self.connection.get_power() - self.connection.get_volume() - self.connection.get_mute() - self.connection.get_source() - - self.power.bind(on_press=self.power_callback) - self.volume_display.bind(on_text_validate=self.volume_callback) - self.volume_minus.bind(on_press=self.volume_minus_callback) - self.volume_plus.bind(on_press=self.volume_plus_callback) - self.volume_mute.bind(on_press=self.volume_mute_callback) - self.vol_preset_1.bind(on_press=self.vol_preset_1_callback) - self.vol_preset_2.bind(on_press=self.vol_preset_2_callback) - self.vol_preset_3.bind(on_press=self.vol_preset_3_callback) - self.fav_src_1.bind(on_press=self.fav_src_1_callback) - self.fav_src_2.bind(on_press=self.fav_src_2_callback) - self.fav_src_3.bind(on_press=self.fav_src_3_callback) - - def print_message(self, msg): - self.debug_messages.text += "{}\n".format(msg) - - def update_power(self, status=True): - if status: - self.power.state = 'down' - self.power.color = [.1, .8, .1, 1] # Green - else: - self.power.state = 'normal' - self.power.color = [.8, .1, .1, 1] # Red - - def power_callback(self, instance): - power = False if instance.state == 'normal' else True - self.connection.set_power(power) - - def update_volume(self, text=""): - self.volume_display.text = text - if text in VOL_PRESET_1: - self.vol_preset_1.state = 'down' - else: - self.vol_preset_1.state = 'normal' - if text in VOL_PRESET_2: - self.vol_preset_2.state = 'down' - else: - self.vol_preset_2.state = 'normal' - if text in VOL_PRESET_3: - self.vol_preset_3.state = 'down' - else: - self.vol_preset_3.state = 'normal' - - def volume_callback(self, instance): - # TODO: validate user input - if len(instance.text) != 7: - self.connection.get_volume() - return - self.connection.set_volume(instance.text) - - def volume_minus_callback(self, instance): - self.connection.set_volume('Down') - - def volume_plus_callback(self, instance): - self.connection.set_volume('Up') - - def volume_mute_callback(self, instance): - mute = True if instance.state == 'down' else False - # Stay down. Updated on message received - self.volume_mute.state = 'down' - self.connection.set_mute(mute) - - def update_volume_mute(self, status=False): - if status: - self.volume_mute.state = 'down' - self.volume_display.foreground_color = [.3, .3, .3, 1] - else: - self.volume_mute.state = 'normal' - self.volume_display.foreground_color = [.85, .85, .85, 1] - - def vol_preset_1_callback(self, instance): - self.connection.set_volume(VOL_PRESET_1) - instance.state = 'down' # Disallow depressing the button manually - - def vol_preset_2_callback(self, instance): - self.connection.set_volume(VOL_PRESET_2) - instance.state = 'down' - - def vol_preset_3_callback(self, instance): - self.connection.set_volume(VOL_PRESET_3) - instance.state = 'down' - - def update_source(self, source=None): - if source in FAV_SRC_1_CODE: - self.fav_src_1.state = 'down' - else: - self.fav_src_1.state = 'normal' - if source in FAV_SRC_2_CODE: - self.fav_src_2.state = 'down' - else: - self.fav_src_2.state = 'normal' - if source in FAV_SRC_3_CODE: - self.fav_src_3.state = 'down' - else: - self.fav_src_3.state = 'normal' - - # TODO: display other sources - - def fav_src_1_callback(self, instance): - self.connection.set_source(FAV_SRC_1_CODE) - instance.state = 'down' # Disallow depressing the button manually - - def fav_src_2_callback(self, instance): - self.connection.set_source(FAV_SRC_2_CODE) - instance.state = 'down' - - def fav_src_3_callback(self, instance): - self.connection.set_source(FAV_SRC_3_CODE) - instance.state = 'down' diff --git a/icon.ico b/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..f7d76d1afffb088819a21389dcf7b93c18ac7f4c GIT binary patch literal 34542 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 literal 0 HcmV?d00001 diff --git a/requirements.txt b/requirements.txt index 2c6c913..6c4873c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,3 @@ --c constraints.txt twisted kivy PyInstaller \ No newline at end of file diff --git a/screenshot-v0.3.0.png b/screenshot-v0.3.0.png new file mode 100644 index 0000000000000000000000000000000000000000..410b5050aff461c1f931e8890257d5077f8eb87f GIT binary patch literal 82753 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%0DiI!y%9B&YI=)=rSqbXRE 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 literal 0 HcmV?d00001