import json import wifi import ubinascii import machine class Settings(dict): SETTINGS_FILE = "/settings.json" def __init__(self): super().__init__() self.load() # Load settings from file during initialization self.color_order = self.get_color_order(self["color_order"]) def set_defaults(self): self["led_pin"] = 10 self["num_leds"] = 50 self["pattern"] = "on" self["color1"] = "#00ff00" self["color2"] = "#ff0000" self["delay"] = 100 self["brightness"] = 10 self["color_order"] = "rgb" self["name"] = f"led-{ubinascii.hexlify(wifi.get_mac()).decode()}" self["ap_password"] = "" self["id"] = 0 self["debug"] = False def save(self): try: j = json.dumps(self) with open(self.SETTINGS_FILE, 'w') as file: file.write(j) print("Settings saved successfully.") except Exception as e: print(f"Error saving settings: {e}") def load(self): try: with open(self.SETTINGS_FILE, 'r') as file: loaded_settings = json.load(file) self.update(loaded_settings) print("Settings loaded successfully.") except Exception as e: print(f"Error loading settings") self.set_defaults() self.save() async def set_settings(self, data, patterns, save): try: print(f"Setting settings: {data}") for key, value in data.items(): print(key, value) if key == "colors": buff = [] for color in value: buff.append(tuple(int(color[i:i+2], 16) for i in self.color_order)) patterns.colors = buff elif key == "num_leds": patterns.update_num_leds(self["led_pin"], value) elif key == "pattern": if not patterns.select(value): return "Pattern doesn't exist", 400 await patterns.run() elif key == "delay": delay = int(data["delay"]) patterns.delay = delay elif key == "brightness": brightness = int(data["brightness"]) patterns.brightness = brightness elif key == "n1": patterns.n1 = value elif key == "n2": patterns.n2 = value elif key == "n3": patterns.n3 = value elif key == "n4": patterns.n4 = value elif key == "n5": patterns.n5 = value elif key == "n6": patterns.n6 = value elif key == "name": self[key] = value self.save() machine.reset() elif key == "color_order": self["color_order"] = value self.color_order = self.get_color_order(value) pass elif key == "id": pass elif key == "led_pin": patterns.update_num_leds(value, self["num_leds"]) else: return "Invalid key", 400 self[key] = value #print(self) if save: self.save() print(self) return "OK", 200 except (KeyError, ValueError): return "Bad request", 400 def get_color_order(self, color_order): """Convert color order string to tuple of hex string indices.""" color_orders = { "rgb": (1, 3, 5), "rbg": (1, 5, 3), "grb": (3, 1, 5), "gbr": (3, 5, 1), "brg": (5, 1, 3), "bgr": (5, 3, 1) } return color_orders.get(color_order.lower(), (1, 3, 5)) # Default to RGB # Example usage def main(): settings = Settings() print(f"Number of LEDs: {settings['num_leds']}") settings['num_leds'] = 100 print(f"Updated number of LEDs: {settings['num_leds']}") settings.save() # Create a new Settings object to test loading new_settings = Settings() print(f"Loaded number of LEDs: {new_settings['num_leds']}") print(settings) # Run the example if __name__ == "__main__": main()