فهرست منبع

fix connection effects

tuanchris 3 ماه پیش
والد
کامیت
1342edff99
3فایلهای تغییر یافته به همراه93 افزوده شده و 9 حذف شده
  1. 20 7
      modules/connection/connection_manager.py
  2. 10 2
      modules/led/hyperion_controller.py
  3. 63 0
      test_hyperion_effects.py

+ 20 - 7
modules/connection/connection_manager.py

@@ -7,7 +7,7 @@ import websocket
 import asyncio
 
 from modules.core.state import state
-from modules.led.led_controller import effect_loading, effect_idle, effect_connected, LEDController
+from modules.led.led_interface import LEDInterface
 logger = logging.getLogger(__name__)
 
 IGNORE_PORTS = ['/dev/cu.debug-console', '/dev/cu.Bluetooth-Incoming-Port']
@@ -179,10 +179,22 @@ def device_init(homing=True):
 
 
 def connect_device(homing=True):
-    if state.wled_ip:
-        state.led_controller = LEDController(state.wled_ip)
-        effect_loading(state.led_controller)
-        
+    # Initialize LED interface based on configured provider
+    if state.led_provider == "wled" and state.wled_ip:
+        state.led_controller = LEDInterface(provider="wled", ip_address=state.wled_ip)
+    elif state.led_provider == "hyperion" and state.hyperion_ip:
+        state.led_controller = LEDInterface(
+            provider="hyperion",
+            ip_address=state.hyperion_ip,
+            port=state.hyperion_port
+        )
+    else:
+        state.led_controller = None
+
+    # Show loading effect
+    if state.led_controller:
+        state.led_controller.effect_loading()
+
     ports = list_serial_ports()
 
     if state.port and state.port in ports:
@@ -194,9 +206,10 @@ def connect_device(homing=True):
         # state.conn = WebSocketConnection('ws://fluidnc.local:81')
     if (state.conn.is_connected() if state.conn else False):
         device_init(homing)
-        
+
+    # Show connected effect
     if state.led_controller:
-        effect_connected(state.led_controller)
+        state.led_controller.effect_connected()
 
 def get_status_response() -> str:
     """

+ 10 - 2
modules/led/hyperion_controller.py

@@ -195,12 +195,14 @@ class HyperionController:
 
 
 def effect_loading(hyperion_controller: HyperionController) -> bool:
-    """Show loading effect - orange color (24 hour duration)"""
+    """Show loading effect - Atomic swirl effect"""
     # Turn on Hyperion first
     hyperion_controller.set_power(1)
+    time.sleep(0.2)  # Give Hyperion time to power on
     # Clear priority before setting new effect
     hyperion_controller.clear_priority()
-    res = hyperion_controller.set_color(r=255, g=160, b=0, duration=86400000)
+    time.sleep(0.1)  # Give Hyperion time to clear
+    res = hyperion_controller.set_effect("Atomic swirl")
     return res.get('connected', False)
 
 
@@ -208,9 +210,11 @@ def effect_idle(hyperion_controller: HyperionController, effect_name: str = None
     """Show idle effect - use configured effect or clear priority to return to default"""
     # Turn on Hyperion first
     hyperion_controller.set_power(1)
+    time.sleep(0.2)  # Give Hyperion time to power on
     # Clear priority before setting new effect
     hyperion_controller.clear_priority()
     if effect_name:
+        time.sleep(0.1)  # Give Hyperion time to clear
         res = hyperion_controller.set_effect(effect_name)
     else:
         # Already cleared above
@@ -222,8 +226,10 @@ def effect_connected(hyperion_controller: HyperionController) -> bool:
     """Show connected effect - green flash"""
     # Turn on Hyperion first
     hyperion_controller.set_power(1)
+    time.sleep(0.2)  # Give Hyperion time to power on
     # Clear priority before setting new effect
     hyperion_controller.clear_priority()
+    time.sleep(0.1)  # Give Hyperion time to clear
     # Flash green twice with explicit 1 second durations
     res = hyperion_controller.set_color(r=8, g=255, b=0, duration=1000)
     time.sleep(1.2)  # Wait for flash to complete
@@ -237,9 +243,11 @@ def effect_playing(hyperion_controller: HyperionController, effect_name: str = N
     """Show playing effect - use configured effect or clear to show default"""
     # Turn on Hyperion first
     hyperion_controller.set_power(1)
+    time.sleep(0.2)  # Give Hyperion time to power on
     # Clear priority before setting new effect
     hyperion_controller.clear_priority()
     if effect_name:
+        time.sleep(0.1)  # Give Hyperion time to clear
         res = hyperion_controller.set_effect(effect_name)
     else:
         # Already cleared above - show user's configured effect/color

+ 63 - 0
test_hyperion_effects.py

@@ -0,0 +1,63 @@
+#!/usr/bin/env python3
+"""
+Test script for Hyperion loading and connected effects
+This simulates the startup sequence when LEDs are off
+"""
+
+import time
+import sys
+from modules.led.led_interface import LEDInterface
+
+# Configuration
+HYPERION_IP = "192.168.2.183"
+HYPERION_PORT = 8090
+
+def test_effects():
+    """Test Hyperion effects with LEDs off"""
+    print(f"Testing Hyperion effects at {HYPERION_IP}:{HYPERION_PORT}")
+    print("=" * 60)
+
+    # Create LED interface
+    led = LEDInterface(
+        provider="hyperion",
+        ip_address=HYPERION_IP,
+        port=HYPERION_PORT
+    )
+
+    # Test 1: Loading effect
+    print("\n1. Testing LOADING effect (orange color)...")
+    print("   - This should turn on the LEDs")
+    print("   - Clear any previous effects")
+    print("   - Show orange color")
+    result = led.effect_loading()
+    print(f"   Result: {'SUCCESS' if result else 'FAILED'}")
+
+    # Wait 5 seconds so you can see the loading effect
+    print("\n   Waiting 5 seconds...")
+    time.sleep(5)
+
+    # Test 2: Connected effect
+    print("\n2. Testing CONNECTED effect (green flash)...")
+    print("   - This should flash green twice")
+    print("   - Then return to idle state (cleared)")
+    result = led.effect_connected()
+    print(f"   Result: {'SUCCESS' if result else 'FAILED'}")
+
+    print("\n" + "=" * 60)
+    print("Test complete!")
+    print("\nDid you see:")
+    print("  1. Orange color for ~5 seconds?")
+    print("  2. Two green flashes?")
+    print("  3. LEDs return to default state after?")
+
+if __name__ == "__main__":
+    try:
+        test_effects()
+    except KeyboardInterrupt:
+        print("\n\nTest interrupted by user")
+        sys.exit(0)
+    except Exception as e:
+        print(f"\n\nERROR: {e}")
+        import traceback
+        traceback.print_exc()
+        sys.exit(1)