From ca721a66ddcb77e96913b8af961f3fac6fff60a3 Mon Sep 17 00:00:00 2001 From: lilian Date: Wed, 31 Mar 2021 18:10:45 +0200 Subject: [PATCH] ajout commentaires et titres sur les graphes indiquant le nom des capteurs --- README.md | 2 +- bin/data.py | 23 ++++++++++++++++++++--- bin/figures.py | 8 +++++++- main.py | 5 ++++- 4 files changed, 32 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index a789073..d337151 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ Il est PRIMORDIAL de respecter l'ordre des données envoyées par l'Arduino dans Une fois le logiciel démarré, le démarrage du processus d'enregistrement des données démarre en utilisant Shift+P; de même, ce processus s'arrête en utilisant Shift+P. -Une fenêtre s'afiche pour afficher les données transmises par l'Arduino en format graphique. Cette fenêtre ne permet pas, pour l'instant, de visualiser la valeur réelle des données (notamment pour les données raw), elle affiche simplement les données (raw ou réelles) reçues par PoDoCor. +Une fenêtre s'affiche pour afficher les données transmises par l'Arduino en format graphique. Cette fenêtre ne permet pas, pour l'instant, de visualiser la valeur réelle des données (notamment pour les données raw), elle affiche simplement les données (raw ou réelles) reçues par PoDoCor. ### TODO diff --git a/bin/data.py b/bin/data.py index 030f8cf..328bb9c 100644 --- a/bin/data.py +++ b/bin/data.py @@ -14,17 +14,19 @@ class Arduino_data(): if(not(os.path.isdir(self.data_path_dir))): #creer dossier si non existant os.mkdir(self.data_path_dir, 0o777) self.raw_data_temp = [[]] + self.captors = [] def add_captors_from_file(self, file): - try: + """Importation, à partir d'un fichier, des capteurs déjà enregistrés.""" + try: # ouverture fichier captors_file = open(file, "r") - except: + except: # si fichier non existant, création du fichier et ajout de capteur print("Le fichier des capteurs n'existe pas encore. Ajoutez au moins 1 capteur:\n") captors_file = open(file,"w") #création du fichier captors_file.close() self.add_captor_manually(file) - else: + else: # fichier existant lines = captors_file.readlines() self.nb_captor_signals = len(lines) if(self.nb_captor_signals == 0): @@ -39,10 +41,12 @@ class Arduino_data(): captor_line = lines[i] capt = Captor_data(); capt.read_captor(captor_line) + self.captors.append(capt) captors_file.close() self.raw_data_temp = np.empty((1,self.nb_captor_signals)) def add_captor_manually(self, file): + """Ajout manuel de capteurs (nom, unité, type de données (raw/real))""" self.nb_captor_signals += 1 capt = Captor_data() @@ -56,6 +60,7 @@ class Arduino_data(): capt.data_type = -1 while(capt.data_type <= -1 or capt.data_type >= 2): capt.data_type = int(input("Type de données : 0 (raw) ou 1 (real): ")) + self.captors.append(capt) captors_file = open(file, "a") captors_file.write(capt.captor_file_line()) @@ -65,6 +70,7 @@ class Arduino_data(): print("Capteur ajouté") def captors_print_list(self, file): + """Affichage des capteurs listés dans le fichier, dans l'ordre""" captors_file = open(file, "r") print(" Nom Unit Type(raw/real)") for i in range(self.nb_captor_signals): @@ -72,8 +78,10 @@ class Arduino_data(): captors_file.close() def del_captor(self, file): + """Suppression d'un capteur""" self.captors_print_list(file) captor_to_del = int(input("\nNumero du capteur a supprimer : "))-1 + del self.captors[captor_to_del-1] captors_file = open(file, "r") lines = captors_file.readlines(); captors_file.close() @@ -88,6 +96,9 @@ class Arduino_data(): self.nb_captor_signals = self.nb_captor_signals-1 def change_captors_order(self, file): + """Changement de l'ordre des capteurs, pour correspondre à l'ordre des + valeurs correspondantes aux capteurs de l'Arduino""" + capt_temp = self.captors[:] self.captors_print_list(file) captors_file = open(file, "r") lines = captors_file.readlines(); @@ -99,6 +110,7 @@ class Arduino_data(): captors_file = open(file, "w") for i in range(self.nb_captor_signals): + self.captors[i] = capt_temp[captors_order[i]-1] captor_line = lines[captors_order[i]-1] captors_file.write(captor_line) captors_file.close() @@ -106,6 +118,8 @@ class Arduino_data(): self.captors_print_list(file) def extract_data_to_array(self, raw_data_txt): + """Lecture d'une ligne envoyée par Arduino, et parsing des données + par rapport aux virgules dans un tableau""" coma = "," coma_places = raw_data_txt.find(coma) if(type(coma_places) == type(int())): @@ -128,11 +142,14 @@ class Arduino_data(): self.data_array = np.append(self.data_array, self.raw_data_temp, axis=0) def create_data_file(self): + """Création du fichier csv où sont enregistrées les données, avec comme nom + l'horodatage du fichier""" self.data_file_path = self.data_path_dir + "/" + time.asctime()+".csv" file = open(self.data_file_path,"w") #mode append file.close() def append_data_to_file(self, data): + """Écriture, à la fin du fichier csv, des données tampon""" file = open(self.data_file_path,"a") #mode append file.write(data) file.close() diff --git a/bin/figures.py b/bin/figures.py index 9e41a9f..d5db599 100644 --- a/bin/figures.py +++ b/bin/figures.py @@ -13,6 +13,7 @@ class Figures(): self.fig = None # objet Figure() self.axes = None # liste d'objets subplots(), suivant la grille plots_grid definie self.time = None # axe x des figures (pas dans data_array car reextractible dans un tableur) + self.titles = [] def plots_grids(self, nb_plots): """ Determine la grille (x,y) de fenêtres de plots dans la figure affichée. @@ -56,7 +57,7 @@ class Figures(): # parcours des cases de la figure de droite à gauche puis de haut en bas, suivant la grille self.repartition.append(self.repartition[i%self.nb_curves]) - def create_figure(self): + def create_figure(self, titles_list): """Creation de la fenêtre contenant les plots. Mode interactif enclenché pour réactualiser à chaque fois que plot_data est appelée. Utilisation de plt.pause pour laisser la fenêtre s'afficher et @@ -66,6 +67,10 @@ class Figures(): if(self.plots_grid[0] < 2): # si 1 seule ligne, empaqueter dans une liste pour # y acceder de la meme facon dans tous les cas self.axes = [self.axes] + for j in range(self.plots_grid[0]): + for i in range(self.plots_grid[1]): + self.titles.append(", ".join(titles_list[j*self.plots_grid[1]+i::self.total_subplots])) + self.axes[j][i].title.set_text(self.titles[j*self.plots_grid[1]+i]) plt.show() plt.pause(0.05) @@ -76,6 +81,7 @@ class Figures(): self.time = np.linspace(0,data_array_t.shape[1]-1,data_array_t.shape[1]) for i in self.repartition: self.axes[i//100-1][(i//10)%10-1].clear() + self.axes[i//100-1][(i//10)%10-1].title.set_text(self.titles[(i//100-1)*self.plots_grid[1]+(i//10)%10-1]) for i in range(self.nb_curves): self.axes[self.repartition[i]//100-1][(self.repartition[i]//10)%10-1].scatter(self.time, data_array_t[i]) plt.show() diff --git a/main.py b/main.py index ad432fe..7abe064 100755 --- a/main.py +++ b/main.py @@ -65,8 +65,11 @@ while(flag_state > 0): flag_state = 3 elif(flag_state == 2): # 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() + figures.create_figure(titles_list) data_buff_nb = 0 arduino_data.create_data_file() time_0 = time.time()-1