vban-cmd-python/vbancmd/meta.py
onyx-and-iris 6c914dafbe add login,logout, caching system, dirty parameter to base class
add login, logout functions to base class.

add caching to setters and fetch caching to getters.

add isdirty function to rt packet dataclass for defining dirty flag.

remove sync kwarg.
2022-03-20 12:25:50 +00:00

79 lines
3.8 KiB
Python

from .errors import VMCMDErrors
from time import sleep
def strip_bool_prop(param):
""" A strip bool prop. """
def fget(self):
val = self.getter(param)
if val is None:
val = not int.from_bytes(self.public_packet.stripstate[self.index], 'little') & getattr(self._modes, f'_{param}') == 0
self._remote.cache[f'{self.identifier}.{param}'] = [val, False]
return val
return val == 1
def fset(self, val):
if not isinstance(val, bool) and val not in (0,1):
raise VMCMDErrors(f'{param} is a boolean parameter')
self.setter(param, 1 if val else 0)
return property(fget, fset)
def bus_bool_prop(param):
""" A bus bool prop. """
def fget(self):
val = self.getter(param)
if val is None:
val = not int.from_bytes(self.public_packet.busstate[self.index], 'little') & getattr(self._modes, f'_{param.replace(".", "_").lower()}') == 0
self._remote.cache[f'{self.identifier}.{param}'] = [val, False]
return val
return val == 1
def fset(self, val):
if not isinstance(val, bool) and val not in (0,1):
raise VMCMDErrors(f'{param} is a boolean parameter')
self.setter(param, 1 if val else 0)
return property(fget, fset)
def strip_output_prop(param):
""" A strip output prop. """
def fget(self):
val = self.getter(param)
if val is None:
val = not int.from_bytes(self.public_packet.stripstate[self.index], 'little') & getattr(self._modes, f'_bus{param.lower()}') == 0
self._remote.cache[f'{self.identifier}.{param}'] = [val, False]
return val
return val == 1
def fset(self, val):
if not isinstance(val, bool) and val not in (0, 1):
raise VMCMDErrors(f'{param} is a boolean parameter')
self.setter(param, 1 if val else 0)
return property(fget, fset)
def bus_mode_prop(param):
""" A bus mode prop. """
def fget(self):
data = self.public_packet
modes = {
'normal': (False, False, False, False, False, False, False, False, False, False, False, False),
'amix': (False, True, False, True, False, True, False, True, False, True, False, True),
'repeat': (False, False, True, True, False, False, True, True, False, False, True, True),
'bmix': (False, True, True, True, False, True, True, True, False, True, True, True),
'composite': (False, False, False, False, True, True, True, True, False, False, False, False),
'tvmix': (False, True, False, True, True, True, True, True, False, True, False, True),
'upmix21': (False, False, True, True, True, True, True, True, False, False, True, True),
'upmix41': (False, True, True, True, True, True, True, True, False, True, True, True),
'upmix61': (False, False, False, False, False, False, False, False, True, True, True, True),
'centeronly': (False, True, False, True, False, True, False, True, True, True, True, True),
'lfeonly': (False, False, True, True, False, False, True, True, True, True, True, True),
'rearonly': (False, True, True, True, False, True, True, True, True, True, True, True),
}
vals = tuple(not int.from_bytes(data.busstate[self.index], 'little') & val == 0 for val in self._modes.modevals)
val = self.getter(f'mode.{param}')
if val is None:
val = vals == modes[param.lower()]
self._remote.cache[f'{self.identifier}.mode.{param}'] = [val, False]
return val
return val == 1
def fset(self, val):
if not isinstance(val, bool) and val not in (0, 1):
raise VMCMDErrors(f'mode.{param} is a boolean parameter')
self.setter(f'mode.{param}', 1 if val else 0)
return property(fget, fset)