You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

195 lines
7.9KB

  1. import bin.functions as fc
  2. import numpy as np
  3. import os
  4. import time
  5. class Arduino_data():
  6. def __init__(self):
  7. self.nb_captor_signals = 0
  8. self.data_file_path = ''
  9. self.data_array = np.empty((1,1))
  10. self.data_path_dir = os.path.abspath(os.path.dirname(__file__)) + "/../data"
  11. if(not(os.path.isdir(self.data_path_dir))): #creer dossier si non existant
  12. os.mkdir(self.data_path_dir, 0o777)
  13. self.raw_data_temp = [[]]
  14. self.captors = []
  15. def add_captors_from_file(self, file):
  16. """Importation, à partir d'un fichier, des capteurs déjà enregistrés."""
  17. try: # ouverture fichier
  18. captors_file = open(file, "r")
  19. except: # si fichier non existant, création du fichier et ajout de capteur
  20. print("Le fichier des capteurs n'existe pas encore. Ajoutez au moins 1 capteur:\n")
  21. captors_file = open(file,"w") #création du fichier
  22. captors_file.close()
  23. self.add_captor_manually(file)
  24. else: # fichier existant
  25. lines = captors_file.readlines()
  26. self.nb_captor_signals = len(lines)
  27. if(self.nb_captor_signals == 0):
  28. captors_file.close()
  29. print("Ajoutez au moins 1 capteur avant de commencer:\n")
  30. self.add_captor_manually(file)
  31. captors_file = open(file, "r")
  32. lines = captors_file.readlines()
  33. self.nb_captor_signals = len(lines)
  34. self.data_array = np.empty((1,self.nb_captor_signals))
  35. for i in range(self.nb_captor_signals):
  36. captor_line = lines[i]
  37. capt = Captor_data();
  38. capt.read_captor(captor_line)
  39. self.captors.append(capt)
  40. captors_file.close()
  41. self.raw_data_temp = np.empty((1,self.nb_captor_signals))
  42. def add_captor_manually(self, file):
  43. """Ajout manuel de capteurs (nom, unité, type de données (raw/real))"""
  44. self.nb_captor_signals += 1
  45. capt = Captor_data()
  46. coma = ","
  47. capt.captor_name = str(input("Nom du capteur : "))
  48. while(capt.captor_name.find(coma) != -1):
  49. capt.captor_name = str(input("Nom du capteur ("," non accepté): "))
  50. capt.unit = str(input("Unité : "))
  51. while(capt.unit.find(coma) != -1):
  52. capt.unit = str(input("Unité (\",\" non accepté): "))
  53. capt.data_type = -1
  54. while(capt.data_type <= -1 or capt.data_type >= 2):
  55. capt.data_type = int(input("Type de données : 0 (raw) ou 1 (real): "))
  56. self.captors.append(capt)
  57. captors_file = open(file, "a")
  58. captors_file.write(capt.captor_file_line())
  59. captors_file.close()
  60. np.append(self.raw_data_temp, [])
  61. self.data_array = np.empty((1,self.nb_captor_signals))
  62. print("Capteur ajouté")
  63. def captors_print_list(self, file):
  64. """Affichage des capteurs listés dans le fichier, dans l'ordre"""
  65. captors_file = open(file, "r")
  66. print(" Nom Unit Type(raw/real)")
  67. for i in range(self.nb_captor_signals):
  68. print("Capteur n°" + str(i+1) + " : " + str(captors_file.readline()))
  69. captors_file.close()
  70. def del_captor(self, file):
  71. """Suppression d'un capteur"""
  72. self.captors_print_list(file)
  73. captor_to_del = int(input("\nNumero du capteur a supprimer : "))-1
  74. del self.captors[captor_to_del-1]
  75. captors_file = open(file, "r")
  76. lines = captors_file.readlines();
  77. captors_file.close()
  78. captors_file = open(file, "w")
  79. for i in range(self.nb_captor_signals):
  80. if(i != captor_to_del):
  81. captor_line = lines[i]
  82. captors_file.write(captor_line)
  83. else:
  84. break;
  85. captors_file.close()
  86. self.nb_captor_signals = self.nb_captor_signals-1
  87. def change_captors_order(self, file):
  88. """Changement de l'ordre des capteurs, pour correspondre à l'ordre des
  89. valeurs correspondantes aux capteurs de l'Arduino"""
  90. capt_temp = self.captors[:]
  91. self.captors_print_list(file)
  92. captors_file = open(file, "r")
  93. lines = captors_file.readlines();
  94. captors_file.close()
  95. captors_order = []
  96. print("Assigner ligne par ligne les anciens numéros de capteur à leur nouvelle place:")
  97. for i in range(self.nb_captor_signals):
  98. captors_order.append(int(input("nouveau n°" + str(i+1) + " : ancien n° : ")))
  99. captors_file = open(file, "w")
  100. for i in range(self.nb_captor_signals):
  101. self.captors[i] = capt_temp[captors_order[i]-1]
  102. captor_line = lines[captors_order[i]-1]
  103. captors_file.write(captor_line)
  104. captors_file.close()
  105. print("\nNouvel ordre des capteurs")
  106. self.captors_print_list(file)
  107. def extract_data_to_array(self, raw_data_txt):
  108. """Lecture d'une ligne envoyée par Arduino, et parsing des données
  109. par rapport aux virgules dans un tableau"""
  110. coma = ","
  111. coma_places = raw_data_txt.find(coma)
  112. if(type(coma_places) == type(int())):
  113. coma_places = [coma_places]
  114. if(coma_places == -1 and len(raw_data_txt) < 2):
  115. print("Donnees non transmises par l'Arduino.")
  116. elif(coma_places == -1 and len(raw_data_txt) > 2):
  117. raw_data_temp[0,0] = int(raw_data_txt)
  118. if(len(coma_places) != self.nb_captor_signals-1):
  119. if(len(coma_places) < self.nb_captor_signals-1):
  120. print("Il y a moins de donnees transmises que de capteurs. Vérifiez les donnees transmises.")
  121. else:
  122. print("Il y a plus de donnees transmises que de capteurs.\nLes " + str(len(coma_places)-self.nb_captor_signals-1) + " donnees de fin seront supprimees")
  123. else:
  124. # insertion de la place du début et de la fin du string
  125. coma_places.insert(0,-1)
  126. coma_places.append(len(raw_data_txt))
  127. for i in range(min(len(coma_places)-1, self.nb_captor_signals)):
  128. self.raw_data_temp[0,i] = int(raw_data_txt[coma_places[i]+1:coma_places[i+1]])
  129. self.data_array = np.append(self.data_array, self.raw_data_temp, axis=0)
  130. def create_data_file(self):
  131. """Création du fichier csv où sont enregistrées les données, avec comme nom
  132. l'horodatage du fichier"""
  133. self.data_file_path = self.data_path_dir + "/" + time.asctime()+".csv"
  134. file = open(self.data_file_path,"w") #mode append
  135. file.close()
  136. def append_data_to_file(self, data):
  137. """Écriture, à la fin du fichier csv, des données tampon"""
  138. file = open(self.data_file_path,"a") #mode append
  139. file.write(data)
  140. file.close()
  141. class Captor_data():
  142. def __init__(self):
  143. self.captor_name = ""
  144. self.unit = ""
  145. self.data_type = 0 #type possibles : donnee brute raw a convertir (0), donnees reelles utilisables en l'etat (1)
  146. def set_captor_name(self, name):
  147. self.captor_name = name
  148. def set_unit(self, unit):
  149. self.unit = unit
  150. def set_data_type(self, data_type):
  151. self.data_type = data_type
  152. def read_captor(self, line):
  153. for j in range(3):
  154. carac_coma_nb = 1
  155. while((line[carac_coma_nb] != ',') and (line[carac_coma_nb:carac_coma_nb+2] != "\n")): #fin de la donnee ou de la ligne
  156. carac_coma_nb +=1
  157. if(j == 0):
  158. self.captor_name = line[0:carac_coma_nb]
  159. elif(j == 1):
  160. self.unit = line[0:carac_coma_nb]
  161. elif(j == 2):
  162. self.data_type = int(line[0:carac_coma_nb])
  163. line = line[carac_coma_nb+1:]
  164. def captor_string(self):
  165. type_txt = ["raw", "real"]
  166. return self.captor_name + "(" + self.unit + " " + type_txt[self.data_type] + ")"
  167. def captor_file_line(self):
  168. return self.captor_name + "," + self.unit + "," + str(self.data_type) + "\n"