fix(driver): gate targeted default and normalize preset colours

This commit is contained in:
2026-03-22 01:47:14 +13:00
parent 8403f36a1f
commit 4b74f3ef02
2 changed files with 67 additions and 17 deletions

View File

@@ -15,7 +15,11 @@ presets.load(settings)
presets.b = settings.get("brightness", 255) presets.b = settings.get("brightness", 255)
# Use the default preset name from settings (set via controller or defaults) # Use the default preset name from settings (set via controller or defaults)
default_preset = settings.get("default") default_preset = settings.get("default")
if default_preset: if (
isinstance(default_preset, str)
and default_preset
and default_preset in presets.presets
):
presets.select(default_preset) presets.select(default_preset)
print(f"Selected startup preset: {default_preset}") print(f"Selected startup preset: {default_preset}")
@@ -35,9 +39,14 @@ while True:
wdt.feed() wdt.feed()
presets.tick() presets.tick()
if e.any(): if e.any():
try:
host, msg = e.recv() host, msg = e.recv()
print(msg)
data = json.loads(msg) data = json.loads(msg)
print(msg)
except (ValueError, TypeError):
continue
if not isinstance(data, dict):
continue
# Only handle messages with the expected version. # Only handle messages with the expected version.
if data.get("v") != "1": if data.get("v") != "1":
continue continue
@@ -53,23 +62,60 @@ while True:
last_brightness_save = now last_brightness_save = now
except (TypeError, ValueError): except (TypeError, ValueError):
pass pass
if "presets" in data: if isinstance(data.get("presets"), dict):
for id, preset_data in data["presets"].items(): for id, preset_data in data["presets"].items():
# Convert hex color strings to RGB tuples and reorder based on device color order if not isinstance(preset_data, dict):
if "c" in preset_data: continue
preset_data["c"] = convert_and_reorder_colors(preset_data["c"], settings) # Convert hex color strings to RGB tuples and reorder based on device colour order.
color_key = "c" if "c" in preset_data else ("colors" if "colors" in preset_data else None)
if color_key is not None:
try:
preset_data[color_key] = convert_and_reorder_colors(
preset_data[color_key], settings
)
except (TypeError, ValueError):
continue
presets.edit(id, preset_data) presets.edit(id, preset_data)
print(f"Edited preset {id}: {preset_data.get('name', '')}") print(f"Edited preset {id}: {preset_data.get('name', '')}")
if settings.get("name") in data.get("select", {}): if isinstance(data.get("select"), dict) and settings.get("name") in data["select"]:
select_list = data["select"][settings.get("name")] select_list = data["select"][settings.get("name")]
# Select value is always a list: ["preset_name"] or ["preset_name", step] # Select value is always a list: ["preset_name"] or ["preset_name", step]
if select_list: if isinstance(select_list, list) and select_list:
preset_name = select_list[0] preset_name = select_list[0]
step = select_list[1] if len(select_list) > 1 else None step = select_list[1] if len(select_list) > 1 else None
if isinstance(preset_name, str):
presets.select(preset_name, step=step) presets.select(preset_name, step=step)
if "default" in data: if "default" in data:
settings["default"] = data["default"] default_name = data["default"]
print(f"Set startup preset to: {data['default']}") this_device_name = settings.get("name")
this_device_name_norm = (
this_device_name.strip().lower()
if isinstance(this_device_name, str)
else None
)
should_apply_default = True
if "targets" in data:
# When targets are present, default must only apply to named targets.
should_apply_default = False
targets = data.get("targets")
if isinstance(targets, list) and this_device_name_norm:
normalized_targets = [
target.strip().lower()
for target in targets
if isinstance(target, str) and target.strip()
]
should_apply_default = this_device_name_norm in normalized_targets
if not should_apply_default:
print("Ignored default: device not in targets")
if (
should_apply_default
and
isinstance(default_name, str)
and default_name
and default_name in presets.presets
):
settings["default"] = default_name
print(f"Set startup preset to: {default_name}")
settings.save() settings.save()
if "save" in data: if "save" in data:
presets.save() presets.save()

View File

@@ -55,9 +55,10 @@ class Presets:
order = settings if settings is not None else "rgb" order = settings if settings is not None else "rgb"
self.presets = {} self.presets = {}
for name, preset_data in data.items(): for name, preset_data in data.items():
if "c" in preset_data: color_key = "c" if "c" in preset_data else ("colors" if "colors" in preset_data else None)
preset_data["c"] = convert_and_reorder_colors( if color_key is not None:
preset_data["c"], order preset_data[color_key] = convert_and_reorder_colors(
preset_data[color_key], order
) )
self.presets[name] = Preset(preset_data) self.presets[name] = Preset(preset_data)
if self.presets: if self.presets:
@@ -89,6 +90,9 @@ class Presets:
next(self.generator) next(self.generator)
except StopIteration: except StopIteration:
self.generator = None self.generator = None
except Exception as e:
print(f"Error in tick: {e}")
self.generator = None
def select(self, preset_name, step=None): def select(self, preset_name, step=None):
# Auto-create simple built-in presets for common names on first use # Auto-create simple built-in presets for common names on first use