import sys
import tty
import termios
import serial
import select

def main():
    port = '/dev/ttyUSB0'
    baud = 115200
    
    try:
        # Ouverture sans DTR/RTS pour éviter de reset l'ESP32 à chaque fois (si possible)
        ser = serial.Serial(port, baud, timeout=0.01)
        ser.dtr = False
        ser.rts = False
    except Exception as e:
        print(f"Erreur d'ouverture du port {port}: {e}")
        print("Assurez-vous que le CYD est branché et que vous avez les permissions (sudo chmod 666 /dev/ttyUSB0).")
        return

    print(f"--- Terminal Hôte connecté à {port} ---")
    print("Instructions :")
    print("- Tout ce que vous tapez est envoyé au CYD.")
    print("- Le CYD affichera les caractères en Vert sur Noir.")
    print("- Appuyez sur Ctrl+C pour quitter.")
    print("---------------------------------------")

    # Sauvegarde des paramètres du terminal hôte
    fd = sys.stdin.fileno()
    old_settings = termios.tcgetattr(fd)
    
    try:
        # Passage du terminal en mode "raw" (capture touche par touche)
        tty.setraw(fd)
        while True:
            # Surveillance de l'entrée clavier et de la réponse série
            rlist, _, _ = select.select([sys.stdin, ser], [], [])
            
            if sys.stdin in rlist:
                char = sys.stdin.read(1)
                
                # Gestion de la sortie propre (Ctrl+C)
                if ord(char) == 3: # ASCII 3 = Ctrl+C
                    break
                    
                # Envoi au CYD
                ser.write(char.encode('utf-8'))
                ser.flush()
                
            if ser in rlist:
                # Lecture des données renvoyées par le CYD (echo du REPL ou print)
                if ser.in_waiting > 0:
                    data = ser.read(ser.in_waiting)
                    # En mode raw, on doit convertir \n en \r\n pour l'affichage local
                    output = data.decode('utf-8', errors='ignore').replace('\n', '\r\n')
                    sys.stdout.write(output)
                    sys.stdout.flush()

    except KeyboardInterrupt:
        pass
    except Exception as e:
        # Restauration temporaire pour afficher l'erreur
        termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
        print(f"\nErreur : {e}")
    finally:
        # Restauration systématique des paramètres du terminal
        termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
        ser.close()
        print("\nSession terminée.")

if __name__ == "__main__":
    main()
