123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 |
- '''--------------------------------------------------------------------------------------------------
- Das Visuelle Model steuert den Ablauf der aufrufe der Openvibe Funktionen fuer das visuelle BCI
- '''
-
- from subprocess import *
- from threading import Thread
- import time
-
- from UIModell import Modell
-
- class ModellVisuell(Modell):
-
- def __init__(self,c, dll):
- Thread.__init__(self)
- Modell.__init__(self, c, dll)
- self.aktiv= True
- self.openVibeAktiv = False
-
- def stop(self):
- '''--------------------------------------------------------------------------------------------------
- Die Funktion stop stopt den ablaufenden Thread
- '''
- print("stop thread")
- self.aktiv = False
-
- def setFunktion(self, func, args=None, kwargs=None):
- '''--------------------------------------------------------------------------------------------------
- Mittels dieser Funktion kann die im Thread ablaufende Funktion und deren Argumente eingestellt werden
- '''
- self.func = func
- self.args = args or []
- self.kwargs = kwargs or {}
-
- def run(self):
- '''--------------------------------------------------------------------------------------------------
- Wird bei Thread.start() aus dem Controller aufgerufen und laeuft ab sobald der Thread destartet wurde
- '''
- print("start thread")
- #self.aktiv = True
- t = Thread(target=self.func, args=self.args, kwargs=self.kwargs)
- t.setDaemon(True)
- t.start()
-
- while self.aktiv:
- time.sleep(0.1)
-
-
- def startCopySpelling(self):
- '''--------------------------------------------------------------------------------------------------
- Holt aus der shared Librarz die Befehle und startet das Copyspelling. Reagiert auf Error oder
- beenden. Bei Beenden startet es das XDawnTraining, bei Error wird der Vorgang gestoppt.
- Positioniert die visuelle Matrix.
- '''
- print("start copySpelling")
- self.controller.resetInfo()
- self.controller.addInfoText('Starten des gefuerhten Buchstabierens -- ')
- command = self.dll.getCommandCopyspellingVisuell().split(" ")
- process = Popen(command, stdout=PIPE, universal_newlines=True)
-
- self.openVibeAktiv = True
- while True:
- output = process.stdout.readline()
- print(output.strip())
- x = output.find("Application terminated")
- y = output.find("Error")
- z = output.find("Initialization")
- if(x != -1):
- print("Training finished")
- process.terminate()
- self.controller.addInfoText('Buchstabieren beendet\n')
- self.controller.stop("filterXdawn")
- break
- elif(y != -1 ):
- print("Error occured")
- self.controller.changeScreen("StartPage")
- self.controller.addInfoText("Fehler beim Buchstabieren aufgetaucht\n")
- process.terminate()
- self.controller.stop()
- break
- elif(z != -1):
- print("Initiation finisched")
- time.sleep(2)
- self.positionWindow("p300")
- if not self.aktiv:
- print("stop")
- break
- #self.controller.stop()
-
- def trainXDawn(self):
- '''--------------------------------------------------------------------------------------------------
- Holt aus der shared Library die Befehle und startet das XDawnTraining. Reagiert auf Error oder
- die Ausgabe das das Training beendet wurde. Bei Beenden startet es das ClassifierTraining, bei Error wird der Vorgang gestoppt.
- '''
- print("start training Xdawn")
- self.controller.addInfoText('Starten des XDawn/Trainings -- ')
- command = self.dll.getCommandXDawn_visuell().split(" ")
- process = Popen(command, stdout=PIPE, universal_newlines=True)
-
- self.openVibeAktiv = True
- while self.aktiv:
- output = process.stdout.readline()
- print(output.strip())
- x = output.find("Training finished and saved")
- y = output.find("Error")
- if(x != -1):
- print("Training finished")
- process.terminate()
- self.controller.addInfoText('Beenden des Trainings\n')
- self.controller.stop("filterClassic")
- break
- elif(y != -1 ):
- print("Error occured")
- self.controller.changeScreen("StartPage")
- self.controller.addInfoText("Fehler beim XDawn Training aufgetaucht\n")
- self.controller.stop()
- process.terminate()
- break
- if not self.aktiv:
- print("stop")
- break
-
- #self.controller.stop()
-
- def trainClassifier(self):
- '''--------------------------------------------------------------------------------------------------
- Holt aus der shared Library die Befehle und startet das ClassifierTraining. Reagiert auf Error oder
- die Ausgabe das das Training beendet wurde. Bei Beenden startet es das speichern der Daten, bei Error wird der Vorgang gestoppt.
- '''
- print("start training Classifier")
- self.controller.addInfoText("Starten Classifier-Trainings -- ")
- command = self.dll.getCommandClassifier_visuell().split(" ")
- process = Popen(command, stdout=PIPE, universal_newlines=True)
-
- self.openVibeAktiv = True
- counter = 0
- while True:
- output = process.stdout.readline()
- print(output.strip())
- x = output.find("aka Classifier trainer")
- accuracy = output.find("Training set accuracy is")
- y = output.find("Error")
- if(x != -1):
- counter = counter +1
- #counter = 18
- if(counter >= 17):
- print("Training finished")
- self.controller.addInfoText('Beenden des Training\n')
- process.terminate()
- self.controller.stop("save")
- break
- elif(y != -1 ):
- print("Error occured")
- self.controller.changeScreen("StartPage")
- self.controller.addInfoText("Fehler beim Classifier Training aufgetaucht\n")
- process.terminate()
- break
- elif(accuracy != -1):
- print("ACCURACY" + output)
- if not self.aktiv:
- print("stop")
- break
-
- self.controller.changeScreen("StartPage")
- self.controller.stop()
-
- def freeSpelling(self):
- '''--------------------------------------------------------------------------------------------------
- Holt aus der shared Library die Befehle und startet das Freespelling. Reagiert auf Error oder
- beenden. Daraufhin wird der Vorgang gestoppt. Positioniert die visuelle Matrix.
- '''
- print("start freeSpelling")
- self.controller.resetInfo()
- self.controller.addInfoText('Starten des freien Buchstabierens -- ')
-
- command = self.dll.getCommandFreespellingVisuell().split(" ")
- process = Popen(command, stdout=PIPE, universal_newlines=True)
-
- self.openVibeAktiv = True
- while True:
- output = process.stdout.readline()
- print(output.strip())
- y = output.find("Error")
- x = output.find("Schlagwort")
- z = output.find("Initialization")
- if(x != -1):
- print("End Spelling")
- process.terminate()
- self.controller.addInfoText('Buchstabieren beendet\n')
- self.controller.changeScreen("StartPage")
- self.controller.stop()
- break
- elif(y != -1 ):
- print("Error occured")
- self.controller.changeScreen("StartPage")
- self.controller.addInfoText("Fehler beim Buchstabieren aufgetaucht\n")
- process.terminate()
- self.controller.stop()
- break
- elif(z != -1):
- print("Initiation finisched")
- time.sleep(2)
- self.positionWindow("p300")
- if not self.aktiv:
- print("stop")
- break
-
- self.controller.changeScreen("StartPage")
- self.controller.stop()
-
- def killProzess(self):
- '''--------------------------------------------------------------------------------------------------
- Ruft den Parent auf, dass Openvibe falls es noch laeuft geschlossen wird
- '''
- if(self.openVibeAktiv):
- self.openVibeAktiv = False
- self.killProzessParent()
-
-
-
-
-
-
-
|