import serial
from window import Win
import serial.tools.list_ports

# Initialisation de la fenêtre principale
win = Win()

def list_com_ports():
    """Liste les ports COM connectés avec un fabricant STMicroelectronics."""
    # Récupération de tous les ports COM disponibles
    lst_ports = serial.tools.list_ports.comports()
    lst_stm32_ports = []
    for port in lst_ports:
        # Filtrer les ports dont le fabricant est STMicroelectronics
        if "STMicroelectronics" == port.manufacturer:
            lst_stm32_ports.append(port.device)

    return lst_stm32_ports

# Variables globales avec préfixe approprié
lst_tram = [0, 0]  # Liste d'entiers pour stocker les trames
int_taille_echantillon = win.int_taille_echantillon  # Taille de l'échantillon définie par la fenêtre graphique

try:
    while True:
        try:
            # Initialisation de la communication série avec le premier port trouvé
            ser = serial.Serial((list_com_ports())[0], 921600)
        except:
            pass

        # Vérifier si le processus de traitement doit démarrer
        if win.bool_start_and_stop:
            if win.bool_emul:
                # Générer des données simulées
                str_data = win.gen_data()
            else:
                # Lire les données depuis le port série
                str_data = ser.read(4 * int_taille_echantillon).hex()

            if str_data != "":
                # Afficher les données reçues pour débogage
                print(str_data)
                # Synchronisation des données en recherchant les marqueurs "ab" et "cd"
                while str_data[:2] != "ab" and str_data[12:14] != "cd":
                    str_data = str_data[1:]

                # Initialiser les valeurs maximales
                lst_maxi = [0, 0]
                for int_index in range(2, (int_taille_echantillon - 1) * 8, 8):
                    try:
                        # Calcul des valeurs maximales pour chaque canal
                        lst_maxi = [
                            max(lst_maxi[0], int(str_data[int_index:int_index + 2], 16)),
                            max(lst_maxi[1], int(str_data[int_index + 4:int_index + 6], 16))
                        ]
                    except ValueError as e:
                        # Gestion des erreurs lors de l'analyse des données
                        print(f"Erreur lors de l'analyse des données : {e}")

                # Mise à jour de l'interface avec les nouvelles valeurs
                win.change_all_val_and_update(lst_maxi[0], lst_maxi[1])

        # Mise à jour des tâches et de l'interface Tkinter
        win.win.update_idletasks()
        win.win.update()
except KeyboardInterrupt:
    ser.close()