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.

UIModellTaktil.py 9.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. '''--------------------------------------------------------------------------------------------------
  2. Das taktile Model steuert den Ablauf der aufrufe der Openvibe Funktionen fuer das taktile BCI
  3. noch nicht implementiert da noch kein Programm dafuer
  4. '''
  5. from subprocess import *
  6. from threading import Thread
  7. import time
  8. from UIModell import *
  9. import re
  10. class ModellTaktil(Modell):
  11. def __init__(self,c, dll):
  12. Thread.__init__(self)
  13. Modell.__init__(self, c, dll)
  14. #self.dll = dll
  15. self.aktiv= True
  16. self.openVibeAktiv = False
  17. def stop(self):
  18. '''--------------------------------------------------------------------------------------------------
  19. Die Funktion stop stopt den ablaufenden Thread
  20. '''
  21. print("stop thread")
  22. self.aktiv = False
  23. def setFunktion(self, func, args=None, kwargs=None):
  24. '''--------------------------------------------------------------------------------------------------
  25. Mittels dieser Funktion kann die im Thread ablaufende Funktion und deren Argumente eingestellt werden
  26. '''
  27. self.func = func
  28. self.args = args or []
  29. self.kwargs = kwargs or {}
  30. def run(self):
  31. '''--------------------------------------------------------------------------------------------------
  32. Wird bei Thread.start() aus dem Controller aufgerufen und laeuft ab sobald der Thread destartet wurde
  33. '''
  34. print("start thread")
  35. #self.aktiv = True
  36. t = Thread(target=self.func, args=self.args, kwargs=self.kwargs)
  37. t.setDaemon(True)
  38. t.start()
  39. while self.aktiv:
  40. time.sleep(0.1)
  41. def startCopySpelling(self):
  42. '''--------------------------------------------------------------------------------------------------
  43. Holt aus der shared Librarz die Befehle und startet das Copyspelling. Reagiert auf Error oder
  44. beenden. Bei Beenden startet es das XDawnTraining, bei Error wird der Vorgang gestoppt.
  45. '''
  46. print("start copySpelling")
  47. self.controller.resetInfo()
  48. self.controller.addInfoText('Starten des gefuerten Buchstabierens -- ')
  49. command = self.dll.getCommandCopyspellingTaktil().split(" ")
  50. process = Popen(command, stdout=PIPE, universal_newlines=True)
  51. self.openVibeAktiv = True
  52. while True:
  53. output = process.stdout.readline()
  54. print(output.strip())
  55. x = output.find("Application terminated")
  56. y = output.find("Error")
  57. if(x != -1):
  58. print("Training finished")
  59. process.terminate()
  60. self.controller.addInfoText('Buchstabieren beendet\n')
  61. self.controller.stop("filterXdawn")
  62. break
  63. elif(y != -1 ):
  64. print("Error occured")
  65. self.controller.changeScreen("StartPage")
  66. self.controller.addInfoText("Fehler beim Buchstabieren aufgetaucht\n")
  67. process.terminate()
  68. self.controller.stop()
  69. break
  70. if not self.aktiv:
  71. print("stop")
  72. break
  73. #self.controller.stop()
  74. def trainXDawn(self):
  75. '''--------------------------------------------------------------------------------------------------
  76. Holt aus der shared Library die Befehle und startet das XDawnTraining. Reagiert auf Error oder
  77. die Ausgabe das das Training beendet wurde. Bei Beenden startet es das ClassifierTraining, bei Error wird der Vorgang gestoppt.
  78. '''
  79. print("Start training Xdawn")
  80. self.controller.addInfoText('Starten des xDawn-Trainings -- ')
  81. command = self.dll.getCommandXDawn_taktil() #.split(" ")
  82. print("Command: " + command)
  83. command = command.split(" ")
  84. process = Popen(command, stdout=PIPE, universal_newlines=True)
  85. self.openVibeAktiv = True
  86. while self.aktiv:
  87. output = process.stdout.readline()
  88. print(output.strip())
  89. x = output.find("Training finished and saved")
  90. y = output.find("Error")
  91. if(x != -1):
  92. print("Training finished")
  93. process.terminate()
  94. self.controller.addInfoText('Training beendet\n')
  95. self.controller.stop("filterClassic")
  96. break
  97. elif(y != -1 ):
  98. print("Error occured")
  99. self.controller.changeScreen("StartPage")
  100. self.controller.addInfoText("Fehler beim XDawn Training aufgetaucht\n")
  101. self.controller.stop()
  102. process.terminate()
  103. break
  104. if not self.aktiv:
  105. print("stop")
  106. break
  107. #self.controller.stop()
  108. #self.controller.filterClassic()
  109. def trainClassifier(self):
  110. '''--------------------------------------------------------------------------------------------------
  111. Holt aus der shared Library die Befehle und startet das ClassifierTraining. Reagiert auf Error oder
  112. die Ausgabe das das Training beendet wurde. Bei Beenden startet es das speichern der Daten, bei Error wird der Vorgang gestoppt.
  113. '''
  114. print("start training Classifier")
  115. self.controller.addInfoText("Starten des Classifier-Trainings -- ")
  116. command = self.dll.getCommandClassifier_taktil().split(" ")
  117. process = Popen(command, stdout=PIPE, universal_newlines=True)
  118. self.openVibeAktiv = True
  119. counter = 0
  120. acc = 0
  121. while True:
  122. output = process.stdout.readline()
  123. print(output.strip())
  124. x = output.find("aka Classifier trainer")
  125. accuracy = output.find("Cross-validation test accuracy is ")
  126. y = output.find("Error")
  127. if(x != -1):
  128. counter = counter +1
  129. #counter = 18
  130. if(counter >= 17):
  131. print("Training finished")
  132. self.controller.addInfoText('Training beendet (' + acc + ')\n')
  133. process.terminate()
  134. self.controller.stop("save")
  135. break
  136. elif(y != -1 ):
  137. print("Error occured")
  138. self.controller.changeScreen("StartPage")
  139. self.controller.addInfoText("Fehler beim Classifier Training aufgetaucht\n")
  140. process.terminate()
  141. break
  142. if(accuracy != -1):
  143. #print("Output:")
  144. #print(output)
  145. ansi_escape = re.compile(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])')
  146. test = output.encode("windows-1252").decode("utf-8")
  147. i = len("Cross-validation test")
  148. #print(output[accuracy:accuracy+i+12])
  149. #print(test[accuracy+i+12:accuracy+i+40].strip())
  150. acc_s = test[accuracy+i:accuracy+i+41].strip()
  151. acc = ansi_escape.sub('', acc_s)
  152. print(acc)
  153. if not self.aktiv:
  154. print("stop")
  155. break
  156. self.controller.changeScreen("StartPage")
  157. self.controller.stop()
  158. def freeSpelling(self):
  159. '''--------------------------------------------------------------------------------------------------
  160. Holt aus der shared Library die Befehle und startet das Freespelling. Reagiert auf Error oder
  161. beenden. Daraufhin wird der Vorgang gestoppt.
  162. '''
  163. print("start freeSpelling")
  164. self.controller.resetInfo()
  165. self.controller.addInfoText('Starten des freien Buchstabierens -- ')
  166. command = self.dll.getCommandFreespellingTaktil().split(" ")
  167. process = Popen(command, stdout=PIPE, universal_newlines=True)
  168. self.openVibeAktiv = True
  169. while True:
  170. output = process.stdout.readline()
  171. print(output.strip())
  172. y = output.find("Error")
  173. x = output.find("Application terminated")
  174. if(x != -1):
  175. print("End Spelling")
  176. process.terminate()
  177. self.controller.addInfoText('Buchstabieren beendet\n')
  178. self.controller.changeScreen("StartPage")
  179. self.controller.stop()
  180. break
  181. elif(y != -1 ):
  182. print("Error occured")
  183. self.controller.changeScreen("StartPage")
  184. self.controller.addInfoText("Fehler beim Buchstabieren aufgetaucht\n")
  185. process.terminate()
  186. self.controller.stop()
  187. break
  188. if not self.aktiv:
  189. print("stop")
  190. break
  191. self.controller.changeScreen("StartPage")
  192. self.controller.stop()
  193. def killProzess(self):
  194. '''--------------------------------------------------------------------------------------------------
  195. Ruft den Parent auf, dass Openvibe falls es noch laeuft geschlossen wird
  196. '''
  197. if(self.openVibeAktiv):
  198. self.openVibeAktiv = False
  199. self.killProzessParent()