receiver: allow for settings that do not persist
This commit is contained in:
parent
63872b9146
commit
1c2b347512
|
@ -43,15 +43,30 @@ KIND = _NamedInts(toggle=0x01, choice=0x02, range=0x04, map_choice=0x0A, multipl
|
||||||
class Setting(object):
|
class Setting(object):
|
||||||
"""A setting descriptor.
|
"""A setting descriptor.
|
||||||
Needs to be instantiated for each specific device."""
|
Needs to be instantiated for each specific device."""
|
||||||
__slots__ = ('name', 'label', 'description', 'kind', 'device_kind', 'feature', '_rw', '_validator', '_device', '_value')
|
__slots__ = (
|
||||||
|
'name', 'label', 'description', 'kind', 'device_kind', 'feature', 'persist', '_rw', '_validator', '_device', '_value'
|
||||||
|
)
|
||||||
|
|
||||||
def __init__(self, name, rw, validator, kind=None, label=None, description=None, device_kind=None, feature=None, **kwargs):
|
def __init__(
|
||||||
|
self,
|
||||||
|
name,
|
||||||
|
rw,
|
||||||
|
validator,
|
||||||
|
kind=None,
|
||||||
|
label=None,
|
||||||
|
description=None,
|
||||||
|
device_kind=None,
|
||||||
|
feature=None,
|
||||||
|
persist=True,
|
||||||
|
**kwargs
|
||||||
|
):
|
||||||
assert name
|
assert name
|
||||||
self.name = name
|
self.name = name
|
||||||
self.label = label or name
|
self.label = label or name
|
||||||
self.description = description
|
self.description = description
|
||||||
self.device_kind = device_kind
|
self.device_kind = device_kind
|
||||||
self.feature = feature
|
self.feature = feature
|
||||||
|
self.persist = persist
|
||||||
|
|
||||||
self._rw = rw
|
self._rw = rw
|
||||||
self._validator = validator
|
self._validator = validator
|
||||||
|
@ -98,13 +113,13 @@ class Setting(object):
|
||||||
if _log.isEnabledFor(_DEBUG):
|
if _log.isEnabledFor(_DEBUG):
|
||||||
_log.debug('%s: settings read %r from %s', self.name, self._value, self._device)
|
_log.debug('%s: settings read %r from %s', self.name, self._value, self._device)
|
||||||
|
|
||||||
if self._value is None and self._device.persister:
|
if self.persist and self._value is None and self._device.persister:
|
||||||
# We haven't read a value from the device yet,
|
# We haven't read a value from the device yet,
|
||||||
# maybe we have something in the configuration.
|
# maybe we have something in the configuration.
|
||||||
self._value = self._device.persister.get(self.name)
|
self._value = self._device.persister.get(self.name)
|
||||||
|
|
||||||
if cached and self._value is not None:
|
if cached and self._value is not None:
|
||||||
if self._device.persister and self.name not in self._device.persister:
|
if self.persist and self._device.persister and self.name not in self._device.persister:
|
||||||
# If this is a new device (or a new setting for an old device),
|
# If this is a new device (or a new setting for an old device),
|
||||||
# make sure to save its current value for the next time.
|
# make sure to save its current value for the next time.
|
||||||
self._device.persister[self.name] = self._value
|
self._device.persister[self.name] = self._value
|
||||||
|
@ -114,7 +129,7 @@ class Setting(object):
|
||||||
reply = self._rw.read(self._device)
|
reply = self._rw.read(self._device)
|
||||||
if reply:
|
if reply:
|
||||||
self._value = self._validator.validate_read(reply)
|
self._value = self._validator.validate_read(reply)
|
||||||
if self._device.persister and self.name not in self._device.persister:
|
if self.persist and self._device.persister and self.name not in self._device.persister:
|
||||||
# Don't update the persister if it already has a value,
|
# Don't update the persister if it already has a value,
|
||||||
# otherwise the first read might overwrite the value we wanted.
|
# otherwise the first read might overwrite the value we wanted.
|
||||||
self._device.persister[self.name] = self._value
|
self._device.persister[self.name] = self._value
|
||||||
|
@ -133,7 +148,7 @@ class Setting(object):
|
||||||
# This way even if the device is offline or some other error occurs,
|
# This way even if the device is offline or some other error occurs,
|
||||||
# the last value we've tried to write is remembered in the configuration.
|
# the last value we've tried to write is remembered in the configuration.
|
||||||
self._value = value
|
self._value = value
|
||||||
if self._device.persister:
|
if self.persist and self._device.persister:
|
||||||
self._device.persister[self.name] = value
|
self._device.persister[self.name] = value
|
||||||
|
|
||||||
current_value = None
|
current_value = None
|
||||||
|
@ -160,7 +175,7 @@ class Setting(object):
|
||||||
if _log.isEnabledFor(_DEBUG):
|
if _log.isEnabledFor(_DEBUG):
|
||||||
_log.debug('%s: apply %s (%s)', self.name, self._value, self._device)
|
_log.debug('%s: apply %s (%s)', self.name, self._value, self._device)
|
||||||
|
|
||||||
value = self.read()
|
value = self.read(self.persist) # Don't use old value if setting doesn't persist
|
||||||
if value is not None:
|
if value is not None:
|
||||||
self.write(value)
|
self.write(value)
|
||||||
|
|
||||||
|
@ -185,13 +200,13 @@ class Settings(Setting):
|
||||||
if _log.isEnabledFor(_DEBUG):
|
if _log.isEnabledFor(_DEBUG):
|
||||||
_log.debug('%s: settings read %r from %s', self.name, self._value, self._device)
|
_log.debug('%s: settings read %r from %s', self.name, self._value, self._device)
|
||||||
|
|
||||||
if self._value is None and getattr(self._device, 'persister', None):
|
if self.persist and self._value is None and getattr(self._device, 'persister', None):
|
||||||
# We haven't read a value from the device yet,
|
# We haven't read a value from the device yet,
|
||||||
# maybe we have something in the configuration.
|
# maybe we have something in the configuration.
|
||||||
self._value = self._device.persister.get(self.name)
|
self._value = self._device.persister.get(self.name)
|
||||||
|
|
||||||
if cached and self._value is not None:
|
if cached and self._value is not None:
|
||||||
if getattr(self._device, 'persister', None) and self.name not in self._device.persister:
|
if self.persist and getattr(self._device, 'persister', None) and self.name not in self._device.persister:
|
||||||
# If this is a new device (or a new setting for an old device),
|
# If this is a new device (or a new setting for an old device),
|
||||||
# make sure to save its current value for the next time.
|
# make sure to save its current value for the next time.
|
||||||
self._device.persister[self.name] = self._value
|
self._device.persister[self.name] = self._value
|
||||||
|
@ -206,7 +221,7 @@ class Settings(Setting):
|
||||||
# encoded into strings because JSON requires strings as keys
|
# encoded into strings because JSON requires strings as keys
|
||||||
reply_map[str(int(key))] = self._validator.validate_read(reply, key)
|
reply_map[str(int(key))] = self._validator.validate_read(reply, key)
|
||||||
self._value = reply_map
|
self._value = reply_map
|
||||||
if getattr(self._device, 'persister', None) and self.name not in self._device.persister:
|
if self.persist and getattr(self._device, 'persister', None) and self.name not in self._device.persister:
|
||||||
# Don't update the persister if it already has a value,
|
# Don't update the persister if it already has a value,
|
||||||
# otherwise the first read might overwrite the value we wanted.
|
# otherwise the first read might overwrite the value we wanted.
|
||||||
self._device.persister[self.name] = self._value
|
self._device.persister[self.name] = self._value
|
||||||
|
@ -224,7 +239,7 @@ class Settings(Setting):
|
||||||
self._value = self._device.persister.get(self.name)
|
self._value = self._device.persister.get(self.name)
|
||||||
|
|
||||||
if cached and self._value is not None:
|
if cached and self._value is not None:
|
||||||
if getattr(self._device, 'persister', None) and self.name not in self._device.persister:
|
if self.persist and getattr(self._device, 'persister', None) and self.name not in self._device.persister:
|
||||||
self._device.persister[self.name] = self._value
|
self._device.persister[self.name] = self._value
|
||||||
return self._value[str(int(key))]
|
return self._value[str(int(key))]
|
||||||
|
|
||||||
|
@ -232,7 +247,7 @@ class Settings(Setting):
|
||||||
reply = self._rw.read(self._device, key)
|
reply = self._rw.read(self._device, key)
|
||||||
if reply:
|
if reply:
|
||||||
self._value[str(int(key))] = self._validator.validate_read(reply, key)
|
self._value[str(int(key))] = self._validator.validate_read(reply, key)
|
||||||
if getattr(self._device, 'persister', None) and self.name not in self._device.persister:
|
if self.persist and getattr(self._device, 'persister', None) and self.name not in self._device.persister:
|
||||||
self._device.persister[self.name] = self._value
|
self._device.persister[self.name] = self._value
|
||||||
return self._value[str(int(key))]
|
return self._value[str(int(key))]
|
||||||
|
|
||||||
|
@ -249,7 +264,7 @@ class Settings(Setting):
|
||||||
# This way even if the device is offline or some other error occurs,
|
# This way even if the device is offline or some other error occurs,
|
||||||
# the last value we've tried to write is remembered in the configuration.
|
# the last value we've tried to write is remembered in the configuration.
|
||||||
self._value = map
|
self._value = map
|
||||||
if self._device.persister:
|
if self.persist and self._device.persister:
|
||||||
self._device.persister[self.name] = map
|
self._device.persister[self.name] = map
|
||||||
|
|
||||||
for key, value in map.items():
|
for key, value in map.items():
|
||||||
|
@ -277,7 +292,7 @@ class Settings(Setting):
|
||||||
# This way even if the device is offline or some other error occurs,
|
# This way even if the device is offline or some other error occurs,
|
||||||
# the last value we've tried to write is remembered in the configuration.
|
# the last value we've tried to write is remembered in the configuration.
|
||||||
self._value[str(key)] = value
|
self._value[str(key)] = value
|
||||||
if self._device.persister:
|
if self.persist and self._device.persister:
|
||||||
self._device.persister[self.name] = self._value
|
self._device.persister[self.name] = self._value
|
||||||
|
|
||||||
data_bytes = self._validator.prepare_write(int(key), value)
|
data_bytes = self._validator.prepare_write(int(key), value)
|
||||||
|
@ -308,7 +323,7 @@ class BitFieldSetting(Setting):
|
||||||
self._value = self._device.persister.get(self.name)
|
self._value = self._device.persister.get(self.name)
|
||||||
|
|
||||||
if cached and self._value is not None:
|
if cached and self._value is not None:
|
||||||
if getattr(self._device, 'persister', None) and self.name not in self._device.persister:
|
if self.persist and getattr(self._device, 'persister', None) and self.name not in self._device.persister:
|
||||||
# If this is a new device (or a new setting for an old device),
|
# If this is a new device (or a new setting for an old device),
|
||||||
# make sure to save its current value for the next time.
|
# make sure to save its current value for the next time.
|
||||||
self._device.persister[self.name] = self._value
|
self._device.persister[self.name] = self._value
|
||||||
|
@ -322,7 +337,7 @@ class BitFieldSetting(Setting):
|
||||||
# encoded into strings because JSON requires strings as keys
|
# encoded into strings because JSON requires strings as keys
|
||||||
reply_map = self._validator.validate_read(reply)
|
reply_map = self._validator.validate_read(reply)
|
||||||
self._value = reply_map
|
self._value = reply_map
|
||||||
if getattr(self._device, 'persister', None) and self.name not in self._device.persister:
|
if self.persist and getattr(self._device, 'persister', None) and self.name not in self._device.persister:
|
||||||
# Don't update the persister if it already has a value,
|
# Don't update the persister if it already has a value,
|
||||||
# otherwise the first read might overwrite the value we wanted.
|
# otherwise the first read might overwrite the value we wanted.
|
||||||
self._device.persister[self.name] = self._value
|
self._device.persister[self.name] = self._value
|
||||||
|
@ -340,7 +355,7 @@ class BitFieldSetting(Setting):
|
||||||
self._value = self._device.persister.get(self.name)
|
self._value = self._device.persister.get(self.name)
|
||||||
|
|
||||||
if cached and self._value is not None:
|
if cached and self._value is not None:
|
||||||
if getattr(self._device, 'persister', None) and self.name not in self._device.persister:
|
if self.persist and getattr(self._device, 'persister', None) and self.name not in self._device.persister:
|
||||||
self._device.persister[self.name] = self._value
|
self._device.persister[self.name] = self._value
|
||||||
return self._value[str(int(key))]
|
return self._value[str(int(key))]
|
||||||
|
|
||||||
|
@ -348,7 +363,7 @@ class BitFieldSetting(Setting):
|
||||||
reply = self._rw.read(self._device, key)
|
reply = self._rw.read(self._device, key)
|
||||||
if reply:
|
if reply:
|
||||||
self._value = self._validator.validate_read(reply)
|
self._value = self._validator.validate_read(reply)
|
||||||
if getattr(self._device, 'persister', None) and self.name not in self._device.persister:
|
if self.persist and getattr(self._device, 'persister', None) and self.name not in self._device.persister:
|
||||||
self._device.persister[self.name] = self._value
|
self._device.persister[self.name] = self._value
|
||||||
return self._value[str(int(key))]
|
return self._value[str(int(key))]
|
||||||
|
|
||||||
|
@ -365,7 +380,7 @@ class BitFieldSetting(Setting):
|
||||||
# This way even if the device is offline or some other error occurs,
|
# This way even if the device is offline or some other error occurs,
|
||||||
# the last value we've tried to write is remembered in the configuration.
|
# the last value we've tried to write is remembered in the configuration.
|
||||||
self._value = map
|
self._value = map
|
||||||
if self._device.persister:
|
if self.persist and self._device.persister:
|
||||||
self._device.persister[self.name] = map
|
self._device.persister[self.name] = map
|
||||||
data_bytes = self._validator.prepare_write(self._value)
|
data_bytes = self._validator.prepare_write(self._value)
|
||||||
if data_bytes is not None:
|
if data_bytes is not None:
|
||||||
|
@ -391,7 +406,7 @@ class BitFieldSetting(Setting):
|
||||||
# the last value we've tried to write is remembered in the configuration.
|
# the last value we've tried to write is remembered in the configuration.
|
||||||
value = bool(value)
|
value = bool(value)
|
||||||
self._value[str(key)] = value
|
self._value[str(key)] = value
|
||||||
if self._device.persister:
|
if self.persist and self._device.persister:
|
||||||
self._device.persister[self.name] = self._value
|
self._device.persister[self.name] = self._value
|
||||||
|
|
||||||
data_bytes = self._validator.prepare_write(self._value)
|
data_bytes = self._validator.prepare_write(self._value)
|
||||||
|
|
Loading…
Reference in New Issue