tuanchris 3 месяцев назад
Родитель
Сommit
ff788b943a

+ 18 - 6
main.py

@@ -105,7 +105,9 @@ async def lifespan(app: FastAPI):
                 "dw_leds",
                 num_leds=state.dw_led_num_leds,
                 gpio_pin=state.dw_led_gpio_pin,
-                brightness=state.dw_led_brightness / 100.0
+                brightness=state.dw_led_brightness / 100.0,
+                speed=state.dw_led_speed,
+                intensity=state.dw_led_intensity
             )
             logger.info(f"LED controller initialized: DW LEDs ({state.dw_led_num_leds} LEDs on GPIO{state.dw_led_gpio_pin})")
         else:
@@ -1160,7 +1162,9 @@ async def set_led_config(request: LEDConfigRequest):
             "dw_leds",
             num_leds=state.dw_led_num_leds,
             gpio_pin=state.dw_led_gpio_pin,
-            brightness=state.dw_led_brightness / 100.0
+            brightness=state.dw_led_brightness / 100.0,
+            speed=state.dw_led_speed,
+            intensity=state.dw_led_intensity
         )
         logger.info(f"DW LEDs configured: {state.dw_led_num_leds} LEDs on GPIO{state.dw_led_gpio_pin}")
 
@@ -1569,13 +1573,17 @@ async def dw_leds_speed(request: dict):
     if not state.led_controller or state.led_provider != "dw_leds":
         raise HTTPException(status_code=400, detail="DW LEDs not configured")
 
-    value = request.get("value", 128)
+    value = request.get("speed", 128)
     if not 0 <= value <= 255:
         raise HTTPException(status_code=400, detail="Speed must be between 0 and 255")
 
     try:
         controller = state.led_controller.get_controller()
-        return controller.set_speed(value)
+        result = controller.set_speed(value)
+        # Save speed to state
+        state.dw_led_speed = value
+        state.save()
+        return result
     except Exception as e:
         logger.error(f"Failed to set DW LED speed: {str(e)}")
         raise HTTPException(status_code=500, detail=str(e))
@@ -1586,13 +1594,17 @@ async def dw_leds_intensity(request: dict):
     if not state.led_controller or state.led_provider != "dw_leds":
         raise HTTPException(status_code=400, detail="DW LEDs not configured")
 
-    value = request.get("value", 128)
+    value = request.get("intensity", 128)
     if not 0 <= value <= 255:
         raise HTTPException(status_code=400, detail="Intensity must be between 0 and 255")
 
     try:
         controller = state.led_controller.get_controller()
-        return controller.set_intensity(value)
+        result = controller.set_intensity(value)
+        # Save intensity to state
+        state.dw_led_intensity = value
+        state.save()
+        return result
     except Exception as e:
         logger.error(f"Failed to set DW LED intensity: {str(e)}")
         raise HTTPException(status_code=500, detail=str(e))

+ 6 - 0
modules/core/state.py

@@ -47,6 +47,8 @@ class AppState:
         self.dw_led_num_leds = 60  # Number of LEDs in strip
         self.dw_led_gpio_pin = 12  # GPIO pin (12, 13, 18, or 19)
         self.dw_led_brightness = 35  # Brightness 0-100
+        self.dw_led_speed = 128  # Effect speed 0-255
+        self.dw_led_intensity = 128  # Effect intensity 0-255
         self.dw_led_idle_effect = "off"  # Effect to show when idle
         self.dw_led_playing_effect = "off"  # Effect to show when playing
         self.skip_requested = False
@@ -202,6 +204,8 @@ class AppState:
             "dw_led_num_leds": self.dw_led_num_leds,
             "dw_led_gpio_pin": self.dw_led_gpio_pin,
             "dw_led_brightness": self.dw_led_brightness,
+            "dw_led_speed": self.dw_led_speed,
+            "dw_led_intensity": self.dw_led_intensity,
             "dw_led_idle_effect": self.dw_led_idle_effect,
             "dw_led_playing_effect": self.dw_led_playing_effect,
             "app_name": self.app_name,
@@ -247,6 +251,8 @@ class AppState:
         self.dw_led_num_leds = data.get('dw_led_num_leds', 60)
         self.dw_led_gpio_pin = data.get('dw_led_gpio_pin', 12)
         self.dw_led_brightness = data.get('dw_led_brightness', 35)
+        self.dw_led_speed = data.get('dw_led_speed', 128)
+        self.dw_led_intensity = data.get('dw_led_intensity', 128)
         self.dw_led_idle_effect = data.get('dw_led_idle_effect', "off")
         self.dw_led_playing_effect = data.get('dw_led_playing_effect', "off")
         self.app_name = data.get("app_name", "Dune Weaver")

+ 9 - 3
modules/led/dw_led_controller.py

@@ -18,7 +18,7 @@ class DWLEDController:
     """Dune Weaver LED Controller for NeoPixel LED strips"""
 
     def __init__(self, num_leds: int = 60, gpio_pin: int = 12, brightness: float = 0.35,
-                 pixel_order: str = "GRB"):
+                 pixel_order: str = "GRB", speed: int = 128, intensity: int = 128):
         """
         Initialize Dune Weaver LED controller
 
@@ -27,6 +27,8 @@ class DWLEDController:
             gpio_pin: GPIO pin number (BCM numbering: 12, 13, 18, or 19)
             brightness: Global brightness (0.0 - 1.0)
             pixel_order: Pixel color order (GRB, RGB, RGBW, GRBW)
+            speed: Effect speed 0-255 (default: 128)
+            intensity: Effect intensity 0-255 (default: 128)
         """
         self.num_leds = num_leds
         self.gpio_pin = gpio_pin
@@ -37,8 +39,8 @@ class DWLEDController:
         self._powered_on = False
         self._current_effect_id = 0
         self._current_palette_id = 0
-        self._speed = 128
-        self._intensity = 128
+        self._speed = speed
+        self._intensity = intensity
         self._color1 = (255, 0, 0)  # Red
         self._color2 = (0, 0, 255)  # Blue
         self._color3 = (0, 255, 0)  # Green
@@ -361,6 +363,8 @@ class DWLEDController:
             self._speed = speed
             if self._segment:
                 self._segment.speed = speed
+                # Reset effect state so speed change takes effect immediately
+                self._segment.reset()
 
         return {
             "connected": True,
@@ -380,6 +384,8 @@ class DWLEDController:
             self._intensity = intensity
             if self._segment:
                 self._segment.intensity = intensity
+                # Reset effect state so intensity change takes effect immediately
+                self._segment.reset()
 
         return {
             "connected": True,

+ 2 - 2
modules/led/dw_leds/effects/basic_effects.py

@@ -311,8 +311,8 @@ EFFECTS = {
     4: ("Fade", mode_fade),
     5: ("Scan", mode_scan),
     6: ("Dual Scan", mode_dual_scan),
-    7: ("Rainbow", mode_rainbow),
-    8: ("Rainbow Cycle", mode_rainbow_cycle),
+    7: ("Rainbow Cycle", mode_rainbow),
+    8: ("Rainbow", mode_rainbow_cycle),
     9: ("Theater Chase", mode_theater_chase),
     10: ("Running Lights", mode_running_lights),
     11: ("Random Color", mode_random_color),

+ 10 - 4
modules/led/led_interface.py

@@ -17,7 +17,8 @@ class LEDInterface:
     """
 
     def __init__(self, provider: LEDProviderType = "none", ip_address: Optional[str] = None,
-                 num_leds: Optional[int] = None, gpio_pin: Optional[int] = None, brightness: Optional[float] = None):
+                 num_leds: Optional[int] = None, gpio_pin: Optional[int] = None, brightness: Optional[float] = None,
+                 speed: Optional[int] = None, intensity: Optional[int] = None):
         self.provider = provider
         self._controller = None
 
@@ -28,7 +29,9 @@ class LEDInterface:
             num_leds = num_leds or 60
             gpio_pin = gpio_pin or 12
             brightness = brightness if brightness is not None else 0.35
-            self._controller = DWLEDController(num_leds, gpio_pin, brightness)
+            speed = speed if speed is not None else 128
+            intensity = intensity if intensity is not None else 128
+            self._controller = DWLEDController(num_leds, gpio_pin, brightness, speed=speed, intensity=intensity)
 
     @property
     def is_configured(self) -> bool:
@@ -36,7 +39,8 @@ class LEDInterface:
         return self._controller is not None
 
     def update_config(self, provider: LEDProviderType, ip_address: Optional[str] = None,
-                     num_leds: Optional[int] = None, gpio_pin: Optional[int] = None, brightness: Optional[float] = None):
+                     num_leds: Optional[int] = None, gpio_pin: Optional[int] = None, brightness: Optional[float] = None,
+                     speed: Optional[int] = None, intensity: Optional[int] = None):
         """Update LED provider configuration"""
         self.provider = provider
 
@@ -53,7 +57,9 @@ class LEDInterface:
             num_leds = num_leds or 60
             gpio_pin = gpio_pin or 12
             brightness = brightness if brightness is not None else 0.35
-            self._controller = DWLEDController(num_leds, gpio_pin, brightness)
+            speed = speed if speed is not None else 128
+            intensity = intensity if intensity is not None else 128
+            self._controller = DWLEDController(num_leds, gpio_pin, brightness, speed=speed, intensity=intensity)
         else:
             self._controller = None