diff --git a/roles/driver-msi-keyboard-color/files/keyboard_color.py b/roles/driver-msi-keyboard-color/files/keyboard_color.py index d298fbfe..380caafa 100644 --- a/roles/driver-msi-keyboard-color/files/keyboard_color.py +++ b/roles/driver-msi-keyboard-color/files/keyboard_color.py @@ -3,20 +3,74 @@ import datetime import subprocess def hex_to_rgb(hex_color): + """Konvertiert Hex-Farbe in RGB-Tupel.""" return tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4)) def calculate_color(start_color, end_color, ratio): + """Berechnet interpolierte Farbe zwischen zwei Farben basierend auf Übergangsverhältnis.""" start_rgb = hex_to_rgb(start_color) end_rgb = hex_to_rgb(end_color) current_rgb = [round(start + (end - start) * ratio) for start, end in zip(start_rgb, end_rgb)] return ''.join(f"{value:02x}" for value in current_rgb) -def get_time_period(current_time, color_times): - for period_start, colors in sorted(color_times.items()): - period_start_time = datetime.datetime.strptime(period_start, "%H:%M").time() +def get_current_period(current_time, color_times): + """ + Ermittelt die aktuelle Zeitperiode und gibt die zugehörigen Farben zurück. + + Args: + current_time (datetime.time): Die aktuelle Uhrzeit. + color_times (dict): Ein Wörterbuch, das Zeitperioden (als String im Format 'HH:MM') + mit Farbpaaren verbindet. + + Returns: + tuple: Ein Tupel der Start- und Endfarbe (als Hex-Codes) für die aktuelle Periode. + """ + # Liste der Zeitperioden sortieren + sorted_periods = sorted(color_times.items()) + + # Über die sortierten Perioden iterieren, um die aktuelle Periode zu finden + for i, (period_start_str, colors) in enumerate(sorted_periods): + period_start_time = datetime.datetime.strptime(period_start_str, "%H:%M").time() + + # Wenn die aktuelle Zeit vor dem Beginn der nächsten Periode liegt if current_time < period_start_time: - return colors - return next(iter(color_times.values())) # Fallback to first item if no match + # Wenn wir uns in der ersten Periode befinden, ist die vorherige Periode die letzte des Tages + previous_period_index = i - 1 if i > 0 else -1 + return sorted_periods[previous_period_index][1] + + # Falls die aktuelle Zeit nach der letzten definierten Periode liegt, + # verwende die Farben der ersten Periode als Standard + return sorted_periods[0][1] + +def calculate_transition_ratio(current_time, start_time, end_time): + """ + Berechnet das Übergangsverhältnis für eine Farbtransition. + + Args: + current_time (datetime.time): Die aktuelle Uhrzeit. + start_time (datetime.time): Die Startzeit der aktuellen Farbperiode. + end_time (datetime.time): Die Endzeit der aktuellen Farbperiode. + + Returns: + float: Das Übergangsverhältnis zwischen 0 und 1. + """ + # Aktuelles Datum für die Zeitstempelberechnung verwenden + today = datetime.datetime.now().date() + + # Zeitstempel für den Beginn und das Ende der aktuellen Periode berechnen + start_timestamp = datetime.datetime.combine(today, start_time).timestamp() + end_timestamp = datetime.datetime.combine(today, end_time).timestamp() + + # Aktuellen Zeitstempel berechnen + current_timestamp = datetime.datetime.combine(today, current_time).timestamp() + + # Übergangsverhältnis berechnen + transition_duration = end_timestamp - start_timestamp + time_since_start = current_timestamp - start_timestamp + + # Verhältnis als Anteil der vergangenen Zeit an der gesamten Übergangsdauer + return time_since_start / transition_duration + def main(vendor_and_product_id): color_times = { @@ -33,9 +87,12 @@ def main(vendor_and_product_id): } current_time = datetime.datetime.now().time() - start_color, end_color = get_time_period(current_time, color_times) + start_color, end_color = get_current_period(current_time, color_times) - transition_ratio = (current_timestamp - start_timestamp) / (end_timestamp - start_timestamp) + next_time = list(color_times.keys())[0] + next_start_time_obj = datetime.datetime.strptime(next_time, "%H:%M").time() + + transition_ratio = calculate_transition_ratio(current_time, start_color, next_start_time_obj) current_color = calculate_color(start_color, end_color, transition_ratio) print(f"Changing keyboard color to #{current_color}.") @@ -43,7 +100,7 @@ def main(vendor_and_product_id): subprocess.run(["msi-perkeyrgb", "--model", "GS65", "-s", current_color, "--id", vendor_and_product_id], check=True) except subprocess.CalledProcessError as e: print(f"Error setting keyboard color: {e}") - exit(1) + sys.exit(1) if __name__ == "__main__": if len(sys.argv) < 2: @@ -52,4 +109,4 @@ if __name__ == "__main__": sys.exit(1) vendor_and_product_id = sys.argv[1] - main(vendor_and_product_id) + main(vendor_and_product_id) \ No newline at end of file