source: trunk/Puzzlebox/Synapse/Interface.py @ 394

Last change on this file since 394 was 394, checked in by sc, 8 years ago

session handling cleanup

  • Property svn:executable set to *
File size: 27.9 KB
Line 
1# -*- coding: utf-8 -*-
2
3# Copyright Puzzlebox Productions, LLC (2010-2012)
4#
5# This code is released under the GNU Pulic License (GPL) version 2
6# For more information please refer to http://www.gnu.org/copyleft/gpl.html
7
8__changelog__ = """\
9Last Update: 2012.05.11
10"""
11
12__todo__ = """
13- update configuration.ini file with settings entered into interface
14"""
15
16### IMPORTS ###
17import os, sys, time
18
19import Puzzlebox.Synapse.Configuration as configuration
20
21if configuration.ENABLE_PYSIDE:
22        try:
23                import PySide as PyQt4
24                from PySide import QtCore, QtGui, QtNetwork
25        except Exception, e:
26                print "ERROR: Exception importing PySide:",
27                print e
28                configuration.ENABLE_PYSIDE = False
29        else:
30                print "INFO: [Synapse:Interface] Using PySide module"
31
32if not configuration.ENABLE_PYSIDE:
33        print "INFO: [Synapse:Interface] Using PyQt4 module"
34        from PyQt4 import QtCore, QtGui, QtNetwork
35
36
37try:
38        from Interface_Plot import *
39        MATPLOTLIB_AVAILABLE = True
40except Exception, e:
41        print "ERROR: Exception importing Interface_Plot:",
42        print e
43        MATPLOTLIB_AVAILABLE = False
44
45
46if (sys.platform == 'win32'):
47        #import _winreg as winreg
48        #import itertools
49        #import re
50        #import serial
51        DEFAULT_IMAGE_PATH = 'images'
52elif (sys.platform == 'darwin'):
53        DEFAULT_IMAGE_PATH = 'images'
54else:
55        import bluetooth
56        DEFAULT_IMAGE_PATH = '/usr/share/puzzlebox_synapse/images'
57
58
59try:
60        import cPickle as pickle
61except:
62        import pickle
63
64
65from Interface_Design import Ui_Form as Design
66
67import Puzzlebox.Synapse.Device as synapse_device
68import Puzzlebox.Synapse.Session as synapse_session
69import Puzzlebox.Synapse.Client as synapse_client
70import Puzzlebox.Synapse.ThinkGear.Server as thinkgear_server
71import Puzzlebox.Synapse.Emotiv.Server as emotiv_server
72
73
74#####################################################################
75# Globals
76#####################################################################
77
78DEBUG = configuration.DEBUG
79
80SYNAPSE_SERVER_HOST = configuration.SYNAPSE_SERVER_HOST
81SYNAPSE_SERVER_PORT = configuration.SYNAPSE_SERVER_PORT
82
83EMULATE_THINKGEAR_FOR_EMOTIV = configuration.EMULATE_THINKGEAR_FOR_EMOTIV
84
85#THINKGEAR_EEG_POWER_BAND_ORDER = configuration.THINKGEAR_EEG_POWER_BAND_ORDER
86
87THINKGEAR_EMULATION_MAX_ESENSE_VALUE = \
88        configuration.THINKGEAR_EMULATION_MAX_ESENSE_VALUE
89THINKGEAR_EMULATION_MAX_EEG_POWER_VALUE = \
90        configuration.THINKGEAR_EMULATION_MAX_EEG_POWER_VALUE
91
92PATH_TO_HCITOOL = '/usr/bin/hcitool'
93
94#UPDATE_INTERFACE_VIA_TIMER = True # Alternative is to establish a
95                                  ## ThinkGear Connect client which
96                                  ## updates the interface on demand
97                                  ## as packets are received
98
99UPDATE_INTERFACE_VIA_TIMER = False
100
101#INTERFACE_UPDATE_FREQUENCY = (1 / 512) * 1000 # ms (512 Hz)
102INTERFACE_UPDATE_FREQUENCY = 1000 # ms
103
104INTERFACE_RAW_EEG_UPDATE_FREQUENCY = 512
105
106PACKET_MINIMUM_TIME_DIFFERENCE_THRESHOLD = 0.75
107
108
109#####################################################################
110# Classes
111#####################################################################
112
113class puzzlebox_synapse_interface(synapse_device.puzzlebox_synapse_device, \
114                                  synapse_session.puzzlebox_synapse_session, \
115                                  Design):
116       
117        def __init__(self, log, \
118                     DEBUG=DEBUG, \
119                     parent=None, \
120                     embedded_mode=False):
121               
122                self.log = log
123                self.DEBUG = DEBUG
124                self.parent=parent
125                self.embedded_mode=embedded_mode
126               
127                if self.parent == None:
128                        QtGui.QWidget.__init__(self, parent)
129                        self.setupUi(self)
130               
131                        self.configureSettings()
132                        self.connectWidgets()
133               
134                self.name = "Synapse:Interface"
135               
136                self.synapseServer = None
137                self.synapseClient = None
138                #self.thinkgearConnectClient = None
139                #self.emotivClient = None
140               
141                self.session_start_timestamp = time.time()
142                self.plugin_session = self # for compatability with Puzzlebox Jigsaw
143               
144                self.maxEEGPower = THINKGEAR_EMULATION_MAX_EEG_POWER_VALUE
145               
146                self.debug_console_buffer = ''
147               
148                self.packets = {}
149                self.packets['rawEeg'] = []
150                self.packets['signals'] = []
151               
152                self.customDataHeaders = []
153               
154                self.session_start_timestamp = time.time()
155                self.packet_count = 0
156                self.bad_packets = 0
157               
158                if UPDATE_INTERFACE_VIA_TIMER:
159                        self.updateInterfaceTimer = QtCore.QTimer()
160                        QtCore.QObject.connect(self.updateInterfaceTimer, \
161                                                    QtCore.SIGNAL("timeout()"), \
162                                                    self.updateInterface)
163               
164               
165               
166                self.activePlugins = [self]
167       
168       
169        ##################################################################
170       
171        def configureSettings(self):
172               
173                # Synapse Interface
174                image_path = "puzzlebox.ico"
175                if not os.path.exists(image_path):
176                        image_path = os.path.join(DEFAULT_IMAGE_PATH, image_path)
177               
178                if os.path.exists(image_path):
179                        icon = QtGui.QIcon()
180                        icon.addPixmap(QtGui.QPixmap(image_path), \
181                                            QtGui.QIcon.Normal, \
182                                            QtGui.QIcon.Off)
183                        self.setWindowIcon(icon)
184               
185                image_path = "puzzlebox_logo.png"
186                if not os.path.exists(image_path):
187                        image_path = os.path.join(DEFAULT_IMAGE_PATH, image_path)
188                if os.path.exists(image_path):
189                        self.labelPuzzleboxIcon.setPixmap(QtGui.QPixmap(image_path))
190               
191               
192                if (sys.platform == 'win32'):
193                        self.homepath = os.path.join( \
194                           os.environ['HOMEDRIVE'], \
195                           os.environ['HOMEPATH'], \
196                           'Desktop')
197                elif (sys.platform == 'darwin'):
198                        desktop = os.path.join(os.environ['HOME'], 'Documents')
199                        if os.path.exists(desktop):
200                                self.homepath = desktop
201                        else:
202                                self.homepath = os.environ['HOME']
203                else:
204                        desktop = os.path.join(os.environ['HOME'], 'Desktop')
205                        if os.path.exists(desktop):
206                                self.homepath = desktop
207                        else:
208                                self.homepath = os.environ['HOME']
209               
210               
211                if not os.path.exists(self.homepath):
212                        if self.DEBUG:
213                                print "DEBUG: User default path not found"
214                        self.homepath = os.getcwd()
215               
216               
217                if configuration.INTERFACE_TAB_POSITION == 'South':
218                        self.tabWidget.setTabPosition(QtGui.QTabWidget.South)
219                else:
220                        self.tabWidget.setTabPosition(QtGui.QTabWidget.North)
221               
222               
223                # EEG Devices
224                self.updateDevices()
225               
226               
227                # Connect Server
228                self.textLabelBluetoothStatus.setText("Status: Disconnected")
229               
230                # Display Host for ThinkGear Connect Socket Server
231                self.lineEditSynapseHost.setText(SYNAPSE_SERVER_HOST)
232               
233                # Display Port for ThinkGear Connect Socket Server
234                self.lineEditSynapsePort.setText('%i' % SYNAPSE_SERVER_PORT)
235               
236               
237                # ThinkgGear Progress Bars
238                self.progressBarEEGDelta.setMaximum(THINKGEAR_EMULATION_MAX_EEG_POWER_VALUE)
239                self.progressBarEEGTheta.setMaximum(THINKGEAR_EMULATION_MAX_EEG_POWER_VALUE)
240                self.progressBarEEGLowAlpha.setMaximum(THINKGEAR_EMULATION_MAX_EEG_POWER_VALUE)
241                self.progressBarEEGHighAlpha.setMaximum(THINKGEAR_EMULATION_MAX_EEG_POWER_VALUE)
242                self.progressBarEEGLowBeta.setMaximum(THINKGEAR_EMULATION_MAX_EEG_POWER_VALUE)
243                self.progressBarEEGHighBeta.setMaximum(THINKGEAR_EMULATION_MAX_EEG_POWER_VALUE)
244                self.progressBarEEGLowGamma.setMaximum(THINKGEAR_EMULATION_MAX_EEG_POWER_VALUE)
245                self.progressBarEEGMidGamma.setMaximum(THINKGEAR_EMULATION_MAX_EEG_POWER_VALUE)
246               
247                self.progressBarAttention.setMaximum(THINKGEAR_EMULATION_MAX_ESENSE_VALUE)
248                self.progressBarMeditation.setMaximum(THINKGEAR_EMULATION_MAX_ESENSE_VALUE)
249               
250                self.progressBarSignalContactQuality.setMaximum(200)
251               
252               
253                if MATPLOTLIB_AVAILABLE:
254                        self.rawEEGMatplot = rawEEGMatplotlibCanvas( \
255                                                self.tabEEGSignals, \
256                                                width=8, \
257                                                height=4, \
258                                                dpi=100, \
259                                                title='Raw EEG Waves')
260                        self.chartEEGMatplot = chartEEGMatplotlibCanvas( \
261                                                self.tabCharts, \
262                                                width=8, \
263                                                height=4, \
264                                                dpi=100, \
265                                                title='EEG Brain Signals')
266               
267                else:
268                        self.tabWidget.removeTab(self.tabWidget.indexOf(self.tabEEGSignals))
269                        self.tabWidget.removeTab(self.tabWidget.indexOf(self.tabCharts))
270       
271       
272        ##################################################################
273       
274        def connectWidgets(self):
275               
276                self.connect(self.comboBoxEEGHeadsetModel, \
277                             QtCore.SIGNAL("currentIndexChanged(int)"), \
278                             self.updateDevices)
279               
280                self.connect(self.pushButtonBluetoothSearch, \
281                             QtCore.SIGNAL("clicked()"), \
282                             self.updateDevices)
283               
284                self.connect(self.pushButtonSynapseServer, \
285                             QtCore.SIGNAL("clicked()"), \
286                             self.startSynapseServer)
287               
288                self.connect(self.pushButtonSave, \
289                             QtCore.SIGNAL("clicked()"), \
290                             self.saveData)
291               
292                self.connect(self.pushButtonExport, \
293                             QtCore.SIGNAL("clicked()"), \
294                             self.exportData)
295               
296                self.connect(self.pushButtonReset, \
297                             QtCore.SIGNAL("clicked()"), \
298                             self.resetData)
299       
300       
301        ##################################################################
302       
303        def updateInterface(self):
304               
305                if not self.synapseServer.emulate_headset_data:
306                        #self.processPacketThinkGear( \
307                        self.processPacketEEG( \
308                                self.synapseServer.protocol.data_packet)
309       
310       
311        ##################################################################
312       
313        def updateDevices(self):
314               
315                if (self.parent != None):
316                        source = self.parent
317                else:
318                        source = self
319               
320                model = source.comboBoxEEGHeadsetModel.currentText()
321               
322                devices = self.searchForDevices()
323               
324                source.comboBoxDeviceSelect.clear()
325               
326                if (model == 'NeuroSky MindWave' or \
327                    model == 'NeuroSky MindSet' or \
328                    model == 'NeuroSky MindWave Mobile'):
329                       
330                        devices.insert(0, 'ThinkGear Emulator')
331               
332                elif (model == 'Emotiv EPOC'):
333                       
334                        devices = []
335                        devices.append('Emotiv Control Panel')
336                        devices.append('EmoComposer')
337               
338               
339                for device in devices:
340                        source.comboBoxDeviceSelect.addItem(device)
341       
342       
343        ##################################################################
344       
345        def startSynapseServer(self):
346               
347                eeg_headset_model = str(self.comboBoxEEGHeadsetModel.currentText())
348                #device_address = str(self.comboBoxDeviceSelect.currentText())
349                server_interface = str(self.lineEditSynapseHost.text())
350                server_port = int(self.lineEditSynapsePort.text())
351               
352               
353                if ((eeg_headset_model == 'NeuroSky MindWave Mobile') or \
354                    (eeg_headset_model == 'NeuroSky MindWave') or \
355                    (eeg_headset_model == 'NeuroSky MindSet')):
356                       
357                        self.startThinkGearConnectService()
358               
359                elif (eeg_headset_model == 'Emotiv EPOC'):
360                       
361                        self.startEmotivService()
362               
363               
364                if UPDATE_INTERFACE_VIA_TIMER:
365                        self.updateInterfaceTimer.start(INTERFACE_UPDATE_FREQUENCY)
366               
367                else:
368                        self.synapseClient = \
369                                synapse_client.puzzlebox_synapse_client( \
370                                        self.log, \
371                                        server_host=server_interface, \
372                                        server_port=server_port, \
373                                        DEBUG=0, \
374                                        parent=self)
375                       
376                        self.synapseClient.start()
377               
378               
379                device_selection = self.comboBoxDeviceSelect.currentText()
380                self.textLabelBluetoothStatus.setText("Status: Connected")
381                self.pushButtonBluetoothSearch.setEnabled(False)
382                self.comboBoxDeviceSelect.setEnabled(False)
383                self.comboBoxEEGHeadsetModel.setEnabled(False)
384               
385                self.lineEditSynapseHost.setEnabled(False)
386                self.lineEditSynapsePort.setEnabled(False)
387               
388                self.pushButtonSynapseServer.setText('Stop')
389               
390                self.progressBarEEGDelta.setValue(0)
391                self.progressBarEEGTheta.setValue(0)
392                self.progressBarEEGLowAlpha.setValue(0)
393                self.progressBarEEGHighAlpha.setValue(0)
394                self.progressBarEEGLowBeta.setValue(0)
395                self.progressBarEEGHighBeta.setValue(0)
396                self.progressBarEEGLowGamma.setValue(0)
397                self.progressBarEEGMidGamma.setValue(0)
398               
399                self.progressBarAttention.setValue(0)
400                self.progressBarMeditation.setValue(0)
401               
402               
403                self.disconnect(self.pushButtonSynapseServer, \
404                                     QtCore.SIGNAL("clicked()"), \
405                                     self.startSynapseServer)
406               
407                self.connect(self.pushButtonSynapseServer, \
408                                  QtCore.SIGNAL("clicked()"), \
409                                  self.stopSynapseServer)
410       
411       
412        ##################################################################
413       
414        def stopSynapseServer(self):
415               
416                eeg_headset_model = str(self.comboBoxEEGHeadsetModel.currentText())
417                #device_address = str(self.comboBoxDeviceSelect.currentText())
418               
419                if ((eeg_headset_model == 'NeuroSky MindWave Mobile') or \
420                    (eeg_headset_model == 'NeuroSky MindWave') or \
421                    (eeg_headset_model == 'NeuroSky MindSet')):
422                       
423                        self.stopThinkGearConnectService()
424               
425                elif (eeg_headset_model == 'Emotiv EPOC'):
426                       
427                        self.stopEmotivService()
428               
429               
430                if UPDATE_INTERFACE_VIA_TIMER:
431                        self.updateInterfaceTimer.stop()
432                else:
433                        try:
434                                self.synapseClient.exitThread()
435                                #self.synapseClient.disconnectFromHost()
436                        except Exception, e:
437                                if self.DEBUG:
438                                        print "Call failed to self.synapseClient.exitThread():",
439                                        #print "Call failed to self.synapseClient.disconnectFromHost():",
440                                        print e
441                       
442                        try:
443                                self.synapseServer.exitThread()
444                        except Exception, e:
445                                if self.DEBUG:
446                                        print "Call failed to self.synapseServer.exitThread():",
447                                        print e
448               
449               
450                self.disconnect(self.pushButtonSynapseServer, \
451                                QtCore.SIGNAL("clicked()"), \
452                                self.stopSynapseServer)
453               
454                self.connect(self.pushButtonSynapseServer, \
455                                  QtCore.SIGNAL("clicked()"), \
456                                  self.startSynapseServer)
457               
458                self.lineEditSynapseHost.setEnabled(True)
459                self.lineEditSynapsePort.setEnabled(True)
460               
461                self.pushButtonSynapseServer.setText('Start')
462               
463                self.pushButtonBluetoothSearch.setEnabled(True)
464               
465                self.pushButtonSynapseServer.setChecked(False)
466               
467                self.textLabelBluetoothStatus.setText("Status: Disconnected")
468               
469                self.pushButtonBluetoothSearch.setEnabled(True)
470               
471                self.comboBoxDeviceSelect.setEnabled(True)
472                self.comboBoxEEGHeadsetModel.setEnabled(True)
473               
474               
475                self.progressBarEEGDelta.setValue(0)
476                self.progressBarEEGTheta.setValue(0)
477                self.progressBarEEGLowAlpha.setValue(0)
478                self.progressBarEEGHighAlpha.setValue(0)
479                self.progressBarEEGLowBeta.setValue(0)
480                self.progressBarEEGHighBeta.setValue(0)
481                self.progressBarEEGLowGamma.setValue(0)
482                self.progressBarEEGMidGamma.setValue(0)
483               
484                self.progressBarAttention.setValue(0)
485                self.progressBarMeditation.setValue(0)
486               
487                self.progressBarSignalContactQuality.setValue(0)
488               
489                self.maxEEGPower = THINKGEAR_EMULATION_MAX_EEG_POWER_VALUE
490               
491                # In case the user connects to a MindSet, then disconnects
492                # and re-connects to a MindSet Emulator,
493                # we need to reset the max power values
494                self.progressBarEEGDelta.setMaximum(self.maxEEGPower)
495                self.progressBarEEGTheta.setMaximum(self.maxEEGPower)
496                self.progressBarEEGLowAlpha.setMaximum(self.maxEEGPower)
497                self.progressBarEEGHighAlpha.setMaximum(self.maxEEGPower)
498                self.progressBarEEGLowBeta.setMaximum(self.maxEEGPower)
499                self.progressBarEEGHighBeta.setMaximum(self.maxEEGPower)
500                self.progressBarEEGLowGamma.setMaximum(self.maxEEGPower)
501                self.progressBarEEGMidGamma.setMaximum(self.maxEEGPower)
502       
503       
504        ##################################################################
505       
506        def startThinkGearConnectService(self):
507               
508                eeg_headset_model = str(self.comboBoxEEGHeadsetModel.currentText())
509                device_address = str(self.comboBoxDeviceSelect.currentText())
510                server_interface = str(self.lineEditSynapseHost.text())
511                server_port = int(self.lineEditSynapsePort.text())
512                emulate_headset_data = (device_address == 'ThinkGear Emulator')
513               
514               
515                self.synapseServer = \
516                        thinkgear_server.puzzlebox_synapse_server_thinkgear( \
517                                self.log, \
518                                server_interface=server_interface, \
519                                server_port=server_port, \
520                                device_model=eeg_headset_model, \
521                                device_address=device_address, \
522                                emulate_headset_data=emulate_headset_data, \
523                                DEBUG=DEBUG, \
524                                parent=self)
525               
526                for header in self.synapseServer.customDataHeaders:
527                        if header not in self.customDataHeaders:
528                                self.customDataHeaders.append(header)
529               
530                self.synapseServer.start()
531       
532       
533        ##################################################################
534       
535        def stopThinkGearConnectService(self):
536               
537                for header in self.synapseServer.customDataHeaders:
538                        if header in self.customDataHeaders:
539                                del(self.customDataHeaders[header])
540       
541       
542        ##################################################################
543       
544        def startEmotivService(self):
545               
546                device_address = str(self.comboBoxDeviceSelect.currentText())
547               
548                if device_address == 'Emotiv Control Panel':
549                        device_address = configuration.EMOTIV_SERVER_PORT_CONTROL_PANEL
550                else:
551                        device_address = configuration.EMOTIV_SERVER_PORT_EMOCOMPOSER
552               
553               
554                server_interface = str(self.lineEditSynapseHost.text())
555                server_port = int(self.lineEditSynapsePort.text())
556                eeg_headset_model = str(self.comboBoxEEGHeadsetModel.currentText())
557                emulate_headset_data = (device_address == 'ThinkGear Emulator')
558               
559               
560                self.synapseServer = \
561                        emotiv_server.puzzlebox_synapse_server_emotiv( \
562                                self.log, \
563                                server_interface=server_interface, \
564                                server_port=server_port, \
565                                device_model=eeg_headset_model, \
566                                device_address=device_address, \
567                                emulate_headset_data=emulate_headset_data, \
568                                DEBUG=DEBUG, \
569                                parent=self)
570               
571                for header in self.synapseServer.customDataHeaders:
572                        if header not in self.customDataHeaders:
573                                self.customDataHeaders.append(header)
574               
575                self.synapseServer.start()
576               
577               
578                self.progressBarEEGDelta.setEnabled(False)
579                self.progressBarEEGTheta.setEnabled(False)
580                self.progressBarEEGLowAlpha.setEnabled(False)
581                self.progressBarEEGHighAlpha.setEnabled(False)
582                self.progressBarEEGLowBeta.setEnabled(False)
583                self.progressBarEEGHighBeta.setEnabled(False)
584                self.progressBarEEGLowGamma.setEnabled(False)
585                self.progressBarEEGMidGamma.setEnabled(False)
586               
587                #self.progressBarAttention.setEnabled(False)
588                #self.progressBarMeditation.setEnabled(False)
589       
590       
591        ##################################################################
592       
593        def stopEmotivService(self):
594               
595                #self.emotivClient.stop()
596               
597                self.progressBarEEGDelta.setEnabled(True)
598                self.progressBarEEGTheta.setEnabled(True)
599                self.progressBarEEGLowAlpha.setEnabled(True)
600                self.progressBarEEGHighAlpha.setEnabled(True)
601                self.progressBarEEGLowBeta.setEnabled(True)
602                self.progressBarEEGHighBeta.setEnabled(True)
603                self.progressBarEEGLowGamma.setEnabled(True)
604                self.progressBarEEGMidGamma.setEnabled(True)
605               
606                #self.progressBarAttention.setEnabled(True)
607                #self.progressBarMeditation.setEnabled(True)
608       
609                for header in self.synapseServer.customDataHeaders:
610                        if header in self.customDataHeaders:
611                                del(self.customDataHeaders[header])
612       
613       
614        ##################################################################
615       
616        def processPacketEEG(self, packet):
617               
618                self.processPacketThinkGear(packet)
619                self.processPacketEmotiv(packet)
620               
621               
622                #if ((self.synapseServer.protocol != None) and
623                if (self.tabWidget.currentIndex() == \
624                    self.tabWidget.indexOf(self.tabControlPanel)):
625                       
626                        self.updateProfileSessionStatus()
627       
628       
629        ##################################################################
630       
631        def processPacketThinkGear(self, packet):
632               
633                #if self.DEBUG > 2:
634                        #print packet
635               
636               
637                if ('rawEeg' in packet.keys()):
638                        self.packets['rawEeg'].append(packet['rawEeg'])
639                        value = packet['rawEeg']
640                        if MATPLOTLIB_AVAILABLE and \
641                                (self.tabWidget.currentIndex() == \
642                                 self.tabWidget.indexOf(self.tabEEGSignals)):
643                                self.rawEEGMatplot.update_figure(value)
644                        return
645                else:
646                        # NOTE: This is also logging Emotiv packets to 'signals'
647                        self.packets['signals'].append(packet)
648               
649               
650                if ('poorSignalLevel' in packet.keys()):
651                        value = 200 - packet['poorSignalLevel']
652                        self.progressBarSignalContactQuality.setValue(value)
653                        self.textEditDebugConsole.append("")
654                        try:
655                                (date, localtime) = self.parseTimeStamp(packet['timestamp'])
656                                self.textEditDebugConsole.append("Timestamp: %s %s" % (date, localtime))
657                        except:
658                                pass
659                        self.textEditDebugConsole.append("poorSignalLevel: %i" % \
660                                                         packet['poorSignalLevel'])
661               
662               
663                if ('eSense' in packet.keys()):
664                       
665                        if ('attention' in packet['eSense'].keys()):
666                                value = packet['eSense']['attention']
667                                self.progressBarAttention.setValue(value)
668                                self.textEditDebugConsole.append("eSense attention: %i" % value)
669                       
670                        if ('meditation' in packet['eSense'].keys()):
671                                value = packet['eSense']['meditation']
672                                self.progressBarMeditation.setValue(value)
673                                self.textEditDebugConsole.append("eSense meditation: %i" % value)
674                       
675                       
676                        if MATPLOTLIB_AVAILABLE:
677                                self.chartEEGMatplot.update_values('eSense', packet['eSense'])
678                                if (self.tabWidget.currentIndex() == \
679                                    self.tabWidget.indexOf(self.tabCharts)):
680                                        self.chartEEGMatplot.update_figure('eSense', packet['eSense'])
681               
682               
683                if ('eegPower' in packet.keys()):
684                       
685                        # If we are not emulating packets we'll set the maximum EEG Power value
686                        # threshold to the default (or maximum value found within this packet)
687                        if not self.synapseServer.emulate_headset_data:
688                                self.maxEEGPower = THINKGEAR_EMULATION_MAX_EEG_POWER_VALUE
689                       
690                        for value in packet['eegPower'].keys():
691                                if packet['eegPower'][value] > self.maxEEGPower:
692                                        self.maxEEGPower = packet['eegPower'][value]
693                       
694                       
695                        if ('delta' in packet['eegPower'].keys()):
696                                value = packet['eegPower']['delta']
697                                self.progressBarEEGDelta.setMaximum(self.maxEEGPower)
698                                self.progressBarEEGDelta.setValue(value)
699                                self.textEditDebugConsole.append("delta: %i" % value)
700                       
701                        if ('theta' in packet['eegPower'].keys()):
702                                value = packet['eegPower']['theta']
703                                self.progressBarEEGTheta.setMaximum(self.maxEEGPower)
704                                self.progressBarEEGTheta.setValue(value)
705                                self.textEditDebugConsole.append("theta: %i" % value)
706                       
707                        if ('lowAlpha' in packet['eegPower'].keys()):
708                                value = packet['eegPower']['lowAlpha']
709                                self.progressBarEEGLowAlpha.setMaximum(self.maxEEGPower)
710                                self.progressBarEEGLowAlpha.setValue(value)
711                                self.textEditDebugConsole.append("lowAlpha: %i" % value)
712                       
713                        if ('highAlpha' in packet['eegPower'].keys()):
714                                value = packet['eegPower']['highAlpha']
715                                self.progressBarEEGHighAlpha.setMaximum(self.maxEEGPower)
716                                self.progressBarEEGHighAlpha.setValue(value)
717                                self.textEditDebugConsole.append("highAlpha: %i" % value)
718                       
719                        if ('lowBeta' in packet['eegPower'].keys()):
720                                value = packet['eegPower']['lowBeta']
721                                self.progressBarEEGLowBeta.setMaximum(self.maxEEGPower)
722                                self.progressBarEEGLowBeta.setValue(value)
723                                self.textEditDebugConsole.append("lowBeta: %i" % value)
724                       
725                        if ('highBeta' in packet['eegPower'].keys()):
726                                value = packet['eegPower']['highBeta']
727                                self.progressBarEEGHighBeta.setMaximum(self.maxEEGPower)
728                                self.progressBarEEGHighBeta.setValue(value)
729                                self.textEditDebugConsole.append("highBeta: %i" % value)
730                       
731                        if ('lowGamma' in packet['eegPower'].keys()):
732                                value = packet['eegPower']['lowGamma']
733                                self.progressBarEEGLowGamma.setMaximum(self.maxEEGPower)
734                                self.progressBarEEGLowGamma.setValue(value)
735                                self.textEditDebugConsole.append("lowGamma: %i" % value)
736                       
737                        if ('highGamma' in packet['eegPower'].keys()):
738                                value = packet['eegPower']['highGamma']
739                                self.progressBarEEGMidGamma.setMaximum(self.maxEEGPower)
740                                self.progressBarEEGMidGamma.setValue(value)
741                                self.textEditDebugConsole.append("highGamma: %i" % value)
742                       
743                       
744                        if MATPLOTLIB_AVAILABLE:
745                                self.chartEEGMatplot.update_values('eegPower', packet['eegPower'])
746                                if (self.tabWidget.currentIndex() == \
747                                    self.tabWidget.indexOf(self.tabCharts)):
748                                        self.chartEEGMatplot.update_figure('eegPower', packet['eegPower'])
749       
750       
751        ##################################################################
752       
753        def processPacketEmotiv(self, packet):
754               
755                if self.DEBUG > 2:
756                        print "INFO [Synapse:Interface] Emotiv packet received:"
757                        print packet
758               
759               
760                if ('emotivStatus' in packet.keys()):
761                       
762                        if ('timeFromStart' in packet['emotivStatus']):
763                                if not configuration.EMULATE_THINKGEAR_FOR_EMOTIV:
764                                        self.textEditDebugConsole.append("")
765                                        try:
766                                                (date, localtime) = self.parseTimeStamp(packet['timestamp'])
767                                                self.textEditDebugConsole.append("Timestamp: %s %s" % (date, localtime))
768                                        except:
769                                                pass
770                                self.textEditDebugConsole.append("timeFromStart: %f" % \
771                                                                  packet['emotivStatus']['timeFromStart'])
772                       
773                        if ('headsetOn' in packet['emotivStatus']):
774                                self.textEditDebugConsole.append("headsetOn: %s" % \
775                                                                  bool(packet['emotivStatus']['headsetOn']))
776                       
777                        if ('contactNumberOfQualityChannels' in packet['emotivStatus']):
778                                self.textEditDebugConsole.append("contactNumberOfQualityChannels: %i" % \
779                                                                  packet['emotivStatus']['contactNumberOfQualityChannels'])
780                       
781                        if ('wireless' in packet['emotivStatus']):
782                                self.textEditDebugConsole.append("wireless: %i" % \
783                                                                  packet['emotivStatus']['wireless'])
784               
785               
786                if ('affectiv' in packet.keys()):
787                       
788                        if ('excitement' in packet['affectiv']):
789                                self.textEditDebugConsole.append("excitement: %.2f" % \
790                                                                  packet['affectiv']['excitement'])
791                       
792                        if ('longTermExcitement' in packet['affectiv']):
793                                self.textEditDebugConsole.append("longTermExcitement: %.2f" % \
794                                                                  packet['affectiv']['longTermExcitement'])
795                       
796                        if ('meditation' in packet['affectiv']):
797                                self.textEditDebugConsole.append("meditation: %.2f" % \
798                                                                  packet['affectiv']['meditation'])
799                       
800                        if ('frustration' in packet['affectiv']):
801                                self.textEditDebugConsole.append("frustration: %.2f" % \
802                                                                  packet['affectiv']['frustration'])
803                       
804                        if ('engagementBoredom' in packet['affectiv']):
805                                self.textEditDebugConsole.append("engagementBoredom: %.2f" % \
806                                                                  packet['affectiv']['engagementBoredom'])
807               
808               
809                if ('cognitiv' in packet.keys()):
810                       
811                        if ('currentAction' in packet['cognitiv']):
812                                self.textEditDebugConsole.append("currentAction: %i" % \
813                                                                  packet['cognitiv']['currentAction'])
814                       
815                        if ('currentActionPower' in packet['cognitiv']):
816                                self.textEditDebugConsole.append("currentActionPower: %.2f" % \
817                                                                  packet['cognitiv']['currentActionPower'])
818       
819       
820       
821        ##################################################################
822       
823        def setPacketCount(self, value):
824               
825                self.packet_count = value
826       
827       
828        ##################################################################
829       
830        def setBadPackets(self, value):
831               
832                self.bad_packets = value
833       
834       
835        ##################################################################
836       
837        def incrementPacketCount(self):
838               
839                self.packet_count += 1
840       
841       
842        ##################################################################
843       
844        def incrementBadPackets(self):
845               
846                self.bad_packets += 1
847       
848       
849        ##################################################################
850       
851        def getPacketCount(self):
852               
853                return (self.packet_count)
854       
855       
856        ##################################################################
857       
858        def getBadPackets(self):
859               
860                return (self.bad_packets)
861       
862       
863        ##################################################################
864       
865        def getSessionTime(self):
866               
867                return (self.session_start_timestamp)
868       
869       
870        ##################################################################
871       
872        def resetSessionStartTime(self):
873       
874                #self.synapseServer.protocol.resetSessionStartTime()
875                #self.resetSessionStartTime()
876                self.session_start_timestamp = time.time()
877       
878       
879        ##################################################################
880       
881        def processPacketForExport(self, packet={}, output={}):
882               
883                if self.synapseServer != None:
884                        output = self.synapseServer.processPacketForExport(packet, output)
885               
886                return(output)
887       
888       
889        ##################################################################
890       
891        def stop(self):
892               
893                if UPDATE_INTERFACE_VIA_TIMER:
894                        self.updateInterfaceTimer.stop()
895                else:
896                        if self.synapseClient != None:
897                                self.synapseClient.exitThread()
898                        #if self.thinkgearConnectClient != None:
899                                #self.thinkgearConnectClient.exitThread()
900                        #if self.emotivClient != None:
901                                #self.emotivClient.exitThread()
902               
903                if self.synapseServer != None:
904                        self.synapseServer.exitThread()
905       
906       
907        ##################################################################
908       
909        def closeEvent(self, event):
910               
911                quit_message = "Are you sure you want to exit the program?"
912               
913                reply = QtGui.QMessageBox.question( \
914                           self, \
915                          'Message', \
916                           quit_message, \
917                           QtGui.QMessageBox.Yes, \
918                           QtGui.QMessageBox.No)
919               
920                if reply == QtGui.QMessageBox.Yes:
921                       
922                        self.stop()
923                       
924                        event.accept()
925               
926                else:
927                        event.ignore()
928
Note: See TracBrowser for help on using the repository browser.