diff --git a/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/datasets/test.md b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/datasets/test.md new file mode 100644 index 0000000..266b73c --- /dev/null +++ b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/datasets/test.md @@ -0,0 +1,2 @@ +# OpenViBE_visual_BCI + diff --git a/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/datasets/test.ov b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/datasets/test.ov new file mode 100644 index 0000000..dfc41ff Binary files /dev/null and b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/datasets/test.ov differ diff --git a/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/datasets/test2.ov b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/datasets/test2.ov new file mode 100644 index 0000000..dfc41ff Binary files /dev/null and b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/datasets/test2.ov differ diff --git a/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/signals/p300-xdawn-train2.ov b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/signals/p300-xdawn-train2.ov new file mode 100644 index 0000000..dfc41ff Binary files /dev/null and b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/signals/p300-xdawn-train2.ov differ diff --git a/Masterarbeit/UIController.py b/Masterarbeit/UIController.py index 419b7dd..7371559 100644 --- a/Masterarbeit/UIController.py +++ b/Masterarbeit/UIController.py @@ -1,6 +1,7 @@ import UIModellVisuell as modelVisuell import UIModellTaktil as modelsTaktil import UIViewTKinter as viewTkinter +from shutil import copyfile @@ -9,6 +10,8 @@ class Controller(): def __init__(self): self.view = viewTkinter.View(self) self.modi = "visuellesBCI" + self.pathOVFile = "Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/signals/p300-xdawn-train2.ov" + self.infotext = "" self.commands = { "copySpelling": self.commandoCopySpelling, @@ -16,12 +19,13 @@ class Controller(): "freeSpelling": self.commandFreeSpelling, "test": self.test, "wechsel": self.wechsel, - "speicherort": self.speicherort + "speicherort": self.setDataset } self.nexts = { "filterXdawn" : self.filterXdawn, - "filterClassic": self.filterClassic + "filterClassic": self.filterClassic, + "save": self.speichern } self.pagesTaktil = { @@ -66,11 +70,17 @@ class Controller(): self.view.setChangeBtnText("Wechsel zu visuellen BCI") self.modi = "taktilesBCI" - def speicherort(self): - pass + def speichern(self): + print("saveFile") + copyfile(self.pathOVFile, self.file) + + def setDataset(self): + file = self.view.openfiledialog() + copyfile(file, self.pathOVFile) def test(self): + self.file = self.view.savefiledialog() if(self.modi == "taktilesBCI"): self.model = modelsTaktil.Modell(self) elif(self.modi == "visuellesBCI"): @@ -80,6 +90,7 @@ class Controller(): #wird durch Btn gestartet -> startet copyspelling als thread def commandoCopySpelling(self): + self.file = self.view.savefiledialog() if(self.modi == "taktilesBCI"): self.model = modelsTaktil.Modell(self) elif(self.modi == "visuellesBCI"): @@ -116,7 +127,7 @@ class Controller(): def commandStop(self): if(self.model is not None): - self.setInfos("Action: STOP-Command") + self.addInfoText("Action: STOP-Command") self.model.stop() self.model.join() self.model.killProzess() @@ -133,8 +144,12 @@ class Controller(): func = self.nexts.get(next) func() - def setInfos(self,text): - self.view.setInfoText(text) + def addInfoText(self,text): + self.infotext = self.infotext + text + self.view.setInfoText(self.infotext) + + def resetInfo(self): + self.infotext = "" def setTitle(self,text): self.view.setTitleText(text) diff --git a/Masterarbeit/UIController.pyc b/Masterarbeit/UIController.pyc index 677ee9e..e11752c 100644 Binary files a/Masterarbeit/UIController.pyc and b/Masterarbeit/UIController.pyc differ diff --git a/Masterarbeit/UIModellTaktil.py b/Masterarbeit/UIModellTaktil.py index 8c3f01c..5eb4d0b 100644 --- a/Masterarbeit/UIModellTaktil.py +++ b/Masterarbeit/UIModellTaktil.py @@ -11,7 +11,6 @@ class Modell(Thread): self.controller = c self.aktiv= True self.openVibeAktiv = False - self.infoText = '' def stop(self): print("stop thread") @@ -35,8 +34,8 @@ class Modell(Thread): def startCopySpelling(self): print("start copySpelling") - self.infoText = 'start copyspelling -- ' - self.controller.setInfos(self.infoText) + self.controller.resetInfo() + self.controller.addInfoText('start copyspelling -- ') self.controller.setTitle("Copy Spelling") path = self.PATH_FILES + 'p300-visual-1-acquisition.xml' process = Popen(['bash', self.PATH_OV, '--play', path, '--no-gui'], @@ -51,14 +50,13 @@ class Modell(Thread): if(x != -1): print("Training finished") process.terminate() - self.infoText = self.infoText + 'finished Copyspelling\n' - self.controller.setInfos(self.infoText) + self.controller.addInfoText('finished Copyspelling\n') 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") + self.controller.addInfoText("Fehler beim Copyspelling aufgetaucht\n") process.terminate() self.controller.stop() break @@ -70,8 +68,7 @@ class Modell(Thread): def trainXDawn(self): print("start training Xdawn") - self.infoText = self.infoText + 'start training XDawn -- ' - self.controller.setInfos(self.infoText) + self.controller.addInfoText('start training XDawn -- ') path = self.PATH_FILES + 'p300-visual-2-train-xDAWN.xml' #path = 'Projekte/test.xml' process = Popen(['bash', self.PATH_OV, '--play', path, '--no-gui'], @@ -86,14 +83,13 @@ class Modell(Thread): if(x != -1): print("Training finished") process.terminate() - self.infoText = self.infoText + 'finished Training\n' - self.controller.setInfos(self.infoText) + self.controller.addInfoText('finished Training\n') 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.addInfoText("Fehler beim XDawn Training aufgetaucht\n") self.controller.stop() process.terminate() break @@ -105,8 +101,7 @@ class Modell(Thread): def trainClassifier(self): print("start training Classifier") - self.infoText = self.infoText + "start training with Classifier -- " - self.controller.setInfos(self.infoText) + self.controller.addInfoText("start training with Classifier -- ") path = self.PATH_FILES + 'p300-visual-3-train-classifier.xml' process = Popen(['bash', self.PATH_OV, '--play', path, '--no-gui'], @@ -125,14 +120,14 @@ class Modell(Thread): #counter = 18 if(counter >= 17): print("Training finished") - self.infoText = self.infoText + 'finished Training\n' - self.controller.setInfos(self.infoText) + self.controller.addInfoText('finished Training\n') process.terminate() + self.controller.stop("save") break elif(y != -1 ): print("Error occured") self.controller.changeScreen("StartPage") - self.controller.setInfos(self.infoText + "Fehler beim Classifier Training aufgetaucht\n") + self.controller.addInfoText("Fehler beim Classifier Training aufgetaucht\n") process.terminate() break elif(accuracy != -1): @@ -144,8 +139,8 @@ class Modell(Thread): def freeSpelling(self): #bei error auch abrechen? print("start freeSpelling") - self.infoText = 'start free spelling -- ' - self.controller.setInfos(self.infoText) + self.controller.resetInfo() + self.controller.addInfoText('start free spelling -- ') path = self.PATH_FILES + 'p300-visual-4-online.xml' process = Popen(['bash', self.PATH_OV, '--play', path, '--no-gui'], stdout=PIPE, @@ -159,15 +154,14 @@ class Modell(Thread): if(x != -1): print("End Spelling") process.terminate() - self.infoText = self.infoText + 'finished freespelling\n' - self.controller.setInfos(self.infoText) + self.controller.addInfoText('finished freespelling\n') 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") + self.controller.addInfoText("Fehler beim Freespelling aufgetaucht\n") process.terminate() self.controller.stop() break diff --git a/Masterarbeit/UIModellTaktil.pyc b/Masterarbeit/UIModellTaktil.pyc index 19c2a85..8f8d5ee 100644 Binary files a/Masterarbeit/UIModellTaktil.pyc and b/Masterarbeit/UIModellTaktil.pyc differ diff --git a/Masterarbeit/UIModellVisuell.py b/Masterarbeit/UIModellVisuell.py index 83847b6..fdc5d21 100644 --- a/Masterarbeit/UIModellVisuell.py +++ b/Masterarbeit/UIModellVisuell.py @@ -11,7 +11,6 @@ class Modell(Thread): self.controller = c self.aktiv= True self.openVibeAktiv = False - self.infoText = '' def stop(self): print("stop thread") @@ -35,14 +34,14 @@ class Modell(Thread): def startCopySpelling(self): print("start copySpelling") - self.infoText = 'start copyspelling -- ' - self.controller.setInfos(self.infoText) + self.controller.resetInfo() + self.controller.addInfoText('start copyspelling -- ') 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 + self.openVibeAktiv = True while True: output = process.stdout.readline() print(output.strip()) @@ -51,17 +50,17 @@ class Modell(Thread): if(x != -1): print("Training finished") process.terminate() - self.infoText = self.infoText + 'finished Copyspelling\n' - self.controller.setInfos(self.infoText) + self.controller.addInfoText('finished Copyspelling\n') 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") + self.controller.addInfoText("Fehler beim Copyspelling aufgetaucht\n") process.terminate() self.controller.stop() break + self.controller.stop() #self.killProzess() @@ -69,9 +68,9 @@ class Modell(Thread): def trainXDawn(self): print("start training Xdawn") - self.infoText = self.infoText + 'start training XDawn -- ' - self.controller.setInfos(self.infoText) + self.controller.addInfoText('start training XDawn -- ') path = self.PATH_FILES + 'p300-visual-2-train-xDAWN.xml' + #path = 'Projekte/test.xml' process = Popen(['bash', self.PATH_OV, '--play', path, '--no-gui'], stdout=PIPE, universal_newlines=True) @@ -84,14 +83,13 @@ class Modell(Thread): if(x != -1): print("Training finished") process.terminate() - self.infoText = self.infoText + 'finished Training\n' - self.controller.setInfos(self.infoText) + self.controller.addInfoText('finished Training\n') 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.addInfoText("Fehler beim XDawn Training aufgetaucht\n") self.controller.stop() process.terminate() break @@ -103,31 +101,37 @@ class Modell(Thread): def trainClassifier(self): print("start training Classifier") - self.infoText = self.infoText + "start training with Classifier -- " - self.controller.setInfos(self.infoText) + self.controller.addInfoText("start training with Classifier -- ") 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 + self.openVibeAktiv = True + counter = 0 while True: output = process.stdout.readline() print(output.strip()) - x = output.find("schlagwort?") + x = output.find("aka Classifier trainer") + accuracy = output.find("Training set accuracy is") 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 + counter = counter +1 + #counter = 18 + if(counter >= 17): + print("Training finished") + self.controller.addInfoText('finished Training\n') + process.terminate() + self.controller.stop("save") + break elif(y != -1 ): print("Error occured") self.controller.changeScreen("StartPage") - self.controller.setInfos(self.infoText + "Fehler beim Classifier Training aufgetaucht\n") + self.controller.addInfoText("Fehler beim Classifier Training aufgetaucht\n") process.terminate() break + elif(accuracy != -1): + print("ACCURACY" + output) self.controller.changeScreen("StartPage") self.controller.stop() @@ -135,8 +139,8 @@ class Modell(Thread): def freeSpelling(self): #bei error auch abrechen? print("start freeSpelling") - self.infoText = 'start free spelling -- ' - self.controller.setInfos(self.infoText) + self.controller.resetInfo() + self.controller.addInfoText('start free spelling -- ') path = self.PATH_FILES + 'p300-visual-4-online.xml' process = Popen(['bash', self.PATH_OV, '--play', path, '--no-gui'], stdout=PIPE, @@ -150,15 +154,14 @@ class Modell(Thread): if(x != -1): print("End Spelling") process.terminate() - self.infoText = self.infoText + 'finished freespelling\n' - self.controller.setInfos(self.infoText) + self.controller.addInfoText('finished freespelling\n') 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") + self.controller.addInfoText("Fehler beim Freespelling aufgetaucht\n") process.terminate() self.controller.stop() break @@ -185,7 +188,4 @@ class Modell(Thread): Popen(["kill", "-TERM", str(pidOV)], stdout=PIPE).communicate() - print("killed openvibe-designer") - - - + print("killed openvibe-designer") \ No newline at end of file diff --git a/Masterarbeit/UIModellVisuell.pyc b/Masterarbeit/UIModellVisuell.pyc index 12d96d1..79ff731 100644 Binary files a/Masterarbeit/UIModellVisuell.pyc and b/Masterarbeit/UIModellVisuell.pyc differ diff --git a/Masterarbeit/UIViewTKinter.py b/Masterarbeit/UIViewTKinter.py index 30dc9fd..4ccf236 100644 --- a/Masterarbeit/UIViewTKinter.py +++ b/Masterarbeit/UIViewTKinter.py @@ -1,7 +1,9 @@ try: from Tkinter import * + import tkFileDialog as fd except ImportError: from tkinter import * + from tkinter import filedialog as fd #from tkinter import font from UIController import * @@ -63,8 +65,9 @@ class View(Tk): def createTopFrame(self): self.topFrame = Frame(self, bg=self.layout["backgroundBar"], height=50, width=500) self.changeBtn = Button(self.topFrame, text="Wechsel zu taktilen BCI", command=lambda: self.controller.actionPerformed("wechsel"), height=2, width = 25, font=self.layout["fontSmall"], bg=self.layout["backgroundBtn"], fg=self.layout["fontColor"]) - self.saveBtn = Button(self.topFrame, text="Aenderung des Speicherorts", command=lambda: self.controller.actionPerformed("speicherort"), height=2, width = 25, font=self.layout["fontSmall"], bg=self.layout["backgroundBtn"], fg=self.layout["fontColor"]) - self.toplabel = Label(self.topFrame, text="visuelles Buchstabieren", font=self.layout["font"], bg=self.layout["backgroundBar"], fg=self.layout["fontColor"], ) + self.saveBtn = Button(self.topFrame, text="Auswaehlen der Datei", command=lambda: self.controller.actionPerformed("speicherort"), height=2, width = 25, font=self.layout["fontSmall"], bg=self.layout["backgroundBtn"], fg=self.layout["fontColor"]) + #self.setBtn = Button(self.topFrame, text="Auswaehlen der Datei", command=lambda: self.controller.actionPerformed("setFile"), height=2, width = 25, font=self.layout["fontSmall"], bg=self.layout["backgroundBtn"], fg=self.layout["fontColor"]) + self.toplabel = Label(self.topFrame, text="visuelles BCI", font=self.layout["font"], bg=self.layout["backgroundBar"], fg=self.layout["fontColor"], ) self.topFrame.grid(column=0, row=0) self.topFrame.grid_propagate(0) @@ -72,6 +75,7 @@ class View(Tk): self.changeBtn.grid(column=0, row=0, padx=10,pady=5) self.saveBtn.grid(column=1, row=0, padx=10, pady=5) + #self.setBtn.grid(column=2, row=0, padx=10, pady=5) self.toplabel.grid(column=2, row=0, padx=100, pady=2) def createMainFrame(self): @@ -114,6 +118,16 @@ class View(Tk): def setChangeBtnText(self,text): self.changeBtn["text"] = text + def openfiledialog(self): + path = "Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/datasets" + file = fd.askopenfilename(initialdir=path) + return file + + def savefiledialog(self): + path = "Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/datasets" + file = fd.asksaveasfilename(initialdir=path) + return file + class StartPage(Frame): def __init__(self, parent, controller, layout): diff --git a/Masterarbeit/UIViewTKinter.pyc b/Masterarbeit/UIViewTKinter.pyc index 50f8b6a..537d1a2 100644 Binary files a/Masterarbeit/UIViewTKinter.pyc and b/Masterarbeit/UIViewTKinter.pyc differ