import serial import numpy as np import os import time import bin.functions as fc import bin.data as data import bin.figures as fig #Variables principales parameters_path = os.path.abspath(os.path.dirname(__file__)) + "/parameters.txt" data_nb = 10 captors_path = os.path.abspath(os.path.dirname(__file__)) + "/captors.txt" serial_path = fc.read_line_file(parameters_path) #si '\n' a l'interieur du lien, peut ne pas fonctionner, donc a enlever bad_path_enter_place = serial_path.find("\n") if(bad_path_enter_place > 0): serial_path = serial_path[0:bad_path_enter_place]+serial_path[bad_path_enter_place+2:] #Variables cachees flag_data = False data_buff_max = 10 data_buff_nb = 0 data_buff = "" pressed_key = '' flag_erreur_serial = -1 flag_afficher_menu = 1 flag_enregistrer = 2 flag_afficher_ss_menu = 3 flag_choix_menu_principal = 4 flag_choix_ss_menu = 5 flag_init_arduino = 6 flag_state = 6 # etat initialisation, puis etat neutre (1) #Programme principal #init try: arduino_ser = serial.Serial(serial_path, 9600) #communication avec Arduino except serial.serialutil.SerialException: print("SerialException : la carte Arduino n'est pas connectee ou est connectee sur au autre port (actuel : "+ serial_path+").") flag_state = flag_erreur_serial exit() else: arduino_data = data.Arduino_data() arduino_data.add_captors_from_file(captors_path) print("\nPoDoCor a initialisé la communication avec l'Arduino.") while(flag_state > 0): if(flag_state == flag_init_arduino): #initialisation de l'arduino print("\nInitialisation des capteurs Arduino, veuillez patienter.") arduino_ser.flushInput() arduino_ser.write(bytes('0','utf-8')) time.sleep(5) test = arduino_ser.readline() print("Initialisation terminée, enregistrement possible.") flag_state = flag_afficher_menu arduino_ser.flushInput() if(flag_state == flag_afficher_menu): #afficher le menu print("_________________________________\n\nMAJ + P : Enregistrement des donnees\nMAJ + N : Gerer les capteurs\nMAJ + X : Arrêt du programme (ne fonctionne pas pendant l'enregistrement)\n_________________________________\n") time.sleep(2) # attente de la bonne communication avec Arduino flag_state = flag_choix_menu_principal elif(flag_state == flag_choix_menu_principal): # appui clavier pour les choix du menu principal flag_state = fc.press_key('XPN', [0, flag_enregistrer, flag_afficher_ss_menu], flag_state) #detection de touche pressee (demarrage procedure acquisition) elif(flag_state == flag_afficher_ss_menu): # afficher le ss-menu capteurs print(" _________________________________\n MAJ + U : Lister les capteurs\n MAJ + A : Ajouter un capteur\n MAJ + E : Supprimer un capteur\n MAJ + T : Changer l'ordre des capteurs\n MAJ + Q : Menu principal\n _________________________________\n") flag_state = flag_choix_ss_menu elif(flag_state == flag_choix_ss_menu): # appui clavier pour les choix du ss-enu capteurs flag_state = fc.press_key('AETUQ', [31, 32, 33, 34, flag_afficher_menu], flag_state) #detection de touche pressee (demarrage procedure acquisition) if(flag_state == 31): arduino_data.add_captor_manually(captors_path) flag_state = flag_afficher_ss_menu elif(flag_state == 32): arduino_data.del_captor(captors_path) flag_state = flag_afficher_ss_menu elif(flag_state == 33): arduino_data.change_captors_order(captors_path) flag_state = flag_afficher_ss_menu elif(flag_state == 34): arduino_data.captors_print_list(captors_path) flag_state = flag_afficher_ss_menu elif(flag_state == flag_enregistrer): # enregistrement des données titles_list = [] for i in range(arduino_data.nb_captor_signals): titles_list.append(arduino_data.captors[i].captor_name) figures = fig.Figures(arduino_data.nb_captor_signals) figures.create_figure(titles_list) data_buff_nb = 0 arduino_data.create_data_file() arduino_ser.flushInput() print("Enregistrement en cours. Arrêtez avec MAJ + P.\n") time_0 = time.time()-1 while(flag_state == flag_enregistrer): #boucle de reception des donnees time_0 = time_0+1 time_1 = time_0+0.6 arduino_ser.write(bytes('1','utf-8')) #envoi de '1' a l'Arduino (acquisition donnees) time.sleep(max(time_1-time.time(), 0)) arduino_ser.write(bytes('2','utf-8')) #envoi de '2' (réception donnees) time.sleep(0.05) raw_data_txt = arduino_ser.readline() #format des donnees: data1,data2,data3\n if(raw_data_txt == ''): # si aucune donnée reçue print("Arduino n'envoie aucune donnee, veuillez verifier le code televerse.") flag_state = flag_erreur_serial data_buff_nb = 0 else: data_buff_nb +=1 data_buff = data_buff + str(raw_data_txt)[2:-5] + "\n" #add 1 data line in buffer #procedure extraction donnees pour affichage #print(str(raw_data_txt)) arduino_data.extract_data_to_array(str(raw_data_txt)[2:-5]) if(data_buff_nb == data_buff_max): # procedure d'ecriture fichier arduino_data.append_data_to_file(data_buff) data_buff = "" #remise a zero data_buff_nb = 0 # plot figures.plot_data(arduino_data.data_array) flag_state = fc.press_key_timeout('P', [flag_afficher_menu], flag_state) time.sleep(max(time_0+1-time.time(), 0)) # while end if(data_buff_nb > 0): #vidage du buffer arduino_data.append_data_to_file(data_buff) data_buff = "" data_buff_nb = 0 figures.reinit() elif(flag_state == 0): break arduino_ser.close() print("Fermeture du programme.")