index — ti25-glauchau-code @ master

Meine Lösungen (oder auch nicht) für die Programmieraufgaben in der TI25 an der Staatlichen Studienakademie Glauchau

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