oop/2026-04-29/morsecode/morsedecode.py (view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
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
|