diff --git a/src/main.py b/src/main.py index e37e545..c059916 100644 --- a/src/main.py +++ b/src/main.py @@ -11,7 +11,7 @@ settings = Settings() print(settings) presets = Presets(settings["led_pin"], settings["num_leds"]) -presets.load() +presets.load(settings) presets.b = settings.get("brightness", 255) # Use the default preset name from settings (set via controller or defaults) default_preset = settings.get("default") diff --git a/src/presets.py b/src/presets.py index 338fb5c..56ce690 100644 --- a/src/presets.py +++ b/src/presets.py @@ -2,6 +2,7 @@ from machine import Pin from neopixel import NeoPixel from preset import Preset from patterns import Blink, Rainbow, Pulse, Transition, Chase, Circle +from utils import convert_and_reorder_colors import json @@ -35,8 +36,13 @@ class Presets: json.dump({name: preset.to_dict() for name, preset in self.presets.items()}, f) return True - def load(self): - """Load presets from a file.""" + def load(self, settings=None): + """Load presets from a file. + + `settings` is used to convert hex strings in `c` to RGB tuples and apply + the device's colour order (same as ESPNow receive). If omitted, RGB order + is assumed. + """ try: with open("presets.json", "r") as f: data = json.load(f) @@ -46,10 +52,13 @@ class Presets: self.save() return True + order = settings if settings is not None else "rgb" self.presets = {} for name, preset_data in data.items(): if "c" in preset_data: - preset_data["c"] = [tuple(color) for color in preset_data["c"]] + preset_data["c"] = convert_and_reorder_colors( + preset_data["c"], order + ) self.presets[name] = Preset(preset_data) if self.presets: print("Loaded presets:") diff --git a/src/utils.py b/src/utils.py index a7aa08d..a2a924e 100644 --- a/src/utils.py +++ b/src/utils.py @@ -43,8 +43,8 @@ def convert_and_reorder_colors(colors, settings_or_color_order): reordered = (rgb[channel_order[0]], rgb[channel_order[1]], rgb[channel_order[2]]) converted_colors.append(reordered) elif isinstance(color, (list, tuple)) and len(color) == 3: - # Already a tuple/list, just reorder - rgb = tuple(color) + # Already a tuple/list, just reorder (JSON may use string numbers) + rgb = tuple(int(x) for x in color) reordered = (rgb[channel_order[0]], rgb[channel_order[1]], rgb[channel_order[2]]) converted_colors.append(reordered) else: diff --git a/test/test_espnow_receive.py b/test/test_espnow_receive.py index 6e05e91..10af390 100644 --- a/test/test_espnow_receive.py +++ b/test/test_espnow_receive.py @@ -644,7 +644,7 @@ def test_preset_save_load(): assert patterns.save(), "Save should return True" reloaded = Presets(settings["led_pin"], settings["num_leds"]) - assert reloaded.load(), "Load should return True" + assert reloaded.load(settings), "Load should return True" preset = reloaded.presets.get("saved_preset") assert preset is not None, "Preset should be loaded"