"""
Audio  ➜  tekst  ➜  6-bits Braille-codes  ➜  serial naar Arduino
---------------------------------------------------------------
• Google Speech-to-Text (internetverbinding vereist)
• Seriële framing:
      - Elke letter  : ASCII-string met een decimale waarde 0-63 + '\n'
      - Woordscheiding: string 'S' + '\n'
"""

import speech_recognition as sr
import serial
import time

# === AANPASBARE PARAMETERS ===
SERIAL_PORT     = 'COM5'   # <-- pas aan aan jouw systeem
BAUDRATE        = 9600
LETTER_PAUSE    = 1     # s – kleine pauze na elke letter
WORD_PAUSE      = 2     # s – langere pauze na een spatie

# 6-bits Braille-mapping (dot-nummering 1-6  = bits 0-5)
BRAILLE = {
    'a': 0b000001,
    'b': 0b000011,
    'c': 0b000101,
    'd': 0b011001,
    'e': 0b010001,
    'f': 0b001011,
    'g': 0b011011,
    'h': 0b010011,
    'i': 0b001010,
    'j': 0b011010,
    'k': 0b000101,
    'l': 0b000111,
    'm': 0b001101,
    'n': 0b011101,
    'o': 0b010101,
    'p': 0b001111,
    'q': 0b011111,
    'r': 0b010111,
    's': 0b001110,
    't': 0b011110,
    'u': 0b100101,
    'v': 0b110111,
    'w': 0b111010,
    'x': 0b101101,
    'y': 0b111101,
    'z': 0b110111,
    # cijfers 0–9 = a–j
    '1': 0b000001, '2': 0b000011, '3': 0b000101, '4': 0b000111, '5': 0b000110,
    '6': 0b001101, '7': 0b001111, '8': 0b001110, '9': 0b001011, '0': 0b001010,
    # leestekens kun je eventueel later toevoegen
}


def speak_to_text() -> str:
    """Luister één zin en geef de herkende tekst terug."""
    r = sr.Recognizer()
    with sr.Microphone() as source:
        print("📢  Spreek nu ...")
        audio = r.listen(source)
    try:
        text = r.recognize_google(audio, language='en-US')  # pas taal aan indien nodig
        print(f"📝  Herkend:  {text}")
        return text
    except sr.UnknownValueError:
        print("😕  Niet verstaan.")
        return ""
    except sr.RequestError as e:
        print(f"❌  STT-fout: {e}")
        return ""

def char_to_pattern(c: str):
    """Geef 0-63 terug voor bekende tekens of None indien onbekend."""
    return BRAILLE.get(c.lower())

def main():
    ser = serial.Serial(SERIAL_PORT, BAUDRATE)
    time.sleep(2)        # Arduino reset-tijd
    print("🔗  Seriële verbinding geopend.")

    while True:
        sentence = speak_to_text()
        if not sentence:
            continue

        for word in sentence.split():
            for ch in word:
                pattern = char_to_pattern(ch)
                if pattern is None:
                    continue           # onbekend teken → overslaan
                ser.write(f"{pattern}\n".encode())
                time.sleep(LETTER_PAUSE)

            # woordscheiding
            ser.write(b"S\n")
            time.sleep(WORD_PAUSE)

if _name_ == "_main_":
    main()