source: trunk/Puzzlebox/Synapse/Emotiv/Server.py @ 393

Last change on this file since 393 was 393, checked in by sc, 8 years ago
  • updates for exporting ThinkGear? and Emotiv custom data headers
File size: 20.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.05.11
10"""
11
12### IMPORTS ###
13
14import os, sys, time
15import math
16
17import simplejson as json
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:Emotiv:Server] Using PySide module"
31
32if not configuration.ENABLE_PYSIDE:
33        print "INFO: [Synapse:Emotiv:Server] Using PyQt4 module"
34        from PyQt4 import QtCore, QtGui, QtNetwork
35
36import Puzzlebox.Synapse.Server as synapse_server
37import Puzzlebox.Synapse.ThinkGear.Server as thinkgear_server
38import Puzzlebox.Synapse.Emotiv.Client as emotiv_client
39try:
40        import Puzzlebox.Synapse.Emotiv.Protocol as emotiv_protocol
41except Exception, e:
42        print "ERROR: [Synapse:Emotiv:Server] Exception importing Emotiv.Protocol:",
43        print e
44        emotiv_protocol = None
45
46#####################################################################
47# Globals
48#####################################################################
49
50DEBUG = configuration.DEBUG
51
52COMMUNICATION_MODE = 'Emit Signal'
53#COMMUNICATION_MODE = 'Call Parent'
54
55SERVER_INTERFACE = configuration.EMOTIV_SERVER_HOST
56SERVER_PORT = configuration.EMOTIV_SERVER_PORT_CONTROL_PANEL
57#SERVER_PORT = configuration.EMOTIV_SERVER_PORT_EMOCOMPOSER
58DEFAULT_DEVICE_MODEL = 'Emotiv EPOC'
59#THINKGEAR_DEVICE_SERIAL_PORT = configuration.THINKGEAR_DEVICE_SERIAL_PORT
60
61EMULATE_THINKGEAR_FOR_EMOTIV = configuration.EMULATE_THINKGEAR_FOR_EMOTIV
62
63CLIENT_NO_REPLY_WAIT = configuration.CLIENT_NO_REPLY_WAIT * 1000
64
65FLASH_POLICY_FILE_REQUEST = configuration.FLASH_POLICY_FILE_REQUEST
66FLASH_SOCKET_POLICY_FILE = configuration.FLASH_SOCKET_POLICY_FILE
67
68DELIMITER = configuration.SYNAPSE_DELIMITER
69
70MESSAGE_FREQUENCY_TIMER = 1 * 1000 # 1 Hz (1000 ms)
71
72ENABLE_SIMULATE_HEADSET_DATA = configuration.THINKGEAR_ENABLE_SIMULATE_HEADSET_DATA
73
74#BLINK_FREQUENCY_TIMER = configuration.THINKGEAR_BLINK_FREQUENCY_TIMER
75
76#DEFAULT_SAMPLE_WAVELENGTH = configuration.THINKGEAR_DEFAULT_SAMPLE_WAVELENGTH
77
78#THINKGEAR_ATTENTION_MULTIPLIER = configuration.THINKGEAR_ATTENTION_MULTIPLIER
79#THINKGEAR_MEDITATION_MULTIPLIER = configuration.THINKGEAR_MEDITATION_MULTIPLIER
80
81#THINKGEAR_EEG_POWER_MULTIPLIERS = configuration.THINKGEAR_EEG_POWER_MULTIPLIERS
82
83DEFAULT_AUTHORIZATION_MESSAGE = \
84        {"isAuthorized": True}
85                # Tells the client whether the server has authorized
86                # access to the user's headset data. The value is
87                # either true or false.
88
89#DEFAULT_SIGNAL_LEVEL_MESSAGE = \
90        #{"poorSignalLevel": 0}
91                ## A quantifier of the quality of the brainwave signal.
92                ## This is an integer value that is generally in the
93                ## range of 0 to 200, with 0 indicating a
94                ## good signal and 200 indicating an off-head state.
95
96#DEFAULT_EEG_POWER_MESSAGE = \
97        #{"eegPower": { \
98                #'delta': 0, \
99                #'theta': 0, \
100                #'lowAlpha': 0, \
101                #'highAlpha': 0, \
102                #'lowBeta': 0, \
103                #'highBeta': 0, \
104                #'lowGamma': 0, \
105                #'highGamma': 0, \
106                #}, \
107        #} # A container for the EEG powers. These may
108          ## be either integer or floating-point values.
109          ## Maximum values are undocumented but assumed to be 65535
110
111#DEFAULT_ESENSE_MESSAGE = \
112        #{"eSense": { \
113                #'attention': 0, \
114                #'meditation': 0, \
115                #}, \
116        #} # A container for the eSense™ attributes.
117          ## These are integer values between 0 and 100,
118          ## where 0 is perceived as a lack of that attribute
119          ## and 100 is an excess of that attribute.
120
121DEFAULT_BLINK_MESSAGE = {"blinkStrength": 255}
122        # The strength of a detected blink. This is
123        # an integer in the range of 0-255.
124
125#DEFAULT_RAWEEG_MESSAGE = {"rawEeg": 255}
126        ## The raw data reading off the forehead sensor.
127        ## This may be either an integer or a floating-point value.
128
129DEFAULT_PACKET = {}
130#DEFAULT_PACKET.update(DEFAULT_EEG_POWER_MESSAGE)
131#DEFAULT_PACKET.update(DEFAULT_SIGNAL_LEVEL_MESSAGE)
132#DEFAULT_PACKET.update(DEFAULT_ESENSE_MESSAGE)
133
134#DEFAULT_RESPONSE_MESSAGE = DEFAULT_SIGNAL_LEVEL_MESSAGE
135DEFAULT_RESPONSE_MESSAGE = DEFAULT_PACKET
136
137#####################################################################
138# Classes
139#####################################################################
140
141class puzzlebox_synapse_server_emotiv(thinkgear_server.puzzlebox_synapse_server_thinkgear):
142       
143        def __init__(self, log, \
144                          server_interface=SERVER_INTERFACE, \
145                          server_port=SERVER_PORT, \
146                          device_model=None, \
147                          device_address=SERVER_PORT, \
148                          emulate_headset_data=ENABLE_SIMULATE_HEADSET_DATA, \
149                          emulate_thinkgear=EMULATE_THINKGEAR_FOR_EMOTIV, \
150                          DEBUG=DEBUG, \
151                          parent=None):
152               
153                QtCore.QThread.__init__(self,parent)
154               
155                self.log = log
156                self.DEBUG = DEBUG
157                self.parent = parent
158               
159                self.server_interface = server_interface
160                self.server_port = server_port
161                self.device_address = device_address
162                self.device_model = device_model
163                self.emulate_headset_data = emulate_headset_data
164                self.emulate_thinkgear = emulate_thinkgear
165               
166                self.name = 'Synapse:Emotiv:Server'
167               
168                self.connection_timestamp = time.time()
169                self.session_start_timestamp = time.time()
170               
171                self.connections = []
172                self.packet_queue = []
173               
174                #self.serial_device = None
175                self.protocol = None
176               
177                self.connect(self, \
178                             QtCore.SIGNAL("sendPacket()"), \
179                             self.sendPacketQueue)
180               
181                self.message_frequency_timer = MESSAGE_FREQUENCY_TIMER
182                #self.blink_frequency_timer = BLINK_FREQUENCY_TIMER
183                #self.blink_timestamp = time.time()
184               
185               
186                #self.customDataHeaders = 'Time From Start,Headset On,Contact Number Of Quality Channels,Wireless,Expressiv Action,Excitement,Long Term Excitement,Meditation,Frustration,Engagement/Boredom,Cognitiv Action,Cognitiv Action Power'
187                self.customDataHeaders = ['Time From Start', \
188                                          'Headset On', \
189                                          'Contact Number Of Quality Channels', \
190                                          'Wireless', \
191                                          'Expressiv Action', \
192                                          'Excitement', \
193                                          'Long Term Excitement', \
194                                          'Meditation', \
195                                          'Frustration', \
196                                          'Engagement/Boredom', \
197                                          'Cognitiv Action', \
198                                          'Cognitiv Action Power', \
199                                         ]
200               
201               
202                self.configureEEG()
203               
204                self.configureNetwork()
205               
206               
207                #if (self.emulate_headset_data):
208                        #self.emulationTimer = QtCore.QTimer()
209                        #QtCore.QObject.connect(self.emulationTimer, \
210                                                    #QtCore.SIGNAL("timeout()"), \
211                                                    #self.emulationEvent)
212                        #self.emulationTimer.start(MESSAGE_FREQUENCY_TIMER)
213       
214       
215        ##################################################################
216       
217        def configureEEG(self):
218               
219                if self.server_interface == '*':
220                        self.server_interface = '127.0.0.1'
221               
222                if emotiv_protocol != None:
223               
224                        # We call Emotiv.Client as Emotiv.Protocol in order
225                        # to run in a separate from Emotiv.Server
226                        #self.emotivClient = \
227                        self.protocol = \
228                           emotiv_client.puzzlebox_synapse_client_emotiv( \
229                              log=self.log, \
230                              server_host=self.server_interface, \
231                              server_port=self.device_address, \
232                              DEBUG=DEBUG, \
233                              parent=self)
234                       
235                        #self.emotivClient.start()
236                        self.protocol.start()
237               
238               
239                        #emotiv_protocol.start(host=self.server_interface, \
240                                              #port=self.server_port, \
241                                              #initialized=False, \
242                                              #parent=self)
243       
244       
245        ##################################################################
246       
247        def processPacketEmotiv(self, packet):
248               
249                if self.DEBUG > 2:
250                        print packet
251               
252               
253                if self.emulate_thinkgear:
254                        packet = self.emulateThinkGear(packet)
255               
256               
257                if (packet != {}):
258                        self.packet_queue.append(packet)
259                       
260                        if COMMUNICATION_MODE == 'Emit Signal':
261                                self.emitSendPacketSignal()
262                       
263                        else:
264                                self.sendPacketQueue()
265                               
266                                if (self.parent != None):
267                                        #self.parent.processPacketEmotiv(packet)
268                                        self.parent.processPacketEEG(packet)
269       
270       
271        ##################################################################
272       
273        def emulateThinkGear(self, packet):
274               
275                if ('emotivStatus' in packet.keys()):
276                       
277                        if ('contactNumberOfQualityChannels' in packet['emotivStatus']):
278                               
279                                #poorSignalLevel = packet['emotivStatus']['wireless']
280                                packet['poorSignalLevel'] = \
281                                   (packet['emotivStatus']['contactNumberOfQualityChannels'] / 18.0) * 200
282                                packet['poorSignalLevel'] = 200 - int(packet['poorSignalLevel'])
283               
284               
285                if ('expressiv' in packet.keys()):
286                       
287                        if self.DEBUG > 2:
288                                print "INFO [Synapse:Emotiv:Server] packet['expressiv']['currentAction']",
289                                print packet['expressiv']['currentAction']
290                       
291                        if ('currentAction' in packet['expressiv'].keys()):
292                                if (packet['expressiv']['currentAction'] == 0x0002):
293                                        packet['blinkStrength'] = 255
294               
295               
296                if ('affectiv' in packet.keys()):
297                       
298                        packet['eSense'] = {}
299                       
300                        if ('excitement' in packet['affectiv'].keys()):
301                                #packet['eSense']['attention'] = int(packet['affectiv']['excitement'] * 100)
302                                packet['eSense']['attention'] = int(packet['cognitiv']['currentActionPower'] * 100)
303                        elif ('engagementBoredom' in packet['affectiv'].keys()):
304                                packet['eSense']['attention'] = int(packet['affectiv']['engagementBoredom'] * 100)
305                       
306                        if ('meditation' in packet['affectiv'].keys()):
307                                packet['eSense']['meditation'] = int(packet['affectiv']['meditation'] * 100)
308               
309               
310                return(packet)
311       
312       
313        ##################################################################
314       
315        def resetDevice(self):
316               
317                #if self.serial_device != None:
318                        #self.serial_device.exitThread()
319               
320                if self.protocol != None:
321                        #self.protocol.exitThread()
322                        self.stopEmotivProtocol()
323               
324                self.configureEEG()
325       
326       
327        ##################################################################
328       
329        def processPacketForExport(self, packet={}, output={}):
330               
331                #output['Time From Start'] = ''
332                #output['Headset On'] = ''
333                #output['Contact Number Of Quality Channels'] = ''
334                #output['Wireless'] = ''
335                #output['Expressiv Action'] = ''
336                #output['Excitement'] = ''
337                #output['Long Term Excitement'] = ''
338                #output['Meditation'] = ''
339                #output['Frustration'] = ''
340                #output['Engagement/Boredom'] = ''
341                #output['Cognitiv Action'] = ''
342                #output['Cognitiv Action Power'] = ''
343               
344                for header in self.customDataHeaders:
345                        output[header] = ''
346               
347                if self.emulate_thinkgear:
348                        output['Attention'] = ''
349                        output['Meditation'] = ''
350                        output['Signal Level'] = ''
351               
352               
353                if 'emotivStatus' in packet.keys():
354                        if 'timeFromStart' in packet['emotivStatus'].keys():
355                                output['Time From Start'] = packet['emotivStatus']['timeFromStart']
356                        if 'headsetOn' in packet['emotivStatus'].keys():
357                                output['Headset On'] = packet['emotivStatus']['headsetOn']
358                        if 'Contact Number Of Quality Channels' in packet['emotivStatus'].keys():
359                                output['Contact Number Of Quality Channels'] = packet['emotivStatus']['contactNumberOfQualityChannels']
360                        if 'Wireless' in packet['emotivStatus'].keys():
361                                output['Wireless'] = packet['emotivStatus']['wireless']
362               
363                if 'expressiv' in packet.keys():
364                        if 'currentAction' in packet['expressiv'].keys():
365                                value = packet['expressiv']['currentAction']
366                                if value == 32:
367                                        output['Expressiv Action'] = ''
368                                else:
369                                        output['Expressiv Action'] = packet['expressiv']['currentAction']
370               
371                if 'affectiv' in packet.keys():
372                        if 'excitement' in packet['affectiv'].keys():
373                                output['Excitement'] = int(packet['affectiv']['excitement'] * 100)
374                        if 'longTermExcitement' in packet['affectiv'].keys():
375                                output['Long Term Excitement'] = int(packet['affectiv']['longTermExcitement'] * 100)
376                        if 'meditation' in packet['affectiv'].keys():
377                                output['Meditation'] = int(packet['affectiv']['meditation'] * 100)
378                        if 'frustration' in packet['affectiv'].keys():
379                                output['Frustration'] = int(packet['affectiv']['frustration'] * 100)
380                        if 'engagementBoredom' in packet['affectiv'].keys():
381                                output['Engagement/Boredom'] = int(packet['affectiv']['engagementBoredom'] * 100)
382               
383                if 'cognitiv' in packet.keys():
384                        if 'currentAction' in packet['cognitiv'].keys():
385                                output['Cognitiv Action'] = packet['cognitiv']['currentAction']
386                        if 'currentActionPower' in packet['cognitiv'].keys():
387                                output['Cognitiv Action Power'] = int(packet['cognitiv']['currentActionPower'] * 100)
388               
389               
390                if self.emulate_thinkgear:
391                        if 'eSense' in packet.keys():
392                                if 'attention' in packet['eSense'].keys():
393                                        output['Attention'] = packet['eSense']['attention']
394                                if 'meditation' in packet['eSense'].keys():
395                                        output['Meditation'] = packet['eSense']['meditation']
396                       
397                        if 'poorSignalLevel' in packet.keys():
398                                output['Signal Level'] = packet['poorSignalLevel']
399               
400                return(output)
401       
402       
403        ##################################################################
404       
405        def exportDataToCSV(self, parent=None, source=None, target=None):
406               
407                if parent == None:
408                        if self.parent == None:
409                                parent = self
410                        else:
411                                parent = self.parent
412               
413                if source == None:
414                        if self.parent == None:
415                                source = self
416                        else:
417                                source = self.parent
418               
419                if target == None:
420                        if self.parent == None:
421                                target = self
422                        else:
423                                target = self.parent
424               
425                try:
426                        truncate_csv_timezone = target.configuration.EXPORT_CSV_TRUNCATE_TIMEZONE
427                except:
428                        truncate_csv_timezone = False
429               
430                try:
431                        scrub_data = target.configuration.EXPORT_CSV_SCRUB_DATA
432                except:
433                        scrub_data = False
434               
435               
436                headers = 'Date,Time'
437                headers = headers + ','
438                #headers = headers + 'Time From Start,Headset On,Contact Number Of Quality Channels,Wireless,Excitement,Long Term Excitement,Meditation,Frustration,Engagement/Boredom,Cognitiv Action,Cognitiv Action Power'
439                headers = headers + 'Time From Start,Headset On,Contact Number Of Quality Channels,Wireless,Expressiv Action,Excitement,Long Term Excitement,Meditation,Frustration,Engagement/Boredom,Cognitiv Action,Cognitiv Action Power'
440               
441                if self.emulate_thinkgear:
442                        headers = headers + ','
443                        #headers = headers + 'Attention,Meditation,Signal Level,Delta,Theta,Low Alpha,High Alpha,Low Beta,High Beta,Low Gamma,Mid Gamma'
444                        headers = headers + 'Attention,Meditation,Signal Level'
445               
446               
447                customDataHeaders = []
448                for header in parent.customDataHeaders:
449                        customDataHeaders.append(header)
450                for plugin in parent.activePlugins:
451                        for header in plugin.customDataHeaders:
452                                customDataHeaders.append(header)
453               
454                for each in customDataHeaders:
455                        headers = headers + ',%s' % each
456               
457                headers = headers + '\n'
458               
459               
460                csv = {}
461               
462                for packet in source.packets['signals']:
463                       
464                        if 'rawEeg' in packet.keys():
465                                continue
466                       
467                        if packet['timestamp'] not in csv.keys():
468                               
469                                if 'blinkStrength' in packet.keys():
470                                        # Skip any blink packets from log
471                                        continue
472                               
473                               
474                                timestamp = packet['timestamp']
475                                (date, localtime) = source.parseTimeStamp(timestamp, \
476                                                    truncate_time_zone=truncate_csv_timezone)
477                               
478                                csv[timestamp] = {}
479                                csv[timestamp]['Date'] = date
480                                csv[timestamp]['Time'] = localtime
481                               
482                                csv[timestamp]['Time From Start'] = ''
483                                csv[timestamp]['Headset On'] = ''
484                                csv[timestamp]['Contact Number Of Quality Channels'] = ''
485                                csv[timestamp]['Wireless'] = ''
486                                csv[timestamp]['Expressiv Action'] = ''
487                                csv[timestamp]['Excitement'] = ''
488                                csv[timestamp]['Long Term Excitement'] = ''
489                                csv[timestamp]['Meditation'] = ''
490                                csv[timestamp]['Frustration'] = ''
491                                csv[timestamp]['Engagement/Boredom'] = ''
492                                csv[timestamp]['Cognitiv Action'] = ''
493                                csv[timestamp]['Cognitiv Action Power'] = ''
494                               
495                                if self.emulate_thinkgear:
496                                        csv[timestamp]['Attention'] = ''
497                                        csv[timestamp]['Meditation'] = ''
498                                        csv[timestamp]['Signal Level'] = ''
499                               
500                                for header in customDataHeaders:
501                                        csv[timestamp][header] = ''
502                       
503                       
504                        if 'emotivStatus' in packet.keys():
505                                if 'timeFromStart' in packet['emotivStatus'].keys():
506                                        csv[timestamp]['Time From Start'] = packet['emotivStatus']['timeFromStart']
507                                if 'headsetOn' in packet['emotivStatus'].keys():
508                                        csv[timestamp]['Headset On'] = packet['emotivStatus']['headsetOn']
509                                if 'Contact Number Of Quality Channels' in packet['emotivStatus'].keys():
510                                        csv[timestamp]['Contact Number Of Quality Channels'] = packet['emotivStatus']['contactNumberOfQualityChannels']
511                                if 'Wireless' in packet['emotivStatus'].keys():
512                                        csv[timestamp]['Wireless'] = packet['emotivStatus']['wireless']
513                       
514                        if 'expressiv' in packet.keys():
515                                if 'currentAction' in packet['expressiv'].keys():
516                                        value = packet['expressiv']['currentAction']
517                                        if value == 32:
518                                                csv[timestamp]['Expressiv Action'] = ''
519                                        else:
520                                                csv[timestamp]['Expressiv Action'] = packet['expressiv']['currentAction']
521                       
522                        if 'affectiv' in packet.keys():
523                                if 'excitement' in packet['affectiv'].keys():
524                                        csv[timestamp]['Excitement'] = int(packet['affectiv']['excitement'] * 100)
525                                if 'longTermExcitement' in packet['affectiv'].keys():
526                                        csv[timestamp]['Long Term Excitement'] = int(packet['affectiv']['longTermExcitement'] * 100)
527                                if 'meditation' in packet['affectiv'].keys():
528                                        csv[timestamp]['Meditation'] = int(packet['affectiv']['meditation'] * 100)
529                                if 'frustration' in packet['affectiv'].keys():
530                                        csv[timestamp]['Frustration'] = int(packet['affectiv']['frustration'] * 100)
531                                if 'engagementBoredom' in packet['affectiv'].keys():
532                                        csv[timestamp]['Engagement/Boredom'] = int(packet['affectiv']['engagementBoredom'] * 100)
533                       
534                        if 'cognitiv' in packet.keys():
535                                if 'currentAction' in packet['cognitiv'].keys():
536                                        csv[timestamp]['Cognitiv Action'] = packet['cognitiv']['currentAction']
537                                if 'currentActionPower' in packet['cognitiv'].keys():
538                                        csv[timestamp]['Cognitiv Action Power'] = int(packet['cognitiv']['currentActionPower'] * 100)
539                       
540                       
541                        if self.emulate_thinkgear:
542                                if 'eSense' in packet.keys():
543                                        if 'attention' in packet['eSense'].keys():
544                                                csv[timestamp]['Attention'] = packet['eSense']['attention']
545                                        if 'meditation' in packet['eSense'].keys():
546                                                csv[timestamp]['Meditation'] = packet['eSense']['meditation']
547                               
548                                if 'poorSignalLevel' in packet.keys():
549                                        csv[timestamp]['Signal Level'] = packet['poorSignalLevel']
550                       
551                        for header in customDataHeaders:
552                                if 'custom' in packet.keys() and \
553                                   header in packet['custom'].keys():
554                                        csv[timestamp][header] = packet['custom'][header]
555               
556               
557                #if scrub_data:
558                        #csv = self.scrubData(csv, truncate_csv_timezone, source=source)
559               
560               
561                output = headers
562               
563                csv_keys = csv.keys()
564                csv_keys.sort()
565               
566                for key in csv_keys:
567                       
568                        row = '%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s' % \
569                              (csv[key]['Date'], \
570                               csv[key]['Time'], \
571                               csv[key]['Time From Start'], \
572                               csv[key]['Headset On'], \
573                               csv[key]['Contact Number Of Quality Channels'], \
574                               csv[key]['Wireless'], \
575                               csv[key]['Expressiv Action'], \
576                               csv[key]['Excitement'], \
577                               csv[key]['Long Term Excitement'], \
578                               csv[key]['Meditation'], \
579                               csv[key]['Frustration'], \
580                               csv[key]['Engagement/Boredom'], \
581                               csv[key]['Cognitiv Action'], \
582                               csv[key]['Cognitiv Action Power'])
583                       
584                        if self.emulate_thinkgear:
585                                row = '%s,%s,%s,%s' % \
586                                   (row, \
587                                    csv[key]['Attention'], \
588                                    csv[key]['Meditation'], \
589                                    csv[key]['Signal Level'])
590                       
591                        for header in customDataHeaders:
592                                row = row + ',%s' % csv[key][header]
593                       
594                        row = row + '\n'
595                       
596                        output = output + row
597               
598               
599                return(output) 
600       
601       
602        ##################################################################
603       
604        def exitThread(self, callThreadQuit=True):
605               
606                #if (self.emulate_headset_data):
607                        #try:
608                                #self.emulationTimer.stop()
609                        #except Exception, e:
610                                #if self.DEBUG:
611                                        #print "ERROR: Exception when stopping emulation timer:",
612                                        #print e
613               
614               
615                self.stopEmotivProtocol()
616               
617               
618                self.socket.close()
619               
620                if callThreadQuit:
621                        QtCore.QThread.quit(self)
622               
623                if self.parent == None:
624                        sys.exit()
625       
626       
627        ##################################################################
628       
629        def stopEmotivProtocol(self):
630               
631                if emotiv_protocol != None:
632                        emotiv_protocol.KEEP_RUNNING = False
633                       
634                        count = 1
635                        while emotiv_protocol.CONNECTED:
636                                time.sleep(0.10)
637                                count = count + 1
638                                if count >= 10:
639                                        break
640
Note: See TracBrowser for help on using the repository browser.