135 lines
4.4 KiB
Python
135 lines
4.4 KiB
Python
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()
|