from subprocess import * from threading import Thread import time class Modell(Thread): PATH_OV = 'meta/dist/designer-Release/openvibe-designer.sh' PATH_FILES = 'Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/' def __init__(self,c): Thread.__init__(self) self.controller = c self.aktiv= True self.openVibeAktiv = False self.infoText = '' def stop(self): print("stop thread") self.aktiv = False def setFunktion(self, func, args=None, kwargs=None): self.func = func self.args = args or [] self.kwargs = kwargs or {} def run(self): 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): print("start copySpelling") self.infoText = 'start copyspelling -- ' self.controller.setInfos(self.infoText) self.controller.setTitle("Copy Spelling") path = self.PATH_FILES + 'p300-visual-1-acquisition.xml' process = Popen(['bash', self.PATH_OV, '--play', path, '--no-gui'], stdout=PIPE, universal_newlines=True) self.openVibeAktiv = True while True: output = process.stdout.readline() print(output.strip()) x = output.find("schlagwort?") y = output.find("Error") if(x != -1): print("Training finished") process.terminate() self.infoText = self.infoText + 'finished Copyspelling\n' self.controller.setInfos(self.infoText) self.controller.stop("filterXdawn") break elif(y != -1 ): print("Error occured") self.controller.changeScreen("StartPage") self.controller.setInfos(self.infoText + "Fehler beim Copyspelling aufgetaucht\n") process.terminate() self.controller.stop() break self.controller.stop() #self.killProzess() #self.controller.filterXdawn() def trainXDawn(self): print("start training Xdawn") self.infoText = self.infoText + 'start training XDawn -- ' self.controller.setInfos(self.infoText) path = self.PATH_FILES + 'p300-visual-2-train-xDAWN.xml' process = Popen(['bash', self.PATH_OV, '--play', path, '--no-gui'], 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.infoText = self.infoText + 'finished Training\n' self.controller.setInfos(self.infoText) self.controller.stop("filterClassic") break elif(y != -1 ): print("Error occured") self.controller.changeScreen("StartPage") self.controller.setInfos(self.infoText + "Fehler beim XDawn Training aufgetaucht\n") self.controller.stop() process.terminate() break self.controller.stop() #self.controller.filterClassic() def trainClassifier(self): print("start training Classifier") self.infoText = self.infoText + "start training with Classifier -- " self.controller.setInfos(self.infoText) path = self.PATH_FILES + 'p300-visual-3-train-classifier.xml' process = Popen(['bash', self.PATH_OV, '--play', path, '--no-gui'], stdout=PIPE, universal_newlines=True) self.openVibeAktiv = True while True: output = process.stdout.readline() print(output.strip()) x = output.find("schlagwort?") y = output.find("Error") if(x != -1): print("Training finished") self.infoText = self.infoText + 'finished Training\n' self.controller.setInfos(self.infoText) process.terminate() break elif(y != -1 ): print("Error occured") self.controller.changeScreen("StartPage") self.controller.setInfos(self.infoText + "Fehler beim Classifier Training aufgetaucht\n") process.terminate() break self.controller.changeScreen("StartPage") self.controller.stop() def freeSpelling(self): #bei error auch abrechen? print("start freeSpelling") self.infoText = 'start free spelling -- ' self.controller.setInfos(self.infoText) path = self.PATH_FILES + 'p300-visual-4-online.xml' process = Popen(['bash', self.PATH_OV, '--play', path, '--no-gui'], 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") if(x != -1): print("End Spelling") process.terminate() self.infoText = self.infoText + 'finished freespelling\n' self.controller.setInfos(self.infoText) self.controller.changeScreen("StartPage") self.controller.stop() break elif(y != -1 ): print("Error occured") self.controller.changeScreen("StartPage") self.controller.setInfos(self.infoText + "Fehler beim Freespelling aufgetaucht\n") process.terminate() self.controller.stop() break self.controller.changeScreen("StartPage") self.controller.stop() def killProzess(self): if(self.openVibeAktiv): self.openVibeAktiv = False print('start killing') pidOV = 0 items = [] prozesse = Popen(["ps", "-e"], stdout=PIPE).communicate()[0].strip() zeilen = prozesse.split('\n') for z in zeilen: if(z.find("openvibe-design") != -1): z = z.strip() items = z.split(' ') pidOV = items[0] #kill -TERM veranlasst dem Prozess sich selbst zu beenden (nicht erzwungen) Popen(["kill", "-TERM", str(pidOV)], stdout=PIPE).communicate() print("killed openvibe-designer")