import time # Modul für Zeitmessung (hier: monotonic für stabile Zeitdifferenzen) # Wörterbuch zur Übersetzung von Morsecode in Buchstaben MORSE = { '.-': 'A', '-...': 'B', '-.-.': 'C', '-..': 'D', '.': 'E', '..-.': 'F', '--.': 'G', '....': 'H', '..': 'I', '.---': 'J', '-.-': 'K', '.-..': 'L', '--': 'M', '-.': 'N', '---': 'O', '.--.': 'P', '--.-': 'Q', '.-.': 'R', '...': 'S', '-': 'T', '..-': 'U', '...-': 'V', '.--': 'W', '-..-': 'X', '-.--': 'Y', '--..': 'Z' } class MorseDecoder: def __init__(self, unit=0.1): # Basis-Zeiteinheit für Morsecode (z.B. Länge eines "Dots") self.unit = unit # Aktuell aufgebauter Morsecode (z.B. ".-") self.code = '' # Zeitpunkt, wann das Signal eingeschaltet wurde self.press_start = None # Zeitpunkt, wann das Signal ausgeschaltet wurde self.pause_start = None def signal_on(self): # Wird aufgerufen, wenn ein Signal beginnt (Taste gedrückt) self.press_start = time.monotonic() # Falls vorher eine Pause war, deren Länge auswerten if self.pause_start is not None: pause = time.monotonic() - self.pause_start self.pause_start = None # Lange Pause → Wortende (7 Einheiten) if pause >= 7 * self.unit: letter = self.flush() # aktuellen Buchstaben abschließen return (letter or '') + ' ' # zusätzlich Leerzeichen für Wort # Mittlere Pause → Buchstabenende (3 Einheiten) if pause >= 3 * self.unit: return self.flush() # Buchstaben zurückgeben return None def signal_off(self): # Wird aufgerufen, wenn das Signal endet (Taste losgelassen) if self.press_start is None: return None # Dauer des Signals berechnen duration = time.monotonic() - self.press_start self.press_start = None # Pause beginnt jetzt self.pause_start = time.monotonic() # Kurzes Signal → Punkt (.) if duration < 2 * self.unit: self.code += '.' else: # Langes Signal → Strich (-) self.code += '-' return None def flush(self): # Wandelt den aktuell gesammelten Morsecode in einen Buchstaben um if not self.code: return None # Übersetzung über das Dictionary, unbekannt → '?' letter = MORSE.get(self.code, '?') # Code zurücksetzen für nächsten Buchstaben self.code = '' # Direkt ausgeben (ohne Zeilenumbruch) print(letter, end='', flush=True) return letter