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

Last change on this file since 391 was 391, checked in by sc, 9 years ago
  • fixes to Synapse after changes to session data handling for Jigsaw 1.2.2
  • Property svn:executable set to *
File size: 27.1 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.04.03
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 = []
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                self.synapseServer.start()
527       
528       
529        ##################################################################
530       
531        def stopThinkGearConnectService(self):
532               
533                pass
534       
535       
536        ##################################################################
537       
538        def startEmotivService(self):
539               
540                device_address = str(self.comboBoxDeviceSelect.currentText())
541               
542                if device_address == 'Emotiv Control Panel':
543                        device_address = configuration.EMOTIV_SERVER_PORT_CONTROL_PANEL
544                else:
545                        device_address = configuration.EMOTIV_SERVER_PORT_EMOCOMPOSER
546               
547               
548                server_interface = str(self.lineEditSynapseHost.text())
549                server_port = int(self.lineEditSynapsePort.text())
550                eeg_headset_model = str(self.comboBoxEEGHeadsetModel.currentText())
551                emulate_headset_data = (device_address == 'ThinkGear Emulator')
552               
553               
554                self.synapseServer = \
555                        emotiv_server.puzzlebox_synapse_server_emotiv( \
556                                self.log, \
557                                server_interface=server_interface, \
558                                server_port=server_port, \
559                                device_model=eeg_headset_model, \
560                                device_address=device_address, \
561                                emulate_headset_data=emulate_headset_data, \
562                                DEBUG=DEBUG, \
563                                parent=self)
564               
565                self.synapseServer.start()
566               
567               
568                self.progressBarEEGDelta.setEnabled(False)
569                self.progressBarEEGTheta.setEnabled(False)
570                self.progressBarEEGLowAlpha.setEnabled(False)
571                self.progressBarEEGHighAlpha.setEnabled(False)
572                self.progressBarEEGLowBeta.setEnabled(False)
573                self.progressBarEEGHighBeta.setEnabled(False)
574                self.progressBarEEGLowGamma.setEnabled(False)
575                self.progressBarEEGMidGamma.setEnabled(False)
576               
577                #self.progressBarAttention.setEnabled(False)
578                #self.progressBarMeditation.setEnabled(False)
579       
580       
581        ##################################################################
582       
583        def stopEmotivService(self):
584               
585                #self.emotivClient.stop()
586               
587                self.progressBarEEGDelta.setEnabled(True)
588                self.progressBarEEGTheta.setEnabled(True)
589                self.progressBarEEGLowAlpha.setEnabled(True)
590                self.progressBarEEGHighAlpha.setEnabled(True)
591                self.progressBarEEGLowBeta.setEnabled(True)
592                self.progressBarEEGHighBeta.setEnabled(True)
593                self.progressBarEEGLowGamma.setEnabled(True)
594                self.progressBarEEGMidGamma.setEnabled(True)
595               
596                #self.progressBarAttention.setEnabled(True)
597                #self.progressBarMeditation.setEnabled(True)
598       
599       
600        ##################################################################
601       
602        def processPacketEEG(self, packet):
603               
604                self.processPacketThinkGear(packet)
605                self.processPacketEmotiv(packet)
606               
607               
608                #if ((self.synapseServer.protocol != None) and
609                if (self.tabWidget.currentIndex() == \
610                    self.tabWidget.indexOf(self.tabControlPanel)):
611                       
612                        self.updateProfileSessionStatus()
613       
614       
615        ##################################################################
616       
617        def processPacketThinkGear(self, packet):
618               
619                #if self.DEBUG > 2:
620                        #print packet
621               
622               
623                if ('rawEeg' in packet.keys()):
624                        self.packets['rawEeg'].append(packet['rawEeg'])
625                        value = packet['rawEeg']
626                        if MATPLOTLIB_AVAILABLE and \
627                                (self.tabWidget.currentIndex() == \
628                                 self.tabWidget.indexOf(self.tabEEGSignals)):
629                                self.rawEEGMatplot.update_figure(value)
630                        return
631                else:
632                        # NOTE: This is also logging Emotiv packets to 'signals'
633                        self.packets['signals'].append(packet)
634               
635               
636                if ('poorSignalLevel' in packet.keys()):
637                        value = 200 - packet['poorSignalLevel']
638                        self.progressBarSignalContactQuality.setValue(value)
639                        self.textEditDebugConsole.append("")
640                        try:
641                                (date, localtime) = self.parseTimeStamp(packet['timestamp'])
642                                self.textEditDebugConsole.append("Timestamp: %s %s" % (date, localtime))
643                        except:
644                                pass
645                        self.textEditDebugConsole.append("poorSignalLevel: %i" % \
646                                                         packet['poorSignalLevel'])
647               
648               
649                if ('eSense' in packet.keys()):
650                       
651                        if ('attention' in packet['eSense'].keys()):
652                                value = packet['eSense']['attention']
653                                self.progressBarAttention.setValue(value)
654                                self.textEditDebugConsole.append("eSense attention: %i" % value)
655                       
656                        if ('meditation' in packet['eSense'].keys()):
657                                value = packet['eSense']['meditation']
658                                self.progressBarMeditation.setValue(value)
659                                self.textEditDebugConsole.append("eSense meditation: %i" % value)
660                       
661                       
662                        if MATPLOTLIB_AVAILABLE:
663                                self.chartEEGMatplot.update_values('eSense', packet['eSense'])
664                                if (self.tabWidget.currentIndex() == \
665                                    self.tabWidget.indexOf(self.tabCharts)):
666                                        self.chartEEGMatplot.update_figure('eSense', packet['eSense'])
667               
668               
669                if ('eegPower' in packet.keys()):
670                       
671                        # If we are not emulating packets we'll set the maximum EEG Power value
672                        # threshold to the default (or maximum value found within this packet)
673                        if not self.synapseServer.emulate_headset_data:
674                                self.maxEEGPower = THINKGEAR_EMULATION_MAX_EEG_POWER_VALUE
675                       
676                        for value in packet['eegPower'].keys():
677                                if packet['eegPower'][value] > self.maxEEGPower:
678                                        self.maxEEGPower = packet['eegPower'][value]
679                       
680                       
681                        if ('delta' in packet['eegPower'].keys()):
682                                value = packet['eegPower']['delta']
683                                self.progressBarEEGDelta.setMaximum(self.maxEEGPower)
684                                self.progressBarEEGDelta.setValue(value)
685                                self.textEditDebugConsole.append("delta: %i" % value)
686                       
687                        if ('theta' in packet['eegPower'].keys()):
688                                value = packet['eegPower']['theta']
689                                self.progressBarEEGTheta.setMaximum(self.maxEEGPower)
690                                self.progressBarEEGTheta.setValue(value)
691                                self.textEditDebugConsole.append("theta: %i" % value)
692                       
693                        if ('lowAlpha' in packet['eegPower'].keys()):
694                                value = packet['eegPower']['lowAlpha']
695                                self.progressBarEEGLowAlpha.setMaximum(self.maxEEGPower)
696                                self.progressBarEEGLowAlpha.setValue(value)
697                                self.textEditDebugConsole.append("lowAlpha: %i" % value)
698                       
699                        if ('highAlpha' in packet['eegPower'].keys()):
700                                value = packet['eegPower']['highAlpha']
701                                self.progressBarEEGHighAlpha.setMaximum(self.maxEEGPower)
702                                self.progressBarEEGHighAlpha.setValue(value)
703                                self.textEditDebugConsole.append("highAlpha: %i" % value)
704                       
705                        if ('lowBeta' in packet['eegPower'].keys()):
706                                value = packet['eegPower']['lowBeta']
707                                self.progressBarEEGLowBeta.setMaximum(self.maxEEGPower)
708                                self.progressBarEEGLowBeta.setValue(value)
709                                self.textEditDebugConsole.append("lowBeta: %i" % value)
710                       
711                        if ('highBeta' in packet['eegPower'].keys()):
712                                value = packet['eegPower']['highBeta']
713                                self.progressBarEEGHighBeta.setMaximum(self.maxEEGPower)
714                                self.progressBarEEGHighBeta.setValue(value)
715                                self.textEditDebugConsole.append("highBeta: %i" % value)
716                       
717                        if ('lowGamma' in packet['eegPower'].keys()):
718                                value = packet['eegPower']['lowGamma']
719                                self.progressBarEEGLowGamma.setMaximum(self.maxEEGPower)
720                                self.progressBarEEGLowGamma.setValue(value)
721                                self.textEditDebugConsole.append("lowGamma: %i" % value)
722                       
723                        if ('highGamma' in packet['eegPower'].keys()):
724                                value = packet['eegPower']['highGamma']
725                                self.progressBarEEGMidGamma.setMaximum(self.maxEEGPower)
726                                self.progressBarEEGMidGamma.setValue(value)
727                                self.textEditDebugConsole.append("highGamma: %i" % value)
728                       
729                       
730                        if MATPLOTLIB_AVAILABLE:
731                                self.chartEEGMatplot.update_values('eegPower', packet['eegPower'])
732                                if (self.tabWidget.currentIndex() == \
733                                    self.tabWidget.indexOf(self.tabCharts)):
734                                        self.chartEEGMatplot.update_figure('eegPower', packet['eegPower'])
735       
736       
737        ##################################################################
738       
739        def processPacketEmotiv(self, packet):
740               
741                if self.DEBUG > 2:
742                        print "INFO [Synapse:Interface] Emotiv packet received:"
743                        print packet
744               
745               
746                if ('emotivStatus' in packet.keys()):
747                       
748                        if ('timeFromStart' in packet['emotivStatus']):
749                                if not configuration.EMULATE_THINKGEAR_FOR_EMOTIV:
750                                        self.textEditDebugConsole.append("")
751                                        try:
752                                                (date, localtime) = self.parseTimeStamp(packet['timestamp'])
753                                                self.textEditDebugConsole.append("Timestamp: %s %s" % (date, localtime))
754                                        except:
755                                                pass
756                                self.textEditDebugConsole.append("timeFromStart: %f" % \
757                                                                  packet['emotivStatus']['timeFromStart'])
758                       
759                        if ('headsetOn' in packet['emotivStatus']):
760                                self.textEditDebugConsole.append("headsetOn: %s" % \
761                                                                  bool(packet['emotivStatus']['headsetOn']))
762                       
763                        if ('contactNumberOfQualityChannels' in packet['emotivStatus']):
764                                self.textEditDebugConsole.append("contactNumberOfQualityChannels: %i" % \
765                                                                  packet['emotivStatus']['contactNumberOfQualityChannels'])
766                       
767                        if ('wireless' in packet['emotivStatus']):
768                                self.textEditDebugConsole.append("wireless: %i" % \
769                                                                  packet['emotivStatus']['wireless'])
770               
771               
772                if ('affectiv' in packet.keys()):
773                       
774                        if ('excitement' in packet['affectiv']):
775                                self.textEditDebugConsole.append("excitement: %.2f" % \
776                                                                  packet['affectiv']['excitement'])
777                       
778                        if ('longTermExcitement' in packet['affectiv']):
779                                self.textEditDebugConsole.append("longTermExcitement: %.2f" % \
780                                                                  packet['affectiv']['longTermExcitement'])
781                       
782                        if ('meditation' in packet['affectiv']):
783                                self.textEditDebugConsole.append("meditation: %.2f" % \
784                                                                  packet['affectiv']['meditation'])
785                       
786                        if ('frustration' in packet['affectiv']):
787                                self.textEditDebugConsole.append("frustration: %.2f" % \
788                                                                  packet['affectiv']['frustration'])
789                       
790                        if ('engagementBoredom' in packet['affectiv']):
791                                self.textEditDebugConsole.append("engagementBoredom: %.2f" % \
792                                                                  packet['affectiv']['engagementBoredom'])
793               
794               
795                if ('cognitiv' in packet.keys()):
796                       
797                        if ('currentAction' in packet['cognitiv']):
798                                self.textEditDebugConsole.append("currentAction: %i" % \
799                                                                  packet['cognitiv']['currentAction'])
800                       
801                        if ('currentActionPower' in packet['cognitiv']):
802                                self.textEditDebugConsole.append("currentActionPower: %.2f" % \
803                                                                  packet['cognitiv']['currentActionPower'])
804       
805       
806       
807        ##################################################################
808       
809        def setPacketCount(self, value):
810               
811                self.packet_count = value
812       
813       
814        ##################################################################
815       
816        def setBadPackets(self, value):
817               
818                self.bad_packets = value
819       
820       
821        ##################################################################
822       
823        def incrementPacketCount(self):
824               
825                self.packet_count += 1
826       
827       
828        ##################################################################
829       
830        def incrementBadPackets(self):
831               
832                self.bad_packets += 1
833       
834       
835        ##################################################################
836       
837        def getPacketCount(self):
838               
839                return (self.packet_count)
840       
841       
842        ##################################################################
843       
844        def getBadPackets(self):
845               
846                return (self.bad_packets)
847       
848       
849        ##################################################################
850       
851        def getSessionTime(self):
852               
853                return (self.session_start_timestamp)
854       
855       
856        ##################################################################
857       
858        def resetSessionStartTime(self):
859       
860                #self.synapseServer.protocol.resetSessionStartTime()
861                #self.resetSessionStartTime()
862                self.session_start_timestamp = time.time()
863       
864       
865        ##################################################################
866       
867        def stop(self):
868               
869                if UPDATE_INTERFACE_VIA_TIMER:
870                        self.updateInterfaceTimer.stop()
871                else:
872                        if self.synapseClient != None:
873                                self.synapseClient.exitThread()
874                        #if self.thinkgearConnectClient != None:
875                                #self.thinkgearConnectClient.exitThread()
876                        #if self.emotivClient != None:
877                                #self.emotivClient.exitThread()
878               
879                if self.synapseServer != None:
880                        self.synapseServer.exitThread()
881       
882       
883        ##################################################################
884       
885        def closeEvent(self, event):
886               
887                quit_message = "Are you sure you want to exit the program?"
888               
889                reply = QtGui.QMessageBox.question( \
890                           self, \
891                          'Message', \
892                           quit_message, \
893                           QtGui.QMessageBox.Yes, \
894                           QtGui.QMessageBox.No)
895               
896                if reply == QtGui.QMessageBox.Yes:
897                       
898                        self.stop()
899                       
900                        event.accept()
901               
902                else:
903                        event.ignore()
904
Note: See TracBrowser for help on using the repository browser.