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.

UIModellVisuell.py 9.2KB

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