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.

149 lines
6.0KB

  1. import serial
  2. import numpy as np
  3. import os
  4. import time
  5. import bin.functions as fc
  6. import bin.data as data
  7. import bin.figures as fig
  8. #Variables principales
  9. parameters_path = os.path.abspath(os.path.dirname(__file__)) + "/parameters.txt"
  10. data_nb = 10
  11. captors_path = os.path.abspath(os.path.dirname(__file__)) + "/captors.txt"
  12. serial_path = fc.read_line_file(parameters_path)
  13. #si '\n' a l'interieur du lien, peut ne pas fonctionner, donc a enlever
  14. bad_path_enter_place = serial_path.find("\n")
  15. if(bad_path_enter_place > 0):
  16. serial_path = serial_path[0:bad_path_enter_place]+serial_path[bad_path_enter_place+2:]
  17. #Variables cachees
  18. flag_data = False
  19. data_buff_max = 10
  20. data_buff_nb = 0
  21. data_buff = ""
  22. pressed_key = ''
  23. flag_erreur_serial = -1
  24. flag_afficher_menu = 1
  25. flag_enregistrer = 2
  26. flag_afficher_ss_menu = 3
  27. flag_choix_menu_principal = 4
  28. flag_choix_ss_menu = 5
  29. flag_init_arduino = 6
  30. flag_state = 6 # etat initialisation, puis etat neutre (1)
  31. #Programme principal
  32. #init
  33. try:
  34. arduino_ser = serial.Serial(serial_path, 9600) #communication avec Arduino
  35. except serial.serialutil.SerialException:
  36. print("SerialException : la carte Arduino n'est pas connectee ou est connectee sur au autre port (actuel : "+ serial_path+").")
  37. flag_state = flag_erreur_serial
  38. exit()
  39. else:
  40. arduino_data = data.Arduino_data()
  41. arduino_data.add_captors_from_file(captors_path)
  42. print("\nPoDoCor a initialisé la communication avec l'Arduino.")
  43. while(flag_state > 0):
  44. if(flag_state == flag_init_arduino): #initialisation de l'arduino
  45. print("\nInitialisation des capteurs Arduino, veuillez patienter.")
  46. arduino_ser.flushInput()
  47. arduino_ser.write(bytes('0','utf-8'))
  48. time.sleep(5)
  49. test = arduino_ser.readline()
  50. print("Initialisation terminée, enregistrement possible.")
  51. flag_state = flag_afficher_menu
  52. arduino_ser.flushInput()
  53. if(flag_state == flag_afficher_menu): #afficher le menu
  54. 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")
  55. time.sleep(2) # attente de la bonne communication avec Arduino
  56. flag_state = flag_choix_menu_principal
  57. elif(flag_state == flag_choix_menu_principal): # appui clavier pour les choix du menu principal
  58. flag_state = fc.press_key('XPN', [0, flag_enregistrer, flag_afficher_ss_menu], flag_state) #detection de touche pressee (demarrage procedure acquisition)
  59. elif(flag_state == flag_afficher_ss_menu): # afficher le ss-menu capteurs
  60. 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")
  61. flag_state = flag_choix_ss_menu
  62. elif(flag_state == flag_choix_ss_menu): # appui clavier pour les choix du ss-enu capteurs
  63. flag_state = fc.press_key('AETUQ', [31, 32, 33, 34, flag_afficher_menu], flag_state) #detection de touche pressee (demarrage procedure acquisition)
  64. if(flag_state == 31):
  65. arduino_data.add_captor_manually(captors_path)
  66. flag_state = flag_afficher_ss_menu
  67. elif(flag_state == 32):
  68. arduino_data.del_captor(captors_path)
  69. flag_state = flag_afficher_ss_menu
  70. elif(flag_state == 33):
  71. arduino_data.change_captors_order(captors_path)
  72. flag_state = flag_afficher_ss_menu
  73. elif(flag_state == 34):
  74. arduino_data.captors_print_list(captors_path)
  75. flag_state = flag_afficher_ss_menu
  76. elif(flag_state == flag_enregistrer): # enregistrement des données
  77. titles_list = []
  78. for i in range(arduino_data.nb_captor_signals):
  79. titles_list.append(arduino_data.captors[i].captor_name)
  80. figures = fig.Figures(arduino_data.nb_captor_signals)
  81. figures.create_figure(titles_list)
  82. data_buff_nb = 0
  83. arduino_data.create_data_file()
  84. arduino_ser.flushInput()
  85. print("Enregistrement en cours. Arrêtez avec MAJ + P.\n")
  86. time_0 = time.time()-1
  87. while(flag_state == flag_enregistrer): #boucle de reception des donnees
  88. time_0 = time_0+1
  89. time_1 = time_0+0.6
  90. arduino_ser.write(bytes('1','utf-8')) #envoi de '1' a l'Arduino (acquisition donnees)
  91. time.sleep(max(time_1-time.time(), 0))
  92. arduino_ser.write(bytes('2','utf-8')) #envoi de '2' (réception donnees)
  93. time.sleep(0.05)
  94. raw_data_txt = arduino_ser.readline() #format des donnees: data1,data2,data3\n
  95. if(raw_data_txt == ''): # si aucune donnée reçue
  96. print("Arduino n'envoie aucune donnee, veuillez verifier le code televerse.")
  97. flag_state = flag_erreur_serial
  98. data_buff_nb = 0
  99. else:
  100. data_buff_nb +=1
  101. data_buff = data_buff + str(raw_data_txt)[2:-5] + "\n" #add 1 data line in buffer
  102. #procedure extraction donnees pour affichage
  103. #print(str(raw_data_txt))
  104. arduino_data.extract_data_to_array(str(raw_data_txt)[2:-5])
  105. if(data_buff_nb == data_buff_max):
  106. # procedure d'ecriture fichier
  107. arduino_data.append_data_to_file(data_buff)
  108. data_buff = "" #remise a zero
  109. data_buff_nb = 0
  110. # plot
  111. figures.plot_data(arduino_data.data_array)
  112. flag_state = fc.press_key_timeout('P', [flag_afficher_menu], flag_state)
  113. time.sleep(max(time_0+1-time.time(), 0))
  114. # while end
  115. if(data_buff_nb > 0): #vidage du buffer
  116. arduino_data.append_data_to_file(data_buff)
  117. data_buff = ""
  118. data_buff_nb = 0
  119. figures.reinit()
  120. elif(flag_state == 0):
  121. break
  122. arduino_ser.close()
  123. print("Fermeture du programme.")