Преглед изворни кода

getch() avec timeout (capture du clavier + timeout lors de l'enregistrement des données). TODO ajouter des commentaires

tags/PoDoCor-v0.1
lilian пре 3 година
родитељ
комит
86be03a78f
3 измењених фајлова са 57 додато и 28 уклоњено
  1. +6
    -3
      bin/data.py
  2. +28
    -6
      bin/functions.py
  3. +23
    -19
      main.py

+ 6
- 3
bin/data.py Прегледај датотеку

@@ -108,6 +108,8 @@ class Arduino_data():
def extract_data_to_array(self, raw_data_txt):
coma = ","
coma_places = raw_data_txt.find(coma)
if(type(coma_places) == type(int())):
coma_places = [coma_places]
if(coma_places == -1 and len(raw_data_txt) < 2):
print("Donnees non transmises par l'Arduino.")
elif(coma_places == -1 and len(raw_data_txt) > 2):
@@ -118,11 +120,12 @@ class Arduino_data():
else:
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")
else:
coma_places.insert(0,0)
# insertion de la place du début et de la fin du string
coma_places.insert(0,-1)
coma_places.append(len(raw_data_txt))
for i in range(min(len(coma_places)-1, self.nb_captor_signals)):
self.raw_data_temp[0,i] = int(raw_data_txt[coma_places[i]:coma_places[i+1]])
np.append(self.data_array, raw_data_temp, axis=1)
self.raw_data_temp[0,i] = int(raw_data_txt[coma_places[i]+1:coma_places[i+1]])
np.append(self.data_array, self.raw_data_temp, axis=1)

def create_data_file(self):
self.data_file_path = self.data_path_dir + "/" + time.asctime()+".csv"


+ 28
- 6
bin/functions.py Прегледај датотеку

@@ -1,16 +1,38 @@
import os
from multiprocessing import Process, Queue
if(os.name == "posix"):
import getch as gt #clavier
else:
import msvcrt as gt

def press_key(caracters, numbers, actual):
def press_key_timeout(caracters, numbers, actual, timeout = 0.1):
queue = Queue()
time_thread = Process(target = press_key, args=(caracters, numbers, actual, queue))
time_thread.start()
time_thread.join(timeout=timeout)
if(time_thread.is_alive()):
time_thread.terminate()
return actual
else:
return queue.get()
#main_thread.join(timeout=timeout)
#actual = queue.get()
#main_thread.terminate()

def press_key(caracters, numbers, actual, queue = None):
""" Cette fonction sert à détecter si un caractère est pressé, pour passer d'un
état (numbers) à un autre."""
état (actual) à l'un de ceux contenus dans numbers, et déclenchés
par leur caractère correspondant."""

pressed_key = gt.getch() #detection de touche pressee (arret procedure acquisition)
pressed_key = gt.getch() #detection de touche pressee (blocant)
place = caracters.find(pressed_key)
if(place == -1):
return actual
if(queue != None):
if(place == -1):
queue.put(actual)
else:
queue.put(numbers[place])
else:
return numbers[place]
if(place == -1):
return actual
else:
return numbers[place]

+ 23
- 19
main.py Прегледај датотеку

@@ -37,11 +37,16 @@ else:
print("PoDoCor est pret a enregistrer les donnees")

while(flag_state > 0):
if(flag_state == 1):
if(flag_state == 1): #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")
flag_state = 4
elif(flag_state == 4): # appui clavier pour les choix du menu principal
flag_state = fc.press_key('XPN', [0, 2, 3], flag_state) #detection de touche pressee (demarrage procedure acquisition)
elif(flag_state == 3):

elif(flag_state == 3): # 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 = 5
elif(flag_state == 5): # apui clavier pour les choix du ss-enu capteurs
flag_state = fc.press_key('AETUQ', [31, 32, 33, 34, 1], flag_state) #detection de touche pressee (demarrage procedure acquisition)
if(flag_state == 31):
arduino_data.add_captor_manually(captors_path)
@@ -56,26 +61,28 @@ while(flag_state > 0):
arduino_data.captors_print_list(captors_path)
flag_state = 3

elif(flag_state == 2):
elif(flag_state == 2): # enregistrement des données
data_buff_nb = 0
arduino_data.create_data_file()
time_0 = time.time()-1
while(flag_state == 2): #boucle de reception des donnees
time_0 = time.time()
arduino_ser.write(1) #envoi de '1' a l'Arduino
time.sleep(time_0+0.5-time.time())
time_1 = time_0+0.5
raw_data_txt = arduino_ser.readline() #format des donnees: data1,data2,data3\n raw data
print(raw_data_txt)
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
print(str(raw_data_txt)[2:-5])
if(raw_data_txt == ''): # si aucune donnée reçue
print("Arduino n'envoie aucune donnee, veuillez verifier le code televerse.")
flag_state = -1
data_buff_nb = 0
else:
data_buff_nb +=1
data_buff = data_buff + str(raw_data_txt) + "\n" #add 1 data line in buffer

data_buff = data_buff + str(raw_data_txt)[2:-5] + "\n" #add 1 data line in buffer
#procedure extraction donnees pour affichage
arduino_data.extract_data_to_array(raw_data_txt)
arduino_data.extract_data_to_array(str(raw_data_txt)[2:-5])

# procedure d'ecriture fichier
if(data_buff_nb == data_buff_max):
@@ -83,21 +90,18 @@ while(flag_state > 0):
data_buff = "" #remise a zero
data_buff_nb = 0

flag_state = fc.press_key('P', [1], flag_state)
time.sleep(time_1+0.5-time.time())
print(time.time())
flag_state = fc.press_key_timeout('P', [1], flag_state)
time.sleep(max(time_0+1-time.time(), 0))

# while end
if(data_buff_nb > 0): #vidage du buffer
arduino_data.ppend_data_to_file(self, data_buff)
arduino_data.append_data_to_file(data_buff)
data_buff = ""
data_buff_nb = 0

arduino_ser.close()
assert flag_data == True, "Sortie de la boucle de reception des donnees"


elif(flag_state == 0):
break
arduino_ser.close()
print("Fermeture du programme.")

Loading…
Откажи
Сачувај