mirror of
https://github.com/onyx-and-iris/vban-cmd-python.git
synced 2026-03-12 04:59:09 +00:00
74 lines
2.0 KiB
Python
74 lines
2.0 KiB
Python
import abc
|
|
import logging
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class IRemote(abc.ABC):
|
|
"""
|
|
Common interface between base class and extended (higher) classes
|
|
|
|
Provides some default implementation
|
|
"""
|
|
|
|
def __init__(self, remote, index=None):
|
|
self._remote = remote
|
|
self.index = index
|
|
self.logger = logger.getChild(self.__class__.__name__)
|
|
|
|
def getter(self, param):
|
|
cmd = self._cmd(param)
|
|
self.logger.debug(f'getter: {cmd}')
|
|
if cmd in self._remote.cache:
|
|
return self._remote.cache.pop(cmd)
|
|
if self._remote.sync:
|
|
self._remote.clear_dirty()
|
|
|
|
def setter(self, param, val):
|
|
"""Sends a string request RT packet."""
|
|
self.logger.debug(f'setter: {self._cmd(param)}={val}')
|
|
self._remote._set_rt(self._cmd(param), val)
|
|
|
|
def _cmd(self, param):
|
|
cmd = (self.identifier,)
|
|
if param:
|
|
cmd += (f'.{param}',)
|
|
return ''.join(cmd)
|
|
|
|
@property
|
|
@abc.abstractmethod
|
|
def identifier(self):
|
|
pass
|
|
|
|
@property
|
|
def public_packets(self):
|
|
"""Returns an RT data packet."""
|
|
return self._remote.public_packets
|
|
|
|
def apply(self, data):
|
|
"""Sets all parameters of a dict for the channel."""
|
|
|
|
script = ''
|
|
|
|
def fget(attr, val):
|
|
if attr == 'mode':
|
|
return (f'mode.{val}', 1)
|
|
elif attr == 'knob':
|
|
return ('', val)
|
|
return (attr, val)
|
|
|
|
for attr, val in data.items():
|
|
if not isinstance(val, dict):
|
|
if attr in dir(self): # avoid calling getattr (with hasattr)
|
|
attr, val = fget(attr, val)
|
|
if isinstance(val, bool):
|
|
val = 1 if val else 0
|
|
|
|
self._remote.cache[self._cmd(attr)] = val
|
|
script += f'{self._cmd(attr)}={val};'
|
|
else:
|
|
target = getattr(self, attr)
|
|
target.apply(val)
|
|
|
|
self._remote.sendtext(script)
|