Initial commit

This commit is contained in:
UDPSendToFailed
2023-12-24 21:16:48 +01:00
parent 80024d0d55
commit 72580e2d8d
4 changed files with 672 additions and 0 deletions

116
led_controller_openrgb.py Normal file
View File

@@ -0,0 +1,116 @@
import atexit
import math
import time
import logging
from PyQt6.QtCore import QThread, pyqtSignal, QTimer, QObject
from PyQt6.QtGui import QColor
from PyQt6.QtWidgets import QMessageBox
from openrgb import OpenRGBClient
from openrgb.utils import RGBColor
class LEDController(QThread):
captureSignal = pyqtSignal()
def __init__(self, main_window):
super().__init__()
self.main = main_window
self.enabled = True
self.client = self.connect_to_openrgb()
if not self.client:
QMessageBox.warning(None, "OpenRGB Connection Error",
"OpenRGB is required for LED control. "
"Please ensure OpenRGB is running and SDK Server is enabled.")
self.enabled = False
return
self.last_rgb_colors = [RGBColor(0, 0, 0)] * 24
self.worker = LEDWorker(self.client, self.last_rgb_colors, self)
self.started.connect(self.worker.set_colors)
QTimer.singleShot(0, self.start_timer)
atexit.register(self.stop_led)
def connect_to_openrgb(self):
for attempt in range(2):
try:
return OpenRGBClient()
except Exception as e:
if attempt == 0:
logging.warning("Retrying after 5 seconds...")
time.sleep(5)
return None
def start_timer(self):
self.update_led_timer = QTimer()
self.update_led_timer.timeout.connect(self.analyze_and_set_colors)
self.update_led_timer.start(100)
def analyze_and_set_colors(self, width=479, height=479, smoothing_factor=0.25, saturation_factor=1.25):
if not self.enabled:
return
try:
image = self.main.capture_container()
radius = min(width, height) // 2
for i in range(24):
angle = 2 * math.pi * (23 - i) / 24
x = width - int(width / 2 + radius * math.cos(angle))
y = int(height / 2 + radius * math.sin(angle))
color = QColor(image.pixel(x, y))
color = color.toHsv()
color.setHsv(color.hue(), min(255, int(color.saturation() * saturation_factor)), color.value())
rgb_color = RGBColor(color.red(), color.green(), color.blue())
self.last_rgb_colors[i] = RGBColor(
int(self.last_rgb_colors[i].red * (
1 - smoothing_factor) + rgb_color.red * smoothing_factor),
int(self.last_rgb_colors[i].green * (
1 - smoothing_factor) + rgb_color.green * smoothing_factor),
int(self.last_rgb_colors[i].blue * (
1 - smoothing_factor) + rgb_color.blue * smoothing_factor)
)
self.started.emit()
except Exception as e:
logging.error(f"Error updating LED: {e}")
def stop_led(self):
self.enabled = False
self.update_led_timer.stop()
self.worker.turn_off_leds()
class LEDWorker(QObject):
colorReady = pyqtSignal(object)
def __init__(self, client, last_rgb_colors, controller):
super().__init__()
self.client = client
self.last_rgb_colors = last_rgb_colors
self.controller = controller
def set_colors(self):
if not self.controller.enabled:
return
try:
for device in self.client.ee_devices:
if device.name == "Corsair Commander Core":
pump_zone = next(zone for zone in device.zones if zone.name == "Pump")
for i, rgb_color in enumerate(self.last_rgb_colors):
pump_zone.leds[i].set_color(rgb_color, fast=True)
except Exception as e:
logging.error(f"Error setting colors: {e}")
def turn_off_leds(self):
time.sleep(0.1)
for device in self.client.ee_devices:
if device.name == "Corsair Commander Core":
device.clear()